diff --git a/.DS_Store b/.DS_Store index a69b6ff..cb3c140 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/frontend/package-lock.json b/frontend/package-lock.json index d487380..3fd91f9 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -19,6 +19,7 @@ "@angular/platform-browser-dynamic": "~12.1.0", "@angular/router": "~12.1.0", "@tinkoff/ng-event-plugins": "^2.2.0", + "@wails/runtime": "^1.3.20", "@wailsapp/runtime": "^1.1.1", "await-to-js": "^3.0.0", "core-js": "^3.15.1", @@ -32,7 +33,7 @@ "@angular/cli": "~12.1.0", "@angular/compiler-cli": "~12.1.0", "@types/jasmine": "~3.6.0", - "@types/node": "^12.11.1", + "@types/node": "^12.20.19", "jasmine-core": "~3.7.0", "karma": "~6.3.0", "karma-chrome-launcher": "~3.1.0", @@ -2295,9 +2296,9 @@ "integrity": "sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA==" }, "node_modules/@types/node": { - "version": "12.20.15", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.15.tgz", - "integrity": "sha512-F6S4Chv4JicJmyrwlDkxUdGNSplsQdGwp1A0AJloEVDirWdZOAiRHhovDlsFkKUrquUXhz1imJhXHsf59auyAg==" + "version": "12.20.19", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.19.tgz", + "integrity": "sha512-niAuZrwrjKck4+XhoCw6AAVQBENHftpXw9F4ryk66fTgYaKQ53R4FI7c9vUGGw5vQis1HKBHDR1gcYI/Bq1xvw==" }, "node_modules/@types/parse-json": { "version": "4.0.0", @@ -2327,6 +2328,11 @@ "node": ">=0.10.0" } }, + "node_modules/@wails/runtime": { + "version": "1.3.20", + "resolved": "https://registry.npmjs.org/@wails/runtime/-/runtime-1.3.20.tgz", + "integrity": "sha512-CGX//m90re65ovCGqFMdABhQCdzH8pmHlCHallzRaAt432ClPtGO0MZBoHasE+HZYcYodZKKnzHgn8sssLswtw==" + }, "node_modules/@wailsapp/runtime": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@wailsapp/runtime/-/runtime-1.1.1.tgz", @@ -16561,9 +16567,9 @@ "integrity": "sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA==" }, "@types/node": { - "version": "12.20.15", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.15.tgz", - "integrity": "sha512-F6S4Chv4JicJmyrwlDkxUdGNSplsQdGwp1A0AJloEVDirWdZOAiRHhovDlsFkKUrquUXhz1imJhXHsf59auyAg==" + "version": "12.20.19", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.19.tgz", + "integrity": "sha512-niAuZrwrjKck4+XhoCw6AAVQBENHftpXw9F4ryk66fTgYaKQ53R4FI7c9vUGGw5vQis1HKBHDR1gcYI/Bq1xvw==" }, "@types/parse-json": { "version": "4.0.0", @@ -16592,6 +16598,11 @@ } } }, + "@wails/runtime": { + "version": "1.3.20", + "resolved": "https://registry.npmjs.org/@wails/runtime/-/runtime-1.3.20.tgz", + "integrity": "sha512-CGX//m90re65ovCGqFMdABhQCdzH8pmHlCHallzRaAt432ClPtGO0MZBoHasE+HZYcYodZKKnzHgn8sssLswtw==" + }, "@wailsapp/runtime": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@wailsapp/runtime/-/runtime-1.1.1.tgz", diff --git a/frontend/package.json b/frontend/package.json index f3f3ec3..95ebf49 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -23,6 +23,7 @@ "@angular/platform-browser-dynamic": "~12.1.0", "@angular/router": "~12.1.0", "@tinkoff/ng-event-plugins": "^2.2.0", + "@wails/runtime": "^1.3.20", "@wailsapp/runtime": "^1.1.1", "await-to-js": "^3.0.0", "core-js": "^3.15.1", @@ -36,7 +37,7 @@ "@angular/cli": "~12.1.0", "@angular/compiler-cli": "~12.1.0", "@types/jasmine": "~3.6.0", - "@types/node": "^12.11.1", + "@types/node": "^12.20.19", "jasmine-core": "~3.7.0", "karma": "~6.3.0", "karma-chrome-launcher": "~3.1.0", diff --git a/frontend/package.json.md5 b/frontend/package.json.md5 index f7abe96..8e5b2ae 100644 --- a/frontend/package.json.md5 +++ b/frontend/package.json.md5 @@ -1 +1 @@ -fcc79e56d8178978cb300aa3b0eb497f \ No newline at end of file +15ba3baba8db13a28cf402c9ac5b016f \ No newline at end of file diff --git a/frontend/src/app/components/settings/settings.component.scss b/frontend/src/app/components/settings/settings.component.scss index ea5d61e..f78af2c 100644 --- a/frontend/src/app/components/settings/settings.component.scss +++ b/frontend/src/app/components/settings/settings.component.scss @@ -13,7 +13,7 @@ settings { .settings-dialog { .mat-dialog-container { - background: url("../../../assets/bg.png"); + background: url("http://localhost:8080/static/frontend/dist/assets/bg.png"); background-repeat: no-repeat; .mat-toolbar { diff --git a/frontend/src/app/pages/home.component.html b/frontend/src/app/pages/home.component.html index 54b825c..2e5ffe4 100644 --- a/frontend/src/app/pages/home.component.html +++ b/frontend/src/app/pages/home.component.html @@ -50,7 +50,7 @@
add - play_circle + play_circle_filled stop + + + + +Created by FontForge 20151118 at Mon Feb 8 11:58:02 2016 + By shyndman +Copyright 2015 Google, Inc. All Rights Reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/src/assets/MaterialIcons-Regular.ttf b/frontend/src/assets/MaterialIcons-Regular.ttf new file mode 100644 index 0000000..7015564 Binary files /dev/null and b/frontend/src/assets/MaterialIcons-Regular.ttf differ diff --git a/frontend/src/assets/MaterialIcons-Regular.woff b/frontend/src/assets/MaterialIcons-Regular.woff new file mode 100644 index 0000000..b648a3e Binary files /dev/null and b/frontend/src/assets/MaterialIcons-Regular.woff differ diff --git a/frontend/src/assets/MaterialIcons-Regular.woff2 b/frontend/src/assets/MaterialIcons-Regular.woff2 new file mode 100644 index 0000000..9fa2112 Binary files /dev/null and b/frontend/src/assets/MaterialIcons-Regular.woff2 differ diff --git a/frontend/src/assets/material-icons.css b/frontend/src/assets/material-icons.css new file mode 100644 index 0000000..1111eb5 --- /dev/null +++ b/frontend/src/assets/material-icons.css @@ -0,0 +1,36 @@ +@font-face { + font-family: 'Material Icons'; + font-style: normal; + font-weight: 400; + src: url(http://localhost:8080/static/frontend/dist/assets/MaterialIcons-Regular.eot); /* For IE6-8 */ + src: local('Material Icons'), + local('MaterialIcons-Regular'), + url(http://localhost:8080/static/frontend/dist/assets/MaterialIcons-Regular.woff2) format('woff2'), + url(http://localhost:8080/static/frontend/dist/assets/MaterialIcons-Regular.woff) format('woff'), + url(http://localhost:8080/static/frontend/dist/assets/MaterialIcons-Regular.ttf) format('truetype'); +} + +.material-icons { + font-family: 'Material Icons'; + font-weight: normal; + font-style: normal; + font-size: 24px; /* Preferred icon size */ + display: inline-block; + line-height: 1; + text-transform: none; + letter-spacing: normal; + word-wrap: normal; + white-space: nowrap; + direction: ltr; + + /* Support for all WebKit browsers. */ + -webkit-font-smoothing: antialiased; + /* Support for Safari and Chrome. */ + text-rendering: optimizeLegibility; + + /* Support for Firefox. */ + -moz-osx-font-smoothing: grayscale; + + /* Support for IE. */ + font-feature-settings: 'liga'; +} diff --git a/frontend/src/backend/index.js b/frontend/src/backend/index.js new file mode 100755 index 0000000..64fc4e7 --- /dev/null +++ b/frontend/src/backend/index.js @@ -0,0 +1,34 @@ +// @ts-check +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +const backend = { + "main": { + "AppState": { + /** + * GetAppConfig + * @returns {Promise} - Go Type: *models.AppConfig + */ + "GetAppConfig": () => { + return window.backend.main.AppState.GetAppConfig(); + }, + /** + * GetEntryById + * @param {any} arg1 - Go Type: models.GenericEntry + * @returns {Promise} - Go Type: *models.GenericEntry + */ + "GetEntryById": (arg1) => { + return window.backend.main.AppState.GetEntryById(arg1); + }, + /** + * SelectDirectory + * @returns {Promise} - Go Type: string + */ + "SelectDirectory": () => { + return window.backend.main.AppState.SelectDirectory(); + }, + } + } + +}; +export default backend; diff --git a/frontend/src/backend/package.json b/frontend/src/backend/package.json new file mode 100755 index 0000000..9094981 --- /dev/null +++ b/frontend/src/backend/package.json @@ -0,0 +1,11 @@ +{ + "name": "backend", + "version": "1.0.0", + "description": "Package to wrap backend method calls", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC" +} \ No newline at end of file diff --git a/frontend/src/index.html b/frontend/src/index.html index 89585eb..3358de7 100644 --- a/frontend/src/index.html +++ b/frontend/src/index.html @@ -4,224 +4,10 @@ Frontend - + - - - + @@ -415,4 +202,4 @@ - \ No newline at end of file + diff --git a/frontend/src/main.ts b/frontend/src/main.ts index 1094490..1f95516 100644 --- a/frontend/src/main.ts +++ b/frontend/src/main.ts @@ -7,7 +7,7 @@ import { environment } from './environments/environment'; import 'zone.js' -import * as Wails from '@wailsapp/runtime'; +import * as Wails from '@wails/runtime'; import { AppState, BackendCallbacks } from '@models'; declare global { @@ -24,9 +24,9 @@ if (environment.production) { Wails.Init(() => { // fetch app data from backend before ng app will be bootstraped - Wails.Events.Once('ytd:onload', ({ entries, config }) => { + Wails.Events.On('ytd:onload', ({ entries, config }) => { window.APP_STATE = { entries, config }; - platformBrowserDynamic().bootstrapModule(AppModule) + platformBrowserDynamic().bootstrapModule(AppModule) .then(ngModule => Wails.Events.Emit('frontend:ready')) // notify wails about angular ready state .catch(err => console.error(err)); }) diff --git a/frontend/src/styles.scss b/frontend/src/styles.scss index 50e31bf..a14bfbf 100644 --- a/frontend/src/styles.scss +++ b/frontend/src/styles.scss @@ -2,7 +2,7 @@ html, body { height: 100%; } body { margin: 0; font-family: Roboto, "Helvetica Neue", sans-serif; } body { - background: url("assets/bg.png"); + background: url("http://localhost:8080/static/frontend/dist/assets/bg.png"); background-repeat: no-repeat; background-size: cover; backdrop-filter: blur(20px); diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json index f4ff5dc..36b5bd1 100644 --- a/frontend/tsconfig.json +++ b/frontend/tsconfig.json @@ -14,6 +14,7 @@ "experimentalDecorators": true, "strictNullChecks": false, "moduleResolution": "node", + "esModuleInterop": true, "importHelpers": true, "target": "es2017", "module": "es2020", @@ -32,6 +33,6 @@ "enableI18nLegacyMessageIdFormat": false, "strictInjectionParameters": true, "strictInputAccessModifiers": true, - "strictTemplates": true + "strictTemplates": true, } } diff --git a/go.mod b/go.mod index 1dc2719..f4f2f46 100644 --- a/go.mod +++ b/go.mod @@ -3,20 +3,20 @@ module ytd go 1.16 require ( - github.com/Masterminds/semver v1.5.0 // indirect - github.com/fatih/color v1.12.0 // indirect + github.com/go-ole/go-ole v1.2.5 // indirect + github.com/google/uuid v1.3.0 // indirect github.com/kkdai/youtube/v2 v2.7.2 + github.com/klauspost/compress v1.13.4 // indirect + github.com/leaanthony/go-ansi-parser v1.2.0 // indirect github.com/leaanthony/slicer v1.6.0 // indirect + github.com/leaanthony/webview2runtime v1.2.0 // indirect + github.com/logrusorgru/aurora v2.0.3+incompatible // indirect github.com/mattn/go-isatty v0.0.13 // indirect github.com/mitchellh/mapstructure v1.4.1 - github.com/pkg/browser v0.0.0-20210706143420-7d21f8c997e2 // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/sirupsen/logrus v1.8.1 // indirect - github.com/wailsapp/wails v1.16.6 + github.com/wailsapp/wails/v2 v2.0.0-alpha.73 github.com/xujiajun/nutsdb v0.6.0 - golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d // indirect golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d // indirect golang.org/x/sys v0.0.0-20210817190340-bfb29a6856f2 // indirect - golang.org/x/text v0.3.7 // indirect gopkg.in/tucnak/telebot.v2 v2.3.5 + nhooyr.io/websocket v1.8.7 // indirect ) diff --git a/go.sum b/go.sum index a4c2d3c..bb5fcaa 100644 --- a/go.sum +++ b/go.sum @@ -39,22 +39,22 @@ cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9 dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Netflix/go-expect v0.0.0-20180615182759-c93bf25de8e8/go.mod h1:oX5x61PbNXchhh0oikYAH+4Pcfw5LKv21+Jnpr6r6Pc= +github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= +github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/VividCortex/ewma v1.1.1/go.mod h1:2Tkkvm3sRDVXaiyucHiACn4cqf7DpdyLvmxzcbUokwA= github.com/VividCortex/ewma v1.2.0/go.mod h1:nz4BbCtbLyFDeC9SUHbtcT5644juEuWfUAUnGx7j5l4= -github.com/abadojack/whatlanggo v1.0.1 h1:19N6YogDnf71CTHm3Mp2qhYfkRdyvbgwWdd2EPxJRG4= -github.com/abadojack/whatlanggo v1.0.1/go.mod h1:66WiQbSbJBIlOZMsvbKe5m6pzQovxCH9B/K8tQB2uoc= github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d/go.mod h1:asat636LX7Bqt5lYEZ27JNDcqxfjdBQuJ/MM4CN/Lzo= +github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= @@ -82,11 +82,13 @@ github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7 github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= @@ -95,20 +97,45 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.m github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.12.0 h1:mRhaKNwANqRgUBGKmnI5ZxEk7QXmjQeCcuYFMX2bfcc= -github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= +github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= +github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.6.3 h1:ahKqKTFpO5KTPHxWZjEdPScmYaGtLo8Y4DMHoEsnp14= +github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= +github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= +github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= +github.com/go-git/go-billy/v5 v5.0.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= +github.com/go-git/go-billy/v5 v5.1.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= +github.com/go-git/go-billy/v5 v5.2.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= +github.com/go-git/go-git-fixtures/v4 v4.0.2-0.20200613231340-f56387b50c12/go.mod h1:m+ICp2rF3jDhFgEZ/8yziagdT1C+ZpZcrJjappBCDSw= +github.com/go-git/go-git/v5 v5.3.0/go.mod h1:xdX4bWJ48aOrdhnl2XqHYstHbbp6+LFS4r4X+lNVprw= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-playground/colors v1.2.0 h1:0EdjTXKrr2g1L/LQTYtIqabeHpZuGZz1U4osS1T8+5M= -github.com/go-playground/colors v1.2.0/go.mod h1:miw1R2JIE19cclPxsXqNdzLZsk4DP4iF+m88bRc7kfM= +github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM= +github.com/go-ole/go-ole v1.2.5 h1:t4MGB5xEDZvXI+0rMjjsfBsD7yAgp/s9ZDkL1JndXwY= +github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= +github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= +github.com/go-playground/validator/v10 v10.2.0 h1:KgJ0snyC2R9VXYN2rneOtQcw5aHQB1Vv0sFl1UcHBOY= +github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee h1:s+21KNqlpePfkah2I+gwHF8xmJWRjooY+5248k6m4A0= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= +github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8= +github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.0.2 h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo= +github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= @@ -142,7 +169,9 @@ github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= +github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -155,6 +184,7 @@ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= @@ -172,11 +202,14 @@ github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= @@ -203,64 +236,80 @@ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hinshun/vt10x v0.0.0-20180616224451-1954e6464174/go.mod h1:DqJ97dSdRW1W22yXSB90986pcOyQ7r45iio1KN2ez1A= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= +github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/jackmordaunt/icns v1.0.0 h1:RYSxplerf/l/DUd09AHtITwckkv/mqjVv4DjYdPmAMQ= github.com/jackmordaunt/icns v1.0.0/go.mod h1:7TTQVEuGzVVfOPPlLNHJIkzA6CoV7aH1Dv9dW351oOo= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= +github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.11 h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMWAQ= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= -github.com/kennygrant/sanitize v1.2.4 h1:gN25/otpP5vAsO2djbMhF/LQX6R7+O1TB4yv8NzpJ3o= -github.com/kennygrant/sanitize v1.2.4/go.mod h1:LGsjYYtgxbetdg5owWB2mpgUL6e2nfw2eObZ0u0qvak= +github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkdai/youtube/v2 v2.7.2 h1:ftkto2ygzfucKJlEKdjaV1hvtWqgbkaIZxRVT+zOgA0= github.com/kkdai/youtube/v2 v2.7.2/go.mod h1:XMmc0kbC9q/gPc6i881DjFYK53CuAAFrg1cx6Wn15F0= +github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.13.4 h1:0zhec2I8zGnjWcKyLl6i3gPqKANCCn5e9xmviEEeX6s= +github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/leaanthony/slicer v1.4.0/go.mod h1:FwrApmf8gOrpzEWM2J/9Lh79tyq8KTX5AzRtwV7m4AY= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/leaanthony/clir v1.0.4 h1:Dov2y9zWJmZr7CjaCe86lKa4b5CSxskGAt2yBkoDyiU= +github.com/leaanthony/clir v1.0.4/go.mod h1:k/RBkdkFl18xkkACMCLt09bhiZnrGORoxmomeMvDpE0= +github.com/leaanthony/debme v1.1.1/go.mod h1:3V+sCm5tYAgQymvSOfYQ5Xx2JCr+OXiD9Jkw3otUjiA= +github.com/leaanthony/debme v1.2.1/go.mod h1:3V+sCm5tYAgQymvSOfYQ5Xx2JCr+OXiD9Jkw3otUjiA= +github.com/leaanthony/go-ansi-parser v1.0.1/go.mod h1:7arTzgVI47srICYhvgUV4CGd063sGEeoSlych5yeSPM= +github.com/leaanthony/go-ansi-parser v1.2.0 h1:CcBhxqkxPATj7Lgdp9EgPUGv2o3FGkg3A5eN7ermsbM= +github.com/leaanthony/go-ansi-parser v1.2.0/go.mod h1:+vva/2y4alzVmmIEpk9QDhA7vLC5zKDTRwfZGOp3IWU= +github.com/leaanthony/go-common-file-dialog v1.0.3 h1:O0uGjKnWtdEADGrkg+TyAAbZylykMwwx/MNEXn9fp+Y= +github.com/leaanthony/go-common-file-dialog v1.0.3/go.mod h1:TGhEc9eSJgRsupZ+iH1ZgAOnEo9zp05cRH2j08RPrF0= +github.com/leaanthony/gosod v1.0.1/go.mod h1:W8RyeSFBXu7RpIxPGEJfW4moSyGGEjlJMLV25wEbAdU= +github.com/leaanthony/idgen v1.0.0 h1:IZreR+JGEzFV4yeVuBZA25gM0keUoFy+RDUldncQ+Jw= +github.com/leaanthony/idgen v1.0.0/go.mod h1:4nBZnt8ml/f/ic/EVQuLxuj817RccT2fyrUaZFxrcVA= +github.com/leaanthony/slicer v1.5.0/go.mod h1:FwrApmf8gOrpzEWM2J/9Lh79tyq8KTX5AzRtwV7m4AY= github.com/leaanthony/slicer v1.6.0 h1:1RFP5uiPJvT93TAHi+ipd3NACobkW53yUiBqZheE/Js= github.com/leaanthony/slicer v1.6.0/go.mod h1:o/Iz29g7LN0GqH3aMjWAe90381nyZlDNquK+mtH2Fj8= -github.com/leaanthony/spinner v0.5.3 h1:IMTvgdQCec5QA4qRy0wil4XsRP+QcG1OwLWVK/LPZ5Y= -github.com/leaanthony/spinner v0.5.3/go.mod h1:oHlrvWicr++CVV7ALWYi+qHk/XNA91D9IJ48IqmpVUo= -github.com/leaanthony/synx v0.1.0 h1:R0lmg2w6VMb8XcotOwAe5DLyzwjLrskNkwU7LLWsyL8= -github.com/leaanthony/synx v0.1.0/go.mod h1:Iz7eybeeG8bdq640iR+CwYb8p+9EOsgMWghkSRyZcqs= -github.com/leaanthony/wincursor v0.1.0 h1:Dsyp68QcF5cCs65AMBmxoYNEm0n8K7mMchG6a8fYxf8= -github.com/leaanthony/wincursor v0.1.0/go.mod h1:7TVwwrzSH/2Y9gLOGH+VhA+bZhoWXBRgbGNTMk+yimE= +github.com/leaanthony/webview2runtime v1.1.0/go.mod h1:hH9GnWCve3DYzNaPOcPbhHQ7fodXR1QJNsnwixid4Tk= +github.com/leaanthony/webview2runtime v1.2.0 h1:HyJzd06A20oC3TaRafM8oW+95HjBzBjkoTIWqkII/+g= +github.com/leaanthony/webview2runtime v1.2.0/go.mod h1:hH9GnWCve3DYzNaPOcPbhHQ7fodXR1QJNsnwixid4Tk= +github.com/leaanthony/winicon v0.0.0-20200606125418-4419cea822a0/go.mod h1:en5xhijl92aphrJdmRPlh4NI1L6wq3gEm0LpXAPghjU= +github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= +github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= +github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= +github.com/logrusorgru/aurora v2.0.3+incompatible h1:tOpm7WcpBTn4fjmVfgpQq0EfczGlG91VSDkswnjF5A8= +github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE= github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= -github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.13 h1:qdl+GuBjcsKKDco5BsxPJlId98mSWNKqYA+Co0SC1yA= github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= @@ -273,20 +322,20 @@ github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ= github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= -github.com/pkg/browser v0.0.0-20210706143420-7d21f8c997e2 h1:acNfDZXmm28D2Yg/c3ALnZStzNaZMSagpbr96vY6Zjc= -github.com/pkg/browser v0.0.0-20210706143420-7d21f8c997e2/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -305,6 +354,7 @@ github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y8 github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= @@ -312,11 +362,10 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= -github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= @@ -334,7 +383,6 @@ github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5q github.com/spf13/viper v1.8.0/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -343,12 +391,24 @@ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/syossan27/tebata v0.0.0-20180602121909-b283fe4bc5ba h1:2DHfQOxcpWdGf5q5IzCUFPNvRX9Icf+09RvQK2VnJq0= -github.com/syossan27/tebata v0.0.0-20180602121909-b283fe4bc5ba/go.mod h1:iLnlXG2Pakcii2CU0cbY07DRCSvpWNa7nFxtevhOChk= +github.com/tdewolff/minify v2.3.6+incompatible/go.mod h1:9Ov578KJUmAWpS6NeZwRZyT56Uf6o3Mcz9CEsg8USYs= +github.com/tdewolff/parse v2.3.4+incompatible/go.mod h1:8oBwCsVmUkgHO8M5iCzSIDtpzXOT0WXX9cWhz+bIzJQ= +github.com/tdewolff/test v1.0.6/go.mod h1:6DAvZliBAAnD7rhVgwaM7DE5/d9NMOAJ09SqYqeK4QE= +github.com/tidwall/gjson v1.8.0/go.mod h1:5/xDoumyyDNerp2U36lyolv46b3uF/9Bu6OfyQ9GImk= +github.com/tidwall/match v1.0.3/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.1.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/tidwall/sjson v1.1.7/go.mod h1:w/yG+ezBeTdUxiKs5NcPicO9diP38nk96QBAbIIGeFs= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= +github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/vbauerster/mpb/v5 v5.4.0/go.mod h1:fi4wVo7BVQ22QcvFObm+VwliQXlV1eBT8JDaKXR4JGI= -github.com/wailsapp/wails v1.16.6 h1:iN0tP0O/Gwr8SKWwgH4t+IqDlMCGeVquWoHTegk8JlQ= -github.com/wailsapp/wails v1.16.6/go.mod h1:aADbAvTzZrKGd4Td7d1l4Dp5Hx7lLJEvVH7guIHoDf8= +github.com/wailsapp/wails/v2 v2.0.0-alpha.73 h1:lGeg/4GZQnsgamdjRmOqIJTNK3qynFW3YkusHC8FRJA= +github.com/wailsapp/wails/v2 v2.0.0-alpha.73/go.mod h1:BFBtJpsnU9bMYfqhotj5wYn5EIGBXXJl5x+2ZT9UrKw= +github.com/wzshiming/ctc v1.2.3/go.mod h1:2tVAtIY7SUyraSk0JxvwmONNPFL4ARavPuEsg5+KA28= +github.com/wzshiming/winseq v0.0.0-20200112104235-db357dc107ae/go.mod h1:VTAq37rkGeV+WOybvZwjXiJOicICdpLCN8ifpISjK20= +github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xujiajun/gorouter v1.2.0/go.mod h1:yJrIta+bTNpBM/2UT8hLOaEAFckO+m/qmR3luMIQygM= github.com/xujiajun/mmap-go v1.0.1 h1:7Se7ss1fLPPRW+ePgqGpCkfGIZzJV6JPq9Wq9iv/WHc= @@ -357,11 +417,14 @@ github.com/xujiajun/nutsdb v0.6.0 h1:voRbF4bQO6gF9xiFZ+5w/fPHgEfR7Jea1NOtU34I8yE github.com/xujiajun/nutsdb v0.6.0/go.mod h1:Q8FXi2zeQRluPpUl/CKQ6J7u/9gcI02J6cZp3owFLyA= github.com/xujiajun/utils v0.0.0-20190123093513-8bf096c4f53b h1:jKG9OiL4T4xQN3IUrhUpc1tG+HfDXppkgVcrAiiaI/0= github.com/xujiajun/utils v0.0.0-20190123093513-8bf096c4f53b/go.mod h1:AZd87GYJlUzl82Yab2kTjx1EyXSQCAfZDhpTo1SQC4k= +github.com/xyproto/xpm v1.2.1/go.mod h1:cMnesLsD0PBXLgjDfTDEaKr8XyTFsnP1QycSqRw7BiY= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/ztrue/tracerr v0.3.0 h1:lDi6EgEYhPYPnKcjsYzmWw4EkFEoA/gfe+I9Y5f+h6Y= +github.com/ztrue/tracerr v0.3.0/go.mod h1:qEalzze4VN9O8tnhBXScfCrmoJo10o8TN5ciKjm6Mww= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= @@ -381,13 +444,15 @@ go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190123085648-057139ce5d2b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -401,8 +466,6 @@ golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMk golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d h1:RNPAfi2nHY7C2srAV8A49jpsYr0ADedCk1wq6fTMTvs= -golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -463,6 +526,7 @@ golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d h1:LO7XpTYMwTqxjLcGWPijK3vRXg1aWdlNOVOHRq45d7c= @@ -490,7 +554,6 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180606202747-9527bec2660b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -498,9 +561,7 @@ golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181221143128-b4a75ba826a6/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181228144115-9a3f9b0469bb/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -508,11 +569,12 @@ golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200107162124-548cf772de50/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -538,11 +600,12 @@ golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210611083646-a4fc73990273/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210817190340-bfb29a6856f2 h1:c8PlLMqBbOHoqtjteWm5/kbe6rNY2pbRfbIMVnepueo= golang.org/x/sys v0.0.0-20210817190340-bfb29a6856f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -555,8 +618,6 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -615,6 +676,7 @@ golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= @@ -717,26 +779,30 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -gopkg.in/AlecAivazis/survey.v1 v1.8.4/go.mod h1:iBNOmqKz/NUbZx3bA+4hAGLRC7fSK7tgtVDT4tB22XA= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/tucnak/telebot.v2 v2.3.5 h1:TdMJTlG8kvepsvZdy/gPeYEBdwKdwFFjH1AQTua9BOU= gopkg.in/tucnak/telebot.v2 v2.3.5/go.mod h1:BgaIIx50PSRS9pG59JH+geT82cfvoJU/IaI5TJdN3v8= +gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20190709130402-674ba3eaed22/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= @@ -747,6 +813,9 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= +nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g= +nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/main.go b/main.go index c52eaf0..4b542a6 100644 --- a/main.go +++ b/main.go @@ -2,6 +2,7 @@ package main import ( "context" + "embed" "errors" "fmt" "log" @@ -22,7 +23,10 @@ import ( _ "embed" "github.com/mitchellh/mapstructure" - "github.com/wailsapp/wails" + "github.com/wailsapp/wails/v2" + "github.com/wailsapp/wails/v2/pkg/options" + "github.com/wailsapp/wails/v2/pkg/options/dialog" + "github.com/wailsapp/wails/v2/pkg/options/mac" "github.com/xujiajun/nutsdb" tb "gopkg.in/tucnak/telebot.v2" ) @@ -30,6 +34,9 @@ import ( var wailsRuntime *wails.Runtime var plugins []Plugin = []Plugin{&Yt{Name: "youtube"}} +//go:embed frontend/dist/assets/* +var static embed.FS + //go:embed frontend/dist/main.js var js string @@ -40,7 +47,6 @@ var appState *AppState var newEntries = make(chan GenericEntry) type AppState struct { - log *wails.CustomLogger runtime *wails.Runtime db *nutsdb.DB plugins []Plugin @@ -49,12 +55,19 @@ type AppState struct { Stats *AppStats } -func (state *AppState) WailsInit(runtime *wails.Runtime) error { +func cors(fs http.Handler) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + // do your cors stuff + // return if you do not want the FileServer handle a specific request + w.Header().Set("Access-Control-Allow-Origin", "*") + fs.ServeHTTP(w, r) + } +} + +func (state *AppState) WailsInit(runtime *wails.Runtime) { // Save runtime state.runtime = runtime - state.log = runtime.Log.New("AppState") // Do some other initialisation - state.db = InitializeDb() state.Entries = DbGetAllEntries() state.Config = state.Config.Init() @@ -62,12 +75,17 @@ func (state *AppState) WailsInit(runtime *wails.Runtime) error { appState = state // this is sync so it blocks until finished and wails:loaded are not dispatched until this finishes - runtime.Events.On("wails:loaded", func(...interface{}) { - // entries := DbGetAllEntries() - time.Sleep(100 * time.Millisecond) - fmt.Println("EMIT YTD:ONLOAD") - runtime.Events.Emit("ytd:onload", state) - }) + if runtime.System.AppType() == "default" { // wails serve & ng serve + runtime.Events.On("wails:loaded", func(...interface{}) { + time.Sleep(100 * time.Millisecond) + fmt.Println("EMIT YTD:ONLOAD") + runtime.Events.Emit("ytd:onload", state) + }) + } else { // dekstop build + go func() { + runtime.Events.Emit("ytd:onload", state) + }() + } for _, plugin := range plugins { plugin.SetWailsRuntime(runtime) @@ -83,7 +101,7 @@ func (state *AppState) WailsInit(runtime *wails.Runtime) error { } }() */ - go func() { + /* go func() { for { restart := make(chan int) time.Sleep(3 * time.Second) @@ -98,7 +116,7 @@ func (state *AppState) WailsInit(runtime *wails.Runtime) error { } } - }() + }() */ go func() { restart := make(chan int) @@ -114,17 +132,20 @@ func (state *AppState) WailsInit(runtime *wails.Runtime) error { } }() - - return nil } func (state *AppState) GetAppConfig() *AppConfig { return state.Config } -func (state *AppState) SelectDirectory() string { - selectedDirectory := state.runtime.Dialog.SelectDirectory() - return selectedDirectory +func (state *AppState) SelectDirectory() (string, error) { + selectedDirectory, err := state.runtime.Dialog.OpenDirectory(&dialog.OpenDialog{ + AllowFiles: false, + CanCreateDirectories: true, + AllowDirectories: true, + Title: "Choose directory", + }) + return selectedDirectory, err } func (state *AppState) GetEntryById(entry GenericEntry) *GenericEntry { @@ -438,26 +459,16 @@ func (s *WailsRuntime) WailsShutdown() { } func main() { - - app := wails.CreateApp(&wails.AppConfig{ - Width: 1024, - Height: 768, - Title: "ytd", - JS: js, - CSS: css, - Colour: "#131313", - DisableInspector: false, - }) - app.Bind(&AppState{}) - app.Bind(saveSettingBoolValue) - app.Bind(saveSettingValue) - app.Bind(readSettingBoolValue) - app.Bind(readSettingValue) - app.Bind(removeEntry) - app.Bind(addToDownload) - app.Bind(startDownload) - app.Bind(isSupportedUrl) - app.Bind(isFFmpegInstalled) + /* app.Bind(&AppState{}) + app.Bind(saveSettingBoolValue) + app.Bind(saveSettingValue) + app.Bind(readSettingBoolValue) + app.Bind(readSettingValue) + app.Bind(removeEntry) + app.Bind(addToDownload) + app.Bind(startDownload) + app.Bind(isSupportedUrl) + app.Bind(isFFmpegInstalled) */ wg := &sync.WaitGroup{} wg.Add(2) @@ -513,9 +524,36 @@ func main() { }() go func() { - http.Handle("/", http.FileServer(http.Dir(currentDir))) + fs := http.StripPrefix("/static/", http.FileServer(http.FS(static))) + http.Handle("/tracks/", http.FileServer(http.Dir(currentDir))) + http.Handle("/static/", cors(fs)) http.ListenAndServe(":8080", nil) }() - app.Run() + app := &AppState{} + err := wails.Run(&options.App{ + Width: 1024, + Height: 768, + MinWidth: 1024, + MinHeight: 768, + StartHidden: false, + HideWindowOnClose: false, + DisableResize: true, + Fullscreen: false, + Startup: app.WailsInit, + Mac: &mac.Options{ + WebviewIsTransparent: true, + WindowBackgroundIsTranslucent: true, + TitleBar: mac.TitleBarHiddenInset(), + ActivationPolicy: mac.NSApplicationActivationPolicyAccessory, + }, + Title: "ytd", + Bind: []interface{}{ + app, + }, + }) + + if err != nil { + log.Fatalln(err) + } } diff --git a/plugins/plugins.go b/plugins/plugins.go index 7305e69..dd436a3 100755 --- a/plugins/plugins.go +++ b/plugins/plugins.go @@ -1,7 +1,7 @@ package plugins import ( - "github.com/wailsapp/wails" + "github.com/wailsapp/wails/v2" . "ytd/models" ) diff --git a/plugins/yt.go b/plugins/yt.go index 70f83ee..73869d8 100755 --- a/plugins/yt.go +++ b/plugins/yt.go @@ -9,7 +9,7 @@ import ( "time" ytDownloader "github.com/kkdai/youtube/v2" - "github.com/wailsapp/wails" + "github.com/wailsapp/wails/v2" . "ytd/constants" . "ytd/db" diff --git a/project.json b/project.json deleted file mode 100644 index 1ddf42c..0000000 --- a/project.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "name": "ytd", - "description": "Enter your project description", - "author": { - "name": "oskar", - "email": "marcio199226@gmail.com" - }, - "version": "0.1.0", - "binaryname": "ytd", - "frontend": { - "dir": "frontend", - "install": "npm install", - "build": "npm run build", - "bridge": "src", - "serve": "npm run serve" - }, - "tags": "", - "WailsVersion": "", - "CrossCompile": false, - "Platform": "", - "Architecture": "", - "LdFlags": "", - "GoPath": "", - "UseFirebug": false -} \ No newline at end of file diff --git a/vendor/github.com/Masterminds/semver/.travis.yml b/vendor/github.com/Masterminds/semver/.travis.yml deleted file mode 100644 index 096369d..0000000 --- a/vendor/github.com/Masterminds/semver/.travis.yml +++ /dev/null @@ -1,29 +0,0 @@ -language: go - -go: - - 1.6.x - - 1.7.x - - 1.8.x - - 1.9.x - - 1.10.x - - 1.11.x - - 1.12.x - - tip - -# Setting sudo access to false will let Travis CI use containers rather than -# VMs to run the tests. For more details see: -# - http://docs.travis-ci.com/user/workers/container-based-infrastructure/ -# - http://docs.travis-ci.com/user/workers/standard-infrastructure/ -sudo: false - -script: - - make setup - - make test - -notifications: - webhooks: - urls: - - https://webhooks.gitter.im/e/06e3328629952dabe3e0 - on_success: change # options: [always|never|change] default: always - on_failure: always # options: [always|never|change] default: always - on_start: never # options: [always|never|change] default: always diff --git a/vendor/github.com/Masterminds/semver/CHANGELOG.md b/vendor/github.com/Masterminds/semver/CHANGELOG.md deleted file mode 100644 index e405c9a..0000000 --- a/vendor/github.com/Masterminds/semver/CHANGELOG.md +++ /dev/null @@ -1,109 +0,0 @@ -# 1.5.0 (2019-09-11) - -## Added - -- #103: Add basic fuzzing for `NewVersion()` (thanks @jesse-c) - -## Changed - -- #82: Clarify wildcard meaning in range constraints and update tests for it (thanks @greysteil) -- #83: Clarify caret operator range for pre-1.0.0 dependencies (thanks @greysteil) -- #72: Adding docs comment pointing to vert for a cli -- #71: Update the docs on pre-release comparator handling -- #89: Test with new go versions (thanks @thedevsaddam) -- #87: Added $ to ValidPrerelease for better validation (thanks @jeremycarroll) - -## Fixed - -- #78: Fix unchecked error in example code (thanks @ravron) -- #70: Fix the handling of pre-releases and the 0.0.0 release edge case -- #97: Fixed copyright file for proper display on GitHub -- #107: Fix handling prerelease when sorting alphanum and num -- #109: Fixed where Validate sometimes returns wrong message on error - -# 1.4.2 (2018-04-10) - -## Changed -- #72: Updated the docs to point to vert for a console appliaction -- #71: Update the docs on pre-release comparator handling - -## Fixed -- #70: Fix the handling of pre-releases and the 0.0.0 release edge case - -# 1.4.1 (2018-04-02) - -## Fixed -- Fixed #64: Fix pre-release precedence issue (thanks @uudashr) - -# 1.4.0 (2017-10-04) - -## Changed -- #61: Update NewVersion to parse ints with a 64bit int size (thanks @zknill) - -# 1.3.1 (2017-07-10) - -## Fixed -- Fixed #57: number comparisons in prerelease sometimes inaccurate - -# 1.3.0 (2017-05-02) - -## Added -- #45: Added json (un)marshaling support (thanks @mh-cbon) -- Stability marker. See https://masterminds.github.io/stability/ - -## Fixed -- #51: Fix handling of single digit tilde constraint (thanks @dgodd) - -## Changed -- #55: The godoc icon moved from png to svg - -# 1.2.3 (2017-04-03) - -## Fixed -- #46: Fixed 0.x.x and 0.0.x in constraints being treated as * - -# Release 1.2.2 (2016-12-13) - -## Fixed -- #34: Fixed issue where hyphen range was not working with pre-release parsing. - -# Release 1.2.1 (2016-11-28) - -## Fixed -- #24: Fixed edge case issue where constraint "> 0" does not handle "0.0.1-alpha" - properly. - -# Release 1.2.0 (2016-11-04) - -## Added -- #20: Added MustParse function for versions (thanks @adamreese) -- #15: Added increment methods on versions (thanks @mh-cbon) - -## Fixed -- Issue #21: Per the SemVer spec (section 9) a pre-release is unstable and - might not satisfy the intended compatibility. The change here ignores pre-releases - on constraint checks (e.g., ~ or ^) when a pre-release is not part of the - constraint. For example, `^1.2.3` will ignore pre-releases while - `^1.2.3-alpha` will include them. - -# Release 1.1.1 (2016-06-30) - -## Changed -- Issue #9: Speed up version comparison performance (thanks @sdboyer) -- Issue #8: Added benchmarks (thanks @sdboyer) -- Updated Go Report Card URL to new location -- Updated Readme to add code snippet formatting (thanks @mh-cbon) -- Updating tagging to v[SemVer] structure for compatibility with other tools. - -# Release 1.1.0 (2016-03-11) - -- Issue #2: Implemented validation to provide reasons a versions failed a - constraint. - -# Release 1.0.1 (2015-12-31) - -- Fixed #1: * constraint failing on valid versions. - -# Release 1.0.0 (2015-10-20) - -- Initial release diff --git a/vendor/github.com/Masterminds/semver/LICENSE.txt b/vendor/github.com/Masterminds/semver/LICENSE.txt deleted file mode 100644 index 9ff7da9..0000000 --- a/vendor/github.com/Masterminds/semver/LICENSE.txt +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (C) 2014-2019, Matt Butcher and Matt Farina - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/vendor/github.com/Masterminds/semver/Makefile b/vendor/github.com/Masterminds/semver/Makefile deleted file mode 100644 index a7a1b4e..0000000 --- a/vendor/github.com/Masterminds/semver/Makefile +++ /dev/null @@ -1,36 +0,0 @@ -.PHONY: setup -setup: - go get -u gopkg.in/alecthomas/gometalinter.v1 - gometalinter.v1 --install - -.PHONY: test -test: validate lint - @echo "==> Running tests" - go test -v - -.PHONY: validate -validate: - @echo "==> Running static validations" - @gometalinter.v1 \ - --disable-all \ - --enable deadcode \ - --severity deadcode:error \ - --enable gofmt \ - --enable gosimple \ - --enable ineffassign \ - --enable misspell \ - --enable vet \ - --tests \ - --vendor \ - --deadline 60s \ - ./... || exit_code=1 - -.PHONY: lint -lint: - @echo "==> Running linters" - @gometalinter.v1 \ - --disable-all \ - --enable golint \ - --vendor \ - --deadline 60s \ - ./... || : diff --git a/vendor/github.com/Masterminds/semver/README.md b/vendor/github.com/Masterminds/semver/README.md deleted file mode 100644 index 1b52d2f..0000000 --- a/vendor/github.com/Masterminds/semver/README.md +++ /dev/null @@ -1,194 +0,0 @@ -# SemVer - -The `semver` package provides the ability to work with [Semantic Versions](http://semver.org) in Go. Specifically it provides the ability to: - -* Parse semantic versions -* Sort semantic versions -* Check if a semantic version fits within a set of constraints -* Optionally work with a `v` prefix - -[![Stability: -Active](https://masterminds.github.io/stability/active.svg)](https://masterminds.github.io/stability/active.html) -[![Build Status](https://travis-ci.org/Masterminds/semver.svg)](https://travis-ci.org/Masterminds/semver) [![Build status](https://ci.appveyor.com/api/projects/status/jfk66lib7hb985k8/branch/master?svg=true&passingText=windows%20build%20passing&failingText=windows%20build%20failing)](https://ci.appveyor.com/project/mattfarina/semver/branch/master) [![GoDoc](https://godoc.org/github.com/Masterminds/semver?status.svg)](https://godoc.org/github.com/Masterminds/semver) [![Go Report Card](https://goreportcard.com/badge/github.com/Masterminds/semver)](https://goreportcard.com/report/github.com/Masterminds/semver) - -If you are looking for a command line tool for version comparisons please see -[vert](https://github.com/Masterminds/vert) which uses this library. - -## Parsing Semantic Versions - -To parse a semantic version use the `NewVersion` function. For example, - -```go - v, err := semver.NewVersion("1.2.3-beta.1+build345") -``` - -If there is an error the version wasn't parseable. The version object has methods -to get the parts of the version, compare it to other versions, convert the -version back into a string, and get the original string. For more details -please see the [documentation](https://godoc.org/github.com/Masterminds/semver). - -## Sorting Semantic Versions - -A set of versions can be sorted using the [`sort`](https://golang.org/pkg/sort/) -package from the standard library. For example, - -```go - raw := []string{"1.2.3", "1.0", "1.3", "2", "0.4.2",} - vs := make([]*semver.Version, len(raw)) - for i, r := range raw { - v, err := semver.NewVersion(r) - if err != nil { - t.Errorf("Error parsing version: %s", err) - } - - vs[i] = v - } - - sort.Sort(semver.Collection(vs)) -``` - -## Checking Version Constraints - -Checking a version against version constraints is one of the most featureful -parts of the package. - -```go - c, err := semver.NewConstraint(">= 1.2.3") - if err != nil { - // Handle constraint not being parseable. - } - - v, _ := semver.NewVersion("1.3") - if err != nil { - // Handle version not being parseable. - } - // Check if the version meets the constraints. The a variable will be true. - a := c.Check(v) -``` - -## Basic Comparisons - -There are two elements to the comparisons. First, a comparison string is a list -of comma separated and comparisons. These are then separated by || separated or -comparisons. For example, `">= 1.2, < 3.0.0 || >= 4.2.3"` is looking for a -comparison that's greater than or equal to 1.2 and less than 3.0.0 or is -greater than or equal to 4.2.3. - -The basic comparisons are: - -* `=`: equal (aliased to no operator) -* `!=`: not equal -* `>`: greater than -* `<`: less than -* `>=`: greater than or equal to -* `<=`: less than or equal to - -## Working With Pre-release Versions - -Pre-releases, for those not familiar with them, are used for software releases -prior to stable or generally available releases. Examples of pre-releases include -development, alpha, beta, and release candidate releases. A pre-release may be -a version such as `1.2.3-beta.1` while the stable release would be `1.2.3`. In the -order of precidence, pre-releases come before their associated releases. In this -example `1.2.3-beta.1 < 1.2.3`. - -According to the Semantic Version specification pre-releases may not be -API compliant with their release counterpart. It says, - -> A pre-release version indicates that the version is unstable and might not satisfy the intended compatibility requirements as denoted by its associated normal version. - -SemVer comparisons without a pre-release comparator will skip pre-release versions. -For example, `>=1.2.3` will skip pre-releases when looking at a list of releases -while `>=1.2.3-0` will evaluate and find pre-releases. - -The reason for the `0` as a pre-release version in the example comparison is -because pre-releases can only contain ASCII alphanumerics and hyphens (along with -`.` separators), per the spec. Sorting happens in ASCII sort order, again per the spec. The lowest character is a `0` in ASCII sort order (see an [ASCII Table](http://www.asciitable.com/)) - -Understanding ASCII sort ordering is important because A-Z comes before a-z. That -means `>=1.2.3-BETA` will return `1.2.3-alpha`. What you might expect from case -sensitivity doesn't apply here. This is due to ASCII sort ordering which is what -the spec specifies. - -## Hyphen Range Comparisons - -There are multiple methods to handle ranges and the first is hyphens ranges. -These look like: - -* `1.2 - 1.4.5` which is equivalent to `>= 1.2, <= 1.4.5` -* `2.3.4 - 4.5` which is equivalent to `>= 2.3.4, <= 4.5` - -## Wildcards In Comparisons - -The `x`, `X`, and `*` characters can be used as a wildcard character. This works -for all comparison operators. When used on the `=` operator it falls -back to the pack level comparison (see tilde below). For example, - -* `1.2.x` is equivalent to `>= 1.2.0, < 1.3.0` -* `>= 1.2.x` is equivalent to `>= 1.2.0` -* `<= 2.x` is equivalent to `< 3` -* `*` is equivalent to `>= 0.0.0` - -## Tilde Range Comparisons (Patch) - -The tilde (`~`) comparison operator is for patch level ranges when a minor -version is specified and major level changes when the minor number is missing. -For example, - -* `~1.2.3` is equivalent to `>= 1.2.3, < 1.3.0` -* `~1` is equivalent to `>= 1, < 2` -* `~2.3` is equivalent to `>= 2.3, < 2.4` -* `~1.2.x` is equivalent to `>= 1.2.0, < 1.3.0` -* `~1.x` is equivalent to `>= 1, < 2` - -## Caret Range Comparisons (Major) - -The caret (`^`) comparison operator is for major level changes. This is useful -when comparisons of API versions as a major change is API breaking. For example, - -* `^1.2.3` is equivalent to `>= 1.2.3, < 2.0.0` -* `^0.0.1` is equivalent to `>= 0.0.1, < 1.0.0` -* `^1.2.x` is equivalent to `>= 1.2.0, < 2.0.0` -* `^2.3` is equivalent to `>= 2.3, < 3` -* `^2.x` is equivalent to `>= 2.0.0, < 3` - -# Validation - -In addition to testing a version against a constraint, a version can be validated -against a constraint. When validation fails a slice of errors containing why a -version didn't meet the constraint is returned. For example, - -```go - c, err := semver.NewConstraint("<= 1.2.3, >= 1.4") - if err != nil { - // Handle constraint not being parseable. - } - - v, _ := semver.NewVersion("1.3") - if err != nil { - // Handle version not being parseable. - } - - // Validate a version against a constraint. - a, msgs := c.Validate(v) - // a is false - for _, m := range msgs { - fmt.Println(m) - - // Loops over the errors which would read - // "1.3 is greater than 1.2.3" - // "1.3 is less than 1.4" - } -``` - -# Fuzzing - - [dvyukov/go-fuzz](https://github.com/dvyukov/go-fuzz) is used for fuzzing. - -1. `go-fuzz-build` -2. `go-fuzz -workdir=fuzz` - -# Contribute - -If you find an issue or want to contribute please file an [issue](https://github.com/Masterminds/semver/issues) -or [create a pull request](https://github.com/Masterminds/semver/pulls). diff --git a/vendor/github.com/Masterminds/semver/appveyor.yml b/vendor/github.com/Masterminds/semver/appveyor.yml deleted file mode 100644 index b2778df..0000000 --- a/vendor/github.com/Masterminds/semver/appveyor.yml +++ /dev/null @@ -1,44 +0,0 @@ -version: build-{build}.{branch} - -clone_folder: C:\gopath\src\github.com\Masterminds\semver -shallow_clone: true - -environment: - GOPATH: C:\gopath - -platform: - - x64 - -install: - - go version - - go env - - go get -u gopkg.in/alecthomas/gometalinter.v1 - - set PATH=%PATH%;%GOPATH%\bin - - gometalinter.v1.exe --install - -build_script: - - go install -v ./... - -test_script: - - "gometalinter.v1 \ - --disable-all \ - --enable deadcode \ - --severity deadcode:error \ - --enable gofmt \ - --enable gosimple \ - --enable ineffassign \ - --enable misspell \ - --enable vet \ - --tests \ - --vendor \ - --deadline 60s \ - ./... || exit_code=1" - - "gometalinter.v1 \ - --disable-all \ - --enable golint \ - --vendor \ - --deadline 60s \ - ./... || :" - - go test -v - -deploy: off diff --git a/vendor/github.com/Masterminds/semver/collection.go b/vendor/github.com/Masterminds/semver/collection.go deleted file mode 100644 index a782358..0000000 --- a/vendor/github.com/Masterminds/semver/collection.go +++ /dev/null @@ -1,24 +0,0 @@ -package semver - -// Collection is a collection of Version instances and implements the sort -// interface. See the sort package for more details. -// https://golang.org/pkg/sort/ -type Collection []*Version - -// Len returns the length of a collection. The number of Version instances -// on the slice. -func (c Collection) Len() int { - return len(c) -} - -// Less is needed for the sort interface to compare two Version objects on the -// slice. If checks if one is less than the other. -func (c Collection) Less(i, j int) bool { - return c[i].LessThan(c[j]) -} - -// Swap is needed for the sort interface to replace the Version objects -// at two different positions in the slice. -func (c Collection) Swap(i, j int) { - c[i], c[j] = c[j], c[i] -} diff --git a/vendor/github.com/Masterminds/semver/constraints.go b/vendor/github.com/Masterminds/semver/constraints.go deleted file mode 100644 index b94b934..0000000 --- a/vendor/github.com/Masterminds/semver/constraints.go +++ /dev/null @@ -1,423 +0,0 @@ -package semver - -import ( - "errors" - "fmt" - "regexp" - "strings" -) - -// Constraints is one or more constraint that a semantic version can be -// checked against. -type Constraints struct { - constraints [][]*constraint -} - -// NewConstraint returns a Constraints instance that a Version instance can -// be checked against. If there is a parse error it will be returned. -func NewConstraint(c string) (*Constraints, error) { - - // Rewrite - ranges into a comparison operation. - c = rewriteRange(c) - - ors := strings.Split(c, "||") - or := make([][]*constraint, len(ors)) - for k, v := range ors { - cs := strings.Split(v, ",") - result := make([]*constraint, len(cs)) - for i, s := range cs { - pc, err := parseConstraint(s) - if err != nil { - return nil, err - } - - result[i] = pc - } - or[k] = result - } - - o := &Constraints{constraints: or} - return o, nil -} - -// Check tests if a version satisfies the constraints. -func (cs Constraints) Check(v *Version) bool { - // loop over the ORs and check the inner ANDs - for _, o := range cs.constraints { - joy := true - for _, c := range o { - if !c.check(v) { - joy = false - break - } - } - - if joy { - return true - } - } - - return false -} - -// Validate checks if a version satisfies a constraint. If not a slice of -// reasons for the failure are returned in addition to a bool. -func (cs Constraints) Validate(v *Version) (bool, []error) { - // loop over the ORs and check the inner ANDs - var e []error - - // Capture the prerelease message only once. When it happens the first time - // this var is marked - var prerelesase bool - for _, o := range cs.constraints { - joy := true - for _, c := range o { - // Before running the check handle the case there the version is - // a prerelease and the check is not searching for prereleases. - if c.con.pre == "" && v.pre != "" { - if !prerelesase { - em := fmt.Errorf("%s is a prerelease version and the constraint is only looking for release versions", v) - e = append(e, em) - prerelesase = true - } - joy = false - - } else { - - if !c.check(v) { - em := fmt.Errorf(c.msg, v, c.orig) - e = append(e, em) - joy = false - } - } - } - - if joy { - return true, []error{} - } - } - - return false, e -} - -var constraintOps map[string]cfunc -var constraintMsg map[string]string -var constraintRegex *regexp.Regexp - -func init() { - constraintOps = map[string]cfunc{ - "": constraintTildeOrEqual, - "=": constraintTildeOrEqual, - "!=": constraintNotEqual, - ">": constraintGreaterThan, - "<": constraintLessThan, - ">=": constraintGreaterThanEqual, - "=>": constraintGreaterThanEqual, - "<=": constraintLessThanEqual, - "=<": constraintLessThanEqual, - "~": constraintTilde, - "~>": constraintTilde, - "^": constraintCaret, - } - - constraintMsg = map[string]string{ - "": "%s is not equal to %s", - "=": "%s is not equal to %s", - "!=": "%s is equal to %s", - ">": "%s is less than or equal to %s", - "<": "%s is greater than or equal to %s", - ">=": "%s is less than %s", - "=>": "%s is less than %s", - "<=": "%s is greater than %s", - "=<": "%s is greater than %s", - "~": "%s does not have same major and minor version as %s", - "~>": "%s does not have same major and minor version as %s", - "^": "%s does not have same major version as %s", - } - - ops := make([]string, 0, len(constraintOps)) - for k := range constraintOps { - ops = append(ops, regexp.QuoteMeta(k)) - } - - constraintRegex = regexp.MustCompile(fmt.Sprintf( - `^\s*(%s)\s*(%s)\s*$`, - strings.Join(ops, "|"), - cvRegex)) - - constraintRangeRegex = regexp.MustCompile(fmt.Sprintf( - `\s*(%s)\s+-\s+(%s)\s*`, - cvRegex, cvRegex)) -} - -// An individual constraint -type constraint struct { - // The callback function for the restraint. It performs the logic for - // the constraint. - function cfunc - - msg string - - // The version used in the constraint check. For example, if a constraint - // is '<= 2.0.0' the con a version instance representing 2.0.0. - con *Version - - // The original parsed version (e.g., 4.x from != 4.x) - orig string - - // When an x is used as part of the version (e.g., 1.x) - minorDirty bool - dirty bool - patchDirty bool -} - -// Check if a version meets the constraint -func (c *constraint) check(v *Version) bool { - return c.function(v, c) -} - -type cfunc func(v *Version, c *constraint) bool - -func parseConstraint(c string) (*constraint, error) { - m := constraintRegex.FindStringSubmatch(c) - if m == nil { - return nil, fmt.Errorf("improper constraint: %s", c) - } - - ver := m[2] - orig := ver - minorDirty := false - patchDirty := false - dirty := false - if isX(m[3]) { - ver = "0.0.0" - dirty = true - } else if isX(strings.TrimPrefix(m[4], ".")) || m[4] == "" { - minorDirty = true - dirty = true - ver = fmt.Sprintf("%s.0.0%s", m[3], m[6]) - } else if isX(strings.TrimPrefix(m[5], ".")) { - dirty = true - patchDirty = true - ver = fmt.Sprintf("%s%s.0%s", m[3], m[4], m[6]) - } - - con, err := NewVersion(ver) - if err != nil { - - // The constraintRegex should catch any regex parsing errors. So, - // we should never get here. - return nil, errors.New("constraint Parser Error") - } - - cs := &constraint{ - function: constraintOps[m[1]], - msg: constraintMsg[m[1]], - con: con, - orig: orig, - minorDirty: minorDirty, - patchDirty: patchDirty, - dirty: dirty, - } - return cs, nil -} - -// Constraint functions -func constraintNotEqual(v *Version, c *constraint) bool { - if c.dirty { - - // If there is a pre-release on the version but the constraint isn't looking - // for them assume that pre-releases are not compatible. See issue 21 for - // more details. - if v.Prerelease() != "" && c.con.Prerelease() == "" { - return false - } - - if c.con.Major() != v.Major() { - return true - } - if c.con.Minor() != v.Minor() && !c.minorDirty { - return true - } else if c.minorDirty { - return false - } - - return false - } - - return !v.Equal(c.con) -} - -func constraintGreaterThan(v *Version, c *constraint) bool { - - // If there is a pre-release on the version but the constraint isn't looking - // for them assume that pre-releases are not compatible. See issue 21 for - // more details. - if v.Prerelease() != "" && c.con.Prerelease() == "" { - return false - } - - return v.Compare(c.con) == 1 -} - -func constraintLessThan(v *Version, c *constraint) bool { - // If there is a pre-release on the version but the constraint isn't looking - // for them assume that pre-releases are not compatible. See issue 21 for - // more details. - if v.Prerelease() != "" && c.con.Prerelease() == "" { - return false - } - - if !c.dirty { - return v.Compare(c.con) < 0 - } - - if v.Major() > c.con.Major() { - return false - } else if v.Minor() > c.con.Minor() && !c.minorDirty { - return false - } - - return true -} - -func constraintGreaterThanEqual(v *Version, c *constraint) bool { - - // If there is a pre-release on the version but the constraint isn't looking - // for them assume that pre-releases are not compatible. See issue 21 for - // more details. - if v.Prerelease() != "" && c.con.Prerelease() == "" { - return false - } - - return v.Compare(c.con) >= 0 -} - -func constraintLessThanEqual(v *Version, c *constraint) bool { - // If there is a pre-release on the version but the constraint isn't looking - // for them assume that pre-releases are not compatible. See issue 21 for - // more details. - if v.Prerelease() != "" && c.con.Prerelease() == "" { - return false - } - - if !c.dirty { - return v.Compare(c.con) <= 0 - } - - if v.Major() > c.con.Major() { - return false - } else if v.Minor() > c.con.Minor() && !c.minorDirty { - return false - } - - return true -} - -// ~*, ~>* --> >= 0.0.0 (any) -// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0, <3.0.0 -// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0, <2.1.0 -// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0, <1.3.0 -// ~1.2.3, ~>1.2.3 --> >=1.2.3, <1.3.0 -// ~1.2.0, ~>1.2.0 --> >=1.2.0, <1.3.0 -func constraintTilde(v *Version, c *constraint) bool { - // If there is a pre-release on the version but the constraint isn't looking - // for them assume that pre-releases are not compatible. See issue 21 for - // more details. - if v.Prerelease() != "" && c.con.Prerelease() == "" { - return false - } - - if v.LessThan(c.con) { - return false - } - - // ~0.0.0 is a special case where all constraints are accepted. It's - // equivalent to >= 0.0.0. - if c.con.Major() == 0 && c.con.Minor() == 0 && c.con.Patch() == 0 && - !c.minorDirty && !c.patchDirty { - return true - } - - if v.Major() != c.con.Major() { - return false - } - - if v.Minor() != c.con.Minor() && !c.minorDirty { - return false - } - - return true -} - -// When there is a .x (dirty) status it automatically opts in to ~. Otherwise -// it's a straight = -func constraintTildeOrEqual(v *Version, c *constraint) bool { - // If there is a pre-release on the version but the constraint isn't looking - // for them assume that pre-releases are not compatible. See issue 21 for - // more details. - if v.Prerelease() != "" && c.con.Prerelease() == "" { - return false - } - - if c.dirty { - c.msg = constraintMsg["~"] - return constraintTilde(v, c) - } - - return v.Equal(c.con) -} - -// ^* --> (any) -// ^2, ^2.x, ^2.x.x --> >=2.0.0, <3.0.0 -// ^2.0, ^2.0.x --> >=2.0.0, <3.0.0 -// ^1.2, ^1.2.x --> >=1.2.0, <2.0.0 -// ^1.2.3 --> >=1.2.3, <2.0.0 -// ^1.2.0 --> >=1.2.0, <2.0.0 -func constraintCaret(v *Version, c *constraint) bool { - // If there is a pre-release on the version but the constraint isn't looking - // for them assume that pre-releases are not compatible. See issue 21 for - // more details. - if v.Prerelease() != "" && c.con.Prerelease() == "" { - return false - } - - if v.LessThan(c.con) { - return false - } - - if v.Major() != c.con.Major() { - return false - } - - return true -} - -var constraintRangeRegex *regexp.Regexp - -const cvRegex string = `v?([0-9|x|X|\*]+)(\.[0-9|x|X|\*]+)?(\.[0-9|x|X|\*]+)?` + - `(-([0-9A-Za-z\-]+(\.[0-9A-Za-z\-]+)*))?` + - `(\+([0-9A-Za-z\-]+(\.[0-9A-Za-z\-]+)*))?` - -func isX(x string) bool { - switch x { - case "x", "*", "X": - return true - default: - return false - } -} - -func rewriteRange(i string) string { - m := constraintRangeRegex.FindAllStringSubmatch(i, -1) - if m == nil { - return i - } - o := i - for _, v := range m { - t := fmt.Sprintf(">= %s, <= %s", v[1], v[11]) - o = strings.Replace(o, v[0], t, 1) - } - - return o -} diff --git a/vendor/github.com/Masterminds/semver/doc.go b/vendor/github.com/Masterminds/semver/doc.go deleted file mode 100644 index 6a6c24c..0000000 --- a/vendor/github.com/Masterminds/semver/doc.go +++ /dev/null @@ -1,115 +0,0 @@ -/* -Package semver provides the ability to work with Semantic Versions (http://semver.org) in Go. - -Specifically it provides the ability to: - - * Parse semantic versions - * Sort semantic versions - * Check if a semantic version fits within a set of constraints - * Optionally work with a `v` prefix - -Parsing Semantic Versions - -To parse a semantic version use the `NewVersion` function. For example, - - v, err := semver.NewVersion("1.2.3-beta.1+build345") - -If there is an error the version wasn't parseable. The version object has methods -to get the parts of the version, compare it to other versions, convert the -version back into a string, and get the original string. For more details -please see the documentation at https://godoc.org/github.com/Masterminds/semver. - -Sorting Semantic Versions - -A set of versions can be sorted using the `sort` package from the standard library. -For example, - - raw := []string{"1.2.3", "1.0", "1.3", "2", "0.4.2",} - vs := make([]*semver.Version, len(raw)) - for i, r := range raw { - v, err := semver.NewVersion(r) - if err != nil { - t.Errorf("Error parsing version: %s", err) - } - - vs[i] = v - } - - sort.Sort(semver.Collection(vs)) - -Checking Version Constraints - -Checking a version against version constraints is one of the most featureful -parts of the package. - - c, err := semver.NewConstraint(">= 1.2.3") - if err != nil { - // Handle constraint not being parseable. - } - - v, err := semver.NewVersion("1.3") - if err != nil { - // Handle version not being parseable. - } - // Check if the version meets the constraints. The a variable will be true. - a := c.Check(v) - -Basic Comparisons - -There are two elements to the comparisons. First, a comparison string is a list -of comma separated and comparisons. These are then separated by || separated or -comparisons. For example, `">= 1.2, < 3.0.0 || >= 4.2.3"` is looking for a -comparison that's greater than or equal to 1.2 and less than 3.0.0 or is -greater than or equal to 4.2.3. - -The basic comparisons are: - - * `=`: equal (aliased to no operator) - * `!=`: not equal - * `>`: greater than - * `<`: less than - * `>=`: greater than or equal to - * `<=`: less than or equal to - -Hyphen Range Comparisons - -There are multiple methods to handle ranges and the first is hyphens ranges. -These look like: - - * `1.2 - 1.4.5` which is equivalent to `>= 1.2, <= 1.4.5` - * `2.3.4 - 4.5` which is equivalent to `>= 2.3.4, <= 4.5` - -Wildcards In Comparisons - -The `x`, `X`, and `*` characters can be used as a wildcard character. This works -for all comparison operators. When used on the `=` operator it falls -back to the pack level comparison (see tilde below). For example, - - * `1.2.x` is equivalent to `>= 1.2.0, < 1.3.0` - * `>= 1.2.x` is equivalent to `>= 1.2.0` - * `<= 2.x` is equivalent to `<= 3` - * `*` is equivalent to `>= 0.0.0` - -Tilde Range Comparisons (Patch) - -The tilde (`~`) comparison operator is for patch level ranges when a minor -version is specified and major level changes when the minor number is missing. -For example, - - * `~1.2.3` is equivalent to `>= 1.2.3, < 1.3.0` - * `~1` is equivalent to `>= 1, < 2` - * `~2.3` is equivalent to `>= 2.3, < 2.4` - * `~1.2.x` is equivalent to `>= 1.2.0, < 1.3.0` - * `~1.x` is equivalent to `>= 1, < 2` - -Caret Range Comparisons (Major) - -The caret (`^`) comparison operator is for major level changes. This is useful -when comparisons of API versions as a major change is API breaking. For example, - - * `^1.2.3` is equivalent to `>= 1.2.3, < 2.0.0` - * `^1.2.x` is equivalent to `>= 1.2.0, < 2.0.0` - * `^2.3` is equivalent to `>= 2.3, < 3` - * `^2.x` is equivalent to `>= 2.0.0, < 3` -*/ -package semver diff --git a/vendor/github.com/Masterminds/semver/version.go b/vendor/github.com/Masterminds/semver/version.go deleted file mode 100644 index 400d4f9..0000000 --- a/vendor/github.com/Masterminds/semver/version.go +++ /dev/null @@ -1,425 +0,0 @@ -package semver - -import ( - "bytes" - "encoding/json" - "errors" - "fmt" - "regexp" - "strconv" - "strings" -) - -// The compiled version of the regex created at init() is cached here so it -// only needs to be created once. -var versionRegex *regexp.Regexp -var validPrereleaseRegex *regexp.Regexp - -var ( - // ErrInvalidSemVer is returned a version is found to be invalid when - // being parsed. - ErrInvalidSemVer = errors.New("Invalid Semantic Version") - - // ErrInvalidMetadata is returned when the metadata is an invalid format - ErrInvalidMetadata = errors.New("Invalid Metadata string") - - // ErrInvalidPrerelease is returned when the pre-release is an invalid format - ErrInvalidPrerelease = errors.New("Invalid Prerelease string") -) - -// SemVerRegex is the regular expression used to parse a semantic version. -const SemVerRegex string = `v?([0-9]+)(\.[0-9]+)?(\.[0-9]+)?` + - `(-([0-9A-Za-z\-]+(\.[0-9A-Za-z\-]+)*))?` + - `(\+([0-9A-Za-z\-]+(\.[0-9A-Za-z\-]+)*))?` - -// ValidPrerelease is the regular expression which validates -// both prerelease and metadata values. -const ValidPrerelease string = `^([0-9A-Za-z\-]+(\.[0-9A-Za-z\-]+)*)$` - -// Version represents a single semantic version. -type Version struct { - major, minor, patch int64 - pre string - metadata string - original string -} - -func init() { - versionRegex = regexp.MustCompile("^" + SemVerRegex + "$") - validPrereleaseRegex = regexp.MustCompile(ValidPrerelease) -} - -// NewVersion parses a given version and returns an instance of Version or -// an error if unable to parse the version. -func NewVersion(v string) (*Version, error) { - m := versionRegex.FindStringSubmatch(v) - if m == nil { - return nil, ErrInvalidSemVer - } - - sv := &Version{ - metadata: m[8], - pre: m[5], - original: v, - } - - var temp int64 - temp, err := strconv.ParseInt(m[1], 10, 64) - if err != nil { - return nil, fmt.Errorf("Error parsing version segment: %s", err) - } - sv.major = temp - - if m[2] != "" { - temp, err = strconv.ParseInt(strings.TrimPrefix(m[2], "."), 10, 64) - if err != nil { - return nil, fmt.Errorf("Error parsing version segment: %s", err) - } - sv.minor = temp - } else { - sv.minor = 0 - } - - if m[3] != "" { - temp, err = strconv.ParseInt(strings.TrimPrefix(m[3], "."), 10, 64) - if err != nil { - return nil, fmt.Errorf("Error parsing version segment: %s", err) - } - sv.patch = temp - } else { - sv.patch = 0 - } - - return sv, nil -} - -// MustParse parses a given version and panics on error. -func MustParse(v string) *Version { - sv, err := NewVersion(v) - if err != nil { - panic(err) - } - return sv -} - -// String converts a Version object to a string. -// Note, if the original version contained a leading v this version will not. -// See the Original() method to retrieve the original value. Semantic Versions -// don't contain a leading v per the spec. Instead it's optional on -// implementation. -func (v *Version) String() string { - var buf bytes.Buffer - - fmt.Fprintf(&buf, "%d.%d.%d", v.major, v.minor, v.patch) - if v.pre != "" { - fmt.Fprintf(&buf, "-%s", v.pre) - } - if v.metadata != "" { - fmt.Fprintf(&buf, "+%s", v.metadata) - } - - return buf.String() -} - -// Original returns the original value passed in to be parsed. -func (v *Version) Original() string { - return v.original -} - -// Major returns the major version. -func (v *Version) Major() int64 { - return v.major -} - -// Minor returns the minor version. -func (v *Version) Minor() int64 { - return v.minor -} - -// Patch returns the patch version. -func (v *Version) Patch() int64 { - return v.patch -} - -// Prerelease returns the pre-release version. -func (v *Version) Prerelease() string { - return v.pre -} - -// Metadata returns the metadata on the version. -func (v *Version) Metadata() string { - return v.metadata -} - -// originalVPrefix returns the original 'v' prefix if any. -func (v *Version) originalVPrefix() string { - - // Note, only lowercase v is supported as a prefix by the parser. - if v.original != "" && v.original[:1] == "v" { - return v.original[:1] - } - return "" -} - -// IncPatch produces the next patch version. -// If the current version does not have prerelease/metadata information, -// it unsets metadata and prerelease values, increments patch number. -// If the current version has any of prerelease or metadata information, -// it unsets both values and keeps curent patch value -func (v Version) IncPatch() Version { - vNext := v - // according to http://semver.org/#spec-item-9 - // Pre-release versions have a lower precedence than the associated normal version. - // according to http://semver.org/#spec-item-10 - // Build metadata SHOULD be ignored when determining version precedence. - if v.pre != "" { - vNext.metadata = "" - vNext.pre = "" - } else { - vNext.metadata = "" - vNext.pre = "" - vNext.patch = v.patch + 1 - } - vNext.original = v.originalVPrefix() + "" + vNext.String() - return vNext -} - -// IncMinor produces the next minor version. -// Sets patch to 0. -// Increments minor number. -// Unsets metadata. -// Unsets prerelease status. -func (v Version) IncMinor() Version { - vNext := v - vNext.metadata = "" - vNext.pre = "" - vNext.patch = 0 - vNext.minor = v.minor + 1 - vNext.original = v.originalVPrefix() + "" + vNext.String() - return vNext -} - -// IncMajor produces the next major version. -// Sets patch to 0. -// Sets minor to 0. -// Increments major number. -// Unsets metadata. -// Unsets prerelease status. -func (v Version) IncMajor() Version { - vNext := v - vNext.metadata = "" - vNext.pre = "" - vNext.patch = 0 - vNext.minor = 0 - vNext.major = v.major + 1 - vNext.original = v.originalVPrefix() + "" + vNext.String() - return vNext -} - -// SetPrerelease defines the prerelease value. -// Value must not include the required 'hypen' prefix. -func (v Version) SetPrerelease(prerelease string) (Version, error) { - vNext := v - if len(prerelease) > 0 && !validPrereleaseRegex.MatchString(prerelease) { - return vNext, ErrInvalidPrerelease - } - vNext.pre = prerelease - vNext.original = v.originalVPrefix() + "" + vNext.String() - return vNext, nil -} - -// SetMetadata defines metadata value. -// Value must not include the required 'plus' prefix. -func (v Version) SetMetadata(metadata string) (Version, error) { - vNext := v - if len(metadata) > 0 && !validPrereleaseRegex.MatchString(metadata) { - return vNext, ErrInvalidMetadata - } - vNext.metadata = metadata - vNext.original = v.originalVPrefix() + "" + vNext.String() - return vNext, nil -} - -// LessThan tests if one version is less than another one. -func (v *Version) LessThan(o *Version) bool { - return v.Compare(o) < 0 -} - -// GreaterThan tests if one version is greater than another one. -func (v *Version) GreaterThan(o *Version) bool { - return v.Compare(o) > 0 -} - -// Equal tests if two versions are equal to each other. -// Note, versions can be equal with different metadata since metadata -// is not considered part of the comparable version. -func (v *Version) Equal(o *Version) bool { - return v.Compare(o) == 0 -} - -// Compare compares this version to another one. It returns -1, 0, or 1 if -// the version smaller, equal, or larger than the other version. -// -// Versions are compared by X.Y.Z. Build metadata is ignored. Prerelease is -// lower than the version without a prerelease. -func (v *Version) Compare(o *Version) int { - // Compare the major, minor, and patch version for differences. If a - // difference is found return the comparison. - if d := compareSegment(v.Major(), o.Major()); d != 0 { - return d - } - if d := compareSegment(v.Minor(), o.Minor()); d != 0 { - return d - } - if d := compareSegment(v.Patch(), o.Patch()); d != 0 { - return d - } - - // At this point the major, minor, and patch versions are the same. - ps := v.pre - po := o.Prerelease() - - if ps == "" && po == "" { - return 0 - } - if ps == "" { - return 1 - } - if po == "" { - return -1 - } - - return comparePrerelease(ps, po) -} - -// UnmarshalJSON implements JSON.Unmarshaler interface. -func (v *Version) UnmarshalJSON(b []byte) error { - var s string - if err := json.Unmarshal(b, &s); err != nil { - return err - } - temp, err := NewVersion(s) - if err != nil { - return err - } - v.major = temp.major - v.minor = temp.minor - v.patch = temp.patch - v.pre = temp.pre - v.metadata = temp.metadata - v.original = temp.original - temp = nil - return nil -} - -// MarshalJSON implements JSON.Marshaler interface. -func (v *Version) MarshalJSON() ([]byte, error) { - return json.Marshal(v.String()) -} - -func compareSegment(v, o int64) int { - if v < o { - return -1 - } - if v > o { - return 1 - } - - return 0 -} - -func comparePrerelease(v, o string) int { - - // split the prelease versions by their part. The separator, per the spec, - // is a . - sparts := strings.Split(v, ".") - oparts := strings.Split(o, ".") - - // Find the longer length of the parts to know how many loop iterations to - // go through. - slen := len(sparts) - olen := len(oparts) - - l := slen - if olen > slen { - l = olen - } - - // Iterate over each part of the prereleases to compare the differences. - for i := 0; i < l; i++ { - // Since the lentgh of the parts can be different we need to create - // a placeholder. This is to avoid out of bounds issues. - stemp := "" - if i < slen { - stemp = sparts[i] - } - - otemp := "" - if i < olen { - otemp = oparts[i] - } - - d := comparePrePart(stemp, otemp) - if d != 0 { - return d - } - } - - // Reaching here means two versions are of equal value but have different - // metadata (the part following a +). They are not identical in string form - // but the version comparison finds them to be equal. - return 0 -} - -func comparePrePart(s, o string) int { - // Fastpath if they are equal - if s == o { - return 0 - } - - // When s or o are empty we can use the other in an attempt to determine - // the response. - if s == "" { - if o != "" { - return -1 - } - return 1 - } - - if o == "" { - if s != "" { - return 1 - } - return -1 - } - - // When comparing strings "99" is greater than "103". To handle - // cases like this we need to detect numbers and compare them. According - // to the semver spec, numbers are always positive. If there is a - at the - // start like -99 this is to be evaluated as an alphanum. numbers always - // have precedence over alphanum. Parsing as Uints because negative numbers - // are ignored. - - oi, n1 := strconv.ParseUint(o, 10, 64) - si, n2 := strconv.ParseUint(s, 10, 64) - - // The case where both are strings compare the strings - if n1 != nil && n2 != nil { - if s > o { - return 1 - } - return -1 - } else if n1 != nil { - // o is a string and s is a number - return -1 - } else if n2 != nil { - // s is a string and o is a number - return 1 - } - // Both are numbers - if si > oi { - return 1 - } - return -1 - -} diff --git a/vendor/github.com/Masterminds/semver/version_fuzz.go b/vendor/github.com/Masterminds/semver/version_fuzz.go deleted file mode 100644 index b42bcd6..0000000 --- a/vendor/github.com/Masterminds/semver/version_fuzz.go +++ /dev/null @@ -1,10 +0,0 @@ -// +build gofuzz - -package semver - -func Fuzz(data []byte) int { - if _, err := NewVersion(string(data)); err != nil { - return 0 - } - return 1 -} diff --git a/vendor/github.com/abadojack/whatlanggo/.travis.yml b/vendor/github.com/abadojack/whatlanggo/.travis.yml deleted file mode 100644 index 55be3b3..0000000 --- a/vendor/github.com/abadojack/whatlanggo/.travis.yml +++ /dev/null @@ -1,13 +0,0 @@ -language: go - -go: - - 1.8 - - tip - -install: - - go get golang.org/x/tools/cmd/cover - - go get github.com/mattn/goveralls - -script: - - go test -v -covermode=count -coverprofile=coverage.out - - $HOME/gopath/bin/goveralls -coverprofile=coverage.out -service=travis-ci -repotoken $COVERALLS_TOKEN diff --git a/vendor/github.com/abadojack/whatlanggo/LICENSE b/vendor/github.com/abadojack/whatlanggo/LICENSE deleted file mode 100644 index 7bf91f7..0000000 --- a/vendor/github.com/abadojack/whatlanggo/LICENSE +++ /dev/null @@ -1,26 +0,0 @@ -(The MIT License) - -Copyright (c) 2017 Abado Jack Mtulla -Copyright (c) 2014 Titus Wormer -Copyright (c) 2008 Kent S Johnson -Copyright (c) 2006 Jacob R Rideout -Copyright (c) 2004 Maciej Ceglowski - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/abadojack/whatlanggo/README.md b/vendor/github.com/abadojack/whatlanggo/README.md deleted file mode 100644 index d9bf203..0000000 --- a/vendor/github.com/abadojack/whatlanggo/README.md +++ /dev/null @@ -1,101 +0,0 @@ -# Whatlanggo - -[![Build Status](https://travis-ci.org/abadojack/whatlanggo.svg?branch=master)](https://travis-ci.org/abadojack/whatlanggo) [![Go Report Card](https://goreportcard.com/badge/github.com/abadojack/whatlanggo)](https://goreportcard.com/report/github.com/abadojack/whatlanggo) [![GoDoc](https://godoc.org/github.com/abadojack/whatlanggo?status.png)](https://godoc.org/github.com/abadojack/whatlanggo) [![Coverage Status](https://coveralls.io/repos/github/abadojack/whatlanggo/badge.svg)](https://coveralls.io/github/abadojack/whatlanggo) - -Natural language detection for Go. -## Features -* Supports [84 languages](https://github.com/abadojack/whatlanggo/blob/master/SUPPORTED_LANGUAGES.md) -* 100% written in Go -* No external dependencies -* Fast -* Recognizes not only a language, but also a script (Latin, Cyrillic, etc) - -## Getting started -Installation: -```sh - go get -u github.com/abadojack/whatlanggo -``` - -Simple usage example: -```go -package main - -import ( - "fmt" - - "github.com/abadojack/whatlanggo" -) - -func main() { - info := whatlanggo.Detect("Foje funkcias kaj foje ne funkcias") - fmt.Println("Language:", info.Lang.String(), " Script:", whatlanggo.Scripts[info.Script], " Confidence: ", info.Confidence) -} -``` - -## Blacklisting and whitelisting -```go -package main - -import ( - "fmt" - - "github.com/abadojack/whatlanggo" -) - -func main() { - //Blacklist - options := whatlanggo.Options{ - Blacklist: map[whatlanggo.Lang]bool{ - whatlanggo.Ydd: true, - }, - } - - info := whatlanggo.DetectWithOptions("האקדמיה ללשון העברית", options) - - fmt.Println("Language:", info.Lang.String(), "Script:", whatlanggo.Scripts[info.Script]) - - //Whitelist - options1 := whatlanggo.Options{ - Whitelist: map[whatlanggo.Lang]bool{ - whatlanggo.Epo: true, - whatlanggo.Ukr: true, - }, - } - - info = whatlanggo.DetectWithOptions("Mi ne scias", options1) - fmt.Println("Language:", info.Lang.String(), " Script:", whatlanggo.Scripts[info.Script]) -} -``` -For more details, please check the [documentation](https://godoc.org/github.com/abadojack/whatlanggo). - -## Requirements -Go 1.8 or higher - -## How does it work? - -### How does the language recognition work? - -The algorithm is based on the trigram language models, which is a particular case of n-grams. -To understand the idea, please check the original whitepaper [Cavnar and Trenkle '94: N-Gram-Based Text Categorization'](https://www.researchgate.net/publication/2375544_N-Gram-Based_Text_Categorization). - -### How _IsReliable_ calculated? - -It is based on the following factors: -* How many unique trigrams are in the given text -* How big is the difference between the first and the second(not returned) detected languages? This metric is called `rate` in the code base. - -Therefore, it can be presented as 2d space with threshold functions, that splits it into "Reliable" and "Not reliable" areas. -This function is a hyperbola and it looks like the following one: - -Language recognition whatlang rust - -For more details, please check a blog article [Introduction to Rust Whatlang Library and Natural Language Identification Algorithms](https://www.greyblake.com/blog/2017-07-30-introduction-to-rust-whatlang-library-and-natural-language-identification-algorithms/). - -## License -[MIT](https://github.com/abadojack/whatlanggo/blob/master/LICENSE) - -## Derivation -whatlanggo is a derivative of [Franc](https://github.com/wooorm/franc) (JavaScript, MIT) by [Titus Wormer](https://github.com/wooorm). - -## Acknowledgements -Thanks to [greyblake](https://github.com/greyblake) (Potapov Sergey) for creating [whatlang-rs](https://github.com/greyblake/whatlang-rs) from where I got the idea and algorithms. diff --git a/vendor/github.com/abadojack/whatlanggo/SUPPORTED_LANGUAGES.md b/vendor/github.com/abadojack/whatlanggo/SUPPORTED_LANGUAGES.md deleted file mode 100644 index 0d3aa5d..0000000 --- a/vendor/github.com/abadojack/whatlanggo/SUPPORTED_LANGUAGES.md +++ /dev/null @@ -1,94 +0,0 @@ -# whatlanggo - -Natural language detection implemented in Go. -Please check also [README](https://github.com/abadojack/whatlanggo/blob/master/README.md) -and [documentation](https://godoc.org/github.com/abadojack/whatlanggo). - -## Supported languages - -| Language | ISO 639-3 | const | -| -------------- | --------- | ----------- | -| Esperanto | epo | Epo | -| English | eng | Eng | -| Russian | rus | Rus | -| Mandarin | cmn | Cmn | -| Spanish | spa | Spa | -| Portuguese | por | Por | -| Italian | ita | Ita | -| Bengali | ben | Ben | -| French | fra | Fra | -| German | deu | Deu | -| Ukrainian | ukr | Ukr | -| Georgian | kat | Kat | -| Arabic | arb | Arb | -| Hindi | hin | Hin | -| Japanese | jpn | Jpn | -| Hebrew | heb | Heb | -| Yiddish | ydd | Ydd | -| Polish | pol | Pol | -| Amharic | amh | Amh | -| Tigrinya | tir | Tir | -| Javanese | jav | Jav | -| Korean | kor | Kor | -| Bokmal | nob | Nob | -| Nynorsk | nno | Nno | -| Danish | dan | Dan | -| Swedish | swe | Swe | -| Finnish | fin | Fin | -| Turkish | tur | Tur | -| Dutch | nld | Nld | -| Hungarian | hun | Hun | -| Czech | ces | Ces | -| Greek | ell | Ell | -| Bulgarian | bul | Bul | -| Belarusian | bel | Bel | -| Marathi | mar | Mar | -| Kannada | kan | Kan | -| Romanian | ron | Ron | -| Slovene | slv | Slv | -| Croatian | hrv | Hrv | -| Serbian | srp | Srp | -| Macedonian | mkd | Mkd | -| Lithuanian | lit | Lit | -| Latvian | lav | Lav | -| Estonian | est | Est | -| Tamil | tam | Tam | -| Vietnamese | vie | Vie | -| Urdu | urd | Urd | -| Thai | tha | Tha | -| Gujarati | guj | Guj | -| Uzbek | uzb | Uzb | -| Punjabi | pan | Pan | -| Azerbaijani | azj | Azj | -| Indonesian | ind | Ind | -| Telugu | tel | Tel | -| Persian | pes | Pes | -| Malayalam | mal | Mal | -| Hausa | hau | Hau | -| Oriya | ori | Ori | -| Burmese | mya | Mya | -| Bhojpuri | bho | Bho | -| Tagalog | tgl | Tgl | -| Yoruba | yor | Yor | -| Maithili | mai | Mai | -| Oromo | orm | Orm | -| Igbo | ibo | Ibo | -| Cebuano | ceb | Ceb | -| Kurdish | kur | Kur | -| Malagasy | mlg | Mlg | -| Saraiki | skr | Skr | -| Nepali | nep | Nep | -| Sinhalese | sin | Sin | -| Khmer | khm | Khm | -| Turkmen | tuk | Tuk | -| Somali | som | Som | -| Chewa | nya | Nya | -| Akan | aka | Aka | -| Zulu | zul | Zul | -| Kinyarwanda | kin | Kin | -| Haitian Creole | hat | Hat | -| Ilocano | ilo | Ilo | -| Rundi | run | Run | -| Shona | sna | Sna | -| Uyghur | uig | Uig | -| Africaans | afr | Afr | diff --git a/vendor/github.com/abadojack/whatlanggo/constants.go b/vendor/github.com/abadojack/whatlanggo/constants.go deleted file mode 100644 index b3b773a..0000000 --- a/vendor/github.com/abadojack/whatlanggo/constants.go +++ /dev/null @@ -1,8 +0,0 @@ -package whatlanggo - -const maxTrigramDistance = 300 -const maxTotalDistance = 90000 - -// ReliableConfidenceThreshold is confidence rating that has to be succeeded -// for the language detection to be considered reliable. -const ReliableConfidenceThreshold = 0.8 diff --git a/vendor/github.com/abadojack/whatlanggo/detect.go b/vendor/github.com/abadojack/whatlanggo/detect.go deleted file mode 100644 index d4e1eab..0000000 --- a/vendor/github.com/abadojack/whatlanggo/detect.go +++ /dev/null @@ -1,187 +0,0 @@ -package whatlanggo - -import ( - "sort" - "unicode" -) - -// Detect language and script of the given text. -func Detect(text string) Info { - return DetectWithOptions(text, Options{}) -} - -// DetectLang detects only the language by a given text. -func DetectLang(text string) Lang { - return Detect(text).Lang -} - -// DetectLangWithOptions detects only the language of the given text with the provided options. -func DetectLangWithOptions(text string, options Options) Lang { - return DetectWithOptions(text, options).Lang -} - -// DetectWithOptions detects the language and script of the given text with the provided options. -func DetectWithOptions(text string, options Options) Info { - script := DetectScript(text) - if script != nil { - lang, confidence := detectLangBaseOnScript(text, options, script) - return Info{ - Lang: lang, - Script: script, - Confidence: confidence, - } - } - - return Info{ - Lang: -1, - Script: nil, - Confidence: 0, - } -} - -func detectLangBaseOnScript(text string, options Options, script *unicode.RangeTable) (Lang, float64) { - switch script { - case unicode.Latin: - return detectLangInProfiles(text, options, latinLangs) - case unicode.Cyrillic: - return detectLangInProfiles(text, options, cyrillicLangs) - case unicode.Devanagari: - return detectLangInProfiles(text, options, devanagariLangs) - case unicode.Hebrew: - return detectLangInProfiles(text, options, hebrewLangs) - case unicode.Ethiopic: - return detectLangInProfiles(text, options, ethiopicLangs) - case unicode.Arabic: - return detectLangInProfiles(text, options, arabicLangs) - case unicode.Han: - return Cmn, 1 - case unicode.Bengali: - return Ben, 1 - case unicode.Hangul: - return Kor, 1 - case unicode.Georgian: - return Kat, 1 - case unicode.Greek: - return Ell, 1 - case unicode.Kannada: - return Kan, 1 - case unicode.Tamil: - return Tam, 1 - case unicode.Thai: - return Tha, 1 - case unicode.Gujarati: - return Guj, 1 - case unicode.Gurmukhi: - return Pan, 1 - case unicode.Telugu: - return Tel, 1 - case unicode.Malayalam: - return Mal, 1 - case unicode.Oriya: - return Ori, 1 - case unicode.Myanmar: - return Mya, 1 - case unicode.Sinhala: - return Sin, 1 - case unicode.Khmer: - return Khm, 1 - case _HiraganaKatakana: - return Jpn, 1 - default: - return -1, 0 - } -} - -type langDistance struct { - lang Lang - dist int -} - -func detectLangInProfiles(text string, options Options, langProfileList langProfileList) (Lang, float64) { - trigrams := getTrigramsWithPositions(text) - - langDistances := []langDistance{} - - for lang, langTrigrams := range langProfileList { - if len(options.Whitelist) != 0 { - //Skip non-whitelisted languages. - if _, ok := options.Whitelist[lang]; !ok { - continue - } - } else if len(options.Blacklist) != 0 { - //skip blacklisted languages. - if _, ok := options.Blacklist[lang]; ok { - continue - } - } - - dist := calculateDistance(langTrigrams, trigrams) - langDistances = append(langDistances, langDistance{lang, dist}) - } - - switch len(langDistances) { - case 0: - return -1, 0 - case 1: - return langDistances[0].lang, 1 - default: - return calculateConfidence(langDistances, trigrams) - } -} - -func calculateConfidence(langDistances []langDistance, trigrams map[string]int) (Lang, float64) { - sort.SliceStable(langDistances, func(i, j int) bool { return langDistances[i].dist < langDistances[j].dist }) - langDist1 := langDistances[0] - langDist2 := langDistances[1] - score1 := maxTotalDistance - langDist1.dist - score2 := maxTotalDistance - langDist2.dist - - var confidence float64 - if score1 == 0 { - // If score1 is 0, score2 is 0 as well, because array is sorted. - // Therefore there is no language to return. - return -1, 0 - } else if score2 == 0 { - // If score2 is 0, return first language, to prevent division by zero in the rate formula. - // In this case confidence is calculated by another formula. - // At this point there are two options: - // * Text contains random characters that accidentally match trigrams of one of the languages - // * Text really matches one of the languages. - // - // Number 500.0 is based on experiments and common sense expectations. - confidence = float64((score1) / 500.0) - if confidence > 1.0 { - confidence = 1.0 - } - return langDist1.lang, confidence - } - - rate := float64((score1 - score2)) / float64(score2) - - // Hyperbola function. Everything that is above the function has confidence = 1.0 - // If rate is below, confidence is calculated proportionally. - // Numbers 12.0 and 0.05 are obtained experimentally, so the function represents common sense. - - confidentRate := float64(12.0/float64(len(trigrams))) + 0.05 - if rate > confidentRate { - confidence = 1.0 - } else { - confidence = rate / confidentRate - } - - return langDist1.lang, confidence -} - -func calculateDistance(langTrigrams []string, textTrigrams map[string]int) int { - var dist, totalDist int - for i, trigram := range langTrigrams { - if n, ok := textTrigrams[trigram]; ok { - dist = abs(n - i) - } else { - dist = maxTrigramDistance - } - totalDist += dist - } - - return totalDist -} diff --git a/vendor/github.com/abadojack/whatlanggo/doc.go b/vendor/github.com/abadojack/whatlanggo/doc.go deleted file mode 100644 index 27918ee..0000000 --- a/vendor/github.com/abadojack/whatlanggo/doc.go +++ /dev/null @@ -1,4 +0,0 @@ -//Package whatlanggo detects natural languages and scripts ( writing systems ). -//Languages are represented by a determined list of constants while scripts are -//represented by *unicode.RangeTable. -package whatlanggo diff --git a/vendor/github.com/abadojack/whatlanggo/go.mod b/vendor/github.com/abadojack/whatlanggo/go.mod deleted file mode 100644 index ceb328b..0000000 --- a/vendor/github.com/abadojack/whatlanggo/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module github.com/abadojack/whatlanggo - -go 1.12 diff --git a/vendor/github.com/abadojack/whatlanggo/info.go b/vendor/github.com/abadojack/whatlanggo/info.go deleted file mode 100644 index a50dffb..0000000 --- a/vendor/github.com/abadojack/whatlanggo/info.go +++ /dev/null @@ -1,15 +0,0 @@ -package whatlanggo - -import "unicode" - -//Info represents a full outcome of language detection. -type Info struct { - Lang Lang - Script *unicode.RangeTable - Confidence float64 -} - -// IsReliable returns true if Confidence is greater than the Reliable Confidence Threshold -func (info *Info) IsReliable() bool { - return info.Confidence > ReliableConfidenceThreshold -} diff --git a/vendor/github.com/abadojack/whatlanggo/lang.go b/vendor/github.com/abadojack/whatlanggo/lang.go deleted file mode 100644 index ca78e42..0000000 --- a/vendor/github.com/abadojack/whatlanggo/lang.go +++ /dev/null @@ -1,584 +0,0 @@ -package whatlanggo - -// Lang represents a language following ISO 639-3 standard. -type Lang int - -// Aka ... -const ( - Afr Lang = iota - Aka - Amh - Arb - Azj - Bel - Ben - Bho - Bul - Ceb - Ces - Cmn - Dan - Deu - Ell - Eng - Epo - Est - Fin - Fra - Guj - Hat - Hau - Heb - Hin - Hrv - Hun - Ibo - Ilo - Ind - Ita - Jav - Jpn - Kan - Kat - Khm - Kin - Kor - Kur - Lav - Lit - Mai - Mal - Mar - Mkd - Mlg - Mya - Nep - Nld - Nno - Nob - Nya - Ori - Orm - Pan - Pes - Pol - Por - Ron - Run - Rus - Sin - Skr - Slv - Sna - Som - Spa - Srp - Swe - Tam - Tel - Tgl - Tha - Tir - Tuk - Tur - Uig - Ukr - Urd - Uzb - Vie - Ydd - Yor - Zul -) - -// CodeToLang gets enum by ISO 639-3 code as a string. -func CodeToLang(code string) Lang { - lang := map[string]Lang{ - "afr": Afr, - "aka": Aka, - "amh": Amh, - "arb": Arb, - "azj": Azj, - "bel": Bel, - "ben": Ben, - "bho": Bho, - "bul": Bul, - "ceb": Ceb, - "ces": Ces, - "cmn": Cmn, - "dan": Dan, - "deu": Deu, - "ell": Ell, - "eng": Eng, - "epo": Epo, - "est": Est, - "fin": Fin, - "fra": Fra, - "guj": Guj, - "hat": Hat, - "hau": Hau, - "heb": Heb, - "hin": Hin, - "hrv": Hrv, - "hun": Hun, - "ibo": Ibo, - "ilo": Ilo, - "ind": Ind, - "ita": Ita, - "jav": Jav, - "jpn": Jpn, - "kan": Kan, - "kat": Kat, - "khm": Khm, - "kin": Kin, - "kor": Kor, - "kur": Kur, - "lav": Lav, - "lit": Lit, - "mai": Mai, - "mal": Mal, - "mar": Mar, - "mkd": Mkd, - "mlg": Mlg, - "mya": Mya, - "nep": Nep, - "nld": Nld, - "nno": Nno, - "nob": Nob, - "nya": Nya, - "ori": Ori, - "orm": Orm, - "pan": Pan, - "pes": Pes, - "pol": Pol, - "por": Por, - "ron": Ron, - "run": Run, - "rus": Rus, - "sin": Sin, - "skr": Skr, - "slv": Slv, - "sna": Sna, - "som": Som, - "spa": Spa, - "srp": Srp, - "swe": Swe, - "tam": Tam, - "tel": Tel, - "tgl": Tgl, - "tha": Tha, - "tir": Tir, - "tuk": Tuk, - "tur": Tur, - "uig": Uig, - "ukr": Ukr, - "urd": Urd, - "uzb": Uzb, - "vie": Vie, - "ydd": Ydd, - "yor": Yor, - "zul": Zul, - } - - if val, ok := lang[code]; ok { - return val - } - - return -1 -} - -// Iso6391 returns ISO 639-1 code of Lang as a string. -func (lang Lang) Iso6391() string { - return LangToStringShort(lang) -} - -// LangToStringShort converts enum into ISO 639-1 code as a string. -// Return empty string when there is no ISO 639-1 code. -// Deprecated: LangToStringShort is deprected and exists for historical -// compatibility. Please use `Lang.Iso6391()` instead. -func LangToStringShort(lang Lang) string { - langMap := map[Lang]string{ - Afr: "af", - Aka: "ak", - Amh: "am", - Arb: "ar", - Azj: "az", // Azerbaijani iso 639-3 is aze, iso 639-1 az - Bel: "be", - Ben: "bn", - Bho: "bh", - Bul: "bg", - Ceb: "", // No iso 639-1 code - Ces: "cs", - Cmn: "zh", // No iso 639-1, but http://www.loc.gov/standards/iso639-2/faq.html#24 - Dan: "da", - Deu: "de", - Ell: "el", - Eng: "en", - Epo: "eo", - Est: "et", - Fin: "fi", - Fra: "fr", - Guj: "gu", - Hat: "ht", - Hau: "ha", - Heb: "he", - Hin: "hi", - Hrv: "hr", - Hun: "hu", - Ibo: "ig", - Ilo: "", // No iso639-1 - Ind: "id", - Ita: "it", - Jav: "jv", - Jpn: "ja", - Kan: "kn", - Kat: "ka", - Khm: "km", - Kin: "rw", - Kor: "ko", - Kur: "ku", - Lav: "lv", - Lit: "lt", - Mai: "", // No iso639-1 - Mal: "ml", - Mar: "mr", - Mkd: "mk", - Mlg: "mg", - Mya: "my", - Nep: "ne", - Nld: "nl", - Nno: "nn", - Nob: "nb", - Nya: "ny", - Ori: "or", - Orm: "om", - Pan: "pa", - Pes: "", // No iso639-1 - Pol: "pl", - Por: "pt", - Ron: "ro", - Run: "rn", - Rus: "ru", - Sin: "si", - Skr: "", // No iso639-1 - Slv: "sl", - Sna: "sn", - Som: "so", - Spa: "es", - Srp: "sr", - Swe: "sv", - Tam: "ta", - Tel: "te", - Tgl: "tl", - Tha: "th", - Tir: "ti", - Tuk: "tk", - Tur: "tr", - Uig: "ug", - Ukr: "uk", - Urd: "ur", - Uzb: "uz", - Vie: "vi", - Ydd: "", // No iso639-1 - Yor: "yo", - Zul: "zu", - } - - if val, ok := langMap[lang]; ok { - return val - } - - return "" -} - -// Iso6393 returns ISO 639-3 code of Lang as a string. -func (lang Lang) Iso6393() string { - return LangToString(lang) -} - -// LangToString converts enum into ISO 639-3 code as a string. -// Deprecated: LangToString is deprected and exists for historical -// compatibility. Please use `Lang.Iso6393()` instead. -func LangToString(lang Lang) string { - langMap := map[Lang]string{ - Afr: "afr", - Aka: "aka", - Amh: "amh", - Arb: "arb", - Azj: "azj", - Bel: "bel", - Ben: "ben", - Bho: "bho", - Bul: "bul", - Ceb: "ceb", - Ces: "ces", - Cmn: "cmn", - Dan: "dan", - Deu: "deu", - Ell: "ell", - Eng: "eng", - Epo: "epo", - Est: "est", - Fin: "fin", - Fra: "fra", - Guj: "guj", - Hat: "hat", - Hau: "hau", - Heb: "heb", - Hin: "hin", - Hrv: "hrv", - Hun: "hun", - Ibo: "ibo", - Ilo: "ilo", - Ind: "ind", - Ita: "ita", - Jav: "jav", - Jpn: "jpn", - Kan: "kan", - Kat: "kat", - Khm: "khm", - Kin: "kin", - Kor: "kor", - Kur: "kur", - Lav: "lav", - Lit: "lit", - Mai: "mai", - Mal: "mal", - Mar: "mar", - Mkd: "mkd", - Mlg: "mlg", - Mya: "mya", - Nep: "nep", - Nld: "nld", - Nno: "nno", - Nob: "nob", - Nya: "nya", - Ori: "ori", - Orm: "orm", - Pan: "pan", - Pes: "pes", - Pol: "pol", - Por: "por", - Ron: "ron", - Run: "run", - Rus: "rus", - Sin: "sin", - Skr: "skr", - Slv: "slv", - Sna: "sna", - Som: "som", - Spa: "spa", - Srp: "srp", - Swe: "swe", - Tam: "tam", - Tel: "tel", - Tgl: "tgl", - Tha: "tha", - Tir: "tir", - Tuk: "tuk", - Tur: "tur", - Uig: "uig", - Ukr: "ukr", - Urd: "urd", - Uzb: "uzb", - Vie: "vie", - Ydd: "ydd", - Yor: "yor", - Zul: "zul", - } - - if val, ok := langMap[lang]; ok { - return val - } - - return "" -} - -// String returns the human-readable name of the language as a string. -func (lang Lang) String() string { - if val, ok := Langs[lang]; ok { - return val - } - - return "" -} - -// Langs represents a map of Lang to language name. -var Langs = map[Lang]string{ - Afr: "Afrikaans", - Aka: "Akan", - Amh: "Amharic", - Arb: "Arabic", - Azj: "Azerbaijani", - Bel: "Belarusian", - Ben: "Bengali", - Bho: "Bhojpuri", - Bul: "Bulgarian", - Ceb: "Cebuano", - Ces: "Czech", - Cmn: "Mandarin", - Dan: "Danish", - Deu: "German", - Ell: "Greek", - Eng: "English", - Epo: "Esperanto", - Est: "Estonian", - Fin: "Finnish", - Fra: "French", - Guj: "Gujarati", - Hat: "Haitian Creole", - Hau: "Hausa", - Heb: "Hebrew", - Hin: "Hindi", - Hrv: "Croatian", - Hun: "Hungarian", - Ibo: "Igbo", - Ilo: "Ilocano", - Ind: "Indonesian", - Ita: "Italian", - Jav: "Javanese", - Jpn: "Japanese", - Kan: "Kannada", - Kat: "Georgian", - Khm: "Khmer", - Kin: "Kinyarwanda", - Kor: "Korean", - Kur: "Kurdish", - Lav: "Latvian", - Lit: "Lithuanian", - Mai: "Maithili", - Mal: "Malayalam", - Mar: "Marathi", - Mkd: "Macedonian", - Mlg: "Malagasy", - Mya: "Burmese", - Nep: "Nepali", - Nld: "Dutch", - Nno: "Nynorsk", - Nob: "Bokmal", - Nya: "Chewa", - Ori: "Oriya", - Orm: "Oromo", - Pan: "Punjabi", - Pes: "Persian", - Pol: "Polish", - Por: "Portuguese", - Ron: "Romanian", - Run: "Rundi", - Rus: "Russian", - Sin: "Sinhalese", - Skr: "Saraiki", - Slv: "Slovene", - Sna: "Shona", - Som: "Somali", - Spa: "Spanish", - Srp: "Serbian", - Swe: "Swedish", - Tam: "Tamil", - Tel: "Telugu", - Tgl: "Tagalog", - Tha: "Thai", - Tir: "Tigrinya", - Tuk: "Turkmen", - Tur: "Turkish", - Uig: "Uyghur", - Ukr: "Ukrainian", - Urd: "Urdu", - Uzb: "Uzbek", - Vie: "Vietnamese", - Ydd: "Yiddish", - Yor: "Yoruba", - Zul: "Zulu", -} - -//langProfileList ... -type langProfileList map[Lang][]string - -//LatinLangs ... -var latinLangs = langProfileList{ - Spa: []string{" de", "os ", "de ", " la", "la ", " y ", " a ", "es ", "ón ", "ión", "rec", "ere", "der", " co", "e l", "el ", "en ", "ien", "cho", "ent", "ech", "ció", "aci", "o a", "a p", " el", "a l", "al ", "as ", "e d", " en", "na ", "ona", "s d", "da ", "nte", " to", "ad ", "ene", "con", " pr", " su", "tod", " se", "ho ", "los", " pe", "per", "ers", " lo", "o d", " ti", "cia", "n d", "cio", " es", "ida", "res", "a t", "tie", "ion", "rso", "te ", "do ", " in", "son", " re", " li", "to ", "dad", "tad", "e s", "est", "pro", "que", "men", " po", "a e", "oda", "nci", " qu", " un", "ue ", "ne ", "n e", "s y", "lib", "su ", " na", "s e", "nac", "ia ", "e e", "tra", " pa", "or ", "ado", "a d", "nes", "ra ", "se ", "ual", "a c", "er ", "por", "com", "nal", "rta", "a s", "ber", " o ", "one", "s p", "dos", "rá ", "sta", "les", "des", "ibe", "ser", "era", "ar ", "ert", "ter", " di", "ale", "l d", "nto", "hos", "del", "ica", "a a", "s n", "n c", "oci", "imi", "io ", "o e", "re ", "y l", "e c", "ant", "cci", " as", "las", "par", "ame", " cu", "ici", "ara", "enc", "s t", "ndi", " so", "o s", "mie", "tos", "una", "bre", "dic", "cla", "s l", "e a", "l p", "pre", "ntr", "o t", "ial", "y a", "nid", "n p", "a y", "man", "omo", "so ", "n l", " al", "ali", "s a", "no ", " ig", "s s", "e p", "nta", "uma", "ten", "gua", "ade", "y e", "soc", "mo ", " fu", "igu", "o p", "n t", "hum", "d d", "ran", "ria", "y d", "ada", "tiv", "l e", "cas", " ca", "vid", "l t", "s c", "ido", "das", "dis", "s i", " hu", "s o", "nad", "fun", " ma", "rac", "nda", "eli", "sar", "und", " ac", "uni", "mbr", "a u", "die", "e i", "qui", "a i", " ha", "lar", " tr", "odo", "ca ", "tic", "o y", "cti", "lid", "ori", "ndo", "ari", " me", "ta ", "ind", "esa", "cua", "un ", "ier", "tal", "esp", "seg", "ele", "ons", "ito", "ont", "iva", "s h", "d y", "nos", "ist", "rse", " le", "cie", "ide", "edi", "ecc", "ios", "l m", "r e", "med", "tor", "sti", "n a", "rim", "uie", "ple", "tri", "ibr", "sus", "lo ", "ect", "pen", "y c", "an ", "e h", "n s", "ern", "tar", "l y", "egu", "gur", "ura", "int", "ond", "mat", "l r", "r a", "isf", "ote"}, - Eng: []string{" th", "the", " an", "he ", "nd ", "and", "ion", " of", "of ", "tio", " to", "to ", "on ", " in", "al ", "ati", "igh", "ght", "rig", " ri", "or ", "ent", "as ", "ed ", "is ", "ll ", "in ", " be", "e r", "ne ", "one", "ver", "all", "s t", "eve", "t t", " fr", "s a", " ha", " re", "ty ", "ery", " or", "d t", " pr", "ht ", " co", " ev", "e h", "e a", "ng ", "ts ", "his", "ing", "be ", "yon", " sh", "ce ", "ree", "fre", "ryo", "n t", "her", "men", "nat", "sha", "pro", "nal", "y a", "has", "es ", "for", " hi", "hal", "f t", "n a", "n o", "nt ", " pe", "s o", " fo", "d i", "nce", "er ", "ons", "res", "e s", "ect", "ity", "ly ", "l b", "ry ", "e e", "ers", "e i", "an ", "e o", " de", "cti", "dom", "edo", "eed", "hts", "ter", "ona", "re ", " no", " wh", " a ", " un", "d f", " as", "ny ", "l a", "e p", "ere", " en", " na", " wi", "nit", "nte", "d a", "any", "ted", " di", "ns ", "sta", "th ", "per", "ith", "e t", "st ", "e c", "y t", "om ", "soc", " ar", "ch ", "t o", "d o", "nti", "s e", "equ", "ve ", "oci", "man", " fu", "ote", "oth", "ess", " al", " ac", "wit", "ial", " ma", "uni", " se", "rea", " so", " on", "lit", "int", "r t", "y o", "enc", "thi", "ual", "t a", " eq", "tat", "qua", "ive", " st", "ali", "e w", "l o", "are", "f h", "con", "te ", "led", " is", "und", "cia", "e f", "le ", " la", "y i", "uma", "by ", " by", "hum", "f a", "ic ", " hu", "ave", "ge ", "r a", " wo", "o a", "ms ", "com", " me", "eas", "s d", "tec", " li", "n e", "en ", "rat", "tit", "ple", "whe", "ate", "o t", "s r", "t f", "rot", " ch", "cie", "dis", "age", "ary", "o o", "anc", "eli", "no ", " fa", " su", "son", "inc", "at ", "nda", "hou", "wor", "t i", "nde", "rom", "oms", " ot", "g t", "eme", "tle", "iti", "gni", "s w", "itl", "duc", "d w", "whi", "act", "hic", "aw ", "law", " he", "ich", "min", "imi", "ort", "o s", "se ", "e b", "ntr", "tra", "edu", "oun", "tan", "e d", "nst", "l p", "d n", "ld ", "nta", "s i", "ble", "n p", " pu", "n s", " at", "ily", "rth", "tho", "ful", "ssi", "der", "o e", "cat", "uca", "unt", "ien", " ed", "o p", "h a", "era", "ind", "pen", "sec", "n w", "omm", "r s"}, - Por: []string{"os ", "de ", " de", " a ", " e ", "o d", "to ", "ão ", " di", "ent", "da ", "ito", "em ", " co", "eit", "as ", "dir", "es ", "ire", "rei", " se", "ção", "ade", "a p", "dad", "e d", "s d", "men", "nte", "do ", "s e", " pr", " pe", "dos", " to", " da", "a a", "o e", " o ", "o a", "ess", "con", "tod", "que", " qu", "te ", "e a", " do", "al ", "res", "ida", "m d", " in", " ou", "er ", "sso", " na", " re", " po", "a s", " li", "uma", "cia", "ar ", "pro", "e e", "a d", " te", "açã", "a t", " es", " su", "ou ", "ue ", "s p", "tos", "a e", "des", "ra ", "com", "no ", "ame", "ia ", "e p", "tem", "nto", " pa", "is ", "est", "tra", "ões", "na ", "s o", "oda", "das", "ser", "soa", "s n", "pes", "o p", "s a", "o s", "e o", " em", " as", " à ", "o o", "ais", "ber", "ado", "oa ", "o t", "e s", "man", "sua", "ua ", " no", " os", "a c", "ter", "çõe", "erd", "lib", "rda", "s s", "nci", "ibe", "e n", "ica", "odo", "so ", "nal", "ntr", "s t", "hum", "ura", " ao", "ona", "ual", " so", "or ", "ma ", "sta", "o c", "a n", "pre", "ara", "era", "ons", "e t", "r a", "par", "o à", " hu", "ind", "por", "cio", "ria", "m a", "s c", " um", "a l", "gua", "ran", " en", "ndi", "o i", "e c", "raç", "ion", "nid", "aci", "ano", "soc", "e r", "oci", " ac", "und", "sen", "nos", "nsi", "rec", "ime", "ali", "int", "um ", "per", "nac", " al", "m o", "r p", " fu", "ndo", "ont", "açõ", " ig", "igu", "fun", "nta", " ma", "uni", "cçã", "ere", " ex", "a i", " me", "ese", "rio", "l d", "a o", "s h", "pel", "ada", "pri", "ide", "am ", "m p", "pod", "s f", "ém ", "a f", "io ", "ode", "ca ", "ita", "lid", "tiv", "e f", "vid", "r e", "esp", "nda", "omo", "e l", "naç", "o r", "ant", "a q", "tad", "lic", "iva", " fa", "ver", "s l", "ial", "cla", "ngu", "ing", " ca", "mo ", "der", " vi", "eli", "ist", "ta ", "se ", "ati", "ios", "ido", "r o", "eci", "dis", " un", "e i", "r d", "ecç", "o q", "s i", "qua", "ênc", "a m", "seu", "sti", "nin", "uer", "rar", "cas", "aos", "ens", "gué", "ias", "sid", "uém", "tur", "dam", "sse", "ao ", "ela", "l e", "for", "tec", "ote", " pl", "ena", " tr", "m c", "tro", " ni", "ico", "rot"}, - Ind: []string{"an ", "ang", " da", "ng ", " pe", "ak ", " ke", " me", "ata", " se", "dan", "kan", " di", " be", "hak", "ber", "per", "ran", "nga", "yan", "eng", " ya", " ha", "asa", "gan", "men", "ara", "nya", "n p", "n d", "n k", "a d", "tan", " at", "at ", "ora", "ala", "san", " ba", "ap ", "erh", "n b", "rha", "ya ", " ma", "g b", "a s", "pen", "eba", "as ", "aan", "uk ", "ntu", " or", "eti", "tas", "aka", "tia", "ban", "set", " un", "n s", "ter", "n y", " te", "k m", "tuk", "bas", "iap", "lam", "beb", "am ", " de", "k a", "keb", "n m", "i d", "unt", "ama", "dal", "ah ", "ika", "dak", "ebe", "p o", "sa ", "pun", "mem", "n h", "end", "den", "ra ", "ela", "ri ", "nda", " sa", "di ", "ma ", "a m", "n t", "k d", "n a", "ngg", "tau", "man", "gar", "eri", "asi", " ti", "un ", "al ", "ada", "um ", "a p", "lak", "ari", "au ", " ne", "neg", "a b", "ngs", "ta ", "ole", "leh", "ert", "ers", "ida", "k h", "ana", "gsa", "dar", "uka", "tid", "bat", "sia", "era", "eh ", "dap", "ila", "dil", "h d", "atu", "sam", "ia ", "i m", " in", "lan", "aha", "uan", "tu ", "ai ", "t d", "a a", "g d", "har", "sem", "na ", "apa", "ser", "ena", "kat", "uat", "erb", "erl", "mas", "rta", "ega", "ung", "nan", "emp", "n u", "kum", "l d", "g s", " hu", "ka ", "ent", "pat", "mba", "aga", "nta", "adi", " su", "eni", "uku", "n i", "huk", "ind", "ar ", "rga", "i s", "aku", "ndi", "sua", "ni ", "rus", "han", "si ", "car", "nny", " la", "in ", "u d", "ik ", "ua ", "lah", "rik", "usi", "emb", "ann", "mer", "ian", "gga", "lai", "min", "a u", "lua", "ema", "emu", "arg", "dun", "dip", "a t", "mat", "aya", "rbu", "aru", "erk", "rka", "ini", "eka", "a k", "rak", "kes", "yat", "iba", "nas", "rma", "ern", "ese", "s p", "nus", " pu", "anu", "ina", " ta", "mel", "mua", "kel", "k s", "us ", "ndu", "nak", "da ", "sya", "das", "pem", "lin", "ut ", "yar", "ami", "upu", "seo", "aik", "eor", "iny", "aup", "tak", "ipe", "ing", "tin", " an", "dik", "uar", "ili", "g t", "rse", "sar", "ant", "g p", "a n", "aks", "ain", " ja", "t p", " um", "g m", "dir", "ksa", "umu", "kep", "mum", "i k", "eca", "rat", "m p", "h p", "aba", "ses", "m m"}, - Fra: []string{" de", "es ", "de ", "ion", "nt ", "et ", "tio", " et", "ent", " la", "la ", "e d", "on ", "ne ", "oit", "e l", "le ", " le", "s d", "e p", "t d", "ati", "roi", " dr", "dro", "it ", " à ", " co", "té ", "ns ", "te ", "e s", "men", "re ", " to", "con", " l’", "tou", "que", " qu", "les", " so", "des", "son", " pe", "ons", " un", "s l", "s e", " pr", "ue ", " pa", "e c", "t l", "ts ", "onn", " au", "e a", "eme", "e e", " li", "ont", "ant", "out", "ute", "t à", "res", "ers", " sa", "ce ", " a ", "tre", "per", "a d", "cti", "er ", "lib", "ité", " en", "ux ", " re", "en ", "rso", "à l", " ou", " in", "lle", "un ", "nat", "ou ", "nne", "n d", "une", " d’", " se", "par", "nte", "us ", "ur ", "s s", "ans", "dan", "a p", "r l", "pro", "its", "és ", "t p", "ire", "e t", "s p", "sa ", " dé", "ond", "é d", "a l", "nce", "ert", "aux", "omm", "nal", "me ", " na", " fo", "iqu", " ce", "rté", "ect", "ale", "ber", "t a", "s a", " da", "mme", "ibe", "san", "e r", " po", "com", "al ", "s c", "qui", "our", "t e", " ne", "e n", "ous", "r d", "ali", "ter", " di", "fon", "e o", "au ", " ch", "air", "ui ", "ell", " es", "lit", "s n", "iss", "éra", "tes", "soc", "aut", "oci", "êtr", "ien", "int", "du ", "est", "été", "tra", "pou", " pl", "rat", "ar ", "ran", "rai", "s o", "ona", "ain", "cla", "éga", "anc", "rs ", "eur", "pri", "n c", "e m", "s t", "à u", " do", "ure", "bre", "ut ", " êt", "age", " ét", "nsi", "sur", "ein", "sen", "ser", "ndi", "ens", "ess", "ntr", "ir ", " ma", "cia", "n p", "st ", "a c", " du", "l e", " su", "bli", "ge ", "rés", " ré", "e q", "ass", "nda", "peu", "ée ", "l’a", " te", "a s", "tat", "il ", "tés", "ais", "u d", "ine", "ind", "é e", "qu’", " ac", "s i", "n t", "t c", "n a", "l’h", "t q", "soi", "t s", "cun", "rit", " ég", "oir", "’en", "nta", "hom", " on", "n e", " mo", "ie ", "ign", "rel", "nna", "t i", "l n", " tr", "ill", "ple", "s é", "l’e", "rec", "a r", "ote", "sse", "uni", "idé", "ive", "s u", "t ê", "ins", "act", " fa", "n s", " vi", "gal", " as", "lig", "ssa", "pré", "leu", "e f", "lic", "dis", "ver", " nu", "ten", "ssi", "rot", "tec", "s m", "abl"}, - Deu: []string{"en ", "er ", "der", " un", "nd ", "und", "ein", "ung", "cht", " de", "ich", "sch", "ng ", " ge", "ie ", "che", "ech", " di", "die", "rec", "gen", "ine", "eit", " re", "ch ", " da", "n d", "ver", "hen", " zu", "t d", " au", "ht ", " ha", "lic", "it ", "ten", "rei", " be", "in ", " ve", " in", " ei", "nde", "auf", "den", "ede", "zu ", "n s", "uf ", "fre", "ne ", "ter", "es ", " je", "jed", "n u", " an", "sei", "and", " fr", "run", "at ", " se", "e u", "das", "hei", "s r", "hte", "hat", "nsc", "nge", "r h", "as ", "ens", " al", "ere", "lle", "t a", " we", "n g", "rde", "nte", "ese", "men", " od", "ode", "ner", "g d", "all", "t u", "ers", "te ", "nen", " so", "d d", "n a", "ben", "lei", " gr", " vo", "wer", "e a", "ege", "ion", " st", "ige", "le ", "cha", " me", "haf", "aft", "n j", "ren", " er", "erk", "ent", "bei", " si", "eih", "ihe", "kei", "erd", "tig", "n i", "on ", "lun", "r d", "len", "gem", "ies", "gru", "tli", "unt", "chu", "ern", "ges", "end", "e s", "ft ", "st ", "ist", "tio", "ati", " gl", "sta", "gun", "mit", "sen", "n n", " na", "n z", "ite", " wi", "r g", "eic", "e e", "ei ", "lie", "r s", "n w", "gle", "mei", "de ", "uch", "em ", "chl", "nat", "rch", "t w", "des", "n e", "hre", "ale", "spr", "d f", "ach", "sse", "r e", " sc", "urc", "r m", "nie", "e f", "fen", "e g", "e d", " ni", "dur", "dar", "int", " du", "geh", "ied", "t s", " mi", "alt", "her", "hab", "f g", "sic", "ste", "taa", "aat", "he ", "ang", "ruc", "hli", "tz ", "eme", "abe", "h a", "n v", "nun", "geg", "arf", "rf ", "ehe", "pru", " is", "erf", "e m", "ans", "ndl", "e b", "tun", "n o", "d g", "n r", "r v", "wie", "ber", "r a", "arb", "bes", "t i", "h d", "r w", "r b", " ih", "d s", "igk", "gke", "nsp", "dig", "ema", "ell", "eru", "n f", "ins", "rbe", "ffe", "esc", "igu", "ger", "str", "ken", "e v", "gew", "han", "ind", "rt ", " ar", "ieß", "n h", "rn ", "man", "r i", "hut", "utz", "d a", "ls ", "ebe", "von", "lte", "r o", "rli", "etz", "tra", "aus", "det", "hul", "e i", "one", "nne", "isc", "son", "sel", "et ", "ohn", "t g", "sam", " fa", "rst", "rkl", "ser", "iem", "g v", "t z", "err"}, - Jav: []string{"ng ", "an ", "ang", " ka", "ing", "kan", " sa", "ak ", "lan", " la", "hak", " ha", " pa", " ma", "ngg", "ara", "sa ", "abe", "ne ", " in", "n k", "ant", " ng", "tan", "nin", " an", "nga", "ata", "en ", "ran", " ba", "man", "ban", "ane", "hi ", "n u", "ong", "ra ", "nth", "ake", "ke ", "thi", " da", "won", "uwo", "ung", "ngs", " uw", "asa", "gsa", "ben", "sab", "ana", "aka", "beb", "a k", "g p", "nan", "nda", "adi", "at ", "awa", "san", "ni ", "dan", "g k", "pan", "eba", " be", "e k", "g s", "ani", "bas", " pr", "dha", "aya", "gan", "ya ", "wa ", "di ", "mar", "n s", " wa", "ta ", "a s", "g u", " na", "e h", "arb", "a n", "a b", "a l", "n n", " ut", "yan", "n p", "asi", "g d", "han", "ah ", "g n", " tu", " um", "as ", "wen", "dak", "rbe", "dar", " di", "ggo", "sar", "mat", "k h", "a a", "iya", " un", "und", "eni", "kab", "be ", "art", "ka ", "uma", "ora", "n b", "ala", "n m", "ngk", "rta", "i h", " or", "gar", "yat", "kar", "al ", "a m", "n i", "na ", "g b", "ega", "pra", "ina", "kak", "g a", "a p", "tum", "nya", "kal", "ger", "gge", " ta", "kat", "i k", "ena", "oni", "kas", " pe", "dad", "aga", "g m", "duw", "k k", "uta", "uwe", " si", " ne", "adh", "pa ", "n a", "go ", "and", "i l", " ke", "nun", "nal", "ngu", "uju", "apa", "a d", "t m", "i p", "min", "iba", "er ", " li", "anu", "sak", "per", "ama", "gay", "war", "pad", "ggu", "ha ", "ind", "taw", "ras", "n l", "ali", "eng", "awi", "a u", " bi", "we ", "bad", "ndu", "uwa", "awe", "bak", "ase", "eh ", " me", "neg", "pri", " ku", "ron", "ih ", "g t", "bis", "iji", "i t", "e p", " pi", "aba", "isa", "mba", "ini", "a w", "g l", "ika", "n t", "ebu", "ndh", "ar ", "sin", "lak", "ur ", "mra", "men", "ku ", " we", "e s", "a i", "liy", " ik", "ayo", "rib", "ngl", "ami", "arg", "nas", "yom", "wae", "ut ", "kon", "ae ", "rap", "aku", " te", "dil", "tin", "rga", "jud", "umu", " as", "rak", "bed", "k b", "il ", "kap", "h k", "jin", "k a", " nd", "e d", "i s", " lu", "i w", "eka", "mum", "um ", "uha", "ate", " mi", "k p", "gon", "eda", " ti", "but", "n d", "r k", "ona", "uto", "tow", "wat", "gka", "si ", "umr", "k l", "oma"}, - Vie: []string{"ng ", "̣c ", "́c ", " qu", " th", "à ", "nh ", " ng", "̣i ", " nh", "và", " va", "̀n ", "uyê", " ph", " ca", "quy", "ền", "yề", "̀i ", " ch", "̀nh", " tr", " cu", "ngư", "i n", "gươ", "ườ", "́t ", "ời", " gi", "ác", " co", "̣t ", "ó ", "c t", "ự ", "n t", "cá", "ông", " kh", "ượ", "ợc", " tư", " đư", "iệ", "đươ", "ìn", "́i ", " ha", "có", "i đ", "gia", " đê", "pha", " mo", "ọi", "mọ", "như", "n n", "củ", " ba", "̣n ", "̉a ", "ủa", "n c", "̀u ", "̃ng", "ân ", "ều", "ất", " bi", "tự", "hôn", " vi", "g t", " la", "n đ", "đề", "nhâ", " ti", "t c", " đô", "ên ", "bả", "hiê", "u c", " tô", "do ", "hân", " do", "ch ", "́ q", "̀ t", " na", "́n ", "ay ", " hi", "àn", "̣ d", "ới", "há", " đi", "hay", "g n", " mô", "ốc", "uố", "n v", "ội", "hữ", "thư", "́p ", "quô", " ho", "̣p ", "nà", "ào", "̀ng", "̉n ", "ị ", "́ch", "ôn ", "̀o ", "khô", "c h", "i c", "c đ", " hô", "i v", "tro", " đa", "́ng", "mộ", "i t", "ột", "g v", "ia ", "̣ng", "ản", "ướ", "ữn", "̉ng", "h t", "hư ", "ện", "n b", "ộc", "ả ", "là", "c c", "g c", " đo", "̉ c", "n h", "hà", "hộ", " bâ", "ã ", "̀y ", " vơ", "̣ t", "̉i ", "iế", " cô", "t t", "g đ", "ức", "iên", " vê", "viê", "vớ", "h v", "ớc", "ực", "ật", "tha", "̉m ", "ron", "ong", "áp", "g b", "hươ", " sư", "a c", "sự", "̉o ", "ảo", "h c", "ể ", "o v", "uậ", "a m", "ế ", "iá", "̀ c", "cho", "qua", "hạ", "ục", " mi", "̀ n", "phâ", "c q", "côn", "o c", "á ", "i h", "ại", " hơ", "̃ h", " cư", "n l", "bị", " lu", "bấ", "cả", "ín", "h đ", " xa", "độ", "g h", "c n", "c p", "thu", "ải", "ệ ", " hư", "́ c", "o n", " nư", "ốn", "́o ", "áo", "xã", "oà", "y t", "hả", "tộ", "̣ c", " tâ", "thô", " du", "m v", "mì", "ho ", "hứ", "ệc", "́ t", "hợ", "án", "n p", "cũ", "ũn", "iể", "ối", "tiê", "ề ", "hấ", "ợp", "hoa", "y đ", "chi", "o h", "ở ", "ày", "̉ t", "đó", "c l", "về", "̀ đ", "i b", "kha", "c b", " đâ", "luâ", "ai ", "̉ n", "đố", "ết", "hự", "tri", "p q", "nươ", "dụ", "hí", "g q", "yên", "họ", "́nh", " ta", " bă", "c g", "n g", "thê", "o t", "c v", "am ", "c m", "an "}, - Ita: []string{" di", "to ", " de", "ion", " in", "la ", "e d", "di ", "ne ", " e ", "zio", "re ", "le ", "ni ", "ell", "one", "lla", "rit", "a d", "o d", "del", "itt", "iri", "dir", " co", "ti ", "ess", "ent", " al", "azi", "tto", "te ", "i d", "i i", "ere", "tà ", " pr", "ndi", "e l", "ale", "o a", "ind", "e e", "e i", "gni", "nte", "con", "i e", "li ", "a s", " un", "men", "ogn", " ne", "uo ", " og", "idu", "e a", "ivi", "duo", "vid", " es", "tti", " ha", "div", " li", "a p", "no ", "all", "pro", "za ", "ato", "per", "sse", "ser", " so", "i s", " la", " su", "e p", " pe", "ibe", "na ", "a l", " il", "ber", "e n", "il ", "ali", "lib", "ha ", "che", "in ", "o s", "e s", " qu", "o e", "ia ", "e c", " ri", "nza", "ta ", "nto", "he ", "oni", "o i", " o ", "sta", "o c", "nel", " a ", "o p", "naz", "e o", "so ", " po", "o h", "gli", "i u", "ond", "i c", "ers", "ame", "i p", "lle", "un ", "era", "ri ", "ver", "ro ", "el ", "una", "a c", " ch", "ert", "ua ", "i a", "ssi", "rtà", "a e", "ei ", "dis", "ant", " l ", "tat", "a a", "ona", "ual", " le", "ità", "are", "ter", " ad", "nit", " da", "pri", "dei", "à e", "cia", " st", " si", "nal", "est", "tut", "ist", "com", "uni", " ed", "ono", " na", "sua", "al ", "si ", "anz", " pa", " re", "raz", "gua", "ita", "res", "der", "soc", "man", "o o", "ad ", "i o", "ese", "que", "enz", "ed ", " se", "io ", "ett", "on ", " tu", "dic", "à d", "sia", "i r", "rso", "oci", "rio", "ari", "qua", "ial", "pre", "ich", "rat", "ien", "tra", "ani", "uma", "se ", "ll ", "eri", "a n", "o n", " um", "do ", "ara", "a t", "zza", "er ", "tri", "att", "ico", "pos", "sci", "i l", "son", "nda", "par", "e u", "fon", " fo", "nti", "uzi", "str", "utt", "ati", "sen", "int", "nes", "iar", " i ", "hia", "n c", "sti", "chi", "ann", "ra ", " eg", "egu", "isp", "bil", "ont", "a r", " no", "rop", " me", "opr", "ost", " ma", "ues", "ica", "sso", "tal", "cie", "sun", "lit", "ore", "ina", "ite", "tan", " ra", "non", "gio", "d a", "e r", "dev", "i m", "l i", "ezz", "izi", " cu", "nno", "rà ", "a i", "tta", "ria", "lia", "cos", "ssu", "dal", "l p", " as", "ass", "opo", "ve ", "eve"}, - Tur: []string{" ve", " ha", "ve ", "ler", "lar", "ir ", "in ", "hak", " he", "her", "bir", "er ", "an ", "arı", "eri", "ya ", " bi", "ak ", "r h", "eti", "ın ", "iye", "yet", " ka", "ası", "ını", " ol", "tle", "eya", "kkı", "ara", "akk", "etl", "sın", "esi", "na ", "de ", "ek ", " ta", "nda", "ini", " bu", "ile", "rın", "rin", "vey", "ne ", "kla", "e h", "ine", "ır ", "ere", "ama", "dır", "n h", " sa", "ına", "sin", "e k", "le ", " ge", "mas", "ınd", "nın", "ı v", " va", "lan", "lma", "erk", "rke", "nma", "tin", "rle", " te", "nin", "akl", "a v", "da ", " de", "let", "ill", "e m", "ard", "en ", "riy", "aya", "nı ", " hü", " şa", "e b", "k v", "kın", "k h", " me", "mil", "san", " il", "si ", "rdı", "e d", "dan", "hür", "var", "ana", "e a", "kes", "et ", "mes", "şah", "dir", " mi", "ret", "rri", " se", "ola", "ürr", "irl", "bu ", "mak", " ma", "mek", "n e", "kı ", "n v", "n i", "lik", "lle", " ed", " hi", "n b", "a h", " ba", "nsa", " iş", "eli", "kar", " iç", "ı h", "ala", "li ", "ulu", "rak", "evl", "e i", "ni ", "re ", "r ş", "eme", "etm", "e t", "ik ", "e s", "a b", "iş ", "n k", "hai", "nde", "aiz", " eş", "izd", "un ", "olm", "hiç", "zdi", "ar ", "unm", "ma ", " gö", "ilm", "lme", "im ", "n t", "tir", "dil", "mal", "e g", "i v", " ko", "lun", "e e", "mel", "ket", "ık ", "n s", "ele", "la ", "el ", "r v", "ede", "şit", "ili", "eşi", "yla", "a i", " an", "anı", " et", "rı ", "ahs", " ya", "sı ", "edi", "siy", "t v", "i b", "se ", "içi", "çin", "bul", "ame", " da", "miş", "may", "tim", "a k", "tme", "r b", "ins", "yan", "nla", "mle", " di", "eye", "ger", "ye ", "uğu", "erd", "din", "ser", " mü", "mem", "vle", " ke", "nam", "ind", "len", "eke", "es ", " ki", "n m", "it ", " in", " ku", "rşı", "a s", "arş", " ay", "eml", "lek", "oru", "rme", "kor", "rde", "i m", " so", "tür", "al ", "lam", "eni", "nun", " uy", "ken", "hsı", "i i", "a d", "ri ", "dev", "ün ", "a m", "r a", "mey", "cak", "ıyl", "maz", "e v", "ece", "ade", "iç ", "şma", "mse", "te ", "tün", "ims", "kim", "e y", "şı ", "end", "k g", "ndi", "alı", " ce", "lem", "öğr", "ütü", "k i", "r t", " öğ", "büt", "anl", " bü"}, - Pol: []string{" pr", "nie", " i ", "ie ", "pra", " po", "ani", "raw", "ia ", "nia", "wie", "go ", " do", "ch ", "ego", "iek", "owi", " ni", "ści", "ci ", "a p", "do ", "awo", " cz", "ośc", "ych", " ma", "ek ", "rze", " na", "prz", " w ", "wo ", "ej ", " za", "noś", "czł", "zło", "eni", "wa ", " je", "łow", "i p", "wol", "oln", " lu", "rod", " ka", " wo", "lno", "wsz", "y c", "ma ", "ny ", "każ", "ażd", "o d", "stw", "owa", "dy ", "żdy", " wy", "rzy", "sta", "ecz", " sw", "dzi", "i w", "e p", "czn", "twa", "na ", "zys", "ów ", "szy", "ub ", "lub", "a w", "est", "kie", "k m", "wan", " sp", "ają", " ws", "e w", "pow", "pos", "nyc", "rac", "spo", "ać ", "a i", "cze", "sze", "neg", "yst", "jak", " ja", "o p", "pod", "acj", "ne ", "ńst", "aro", "mi ", " z ", "i i", "nar", " ko", "obo", "awa", " ro", "i n", "jąc", "zec", "zne", "zan", "dow", " ró", "iej", "zy ", "zen", "nic", "ony", "aw ", "i z", "czy", "no ", "nej", "o s", "rów", "odn", "cy ", "ówn", "odz", "o w", "o z", "jeg", "edn", "o o", "aki", "mie", "ien", "kol", " in", "zie", "bez", "ami", "eńs", "owo", "dno", " ob", " or", " st", "a s", "ni ", "orz", "o u", "ym ", "stę", "tęp", "łec", "jed", "i k", " os", "w c", "lwi", "ez ", "olw", "ołe", "poł", "cji", "y w", "o n", "wia", " be", "któ", "a j", "zna", "zyn", "owe", "wob", "ka ", "wyc", "owy", "ji ", " od", "aln", "inn", "jes", "icz", "h p", "i s", "się", "a o", "ją ", "ost", "kra", "st ", "sza", "swo", "war", "cza", "roz", "y s", "raz", "nik", "ara", "ora", "lud", "i o", "a z", "zes", " kr", "ran", "ows", "ech", "w p", "dów", "ą p", "pop", "a n", "tki", "stk", "gan", "zon", "raj", "e o", "iec", "i l", " si", "że ", "eka", " kt", " de", "em ", "tór", "ię ", "wni", "lni", "ejs", "ini", "odo", "dni", "ełn", "kow", "peł", "a d", "ron", "dek", "pie", "udz", "bod", "nan", "h i", "dst", "ieg", "taw", "z p", "z w", "zeń", "god", "iu ", "ano", "lar", " to", "y z", "a k", "ale", "kla", "trz", "zaw", "ich", "e i", "ier", "iko", "dzy", "chn", "w z", "by ", "ków", "adz", "ekl", "ywa", "ju ", "och", "kor", "sob", "ocz", "oso", "u p", "du ", "tyc", "tan", "ędz", " mi", "e s", " ta", "ki "}, - Orm: []string{"aa ", "an ", "uu ", " ka", "ni ", "aan", "umm", "ii ", "mma", "maa", " wa", "ti ", "nam", " fi", "ta ", "tti", " na", "saa", "fi ", " mi", "rga", "i k", "a n", " qa", "dha", "iyy", "oot", "in ", "mir", "irg", "raa", "qab", "a i", "a k", "kan", "akk", "isa", "chu", "amu", "a f", "huu", "aba", "kka", " ta", "kam", "a a", " is", "amn", "ami", "att", "ach", "mni", "yaa", " bi", "yuu", "yyu", "ee ", "wal", "miy", "waa", "ga ", "ata", "aat", "tii", "oo ", "a e", "moo", " ni", " ee", "ba ", " ak", "ota", "a h", "i q", " ga", " dh", "daa", "haa", "a m", "ama", "yoo", "a b", "i a", "ka ", "kaa", " hi", "sum", "aas", "arg", "man", " hu", " uu", "u n", " yo", " ar", " ke", " ha", "ees", " ba", "uf ", "i i", "taa", "uuf", "iin", "ada", "a w", "i f", "ani", "rra", "na ", "isu", " ad", "i w", "a u", "nya", "irr", "da ", "hun", "hin", "ess", " ho", " ma", "i m", "und", "i b", "bar", "ana", "een", "mu ", "is ", "bu ", "f m", " ir", " sa", "u a", "add", "aad", " la", "i d", "n h", "eeg", "i h", "sa ", "hoj", "abu", " ya", "kee", "al ", "udh", "ook", "goo", "ala", "ira", "nda", "itt", "gac", "as ", "n k", "mum", "see", "rgo", "uum", "ra ", "n t", "n i", "ara", "muu", "ums", "mat", "nii", "sii", "ssa", "a d", "a q", " da", "haw", "a g", "yya", "asu", "eef", "u h", "tum", "biy", " mo", "a t", "ati", "eny", "gam", "abs", "awa", "roo", "uma", "n b", "n m", "u y", "a s", "sat", "baa", "gar", "n a", "mmo", "nis", " qo", "nna", " ku", "eer", " to", "kko", "bil", "ili", "lis", "bir", "otu", "tee", "ya ", "msa", "aaf", "suu", "n d", "jii", "n w", "okk", "rka", "gaa", "ald", "un ", "rum", " ye", "ame", " fu", "mee", "yer", "ero", "amm", "era", "kun", "i y", "oti", "tok", "ant", "ali", "nni", " am", "lda", "lii", "n u", "lee", "ura", "lab", "aal", "tan", "laa", "i g", "ila", "ddu", "aru", "u m", "oji", "gum", "han", "ega", " se", "ffa", "dar", "faa", "ark", "n y", "hii", "qix", "gal", "ndi", " qi", "asa", "art", "ef ", "uud", " bu", "jir", " ji", "arb", "n g", "chi", "tam", "u b", "dda", "bat", "di ", "kar", "lam", "a l", " go", "bsi", "sad", "oka", "a j", "egu", "u t", "bee", "u f", "uun"}, - Ron: []string{" de", "și ", " și", "re ", " în", "are", "te ", "de ", "ea ", "ul ", "rep", "le ", "ept", "dre", "e d", " dr", "ie ", "în ", "e a", "ate", "ptu", " sa", "tul", " pr", "or ", "e p", " pe", "la ", "e s", "ori", " la", " co", "lor", " or", "ii ", "rea", "ce ", "au ", "tat", "ați", " a ", " ca", "ent", " fi", "ale", "ă a", "a s", " ar", "ers", "per", "ice", " li", "uri", "a d", "al ", " re", "e c", "ric", "nă ", "i s", "e o", "ei ", "tur", " să", "lib", "con", "men", "ibe", "ber", "rso", "să ", "tăț", "sau", " ac", "ilo", "pri", "ăți", "i a", "i l", "car", "l l", "ter", " in", "ție", "că ", "soa", "oan", "ții", "lă ", "tea", "ri ", "a p", " al", "ril", "e ș", "ană", "in ", "nal", "pre", "i î", "uni", "ui ", "se ", "e f", "ere", "i d", "e î", "ita", " un", "ert", "ile", "tă ", "a o", " se", "i ș", "pen", "ia ", "ele", "fie", "i c", "a l", "ace", "nte", "ntr", "eni", " că", "ală", " ni", "ire", "ă d", "pro", "est", "a c", " cu", " nu", "n c", "lui", "eri", "ona", " as", "sal", "ând", "naț", "ecu", "i p", "rin", "inț", " su", "ră ", "e n", " om", "ici", "nu ", "i n", "oat", "ări", "l d", " to", "tor", " di", " na", "iun", " po", "oci", "tre", "ni ", "ste", "soc", "ega", "i o", "gal", " so", " tr", "ă p", "a a", "n m", "sta", "va ", "ă î", "fi ", "res", "rec", "ulu", "nic", "din", "sa ", "cla", "nd ", " mo", " ce", " au", "ara", "lit", "int", "i e", "ces", "uie", "at ", "rar", "rel", "iei", "ons", "e e", "leg", "nit", "ă f", " îm", "a î", "act", "e l", "ru ", "u d", "nta", "a f", "ial", "ra ", "ă c", " eg", "ță ", " fa", "i f", "rtă", "tru", "tar", "ți ", "ă ș", "ion", "ntu", "dep", "ame", "i i", "reb", "ect", "ali", "l c", "eme", "nde", "n a", "ite", "ebu", "bui", "ât ", "ili", "toa", "dec", " o ", "pli", "văț", "nt ", "e r", "u c", "ța ", "t î", "l ș", "cu ", "rta", "cia", "ane", "țio", "ca ", "ită", "poa", "cți", "împ", "bil", "r ș", " st", "omu", "ăță", "țiu", "rie", "uma", "mân", " ma", "ani", "nța", "cur", "era", "u a", "tra", "oar", " ex", "t s", "iil", "ta ", "rit", "rot", "mod", "tri", "riv", "od ", "lic", "rii", "eze", "man", "înv", "ne ", "nvă", "a ș", "cti"}, - Hau: []string{"da ", " da", "in ", "a k", "ya ", "an ", "a d", "a a", " ya", " ko", " wa", " a ", "sa ", "na ", " ha", "a s", "ta ", "kin", "wan", "wa ", " ta", " ba", "a y", "a h", "n d", "n a", "iya", "ko ", "a t", "ma ", "ar ", " na", "yan", "ba ", " sa", "asa", " za", " ma", "a w", "hak", "ata", " ka", "ama", "akk", "i d", "a m", " mu", "su ", "owa", "a z", "iki", "a b", "nci", " ƙa", " ci", " sh", "ai ", "kow", "anc", "nsa", "a ƙ", "a c", " su", "shi", "ka ", " ku", " ga", "ci ", "ne ", "ani", "e d", "uma", "‘ya", "cik", "kum", "uwa", "ana", " du", " ‘y", "ɗan", "ali", "i k", " yi", "ada", "ƙas", "aka", "kki", "utu", "n y", "a n", "hi ", " ra", "mut", " do", " ad", "tar", " ɗa", "nda", " ab", "man", "a g", "nan", "ars", "and", "cin", "ane", "i a", "yi ", "n k", "min", "sam", "ke ", "a i", "ins", "yin", "ki ", "nin", "aɗa", "ann", "ni ", "tum", "za ", "e m", "ami", "dam", "kan", "yar", "en ", "um ", "n h", "oka", "duk", "mi ", " ja", "ewa", "abi", "kam", "i y", "dai", "mat", "nna", "waɗ", "n s", "ash", "ga ", "kok", "oki", "re ", "am ", "ida", "sar", "awa", "mas", "abu", "uni", "n j", "una", "ra ", "i b", " ƙu", "dun", "a ‘", "cew", "a r", "aba", "ƙun", "ce ", "e s", "a ɗ", "san", "she", "ara", "li ", "kko", "ari", "n w", "m n", "buw", "aik", "u d", "kar", " ai", "niy", " ne", "hal", "rin", "bub", "zam", "omi", " la", "rsa", "ubu", "han", "are", "aya", "a l", "i m", "zai", "ban", "o n", "add", "n m", "i s", " fa", "bin", "r d", "ake", "n ‘", "uns", "sas", "tsa", "dom", " ce", "ans", " hu", "me ", "kiy", "ƙar", " am", "ɗin", " an", "ika", "jam", "i w", "wat", "n t", "yya", "ame", "n ƙ", "abb", "bay", "har", "din", "hen", "dok", "yak", "n b", "nce", "ray", "gan", "fa ", "on ", " ki", "aid", " ts", "rsu", " al", "aye", " id", "n r", "u k", "ili", "nsu", "bba", "aur", "kka", "ayu", "ant", "aci", "dan", "ukk", "ayi", "tun", "aga", "fan", "unc", " lo", "o d", "lok", "sha", "un ", "lin", "kac", "aɗi", "fi ", "gam", "i i", "yuw", "sun", "aif", "aja", " ir", "yay", "imi", "war", " iy", "riy", "ace", "nta", "uka", "o a", "bat", "mar", "bi ", "sak", "n i", " ak", "tab", "afi", "sab"}, - Hrv: []string{" pr", " i ", "je ", "rav", "pra", "ma ", " na", "ima", " sv", "na ", "ti ", "a p", "nje", " po", "a s", "anj", "a i", "vo ", "ko ", "da ", "vat", "va ", "no ", " za", "i s", "o i", "ja ", "avo", " u ", " im", "sva", "i p", " bi", "e s", "ju ", "tko", "o n", "li ", "ili", "van", "ava", " sl", "ih ", "ne ", "ost", " dr", "ije", " ne", "jed", "slo", " ra", "u s", "lob", "obo", " os", "bod", " da", " ko", "ova", "nja", "koj", "i d", "atk", "iti", " il", "stv", "pri", "om ", "im ", " je", " ob", " su", " ka", "i i", "i n", "e i", "vje", "i u", "se ", "dru", "bit", "voj", "ati", "i o", "ćen", "a o", "o p", "a b", "a n", "ući", " se", "enj", "sti", "a u", "edn", "dje", "lo ", "ćav", " mo", "raz", "u p", " od", "ran", "ni ", "rod", "a k", "su ", "aro", "drć", "svo", "ako", "u i", "rća", "a j", "mij", "ji ", "nih", "eni", "e n", "e o", " nj", "pre", "pos", "ćiv", "oje", "eno", "e p", "nar", "oda", "nim", "ovo", "aju", "ra ", "ći ", "og ", "nov", "iva", "a d", "nos", "bra", "bil", "i b", "avn", "a z", "jen", "e d", "ve ", "ora", "tva", "jel", "sta", "mor", "u o", "cij", "pro", "ovi", "za ", "jer", "ka ", "sno", "ilo", "jem", "red", "em ", "lju", "osn", "oji", " iz", "aci", " do", "lje", "i m", " ni", "odn", "nom", "jeg", " dj", "vno", "vim", "elj", "u z", "o d", "rad", "o o", "m i", "du ", "uje", " sa", "nit", "e b", " st", "oj ", "tit", "a ć", "dno", "e u", "o s", "u d", "eću", "ani", "dna", "nak", "nst", "stu", " sm", "e k", "u u", "an ", "gov", "nju", "juć", "aln", "m s", "tu ", "a r", "ćov", "jan", "u n", "o k", "ist", "ću ", "te ", "tvo", "ans", "šti", "nu ", "ara", "nap", "m p", "nić", "olj", "bud", " bu", "edi", "ovj", "i v", "pod", "sam", "obr", "tel", " mi", "ina", "zaš", "e m", "ašt", " vj", "ona", "nji", "jek", " ta", "duć", "ija", " ćo", "tup", "h p", "oja", "smi", "ada", " op", "oso", "una", "sob", "odu", "dni", "rug", "udu", "ao ", "di ", "avi", "tno", "jim", "itu", "itk", "će ", "odr", "ave", "meć", "nog", "din", "svi", " ći", "kak", "kla", "rim", "akv", "elo", "štv", "ite", "vol", "jet", "opć", "pot", "tan", "ak ", "nic", "nac", "uće", " sk", " me", "ven"}, - Nld: []string{"en ", "de ", "an ", " de", "van", " va", " en", " he", "ing", "cht", "der", "ng ", "n d", "n v", "et ", "een", " ge", "ech", "n e", "ver", "rec", "nde", " ee", " re", " be", "ede", "er ", "e v", "gen", "den", "het", "ten", " te", " in", " op", "n i", " ve", "lij", " zi", "ere", "eli", "zij", "ijk", "te ", "oor", "ht ", "ens", "n o", "and", "t o", "ijn", "ied", "ke ", " on", "eid", "op ", " vo", "jn ", "id ", "ond", "in ", "sch", " vr", "aar", "n z", "aan", " ie", "rde", "rij", "men", "ren", "ord", "hei", "hte", " we", "eft", "n g", "ft ", "n w", "or ", "n h", "eef", "vri", "wor", " me", "hee", "al ", "t r", "of ", "le ", " of", "ati", "g v", "e b", "eni", " aa", "lle", " wo", "n a", "e o", "nd ", "r h", "voo", " al", "ege", "n t", "erk", " da", " na", "t h", "sta", "jke", "at ", "nat", "nge", "e e", "end", " st", "om ", "e g", "tie", "n b", "ste", "die", "e r", "erw", "wel", "e s", "r d", " om", "ij ", "dig", "t e", "ige", "ter", "ie ", "gel", "re ", "jhe", "t d", " za", "e m", "ers", "ijh", "nig", "zal", "nie", "d v", "ns ", "d e", "e w", "e n", "est", "ele", "bes", " do", "g e", "che", "vol", "ge ", "eze", "e d", "ig ", "gin", "dat", "hap", "cha", "eke", " di", "ona", "e a", "lke", "nst", "ard", " gr", "tel", "min", " to", "waa", "len", "elk", "lin", "eme", "jk ", "n s", "del", "str", "han", "eve", "gro", "ich", "ven", "doo", " wa", "t v", "it ", "ove", "rin", "aat", "n n", "wet", "uit", "ijd", "ze ", " zo", "ion", " ov", "dez", "gem", "met", "tio", "bbe", "ach", " ni", "hed", "st ", "all", "ies", "per", "heb", "ebb", "e i", "toe", "es ", "taa", "n m", "nte", "ien", "el ", "nin", "ale", "ben", "daa", "sti", " ma", "mee", "kin", "pen", "e h", "wer", "ont", "iet", "tig", "g o", "s e", " er", "igd", "ete", "ang", "lan", "nsc", "ema", "man", "t g", "is ", "beg", "her", "esc", "bij", "d o", "ron", "tin", "nal", "eer", "p v", "edi", "erm", "ite", "t w", "t a", " hu", "rwi", "wij", "ijs", "r e", "weg", "js ", "rmi", "naa", "t b", "app", "rwe", " bi", "t z", "ker", "ame", "eri", "ken", " an", "ar ", " la", "tre", "ger", "rdi", "tan", "eit", "gde", "g i", "d z", "oep"}, - Kur: []string{" he", " û ", "ên ", " bi", " ma", "in ", "na ", " di", "maf", "an ", "ku ", " de", " ku", " ji", "xwe", "her", " xw", "iya", "ya ", "kes", "kir", "rin", "iri", " ne", "ji ", "bi ", "yên", "afê", "e b", "de ", "tin", "e h", "iyê", "ke ", "es ", "ye ", " we", "er ", "di ", "we ", "ê d", "i b", " be", "erk", "ina", " na", " an", "î û", "yê ", "eye", "î y", "kî ", "rke", "nê ", "diy", "ete", "eke", "ber", "hem", "hey", " li", " ci", "wek", "li ", "n d", "fê ", " bê", " te", "ne ", "yî ", " se", "net", "rî ", "tew", "yek", "sti", "af ", " ki", "re ", "yan", "n b", "kar", "hev", "e k", "aza", "n û", "wî ", " ew", "i h", "n k", "û b", "î b", " mi", " az", "dan", " wî", "ekî", "î a", "a m", "zad", "e d", "mir", "bin", "est", "ara", "iro", "nav", "ser", "a w", "adi", "rov", "n h", "anê", "tê ", "ewe", "be ", "ewl", "ev ", "mû ", " ya", "tî ", "ta ", "emû", " yê", "ast", "wle", " tê", "n m", " bo", "wey", "s m", "bo ", " tu", "n j", "ras", " da", " me", "din", "î d", "ê h", "n n", "n w", "ing", "st ", " ke", " ge", "în ", "ar ", " pê", "iye", "îna", "bat", "r k", "ema", "cih", "ê b", "wed", "û m", "dî ", "û a", "vak", "ê t", "ekh", "par", " ye", "vî ", "civ", "n e", "ana", "î h", "ê k", "khe", "geh", "nge", "ûna", "fên", "ane", "av ", "î m", "bik", "eyê", "eyî", "e û", " re", "man", "erb", "a x", "vê ", "ê m", "iva", "e n", "hî ", "bûn", "kê ", " pa", "erî", "jî ", "end", " ta", "ela", "nên", "n x", "a k", "ika", "f û", "f h", "î n", "ari", "mî ", "a s", "e j", "eza", "tên", "nek", " ni", "ra ", "ehî", "tiy", "n a", "bes", "rbe", "û h", "rwe", "zan", " a ", "erw", "ov ", "inê", "ama", "ek ", "nîn", "bê ", "ovî", "ike", "a n", " ra", "riy", "i d", "anî", "û d", "e e", "etê", "ê x", "yet", "aye", "ê j", "tem", "e t", "erd", "i n", "eta", "ibe", "a g", "u d", "xeb", "atê", "i m", "tu ", " wi", "dew", "mal", "let", "nda", "ewa", " ên", "awa", "e m", "a d", "mam", "han", "u h", "a b", "pêş", "ere", " ba", "lat", "ist", " za", "bib", "uke", "tuk", "are", "asî", "rti", "arî", "i a", "hîn", " hî", "edi", "nûn", "anû", "qan", " qa", " hi", " şe", "ine", "n l", "mên", "ûn ", "e a"}, - Yor: []string{"ti ", " ní", "ó̩ ", " è̩", "ní ", " lá", "̩n ", "o̩n", "é̩ ", "wo̩", "àn ", " e̩", "kan", "an ", "tí ", " tí", "tó̩", " kò", "ò̩ ", "̩tó", " àw", " àt", "è̩ ", "è̩t", "e̩n", "bí ", "àti", "lát", "áti", " gb", "lè̩", "s̩e", " ló", " ó ", "àwo", "gbo", "̩nì", "n l", " a ", " tó", "í è", "ra ", " s̩", "n t", "ò̩k", "sí ", "tó ", "̩ka", "kò̩", "ìyà", "o̩ ", " sí", "ílè", "orí", "ni ", "yàn", "dè ", "̩‐è", "ì k", "̩ à", "èdè", " or", "ún ", "ríl", "è̩‐", "í à", "jé̩", "‐èd", "àbí", "̩ò̩", "ò̩ò", "tàb", "nì ", "í ó", "n à", " tà", "̩ l", "jo̩", " ti", "̩e ", "̩ t", " wo", "nìy", "í ì", "ó n", " jé", " sì", "ló ", "kò ", "n è", "wó̩", " bá", "n n", "sì ", " fú", "̩ s", "í a", "rè̩", "fún", " pé", " òm", "̩ni", "gbà", " kí", " èn", "ènì", "in ", "òmì", "ìí ", "ba ", "nir", "pé ", "ira", "mìn", "ìni", "n o", "ràn", "ìgb", " ìg", "bá ", "e̩ ", " rè", "̩ n", "kí ", "n e", "un ", "gba", "̩ p", "í ò", "nú ", " o̩", "nín", "gbé", "yé ", " ka", "ínú", "a k", "fi ", " fi", "mo̩", "bé̩", "o̩d", "dò̩", "̩dò", "ó s", "i l", "̩ o", "̩ ì", "wà ", "í i", "i ì", "hun", "bò ", "i ò", "dá ", "bo̩", "o̩m", "̩mo", "̩wó", "bo ", "áà ", "̩ k", "ó j", "ló̩", "àgb", "ohu", " oh", " bí", " ò̩", "bà ", "ara", "yìí", "ogb", "írà", "n s", "ú ì", " ìb", "pò̩", "í k", " lè", "bog", "i t", "à t", "óò ", "yóò", "kó̩", "gé̩", "à l", "ó̩n", "rú ", "lè ", " yó", "̩ ò", "̩ e", "a w", "̩ y", "ò̩r", "̩ f", " wà", "ò l", "í t", "ó b", "i n", "ó̩w", "̩gb", "yí ", "í w", "ìké", "̩ a", "láà", "wùj", "àbò", "i è", "ùjo", "fin", "é̩n", "n k", "í e", "i j", "ú à", " ìk", "òfi", " òf", " ar", "i s", "mìí", "ìír", " mì", " ir", "rin", "náà", " ná", "jú ", "̩ b", " yì", "ó t", "̩é̩", " i ", "̩ m", "fé̩", "kàn", "rí ", "ú è", "à n", "wù ", "s̩é", "é à", " mú", " èt", "áyé", "í g", "̩kó", "̩dá", "è̩d", "àwù", "è̩k", " ìd", "irú", "í o", "i o", "i à", "láì", "í n", "ípa", " kú", "níp", " ìm", "a l", "ké̩", "bé ", "i g", "de ", "ábé", "ìn ", "báy", "̩è̩", "ígb", "wò̩", "níg", "mú ", "láb", " àà", "n f", "è̩s", "̩ w", "ùn ", "i a", "ayé", "èyí", " èy", "mó̩", "á è", " ni", "n b", " wó", "je̩", " ìj", "gbá", "ò̩n", "ó̩g"}, - Uzb: []string{"lar", "ish", "an ", "ga ", "ar ", " va", " bi", "da ", "va ", "ir ", " hu", "iga", "sh ", "uqu", "shi", "bir", "quq", "huq", "gan", " bo", " ha", "ini", "ng ", "a e", "r b", " ta", "lis", "ni ", "ing", "lik", "ida", "oʻl", "ili", "ari", "nin", "on ", "ins", " in", "adi", "nso", "son", "iy ", " oʻ", "lan", " ma", "dir", "hi ", "kin", "har", "i b", "ash", " yo", "boʻ", " mu", "dan", "uqi", "ila", "ega", "qla", "r i", "qig", "oʻz", " eg", "kla", "a b", "qil", "erk", "ki ", " er", "oli", "nli", "at ", " ol", "gad", "lga", "rki", "oki", "i h", "a o", " qa", "yok", "lig", "osh", "igi", "ib ", "las", "n b", "atl", "n m", " ba", "ara", " qi", "ri ", " sh", "iya", "ala", "lat", "in ", "ham", "bil", "a t", "a y", "bos", "r h", "siy", "n o", "yat", "inl", "ik ", "a q", "cha", "a h", " et", "eti", "nis", "a s", "til", "ani", "h h", "i v", "mas", "tla", "osi", "asi", " qo", "ʻli", "ati", "i m", "rni", "im ", "uql", "arn", "ris", "qar", "a i", "gi ", " da", "n h", "ha ", "sha", "i t", "mla", "rch", " xa", "i o", "li ", "hun", "bar", "lin", "ʻz ", "arc", "rla", " bu", "a m", "a a", " as", "mum", " be", " tu", "aro", "r v", "ikl", "lib", "taʼ", "h v", "tga", "tib", "un ", "lla", "mda", " ke", "shg", " to", "n q", "sid", "n e", "mat", "amd", "shu", "hga", " te", "tas", "ali", "umk", "oya", "hla", "ola", "aml", "iro", "ill", "tis", "iri", "rga", "mki", "irl", " ya", "xal", "dam", " de", "gin", "eng", "rda", "tar", "ush", "rak", "ayo", " eʼ", " so", "ten", "alq", " sa", "ur ", " is", "imo", "r t", " ki", "mil", " mi", "era", "zar", "hqa", "aza", "k b", " si", "nda", "hda", "kat", "ak ", "oʻr", "n v", "a k", "or ", "rat", "ada", "ʻlg", "miy", "tni", "i q", "shq", "oda", "shl", "bu ", "dav", "nid", "y t", "ch ", "asl", "sos", "ilg", "aso", "n t", "atn", "sin", "am ", "ti ", "as ", "ana", "rin", "siz", "yot", "lim", "uni", "nga", "lak", "n i", "a u", "qon", "i a", "h k", "vla", "avl", "ami", "dek", " ja", "ema", "a d", "na ", " em", "ekl", "gʻi", "si ", "i e", "ino", " ka", "uch", "bor", "ker", " ch", "lma", "liy", "a v", "ʼti", "lli", "aka", "muh", "rig", "ech", "i y", "uri", "ror"}, - Ibo: []string{"a n", "e n", "ke ", " na", "na ", " ọ ", " bụ", " n ", "nwe", "ere", "ọ b", "re ", "nye", " nk", "ya ", "la ", " nw", " ik", " ma", "ye ", "e ọ", "ike", "a o", "nke", "a m", "ụ n", " ya", "a ọ", "ma ", "bụl", "ụla", " on", " a ", "e i", "kik", "iki", "ka ", "ony", "ta ", "bụ ", "kwa", " nd", "a i", "i n", "di ", "a a", "wa ", "wer", "do ", " mm", "dụ ", "e a", "ha ", " ga", "any", " ob", "ndi", " ok", "he ", "e m", "e o", "a e", "ọ n", "ite", "rụ ", "hi ", "mma", "ga‐", "wu ", "ara", " dị", "aka", "che", "oke", "we ", "o n", " ih", "n o", "adụ", "mad", "obo", "bod", "a g", "odo", " ka", " ez", "te ", "hị ", "be ", "ụta", "dị ", " an", "zi ", " oh", "a‐e", "akw", "gba", "i m", "me ", " ak", "u n", "nya", "ihe", "ala", "ohe", "ghi", "ri ", " ọz", "her", "ra ", "weg", " nt", " iw", " mb", "ba ", "pụt", " si", "ro ", "oro", "iwu", "chi", "a‐a", "rị ", "ụ i", "ụ ọ", " eb", "iri", "ebe", "ụrụ", "zọ ", " in", "a y", "ezi", "e ị", "kpa", "le ", "ile", "ịrị", "n e", "kpe", "mba", " ha", "bi ", "sit", "e e", "inw", "nil", "asị", " en", "mak", "a u", " ni", "apụ", "chị", "i i", "ghị", "i ọ", "i o", "si ", " e ", "ide", "o i", "e y", "ụ m", "a s", "u o", "kwu", "ozu", "yer", "ru ", "enw", "ụ o", "ọzọ", "gid", "hụ ", "n a", "ahụ", "nkw", "sor", "egh", "edo", "a ụ", "tar", "n i", "toz", "ị o", "pa ", "i a", " me", "ime", "uru", "kwe", " mk", "tu ", "ama", "eny", "uso", "de ", " im", "ọ d", "osi", "hed", "a d", " kw", "mkp", "wet", " ọr", " ọn", "obi", "ọrụ", " ịk", " to", "gas", " ch", "ịch", "nha", "ọnọ", "nọd", " nc", " al", "n ụ", "ị m", " us", "nọ ", "u ọ", "nch", " o ", "eta", "n u", " ot", "otu", "sir", "sịr", " nh", "a k", "ali", "o m", " ag", " gb", "e s", "ọta", "nwa", "ị n", "lit", "ega", "ji ", "ọdụ", "e k", "ban", "e g", "ị k", "esi", "agb", "eme", "hu ", "ikp", "zu ", "pe ", "nta", "na‐", "chọ", "u a", "a b", "uch", "n ọ", "onw", "ram", "kwụ", "ekọ", "i e", " nọ", " ug", "ọch", "u m", "gwu", "a h", "zụz", "ugw", "meg", "ị e", "nat", "e h", "dịg", "o y", "kpu", "pụr", "cha", "zụ ", "hịc", "ich", " ng", "ach", " og", "wap", "wan", "ịgh", "uwa", " di", " nn", "i ị"}, - Ceb: []string{"sa ", " sa", "ng ", "ang", " ka", "an ", " pa", "ga ", " ma", "nga", "pag", " ng", "a p", "on ", "kat", "a k", "ug ", "od ", " ug", "g m", " an", "ana", "n s", "ay ", "ung", "ata", "ngo", "a m", "atu", "ala", "san", "ag ", "tun", "g s", "g k", "god", "d s", "a s", "ong", "mga", " mg", "g p", "n u", "yon", "a a", "pan", "ing", "usa", "tan", "tag", "una", "aga", "mat", "ali", "g u", "han", "nan", " us", "man", "y k", "ina", "non", "kin", " na", "syo", "lan", "a b", "asa", "nay", "n n", "a i", "awa", " ta", "taw", "gaw", "nsa", "a n", "nas", " o ", "ban", "agp", "isa", "dun", "was", "iya", " gi", "asy", "adu", "ini", "bis", " ad", "ili", "o s", " bi", "g a", "nah", "nag", "a t", " ki", "lin", "lay", "ahi", "sam", "al ", "wal", " di", "nal", "asu", " ba", "ano", "agt", " wa", "ama", "yan", "a u", " iy", "kan", "him", "n k", "gan", "ags", "n a", "kag", " un", "ya ", "kas", "gpa", "g t", " su", "aha", "wha", "agk", "awh", "gka", "a g", "kal", "l n", "gla", "gsa", "sud", "gal", "imo", "ud ", "d u", "ran", "uka", "ig ", "aka", "aba", "ika", "g d", "ara", "ipo", "ngl", "g n", "uns", "n o", "kau", "i s", "y s", "og ", "uta", "d n", "li ", " si", "gik", "g i", "mta", "ot ", "iin", " la", " og", "o a", "ayo", "ok ", "awo", "aki", "kab", "aho", "n m", "hat", "o p", "gpi", "a w", "apa", "lip", "ip ", " hu", " ga", "a h", "uba", "na ", " ti", "bal", "gon", "la ", "ati", "wo ", "ad ", "hin", "sal", "gba", "buh", " bu", " ub", "uha", "agb", "hon", "ma ", "nin", "uga", "t n", "ihi", " pi", "may", " pu", "mak", "ni ", " ni", "d a", "pin", "abu", "agh", "ahu", "uma", "as ", "dil", "say", " in", "at ", "ins", "lak", "hun", "ila", "mo ", "s s", "sak", "amt", "o u", "pod", "ngp", "tin", "a d", "but", "ura", "lam", "aod", "t s", "bah", "ami", "aug", "mal", "sos", "os ", "k s", " il", "tra", " at", "gta", "bat", "aan", "ulo", "iha", "ha ", "n p", " al", "g b", "lih", "kar", "lao", "agi", "amb", "mah", "ho ", "sya", "ona", "aya", "ngb", "in ", "inu", "a l", " hi", "mag", "iko", "it ", "agl", "mbo", "oon", "tar", "o n", "til", "ghi", "rab", "y p", " re", "yal", "aw ", "nab", "osy", "dan"}, - Tgl: []string{"ng ", "ang", " pa", "an ", "sa ", " sa", "at ", " ka", " ng", " ma", "ala", "g p", "apa", " na", "ata", "pag", "pan", " an", " at", "ay ", "ara", "ga ", "a p", "tan", "g m", "mga", " mg", "n n", "pat", " ba", "n a", "aya", "na ", "ama", "g k", "awa", "kar", "a k", "lan", "rap", "gka", "nga", "n s", "g n", "aha", "g b", "a a", " ta", "agk", "gan", "tao", "asa", "aka", "yan", "ao ", "a m", "may", "man", "kal", "ing", "a s", "nan", "aga", " la", "ban", "ali", "g a", "ana", "y m", "kat", "san", "kan", "g i", "ong", "pam", "mag", "a n", "o a", "baw", "isa", "wat", " y ", "lay", "g s", "y k", "in ", "ila", "t t", " ay", "aan", "o y", "kas", "ina", "t n", "ag ", "t p", "wal", "una", "yon", " o ", " it", "nag", "lal", "tay", "pin", "ili", "ans", "ito", "nsa", "lah", "kak", "any", "a i", "nta", "nya", "to ", "hay", "gal", "mam", "aba", "ran", "ant", "agt", "on ", "t s", "agp", " wa", " ga", "gaw", "han", "kap", "o m", "lip", "ya ", "as ", "g t", "hat", "y n", "ngk", "ung", "no ", "g l", "gpa", "wa ", "lag", "gta", "t m", "kai", "yaa", "sal", "ari", "lin", "a l", "pap", "ahi", " is", " di", "ita", " pi", "pun", "agi", "ipi", "mak", "a b", "y s", "bat", "yag", "ags", "o n", "aki", "tat", "pah", "la ", "gay", "hin", " si", "di ", "i n", "sas", "iti", "a t", "t k", "mal", "ais", "s n", "t a", "al ", "ipu", "ika", "lit", "gin", " ip", "ano", "gsa", "alo", "nin", "uma", "hal", "ira", "ap ", "ani", "od ", "i a", "gga", "y p", "par", "tas", "ig ", "sap", "ihi", "nah", "ini", " bu", "ngi", "syo", "o s", "nap", "o p", "a g", " ha", "uka", "a h", "aru", "a o", "mah", "iba", "asy", "li ", "usa", "g e", "uha", "ipa", "mba", "lam", "kin", "kil", "duk", "n o", "iga", " da", "dai", "aig", "igd", "gdi", "pil", "dig", "pak", " tu", "d n", "sam", "nas", "nak", "ba ", "ad ", "lim", "sin", "buh", "ri ", "lab", "it ", "tag", "g g", "lun", "ain", "and", "nda", "pas", "kab", "aho", "lig", "nar", "ula", " ed", "edu", " ib", "git", "ma ", "mas", "agb", "ami", "agg", "gi ", "sar", "i m", "siy", "g w", "api", "pul", "iya", "amb", "nil", "agl", "sta", "uli", "ino", "abu", "aun", "ayu", " al", "iyo"}, - Hun: []string{" sz", " a ", "en ", " va", "és ", " és", "min", "ek ", " mi", " jo", "jog", "ind", "an ", "nek", "sze", "ság", " az", "gy ", "sza", "nde", "ala", "az ", "den", "a v", "val", "ele", " el", "oga", "mél", "egy", " eg", "n a", "ga ", "zab", " me", "zem", "emé", "aba", "int", "van", "bad", "tel", "tet", " te", "ak ", "tás", "ény", "t a", " ne", "gye", "ély", "tt ", "n s", "ben", "ség", "zet", "lam", "meg", "nak", "ni ", " se", "ete", "sen", "agy", "let", "lyn", "s a", "yne", "ra ", "z e", "et ", " al", "mel", "kin", "k j", "eté", "ok ", "tek", " ki", "vag", "re ", "n m", "oz ", "hoz", "ez ", "s s", "ett", "gok", "ogy", " kö", "mbe", "es ", "em ", "nem", "ely", " le", "ell", "emb", "hog", "k a", "atá", "köz", "nt ", " ho", "yen", "hez", "el ", "z a", "len", "dsá", "ásá", "tés", "ads", "k m", " ál", " em", "a s", "nte", "a m", "szt", "a t", "áll", "ás ", "y a", "ogo", "sem", "a h", "enk", "nye", "ese", "nki", "ágo", "t s", "lap", "ame", "ber", "ló ", "k é", "nyi", "ban", "mén", "s e", "i m", "t m", " vé", "lla", "ly ", "ébe", "lat", "ág ", "ami", "on ", "mze", "n v", "emz", "fel", "a n", "lő ", "a a", "eki", "eri", "yes", " cs", "lle", "tat", "elő", "nd ", "i é", "ég ", "ésé", "lis", "yil", "vet", "át ", "kül", "ért", " ke", "éte", "rés", "l a", "het", "szo", "art", "alá", " ny", "tar", "koz", " am", "a j", "ész", "enl", "elé", "ól ", "s k", "tár", "s é", "éle", "s t", "lem", "sít", "ges", "ott", " fe", "n k", "tko", "zás", "t é", "kel", "ja ", " ha", "aló", "zés", "nlő", "ése", "ot ", "ri ", "lek", "más", "tő ", "vel", "i j", "se ", "ehe", "tes", "eve", "ssá", "tot", "t k", "olg", "eze", "i v", "áza", "leh", "n e", "ül ", "tte", "os ", "ti ", "atk", "zto", "e a", "tos", "ány", "ána", "zte", "fej", "del", "árs", "k k", "kor", "ége", "szá", "t n", " bi", "zat", "véd", "nev", "elm", "éde", "zer", "téb", "biz", "rra", "ife", "izt", "ere", "at ", "ll ", "k e", "ny ", "sel", " né", "ába", "lt ", "ai ", "sül", "ház", "kif", "t e", " ar", "leg", "d a", "is ", "i e", "arr", "t t", "áso", "it ", "ető", "al ", " má", "t v", " bá", "bár", "a é", "esü", "lye", "m l", " es", "nyo"}, - Azj: []string{" və", "və ", "ər ", "lar", " hə", "in ", "ir ", " ol", " hü", " bi", "hüq", "üqu", "quq", "na ", "lər", "də ", "hər", " şə", "bir", "an ", "lik", " tə", "r b", "mal", "lma", "ası", "ini", "r h", "əxs", "şəx", "ən ", "arı", "qla", "a m", "dir", "aq ", "uqu", "ali", " ma", "una", "ilə", "ın ", "yət", " ya", "ara", "ikd", "əri", "ar ", "əsi", "əti", "r ş", "rin", "yyə", "n h", " az", "dən", "nin", "ərə", "tin", "iyy", "mək", "zad", " mü", "sin", " mə", "ni ", "nda", "ət ", "ndə", "aza", "rın", "ün ", "ını", "ə a", "i v", "nın", "olu", "qun", " qa", " et", "ilm", "lıq", "ə y", "ək ", "lmə", "lə ", "kdi", "ind", "ına", "olm", "lun", "mas", "xs ", "sın", "ə b", " in", "n m", "q v", "nə ", "əmi", "n t", "ya ", "da ", " bə", "tmə", "dlı", "adl", "bər", " on", "əya", "ə h", "sı ", "nun", "maq", "dan", "inə", "etm", "un ", "ə v", "rlə", "n b", "si ", "raq", " va", "ə m", "n a", "ınd", "rı ", "anı", " öz", "əra", "nma", "n i", "ama", "a b", "irl", "ala", "li ", "ins", "bil", "ik ", " al", " di", "ığı", "ə d", "lət", "il ", "ələ", "ə i", "ıq ", "nı ", "nla", "dil", "müd", "n v", "ə e", "unm", "alı", " sə", "xsi", "ə o", "uq ", "uql", "nsa", "ətl", " də", "ili", "üda", "asi", " he", "ola", "san", "əni", "məs", " da", "lan", " bu", "tər", "həm", "dır", "kil", "iş ", "u v", " ki", "min", "eyn", "mi ", "yin", " ha", "sos", "heç", "bu ", "eç ", " ed", "kim", "lığ", "alq", "xal", " as", "sia", "osi", "r v", "q h", "rə ", "yan", "i s", " əs", "daf", "afi", " iş", "ı h", "fiə", " ta", "ə q", "ıql", "a q", "yar", "sas", "lı ", "ill", "mil", "əsa", "liy", "tlə", "siy", "a h", "məz", "tün", "ə t", " is", "ist", "iyi", " so", "n ə", "al ", "ifa", "ina", "lıd", "ı o", "ıdı", "əmə", "ır ", "ədə", "ial", " mi", "əyi", "miy", "çün", "n e", "iya", "edi", " cə", " bü", "büt", "ütü", "xil", "üçü", "mən", "adə", "t v", "a v", "axi", "dax", "r a", "onu", " üç", "seç", " nə", " se", "man", "ril", "sil", "əz ", "iə ", "öz ", "ılı", "aya", "qan", "i t", "şər", "təm", "ulm", "rəf", "məh", " xa", "ğın", " dö", " ni", "sti", "ild", "amə", "qu ", "nam", "n o", "n d", "var", "ad ", "zam", "tam", "təh"}, - Ces: []string{" pr", " a ", "ní ", " ne", "prá", "ráv", "ost", " sv", " po", "na ", "ch ", "ho ", " na", "nos", "o n", " ro", "ání", "ti ", "vo ", "neb", "ávo", "má ", "bo ", "ebo", " má", "kaž", " ka", "ou ", "ažd", " za", " je", "dý ", "svo", "ždý", " př", "a s", " st", "sti", "á p", " v ", "obo", "vob", " sp", "bod", " zá", "ých", "pro", "rod", "ván", "ení", "né ", "ý m", "ého", " by", " ná", "spo", "ně ", "o p", "mi ", "í a", "ter", "roz", "ová", "to ", " ja", " li", "áro", "nár", "by ", "jak", "a p", "a z", "ny ", " vš", "kte", "i a", "lid", "ím ", "o v", "í p", "u p", "mu ", "at ", " vy", "odn", " so", " ma", "a v", " kt", "í n", "zák", "li ", "oli", "ví ", "kla", "tní", "pod", "stá", "en ", "do ", "t s", "mí ", "je ", "em ", "áva", " do", "byl", " se", "být", "í s", "rov", " k ", "čin", " ve", "ýt ", "í b", "it ", "dní", "vše", "pol", "o s", " bý", "tví", "nýc", "stn", "nou", "ejn", "sou", "ran", "ci ", "vol", "se ", "nes", "a n", "pří", "eho", "ným", "tát", "va ", "ním", "mez", "ají", "i s", "stv", "ké ", "ích", "ečn", "žen", "e s", "vé ", "ova", "své", "ým ", "kol", "du ", "u s", "jeh", "kon", "ave", "ech", "eré", "nu ", " ze", "i v", "o d", "í v", "hra", "ids", "m p", "ému", "ole", "y s", " i ", "maj", "o z", " to", "aby", "sta", " ab", "m a", "pra", " ta", "chn", " ni", "že ", "ovn", "ako", "néh", "len", "dsk", "rac", "lad", "chr", " že", "vat", " os", "sob", "aké", "i p", "smí", "esm", "st ", "i n", "m n", "a m", "lně", "lní", "při", "bez", "dy ", "áln", "ens", "zem", "t v", "čen", "leč", "kdo", "ými", " ji", "oci", "i k", " s ", "í m", "jí ", " či", "áv ", "ste", "och", " oc", "vou", "ákl", " vz", "rav", "odu", "nez", "inn", "ský", "nit", "ivo", "a j", "u k", "iál", " me", "ezi", "ské", "ven", "stu", "u a", "tej", "oln", "slu", "zen", "í z", "y b", "oko", "zac", "níc", "jin", "ky ", "a o", "řís", "obe", "u v", "tak", "věd", "oje", " vý", "ikd", "h n", " od", "čno", "oso", "ciá", "h p", " de", "a t", "ům ", "soc", "jíc", "odů", "něn", "adn", "tup", "dů ", "děl", "jno", "kéh", "por", "ože", "hov", "aci", "nem", "é v", "rok", "i j", "u o", "od ", "ího", "vin", "odi"}, - Mlg: []string{"ny ", "na ", "ana", " ny", "y f", "a n", "sy ", "aha", "ra ", "a a", " fa", "n n", "y n", "a m", "an ", " fi", "tra", "any", " ma", "han", "nan", "ara", "y a", " am", "ka ", "in ", "y m", "ami", "olo", " ts", "lon", "min", " mi", " sy", " na", "a t", " ol", "fan", " ha", "a i", "man", "iza", " iz", "ina", "ona", "y h", "aka", "o a", "ian", "a h", "reh", "etr", "a s", "het", "on ", "a f", "ire", "fah", "tsy", "mba", " ar", " hi", "zan", "ay ", "ndr", "y o", "ira", "y t", " an", "ehe", "o h", "afa", "y i", "ren", "ran", " zo", "ena", "amb", "dia", "ala", "amp", "zo ", "ika", " di", "tan", "y s", "y z", " az", "ia ", "m p", "rin", "jo ", "n j", " jo", " dr", "zy ", "ry ", "a d", "ao ", "and", "dre", "haf", "nen", "mpi", "rah", " ka", "eo ", "n d", " ir", "ho ", "am ", "rai", "fa ", "elo", "ene", "oan", "omb", " ta", " pi", " ho", "ava", "azo", "dra", "itr", "iny", "ant", "tsi", "zon", "asa", "tsa", " to", "ari", "ha ", "a k", "van", "n i", "fia", "ray", " fo", "mbe", "ony", "sa ", "isy", "azy", "o f", "lal", "ly ", "ova", "lom", " vo", "nat", "fir", "sam", "oto", "zay", "mis", "ham", "bel", " ra", "a r", "ban", "kan", "iha", "nin", "a e", "ary", "ito", " he", " re", " no", "ita", "voa", "nam", "fit", "iar", " ko", "tok", "isa", "fot", "no ", "otr", "mah", "aly", "har", "y v", "y r", " sa", "o n", "ain", "kam", "aza", "n o", "oka", "ial", "ila", "ano", "atr", "oa ", " la", "y l", "eri", "y d", "ata", "hev", "sia", "pia", "its", "reo", " ao", "pan", "anj", "aro", "tov", "nja", "o s", "fam", "pir", " as", "ty ", "nto", "oko", "y k", "sir", "air", "tin", "hia", "ais", "mit", "ba ", " it", " eo", "o t", "mpa", "kon", "a z", "a v", "ity", "ton", "rak", "era", "ani", "ive", "mik", "ati", "tot", "vy ", "hit", "hoa", "aho", "ank", "ame", "ver", "vah", "tao", "o m", "ino", "dy ", "dri", "oni", "ori", " mo", "hah", "nao", "koa", "ato", "end", "n t", " za", "eha", "nga", "jak", "bar", "lah", "mia", "lna", "aln", "va ", " mb", "lan", " pa", "aov", "ama", "eve", "za ", "dro", "ria", "to ", "nar", "izy", "ifa", "adi", "via", "aja", " va", "ind", "n k", "idi", "fiv", "rov", "vel"}, - Nya: []string{"ndi", "ali", "a k", "a m", " ku", " nd", "wa ", "na ", "nth", " mu", " al", "yen", "thu", "se ", "ra ", "nse", "hu ", "di ", "a n", "la ", " pa", "mun", " wa", "nga", "unt", " la", "a u", "u a", "e a", "ons", "za ", " ma", " lo", "iye", "ace", "ce ", "a l", "idw", "ang", " ka", "kha", "liy", "ens", "li ", "ala", "ira", "ene", "pa ", "i n", "we ", "e m", "ana", "dwa", "era", "hal", "ulu", "lo ", "ko ", "dzi", " ci", "yo ", "o w", "iko", "ga ", "a p", "chi", " mo", "lu ", "o l", "o m", "oyo", "ufu", " um", "moy", "zik", " an", "ner", "and", "umo", "ena", " uf", "dan", "iri", "ful", "a a", "ka ", "to ", "hit", "nch", " nc", "a c", "ito", "fun", "dwe", " da", "kuk", "wac", " dz", "e l", "a z", "ape", "kap", "u w", "e k", "ere", "ti ", "lir", " za", "pen", "tha", "aye", "kut", "mu ", "ro ", "ofu", "ing", "lid", " zo", "amu", "o c", "i m", "mal", "kwa", "mwa", "o a", "eza", "i p", "o n", "so ", "i d", "lin", "nso", " mw", "iro", "zo ", " a ", "ati", " li", "i l", "a d", "ri ", "edw", "kul", "una", "uti", "lan", "a b", "iki", "i c", "alo", "i k", " ca", "lam", "o k", "dza", "ung", "o z", "mul", "ulo", "uni", "gan", "ant", "nzi", " na", "nkh", "e n", "san", "oli", "wir", "tsa", "u k", "ome", "ca ", "gwi", "unz", "lon", "dip", "ipo", "yan", "gwe", "pon", "akh", "uli", "aku", "mer", "ngw", "cit", " po", " ko", "kir", "mba", "ukh", "tsi", "bun", "iya", "ope", "kup", "bvo", "han", " bu", "pan", "ame", "vom", "ama", " ya", "siy", " am", "rez", "u n", "zid", "men", "osa", "ao ", "pez", "i a", " kw", " on", "u o", "lac", "ezo", "aka", "nda", "hun", "u d", "ank", "diz", "ina", "its", "adz", " kh", "ne ", "nik", "e p", "o o", "ku ", "phu", "eka", " un", "eze", "mol", "ma ", " ad", "pat", "oma", "ets", "wez", "kwe", "kho", "ya ", "izo", "sa ", "o p", "kus", "oci", "khu", "okh", "ans", "awi", "izi", "zi ", "ndu", "iza", "no ", "say", " si", "i u", "aik", "jir", "ats", "ogw", "du ", "mak", "ukw", "nji", "mai", "ja ", "sam", "ika", "aph", "sid", "isa", "amb", "ula", "osi", "haw", "u m", " zi", "oye", "lok", "win", "lal", "ani", " ba", "si ", " yo", "e o", "opa", "ha ", "map", "emb"}, - Kin: []string{"ra ", " ku", " mu", "se ", "a k", "ntu", "nga", "tu ", "umu", "ye ", "li ", " um", "mun", "unt", "a n", "ira", " n ", "ere", "wa ", "we ", " gu", "mu ", "ko ", "a b", "e n", "o k", "e a", "a u", "a a", "u b", "e k", "ose", "uli", "aba", "ro ", " ab", "gom", "e b", "ba ", "ugu", " ag", "omb", "ang", " ib", "eng", "mba", "o a", "gu ", " ub", "ama", " by", " bu", "za ", "ihu", "ga ", "e u", "o b", " ba", "kwi", "hug", "ash", "ren", "yo ", "ndi", "e i", " ka", " ak", " cy", "iye", " bi", "ora", "re ", "gih", "igi", "ban", "ubu", " nt", " kw", "di ", "gan", "a g", "a m", "aka", "nta", "aga", " am", "a i", "ku ", "iro", "i m", "ta ", "ka ", "ago", "byo", "ali", "and", "ibi", "na ", "uba", "ili", " bw", "sha", "cya", "u m", "yan", "o n", " ig", "ese", "no ", "obo", "ana", "ish", "kan", "sho", " we", "era", "ya ", "aci", "wes", "ura", "i a", "uko", "e m", "n a", "o i", "kub", "uru", "hob", "ber", "ran", "bor", " im", "ure", "u w", "wo ", "cir", "gac", "ani", "bur", "u a", "o m", "ush", " no", "e y", " y ", "rwa", "eke", "nge", "ara", "wiy", "uga", "zo ", "ne ", "ho ", "bwa", "yos", "anz", "aha", "ind", "mwe", "teg", "ege", "are", "ze ", "n i", "rag", "ane", "u n", "ge ", "mo ", "u k", "bul", " uk", "bwo", "bye", "iza", "age", "ngo", "u g", "gir", "ger", "zir", "kug", "ite", "bah", " al", " ki", "uha", "go ", "mul", "ugo", "n u", "tan", "guh", "y i", " ry", "gar", "bih", "iki", "atu", "ha ", "mbe", "bat", "o g", "akw", "iby", "imi", "kim", "ate", "abo", "e c", "aho", "o u", "eye", "tur", "kir", " ni", "je ", "bo ", "ata", "u u", " ng", "shy", "a s", "gek", " ru", "iko", " bo", "bos", "i i", " gi", "nir", "i n", "gus", "eza", "nzi", "i b", "kur", " ya", "o r", "ung", "rez", "ugi", "ngi", "nya", " se", "mat", "eko", "o y", " in", "uki", " as", "any", "bis", "ako", "gaz", "imw", "rer", "bak", "ige", "mug", "ing", "byi", "kor", "eme", "nu ", " at", "bit", " ik", "hin", "ire", "kar", "shi", "yem", "yam", " yi", "gen", "tse", "ets", "ihe", "hak", "ubi", "key", "rek", "icy", " na", "bag", "yer", " ic", "eze", "awe", "but", "irw", " ur", "fit", "ruk", "ubw", "rya", "uka", "afi"}, - Zul: []string{"nge", "oku", "lo ", " ng", "a n", "ung", "nga", "le ", "lun", " no", "elo", "wa ", "la ", "e n", "ele", "ntu", "gel", "tu ", "we ", "ngo", " um", "e u", "thi", "uth", "ke ", "hi ", "lek", "ni ", "ezi", " ku", "ma ", "nom", "o n", "pha", "gok", "nke", "onk", "a u", "nel", "ulu", "oma", "o e", "o l", "kwe", "unt", "ang", "lul", "kul", " uk", "a k", "eni", "uku", "hla", " ne", " wo", "mun", " lo", "kel", "ama", "ath", "umu", "ho ", "ela", "lwa", "won", "zwe", "ban", "elw", "ule", "a i", " un", "ana", "une", "lok", "ing", "elu", "wen", "aka", "tho", "aba", " kw", "gan", "ko ", "ala", "enz", "o y", "khe", "akh", "thu", "u u", "na ", "enk", "kho", "a e", "zin", "gen", "i n", "kun", "alu", "mal", "lel", "e k", "nku", "e a", "eko", " na", "kat", "lan", "he ", "hak", " ez", "o a", "kwa", "o o", "ayo", "okw", "kut", "kub", "lwe", " em", "yo ", "nzi", "ane", "obu", " ok", "eth", "het", "ise", "so ", "ile", "nok", " ba", "ben", "eki", "nye", "ike", "i k", "isi", " is", "aph", "esi", "nhl", "mph", " ab", "fan", "e i", "isa", " ye", "nen", "ini", "ga ", "zi ", "fut", " fu", "uba", "ukh", "ka ", "ant", "uhl", "hol", "ba ", "and", "do ", "kuk", "abe", "za ", "nda", " ya", "e w", "kil", "the", " im", "eke", "a a", "olo", "sa ", "olu", "ith", "kuh", "o u", "ye ", "nis", " in", "ekh", "e e", " ak", "i w", "any", "khu", "eng", "eli", "yok", "ne ", "no ", "ume", "ndl", "iph", "amb", "emp", " ko", "i i", " le", "isw", "zo ", "a o", "emi", "uny", "mel", "eka", "mth", "uph", "ndo", "vik", " yo", "hlo", "alo", "kuf", "yen", "enh", "o w", "nay", "lin", "hul", "ezw", "ind", "eze", "ebe", "kan", "kuz", "phe", "kug", "nez", "ake", "nya", "wez", "wam", "seb", "ufa", "bo ", "din", "ahl", "azw", "fun", "yez", "und", "a l", "li ", "bus", "ale", "ula", "kuq", "ola", "izi", "ink", "i e", "da ", "nan", "ase", "phi", "ano", "nem", "hel", "a y", "hut", "kis", "kup", "swa", "han", "ili", "mbi", "kuv", "o k", "kek", "omp", "pho", "kol", "i u", "oko", "izw", "lon", "e l", " el", "uke", "kus", "kom", "ulo", "zis", "hun", "nje", "lak", "u n", "huk", "sek", "ham", " ol", "ani", "o i", "ubu", "mba", " am"}, - Swe: []string{" oc", "och", "ch ", "er ", "ing", "för", "tt ", "ar ", "en ", "ätt", "nde", " fö", "rät", "ill", "et ", "and", " rä", " en", " ti", " de", "til", "het", "ll ", "de ", "om ", "var", "lig", "gen", " fr", "ell", "ska", "nin", "ng ", "ter", " ha", "as ", " in", "ka ", "att", "lle", "der", "sam", " i ", "und", "lla", "ghe", "fri", "all", "ens", "ete", "na ", "ler", " at", "ör ", "den", " el", "av ", " av", " so", "igh", "r h", "nva", "ga ", "r r", "env", "la ", "tig", "nsk", "iga", "har", "t a", "som", "tti", " ut", "ion", "t t", "a s", "nge", "ns ", "a f", "r s", "män", "a o", " sk", " si", "rna", "isk", "an ", " st", "är ", "ra ", " vi", " al", "t f", " sa", "a r", "ati", " är", " me", " be", "n s", " an", "tio", "nna", "lan", "ern", "t e", "med", " va", "ig ", "äns", " åt", "sta", "ta ", "nat", " un", "kli", "ten", " gr", "vis", "äll", " la", "one", "han", "änd", "t s", "stä", "t i", "ner", "ans", "gru", " ge", "ver", " må", " li", "lik", "ihe", "ers", "rih", "r a", " re", "må ", "sni", "n f", "t o", " mä", " na", "r e", "ri ", "ad ", "ent", "kla", "det", " vä", "run", "rkl", "da ", "h r", "upp", "dra", "rin", "igt", "dig", "n e", "erk", "kap", "tta", "ed ", "d f", "ran", "e s", "tan", "uta", "nom", "lar", "gt ", "s f", " på", " om", "kte", "lin", "r u", "vid", "g o", "änn", "erv", "ika", "ari", "a i", "lag", "rvi", "id ", "r o", "s s", "vil", "r m", "örk", "ot ", "ndl", "str", "els", "ro ", "a m", "mot", " mo", "i o", "på ", "r d", "on ", "del", "isn", "sky", "e m", "ras", " hä", "r f", "i s", "a n", "nad", "n o", "gan", "tni", "era", "ärd", "a d", "täl", "ber", "nga", "r i", "enn", "nd ", "n a", " up", "sin", "dd ", "örs", "je ", "itt", "kal", "n m", "amt", "n i", "kil", "lse", "ski", "nas", "end", "s e", " så", "inn", "tat", "per", "t v", "arj", "e f", "l a", "rel", "t b", "int", "tet", "g a", "öra", "l v", "kyd", "ydd", "rje", " fa", "bet", "se ", "t l", "lit", "sa ", "när", "häl", "l s", "ndr", "nis", "yck", "h a", "llm", "lke", "h f", "arb", "lmä", "nda", "bar", "ckl", "v s", "rän", "gar", "tra", "re ", "ege", "r g", "ara", "ess", "d e", "vär", "mt ", "ap "}, - Som: []string{" ka", "ay ", "ka ", "an ", "uu ", "oo ", "da ", "yo ", "aha", " iy", "ada", "aan", "iyo", "a i", " wa", " in", "sha", " ah", " u ", "a a", " qo", "ama", " la", "hay", "ga ", "ma ", "aad", " dh", " xa", "ah ", "qof", "in ", " da", "a d", "aa ", "iya", "a s", "a w", " si", " oo", "isa", "yah", "eey", "xaq", "ku ", " le", "lee", " ku", "u l", "la ", "taa", " ma", "q u", "dha", "y i", "ta ", "aq ", "eya", "sta", "ast", "a k", "of ", "ha ", "u x", "kas", "wux", " wu", "doo", "sa ", "ara", "wax", "uxu", " am", "xuu", "inu", "nuu", "a x", "iis", "ala", "a q", "ro ", "maa", "o a", " qa", "nay", "o i", " sh", " aa", "kal", "loo", " lo", "le ", "a u", " xo", " xu", "o x", "f k", " ba", "ana", "o d", " uu", "iga", "a l", "yad", "dii", "yaa", "si ", "a m", "gu ", "ale", "u d", "ash", "ima", "adk", "do ", "aas", " ca", "o m", "lag", "san", "dka", "xor", "adi", "add", " so", "o k", " is", "lo ", " mi", "aqa", "na ", " fa", "soo", "baa", " he", "kar", "mid", "dad", "rka", "had", "iin", "a o", "aro", "ado", "aar", "u k", "qaa", " ha", "ad ", "nta", "o h", "har", "axa", "quu", " sa", "n k", " ay", "mad", "u s", " ga", "eed", "aga", "dda", "hii", "aal", "haa", "n l", "daa", "xuq", "o q", "o s", "uqu", "uuq", "aya", "i k", "hel", "id ", "n i", " ee", "nka", " ho", "ina", "waa", "dan", "nim", "elo", "agu", "ihi", "naa", "mar", "ark", "saa", "riy", "rri", "qda", "uqd", " bu", "ax ", "a h", "o w", "ya ", "ays", "gga", "ee ", "ank", " no", "n s", "oon", "u h", "n a", "ab ", "haq", "iri", "o l", " gu", "uur", "lka", "laa", "u a", "ida", "int", "lad", "aam", "ood", "ofk", "dhi", "dah", "orr", "eli", " xi", "ysa", "arc", "rci", "to ", "yih", "ool", "kii", "h q", "a f", " ug", "ayn", "asa", " ge", "sho", "n x", "siy", "ido", "a g", "gel", "ami", "hoo", "i a", "jee", "n q", "agg", "al ", " di", " ta", "e u", "o u", " ji", "goo", "a c", "sag", "alk", "aba", "sig", " mu", "caa", "aqo", "u q", "ooc", "oob", "bar", "ii ", "ra ", "a b", "ago", "xir", "aaq", " ci", "dal", "oba", "mo ", "iir", "hor", "fal", "qan", " du", "dar", "ari", "uma", "d k", "ban", "y d", "qar", "ugu", " ya", "xay", "a j"}, - Ilo: []string{"ti ", "iti", "an ", "nga", "ga ", " ng", " pa", " it", "en ", " ka", " ke", " ma", "ana", " a ", " ti", "pan", "ken", "agi", "ang", "a n", "a k", "aya", "gan", "n a", "int", "lin", "ali", "n t", "a m", "dag", "git", "a a", "i p", "teg", "a p", " na", "nte", "man", "awa", "kal", "da ", "ng ", "ega", "ada", "way", "nag", "n i", " da", "na ", "i k", "sa ", "n k", "ysa", "n n", "no ", "a i", "al ", "add", "aba", " me", "i a", "eys", "nna", "dda", "ngg", "mey", " sa", "pag", "ann", "ya ", "gal", " ba", "mai", " tu", "gga", "kad", "i s", "yan", "ung", "nak", "tun", "wen", "aan", "nan", "aka", " ad", "enn", " ag", "asa", " we", "yaw", "i n", "wan", "nno", "ata", " ta", "l m", "i t", "ami", "a t", " si", "ong", "apa", "kas", "li ", "i m", "ina", " an", "aki", "ay ", "n d", "ala", "gpa", "a s", "g k", "ara", "et ", "n p", "at ", "ili", "eng", "mak", "ika", "ama", "dad", "nai", "g i", "ipa", "in ", " aw", "toy", "oy ", "ao ", "yon", "ag ", "on ", "aen", "ta ", "ani", "ily", "bab", "tao", "ket", "lya", "sin", "aik", " ki", "bal", "oma", "agp", "ngi", "a d", "y n", "iwa", "o k", "kin", "naa", "uma", "daa", "o t", "gil", "bae", "i i", "g a", "mil", " am", " um", "aga", "kab", "pad", "ram", "ags", "syo", "ar ", "ida", "yto", "i b", "gim", "sab", "ino", "n w", " wa", " de", "a b", "nia", "dey", "n m", "o n", "min", "nom", "asi", "tan", "aar", "eg ", "agt", "san", "pap", "eyt", "iam", "i e", "saa", "sal", "pam", "bag", "nat", "ak ", "sap", "ed ", "gsa", "lak", "t n", "ari", "i u", " gi", "o p", "nay", "kan", "t k", "sia", "aw ", "g n", "day", "i l", "kit", "uka", "lan", "i d", "aib", "pak", "imo", "y a", "ias", "mon", "ma ", " li", "den", "i g", "to ", "dum", "sta", "apu", "o i", "ubo", "ged", "lub", "agb", "pul", "bia", "i w", "ita", "asy", "mid", "umi", "abi", "akd", "kar", "kap", "kai", " ar", "gin", "kni", " id", "ban", "bas", "ad ", "bon", "agk", "nib", "o m", "ibi", "ing", "ran", "kda", "din", "abs", "iba", "akn", "nnu", "t i", "isu", "o a", "aip", "as ", "inn", "sar", " la", "maa", "nto", "amm", "idi", "g t", "ulo", "lal", "bsa", "waw", "kip", "w k", "ura", "d n", "y i"}, - Uig: []string{"ish", " he", "ini", "ing", "nin", "gha", "ng ", "ili", " we", "we ", "sh ", "in ", " bo", "quq", "oqu", "ni ", "hoq", " ho", "ush", "shi", "lik", "qil", "bol", "shq", "en ", "lis", "qa ", "hqa", "n b", "hem", " qi", "ki ", "dem", "iy ", " ad", "ade", "igh", "e a", "em ", "han", "liq", "et ", "ge ", "uq ", "nda", "din", " te", " bi", "idi", "let", "qan", "nli", "ige", "ash", "tin", "ha ", "kin", "iki", "her", "de ", " er", " ba", "and", "iti", "olu", "an ", " dö", "döl", "aq ", "luq", " ya", "me ", "lus", "öle", "mme", "emm", " qa", "daq", "rki", "lgh", "erq", "erk", "shk", "esh", "rqa", "iq ", "uqi", "ile", "rim", "i w", "er ", "ik ", "yak", "aki", "ara", "a h", " be", "men", " ar", "du ", "shu", "uql", "hri", "hi ", "qlu", "q h", "inl", "lar", "da ", "i b", "ime", " as", "ler", "etl", "nis", " öz", "ehr", "lin", "e q", "ar ", "ila", " mu", "len", " me", "qi ", "asi", "beh", "a b", "ayd", "q a", "bir", "bil", " sh", "che", "rli", "ke ", "bar", "hke", "yet", "éli", "shl", "tni", "u h", "ek ", "may", "e b", " ké", "h h", " ig", "ydu", "isi", "ali", "hli", "k h", " qo", "iri", "emd", "ari", "e h", "ida", "e t", "tle", "rni", " al", "siy", "lid", "olm", "iye", "anl", " tu", "iqi", "lma", "ip ", "mde", "e e", "tur", "a i", "uru", "i k", "raw", "hu ", "mus", "kil", " is", "i a", "ir ", "éti", "r b", "özi", "ris", "asa", "i h", "sas", " je", "he ", " ch", "qig", "bas", "n q", "alg", "ett", "les", " xi", "tid", " él", "tes", "ti ", "awa", "ima", "nun", "a a", " xe", " bu", "hil", "n h", " xa", "adi", "dig", "anu", "uni", "mni", " sa", "arl", "rek", "ére", " hö", "kér", " ji", "min", "i q", "tis", "rqi", " iy", "elq", "xel", "p q", " qe", "y i", "i s", "lig", " ma", "iya", "i y", "siz", "ani", " ki", "qti", " de", "q w", "emn", "met", "jin", "niy", "i i", "tim", "irl", " ti", "rin", "éri", "i d", "ati", "si ", "tew", "i t", "tli", "eli", "e m", "rus", "oli", "ami", "gen", "ide", "ina", "chi", "dil", "nay", "ken", "ern", "n w", " to", "ayi", " ij", "elg", "she", "tti", "arq", "hek", "e i", "n a", "zin", "r a", "ijt", "g b", "atn", "qar", "his", "uch", "lim", "hki", "dik"}, - Hat: []string{"ou ", "an ", " li", "on ", "wa ", "yon", " po", "li ", "pou", "te ", " yo", "oun", " mo", "un ", "mou", "ak ", " na", "en ", "n p", "nan", "tou", "syo", " dw", " to", "yo ", " fè", "dwa", " ak", " ki", "ki ", " pa", " sa", "out", " la", " ko", " ge", "ut ", "n s", "gen", " de", "se ", "asy", "èt ", "i p", "n d", " a ", " so", "n l", "a a", "fè ", "n k", " se", "pa ", "e d", "u l", " re", "ite", "sa ", " ch", "kon", "n n", "e l", "t p", "ni ", "cha", "a p", "nn ", "ans", "pi ", "t m", " ka", " an", "nm ", "fèt", "i s", "son", "man", " me", "n m", "n a", "e p", "swa", "sou", "e k", "hak", "òt ", "n y", "men", "i l", "epi", " pe", "ote", "san", " ep", "i k", " si", "yen", "eyi", "a l", " ap", "i a", "yi ", "pey", "je ", "n t", "e a", "k m", "e s", " ni", "lib", "e n", "i t", "lit", "ran", "lè ", "enn", "al ", "a s", " pr", "a f", "ns ", " lò", "ap ", "lòt", "enm", "k l", "n e", "t l", "kla", "anm", "e y", "a k", " ma", "e t", "ay ", "i m", "ali", " lè", "è a", "ye ", "a y", "ant", " os", " ba", "i g", " tè", "aso", "u t", "a n", " pw", "ras", " pè", "n f", "nas", "ka ", "n g", "osw", " ta", "dek", "i d", "pwo", "e m", " di", " vi", "la ", "i n", "u s", "sos", "bli", " te", "o t", " tr", "lwa", "ète", "a t", "le ", "u y", "i f", "tan", "a c", "lar", "a m", "ete", "ara", "t k", " pi", "ibè", "bèt", "re ", "osy", "de ", "ati", "ke ", "res", "tis", "i y", "tè ", "nen", " fa", "ekl", "ze ", "nal", "ons", "ksy", "ini", "che", " le", "e r", "a d", " en", "aye", "he ", "o p", "alw", " kò", "lal", " no", "esp", "a g", "ava", "kou", "las", "way", "u f", "isy", " za", " ok", "oke", "kal", "ken", "sye", "ta ", "onn", "k k", "nje", "pra", "van", "esi", "pès", "kot", "ret", "sya", "n v", "lek", "jan", "ik ", "a b", "eks", "wot", "è n", "di ", "òl ", "tra", "u k", "i r", "nou", " as", "k a", "u d", "ist", "èso", "ib ", " ne", "iti", "ti ", "is ", "y a", "des", "è l", "a r", "ont", " ke", "nsa", "pat", "rit", "sit", "pòt", "ona", "ab ", "è s", " sw", "ond", "ide", " ja", "rav", "t a", "ri ", "bon", "viv", " sè", "pre", "vay", "k p", "l l", "kòm", "i o", " ra", "era", "fan", "dev"}, - Aka: []string{"sɛ ", "a a", " sɛ", "ne ", "ra ", "a n", " wɔ", " a ", "ara", "an ", "eɛ ", "no ", " ne", " bi", " no", " as", "iar", "bia", "yɛ ", "mu ", "aa ", " an", "ɛ s", "e a", "ma ", " ho", "bi ", "man", "deɛ", " mu", "ho ", "ɛ a", "na ", "a ɛ", " ob", "obi", "e n", "a b", "n a", "so ", "o n", "pa ", "ama", "ɛ o", "o a", "ipa", "nip", "ɛ n", "naa", " na", "a w", "ana", " so", " ad", " nn", "ɛ ɔ", "ɛde", "asɛ", "kwa", " on", "oni", "wan", " am", "a ɔ", "sɛd", "wɔ ", " ah", "ɛyɛ", " ny", "oɔ ", " n ", "mma", "i a", " mm", "nni", " kw", "ie ", "wɔn", "ɛ w", "de ", " ɛy", " ba", "ase", "ɔ n", "o b", "i m", "ɔ a", "uo ", "n n", "a m", "o s", "iri", " yi", "ni ", "e s", "nyi", "di ", "u n", "a o", "aho", " de", "tum", " ɛn", "ɔn ", "nya", "i n", "ɔma", "e m", "adw", " yɛ", "umi", "die", "mi ", "ɛ ɛ", "o k", " ab", "ɛm ", "a s", " ma", "nam", " ɔm", " ɛs", "yin", " at", " bɔ", "o d", "ina", "pɛ ", "sɛm", "ua ", "n s", "bɔ ", "adi", "ya ", "e h", "aso", "mar", "ani", "kuo", "rɛ ", "fa ", "a k", "ɔde", "a h", "ba ", "n b", "re ", "uma", "wum", "om ", "ɔ h", "m n", "yi ", "u a", " sa", "se ", "dwu", "ɔ b", " nt", "m a", "erɛ", " kɔ", "a y", "orɔ", " nk", " bɛ", " ɔd", "ten", "rɔ ", "hyɛ", "saa", "ka ", "ɛ b", "e b", "i s", "ade", "am ", "nka", "kor", "i ɛ", "ene", "ena", " ns", "ban", "ɛns", " ku", "ɛsɛ", "ane", "nsɛ", "fof", "ɛɛ ", " fi", "gye", "ɔtu", " di", "ano", "i k", "o m", " ɔt", " ko", "yɛɛ", "bir", " ak", "im ", "kye", " pɛ", "a d", "yie", "ko ", "nti", "i b", "ete", "ofo", "amm", "ye ", "ri ", "foɔ", "kɔ ", "bom", "abo", "ɔ s", "ɔne", " ɛb", "soɔ", "for", "isɛ", "m k", "asa", "nod", "ɛ m", "fir", "ti ", " da", "e y", "sua", " be", "nii", "seɛ", "wa ", "ber", " aw", "dwe", "n f", " fo", "o ɛ", "i h", "u b", "ɔ m", " mf", "hɔ ", "kab", "wɛ ", "to ", "rib", "hwɛ", "ibi", " dw", "dis", "nso", "ans", "tir", "u ɛ", " ti", " hɔ", "sa ", "e o", " tu", "odi", "ɛ y", "ia ", "ofa", " ɔn", "o w", "ɛbɛ", "aba", " ka", "ii ", "wen", "ɛsi", "m m", "sia", "ada", "yer", "ian", "da ", "set", " gy", "dua", "i d", "som", "mfa", "ɔ w", " af", "i y", "any", "ora", "rim", "wɔd", "dwa", "nsi"}, - Sna: []string{"wa ", "a k", "ana", "ro ", "na ", " ku", " mu", "nhu", "dze", "hu ", "a m", " zv", "mun", "oku", "chi", "a n", "aka", "dzi", "ka ", "zer", "ero", " ch", "che", "se ", "unh", "odz", "rwa", "ra ", "kod", "zvi", " ne", " pa", "kan", " we", " dz", " no", "ika", "va ", "iri", " an", "kut", "nyi", "o y", "yik", "van", "nek", "ese", "eko", "zva", "idz", "e a", " ka", "ane", "ano", "ngu", "eku", "cha", "ung", " yo", "ri ", "ake", "ke ", "ach", "udz", "iro", "a z", "u w", " va", "ira", "wes", "ang", "ech", "nge", "i p", "eng", "yok", "nok", "edz", "o i", "irw", "ani", "ino", "uva", "ich", "nga", "ti ", "zir", "anh", "rir", "ko ", "dza", "o n", "wan", "wo ", "tan", "sun", "ipi", "dzw", "eny", "asi", "hen", "zve", "kur", "vak", "a p", "sha", "unu", "zwa", "ita", "kwa", "e k", "rud", "nun", "uru", "guk", "a c", "a d", " ya", "a y", "bat", "pas", "ezv", "ta ", "e n", "uti", " kw", "o k", "o c", "o m", "ara", " ma", "si ", "ga ", "uko", "ata", "ose", "ema", "dzo", "uch", "hip", "kuv", "no ", "rus", "hec", "omu", "i z", "wak", "o r", "kus", "kwe", "ere", "re ", " rw", " po", "o a", "mwe", "yak", "mo ", "usu", "isi", "za ", "sa ", "e z", "uta", "gar", " in", "hin", "nem", "pac", "kuc", "we ", "ete", " ye", "twa", "pos", "o d", "a i", "hur", "get", "ari", "ong", "pan", "erw", "uka", "rwo", "vo ", " ak", "tem", "zo ", "emu", "emo", "oru", " ha", "uit", "wen", "uye", "kui", " uy", "vin", "hak", "kub", "i m", "a a", "kud", " se", " ko", "yo ", "and", "da ", "nor", "sin", "uba", "a s", "a u", " ic", "zvo", "mut", "mat", "nez", "e m", "a w", "adz", "ura", "eva", "ava", "pi ", "a r", "era", "ute", "oko", "vis", " iy", "ha ", "u a", "han", "cho", "aru", "asa", "fan", "aan", "pir", "ina", "guv", "ush", "ton", " hu", "uny", "enz", "ran", "yor", "ted", "ait", "hek", " ny", "uri", "hok", "nen", "osh", " ac", "ngi", "muk", "ngo", "o z", "azv", "kun", "nid", "uma", "i h", "vem", "a h", "mir", "usa", "o p", "i n", "a v", "i k", "amb", "zan", "nza", "kuz", "zi ", "kak", "ing", "u v", "ngw", "mum", "mba", "nir", "sar", "ewo", "e p", "uwa", "vic", "i i", "gwa", "aga", "ama", "go ", "yew", "pam"}, - Afr: []string{"ie ", "die", "en ", " di", " en", "an ", "ing", "ng ", "van", " va", "te ", "e v", "reg", " re", "n d", " ge", "ens", "et ", "e r", "e e", " te", " be", "le ", "ver", "een", " in", "ke ", " ve", " he", "eg ", "het", "lke", "lik", "n h", "de ", "nie", "aan", "t d", "id ", "men", " vr", "nde", "eid", "e o", " aa", "in ", "of ", "der", "hei", "om ", "g v", " op", " ni", "e b", " el", "al ", "and", "elk", "er ", " me", "ord", "e w", "g t", " to", " of", "ers", " we", " sa", " vo", "ot ", "erk", "n v", "vry", "ge ", "kee", "asi", "tot", " wa", "sie", "ere", " om", "aar", "sal", "dig", "wor", "egt", "gte", "rdi", "rd ", "at ", "nd ", "e s", "ede", "ige", " de", " ’n", "n a", "eni", " wo", "e g", " on", "n s", "’n ", "e t", "erd", "ns ", "oor", "bes", "ond", "se ", "ska", "aak", "nig", "lle", "yhe", "ryh", "is ", "eli", "esk", "ien", "sta", "vol", "ele", "e m", " vi", "ik ", "r d", "vir", "edi", "kap", "g e", "ir ", "es ", "sy ", "ang", "din", " st", "ewe", "gem", "gel", "g o", " is", "el ", "e i", "op ", "ker", "ak ", "uit", "ike", "nse", "hie", "ur ", "eur", " al", "e a", "nas", "e n", "nge", "ier", "n o", "wer", "e d", "ap ", " hu", "ale", "rin", " hi", "eme", "deu", "min", "wat", "n e", "s o", " as", " so", "as ", "e h", "del", "d v", "ter", "ten", "gin", "end", "kin", "it ", " da", " sy", "per", "re ", "n w", "ges", "wet", "ger", "e k", "oed", "s v", "nte", "s e", "ona", "nal", "waa", "d t", "ees", "soo", " ma", "d s", "ies", "tel", "ema", "d e", "red", "ite", " na", "ske", "ely", "lyk", "ren", "nsk", "d o", "oon", "t e", "eke", "esi", "ese", "eri", "hul", " gr", "ig ", "sio", "man", "rde", "ion", "n b", "n g", "voo", "hed", "ind", "tee", " pe", "rso", "t v", "s d", "all", "n t", "rse", "n i", "eem", "d w", "ort", "ndi", "daa", "maa", "t g", "erm", "ont", "ent", "ans", "ame", "yke", "ari", "n m", "lan", "voe", "n ’", "nli", "rkl", "r m", "sia", "ods", "ard", "iem", "g s", "wee", "r e", "l g", "taa", "sek", "bar", "gti", "n n", "lin", "sen", "t o", "t a", "raa", "ene", "opv", "pvo", "ete", " ty", "arb", " sl", "igh", "dee", "g a", "str", "nsl", "sel", "ern", "ste"}, - Fin: []string{"en ", "ise", "ja ", "ist", " ja", "on ", "ta ", "sta", "an ", "n j", "ais", "sen", "n o", "keu", "ike", "oik", "lis", " va", "ell", "lla", "n t", "uks", " on", "ksi", " oi", "n k", " ka", "aan", "een", "la ", "lli", "kai", "a j", " ta", "sa ", "in ", "mis", " jo", "a o", "ään", "än ", "sel", "n s", "kse", "a t", "a k", "tai", "us ", "tta", "ans", "ssa", "kun", "den", "tä ", "eus", "nen", "kan", "nsa", "apa", "all", "est", " se", "eis", "ill", "ien", "see", "taa", " yh", "jok", "n y", "vap", "a v", "ttä", "oka", "n v", "ai ", "itt", "aa ", "aik", "ett", "tuk", "ti ", "ust", " ku", "isi", "stä", "ses", " tä", " tu", "lai", "n p", "sti", "ast", "n e", "n m", "tää", "sia", "unn", "ä j", "ude", "ä o", "ste", "si ", "tei", "ine", "per", "a s", "ia ", "kä ", "äne", " mi", "maa", " pe", "a p", "ess", "a m", "ain", "ämä", "tam", "yht", " ju", "jul", "yks", "hän", "ä t", " hä", "utt", "ide", "et ", "llä", "val", "sek", "stu", "n a", "lä ", "ami", "hmi", " ke", "ikk", "lle", "iin", "sä ", "euk", "täm", "ihm", "tee", " ih", "lta", "pau", " sa", "isk", "mää", "ois", "un ", "tav", "ten", "dis", "hte", "n h", "iss", "ssä", "a h", "ava", " ma", "a y", " ei", " te", " si", " ol", "ekä", "sty", "alt", "toi", "att", "oll", "tet", " jä", " ra", "vat", " mu", "iel", " to", "mai", "sal", "isu", "a a", "kki", "at ", "suu", "n l", "väl", "ää ", "uli", "tun", "tie", "eru", " yk", "etu", "vaa", "rus", "muk", " he", "ei ", "a e", "kie", "sku", "eid", "iit", " su", "nna", "sil", "oma", "min", " yl", "lin", "aut", "uut", "sko", " ko", "tti", "le ", "sie", "kaa", "a r", " ri", "sii", "nno", "eli", "tur", "saa", "aat", "lei", "oli", "na ", " la", "oon", "urv", "lma", "rva", "ite", "mie", "vas", "ä m", " ed", "tus", "iaa", "itä", "ä v", "uol", "yle", " al", "lit", "suo", "ama", "joi", "unt", "ute", "i o", "tyk", "n r", "ali", "lii", "nee", "paa", "avi", "omi", "oit", "jen", "kää", "voi", "yhd", "ä k", " ki", "eet", "eks", " sy", "ity", "ilö", "ilm", "oim", "ole", "sit", "ita", "uom", "vai", "usk", "ala", "hen", "ope", " pu", "auk", "pet", "oja", "i s", "rii", "uud", "hdi", "äli", "va ", " om"}, - Run: []string{"ra ", "we ", "wa ", " mu", "e a", "se ", " n ", "a k", "ira", "ntu", "tu ", " ku", " um", "ko ", "a i", "mu ", "iri", "mun", "hir", "ye ", "unt", "ing", "ash", "ere", "shi", "a n", "umu", "zwa", " bi", "gu ", "ege", "a a", "za ", "teg", "ama", "e k", "go ", "uba", "aba", "ngo", "ora", "o a", "ish", " ba", " ar", "ung", "a m", " we", "e n", "na ", "sho", "ese", "nga", " ab", "e m", "mwe", "ugu", " kw", "ndi", " gu", "ate", "kwi", "wes", "riz", "ger", "u w", " at", "di ", "gih", "iza", "n u", "ngi", "ban", "yo ", "ka ", "e b", "a b", " am", " ca", "ara", "e i", "obo", "hob", "ri ", "u b", "can", "nke", "ro ", "bor", " in", "bah", "ahi", "ezw", "a u", "gir", "ke ", "igi", "iki", "iwe", "rez", "ihu", "hug", "aku", "ari", "ang", "a g", "ank", "ose", "u n", "o n", "rwa", "kan", " ak", "nta", "and", "ngu", " vy", "aka", "n i", "ran", " nt", " ub", "kun", "ata", "i n", "kur", "ana", "e u", " ko", "gin", "nye", "re ", " ka", "any", "ta ", "uko", "amw", "iye", " zi", "ga ", "ite", " ib", "aha", " ng", "era", "o b", "ako", "o i", " bu", "o k", "o u", "o z", " ig", "o m", "ho ", "mak", "sha", " as", " iv", "ivy", "n a", "i b", "izw", "o y", " uk", "ubu", "aga", "ba ", "kir", "vyi", "aho", " is", "nya", "gan", "uri", " it", " im", "u m", "kub", "rik", "hin", "guk", "ene", "bat", "nge", "jwe", "imi", " y ", "vyo", "imw", "ani", "kug", "u a", "ina", "gek", "ham", "i i", "e c", "ze ", "ush", "e y", "uru", "bur", "amb", "ibi", "agi", "uza", "zi ", "eye", "u g", "gus", "i a", " nk", "no ", "abi", "ha ", "rah", "ber", "eme", "ras", "ura", "kiz", "ne ", "tun", "ron", " zu", "ma ", "gen", "wo ", "zub", "w i", "kor", "zin", "wub", "ind", " gi", "y i", "ugi", "je ", "iro", "mbe", " mw", "bak", " ma", "ryo", "eka", "mat", " ic", "onk", "a z", " bo", "ika", "eko", "ihe", "ukw", "wir", "bwa", " ry", " ha", "bwo", " ag", "umw", "yiw", "tse", " ya", "he ", "eng", " ki", "nka", "bir", "ant", "aro", "gis", "ury", "twa", " yo", "bik", "rek", "ni ", " ah", " bw", "uro", "mw ", "tan", "i y", "nde", "ejw", " no", "zam", "puz", "ku ", "y a", "a c", "bih", "ya ", "mur", "utu", "eny", "uki", "bos"}, - Tuk: []string{"lar", " we", "we ", " bi", "yň ", "ary", "ada", "da ", " he", " ha", "an ", "yny", "kla", "dam", "de ", " ad", "yna", "er ", "na ", " ýa", "ir ", "dyr", "iň ", "bir", "r b", "ydy", "ler", "ara", "am ", "yr ", "ini", "lan", "r a", "kly", "lyd", " öz", "mag", "nyň", "öz ", "her", "gyn", "aga", "en ", "ryn", "akl", "ala", "dan", "hak", "eri", "ne ", "uku", "ar ", "r h", "ga ", "ny ", "huk", " de", "ili", "ygy", "li ", "kuk", "a h", "nda", "asy", "len", " ed", "bil", "atl", "ine", "edi", "niň", "lyg", " hu", " ga", "e h", "nde", "dil", "ryň", "aza", "zat", "a g", "‐da", "a‐d", "eti", "ukl", " gö", "ly ", " bo", "tly", "gin", " az", "lma", "ama", "hem", "dir", "ykl", "‐de", "e d", "ile", "ýan", "a d", "ýet", "ýa‐", "ynd", "lyk", "aýy", "e a", "ünd", "ge ", " go", "egi", "ilm", "sy ", "ni ", "etm", "em‐", "lme", "m‐d", "aly", "any", " be", "tle", "syn", "rin", "y b", "let", "mak", "a w", "a ý", "den", "äge", "ra ", " äh", "mäg", " du", "n e", "bol", "meg", "ele", "ň h", " et", "igi", "ň w", "im ", "iýa", " ýe", " di", "r e", "ek ", " ba", "ak ", "esi", "ril", "a b", "in ", "p b", "deň", "etl", "agy", " bu", " je", "bu ", "e ö", "y d", " hi", "mez", " es", "ard", " sa", "ähl", "e b", "yly", " ka", "esa", "mek", " gu", "n a", "e t", "lik", " do", "e g", "sas", "ill", "nma", "ň a", "ram", "ola", "hal", "y w", "ýar", " ar", "anm", "mel", "iri", "siý", "ndi", "ede", "gal", "end", "mil", "rla", "göz", " ma", "n b", "e ý", "öňü", "ňün", "n h", " tu", "hiç", "yýe", " ge", "my ", "iç ", " öň", "n ý", "tla", "ň ý", "lin", "rda", "al ", "lig", "gar", " mi", "i g", "dal", "rle", "mal", "kan", "gat", "tme", "sin", "and", "ň g", "gor", " ta", "öwl", "ýle", "y g", "e w", "ora", "tiň", "ekl", " yn", "alk", "döw", " dö", "ere", "m h", " me", "dur", " er", "asi", "tut", "at ", "çin", "irl", "umy", "eli", "erk", "nme", "wle", "gur", "a ö", "aýa", " çä", "nun", " ki", "ras", "aml", "up ", "ýaş", "tyn", " aý", "ry ", "ň d", "baş", "ip ", "gi ", "z h", "kin", "z ö", "n w", "ter", "inm", "eýl", "i ý", "kim", "nam", "eň ", "beý", "dol", " se", " te", "r d", "utu", "gyý", "ez ", "umu", "mum"}, - Dan: []string{"er ", "og ", " og", "der", " de", "for", "en ", "et ", "til", " fo", " ti", "ing", "de ", "nde", "ret", " re", "hed", "il ", "lig", " ha", "lle", "den", " en", "ed ", "ver", "els", "und", "ar ", " fr", " me", "se ", "lse", "and", "har", "gen", "ede", "ge ", "ell", "ng ", "at ", " af", "nne", "le ", "nge", "e f", "ghe", "e o", "igh", "es ", "af ", "enn", " at", "ler", " i ", "ske", "hve", "e e", "r h", "ne ", "enh", "t t", "ige", "esk", " el", " be", "ig ", "tig", "fri", "or ", "ska", "nin", "e s", "ion", " er", "nhv", "re ", "men", "r o", "e a", " st", "ati", " sk", " in", "l a", "tio", " på", "ett", "ens", "al ", "tti", "med", "r f", "om ", "end", "r e", "del", "g f", "ke ", " so", "på ", "eli", "g o", " an", "r r", "ns ", " al", "nat", "han", " ve", "r s", "r a", " un", " he", "t f", "lin", " si", "r d", "ter", "ere", "nes", "det", "e r", " ud", "ale", "sam", "ihe", "lan", "tte", "rin", "rih", "ent", "ndl", "e m", "isk", "erk", "ans", "t s", "kal", " na", "som", "hol", "lde", "ind", "e n", "ren", "n s", "ner", "kel", "old", "dig", "te ", "ors", "e i", " hv", "sni", "sky", "ene", "vær", " li", " sa", "s f", "d d", "ers", "ste", "nte", "mme", "ove", "e h", "nal", "ona", "ger", " gr", "age", "g a", "vil", "all", "e d", "fre", "tel", "s o", "g h", "t o", "t d", "r i", "e t", " om", "arb", "d e", "ern", "r u", " væ", "d o", "res", "g t", "klæ", "øre", "n f", " vi", " må", "ven", "sk ", " la", "gte", "kab", "str", "n m", "rel", "e b", "run", "rbe", "bej", "t i", "ejd", "kke", "t e", "g d", "rkl", "ilk", "gru", "ved", "bes", " da", "nd ", " fu", "lær", "æri", "rdi", "ærd", "ld ", "t m", "dli", "fun", "sig", " mo", "sta", "nst", "rt ", "od ", " ar", " op", "vis", "igt", "ære", "tet", "t a", "emm", "g e", "mod", "rho", "ie ", "g u", "ker", "rem", " no", "n h", " fa", "rsk", "orm", "e u", "s s", "em ", "d h", " ge", "ets", "e g", "g s", "per", " et", "lem", " tr", "i s", "da ", "dre", "n a", "des", "dt ", "kyt", "rde", "ytt", "eri", "hen", "erv", "l e", "rvi", "ffe", "off", "isn", "r t", " of", "ken", "l h", "rke", "g i", "tal", "må ", "r k", "lke", "gt ", "t v", "t b"}, - Nob: []string{"er ", " og", "og ", "en ", " de", "for", "til", "ing", "ett", " ti", "et ", " ha", " fo", " re", "ret", "il ", "het", "lle", "ver", "tt ", "ar ", "nne", " en", "om ", "ell", "ng ", "har", " me", "enn", "ter", "de ", "lig", " fr", " so", "r h", "ler", "av ", "le ", "den", "and", " i ", " er", "som", " å ", "hve", "or ", "t t", "ne ", " el", "els", "re ", " av", "se ", "esk", "enh", "nge", "ska", "nde", "e o", "ete", "gen", "ke ", "lse", "ghe", "ten", "men", " st", "r s", "fri", "igh", "ig ", " be", "e e", "nhv", "r r", "tte", "ske", "te ", " på", " ut", " sk", "al ", " in", "sjo", "på ", "der", "e s", "ner", "rin", "jon", "t o", "unn", "e f", "han", "asj", "tig", "ed ", "es ", "g f", "sam", "ent", "tti", "ene", "nes", "med", "ge ", " al", "r o", "ens", "r e", "eli", "isk", "lin", " ve", "nin", "g o", " sa", " an", "t f", "itt", "lik", "end", "kal", "r f", "t s", "rih", "ihe", "nas", "nte", "e r", "ns ", " si", "lan", "g s", "mme", "ige", "l å", "erk", "dig", " gr", "n s", "ren", "r a", "all", " na", "kte", "erd", "ere", "e m", "und", "r u", "res", "tel", "ste", "gru", "inn", "lær", "ers", " un", "det", "t e", "arb", "ale", "del", "ekt", "ven", "t i", "g e", "bei", "eid", "e a", "n m", "e d", " ar", "rbe", "e g", " bl", "ans", "klæ", " li", " he", "g t", "æri", "sky", "run", "rkl", " la", "sta", "sni", "kke", "m e", "rt ", "mot", " mo", "e n", "tat", "at ", "e h", "e b", "ove", "e t", "jen", "t d", "str", " må", "r m", "n e", "ors", "rel", "ker", " et", "n a", "bes", "one", " vi", "nn ", "g r", "e i", "kap", "sk ", "ot ", "ndi", "nnl", "i s", " da", "s o", " no", "id ", "ger", "g h", "vis", "n o", "bar", "s f", "ndl", "t m", "g a", "opp", "t a", "dis", "nal", "r d", "per", "dre", "ona", "ære", "rdi", "da ", "ute", "nse", "bli", "ore", "tet", "rit", " op", "kra", "eri", "hol", "old", " kr", "ytt", "kyt", "ffe", "emm", "g d", "l f", " om", "isn", " gj", "å d", "ser", "r b", " di", " fa", "n t", "r k", "lt ", "set", " sl", "dom", "rvi", "me ", "l e", "gre", "å s", "må ", " tr", "nd ", "m s", "g i", "ikk", "n h", " at", "tes", "vil", "dli", "g b", "d d", " hv", "rav"}, - Nno: []string{" og", "og ", " de", " ha", "er ", "en ", "ar ", "til", " ti", "lle", "ett", "il ", "ret", "om ", "et ", " re", "le ", "har", "enn", " me", " al", "all", " fr", "ne ", "tt ", "re ", " å ", " i ", "nne", "and", "ing", "ska", " sk", "men", " fo", "det", "den", "ver", "for", "ell", "t t", "dom", " so", "de ", "e s", " ve", " ei", "ere", " på", "al ", "an ", "e o", "e h", "fri", "sam", " sa", "l å", "på ", "leg", " el", "ler", "som", "ein", "ei ", "nde", "av ", " st", "dei", "or ", "ten", "esk", "kal", "gje", "n s", "tte", "je ", "ske", "rid", "r r", "i s", "te ", "nes", " gj", "eg ", "ido", "med", "e f", "r s", "st ", "ke ", "jon", " in", "r f", "sjo", "asj", "nas", "ter", "unn", "ed ", "kje", "han", "ona", " er", "t o", "t e", "g f", "ski", "e m", "ast", "ane", "e t", " av", " gr", "lan", "ste", "tan", "å f", " na", "der", " sl", "t s", "seg", "n o", "r k", "nga", "ge ", " an", "g o", "at ", "na ", "ern", "nte", "ng ", " ut", "lik", "e a", "bei", "gru", "e i", "arb", "kil", "g s", "lag", "eid", "r a", "e d", "g d", " si", " få", "ame", "a s", "e r", "rbe", "jen", "n m", "r d", "n e", "nn ", "e n", "erd", " tr", " må", " bl", " mo", "ren", "run", "nin", "bli", "kra", " kr", " at", "ege", "n i", "me ", "nsk", "ins", "år ", "frå", "in ", "lov", "v p", "end", "mot", "ale", "e v", "å a", "få ", "rav", "int", "nal", " ar", "sta", "e k", "t f", "ome", " la", "ot ", "t a", "sla", " ik", "nle", "itt", " li", " kv", "id ", "kkj", "ikk", " lo", "nad", "å v", "tta", " fa", " se", "gen", "ld ", "å s", "kan", "g t", " ka", "r l", "god", "n a", "lin", "jel", "ild", "dig", "ha ", "l d", "kap", "ve ", "ndr", "g i", "g a", "inn", "var", "rna", "r m", "r g", "a o", "dre", "d a", "n t", "ag ", "kår", "mål", "ig ", "va ", "i d", "t m", "e e", "n d", "tyr", " om", "g e", "eve", "då ", "e u", " då", "und", " no", "ir ", "gar", "g g", "l h", "se ", "ga ", "d d", "l f", "ker", "r o", "å d", "eld", "ige", "t d", "t i", "t h", "oko", "nnl", "rel", "nok", "rt ", "lt ", "åse", "jer", "ta ", "ik ", "ial", "eig", "r p", "i e", "olk", "bar", "osi", "kte", "sos", "lir", "opp", " un", "ad ", " be"}, - Lit: []string{"as ", "ir ", " ir", "eis", "tei", " te", "s t", "os ", "uri", "ti ", "us ", "is ", "iek", " pa", "ai ", " vi", "vie", "tur", " ki", "ri ", "žmo", " tu", " žm", "ien", "ės ", "ių ", "ali", "ais", "mog", "vis", " ka", "lai", " la", "ini", "i t", "s i", "s ž", "sę ", " į ", "isę", "ena", " ne", " pr", " bū", " jo", "pri", "kie", " ta", "kvi", "nas", " su", "ekv", "mas", "gus", "būt", "tin", "isv", "s s", "ogu", "isi", "mą ", "mo ", "ant", " ar", "s k", "ama", "kai", "ūti", "s a", "s v", "aci", " ti", "s n", " sa", "s p", "oki", "cij", "inė", "ar ", "val", "ms ", "tai", "jo ", "i b", " na", "gal", "sav", "kur", "aus", "men", "rin", " ap", "imą", "ma ", "sta", "ę į", "ina", "i p", "imo", "nim", "i k", " nu", "ima", "oti", "mis", " ku", "jos", "lyg", "dar", "išk", "je ", " at", "tas", "kad", "r t", "tų ", "ad ", "tik", "i i", "nės", "arb", "i v", "ijo", "eik", "aut", "s b", " įs", " re", "iam", "sin", "suo", " be", "isu", " va", "li ", "sty", "asi", "tie", "ara", "lin", "isė", "i s", "ą i", "jų ", " ly", " ga", "vo ", "si ", "r p", "tuo", "aik", "rie", " mo", "din", "pas", "mok", "ip ", "i n", "rei", "ybė", "mos", "aip", "r l", "ntu", "įst", "į t", "gyv", " iš", "nti", "tyb", "ų i", "pag", "kia", "kit", "es ", "uot", " sk", "jim", "tis", " or", "aud", "yve", "ven", "mų ", "als", "ų t", "nac", "avo", "dam", "ą k", "i a", "s j", "oje", "agr", "kla", "gau", "neg", "nių", "o k", "ega", "iki", "aug", "ek ", "tat", "ieš", "tar", "ia ", " ši", "ios", "ška", "sva", " to", "tau", "int", "sau", "uti", " as", "io ", "oga", "san", "mon", "omi", "kin", "ito", "s g", "ome", "r j", " ve", "aty", "kim", "nt ", "iai", "lst", " da", "ją ", "min", "r k", "o t", "nuo", "tu ", "ver", "kal", "am ", "usi", "o n", "o a", "ymo", "tym", "vę ", "ati", " ji", "o p", "tim", "ų n", "paž", "ter", "s š", " vy", "alt", "ksl", "ing", "ų s", "oma", "šal", "ran", "e t", " ni", " ša", "ava", "avi", "nie", "uom", "irt", "elg", "jam", "ipa", "kių", "tok", "eka", "tos", "oja", "kio", "eny", "nam", "s d", "ndi", "amo", "yti", "gri", "svę", " gy", "lie", "ėmi", "ats", "ygi", "soc", "sie", "oci", "pat", "cia"}, - Slv: []string{" pr", "in ", " in", "rav", "pra", "do ", "anj", "ti ", "avi", "je ", "nje", "no ", "vic", " do", "ih ", " po", "li ", "o d", " za", " vs", "ost", "a p", "ega", "o i", "ne ", " dr", " na", " v ", "ga ", " sv", "ja ", "van", "svo", "ako", "pri", "co ", "ico", "i s", "e s", "o p", " ka", "ali", "stv", "sti", "vsa", " ne", " im", "sak", "ima", "jo ", "dru", "nos", "kdo", "i d", "akd", "i p", "nja", "o s", "nih", " al", "o v", "ma ", "i i", " de", "e n", "pre", "vo ", "i v", "ni ", "red", "obo", "vob", "avn", "neg", " bi", "ova", " iz", "ove", "iti", "lov", "ki ", "jan", "a v", "na ", " so", "em ", " nj", "a i", "se ", " te", "tva", "oli", "bod", "ruž", "e i", " ra", " sk", "ati", "e p", "aro", "i k", " ob", "a d", " čl", "eva", "rža", "drž", " sp", "ko ", "i n", " se", " ki", "ena", "sto", "e v", "žen", "nak", "kak", "i z", "var", "ter", "žav", " mo", "di ", "gov", "imi", "va ", "kol", "n s", " z ", "mi ", "ovo", "rod", "voj", " en", "nar", "ve ", " je", "pos", "a s", "ego", "vlj", "jeg", " st", "h p", "er ", "kat", "člo", "ate", "a z", "enj", "n p", "del", "i o", "lja", "pol", "čin", "a n", "ed ", "sme", "jen", "eni", " ta", "odn", " ve", " ni", "e b", "en ", " me", "jem", "kon", "nan", "elj", "sam", "da ", "lje", "zak", "ovi", "šči", "raz", "ans", "ju ", "bit", "ic ", " sm", "ji ", "nsk", "v s", " s ", "n v", "tvo", "ene", "a k", "me ", "vat", "ora", "krš", "nim", "sta", "živ", "ebn", "ev ", "ri ", "eko", "o k", "n n", "so ", "za ", "ičn", "ski", "e d", " va", "o z", "aci", "cij", "eja", "elo", "dej", "si ", "nju", "vol", "kih", "i m", "nst", "kup", "kov", "uži", "la ", "mor", "vih", " da", "h i", "lju", "otr", "med", "o a", "sku", "rug", "odo", "ijo", "dst", "spo", "tak", "zna", "edn", "vne", "ara", "ršn", "itv", "odi", "u s", "čen", "boš", "nik", "avl", "akr", "e o", "vek", "dno", "oln", "o o", "ošč", "e m", "ta ", "vič", "bi ", "pno", "čno", "mel", "eme", "olj", "ode", "rst", "rem", "ov ", "ars", " bo", "n d", "ere", "dov", "ajo", "kla", "ice", "vez", "vni", " ko", "ose", "tev", "bno", "užb", "ava", "ver", "e z", "ljn", "mu ", "a b", "vi ", "dol", "ker", "r s"}, - Epo: []string{"aj ", " la", "la ", "kaj", " ka", "oj ", " de", "on ", "de ", "raj", " ra", "iu ", "ajt", "as ", "o k", " ĉi", "e l", "j k", " li", " pr", "eco", "aŭ ", "ĉiu", "jn ", "ia ", "jto", "est", " es", " al", "an ", " ki", "pro", "io ", " ko", "en ", "n k", "kon", " ti", "co ", "j p", "o d", " po", "ibe", " aŭ", "ro ", "tas", "lib", "ber", "aci", "toj", " en", "a p", " ne", "cio", "ere", "ta ", " in", "to ", "do ", "o e", "j l", "n a", "j d", " se", "a k", "j r", "ala", "j e", "taj", " re", "rec", "iuj", "kiu", " pe", "o a", "ita", "ajn", "ado", "n d", "sta", "nac", "a a", "nta", "lia", "ekt", "eni", "iaj", "ter", "uj ", "per", "ton", "int", " si", "cia", " ha", "stu", "a l", "je ", " je", "al ", "o ĉ", "n p", "jta", "tu ", " ri", "vas", "sen", "hav", "hom", " di", " ho", "nte", "a e", "ali", "ent", " so", "nec", "tra", "a s", "ava", "por", "a r", " na", "igi", "tiu", "sia", "o p", "n l", "ega", "or ", " aj", "soc", "j ĉ", "s l", "oci", "no ", " pl", "j n", "kto", "evi", "s r", "j s", "ojn", "laj", "u a", "re ", " eg", "j a", "gal", "ers", "ke ", "pre", "igo", "er ", "lan", "n j", "pri", " ku", "era", "ian", "rim", " fa", "e s", " ju", "e a", "ika", "ata", "ntr", "el ", "is ", "u h", "li ", "ioj", "don", "ont", "tat", "ons", " el", " su", "go ", "un ", " ke", "ebl", "bla", "n s", "oma", "ĉi ", "raŭ", "kla", "u r", "ne ", "ili", "iĝo", "o t", "s e", "tek", "men", "nen", "j i", "nda", "con", "a d", "ena", "cev", "moj", "ice", "ric", "ple", "son", "art", "a h", "o r", "res", " un", "u s", "coj", "e p", "ĝi ", "for", "ato", "ren", "ara", "ame", "tan", " pu", "ote", "rot", " ma", "vi ", "j f", "len", "dis", "ive", "ant", "n r", " vi", "ami", "iĝi", "sti", "ĝo ", "r l", "n ĉ", "u l", " ag", "erv", "u e", "unu", "gno", " ce", " me", "niu", "iel", "duk", "ern", " ŝt", "laŭ", "o n", "lab", "olo", "abo", "tio", "bor", "ŝta", "imi", " ed", "lo ", "kun", "edu", "kom", "dev", "enc", "ndo", "lig", "e e", "a f", "tig", "i e", " kr", " pa", "na ", "n i", "kad", "and", "e d", "mal", "ono", "dek", "pol", "oro", "eri", "edo", "e k", "rso", "ti ", "rac", "ion", "loj", "j h", "pli", "j m"}, - Lav: []string{"as ", "ība", " un", "un ", "tie", "ies", "bas", "ai ", " ti", "esī", "sīb", "ien", " vi", "bu ", "vie", "ir ", " ir", "ību", "iem", " va", " pa", "em ", " ne", "s u", "am ", "m i", "šan", "u u", "r t", "pie", " ci", " sa", "ās ", " uz", "vai", " ka", " pi", "brī", " iz", "rīv", " br", "uz ", "cij", "dzī", "ena", " ar", "ar ", "isk", "s p", "es ", " at", "āci", " ap", "ot ", "nam", "viņ", "inā", "ikv", "kvi", " no", "s v", " ie", "vis", " ik", "i i", "pār", "u a", "ju ", "nu ", " pr", "edr", "vīb", "īvī", "iju", "drī", "u p", "dar", " st", "lvē", "cil", "ilv", "s t", " la", "iņa", "ana", "s i", "n i", "īdz", "s s", "kā ", "tīb", "i a", "ija", "bai", "ībā", "ied", "s n", "arb", "val", "līd", "s b", "aiz", "tu ", "iec", "cie", "ām ", "gu ", "vēk", "īgu", "īgi", "ka ", "jas", "umu", "mu ", "t p", " jā", "u v", "zīb", "ska", "lst", "als", "kum", "gi ", "s l", " tā", "jot", "stā", "st ", "n v", "vēr", "a p", "arī", "aut", "n p", "ama", "kas", "u k", " da", " ta", "nīg", "izs", "ojo", "anu", "ņa ", "u n", "sta", "s a", "ba ", " ai", " so", "s d", "a u", "ā a", "stī", "cīb", "m u", "i u", "son", "not", "mat", "sav", "iev", "ā v", "jum", " kā", "u t", "ned", "ajā", "s k", "u i", "i v", "līt", "ēro", " pe", " dz", "i n", "per", "u d", "īks", "kat", "nāt", "līb", "nāc", "rdz", "nīb", "pil", "rīk", "kst", "a s", "cit", "pam", " pā", "ekl", "tau", "u s", "bie", "jā ", " re", "i p", "kur", "a a", "t v", " li", "evi", "tis", "evē", "bā ", "ma ", "rīb", "a v", "os ", "ras", "abi", "nev", "iku", "skā", " ve", "lik", " lī", "nas", "t k", "ant", "uma", "roš", "kād", "zsa", "sar", "ciā", "mie", "ais", "eci", "oci", "oša", " je", "jeb", "būt", "atr", "n b", "ieš", "rso", "ers", "soc", "enā", "a t", "t s", "īša", " be", "bez", "āda", "ebk", " ku", "glī", "isp", "tot", "spā", "roj", "lie", "pre", "ret", "aul", "na ", "tra", "iet", "du ", "zgl", "āt ", "ard", "kt ", "ier", "izg", "ikt", "paš", "iāl", "nod", "ts ", "eja", "ā u", "sab", "eno", "ēt ", "ta ", "tik", "tīt", "ecī", " de", "īga", "tar", "arp", "r j", "īst", "tās", "ja ", "enī", "atv", "vu ", "ārē", "rēj", "rie", "oši", "dro"}, - Est: []string{"sel", "ja ", " ja", "le ", "se ", "ust", "ste", "use", "ise", "õig", "mis", " va", "gus", "ele", "te ", "igu", "us ", "st ", "dus", " õi", " võ", " on", "on ", "e j", " in", "ini", "nim", "ma ", "el ", "a v", "iga", "ist", "ime", "al ", "või", "da ", " te", "lik", " ig", "adu", "mes", "ami", "end", "e k", "e v", "l o", " ka", "est", " ra", " se", "õi ", "iku", " ko", "vab", "aba", "tus", "ud ", "a k", "ese", " ku", "l i", "gal", "tsi", "lt ", "es ", "ema", "ida", "ks ", "a i", "n õ", "lis", "atu", "rah", "tam", "ast", "sta", "e t", "s s", " mi", "ta ", "ole", "stu", "bad", "ga ", "val", "ine", " ta", "ne ", " pe", "nda", "ell", "a t", "ali", "ava", "ada", "a p", "ik ", "kus", "e s", "ioo", "tes", "ahe", "ing", "lus", " ol", "a a", "is ", "vah", "a s", "ei ", " ei", "kon", "vas", "tud", "ahv", "t k", "as ", "a r", "s t", "e e", "i v", "eks", "oon", "t v", "oni", "kõi", "s k", "sio", "sus", "e a", "gi ", "mat", "min", " pi", "s v", "oma", "kul", "dad", " ni", "e p", " om", "igi", "tel", "a j", "e o", "ndu", "dse", "lle", "ees", "tse", "uta", "vus", "aal", "aja", "i t", "dam", "ats", "ni ", "ete", "pid", "pea", "e õ", "its", "lma", "lev", "nis", "dis", "ühi", "sli", "i s", "nen", "iel", "des", "de ", "t i", "et ", "nin", "eva", "teg", "usl", "elt", "ili", "i m", "ng ", " ee", "tem", "ses", "ilm", "sek", "ab ", " põ", "ait", " ne", "õrd", "sed", "võr", "ul ", " üh", " ki", "abi", " kõ", "ega", "rds", " vä", "ots", " et", " ri", "põh", "ed ", "töö", "si ", "ad ", "i k", " tä", "ata", " ab", " su", "eli", " sa", "s o", "s j", "sil", "nni", "ari", "asu", "nna", " al", "nud", "uma", "sik", "hvu", "onn", "eab", "emi", "rid", "ara", "set", "e m", " ke", "a e", "täi", "d k", "s p", "i e", "imi", "eis", "e r", "na ", " ül", "a ü", "koh", "a o", "aks", "s e", "e n", " so", "õik", "saa", "and", "isi", "nde", "tum", "hel", "lii", "kin", "äär", "sea", "isk", "een", "ead", "dum", " kä", "rii", "rat", "lem", "umi", "kor", "sa ", "idu", "mus", "rit", "har", " si", "vad", "ita", "ale", "kai", "teo", " mõ", "ade", "üks", "mas", "lse", "als", "iaa", "sia", "sot", "jal", "iig", "ite"}, -} - -var cyrillicLangs = langProfileList{ - Rus: []string{" пр", " и ", "рав", "ств", " на", "пра", "го ", "ени", "ове", "во ", " ка", "ани", "ть ", " в ", " по", " об", "ия ", "сво", " св", "лов", "на ", " че", "ело", "о н", " со", "ост", "чел", "ие ", "ого", "ет ", "ния", "ест", "аво", "ый ", "ажд", " им", "ние", "век", " не", "льн", "ли ", "ова", "име", "ать", "при", "т п", "и п", "каж", "или", "обо", " ра", "ых ", "жды", " до", "дый", "воб", "ек ", "бод", "ва ", "й ч", "его", "ся ", "и с", "ии ", "аци", "еет", "но ", "мее", "и и", "лен", "ой ", "тва", "ных", "то ", " ил", "к и", "енн", " бы", "ию ", " за", "ми ", "тво", "и н", "о п", "ван", "о с", "сто", "аль", " вс", "ом ", "о в", "ьно", "их ", "ног", "и в", "нов", "ако", "про", "ий ", "сти", "и о", "пол", "олж", "дол", "ое ", "бра", "я в", " ос", "ным", "жен", "раз", "ти ", "нос", "я и", " во", "тор", "все", " ег", "ей ", "тел", "не ", "и р", "ред", "ель", "тве", "оди", " ко", "общ", "о и", " де", "има", "а и", "чес", "ним", "сно", "как", " ли", "щес", "вле", "ься", "нны", "аст", "тьс", "нно", "осу", "е д", " от", "пре", "шен", "а с", "бще", "осн", "одн", "быт", "сов", "ыть", "лжн", "ран", "нию", "иче", "ак ", "ым ", "ват", "что", "сту", "чен", "е в", " ст", "рес", "оль", " ни", "ном", "род", "ля ", "нар", "вен", "ду ", "оже", "ны ", "е и", " то", "вер", "а о", "зов", "м и", "нац", "ден", "рин", "туп", "ежд", "стр", " чт", "я п", "она", "дос", "х и", "й и", "тоя", "есп", "лич", "бес", "обр", "ото", "о б", "ьны", "ь в", "нии", "е м", "ую ", " мо", "ем ", " ме", "аро", " ре", "ава", "кот", "ав ", " вы", "ам ", "жно", "ста", "ая ", "под", "и к", "ное", " к ", " та", " го", "гос", "суд", "еоб", "я н", "ен ", "и д", "мож", "еск", "ели", "авн", "ве ", "ече", "уще", "печ", "дно", "о д", "ход", "ка ", " дл", "для", "ово", "ате", "льс", "ю и", "в к", "нен", "ции", "ной", "уда", "вов", " бе", "оро", "нст", "ами", "циа", "кон", "сем", "е о", "вно", " эт", "азо", "х п", "ни ", "жде", "м п", "ког", "от ", "дст", "вны", "сть", "ые ", "о о", "пос", "сре", "тра", "ейс", "так", "и б", "дов", "му ", "я к", "нал", "дру", " др", "кой", "тер", "ь п", "арс", "изн", "соц", "еди", "олн"}, - Ukr: []string{"на ", " пр", " і ", "пра", "рав", " на", "ня ", "ння", " за", "ого", " по", "ти ", "го ", "люд", " лю", "во ", " ко", " ма", "льн", "юди", "их ", "о н", " не", "аво", "анн", "дин", " св", "сво", "ожн", "кож", "енн", "пов", "жна", " до", "ати", "ина", "ає ", "а л", " бу", "аці", "не ", "ува", "обо", " ос", " як", "має", " ви", "них", "аль", "або", "є п", " та", "ні ", "ть ", "ови", "бо ", " ві", " аб", "ере", "і п", "а м", "вин", "без", "при", "іль", "ног", "о п", "ми ", "та ", "ом ", "ою ", "бод", "ста", "воб", " бе", "до ", "ва ", "ті ", " об", "о в", "ост", " в ", " що", "ий ", "ся ", "і с", " сп", "инн", "від", "ств", "и п", "ван", "нов", "нан", "кон", " у ", "ват", "она", "ії ", "но ", "дно", "ій ", "езп", "пер", " де", "ути", "ьно", "ист", "під", "сті", "бут", " мо", "и і", "ідн", "ако", "нні", "ід ", "тис", "що ", "род", "і в", "а з", "ава", " пе", "му ", "і н", "а п", "соб", "ої ", "а в", "спр", "ів ", "ний", "яко", "ду ", "вно", "і д", "ну ", "аро", "и с", " ін", "ля ", "рів", "у в", " рі", "и д", "нар", "нен", "ова", "ому", "лен", "нац", "ним", "ися", "чи ", "ав ", "і р", "ном", " ро", "нос", "ві ", "вни", "овн", " її", "ові", "мож", "віл", "у п", " пі", " су", "її ", "одн", " вс", "ово", "ють", "іст", "сть", "і з", " ст", "буд", " ра", "чен", "про", "роз", "івн", "оду", "а о", "ьни", "ни ", "о с", "сно", "зна", "рац", "им ", "о д", "ими", "я і", "ції", "х п", "дер", "чин", " со", "а с", "ерж", "и з", "и в", "е п", "ди ", "заб", "осо", "у с", "е б", "сі ", "тер", "ніх", "я н", "і б", "кла", "спі", "в і", " ні", "о з", "ржа", "сту", "їх ", "а н", "нна", "так", "я п", "зпе", " од", "абе", "для", "ту ", "і м", "печ", " дл", "же ", "ки ", "віт", "ніс", "гал", "ага", "е м", "ами", "зах", "рим", "ї о", "тан", "ког", "рес", "удь", " ре", "то ", "ков", "тор", "ара", "сві", "тва", "а б", "оже", "соц", "оці", "ціа", "осн", "роб", "дь‐", "ь‐я", "‐як", "і і", "заг", "ахи", "хис", "піл", "цій", "х в", "лив", "осв", "іал", "руч", "ь п", "інш", "в я", "ги ", "аги", " ді", "ком", "ини", "а і", "оди", "нал", "тво", "кої", "всі", "я в", "ною", "об ", "о у", "о о", "і о"}, - Srp: []string{" пр", " и ", "рав", "пра", " на", "на ", " по", "ма ", " св", "да ", "има", "а п", "а и", "во ", "ко ", "ва ", "ти ", "и п", " у ", "ако", " да", "а с", "аво", "и с", "ост", " за", "о и", "сва", " им", "вак", "ава", "је ", "е с", " сл", " ко", "о н", "ња ", "но ", "не ", " не", "ом ", "ли ", " др", "или", "у с", "сло", "обо", "кој", "их ", "лоб", "бод", "им ", "а н", "ју ", " ил", "ств", " би", "сти", "а о", "при", "а у", " ра", "јед", "ог ", " је", "е п", "ње ", "ни ", "у п", "а д", "едн", "ити", "а к", "нос", "и у", "о д", "про", " су", "ање", "ова", "е и", "вањ", "и и", "циј", " ос", "се ", "дру", "ста", "ају", "ања", "и о", " об", "род", "ове", " ка", " де", "е о", "аци", "ја ", "ово", " ни", " од", "и д", " се", "ве ", "ује", "ени", "ија", "авн", "жав", " ст", "у и", "м и", "дна", "су ", "ред", "и н", "оја", "е б", "ара", "што", "нов", "ржа", "вој", "држ", "тва", "оди", "у о", "а б", "одн", "пош", "ошт", "ним", "а ј", "ка ", "ран", "у у", " ов", "аро", "е д", "сно", "ења", "у з", "раз", " из", "осн", "а з", "о п", "аве", "пре", "де ", "бит", "них", "шти", "ву ", "у д", "ду ", "ту ", " тр", "нар", " са", "гов", "за ", "без", "оји", "у н", "вно", "ичн", "еђу", "ло ", "ан ", "чно", "ји ", "нак", "ода", " ме", "вим", "то ", "сво", "ани", "нац", " ње", "ник", "њег", "тит", "ој ", "ме ", "ном", "м с", "е у", "о к", "ку ", " до", "ика", "ико", "е к", "пос", "ашт", "тре", "алн", "ног", " вр", "реб", "нст", " кр", "сту", "дно", "ем ", "вар", "е н", "рив", "туп", "жив", "те ", "чов", "ст ", "ови", "дни", "ао ", "сме", "бра", "ави", " ли", "као", "вољ", "ило", "о с", "штв", "и м", "заш", "њу ", "руг", "тав", "анс", "ено", "пор", "кри", "и б", "оду", "а р", "ла ", " чо", "а т", "руш", "ушт", " бу", "буд", "ављ", "уги", "м п", "ком", "оје", "вер", " ве", "под", "и в", "међ", "его", "вре", "акв", "еди", "тво", " см", "од ", "дел", "ена", "рад", "ба ", " мо", "ну ", "о ј", "дст", "кла", " оп", "как", "сам", "ере", "рим", "вич", "ива", "о о", " он", "вни", "тер", "збе", "х п", "ниц", "еба", "е р", "у в", "ист", "век", "рем", "сви", "бил", "ште", "езб", "јућ", "њен", "гла"}, - Azj: []string{" вә", "вә ", "әр ", "лар", " һә", "ин ", "ир ", " ол", " һү", " би", "һүг", "үгу", "гуг", "на ", "ләр", "дә ", "һәр", " шә", "бир", "ан ", " тә", "лик", "р б", "мал", "лма", "асы", "ини", "р һ", "шәх", "ән ", "әхс", "ары", "гла", "дир", "а м", "али", "угу", "аг ", " ма", "ын ", "илә", "уна", "јәт", " ја", "икд", "ара", "ар ", "әри", "әси", "рин", "әти", "р ш", "нин", "дән", "јјә", "н һ", " аз", "ни ", "әрә", " мә", "зад", "мәк", "ијј", " мү", "син", "тин", "үн ", "олу", "и в", "ндә", "гун", "рын", "аза", "нда", "ә а", "әт ", "ыны", "нын", "лыг", "илм", " га", " ет", "ә ј", "кди", "әк ", "лә ", "лмә", "олм", "ына", "инд", "лун", " ин", "мас", "хс ", "сын", "ә б", "г в", "н м", "адл", "ја ", "тмә", "н т", "әми", "нә ", "длы", "да ", " бә", "нун", "бәр", "сы ", " он", "әја", "ә һ", "маг", "дан", "ун ", "етм", "инә", "н а", "рлә", "си ", " ва", "ә в", "раг", "н б", "ә м", "ама", "ры ", "н и", "әра", "нма", "ынд", "инс", " өз", "аны", "ала", " ал", "ик ", "ә д", "ләт", "ирл", "ил ", " ди", "бил", "ығы", "ли ", "а б", "әлә", "дил", "ә е", "унм", "алы", "мүд", " сә", "ны ", "ә и", "н в", "ыг ", "нла", "үда", "аси", "или", " дә", "нса", "сан", "угл", "уг ", "әтл", "ә о", "хси", " һе", "ола", "кил", "ејн", "тәр", "јин", " бу", "ми ", "мәс", "дыр", "һәм", " да", "мин", "иш ", " һа", " ки", "у в", "лан", "әни", " ас", "хал", "бу ", "лығ", "р в", " ед", "јан", "рә ", "һеч", "алг", " та", "еч ", "и с", "ы һ", "сиа", "оси", "сос", "фиә", "г һ", "афи", "ким", "даф", " әс", "ә г", " иш", "н ә", "ији", "ыгл", "әмә", "ы о", "әдә", "әса", " со", "а г", "лыд", "илл", "мил", "а һ", "ыды", "сас", "лы ", "ист", " ис", "ифа", "мәз", "ыр ", "јар", "тлә", "лиј", "түн", "ина", "ә т", "сиј", "ал ", "рил", " бү", "иә ", "бүт", " үч", "үтү", "өз ", "ону", " ми", "ија", " нә", "адә", "ман", "үчү", "чүн", "сеч", "ылы", "т в", " се", "иал", "дах", "сил", "еди", "н е", "әји", "ахи", "хил", " ҹә", "миј", "мән", "р а", "әз ", "а в", "илд", "и һ", "тәһ", "әһс", "ы в", "һси", "вар", "шәр", "абә", "гу ", "раб", "аја", "з һ", "амә", "там", "ғын", "ад ", "уғу", "н д", "мәһ", "тәм", " ни", "и т", " ха"}, - Bel: []string{" і ", " пр", "пра", "ава", " на", "на ", " па", "рав", "ны ", "ць ", "або", " аб", "ва ", "ацы", "аве", "ае ", " ча", "ння", "анн", "льн", " ма", " св", "сва", "ала", "не ", "чал", "лав", "ня ", "ай ", "ых ", " як", "га ", "век", "е п", " ад", "а н", " не", "пры", "ага", " ко", "а п", " за", "кож", "ожн", "ы ч", "бод", "дна", "жны", "ваб", "цца", "ца ", " ў ", "а а", "ек ", "мае", "і п", "нне", "ных", "асц", "а с", "пав", "бо ", "ам ", "ста", " са", " вы", "ван", "ьна", " да", "ара", "дзе", "одн", "го ", "наг", "він", "аць", "оўн", "цыя", "мі ", "то ", " ра", "і а", "тва", " ас", "ств", "лен", "аві", "ад ", "і с", "енн", "і н", "аль", "най", "аво", "рац", "аро", "ці ", "сці", "пад", "ама", " бы", " яг", "яго", "к м", "іх ", "рым", "ым ", "энн", "што", "і і", "род", " та", "нан", " дз", "ні ", "я а", "гэт", "нас", "ана", " гэ", "інн", "а б", "ыць", "да ", "ыі ", "оў ", "чын", " шт", "а ў", "цыі", "які", "дзя", "а і", "агу", "я п", "ным", "нац", " у ", " ўс", "ыя ", "ьны", "оль", "нар", "ўна", "х п", "і д", "ў і", " гр", "амі", "ымі", "ах ", " ус", "адз", " ні", "эта", "ля ", "воў", "ыма", "рад", "ы п", "зна", "чэн", "нен", "аба", " ка", "ўле", "іна", "быц", "ход", " ін", "о п", " ст", "ера", "уль", "аў ", "асн", "сам", "рам", "ры ", " су", "нал", "ду ", "ь с", "чы ", "кла", "аны", "жна", "і р", "пер", "і з", "ь у", "маю", "ако", "ыцц", "яко", "для", "ую ", "гра", "ука", "е і", "нае", "адс", "і ў", "кац", "ўны", "а з", " дл", "яўл", "а р", "аюч", "ючы", "оду", " пе", " ро", "ы і", "вы ", "і м", "аса", "е м", "аду", "х н", "ода", "адн", "нні", "кі ", " шл", "але", "раз", "ада", "х і", "авя", "нав", "алі", "раб", "ы ў", "нна", "мад", "роў", "кан", "зе ", "дст", "жыц", "ані", "нст", "зяр", "ржа", "зак", "дзі", "люб", "аюц", "бар", "ім ", "ены", "бес", "тан", "м п", "дук", "е а", "гул", "я ў", " дэ", "ве ", "жав", "ацц", "ахо", "заб", "а в", "авы", "ган", "о н", "ваг", "я і", "чна", "я я", "сац", "так", "од ", "ярж", "соб", "м н", "се ", "чац", "ніч", "ыял", "яль", "цця", "ь п", "о с", "вол", "дэк", " бе", "ну ", "ога", " рэ", "рас", "буд", "а т", "асо", "сно", "ейн"}, - Bul: []string{" на", "на ", " пр", "то ", " и ", "рав", "да ", "пра", " да", "а с", "ств", "ва ", "та ", "а п", "ите", "но ", "во ", "ени", "а н", "е н", " за", "о и", "ото", "ван", "не ", " вс", "те ", "ки ", " не", "о н", "ове", " по", "а и", "ава", "чов", "ни ", "ане", "ия ", " чо", "аво", "ие ", " св", "е п", "а д", " об", "век", "ест", "сво", " им", "има", "ост", "и д", "и ч", "ани", "или", "все", "ли ", "тво", "и с", "ние", "вот", "а в", "ват", "ма ", " ра", "и п", "и н", " в ", "ек ", "сек", "еки", "а о", " ил", "е и", "при", " се", "ова", "ето", "ата", "воб", "обо", "бод", "аци", "ат ", "пре", "оди", "к и", " бъ", " съ", "раз", " ос", "ред", " ка", "а б", "о д", "се ", " ко", "бъд", "лно", "ния", "о п", " от", "ъде", "о в", "за ", "ята", " е ", " тр", "и и", "о с", "тел", "и в", "нит", "е с", "ран", " де", "от ", "общ", "де ", "ка ", "бра", "ен ", "ява", "ция", "про", "алн", "и о", "ият", "ст ", "нов", " до", "его", "как", "ато", " из", "нег", "а т", "ден", "а к", "щес", "а р", "тря", "а ч", "ряб", "о о", "вен", "ябв", "бва", "дър", "гов", "нац", "ено", "тве", "ърж", "е д", "нос", "ржа", "а з", "вит", "зи ", "акв", "лен", " та", "ежд", "и з", "род", "е о", "обр", "нот", " ни", " с ", "т с", "нар", "о т", "она", "ез ", "йст", "кат", "иче", " бе", "жав", "е т", "е в", "тва", "зак", "аро", "кой", "осн", " ли", "ува", "авн", "ейс", "сно", "рес", "пол", "нен", "вни", "без", "ри ", "стр", " ст", "сто", "под", "чки", "вид", "ган", "си ", "ди ", "и к", "нст", " те", "а е", "вси", "еоб", " дъ", "сич", "ичк", "едв", "жен", "ник", "ода", "т н", "о р", "ака", "ели", "одн", "елн", "лич", " че", "чес", "бще", " ре", "и м", " ср", "сре", "и р", "са ", "лни", " си", "дви", "ичн", "жда", " къ", "оет", "ира", "я н", "дей", " ме", "еди", "дру", "ход", "еме", "кри", "че ", "дос", "ста", "гра", " то", "ой ", "тъп", "въз", "ико", "и у", "нет", " со", "ави", "той", "елс", "меж", "чит", "ита", "що ", "ъм ", "азо", "зов", "нич", "нал", "дно", " мо", "ине", "а у", "тно", "таз", "кон", "лит", "ан ", "клю", "люч", "пос", "тви", "а м", "й н", "т и", "изв", "рез", "ази", "ра ", "оят", "нео", "чре"}, - Tuk: []string{" би", "лар", " ве", "ве ", "да ", "ада", "ары", " хе", "ир ", " ад", "бир", "дам", "кла", "ер ", "р б", "ың ", " ха", "ара", "га ", "ен ", "лан", "ыны", "или", "дыр", "ам ", "ала", " бо", "хер", "р а", "ыр ", "лы ", "лер", "ан ", "бил", "иң ", "ыды", "р х", "акл", "нда", " өз", "клы", "ны ", "хук", "ери", " ху", "уку", "ага", "не ", "лыд", "ине", "ына", "лен", "на ", "хак", "де ", "‐да", "ин ", "рын", "атл", " эд", "маг", "өз ", " де", "асы", "лыг", "кук", "е а", "ынд", "алы", "лма", "бол", "дан", "ини", "а х", " я‐", "е х", "ге ", "иле", "я‐д", "ар ", "ама", "ли ", "ыгы", "ети", " ба", " га", "гын", "ере", "укл", "лиг", "ның", "зат", "лык", "тлы", "нде", "ни ", "лик", "ден", "мак", "сын", "дил", "ры ", "аны", "кин", "әге", "п б", "а г", "хем", "иги", "эрк", "аза", "а д", "мек", " эр", "мал", "ыкл", "мәг", "сас", " эс", "екл", " ма", "рин", "эса", "ола", "ы б", "айы", "н э", "эди", " гө", " хи", "сы ", " аз", "баш", "ы д", "йда", "шга", "ашг", "а в", " до", "ыет", "ы в", "дак", "ниң", "рки", "гал", "чин", "гда", "ак ", " җе", "а б", " эт", "этм", "кы ", "лет", "йән", " та", "гин", "ян ", "тме", "хич", "ич ", "мез", " гу", "хал", "ылы", "үнд", "илм", "дай", "ягд", " яг", "и в", "им ", "акы", "ы г", "ән ", "а а", "рың", "ги ", "тле", "н м", " го", "ип ", "ал ", "еси", " се", "лме", " ка", "м х", "дең", "ң х", "е д", "дир", "илл", "рил", " ал", "кан", "е г", "лин", "ра ", "дол", " бе", " ми", "мил", "ң д", "н х", "ели", "н а", "е м", " ге", "ы х", " дө", "ик ", " со", "ң а", "чил", "дөв", "е б", " са", "гар", "е в", "ең ", "н б", "рма", " ме", "кли", "үчи", " дә", " үч", "ция", "н в", " дү", "и б", "айд", "кле", "сер", "а я", "соц", "гор", "оци", "дал", "мы ", "олм", "циа", "уң ", " он", "уп ", "кда", "дәл", "ири", " ди", "еле", "лип", "алк", "лим", "гур", "үни", "нме", " әх", "н г", " иш", "ы ө", "ң э", "нун", "еги", "тин", "ы а", "рле", "аци", "ыз ", "з х", "сыз", "аха", "м э", "олы", "рам", " ту", " ни", "ып ", "ерт", "алм", "ора", "и х", "хли", "әхл", "к э", "өвл", "вле", "тмә", "ет ", "нли", "ахс", "гөз", "гы ", "етл", "ы ү", "нуң", "ону", "сиз", "емм", "ек "}, - Mkd: []string{" на", "на ", " пр", " и ", "во ", " се", "то ", "ите", "те ", "рав", "та ", "а с", "пра", "ува", "да ", " да", " не", "ва ", "а п", "а н", "и с", "ата", "о н", "еко", "а и", " по", "но ", "ој ", "кој", " со", " за", " во", "ств", "ја ", "ње ", "ање", "аво", "ни ", " им", "от ", "е п", "е н", "ма ", "ат ", "вањ", "ост", "а д", "о с", "е и", "се ", "ова", "ија", "и п", " сл", "а о", "има", "сек", "сло", "ото", "ли ", "о д", "ава", "обо", "о и", " ил", "или", " би", "бод", "и н", "лоб", " од", "бид", "ред", "ен ", "при", "вот", "иде", "а в", "ста", " об", "и и", "и д", "пре", "нос", "ст ", "е с", " ни", " ќе", "ове", "аат", "аци", "ќе ", "со ", "ови", "про", "ј и", "тво", " ра", "ест", "што", " де", "т и", "акв", " ко", "раз", "гов", "его", "нег", "ани", "едн", "ако", "циј", "бра", "од ", "а з", "е б", "и о", "а б", "о п", "ват", " е ", " др", "ето", "ваа", "как", "ди ", "т с", " ка", " чо", "ени", "алн", "одн", "ено", " си", "чов", " шт", "а г", "а е", "вен", "нит", " ја", "де ", "оди", "е о", "ран", "и з", "сно", "нот", " ед", "тит", "лно", "ви ", "јат", "ден", "т н", "нац", " оп", " до", " ос", "и в", "осн", "кон", "дна", "е д", " ст", "век", "о о", "род", "сто", "сит", "еме", "ара", "дно", "обр", "ј н", "пшт", "еди", "опш", "за ", "ние", "аро", "нов", "а к", "вни", "дру", " ов", "тве", "жив", "ште", "д н", "ие ", " ме", "ед ", "иот", "и м", "о в", "ќи ", "дат", "шти", "јќи", "без", "бед", "ки ", "ков", "ко ", "а р", "нар", "чно", "дни", " вр", "ели", "нак", "ашт", "ичн", "ка ", "ема", "цел", "зем", "еду", "чув", "тес", "држ", "ник", "т п", "луч", "аа ", "деј", "нст", "не ", "а ч", "руг", "ода", "ивн", " це", "нив", "дин", "авн", " зе", "нио", "пор", "а м", "заш", "лас", "вит", "дек", "го ", "ине", "ело", "нет", "ез ", "тен", " ре", " из", "под", "раб", "або", "бот", "дув", "нув", " бе", "ење", "еде", "он ", "њет", "зов", "иту", "ван", "н и", "аѓа", "е в", "еѓу", "рем", "дел", "о к", "кот", "им ", " жи", "дос", "вре", "меѓ", "олн", "нап", " го", "емј", "кри", "уна", "нем", "оја", " су", "ита", "азо", "лит", "тор", "инс", "ора", "огл", "ипа", "пот", "слу", "кви"}, -} - -var arabicLangs = langProfileList{ - Arb: []string{" ال", "ية ", " في", "الح", "في ", " وا", "وال", " أو", "ة ا", "أو ", "الم", "الت", "لحق", "حق ", "لى ", "كل ", "ان ", "ة و", "الأ", " لك", "لكل", "ن ا", "ها ", "ق ف", "ات ", "مة ", "ون ", "أن ", "ما ", "اء ", "ته ", "و ا", "الع", "ي ا", "شخص", "ي أ", " أن", "الإ", "م ا", "حري", " عل", "ة ل", "من ", "الا", "حقو", "على", "قوق", "ت ا", "أي ", "رد ", " شخ", " لل", " أي", "ق ا", "لا ", "فرد", "رية", " ول", " من", "د ا", " كا", " إل", "خص ", "وق ", "ا ا", "ة أ", "ا ي", "ل ف", "ه ا", "نسا", "جتم", "ن ي", "امة", "كان", "دة ", " حق", "ام ", "الق", "ة م", " فر", "اية", "سان", "ل ش", "ين ", "ن ت", "إنس", "ا ل", " لا", "ذا ", "هذا", "ن أ", "لة ", "ي ح", " دو", "ه ل", "لك ", "ترا", "لتع", "اً ", "له ", "إلى", " عن", "ى ا", "ه و", "ع ا", "ماع", "د أ", "اسي", " حر", "ة ع", "مع ", "الد", "نون", " با", "لحر", "لعا", "ن و", "، و", "يات", "ي ت", "الج", " هذ", "ير ", "بال", "دول", "لإن", "عية", "الف", "ص ا", " وي", "الو", "لأس", " إن", "أسا", "ساس", "ماي", "حما", "رام", "سية", "انو", "مل ", "ي و", "عام", "ا و", "تما", " مت", "ة ت", "علي", "ع ب", "ك ا", " له", "ة ف", "قان", "ى أ", "ول ", "هم ", "الب", "ة ب", "ساو", "لقا", "الر", "لجم", "ا ك", "تمت", "ليه", "لتم", "لمت", "انت", " قد", "اد ", "ه أ", " يج", "ريا", "ق و", "ل ا", "ا ب", "ال ", "يه ", "اعي", "لدو", "ل و", "لإع", "لمي", "لمج", "لأم", "تع ", "دم ", "تسا", "عمل", "اته", "لاد", "رة ", "اة ", "غير", "قدم", "وز ", "جوز", "يجو", "عال", "لان", "متع", "مان", "فيه", "اجت", "م و", "يد ", "تعل", "ن ل", "ر ا", " يع", " كل", "مم ", "مجت", "تمع", "دون", " مع", "تمي", "ذلك", "كرا", "يها", " مس", "ميع", "إعل", "علا", " تم", " عا", "ملا", "اعا", "لاج", "ني ", "ليم", "متس", "ييز", "يم ", "اعت", "الش", " تع", "ميي", "عن ", "تنا", " بح", "لما", "ي ي", "يز ", "ود ", "أمم", "لات", "أسر", "شتر", "تي ", " جم", "ه ع", "ر و", "ي إ", "تحد", "حدة", " أس", "عة ", "ي م", "ة، ", "معي", "ن م", "لمس", "م ب", "اق ", "جمي", "لي ", "مية", "الض", "الس", "لضم", "ضما", "لفر", " وس", "لحم", "امل", "ق م", "را ", "ا ح", "نت ", " تن", "يته", " أم", "إلي", "واج", "د و", "لتي", " مر", "مرا", "متح", " ذل", " وأ", " تح", "ا ف", " به", " وم", " بم", "وية", "ولي", "لزو"}, - Urd: []string{"ور ", " او", "اور", " کی", "کے ", " کے", "یں ", " کا", "کی ", " حق", "ے ک", "ایٔ", "کا ", "یٔے", " کو", "یا ", "نے ", "سے ", " اس", "ٔے ", "میں", "کو ", " ہے", " می", "ے ا", " ان", "وں ", " کر", " ہو", "اس ", "ی ا", "ر ا", "شخص", " شخ", "حق ", " سے", " جا", "خص ", "ہر ", "ام ", "ے م", "ں ک", "ہیں", " یا", "سی ", "ادی", "آزا", " آز", "زاد", "ص ک", "ہ ا", "ہے ", "جای", "ا ح", "ر ش", "ت ک", "کہ ", "م ک", " پر", "ی ک", "ان ", "پر ", "۔ہر", "دی ", "یٔی", "س ک", "ا ج", "ر م", "ہے۔", "ق ہ", "ں ا", "ی ح", "و ا", "ار ", "ن ک", "قوق", "کسی", "حقو", "ری ", "وق ", "ے گ", " ہی", "ی ج", " مع", "سان", " نہ", " مل", " حا", "ٔی ", " جو", "نی ", "کرن", " لی", "تی ", "ی ت", "نسا", "ل ک", " کہ", "جو ", "انس", "اپن", "ے ب", "نہ ", " اپ", "یت ", "ا ا", "ہ ک", " کس", "ر ک", "رے ", "ے ہ", " ای", "می ", "ل ہ", "۔ ا", "ے ل", "ی ش", "رنے", "وہ ", "حاص", "ی م", "معا", "اصل", "صل ", "یں۔", "ویٔ", "نہی", "ملک", "ایس", "انہ", "ات ", "ی ب", "د ک", "ی ہ", " تع", "کیا", "ق ک", "ر ہ", "ا م", "دہ ", " من", " بن", " قو", "ے ج", "یہ ", "ں م", "اشر", "مل ", " دو", "عاش", "قوم", "ر ب", "انی", "وام", "قوا", "اقو", "لیٔ", "دار", " وہ", " و ", " عا", "ی س", "بر ", "علا", "اد ", "ہ م", "و ت", "ر ن", " جس", "ے۔ہ", "ے، ", "انو", " دی", "گی ", "لیم", "یوں", " قا", " یہ", "دوس", "ے۔ ", "ا ہ", "تعل", "یم ", "ر پ", "جس ", "ریق", "ے ح", " اق", "نیا", "لک ", " گی", "ین ", "یاد", " مس", "لاق", "، ا", "ی ن", "پنے", "وری", "م ا", " با", "علی", "یر ", "ی، ", "انے", "ون ", "ن ا", "ر ع", " بر", "ی آ", "ر ح", " رک", "ے پ", "کر ", "گا۔", " پی", "سب ", " گا", "نا ", " پو", "یسے", "رای", " مر", "اری", "قان", "نون", " مم", "ندگ", " اع", "دگی", "ہ و", " ہر", "ر س", " چا", "خلا", "ا پ", "ق ح", " بھ", "س م", " شا", "ہوگ", "ے خ", "وسر", "رتی", "ومی", " بی", "رکھ", " مت", "کوی", "ر آ", "پور", "اف ", " مح", "ے س", "ہوں", "نکہ", "ونک", "ت ا", " طر", "ے ع", "یٔد", "د ا", "ال ", "ں۔ ", "م م", "اں ", " مق", "غیر", "پنی", " ام", "ں، ", "من ", "ہو ", "ریع", "و ک", "ذری", " ذر", "عام", "، م", "دان", "ادا", "اعل", "مام", "تما", " عل", "دیو", "بھی", "ھی ", "بنی", "ے ی", "ا ک", "اوی", "ل م", " زن", "یاس", "لان", "عمل", " عم", "ت م", " بچ"}, - Skr: []string{"تے ", "اں ", " تے", "دے ", "دی ", "وں ", " دا", " حق", " کو", "ے ا", "کوں", " دے", "دا ", " دی", "یاں", " کی", "ے ۔", "یں ", "ہر ", " ۔ ", "کیت", "ہے ", " وچ", " ہے", "وچ ", " ان", " شخ", "شخص", "ادی", "ال ", " حا", "اصل", "حق ", "حاص", "ے م", "خص ", "صل ", "ں د", " نا", "یا ", " ای", "اتے", "ق ح", "ل ہ", "ے و", "ں ک", " ات", "ہیں", "سی ", " مل", "نال", "زاد", "ازا", "ی ت", " از", "قوق", "ار ", "ا ح", "حقو", " او", "ص ک", " ۔ہ", "۔ہر", "ر ش", "دیا", "ے ج", "وق ", "ندے", " کر", "یند", " یا", "نہ ", " جو", "کہی", "ئے ", "ی د", "سان", "نسا", "وند", "ی ا", "یتے", "انس", "ا ا", "ملک", "ے ح", "و ڄ", "ے ک", "ڻ د", " وی", "یسی", "ے ب", "ا و", " ہو", "ں ا", "ئی ", "ندی", "تی ", "آپڻ", "وڻ ", "ر ک", "ن ۔", " نہ", "انہ", "جو ", " کن", " آپ", " جی", "اون", "ویس", "ی ن", " تھ", " کہ", "ان ", "ری ", "ڻے ", " ڄئ", " ہر", "ے ن", "دہ ", "ام ", "ں م", "ے ہ", "تھی", "ں و", "۔ ا", "ں ت", "ی ۔", "کنو", "ی ح", "ی ک", "نوں", "رے ", "ہاں", " بچ", "ون ", "ے ت", "کو ", " من", "ی ہ", "اری", "ور ", "نہا", "ہکو", "یتا", "نی ", "یاد", "ت د", "ن د", " ون", "وام", "ی م", "قوا", "تا ", "ڄئے", "پڻے", " ہک", "می ", " قو", "ق ت", "ے د", "لے ", "اف ", "ل ک", "ل ت", " تع", "چ ا", "ین ", "خلا", "اے ", "علا", " سا", "جیا", "ئو ", "کرڻ", "ی و", "انی", "ہو ", "دار", " و ", "ی ج", " اق", "ن ا", "یت ", "ارے", "ے س", "لک ", "ق د", "ہوو", " ڋو", "ر ت", " اے", "ے خ", " چا", " خل", "لاف", "قنو", "نون", "پور", "ڻ ک", " پو", "ایہ", "بچئ", "چئو", "ات ", "الا", "ونڄ", "وری", "این", " وس", " لو", "و ا", "ہ د", " رک", "یب ", "سیب", "وسی", "یر ", "ا ک", "قوم", "ریا", "ں آ", " جا", "رکھ", "مل ", "کاں", "رڻ ", "اد ", "او ", "عزت", " قن", "ب د", "وئی", "ے ع", " عز", " ۔ک", " مع", "اقو", "ایں", "م م", "زت ", "ڻی ", "یوڻ", "ر ہ", " سم", "ں س", "لوک", " جھ", " سی", "جھی", "ت ت", "ل ا", "اوڻ", "کوئ", "ں ج", "ہی ", "حدہ", "تعل", "ے ذ", "وے ", "تحد", "متح", "لا ", "ا ت", "کار", " اع", "ے ر", " مت", "ر ا", "ا م", "ھین", "ھیو", "یہو", " مط", " سڱ", "ی س", "ڄے ", "نڄے", "سڱد", "لیم", "علی", "ے ق", " ذر", "م ت", " کھ", "ن ک", " کم", "ہ ا", "سار", "ائد", "ائی", "د ا", " ہن", "ہن ", "ی، ", "و ک", "ں ب", "ھیا", "ذری", "ں پ", "لی "}, - Uig: []string{" ئا", " ھە", "ىنى", "ە ئ", "نىڭ", "ىلى", " ۋە", "ىڭ ", "ۋە ", " ئى", " بو", "ھوق", "وقۇ", " ھو", "قۇق", "نى ", "بول", " ئە", "لىك", "قىل", "ىن ", "لىش", "شقا", "قا ", "ەن ", " قى", "ن ب", "ھەم", "ى ئ", "ئاد", "ىشى", "دەم", "ادە", "كى ", "لىق", "غان", "ىي ", "ىغا", "گە ", " بى", "دىن", "ىدى", "ەت ", "كىن", "ىكى", "ندا", "ۇق ", " تە", "نلى", "تىن", "ەم ", "لەت", "قان", "ىگە", "ىتى", "ىش ", "ھەر", "ئەر", " با", "ولۇ", "دۆل", "غا ", "اند", " دۆ", "اق ", "مە ", "لۇش", "دە ", "لۇق", " ئۆ", "ان ", " يا", "ەرق", "ۆلە", "ركى", " قا", "ەرك", "ەمم", "ا ئ", "ممە", "ۇقى", "ىق ", " بە", "رقا", "داق", "ارا", "ىلە", "رىم", "ىشق", "ى ۋ", "لغا", "مەن", "اكى", "ەر ", "ا ھ", "دۇ ", "ياك", "ۇقل", "ئار", "ق ئ", "ىنل", "لار", " ئې", "ى ب", "لىن", "ڭ ئ", "ئۆز", "ق ھ", "شى ", "ىمە", "قلۇ", "ن ئ", "لەر", "ەتل", "نىش", "ىك ", "ەھر", " مە", "ھرى", "لەن", "ىلا", "ار ", "بەھ", " ئۇ", "ە ق", "ئىي", "اسى", " مۇ", "رلى", " ئو", "بىر", "، ئ", "بىل", "ش ھ", "بار", "ى، ", "ۇ ھ", "ايد", "ۇشق", "شكە", "ە ب", "يەت", "ا ب", "رنى", "كە ", "ىسى", " كې", "ېلى", "الى", "ەك ", "م ئ", "ماي", "ولم", "تنى", "ىدا", "ارى", "يدۇ", "لىد", " قو", "ەشك", "تلە", "ك ھ", "انل", "ەمد", "مائ", "ئال", "ر ئ", "مدە", "ىيە", "ش ئ", "ە ھ", "لما", "ائى", "ئىگ", "دا ", "ي ئ", "ۇشى", "راۋ", "ا، ", "سىي", " تۇ", "كىل", "ە ت", "ىقى", "قى ", "ۆزى", "ېتى", "ىرى", "ىر ", "ىپ ", "ى ك", "ن، ", "ر ب", "لەش", "اسا", "اۋا", "ى ھ", "شلى", "ساس", "ادى", "تى ", "اشق", "ەتت", "قىغ", "ىما", "انى", " خى", "ۇرۇ", " خە", "ن ق", "منى", " خا", "چە ", "ى ق", " جە", "رقى", "تىد", " ھۆ", "باش", "ارل", "ئىش", "تۇر", " جى", "مۇش", "نۇن", "شۇ ", "انۇ", "ۇش ", "رەك", "ېرە", "كېر", " سا", "الغ", "ۇنى", "ئېل", "ىشل", "تەش", "خەل", "مەت", "اش ", "دىغ", "كەن", "ەلق", "تىش", "مىن", "ايى", "سىز", "ق ۋ", "نىي", "جىن", "رىش", "پ ق", " كى", "ېرى", "ئاس", "ەلى", " ما", "تتى", "ىرل", "ولى", " دە", "ارق", "سىت", "ە م", " قە", "شىل", " تى", "ەرن", "كىش", "ن ھ", "ەلگ", "ەمن", "ك ئ", " تو", "ى ي", "قتى", "ئاش", "تىم", "تەۋ", "ناي", "ىدە", "ىنا", " بۇ", "ىيا", "زىن", "امى", "قار", "شكى", "ىز ", " ئۈ", "ەۋە", "ۆرم", "ە خ", "شىش", "ىيى", "جتى", "ىجت", "ئىج", "نام", "تەر"}, - Pes: []string{" و ", " حق", " با", "که ", "ند ", " که", " در", "در ", "رد ", " دا", "دار", "از ", " از", "هر ", " هر", "یت ", "ر ک", "حق ", "د ه", "ای ", "د و", "ان ", " را", "ین ", "ود ", "یا ", " یا", "را ", "ارد", "ی و", "کس ", " کس", " بر", " آز", "باش", "ه ب", "آزا", "د ک", " خو", "ه ا", "د ب", "زاد", " اس", "ار ", " آن", "ق د", "شد ", "حقو", "قوق", "ی ب", "وق ", "ده ", "ه د", "ید ", "ی ک", "و ا", "ور ", "ر م", "رای", "اشد", "خود", "ادی", "تما", "ری ", " اج", "ام ", "دی ", "اید", "س ح", "است", "ر ا", "و م", " ان", "د ا", "نه ", " بی", "با ", " هم", " نم", "مای", " تا", "د، ", "ی ا", "انه", "ات ", "ون ", "ایت", "ا ب", "ست ", " کن", "برا", "انو", " بش", " مو", "این", " مر", "اسا", " مل", "وان", "ر ب", "جتم", " شو", " اع", "ن ا", "ورد", " می", " ای", "آن ", " به", "و آ", "ملل", "ا م", "ماع", "نی ", "ت ا", "، ا", "ت و", "ئی ", "عی ", "ائی", "اجت", "و ب", "های", "ن م", "ی ی", "بشر", "کند", "شود", " من", " زن", "ن و", "ی، ", "بای", "ی ر", " مس", "مل ", "مور", "ز آ", "توا", "دان", "اری", "علا", "گرد", "یگر", "کار", " گر", " بد", "ن ب", "ت ب", "ت م", "ی م", " مق", "د آ", "شور", "یه ", "اعی", " عم", "ر خ", "ن ح", " کش", "رند", "مین", " اح", "ن ت", "ی د", " مت", "ه م", "د ش", " حم", "و د", "دیگ", "لام", "کشو", "هٔ ", "ه و", "انی", "لی ", "ت ک", " مج", "ق م", "میت", " کا", " شد", "اه ", "نون", " آم", "اد ", "ادا", "اعل", "د م", "ق و", "ا ک", "می ", "ی ح", "لل ", "نجا", " مح", "ساس", "یده", " قا", "بعی", "قان", "ر ش", "مقا", "ا د", "هد ", "وی ", "نوا", "گی ", "ساو", "ر ت", "بر ", "اً ", "نمی", "اسی", "اده", "او ", " او", " دی", " هی", "هیچ", "ه‌ا", "‌ها", "یر ", "خوا", "د ت", "همه", "ا ه", "تی ", "حما", "دگی", "بین", "ع ا", "سان", "ر و", "شده", "ومی", " عق", " بع", "ز ح", "شر ", "مند", " شر", "ٔمی", "أم", "تأ", "انت", "اند", "اوی", "مسا", "ردد", "بهر", " بم", "ارن", "یتو", "ل م", "ران", "و ه", "ر د", "م م", "رار", "عقی", "سی ", "و ت", "زش ", " بو", "ا ا", "ی ن", "موم", "جا ", "عمو", "رفت", "عیت", " فر", "ندگ", "واه", "زند", "م و", "نما", "ه ح", "ا ر", "دیه", "جام", "مرد", "ت، ", "د ر", "مام", " تم", "ملی", "نند", "الم", "طور", "ی ت", "تخا", "ا ت", "امی", "امل", "دد ", " شخ", "شخص"}, -} - -var devanagariLangs = langProfileList{ - Hin: []string{"के ", "प्र", "और ", " और", " के", "ों ", " का", "कार", " प्", "का ", " को", "या ", "ं क", "ति ", "ार ", "को ", " है", "िका", "ने ", "है ", "्रत", "धिक", " अध", "अधि", "की ", "ा क", " कि", " की", " सम", "ें ", "व्य", "्ति", "क्त", "से ", " व्", "ा अ", "्यक", "में", "मान", "ि क", " स्", " मे", "सी ", "न्त", " हो", "े क", "ता ", "यक्", "क्ष", "ै ।", "िक ", "त्य", " कर", "्य ", " या", "भी ", " वि", "रत्", "र स", "ी स", " जा", "स्व", "रों", "्ये", "ेक ", "येक", "त्र", "िया", "ा ज", "क व", "र ह", "ित ", "्रा", "किस", " अन", "ा स", "िसी", "ा ह", "ना ", " से", " पर", "र क", " सा", "देश", "गा ", " । ", " अप", "्त्", "े स", "समा", "ान ", "ी क", "्त ", "वार", " ।प", "ा प", " रा", "षा ", "न क", "।प्", "ष्ट", "था ", "अन्", " मा", "्षा", "्वा", "ारो", "तन्", "वतन", "ट्र", "्वत", "प्त", "ाप्", "्ट्", "राष", "ाष्", " इस", "े अ", " उस", " सं", "राप", "कि ", "त ह", "हो ", "ं औ", "ार्", "ा ।", "किय", "े प", " दे", " भी", "करन", "री ", "जाए", "ी प", " न ", "र अ", "क स", "अपन", "े व", "ाओं", "्तर", "ओं ", " नि", "सभी", "रा ", " तथ", "तथा", "िवा", "यों", "पर ", " ऐस", "रता", "ारा", "्री", "सम्", " द्", "ीय ", "िए ", "व क", "सके", "द्व", "होग", " सभ", "ं म", "माज", "रने", "िक्", "्या", "ा व", "र प", " जि", "ो स", "र उ", "रक्", "े म", "पूर", " लि", "ाएग", " भा", "इस ", "त क", "ाव ", "स्थ", "पने", "ा औ", "द्ध", "श्य", "र्व", " घो", "घोष", "रूप", "भाव", "ाने", "कृत", "ो प", "े ल", "लिए", "शिक", "ूर्", " उन", "। इ", "ं स", "य क", "्ध ", "दी ", "ी र", "र्य", "णा ", "एगा", "न्य", "रीय", "ेश ", "रति", "े ब", " रू", "ूप ", "परा", "्र ", "तर्", " पा", " सु", "जिस", "तिक", "सार", "जो ", "ेशो", " शि", "ानव", "ी अ", "चित", "े औ", " पू", "ियो", "ा उ", "म क", "ी भ", "शों", " बु", "म्म", "स्त", "िश्", "्रो", "्म ", "ो क", " यह", "र द", "नव ", "चार", "दिय", "े य", "र्ण", "राध", "ोगा", "ले ", "नून", "ानू", "ोषण", "षणा", "विश", " जन", "ारी", "परि", "गी ", "वाह", "साम", "ाना", "रका", " जो", "ाज ", "ी ज", "ध क", "बन्", "ताओ", "ंकि", "ूंक", "ास ", "कर ", "चूं", "ी व", "य ह", "ा ग", "य स", "न स", "त र", "कोई", "ुक्", "ोई ", " ।क", "ं न", "हित", "निय", "याद", "ादी", "्मा", "्था", "ामा", "ाह ", "ी म", "े ज"}, - Mar: []string{"्या", "या ", "त्य", "याच", "चा ", " व ", "ण्य", "प्र", "कार", "ाचा", " प्", "धिक", "िका", " अध", "अधि", "च्य", "ार ", "आहे", " आह", "ा अ", "हे ", " स्", "्रत", "्ये", "ा क", "स्व", " कर", "्वा", "ता ", "ास ", "ा स", "ा व", "त्र", " त्", "वा ", "ांच", "यां", "िक ", "मान", " या", "्य ", " का", " अस", "रत्", "ष्ट", "र्य", "येक", "ल्य", "र आ", "ाहि", "क्ष", " को", "ामा", "कोण", " सं", "ाच्", "ात ", "ा न", " रा", "ंत्", "ून ", "ेका", " सा", "राष", "ाष्", "चे ", "्ट्", "ट्र", "तंत", " मा", "ने ", "किं", " कि", "व्य", "वात", "े स", "करण", "ंवा", "िंव", "ये ", "क्त", " सम", "ा प", "ना ", " मि", "कास", "ातं", "्र्", "र्व", "समा", "मिळ", " जा", "े प", "व स", "यास", "ोणत", "रण्", "काम", "ीय ", "ा आ", " दे", "े क", "ांन", "हि ", "रां", " व्", "्यक", "ा म", "िळण", "ही ", " पा", "्षण", "ार्", "ान ", "े अ", " आप", " वि", "ळण्", "ाही", "ची ", "े व", "्रा", "मा ", "ली ", "ंच्", "ारा", "ा द", " आण", " नि", "णे ", "द्ध", " नय", "ला ", "ा ह", "नये", " सर", "सर्", "्री", "बंध", "ी प", "आपल", "ले ", "ील ", "माज", " हो", "्त ", "त क", "ाचे", "्व ", "षण ", "ंना", "लेल", "ी अ", "देश", "आणि", "णि ", "ध्य", " शि", "ी स", "े ज", "शिक", "रीय", "ानव", "पाह", "हिज", "िजे", "जे ", "क स", "यक्", "न क", "व त", "ा ज", "यात", "पल्", "न्य", "वी ", "स्थ", "ज्य", " ज्", "े आ", "रक्", "त स", "िक्", "ंबं", "संब", " के", "क व", "केल", "असल", "य अ", "य क", "त व", "ीत ", "णत्", "त्व", "ाने", " उप", "्वत", "भाव", "े त", "करत", "याह", "रता", "िष्", "व म", "कां", "साम", "रति", "सार", "ंचा", "र व", "क आ", "याय", "ासा", "साठ", "ाठी", "्ती", "ठी ", "ेण्", "र्थ", "ीने", "े य", "जाह", "ोणा", "संर", "ायद", "च्छ", "स स", "ंरक", "तील", "ी व", "त आ", "ी आ", "ंधा", "ेशा", "ित ", " अश", "हीर", " हक", "हक्", "क्क", "य व", "शा ", "व आ", "तीन", "ण म", "ूर्", "ेल्", "द्य", "ेले", "ांत", "ा य", "ा ब", "ी म", "ंचे", "याव", "देण", "कृत", "ारण", "ेत ", "िवा", "वस्", "स्त", "ाची", "नवी", " अर", "थवा", "अथव", "ा त", " अथ", "अर्", "ती ", "पूर", "इतर", "र्ण", "ी क", "यत्", " इत", " शा", "रका", "तिष", "ण स", "तिक", "्रक", "्ध ", "रणा", " आल", "ेल ", "ाजि", " न्", "धात", "रून", "श्र", "असे", "ष्ठ", "ुक्", "ेश ", "तो ", "जिक", "े म"}, - Mai: []string{"ाक ", " आ ", "प्र", "कार", "िका", "धिक", "ार ", "्रत", "ेँ ", "क अ", "्यक", "िक ", "्ति", " अध", "व्य", "अधि", "क स", " प्", "क्त", " व्", "केँ", "यक्", "तिक", "न्त", " स्", "हि ", "क व", "मे ", "बाक", "मान", " सम", "त्य", "क्ष", " छै", "छैक", "ेक ", "स्व", "त्र", "रत्", "्ये", "ष्ट", " अप", "येक", "र छ", "सँ ", "वा ", " एह", "ैक।", "ित ", " वि", " जा", "ति ", "्त्", "ट्र", "िके", "राष", "ाष्", " हो", "्ट्", " रा", "्य ", " सा", " अन", " कर", "अपन", "।प्", "कोन", "अछि", "वतन", "्वत", "तन्", "क आ", " अछ", "ताक", "था ", " पर", " वा", " को", "ार्", "एहि", "पन ", "ा आ", "नहि", "नो ", "समा", " मा", "्री", "रता", " नि", " का", "देश", " नह", "्षा", "क प", " दे", " कए", "रक ", " सं", "ोनो", "ि क", "न्य", "आ स", "छि ", "्त ", "ल ज", "्वा", "ारक", "ा स", "तथा", "ान्", " तथ", "्या", "आ अ", "ना ", "ँ क", "ान ", " जे", "जाए", "वार", "ता ", "ीय ", "र आ", "क ह", "करब", "िवा", "ामा", "र्व", " आओ", "्रस", "परि", "त क", "स्थ", "ा प", "ानव", "रीय", "धार", "्तर", "अन्", "घोष", "साम", "माज", "आओर", "ारण", " एक", "कएल", "ँ अ", "ओर ", "एबा", "स्त", "द्ध", "्रा", "ँ स", "रण ", " सभ", "ोषण", "क।प", "ाहि", "रबा", "क ज", "ा अ", "चित", "यक ", "कर ", "पूर", "रक्", "नक ", " घो", "षा ", "िक्", "सम्", "एहन", " उप", "र प", " अव", "एल ", "ूर्", "षणा", " हे", "त अ", "शिक", "तु ", "ाधि", "ेतु", "हेत", "हन ", "िमे", "र अ", "वक ", "ँ ए", "जाह", " शि", "आ प", "भाव", "े स", "्ध ", "क क", "ि ज", "प्त", "रूप", "निर", "िर्", " सक", "च्छ", "होए", "रति", "अनु", "सभ ", "हो ", "ेल ", "त आ", "चार", "ण स", "रा ", "त ह", "जिक", "ाजि", "र्ण", "्रक", "एत।", "ि आ", "र्य", "सभक", "ैक ", "क उ", " जन", "त स", "ाप्", "न प", "श्य", "न अ", "कृत", "हु ", "रसं", "री ", "राप", "ा व", "जे ", "क ब", "ि घ", " भा", "उद्", "ाएत", "्ण ", "विव", " उद", "वाध", "िसँ", "आ व", "ि स", "न व", "ारा", "ोएत", " ओ ", "य आ", "कान", "िश्", "न क", " दो", "णाक", " द्", "हिम", " अथ", "अथव", "ामे", "द्व", "ेश ", "ओ व", "ि अ", "क ए", "वास", " पू", "षाक", "त्त", "य प", " बी", "यता", "धक ", "ए स", "थवा", "ि द", "पर ", " भे", "जेँ", " कि", "कि ", "क ल", " रू", "विश", "न स", " ले", "सार", "ाके", "िष्", "रिव", "क र", "ास ", "ेओ ", "्थि", "केओ", "राज"}, - Bho: []string{" के", "के ", "ार ", "े क", "कार", "धिक", "िका", "ओर ", "आओर", " आओ", " अध", "अधि", "े स", "ा क", "े अ", " हो", " सं", "र क", "र स", "ें ", " मे", "में", "िक ", " कर", "ा स", "र ह", " से", "से ", "रा ", "मान", " सम", "न क", "क्ष", "े ब", "नो ", " चा", "वे ", "ता ", "चाह", "ष्ट", " रा", "ति ", "्रा", "खे ", "राष", "ाष्", "प्र", " सा", " का", "ट्र", "े आ", " प्", " सक", " मा", "्ट्", " स्", "होख", " बा", "करे", "ि क", "ौनो", "त क", "था ", "कौन", "पन ", " जा", " कौ", "रे ", "ाति", "ला ", " ओक", "ेला", "तथा", "आपन", "्त ", " आप", "कर ", "हवे", "र म", " हव", " तथ", "सबह", "र आ", "ोखे", " ह।", "िर ", "े ओ", "केल", "सके", "हे ", " और", "ही ", "तिर", "त्र", "जा ", "ना ", "बहि", "।सब", "े च", " खा", "े म", " पर", "खात", "ान ", "र ब", "न स", "ावे", " लो", "षा ", "ाहे", "ी क", "ओकर", "ा आ", "माज", "ित ", "े ज", "ल ज", "मिल", "संग", "्षा", "ं क", " सब", "ा प", "और ", "रक्", "वे।", "िं ", "े ह", "ंत्", "ाज ", "स्व", "हिं", "नइख", "कान", "ो स", " जे", "समा", "क स", "लोग", "करा", "क्त", "्रत", "ला।", " नइ", "े। ", "ानव", "िया", "हु ", "इखे", "्र ", "रता", "्वत", "ानू", "े न", "ाम ", "नून", "ाही", "वतं", "पर ", "ी स", " ओ ", "े उ", "े व", "्री", "रीय", "स्थ", "तंत", "दी ", "ीय ", "े त", "र अ", "र प", "्य ", "साम", "बा।", " आद", "ून ", "। स", "व्य", "ा।स", "सभे", "भे ", "या ", " दे", "ा म", "े ख", " वि", " सु", "केह", "प्त", "योग", "ु क", "ोग ", "े द", "चार", "ादी", "ाप्", " दो", " या", "राप", "ल ह", "पूर", " मि", "तिक", "खल ", "यता", "्ति", " बि", "ए क", "आदि", "दिम", " ही", "हि ", "मी ", " नि", "र न", " इ ", "ेहु", "नवा", "ा ह", "री ", "ले ", " पा", "ाधि", " सह", " उप", "्या", " जर", "षण ", " सभ", "िमी", "देश", "े प", "म क", "जे ", "ाव ", " अप", "शिक", "ाजि", "जाद", "जिक", "े भ", "क आ", "्तर", "िक्", "ि म", "ेकर", "ुक्", "वाध", "गठन", " व्", "निय", "ठन ", "।के", "ामा", "रो ", " जी", "य क", "न म", "े ल", "न ह", "ास ", "ेश ", " शा", "घोष", "ंगठ", "िल ", " घो", "्षण", " पू", "े र", "ंरक", "संर", "उपय", "पयो", "हो ", "बा ", "ी ब", "्म ", "सब ", "दोस", "ा। ", " आज", "साथ", " शि", "आजा", " भी", " उच", "ने ", "चित", " अं", "र व", "ज क", "न आ", " ले", "नि ", "ार्", "कि ", "याह", "्थि"}, - Nep: []string{"को ", " र ", "कार", "प्र", "ार ", "ने ", "िका", "क्त", "धिक", "्यक", " गर", "व्य", "्रत", " प्", "अधि", "्ति", " अध", " व्", "यक्", "मा ", "िक ", "त्य", "ाई ", "लाई", "न्त", "मान", " सम", "त्र", "गर्", "र्न", "क व", " वा", "्ने", "वा ", " स्", "रत्", "र स", "्ये", "तिल", "येक", "ेक ", "छ ।", "ो स", "ा स", "हरू", " वि", "क्ष", "्त्", "िला", " । ", "स्व", "हुन", "ति ", " हु", "ले ", " रा", " मा", "ष्ट", "समा", "वतन", "तन्", " छ ", "र छ", " सं", "्ट्", "ट्र", "ाष्", "ो अ", "राष", "्वत", "ुने", "नेछ", "हरु", "ान ", "ता ", "े अ", "्र ", " का", "िने", "ाको", "गरि", "े छ", "ना ", " अन", " नि", "रता", "नै ", " सा", "ित ", "तिक", "क स", "र र", "रू ", "ा अ", "था ", "स्त", "कुन", "ा र", "ुनै", " छै", "्त ", "छैन", "ा प", "ार्", "वार", "ा व", " पर", "तथा", " तथ", "का ", "्या", "एको", "रु ", "्षा", "माज", "रक्", "परि", "द्ध", "। प", " ला", "सको", "ामा", " यस", "ाहर", "ेछ ", "धार", "्रा", "ो प", "नि ", "देश", "भाव", "िवा", "्य ", "र ह", "र व", "र म", "सबै", "न अ", "े र", "न स", "रको", "अन्", "ताक", "ंरक", "संर", "्वा", " त्", "सम्", "री ", "ो व", "ा भ", "रहर", " कु", "्रि", "त र", "रिन", "श्य", "पनि", "ै व", "यस्", "ारा", "ानव", " शि", "ा त", "लाग", "रा ", "शिक", " सब", "ाउन", "िक्", "्न ", "ारक", "ा न", "रिय", "्यस", "द्व", "रति", "चार", " सह", "्षण", " सु", "ारम", "ुक्", "ुद्", "साम", "षा ", "ैन ", " अप", " भए", "बाट", "ुन ", " उप", "ान्", "ो आ", "्तर", "िय ", "कान", "ि र", "रूक", "द्द", "र प", "ाव ", "ो ल", "तो ", " पन", "ैन।", " आव", "ा ग", "।प्", "बै ", "ूर्", "िएक", "र त", "निज", "त्प", " भे", "जिक", "ेछ।", "िको", "्तो", "वाह", "त स", "ाट ", " अर", "ाजि", "्ध ", " उस", "रमा", "ात्", "र्य", "नको", "ाय ", "जको", "ित्", "ागि", " अभ", "न ग", "गि ", "ा म", " आध", "स्थ", " पा", "ारह", "घोष", "त्व", "यता", "ा क", "र्द", " मत", "विध", " सक", "सार", "परा", "युक", "राध", " घो", "णको", "अपर", "े स", "ारी", "।कु", " दि", " जन", "भेद", "रिव", "उसक", "क र", "र अ", "ि स", "ानु", "ो ह", "रुद", " छ।", "ूको", "रका", "नमा", " भन", "र्म", "हित", "पूर", "न्य", "क अ", "ा ब", "ो भ", "राज", "अनु", "ोषण", "षणा", "य र", " मन", " बि", "्धा", " दे", "निर", "ताह", "र उ", "यस ", "उने", "रण ", "विक"}, -} - -var ethiopicLangs = langProfileList{ - Amh: []string{"፡መብ", "ሰው፡", "ት፡አ", "ብት፡", "መብት", "፡ሰው", "፡አለ", "፡ወይ", "ወይም", "ይም፡", "ነት፡", "ንዱ፡", "አለው", "ለው።", "ዳንዱ", "ያንዳ", "ንዳን", "እያን", "ዱ፡ሰ", "ት፡መ", "፡እን", "፡የመ", "።እያ", "እንዲ", "፡ነጻ", "፡የተ", "ም፡በ", "ው፡የ", "ም፡የ", "፡የሚ", "ና፡በ", "ን፡የ", "፡የማ", "፡አይ", "ነጻነ", "ና፡የ", "ው፡በ", "ቶች፡", "ው።፡", "ሆነ፡", "ት፡የ", "፡በሚ", "፡መን", "ው።እ", "ትና፡", "ኀብረ", "ትን፡", "ውም፡", "ንኛው", "እኩል", "ብቻ፡", "ኛውም", "ንም፡", "፡ለመ", "፡ያለ", "ም፡ሰ", "ማንኛ", "መብቶ", "፡አገ", "ት፡በ", "ራዊ፡", "፡እኩ", "፡ለማ", "ለት፡", "በት፡", "ሆን፡", "መንግ", "፡በተ", "ረት፡", "ብቶች", "ጋብቻ", "ዎች፡", "ህንነ", "ጻነት", "ም፡እ", "ወንጀ", "፡ልዩ", "ሰብ፡", "ማንም", "ጠበቅ", "ኩል፡", "ደህን", "።ማን", "ነጻ፡", "ግኘት", "ማግኘ", "።፡እ", "፡የሆ", "፡ሁሉ", "ች፡በ", "፡በመ", "ሥራ፡", "፡ደህ", "ፈጸም", "ል፡መ", "ተግባ", "፡ድር", "ት፡ወ", "ው።ማ", "ፍርድ", "ርድ፡", "፡በሆ", "ር፡ወ", "በትም", "ትም፡", "ይነት", "ቸው፡", "ብ፡የ", "ነትና", "ቱን፡", "ሕግ፡", "ንና፡", "፡ሥራ", "የማግ", "፡መሠ", "ኘት፡", "፡ጊዜ", "ጻነቶ", "ነቶች", "በር፡", "በኀብ", "ዩነት", "ልዩነ", "፡በኀ", "፡ዓይ", "ዓይነ", "ችና፡", "ግባር", "ባር፡", "፡ደረ", "ነው።", "፡ነው", "ደረጃ", "ም።እ", "ም፡መ", "፡ወን", "ይማኖ", "ማኀበ", "ሃይማ", "፡ኑሮ", "መሠረ", "ሁሉ፡", "ነቱ፡", "ሌሎች", "ንግሥ", "በቅ፡", "የሆነ", "፡ይህ", "ንዲጠ", "ገር፡", "ተባበ", "ትክክ", "ጸም፡", "ር፡የ", "ዲጠበ", "ትም።", "ው፡ከ", "፡እያ", "ሩት፡", "ድርጅ", "፡ብቻ", "ና፡ለ", "ይገባ", "የመኖ", "፡ማን", "ንነት", "ቤተሰ", "ርጅት", "ት፡ድ", "፡መሰ", "እንደ", "፡አላ", "ብሔራ", "ት፡ለ", "ሔራዊ", "ርት፡", "ህርት", "ውን፡", "የሚያ", "ል።እ", "ሆኑ፡", "ምህር", "ትምህ", "በት።", "ለበት", "አለበ", "፡አስ", "ሎች፡", "ች፡የ", "፡በሕ", "ብረ፡", "፡ከሚ", "ን፡አ", "ት፡እ", "ን፡ወ", "ረግ፡", "በሆነ", "የኀብ", "፡የኀ", "መሆን", "፡መሆ", "ን፡መ", "፡ውሳ", "ንጀል", "ፈላጊ", "ህም፡", "ረታዊ", "ክለኛ", "ክክለ", "ታዊ፡", "ጀል፡", "ኑሮ፡", "።፡ይ", "ዓዊ፡", "ዜግነ", "ንዲሁ", "ዲሁም", "፡ማኀ", "ገሩ፡", "ር፡በ", "ብዓዊ", "አገሩ", "ሁም፡", "ና፡ነ", "ሰብዓ", "የተባ", "ጅት፡", "ማኖት", "ር፡አ", "ንግስ", "ኖት፡", "በሕግ", "መኖር", "ው፡ያ", "መጠበ", "ረጃ፡", "፡በማ", "ነትን", "ብነት", "ገብነ", "፡ገብ", "መፈጸ", "፡ሁኔ", "ሁኔታ", "ን፡ለ", "ው፡ለ", "፡ተግ", "፡የአ", "፡ይገ", "፡በአ", "ችን፡", "፡ትም", "ነቱን", "፡ቢሆ", "ቢሆን", "ጊዜ፡", "ረ፡ሰ", "ት፡ጊ", "ሰቡ፡", "ምበት", "ላቸው", "አላቸ", "በነጻ", "፡በነ", "አንድ", "ቅ፡መ", "፡መጠ", "ት፡ይ", "መሰረ", "ጥ፡የ", "ስጥ፡", "ፈጸመ", "ውስጥ", "ንድ፡", "፡ውስ", "፡በግ", "፡ሆኖ", "ሉ፡በ", "፡ጋብ", "ንስ፡", "ንነቱ", "መው፡", "የሚፈ", "አይፈ", "ብረሰ", "ነ፡መ", "፡የሃ", "ም፡ከ", "ች፡እ", "ስት፡", "ሙሉ፡", "አገር", "ሆኖ፡", "ደረግ", "ኢንተ", "ንተር", "ተርና", "ርናሽ", "ናሽና", "ሽናል"}, - Tir: []string{" መሰ", " ሰብ", "ሰብ ", " ኦለ", "ትን ", "ኦለዎ", "ናይ ", " ናይ", " ኦብ", "ዎ፡፡", "ለዎ፡", "ሕድሕ", "ኦብ ", "ድሕድ", "ሕድ ", "መሰል", "ውን ", "ሰል ", "ድ ሰ", "ይ ም", "ል ኦ", "ካብ ", "፡ሕድ", "፡፡ሕ", " ወይ", "ወይ ", " መን", " ነፃ", "ን መ", "ዝኾነ", "፡፡ ", "ታት ", "ብ ዝ", "ነት ", "ን ነ", " ካብ", "መሰላ", "ነፃነ", " እዚ", "ብ መ", "ኦዊ ", "ታትን", "መንግ", "ዊ መ", " እን", "ብ ብ", "ንግስ", "ት ኦ", "ሰላት", "ን ም", "ኾነ ", "እዚ ", "ብኦዊ", "ሰብኦ", "ን ኦ", "ን፡፡", " ንክ", " ዝኾ", "ን ን", " ምር", "ኹን ", "ይኹን", " ይኹ", "ምርካ", "ርካብ", " ኦይ", " ሃገ", "ሕጊ ", "ራት ", "ሎም ", " ብሕ", "ነ ይ", " ከም", "ማዕሪ", "ይ ብ", " ንም", " ዝተ", "ርን ", "ን ብ", "ራዊ ", " ፣ ", "ብ ሕ", "ላትን", "ብ ኦ", "ማሕበ", "ነታት", " ኦድ", "ዕሪ ", " ማዕ", "ስታት", "ግስታ", "’ውን", "ት መ", "ን ዝ", "ታዊ ", "፣ ብ", " ማሕ", "ነትን", "ንጋገ", "ድንጋ", " ስለ", " ድን", "ስራሕ", "ኩሎም", "ሕበራ", "ኦት ", "ን ሰ", "ዓለም", "ፃነታ", " ብም", "ት ወ", "መሰሪ", " ስራ", "ፃነት", "ተሰብ", "ካልኦ", "ልኦት", "ን ሓ", "ዓት ", "ዋን ", "ቡራት", "ሕቡራ", " ሕቡ", "ብሕጊ", "ድብ ", "ውድብ", " ውድ", "ብን ", "ትምህ", "ነቱ ", "ዚ ድ", "፣ ኦ", "ሃገራ", " ኩሎ", "ለዎም", "ምህር", "ም፡፡", "ም መ", " ብዝ", "ምኡ’", "ኡ’ው", "እንት", " ዓለ", " ብዘ", "በራዊ", " ሓለ", "ሓለዋ", "ዎም፡", "ቱ ን", "ት ብ", "ጋገ ", "ነፃ ", " ምዃ", "ን ዘ", " ገበ", "ት፣ ", " ትም", "ኸውን", "ራሕ ", " ዘይ", "ህርቲ", "ርቲ ", "ከምኡ", "ሃይማ", " ምስ", "ነ፣ ", "እንተ", " ስር", "ስርዓ", "ርዓት", "ባት ", "ይማኖ", "ሰሪታ", "ን ና", " ክብ", "ልን ", " ብማ", "ገሩ ", " ህዝ", "ላት ", "ት ና", "ይ ኦ", "ዕሊ ", "ለዝኾ", "ስለዝ", "ሪተሰ", "ብሪተ", "ሕብሪ", " ሕብ", "ን ተ", "ኾነ፣", "በን ", "ሃገሩ", "ገ እ", "ኻዊ ", " ሃይ", "እን ", "ሪጋገ", " ምሕ", "ን እ", "ለኻዊ", "ር፣ ", " ብሓ", " ብሃ", " ክኸ", "ክኸው", "ብ ዘ", "ዃኑ ", "ዊ ክ", "ምን ", "ሓደ ", "ምዃኑ", "ም ን", "ት እ", "ዊ ወ", "ታውን", " ሕድ", "ብዘይ", " ሕጊ", "ት ን", " ልዕ", " ካል", "ን ካ", "ሰባት", "ን ስ", "ናን ", "ቤተሰ", "ሕን ", "ለምለ", "ት ስ", "ምለኻ", "፣ ከ", "ተደን", "ባል ", "ኦድላ", "እዋን", " እዋ", "ደቂ ", " ደቂ", " ሰባ", "ፃን ", "ነፃን", "ግስቲ", "፣ ን", "ዚ ብ", "ስቲ ", " ቤተ", "ምጥሓ", " ክሳ", " ነዚ", "ን ክ", "ነቲ ", " ነቲ", "ነዚ ", " ምእ", "ብነፃ", " ምዕ", "ምዕባ", "ዕባለ", "ክሳብ", " ብነ", "ል እ", "ዚ መ", "ልዕሊ", "ክብሩ", "ብማዕ", "ሳብ ", "ህይወ", "ኦቶም", "ምስ ", "ንገገ", "እምነ", " እም", "ድ ኦ", "ቶም ", "ቲ ክ", "ፍትሓ", "ለም ", " ፍት", "ብ ን", "ን ዓ", "ራውን", "ሓፈሻ", "ደንገ", "ም ብ", "ትዮን", " ዝሰ", "ዝተደ", "ሉ መ", "ብ ና", "ጊ ካ", "ልዎ ", "ኦባል", " ኦባ", "ድልዎ", "ን ድ", "ኦድል", "ዜግነ", "ላውን", " ድሕ"}, -} - -var hebrewLangs = langProfileList{ - Heb: []string{"ות ", "ים ", "כל ", "ת ה", " כל", "דם ", "אדם", "יות", " של", " זכ", "ל א", " אד", "של ", "ל ה", "אי ", "ויו", "כאי", "ת ו", "י ל", "זכא", " ול", "לא ", " וה", "רות", "זכו", "ית ", "ירו", "ין ", " או", "ם ז", " לא", " הח", "או ", " הא", " וב", " המ", "חיר", "ת ל", "יים", "ם ל", "את ", "ת ב", "ת ש", "רה ", "ון ", " לה", "נה ", "כוי", "ותי", "ה ש", "ו ל", "ו ב", " הו", "ת א", "ם ב", "ם ו", "תו ", " את", "לה ", "ני ", "אומ", " במ", "דה ", "א י", "ה ה", "ה ב", "על ", "ם ה", " על", "הוא", "וך ", "ה א", "בוד", "וד ", "ואי", "נות", "ה ו", "ת כ", "י ה", "יה ", "ם ש", "ו ו", " שה", "ם א", "ו כ", "ינו", "ן ה", " שו", "שוו", "החי", "כות", "לאו", "בות", "דות", "ה ל", "לית", "ה מ", " בי", "וה ", "וא ", " הי", " לפ", "ור ", " לב", "ל ב", "בחי", "הכר", "לו ", "ת מ", "ן ש", "החו", "ה כ", " בכ", "ומי", "בין", "ן ו", "ן ל", "רוי", "פלי", "ולה", "ליה", " הז", "חינ", " לע", " בנ", "יבו", "חוק", " אח", "חבר", " יה", " חי", "מי ", "ירה", " חו", "האד", "ווה", "חופ", "ופש", "וק ", "נו ", "יו ", "ל מ", "מדי", "כבו", " הע", "נוך", " הד", "י א", "י ו", " הכ", "בני", "עה ", "ו א", "רצו", "דינ", "בזכ", "מות", "יפו", " אל", "סוד", "לם ", "איש", "רך ", " אי", "הגנ", "הם ", "פי ", "ם כ", "חות", "ל ו", "איל", "ילי", "תיה", "כלל", "אלי", "יסו", "האו", "זש ", " בא", "ר א", "ו ה", "זו ", "אחר", " הפ", " בע", " בז", "משפ", " בה", " לח", "דרך", "ומו", " בח", " דר", " מע", "ל י", "תוך", "מנו", " בש", "לל ", "רבו", " למ", "פני", " לק", "תם ", "שה ", "שית", "ללא", "לפי", "היה", "מעש", "דו ", "שות", "להג", "וצי", "שוא", "אין", "וי ", "תי ", "ונו", "ליל", " לו", "חיי", "ל ז", " זו", "היא", "יא ", "נתו", "ה פ", "לת ", "ובי", " לכ", "ך ה", "יל ", "י ש", "שיו", "ן ב", "עול", "המד", "ודה", "ולם", " ומ", "א ה", "ולא", " בת", "הכל", " סו", " מש", " עב", "סוצ", "ארצ", " אר", "ציא", "ד א", "לחי", "הן ", "יחס", " יח", "יאל", "הזכ", "ם נ", " שר", "בו ", "עבו", "היס", " לי", "ת ז", "פול", "יהי", "גבל", "תיו", "המא", "שהי", "א ל", "מאו", " יו", "ותו", "ישי", "גנה", "פשי", "וחד", "יהם", "חרו", "לכל", "ידה", "עות", "ונה", "ום ", "חה ", "עם ", "שרי", "ם י", "שר ", "והח", " אש", " הג", "ק ב", "הפל", "נשו", "הגב", "ד ו"}, - Ydd: []string{" פֿ", "ון ", "ער ", "ן א", " אַ", "דער", "ט א", " או", "און", "אַר", "ען ", "פֿו", " אױ", " אי", "ן פ", "ֿון", "רעכ", " דע", " רע", "עכט", "פֿא", "ן ד", "כט ", " די", "די ", "אַ ", "אױף", "ױף ", "ֿאַ", " זײ", " גע", "אַל", "אָס", " אָ", "ונג", " הא", "האָ", "זײַ", " מע", "אָל", "נג ", "װאָ", "ַן ", "אַנ", "רײַ", " װא", "ָס ", "באַ", " יע", "יעד", "ניט", "ן ז", "ר א", "יט ", "אָט", "אָר", "עדע", "מען", "זאָ", "ָט ", "פֿר", "ײַן", " בא", "טן ", "אין", "ן ג", "ין ", "ן װ", "נאַ", "ֿרײ", "ר ה", " זא", "לעכ", "ע א", "אָד", "ַ ר", "ענט", "אַצ", "ַצי", "אָנ", " צו", " װע", "יז ", "מענ", "ָדע", "איז", "ן מ", "ַלע", "בן ", "ר מ", "טער", " מי", " פּ", "מיט", "טלע", "ָל ", "עכע", "ײט ", "ַנד", "ע פ", "לע ", "געז", "לאַ", "אַפ", "עזע", "ראַ", " ני", "ַפֿ", "רן ", "ײַנ", "נען", "טיק", "כע ", "פֿע", "יע ", "הײט", "ַהײ", "נטש", "ײַה", "ט ד", "ן ב", "לן ", "ן נ", "פֿט", "שאַ", "רונ", " זי", " װי", "ט פ", " דא", "טאָ", "דיק", "קן ", "ר פ", "ר ג", "יקן", "אָב", "ף א", "אַק", "קער", "ערע", "כער", "י פ", "ות ", "ַרב", "פּר", "קט ", "עם ", "יאָ", "ציע", "ציא", "יט־", "צו ", "ישע", " קײ", "ן ק", "סער", " גל", "דאָ", "ונט", "גן ", "ַרא", "יקע", " טא", "ענע", "לײַ", "שן ", "ַנע", "יק ", "טאַ", "ס א", "עט ", "נגע", "ט־א", "ָנא", "־אי", "יקט", "נטע", "ײנע", "־ני", "ָר ", "װער", "י א", "ן י", "יך ", "זיך", "ער־", "ערן", "אױס", "ָבן", "נדע", "ָסע", "װי ", "ֿעל", "ר־נ", "ן ה", " גר", "גלײ", " צי", "ראָ", "זעל", "עלק", "נד ", "לקע", "אָפ", " כּ", "ט װ", "ג א", " נא", "ט צ", "ר ד", "עס ", "דור", "גען", "קע ", "ג פ", "ֿט ", "ן ל", "שע ", "ר ז", "רע ", "ײטן", "פּע", "קלא", "קײט", "יטע", "ים ", "ס ז", "ײַ ", " דו", "אַט", " לא", "ר װ", "קײנ", "עלש", "י ד", "לשא", "יות", "נט ", "ַרז", "ע ר", "ל ז", "אַמ", "ן ש", " שו", "אינ", "נטל", " הי", "בעט", "ָפּ", "ף פ", "ײַכ", "בער", "ן צ", "מאָ", " שט", " לע", "גער", "ורך", "רך ", "נעם", "גרו", "פֿן", "לער", "װעל", "ע מ", "ום ", "שפּ", "ך א", "יונ", "רבע", "עפֿ", "טעט", "ן כ", "רעס", "ערצ", "ז א", "עמע", "ם א", "שטע", "כן ", "רט ", "י ג", "סן ", "נער", "ליט", "ט ז", "נעמ", "ּרא", "היו", "אַש", "ת װ", "אומ", "ק א", "יבע", "ֿן ", "ץ א", "פֿי", "ײן ", "ם ט"}, -} diff --git a/vendor/github.com/abadojack/whatlanggo/options.go b/vendor/github.com/abadojack/whatlanggo/options.go deleted file mode 100644 index 3d114af..0000000 --- a/vendor/github.com/abadojack/whatlanggo/options.go +++ /dev/null @@ -1,8 +0,0 @@ -package whatlanggo - -// Options represents options that can be set when detecting a language or/and script such -// blacklisting languages to skip checking. -type Options struct { - Whitelist map[Lang]bool - Blacklist map[Lang]bool -} diff --git a/vendor/github.com/abadojack/whatlanggo/script.go b/vendor/github.com/abadojack/whatlanggo/script.go deleted file mode 100644 index 8ed92ed..0000000 --- a/vendor/github.com/abadojack/whatlanggo/script.go +++ /dev/null @@ -1,207 +0,0 @@ -package whatlanggo - -import "unicode" - -type scriptCounter struct { - checkFunc func(r rune) bool - script *unicode.RangeTable - count int -} - -// Scripts is the set of Unicode script tables. -var Scripts = map[*unicode.RangeTable]string{ - unicode.Arabic: "Arabic", - unicode.Bengali: "Bengali", - unicode.Cyrillic: "Cyrillic", - unicode.Ethiopic: "Ethiopic", - unicode.Devanagari: "Devanagari", - unicode.Han: "Han", - unicode.Georgian: "Georgian", - unicode.Greek: "Greek", - unicode.Gujarati: "Gujarati", - unicode.Gurmukhi: "Gurmukhi", - unicode.Hangul: "Hangul", - unicode.Hebrew: "Hebrew", - unicode.Hiragana: "Hiragana", - unicode.Kannada: "Kannada", - unicode.Katakana: "Katakana", - unicode.Khmer: "Khmer", - unicode.Latin: "Latin", - unicode.Malayalam: "Malayalam", - unicode.Myanmar: "Myanmar", - unicode.Oriya: "Oriya", - unicode.Sinhala: "Sinhala", - unicode.Tamil: "Tamil", - unicode.Telugu: "Telugu", - unicode.Thai: "Thai", -} - -// DetectScript returns only the script of the given text. -func DetectScript(text string) *unicode.RangeTable { - halfLen := len(text) / 2 - - scriptCounter := []scriptCounter{ - {isLatin, unicode.Latin, 0}, - {isCyrillic, unicode.Cyrillic, 0}, - {isArabic, unicode.Arabic, 0}, - {isDevanagari, unicode.Devanagari, 0}, - {isHiraganaKatakana, _HiraganaKatakana, 0}, - {isEthiopic, unicode.Ethiopic, 0}, - {isHebrew, unicode.Hebrew, 0}, - {isBengali, unicode.Bengali, 0}, - {isGeorgian, unicode.Georgian, 0}, - {isHan, unicode.Han, 0}, - {isHangul, unicode.Hangul, 0}, - {isGreek, unicode.Greek, 0}, - {isKannada, unicode.Kannada, 0}, - {isTamil, unicode.Tamil, 0}, - {isThai, unicode.Thai, 0}, - {isGujarati, unicode.Gujarati, 0}, - {isGurmukhi, unicode.Gurmukhi, 0}, - {isTelugu, unicode.Telugu, 0}, - {isMalayalam, unicode.Malayalam, 0}, - {isOriya, unicode.Oriya, 0}, - {isMyanmar, unicode.Myanmar, 0}, - {isSinhala, unicode.Sinhala, 0}, - {isKhmer, unicode.Khmer, 0}, - } - - for _, ch := range text { - if isStopChar(ch) { - continue - } - - for i, sc := range scriptCounter { - if sc.checkFunc(ch) { - scriptCounter[i].count++ - if scriptCounter[i].count > halfLen { - return sc.script - } - - //if script is found, move it closer to the front so that it be checked first. - if i > 0 { - scriptCounter[i], scriptCounter[i-1] = scriptCounter[i-1], scriptCounter[i] - } - } - } - } - - //find the script that occurs the most in the text and return it. - jpCount := 0 - max := 0 - maxScript := &unicode.RangeTable{} - for _, script := range scriptCounter { - if script.count > max { - max = script.count - maxScript = script.script - if script.script == _HiraganaKatakana { - jpCount = max - } - } - } - - switch { - case max == 0: - //if no valid script is detected, return nil. - return nil - case max != 0 && (maxScript == unicode.Han && jpCount > 0): - // If Hiragana or Katakana is included, even if judged as Mandarin, - // it is regarded as Japanese. Japanese uses Kanji (unicode.Han) - // in addition to Hiragana and Katakana. - return _HiraganaKatakana - default: - return maxScript - } -} - -var isCyrillic = func(r rune) bool { - return unicode.Is(unicode.Cyrillic, r) -} - -var isLatin = func(r rune) bool { - return unicode.Is(unicode.Latin, r) -} - -var isArabic = func(r rune) bool { - return unicode.Is(unicode.Arabic, r) -} - -var isDevanagari = func(r rune) bool { - return unicode.Is(unicode.Devanagari, r) -} - -var isEthiopic = func(r rune) bool { - return unicode.Is(unicode.Ethiopic, r) -} - -var isHebrew = func(r rune) bool { - return unicode.Is(unicode.Hebrew, r) -} - -var isHan = func(r rune) bool { - return unicode.Is(unicode.Han, r) -} - -var isBengali = func(r rune) bool { - return unicode.Is(unicode.Bengali, r) -} - -var isHiraganaKatakana = func(r rune) bool { - return unicode.Is(_HiraganaKatakana, r) -} - -var isHangul = func(r rune) bool { - return unicode.Is(unicode.Hangul, r) -} - -var isGreek = func(r rune) bool { - return unicode.Is(unicode.Greek, r) -} - -var isKannada = func(r rune) bool { - return unicode.Is(unicode.Kannada, r) -} - -var isTamil = func(r rune) bool { - return unicode.Is(unicode.Tamil, r) -} - -var isThai = func(r rune) bool { - return unicode.Is(unicode.Thai, r) -} - -var isGujarati = func(r rune) bool { - return unicode.Is(unicode.Gujarati, r) -} - -var isGurmukhi = func(r rune) bool { - return unicode.Is(unicode.Gurmukhi, r) -} - -var isTelugu = func(r rune) bool { - return unicode.Is(unicode.Telugu, r) -} - -var isMalayalam = func(r rune) bool { - return unicode.Is(unicode.Malayalam, r) -} - -var isOriya = func(r rune) bool { - return unicode.Is(unicode.Oriya, r) -} - -var isMyanmar = func(r rune) bool { - return unicode.Is(unicode.Myanmar, r) -} - -var isSinhala = func(r rune) bool { - return unicode.Is(unicode.Sinhala, r) -} - -var isKhmer = func(r rune) bool { - return unicode.Is(unicode.Khmer, r) -} - -var isGeorgian = func(r rune) bool { - return unicode.Is(unicode.Georgian, r) -} diff --git a/vendor/github.com/abadojack/whatlanggo/trigrams.go b/vendor/github.com/abadojack/whatlanggo/trigrams.go deleted file mode 100644 index b3c1d91..0000000 --- a/vendor/github.com/abadojack/whatlanggo/trigrams.go +++ /dev/null @@ -1,79 +0,0 @@ -package whatlanggo - -import ( - "sort" - "strings" - "unicode" -) - -type trigram struct { - trigram string - count int -} - -//convert punctuations and digits to space. -func toTrigramChar(ch rune) rune { - if isStopChar(ch) { - return ' ' - } - return ch -} - -func getTrigramsWithPositions(text string) map[string]int { - counterMap := count(text) - trigrams := make([]trigram, len(counterMap)) - - i := 0 - for tg, count := range counterMap { - trigrams[i] = trigram{tg, count} - i++ - } - - sort.SliceStable(trigrams, func(i, j int) bool { - if trigrams[i].count == trigrams[j].count { - return strings.Compare(trigrams[i].trigram, trigrams[j].trigram) < 0 - } - return trigrams[i].count < trigrams[j].count - }) - - trigramsWithPositions := map[string]int{} - - j := 0 - for i := len(trigrams) - 1; i >= 0; i-- { - trigramsWithPositions[trigrams[i].trigram] = j - j++ - } - return trigramsWithPositions -} - -func count(text string) map[string]int { - var r1, r2, r3 rune - trigrams := map[string]int{} - var txt []rune - - for _, r := range text { - txt = append(txt, unicode.ToLower(toTrigramChar(r))) - } - txt = append(txt, ' ') - - r1 = ' ' - r2 = txt[0] - for i := 1; i < len(txt); i++ { - r3 = txt[i] - if !(r2 == ' ' && (r1 == ' ' || r3 == ' ')) { - trigram := []rune{} - trigram = append(trigram, r1) - trigram = append(trigram, r2) - trigram = append(trigram, r3) - if trigrams[string(trigram)] == 0 { - trigrams[string(trigram)] = 1 - } else { - trigrams[string(trigram)]++ - } - } - r1 = r2 - r2 = r3 - } - - return trigrams -} diff --git a/vendor/github.com/abadojack/whatlanggo/unicode.go b/vendor/github.com/abadojack/whatlanggo/unicode.go deleted file mode 100644 index 8c1ca31..0000000 --- a/vendor/github.com/abadojack/whatlanggo/unicode.go +++ /dev/null @@ -1,10 +0,0 @@ -package whatlanggo - -import "unicode" - -var ( - _HiraganaKatakana = &unicode.RangeTable{ - R16: append(unicode.Hiragana.R16, unicode.Katakana.R16...), - R32: append(unicode.Hiragana.R32, unicode.Katakana.R32...), - } -) diff --git a/vendor/github.com/abadojack/whatlanggo/utils.go b/vendor/github.com/abadojack/whatlanggo/utils.go deleted file mode 100644 index 4b2c386..0000000 --- a/vendor/github.com/abadojack/whatlanggo/utils.go +++ /dev/null @@ -1,19 +0,0 @@ -package whatlanggo - -import "unicode" - -//isStopChar returns true if r is space, punctuation or digit. -func isStopChar(r rune) bool { - if unicode.IsSymbol(r) || unicode.IsSpace(r) || unicode.IsPunct(r) || unicode.IsDigit(r) { - return true - } - return false -} - -//abs returns the absolute value of x. -func abs(n int) int { - if n < 0 { - return n * -1 - } - return n -} diff --git a/vendor/github.com/fatih/color/LICENSE.md b/vendor/github.com/fatih/color/LICENSE.md deleted file mode 100644 index 25fdaf6..0000000 --- a/vendor/github.com/fatih/color/LICENSE.md +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2013 Fatih Arslan - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/fatih/color/README.md b/vendor/github.com/fatih/color/README.md deleted file mode 100644 index 5c751f2..0000000 --- a/vendor/github.com/fatih/color/README.md +++ /dev/null @@ -1,178 +0,0 @@ -# color [![](https://github.com/fatih/color/workflows/build/badge.svg)](https://github.com/fatih/color/actions) [![PkgGoDev](https://pkg.go.dev/badge/github.com/fatih/color)](https://pkg.go.dev/github.com/fatih/color) - -Color lets you use colorized outputs in terms of [ANSI Escape -Codes](http://en.wikipedia.org/wiki/ANSI_escape_code#Colors) in Go (Golang). It -has support for Windows too! The API can be used in several ways, pick one that -suits you. - -![Color](https://user-images.githubusercontent.com/438920/96832689-03b3e000-13f4-11eb-9803-46f4c4de3406.jpg) - - -## Install - -```bash -go get github.com/fatih/color -``` - -## Examples - -### Standard colors - -```go -// Print with default helper functions -color.Cyan("Prints text in cyan.") - -// A newline will be appended automatically -color.Blue("Prints %s in blue.", "text") - -// These are using the default foreground colors -color.Red("We have red") -color.Magenta("And many others ..") - -``` - -### Mix and reuse colors - -```go -// Create a new color object -c := color.New(color.FgCyan).Add(color.Underline) -c.Println("Prints cyan text with an underline.") - -// Or just add them to New() -d := color.New(color.FgCyan, color.Bold) -d.Printf("This prints bold cyan %s\n", "too!.") - -// Mix up foreground and background colors, create new mixes! -red := color.New(color.FgRed) - -boldRed := red.Add(color.Bold) -boldRed.Println("This will print text in bold red.") - -whiteBackground := red.Add(color.BgWhite) -whiteBackground.Println("Red text with white background.") -``` - -### Use your own output (io.Writer) - -```go -// Use your own io.Writer output -color.New(color.FgBlue).Fprintln(myWriter, "blue color!") - -blue := color.New(color.FgBlue) -blue.Fprint(writer, "This will print text in blue.") -``` - -### Custom print functions (PrintFunc) - -```go -// Create a custom print function for convenience -red := color.New(color.FgRed).PrintfFunc() -red("Warning") -red("Error: %s", err) - -// Mix up multiple attributes -notice := color.New(color.Bold, color.FgGreen).PrintlnFunc() -notice("Don't forget this...") -``` - -### Custom fprint functions (FprintFunc) - -```go -blue := color.New(FgBlue).FprintfFunc() -blue(myWriter, "important notice: %s", stars) - -// Mix up with multiple attributes -success := color.New(color.Bold, color.FgGreen).FprintlnFunc() -success(myWriter, "Don't forget this...") -``` - -### Insert into noncolor strings (SprintFunc) - -```go -// Create SprintXxx functions to mix strings with other non-colorized strings: -yellow := color.New(color.FgYellow).SprintFunc() -red := color.New(color.FgRed).SprintFunc() -fmt.Printf("This is a %s and this is %s.\n", yellow("warning"), red("error")) - -info := color.New(color.FgWhite, color.BgGreen).SprintFunc() -fmt.Printf("This %s rocks!\n", info("package")) - -// Use helper functions -fmt.Println("This", color.RedString("warning"), "should be not neglected.") -fmt.Printf("%v %v\n", color.GreenString("Info:"), "an important message.") - -// Windows supported too! Just don't forget to change the output to color.Output -fmt.Fprintf(color.Output, "Windows support: %s", color.GreenString("PASS")) -``` - -### Plug into existing code - -```go -// Use handy standard colors -color.Set(color.FgYellow) - -fmt.Println("Existing text will now be in yellow") -fmt.Printf("This one %s\n", "too") - -color.Unset() // Don't forget to unset - -// You can mix up parameters -color.Set(color.FgMagenta, color.Bold) -defer color.Unset() // Use it in your function - -fmt.Println("All text will now be bold magenta.") -``` - -### Disable/Enable color - -There might be a case where you want to explicitly disable/enable color output. the -`go-isatty` package will automatically disable color output for non-tty output streams -(for example if the output were piped directly to `less`). - -The `color` package also disables color output if the [`NO_COLOR`](https://no-color.org) environment -variable is set (regardless of its value). - -`Color` has support to disable/enable colors programatically both globally and -for single color definitions. For example suppose you have a CLI app and a -`--no-color` bool flag. You can easily disable the color output with: - -```go -var flagNoColor = flag.Bool("no-color", false, "Disable color output") - -if *flagNoColor { - color.NoColor = true // disables colorized output -} -``` - -It also has support for single color definitions (local). You can -disable/enable color output on the fly: - -```go -c := color.New(color.FgCyan) -c.Println("Prints cyan text") - -c.DisableColor() -c.Println("This is printed without any color") - -c.EnableColor() -c.Println("This prints again cyan...") -``` - -## GitHub Actions - -To output color in GitHub Actions (or other CI systems that support ANSI colors), make sure to set `color.NoColor = false` so that it bypasses the check for non-tty output streams. - -## Todo - -* Save/Return previous values -* Evaluate fmt.Formatter interface - - -## Credits - - * [Fatih Arslan](https://github.com/fatih) - * Windows support via @mattn: [colorable](https://github.com/mattn/go-colorable) - -## License - -The MIT License (MIT) - see [`LICENSE.md`](https://github.com/fatih/color/blob/master/LICENSE.md) for more details diff --git a/vendor/github.com/fatih/color/color.go b/vendor/github.com/fatih/color/color.go deleted file mode 100644 index 98a60f3..0000000 --- a/vendor/github.com/fatih/color/color.go +++ /dev/null @@ -1,618 +0,0 @@ -package color - -import ( - "fmt" - "io" - "os" - "strconv" - "strings" - "sync" - - "github.com/mattn/go-colorable" - "github.com/mattn/go-isatty" -) - -var ( - // NoColor defines if the output is colorized or not. It's dynamically set to - // false or true based on the stdout's file descriptor referring to a terminal - // or not. It's also set to true if the NO_COLOR environment variable is - // set (regardless of its value). This is a global option and affects all - // colors. For more control over each color block use the methods - // DisableColor() individually. - NoColor = noColorExists() || os.Getenv("TERM") == "dumb" || - (!isatty.IsTerminal(os.Stdout.Fd()) && !isatty.IsCygwinTerminal(os.Stdout.Fd())) - - // Output defines the standard output of the print functions. By default - // os.Stdout is used. - Output = colorable.NewColorableStdout() - - // Error defines a color supporting writer for os.Stderr. - Error = colorable.NewColorableStderr() - - // colorsCache is used to reduce the count of created Color objects and - // allows to reuse already created objects with required Attribute. - colorsCache = make(map[Attribute]*Color) - colorsCacheMu sync.Mutex // protects colorsCache -) - -// noColorExists returns true if the environment variable NO_COLOR exists. -func noColorExists() bool { - _, exists := os.LookupEnv("NO_COLOR") - return exists -} - -// Color defines a custom color object which is defined by SGR parameters. -type Color struct { - params []Attribute - noColor *bool -} - -// Attribute defines a single SGR Code -type Attribute int - -const escape = "\x1b" - -// Base attributes -const ( - Reset Attribute = iota - Bold - Faint - Italic - Underline - BlinkSlow - BlinkRapid - ReverseVideo - Concealed - CrossedOut -) - -// Foreground text colors -const ( - FgBlack Attribute = iota + 30 - FgRed - FgGreen - FgYellow - FgBlue - FgMagenta - FgCyan - FgWhite -) - -// Foreground Hi-Intensity text colors -const ( - FgHiBlack Attribute = iota + 90 - FgHiRed - FgHiGreen - FgHiYellow - FgHiBlue - FgHiMagenta - FgHiCyan - FgHiWhite -) - -// Background text colors -const ( - BgBlack Attribute = iota + 40 - BgRed - BgGreen - BgYellow - BgBlue - BgMagenta - BgCyan - BgWhite -) - -// Background Hi-Intensity text colors -const ( - BgHiBlack Attribute = iota + 100 - BgHiRed - BgHiGreen - BgHiYellow - BgHiBlue - BgHiMagenta - BgHiCyan - BgHiWhite -) - -// New returns a newly created color object. -func New(value ...Attribute) *Color { - c := &Color{ - params: make([]Attribute, 0), - } - - if noColorExists() { - c.noColor = boolPtr(true) - } - - c.Add(value...) - return c -} - -// Set sets the given parameters immediately. It will change the color of -// output with the given SGR parameters until color.Unset() is called. -func Set(p ...Attribute) *Color { - c := New(p...) - c.Set() - return c -} - -// Unset resets all escape attributes and clears the output. Usually should -// be called after Set(). -func Unset() { - if NoColor { - return - } - - fmt.Fprintf(Output, "%s[%dm", escape, Reset) -} - -// Set sets the SGR sequence. -func (c *Color) Set() *Color { - if c.isNoColorSet() { - return c - } - - fmt.Fprintf(Output, c.format()) - return c -} - -func (c *Color) unset() { - if c.isNoColorSet() { - return - } - - Unset() -} - -func (c *Color) setWriter(w io.Writer) *Color { - if c.isNoColorSet() { - return c - } - - fmt.Fprintf(w, c.format()) - return c -} - -func (c *Color) unsetWriter(w io.Writer) { - if c.isNoColorSet() { - return - } - - if NoColor { - return - } - - fmt.Fprintf(w, "%s[%dm", escape, Reset) -} - -// Add is used to chain SGR parameters. Use as many as parameters to combine -// and create custom color objects. Example: Add(color.FgRed, color.Underline). -func (c *Color) Add(value ...Attribute) *Color { - c.params = append(c.params, value...) - return c -} - -func (c *Color) prepend(value Attribute) { - c.params = append(c.params, 0) - copy(c.params[1:], c.params[0:]) - c.params[0] = value -} - -// Fprint formats using the default formats for its operands and writes to w. -// Spaces are added between operands when neither is a string. -// It returns the number of bytes written and any write error encountered. -// On Windows, users should wrap w with colorable.NewColorable() if w is of -// type *os.File. -func (c *Color) Fprint(w io.Writer, a ...interface{}) (n int, err error) { - c.setWriter(w) - defer c.unsetWriter(w) - - return fmt.Fprint(w, a...) -} - -// Print formats using the default formats for its operands and writes to -// standard output. Spaces are added between operands when neither is a -// string. It returns the number of bytes written and any write error -// encountered. This is the standard fmt.Print() method wrapped with the given -// color. -func (c *Color) Print(a ...interface{}) (n int, err error) { - c.Set() - defer c.unset() - - return fmt.Fprint(Output, a...) -} - -// Fprintf formats according to a format specifier and writes to w. -// It returns the number of bytes written and any write error encountered. -// On Windows, users should wrap w with colorable.NewColorable() if w is of -// type *os.File. -func (c *Color) Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error) { - c.setWriter(w) - defer c.unsetWriter(w) - - return fmt.Fprintf(w, format, a...) -} - -// Printf formats according to a format specifier and writes to standard output. -// It returns the number of bytes written and any write error encountered. -// This is the standard fmt.Printf() method wrapped with the given color. -func (c *Color) Printf(format string, a ...interface{}) (n int, err error) { - c.Set() - defer c.unset() - - return fmt.Fprintf(Output, format, a...) -} - -// Fprintln formats using the default formats for its operands and writes to w. -// Spaces are always added between operands and a newline is appended. -// On Windows, users should wrap w with colorable.NewColorable() if w is of -// type *os.File. -func (c *Color) Fprintln(w io.Writer, a ...interface{}) (n int, err error) { - c.setWriter(w) - defer c.unsetWriter(w) - - return fmt.Fprintln(w, a...) -} - -// Println formats using the default formats for its operands and writes to -// standard output. Spaces are always added between operands and a newline is -// appended. It returns the number of bytes written and any write error -// encountered. This is the standard fmt.Print() method wrapped with the given -// color. -func (c *Color) Println(a ...interface{}) (n int, err error) { - c.Set() - defer c.unset() - - return fmt.Fprintln(Output, a...) -} - -// Sprint is just like Print, but returns a string instead of printing it. -func (c *Color) Sprint(a ...interface{}) string { - return c.wrap(fmt.Sprint(a...)) -} - -// Sprintln is just like Println, but returns a string instead of printing it. -func (c *Color) Sprintln(a ...interface{}) string { - return c.wrap(fmt.Sprintln(a...)) -} - -// Sprintf is just like Printf, but returns a string instead of printing it. -func (c *Color) Sprintf(format string, a ...interface{}) string { - return c.wrap(fmt.Sprintf(format, a...)) -} - -// FprintFunc returns a new function that prints the passed arguments as -// colorized with color.Fprint(). -func (c *Color) FprintFunc() func(w io.Writer, a ...interface{}) { - return func(w io.Writer, a ...interface{}) { - c.Fprint(w, a...) - } -} - -// PrintFunc returns a new function that prints the passed arguments as -// colorized with color.Print(). -func (c *Color) PrintFunc() func(a ...interface{}) { - return func(a ...interface{}) { - c.Print(a...) - } -} - -// FprintfFunc returns a new function that prints the passed arguments as -// colorized with color.Fprintf(). -func (c *Color) FprintfFunc() func(w io.Writer, format string, a ...interface{}) { - return func(w io.Writer, format string, a ...interface{}) { - c.Fprintf(w, format, a...) - } -} - -// PrintfFunc returns a new function that prints the passed arguments as -// colorized with color.Printf(). -func (c *Color) PrintfFunc() func(format string, a ...interface{}) { - return func(format string, a ...interface{}) { - c.Printf(format, a...) - } -} - -// FprintlnFunc returns a new function that prints the passed arguments as -// colorized with color.Fprintln(). -func (c *Color) FprintlnFunc() func(w io.Writer, a ...interface{}) { - return func(w io.Writer, a ...interface{}) { - c.Fprintln(w, a...) - } -} - -// PrintlnFunc returns a new function that prints the passed arguments as -// colorized with color.Println(). -func (c *Color) PrintlnFunc() func(a ...interface{}) { - return func(a ...interface{}) { - c.Println(a...) - } -} - -// SprintFunc returns a new function that returns colorized strings for the -// given arguments with fmt.Sprint(). Useful to put into or mix into other -// string. Windows users should use this in conjunction with color.Output, example: -// -// put := New(FgYellow).SprintFunc() -// fmt.Fprintf(color.Output, "This is a %s", put("warning")) -func (c *Color) SprintFunc() func(a ...interface{}) string { - return func(a ...interface{}) string { - return c.wrap(fmt.Sprint(a...)) - } -} - -// SprintfFunc returns a new function that returns colorized strings for the -// given arguments with fmt.Sprintf(). Useful to put into or mix into other -// string. Windows users should use this in conjunction with color.Output. -func (c *Color) SprintfFunc() func(format string, a ...interface{}) string { - return func(format string, a ...interface{}) string { - return c.wrap(fmt.Sprintf(format, a...)) - } -} - -// SprintlnFunc returns a new function that returns colorized strings for the -// given arguments with fmt.Sprintln(). Useful to put into or mix into other -// string. Windows users should use this in conjunction with color.Output. -func (c *Color) SprintlnFunc() func(a ...interface{}) string { - return func(a ...interface{}) string { - return c.wrap(fmt.Sprintln(a...)) - } -} - -// sequence returns a formatted SGR sequence to be plugged into a "\x1b[...m" -// an example output might be: "1;36" -> bold cyan -func (c *Color) sequence() string { - format := make([]string, len(c.params)) - for i, v := range c.params { - format[i] = strconv.Itoa(int(v)) - } - - return strings.Join(format, ";") -} - -// wrap wraps the s string with the colors attributes. The string is ready to -// be printed. -func (c *Color) wrap(s string) string { - if c.isNoColorSet() { - return s - } - - return c.format() + s + c.unformat() -} - -func (c *Color) format() string { - return fmt.Sprintf("%s[%sm", escape, c.sequence()) -} - -func (c *Color) unformat() string { - return fmt.Sprintf("%s[%dm", escape, Reset) -} - -// DisableColor disables the color output. Useful to not change any existing -// code and still being able to output. Can be used for flags like -// "--no-color". To enable back use EnableColor() method. -func (c *Color) DisableColor() { - c.noColor = boolPtr(true) -} - -// EnableColor enables the color output. Use it in conjunction with -// DisableColor(). Otherwise this method has no side effects. -func (c *Color) EnableColor() { - c.noColor = boolPtr(false) -} - -func (c *Color) isNoColorSet() bool { - // check first if we have user set action - if c.noColor != nil { - return *c.noColor - } - - // if not return the global option, which is disabled by default - return NoColor -} - -// Equals returns a boolean value indicating whether two colors are equal. -func (c *Color) Equals(c2 *Color) bool { - if len(c.params) != len(c2.params) { - return false - } - - for _, attr := range c.params { - if !c2.attrExists(attr) { - return false - } - } - - return true -} - -func (c *Color) attrExists(a Attribute) bool { - for _, attr := range c.params { - if attr == a { - return true - } - } - - return false -} - -func boolPtr(v bool) *bool { - return &v -} - -func getCachedColor(p Attribute) *Color { - colorsCacheMu.Lock() - defer colorsCacheMu.Unlock() - - c, ok := colorsCache[p] - if !ok { - c = New(p) - colorsCache[p] = c - } - - return c -} - -func colorPrint(format string, p Attribute, a ...interface{}) { - c := getCachedColor(p) - - if !strings.HasSuffix(format, "\n") { - format += "\n" - } - - if len(a) == 0 { - c.Print(format) - } else { - c.Printf(format, a...) - } -} - -func colorString(format string, p Attribute, a ...interface{}) string { - c := getCachedColor(p) - - if len(a) == 0 { - return c.SprintFunc()(format) - } - - return c.SprintfFunc()(format, a...) -} - -// Black is a convenient helper function to print with black foreground. A -// newline is appended to format by default. -func Black(format string, a ...interface{}) { colorPrint(format, FgBlack, a...) } - -// Red is a convenient helper function to print with red foreground. A -// newline is appended to format by default. -func Red(format string, a ...interface{}) { colorPrint(format, FgRed, a...) } - -// Green is a convenient helper function to print with green foreground. A -// newline is appended to format by default. -func Green(format string, a ...interface{}) { colorPrint(format, FgGreen, a...) } - -// Yellow is a convenient helper function to print with yellow foreground. -// A newline is appended to format by default. -func Yellow(format string, a ...interface{}) { colorPrint(format, FgYellow, a...) } - -// Blue is a convenient helper function to print with blue foreground. A -// newline is appended to format by default. -func Blue(format string, a ...interface{}) { colorPrint(format, FgBlue, a...) } - -// Magenta is a convenient helper function to print with magenta foreground. -// A newline is appended to format by default. -func Magenta(format string, a ...interface{}) { colorPrint(format, FgMagenta, a...) } - -// Cyan is a convenient helper function to print with cyan foreground. A -// newline is appended to format by default. -func Cyan(format string, a ...interface{}) { colorPrint(format, FgCyan, a...) } - -// White is a convenient helper function to print with white foreground. A -// newline is appended to format by default. -func White(format string, a ...interface{}) { colorPrint(format, FgWhite, a...) } - -// BlackString is a convenient helper function to return a string with black -// foreground. -func BlackString(format string, a ...interface{}) string { return colorString(format, FgBlack, a...) } - -// RedString is a convenient helper function to return a string with red -// foreground. -func RedString(format string, a ...interface{}) string { return colorString(format, FgRed, a...) } - -// GreenString is a convenient helper function to return a string with green -// foreground. -func GreenString(format string, a ...interface{}) string { return colorString(format, FgGreen, a...) } - -// YellowString is a convenient helper function to return a string with yellow -// foreground. -func YellowString(format string, a ...interface{}) string { return colorString(format, FgYellow, a...) } - -// BlueString is a convenient helper function to return a string with blue -// foreground. -func BlueString(format string, a ...interface{}) string { return colorString(format, FgBlue, a...) } - -// MagentaString is a convenient helper function to return a string with magenta -// foreground. -func MagentaString(format string, a ...interface{}) string { - return colorString(format, FgMagenta, a...) -} - -// CyanString is a convenient helper function to return a string with cyan -// foreground. -func CyanString(format string, a ...interface{}) string { return colorString(format, FgCyan, a...) } - -// WhiteString is a convenient helper function to return a string with white -// foreground. -func WhiteString(format string, a ...interface{}) string { return colorString(format, FgWhite, a...) } - -// HiBlack is a convenient helper function to print with hi-intensity black foreground. A -// newline is appended to format by default. -func HiBlack(format string, a ...interface{}) { colorPrint(format, FgHiBlack, a...) } - -// HiRed is a convenient helper function to print with hi-intensity red foreground. A -// newline is appended to format by default. -func HiRed(format string, a ...interface{}) { colorPrint(format, FgHiRed, a...) } - -// HiGreen is a convenient helper function to print with hi-intensity green foreground. A -// newline is appended to format by default. -func HiGreen(format string, a ...interface{}) { colorPrint(format, FgHiGreen, a...) } - -// HiYellow is a convenient helper function to print with hi-intensity yellow foreground. -// A newline is appended to format by default. -func HiYellow(format string, a ...interface{}) { colorPrint(format, FgHiYellow, a...) } - -// HiBlue is a convenient helper function to print with hi-intensity blue foreground. A -// newline is appended to format by default. -func HiBlue(format string, a ...interface{}) { colorPrint(format, FgHiBlue, a...) } - -// HiMagenta is a convenient helper function to print with hi-intensity magenta foreground. -// A newline is appended to format by default. -func HiMagenta(format string, a ...interface{}) { colorPrint(format, FgHiMagenta, a...) } - -// HiCyan is a convenient helper function to print with hi-intensity cyan foreground. A -// newline is appended to format by default. -func HiCyan(format string, a ...interface{}) { colorPrint(format, FgHiCyan, a...) } - -// HiWhite is a convenient helper function to print with hi-intensity white foreground. A -// newline is appended to format by default. -func HiWhite(format string, a ...interface{}) { colorPrint(format, FgHiWhite, a...) } - -// HiBlackString is a convenient helper function to return a string with hi-intensity black -// foreground. -func HiBlackString(format string, a ...interface{}) string { - return colorString(format, FgHiBlack, a...) -} - -// HiRedString is a convenient helper function to return a string with hi-intensity red -// foreground. -func HiRedString(format string, a ...interface{}) string { return colorString(format, FgHiRed, a...) } - -// HiGreenString is a convenient helper function to return a string with hi-intensity green -// foreground. -func HiGreenString(format string, a ...interface{}) string { - return colorString(format, FgHiGreen, a...) -} - -// HiYellowString is a convenient helper function to return a string with hi-intensity yellow -// foreground. -func HiYellowString(format string, a ...interface{}) string { - return colorString(format, FgHiYellow, a...) -} - -// HiBlueString is a convenient helper function to return a string with hi-intensity blue -// foreground. -func HiBlueString(format string, a ...interface{}) string { return colorString(format, FgHiBlue, a...) } - -// HiMagentaString is a convenient helper function to return a string with hi-intensity magenta -// foreground. -func HiMagentaString(format string, a ...interface{}) string { - return colorString(format, FgHiMagenta, a...) -} - -// HiCyanString is a convenient helper function to return a string with hi-intensity cyan -// foreground. -func HiCyanString(format string, a ...interface{}) string { return colorString(format, FgHiCyan, a...) } - -// HiWhiteString is a convenient helper function to return a string with hi-intensity white -// foreground. -func HiWhiteString(format string, a ...interface{}) string { - return colorString(format, FgHiWhite, a...) -} diff --git a/vendor/github.com/fatih/color/doc.go b/vendor/github.com/fatih/color/doc.go deleted file mode 100644 index 04541de..0000000 --- a/vendor/github.com/fatih/color/doc.go +++ /dev/null @@ -1,135 +0,0 @@ -/* -Package color is an ANSI color package to output colorized or SGR defined -output to the standard output. The API can be used in several way, pick one -that suits you. - -Use simple and default helper functions with predefined foreground colors: - - color.Cyan("Prints text in cyan.") - - // a newline will be appended automatically - color.Blue("Prints %s in blue.", "text") - - // More default foreground colors.. - color.Red("We have red") - color.Yellow("Yellow color too!") - color.Magenta("And many others ..") - - // Hi-intensity colors - color.HiGreen("Bright green color.") - color.HiBlack("Bright black means gray..") - color.HiWhite("Shiny white color!") - -However there are times where custom color mixes are required. Below are some -examples to create custom color objects and use the print functions of each -separate color object. - - // Create a new color object - c := color.New(color.FgCyan).Add(color.Underline) - c.Println("Prints cyan text with an underline.") - - // Or just add them to New() - d := color.New(color.FgCyan, color.Bold) - d.Printf("This prints bold cyan %s\n", "too!.") - - - // Mix up foreground and background colors, create new mixes! - red := color.New(color.FgRed) - - boldRed := red.Add(color.Bold) - boldRed.Println("This will print text in bold red.") - - whiteBackground := red.Add(color.BgWhite) - whiteBackground.Println("Red text with White background.") - - // Use your own io.Writer output - color.New(color.FgBlue).Fprintln(myWriter, "blue color!") - - blue := color.New(color.FgBlue) - blue.Fprint(myWriter, "This will print text in blue.") - -You can create PrintXxx functions to simplify even more: - - // Create a custom print function for convenient - red := color.New(color.FgRed).PrintfFunc() - red("warning") - red("error: %s", err) - - // Mix up multiple attributes - notice := color.New(color.Bold, color.FgGreen).PrintlnFunc() - notice("don't forget this...") - -You can also FprintXxx functions to pass your own io.Writer: - - blue := color.New(FgBlue).FprintfFunc() - blue(myWriter, "important notice: %s", stars) - - // Mix up with multiple attributes - success := color.New(color.Bold, color.FgGreen).FprintlnFunc() - success(myWriter, don't forget this...") - - -Or create SprintXxx functions to mix strings with other non-colorized strings: - - yellow := New(FgYellow).SprintFunc() - red := New(FgRed).SprintFunc() - - fmt.Printf("this is a %s and this is %s.\n", yellow("warning"), red("error")) - - info := New(FgWhite, BgGreen).SprintFunc() - fmt.Printf("this %s rocks!\n", info("package")) - -Windows support is enabled by default. All Print functions work as intended. -However only for color.SprintXXX functions, user should use fmt.FprintXXX and -set the output to color.Output: - - fmt.Fprintf(color.Output, "Windows support: %s", color.GreenString("PASS")) - - info := New(FgWhite, BgGreen).SprintFunc() - fmt.Fprintf(color.Output, "this %s rocks!\n", info("package")) - -Using with existing code is possible. Just use the Set() method to set the -standard output to the given parameters. That way a rewrite of an existing -code is not required. - - // Use handy standard colors. - color.Set(color.FgYellow) - - fmt.Println("Existing text will be now in Yellow") - fmt.Printf("This one %s\n", "too") - - color.Unset() // don't forget to unset - - // You can mix up parameters - color.Set(color.FgMagenta, color.Bold) - defer color.Unset() // use it in your function - - fmt.Println("All text will be now bold magenta.") - -There might be a case where you want to disable color output (for example to -pipe the standard output of your app to somewhere else). `Color` has support to -disable colors both globally and for single color definition. For example -suppose you have a CLI app and a `--no-color` bool flag. You can easily disable -the color output with: - - var flagNoColor = flag.Bool("no-color", false, "Disable color output") - - if *flagNoColor { - color.NoColor = true // disables colorized output - } - -You can also disable the color by setting the NO_COLOR environment variable to any value. - -It also has support for single color definitions (local). You can -disable/enable color output on the fly: - - c := color.New(color.FgCyan) - c.Println("Prints cyan text") - - c.DisableColor() - c.Println("This is printed without any color") - - c.EnableColor() - c.Println("This prints again cyan...") -*/ -package color diff --git a/vendor/github.com/fatih/color/go.mod b/vendor/github.com/fatih/color/go.mod deleted file mode 100644 index 7887281..0000000 --- a/vendor/github.com/fatih/color/go.mod +++ /dev/null @@ -1,8 +0,0 @@ -module github.com/fatih/color - -go 1.13 - -require ( - github.com/mattn/go-colorable v0.1.8 - github.com/mattn/go-isatty v0.0.12 -) diff --git a/vendor/github.com/fatih/color/go.sum b/vendor/github.com/fatih/color/go.sum deleted file mode 100644 index 54f7c46..0000000 --- a/vendor/github.com/fatih/color/go.sum +++ /dev/null @@ -1,7 +0,0 @@ -github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae h1:/WDfKMnPU+m5M4xB+6x4kaepxRw6jWvR5iDRdvjHgy8= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/vendor/github.com/go-ole/go-ole/.travis.yml b/vendor/github.com/go-ole/go-ole/.travis.yml new file mode 100644 index 0000000..28f740c --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/.travis.yml @@ -0,0 +1,8 @@ +language: go +sudo: false + +go: + - 1.9.x + - 1.10.x + - 1.11.x + - tip diff --git a/vendor/github.com/go-ole/go-ole/ChangeLog.md b/vendor/github.com/go-ole/go-ole/ChangeLog.md new file mode 100644 index 0000000..4ba6a8c --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/ChangeLog.md @@ -0,0 +1,49 @@ +# Version 1.x.x + +* **Add more test cases and reference new test COM server project.** (Placeholder for future additions) + +# Version 1.2.0-alphaX + +**Minimum supported version is now Go 1.4. Go 1.1 support is deprecated, but should still build.** + + * Added CI configuration for Travis-CI and AppVeyor. + * Added test InterfaceID and ClassID for the COM Test Server project. + * Added more inline documentation (#83). + * Added IEnumVARIANT implementation (#88). + * Added IEnumVARIANT test cases (#99, #100, #101). + * Added support for retrieving `time.Time` from VARIANT (#92). + * Added test case for IUnknown (#64). + * Added test case for IDispatch (#64). + * Added test cases for scalar variants (#64, #76). + +# Version 1.1.1 + + * Fixes for Linux build. + * Fixes for Windows build. + +# Version 1.1.0 + +The change to provide building on all platforms is a new feature. The increase in minor version reflects that and allows those who wish to stay on 1.0.x to continue to do so. Support for 1.0.x will be limited to bug fixes. + + * Move GUID out of variables.go into its own file to make new documentation available. + * Move OleError out of ole.go into its own file to make new documentation available. + * Add documentation to utility functions. + * Add documentation to variant receiver functions. + * Add documentation to ole structures. + * Make variant available to other systems outside of Windows. + * Make OLE structures available to other systems outside of Windows. + +## New Features + + * Library should now be built on all platforms supported by Go. Library will NOOP on any platform that is not Windows. + * More functions are now documented and available on godoc.org. + +# Version 1.0.1 + + 1. Fix package references from repository location change. + +# Version 1.0.0 + +This version is stable enough for use. The COM API is still incomplete, but provides enough functionality for accessing COM servers using IDispatch interface. + +There is no changelog for this version. Check commits for history. diff --git a/vendor/github.com/go-ole/go-ole/LICENSE b/vendor/github.com/go-ole/go-ole/LICENSE new file mode 100644 index 0000000..623ec06 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright © 2013-2017 Yasuhiro Matsumoto, + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the “Software”), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/go-ole/go-ole/README.md b/vendor/github.com/go-ole/go-ole/README.md new file mode 100644 index 0000000..7b57755 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/README.md @@ -0,0 +1,46 @@ +# Go OLE + +[![Build status](https://ci.appveyor.com/api/projects/status/qr0u2sf7q43us9fj?svg=true)](https://ci.appveyor.com/project/jacobsantos/go-ole-jgs28) +[![Build Status](https://travis-ci.org/go-ole/go-ole.svg?branch=master)](https://travis-ci.org/go-ole/go-ole) +[![GoDoc](https://godoc.org/github.com/go-ole/go-ole?status.svg)](https://godoc.org/github.com/go-ole/go-ole) + +Go bindings for Windows COM using shared libraries instead of cgo. + +By Yasuhiro Matsumoto. + +## Install + +To experiment with go-ole, you can just compile and run the example program: + +``` +go get github.com/go-ole/go-ole +cd /path/to/go-ole/ +go test + +cd /path/to/go-ole/example/excel +go run excel.go +``` + +## Continuous Integration + +Continuous integration configuration has been added for both Travis-CI and AppVeyor. You will have to add these to your own account for your fork in order for it to run. + +**Travis-CI** + +Travis-CI was added to check builds on Linux to ensure that `go get` works when cross building. Currently, Travis-CI is not used to test cross-building, but this may be changed in the future. It is also not currently possible to test the library on Linux, since COM API is specific to Windows and it is not currently possible to run a COM server on Linux or even connect to a remote COM server. + +**AppVeyor** + +AppVeyor is used to build on Windows using the (in-development) test COM server. It is currently only used to test the build and ensure that the code works on Windows. It will be used to register a COM server and then run the test cases based on the test COM server. + +The tests currently do run and do pass and this should be maintained with commits. + +## Versioning + +Go OLE uses [semantic versioning](http://semver.org) for version numbers, which is similar to the version contract of the Go language. Which means that the major version will always maintain backwards compatibility with minor versions. Minor versions will only add new additions and changes. Fixes will always be in patch. + +This contract should allow you to upgrade to new minor and patch versions without breakage or modifications to your existing code. Leave a ticket, if there is breakage, so that it could be fixed. + +## LICENSE + +Under the MIT License: http://mattn.mit-license.org/2013 diff --git a/vendor/github.com/go-ole/go-ole/appveyor.yml b/vendor/github.com/go-ole/go-ole/appveyor.yml new file mode 100644 index 0000000..0d557ac --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/appveyor.yml @@ -0,0 +1,54 @@ +# Notes: +# - Minimal appveyor.yml file is an empty file. All sections are optional. +# - Indent each level of configuration with 2 spaces. Do not use tabs! +# - All section names are case-sensitive. +# - Section names should be unique on each level. + +version: "1.3.0.{build}-alpha-{branch}" + +os: Windows Server 2012 R2 + +branches: + only: + - master + - v1.2 + - v1.1 + - v1.0 + +skip_tags: true + +clone_folder: c:\gopath\src\github.com\go-ole\go-ole + +environment: + GOPATH: c:\gopath + matrix: + - GOARCH: amd64 + GOVERSION: 1.5 + GOROOT: c:\go + DOWNLOADPLATFORM: "x64" + +install: + - choco install mingw + - SET PATH=c:\tools\mingw64\bin;%PATH% + # - Download COM Server + - ps: Start-FileDownload "https://github.com/go-ole/test-com-server/releases/download/v1.0.2/test-com-server-${env:DOWNLOADPLATFORM}.zip" + - 7z e test-com-server-%DOWNLOADPLATFORM%.zip -oc:\gopath\src\github.com\go-ole\go-ole > NUL + - c:\gopath\src\github.com\go-ole\go-ole\build\register-assembly.bat + # - set + - go version + - go env + - go get -u golang.org/x/tools/cmd/cover + - go get -u golang.org/x/tools/cmd/godoc + - go get -u golang.org/x/tools/cmd/stringer + +build_script: + - cd c:\gopath\src\github.com\go-ole\go-ole + - go get -v -t ./... + - go build + - go test -v -cover ./... + +# disable automatic tests +test: off + +# disable deployment +deploy: off diff --git a/vendor/github.com/go-ole/go-ole/com.go b/vendor/github.com/go-ole/go-ole/com.go new file mode 100644 index 0000000..a9bef15 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/com.go @@ -0,0 +1,344 @@ +// +build windows + +package ole + +import ( + "syscall" + "unicode/utf16" + "unsafe" +) + +var ( + procCoInitialize = modole32.NewProc("CoInitialize") + procCoInitializeEx = modole32.NewProc("CoInitializeEx") + procCoUninitialize = modole32.NewProc("CoUninitialize") + procCoCreateInstance = modole32.NewProc("CoCreateInstance") + procCoTaskMemFree = modole32.NewProc("CoTaskMemFree") + procCLSIDFromProgID = modole32.NewProc("CLSIDFromProgID") + procCLSIDFromString = modole32.NewProc("CLSIDFromString") + procStringFromCLSID = modole32.NewProc("StringFromCLSID") + procStringFromIID = modole32.NewProc("StringFromIID") + procIIDFromString = modole32.NewProc("IIDFromString") + procCoGetObject = modole32.NewProc("CoGetObject") + procGetUserDefaultLCID = modkernel32.NewProc("GetUserDefaultLCID") + procCopyMemory = modkernel32.NewProc("RtlMoveMemory") + procVariantInit = modoleaut32.NewProc("VariantInit") + procVariantClear = modoleaut32.NewProc("VariantClear") + procVariantTimeToSystemTime = modoleaut32.NewProc("VariantTimeToSystemTime") + procSysAllocString = modoleaut32.NewProc("SysAllocString") + procSysAllocStringLen = modoleaut32.NewProc("SysAllocStringLen") + procSysFreeString = modoleaut32.NewProc("SysFreeString") + procSysStringLen = modoleaut32.NewProc("SysStringLen") + procCreateDispTypeInfo = modoleaut32.NewProc("CreateDispTypeInfo") + procCreateStdDispatch = modoleaut32.NewProc("CreateStdDispatch") + procGetActiveObject = modoleaut32.NewProc("GetActiveObject") + + procGetMessageW = moduser32.NewProc("GetMessageW") + procDispatchMessageW = moduser32.NewProc("DispatchMessageW") +) + +// coInitialize initializes COM library on current thread. +// +// MSDN documentation suggests that this function should not be called. Call +// CoInitializeEx() instead. The reason has to do with threading and this +// function is only for single-threaded apartments. +// +// That said, most users of the library have gotten away with just this +// function. If you are experiencing threading issues, then use +// CoInitializeEx(). +func coInitialize() (err error) { + // http://msdn.microsoft.com/en-us/library/windows/desktop/ms678543(v=vs.85).aspx + // Suggests that no value should be passed to CoInitialized. + // Could just be Call() since the parameter is optional. <-- Needs testing to be sure. + hr, _, _ := procCoInitialize.Call(uintptr(0)) + if hr != 0 { + err = NewError(hr) + } + return +} + +// coInitializeEx initializes COM library with concurrency model. +func coInitializeEx(coinit uint32) (err error) { + // http://msdn.microsoft.com/en-us/library/windows/desktop/ms695279(v=vs.85).aspx + // Suggests that the first parameter is not only optional but should always be NULL. + hr, _, _ := procCoInitializeEx.Call(uintptr(0), uintptr(coinit)) + if hr != 0 { + err = NewError(hr) + } + return +} + +// CoInitialize initializes COM library on current thread. +// +// MSDN documentation suggests that this function should not be called. Call +// CoInitializeEx() instead. The reason has to do with threading and this +// function is only for single-threaded apartments. +// +// That said, most users of the library have gotten away with just this +// function. If you are experiencing threading issues, then use +// CoInitializeEx(). +func CoInitialize(p uintptr) (err error) { + // p is ignored and won't be used. + // Avoid any variable not used errors. + p = uintptr(0) + return coInitialize() +} + +// CoInitializeEx initializes COM library with concurrency model. +func CoInitializeEx(p uintptr, coinit uint32) (err error) { + // Avoid any variable not used errors. + p = uintptr(0) + return coInitializeEx(coinit) +} + +// CoUninitialize uninitializes COM Library. +func CoUninitialize() { + procCoUninitialize.Call() +} + +// CoTaskMemFree frees memory pointer. +func CoTaskMemFree(memptr uintptr) { + procCoTaskMemFree.Call(memptr) +} + +// CLSIDFromProgID retrieves Class Identifier with the given Program Identifier. +// +// The Programmatic Identifier must be registered, because it will be looked up +// in the Windows Registry. The registry entry has the following keys: CLSID, +// Insertable, Protocol and Shell +// (https://msdn.microsoft.com/en-us/library/dd542719(v=vs.85).aspx). +// +// programID identifies the class id with less precision and is not guaranteed +// to be unique. These are usually found in the registry under +// HKEY_LOCAL_MACHINE\SOFTWARE\Classes, usually with the format of +// "Program.Component.Version" with version being optional. +// +// CLSIDFromProgID in Windows API. +func CLSIDFromProgID(progId string) (clsid *GUID, err error) { + var guid GUID + lpszProgID := uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(progId))) + hr, _, _ := procCLSIDFromProgID.Call(lpszProgID, uintptr(unsafe.Pointer(&guid))) + if hr != 0 { + err = NewError(hr) + } + clsid = &guid + return +} + +// CLSIDFromString retrieves Class ID from string representation. +// +// This is technically the string version of the GUID and will convert the +// string to object. +// +// CLSIDFromString in Windows API. +func CLSIDFromString(str string) (clsid *GUID, err error) { + var guid GUID + lpsz := uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(str))) + hr, _, _ := procCLSIDFromString.Call(lpsz, uintptr(unsafe.Pointer(&guid))) + if hr != 0 { + err = NewError(hr) + } + clsid = &guid + return +} + +// StringFromCLSID returns GUID formated string from GUID object. +func StringFromCLSID(clsid *GUID) (str string, err error) { + var p *uint16 + hr, _, _ := procStringFromCLSID.Call(uintptr(unsafe.Pointer(clsid)), uintptr(unsafe.Pointer(&p))) + if hr != 0 { + err = NewError(hr) + } + str = LpOleStrToString(p) + return +} + +// IIDFromString returns GUID from program ID. +func IIDFromString(progId string) (clsid *GUID, err error) { + var guid GUID + lpsz := uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(progId))) + hr, _, _ := procIIDFromString.Call(lpsz, uintptr(unsafe.Pointer(&guid))) + if hr != 0 { + err = NewError(hr) + } + clsid = &guid + return +} + +// StringFromIID returns GUID formatted string from GUID object. +func StringFromIID(iid *GUID) (str string, err error) { + var p *uint16 + hr, _, _ := procStringFromIID.Call(uintptr(unsafe.Pointer(iid)), uintptr(unsafe.Pointer(&p))) + if hr != 0 { + err = NewError(hr) + } + str = LpOleStrToString(p) + return +} + +// CreateInstance of single uninitialized object with GUID. +func CreateInstance(clsid *GUID, iid *GUID) (unk *IUnknown, err error) { + if iid == nil { + iid = IID_IUnknown + } + hr, _, _ := procCoCreateInstance.Call( + uintptr(unsafe.Pointer(clsid)), + 0, + CLSCTX_SERVER, + uintptr(unsafe.Pointer(iid)), + uintptr(unsafe.Pointer(&unk))) + if hr != 0 { + err = NewError(hr) + } + return +} + +// GetActiveObject retrieves pointer to active object. +func GetActiveObject(clsid *GUID, iid *GUID) (unk *IUnknown, err error) { + if iid == nil { + iid = IID_IUnknown + } + hr, _, _ := procGetActiveObject.Call( + uintptr(unsafe.Pointer(clsid)), + uintptr(unsafe.Pointer(iid)), + uintptr(unsafe.Pointer(&unk))) + if hr != 0 { + err = NewError(hr) + } + return +} + +type BindOpts struct { + CbStruct uint32 + GrfFlags uint32 + GrfMode uint32 + TickCountDeadline uint32 +} + +// GetObject retrieves pointer to active object. +func GetObject(programID string, bindOpts *BindOpts, iid *GUID) (unk *IUnknown, err error) { + if bindOpts != nil { + bindOpts.CbStruct = uint32(unsafe.Sizeof(BindOpts{})) + } + if iid == nil { + iid = IID_IUnknown + } + hr, _, _ := procCoGetObject.Call( + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(programID))), + uintptr(unsafe.Pointer(bindOpts)), + uintptr(unsafe.Pointer(iid)), + uintptr(unsafe.Pointer(&unk))) + if hr != 0 { + err = NewError(hr) + } + return +} + +// VariantInit initializes variant. +func VariantInit(v *VARIANT) (err error) { + hr, _, _ := procVariantInit.Call(uintptr(unsafe.Pointer(v))) + if hr != 0 { + err = NewError(hr) + } + return +} + +// VariantClear clears value in Variant settings to VT_EMPTY. +func VariantClear(v *VARIANT) (err error) { + hr, _, _ := procVariantClear.Call(uintptr(unsafe.Pointer(v))) + if hr != 0 { + err = NewError(hr) + } + return +} + +// SysAllocString allocates memory for string and copies string into memory. +func SysAllocString(v string) (ss *int16) { + pss, _, _ := procSysAllocString.Call(uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(v)))) + ss = (*int16)(unsafe.Pointer(pss)) + return +} + +// SysAllocStringLen copies up to length of given string returning pointer. +func SysAllocStringLen(v string) (ss *int16) { + utf16 := utf16.Encode([]rune(v + "\x00")) + ptr := &utf16[0] + + pss, _, _ := procSysAllocStringLen.Call(uintptr(unsafe.Pointer(ptr)), uintptr(len(utf16)-1)) + ss = (*int16)(unsafe.Pointer(pss)) + return +} + +// SysFreeString frees string system memory. This must be called with SysAllocString. +func SysFreeString(v *int16) (err error) { + hr, _, _ := procSysFreeString.Call(uintptr(unsafe.Pointer(v))) + if hr != 0 { + err = NewError(hr) + } + return +} + +// SysStringLen is the length of the system allocated string. +func SysStringLen(v *int16) uint32 { + l, _, _ := procSysStringLen.Call(uintptr(unsafe.Pointer(v))) + return uint32(l) +} + +// CreateStdDispatch provides default IDispatch implementation for IUnknown. +// +// This handles default IDispatch implementation for objects. It haves a few +// limitations with only supporting one language. It will also only return +// default exception codes. +func CreateStdDispatch(unk *IUnknown, v uintptr, ptinfo *IUnknown) (disp *IDispatch, err error) { + hr, _, _ := procCreateStdDispatch.Call( + uintptr(unsafe.Pointer(unk)), + v, + uintptr(unsafe.Pointer(ptinfo)), + uintptr(unsafe.Pointer(&disp))) + if hr != 0 { + err = NewError(hr) + } + return +} + +// CreateDispTypeInfo provides default ITypeInfo implementation for IDispatch. +// +// This will not handle the full implementation of the interface. +func CreateDispTypeInfo(idata *INTERFACEDATA) (pptinfo *IUnknown, err error) { + hr, _, _ := procCreateDispTypeInfo.Call( + uintptr(unsafe.Pointer(idata)), + uintptr(GetUserDefaultLCID()), + uintptr(unsafe.Pointer(&pptinfo))) + if hr != 0 { + err = NewError(hr) + } + return +} + +// copyMemory moves location of a block of memory. +func copyMemory(dest unsafe.Pointer, src unsafe.Pointer, length uint32) { + procCopyMemory.Call(uintptr(dest), uintptr(src), uintptr(length)) +} + +// GetUserDefaultLCID retrieves current user default locale. +func GetUserDefaultLCID() (lcid uint32) { + ret, _, _ := procGetUserDefaultLCID.Call() + lcid = uint32(ret) + return +} + +// GetMessage in message queue from runtime. +// +// This function appears to block. PeekMessage does not block. +func GetMessage(msg *Msg, hwnd uint32, MsgFilterMin uint32, MsgFilterMax uint32) (ret int32, err error) { + r0, _, err := procGetMessageW.Call(uintptr(unsafe.Pointer(msg)), uintptr(hwnd), uintptr(MsgFilterMin), uintptr(MsgFilterMax)) + ret = int32(r0) + return +} + +// DispatchMessage to window procedure. +func DispatchMessage(msg *Msg) (ret int32) { + r0, _, _ := procDispatchMessageW.Call(uintptr(unsafe.Pointer(msg))) + ret = int32(r0) + return +} diff --git a/vendor/github.com/go-ole/go-ole/com_func.go b/vendor/github.com/go-ole/go-ole/com_func.go new file mode 100644 index 0000000..cef539d --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/com_func.go @@ -0,0 +1,174 @@ +// +build !windows + +package ole + +import ( + "time" + "unsafe" +) + +// coInitialize initializes COM library on current thread. +// +// MSDN documentation suggests that this function should not be called. Call +// CoInitializeEx() instead. The reason has to do with threading and this +// function is only for single-threaded apartments. +// +// That said, most users of the library have gotten away with just this +// function. If you are experiencing threading issues, then use +// CoInitializeEx(). +func coInitialize() error { + return NewError(E_NOTIMPL) +} + +// coInitializeEx initializes COM library with concurrency model. +func coInitializeEx(coinit uint32) error { + return NewError(E_NOTIMPL) +} + +// CoInitialize initializes COM library on current thread. +// +// MSDN documentation suggests that this function should not be called. Call +// CoInitializeEx() instead. The reason has to do with threading and this +// function is only for single-threaded apartments. +// +// That said, most users of the library have gotten away with just this +// function. If you are experiencing threading issues, then use +// CoInitializeEx(). +func CoInitialize(p uintptr) error { + return NewError(E_NOTIMPL) +} + +// CoInitializeEx initializes COM library with concurrency model. +func CoInitializeEx(p uintptr, coinit uint32) error { + return NewError(E_NOTIMPL) +} + +// CoUninitialize uninitializes COM Library. +func CoUninitialize() {} + +// CoTaskMemFree frees memory pointer. +func CoTaskMemFree(memptr uintptr) {} + +// CLSIDFromProgID retrieves Class Identifier with the given Program Identifier. +// +// The Programmatic Identifier must be registered, because it will be looked up +// in the Windows Registry. The registry entry has the following keys: CLSID, +// Insertable, Protocol and Shell +// (https://msdn.microsoft.com/en-us/library/dd542719(v=vs.85).aspx). +// +// programID identifies the class id with less precision and is not guaranteed +// to be unique. These are usually found in the registry under +// HKEY_LOCAL_MACHINE\SOFTWARE\Classes, usually with the format of +// "Program.Component.Version" with version being optional. +// +// CLSIDFromProgID in Windows API. +func CLSIDFromProgID(progId string) (*GUID, error) { + return nil, NewError(E_NOTIMPL) +} + +// CLSIDFromString retrieves Class ID from string representation. +// +// This is technically the string version of the GUID and will convert the +// string to object. +// +// CLSIDFromString in Windows API. +func CLSIDFromString(str string) (*GUID, error) { + return nil, NewError(E_NOTIMPL) +} + +// StringFromCLSID returns GUID formated string from GUID object. +func StringFromCLSID(clsid *GUID) (string, error) { + return "", NewError(E_NOTIMPL) +} + +// IIDFromString returns GUID from program ID. +func IIDFromString(progId string) (*GUID, error) { + return nil, NewError(E_NOTIMPL) +} + +// StringFromIID returns GUID formatted string from GUID object. +func StringFromIID(iid *GUID) (string, error) { + return "", NewError(E_NOTIMPL) +} + +// CreateInstance of single uninitialized object with GUID. +func CreateInstance(clsid *GUID, iid *GUID) (*IUnknown, error) { + return nil, NewError(E_NOTIMPL) +} + +// GetActiveObject retrieves pointer to active object. +func GetActiveObject(clsid *GUID, iid *GUID) (*IUnknown, error) { + return nil, NewError(E_NOTIMPL) +} + +// VariantInit initializes variant. +func VariantInit(v *VARIANT) error { + return NewError(E_NOTIMPL) +} + +// VariantClear clears value in Variant settings to VT_EMPTY. +func VariantClear(v *VARIANT) error { + return NewError(E_NOTIMPL) +} + +// SysAllocString allocates memory for string and copies string into memory. +func SysAllocString(v string) *int16 { + u := int16(0) + return &u +} + +// SysAllocStringLen copies up to length of given string returning pointer. +func SysAllocStringLen(v string) *int16 { + u := int16(0) + return &u +} + +// SysFreeString frees string system memory. This must be called with SysAllocString. +func SysFreeString(v *int16) error { + return NewError(E_NOTIMPL) +} + +// SysStringLen is the length of the system allocated string. +func SysStringLen(v *int16) uint32 { + return uint32(0) +} + +// CreateStdDispatch provides default IDispatch implementation for IUnknown. +// +// This handles default IDispatch implementation for objects. It haves a few +// limitations with only supporting one language. It will also only return +// default exception codes. +func CreateStdDispatch(unk *IUnknown, v uintptr, ptinfo *IUnknown) (*IDispatch, error) { + return nil, NewError(E_NOTIMPL) +} + +// CreateDispTypeInfo provides default ITypeInfo implementation for IDispatch. +// +// This will not handle the full implementation of the interface. +func CreateDispTypeInfo(idata *INTERFACEDATA) (*IUnknown, error) { + return nil, NewError(E_NOTIMPL) +} + +// copyMemory moves location of a block of memory. +func copyMemory(dest unsafe.Pointer, src unsafe.Pointer, length uint32) {} + +// GetUserDefaultLCID retrieves current user default locale. +func GetUserDefaultLCID() uint32 { + return uint32(0) +} + +// GetMessage in message queue from runtime. +// +// This function appears to block. PeekMessage does not block. +func GetMessage(msg *Msg, hwnd uint32, MsgFilterMin uint32, MsgFilterMax uint32) (int32, error) { + return int32(0), NewError(E_NOTIMPL) +} + +// DispatchMessage to window procedure. +func DispatchMessage(msg *Msg) int32 { + return int32(0) +} + +func GetVariantDate(value uint64) (time.Time, error) { + return time.Now(), NewError(E_NOTIMPL) +} diff --git a/vendor/github.com/go-ole/go-ole/connect.go b/vendor/github.com/go-ole/go-ole/connect.go new file mode 100644 index 0000000..b2ac2ec --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/connect.go @@ -0,0 +1,192 @@ +package ole + +// Connection contains IUnknown for fluent interface interaction. +// +// Deprecated. Use oleutil package instead. +type Connection struct { + Object *IUnknown // Access COM +} + +// Initialize COM. +func (*Connection) Initialize() (err error) { + return coInitialize() +} + +// Uninitialize COM. +func (*Connection) Uninitialize() { + CoUninitialize() +} + +// Create IUnknown object based first on ProgId and then from String. +func (c *Connection) Create(progId string) (err error) { + var clsid *GUID + clsid, err = CLSIDFromProgID(progId) + if err != nil { + clsid, err = CLSIDFromString(progId) + if err != nil { + return + } + } + + unknown, err := CreateInstance(clsid, IID_IUnknown) + if err != nil { + return + } + c.Object = unknown + + return +} + +// Release IUnknown object. +func (c *Connection) Release() { + c.Object.Release() +} + +// Load COM object from list of programIDs or strings. +func (c *Connection) Load(names ...string) (errors []error) { + var tempErrors []error = make([]error, len(names)) + var numErrors int = 0 + for _, name := range names { + err := c.Create(name) + if err != nil { + tempErrors = append(tempErrors, err) + numErrors += 1 + continue + } + break + } + + copy(errors, tempErrors[0:numErrors]) + return +} + +// Dispatch returns Dispatch object. +func (c *Connection) Dispatch() (object *Dispatch, err error) { + dispatch, err := c.Object.QueryInterface(IID_IDispatch) + if err != nil { + return + } + object = &Dispatch{dispatch} + return +} + +// Dispatch stores IDispatch object. +type Dispatch struct { + Object *IDispatch // Dispatch object. +} + +// Call method on IDispatch with parameters. +func (d *Dispatch) Call(method string, params ...interface{}) (result *VARIANT, err error) { + id, err := d.GetId(method) + if err != nil { + return + } + + result, err = d.Invoke(id, DISPATCH_METHOD, params) + return +} + +// MustCall method on IDispatch with parameters. +func (d *Dispatch) MustCall(method string, params ...interface{}) (result *VARIANT) { + id, err := d.GetId(method) + if err != nil { + panic(err) + } + + result, err = d.Invoke(id, DISPATCH_METHOD, params) + if err != nil { + panic(err) + } + + return +} + +// Get property on IDispatch with parameters. +func (d *Dispatch) Get(name string, params ...interface{}) (result *VARIANT, err error) { + id, err := d.GetId(name) + if err != nil { + return + } + result, err = d.Invoke(id, DISPATCH_PROPERTYGET, params) + return +} + +// MustGet property on IDispatch with parameters. +func (d *Dispatch) MustGet(name string, params ...interface{}) (result *VARIANT) { + id, err := d.GetId(name) + if err != nil { + panic(err) + } + + result, err = d.Invoke(id, DISPATCH_PROPERTYGET, params) + if err != nil { + panic(err) + } + return +} + +// Set property on IDispatch with parameters. +func (d *Dispatch) Set(name string, params ...interface{}) (result *VARIANT, err error) { + id, err := d.GetId(name) + if err != nil { + return + } + result, err = d.Invoke(id, DISPATCH_PROPERTYPUT, params) + return +} + +// MustSet property on IDispatch with parameters. +func (d *Dispatch) MustSet(name string, params ...interface{}) (result *VARIANT) { + id, err := d.GetId(name) + if err != nil { + panic(err) + } + + result, err = d.Invoke(id, DISPATCH_PROPERTYPUT, params) + if err != nil { + panic(err) + } + return +} + +// GetId retrieves ID of name on IDispatch. +func (d *Dispatch) GetId(name string) (id int32, err error) { + var dispid []int32 + dispid, err = d.Object.GetIDsOfName([]string{name}) + if err != nil { + return + } + id = dispid[0] + return +} + +// GetIds retrieves all IDs of names on IDispatch. +func (d *Dispatch) GetIds(names ...string) (dispid []int32, err error) { + dispid, err = d.Object.GetIDsOfName(names) + return +} + +// Invoke IDispatch on DisplayID of dispatch type with parameters. +// +// There have been problems where if send cascading params..., it would error +// out because the parameters would be empty. +func (d *Dispatch) Invoke(id int32, dispatch int16, params []interface{}) (result *VARIANT, err error) { + if len(params) < 1 { + result, err = d.Object.Invoke(id, dispatch) + } else { + result, err = d.Object.Invoke(id, dispatch, params...) + } + return +} + +// Release IDispatch object. +func (d *Dispatch) Release() { + d.Object.Release() +} + +// Connect initializes COM and attempts to load IUnknown based on given names. +func Connect(names ...string) (connection *Connection) { + connection.Initialize() + connection.Load(names...) + return +} diff --git a/vendor/github.com/go-ole/go-ole/constants.go b/vendor/github.com/go-ole/go-ole/constants.go new file mode 100644 index 0000000..fd0c6d7 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/constants.go @@ -0,0 +1,153 @@ +package ole + +const ( + CLSCTX_INPROC_SERVER = 1 + CLSCTX_INPROC_HANDLER = 2 + CLSCTX_LOCAL_SERVER = 4 + CLSCTX_INPROC_SERVER16 = 8 + CLSCTX_REMOTE_SERVER = 16 + CLSCTX_ALL = CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER | CLSCTX_LOCAL_SERVER + CLSCTX_INPROC = CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER + CLSCTX_SERVER = CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER +) + +const ( + COINIT_APARTMENTTHREADED = 0x2 + COINIT_MULTITHREADED = 0x0 + COINIT_DISABLE_OLE1DDE = 0x4 + COINIT_SPEED_OVER_MEMORY = 0x8 +) + +const ( + DISPATCH_METHOD = 1 + DISPATCH_PROPERTYGET = 2 + DISPATCH_PROPERTYPUT = 4 + DISPATCH_PROPERTYPUTREF = 8 +) + +const ( + S_OK = 0x00000000 + E_UNEXPECTED = 0x8000FFFF + E_NOTIMPL = 0x80004001 + E_OUTOFMEMORY = 0x8007000E + E_INVALIDARG = 0x80070057 + E_NOINTERFACE = 0x80004002 + E_POINTER = 0x80004003 + E_HANDLE = 0x80070006 + E_ABORT = 0x80004004 + E_FAIL = 0x80004005 + E_ACCESSDENIED = 0x80070005 + E_PENDING = 0x8000000A + + CO_E_CLASSSTRING = 0x800401F3 +) + +const ( + CC_FASTCALL = iota + CC_CDECL + CC_MSCPASCAL + CC_PASCAL = CC_MSCPASCAL + CC_MACPASCAL + CC_STDCALL + CC_FPFASTCALL + CC_SYSCALL + CC_MPWCDECL + CC_MPWPASCAL + CC_MAX = CC_MPWPASCAL +) + +type VT uint16 + +const ( + VT_EMPTY VT = 0x0 + VT_NULL VT = 0x1 + VT_I2 VT = 0x2 + VT_I4 VT = 0x3 + VT_R4 VT = 0x4 + VT_R8 VT = 0x5 + VT_CY VT = 0x6 + VT_DATE VT = 0x7 + VT_BSTR VT = 0x8 + VT_DISPATCH VT = 0x9 + VT_ERROR VT = 0xa + VT_BOOL VT = 0xb + VT_VARIANT VT = 0xc + VT_UNKNOWN VT = 0xd + VT_DECIMAL VT = 0xe + VT_I1 VT = 0x10 + VT_UI1 VT = 0x11 + VT_UI2 VT = 0x12 + VT_UI4 VT = 0x13 + VT_I8 VT = 0x14 + VT_UI8 VT = 0x15 + VT_INT VT = 0x16 + VT_UINT VT = 0x17 + VT_VOID VT = 0x18 + VT_HRESULT VT = 0x19 + VT_PTR VT = 0x1a + VT_SAFEARRAY VT = 0x1b + VT_CARRAY VT = 0x1c + VT_USERDEFINED VT = 0x1d + VT_LPSTR VT = 0x1e + VT_LPWSTR VT = 0x1f + VT_RECORD VT = 0x24 + VT_INT_PTR VT = 0x25 + VT_UINT_PTR VT = 0x26 + VT_FILETIME VT = 0x40 + VT_BLOB VT = 0x41 + VT_STREAM VT = 0x42 + VT_STORAGE VT = 0x43 + VT_STREAMED_OBJECT VT = 0x44 + VT_STORED_OBJECT VT = 0x45 + VT_BLOB_OBJECT VT = 0x46 + VT_CF VT = 0x47 + VT_CLSID VT = 0x48 + VT_BSTR_BLOB VT = 0xfff + VT_VECTOR VT = 0x1000 + VT_ARRAY VT = 0x2000 + VT_BYREF VT = 0x4000 + VT_RESERVED VT = 0x8000 + VT_ILLEGAL VT = 0xffff + VT_ILLEGALMASKED VT = 0xfff + VT_TYPEMASK VT = 0xfff +) + +const ( + DISPID_UNKNOWN = -1 + DISPID_VALUE = 0 + DISPID_PROPERTYPUT = -3 + DISPID_NEWENUM = -4 + DISPID_EVALUATE = -5 + DISPID_CONSTRUCTOR = -6 + DISPID_DESTRUCTOR = -7 + DISPID_COLLECT = -8 +) + +const ( + TKIND_ENUM = 1 + TKIND_RECORD = 2 + TKIND_MODULE = 3 + TKIND_INTERFACE = 4 + TKIND_DISPATCH = 5 + TKIND_COCLASS = 6 + TKIND_ALIAS = 7 + TKIND_UNION = 8 + TKIND_MAX = 9 +) + +// Safe Array Feature Flags + +const ( + FADF_AUTO = 0x0001 + FADF_STATIC = 0x0002 + FADF_EMBEDDED = 0x0004 + FADF_FIXEDSIZE = 0x0010 + FADF_RECORD = 0x0020 + FADF_HAVEIID = 0x0040 + FADF_HAVEVARTYPE = 0x0080 + FADF_BSTR = 0x0100 + FADF_UNKNOWN = 0x0200 + FADF_DISPATCH = 0x0400 + FADF_VARIANT = 0x0800 + FADF_RESERVED = 0xF008 +) diff --git a/vendor/github.com/go-ole/go-ole/error.go b/vendor/github.com/go-ole/go-ole/error.go new file mode 100644 index 0000000..096b456 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/error.go @@ -0,0 +1,51 @@ +package ole + +// OleError stores COM errors. +type OleError struct { + hr uintptr + description string + subError error +} + +// NewError creates new error with HResult. +func NewError(hr uintptr) *OleError { + return &OleError{hr: hr} +} + +// NewErrorWithDescription creates new COM error with HResult and description. +func NewErrorWithDescription(hr uintptr, description string) *OleError { + return &OleError{hr: hr, description: description} +} + +// NewErrorWithSubError creates new COM error with parent error. +func NewErrorWithSubError(hr uintptr, description string, err error) *OleError { + return &OleError{hr: hr, description: description, subError: err} +} + +// Code is the HResult. +func (v *OleError) Code() uintptr { + return uintptr(v.hr) +} + +// String description, either manually set or format message with error code. +func (v *OleError) String() string { + if v.description != "" { + return errstr(int(v.hr)) + " (" + v.description + ")" + } + return errstr(int(v.hr)) +} + +// Error implements error interface. +func (v *OleError) Error() string { + return v.String() +} + +// Description retrieves error summary, if there is one. +func (v *OleError) Description() string { + return v.description +} + +// SubError returns parent error, if there is one. +func (v *OleError) SubError() error { + return v.subError +} diff --git a/vendor/github.com/go-ole/go-ole/error_func.go b/vendor/github.com/go-ole/go-ole/error_func.go new file mode 100644 index 0000000..8a2ffaa --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/error_func.go @@ -0,0 +1,8 @@ +// +build !windows + +package ole + +// errstr converts error code to string. +func errstr(errno int) string { + return "" +} diff --git a/vendor/github.com/go-ole/go-ole/error_windows.go b/vendor/github.com/go-ole/go-ole/error_windows.go new file mode 100644 index 0000000..d0e8e68 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/error_windows.go @@ -0,0 +1,24 @@ +// +build windows + +package ole + +import ( + "fmt" + "syscall" + "unicode/utf16" +) + +// errstr converts error code to string. +func errstr(errno int) string { + // ask windows for the remaining errors + var flags uint32 = syscall.FORMAT_MESSAGE_FROM_SYSTEM | syscall.FORMAT_MESSAGE_ARGUMENT_ARRAY | syscall.FORMAT_MESSAGE_IGNORE_INSERTS + b := make([]uint16, 300) + n, err := syscall.FormatMessage(flags, 0, uint32(errno), 0, b, nil) + if err != nil { + return fmt.Sprintf("error %d (FormatMessage failed with: %v)", errno, err) + } + // trim terminating \r and \n + for ; n > 0 && (b[n-1] == '\n' || b[n-1] == '\r'); n-- { + } + return string(utf16.Decode(b[:n])) +} diff --git a/vendor/github.com/go-ole/go-ole/go.mod b/vendor/github.com/go-ole/go-ole/go.mod new file mode 100644 index 0000000..3a21f75 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/go.mod @@ -0,0 +1,5 @@ +module github.com/go-ole/go-ole + +go 1.12 + +require golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3 diff --git a/vendor/github.com/go-ole/go-ole/go.sum b/vendor/github.com/go-ole/go-ole/go.sum new file mode 100644 index 0000000..9814d31 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/go.sum @@ -0,0 +1,2 @@ +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3 h1:7TYNF4UdlohbFwpNH04CoPMp1cHUZgO1Ebq5r2hIjfo= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/vendor/github.com/go-ole/go-ole/guid.go b/vendor/github.com/go-ole/go-ole/guid.go new file mode 100644 index 0000000..8d20f68 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/guid.go @@ -0,0 +1,284 @@ +package ole + +var ( + // IID_NULL is null Interface ID, used when no other Interface ID is known. + IID_NULL = NewGUID("{00000000-0000-0000-0000-000000000000}") + + // IID_IUnknown is for IUnknown interfaces. + IID_IUnknown = NewGUID("{00000000-0000-0000-C000-000000000046}") + + // IID_IDispatch is for IDispatch interfaces. + IID_IDispatch = NewGUID("{00020400-0000-0000-C000-000000000046}") + + // IID_IEnumVariant is for IEnumVariant interfaces + IID_IEnumVariant = NewGUID("{00020404-0000-0000-C000-000000000046}") + + // IID_IConnectionPointContainer is for IConnectionPointContainer interfaces. + IID_IConnectionPointContainer = NewGUID("{B196B284-BAB4-101A-B69C-00AA00341D07}") + + // IID_IConnectionPoint is for IConnectionPoint interfaces. + IID_IConnectionPoint = NewGUID("{B196B286-BAB4-101A-B69C-00AA00341D07}") + + // IID_IInspectable is for IInspectable interfaces. + IID_IInspectable = NewGUID("{AF86E2E0-B12D-4C6A-9C5A-D7AA65101E90}") + + // IID_IProvideClassInfo is for IProvideClassInfo interfaces. + IID_IProvideClassInfo = NewGUID("{B196B283-BAB4-101A-B69C-00AA00341D07}") +) + +// These are for testing and not part of any library. +var ( + // IID_ICOMTestString is for ICOMTestString interfaces. + // + // {E0133EB4-C36F-469A-9D3D-C66B84BE19ED} + IID_ICOMTestString = NewGUID("{E0133EB4-C36F-469A-9D3D-C66B84BE19ED}") + + // IID_ICOMTestInt8 is for ICOMTestInt8 interfaces. + // + // {BEB06610-EB84-4155-AF58-E2BFF53680B4} + IID_ICOMTestInt8 = NewGUID("{BEB06610-EB84-4155-AF58-E2BFF53680B4}") + + // IID_ICOMTestInt16 is for ICOMTestInt16 interfaces. + // + // {DAA3F9FA-761E-4976-A860-8364CE55F6FC} + IID_ICOMTestInt16 = NewGUID("{DAA3F9FA-761E-4976-A860-8364CE55F6FC}") + + // IID_ICOMTestInt32 is for ICOMTestInt32 interfaces. + // + // {E3DEDEE7-38A2-4540-91D1-2EEF1D8891B0} + IID_ICOMTestInt32 = NewGUID("{E3DEDEE7-38A2-4540-91D1-2EEF1D8891B0}") + + // IID_ICOMTestInt64 is for ICOMTestInt64 interfaces. + // + // {8D437CBC-B3ED-485C-BC32-C336432A1623} + IID_ICOMTestInt64 = NewGUID("{8D437CBC-B3ED-485C-BC32-C336432A1623}") + + // IID_ICOMTestFloat is for ICOMTestFloat interfaces. + // + // {BF1ED004-EA02-456A-AA55-2AC8AC6B054C} + IID_ICOMTestFloat = NewGUID("{BF1ED004-EA02-456A-AA55-2AC8AC6B054C}") + + // IID_ICOMTestDouble is for ICOMTestDouble interfaces. + // + // {BF908A81-8687-4E93-999F-D86FAB284BA0} + IID_ICOMTestDouble = NewGUID("{BF908A81-8687-4E93-999F-D86FAB284BA0}") + + // IID_ICOMTestBoolean is for ICOMTestBoolean interfaces. + // + // {D530E7A6-4EE8-40D1-8931-3D63B8605010} + IID_ICOMTestBoolean = NewGUID("{D530E7A6-4EE8-40D1-8931-3D63B8605010}") + + // IID_ICOMEchoTestObject is for ICOMEchoTestObject interfaces. + // + // {6485B1EF-D780-4834-A4FE-1EBB51746CA3} + IID_ICOMEchoTestObject = NewGUID("{6485B1EF-D780-4834-A4FE-1EBB51746CA3}") + + // IID_ICOMTestTypes is for ICOMTestTypes interfaces. + // + // {CCA8D7AE-91C0-4277-A8B3-FF4EDF28D3C0} + IID_ICOMTestTypes = NewGUID("{CCA8D7AE-91C0-4277-A8B3-FF4EDF28D3C0}") + + // CLSID_COMEchoTestObject is for COMEchoTestObject class. + // + // {3C24506A-AE9E-4D50-9157-EF317281F1B0} + CLSID_COMEchoTestObject = NewGUID("{3C24506A-AE9E-4D50-9157-EF317281F1B0}") + + // CLSID_COMTestScalarClass is for COMTestScalarClass class. + // + // {865B85C5-0334-4AC6-9EF6-AACEC8FC5E86} + CLSID_COMTestScalarClass = NewGUID("{865B85C5-0334-4AC6-9EF6-AACEC8FC5E86}") +) + +const hextable = "0123456789ABCDEF" +const emptyGUID = "{00000000-0000-0000-0000-000000000000}" + +// GUID is Windows API specific GUID type. +// +// This exists to match Windows GUID type for direct passing for COM. +// Format is in xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxxxxxx. +type GUID struct { + Data1 uint32 + Data2 uint16 + Data3 uint16 + Data4 [8]byte +} + +// NewGUID converts the given string into a globally unique identifier that is +// compliant with the Windows API. +// +// The supplied string may be in any of these formats: +// +// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +// XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX +// {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} +// +// The conversion of the supplied string is not case-sensitive. +func NewGUID(guid string) *GUID { + d := []byte(guid) + var d1, d2, d3, d4a, d4b []byte + + switch len(d) { + case 38: + if d[0] != '{' || d[37] != '}' { + return nil + } + d = d[1:37] + fallthrough + case 36: + if d[8] != '-' || d[13] != '-' || d[18] != '-' || d[23] != '-' { + return nil + } + d1 = d[0:8] + d2 = d[9:13] + d3 = d[14:18] + d4a = d[19:23] + d4b = d[24:36] + case 32: + d1 = d[0:8] + d2 = d[8:12] + d3 = d[12:16] + d4a = d[16:20] + d4b = d[20:32] + default: + return nil + } + + var g GUID + var ok1, ok2, ok3, ok4 bool + g.Data1, ok1 = decodeHexUint32(d1) + g.Data2, ok2 = decodeHexUint16(d2) + g.Data3, ok3 = decodeHexUint16(d3) + g.Data4, ok4 = decodeHexByte64(d4a, d4b) + if ok1 && ok2 && ok3 && ok4 { + return &g + } + return nil +} + +func decodeHexUint32(src []byte) (value uint32, ok bool) { + var b1, b2, b3, b4 byte + var ok1, ok2, ok3, ok4 bool + b1, ok1 = decodeHexByte(src[0], src[1]) + b2, ok2 = decodeHexByte(src[2], src[3]) + b3, ok3 = decodeHexByte(src[4], src[5]) + b4, ok4 = decodeHexByte(src[6], src[7]) + value = (uint32(b1) << 24) | (uint32(b2) << 16) | (uint32(b3) << 8) | uint32(b4) + ok = ok1 && ok2 && ok3 && ok4 + return +} + +func decodeHexUint16(src []byte) (value uint16, ok bool) { + var b1, b2 byte + var ok1, ok2 bool + b1, ok1 = decodeHexByte(src[0], src[1]) + b2, ok2 = decodeHexByte(src[2], src[3]) + value = (uint16(b1) << 8) | uint16(b2) + ok = ok1 && ok2 + return +} + +func decodeHexByte64(s1 []byte, s2 []byte) (value [8]byte, ok bool) { + var ok1, ok2, ok3, ok4, ok5, ok6, ok7, ok8 bool + value[0], ok1 = decodeHexByte(s1[0], s1[1]) + value[1], ok2 = decodeHexByte(s1[2], s1[3]) + value[2], ok3 = decodeHexByte(s2[0], s2[1]) + value[3], ok4 = decodeHexByte(s2[2], s2[3]) + value[4], ok5 = decodeHexByte(s2[4], s2[5]) + value[5], ok6 = decodeHexByte(s2[6], s2[7]) + value[6], ok7 = decodeHexByte(s2[8], s2[9]) + value[7], ok8 = decodeHexByte(s2[10], s2[11]) + ok = ok1 && ok2 && ok3 && ok4 && ok5 && ok6 && ok7 && ok8 + return +} + +func decodeHexByte(c1, c2 byte) (value byte, ok bool) { + var n1, n2 byte + var ok1, ok2 bool + n1, ok1 = decodeHexChar(c1) + n2, ok2 = decodeHexChar(c2) + value = (n1 << 4) | n2 + ok = ok1 && ok2 + return +} + +func decodeHexChar(c byte) (byte, bool) { + switch { + case '0' <= c && c <= '9': + return c - '0', true + case 'a' <= c && c <= 'f': + return c - 'a' + 10, true + case 'A' <= c && c <= 'F': + return c - 'A' + 10, true + } + + return 0, false +} + +// String converts the GUID to string form. It will adhere to this pattern: +// +// {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} +// +// If the GUID is nil, the string representation of an empty GUID is returned: +// +// {00000000-0000-0000-0000-000000000000} +func (guid *GUID) String() string { + if guid == nil { + return emptyGUID + } + + var c [38]byte + c[0] = '{' + putUint32Hex(c[1:9], guid.Data1) + c[9] = '-' + putUint16Hex(c[10:14], guid.Data2) + c[14] = '-' + putUint16Hex(c[15:19], guid.Data3) + c[19] = '-' + putByteHex(c[20:24], guid.Data4[0:2]) + c[24] = '-' + putByteHex(c[25:37], guid.Data4[2:8]) + c[37] = '}' + return string(c[:]) +} + +func putUint32Hex(b []byte, v uint32) { + b[0] = hextable[byte(v>>24)>>4] + b[1] = hextable[byte(v>>24)&0x0f] + b[2] = hextable[byte(v>>16)>>4] + b[3] = hextable[byte(v>>16)&0x0f] + b[4] = hextable[byte(v>>8)>>4] + b[5] = hextable[byte(v>>8)&0x0f] + b[6] = hextable[byte(v)>>4] + b[7] = hextable[byte(v)&0x0f] +} + +func putUint16Hex(b []byte, v uint16) { + b[0] = hextable[byte(v>>8)>>4] + b[1] = hextable[byte(v>>8)&0x0f] + b[2] = hextable[byte(v)>>4] + b[3] = hextable[byte(v)&0x0f] +} + +func putByteHex(dst, src []byte) { + for i := 0; i < len(src); i++ { + dst[i*2] = hextable[src[i]>>4] + dst[i*2+1] = hextable[src[i]&0x0f] + } +} + +// IsEqualGUID compares two GUID. +// +// Not constant time comparison. +func IsEqualGUID(guid1 *GUID, guid2 *GUID) bool { + return guid1.Data1 == guid2.Data1 && + guid1.Data2 == guid2.Data2 && + guid1.Data3 == guid2.Data3 && + guid1.Data4[0] == guid2.Data4[0] && + guid1.Data4[1] == guid2.Data4[1] && + guid1.Data4[2] == guid2.Data4[2] && + guid1.Data4[3] == guid2.Data4[3] && + guid1.Data4[4] == guid2.Data4[4] && + guid1.Data4[5] == guid2.Data4[5] && + guid1.Data4[6] == guid2.Data4[6] && + guid1.Data4[7] == guid2.Data4[7] +} diff --git a/vendor/github.com/go-ole/go-ole/iconnectionpoint.go b/vendor/github.com/go-ole/go-ole/iconnectionpoint.go new file mode 100644 index 0000000..9e6c49f --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/iconnectionpoint.go @@ -0,0 +1,20 @@ +package ole + +import "unsafe" + +type IConnectionPoint struct { + IUnknown +} + +type IConnectionPointVtbl struct { + IUnknownVtbl + GetConnectionInterface uintptr + GetConnectionPointContainer uintptr + Advise uintptr + Unadvise uintptr + EnumConnections uintptr +} + +func (v *IConnectionPoint) VTable() *IConnectionPointVtbl { + return (*IConnectionPointVtbl)(unsafe.Pointer(v.RawVTable)) +} diff --git a/vendor/github.com/go-ole/go-ole/iconnectionpoint_func.go b/vendor/github.com/go-ole/go-ole/iconnectionpoint_func.go new file mode 100644 index 0000000..5414dc3 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/iconnectionpoint_func.go @@ -0,0 +1,21 @@ +// +build !windows + +package ole + +import "unsafe" + +func (v *IConnectionPoint) GetConnectionInterface(piid **GUID) int32 { + return int32(0) +} + +func (v *IConnectionPoint) Advise(unknown *IUnknown) (uint32, error) { + return uint32(0), NewError(E_NOTIMPL) +} + +func (v *IConnectionPoint) Unadvise(cookie uint32) error { + return NewError(E_NOTIMPL) +} + +func (v *IConnectionPoint) EnumConnections(p *unsafe.Pointer) (err error) { + return NewError(E_NOTIMPL) +} diff --git a/vendor/github.com/go-ole/go-ole/iconnectionpoint_windows.go b/vendor/github.com/go-ole/go-ole/iconnectionpoint_windows.go new file mode 100644 index 0000000..32bc183 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/iconnectionpoint_windows.go @@ -0,0 +1,43 @@ +// +build windows + +package ole + +import ( + "syscall" + "unsafe" +) + +func (v *IConnectionPoint) GetConnectionInterface(piid **GUID) int32 { + // XXX: This doesn't look like it does what it's supposed to + return release((*IUnknown)(unsafe.Pointer(v))) +} + +func (v *IConnectionPoint) Advise(unknown *IUnknown) (cookie uint32, err error) { + hr, _, _ := syscall.Syscall( + v.VTable().Advise, + 3, + uintptr(unsafe.Pointer(v)), + uintptr(unsafe.Pointer(unknown)), + uintptr(unsafe.Pointer(&cookie))) + if hr != 0 { + err = NewError(hr) + } + return +} + +func (v *IConnectionPoint) Unadvise(cookie uint32) (err error) { + hr, _, _ := syscall.Syscall( + v.VTable().Unadvise, + 2, + uintptr(unsafe.Pointer(v)), + uintptr(cookie), + 0) + if hr != 0 { + err = NewError(hr) + } + return +} + +func (v *IConnectionPoint) EnumConnections(p *unsafe.Pointer) error { + return NewError(E_NOTIMPL) +} diff --git a/vendor/github.com/go-ole/go-ole/iconnectionpointcontainer.go b/vendor/github.com/go-ole/go-ole/iconnectionpointcontainer.go new file mode 100644 index 0000000..165860d --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/iconnectionpointcontainer.go @@ -0,0 +1,17 @@ +package ole + +import "unsafe" + +type IConnectionPointContainer struct { + IUnknown +} + +type IConnectionPointContainerVtbl struct { + IUnknownVtbl + EnumConnectionPoints uintptr + FindConnectionPoint uintptr +} + +func (v *IConnectionPointContainer) VTable() *IConnectionPointContainerVtbl { + return (*IConnectionPointContainerVtbl)(unsafe.Pointer(v.RawVTable)) +} diff --git a/vendor/github.com/go-ole/go-ole/iconnectionpointcontainer_func.go b/vendor/github.com/go-ole/go-ole/iconnectionpointcontainer_func.go new file mode 100644 index 0000000..5dfa42a --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/iconnectionpointcontainer_func.go @@ -0,0 +1,11 @@ +// +build !windows + +package ole + +func (v *IConnectionPointContainer) EnumConnectionPoints(points interface{}) error { + return NewError(E_NOTIMPL) +} + +func (v *IConnectionPointContainer) FindConnectionPoint(iid *GUID, point **IConnectionPoint) error { + return NewError(E_NOTIMPL) +} diff --git a/vendor/github.com/go-ole/go-ole/iconnectionpointcontainer_windows.go b/vendor/github.com/go-ole/go-ole/iconnectionpointcontainer_windows.go new file mode 100644 index 0000000..ad30d79 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/iconnectionpointcontainer_windows.go @@ -0,0 +1,25 @@ +// +build windows + +package ole + +import ( + "syscall" + "unsafe" +) + +func (v *IConnectionPointContainer) EnumConnectionPoints(points interface{}) error { + return NewError(E_NOTIMPL) +} + +func (v *IConnectionPointContainer) FindConnectionPoint(iid *GUID, point **IConnectionPoint) (err error) { + hr, _, _ := syscall.Syscall( + v.VTable().FindConnectionPoint, + 3, + uintptr(unsafe.Pointer(v)), + uintptr(unsafe.Pointer(iid)), + uintptr(unsafe.Pointer(point))) + if hr != 0 { + err = NewError(hr) + } + return +} diff --git a/vendor/github.com/go-ole/go-ole/idispatch.go b/vendor/github.com/go-ole/go-ole/idispatch.go new file mode 100644 index 0000000..d4af124 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/idispatch.go @@ -0,0 +1,94 @@ +package ole + +import "unsafe" + +type IDispatch struct { + IUnknown +} + +type IDispatchVtbl struct { + IUnknownVtbl + GetTypeInfoCount uintptr + GetTypeInfo uintptr + GetIDsOfNames uintptr + Invoke uintptr +} + +func (v *IDispatch) VTable() *IDispatchVtbl { + return (*IDispatchVtbl)(unsafe.Pointer(v.RawVTable)) +} + +func (v *IDispatch) GetIDsOfName(names []string) (dispid []int32, err error) { + dispid, err = getIDsOfName(v, names) + return +} + +func (v *IDispatch) Invoke(dispid int32, dispatch int16, params ...interface{}) (result *VARIANT, err error) { + result, err = invoke(v, dispid, dispatch, params...) + return +} + +func (v *IDispatch) GetTypeInfoCount() (c uint32, err error) { + c, err = getTypeInfoCount(v) + return +} + +func (v *IDispatch) GetTypeInfo() (tinfo *ITypeInfo, err error) { + tinfo, err = getTypeInfo(v) + return +} + +// GetSingleIDOfName is a helper that returns single display ID for IDispatch name. +// +// This replaces the common pattern of attempting to get a single name from the list of available +// IDs. It gives the first ID, if it is available. +func (v *IDispatch) GetSingleIDOfName(name string) (displayID int32, err error) { + var displayIDs []int32 + displayIDs, err = v.GetIDsOfName([]string{name}) + if err != nil { + return + } + displayID = displayIDs[0] + return +} + +// InvokeWithOptionalArgs accepts arguments as an array, works like Invoke. +// +// Accepts name and will attempt to retrieve Display ID to pass to Invoke. +// +// Passing params as an array is a workaround that could be fixed in later versions of Go that +// prevent passing empty params. During testing it was discovered that this is an acceptable way of +// getting around not being able to pass params normally. +func (v *IDispatch) InvokeWithOptionalArgs(name string, dispatch int16, params []interface{}) (result *VARIANT, err error) { + displayID, err := v.GetSingleIDOfName(name) + if err != nil { + return + } + + if len(params) < 1 { + result, err = v.Invoke(displayID, dispatch) + } else { + result, err = v.Invoke(displayID, dispatch, params...) + } + + return +} + +// CallMethod invokes named function with arguments on object. +func (v *IDispatch) CallMethod(name string, params ...interface{}) (*VARIANT, error) { + return v.InvokeWithOptionalArgs(name, DISPATCH_METHOD, params) +} + +// GetProperty retrieves the property with the name with the ability to pass arguments. +// +// Most of the time you will not need to pass arguments as most objects do not allow for this +// feature. Or at least, should not allow for this feature. Some servers don't follow best practices +// and this is provided for those edge cases. +func (v *IDispatch) GetProperty(name string, params ...interface{}) (*VARIANT, error) { + return v.InvokeWithOptionalArgs(name, DISPATCH_PROPERTYGET, params) +} + +// PutProperty attempts to mutate a property in the object. +func (v *IDispatch) PutProperty(name string, params ...interface{}) (*VARIANT, error) { + return v.InvokeWithOptionalArgs(name, DISPATCH_PROPERTYPUT, params) +} diff --git a/vendor/github.com/go-ole/go-ole/idispatch_func.go b/vendor/github.com/go-ole/go-ole/idispatch_func.go new file mode 100644 index 0000000..b8fbbe3 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/idispatch_func.go @@ -0,0 +1,19 @@ +// +build !windows + +package ole + +func getIDsOfName(disp *IDispatch, names []string) ([]int32, error) { + return []int32{}, NewError(E_NOTIMPL) +} + +func getTypeInfoCount(disp *IDispatch) (uint32, error) { + return uint32(0), NewError(E_NOTIMPL) +} + +func getTypeInfo(disp *IDispatch) (*ITypeInfo, error) { + return nil, NewError(E_NOTIMPL) +} + +func invoke(disp *IDispatch, dispid int32, dispatch int16, params ...interface{}) (*VARIANT, error) { + return nil, NewError(E_NOTIMPL) +} diff --git a/vendor/github.com/go-ole/go-ole/idispatch_windows.go b/vendor/github.com/go-ole/go-ole/idispatch_windows.go new file mode 100644 index 0000000..6ec180b --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/idispatch_windows.go @@ -0,0 +1,200 @@ +// +build windows + +package ole + +import ( + "math/big" + "syscall" + "time" + "unsafe" +) + +func getIDsOfName(disp *IDispatch, names []string) (dispid []int32, err error) { + wnames := make([]*uint16, len(names)) + for i := 0; i < len(names); i++ { + wnames[i] = syscall.StringToUTF16Ptr(names[i]) + } + dispid = make([]int32, len(names)) + namelen := uint32(len(names)) + hr, _, _ := syscall.Syscall6( + disp.VTable().GetIDsOfNames, + 6, + uintptr(unsafe.Pointer(disp)), + uintptr(unsafe.Pointer(IID_NULL)), + uintptr(unsafe.Pointer(&wnames[0])), + uintptr(namelen), + uintptr(GetUserDefaultLCID()), + uintptr(unsafe.Pointer(&dispid[0]))) + if hr != 0 { + err = NewError(hr) + } + return +} + +func getTypeInfoCount(disp *IDispatch) (c uint32, err error) { + hr, _, _ := syscall.Syscall( + disp.VTable().GetTypeInfoCount, + 2, + uintptr(unsafe.Pointer(disp)), + uintptr(unsafe.Pointer(&c)), + 0) + if hr != 0 { + err = NewError(hr) + } + return +} + +func getTypeInfo(disp *IDispatch) (tinfo *ITypeInfo, err error) { + hr, _, _ := syscall.Syscall( + disp.VTable().GetTypeInfo, + 3, + uintptr(unsafe.Pointer(disp)), + uintptr(GetUserDefaultLCID()), + uintptr(unsafe.Pointer(&tinfo))) + if hr != 0 { + err = NewError(hr) + } + return +} + +func invoke(disp *IDispatch, dispid int32, dispatch int16, params ...interface{}) (result *VARIANT, err error) { + var dispparams DISPPARAMS + + if dispatch&DISPATCH_PROPERTYPUT != 0 { + dispnames := [1]int32{DISPID_PROPERTYPUT} + dispparams.rgdispidNamedArgs = uintptr(unsafe.Pointer(&dispnames[0])) + dispparams.cNamedArgs = 1 + } else if dispatch&DISPATCH_PROPERTYPUTREF != 0 { + dispnames := [1]int32{DISPID_PROPERTYPUT} + dispparams.rgdispidNamedArgs = uintptr(unsafe.Pointer(&dispnames[0])) + dispparams.cNamedArgs = 1 + } + var vargs []VARIANT + if len(params) > 0 { + vargs = make([]VARIANT, len(params)) + for i, v := range params { + //n := len(params)-i-1 + n := len(params) - i - 1 + VariantInit(&vargs[n]) + switch vv := v.(type) { + case bool: + if vv { + vargs[n] = NewVariant(VT_BOOL, 0xffff) + } else { + vargs[n] = NewVariant(VT_BOOL, 0) + } + case *bool: + vargs[n] = NewVariant(VT_BOOL|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*bool))))) + case uint8: + vargs[n] = NewVariant(VT_I1, int64(v.(uint8))) + case *uint8: + vargs[n] = NewVariant(VT_I1|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*uint8))))) + case int8: + vargs[n] = NewVariant(VT_I1, int64(v.(int8))) + case *int8: + vargs[n] = NewVariant(VT_I1|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*uint8))))) + case int16: + vargs[n] = NewVariant(VT_I2, int64(v.(int16))) + case *int16: + vargs[n] = NewVariant(VT_I2|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*int16))))) + case uint16: + vargs[n] = NewVariant(VT_UI2, int64(v.(uint16))) + case *uint16: + vargs[n] = NewVariant(VT_UI2|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*uint16))))) + case int32: + vargs[n] = NewVariant(VT_I4, int64(v.(int32))) + case *int32: + vargs[n] = NewVariant(VT_I4|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*int32))))) + case uint32: + vargs[n] = NewVariant(VT_UI4, int64(v.(uint32))) + case *uint32: + vargs[n] = NewVariant(VT_UI4|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*uint32))))) + case int64: + vargs[n] = NewVariant(VT_I8, int64(v.(int64))) + case *int64: + vargs[n] = NewVariant(VT_I8|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*int64))))) + case uint64: + vargs[n] = NewVariant(VT_UI8, int64(uintptr(v.(uint64)))) + case *uint64: + vargs[n] = NewVariant(VT_UI8|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*uint64))))) + case int: + vargs[n] = NewVariant(VT_I4, int64(v.(int))) + case *int: + vargs[n] = NewVariant(VT_I4|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*int))))) + case uint: + vargs[n] = NewVariant(VT_UI4, int64(v.(uint))) + case *uint: + vargs[n] = NewVariant(VT_UI4|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*uint))))) + case float32: + vargs[n] = NewVariant(VT_R4, *(*int64)(unsafe.Pointer(&vv))) + case *float32: + vargs[n] = NewVariant(VT_R4|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*float32))))) + case float64: + vargs[n] = NewVariant(VT_R8, *(*int64)(unsafe.Pointer(&vv))) + case *float64: + vargs[n] = NewVariant(VT_R8|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*float64))))) + case *big.Int: + vargs[n] = NewVariant(VT_DECIMAL, v.(*big.Int).Int64()) + case string: + vargs[n] = NewVariant(VT_BSTR, int64(uintptr(unsafe.Pointer(SysAllocStringLen(v.(string)))))) + case *string: + vargs[n] = NewVariant(VT_BSTR|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*string))))) + case time.Time: + s := vv.Format("2006-01-02 15:04:05") + vargs[n] = NewVariant(VT_BSTR, int64(uintptr(unsafe.Pointer(SysAllocStringLen(s))))) + case *time.Time: + s := vv.Format("2006-01-02 15:04:05") + vargs[n] = NewVariant(VT_BSTR|VT_BYREF, int64(uintptr(unsafe.Pointer(&s)))) + case *IDispatch: + vargs[n] = NewVariant(VT_DISPATCH, int64(uintptr(unsafe.Pointer(v.(*IDispatch))))) + case **IDispatch: + vargs[n] = NewVariant(VT_DISPATCH|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(**IDispatch))))) + case nil: + vargs[n] = NewVariant(VT_NULL, 0) + case *VARIANT: + vargs[n] = NewVariant(VT_VARIANT|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*VARIANT))))) + case []byte: + safeByteArray := safeArrayFromByteSlice(v.([]byte)) + vargs[n] = NewVariant(VT_ARRAY|VT_UI1, int64(uintptr(unsafe.Pointer(safeByteArray)))) + defer VariantClear(&vargs[n]) + case []string: + safeByteArray := safeArrayFromStringSlice(v.([]string)) + vargs[n] = NewVariant(VT_ARRAY|VT_BSTR, int64(uintptr(unsafe.Pointer(safeByteArray)))) + defer VariantClear(&vargs[n]) + default: + panic("unknown type") + } + } + dispparams.rgvarg = uintptr(unsafe.Pointer(&vargs[0])) + dispparams.cArgs = uint32(len(params)) + } + + result = new(VARIANT) + var excepInfo EXCEPINFO + VariantInit(result) + hr, _, _ := syscall.Syscall9( + disp.VTable().Invoke, + 9, + uintptr(unsafe.Pointer(disp)), + uintptr(dispid), + uintptr(unsafe.Pointer(IID_NULL)), + uintptr(GetUserDefaultLCID()), + uintptr(dispatch), + uintptr(unsafe.Pointer(&dispparams)), + uintptr(unsafe.Pointer(result)), + uintptr(unsafe.Pointer(&excepInfo)), + 0) + if hr != 0 { + err = NewErrorWithSubError(hr, BstrToString(excepInfo.bstrDescription), excepInfo) + } + for i, varg := range vargs { + n := len(params) - i - 1 + if varg.VT == VT_BSTR && varg.Val != 0 { + SysFreeString(((*int16)(unsafe.Pointer(uintptr(varg.Val))))) + } + if varg.VT == (VT_BSTR|VT_BYREF) && varg.Val != 0 { + *(params[n].(*string)) = LpOleStrToString(*(**uint16)(unsafe.Pointer(uintptr(varg.Val)))) + } + } + return +} diff --git a/vendor/github.com/go-ole/go-ole/ienumvariant.go b/vendor/github.com/go-ole/go-ole/ienumvariant.go new file mode 100644 index 0000000..2433897 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/ienumvariant.go @@ -0,0 +1,19 @@ +package ole + +import "unsafe" + +type IEnumVARIANT struct { + IUnknown +} + +type IEnumVARIANTVtbl struct { + IUnknownVtbl + Next uintptr + Skip uintptr + Reset uintptr + Clone uintptr +} + +func (v *IEnumVARIANT) VTable() *IEnumVARIANTVtbl { + return (*IEnumVARIANTVtbl)(unsafe.Pointer(v.RawVTable)) +} diff --git a/vendor/github.com/go-ole/go-ole/ienumvariant_func.go b/vendor/github.com/go-ole/go-ole/ienumvariant_func.go new file mode 100644 index 0000000..c148481 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/ienumvariant_func.go @@ -0,0 +1,19 @@ +// +build !windows + +package ole + +func (enum *IEnumVARIANT) Clone() (*IEnumVARIANT, error) { + return nil, NewError(E_NOTIMPL) +} + +func (enum *IEnumVARIANT) Reset() error { + return NewError(E_NOTIMPL) +} + +func (enum *IEnumVARIANT) Skip(celt uint) error { + return NewError(E_NOTIMPL) +} + +func (enum *IEnumVARIANT) Next(celt uint) (VARIANT, uint, error) { + return NewVariant(VT_NULL, int64(0)), 0, NewError(E_NOTIMPL) +} diff --git a/vendor/github.com/go-ole/go-ole/ienumvariant_windows.go b/vendor/github.com/go-ole/go-ole/ienumvariant_windows.go new file mode 100644 index 0000000..4781f3b --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/ienumvariant_windows.go @@ -0,0 +1,63 @@ +// +build windows + +package ole + +import ( + "syscall" + "unsafe" +) + +func (enum *IEnumVARIANT) Clone() (cloned *IEnumVARIANT, err error) { + hr, _, _ := syscall.Syscall( + enum.VTable().Clone, + 2, + uintptr(unsafe.Pointer(enum)), + uintptr(unsafe.Pointer(&cloned)), + 0) + if hr != 0 { + err = NewError(hr) + } + return +} + +func (enum *IEnumVARIANT) Reset() (err error) { + hr, _, _ := syscall.Syscall( + enum.VTable().Reset, + 1, + uintptr(unsafe.Pointer(enum)), + 0, + 0) + if hr != 0 { + err = NewError(hr) + } + return +} + +func (enum *IEnumVARIANT) Skip(celt uint) (err error) { + hr, _, _ := syscall.Syscall( + enum.VTable().Skip, + 2, + uintptr(unsafe.Pointer(enum)), + uintptr(celt), + 0) + if hr != 0 { + err = NewError(hr) + } + return +} + +func (enum *IEnumVARIANT) Next(celt uint) (array VARIANT, length uint, err error) { + hr, _, _ := syscall.Syscall6( + enum.VTable().Next, + 4, + uintptr(unsafe.Pointer(enum)), + uintptr(celt), + uintptr(unsafe.Pointer(&array)), + uintptr(unsafe.Pointer(&length)), + 0, + 0) + if hr != 0 { + err = NewError(hr) + } + return +} diff --git a/vendor/github.com/go-ole/go-ole/iinspectable.go b/vendor/github.com/go-ole/go-ole/iinspectable.go new file mode 100644 index 0000000..f4a19e2 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/iinspectable.go @@ -0,0 +1,18 @@ +package ole + +import "unsafe" + +type IInspectable struct { + IUnknown +} + +type IInspectableVtbl struct { + IUnknownVtbl + GetIIds uintptr + GetRuntimeClassName uintptr + GetTrustLevel uintptr +} + +func (v *IInspectable) VTable() *IInspectableVtbl { + return (*IInspectableVtbl)(unsafe.Pointer(v.RawVTable)) +} diff --git a/vendor/github.com/go-ole/go-ole/iinspectable_func.go b/vendor/github.com/go-ole/go-ole/iinspectable_func.go new file mode 100644 index 0000000..348829b --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/iinspectable_func.go @@ -0,0 +1,15 @@ +// +build !windows + +package ole + +func (v *IInspectable) GetIids() ([]*GUID, error) { + return []*GUID{}, NewError(E_NOTIMPL) +} + +func (v *IInspectable) GetRuntimeClassName() (string, error) { + return "", NewError(E_NOTIMPL) +} + +func (v *IInspectable) GetTrustLevel() (uint32, error) { + return uint32(0), NewError(E_NOTIMPL) +} diff --git a/vendor/github.com/go-ole/go-ole/iinspectable_windows.go b/vendor/github.com/go-ole/go-ole/iinspectable_windows.go new file mode 100644 index 0000000..4519a4a --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/iinspectable_windows.go @@ -0,0 +1,72 @@ +// +build windows + +package ole + +import ( + "bytes" + "encoding/binary" + "reflect" + "syscall" + "unsafe" +) + +func (v *IInspectable) GetIids() (iids []*GUID, err error) { + var count uint32 + var array uintptr + hr, _, _ := syscall.Syscall( + v.VTable().GetIIds, + 3, + uintptr(unsafe.Pointer(v)), + uintptr(unsafe.Pointer(&count)), + uintptr(unsafe.Pointer(&array))) + if hr != 0 { + err = NewError(hr) + return + } + defer CoTaskMemFree(array) + + iids = make([]*GUID, count) + byteCount := count * uint32(unsafe.Sizeof(GUID{})) + slicehdr := reflect.SliceHeader{Data: array, Len: int(byteCount), Cap: int(byteCount)} + byteSlice := *(*[]byte)(unsafe.Pointer(&slicehdr)) + reader := bytes.NewReader(byteSlice) + for i := range iids { + guid := GUID{} + err = binary.Read(reader, binary.LittleEndian, &guid) + if err != nil { + return + } + iids[i] = &guid + } + return +} + +func (v *IInspectable) GetRuntimeClassName() (s string, err error) { + var hstring HString + hr, _, _ := syscall.Syscall( + v.VTable().GetRuntimeClassName, + 2, + uintptr(unsafe.Pointer(v)), + uintptr(unsafe.Pointer(&hstring)), + 0) + if hr != 0 { + err = NewError(hr) + return + } + s = hstring.String() + DeleteHString(hstring) + return +} + +func (v *IInspectable) GetTrustLevel() (level uint32, err error) { + hr, _, _ := syscall.Syscall( + v.VTable().GetTrustLevel, + 2, + uintptr(unsafe.Pointer(v)), + uintptr(unsafe.Pointer(&level)), + 0) + if hr != 0 { + err = NewError(hr) + } + return +} diff --git a/vendor/github.com/go-ole/go-ole/iprovideclassinfo.go b/vendor/github.com/go-ole/go-ole/iprovideclassinfo.go new file mode 100644 index 0000000..25f3a6f --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/iprovideclassinfo.go @@ -0,0 +1,21 @@ +package ole + +import "unsafe" + +type IProvideClassInfo struct { + IUnknown +} + +type IProvideClassInfoVtbl struct { + IUnknownVtbl + GetClassInfo uintptr +} + +func (v *IProvideClassInfo) VTable() *IProvideClassInfoVtbl { + return (*IProvideClassInfoVtbl)(unsafe.Pointer(v.RawVTable)) +} + +func (v *IProvideClassInfo) GetClassInfo() (cinfo *ITypeInfo, err error) { + cinfo, err = getClassInfo(v) + return +} diff --git a/vendor/github.com/go-ole/go-ole/iprovideclassinfo_func.go b/vendor/github.com/go-ole/go-ole/iprovideclassinfo_func.go new file mode 100644 index 0000000..7e3cb63 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/iprovideclassinfo_func.go @@ -0,0 +1,7 @@ +// +build !windows + +package ole + +func getClassInfo(disp *IProvideClassInfo) (tinfo *ITypeInfo, err error) { + return nil, NewError(E_NOTIMPL) +} diff --git a/vendor/github.com/go-ole/go-ole/iprovideclassinfo_windows.go b/vendor/github.com/go-ole/go-ole/iprovideclassinfo_windows.go new file mode 100644 index 0000000..2ad0163 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/iprovideclassinfo_windows.go @@ -0,0 +1,21 @@ +// +build windows + +package ole + +import ( + "syscall" + "unsafe" +) + +func getClassInfo(disp *IProvideClassInfo) (tinfo *ITypeInfo, err error) { + hr, _, _ := syscall.Syscall( + disp.VTable().GetClassInfo, + 2, + uintptr(unsafe.Pointer(disp)), + uintptr(unsafe.Pointer(&tinfo)), + 0) + if hr != 0 { + err = NewError(hr) + } + return +} diff --git a/vendor/github.com/go-ole/go-ole/itypeinfo.go b/vendor/github.com/go-ole/go-ole/itypeinfo.go new file mode 100644 index 0000000..dd3c5e2 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/itypeinfo.go @@ -0,0 +1,34 @@ +package ole + +import "unsafe" + +type ITypeInfo struct { + IUnknown +} + +type ITypeInfoVtbl struct { + IUnknownVtbl + GetTypeAttr uintptr + GetTypeComp uintptr + GetFuncDesc uintptr + GetVarDesc uintptr + GetNames uintptr + GetRefTypeOfImplType uintptr + GetImplTypeFlags uintptr + GetIDsOfNames uintptr + Invoke uintptr + GetDocumentation uintptr + GetDllEntry uintptr + GetRefTypeInfo uintptr + AddressOfMember uintptr + CreateInstance uintptr + GetMops uintptr + GetContainingTypeLib uintptr + ReleaseTypeAttr uintptr + ReleaseFuncDesc uintptr + ReleaseVarDesc uintptr +} + +func (v *ITypeInfo) VTable() *ITypeInfoVtbl { + return (*ITypeInfoVtbl)(unsafe.Pointer(v.RawVTable)) +} diff --git a/vendor/github.com/go-ole/go-ole/itypeinfo_func.go b/vendor/github.com/go-ole/go-ole/itypeinfo_func.go new file mode 100644 index 0000000..8364a65 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/itypeinfo_func.go @@ -0,0 +1,7 @@ +// +build !windows + +package ole + +func (v *ITypeInfo) GetTypeAttr() (*TYPEATTR, error) { + return nil, NewError(E_NOTIMPL) +} diff --git a/vendor/github.com/go-ole/go-ole/itypeinfo_windows.go b/vendor/github.com/go-ole/go-ole/itypeinfo_windows.go new file mode 100644 index 0000000..54782b3 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/itypeinfo_windows.go @@ -0,0 +1,21 @@ +// +build windows + +package ole + +import ( + "syscall" + "unsafe" +) + +func (v *ITypeInfo) GetTypeAttr() (tattr *TYPEATTR, err error) { + hr, _, _ := syscall.Syscall( + uintptr(v.VTable().GetTypeAttr), + 2, + uintptr(unsafe.Pointer(v)), + uintptr(unsafe.Pointer(&tattr)), + 0) + if hr != 0 { + err = NewError(hr) + } + return +} diff --git a/vendor/github.com/go-ole/go-ole/iunknown.go b/vendor/github.com/go-ole/go-ole/iunknown.go new file mode 100644 index 0000000..108f28e --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/iunknown.go @@ -0,0 +1,57 @@ +package ole + +import "unsafe" + +type IUnknown struct { + RawVTable *interface{} +} + +type IUnknownVtbl struct { + QueryInterface uintptr + AddRef uintptr + Release uintptr +} + +type UnknownLike interface { + QueryInterface(iid *GUID) (disp *IDispatch, err error) + AddRef() int32 + Release() int32 +} + +func (v *IUnknown) VTable() *IUnknownVtbl { + return (*IUnknownVtbl)(unsafe.Pointer(v.RawVTable)) +} + +func (v *IUnknown) PutQueryInterface(interfaceID *GUID, obj interface{}) error { + return reflectQueryInterface(v, v.VTable().QueryInterface, interfaceID, obj) +} + +func (v *IUnknown) IDispatch(interfaceID *GUID) (dispatch *IDispatch, err error) { + err = v.PutQueryInterface(interfaceID, &dispatch) + return +} + +func (v *IUnknown) IEnumVARIANT(interfaceID *GUID) (enum *IEnumVARIANT, err error) { + err = v.PutQueryInterface(interfaceID, &enum) + return +} + +func (v *IUnknown) QueryInterface(iid *GUID) (*IDispatch, error) { + return queryInterface(v, iid) +} + +func (v *IUnknown) MustQueryInterface(iid *GUID) (disp *IDispatch) { + unk, err := queryInterface(v, iid) + if err != nil { + panic(err) + } + return unk +} + +func (v *IUnknown) AddRef() int32 { + return addRef(v) +} + +func (v *IUnknown) Release() int32 { + return release(v) +} diff --git a/vendor/github.com/go-ole/go-ole/iunknown_func.go b/vendor/github.com/go-ole/go-ole/iunknown_func.go new file mode 100644 index 0000000..d0a62cf --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/iunknown_func.go @@ -0,0 +1,19 @@ +// +build !windows + +package ole + +func reflectQueryInterface(self interface{}, method uintptr, interfaceID *GUID, obj interface{}) (err error) { + return NewError(E_NOTIMPL) +} + +func queryInterface(unk *IUnknown, iid *GUID) (disp *IDispatch, err error) { + return nil, NewError(E_NOTIMPL) +} + +func addRef(unk *IUnknown) int32 { + return 0 +} + +func release(unk *IUnknown) int32 { + return 0 +} diff --git a/vendor/github.com/go-ole/go-ole/iunknown_windows.go b/vendor/github.com/go-ole/go-ole/iunknown_windows.go new file mode 100644 index 0000000..ede5bb8 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/iunknown_windows.go @@ -0,0 +1,58 @@ +// +build windows + +package ole + +import ( + "reflect" + "syscall" + "unsafe" +) + +func reflectQueryInterface(self interface{}, method uintptr, interfaceID *GUID, obj interface{}) (err error) { + selfValue := reflect.ValueOf(self).Elem() + objValue := reflect.ValueOf(obj).Elem() + + hr, _, _ := syscall.Syscall( + method, + 3, + selfValue.UnsafeAddr(), + uintptr(unsafe.Pointer(interfaceID)), + objValue.Addr().Pointer()) + if hr != 0 { + err = NewError(hr) + } + return +} + +func queryInterface(unk *IUnknown, iid *GUID) (disp *IDispatch, err error) { + hr, _, _ := syscall.Syscall( + unk.VTable().QueryInterface, + 3, + uintptr(unsafe.Pointer(unk)), + uintptr(unsafe.Pointer(iid)), + uintptr(unsafe.Pointer(&disp))) + if hr != 0 { + err = NewError(hr) + } + return +} + +func addRef(unk *IUnknown) int32 { + ret, _, _ := syscall.Syscall( + unk.VTable().AddRef, + 1, + uintptr(unsafe.Pointer(unk)), + 0, + 0) + return int32(ret) +} + +func release(unk *IUnknown) int32 { + ret, _, _ := syscall.Syscall( + unk.VTable().Release, + 1, + uintptr(unsafe.Pointer(unk)), + 0, + 0) + return int32(ret) +} diff --git a/vendor/github.com/go-ole/go-ole/ole.go b/vendor/github.com/go-ole/go-ole/ole.go new file mode 100644 index 0000000..e2ae4f4 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/ole.go @@ -0,0 +1,157 @@ +package ole + +import ( + "fmt" + "strings" +) + +// DISPPARAMS are the arguments that passed to methods or property. +type DISPPARAMS struct { + rgvarg uintptr + rgdispidNamedArgs uintptr + cArgs uint32 + cNamedArgs uint32 +} + +// EXCEPINFO defines exception info. +type EXCEPINFO struct { + wCode uint16 + wReserved uint16 + bstrSource *uint16 + bstrDescription *uint16 + bstrHelpFile *uint16 + dwHelpContext uint32 + pvReserved uintptr + pfnDeferredFillIn uintptr + scode uint32 +} + +// WCode return wCode in EXCEPINFO. +func (e EXCEPINFO) WCode() uint16 { + return e.wCode +} + +// SCODE return scode in EXCEPINFO. +func (e EXCEPINFO) SCODE() uint32 { + return e.scode +} + +// String convert EXCEPINFO to string. +func (e EXCEPINFO) String() string { + var src, desc, hlp string + if e.bstrSource == nil { + src = "" + } else { + src = BstrToString(e.bstrSource) + } + + if e.bstrDescription == nil { + desc = "" + } else { + desc = BstrToString(e.bstrDescription) + } + + if e.bstrHelpFile == nil { + hlp = "" + } else { + hlp = BstrToString(e.bstrHelpFile) + } + + return fmt.Sprintf( + "wCode: %#x, bstrSource: %v, bstrDescription: %v, bstrHelpFile: %v, dwHelpContext: %#x, scode: %#x", + e.wCode, src, desc, hlp, e.dwHelpContext, e.scode, + ) +} + +// Error implements error interface and returns error string. +func (e EXCEPINFO) Error() string { + if e.bstrDescription != nil { + return strings.TrimSpace(BstrToString(e.bstrDescription)) + } + + src := "Unknown" + if e.bstrSource != nil { + src = BstrToString(e.bstrSource) + } + + code := e.scode + if e.wCode != 0 { + code = uint32(e.wCode) + } + + return fmt.Sprintf("%v: %#x", src, code) +} + +// PARAMDATA defines parameter data type. +type PARAMDATA struct { + Name *int16 + Vt uint16 +} + +// METHODDATA defines method info. +type METHODDATA struct { + Name *uint16 + Data *PARAMDATA + Dispid int32 + Meth uint32 + CC int32 + CArgs uint32 + Flags uint16 + VtReturn uint32 +} + +// INTERFACEDATA defines interface info. +type INTERFACEDATA struct { + MethodData *METHODDATA + CMembers uint32 +} + +// Point is 2D vector type. +type Point struct { + X int32 + Y int32 +} + +// Msg is message between processes. +type Msg struct { + Hwnd uint32 + Message uint32 + Wparam int32 + Lparam int32 + Time uint32 + Pt Point +} + +// TYPEDESC defines data type. +type TYPEDESC struct { + Hreftype uint32 + VT uint16 +} + +// IDLDESC defines IDL info. +type IDLDESC struct { + DwReserved uint32 + WIDLFlags uint16 +} + +// TYPEATTR defines type info. +type TYPEATTR struct { + Guid GUID + Lcid uint32 + dwReserved uint32 + MemidConstructor int32 + MemidDestructor int32 + LpstrSchema *uint16 + CbSizeInstance uint32 + Typekind int32 + CFuncs uint16 + CVars uint16 + CImplTypes uint16 + CbSizeVft uint16 + CbAlignment uint16 + WTypeFlags uint16 + WMajorVerNum uint16 + WMinorVerNum uint16 + TdescAlias TYPEDESC + IdldescType IDLDESC +} diff --git a/vendor/github.com/go-ole/go-ole/safearray.go b/vendor/github.com/go-ole/go-ole/safearray.go new file mode 100644 index 0000000..a5201b5 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/safearray.go @@ -0,0 +1,27 @@ +// Package is meant to retrieve and process safe array data returned from COM. + +package ole + +// SafeArrayBound defines the SafeArray boundaries. +type SafeArrayBound struct { + Elements uint32 + LowerBound int32 +} + +// SafeArray is how COM handles arrays. +type SafeArray struct { + Dimensions uint16 + FeaturesFlag uint16 + ElementsSize uint32 + LocksAmount uint32 + Data uint32 + Bounds [16]byte +} + +// SAFEARRAY is obsolete, exists for backwards compatibility. +// Use SafeArray +type SAFEARRAY SafeArray + +// SAFEARRAYBOUND is obsolete, exists for backwards compatibility. +// Use SafeArrayBound +type SAFEARRAYBOUND SafeArrayBound diff --git a/vendor/github.com/go-ole/go-ole/safearray_func.go b/vendor/github.com/go-ole/go-ole/safearray_func.go new file mode 100644 index 0000000..0dee670 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/safearray_func.go @@ -0,0 +1,211 @@ +// +build !windows + +package ole + +import ( + "unsafe" +) + +// safeArrayAccessData returns raw array pointer. +// +// AKA: SafeArrayAccessData in Windows API. +func safeArrayAccessData(safearray *SafeArray) (uintptr, error) { + return uintptr(0), NewError(E_NOTIMPL) +} + +// safeArrayUnaccessData releases raw array. +// +// AKA: SafeArrayUnaccessData in Windows API. +func safeArrayUnaccessData(safearray *SafeArray) error { + return NewError(E_NOTIMPL) +} + +// safeArrayAllocData allocates SafeArray. +// +// AKA: SafeArrayAllocData in Windows API. +func safeArrayAllocData(safearray *SafeArray) error { + return NewError(E_NOTIMPL) +} + +// safeArrayAllocDescriptor allocates SafeArray. +// +// AKA: SafeArrayAllocDescriptor in Windows API. +func safeArrayAllocDescriptor(dimensions uint32) (*SafeArray, error) { + return nil, NewError(E_NOTIMPL) +} + +// safeArrayAllocDescriptorEx allocates SafeArray. +// +// AKA: SafeArrayAllocDescriptorEx in Windows API. +func safeArrayAllocDescriptorEx(variantType VT, dimensions uint32) (*SafeArray, error) { + return nil, NewError(E_NOTIMPL) +} + +// safeArrayCopy returns copy of SafeArray. +// +// AKA: SafeArrayCopy in Windows API. +func safeArrayCopy(original *SafeArray) (*SafeArray, error) { + return nil, NewError(E_NOTIMPL) +} + +// safeArrayCopyData duplicates SafeArray into another SafeArray object. +// +// AKA: SafeArrayCopyData in Windows API. +func safeArrayCopyData(original *SafeArray, duplicate *SafeArray) error { + return NewError(E_NOTIMPL) +} + +// safeArrayCreate creates SafeArray. +// +// AKA: SafeArrayCreate in Windows API. +func safeArrayCreate(variantType VT, dimensions uint32, bounds *SafeArrayBound) (*SafeArray, error) { + return nil, NewError(E_NOTIMPL) +} + +// safeArrayCreateEx creates SafeArray. +// +// AKA: SafeArrayCreateEx in Windows API. +func safeArrayCreateEx(variantType VT, dimensions uint32, bounds *SafeArrayBound, extra uintptr) (*SafeArray, error) { + return nil, NewError(E_NOTIMPL) +} + +// safeArrayCreateVector creates SafeArray. +// +// AKA: SafeArrayCreateVector in Windows API. +func safeArrayCreateVector(variantType VT, lowerBound int32, length uint32) (*SafeArray, error) { + return nil, NewError(E_NOTIMPL) +} + +// safeArrayCreateVectorEx creates SafeArray. +// +// AKA: SafeArrayCreateVectorEx in Windows API. +func safeArrayCreateVectorEx(variantType VT, lowerBound int32, length uint32, extra uintptr) (*SafeArray, error) { + return nil, NewError(E_NOTIMPL) +} + +// safeArrayDestroy destroys SafeArray object. +// +// AKA: SafeArrayDestroy in Windows API. +func safeArrayDestroy(safearray *SafeArray) error { + return NewError(E_NOTIMPL) +} + +// safeArrayDestroyData destroys SafeArray object. +// +// AKA: SafeArrayDestroyData in Windows API. +func safeArrayDestroyData(safearray *SafeArray) error { + return NewError(E_NOTIMPL) +} + +// safeArrayDestroyDescriptor destroys SafeArray object. +// +// AKA: SafeArrayDestroyDescriptor in Windows API. +func safeArrayDestroyDescriptor(safearray *SafeArray) error { + return NewError(E_NOTIMPL) +} + +// safeArrayGetDim is the amount of dimensions in the SafeArray. +// +// SafeArrays may have multiple dimensions. Meaning, it could be +// multidimensional array. +// +// AKA: SafeArrayGetDim in Windows API. +func safeArrayGetDim(safearray *SafeArray) (*uint32, error) { + u := uint32(0) + return &u, NewError(E_NOTIMPL) +} + +// safeArrayGetElementSize is the element size in bytes. +// +// AKA: SafeArrayGetElemsize in Windows API. +func safeArrayGetElementSize(safearray *SafeArray) (*uint32, error) { + u := uint32(0) + return &u, NewError(E_NOTIMPL) +} + +// safeArrayGetElement retrieves element at given index. +func safeArrayGetElement(safearray *SafeArray, index int32, pv unsafe.Pointer) error { + return NewError(E_NOTIMPL) +} + +// safeArrayGetElement retrieves element at given index and converts to string. +func safeArrayGetElementString(safearray *SafeArray, index int32) (string, error) { + return "", NewError(E_NOTIMPL) +} + +// safeArrayGetIID is the InterfaceID of the elements in the SafeArray. +// +// AKA: SafeArrayGetIID in Windows API. +func safeArrayGetIID(safearray *SafeArray) (*GUID, error) { + return nil, NewError(E_NOTIMPL) +} + +// safeArrayGetLBound returns lower bounds of SafeArray. +// +// SafeArrays may have multiple dimensions. Meaning, it could be +// multidimensional array. +// +// AKA: SafeArrayGetLBound in Windows API. +func safeArrayGetLBound(safearray *SafeArray, dimension uint32) (int32, error) { + return int32(0), NewError(E_NOTIMPL) +} + +// safeArrayGetUBound returns upper bounds of SafeArray. +// +// SafeArrays may have multiple dimensions. Meaning, it could be +// multidimensional array. +// +// AKA: SafeArrayGetUBound in Windows API. +func safeArrayGetUBound(safearray *SafeArray, dimension uint32) (int32, error) { + return int32(0), NewError(E_NOTIMPL) +} + +// safeArrayGetVartype returns data type of SafeArray. +// +// AKA: SafeArrayGetVartype in Windows API. +func safeArrayGetVartype(safearray *SafeArray) (uint16, error) { + return uint16(0), NewError(E_NOTIMPL) +} + +// safeArrayLock locks SafeArray for reading to modify SafeArray. +// +// This must be called during some calls to ensure that another process does not +// read or write to the SafeArray during editing. +// +// AKA: SafeArrayLock in Windows API. +func safeArrayLock(safearray *SafeArray) error { + return NewError(E_NOTIMPL) +} + +// safeArrayUnlock unlocks SafeArray for reading. +// +// AKA: SafeArrayUnlock in Windows API. +func safeArrayUnlock(safearray *SafeArray) error { + return NewError(E_NOTIMPL) +} + +// safeArrayPutElement stores the data element at the specified location in the +// array. +// +// AKA: SafeArrayPutElement in Windows API. +func safeArrayPutElement(safearray *SafeArray, index int64, element uintptr) error { + return NewError(E_NOTIMPL) +} + +// safeArrayGetRecordInfo accesses IRecordInfo info for custom types. +// +// AKA: SafeArrayGetRecordInfo in Windows API. +// +// XXX: Must implement IRecordInfo interface for this to return. +func safeArrayGetRecordInfo(safearray *SafeArray) (interface{}, error) { + return nil, NewError(E_NOTIMPL) +} + +// safeArraySetRecordInfo mutates IRecordInfo info for custom types. +// +// AKA: SafeArraySetRecordInfo in Windows API. +// +// XXX: Must implement IRecordInfo interface for this to return. +func safeArraySetRecordInfo(safearray *SafeArray, recordInfo interface{}) error { + return NewError(E_NOTIMPL) +} diff --git a/vendor/github.com/go-ole/go-ole/safearray_windows.go b/vendor/github.com/go-ole/go-ole/safearray_windows.go new file mode 100644 index 0000000..0c1b3a1 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/safearray_windows.go @@ -0,0 +1,337 @@ +// +build windows + +package ole + +import ( + "unsafe" +) + +var ( + procSafeArrayAccessData = modoleaut32.NewProc("SafeArrayAccessData") + procSafeArrayAllocData = modoleaut32.NewProc("SafeArrayAllocData") + procSafeArrayAllocDescriptor = modoleaut32.NewProc("SafeArrayAllocDescriptor") + procSafeArrayAllocDescriptorEx = modoleaut32.NewProc("SafeArrayAllocDescriptorEx") + procSafeArrayCopy = modoleaut32.NewProc("SafeArrayCopy") + procSafeArrayCopyData = modoleaut32.NewProc("SafeArrayCopyData") + procSafeArrayCreate = modoleaut32.NewProc("SafeArrayCreate") + procSafeArrayCreateEx = modoleaut32.NewProc("SafeArrayCreateEx") + procSafeArrayCreateVector = modoleaut32.NewProc("SafeArrayCreateVector") + procSafeArrayCreateVectorEx = modoleaut32.NewProc("SafeArrayCreateVectorEx") + procSafeArrayDestroy = modoleaut32.NewProc("SafeArrayDestroy") + procSafeArrayDestroyData = modoleaut32.NewProc("SafeArrayDestroyData") + procSafeArrayDestroyDescriptor = modoleaut32.NewProc("SafeArrayDestroyDescriptor") + procSafeArrayGetDim = modoleaut32.NewProc("SafeArrayGetDim") + procSafeArrayGetElement = modoleaut32.NewProc("SafeArrayGetElement") + procSafeArrayGetElemsize = modoleaut32.NewProc("SafeArrayGetElemsize") + procSafeArrayGetIID = modoleaut32.NewProc("SafeArrayGetIID") + procSafeArrayGetLBound = modoleaut32.NewProc("SafeArrayGetLBound") + procSafeArrayGetUBound = modoleaut32.NewProc("SafeArrayGetUBound") + procSafeArrayGetVartype = modoleaut32.NewProc("SafeArrayGetVartype") + procSafeArrayLock = modoleaut32.NewProc("SafeArrayLock") + procSafeArrayPtrOfIndex = modoleaut32.NewProc("SafeArrayPtrOfIndex") + procSafeArrayUnaccessData = modoleaut32.NewProc("SafeArrayUnaccessData") + procSafeArrayUnlock = modoleaut32.NewProc("SafeArrayUnlock") + procSafeArrayPutElement = modoleaut32.NewProc("SafeArrayPutElement") + //procSafeArrayRedim = modoleaut32.NewProc("SafeArrayRedim") // TODO + //procSafeArraySetIID = modoleaut32.NewProc("SafeArraySetIID") // TODO + procSafeArrayGetRecordInfo = modoleaut32.NewProc("SafeArrayGetRecordInfo") + procSafeArraySetRecordInfo = modoleaut32.NewProc("SafeArraySetRecordInfo") +) + +// safeArrayAccessData returns raw array pointer. +// +// AKA: SafeArrayAccessData in Windows API. +// Todo: Test +func safeArrayAccessData(safearray *SafeArray) (element uintptr, err error) { + err = convertHresultToError( + procSafeArrayAccessData.Call( + uintptr(unsafe.Pointer(safearray)), + uintptr(unsafe.Pointer(&element)))) + return +} + +// safeArrayUnaccessData releases raw array. +// +// AKA: SafeArrayUnaccessData in Windows API. +func safeArrayUnaccessData(safearray *SafeArray) (err error) { + err = convertHresultToError(procSafeArrayUnaccessData.Call(uintptr(unsafe.Pointer(safearray)))) + return +} + +// safeArrayAllocData allocates SafeArray. +// +// AKA: SafeArrayAllocData in Windows API. +func safeArrayAllocData(safearray *SafeArray) (err error) { + err = convertHresultToError(procSafeArrayAllocData.Call(uintptr(unsafe.Pointer(safearray)))) + return +} + +// safeArrayAllocDescriptor allocates SafeArray. +// +// AKA: SafeArrayAllocDescriptor in Windows API. +func safeArrayAllocDescriptor(dimensions uint32) (safearray *SafeArray, err error) { + err = convertHresultToError( + procSafeArrayAllocDescriptor.Call(uintptr(dimensions), uintptr(unsafe.Pointer(&safearray)))) + return +} + +// safeArrayAllocDescriptorEx allocates SafeArray. +// +// AKA: SafeArrayAllocDescriptorEx in Windows API. +func safeArrayAllocDescriptorEx(variantType VT, dimensions uint32) (safearray *SafeArray, err error) { + err = convertHresultToError( + procSafeArrayAllocDescriptorEx.Call( + uintptr(variantType), + uintptr(dimensions), + uintptr(unsafe.Pointer(&safearray)))) + return +} + +// safeArrayCopy returns copy of SafeArray. +// +// AKA: SafeArrayCopy in Windows API. +func safeArrayCopy(original *SafeArray) (safearray *SafeArray, err error) { + err = convertHresultToError( + procSafeArrayCopy.Call( + uintptr(unsafe.Pointer(original)), + uintptr(unsafe.Pointer(&safearray)))) + return +} + +// safeArrayCopyData duplicates SafeArray into another SafeArray object. +// +// AKA: SafeArrayCopyData in Windows API. +func safeArrayCopyData(original *SafeArray, duplicate *SafeArray) (err error) { + err = convertHresultToError( + procSafeArrayCopyData.Call( + uintptr(unsafe.Pointer(original)), + uintptr(unsafe.Pointer(duplicate)))) + return +} + +// safeArrayCreate creates SafeArray. +// +// AKA: SafeArrayCreate in Windows API. +func safeArrayCreate(variantType VT, dimensions uint32, bounds *SafeArrayBound) (safearray *SafeArray, err error) { + sa, _, err := procSafeArrayCreate.Call( + uintptr(variantType), + uintptr(dimensions), + uintptr(unsafe.Pointer(bounds))) + safearray = (*SafeArray)(unsafe.Pointer(&sa)) + return +} + +// safeArrayCreateEx creates SafeArray. +// +// AKA: SafeArrayCreateEx in Windows API. +func safeArrayCreateEx(variantType VT, dimensions uint32, bounds *SafeArrayBound, extra uintptr) (safearray *SafeArray, err error) { + sa, _, err := procSafeArrayCreateEx.Call( + uintptr(variantType), + uintptr(dimensions), + uintptr(unsafe.Pointer(bounds)), + extra) + safearray = (*SafeArray)(unsafe.Pointer(sa)) + return +} + +// safeArrayCreateVector creates SafeArray. +// +// AKA: SafeArrayCreateVector in Windows API. +func safeArrayCreateVector(variantType VT, lowerBound int32, length uint32) (safearray *SafeArray, err error) { + sa, _, err := procSafeArrayCreateVector.Call( + uintptr(variantType), + uintptr(lowerBound), + uintptr(length)) + safearray = (*SafeArray)(unsafe.Pointer(sa)) + return +} + +// safeArrayCreateVectorEx creates SafeArray. +// +// AKA: SafeArrayCreateVectorEx in Windows API. +func safeArrayCreateVectorEx(variantType VT, lowerBound int32, length uint32, extra uintptr) (safearray *SafeArray, err error) { + sa, _, err := procSafeArrayCreateVectorEx.Call( + uintptr(variantType), + uintptr(lowerBound), + uintptr(length), + extra) + safearray = (*SafeArray)(unsafe.Pointer(sa)) + return +} + +// safeArrayDestroy destroys SafeArray object. +// +// AKA: SafeArrayDestroy in Windows API. +func safeArrayDestroy(safearray *SafeArray) (err error) { + err = convertHresultToError(procSafeArrayDestroy.Call(uintptr(unsafe.Pointer(safearray)))) + return +} + +// safeArrayDestroyData destroys SafeArray object. +// +// AKA: SafeArrayDestroyData in Windows API. +func safeArrayDestroyData(safearray *SafeArray) (err error) { + err = convertHresultToError(procSafeArrayDestroyData.Call(uintptr(unsafe.Pointer(safearray)))) + return +} + +// safeArrayDestroyDescriptor destroys SafeArray object. +// +// AKA: SafeArrayDestroyDescriptor in Windows API. +func safeArrayDestroyDescriptor(safearray *SafeArray) (err error) { + err = convertHresultToError(procSafeArrayDestroyDescriptor.Call(uintptr(unsafe.Pointer(safearray)))) + return +} + +// safeArrayGetDim is the amount of dimensions in the SafeArray. +// +// SafeArrays may have multiple dimensions. Meaning, it could be +// multidimensional array. +// +// AKA: SafeArrayGetDim in Windows API. +func safeArrayGetDim(safearray *SafeArray) (dimensions *uint32, err error) { + l, _, err := procSafeArrayGetDim.Call(uintptr(unsafe.Pointer(safearray))) + dimensions = (*uint32)(unsafe.Pointer(l)) + return +} + +// safeArrayGetElementSize is the element size in bytes. +// +// AKA: SafeArrayGetElemsize in Windows API. +func safeArrayGetElementSize(safearray *SafeArray) (length *uint32, err error) { + l, _, err := procSafeArrayGetElemsize.Call(uintptr(unsafe.Pointer(safearray))) + length = (*uint32)(unsafe.Pointer(l)) + return +} + +// safeArrayGetElement retrieves element at given index. +func safeArrayGetElement(safearray *SafeArray, index int32, pv unsafe.Pointer) error { + return convertHresultToError( + procSafeArrayGetElement.Call( + uintptr(unsafe.Pointer(safearray)), + uintptr(unsafe.Pointer(&index)), + uintptr(pv))) +} + +// safeArrayGetElementString retrieves element at given index and converts to string. +func safeArrayGetElementString(safearray *SafeArray, index int32) (str string, err error) { + var element *int16 + err = convertHresultToError( + procSafeArrayGetElement.Call( + uintptr(unsafe.Pointer(safearray)), + uintptr(unsafe.Pointer(&index)), + uintptr(unsafe.Pointer(&element)))) + str = BstrToString(*(**uint16)(unsafe.Pointer(&element))) + SysFreeString(element) + return +} + +// safeArrayGetIID is the InterfaceID of the elements in the SafeArray. +// +// AKA: SafeArrayGetIID in Windows API. +func safeArrayGetIID(safearray *SafeArray) (guid *GUID, err error) { + err = convertHresultToError( + procSafeArrayGetIID.Call( + uintptr(unsafe.Pointer(safearray)), + uintptr(unsafe.Pointer(&guid)))) + return +} + +// safeArrayGetLBound returns lower bounds of SafeArray. +// +// SafeArrays may have multiple dimensions. Meaning, it could be +// multidimensional array. +// +// AKA: SafeArrayGetLBound in Windows API. +func safeArrayGetLBound(safearray *SafeArray, dimension uint32) (lowerBound int32, err error) { + err = convertHresultToError( + procSafeArrayGetLBound.Call( + uintptr(unsafe.Pointer(safearray)), + uintptr(dimension), + uintptr(unsafe.Pointer(&lowerBound)))) + return +} + +// safeArrayGetUBound returns upper bounds of SafeArray. +// +// SafeArrays may have multiple dimensions. Meaning, it could be +// multidimensional array. +// +// AKA: SafeArrayGetUBound in Windows API. +func safeArrayGetUBound(safearray *SafeArray, dimension uint32) (upperBound int32, err error) { + err = convertHresultToError( + procSafeArrayGetUBound.Call( + uintptr(unsafe.Pointer(safearray)), + uintptr(dimension), + uintptr(unsafe.Pointer(&upperBound)))) + return +} + +// safeArrayGetVartype returns data type of SafeArray. +// +// AKA: SafeArrayGetVartype in Windows API. +func safeArrayGetVartype(safearray *SafeArray) (varType uint16, err error) { + err = convertHresultToError( + procSafeArrayGetVartype.Call( + uintptr(unsafe.Pointer(safearray)), + uintptr(unsafe.Pointer(&varType)))) + return +} + +// safeArrayLock locks SafeArray for reading to modify SafeArray. +// +// This must be called during some calls to ensure that another process does not +// read or write to the SafeArray during editing. +// +// AKA: SafeArrayLock in Windows API. +func safeArrayLock(safearray *SafeArray) (err error) { + err = convertHresultToError(procSafeArrayLock.Call(uintptr(unsafe.Pointer(safearray)))) + return +} + +// safeArrayUnlock unlocks SafeArray for reading. +// +// AKA: SafeArrayUnlock in Windows API. +func safeArrayUnlock(safearray *SafeArray) (err error) { + err = convertHresultToError(procSafeArrayUnlock.Call(uintptr(unsafe.Pointer(safearray)))) + return +} + +// safeArrayPutElement stores the data element at the specified location in the +// array. +// +// AKA: SafeArrayPutElement in Windows API. +func safeArrayPutElement(safearray *SafeArray, index int64, element uintptr) (err error) { + err = convertHresultToError( + procSafeArrayPutElement.Call( + uintptr(unsafe.Pointer(safearray)), + uintptr(unsafe.Pointer(&index)), + uintptr(unsafe.Pointer(element)))) + return +} + +// safeArrayGetRecordInfo accesses IRecordInfo info for custom types. +// +// AKA: SafeArrayGetRecordInfo in Windows API. +// +// XXX: Must implement IRecordInfo interface for this to return. +func safeArrayGetRecordInfo(safearray *SafeArray) (recordInfo interface{}, err error) { + err = convertHresultToError( + procSafeArrayGetRecordInfo.Call( + uintptr(unsafe.Pointer(safearray)), + uintptr(unsafe.Pointer(&recordInfo)))) + return +} + +// safeArraySetRecordInfo mutates IRecordInfo info for custom types. +// +// AKA: SafeArraySetRecordInfo in Windows API. +// +// XXX: Must implement IRecordInfo interface for this to return. +func safeArraySetRecordInfo(safearray *SafeArray, recordInfo interface{}) (err error) { + err = convertHresultToError( + procSafeArraySetRecordInfo.Call( + uintptr(unsafe.Pointer(safearray)), + uintptr(unsafe.Pointer(&recordInfo)))) + return +} diff --git a/vendor/github.com/go-ole/go-ole/safearrayconversion.go b/vendor/github.com/go-ole/go-ole/safearrayconversion.go new file mode 100644 index 0000000..259f488 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/safearrayconversion.go @@ -0,0 +1,140 @@ +// Helper for converting SafeArray to array of objects. + +package ole + +import ( + "unsafe" +) + +type SafeArrayConversion struct { + Array *SafeArray +} + +func (sac *SafeArrayConversion) ToStringArray() (strings []string) { + totalElements, _ := sac.TotalElements(0) + strings = make([]string, totalElements) + + for i := int32(0); i < totalElements; i++ { + strings[int32(i)], _ = safeArrayGetElementString(sac.Array, i) + } + + return +} + +func (sac *SafeArrayConversion) ToByteArray() (bytes []byte) { + totalElements, _ := sac.TotalElements(0) + bytes = make([]byte, totalElements) + + for i := int32(0); i < totalElements; i++ { + safeArrayGetElement(sac.Array, i, unsafe.Pointer(&bytes[int32(i)])) + } + + return +} + +func (sac *SafeArrayConversion) ToValueArray() (values []interface{}) { + totalElements, _ := sac.TotalElements(0) + values = make([]interface{}, totalElements) + vt, _ := safeArrayGetVartype(sac.Array) + + for i := int32(0); i < totalElements; i++ { + switch VT(vt) { + case VT_BOOL: + var v bool + safeArrayGetElement(sac.Array, i, unsafe.Pointer(&v)) + values[i] = v + case VT_I1: + var v int8 + safeArrayGetElement(sac.Array, i, unsafe.Pointer(&v)) + values[i] = v + case VT_I2: + var v int16 + safeArrayGetElement(sac.Array, i, unsafe.Pointer(&v)) + values[i] = v + case VT_I4: + var v int32 + safeArrayGetElement(sac.Array, i, unsafe.Pointer(&v)) + values[i] = v + case VT_I8: + var v int64 + safeArrayGetElement(sac.Array, i, unsafe.Pointer(&v)) + values[i] = v + case VT_UI1: + var v uint8 + safeArrayGetElement(sac.Array, i, unsafe.Pointer(&v)) + values[i] = v + case VT_UI2: + var v uint16 + safeArrayGetElement(sac.Array, i, unsafe.Pointer(&v)) + values[i] = v + case VT_UI4: + var v uint32 + safeArrayGetElement(sac.Array, i, unsafe.Pointer(&v)) + values[i] = v + case VT_UI8: + var v uint64 + safeArrayGetElement(sac.Array, i, unsafe.Pointer(&v)) + values[i] = v + case VT_R4: + var v float32 + safeArrayGetElement(sac.Array, i, unsafe.Pointer(&v)) + values[i] = v + case VT_R8: + var v float64 + safeArrayGetElement(sac.Array, i, unsafe.Pointer(&v)) + values[i] = v + case VT_BSTR: + var v string + safeArrayGetElement(sac.Array, i, unsafe.Pointer(&v)) + values[i] = v + case VT_VARIANT: + var v VARIANT + safeArrayGetElement(sac.Array, i, unsafe.Pointer(&v)) + values[i] = v.Value() + default: + // TODO + } + } + + return +} + +func (sac *SafeArrayConversion) GetType() (varType uint16, err error) { + return safeArrayGetVartype(sac.Array) +} + +func (sac *SafeArrayConversion) GetDimensions() (dimensions *uint32, err error) { + return safeArrayGetDim(sac.Array) +} + +func (sac *SafeArrayConversion) GetSize() (length *uint32, err error) { + return safeArrayGetElementSize(sac.Array) +} + +func (sac *SafeArrayConversion) TotalElements(index uint32) (totalElements int32, err error) { + if index < 1 { + index = 1 + } + + // Get array bounds + var LowerBounds int32 + var UpperBounds int32 + + LowerBounds, err = safeArrayGetLBound(sac.Array, index) + if err != nil { + return + } + + UpperBounds, err = safeArrayGetUBound(sac.Array, index) + if err != nil { + return + } + + totalElements = UpperBounds - LowerBounds + 1 + return +} + +// Release Safe Array memory +func (sac *SafeArrayConversion) Release() { + safeArrayDestroy(sac.Array) +} diff --git a/vendor/github.com/go-ole/go-ole/safearrayslices.go b/vendor/github.com/go-ole/go-ole/safearrayslices.go new file mode 100644 index 0000000..a9fa885 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/safearrayslices.go @@ -0,0 +1,33 @@ +// +build windows + +package ole + +import ( + "unsafe" +) + +func safeArrayFromByteSlice(slice []byte) *SafeArray { + array, _ := safeArrayCreateVector(VT_UI1, 0, uint32(len(slice))) + + if array == nil { + panic("Could not convert []byte to SAFEARRAY") + } + + for i, v := range slice { + safeArrayPutElement(array, int64(i), uintptr(unsafe.Pointer(&v))) + } + return array +} + +func safeArrayFromStringSlice(slice []string) *SafeArray { + array, _ := safeArrayCreateVector(VT_BSTR, 0, uint32(len(slice))) + + if array == nil { + panic("Could not convert []string to SAFEARRAY") + } + // SysAllocStringLen(s) + for i, v := range slice { + safeArrayPutElement(array, int64(i), uintptr(unsafe.Pointer(SysAllocStringLen(v)))) + } + return array +} diff --git a/vendor/github.com/go-ole/go-ole/utility.go b/vendor/github.com/go-ole/go-ole/utility.go new file mode 100644 index 0000000..99ee82d --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/utility.go @@ -0,0 +1,101 @@ +package ole + +import ( + "unicode/utf16" + "unsafe" +) + +// ClassIDFrom retrieves class ID whether given is program ID or application string. +// +// Helper that provides check against both Class ID from Program ID and Class ID from string. It is +// faster, if you know which you are using, to use the individual functions, but this will check +// against available functions for you. +func ClassIDFrom(programID string) (classID *GUID, err error) { + classID, err = CLSIDFromProgID(programID) + if err != nil { + classID, err = CLSIDFromString(programID) + if err != nil { + return + } + } + return +} + +// BytePtrToString converts byte pointer to a Go string. +func BytePtrToString(p *byte) string { + a := (*[10000]uint8)(unsafe.Pointer(p)) + i := 0 + for a[i] != 0 { + i++ + } + return string(a[:i]) +} + +// UTF16PtrToString is alias for LpOleStrToString. +// +// Kept for compatibility reasons. +func UTF16PtrToString(p *uint16) string { + return LpOleStrToString(p) +} + +// LpOleStrToString converts COM Unicode to Go string. +func LpOleStrToString(p *uint16) string { + if p == nil { + return "" + } + + length := lpOleStrLen(p) + a := make([]uint16, length) + + ptr := unsafe.Pointer(p) + + for i := 0; i < int(length); i++ { + a[i] = *(*uint16)(ptr) + ptr = unsafe.Pointer(uintptr(ptr) + 2) + } + + return string(utf16.Decode(a)) +} + +// BstrToString converts COM binary string to Go string. +func BstrToString(p *uint16) string { + if p == nil { + return "" + } + length := SysStringLen((*int16)(unsafe.Pointer(p))) + a := make([]uint16, length) + + ptr := unsafe.Pointer(p) + + for i := 0; i < int(length); i++ { + a[i] = *(*uint16)(ptr) + ptr = unsafe.Pointer(uintptr(ptr) + 2) + } + return string(utf16.Decode(a)) +} + +// lpOleStrLen returns the length of Unicode string. +func lpOleStrLen(p *uint16) (length int64) { + if p == nil { + return 0 + } + + ptr := unsafe.Pointer(p) + + for i := 0; ; i++ { + if 0 == *(*uint16)(ptr) { + length = int64(i) + break + } + ptr = unsafe.Pointer(uintptr(ptr) + 2) + } + return +} + +// convertHresultToError converts syscall to error, if call is unsuccessful. +func convertHresultToError(hr uintptr, r2 uintptr, ignore error) (err error) { + if hr != 0 { + err = NewError(hr) + } + return +} diff --git a/vendor/github.com/go-ole/go-ole/variables.go b/vendor/github.com/go-ole/go-ole/variables.go new file mode 100644 index 0000000..a6add1b --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/variables.go @@ -0,0 +1,15 @@ +// +build windows + +package ole + +import ( + "golang.org/x/sys/windows" +) + +var ( + modcombase = windows.NewLazySystemDLL("combase.dll") + modkernel32 = windows.NewLazySystemDLL("kernel32.dll") + modole32 = windows.NewLazySystemDLL("ole32.dll") + modoleaut32 = windows.NewLazySystemDLL("oleaut32.dll") + moduser32 = windows.NewLazySystemDLL("user32.dll") +) diff --git a/vendor/github.com/go-ole/go-ole/variant.go b/vendor/github.com/go-ole/go-ole/variant.go new file mode 100644 index 0000000..967a23f --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/variant.go @@ -0,0 +1,105 @@ +package ole + +import "unsafe" + +// NewVariant returns new variant based on type and value. +func NewVariant(vt VT, val int64) VARIANT { + return VARIANT{VT: vt, Val: val} +} + +// ToIUnknown converts Variant to Unknown object. +func (v *VARIANT) ToIUnknown() *IUnknown { + if v.VT != VT_UNKNOWN { + return nil + } + return (*IUnknown)(unsafe.Pointer(uintptr(v.Val))) +} + +// ToIDispatch converts variant to dispatch object. +func (v *VARIANT) ToIDispatch() *IDispatch { + if v.VT != VT_DISPATCH { + return nil + } + return (*IDispatch)(unsafe.Pointer(uintptr(v.Val))) +} + +// ToArray converts variant to SafeArray helper. +func (v *VARIANT) ToArray() *SafeArrayConversion { + if v.VT != VT_SAFEARRAY { + if v.VT&VT_ARRAY == 0 { + return nil + } + } + var safeArray *SafeArray = (*SafeArray)(unsafe.Pointer(uintptr(v.Val))) + return &SafeArrayConversion{safeArray} +} + +// ToString converts variant to Go string. +func (v *VARIANT) ToString() string { + if v.VT != VT_BSTR { + return "" + } + return BstrToString(*(**uint16)(unsafe.Pointer(&v.Val))) +} + +// Clear the memory of variant object. +func (v *VARIANT) Clear() error { + return VariantClear(v) +} + +// Value returns variant value based on its type. +// +// Currently supported types: 2- and 4-byte integers, strings, bools. +// Note that 64-bit integers, datetimes, and other types are stored as strings +// and will be returned as strings. +// +// Needs to be further converted, because this returns an interface{}. +func (v *VARIANT) Value() interface{} { + switch v.VT { + case VT_I1: + return int8(v.Val) + case VT_UI1: + return uint8(v.Val) + case VT_I2: + return int16(v.Val) + case VT_UI2: + return uint16(v.Val) + case VT_I4: + return int32(v.Val) + case VT_UI4: + return uint32(v.Val) + case VT_I8: + return int64(v.Val) + case VT_UI8: + return uint64(v.Val) + case VT_INT: + return int(v.Val) + case VT_UINT: + return uint(v.Val) + case VT_INT_PTR: + return uintptr(v.Val) // TODO + case VT_UINT_PTR: + return uintptr(v.Val) + case VT_R4: + return *(*float32)(unsafe.Pointer(&v.Val)) + case VT_R8: + return *(*float64)(unsafe.Pointer(&v.Val)) + case VT_BSTR: + return v.ToString() + case VT_DATE: + // VT_DATE type will either return float64 or time.Time. + d := uint64(v.Val) + date, err := GetVariantDate(d) + if err != nil { + return float64(v.Val) + } + return date + case VT_UNKNOWN: + return v.ToIUnknown() + case VT_DISPATCH: + return v.ToIDispatch() + case VT_BOOL: + return v.Val != 0 + } + return nil +} diff --git a/vendor/github.com/go-ole/go-ole/variant_386.go b/vendor/github.com/go-ole/go-ole/variant_386.go new file mode 100644 index 0000000..e73736b --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/variant_386.go @@ -0,0 +1,11 @@ +// +build 386 + +package ole + +type VARIANT struct { + VT VT // 2 + wReserved1 uint16 // 4 + wReserved2 uint16 // 6 + wReserved3 uint16 // 8 + Val int64 // 16 +} diff --git a/vendor/github.com/go-ole/go-ole/variant_amd64.go b/vendor/github.com/go-ole/go-ole/variant_amd64.go new file mode 100644 index 0000000..dccdde1 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/variant_amd64.go @@ -0,0 +1,12 @@ +// +build amd64 + +package ole + +type VARIANT struct { + VT VT // 2 + wReserved1 uint16 // 4 + wReserved2 uint16 // 6 + wReserved3 uint16 // 8 + Val int64 // 16 + _ [8]byte // 24 +} diff --git a/vendor/github.com/go-ole/go-ole/variant_date_386.go b/vendor/github.com/go-ole/go-ole/variant_date_386.go new file mode 100644 index 0000000..1b970f6 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/variant_date_386.go @@ -0,0 +1,22 @@ +// +build windows,386 + +package ole + +import ( + "errors" + "syscall" + "time" + "unsafe" +) + +// GetVariantDate converts COM Variant Time value to Go time.Time. +func GetVariantDate(value uint64) (time.Time, error) { + var st syscall.Systemtime + v1 := uint32(value) + v2 := uint32(value >> 32) + r, _, _ := procVariantTimeToSystemTime.Call(uintptr(v1), uintptr(v2), uintptr(unsafe.Pointer(&st))) + if r != 0 { + return time.Date(int(st.Year), time.Month(st.Month), int(st.Day), int(st.Hour), int(st.Minute), int(st.Second), int(st.Milliseconds/1000), time.UTC), nil + } + return time.Now(), errors.New("Could not convert to time, passing current time.") +} diff --git a/vendor/github.com/go-ole/go-ole/variant_date_amd64.go b/vendor/github.com/go-ole/go-ole/variant_date_amd64.go new file mode 100644 index 0000000..6952f1f --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/variant_date_amd64.go @@ -0,0 +1,20 @@ +// +build windows,amd64 + +package ole + +import ( + "errors" + "syscall" + "time" + "unsafe" +) + +// GetVariantDate converts COM Variant Time value to Go time.Time. +func GetVariantDate(value uint64) (time.Time, error) { + var st syscall.Systemtime + r, _, _ := procVariantTimeToSystemTime.Call(uintptr(value), uintptr(unsafe.Pointer(&st))) + if r != 0 { + return time.Date(int(st.Year), time.Month(st.Month), int(st.Day), int(st.Hour), int(st.Minute), int(st.Second), int(st.Milliseconds/1000), time.UTC), nil + } + return time.Now(), errors.New("Could not convert to time, passing current time.") +} diff --git a/vendor/github.com/go-ole/go-ole/variant_ppc64le.go b/vendor/github.com/go-ole/go-ole/variant_ppc64le.go new file mode 100644 index 0000000..326427a --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/variant_ppc64le.go @@ -0,0 +1,12 @@ +// +build ppc64le + +package ole + +type VARIANT struct { + VT VT // 2 + wReserved1 uint16 // 4 + wReserved2 uint16 // 6 + wReserved3 uint16 // 8 + Val int64 // 16 + _ [8]byte // 24 +} diff --git a/vendor/github.com/go-ole/go-ole/variant_s390x.go b/vendor/github.com/go-ole/go-ole/variant_s390x.go new file mode 100644 index 0000000..9874ca6 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/variant_s390x.go @@ -0,0 +1,12 @@ +// +build s390x + +package ole + +type VARIANT struct { + VT VT // 2 + wReserved1 uint16 // 4 + wReserved2 uint16 // 6 + wReserved3 uint16 // 8 + Val int64 // 16 + _ [8]byte // 24 +} diff --git a/vendor/github.com/go-ole/go-ole/vt_string.go b/vendor/github.com/go-ole/go-ole/vt_string.go new file mode 100644 index 0000000..729b4a0 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/vt_string.go @@ -0,0 +1,58 @@ +// generated by stringer -output vt_string.go -type VT; DO NOT EDIT + +package ole + +import "fmt" + +const ( + _VT_name_0 = "VT_EMPTYVT_NULLVT_I2VT_I4VT_R4VT_R8VT_CYVT_DATEVT_BSTRVT_DISPATCHVT_ERRORVT_BOOLVT_VARIANTVT_UNKNOWNVT_DECIMAL" + _VT_name_1 = "VT_I1VT_UI1VT_UI2VT_UI4VT_I8VT_UI8VT_INTVT_UINTVT_VOIDVT_HRESULTVT_PTRVT_SAFEARRAYVT_CARRAYVT_USERDEFINEDVT_LPSTRVT_LPWSTR" + _VT_name_2 = "VT_RECORDVT_INT_PTRVT_UINT_PTR" + _VT_name_3 = "VT_FILETIMEVT_BLOBVT_STREAMVT_STORAGEVT_STREAMED_OBJECTVT_STORED_OBJECTVT_BLOB_OBJECTVT_CFVT_CLSID" + _VT_name_4 = "VT_BSTR_BLOBVT_VECTOR" + _VT_name_5 = "VT_ARRAY" + _VT_name_6 = "VT_BYREF" + _VT_name_7 = "VT_RESERVED" + _VT_name_8 = "VT_ILLEGAL" +) + +var ( + _VT_index_0 = [...]uint8{0, 8, 15, 20, 25, 30, 35, 40, 47, 54, 65, 73, 80, 90, 100, 110} + _VT_index_1 = [...]uint8{0, 5, 11, 17, 23, 28, 34, 40, 47, 54, 64, 70, 82, 91, 105, 113, 122} + _VT_index_2 = [...]uint8{0, 9, 19, 30} + _VT_index_3 = [...]uint8{0, 11, 18, 27, 37, 55, 71, 85, 90, 98} + _VT_index_4 = [...]uint8{0, 12, 21} + _VT_index_5 = [...]uint8{0, 8} + _VT_index_6 = [...]uint8{0, 8} + _VT_index_7 = [...]uint8{0, 11} + _VT_index_8 = [...]uint8{0, 10} +) + +func (i VT) String() string { + switch { + case 0 <= i && i <= 14: + return _VT_name_0[_VT_index_0[i]:_VT_index_0[i+1]] + case 16 <= i && i <= 31: + i -= 16 + return _VT_name_1[_VT_index_1[i]:_VT_index_1[i+1]] + case 36 <= i && i <= 38: + i -= 36 + return _VT_name_2[_VT_index_2[i]:_VT_index_2[i+1]] + case 64 <= i && i <= 72: + i -= 64 + return _VT_name_3[_VT_index_3[i]:_VT_index_3[i+1]] + case 4095 <= i && i <= 4096: + i -= 4095 + return _VT_name_4[_VT_index_4[i]:_VT_index_4[i+1]] + case i == 8192: + return _VT_name_5 + case i == 16384: + return _VT_name_6 + case i == 32768: + return _VT_name_7 + case i == 65535: + return _VT_name_8 + default: + return fmt.Sprintf("VT(%d)", i) + } +} diff --git a/vendor/github.com/go-ole/go-ole/winrt.go b/vendor/github.com/go-ole/go-ole/winrt.go new file mode 100644 index 0000000..4e9eca7 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/winrt.go @@ -0,0 +1,99 @@ +// +build windows + +package ole + +import ( + "reflect" + "syscall" + "unicode/utf8" + "unsafe" +) + +var ( + procRoInitialize = modcombase.NewProc("RoInitialize") + procRoActivateInstance = modcombase.NewProc("RoActivateInstance") + procRoGetActivationFactory = modcombase.NewProc("RoGetActivationFactory") + procWindowsCreateString = modcombase.NewProc("WindowsCreateString") + procWindowsDeleteString = modcombase.NewProc("WindowsDeleteString") + procWindowsGetStringRawBuffer = modcombase.NewProc("WindowsGetStringRawBuffer") +) + +func RoInitialize(thread_type uint32) (err error) { + hr, _, _ := procRoInitialize.Call(uintptr(thread_type)) + if hr != 0 { + err = NewError(hr) + } + return +} + +func RoActivateInstance(clsid string) (ins *IInspectable, err error) { + hClsid, err := NewHString(clsid) + if err != nil { + return nil, err + } + defer DeleteHString(hClsid) + + hr, _, _ := procRoActivateInstance.Call( + uintptr(unsafe.Pointer(hClsid)), + uintptr(unsafe.Pointer(&ins))) + if hr != 0 { + err = NewError(hr) + } + return +} + +func RoGetActivationFactory(clsid string, iid *GUID) (ins *IInspectable, err error) { + hClsid, err := NewHString(clsid) + if err != nil { + return nil, err + } + defer DeleteHString(hClsid) + + hr, _, _ := procRoGetActivationFactory.Call( + uintptr(unsafe.Pointer(hClsid)), + uintptr(unsafe.Pointer(iid)), + uintptr(unsafe.Pointer(&ins))) + if hr != 0 { + err = NewError(hr) + } + return +} + +// HString is handle string for pointers. +type HString uintptr + +// NewHString returns a new HString for Go string. +func NewHString(s string) (hstring HString, err error) { + u16 := syscall.StringToUTF16Ptr(s) + len := uint32(utf8.RuneCountInString(s)) + hr, _, _ := procWindowsCreateString.Call( + uintptr(unsafe.Pointer(u16)), + uintptr(len), + uintptr(unsafe.Pointer(&hstring))) + if hr != 0 { + err = NewError(hr) + } + return +} + +// DeleteHString deletes HString. +func DeleteHString(hstring HString) (err error) { + hr, _, _ := procWindowsDeleteString.Call(uintptr(hstring)) + if hr != 0 { + err = NewError(hr) + } + return +} + +// String returns Go string value of HString. +func (h HString) String() string { + var u16buf uintptr + var u16len uint32 + u16buf, _, _ = procWindowsGetStringRawBuffer.Call( + uintptr(h), + uintptr(unsafe.Pointer(&u16len))) + + u16hdr := reflect.SliceHeader{Data: u16buf, Len: int(u16len), Cap: int(u16len)} + u16 := *(*[]uint16)(unsafe.Pointer(&u16hdr)) + return syscall.UTF16ToString(u16) +} diff --git a/vendor/github.com/go-ole/go-ole/winrt_doc.go b/vendor/github.com/go-ole/go-ole/winrt_doc.go new file mode 100644 index 0000000..52e6d74 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/winrt_doc.go @@ -0,0 +1,36 @@ +// +build !windows + +package ole + +// RoInitialize +func RoInitialize(thread_type uint32) (err error) { + return NewError(E_NOTIMPL) +} + +// RoActivateInstance +func RoActivateInstance(clsid string) (ins *IInspectable, err error) { + return nil, NewError(E_NOTIMPL) +} + +// RoGetActivationFactory +func RoGetActivationFactory(clsid string, iid *GUID) (ins *IInspectable, err error) { + return nil, NewError(E_NOTIMPL) +} + +// HString is handle string for pointers. +type HString uintptr + +// NewHString returns a new HString for Go string. +func NewHString(s string) (hstring HString, err error) { + return HString(uintptr(0)), NewError(E_NOTIMPL) +} + +// DeleteHString deletes HString. +func DeleteHString(hstring HString) (err error) { + return NewError(E_NOTIMPL) +} + +// String returns Go string value of HString. +func (h HString) String() string { + return "" +} diff --git a/vendor/github.com/go-playground/colors/.travis.yml b/vendor/github.com/go-playground/colors/.travis.yml deleted file mode 100644 index 68398d9..0000000 --- a/vendor/github.com/go-playground/colors/.travis.yml +++ /dev/null @@ -1,13 +0,0 @@ -language: go - -notificaitons: - email: - recipients: bluesuncorp01@gmail.com - on_success: change - on_failure: always - -go: - - 1.2 - - 1.3 - - 1.4 - - tip \ No newline at end of file diff --git a/vendor/github.com/go-playground/colors/README.md b/vendor/github.com/go-playground/colors/README.md deleted file mode 100644 index 58a8733..0000000 --- a/vendor/github.com/go-playground/colors/README.md +++ /dev/null @@ -1,64 +0,0 @@ -Package colors -================ -[![Build Status](https://semaphoreci.com/api/v1/projects/be59797f-235e-411f-82be-4fab6e3172a6/550132/badge.svg)](https://semaphoreci.com/joeybloggs/colors) -[![GoDoc](https://godoc.org/gopkg.in/go-playground/colors.v1?status.svg)](https://godoc.org/gopkg.in/go-playground/colors.v1) - -Go color manipulation, conversion and printing library/utility - -this library is currently in development, not all color types such as HSL, HSV and CMYK will be included in the first release; pull requests are welcome. - -Installation -============ - -Use go get. - - go get gopkg.in/go-playground/colors.v1 - -or to update - - go get -u gopkg.in/go-playground/colors.v1 - -Then import the validator package into your own code. - - import "gopkg.in/go-playground/colors.v1" - -Usage and documentation -======================= - -Please see http://godoc.org/gopkg.in/go-playground/colors.v1 for detailed usage docs. - -#Example -```go -hex, err := colors.ParseHEX("#fff") -rgb, err := colors.ParseRGB("rgb(0,0,0)") -rgb, err := colors.RGB(0,0,0) -rgba, err := colors.ParseRGBA("rgba(0,0,0,1)") -rgba, err := colors.RGBA(0,0,0,1) - -// don't know which color, it was user selectable -color, err := colors.Parse("#000) - -color.ToRGB() // rgb(0,0,0) -color.ToRGBA() // rgba(0,0,0,1) -color.ToHEX() // #000000 -color.IsLight() // false -color.IsDark() // true - -``` - -How to Contribute -================= - -There will always be a development branch for each version i.e. `v1-development`. In order to contribute, -please make your pull requests against those branches. - -If the changes being proposed or requested are breaking changes, please create an issue, for discussion -or create a pull request against the highest development branch for example this package has a -v1 and v1-development branch however, there will also be a v2-development brach even though v2 doesn't exist yet. - -I am not a color expert by any means and am sure that there could be better or even more efficient -ways to accomplish the color conversion and so forth and I welcome any suggestions or pull request to help! - -License -======= -Distributed under MIT License, please see license file in code for more details. diff --git a/vendor/github.com/go-playground/colors/colors.go b/vendor/github.com/go-playground/colors/colors.go deleted file mode 100644 index e823578..0000000 --- a/vendor/github.com/go-playground/colors/colors.go +++ /dev/null @@ -1,41 +0,0 @@ -package colors - -import ( - "errors" - "strings" -) - -var ( - // ErrBadColor is the default bad color error - ErrBadColor = errors.New("Parsing of color failed, Bad Color") -) - -// Color is the base color interface from which all others ascribe to -type Color interface { - ToHEX() *HEXColor - ToRGB() *RGBColor - ToRGBA() *RGBAColor - String() string - IsLight() bool // http://stackoverflow.com/a/24213274/3158232 and http://www.nbdtech.com/Blog/archive/2008/04/27/Calculating-the-Perceived-Brightness-of-a-Color.aspx - IsDark() bool //for perceived luminance, not strict math -} - -// Parse parses an unknown color type to it's appropriate type, or returns a ErrBadColor -func Parse(s string) (Color, error) { - - if len(s) < 4 { - return nil, ErrBadColor - } - - s = strings.ToLower(s) - - if s[:1] == "#" { - return ParseHEX(s) - } else if s[:4] == "rgba" { - return ParseRGBA(s) - } else if s[:3] == "rgb" { - return ParseRGB(s) - } - - return nil, ErrBadColor -} diff --git a/vendor/github.com/go-playground/colors/hex.go b/vendor/github.com/go-playground/colors/hex.go deleted file mode 100644 index 75c822c..0000000 --- a/vendor/github.com/go-playground/colors/hex.go +++ /dev/null @@ -1,81 +0,0 @@ -package colors - -import ( - "fmt" - "regexp" - "strings" -) - -const ( - hexRegexString = "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$" - hexFormat = "#%02x%02x%02x" - hexShortFormat = "#%1x%1x%1x" - hexToRGBFactor = 17 -) - -var ( - hexRegex = regexp.MustCompile(hexRegexString) -) - -// HEXColor represents a HEX color -type HEXColor struct { - hex string -} - -// ParseHEX validates an parses the provided string into a HEXColor object -func ParseHEX(s string) (*HEXColor, error) { - - s = strings.ToLower(s) - - if !hexRegex.MatchString(s) { - return nil, ErrBadColor - } - - return &HEXColor{hex: s}, nil -} - -// String returns the string representation on the HEXColor -func (c *HEXColor) String() string { - return c.hex -} - -// ToHEX converts the HEXColor to a HEXColor -// it's here to satisfy the Color interface -func (c *HEXColor) ToHEX() *HEXColor { - return c -} - -// ToRGB converts the HEXColor to and RGBColor -func (c *HEXColor) ToRGB() *RGBColor { - - var r, g, b uint8 - - if len(c.hex) == 4 { - fmt.Sscanf(c.hex, hexShortFormat, &r, &g, &b) - r *= hexToRGBFactor - g *= hexToRGBFactor - b *= hexToRGBFactor - } else { - fmt.Sscanf(c.hex, hexFormat, &r, &g, &b) - } - - return &RGBColor{R: r, G: g, B: b} -} - -// ToRGBA converts the HEXColor to an RGBAColor -func (c *HEXColor) ToRGBA() *RGBAColor { - - rgb := c.ToRGB() - - return &RGBAColor{R: rgb.R, G: rgb.G, B: rgb.B, A: 1} -} - -// IsLight returns whether the color is perceived to be a light color -func (c *HEXColor) IsLight() bool { - return c.ToRGB().IsLight() -} - -// IsDark returns whether the color is perceived to be a dark color -func (c *HEXColor) IsDark() bool { - return !c.IsLight() -} diff --git a/vendor/github.com/go-playground/colors/rgb.go b/vendor/github.com/go-playground/colors/rgb.go deleted file mode 100644 index 3db4167..0000000 --- a/vendor/github.com/go-playground/colors/rgb.go +++ /dev/null @@ -1,103 +0,0 @@ -package colors - -import ( - "fmt" - "math" - "regexp" - "strconv" - "strings" -) - -const ( - rgbString = "rgb(%d,%d,%d)" - rgbCaptureRegexString = "^rgb\\(\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*\\)$" - rgbCaptureRegexPercentString = "^rgb\\(\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])%\\s*,\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])%\\s*,\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])%\\s*\\)$" -) - -var ( - rgbCaptureRegex = regexp.MustCompile(rgbCaptureRegexString) - rgbCapturePercentRegex = regexp.MustCompile(rgbCaptureRegexPercentString) -) - -// RGBColor represents an RGB color -type RGBColor struct { - R uint8 - G uint8 - B uint8 -} - -// ParseRGB validates an parses the provided string into an RGBColor object -// supports both RGB 255 and RGB as percentages -func ParseRGB(s string) (*RGBColor, error) { - - s = strings.ToLower(s) - - var isPercent bool - vals := rgbCaptureRegex.FindAllStringSubmatch(s, -1) - - if vals == nil || len(vals) == 0 || len(vals[0]) == 0 { - - vals = rgbCapturePercentRegex.FindAllStringSubmatch(s, -1) - - if vals == nil || len(vals) == 0 || len(vals[0]) == 0 { - return nil, ErrBadColor - } - - isPercent = true - } - - r, _ := strconv.ParseUint(vals[0][1], 10, 8) - g, _ := strconv.ParseUint(vals[0][2], 10, 8) - b, _ := strconv.ParseUint(vals[0][3], 10, 8) - - if isPercent { - r = uint64(math.Floor(float64(r)/100*255 + .5)) - g = uint64(math.Floor(float64(g)/100*255 + .5)) - b = uint64(math.Floor(float64(b)/100*255 + .5)) - } - - return &RGBColor{R: uint8(r), G: uint8(g), B: uint8(b)}, nil -} - -// RGB validates and returns a new RGBColor object from the provided r, g, b values -func RGB(r, g, b uint8) (*RGBColor, error) { - return &RGBColor{R: r, G: g, B: b}, nil -} - -// String returns the string representation on the RGBColor -func (c *RGBColor) String() string { - return fmt.Sprintf(rgbString, c.R, c.G, c.B) -} - -// ToHEX converts the RGBColor to a HEXColor -func (c *RGBColor) ToHEX() *HEXColor { - return &HEXColor{hex: fmt.Sprintf("#%02x%02x%02x", c.R, c.G, c.B)} -} - -// ToRGB converts the RGBColor to an RGBColor -// it's here to satisfy the Color interface -func (c *RGBColor) ToRGB() *RGBColor { - return c -} - -// ToRGBA converts the RGBColor to an RGBAColor -func (c *RGBColor) ToRGBA() *RGBAColor { - return &RGBAColor{R: c.R, G: c.G, B: c.B, A: 1} -} - -// IsLight returns whether the color is perceived to be a light color -func (c *RGBColor) IsLight() bool { - - r := float64(c.R) - g := float64(c.G) - b := float64(c.B) - - hsp := math.Sqrt(0.299*math.Pow(r, 2) + 0.587*math.Pow(g, 2) + 0.114*math.Pow(b, 2)) - - return hsp > 130 -} - -// IsDark returns whether the color is perceived to be a dark color -func (c *RGBColor) IsDark() bool { - return !c.IsLight() -} diff --git a/vendor/github.com/go-playground/colors/rgba.go b/vendor/github.com/go-playground/colors/rgba.go deleted file mode 100644 index b5ad3b6..0000000 --- a/vendor/github.com/go-playground/colors/rgba.go +++ /dev/null @@ -1,159 +0,0 @@ -package colors - -import ( - "fmt" - "image/color" - "math" - "regexp" - "strconv" - "strings" -) - -const ( - rgbaString = "rgba(%d,%d,%d,%g)" - rgbaCaptureRegexString = "^rgba\\(\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*(0\\.[0-9]*|[01])\\s*\\)$" - rgbaCaptureRegexPercentString = "^rgba\\(\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])%\\s*,\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])%\\s*,\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])%\\s*,\\s*(0\\.[0-9]*|[01])\\s*\\)$" -) - -var ( - rgbaCaptureRegex = regexp.MustCompile(rgbaCaptureRegexString) - rgbaCapturePercentRegex = regexp.MustCompile(rgbaCaptureRegexPercentString) -) - -// RGBAColor represents an RGBA color -type RGBAColor struct { - R uint8 - G uint8 - B uint8 - A float64 -} - -// ParseRGBA validates an parses the provided string into an RGBAColor object -// supports both RGBA 255 and RGBA as percentages -func ParseRGBA(s string) (*RGBAColor, error) { - - s = strings.ToLower(s) - - var isPercent bool - - vals := rgbaCaptureRegex.FindAllStringSubmatch(s, -1) - - if vals == nil || len(vals) == 0 || len(vals[0]) == 0 { - - vals = rgbaCapturePercentRegex.FindAllStringSubmatch(s, -1) - - if vals == nil || len(vals) == 0 || len(vals[0]) == 0 { - return nil, ErrBadColor - } - - isPercent = true - } - - r, _ := strconv.ParseUint(vals[0][1], 10, 8) - g, _ := strconv.ParseUint(vals[0][2], 10, 8) - b, _ := strconv.ParseUint(vals[0][3], 10, 8) - a, _ := strconv.ParseFloat(vals[0][4], 64) - - if isPercent { - r = uint64(math.Floor(float64(r)/100*255 + .5)) - g = uint64(math.Floor(float64(g)/100*255 + .5)) - b = uint64(math.Floor(float64(b)/100*255 + .5)) - } - - return &RGBAColor{R: uint8(r), G: uint8(g), B: uint8(b), A: a}, nil -} - -// RGBA validates and returns a new RGBAColor object from the provided r, g, b, a values -func RGBA(r, g, b uint8, a float64) (*RGBAColor, error) { - - if a < 0 || a > 1 { - return nil, ErrBadColor - } - - return &RGBAColor{R: r, G: g, B: b, A: a}, nil -} - -func FromStdColor(c color.Color) *RGBAColor { - r, g, b, a := c.RGBA() - return &RGBAColor{ - R: uint8(r >> 8), - G: uint8(g >> 8), - B: uint8(b >> 8), - A: float64(a>>8) / 0xff, - } -} - -// String returns the string representation on the RGBAColor -func (c *RGBAColor) String() string { - return fmt.Sprintf(rgbaString, c.R, c.G, c.B, c.A) -} - -// ToHEX converts the RGBAColor to a HEXColor -func (c *RGBAColor) ToHEX() *HEXColor { - return &HEXColor{hex: fmt.Sprintf("#%02x%02x%02x", c.R, c.G, c.B)} -} - -// ToRGB converts the RGBAColor to an RGBColor -func (c *RGBAColor) ToRGB() *RGBColor { - return &RGBColor{R: c.R, G: c.G, B: c.B} -} - -// ToRGBA converts the RGBAColor to an RGBAColor -// it's here to satisfy the Color interface -func (c *RGBAColor) ToRGBA() *RGBAColor { - return c -} - -// IsLight returns whether the color is perceived to be a light color -// NOTE: this is determined only by the RGB values, if you need to take -// the alpha into account see the IsLightAlpha function -func (c *RGBAColor) IsLight() bool { - return c.ToRGB().IsLight() -} - -// IsDark returns whether the color is perceived to be a dark color -// NOTE: this is determined only by the RGB values, if you need to take -// the alpha into account see the IsLightAlpha function -func (c *RGBAColor) IsDark() bool { - return !c.IsLight() -} - -// IsLightAlpha returns whether the color is perceived to be a light color -// based on RGBA values and the provided background color -// algorithm based of of post here: http://stackoverflow.com/a/12228643/3158232 -func (c *RGBAColor) IsLightAlpha(bg Color) bool { - - // if alpha is 1 then RGB3 == RGB1 - if c.A == 1 { - return c.IsLight() - } - - // if alpha is 0 then RGB3 == RGB2 - if c.A == 0 { - return bg.IsLight() - } - - rgb2 := bg.ToRGB() - - r1 := float64(c.R) - g1 := float64(c.G) - b1 := float64(c.B) - r2 := float64(rgb2.R) - g2 := float64(rgb2.G) - b2 := float64(rgb2.B) - - r3 := r2 + (r1-r2)*c.A - g3 := g2 + (g1-g2)*c.A - b3 := b2 + (b1-b2)*c.A - - rgb, _ := RGB(uint8(r3), uint8(g3), uint8(b3)) - - return rgb.IsLight() -} - -// IsDarkAlpha returns whether the color is perceived to be a dark color -// based on RGBA values and the provided background color -// algorithm based of of post here: http://stackoverflow.com/a/12228643/3158232 -func (c *RGBAColor) IsDarkAlpha(bg Color) bool { - return !c.IsLightAlpha(bg) -} diff --git a/vendor/github.com/google/uuid/.travis.yml b/vendor/github.com/google/uuid/.travis.yml new file mode 100644 index 0000000..d8156a6 --- /dev/null +++ b/vendor/github.com/google/uuid/.travis.yml @@ -0,0 +1,9 @@ +language: go + +go: + - 1.4.3 + - 1.5.3 + - tip + +script: + - go test -v ./... diff --git a/vendor/github.com/google/uuid/CONTRIBUTING.md b/vendor/github.com/google/uuid/CONTRIBUTING.md new file mode 100644 index 0000000..04fdf09 --- /dev/null +++ b/vendor/github.com/google/uuid/CONTRIBUTING.md @@ -0,0 +1,10 @@ +# How to contribute + +We definitely welcome patches and contribution to this project! + +### Legal requirements + +In order to protect both you and ourselves, you will need to sign the +[Contributor License Agreement](https://cla.developers.google.com/clas). + +You may have already signed it for other Google projects. diff --git a/vendor/github.com/google/uuid/CONTRIBUTORS b/vendor/github.com/google/uuid/CONTRIBUTORS new file mode 100644 index 0000000..b4bb97f --- /dev/null +++ b/vendor/github.com/google/uuid/CONTRIBUTORS @@ -0,0 +1,9 @@ +Paul Borman +bmatsuo +shawnps +theory +jboverfelt +dsymonds +cd1 +wallclockbuilder +dansouza diff --git a/vendor/golang.org/x/image/LICENSE b/vendor/github.com/google/uuid/LICENSE similarity index 96% rename from vendor/golang.org/x/image/LICENSE rename to vendor/github.com/google/uuid/LICENSE index 6a66aea..5dc6826 100644 --- a/vendor/golang.org/x/image/LICENSE +++ b/vendor/github.com/google/uuid/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2009 The Go Authors. All rights reserved. +Copyright (c) 2009,2014 Google Inc. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are diff --git a/vendor/github.com/google/uuid/README.md b/vendor/github.com/google/uuid/README.md new file mode 100644 index 0000000..f765a46 --- /dev/null +++ b/vendor/github.com/google/uuid/README.md @@ -0,0 +1,19 @@ +# uuid ![build status](https://travis-ci.org/google/uuid.svg?branch=master) +The uuid package generates and inspects UUIDs based on +[RFC 4122](http://tools.ietf.org/html/rfc4122) +and DCE 1.1: Authentication and Security Services. + +This package is based on the github.com/pborman/uuid package (previously named +code.google.com/p/go-uuid). It differs from these earlier packages in that +a UUID is a 16 byte array rather than a byte slice. One loss due to this +change is the ability to represent an invalid UUID (vs a NIL UUID). + +###### Install +`go get github.com/google/uuid` + +###### Documentation +[![GoDoc](https://godoc.org/github.com/google/uuid?status.svg)](http://godoc.org/github.com/google/uuid) + +Full `go doc` style documentation for the package can be viewed online without +installing this package by using the GoDoc site here: +http://pkg.go.dev/github.com/google/uuid diff --git a/vendor/github.com/google/uuid/dce.go b/vendor/github.com/google/uuid/dce.go new file mode 100644 index 0000000..fa820b9 --- /dev/null +++ b/vendor/github.com/google/uuid/dce.go @@ -0,0 +1,80 @@ +// Copyright 2016 Google Inc. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package uuid + +import ( + "encoding/binary" + "fmt" + "os" +) + +// A Domain represents a Version 2 domain +type Domain byte + +// Domain constants for DCE Security (Version 2) UUIDs. +const ( + Person = Domain(0) + Group = Domain(1) + Org = Domain(2) +) + +// NewDCESecurity returns a DCE Security (Version 2) UUID. +// +// The domain should be one of Person, Group or Org. +// On a POSIX system the id should be the users UID for the Person +// domain and the users GID for the Group. The meaning of id for +// the domain Org or on non-POSIX systems is site defined. +// +// For a given domain/id pair the same token may be returned for up to +// 7 minutes and 10 seconds. +func NewDCESecurity(domain Domain, id uint32) (UUID, error) { + uuid, err := NewUUID() + if err == nil { + uuid[6] = (uuid[6] & 0x0f) | 0x20 // Version 2 + uuid[9] = byte(domain) + binary.BigEndian.PutUint32(uuid[0:], id) + } + return uuid, err +} + +// NewDCEPerson returns a DCE Security (Version 2) UUID in the person +// domain with the id returned by os.Getuid. +// +// NewDCESecurity(Person, uint32(os.Getuid())) +func NewDCEPerson() (UUID, error) { + return NewDCESecurity(Person, uint32(os.Getuid())) +} + +// NewDCEGroup returns a DCE Security (Version 2) UUID in the group +// domain with the id returned by os.Getgid. +// +// NewDCESecurity(Group, uint32(os.Getgid())) +func NewDCEGroup() (UUID, error) { + return NewDCESecurity(Group, uint32(os.Getgid())) +} + +// Domain returns the domain for a Version 2 UUID. Domains are only defined +// for Version 2 UUIDs. +func (uuid UUID) Domain() Domain { + return Domain(uuid[9]) +} + +// ID returns the id for a Version 2 UUID. IDs are only defined for Version 2 +// UUIDs. +func (uuid UUID) ID() uint32 { + return binary.BigEndian.Uint32(uuid[0:4]) +} + +func (d Domain) String() string { + switch d { + case Person: + return "Person" + case Group: + return "Group" + case Org: + return "Org" + } + return fmt.Sprintf("Domain%d", int(d)) +} diff --git a/vendor/github.com/google/uuid/doc.go b/vendor/github.com/google/uuid/doc.go new file mode 100644 index 0000000..5b8a4b9 --- /dev/null +++ b/vendor/github.com/google/uuid/doc.go @@ -0,0 +1,12 @@ +// Copyright 2016 Google Inc. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package uuid generates and inspects UUIDs. +// +// UUIDs are based on RFC 4122 and DCE 1.1: Authentication and Security +// Services. +// +// A UUID is a 16 byte (128 bit) array. UUIDs may be used as keys to +// maps or compared directly. +package uuid diff --git a/vendor/github.com/google/uuid/go.mod b/vendor/github.com/google/uuid/go.mod new file mode 100644 index 0000000..fc84cd7 --- /dev/null +++ b/vendor/github.com/google/uuid/go.mod @@ -0,0 +1 @@ +module github.com/google/uuid diff --git a/vendor/github.com/google/uuid/hash.go b/vendor/github.com/google/uuid/hash.go new file mode 100644 index 0000000..b404f4b --- /dev/null +++ b/vendor/github.com/google/uuid/hash.go @@ -0,0 +1,53 @@ +// Copyright 2016 Google Inc. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package uuid + +import ( + "crypto/md5" + "crypto/sha1" + "hash" +) + +// Well known namespace IDs and UUIDs +var ( + NameSpaceDNS = Must(Parse("6ba7b810-9dad-11d1-80b4-00c04fd430c8")) + NameSpaceURL = Must(Parse("6ba7b811-9dad-11d1-80b4-00c04fd430c8")) + NameSpaceOID = Must(Parse("6ba7b812-9dad-11d1-80b4-00c04fd430c8")) + NameSpaceX500 = Must(Parse("6ba7b814-9dad-11d1-80b4-00c04fd430c8")) + Nil UUID // empty UUID, all zeros +) + +// NewHash returns a new UUID derived from the hash of space concatenated with +// data generated by h. The hash should be at least 16 byte in length. The +// first 16 bytes of the hash are used to form the UUID. The version of the +// UUID will be the lower 4 bits of version. NewHash is used to implement +// NewMD5 and NewSHA1. +func NewHash(h hash.Hash, space UUID, data []byte, version int) UUID { + h.Reset() + h.Write(space[:]) //nolint:errcheck + h.Write(data) //nolint:errcheck + s := h.Sum(nil) + var uuid UUID + copy(uuid[:], s) + uuid[6] = (uuid[6] & 0x0f) | uint8((version&0xf)<<4) + uuid[8] = (uuid[8] & 0x3f) | 0x80 // RFC 4122 variant + return uuid +} + +// NewMD5 returns a new MD5 (Version 3) UUID based on the +// supplied name space and data. It is the same as calling: +// +// NewHash(md5.New(), space, data, 3) +func NewMD5(space UUID, data []byte) UUID { + return NewHash(md5.New(), space, data, 3) +} + +// NewSHA1 returns a new SHA1 (Version 5) UUID based on the +// supplied name space and data. It is the same as calling: +// +// NewHash(sha1.New(), space, data, 5) +func NewSHA1(space UUID, data []byte) UUID { + return NewHash(sha1.New(), space, data, 5) +} diff --git a/vendor/github.com/google/uuid/marshal.go b/vendor/github.com/google/uuid/marshal.go new file mode 100644 index 0000000..14bd340 --- /dev/null +++ b/vendor/github.com/google/uuid/marshal.go @@ -0,0 +1,38 @@ +// Copyright 2016 Google Inc. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package uuid + +import "fmt" + +// MarshalText implements encoding.TextMarshaler. +func (uuid UUID) MarshalText() ([]byte, error) { + var js [36]byte + encodeHex(js[:], uuid) + return js[:], nil +} + +// UnmarshalText implements encoding.TextUnmarshaler. +func (uuid *UUID) UnmarshalText(data []byte) error { + id, err := ParseBytes(data) + if err != nil { + return err + } + *uuid = id + return nil +} + +// MarshalBinary implements encoding.BinaryMarshaler. +func (uuid UUID) MarshalBinary() ([]byte, error) { + return uuid[:], nil +} + +// UnmarshalBinary implements encoding.BinaryUnmarshaler. +func (uuid *UUID) UnmarshalBinary(data []byte) error { + if len(data) != 16 { + return fmt.Errorf("invalid UUID (got %d bytes)", len(data)) + } + copy(uuid[:], data) + return nil +} diff --git a/vendor/github.com/google/uuid/node.go b/vendor/github.com/google/uuid/node.go new file mode 100644 index 0000000..d651a2b --- /dev/null +++ b/vendor/github.com/google/uuid/node.go @@ -0,0 +1,90 @@ +// Copyright 2016 Google Inc. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package uuid + +import ( + "sync" +) + +var ( + nodeMu sync.Mutex + ifname string // name of interface being used + nodeID [6]byte // hardware for version 1 UUIDs + zeroID [6]byte // nodeID with only 0's +) + +// NodeInterface returns the name of the interface from which the NodeID was +// derived. The interface "user" is returned if the NodeID was set by +// SetNodeID. +func NodeInterface() string { + defer nodeMu.Unlock() + nodeMu.Lock() + return ifname +} + +// SetNodeInterface selects the hardware address to be used for Version 1 UUIDs. +// If name is "" then the first usable interface found will be used or a random +// Node ID will be generated. If a named interface cannot be found then false +// is returned. +// +// SetNodeInterface never fails when name is "". +func SetNodeInterface(name string) bool { + defer nodeMu.Unlock() + nodeMu.Lock() + return setNodeInterface(name) +} + +func setNodeInterface(name string) bool { + iname, addr := getHardwareInterface(name) // null implementation for js + if iname != "" && addr != nil { + ifname = iname + copy(nodeID[:], addr) + return true + } + + // We found no interfaces with a valid hardware address. If name + // does not specify a specific interface generate a random Node ID + // (section 4.1.6) + if name == "" { + ifname = "random" + randomBits(nodeID[:]) + return true + } + return false +} + +// NodeID returns a slice of a copy of the current Node ID, setting the Node ID +// if not already set. +func NodeID() []byte { + defer nodeMu.Unlock() + nodeMu.Lock() + if nodeID == zeroID { + setNodeInterface("") + } + nid := nodeID + return nid[:] +} + +// SetNodeID sets the Node ID to be used for Version 1 UUIDs. The first 6 bytes +// of id are used. If id is less than 6 bytes then false is returned and the +// Node ID is not set. +func SetNodeID(id []byte) bool { + if len(id) < 6 { + return false + } + defer nodeMu.Unlock() + nodeMu.Lock() + copy(nodeID[:], id) + ifname = "user" + return true +} + +// NodeID returns the 6 byte node id encoded in uuid. It returns nil if uuid is +// not valid. The NodeID is only well defined for version 1 and 2 UUIDs. +func (uuid UUID) NodeID() []byte { + var node [6]byte + copy(node[:], uuid[10:]) + return node[:] +} diff --git a/vendor/github.com/google/uuid/node_js.go b/vendor/github.com/google/uuid/node_js.go new file mode 100644 index 0000000..24b78ed --- /dev/null +++ b/vendor/github.com/google/uuid/node_js.go @@ -0,0 +1,12 @@ +// Copyright 2017 Google Inc. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build js + +package uuid + +// getHardwareInterface returns nil values for the JS version of the code. +// This remvoves the "net" dependency, because it is not used in the browser. +// Using the "net" library inflates the size of the transpiled JS code by 673k bytes. +func getHardwareInterface(name string) (string, []byte) { return "", nil } diff --git a/vendor/github.com/google/uuid/node_net.go b/vendor/github.com/google/uuid/node_net.go new file mode 100644 index 0000000..0cbbcdd --- /dev/null +++ b/vendor/github.com/google/uuid/node_net.go @@ -0,0 +1,33 @@ +// Copyright 2017 Google Inc. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !js + +package uuid + +import "net" + +var interfaces []net.Interface // cached list of interfaces + +// getHardwareInterface returns the name and hardware address of interface name. +// If name is "" then the name and hardware address of one of the system's +// interfaces is returned. If no interfaces are found (name does not exist or +// there are no interfaces) then "", nil is returned. +// +// Only addresses of at least 6 bytes are returned. +func getHardwareInterface(name string) (string, []byte) { + if interfaces == nil { + var err error + interfaces, err = net.Interfaces() + if err != nil { + return "", nil + } + } + for _, ifs := range interfaces { + if len(ifs.HardwareAddr) >= 6 && (name == "" || name == ifs.Name) { + return ifs.Name, ifs.HardwareAddr + } + } + return "", nil +} diff --git a/vendor/github.com/google/uuid/null.go b/vendor/github.com/google/uuid/null.go new file mode 100644 index 0000000..d7fcbf2 --- /dev/null +++ b/vendor/github.com/google/uuid/null.go @@ -0,0 +1,118 @@ +// Copyright 2021 Google Inc. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package uuid + +import ( + "bytes" + "database/sql/driver" + "encoding/json" + "fmt" +) + +var jsonNull = []byte("null") + +// NullUUID represents a UUID that may be null. +// NullUUID implements the SQL driver.Scanner interface so +// it can be used as a scan destination: +// +// var u uuid.NullUUID +// err := db.QueryRow("SELECT name FROM foo WHERE id=?", id).Scan(&u) +// ... +// if u.Valid { +// // use u.UUID +// } else { +// // NULL value +// } +// +type NullUUID struct { + UUID UUID + Valid bool // Valid is true if UUID is not NULL +} + +// Scan implements the SQL driver.Scanner interface. +func (nu *NullUUID) Scan(value interface{}) error { + if value == nil { + nu.UUID, nu.Valid = Nil, false + return nil + } + + err := nu.UUID.Scan(value) + if err != nil { + nu.Valid = false + return err + } + + nu.Valid = true + return nil +} + +// Value implements the driver Valuer interface. +func (nu NullUUID) Value() (driver.Value, error) { + if !nu.Valid { + return nil, nil + } + // Delegate to UUID Value function + return nu.UUID.Value() +} + +// MarshalBinary implements encoding.BinaryMarshaler. +func (nu NullUUID) MarshalBinary() ([]byte, error) { + if nu.Valid { + return nu.UUID[:], nil + } + + return []byte(nil), nil +} + +// UnmarshalBinary implements encoding.BinaryUnmarshaler. +func (nu *NullUUID) UnmarshalBinary(data []byte) error { + if len(data) != 16 { + return fmt.Errorf("invalid UUID (got %d bytes)", len(data)) + } + copy(nu.UUID[:], data) + nu.Valid = true + return nil +} + +// MarshalText implements encoding.TextMarshaler. +func (nu NullUUID) MarshalText() ([]byte, error) { + if nu.Valid { + return nu.UUID.MarshalText() + } + + return jsonNull, nil +} + +// UnmarshalText implements encoding.TextUnmarshaler. +func (nu *NullUUID) UnmarshalText(data []byte) error { + id, err := ParseBytes(data) + if err != nil { + nu.Valid = false + return err + } + nu.UUID = id + nu.Valid = true + return nil +} + +// MarshalJSON implements json.Marshaler. +func (nu NullUUID) MarshalJSON() ([]byte, error) { + if nu.Valid { + return json.Marshal(nu.UUID) + } + + return jsonNull, nil +} + +// UnmarshalJSON implements json.Unmarshaler. +func (nu *NullUUID) UnmarshalJSON(data []byte) error { + if bytes.Equal(data, jsonNull) { + *nu = NullUUID{} + return nil // valid null UUID + } + err := json.Unmarshal(data, &nu.UUID) + nu.Valid = err == nil + return err +} diff --git a/vendor/github.com/google/uuid/sql.go b/vendor/github.com/google/uuid/sql.go new file mode 100644 index 0000000..2e02ec0 --- /dev/null +++ b/vendor/github.com/google/uuid/sql.go @@ -0,0 +1,59 @@ +// Copyright 2016 Google Inc. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package uuid + +import ( + "database/sql/driver" + "fmt" +) + +// Scan implements sql.Scanner so UUIDs can be read from databases transparently. +// Currently, database types that map to string and []byte are supported. Please +// consult database-specific driver documentation for matching types. +func (uuid *UUID) Scan(src interface{}) error { + switch src := src.(type) { + case nil: + return nil + + case string: + // if an empty UUID comes from a table, we return a null UUID + if src == "" { + return nil + } + + // see Parse for required string format + u, err := Parse(src) + if err != nil { + return fmt.Errorf("Scan: %v", err) + } + + *uuid = u + + case []byte: + // if an empty UUID comes from a table, we return a null UUID + if len(src) == 0 { + return nil + } + + // assumes a simple slice of bytes if 16 bytes + // otherwise attempts to parse + if len(src) != 16 { + return uuid.Scan(string(src)) + } + copy((*uuid)[:], src) + + default: + return fmt.Errorf("Scan: unable to scan type %T into UUID", src) + } + + return nil +} + +// Value implements sql.Valuer so that UUIDs can be written to databases +// transparently. Currently, UUIDs map to strings. Please consult +// database-specific driver documentation for matching types. +func (uuid UUID) Value() (driver.Value, error) { + return uuid.String(), nil +} diff --git a/vendor/github.com/google/uuid/time.go b/vendor/github.com/google/uuid/time.go new file mode 100644 index 0000000..e6ef06c --- /dev/null +++ b/vendor/github.com/google/uuid/time.go @@ -0,0 +1,123 @@ +// Copyright 2016 Google Inc. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package uuid + +import ( + "encoding/binary" + "sync" + "time" +) + +// A Time represents a time as the number of 100's of nanoseconds since 15 Oct +// 1582. +type Time int64 + +const ( + lillian = 2299160 // Julian day of 15 Oct 1582 + unix = 2440587 // Julian day of 1 Jan 1970 + epoch = unix - lillian // Days between epochs + g1582 = epoch * 86400 // seconds between epochs + g1582ns100 = g1582 * 10000000 // 100s of a nanoseconds between epochs +) + +var ( + timeMu sync.Mutex + lasttime uint64 // last time we returned + clockSeq uint16 // clock sequence for this run + + timeNow = time.Now // for testing +) + +// UnixTime converts t the number of seconds and nanoseconds using the Unix +// epoch of 1 Jan 1970. +func (t Time) UnixTime() (sec, nsec int64) { + sec = int64(t - g1582ns100) + nsec = (sec % 10000000) * 100 + sec /= 10000000 + return sec, nsec +} + +// GetTime returns the current Time (100s of nanoseconds since 15 Oct 1582) and +// clock sequence as well as adjusting the clock sequence as needed. An error +// is returned if the current time cannot be determined. +func GetTime() (Time, uint16, error) { + defer timeMu.Unlock() + timeMu.Lock() + return getTime() +} + +func getTime() (Time, uint16, error) { + t := timeNow() + + // If we don't have a clock sequence already, set one. + if clockSeq == 0 { + setClockSequence(-1) + } + now := uint64(t.UnixNano()/100) + g1582ns100 + + // If time has gone backwards with this clock sequence then we + // increment the clock sequence + if now <= lasttime { + clockSeq = ((clockSeq + 1) & 0x3fff) | 0x8000 + } + lasttime = now + return Time(now), clockSeq, nil +} + +// ClockSequence returns the current clock sequence, generating one if not +// already set. The clock sequence is only used for Version 1 UUIDs. +// +// The uuid package does not use global static storage for the clock sequence or +// the last time a UUID was generated. Unless SetClockSequence is used, a new +// random clock sequence is generated the first time a clock sequence is +// requested by ClockSequence, GetTime, or NewUUID. (section 4.2.1.1) +func ClockSequence() int { + defer timeMu.Unlock() + timeMu.Lock() + return clockSequence() +} + +func clockSequence() int { + if clockSeq == 0 { + setClockSequence(-1) + } + return int(clockSeq & 0x3fff) +} + +// SetClockSequence sets the clock sequence to the lower 14 bits of seq. Setting to +// -1 causes a new sequence to be generated. +func SetClockSequence(seq int) { + defer timeMu.Unlock() + timeMu.Lock() + setClockSequence(seq) +} + +func setClockSequence(seq int) { + if seq == -1 { + var b [2]byte + randomBits(b[:]) // clock sequence + seq = int(b[0])<<8 | int(b[1]) + } + oldSeq := clockSeq + clockSeq = uint16(seq&0x3fff) | 0x8000 // Set our variant + if oldSeq != clockSeq { + lasttime = 0 + } +} + +// Time returns the time in 100s of nanoseconds since 15 Oct 1582 encoded in +// uuid. The time is only defined for version 1 and 2 UUIDs. +func (uuid UUID) Time() Time { + time := int64(binary.BigEndian.Uint32(uuid[0:4])) + time |= int64(binary.BigEndian.Uint16(uuid[4:6])) << 32 + time |= int64(binary.BigEndian.Uint16(uuid[6:8])&0xfff) << 48 + return Time(time) +} + +// ClockSequence returns the clock sequence encoded in uuid. +// The clock sequence is only well defined for version 1 and 2 UUIDs. +func (uuid UUID) ClockSequence() int { + return int(binary.BigEndian.Uint16(uuid[8:10])) & 0x3fff +} diff --git a/vendor/github.com/google/uuid/util.go b/vendor/github.com/google/uuid/util.go new file mode 100644 index 0000000..5ea6c73 --- /dev/null +++ b/vendor/github.com/google/uuid/util.go @@ -0,0 +1,43 @@ +// Copyright 2016 Google Inc. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package uuid + +import ( + "io" +) + +// randomBits completely fills slice b with random data. +func randomBits(b []byte) { + if _, err := io.ReadFull(rander, b); err != nil { + panic(err.Error()) // rand should never fail + } +} + +// xvalues returns the value of a byte as a hexadecimal digit or 255. +var xvalues = [256]byte{ + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 255, 255, 255, 255, 255, 255, + 255, 10, 11, 12, 13, 14, 15, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 10, 11, 12, 13, 14, 15, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, +} + +// xtob converts hex characters x1 and x2 into a byte. +func xtob(x1, x2 byte) (byte, bool) { + b1 := xvalues[x1] + b2 := xvalues[x2] + return (b1 << 4) | b2, b1 != 255 && b2 != 255 +} diff --git a/vendor/github.com/google/uuid/uuid.go b/vendor/github.com/google/uuid/uuid.go new file mode 100644 index 0000000..a57207a --- /dev/null +++ b/vendor/github.com/google/uuid/uuid.go @@ -0,0 +1,294 @@ +// Copyright 2018 Google Inc. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package uuid + +import ( + "bytes" + "crypto/rand" + "encoding/hex" + "errors" + "fmt" + "io" + "strings" + "sync" +) + +// A UUID is a 128 bit (16 byte) Universal Unique IDentifier as defined in RFC +// 4122. +type UUID [16]byte + +// A Version represents a UUID's version. +type Version byte + +// A Variant represents a UUID's variant. +type Variant byte + +// Constants returned by Variant. +const ( + Invalid = Variant(iota) // Invalid UUID + RFC4122 // The variant specified in RFC4122 + Reserved // Reserved, NCS backward compatibility. + Microsoft // Reserved, Microsoft Corporation backward compatibility. + Future // Reserved for future definition. +) + +const randPoolSize = 16 * 16 + +var ( + rander = rand.Reader // random function + poolEnabled = false + poolMu sync.Mutex + poolPos = randPoolSize // protected with poolMu + pool [randPoolSize]byte // protected with poolMu +) + +type invalidLengthError struct{ len int } + +func (err invalidLengthError) Error() string { + return fmt.Sprintf("invalid UUID length: %d", err.len) +} + +// IsInvalidLengthError is matcher function for custom error invalidLengthError +func IsInvalidLengthError(err error) bool { + _, ok := err.(invalidLengthError) + return ok +} + +// Parse decodes s into a UUID or returns an error. Both the standard UUID +// forms of xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx and +// urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx are decoded as well as the +// Microsoft encoding {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} and the raw hex +// encoding: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx. +func Parse(s string) (UUID, error) { + var uuid UUID + switch len(s) { + // xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx + case 36: + + // urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx + case 36 + 9: + if strings.ToLower(s[:9]) != "urn:uuid:" { + return uuid, fmt.Errorf("invalid urn prefix: %q", s[:9]) + } + s = s[9:] + + // {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} + case 36 + 2: + s = s[1:] + + // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + case 32: + var ok bool + for i := range uuid { + uuid[i], ok = xtob(s[i*2], s[i*2+1]) + if !ok { + return uuid, errors.New("invalid UUID format") + } + } + return uuid, nil + default: + return uuid, invalidLengthError{len(s)} + } + // s is now at least 36 bytes long + // it must be of the form xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx + if s[8] != '-' || s[13] != '-' || s[18] != '-' || s[23] != '-' { + return uuid, errors.New("invalid UUID format") + } + for i, x := range [16]int{ + 0, 2, 4, 6, + 9, 11, + 14, 16, + 19, 21, + 24, 26, 28, 30, 32, 34} { + v, ok := xtob(s[x], s[x+1]) + if !ok { + return uuid, errors.New("invalid UUID format") + } + uuid[i] = v + } + return uuid, nil +} + +// ParseBytes is like Parse, except it parses a byte slice instead of a string. +func ParseBytes(b []byte) (UUID, error) { + var uuid UUID + switch len(b) { + case 36: // xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx + case 36 + 9: // urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx + if !bytes.Equal(bytes.ToLower(b[:9]), []byte("urn:uuid:")) { + return uuid, fmt.Errorf("invalid urn prefix: %q", b[:9]) + } + b = b[9:] + case 36 + 2: // {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} + b = b[1:] + case 32: // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + var ok bool + for i := 0; i < 32; i += 2 { + uuid[i/2], ok = xtob(b[i], b[i+1]) + if !ok { + return uuid, errors.New("invalid UUID format") + } + } + return uuid, nil + default: + return uuid, invalidLengthError{len(b)} + } + // s is now at least 36 bytes long + // it must be of the form xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx + if b[8] != '-' || b[13] != '-' || b[18] != '-' || b[23] != '-' { + return uuid, errors.New("invalid UUID format") + } + for i, x := range [16]int{ + 0, 2, 4, 6, + 9, 11, + 14, 16, + 19, 21, + 24, 26, 28, 30, 32, 34} { + v, ok := xtob(b[x], b[x+1]) + if !ok { + return uuid, errors.New("invalid UUID format") + } + uuid[i] = v + } + return uuid, nil +} + +// MustParse is like Parse but panics if the string cannot be parsed. +// It simplifies safe initialization of global variables holding compiled UUIDs. +func MustParse(s string) UUID { + uuid, err := Parse(s) + if err != nil { + panic(`uuid: Parse(` + s + `): ` + err.Error()) + } + return uuid +} + +// FromBytes creates a new UUID from a byte slice. Returns an error if the slice +// does not have a length of 16. The bytes are copied from the slice. +func FromBytes(b []byte) (uuid UUID, err error) { + err = uuid.UnmarshalBinary(b) + return uuid, err +} + +// Must returns uuid if err is nil and panics otherwise. +func Must(uuid UUID, err error) UUID { + if err != nil { + panic(err) + } + return uuid +} + +// String returns the string form of uuid, xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx +// , or "" if uuid is invalid. +func (uuid UUID) String() string { + var buf [36]byte + encodeHex(buf[:], uuid) + return string(buf[:]) +} + +// URN returns the RFC 2141 URN form of uuid, +// urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx, or "" if uuid is invalid. +func (uuid UUID) URN() string { + var buf [36 + 9]byte + copy(buf[:], "urn:uuid:") + encodeHex(buf[9:], uuid) + return string(buf[:]) +} + +func encodeHex(dst []byte, uuid UUID) { + hex.Encode(dst, uuid[:4]) + dst[8] = '-' + hex.Encode(dst[9:13], uuid[4:6]) + dst[13] = '-' + hex.Encode(dst[14:18], uuid[6:8]) + dst[18] = '-' + hex.Encode(dst[19:23], uuid[8:10]) + dst[23] = '-' + hex.Encode(dst[24:], uuid[10:]) +} + +// Variant returns the variant encoded in uuid. +func (uuid UUID) Variant() Variant { + switch { + case (uuid[8] & 0xc0) == 0x80: + return RFC4122 + case (uuid[8] & 0xe0) == 0xc0: + return Microsoft + case (uuid[8] & 0xe0) == 0xe0: + return Future + default: + return Reserved + } +} + +// Version returns the version of uuid. +func (uuid UUID) Version() Version { + return Version(uuid[6] >> 4) +} + +func (v Version) String() string { + if v > 15 { + return fmt.Sprintf("BAD_VERSION_%d", v) + } + return fmt.Sprintf("VERSION_%d", v) +} + +func (v Variant) String() string { + switch v { + case RFC4122: + return "RFC4122" + case Reserved: + return "Reserved" + case Microsoft: + return "Microsoft" + case Future: + return "Future" + case Invalid: + return "Invalid" + } + return fmt.Sprintf("BadVariant%d", int(v)) +} + +// SetRand sets the random number generator to r, which implements io.Reader. +// If r.Read returns an error when the package requests random data then +// a panic will be issued. +// +// Calling SetRand with nil sets the random number generator to the default +// generator. +func SetRand(r io.Reader) { + if r == nil { + rander = rand.Reader + return + } + rander = r +} + +// EnableRandPool enables internal randomness pool used for Random +// (Version 4) UUID generation. The pool contains random bytes read from +// the random number generator on demand in batches. Enabling the pool +// may improve the UUID generation throughput significantly. +// +// Since the pool is stored on the Go heap, this feature may be a bad fit +// for security sensitive applications. +// +// Both EnableRandPool and DisableRandPool are not thread-safe and should +// only be called when there is no possibility that New or any other +// UUID Version 4 generation function will be called concurrently. +func EnableRandPool() { + poolEnabled = true +} + +// DisableRandPool disables the randomness pool if it was previously +// enabled with EnableRandPool. +// +// Both EnableRandPool and DisableRandPool are not thread-safe and should +// only be called when there is no possibility that New or any other +// UUID Version 4 generation function will be called concurrently. +func DisableRandPool() { + poolEnabled = false + defer poolMu.Unlock() + poolMu.Lock() + poolPos = randPoolSize +} diff --git a/vendor/github.com/google/uuid/version1.go b/vendor/github.com/google/uuid/version1.go new file mode 100644 index 0000000..4631096 --- /dev/null +++ b/vendor/github.com/google/uuid/version1.go @@ -0,0 +1,44 @@ +// Copyright 2016 Google Inc. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package uuid + +import ( + "encoding/binary" +) + +// NewUUID returns a Version 1 UUID based on the current NodeID and clock +// sequence, and the current time. If the NodeID has not been set by SetNodeID +// or SetNodeInterface then it will be set automatically. If the NodeID cannot +// be set NewUUID returns nil. If clock sequence has not been set by +// SetClockSequence then it will be set automatically. If GetTime fails to +// return the current NewUUID returns nil and an error. +// +// In most cases, New should be used. +func NewUUID() (UUID, error) { + var uuid UUID + now, seq, err := GetTime() + if err != nil { + return uuid, err + } + + timeLow := uint32(now & 0xffffffff) + timeMid := uint16((now >> 32) & 0xffff) + timeHi := uint16((now >> 48) & 0x0fff) + timeHi |= 0x1000 // Version 1 + + binary.BigEndian.PutUint32(uuid[0:], timeLow) + binary.BigEndian.PutUint16(uuid[4:], timeMid) + binary.BigEndian.PutUint16(uuid[6:], timeHi) + binary.BigEndian.PutUint16(uuid[8:], seq) + + nodeMu.Lock() + if nodeID == zeroID { + setNodeInterface("") + } + copy(uuid[10:], nodeID[:]) + nodeMu.Unlock() + + return uuid, nil +} diff --git a/vendor/github.com/google/uuid/version4.go b/vendor/github.com/google/uuid/version4.go new file mode 100644 index 0000000..7697802 --- /dev/null +++ b/vendor/github.com/google/uuid/version4.go @@ -0,0 +1,76 @@ +// Copyright 2016 Google Inc. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package uuid + +import "io" + +// New creates a new random UUID or panics. New is equivalent to +// the expression +// +// uuid.Must(uuid.NewRandom()) +func New() UUID { + return Must(NewRandom()) +} + +// NewString creates a new random UUID and returns it as a string or panics. +// NewString is equivalent to the expression +// +// uuid.New().String() +func NewString() string { + return Must(NewRandom()).String() +} + +// NewRandom returns a Random (Version 4) UUID. +// +// The strength of the UUIDs is based on the strength of the crypto/rand +// package. +// +// Uses the randomness pool if it was enabled with EnableRandPool. +// +// A note about uniqueness derived from the UUID Wikipedia entry: +// +// Randomly generated UUIDs have 122 random bits. One's annual risk of being +// hit by a meteorite is estimated to be one chance in 17 billion, that +// means the probability is about 0.00000000006 (6 × 10−11), +// equivalent to the odds of creating a few tens of trillions of UUIDs in a +// year and having one duplicate. +func NewRandom() (UUID, error) { + if !poolEnabled { + return NewRandomFromReader(rander) + } + return newRandomFromPool() +} + +// NewRandomFromReader returns a UUID based on bytes read from a given io.Reader. +func NewRandomFromReader(r io.Reader) (UUID, error) { + var uuid UUID + _, err := io.ReadFull(r, uuid[:]) + if err != nil { + return Nil, err + } + uuid[6] = (uuid[6] & 0x0f) | 0x40 // Version 4 + uuid[8] = (uuid[8] & 0x3f) | 0x80 // Variant is 10 + return uuid, nil +} + +func newRandomFromPool() (UUID, error) { + var uuid UUID + poolMu.Lock() + if poolPos == randPoolSize { + _, err := io.ReadFull(rander, pool[:]) + if err != nil { + poolMu.Unlock() + return Nil, err + } + poolPos = 0 + } + copy(uuid[:], pool[poolPos:(poolPos+16)]) + poolPos += 16 + poolMu.Unlock() + + uuid[6] = (uuid[6] & 0x0f) | 0x40 // Version 4 + uuid[8] = (uuid[8] & 0x3f) | 0x80 // Variant is 10 + return uuid, nil +} diff --git a/vendor/github.com/imdario/mergo/.deepsource.toml b/vendor/github.com/imdario/mergo/.deepsource.toml new file mode 100644 index 0000000..8a0681a --- /dev/null +++ b/vendor/github.com/imdario/mergo/.deepsource.toml @@ -0,0 +1,12 @@ +version = 1 + +test_patterns = [ + "*_test.go" +] + +[[analyzers]] +name = "go" +enabled = true + + [analyzers.meta] + import_path = "github.com/imdario/mergo" \ No newline at end of file diff --git a/vendor/github.com/imdario/mergo/.gitignore b/vendor/github.com/imdario/mergo/.gitignore new file mode 100644 index 0000000..529c341 --- /dev/null +++ b/vendor/github.com/imdario/mergo/.gitignore @@ -0,0 +1,33 @@ +#### joe made this: http://goel.io/joe + +#### go #### +# Binaries for programs and plugins +*.exe +*.dll +*.so +*.dylib + +# Test binary, build with `go test -c` +*.test + +# Output of the go coverage tool, specifically when used with LiteIDE +*.out + +# Project-local glide cache, RE: https://github.com/Masterminds/glide/issues/736 +.glide/ + +#### vim #### +# Swap +[._]*.s[a-v][a-z] +[._]*.sw[a-p] +[._]s[a-v][a-z] +[._]sw[a-p] + +# Session +Session.vim + +# Temporary +.netrwhist +*~ +# Auto-generated tag files +tags diff --git a/vendor/github.com/imdario/mergo/.travis.yml b/vendor/github.com/imdario/mergo/.travis.yml new file mode 100644 index 0000000..d324c43 --- /dev/null +++ b/vendor/github.com/imdario/mergo/.travis.yml @@ -0,0 +1,12 @@ +language: go +arch: + - amd64 + - ppc64le +install: + - go get -t + - go get golang.org/x/tools/cmd/cover + - go get github.com/mattn/goveralls +script: + - go test -race -v ./... +after_script: + - $HOME/gopath/bin/goveralls -service=travis-ci -repotoken $COVERALLS_TOKEN diff --git a/vendor/github.com/imdario/mergo/CODE_OF_CONDUCT.md b/vendor/github.com/imdario/mergo/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..469b449 --- /dev/null +++ b/vendor/github.com/imdario/mergo/CODE_OF_CONDUCT.md @@ -0,0 +1,46 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at i@dario.im. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ diff --git a/vendor/github.com/kennygrant/sanitize/LICENSE b/vendor/github.com/imdario/mergo/LICENSE similarity index 92% rename from vendor/github.com/kennygrant/sanitize/LICENSE rename to vendor/github.com/imdario/mergo/LICENSE index 749ebb2..6866802 100644 --- a/vendor/github.com/kennygrant/sanitize/LICENSE +++ b/vendor/github.com/imdario/mergo/LICENSE @@ -1,4 +1,5 @@ -Copyright (c) 2017 Mechanism Design. All rights reserved. +Copyright (c) 2013 Dario Castañé. All rights reserved. +Copyright (c) 2012 The Go Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -24,4 +25,4 @@ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/imdario/mergo/README.md b/vendor/github.com/imdario/mergo/README.md new file mode 100644 index 0000000..aa8cbd7 --- /dev/null +++ b/vendor/github.com/imdario/mergo/README.md @@ -0,0 +1,247 @@ +# Mergo + + +[![GoDoc][3]][4] +[![GitHub release][5]][6] +[![GoCard][7]][8] +[![Build Status][1]][2] +[![Coverage Status][9]][10] +[![Sourcegraph][11]][12] +[![FOSSA Status][13]][14] + +[![GoCenter Kudos][15]][16] + +[1]: https://travis-ci.org/imdario/mergo.png +[2]: https://travis-ci.org/imdario/mergo +[3]: https://godoc.org/github.com/imdario/mergo?status.svg +[4]: https://godoc.org/github.com/imdario/mergo +[5]: https://img.shields.io/github/release/imdario/mergo.svg +[6]: https://github.com/imdario/mergo/releases +[7]: https://goreportcard.com/badge/imdario/mergo +[8]: https://goreportcard.com/report/github.com/imdario/mergo +[9]: https://coveralls.io/repos/github/imdario/mergo/badge.svg?branch=master +[10]: https://coveralls.io/github/imdario/mergo?branch=master +[11]: https://sourcegraph.com/github.com/imdario/mergo/-/badge.svg +[12]: https://sourcegraph.com/github.com/imdario/mergo?badge +[13]: https://app.fossa.io/api/projects/git%2Bgithub.com%2Fimdario%2Fmergo.svg?type=shield +[14]: https://app.fossa.io/projects/git%2Bgithub.com%2Fimdario%2Fmergo?ref=badge_shield +[15]: https://search.gocenter.io/api/ui/badge/github.com%2Fimdario%2Fmergo +[16]: https://search.gocenter.io/github.com/imdario/mergo + +A helper to merge structs and maps in Golang. Useful for configuration default values, avoiding messy if-statements. + +Mergo merges same-type structs and maps by setting default values in zero-value fields. Mergo won't merge unexported (private) fields. It will do recursively any exported one. It also won't merge structs inside maps (because they are not addressable using Go reflection). + +Also a lovely [comune](http://en.wikipedia.org/wiki/Mergo) (municipality) in the Province of Ancona in the Italian region of Marche. + +## Status + +It is ready for production use. [It is used in several projects by Docker, Google, The Linux Foundation, VMWare, Shopify, etc](https://github.com/imdario/mergo#mergo-in-the-wild). + +### Important note + +Please keep in mind that a problematic PR broke [0.3.9](//github.com/imdario/mergo/releases/tag/0.3.9). I reverted it in [0.3.10](//github.com/imdario/mergo/releases/tag/0.3.10), and I consider it stable but not bug-free. Also, this version adds suppot for go modules. + +Keep in mind that in [0.3.2](//github.com/imdario/mergo/releases/tag/0.3.2), Mergo changed `Merge()`and `Map()` signatures to support [transformers](#transformers). I added an optional/variadic argument so that it won't break the existing code. + +If you were using Mergo before April 6th, 2015, please check your project works as intended after updating your local copy with ```go get -u github.com/imdario/mergo```. I apologize for any issue caused by its previous behavior and any future bug that Mergo could cause in existing projects after the change (release 0.2.0). + +### Donations + +If Mergo is useful to you, consider buying me a coffee, a beer, or making a monthly donation to allow me to keep building great free software. :heart_eyes: + +Buy Me a Coffee at ko-fi.com +[![Beerpay](https://beerpay.io/imdario/mergo/badge.svg)](https://beerpay.io/imdario/mergo) +[![Beerpay](https://beerpay.io/imdario/mergo/make-wish.svg)](https://beerpay.io/imdario/mergo) +Donate using Liberapay + +### Mergo in the wild + +- [moby/moby](https://github.com/moby/moby) +- [kubernetes/kubernetes](https://github.com/kubernetes/kubernetes) +- [vmware/dispatch](https://github.com/vmware/dispatch) +- [Shopify/themekit](https://github.com/Shopify/themekit) +- [imdario/zas](https://github.com/imdario/zas) +- [matcornic/hermes](https://github.com/matcornic/hermes) +- [OpenBazaar/openbazaar-go](https://github.com/OpenBazaar/openbazaar-go) +- [kataras/iris](https://github.com/kataras/iris) +- [michaelsauter/crane](https://github.com/michaelsauter/crane) +- [go-task/task](https://github.com/go-task/task) +- [sensu/uchiwa](https://github.com/sensu/uchiwa) +- [ory/hydra](https://github.com/ory/hydra) +- [sisatech/vcli](https://github.com/sisatech/vcli) +- [dairycart/dairycart](https://github.com/dairycart/dairycart) +- [projectcalico/felix](https://github.com/projectcalico/felix) +- [resin-os/balena](https://github.com/resin-os/balena) +- [go-kivik/kivik](https://github.com/go-kivik/kivik) +- [Telefonica/govice](https://github.com/Telefonica/govice) +- [supergiant/supergiant](supergiant/supergiant) +- [SergeyTsalkov/brooce](https://github.com/SergeyTsalkov/brooce) +- [soniah/dnsmadeeasy](https://github.com/soniah/dnsmadeeasy) +- [ohsu-comp-bio/funnel](https://github.com/ohsu-comp-bio/funnel) +- [EagerIO/Stout](https://github.com/EagerIO/Stout) +- [lynndylanhurley/defsynth-api](https://github.com/lynndylanhurley/defsynth-api) +- [russross/canvasassignments](https://github.com/russross/canvasassignments) +- [rdegges/cryptly-api](https://github.com/rdegges/cryptly-api) +- [casualjim/exeggutor](https://github.com/casualjim/exeggutor) +- [divshot/gitling](https://github.com/divshot/gitling) +- [RWJMurphy/gorl](https://github.com/RWJMurphy/gorl) +- [andrerocker/deploy42](https://github.com/andrerocker/deploy42) +- [elwinar/rambler](https://github.com/elwinar/rambler) +- [tmaiaroto/gopartman](https://github.com/tmaiaroto/gopartman) +- [jfbus/impressionist](https://github.com/jfbus/impressionist) +- [Jmeyering/zealot](https://github.com/Jmeyering/zealot) +- [godep-migrator/rigger-host](https://github.com/godep-migrator/rigger-host) +- [Dronevery/MultiwaySwitch-Go](https://github.com/Dronevery/MultiwaySwitch-Go) +- [thoas/picfit](https://github.com/thoas/picfit) +- [mantasmatelis/whooplist-server](https://github.com/mantasmatelis/whooplist-server) +- [jnuthong/item_search](https://github.com/jnuthong/item_search) +- [bukalapak/snowboard](https://github.com/bukalapak/snowboard) +- [containerssh/containerssh](https://github.com/containerssh/containerssh) + +## Install + + go get github.com/imdario/mergo + + // use in your .go code + import ( + "github.com/imdario/mergo" + ) + +## Usage + +You can only merge same-type structs with exported fields initialized as zero value of their type and same-types maps. Mergo won't merge unexported (private) fields but will do recursively any exported one. It won't merge empty structs value as [they are zero values](https://golang.org/ref/spec#The_zero_value) too. Also, maps will be merged recursively except for structs inside maps (because they are not addressable using Go reflection). + +```go +if err := mergo.Merge(&dst, src); err != nil { + // ... +} +``` + +Also, you can merge overwriting values using the transformer `WithOverride`. + +```go +if err := mergo.Merge(&dst, src, mergo.WithOverride); err != nil { + // ... +} +``` + +Additionally, you can map a `map[string]interface{}` to a struct (and otherwise, from struct to map), following the same restrictions as in `Merge()`. Keys are capitalized to find each corresponding exported field. + +```go +if err := mergo.Map(&dst, srcMap); err != nil { + // ... +} +``` + +Warning: if you map a struct to map, it won't do it recursively. Don't expect Mergo to map struct members of your struct as `map[string]interface{}`. They will be just assigned as values. + +Here is a nice example: + +```go +package main + +import ( + "fmt" + "github.com/imdario/mergo" +) + +type Foo struct { + A string + B int64 +} + +func main() { + src := Foo{ + A: "one", + B: 2, + } + dest := Foo{ + A: "two", + } + mergo.Merge(&dest, src) + fmt.Println(dest) + // Will print + // {two 2} +} +``` + +Note: if test are failing due missing package, please execute: + + go get gopkg.in/yaml.v2 + +### Transformers + +Transformers allow to merge specific types differently than in the default behavior. In other words, now you can customize how some types are merged. For example, `time.Time` is a struct; it doesn't have zero value but IsZero can return true because it has fields with zero value. How can we merge a non-zero `time.Time`? + +```go +package main + +import ( + "fmt" + "github.com/imdario/mergo" + "reflect" + "time" +) + +type timeTransformer struct { +} + +func (t timeTransformer) Transformer(typ reflect.Type) func(dst, src reflect.Value) error { + if typ == reflect.TypeOf(time.Time{}) { + return func(dst, src reflect.Value) error { + if dst.CanSet() { + isZero := dst.MethodByName("IsZero") + result := isZero.Call([]reflect.Value{}) + if result[0].Bool() { + dst.Set(src) + } + } + return nil + } + } + return nil +} + +type Snapshot struct { + Time time.Time + // ... +} + +func main() { + src := Snapshot{time.Now()} + dest := Snapshot{} + mergo.Merge(&dest, src, mergo.WithTransformers(timeTransformer{})) + fmt.Println(dest) + // Will print + // { 2018-01-12 01:15:00 +0000 UTC m=+0.000000001 } +} +``` + + +## Contact me + +If I can help you, you have an idea or you are using Mergo in your projects, don't hesitate to drop me a line (or a pull request): [@im_dario](https://twitter.com/im_dario) + +## About + +Written by [Dario Castañé](http://dario.im). + +## Top Contributors + +[![0](https://sourcerer.io/fame/imdario/imdario/mergo/images/0)](https://sourcerer.io/fame/imdario/imdario/mergo/links/0) +[![1](https://sourcerer.io/fame/imdario/imdario/mergo/images/1)](https://sourcerer.io/fame/imdario/imdario/mergo/links/1) +[![2](https://sourcerer.io/fame/imdario/imdario/mergo/images/2)](https://sourcerer.io/fame/imdario/imdario/mergo/links/2) +[![3](https://sourcerer.io/fame/imdario/imdario/mergo/images/3)](https://sourcerer.io/fame/imdario/imdario/mergo/links/3) +[![4](https://sourcerer.io/fame/imdario/imdario/mergo/images/4)](https://sourcerer.io/fame/imdario/imdario/mergo/links/4) +[![5](https://sourcerer.io/fame/imdario/imdario/mergo/images/5)](https://sourcerer.io/fame/imdario/imdario/mergo/links/5) +[![6](https://sourcerer.io/fame/imdario/imdario/mergo/images/6)](https://sourcerer.io/fame/imdario/imdario/mergo/links/6) +[![7](https://sourcerer.io/fame/imdario/imdario/mergo/images/7)](https://sourcerer.io/fame/imdario/imdario/mergo/links/7) + + +## License + +[BSD 3-Clause](http://opensource.org/licenses/BSD-3-Clause) license, as [Go language](http://golang.org/LICENSE). + + +[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fimdario%2Fmergo.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2Fimdario%2Fmergo?ref=badge_large) diff --git a/vendor/github.com/imdario/mergo/doc.go b/vendor/github.com/imdario/mergo/doc.go new file mode 100644 index 0000000..fcd985f --- /dev/null +++ b/vendor/github.com/imdario/mergo/doc.go @@ -0,0 +1,143 @@ +// Copyright 2013 Dario Castañé. All rights reserved. +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +/* +A helper to merge structs and maps in Golang. Useful for configuration default values, avoiding messy if-statements. + +Mergo merges same-type structs and maps by setting default values in zero-value fields. Mergo won't merge unexported (private) fields. It will do recursively any exported one. It also won't merge structs inside maps (because they are not addressable using Go reflection). + +Status + +It is ready for production use. It is used in several projects by Docker, Google, The Linux Foundation, VMWare, Shopify, etc. + +Important note + +Please keep in mind that a problematic PR broke 0.3.9. We reverted it in 0.3.10. We consider 0.3.10 as stable but not bug-free. . Also, this version adds suppot for go modules. + +Keep in mind that in 0.3.2, Mergo changed Merge() and Map() signatures to support transformers. We added an optional/variadic argument so that it won't break the existing code. + +If you were using Mergo before April 6th, 2015, please check your project works as intended after updating your local copy with go get -u github.com/imdario/mergo. I apologize for any issue caused by its previous behavior and any future bug that Mergo could cause in existing projects after the change (release 0.2.0). + +Install + +Do your usual installation procedure: + + go get github.com/imdario/mergo + + // use in your .go code + import ( + "github.com/imdario/mergo" + ) + +Usage + +You can only merge same-type structs with exported fields initialized as zero value of their type and same-types maps. Mergo won't merge unexported (private) fields but will do recursively any exported one. It won't merge empty structs value as they are zero values too. Also, maps will be merged recursively except for structs inside maps (because they are not addressable using Go reflection). + + if err := mergo.Merge(&dst, src); err != nil { + // ... + } + +Also, you can merge overwriting values using the transformer WithOverride. + + if err := mergo.Merge(&dst, src, mergo.WithOverride); err != nil { + // ... + } + +Additionally, you can map a map[string]interface{} to a struct (and otherwise, from struct to map), following the same restrictions as in Merge(). Keys are capitalized to find each corresponding exported field. + + if err := mergo.Map(&dst, srcMap); err != nil { + // ... + } + +Warning: if you map a struct to map, it won't do it recursively. Don't expect Mergo to map struct members of your struct as map[string]interface{}. They will be just assigned as values. + +Here is a nice example: + + package main + + import ( + "fmt" + "github.com/imdario/mergo" + ) + + type Foo struct { + A string + B int64 + } + + func main() { + src := Foo{ + A: "one", + B: 2, + } + dest := Foo{ + A: "two", + } + mergo.Merge(&dest, src) + fmt.Println(dest) + // Will print + // {two 2} + } + +Transformers + +Transformers allow to merge specific types differently than in the default behavior. In other words, now you can customize how some types are merged. For example, time.Time is a struct; it doesn't have zero value but IsZero can return true because it has fields with zero value. How can we merge a non-zero time.Time? + + package main + + import ( + "fmt" + "github.com/imdario/mergo" + "reflect" + "time" + ) + + type timeTransformer struct { + } + + func (t timeTransformer) Transformer(typ reflect.Type) func(dst, src reflect.Value) error { + if typ == reflect.TypeOf(time.Time{}) { + return func(dst, src reflect.Value) error { + if dst.CanSet() { + isZero := dst.MethodByName("IsZero") + result := isZero.Call([]reflect.Value{}) + if result[0].Bool() { + dst.Set(src) + } + } + return nil + } + } + return nil + } + + type Snapshot struct { + Time time.Time + // ... + } + + func main() { + src := Snapshot{time.Now()} + dest := Snapshot{} + mergo.Merge(&dest, src, mergo.WithTransformers(timeTransformer{})) + fmt.Println(dest) + // Will print + // { 2018-01-12 01:15:00 +0000 UTC m=+0.000000001 } + } + +Contact me + +If I can help you, you have an idea or you are using Mergo in your projects, don't hesitate to drop me a line (or a pull request): https://twitter.com/im_dario + +About + +Written by Dario Castañé: https://da.rio.hn + +License + +BSD 3-Clause license, as Go language. + +*/ +package mergo diff --git a/vendor/github.com/imdario/mergo/go.mod b/vendor/github.com/imdario/mergo/go.mod new file mode 100644 index 0000000..3d689d9 --- /dev/null +++ b/vendor/github.com/imdario/mergo/go.mod @@ -0,0 +1,5 @@ +module github.com/imdario/mergo + +go 1.13 + +require gopkg.in/yaml.v2 v2.3.0 diff --git a/vendor/github.com/imdario/mergo/go.sum b/vendor/github.com/imdario/mergo/go.sum new file mode 100644 index 0000000..168980d --- /dev/null +++ b/vendor/github.com/imdario/mergo/go.sum @@ -0,0 +1,4 @@ +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/imdario/mergo/map.go b/vendor/github.com/imdario/mergo/map.go new file mode 100644 index 0000000..a13a7ee --- /dev/null +++ b/vendor/github.com/imdario/mergo/map.go @@ -0,0 +1,178 @@ +// Copyright 2014 Dario Castañé. All rights reserved. +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Based on src/pkg/reflect/deepequal.go from official +// golang's stdlib. + +package mergo + +import ( + "fmt" + "reflect" + "unicode" + "unicode/utf8" +) + +func changeInitialCase(s string, mapper func(rune) rune) string { + if s == "" { + return s + } + r, n := utf8.DecodeRuneInString(s) + return string(mapper(r)) + s[n:] +} + +func isExported(field reflect.StructField) bool { + r, _ := utf8.DecodeRuneInString(field.Name) + return r >= 'A' && r <= 'Z' +} + +// Traverses recursively both values, assigning src's fields values to dst. +// The map argument tracks comparisons that have already been seen, which allows +// short circuiting on recursive types. +func deepMap(dst, src reflect.Value, visited map[uintptr]*visit, depth int, config *Config) (err error) { + overwrite := config.Overwrite + if dst.CanAddr() { + addr := dst.UnsafeAddr() + h := 17 * addr + seen := visited[h] + typ := dst.Type() + for p := seen; p != nil; p = p.next { + if p.ptr == addr && p.typ == typ { + return nil + } + } + // Remember, remember... + visited[h] = &visit{addr, typ, seen} + } + zeroValue := reflect.Value{} + switch dst.Kind() { + case reflect.Map: + dstMap := dst.Interface().(map[string]interface{}) + for i, n := 0, src.NumField(); i < n; i++ { + srcType := src.Type() + field := srcType.Field(i) + if !isExported(field) { + continue + } + fieldName := field.Name + fieldName = changeInitialCase(fieldName, unicode.ToLower) + if v, ok := dstMap[fieldName]; !ok || (isEmptyValue(reflect.ValueOf(v)) || overwrite) { + dstMap[fieldName] = src.Field(i).Interface() + } + } + case reflect.Ptr: + if dst.IsNil() { + v := reflect.New(dst.Type().Elem()) + dst.Set(v) + } + dst = dst.Elem() + fallthrough + case reflect.Struct: + srcMap := src.Interface().(map[string]interface{}) + for key := range srcMap { + config.overwriteWithEmptyValue = true + srcValue := srcMap[key] + fieldName := changeInitialCase(key, unicode.ToUpper) + dstElement := dst.FieldByName(fieldName) + if dstElement == zeroValue { + // We discard it because the field doesn't exist. + continue + } + srcElement := reflect.ValueOf(srcValue) + dstKind := dstElement.Kind() + srcKind := srcElement.Kind() + if srcKind == reflect.Ptr && dstKind != reflect.Ptr { + srcElement = srcElement.Elem() + srcKind = reflect.TypeOf(srcElement.Interface()).Kind() + } else if dstKind == reflect.Ptr { + // Can this work? I guess it can't. + if srcKind != reflect.Ptr && srcElement.CanAddr() { + srcPtr := srcElement.Addr() + srcElement = reflect.ValueOf(srcPtr) + srcKind = reflect.Ptr + } + } + + if !srcElement.IsValid() { + continue + } + if srcKind == dstKind { + if err = deepMerge(dstElement, srcElement, visited, depth+1, config); err != nil { + return + } + } else if dstKind == reflect.Interface && dstElement.Kind() == reflect.Interface { + if err = deepMerge(dstElement, srcElement, visited, depth+1, config); err != nil { + return + } + } else if srcKind == reflect.Map { + if err = deepMap(dstElement, srcElement, visited, depth+1, config); err != nil { + return + } + } else { + return fmt.Errorf("type mismatch on %s field: found %v, expected %v", fieldName, srcKind, dstKind) + } + } + } + return +} + +// Map sets fields' values in dst from src. +// src can be a map with string keys or a struct. dst must be the opposite: +// if src is a map, dst must be a valid pointer to struct. If src is a struct, +// dst must be map[string]interface{}. +// It won't merge unexported (private) fields and will do recursively +// any exported field. +// If dst is a map, keys will be src fields' names in lower camel case. +// Missing key in src that doesn't match a field in dst will be skipped. This +// doesn't apply if dst is a map. +// This is separated method from Merge because it is cleaner and it keeps sane +// semantics: merging equal types, mapping different (restricted) types. +func Map(dst, src interface{}, opts ...func(*Config)) error { + return _map(dst, src, opts...) +} + +// MapWithOverwrite will do the same as Map except that non-empty dst attributes will be overridden by +// non-empty src attribute values. +// Deprecated: Use Map(…) with WithOverride +func MapWithOverwrite(dst, src interface{}, opts ...func(*Config)) error { + return _map(dst, src, append(opts, WithOverride)...) +} + +func _map(dst, src interface{}, opts ...func(*Config)) error { + if dst != nil && reflect.ValueOf(dst).Kind() != reflect.Ptr { + return ErrNonPointerAgument + } + var ( + vDst, vSrc reflect.Value + err error + ) + config := &Config{} + + for _, opt := range opts { + opt(config) + } + + if vDst, vSrc, err = resolveValues(dst, src); err != nil { + return err + } + // To be friction-less, we redirect equal-type arguments + // to deepMerge. Only because arguments can be anything. + if vSrc.Kind() == vDst.Kind() { + return deepMerge(vDst, vSrc, make(map[uintptr]*visit), 0, config) + } + switch vSrc.Kind() { + case reflect.Struct: + if vDst.Kind() != reflect.Map { + return ErrExpectedMapAsDestination + } + case reflect.Map: + if vDst.Kind() != reflect.Struct { + return ErrExpectedStructAsDestination + } + default: + return ErrNotSupported + } + return deepMap(vDst, vSrc, make(map[uintptr]*visit), 0, config) +} diff --git a/vendor/github.com/imdario/mergo/merge.go b/vendor/github.com/imdario/mergo/merge.go new file mode 100644 index 0000000..8c2a8fc --- /dev/null +++ b/vendor/github.com/imdario/mergo/merge.go @@ -0,0 +1,380 @@ +// Copyright 2013 Dario Castañé. All rights reserved. +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Based on src/pkg/reflect/deepequal.go from official +// golang's stdlib. + +package mergo + +import ( + "fmt" + "reflect" +) + +func hasMergeableFields(dst reflect.Value) (exported bool) { + for i, n := 0, dst.NumField(); i < n; i++ { + field := dst.Type().Field(i) + if field.Anonymous && dst.Field(i).Kind() == reflect.Struct { + exported = exported || hasMergeableFields(dst.Field(i)) + } else if isExportedComponent(&field) { + exported = exported || len(field.PkgPath) == 0 + } + } + return +} + +func isExportedComponent(field *reflect.StructField) bool { + pkgPath := field.PkgPath + if len(pkgPath) > 0 { + return false + } + c := field.Name[0] + if 'a' <= c && c <= 'z' || c == '_' { + return false + } + return true +} + +type Config struct { + Overwrite bool + AppendSlice bool + TypeCheck bool + Transformers Transformers + overwriteWithEmptyValue bool + overwriteSliceWithEmptyValue bool + sliceDeepCopy bool + debug bool +} + +type Transformers interface { + Transformer(reflect.Type) func(dst, src reflect.Value) error +} + +// Traverses recursively both values, assigning src's fields values to dst. +// The map argument tracks comparisons that have already been seen, which allows +// short circuiting on recursive types. +func deepMerge(dst, src reflect.Value, visited map[uintptr]*visit, depth int, config *Config) (err error) { + overwrite := config.Overwrite + typeCheck := config.TypeCheck + overwriteWithEmptySrc := config.overwriteWithEmptyValue + overwriteSliceWithEmptySrc := config.overwriteSliceWithEmptyValue + sliceDeepCopy := config.sliceDeepCopy + + if !src.IsValid() { + return + } + if dst.CanAddr() { + addr := dst.UnsafeAddr() + h := 17 * addr + seen := visited[h] + typ := dst.Type() + for p := seen; p != nil; p = p.next { + if p.ptr == addr && p.typ == typ { + return nil + } + } + // Remember, remember... + visited[h] = &visit{addr, typ, seen} + } + + if config.Transformers != nil && !isEmptyValue(dst) { + if fn := config.Transformers.Transformer(dst.Type()); fn != nil { + err = fn(dst, src) + return + } + } + + switch dst.Kind() { + case reflect.Struct: + if hasMergeableFields(dst) { + for i, n := 0, dst.NumField(); i < n; i++ { + if err = deepMerge(dst.Field(i), src.Field(i), visited, depth+1, config); err != nil { + return + } + } + } else { + if dst.CanSet() && (isReflectNil(dst) || overwrite) && (!isEmptyValue(src) || overwriteWithEmptySrc) { + dst.Set(src) + } + } + case reflect.Map: + if dst.IsNil() && !src.IsNil() { + if dst.CanSet() { + dst.Set(reflect.MakeMap(dst.Type())) + } else { + dst = src + return + } + } + + if src.Kind() != reflect.Map { + if overwrite { + dst.Set(src) + } + return + } + + for _, key := range src.MapKeys() { + srcElement := src.MapIndex(key) + if !srcElement.IsValid() { + continue + } + dstElement := dst.MapIndex(key) + switch srcElement.Kind() { + case reflect.Chan, reflect.Func, reflect.Map, reflect.Interface, reflect.Slice: + if srcElement.IsNil() { + if overwrite { + dst.SetMapIndex(key, srcElement) + } + continue + } + fallthrough + default: + if !srcElement.CanInterface() { + continue + } + switch reflect.TypeOf(srcElement.Interface()).Kind() { + case reflect.Struct: + fallthrough + case reflect.Ptr: + fallthrough + case reflect.Map: + srcMapElm := srcElement + dstMapElm := dstElement + if srcMapElm.CanInterface() { + srcMapElm = reflect.ValueOf(srcMapElm.Interface()) + if dstMapElm.IsValid() { + dstMapElm = reflect.ValueOf(dstMapElm.Interface()) + } + } + if err = deepMerge(dstMapElm, srcMapElm, visited, depth+1, config); err != nil { + return + } + case reflect.Slice: + srcSlice := reflect.ValueOf(srcElement.Interface()) + + var dstSlice reflect.Value + if !dstElement.IsValid() || dstElement.IsNil() { + dstSlice = reflect.MakeSlice(srcSlice.Type(), 0, srcSlice.Len()) + } else { + dstSlice = reflect.ValueOf(dstElement.Interface()) + } + + if (!isEmptyValue(src) || overwriteWithEmptySrc || overwriteSliceWithEmptySrc) && (overwrite || isEmptyValue(dst)) && !config.AppendSlice && !sliceDeepCopy { + if typeCheck && srcSlice.Type() != dstSlice.Type() { + return fmt.Errorf("cannot override two slices with different type (%s, %s)", srcSlice.Type(), dstSlice.Type()) + } + dstSlice = srcSlice + } else if config.AppendSlice { + if srcSlice.Type() != dstSlice.Type() { + return fmt.Errorf("cannot append two slices with different type (%s, %s)", srcSlice.Type(), dstSlice.Type()) + } + dstSlice = reflect.AppendSlice(dstSlice, srcSlice) + } else if sliceDeepCopy { + i := 0 + for ; i < srcSlice.Len() && i < dstSlice.Len(); i++ { + srcElement := srcSlice.Index(i) + dstElement := dstSlice.Index(i) + + if srcElement.CanInterface() { + srcElement = reflect.ValueOf(srcElement.Interface()) + } + if dstElement.CanInterface() { + dstElement = reflect.ValueOf(dstElement.Interface()) + } + + if err = deepMerge(dstElement, srcElement, visited, depth+1, config); err != nil { + return + } + } + + } + dst.SetMapIndex(key, dstSlice) + } + } + if dstElement.IsValid() && !isEmptyValue(dstElement) && (reflect.TypeOf(srcElement.Interface()).Kind() == reflect.Map || reflect.TypeOf(srcElement.Interface()).Kind() == reflect.Slice) { + continue + } + + if srcElement.IsValid() && ((srcElement.Kind() != reflect.Ptr && overwrite) || !dstElement.IsValid() || isEmptyValue(dstElement)) { + if dst.IsNil() { + dst.Set(reflect.MakeMap(dst.Type())) + } + dst.SetMapIndex(key, srcElement) + } + } + case reflect.Slice: + if !dst.CanSet() { + break + } + if (!isEmptyValue(src) || overwriteWithEmptySrc || overwriteSliceWithEmptySrc) && (overwrite || isEmptyValue(dst)) && !config.AppendSlice && !sliceDeepCopy { + dst.Set(src) + } else if config.AppendSlice { + if src.Type() != dst.Type() { + return fmt.Errorf("cannot append two slice with different type (%s, %s)", src.Type(), dst.Type()) + } + dst.Set(reflect.AppendSlice(dst, src)) + } else if sliceDeepCopy { + for i := 0; i < src.Len() && i < dst.Len(); i++ { + srcElement := src.Index(i) + dstElement := dst.Index(i) + if srcElement.CanInterface() { + srcElement = reflect.ValueOf(srcElement.Interface()) + } + if dstElement.CanInterface() { + dstElement = reflect.ValueOf(dstElement.Interface()) + } + + if err = deepMerge(dstElement, srcElement, visited, depth+1, config); err != nil { + return + } + } + } + case reflect.Ptr: + fallthrough + case reflect.Interface: + if isReflectNil(src) { + if overwriteWithEmptySrc && dst.CanSet() && src.Type().AssignableTo(dst.Type()) { + dst.Set(src) + } + break + } + + if src.Kind() != reflect.Interface { + if dst.IsNil() || (src.Kind() != reflect.Ptr && overwrite) { + if dst.CanSet() && (overwrite || isEmptyValue(dst)) { + dst.Set(src) + } + } else if src.Kind() == reflect.Ptr { + if err = deepMerge(dst.Elem(), src.Elem(), visited, depth+1, config); err != nil { + return + } + } else if dst.Elem().Type() == src.Type() { + if err = deepMerge(dst.Elem(), src, visited, depth+1, config); err != nil { + return + } + } else { + return ErrDifferentArgumentsTypes + } + break + } + + if dst.IsNil() || overwrite { + if dst.CanSet() && (overwrite || isEmptyValue(dst)) { + dst.Set(src) + } + break + } + + if dst.Elem().Kind() == src.Elem().Kind() { + if err = deepMerge(dst.Elem(), src.Elem(), visited, depth+1, config); err != nil { + return + } + break + } + default: + mustSet := (isEmptyValue(dst) || overwrite) && (!isEmptyValue(src) || overwriteWithEmptySrc) + if mustSet { + if dst.CanSet() { + dst.Set(src) + } else { + dst = src + } + } + } + + return +} + +// Merge will fill any empty for value type attributes on the dst struct using corresponding +// src attributes if they themselves are not empty. dst and src must be valid same-type structs +// and dst must be a pointer to struct. +// It won't merge unexported (private) fields and will do recursively any exported field. +func Merge(dst, src interface{}, opts ...func(*Config)) error { + return merge(dst, src, opts...) +} + +// MergeWithOverwrite will do the same as Merge except that non-empty dst attributes will be overridden by +// non-empty src attribute values. +// Deprecated: use Merge(…) with WithOverride +func MergeWithOverwrite(dst, src interface{}, opts ...func(*Config)) error { + return merge(dst, src, append(opts, WithOverride)...) +} + +// WithTransformers adds transformers to merge, allowing to customize the merging of some types. +func WithTransformers(transformers Transformers) func(*Config) { + return func(config *Config) { + config.Transformers = transformers + } +} + +// WithOverride will make merge override non-empty dst attributes with non-empty src attributes values. +func WithOverride(config *Config) { + config.Overwrite = true +} + +// WithOverwriteWithEmptyValue will make merge override non empty dst attributes with empty src attributes values. +func WithOverwriteWithEmptyValue(config *Config) { + config.Overwrite = true + config.overwriteWithEmptyValue = true +} + +// WithOverrideEmptySlice will make merge override empty dst slice with empty src slice. +func WithOverrideEmptySlice(config *Config) { + config.overwriteSliceWithEmptyValue = true +} + +// WithAppendSlice will make merge append slices instead of overwriting it. +func WithAppendSlice(config *Config) { + config.AppendSlice = true +} + +// WithTypeCheck will make merge check types while overwriting it (must be used with WithOverride). +func WithTypeCheck(config *Config) { + config.TypeCheck = true +} + +// WithSliceDeepCopy will merge slice element one by one with Overwrite flag. +func WithSliceDeepCopy(config *Config) { + config.sliceDeepCopy = true + config.Overwrite = true +} + +func merge(dst, src interface{}, opts ...func(*Config)) error { + if dst != nil && reflect.ValueOf(dst).Kind() != reflect.Ptr { + return ErrNonPointerAgument + } + var ( + vDst, vSrc reflect.Value + err error + ) + + config := &Config{} + + for _, opt := range opts { + opt(config) + } + + if vDst, vSrc, err = resolveValues(dst, src); err != nil { + return err + } + if vDst.Type() != vSrc.Type() { + return ErrDifferentArgumentsTypes + } + return deepMerge(vDst, vSrc, make(map[uintptr]*visit), 0, config) +} + +// IsReflectNil is the reflect value provided nil +func isReflectNil(v reflect.Value) bool { + k := v.Kind() + switch k { + case reflect.Interface, reflect.Slice, reflect.Chan, reflect.Func, reflect.Map, reflect.Ptr: + // Both interface and slice are nil if first word is 0. + // Both are always bigger than a word; assume flagIndir. + return v.IsNil() + default: + return false + } +} diff --git a/vendor/github.com/imdario/mergo/mergo.go b/vendor/github.com/imdario/mergo/mergo.go new file mode 100644 index 0000000..3cc926c --- /dev/null +++ b/vendor/github.com/imdario/mergo/mergo.go @@ -0,0 +1,78 @@ +// Copyright 2013 Dario Castañé. All rights reserved. +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Based on src/pkg/reflect/deepequal.go from official +// golang's stdlib. + +package mergo + +import ( + "errors" + "reflect" +) + +// Errors reported by Mergo when it finds invalid arguments. +var ( + ErrNilArguments = errors.New("src and dst must not be nil") + ErrDifferentArgumentsTypes = errors.New("src and dst must be of same type") + ErrNotSupported = errors.New("only structs and maps are supported") + ErrExpectedMapAsDestination = errors.New("dst was expected to be a map") + ErrExpectedStructAsDestination = errors.New("dst was expected to be a struct") + ErrNonPointerAgument = errors.New("dst must be a pointer") +) + +// During deepMerge, must keep track of checks that are +// in progress. The comparison algorithm assumes that all +// checks in progress are true when it reencounters them. +// Visited are stored in a map indexed by 17 * a1 + a2; +type visit struct { + ptr uintptr + typ reflect.Type + next *visit +} + +// From src/pkg/encoding/json/encode.go. +func isEmptyValue(v reflect.Value) bool { + switch v.Kind() { + case reflect.Array, reflect.Map, reflect.Slice, reflect.String: + return v.Len() == 0 + case reflect.Bool: + return !v.Bool() + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return v.Int() == 0 + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return v.Uint() == 0 + case reflect.Float32, reflect.Float64: + return v.Float() == 0 + case reflect.Interface, reflect.Ptr: + if v.IsNil() { + return true + } + return isEmptyValue(v.Elem()) + case reflect.Func: + return v.IsNil() + case reflect.Invalid: + return true + } + return false +} + +func resolveValues(dst, src interface{}) (vDst, vSrc reflect.Value, err error) { + if dst == nil || src == nil { + err = ErrNilArguments + return + } + vDst = reflect.ValueOf(dst).Elem() + if vDst.Kind() != reflect.Struct && vDst.Kind() != reflect.Map { + err = ErrNotSupported + return + } + vSrc = reflect.ValueOf(src) + // We check if vSrc is a pointer to dereference it. + if vSrc.Kind() == reflect.Ptr { + vSrc = vSrc.Elem() + } + return +} diff --git a/vendor/github.com/jackmordaunt/icns/.gitignore b/vendor/github.com/jackmordaunt/icns/.gitignore deleted file mode 100644 index 8a2be8c..0000000 --- a/vendor/github.com/jackmordaunt/icns/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -*.DS_Store -*vendor -*dist \ No newline at end of file diff --git a/vendor/github.com/jackmordaunt/icns/.goreleaser.yml b/vendor/github.com/jackmordaunt/icns/.goreleaser.yml deleted file mode 100644 index 7b000be..0000000 --- a/vendor/github.com/jackmordaunt/icns/.goreleaser.yml +++ /dev/null @@ -1,69 +0,0 @@ -project_name: icnsify -release: - github: - owner: jackmordaunt - name: icns - name_template: '{{.Tag}}' -brew: - commit_author: - name: jackmordaunt - email: jackmordaunt@gmail.com - install: bin.install "icns" -scoop: - commit_author: - name: jackmordaunt - email: jackmordaunt@gmail.com -builds: -- goos: - - linux - - darwin - goarch: - - amd64 - - "386" - goarm: - - "6" - targets: - - linux_amd64 - - linux_386 - - darwin_amd64 - - darwin_386 - main: ./cmd/icnsify - ldflags: -s -w -X main.version={{.Version}} -X main.commit={{.Commit}} -X main.date={{.Date}} - binary: icnsify - lang: go -archive: - name_template: '{{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}{{ if .Arm - }}v{{ .Arm }}{{ end }}' - format: tar.gz - files: - - licence* - - LICENCE* - - license* - - LICENSE* - - readme* - - README* - - changelog* - - CHANGELOG* -fpm: - name_template: '{{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}{{ if .Arm - }}v{{ .Arm }}{{ end }}' - bindir: /usr/local/bin -snapcraft: - name_template: '{{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}{{ if .Arm - }}v{{ .Arm }}{{ end }}' -snapshot: - name_template: SNAPSHOT-{{ .Commit }} -checksum: - name_template: '{{ .ProjectName }}_{{ .Version }}_checksums.txt' -dist: dist -sign: - cmd: gpg - args: - - --output - - $signature - - --detach-sig - - $artifact - signature: ${artifact}.sig - artifacts: none -env_files: - github_token: ~/.config/goreleaser/github_token diff --git a/vendor/github.com/jackmordaunt/icns/Gopkg.lock b/vendor/github.com/jackmordaunt/icns/Gopkg.lock deleted file mode 100644 index bcc1471..0000000 --- a/vendor/github.com/jackmordaunt/icns/Gopkg.lock +++ /dev/null @@ -1,49 +0,0 @@ -# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. - - -[[projects]] - branch = "master" - name = "github.com/nfnt/resize" - packages = ["."] - revision = "891127d8d1b52734debe1b3c3d7e747502b6c366" - -[[projects]] - name = "github.com/pkg/errors" - packages = ["."] - revision = "645ef00459ed84a119197bfb8d8205042c6df63d" - version = "v0.8.0" - -[[projects]] - name = "github.com/spf13/afero" - packages = [ - ".", - "mem" - ] - revision = "bb8f1927f2a9d3ab41c9340aa034f6b803f4359c" - version = "v1.0.2" - -[[projects]] - name = "github.com/spf13/pflag" - packages = ["."] - revision = "e57e3eeb33f795204c1ca35f56c44f83227c6e66" - version = "v1.0.0" - -[[projects]] - branch = "master" - name = "golang.org/x/text" - packages = [ - "internal/gen", - "internal/triegen", - "internal/ucd", - "transform", - "unicode/cldr", - "unicode/norm" - ] - revision = "4e4a3210bb54bb31f6ab2cdca2edcc0b50c420c1" - -[solve-meta] - analyzer-name = "dep" - analyzer-version = 1 - inputs-digest = "542c1997350fc6496202a525a2792f1820f9f9ee7c550410442fea03a48da8dc" - solver-name = "gps-cdcl" - solver-version = 1 diff --git a/vendor/github.com/jackmordaunt/icns/Gopkg.toml b/vendor/github.com/jackmordaunt/icns/Gopkg.toml deleted file mode 100644 index 2503610..0000000 --- a/vendor/github.com/jackmordaunt/icns/Gopkg.toml +++ /dev/null @@ -1,46 +0,0 @@ -# Gopkg.toml example -# -# Refer to https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md -# for detailed Gopkg.toml documentation. -# -# required = ["github.com/user/thing/cmd/thing"] -# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"] -# -# [[constraint]] -# name = "github.com/user/project" -# version = "1.0.0" -# -# [[constraint]] -# name = "github.com/user/project2" -# branch = "dev" -# source = "github.com/myfork/project2" -# -# [[override]] -# name = "github.com/x/y" -# version = "2.4.0" -# -# [prune] -# non-go = false -# go-tests = true -# unused-packages = true - - -[[constraint]] - branch = "master" - name = "github.com/nfnt/resize" - -[[constraint]] - name = "github.com/pkg/errors" - version = "0.8.0" - -[[constraint]] - name = "github.com/spf13/afero" - version = "1.0.2" - -[[constraint]] - name = "github.com/spf13/pflag" - version = "1.0.0" - -[prune] - go-tests = true - unused-packages = true diff --git a/vendor/github.com/jackmordaunt/icns/doc.go b/vendor/github.com/jackmordaunt/icns/doc.go deleted file mode 100644 index 4b3411f..0000000 --- a/vendor/github.com/jackmordaunt/icns/doc.go +++ /dev/null @@ -1,20 +0,0 @@ -// Package icns implements an encoder for Apple's `.icns` file format. -// Reference: "https://en.wikipedia.org/wiki/Apple_Icon_Image_format". -// -// icns files allow for high resolution icons to make your apps look sexy. -// The most common ways to generate icns files are 1. use `iconutil` which is -// a Mac native cli utility, or 2. use tools that wrap `ImageMagick` which adds -// a large dependency to your project for such a simple use case. -// -// With this library you can use pure Go to create icns files from any source -// image, given that you can decode it into an `image.Image`, without any -// heavyweight dependencies or subprocessing required. You can also use this -// library to create icns files on windows and linux. -// -// A small CLI app `icnsify` is provided to allow you to create icns files -// using this library from the command line. It supports piping, which is -// something `iconutil` does not do, making it substantially easier to wrap. -// -// Note: All icons within the icns are sized for high dpi retina screens, using -// the appropriate icns OSTypes. -package icns diff --git a/vendor/github.com/jackmordaunt/icns/error.go b/vendor/github.com/jackmordaunt/icns/error.go deleted file mode 100644 index 83b731c..0000000 --- a/vendor/github.com/jackmordaunt/icns/error.go +++ /dev/null @@ -1,22 +0,0 @@ -package icns - -import ( - "fmt" - "image" -) - -// ErrImageTooSmall is returned when the image is too small to process. -type ErrImageTooSmall struct { - need int - image image.Image -} - -func (err ErrImageTooSmall) Error() string { - b := err.image.Bounds().Max - format := "image is too small: %dx%d, need at least %dx%d" - return fmt.Sprintf(format, b.X, b.Y, err.need, err.need) -} - -func panicf(format string, values ...interface{}) { - panic(fmt.Sprintf(format, values...)) -} diff --git a/vendor/github.com/jackmordaunt/icns/icns.go b/vendor/github.com/jackmordaunt/icns/icns.go deleted file mode 100644 index ecd86b7..0000000 --- a/vendor/github.com/jackmordaunt/icns/icns.go +++ /dev/null @@ -1,170 +0,0 @@ -package icns - -import ( - "errors" - "image" - "io" - - "github.com/nfnt/resize" -) - -// Encoder encodes ICNS files from a source image. -type Encoder struct { - Wr io.Writer - Algorithm InterpolationFunction -} - -// NewEncoder initialises an encoder. -func NewEncoder(wr io.Writer) *Encoder { - return &Encoder{ - Wr: wr, - } -} - -// WithAlgorithm applies the interpolation function used to resize the image. -func (enc *Encoder) WithAlgorithm(a InterpolationFunction) *Encoder { - enc.Algorithm = a - return enc -} - -// Encode icns with the given configuration. -func (enc *Encoder) Encode(img image.Image) error { - if enc.Wr == nil { - return errors.New("cannot write to nil writer") - } - if img == nil { - return errors.New("cannot encode nil image") - } - iconset, err := NewIconSet(img, enc.Algorithm) - if err != nil { - return err - } - if _, err := iconset.WriteTo(enc.Wr); err != nil { - return err - } - return nil -} - -// Encode writes img to wr in ICNS format. -// img is assumed to be a rectangle; non-square dimensions will be squared -// without preserving the aspect ratio. -// Uses nearest neighbor as interpolation algorithm. -func Encode(wr io.Writer, img image.Image) error { - return NewEncoder(wr).Encode(img) -} - -// NewIconSet uses the source image to create an IconSet. -// If width != height, the image will be resized using the largest side without -// preserving the aspect ratio. -func NewIconSet(img image.Image, interp InterpolationFunction) (*IconSet, error) { - biggest := findNearestSize(img) - if biggest == 0 { - return nil, ErrImageTooSmall{image: img, need: 16} - } - icons := []*Icon{} - for _, size := range sizesFrom(biggest) { - t, ok := getTypeFromSize(size) - if !ok { - continue - } - iconImg := resize.Resize(size, size, img, interp) - icon := &Icon{ - Type: t, - Image: iconImg, - } - icons = append(icons, icon) - } - iconset := &IconSet{ - Icons: icons, - } - return iconset, nil -} - -// Big-endian. -// https://golang.org/src/image/png/writer.go -func writeUint32(b []uint8, u uint32) { - b[0] = uint8(u >> 24) - b[1] = uint8(u >> 16) - b[2] = uint8(u >> 8) - b[3] = uint8(u >> 0) -} - -var sizes = []uint{ - 1024, - 512, - 256, - 64, - 32, -} - -// findNearestSize finds the biggest icon size we can use for this image. -func findNearestSize(img image.Image) uint { - size := biggestSide(img) - for _, s := range sizes { - if size >= s { - return s - } - } - return 0 -} - -func biggestSide(img image.Image) uint { - var size uint - b := img.Bounds() - w, h := uint(b.Max.X), uint(b.Max.Y) - size = w - if h > size { - size = h - } - return size -} - -// sizesFrom returns a slice containing the sizes less than and including max. -func sizesFrom(max uint) []uint { - for ii, s := range sizes { - if s <= max { - return sizes[ii:len(sizes)] - } - } - return []uint{} -} - -// OsType is a 4 character identifier used to differentiate icon types. -type OsType struct { - ID string - Size uint -} - -var osTypes = []OsType{ - {ID: "ic10", Size: uint(1024)}, - {ID: "ic14", Size: uint(512)}, - {ID: "ic13", Size: uint(256)}, - {ID: "ic07", Size: uint(128)}, - {ID: "ic12", Size: uint(64)}, - {ID: "ic11", Size: uint(32)}, -} - -// getTypeFromSize returns the type for the given icon size (in px). -// The boolean indicates whether the type exists. -func getTypeFromSize(size uint) (OsType, bool) { - for _, t := range osTypes { - if t.Size == size { - return t, true - } - } - return OsType{}, false -} - -func getTypeFromID(ID string) (OsType, bool) { - for _, t := range osTypes { - if t.ID == ID { - return t, true - } - } - return OsType{}, false -} - -func osTypeFromID(ID string) OsType { - t, _ := getTypeFromID(ID) - return t -} diff --git a/vendor/github.com/jackmordaunt/icns/interpolation.go b/vendor/github.com/jackmordaunt/icns/interpolation.go deleted file mode 100644 index aedd4f5..0000000 --- a/vendor/github.com/jackmordaunt/icns/interpolation.go +++ /dev/null @@ -1,24 +0,0 @@ -package icns - -import ( - "github.com/nfnt/resize" -) - -// InterpolationFunction is the algorithm used to resize the image. -type InterpolationFunction = resize.InterpolationFunction - -// InterpolationFunction constants. -const ( - // Nearest-neighbor interpolation - NearestNeighbor InterpolationFunction = iota - // Bilinear interpolation - Bilinear - // Bicubic interpolation (with cubic hermite spline) - Bicubic - // Mitchell-Netravali interpolation - MitchellNetravali - // Lanczos interpolation (a=2) - Lanczos2 - // Lanczos interpolation (a=3) - Lanczos3 -) diff --git a/vendor/github.com/jackmordaunt/icns/reader.go b/vendor/github.com/jackmordaunt/icns/reader.go deleted file mode 100644 index cc0fc26..0000000 --- a/vendor/github.com/jackmordaunt/icns/reader.go +++ /dev/null @@ -1,79 +0,0 @@ -package icns - -import ( - "bytes" - "encoding/binary" - "fmt" - "image" - "io" - "io/ioutil" - - "github.com/pkg/errors" -) - -// Decode finds the largest icon listed in the icns file and returns it, -// ignoring all other sizes. The format returned will be whatever the icon data -// is, typically jpeg or png. -func Decode(r io.Reader) (image.Image, error) { - data, err := ioutil.ReadAll(r) - if err != nil { - return nil, err - } - icnsHeader := data[0:4] - if string(icnsHeader) != "icns" { - return nil, fmt.Errorf("invalid header for icns file") - } - fileSize := binary.BigEndian.Uint32(data[4:8]) - icons := []iconReader{} - read := uint32(8) - for read < fileSize { - next := data[read : read+4] - read += 4 - switch string(next) { - case "TOC ": - read += 4 - continue - case "icnV": - read += 4 - continue - } - if isOsType(string(next)) { - iconSize := binary.BigEndian.Uint32(data[read : read+4]) - read += 4 - iconData := data[read : read+iconSize] - read += iconSize - icons = append(icons, iconReader{ - OsType: osTypeFromID(string(next)), - r: bytes.NewBuffer(iconData), - }) - } - } - if len(icons) == 0 { - return nil, fmt.Errorf("no icons found") - } - var biggest iconReader - for _, icon := range icons { - if icon.Size > biggest.Size { - biggest = icon - } - } - img, _, err := image.Decode(biggest.r) - if err != nil { - return nil, errors.Wrap(err, "decoding largest image") - } - return img, nil -} - -type iconReader struct { - OsType - r io.Reader -} - -func isOsType(ID string) bool { - _, ok := getTypeFromID(ID) - return ok -} - -func init() { - image.RegisterFormat("icns", "icns", Decode, nil) -} diff --git a/vendor/github.com/jackmordaunt/icns/readme.md b/vendor/github.com/jackmordaunt/icns/readme.md deleted file mode 100644 index 436c0ab..0000000 --- a/vendor/github.com/jackmordaunt/icns/readme.md +++ /dev/null @@ -1,64 +0,0 @@ -# icns - -Easily convert `.jpg` and `.png` to `.icns` with the command line tool `icnsify`, or use the library to convert from any `image.Image` to `.icns`. - -`go get github.com/jackmordaunt/icns` - -`icns` files allow for high resolution icons to make your apps look sexy. The most common ways to generate icns files are: - -1. `iconutil`, which is a Mac native cli utility. -2. `ImageMagick` which adds a large dependency to your project for such a simple use case. - -With this library you can use pure Go to create `icns` files from any source image, given that you can decode it into an `image.Image`, without any heavyweight dependencies or subprocessing required. You can also use it to create icns files on windows and linux (thanks Go). - -A small CLI app `icnsify` is provided allowing you to create icns files using this library from the command line. It supports piping, which is something `iconutil` does not do, making it substantially easier to wrap or chuck into a shell pipeline. - -Note: All icons within the `icns` are sized for high dpi retina screens, using the appropriate `icns` OSTypes. - -## Command Line - -Pipe it - -`cat icon.png | icnsify | cat > icon.icns` - -`cat icon.icns | icnsify | cat > icon.png` - -Standard - -`icnsify -i icon.png -o icon.icns` - -`icnsify -i icon.icns -o icon.png` - -## Library Usage - -```go -func main() { - pngf, err := os.Open("path/to/icon.png") - if err != nil { - log.Fatalf("opening source image: %v", err) - } - defer pngf.Close() - srcImg, _, err := image.Decode(pngf) - if err != nil { - log.Fatalf("decoding source image: %v", err) - } - dest, err := os.Create("path/to/icon.icns") - if err != nil { - log.Fatalf("opening destination file: %v", err) - } - defer dest.Close() - if err := icns.Encode(dest, srcImg); err != nil { - log.Fatalf("encoding icns: %v", err) - } -} -``` - -## Roadmap - -* [x] Encoder: `image.Image -> .icns` -* [x] Command Line Interface - * [x] Encoding - * [x] Pipe support - * [x] Decoding -* [x] Implement Decoder: `.icns -> image.Image` -* [ ] Symmetric test: `decode(encode(img)) == img` diff --git a/vendor/github.com/jackmordaunt/icns/writer.go b/vendor/github.com/jackmordaunt/icns/writer.go deleted file mode 100644 index 5e73710..0000000 --- a/vendor/github.com/jackmordaunt/icns/writer.go +++ /dev/null @@ -1,137 +0,0 @@ -package icns - -import ( - "bytes" - "image" - "image/png" - "io" -) - -// Icon encodes an icns icon. -type Icon struct { - Type OsType - Image image.Image - - header [8]byte - headerSet bool - data []byte -} - -// WriteTo encodes the icon into wr. -func (i *Icon) WriteTo(wr io.Writer) (int64, error) { - var written int64 - if err := i.encodeImage(); err != nil { - return written, err - } - size, err := i.writeHeader(wr) - written += size - if err != nil { - return written, err - } - size, err = i.writeData(wr) - written += size - if err != nil { - return written, err - } - return written, nil -} - -func (i *Icon) encodeImage() error { - if len(i.data) > 0 { - return nil - } - data, err := encodeImage(i.Image) - if err != nil { - return err - } - i.data = data - return nil -} - -func encodeImage(img image.Image) ([]byte, error) { - buf := bytes.NewBuffer(nil) - if err := png.Encode(buf, img); err != nil { - return nil, err - } - return buf.Bytes(), nil -} - -func (i *Icon) writeHeader(wr io.Writer) (int64, error) { - if !i.headerSet { - defer func() { i.headerSet = true }() - i.header[0] = i.Type.ID[0] - i.header[1] = i.Type.ID[1] - i.header[2] = i.Type.ID[2] - i.header[3] = i.Type.ID[3] - length := uint32(len(i.data) + 8) - writeUint32(i.header[4:8], length) - } - written, err := wr.Write(i.header[:8]) - return int64(written), err -} - -func (i *Icon) writeData(wr io.Writer) (int64, error) { - written, err := wr.Write(i.data) - return int64(written), err -} - -// IconSet encodes a set of icons into an ICNS file. -type IconSet struct { - Icons []*Icon - - header [8]byte - headerSet bool - data []byte -} - -// WriteTo writes the ICNS file to wr. -func (s *IconSet) WriteTo(wr io.Writer) (int64, error) { - var written int64 - if err := s.encodeIcons(); err != nil { - return written, err - } - size, err := s.writeHeader(wr) - written += size - if err != nil { - return written, err - } - size, err = s.writeData(wr) - written += size - if err != nil { - return written, err - } - return written, nil -} - -func (s *IconSet) encodeIcons() error { - if len(s.data) > 0 { - return nil - } - buf := bytes.NewBuffer(nil) - for _, icon := range s.Icons { - if _, err := icon.WriteTo(buf); err != nil { - return err - } - } - s.data = buf.Bytes() - return nil -} - -func (s *IconSet) writeHeader(wr io.Writer) (int64, error) { - if !s.headerSet { - defer func() { s.headerSet = true }() - s.header[0] = 'i' - s.header[1] = 'c' - s.header[2] = 'n' - s.header[3] = 's' - length := uint32(len(s.data) + 8) - writeUint32(s.header[4:8], length) - } - written, err := wr.Write(s.header[:8]) - return int64(written), err -} - -func (s *IconSet) writeData(wr io.Writer) (int64, error) { - written, err := wr.Write(s.data) - return int64(written), err -} diff --git a/vendor/github.com/kennygrant/sanitize/.gitignore b/vendor/github.com/kennygrant/sanitize/.gitignore deleted file mode 100644 index 0026861..0000000 --- a/vendor/github.com/kennygrant/sanitize/.gitignore +++ /dev/null @@ -1,22 +0,0 @@ -# Compiled Object files, Static and Dynamic libs (Shared Objects) -*.o -*.a -*.so - -# Folders -_obj -_test - -# Architecture specific extensions/prefixes -*.[568vq] -[568vq].out - -*.cgo1.go -*.cgo2.c -_cgo_defun.c -_cgo_gotypes.go -_cgo_export.* - -_testmain.go - -*.exe diff --git a/vendor/github.com/kennygrant/sanitize/.travis.yml b/vendor/github.com/kennygrant/sanitize/.travis.yml deleted file mode 100644 index 4f2ee4d..0000000 --- a/vendor/github.com/kennygrant/sanitize/.travis.yml +++ /dev/null @@ -1 +0,0 @@ -language: go diff --git a/vendor/github.com/kennygrant/sanitize/README.md b/vendor/github.com/kennygrant/sanitize/README.md deleted file mode 100644 index 4401ef7..0000000 --- a/vendor/github.com/kennygrant/sanitize/README.md +++ /dev/null @@ -1,62 +0,0 @@ -sanitize [![GoDoc](https://godoc.org/github.com/kennygrant/sanitize?status.svg)](https://godoc.org/github.com/kennygrant/sanitize) [![Go Report Card](https://goreportcard.com/badge/github.com/kennygrant/sanitize)](https://goreportcard.com/report/github.com/kennygrant/sanitize) [![CircleCI](https://circleci.com/gh/kennygrant/sanitize.svg?style=svg)](https://circleci.com/gh/kennygrant/sanitize) -======== - -Package sanitize provides functions to sanitize html and paths with go (golang). - -FUNCTIONS - - -```go -sanitize.Accents(s string) string -``` - -Accents replaces a set of accented characters with ascii equivalents. - -```go -sanitize.BaseName(s string) string -``` - -BaseName makes a string safe to use in a file name, producing a sanitized basename replacing . or / with -. Unlike Name no attempt is made to normalise text as a path. - -```go -sanitize.HTML(s string) string -``` - -HTML strips html tags with a very simple parser, replace common entities, and escape < and > in the result. The result is intended to be used as plain text. - -```go -sanitize.HTMLAllowing(s string, args...[]string) (string, error) -``` - -HTMLAllowing parses html and allow certain tags and attributes from the lists optionally specified by args - args[0] is a list of allowed tags, args[1] is a list of allowed attributes. If either is missing default sets are used. - -```go -sanitize.Name(s string) string -``` - -Name makes a string safe to use in a file name by first finding the path basename, then replacing non-ascii characters. - -```go -sanitize.Path(s string) string -``` - -Path makes a string safe to use as an url path. - - -Changes -------- - -Version 1.2 - -Adjusted HTML function to avoid linter warning -Added more tests from https://githubengineering.com/githubs-post-csp-journey/ -Chnaged name of license file -Added badges and change log to readme - -Version 1.1 -Fixed type in comments. -Merge pull request from Povilas Balzaravicius Pawka - - replace br tags with newline even when they contain a space - -Version 1.0 -First release \ No newline at end of file diff --git a/vendor/github.com/kennygrant/sanitize/sanitize.go b/vendor/github.com/kennygrant/sanitize/sanitize.go deleted file mode 100644 index 2932209..0000000 --- a/vendor/github.com/kennygrant/sanitize/sanitize.go +++ /dev/null @@ -1,388 +0,0 @@ -// Package sanitize provides functions for sanitizing text. -package sanitize - -import ( - "bytes" - "html" - "html/template" - "io" - "path" - "regexp" - "strings" - - parser "golang.org/x/net/html" -) - -var ( - ignoreTags = []string{"title", "script", "style", "iframe", "frame", "frameset", "noframes", "noembed", "embed", "applet", "object", "base"} - - defaultTags = []string{"h1", "h2", "h3", "h4", "h5", "h6", "div", "span", "hr", "p", "br", "b", "i", "strong", "em", "ol", "ul", "li", "a", "img", "pre", "code", "blockquote", "article", "section"} - - defaultAttributes = []string{"id", "class", "src", "href", "title", "alt", "name", "rel"} -) - -// HTMLAllowing sanitizes html, allowing some tags. -// Arrays of allowed tags and allowed attributes may optionally be passed as the second and third arguments. -func HTMLAllowing(s string, args ...[]string) (string, error) { - - allowedTags := defaultTags - if len(args) > 0 { - allowedTags = args[0] - } - allowedAttributes := defaultAttributes - if len(args) > 1 { - allowedAttributes = args[1] - } - - // Parse the html - tokenizer := parser.NewTokenizer(strings.NewReader(s)) - - buffer := bytes.NewBufferString("") - ignore := "" - - for { - tokenType := tokenizer.Next() - token := tokenizer.Token() - - switch tokenType { - - case parser.ErrorToken: - err := tokenizer.Err() - if err == io.EOF { - return buffer.String(), nil - } - return "", err - - case parser.StartTagToken: - - if len(ignore) == 0 && includes(allowedTags, token.Data) { - token.Attr = cleanAttributes(token.Attr, allowedAttributes) - buffer.WriteString(token.String()) - } else if includes(ignoreTags, token.Data) { - ignore = token.Data - } - - case parser.SelfClosingTagToken: - - if len(ignore) == 0 && includes(allowedTags, token.Data) { - token.Attr = cleanAttributes(token.Attr, allowedAttributes) - buffer.WriteString(token.String()) - } else if token.Data == ignore { - ignore = "" - } - - case parser.EndTagToken: - if len(ignore) == 0 && includes(allowedTags, token.Data) { - token.Attr = []parser.Attribute{} - buffer.WriteString(token.String()) - } else if token.Data == ignore { - ignore = "" - } - - case parser.TextToken: - // We allow text content through, unless ignoring this entire tag and its contents (including other tags) - if ignore == "" { - buffer.WriteString(token.String()) - } - case parser.CommentToken: - // We ignore comments by default - case parser.DoctypeToken: - // We ignore doctypes by default - html5 does not require them and this is intended for sanitizing snippets of text - default: - // We ignore unknown token types by default - - } - - } - -} - -// HTML strips html tags, replace common entities, and escapes <>&;'" in the result. -// Note the returned text may contain entities as it is escaped by HTMLEscapeString, and most entities are not translated. -func HTML(s string) (output string) { - - // Shortcut strings with no tags in them - if !strings.ContainsAny(s, "<>") { - output = s - } else { - - // First remove line breaks etc as these have no meaning outside html tags (except pre) - // this means pre sections will lose formatting... but will result in less unintentional paras. - s = strings.Replace(s, "\n", "", -1) - - // Then replace line breaks with newlines, to preserve that formatting - s = strings.Replace(s, "

", "\n", -1) - s = strings.Replace(s, "
", "\n", -1) - s = strings.Replace(s, "
", "\n", -1) - s = strings.Replace(s, "
", "\n", -1) - s = strings.Replace(s, "
", "\n", -1) - - // Walk through the string removing all tags - b := bytes.NewBufferString("") - inTag := false - for _, r := range s { - switch r { - case '<': - inTag = true - case '>': - inTag = false - default: - if !inTag { - b.WriteRune(r) - } - } - } - output = b.String() - } - - // Remove a few common harmless entities, to arrive at something more like plain text - output = strings.Replace(output, "‘", "'", -1) - output = strings.Replace(output, "’", "'", -1) - output = strings.Replace(output, "“", "\"", -1) - output = strings.Replace(output, "”", "\"", -1) - output = strings.Replace(output, " ", " ", -1) - output = strings.Replace(output, """, "\"", -1) - output = strings.Replace(output, "'", "'", -1) - - // Translate some entities into their plain text equivalent (for example accents, if encoded as entities) - output = html.UnescapeString(output) - - // In case we have missed any tags above, escape the text - removes <, >, &, ' and ". - output = template.HTMLEscapeString(output) - - // After processing, remove some harmless entities &, ' and " which are encoded by HTMLEscapeString - output = strings.Replace(output, """, "\"", -1) - output = strings.Replace(output, "'", "'", -1) - output = strings.Replace(output, "& ", "& ", -1) // NB space after - output = strings.Replace(output, "&amp; ", "& ", -1) // NB space after - - return output -} - -// We are very restrictive as this is intended for ascii url slugs -var illegalPath = regexp.MustCompile(`[^[:alnum:]\~\-\./]`) - -// Path makes a string safe to use as a URL path, -// removing accents and replacing separators with -. -// The path may still start at / and is not intended -// for use as a file system path without prefix. -func Path(s string) string { - // Start with lowercase string - filePath := strings.ToLower(s) - filePath = strings.Replace(filePath, "..", "", -1) - filePath = path.Clean(filePath) - - // Remove illegal characters for paths, flattening accents - // and replacing some common separators with - - filePath = cleanString(filePath, illegalPath) - - // NB this may be of length 0, caller must check - return filePath -} - -// Remove all other unrecognised characters apart from -var illegalName = regexp.MustCompile(`[^[:alnum:]-.]`) - -// Name makes a string safe to use in a file name by first finding the path basename, then replacing non-ascii characters. -func Name(s string) string { - // Start with lowercase string - fileName := strings.ToLower(s) - fileName = path.Clean(path.Base(fileName)) - - // Remove illegal characters for names, replacing some common separators with - - fileName = cleanString(fileName, illegalName) - - // NB this may be of length 0, caller must check - return fileName -} - -// Replace these separators with - -var baseNameSeparators = regexp.MustCompile(`[./]`) - -// BaseName makes a string safe to use in a file name, producing a sanitized basename replacing . or / with -. -// No attempt is made to normalise a path or normalise case. -func BaseName(s string) string { - - // Replace certain joining characters with a dash - baseName := baseNameSeparators.ReplaceAllString(s, "-") - - // Remove illegal characters for names, replacing some common separators with - - baseName = cleanString(baseName, illegalName) - - // NB this may be of length 0, caller must check - return baseName -} - -// A very limited list of transliterations to catch common european names translated to urls. -// This set could be expanded with at least caps and many more characters. -var transliterations = map[rune]string{ - 'À': "A", - 'Á': "A", - 'Â': "A", - 'Ã': "A", - 'Ä': "A", - 'Å': "AA", - 'Æ': "AE", - 'Ç': "C", - 'È': "E", - 'É': "E", - 'Ê': "E", - 'Ë': "E", - 'Ì': "I", - 'Í': "I", - 'Î': "I", - 'Ï': "I", - 'Ð': "D", - 'Ł': "L", - 'Ñ': "N", - 'Ò': "O", - 'Ó': "O", - 'Ô': "O", - 'Õ': "O", - 'Ö': "OE", - 'Ø': "OE", - 'Œ': "OE", - 'Ù': "U", - 'Ú': "U", - 'Ü': "UE", - 'Û': "U", - 'Ý': "Y", - 'Þ': "TH", - 'ẞ': "SS", - 'à': "a", - 'á': "a", - 'â': "a", - 'ã': "a", - 'ä': "ae", - 'å': "aa", - 'æ': "ae", - 'ç': "c", - 'è': "e", - 'é': "e", - 'ê': "e", - 'ë': "e", - 'ì': "i", - 'í': "i", - 'î': "i", - 'ï': "i", - 'ð': "d", - 'ł': "l", - 'ñ': "n", - 'ń': "n", - 'ò': "o", - 'ó': "o", - 'ô': "o", - 'õ': "o", - 'ō': "o", - 'ö': "oe", - 'ø': "oe", - 'œ': "oe", - 'ś': "s", - 'ù': "u", - 'ú': "u", - 'û': "u", - 'ū': "u", - 'ü': "ue", - 'ý': "y", - 'ÿ': "y", - 'ż': "z", - 'þ': "th", - 'ß': "ss", -} - -// Accents replaces a set of accented characters with ascii equivalents. -func Accents(s string) string { - // Replace some common accent characters - b := bytes.NewBufferString("") - for _, c := range s { - // Check transliterations first - if val, ok := transliterations[c]; ok { - b.WriteString(val) - } else { - b.WriteRune(c) - } - } - return b.String() -} - -var ( - // If the attribute contains data: or javascript: anywhere, ignore it - // we don't allow this in attributes as it is so frequently used for xss - // NB we allow spaces in the value, and lowercase. - illegalAttr = regexp.MustCompile(`(d\s*a\s*t\s*a|j\s*a\s*v\s*a\s*s\s*c\s*r\s*i\s*p\s*t\s*)\s*:`) - - // We are far more restrictive with href attributes. - legalHrefAttr = regexp.MustCompile(`\A[/#][^/\\]?|mailto:|http://|https://`) -) - -// cleanAttributes returns an array of attributes after removing malicious ones. -func cleanAttributes(a []parser.Attribute, allowed []string) []parser.Attribute { - if len(a) == 0 { - return a - } - - var cleaned []parser.Attribute - for _, attr := range a { - if includes(allowed, attr.Key) { - - val := strings.ToLower(attr.Val) - - // Check for illegal attribute values - if illegalAttr.FindString(val) != "" { - attr.Val = "" - } - - // Check for legal href values - / mailto:// http:// or https:// - if attr.Key == "href" { - if legalHrefAttr.FindString(val) == "" { - attr.Val = "" - } - } - - // If we still have an attribute, append it to the array - if attr.Val != "" { - cleaned = append(cleaned, attr) - } - } - } - return cleaned -} - -// A list of characters we consider separators in normal strings and replace with our canonical separator - rather than removing. -var ( - separators = regexp.MustCompile(`[ &_=+:]`) - - dashes = regexp.MustCompile(`[\-]+`) -) - -// cleanString replaces separators with - and removes characters listed in the regexp provided from string. -// Accents, spaces, and all characters not in A-Za-z0-9 are replaced. -func cleanString(s string, r *regexp.Regexp) string { - - // Remove any trailing space to avoid ending on - - s = strings.Trim(s, " ") - - // Flatten accents first so that if we remove non-ascii we still get a legible name - s = Accents(s) - - // Replace certain joining characters with a dash - s = separators.ReplaceAllString(s, "-") - - // Remove all other unrecognised characters - NB we do allow any printable characters - s = r.ReplaceAllString(s, "") - - // Remove any multiple dashes caused by replacements above - s = dashes.ReplaceAllString(s, "-") - - return s -} - -// includes checks for inclusion of a string in a []string. -func includes(a []string, s string) bool { - for _, as := range a { - if as == s { - return true - } - } - return false -} diff --git a/vendor/golang.org/x/text/LICENSE b/vendor/github.com/klauspost/compress/LICENSE similarity index 92% rename from vendor/golang.org/x/text/LICENSE rename to vendor/github.com/klauspost/compress/LICENSE index 6a66aea..1eb75ef 100644 --- a/vendor/golang.org/x/text/LICENSE +++ b/vendor/github.com/klauspost/compress/LICENSE @@ -1,4 +1,5 @@ -Copyright (c) 2009 The Go Authors. All rights reserved. +Copyright (c) 2012 The Go Authors. All rights reserved. +Copyright (c) 2019 Klaus Post. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are diff --git a/vendor/github.com/klauspost/compress/flate/deflate.go b/vendor/github.com/klauspost/compress/flate/deflate.go new file mode 100644 index 0000000..5283ac5 --- /dev/null +++ b/vendor/github.com/klauspost/compress/flate/deflate.go @@ -0,0 +1,820 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Copyright (c) 2015 Klaus Post +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package flate + +import ( + "fmt" + "io" + "math" +) + +const ( + NoCompression = 0 + BestSpeed = 1 + BestCompression = 9 + DefaultCompression = -1 + + // HuffmanOnly disables Lempel-Ziv match searching and only performs Huffman + // entropy encoding. This mode is useful in compressing data that has + // already been compressed with an LZ style algorithm (e.g. Snappy or LZ4) + // that lacks an entropy encoder. Compression gains are achieved when + // certain bytes in the input stream occur more frequently than others. + // + // Note that HuffmanOnly produces a compressed output that is + // RFC 1951 compliant. That is, any valid DEFLATE decompressor will + // continue to be able to decompress this output. + HuffmanOnly = -2 + ConstantCompression = HuffmanOnly // compatibility alias. + + logWindowSize = 15 + windowSize = 1 << logWindowSize + windowMask = windowSize - 1 + logMaxOffsetSize = 15 // Standard DEFLATE + minMatchLength = 4 // The smallest match that the compressor looks for + maxMatchLength = 258 // The longest match for the compressor + minOffsetSize = 1 // The shortest offset that makes any sense + + // The maximum number of tokens we put into a single flat block, just too + // stop things from getting too large. + maxFlateBlockTokens = 1 << 14 + maxStoreBlockSize = 65535 + hashBits = 17 // After 17 performance degrades + hashSize = 1 << hashBits + hashMask = (1 << hashBits) - 1 + hashShift = (hashBits + minMatchLength - 1) / minMatchLength + maxHashOffset = 1 << 24 + + skipNever = math.MaxInt32 + + debugDeflate = false +) + +type compressionLevel struct { + good, lazy, nice, chain, fastSkipHashing, level int +} + +// Compression levels have been rebalanced from zlib deflate defaults +// to give a bigger spread in speed and compression. +// See https://blog.klauspost.com/rebalancing-deflate-compression-levels/ +var levels = []compressionLevel{ + {}, // 0 + // Level 1-6 uses specialized algorithm - values not used + {0, 0, 0, 0, 0, 1}, + {0, 0, 0, 0, 0, 2}, + {0, 0, 0, 0, 0, 3}, + {0, 0, 0, 0, 0, 4}, + {0, 0, 0, 0, 0, 5}, + {0, 0, 0, 0, 0, 6}, + // Levels 7-9 use increasingly more lazy matching + // and increasingly stringent conditions for "good enough". + {8, 8, 24, 16, skipNever, 7}, + {10, 16, 24, 64, skipNever, 8}, + {32, 258, 258, 4096, skipNever, 9}, +} + +// advancedState contains state for the advanced levels, with bigger hash tables, etc. +type advancedState struct { + // deflate state + length int + offset int + maxInsertIndex int + + // Input hash chains + // hashHead[hashValue] contains the largest inputIndex with the specified hash value + // If hashHead[hashValue] is within the current window, then + // hashPrev[hashHead[hashValue] & windowMask] contains the previous index + // with the same hash value. + chainHead int + hashHead [hashSize]uint32 + hashPrev [windowSize]uint32 + hashOffset int + + // input window: unprocessed data is window[index:windowEnd] + index int + hashMatch [maxMatchLength + minMatchLength]uint32 + + hash uint32 + ii uint16 // position of last match, intended to overflow to reset. +} + +type compressor struct { + compressionLevel + + w *huffmanBitWriter + + // compression algorithm + fill func(*compressor, []byte) int // copy data to window + step func(*compressor) // process window + + window []byte + windowEnd int + blockStart int // window index where current tokens start + err error + + // queued output tokens + tokens tokens + fast fastEnc + state *advancedState + + sync bool // requesting flush + byteAvailable bool // if true, still need to process window[index-1]. +} + +func (d *compressor) fillDeflate(b []byte) int { + s := d.state + if s.index >= 2*windowSize-(minMatchLength+maxMatchLength) { + // shift the window by windowSize + copy(d.window[:], d.window[windowSize:2*windowSize]) + s.index -= windowSize + d.windowEnd -= windowSize + if d.blockStart >= windowSize { + d.blockStart -= windowSize + } else { + d.blockStart = math.MaxInt32 + } + s.hashOffset += windowSize + if s.hashOffset > maxHashOffset { + delta := s.hashOffset - 1 + s.hashOffset -= delta + s.chainHead -= delta + // Iterate over slices instead of arrays to avoid copying + // the entire table onto the stack (Issue #18625). + for i, v := range s.hashPrev[:] { + if int(v) > delta { + s.hashPrev[i] = uint32(int(v) - delta) + } else { + s.hashPrev[i] = 0 + } + } + for i, v := range s.hashHead[:] { + if int(v) > delta { + s.hashHead[i] = uint32(int(v) - delta) + } else { + s.hashHead[i] = 0 + } + } + } + } + n := copy(d.window[d.windowEnd:], b) + d.windowEnd += n + return n +} + +func (d *compressor) writeBlock(tok *tokens, index int, eof bool) error { + if index > 0 || eof { + var window []byte + if d.blockStart <= index { + window = d.window[d.blockStart:index] + } + d.blockStart = index + d.w.writeBlock(tok, eof, window) + return d.w.err + } + return nil +} + +// writeBlockSkip writes the current block and uses the number of tokens +// to determine if the block should be stored on no matches, or +// only huffman encoded. +func (d *compressor) writeBlockSkip(tok *tokens, index int, eof bool) error { + if index > 0 || eof { + if d.blockStart <= index { + window := d.window[d.blockStart:index] + // If we removed less than a 64th of all literals + // we huffman compress the block. + if int(tok.n) > len(window)-int(tok.n>>6) { + d.w.writeBlockHuff(eof, window, d.sync) + } else { + // Write a dynamic huffman block. + d.w.writeBlockDynamic(tok, eof, window, d.sync) + } + } else { + d.w.writeBlock(tok, eof, nil) + } + d.blockStart = index + return d.w.err + } + return nil +} + +// fillWindow will fill the current window with the supplied +// dictionary and calculate all hashes. +// This is much faster than doing a full encode. +// Should only be used after a start/reset. +func (d *compressor) fillWindow(b []byte) { + // Do not fill window if we are in store-only or huffman mode. + if d.level <= 0 { + return + } + if d.fast != nil { + // encode the last data, but discard the result + if len(b) > maxMatchOffset { + b = b[len(b)-maxMatchOffset:] + } + d.fast.Encode(&d.tokens, b) + d.tokens.Reset() + return + } + s := d.state + // If we are given too much, cut it. + if len(b) > windowSize { + b = b[len(b)-windowSize:] + } + // Add all to window. + n := copy(d.window[d.windowEnd:], b) + + // Calculate 256 hashes at the time (more L1 cache hits) + loops := (n + 256 - minMatchLength) / 256 + for j := 0; j < loops; j++ { + startindex := j * 256 + end := startindex + 256 + minMatchLength - 1 + if end > n { + end = n + } + tocheck := d.window[startindex:end] + dstSize := len(tocheck) - minMatchLength + 1 + + if dstSize <= 0 { + continue + } + + dst := s.hashMatch[:dstSize] + bulkHash4(tocheck, dst) + var newH uint32 + for i, val := range dst { + di := i + startindex + newH = val & hashMask + // Get previous value with the same hash. + // Our chain should point to the previous value. + s.hashPrev[di&windowMask] = s.hashHead[newH] + // Set the head of the hash chain to us. + s.hashHead[newH] = uint32(di + s.hashOffset) + } + s.hash = newH + } + // Update window information. + d.windowEnd += n + s.index = n +} + +// Try to find a match starting at index whose length is greater than prevSize. +// We only look at chainCount possibilities before giving up. +// pos = s.index, prevHead = s.chainHead-s.hashOffset, prevLength=minMatchLength-1, lookahead +func (d *compressor) findMatch(pos int, prevHead int, prevLength int, lookahead int) (length, offset int, ok bool) { + minMatchLook := maxMatchLength + if lookahead < minMatchLook { + minMatchLook = lookahead + } + + win := d.window[0 : pos+minMatchLook] + + // We quit when we get a match that's at least nice long + nice := len(win) - pos + if d.nice < nice { + nice = d.nice + } + + // If we've got a match that's good enough, only look in 1/4 the chain. + tries := d.chain + length = prevLength + if length >= d.good { + tries >>= 2 + } + + wEnd := win[pos+length] + wPos := win[pos:] + minIndex := pos - windowSize + + for i := prevHead; tries > 0; tries-- { + if wEnd == win[i+length] { + n := matchLen(win[i:i+minMatchLook], wPos) + + if n > length && (n > minMatchLength || pos-i <= 4096) { + length = n + offset = pos - i + ok = true + if n >= nice { + // The match is good enough that we don't try to find a better one. + break + } + wEnd = win[pos+n] + } + } + if i == minIndex { + // hashPrev[i & windowMask] has already been overwritten, so stop now. + break + } + i = int(d.state.hashPrev[i&windowMask]) - d.state.hashOffset + if i < minIndex || i < 0 { + break + } + } + return +} + +func (d *compressor) writeStoredBlock(buf []byte) error { + if d.w.writeStoredHeader(len(buf), false); d.w.err != nil { + return d.w.err + } + d.w.writeBytes(buf) + return d.w.err +} + +// hash4 returns a hash representation of the first 4 bytes +// of the supplied slice. +// The caller must ensure that len(b) >= 4. +func hash4(b []byte) uint32 { + b = b[:4] + return hash4u(uint32(b[3])|uint32(b[2])<<8|uint32(b[1])<<16|uint32(b[0])<<24, hashBits) +} + +// bulkHash4 will compute hashes using the same +// algorithm as hash4 +func bulkHash4(b []byte, dst []uint32) { + if len(b) < 4 { + return + } + hb := uint32(b[3]) | uint32(b[2])<<8 | uint32(b[1])<<16 | uint32(b[0])<<24 + dst[0] = hash4u(hb, hashBits) + end := len(b) - 4 + 1 + for i := 1; i < end; i++ { + hb = (hb << 8) | uint32(b[i+3]) + dst[i] = hash4u(hb, hashBits) + } +} + +func (d *compressor) initDeflate() { + d.window = make([]byte, 2*windowSize) + d.byteAvailable = false + d.err = nil + if d.state == nil { + return + } + s := d.state + s.index = 0 + s.hashOffset = 1 + s.length = minMatchLength - 1 + s.offset = 0 + s.hash = 0 + s.chainHead = -1 +} + +// deflateLazy is the same as deflate, but with d.fastSkipHashing == skipNever, +// meaning it always has lazy matching on. +func (d *compressor) deflateLazy() { + s := d.state + // Sanity enables additional runtime tests. + // It's intended to be used during development + // to supplement the currently ad-hoc unit tests. + const sanity = debugDeflate + + if d.windowEnd-s.index < minMatchLength+maxMatchLength && !d.sync { + return + } + + s.maxInsertIndex = d.windowEnd - (minMatchLength - 1) + if s.index < s.maxInsertIndex { + s.hash = hash4(d.window[s.index : s.index+minMatchLength]) + } + + for { + if sanity && s.index > d.windowEnd { + panic("index > windowEnd") + } + lookahead := d.windowEnd - s.index + if lookahead < minMatchLength+maxMatchLength { + if !d.sync { + return + } + if sanity && s.index > d.windowEnd { + panic("index > windowEnd") + } + if lookahead == 0 { + // Flush current output block if any. + if d.byteAvailable { + // There is still one pending token that needs to be flushed + d.tokens.AddLiteral(d.window[s.index-1]) + d.byteAvailable = false + } + if d.tokens.n > 0 { + if d.err = d.writeBlock(&d.tokens, s.index, false); d.err != nil { + return + } + d.tokens.Reset() + } + return + } + } + if s.index < s.maxInsertIndex { + // Update the hash + s.hash = hash4(d.window[s.index : s.index+minMatchLength]) + ch := s.hashHead[s.hash&hashMask] + s.chainHead = int(ch) + s.hashPrev[s.index&windowMask] = ch + s.hashHead[s.hash&hashMask] = uint32(s.index + s.hashOffset) + } + prevLength := s.length + prevOffset := s.offset + s.length = minMatchLength - 1 + s.offset = 0 + minIndex := s.index - windowSize + if minIndex < 0 { + minIndex = 0 + } + + if s.chainHead-s.hashOffset >= minIndex && lookahead > prevLength && prevLength < d.lazy { + if newLength, newOffset, ok := d.findMatch(s.index, s.chainHead-s.hashOffset, minMatchLength-1, lookahead); ok { + s.length = newLength + s.offset = newOffset + } + } + if prevLength >= minMatchLength && s.length <= prevLength { + // There was a match at the previous step, and the current match is + // not better. Output the previous match. + d.tokens.AddMatch(uint32(prevLength-3), uint32(prevOffset-minOffsetSize)) + + // Insert in the hash table all strings up to the end of the match. + // index and index-1 are already inserted. If there is not enough + // lookahead, the last two strings are not inserted into the hash + // table. + newIndex := s.index + prevLength - 1 + // Calculate missing hashes + end := newIndex + if end > s.maxInsertIndex { + end = s.maxInsertIndex + } + end += minMatchLength - 1 + startindex := s.index + 1 + if startindex > s.maxInsertIndex { + startindex = s.maxInsertIndex + } + tocheck := d.window[startindex:end] + dstSize := len(tocheck) - minMatchLength + 1 + if dstSize > 0 { + dst := s.hashMatch[:dstSize] + bulkHash4(tocheck, dst) + var newH uint32 + for i, val := range dst { + di := i + startindex + newH = val & hashMask + // Get previous value with the same hash. + // Our chain should point to the previous value. + s.hashPrev[di&windowMask] = s.hashHead[newH] + // Set the head of the hash chain to us. + s.hashHead[newH] = uint32(di + s.hashOffset) + } + s.hash = newH + } + + s.index = newIndex + d.byteAvailable = false + s.length = minMatchLength - 1 + if d.tokens.n == maxFlateBlockTokens { + // The block includes the current character + if d.err = d.writeBlock(&d.tokens, s.index, false); d.err != nil { + return + } + d.tokens.Reset() + } + } else { + // Reset, if we got a match this run. + if s.length >= minMatchLength { + s.ii = 0 + } + // We have a byte waiting. Emit it. + if d.byteAvailable { + s.ii++ + d.tokens.AddLiteral(d.window[s.index-1]) + if d.tokens.n == maxFlateBlockTokens { + if d.err = d.writeBlock(&d.tokens, s.index, false); d.err != nil { + return + } + d.tokens.Reset() + } + s.index++ + + // If we have a long run of no matches, skip additional bytes + // Resets when s.ii overflows after 64KB. + if s.ii > 31 { + n := int(s.ii >> 5) + for j := 0; j < n; j++ { + if s.index >= d.windowEnd-1 { + break + } + + d.tokens.AddLiteral(d.window[s.index-1]) + if d.tokens.n == maxFlateBlockTokens { + if d.err = d.writeBlock(&d.tokens, s.index, false); d.err != nil { + return + } + d.tokens.Reset() + } + s.index++ + } + // Flush last byte + d.tokens.AddLiteral(d.window[s.index-1]) + d.byteAvailable = false + // s.length = minMatchLength - 1 // not needed, since s.ii is reset above, so it should never be > minMatchLength + if d.tokens.n == maxFlateBlockTokens { + if d.err = d.writeBlock(&d.tokens, s.index, false); d.err != nil { + return + } + d.tokens.Reset() + } + } + } else { + s.index++ + d.byteAvailable = true + } + } + } +} + +func (d *compressor) store() { + if d.windowEnd > 0 && (d.windowEnd == maxStoreBlockSize || d.sync) { + d.err = d.writeStoredBlock(d.window[:d.windowEnd]) + d.windowEnd = 0 + } +} + +// fillWindow will fill the buffer with data for huffman-only compression. +// The number of bytes copied is returned. +func (d *compressor) fillBlock(b []byte) int { + n := copy(d.window[d.windowEnd:], b) + d.windowEnd += n + return n +} + +// storeHuff will compress and store the currently added data, +// if enough has been accumulated or we at the end of the stream. +// Any error that occurred will be in d.err +func (d *compressor) storeHuff() { + if d.windowEnd < len(d.window) && !d.sync || d.windowEnd == 0 { + return + } + d.w.writeBlockHuff(false, d.window[:d.windowEnd], d.sync) + d.err = d.w.err + d.windowEnd = 0 +} + +// storeFast will compress and store the currently added data, +// if enough has been accumulated or we at the end of the stream. +// Any error that occurred will be in d.err +func (d *compressor) storeFast() { + // We only compress if we have maxStoreBlockSize. + if d.windowEnd < len(d.window) { + if !d.sync { + return + } + // Handle extremely small sizes. + if d.windowEnd < 128 { + if d.windowEnd == 0 { + return + } + if d.windowEnd <= 32 { + d.err = d.writeStoredBlock(d.window[:d.windowEnd]) + } else { + d.w.writeBlockHuff(false, d.window[:d.windowEnd], true) + d.err = d.w.err + } + d.tokens.Reset() + d.windowEnd = 0 + d.fast.Reset() + return + } + } + + d.fast.Encode(&d.tokens, d.window[:d.windowEnd]) + // If we made zero matches, store the block as is. + if d.tokens.n == 0 { + d.err = d.writeStoredBlock(d.window[:d.windowEnd]) + // If we removed less than 1/16th, huffman compress the block. + } else if int(d.tokens.n) > d.windowEnd-(d.windowEnd>>4) { + d.w.writeBlockHuff(false, d.window[:d.windowEnd], d.sync) + d.err = d.w.err + } else { + d.w.writeBlockDynamic(&d.tokens, false, d.window[:d.windowEnd], d.sync) + d.err = d.w.err + } + d.tokens.Reset() + d.windowEnd = 0 +} + +// write will add input byte to the stream. +// Unless an error occurs all bytes will be consumed. +func (d *compressor) write(b []byte) (n int, err error) { + if d.err != nil { + return 0, d.err + } + n = len(b) + for len(b) > 0 { + d.step(d) + b = b[d.fill(d, b):] + if d.err != nil { + return 0, d.err + } + } + return n, d.err +} + +func (d *compressor) syncFlush() error { + d.sync = true + if d.err != nil { + return d.err + } + d.step(d) + if d.err == nil { + d.w.writeStoredHeader(0, false) + d.w.flush() + d.err = d.w.err + } + d.sync = false + return d.err +} + +func (d *compressor) init(w io.Writer, level int) (err error) { + d.w = newHuffmanBitWriter(w) + + switch { + case level == NoCompression: + d.window = make([]byte, maxStoreBlockSize) + d.fill = (*compressor).fillBlock + d.step = (*compressor).store + case level == ConstantCompression: + d.w.logNewTablePenalty = 10 + d.window = make([]byte, 32<<10) + d.fill = (*compressor).fillBlock + d.step = (*compressor).storeHuff + case level == DefaultCompression: + level = 5 + fallthrough + case level >= 1 && level <= 6: + d.w.logNewTablePenalty = 8 + d.fast = newFastEnc(level) + d.window = make([]byte, maxStoreBlockSize) + d.fill = (*compressor).fillBlock + d.step = (*compressor).storeFast + case 7 <= level && level <= 9: + d.w.logNewTablePenalty = 10 + d.state = &advancedState{} + d.compressionLevel = levels[level] + d.initDeflate() + d.fill = (*compressor).fillDeflate + d.step = (*compressor).deflateLazy + default: + return fmt.Errorf("flate: invalid compression level %d: want value in range [-2, 9]", level) + } + d.level = level + return nil +} + +// reset the state of the compressor. +func (d *compressor) reset(w io.Writer) { + d.w.reset(w) + d.sync = false + d.err = nil + // We only need to reset a few things for Snappy. + if d.fast != nil { + d.fast.Reset() + d.windowEnd = 0 + d.tokens.Reset() + return + } + switch d.compressionLevel.chain { + case 0: + // level was NoCompression or ConstantCompresssion. + d.windowEnd = 0 + default: + s := d.state + s.chainHead = -1 + for i := range s.hashHead { + s.hashHead[i] = 0 + } + for i := range s.hashPrev { + s.hashPrev[i] = 0 + } + s.hashOffset = 1 + s.index, d.windowEnd = 0, 0 + d.blockStart, d.byteAvailable = 0, false + d.tokens.Reset() + s.length = minMatchLength - 1 + s.offset = 0 + s.hash = 0 + s.ii = 0 + s.maxInsertIndex = 0 + } +} + +func (d *compressor) close() error { + if d.err != nil { + return d.err + } + d.sync = true + d.step(d) + if d.err != nil { + return d.err + } + if d.w.writeStoredHeader(0, true); d.w.err != nil { + return d.w.err + } + d.w.flush() + d.w.reset(nil) + return d.w.err +} + +// NewWriter returns a new Writer compressing data at the given level. +// Following zlib, levels range from 1 (BestSpeed) to 9 (BestCompression); +// higher levels typically run slower but compress more. +// Level 0 (NoCompression) does not attempt any compression; it only adds the +// necessary DEFLATE framing. +// Level -1 (DefaultCompression) uses the default compression level. +// Level -2 (ConstantCompression) will use Huffman compression only, giving +// a very fast compression for all types of input, but sacrificing considerable +// compression efficiency. +// +// If level is in the range [-2, 9] then the error returned will be nil. +// Otherwise the error returned will be non-nil. +func NewWriter(w io.Writer, level int) (*Writer, error) { + var dw Writer + if err := dw.d.init(w, level); err != nil { + return nil, err + } + return &dw, nil +} + +// NewWriterDict is like NewWriter but initializes the new +// Writer with a preset dictionary. The returned Writer behaves +// as if the dictionary had been written to it without producing +// any compressed output. The compressed data written to w +// can only be decompressed by a Reader initialized with the +// same dictionary. +func NewWriterDict(w io.Writer, level int, dict []byte) (*Writer, error) { + zw, err := NewWriter(w, level) + if err != nil { + return nil, err + } + zw.d.fillWindow(dict) + zw.dict = append(zw.dict, dict...) // duplicate dictionary for Reset method. + return zw, err +} + +// A Writer takes data written to it and writes the compressed +// form of that data to an underlying writer (see NewWriter). +type Writer struct { + d compressor + dict []byte +} + +// Write writes data to w, which will eventually write the +// compressed form of data to its underlying writer. +func (w *Writer) Write(data []byte) (n int, err error) { + return w.d.write(data) +} + +// Flush flushes any pending data to the underlying writer. +// It is useful mainly in compressed network protocols, to ensure that +// a remote reader has enough data to reconstruct a packet. +// Flush does not return until the data has been written. +// Calling Flush when there is no pending data still causes the Writer +// to emit a sync marker of at least 4 bytes. +// If the underlying writer returns an error, Flush returns that error. +// +// In the terminology of the zlib library, Flush is equivalent to Z_SYNC_FLUSH. +func (w *Writer) Flush() error { + // For more about flushing: + // http://www.bolet.org/~pornin/deflate-flush.html + return w.d.syncFlush() +} + +// Close flushes and closes the writer. +func (w *Writer) Close() error { + return w.d.close() +} + +// Reset discards the writer's state and makes it equivalent to +// the result of NewWriter or NewWriterDict called with dst +// and w's level and dictionary. +func (w *Writer) Reset(dst io.Writer) { + if len(w.dict) > 0 { + // w was created with NewWriterDict + w.d.reset(dst) + if dst != nil { + w.d.fillWindow(w.dict) + } + } else { + // w was created with NewWriter + w.d.reset(dst) + } +} + +// ResetDict discards the writer's state and makes it equivalent to +// the result of NewWriter or NewWriterDict called with dst +// and w's level, but sets a specific dictionary. +func (w *Writer) ResetDict(dst io.Writer, dict []byte) { + w.dict = dict + w.d.reset(dst) + w.d.fillWindow(w.dict) +} diff --git a/vendor/github.com/klauspost/compress/flate/dict_decoder.go b/vendor/github.com/klauspost/compress/flate/dict_decoder.go new file mode 100644 index 0000000..71c75a0 --- /dev/null +++ b/vendor/github.com/klauspost/compress/flate/dict_decoder.go @@ -0,0 +1,184 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package flate + +// dictDecoder implements the LZ77 sliding dictionary as used in decompression. +// LZ77 decompresses data through sequences of two forms of commands: +// +// * Literal insertions: Runs of one or more symbols are inserted into the data +// stream as is. This is accomplished through the writeByte method for a +// single symbol, or combinations of writeSlice/writeMark for multiple symbols. +// Any valid stream must start with a literal insertion if no preset dictionary +// is used. +// +// * Backward copies: Runs of one or more symbols are copied from previously +// emitted data. Backward copies come as the tuple (dist, length) where dist +// determines how far back in the stream to copy from and length determines how +// many bytes to copy. Note that it is valid for the length to be greater than +// the distance. Since LZ77 uses forward copies, that situation is used to +// perform a form of run-length encoding on repeated runs of symbols. +// The writeCopy and tryWriteCopy are used to implement this command. +// +// For performance reasons, this implementation performs little to no sanity +// checks about the arguments. As such, the invariants documented for each +// method call must be respected. +type dictDecoder struct { + hist []byte // Sliding window history + + // Invariant: 0 <= rdPos <= wrPos <= len(hist) + wrPos int // Current output position in buffer + rdPos int // Have emitted hist[:rdPos] already + full bool // Has a full window length been written yet? +} + +// init initializes dictDecoder to have a sliding window dictionary of the given +// size. If a preset dict is provided, it will initialize the dictionary with +// the contents of dict. +func (dd *dictDecoder) init(size int, dict []byte) { + *dd = dictDecoder{hist: dd.hist} + + if cap(dd.hist) < size { + dd.hist = make([]byte, size) + } + dd.hist = dd.hist[:size] + + if len(dict) > len(dd.hist) { + dict = dict[len(dict)-len(dd.hist):] + } + dd.wrPos = copy(dd.hist, dict) + if dd.wrPos == len(dd.hist) { + dd.wrPos = 0 + dd.full = true + } + dd.rdPos = dd.wrPos +} + +// histSize reports the total amount of historical data in the dictionary. +func (dd *dictDecoder) histSize() int { + if dd.full { + return len(dd.hist) + } + return dd.wrPos +} + +// availRead reports the number of bytes that can be flushed by readFlush. +func (dd *dictDecoder) availRead() int { + return dd.wrPos - dd.rdPos +} + +// availWrite reports the available amount of output buffer space. +func (dd *dictDecoder) availWrite() int { + return len(dd.hist) - dd.wrPos +} + +// writeSlice returns a slice of the available buffer to write data to. +// +// This invariant will be kept: len(s) <= availWrite() +func (dd *dictDecoder) writeSlice() []byte { + return dd.hist[dd.wrPos:] +} + +// writeMark advances the writer pointer by cnt. +// +// This invariant must be kept: 0 <= cnt <= availWrite() +func (dd *dictDecoder) writeMark(cnt int) { + dd.wrPos += cnt +} + +// writeByte writes a single byte to the dictionary. +// +// This invariant must be kept: 0 < availWrite() +func (dd *dictDecoder) writeByte(c byte) { + dd.hist[dd.wrPos] = c + dd.wrPos++ +} + +// writeCopy copies a string at a given (dist, length) to the output. +// This returns the number of bytes copied and may be less than the requested +// length if the available space in the output buffer is too small. +// +// This invariant must be kept: 0 < dist <= histSize() +func (dd *dictDecoder) writeCopy(dist, length int) int { + dstBase := dd.wrPos + dstPos := dstBase + srcPos := dstPos - dist + endPos := dstPos + length + if endPos > len(dd.hist) { + endPos = len(dd.hist) + } + + // Copy non-overlapping section after destination position. + // + // This section is non-overlapping in that the copy length for this section + // is always less than or equal to the backwards distance. This can occur + // if a distance refers to data that wraps-around in the buffer. + // Thus, a backwards copy is performed here; that is, the exact bytes in + // the source prior to the copy is placed in the destination. + if srcPos < 0 { + srcPos += len(dd.hist) + dstPos += copy(dd.hist[dstPos:endPos], dd.hist[srcPos:]) + srcPos = 0 + } + + // Copy possibly overlapping section before destination position. + // + // This section can overlap if the copy length for this section is larger + // than the backwards distance. This is allowed by LZ77 so that repeated + // strings can be succinctly represented using (dist, length) pairs. + // Thus, a forwards copy is performed here; that is, the bytes copied is + // possibly dependent on the resulting bytes in the destination as the copy + // progresses along. This is functionally equivalent to the following: + // + // for i := 0; i < endPos-dstPos; i++ { + // dd.hist[dstPos+i] = dd.hist[srcPos+i] + // } + // dstPos = endPos + // + for dstPos < endPos { + dstPos += copy(dd.hist[dstPos:endPos], dd.hist[srcPos:dstPos]) + } + + dd.wrPos = dstPos + return dstPos - dstBase +} + +// tryWriteCopy tries to copy a string at a given (distance, length) to the +// output. This specialized version is optimized for short distances. +// +// This method is designed to be inlined for performance reasons. +// +// This invariant must be kept: 0 < dist <= histSize() +func (dd *dictDecoder) tryWriteCopy(dist, length int) int { + dstPos := dd.wrPos + endPos := dstPos + length + if dstPos < dist || endPos > len(dd.hist) { + return 0 + } + dstBase := dstPos + srcPos := dstPos - dist + + // Copy possibly overlapping section before destination position. +loop: + dstPos += copy(dd.hist[dstPos:endPos], dd.hist[srcPos:dstPos]) + if dstPos < endPos { + goto loop // Avoid for-loop so that this function can be inlined + } + + dd.wrPos = dstPos + return dstPos - dstBase +} + +// readFlush returns a slice of the historical buffer that is ready to be +// emitted to the user. The data returned by readFlush must be fully consumed +// before calling any other dictDecoder methods. +func (dd *dictDecoder) readFlush() []byte { + toRead := dd.hist[dd.rdPos:dd.wrPos] + dd.rdPos = dd.wrPos + if dd.wrPos == len(dd.hist) { + dd.wrPos, dd.rdPos = 0, 0 + dd.full = true + } + return toRead +} diff --git a/vendor/github.com/klauspost/compress/flate/fast_encoder.go b/vendor/github.com/klauspost/compress/flate/fast_encoder.go new file mode 100644 index 0000000..347ac2c --- /dev/null +++ b/vendor/github.com/klauspost/compress/flate/fast_encoder.go @@ -0,0 +1,244 @@ +// Copyright 2011 The Snappy-Go Authors. All rights reserved. +// Modified for deflate by Klaus Post (c) 2015. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package flate + +import ( + "encoding/binary" + "fmt" + "math/bits" +) + +type fastEnc interface { + Encode(dst *tokens, src []byte) + Reset() +} + +func newFastEnc(level int) fastEnc { + switch level { + case 1: + return &fastEncL1{fastGen: fastGen{cur: maxStoreBlockSize}} + case 2: + return &fastEncL2{fastGen: fastGen{cur: maxStoreBlockSize}} + case 3: + return &fastEncL3{fastGen: fastGen{cur: maxStoreBlockSize}} + case 4: + return &fastEncL4{fastGen: fastGen{cur: maxStoreBlockSize}} + case 5: + return &fastEncL5{fastGen: fastGen{cur: maxStoreBlockSize}} + case 6: + return &fastEncL6{fastGen: fastGen{cur: maxStoreBlockSize}} + default: + panic("invalid level specified") + } +} + +const ( + tableBits = 15 // Bits used in the table + tableSize = 1 << tableBits // Size of the table + tableShift = 32 - tableBits // Right-shift to get the tableBits most significant bits of a uint32. + baseMatchOffset = 1 // The smallest match offset + baseMatchLength = 3 // The smallest match length per the RFC section 3.2.5 + maxMatchOffset = 1 << 15 // The largest match offset + + bTableBits = 17 // Bits used in the big tables + bTableSize = 1 << bTableBits // Size of the table + allocHistory = maxStoreBlockSize * 5 // Size to preallocate for history. + bufferReset = (1 << 31) - allocHistory - maxStoreBlockSize - 1 // Reset the buffer offset when reaching this. +) + +const ( + prime3bytes = 506832829 + prime4bytes = 2654435761 + prime5bytes = 889523592379 + prime6bytes = 227718039650203 + prime7bytes = 58295818150454627 + prime8bytes = 0xcf1bbcdcb7a56463 +) + +func load32(b []byte, i int) uint32 { + // Help the compiler eliminate bounds checks on the read so it can be done in a single read. + b = b[i:] + b = b[:4] + return uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 +} + +func load64(b []byte, i int) uint64 { + return binary.LittleEndian.Uint64(b[i:]) +} + +func load3232(b []byte, i int32) uint32 { + return binary.LittleEndian.Uint32(b[i:]) +} + +func load6432(b []byte, i int32) uint64 { + return binary.LittleEndian.Uint64(b[i:]) +} + +func hash(u uint32) uint32 { + return (u * 0x1e35a7bd) >> tableShift +} + +type tableEntry struct { + offset int32 +} + +// fastGen maintains the table for matches, +// and the previous byte block for level 2. +// This is the generic implementation. +type fastGen struct { + hist []byte + cur int32 +} + +func (e *fastGen) addBlock(src []byte) int32 { + // check if we have space already + if len(e.hist)+len(src) > cap(e.hist) { + if cap(e.hist) == 0 { + e.hist = make([]byte, 0, allocHistory) + } else { + if cap(e.hist) < maxMatchOffset*2 { + panic("unexpected buffer size") + } + // Move down + offset := int32(len(e.hist)) - maxMatchOffset + copy(e.hist[0:maxMatchOffset], e.hist[offset:]) + e.cur += offset + e.hist = e.hist[:maxMatchOffset] + } + } + s := int32(len(e.hist)) + e.hist = append(e.hist, src...) + return s +} + +// hash4 returns the hash of u to fit in a hash table with h bits. +// Preferably h should be a constant and should always be <32. +func hash4u(u uint32, h uint8) uint32 { + return (u * prime4bytes) >> ((32 - h) & reg8SizeMask32) +} + +type tableEntryPrev struct { + Cur tableEntry + Prev tableEntry +} + +// hash4x64 returns the hash of the lowest 4 bytes of u to fit in a hash table with h bits. +// Preferably h should be a constant and should always be <32. +func hash4x64(u uint64, h uint8) uint32 { + return (uint32(u) * prime4bytes) >> ((32 - h) & reg8SizeMask32) +} + +// hash7 returns the hash of the lowest 7 bytes of u to fit in a hash table with h bits. +// Preferably h should be a constant and should always be <64. +func hash7(u uint64, h uint8) uint32 { + return uint32(((u << (64 - 56)) * prime7bytes) >> ((64 - h) & reg8SizeMask64)) +} + +// hash8 returns the hash of u to fit in a hash table with h bits. +// Preferably h should be a constant and should always be <64. +func hash8(u uint64, h uint8) uint32 { + return uint32((u * prime8bytes) >> ((64 - h) & reg8SizeMask64)) +} + +// hash6 returns the hash of the lowest 6 bytes of u to fit in a hash table with h bits. +// Preferably h should be a constant and should always be <64. +func hash6(u uint64, h uint8) uint32 { + return uint32(((u << (64 - 48)) * prime6bytes) >> ((64 - h) & reg8SizeMask64)) +} + +// matchlen will return the match length between offsets and t in src. +// The maximum length returned is maxMatchLength - 4. +// It is assumed that s > t, that t >=0 and s < len(src). +func (e *fastGen) matchlen(s, t int32, src []byte) int32 { + if debugDecode { + if t >= s { + panic(fmt.Sprint("t >=s:", t, s)) + } + if int(s) >= len(src) { + panic(fmt.Sprint("s >= len(src):", s, len(src))) + } + if t < 0 { + panic(fmt.Sprint("t < 0:", t)) + } + if s-t > maxMatchOffset { + panic(fmt.Sprint(s, "-", t, "(", s-t, ") > maxMatchLength (", maxMatchOffset, ")")) + } + } + s1 := int(s) + maxMatchLength - 4 + if s1 > len(src) { + s1 = len(src) + } + + // Extend the match to be as long as possible. + return int32(matchLen(src[s:s1], src[t:])) +} + +// matchlenLong will return the match length between offsets and t in src. +// It is assumed that s > t, that t >=0 and s < len(src). +func (e *fastGen) matchlenLong(s, t int32, src []byte) int32 { + if debugDecode { + if t >= s { + panic(fmt.Sprint("t >=s:", t, s)) + } + if int(s) >= len(src) { + panic(fmt.Sprint("s >= len(src):", s, len(src))) + } + if t < 0 { + panic(fmt.Sprint("t < 0:", t)) + } + if s-t > maxMatchOffset { + panic(fmt.Sprint(s, "-", t, "(", s-t, ") > maxMatchLength (", maxMatchOffset, ")")) + } + } + // Extend the match to be as long as possible. + return int32(matchLen(src[s:], src[t:])) +} + +// Reset the encoding table. +func (e *fastGen) Reset() { + if cap(e.hist) < allocHistory { + e.hist = make([]byte, 0, allocHistory) + } + // We offset current position so everything will be out of reach. + // If we are above the buffer reset it will be cleared anyway since len(hist) == 0. + if e.cur <= bufferReset { + e.cur += maxMatchOffset + int32(len(e.hist)) + } + e.hist = e.hist[:0] +} + +// matchLen returns the maximum length. +// 'a' must be the shortest of the two. +func matchLen(a, b []byte) int { + b = b[:len(a)] + var checked int + if len(a) >= 4 { + // Try 4 bytes first + if diff := binary.LittleEndian.Uint32(a) ^ binary.LittleEndian.Uint32(b); diff != 0 { + return bits.TrailingZeros32(diff) >> 3 + } + // Switch to 8 byte matching. + checked = 4 + a = a[4:] + b = b[4:] + for len(a) >= 8 { + b = b[:len(a)] + if diff := binary.LittleEndian.Uint64(a) ^ binary.LittleEndian.Uint64(b); diff != 0 { + return checked + (bits.TrailingZeros64(diff) >> 3) + } + checked += 8 + a = a[8:] + b = b[8:] + } + } + b = b[:len(a)] + for i := range a { + if a[i] != b[i] { + return i + checked + } + } + return len(a) + checked +} diff --git a/vendor/github.com/klauspost/compress/flate/huffman_bit_writer.go b/vendor/github.com/klauspost/compress/flate/huffman_bit_writer.go new file mode 100644 index 0000000..3ad5e98 --- /dev/null +++ b/vendor/github.com/klauspost/compress/flate/huffman_bit_writer.go @@ -0,0 +1,1034 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package flate + +import ( + "encoding/binary" + "fmt" + "io" +) + +const ( + // The largest offset code. + offsetCodeCount = 30 + + // The special code used to mark the end of a block. + endBlockMarker = 256 + + // The first length code. + lengthCodesStart = 257 + + // The number of codegen codes. + codegenCodeCount = 19 + badCode = 255 + + // bufferFlushSize indicates the buffer size + // after which bytes are flushed to the writer. + // Should preferably be a multiple of 6, since + // we accumulate 6 bytes between writes to the buffer. + bufferFlushSize = 246 + + // bufferSize is the actual output byte buffer size. + // It must have additional headroom for a flush + // which can contain up to 8 bytes. + bufferSize = bufferFlushSize + 8 +) + +// The number of extra bits needed by length code X - LENGTH_CODES_START. +var lengthExtraBits = [32]int8{ + /* 257 */ 0, 0, 0, + /* 260 */ 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, + /* 270 */ 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, + /* 280 */ 4, 5, 5, 5, 5, 0, +} + +// The length indicated by length code X - LENGTH_CODES_START. +var lengthBase = [32]uint8{ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 10, + 12, 14, 16, 20, 24, 28, 32, 40, 48, 56, + 64, 80, 96, 112, 128, 160, 192, 224, 255, +} + +// offset code word extra bits. +var offsetExtraBits = [64]int8{ + 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, + 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, + 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, + /* extended window */ + 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, +} + +var offsetCombined = [32]uint32{} + +func init() { + var offsetBase = [64]uint32{ + /* normal deflate */ + 0x000000, 0x000001, 0x000002, 0x000003, 0x000004, + 0x000006, 0x000008, 0x00000c, 0x000010, 0x000018, + 0x000020, 0x000030, 0x000040, 0x000060, 0x000080, + 0x0000c0, 0x000100, 0x000180, 0x000200, 0x000300, + 0x000400, 0x000600, 0x000800, 0x000c00, 0x001000, + 0x001800, 0x002000, 0x003000, 0x004000, 0x006000, + + /* extended window */ + 0x008000, 0x00c000, 0x010000, 0x018000, 0x020000, + 0x030000, 0x040000, 0x060000, 0x080000, 0x0c0000, + 0x100000, 0x180000, 0x200000, 0x300000, + } + + for i := range offsetCombined[:] { + // Don't use extended window values... + if offsetBase[i] > 0x006000 { + continue + } + offsetCombined[i] = uint32(offsetExtraBits[i])<<16 | (offsetBase[i]) + } +} + +// The odd order in which the codegen code sizes are written. +var codegenOrder = []uint32{16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15} + +type huffmanBitWriter struct { + // writer is the underlying writer. + // Do not use it directly; use the write method, which ensures + // that Write errors are sticky. + writer io.Writer + + // Data waiting to be written is bytes[0:nbytes] + // and then the low nbits of bits. + bits uint64 + nbits uint16 + nbytes uint8 + lastHuffMan bool + literalEncoding *huffmanEncoder + tmpLitEncoding *huffmanEncoder + offsetEncoding *huffmanEncoder + codegenEncoding *huffmanEncoder + err error + lastHeader int + // Set between 0 (reused block can be up to 2x the size) + logNewTablePenalty uint + bytes [256 + 8]byte + literalFreq [lengthCodesStart + 32]uint16 + offsetFreq [32]uint16 + codegenFreq [codegenCodeCount]uint16 + + // codegen must have an extra space for the final symbol. + codegen [literalCount + offsetCodeCount + 1]uint8 +} + +// Huffman reuse. +// +// The huffmanBitWriter supports reusing huffman tables and thereby combining block sections. +// +// This is controlled by several variables: +// +// If lastHeader is non-zero the Huffman table can be reused. +// This also indicates that a Huffman table has been generated that can output all +// possible symbols. +// It also indicates that an EOB has not yet been emitted, so if a new tabel is generated +// an EOB with the previous table must be written. +// +// If lastHuffMan is set, a table for outputting literals has been generated and offsets are invalid. +// +// An incoming block estimates the output size of a new table using a 'fresh' by calculating the +// optimal size and adding a penalty in 'logNewTablePenalty'. +// A Huffman table is not optimal, which is why we add a penalty, and generating a new table +// is slower both for compression and decompression. + +func newHuffmanBitWriter(w io.Writer) *huffmanBitWriter { + return &huffmanBitWriter{ + writer: w, + literalEncoding: newHuffmanEncoder(literalCount), + tmpLitEncoding: newHuffmanEncoder(literalCount), + codegenEncoding: newHuffmanEncoder(codegenCodeCount), + offsetEncoding: newHuffmanEncoder(offsetCodeCount), + } +} + +func (w *huffmanBitWriter) reset(writer io.Writer) { + w.writer = writer + w.bits, w.nbits, w.nbytes, w.err = 0, 0, 0, nil + w.lastHeader = 0 + w.lastHuffMan = false +} + +func (w *huffmanBitWriter) canReuse(t *tokens) (offsets, lits bool) { + offsets, lits = true, true + a := t.offHist[:offsetCodeCount] + b := w.offsetFreq[:len(a)] + for i := range a { + if b[i] == 0 && a[i] != 0 { + offsets = false + break + } + } + + a = t.extraHist[:literalCount-256] + b = w.literalFreq[256:literalCount] + b = b[:len(a)] + for i := range a { + if b[i] == 0 && a[i] != 0 { + lits = false + break + } + } + if lits { + a = t.litHist[:] + b = w.literalFreq[:len(a)] + for i := range a { + if b[i] == 0 && a[i] != 0 { + lits = false + break + } + } + } + return +} + +func (w *huffmanBitWriter) flush() { + if w.err != nil { + w.nbits = 0 + return + } + if w.lastHeader > 0 { + // We owe an EOB + w.writeCode(w.literalEncoding.codes[endBlockMarker]) + w.lastHeader = 0 + } + n := w.nbytes + for w.nbits != 0 { + w.bytes[n] = byte(w.bits) + w.bits >>= 8 + if w.nbits > 8 { // Avoid underflow + w.nbits -= 8 + } else { + w.nbits = 0 + } + n++ + } + w.bits = 0 + w.write(w.bytes[:n]) + w.nbytes = 0 +} + +func (w *huffmanBitWriter) write(b []byte) { + if w.err != nil { + return + } + _, w.err = w.writer.Write(b) +} + +func (w *huffmanBitWriter) writeBits(b int32, nb uint16) { + w.bits |= uint64(b) << w.nbits + w.nbits += nb + if w.nbits >= 48 { + w.writeOutBits() + } +} + +func (w *huffmanBitWriter) writeBytes(bytes []byte) { + if w.err != nil { + return + } + n := w.nbytes + if w.nbits&7 != 0 { + w.err = InternalError("writeBytes with unfinished bits") + return + } + for w.nbits != 0 { + w.bytes[n] = byte(w.bits) + w.bits >>= 8 + w.nbits -= 8 + n++ + } + if n != 0 { + w.write(w.bytes[:n]) + } + w.nbytes = 0 + w.write(bytes) +} + +// RFC 1951 3.2.7 specifies a special run-length encoding for specifying +// the literal and offset lengths arrays (which are concatenated into a single +// array). This method generates that run-length encoding. +// +// The result is written into the codegen array, and the frequencies +// of each code is written into the codegenFreq array. +// Codes 0-15 are single byte codes. Codes 16-18 are followed by additional +// information. Code badCode is an end marker +// +// numLiterals The number of literals in literalEncoding +// numOffsets The number of offsets in offsetEncoding +// litenc, offenc The literal and offset encoder to use +func (w *huffmanBitWriter) generateCodegen(numLiterals int, numOffsets int, litEnc, offEnc *huffmanEncoder) { + for i := range w.codegenFreq { + w.codegenFreq[i] = 0 + } + // Note that we are using codegen both as a temporary variable for holding + // a copy of the frequencies, and as the place where we put the result. + // This is fine because the output is always shorter than the input used + // so far. + codegen := w.codegen[:] // cache + // Copy the concatenated code sizes to codegen. Put a marker at the end. + cgnl := codegen[:numLiterals] + for i := range cgnl { + cgnl[i] = uint8(litEnc.codes[i].len) + } + + cgnl = codegen[numLiterals : numLiterals+numOffsets] + for i := range cgnl { + cgnl[i] = uint8(offEnc.codes[i].len) + } + codegen[numLiterals+numOffsets] = badCode + + size := codegen[0] + count := 1 + outIndex := 0 + for inIndex := 1; size != badCode; inIndex++ { + // INVARIANT: We have seen "count" copies of size that have not yet + // had output generated for them. + nextSize := codegen[inIndex] + if nextSize == size { + count++ + continue + } + // We need to generate codegen indicating "count" of size. + if size != 0 { + codegen[outIndex] = size + outIndex++ + w.codegenFreq[size]++ + count-- + for count >= 3 { + n := 6 + if n > count { + n = count + } + codegen[outIndex] = 16 + outIndex++ + codegen[outIndex] = uint8(n - 3) + outIndex++ + w.codegenFreq[16]++ + count -= n + } + } else { + for count >= 11 { + n := 138 + if n > count { + n = count + } + codegen[outIndex] = 18 + outIndex++ + codegen[outIndex] = uint8(n - 11) + outIndex++ + w.codegenFreq[18]++ + count -= n + } + if count >= 3 { + // count >= 3 && count <= 10 + codegen[outIndex] = 17 + outIndex++ + codegen[outIndex] = uint8(count - 3) + outIndex++ + w.codegenFreq[17]++ + count = 0 + } + } + count-- + for ; count >= 0; count-- { + codegen[outIndex] = size + outIndex++ + w.codegenFreq[size]++ + } + // Set up invariant for next time through the loop. + size = nextSize + count = 1 + } + // Marker indicating the end of the codegen. + codegen[outIndex] = badCode +} + +func (w *huffmanBitWriter) codegens() int { + numCodegens := len(w.codegenFreq) + for numCodegens > 4 && w.codegenFreq[codegenOrder[numCodegens-1]] == 0 { + numCodegens-- + } + return numCodegens +} + +func (w *huffmanBitWriter) headerSize() (size, numCodegens int) { + numCodegens = len(w.codegenFreq) + for numCodegens > 4 && w.codegenFreq[codegenOrder[numCodegens-1]] == 0 { + numCodegens-- + } + return 3 + 5 + 5 + 4 + (3 * numCodegens) + + w.codegenEncoding.bitLength(w.codegenFreq[:]) + + int(w.codegenFreq[16])*2 + + int(w.codegenFreq[17])*3 + + int(w.codegenFreq[18])*7, numCodegens +} + +// dynamicSize returns the size of dynamically encoded data in bits. +func (w *huffmanBitWriter) dynamicReuseSize(litEnc, offEnc *huffmanEncoder) (size int) { + size = litEnc.bitLength(w.literalFreq[:]) + + offEnc.bitLength(w.offsetFreq[:]) + return size +} + +// dynamicSize returns the size of dynamically encoded data in bits. +func (w *huffmanBitWriter) dynamicSize(litEnc, offEnc *huffmanEncoder, extraBits int) (size, numCodegens int) { + header, numCodegens := w.headerSize() + size = header + + litEnc.bitLength(w.literalFreq[:]) + + offEnc.bitLength(w.offsetFreq[:]) + + extraBits + return size, numCodegens +} + +// extraBitSize will return the number of bits that will be written +// as "extra" bits on matches. +func (w *huffmanBitWriter) extraBitSize() int { + total := 0 + for i, n := range w.literalFreq[257:literalCount] { + total += int(n) * int(lengthExtraBits[i&31]) + } + for i, n := range w.offsetFreq[:offsetCodeCount] { + total += int(n) * int(offsetExtraBits[i&31]) + } + return total +} + +// fixedSize returns the size of dynamically encoded data in bits. +func (w *huffmanBitWriter) fixedSize(extraBits int) int { + return 3 + + fixedLiteralEncoding.bitLength(w.literalFreq[:]) + + fixedOffsetEncoding.bitLength(w.offsetFreq[:]) + + extraBits +} + +// storedSize calculates the stored size, including header. +// The function returns the size in bits and whether the block +// fits inside a single block. +func (w *huffmanBitWriter) storedSize(in []byte) (int, bool) { + if in == nil { + return 0, false + } + if len(in) <= maxStoreBlockSize { + return (len(in) + 5) * 8, true + } + return 0, false +} + +func (w *huffmanBitWriter) writeCode(c hcode) { + // The function does not get inlined if we "& 63" the shift. + w.bits |= uint64(c.code) << w.nbits + w.nbits += c.len + if w.nbits >= 48 { + w.writeOutBits() + } +} + +// writeOutBits will write bits to the buffer. +func (w *huffmanBitWriter) writeOutBits() { + bits := w.bits + w.bits >>= 48 + w.nbits -= 48 + n := w.nbytes + + // We over-write, but faster... + binary.LittleEndian.PutUint64(w.bytes[n:], bits) + n += 6 + + if n >= bufferFlushSize { + if w.err != nil { + n = 0 + return + } + w.write(w.bytes[:n]) + n = 0 + } + + w.nbytes = n +} + +// Write the header of a dynamic Huffman block to the output stream. +// +// numLiterals The number of literals specified in codegen +// numOffsets The number of offsets specified in codegen +// numCodegens The number of codegens used in codegen +func (w *huffmanBitWriter) writeDynamicHeader(numLiterals int, numOffsets int, numCodegens int, isEof bool) { + if w.err != nil { + return + } + var firstBits int32 = 4 + if isEof { + firstBits = 5 + } + w.writeBits(firstBits, 3) + w.writeBits(int32(numLiterals-257), 5) + w.writeBits(int32(numOffsets-1), 5) + w.writeBits(int32(numCodegens-4), 4) + + for i := 0; i < numCodegens; i++ { + value := uint(w.codegenEncoding.codes[codegenOrder[i]].len) + w.writeBits(int32(value), 3) + } + + i := 0 + for { + var codeWord = uint32(w.codegen[i]) + i++ + if codeWord == badCode { + break + } + w.writeCode(w.codegenEncoding.codes[codeWord]) + + switch codeWord { + case 16: + w.writeBits(int32(w.codegen[i]), 2) + i++ + case 17: + w.writeBits(int32(w.codegen[i]), 3) + i++ + case 18: + w.writeBits(int32(w.codegen[i]), 7) + i++ + } + } +} + +// writeStoredHeader will write a stored header. +// If the stored block is only used for EOF, +// it is replaced with a fixed huffman block. +func (w *huffmanBitWriter) writeStoredHeader(length int, isEof bool) { + if w.err != nil { + return + } + if w.lastHeader > 0 { + // We owe an EOB + w.writeCode(w.literalEncoding.codes[endBlockMarker]) + w.lastHeader = 0 + } + + // To write EOF, use a fixed encoding block. 10 bits instead of 5 bytes. + if length == 0 && isEof { + w.writeFixedHeader(isEof) + // EOB: 7 bits, value: 0 + w.writeBits(0, 7) + w.flush() + return + } + + var flag int32 + if isEof { + flag = 1 + } + w.writeBits(flag, 3) + w.flush() + w.writeBits(int32(length), 16) + w.writeBits(int32(^uint16(length)), 16) +} + +func (w *huffmanBitWriter) writeFixedHeader(isEof bool) { + if w.err != nil { + return + } + if w.lastHeader > 0 { + // We owe an EOB + w.writeCode(w.literalEncoding.codes[endBlockMarker]) + w.lastHeader = 0 + } + + // Indicate that we are a fixed Huffman block + var value int32 = 2 + if isEof { + value = 3 + } + w.writeBits(value, 3) +} + +// writeBlock will write a block of tokens with the smallest encoding. +// The original input can be supplied, and if the huffman encoded data +// is larger than the original bytes, the data will be written as a +// stored block. +// If the input is nil, the tokens will always be Huffman encoded. +func (w *huffmanBitWriter) writeBlock(tokens *tokens, eof bool, input []byte) { + if w.err != nil { + return + } + + tokens.AddEOB() + if w.lastHeader > 0 { + // We owe an EOB + w.writeCode(w.literalEncoding.codes[endBlockMarker]) + w.lastHeader = 0 + } + numLiterals, numOffsets := w.indexTokens(tokens, false) + w.generate(tokens) + var extraBits int + storedSize, storable := w.storedSize(input) + if storable { + extraBits = w.extraBitSize() + } + + // Figure out smallest code. + // Fixed Huffman baseline. + var literalEncoding = fixedLiteralEncoding + var offsetEncoding = fixedOffsetEncoding + var size = w.fixedSize(extraBits) + + // Dynamic Huffman? + var numCodegens int + + // Generate codegen and codegenFrequencies, which indicates how to encode + // the literalEncoding and the offsetEncoding. + w.generateCodegen(numLiterals, numOffsets, w.literalEncoding, w.offsetEncoding) + w.codegenEncoding.generate(w.codegenFreq[:], 7) + dynamicSize, numCodegens := w.dynamicSize(w.literalEncoding, w.offsetEncoding, extraBits) + + if dynamicSize < size { + size = dynamicSize + literalEncoding = w.literalEncoding + offsetEncoding = w.offsetEncoding + } + + // Stored bytes? + if storable && storedSize < size { + w.writeStoredHeader(len(input), eof) + w.writeBytes(input) + return + } + + // Huffman. + if literalEncoding == fixedLiteralEncoding { + w.writeFixedHeader(eof) + } else { + w.writeDynamicHeader(numLiterals, numOffsets, numCodegens, eof) + } + + // Write the tokens. + w.writeTokens(tokens.Slice(), literalEncoding.codes, offsetEncoding.codes) +} + +// writeBlockDynamic encodes a block using a dynamic Huffman table. +// This should be used if the symbols used have a disproportionate +// histogram distribution. +// If input is supplied and the compression savings are below 1/16th of the +// input size the block is stored. +func (w *huffmanBitWriter) writeBlockDynamic(tokens *tokens, eof bool, input []byte, sync bool) { + if w.err != nil { + return + } + + sync = sync || eof + if sync { + tokens.AddEOB() + } + + // We cannot reuse pure huffman table, and must mark as EOF. + if (w.lastHuffMan || eof) && w.lastHeader > 0 { + // We will not try to reuse. + w.writeCode(w.literalEncoding.codes[endBlockMarker]) + w.lastHeader = 0 + w.lastHuffMan = false + } + if !sync { + tokens.Fill() + } + numLiterals, numOffsets := w.indexTokens(tokens, !sync) + + var size int + // Check if we should reuse. + if w.lastHeader > 0 { + // Estimate size for using a new table. + // Use the previous header size as the best estimate. + newSize := w.lastHeader + tokens.EstimatedBits() + newSize += newSize >> w.logNewTablePenalty + + // The estimated size is calculated as an optimal table. + // We add a penalty to make it more realistic and re-use a bit more. + reuseSize := w.dynamicReuseSize(w.literalEncoding, w.offsetEncoding) + w.extraBitSize() + + // Check if a new table is better. + if newSize < reuseSize { + // Write the EOB we owe. + w.writeCode(w.literalEncoding.codes[endBlockMarker]) + size = newSize + w.lastHeader = 0 + } else { + size = reuseSize + } + // Check if we get a reasonable size decrease. + if ssize, storable := w.storedSize(input); storable && ssize < (size+size>>4) { + w.writeStoredHeader(len(input), eof) + w.writeBytes(input) + w.lastHeader = 0 + return + } + } + + // We want a new block/table + if w.lastHeader == 0 { + w.generate(tokens) + // Generate codegen and codegenFrequencies, which indicates how to encode + // the literalEncoding and the offsetEncoding. + w.generateCodegen(numLiterals, numOffsets, w.literalEncoding, w.offsetEncoding) + w.codegenEncoding.generate(w.codegenFreq[:], 7) + var numCodegens int + size, numCodegens = w.dynamicSize(w.literalEncoding, w.offsetEncoding, w.extraBitSize()) + // Store bytes, if we don't get a reasonable improvement. + if ssize, storable := w.storedSize(input); storable && ssize < (size+size>>4) { + w.writeStoredHeader(len(input), eof) + w.writeBytes(input) + w.lastHeader = 0 + return + } + + // Write Huffman table. + w.writeDynamicHeader(numLiterals, numOffsets, numCodegens, eof) + w.lastHeader, _ = w.headerSize() + w.lastHuffMan = false + } + + if sync { + w.lastHeader = 0 + } + // Write the tokens. + w.writeTokens(tokens.Slice(), w.literalEncoding.codes, w.offsetEncoding.codes) +} + +// indexTokens indexes a slice of tokens, and updates +// literalFreq and offsetFreq, and generates literalEncoding +// and offsetEncoding. +// The number of literal and offset tokens is returned. +func (w *huffmanBitWriter) indexTokens(t *tokens, filled bool) (numLiterals, numOffsets int) { + copy(w.literalFreq[:], t.litHist[:]) + copy(w.literalFreq[256:], t.extraHist[:]) + copy(w.offsetFreq[:], t.offHist[:offsetCodeCount]) + + if t.n == 0 { + return + } + if filled { + return maxNumLit, maxNumDist + } + // get the number of literals + numLiterals = len(w.literalFreq) + for w.literalFreq[numLiterals-1] == 0 { + numLiterals-- + } + // get the number of offsets + numOffsets = len(w.offsetFreq) + for numOffsets > 0 && w.offsetFreq[numOffsets-1] == 0 { + numOffsets-- + } + if numOffsets == 0 { + // We haven't found a single match. If we want to go with the dynamic encoding, + // we should count at least one offset to be sure that the offset huffman tree could be encoded. + w.offsetFreq[0] = 1 + numOffsets = 1 + } + return +} + +func (w *huffmanBitWriter) generate(t *tokens) { + w.literalEncoding.generate(w.literalFreq[:literalCount], 15) + w.offsetEncoding.generate(w.offsetFreq[:offsetCodeCount], 15) +} + +// writeTokens writes a slice of tokens to the output. +// codes for literal and offset encoding must be supplied. +func (w *huffmanBitWriter) writeTokens(tokens []token, leCodes, oeCodes []hcode) { + if w.err != nil { + return + } + if len(tokens) == 0 { + return + } + + // Only last token should be endBlockMarker. + var deferEOB bool + if tokens[len(tokens)-1] == endBlockMarker { + tokens = tokens[:len(tokens)-1] + deferEOB = true + } + + // Create slices up to the next power of two to avoid bounds checks. + lits := leCodes[:256] + offs := oeCodes[:32] + lengths := leCodes[lengthCodesStart:] + lengths = lengths[:32] + + // Go 1.16 LOVES having these on stack. + bits, nbits, nbytes := w.bits, w.nbits, w.nbytes + + for _, t := range tokens { + if t < matchType { + //w.writeCode(lits[t.literal()]) + c := lits[t.literal()] + bits |= uint64(c.code) << nbits + nbits += c.len + if nbits >= 48 { + binary.LittleEndian.PutUint64(w.bytes[nbytes:], bits) + //*(*uint64)(unsafe.Pointer(&w.bytes[nbytes])) = bits + bits >>= 48 + nbits -= 48 + nbytes += 6 + if nbytes >= bufferFlushSize { + if w.err != nil { + nbytes = 0 + return + } + _, w.err = w.writer.Write(w.bytes[:nbytes]) + nbytes = 0 + } + } + continue + } + + // Write the length + length := t.length() + lengthCode := lengthCode(length) + if false { + w.writeCode(lengths[lengthCode&31]) + } else { + // inlined + c := lengths[lengthCode&31] + bits |= uint64(c.code) << nbits + nbits += c.len + if nbits >= 48 { + binary.LittleEndian.PutUint64(w.bytes[nbytes:], bits) + //*(*uint64)(unsafe.Pointer(&w.bytes[nbytes])) = bits + bits >>= 48 + nbits -= 48 + nbytes += 6 + if nbytes >= bufferFlushSize { + if w.err != nil { + nbytes = 0 + return + } + _, w.err = w.writer.Write(w.bytes[:nbytes]) + nbytes = 0 + } + } + } + + extraLengthBits := uint16(lengthExtraBits[lengthCode&31]) + if extraLengthBits > 0 { + //w.writeBits(extraLength, extraLengthBits) + extraLength := int32(length - lengthBase[lengthCode&31]) + bits |= uint64(extraLength) << nbits + nbits += extraLengthBits + if nbits >= 48 { + binary.LittleEndian.PutUint64(w.bytes[nbytes:], bits) + //*(*uint64)(unsafe.Pointer(&w.bytes[nbytes])) = bits + bits >>= 48 + nbits -= 48 + nbytes += 6 + if nbytes >= bufferFlushSize { + if w.err != nil { + nbytes = 0 + return + } + _, w.err = w.writer.Write(w.bytes[:nbytes]) + nbytes = 0 + } + } + } + // Write the offset + offset := t.offset() + offsetCode := offset >> 16 + offset &= matchOffsetOnlyMask + if false { + w.writeCode(offs[offsetCode&31]) + } else { + // inlined + c := offs[offsetCode] + bits |= uint64(c.code) << nbits + nbits += c.len + if nbits >= 48 { + binary.LittleEndian.PutUint64(w.bytes[nbytes:], bits) + //*(*uint64)(unsafe.Pointer(&w.bytes[nbytes])) = bits + bits >>= 48 + nbits -= 48 + nbytes += 6 + if nbytes >= bufferFlushSize { + if w.err != nil { + nbytes = 0 + return + } + _, w.err = w.writer.Write(w.bytes[:nbytes]) + nbytes = 0 + } + } + } + offsetComb := offsetCombined[offsetCode] + if offsetComb > 1<<16 { + //w.writeBits(extraOffset, extraOffsetBits) + bits |= uint64(offset&matchOffsetOnlyMask-(offsetComb&0xffff)) << nbits + nbits += uint16(offsetComb >> 16) + if nbits >= 48 { + binary.LittleEndian.PutUint64(w.bytes[nbytes:], bits) + //*(*uint64)(unsafe.Pointer(&w.bytes[nbytes])) = bits + bits >>= 48 + nbits -= 48 + nbytes += 6 + if nbytes >= bufferFlushSize { + if w.err != nil { + nbytes = 0 + return + } + _, w.err = w.writer.Write(w.bytes[:nbytes]) + nbytes = 0 + } + } + } + } + // Restore... + w.bits, w.nbits, w.nbytes = bits, nbits, nbytes + + if deferEOB { + w.writeCode(leCodes[endBlockMarker]) + } +} + +// huffOffset is a static offset encoder used for huffman only encoding. +// It can be reused since we will not be encoding offset values. +var huffOffset *huffmanEncoder + +func init() { + w := newHuffmanBitWriter(nil) + w.offsetFreq[0] = 1 + huffOffset = newHuffmanEncoder(offsetCodeCount) + huffOffset.generate(w.offsetFreq[:offsetCodeCount], 15) +} + +// writeBlockHuff encodes a block of bytes as either +// Huffman encoded literals or uncompressed bytes if the +// results only gains very little from compression. +func (w *huffmanBitWriter) writeBlockHuff(eof bool, input []byte, sync bool) { + if w.err != nil { + return + } + + // Clear histogram + for i := range w.literalFreq[:] { + w.literalFreq[i] = 0 + } + if !w.lastHuffMan { + for i := range w.offsetFreq[:] { + w.offsetFreq[i] = 0 + } + } + + // Fill is rarely better... + const fill = false + const numLiterals = endBlockMarker + 1 + const numOffsets = 1 + + // Add everything as literals + // We have to estimate the header size. + // Assume header is around 70 bytes: + // https://stackoverflow.com/a/25454430 + const guessHeaderSizeBits = 70 * 8 + histogram(input, w.literalFreq[:numLiterals], fill) + w.literalFreq[endBlockMarker] = 1 + w.tmpLitEncoding.generate(w.literalFreq[:numLiterals], 15) + if fill { + // Clear fill... + for i := range w.literalFreq[:numLiterals] { + w.literalFreq[i] = 0 + } + histogram(input, w.literalFreq[:numLiterals], false) + } + estBits := w.tmpLitEncoding.canReuseBits(w.literalFreq[:numLiterals]) + estBits += w.lastHeader + if w.lastHeader == 0 { + estBits += guessHeaderSizeBits + } + estBits += estBits >> w.logNewTablePenalty + + // Store bytes, if we don't get a reasonable improvement. + ssize, storable := w.storedSize(input) + if storable && ssize <= estBits { + w.writeStoredHeader(len(input), eof) + w.writeBytes(input) + return + } + + if w.lastHeader > 0 { + reuseSize := w.literalEncoding.canReuseBits(w.literalFreq[:256]) + + if estBits < reuseSize { + if debugDeflate { + //fmt.Println("not reusing, reuse:", reuseSize/8, "> new:", estBits/8, "- header est:", w.lastHeader/8) + } + // We owe an EOB + w.writeCode(w.literalEncoding.codes[endBlockMarker]) + w.lastHeader = 0 + } else if debugDeflate { + fmt.Println("reusing, reuse:", reuseSize/8, "> new:", estBits/8, "- header est:", w.lastHeader/8) + } + } + + count := 0 + if w.lastHeader == 0 { + // Use the temp encoding, so swap. + w.literalEncoding, w.tmpLitEncoding = w.tmpLitEncoding, w.literalEncoding + // Generate codegen and codegenFrequencies, which indicates how to encode + // the literalEncoding and the offsetEncoding. + w.generateCodegen(numLiterals, numOffsets, w.literalEncoding, huffOffset) + w.codegenEncoding.generate(w.codegenFreq[:], 7) + numCodegens := w.codegens() + + // Huffman. + w.writeDynamicHeader(numLiterals, numOffsets, numCodegens, eof) + w.lastHuffMan = true + w.lastHeader, _ = w.headerSize() + if debugDeflate { + count += w.lastHeader + fmt.Println("header:", count/8) + } + } + + encoding := w.literalEncoding.codes[:256] + // Go 1.16 LOVES having these on stack. At least 1.5x the speed. + bits, nbits, nbytes := w.bits, w.nbits, w.nbytes + for _, t := range input { + // Bitwriting inlined, ~30% speedup + c := encoding[t] + bits |= uint64(c.code) << nbits + nbits += c.len + if debugDeflate { + count += int(c.len) + } + if nbits >= 48 { + binary.LittleEndian.PutUint64(w.bytes[nbytes:], bits) + //*(*uint64)(unsafe.Pointer(&w.bytes[nbytes])) = bits + bits >>= 48 + nbits -= 48 + nbytes += 6 + if nbytes >= bufferFlushSize { + if w.err != nil { + nbytes = 0 + return + } + _, w.err = w.writer.Write(w.bytes[:nbytes]) + nbytes = 0 + } + } + } + // Restore... + w.bits, w.nbits, w.nbytes = bits, nbits, nbytes + + if debugDeflate { + fmt.Println("wrote", count/8, "bytes") + } + if eof || sync { + w.writeCode(w.literalEncoding.codes[endBlockMarker]) + w.lastHeader = 0 + w.lastHuffMan = false + } +} diff --git a/vendor/github.com/klauspost/compress/flate/huffman_code.go b/vendor/github.com/klauspost/compress/flate/huffman_code.go new file mode 100644 index 0000000..67b2b38 --- /dev/null +++ b/vendor/github.com/klauspost/compress/flate/huffman_code.go @@ -0,0 +1,374 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package flate + +import ( + "math" + "math/bits" +) + +const ( + maxBitsLimit = 16 + // number of valid literals + literalCount = 286 +) + +// hcode is a huffman code with a bit code and bit length. +type hcode struct { + code, len uint16 +} + +type huffmanEncoder struct { + codes []hcode + bitCount [17]int32 + + // Allocate a reusable buffer with the longest possible frequency table. + // Possible lengths are codegenCodeCount, offsetCodeCount and literalCount. + // The largest of these is literalCount, so we allocate for that case. + freqcache [literalCount + 1]literalNode +} + +type literalNode struct { + literal uint16 + freq uint16 +} + +// A levelInfo describes the state of the constructed tree for a given depth. +type levelInfo struct { + // Our level. for better printing + level int32 + + // The frequency of the last node at this level + lastFreq int32 + + // The frequency of the next character to add to this level + nextCharFreq int32 + + // The frequency of the next pair (from level below) to add to this level. + // Only valid if the "needed" value of the next lower level is 0. + nextPairFreq int32 + + // The number of chains remaining to generate for this level before moving + // up to the next level + needed int32 +} + +// set sets the code and length of an hcode. +func (h *hcode) set(code uint16, length uint16) { + h.len = length + h.code = code +} + +func reverseBits(number uint16, bitLength byte) uint16 { + return bits.Reverse16(number << ((16 - bitLength) & 15)) +} + +func maxNode() literalNode { return literalNode{math.MaxUint16, math.MaxUint16} } + +func newHuffmanEncoder(size int) *huffmanEncoder { + // Make capacity to next power of two. + c := uint(bits.Len32(uint32(size - 1))) + return &huffmanEncoder{codes: make([]hcode, size, 1<= 3 +// The cases of 0, 1, and 2 literals are handled by special case code. +// +// list An array of the literals with non-zero frequencies +// and their associated frequencies. The array is in order of increasing +// frequency, and has as its last element a special element with frequency +// MaxInt32 +// maxBits The maximum number of bits that should be used to encode any literal. +// Must be less than 16. +// return An integer array in which array[i] indicates the number of literals +// that should be encoded in i bits. +func (h *huffmanEncoder) bitCounts(list []literalNode, maxBits int32) []int32 { + if maxBits >= maxBitsLimit { + panic("flate: maxBits too large") + } + n := int32(len(list)) + list = list[0 : n+1] + list[n] = maxNode() + + // The tree can't have greater depth than n - 1, no matter what. This + // saves a little bit of work in some small cases + if maxBits > n-1 { + maxBits = n - 1 + } + + // Create information about each of the levels. + // A bogus "Level 0" whose sole purpose is so that + // level1.prev.needed==0. This makes level1.nextPairFreq + // be a legitimate value that never gets chosen. + var levels [maxBitsLimit]levelInfo + // leafCounts[i] counts the number of literals at the left + // of ancestors of the rightmost node at level i. + // leafCounts[i][j] is the number of literals at the left + // of the level j ancestor. + var leafCounts [maxBitsLimit][maxBitsLimit]int32 + + for level := int32(1); level <= maxBits; level++ { + // For every level, the first two items are the first two characters. + // We initialize the levels as if we had already figured this out. + levels[level] = levelInfo{ + level: level, + lastFreq: int32(list[1].freq), + nextCharFreq: int32(list[2].freq), + nextPairFreq: int32(list[0].freq) + int32(list[1].freq), + } + leafCounts[level][level] = 2 + if level == 1 { + levels[level].nextPairFreq = math.MaxInt32 + } + } + + // We need a total of 2*n - 2 items at top level and have already generated 2. + levels[maxBits].needed = 2*n - 4 + + level := maxBits + for { + l := &levels[level] + if l.nextPairFreq == math.MaxInt32 && l.nextCharFreq == math.MaxInt32 { + // We've run out of both leafs and pairs. + // End all calculations for this level. + // To make sure we never come back to this level or any lower level, + // set nextPairFreq impossibly large. + l.needed = 0 + levels[level+1].nextPairFreq = math.MaxInt32 + level++ + continue + } + + prevFreq := l.lastFreq + if l.nextCharFreq < l.nextPairFreq { + // The next item on this row is a leaf node. + n := leafCounts[level][level] + 1 + l.lastFreq = l.nextCharFreq + // Lower leafCounts are the same of the previous node. + leafCounts[level][level] = n + e := list[n] + if e.literal < math.MaxUint16 { + l.nextCharFreq = int32(e.freq) + } else { + l.nextCharFreq = math.MaxInt32 + } + } else { + // The next item on this row is a pair from the previous row. + // nextPairFreq isn't valid until we generate two + // more values in the level below + l.lastFreq = l.nextPairFreq + // Take leaf counts from the lower level, except counts[level] remains the same. + copy(leafCounts[level][:level], leafCounts[level-1][:level]) + levels[l.level-1].needed = 2 + } + + if l.needed--; l.needed == 0 { + // We've done everything we need to do for this level. + // Continue calculating one level up. Fill in nextPairFreq + // of that level with the sum of the two nodes we've just calculated on + // this level. + if l.level == maxBits { + // All done! + break + } + levels[l.level+1].nextPairFreq = prevFreq + l.lastFreq + level++ + } else { + // If we stole from below, move down temporarily to replenish it. + for levels[level-1].needed > 0 { + level-- + } + } + } + + // Somethings is wrong if at the end, the top level is null or hasn't used + // all of the leaves. + if leafCounts[maxBits][maxBits] != n { + panic("leafCounts[maxBits][maxBits] != n") + } + + bitCount := h.bitCount[:maxBits+1] + bits := 1 + counts := &leafCounts[maxBits] + for level := maxBits; level > 0; level-- { + // chain.leafCount gives the number of literals requiring at least "bits" + // bits to encode. + bitCount[bits] = counts[level] - counts[level-1] + bits++ + } + return bitCount +} + +// Look at the leaves and assign them a bit count and an encoding as specified +// in RFC 1951 3.2.2 +func (h *huffmanEncoder) assignEncodingAndSize(bitCount []int32, list []literalNode) { + code := uint16(0) + for n, bits := range bitCount { + code <<= 1 + if n == 0 || bits == 0 { + continue + } + // The literals list[len(list)-bits] .. list[len(list)-bits] + // are encoded using "bits" bits, and get the values + // code, code + 1, .... The code values are + // assigned in literal order (not frequency order). + chunk := list[len(list)-int(bits):] + + sortByLiteral(chunk) + for _, node := range chunk { + h.codes[node.literal] = hcode{code: reverseBits(code, uint8(n)), len: uint16(n)} + code++ + } + list = list[0 : len(list)-int(bits)] + } +} + +// Update this Huffman Code object to be the minimum code for the specified frequency count. +// +// freq An array of frequencies, in which frequency[i] gives the frequency of literal i. +// maxBits The maximum number of bits to use for any literal. +func (h *huffmanEncoder) generate(freq []uint16, maxBits int32) { + list := h.freqcache[:len(freq)+1] + // Number of non-zero literals + count := 0 + // Set list to be the set of all non-zero literals and their frequencies + for i, f := range freq { + if f != 0 { + list[count] = literalNode{uint16(i), f} + count++ + } else { + list[count] = literalNode{} + h.codes[i].len = 0 + } + } + list[len(freq)] = literalNode{} + + list = list[:count] + if count <= 2 { + // Handle the small cases here, because they are awkward for the general case code. With + // two or fewer literals, everything has bit length 1. + for i, node := range list { + // "list" is in order of increasing literal value. + h.codes[node.literal].set(uint16(i), 1) + } + return + } + sortByFreq(list) + + // Get the number of literals for each bit count + bitCount := h.bitCounts(list, maxBits) + // And do the assignment + h.assignEncodingAndSize(bitCount, list) +} + +// atLeastOne clamps the result between 1 and 15. +func atLeastOne(v float32) float32 { + if v < 1 { + return 1 + } + if v > 15 { + return 15 + } + return v +} + +// Unassigned values are assigned '1' in the histogram. +func fillHist(b []uint16) { + for i, v := range b { + if v == 0 { + b[i] = 1 + } + } +} + +func histogram(b []byte, h []uint16, fill bool) { + h = h[:256] + for _, t := range b { + h[t]++ + } + if fill { + fillHist(h) + } +} diff --git a/vendor/github.com/klauspost/compress/flate/huffman_sortByFreq.go b/vendor/github.com/klauspost/compress/flate/huffman_sortByFreq.go new file mode 100644 index 0000000..2077802 --- /dev/null +++ b/vendor/github.com/klauspost/compress/flate/huffman_sortByFreq.go @@ -0,0 +1,178 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package flate + +// Sort sorts data. +// It makes one call to data.Len to determine n, and O(n*log(n)) calls to +// data.Less and data.Swap. The sort is not guaranteed to be stable. +func sortByFreq(data []literalNode) { + n := len(data) + quickSortByFreq(data, 0, n, maxDepth(n)) +} + +func quickSortByFreq(data []literalNode, a, b, maxDepth int) { + for b-a > 12 { // Use ShellSort for slices <= 12 elements + if maxDepth == 0 { + heapSort(data, a, b) + return + } + maxDepth-- + mlo, mhi := doPivotByFreq(data, a, b) + // Avoiding recursion on the larger subproblem guarantees + // a stack depth of at most lg(b-a). + if mlo-a < b-mhi { + quickSortByFreq(data, a, mlo, maxDepth) + a = mhi // i.e., quickSortByFreq(data, mhi, b) + } else { + quickSortByFreq(data, mhi, b, maxDepth) + b = mlo // i.e., quickSortByFreq(data, a, mlo) + } + } + if b-a > 1 { + // Do ShellSort pass with gap 6 + // It could be written in this simplified form cause b-a <= 12 + for i := a + 6; i < b; i++ { + if data[i].freq == data[i-6].freq && data[i].literal < data[i-6].literal || data[i].freq < data[i-6].freq { + data[i], data[i-6] = data[i-6], data[i] + } + } + insertionSortByFreq(data, a, b) + } +} + +// siftDownByFreq implements the heap property on data[lo, hi). +// first is an offset into the array where the root of the heap lies. +func siftDownByFreq(data []literalNode, lo, hi, first int) { + root := lo + for { + child := 2*root + 1 + if child >= hi { + break + } + if child+1 < hi && (data[first+child].freq == data[first+child+1].freq && data[first+child].literal < data[first+child+1].literal || data[first+child].freq < data[first+child+1].freq) { + child++ + } + if data[first+root].freq == data[first+child].freq && data[first+root].literal > data[first+child].literal || data[first+root].freq > data[first+child].freq { + return + } + data[first+root], data[first+child] = data[first+child], data[first+root] + root = child + } +} +func doPivotByFreq(data []literalNode, lo, hi int) (midlo, midhi int) { + m := int(uint(lo+hi) >> 1) // Written like this to avoid integer overflow. + if hi-lo > 40 { + // Tukey's ``Ninther,'' median of three medians of three. + s := (hi - lo) / 8 + medianOfThreeSortByFreq(data, lo, lo+s, lo+2*s) + medianOfThreeSortByFreq(data, m, m-s, m+s) + medianOfThreeSortByFreq(data, hi-1, hi-1-s, hi-1-2*s) + } + medianOfThreeSortByFreq(data, lo, m, hi-1) + + // Invariants are: + // data[lo] = pivot (set up by ChoosePivot) + // data[lo < i < a] < pivot + // data[a <= i < b] <= pivot + // data[b <= i < c] unexamined + // data[c <= i < hi-1] > pivot + // data[hi-1] >= pivot + pivot := lo + a, c := lo+1, hi-1 + + for ; a < c && (data[a].freq == data[pivot].freq && data[a].literal < data[pivot].literal || data[a].freq < data[pivot].freq); a++ { + } + b := a + for { + for ; b < c && (data[pivot].freq == data[b].freq && data[pivot].literal > data[b].literal || data[pivot].freq > data[b].freq); b++ { // data[b] <= pivot + } + for ; b < c && (data[pivot].freq == data[c-1].freq && data[pivot].literal < data[c-1].literal || data[pivot].freq < data[c-1].freq); c-- { // data[c-1] > pivot + } + if b >= c { + break + } + // data[b] > pivot; data[c-1] <= pivot + data[b], data[c-1] = data[c-1], data[b] + b++ + c-- + } + // If hi-c<3 then there are duplicates (by property of median of nine). + // Let's be a bit more conservative, and set border to 5. + protect := hi-c < 5 + if !protect && hi-c < (hi-lo)/4 { + // Lets test some points for equality to pivot + dups := 0 + if data[pivot].freq == data[hi-1].freq && data[pivot].literal > data[hi-1].literal || data[pivot].freq > data[hi-1].freq { // data[hi-1] = pivot + data[c], data[hi-1] = data[hi-1], data[c] + c++ + dups++ + } + if data[b-1].freq == data[pivot].freq && data[b-1].literal > data[pivot].literal || data[b-1].freq > data[pivot].freq { // data[b-1] = pivot + b-- + dups++ + } + // m-lo = (hi-lo)/2 > 6 + // b-lo > (hi-lo)*3/4-1 > 8 + // ==> m < b ==> data[m] <= pivot + if data[m].freq == data[pivot].freq && data[m].literal > data[pivot].literal || data[m].freq > data[pivot].freq { // data[m] = pivot + data[m], data[b-1] = data[b-1], data[m] + b-- + dups++ + } + // if at least 2 points are equal to pivot, assume skewed distribution + protect = dups > 1 + } + if protect { + // Protect against a lot of duplicates + // Add invariant: + // data[a <= i < b] unexamined + // data[b <= i < c] = pivot + for { + for ; a < b && (data[b-1].freq == data[pivot].freq && data[b-1].literal > data[pivot].literal || data[b-1].freq > data[pivot].freq); b-- { // data[b] == pivot + } + for ; a < b && (data[a].freq == data[pivot].freq && data[a].literal < data[pivot].literal || data[a].freq < data[pivot].freq); a++ { // data[a] < pivot + } + if a >= b { + break + } + // data[a] == pivot; data[b-1] < pivot + data[a], data[b-1] = data[b-1], data[a] + a++ + b-- + } + } + // Swap pivot into middle + data[pivot], data[b-1] = data[b-1], data[pivot] + return b - 1, c +} + +// Insertion sort +func insertionSortByFreq(data []literalNode, a, b int) { + for i := a + 1; i < b; i++ { + for j := i; j > a && (data[j].freq == data[j-1].freq && data[j].literal < data[j-1].literal || data[j].freq < data[j-1].freq); j-- { + data[j], data[j-1] = data[j-1], data[j] + } + } +} + +// quickSortByFreq, loosely following Bentley and McIlroy, +// ``Engineering a Sort Function,'' SP&E November 1993. + +// medianOfThreeSortByFreq moves the median of the three values data[m0], data[m1], data[m2] into data[m1]. +func medianOfThreeSortByFreq(data []literalNode, m1, m0, m2 int) { + // sort 3 elements + if data[m1].freq == data[m0].freq && data[m1].literal < data[m0].literal || data[m1].freq < data[m0].freq { + data[m1], data[m0] = data[m0], data[m1] + } + // data[m0] <= data[m1] + if data[m2].freq == data[m1].freq && data[m2].literal < data[m1].literal || data[m2].freq < data[m1].freq { + data[m2], data[m1] = data[m1], data[m2] + // data[m0] <= data[m2] && data[m1] < data[m2] + if data[m1].freq == data[m0].freq && data[m1].literal < data[m0].literal || data[m1].freq < data[m0].freq { + data[m1], data[m0] = data[m0], data[m1] + } + } + // now data[m0] <= data[m1] <= data[m2] +} diff --git a/vendor/github.com/klauspost/compress/flate/huffman_sortByLiteral.go b/vendor/github.com/klauspost/compress/flate/huffman_sortByLiteral.go new file mode 100644 index 0000000..93f1aea --- /dev/null +++ b/vendor/github.com/klauspost/compress/flate/huffman_sortByLiteral.go @@ -0,0 +1,201 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package flate + +// Sort sorts data. +// It makes one call to data.Len to determine n, and O(n*log(n)) calls to +// data.Less and data.Swap. The sort is not guaranteed to be stable. +func sortByLiteral(data []literalNode) { + n := len(data) + quickSort(data, 0, n, maxDepth(n)) +} + +func quickSort(data []literalNode, a, b, maxDepth int) { + for b-a > 12 { // Use ShellSort for slices <= 12 elements + if maxDepth == 0 { + heapSort(data, a, b) + return + } + maxDepth-- + mlo, mhi := doPivot(data, a, b) + // Avoiding recursion on the larger subproblem guarantees + // a stack depth of at most lg(b-a). + if mlo-a < b-mhi { + quickSort(data, a, mlo, maxDepth) + a = mhi // i.e., quickSort(data, mhi, b) + } else { + quickSort(data, mhi, b, maxDepth) + b = mlo // i.e., quickSort(data, a, mlo) + } + } + if b-a > 1 { + // Do ShellSort pass with gap 6 + // It could be written in this simplified form cause b-a <= 12 + for i := a + 6; i < b; i++ { + if data[i].literal < data[i-6].literal { + data[i], data[i-6] = data[i-6], data[i] + } + } + insertionSort(data, a, b) + } +} +func heapSort(data []literalNode, a, b int) { + first := a + lo := 0 + hi := b - a + + // Build heap with greatest element at top. + for i := (hi - 1) / 2; i >= 0; i-- { + siftDown(data, i, hi, first) + } + + // Pop elements, largest first, into end of data. + for i := hi - 1; i >= 0; i-- { + data[first], data[first+i] = data[first+i], data[first] + siftDown(data, lo, i, first) + } +} + +// siftDown implements the heap property on data[lo, hi). +// first is an offset into the array where the root of the heap lies. +func siftDown(data []literalNode, lo, hi, first int) { + root := lo + for { + child := 2*root + 1 + if child >= hi { + break + } + if child+1 < hi && data[first+child].literal < data[first+child+1].literal { + child++ + } + if data[first+root].literal > data[first+child].literal { + return + } + data[first+root], data[first+child] = data[first+child], data[first+root] + root = child + } +} +func doPivot(data []literalNode, lo, hi int) (midlo, midhi int) { + m := int(uint(lo+hi) >> 1) // Written like this to avoid integer overflow. + if hi-lo > 40 { + // Tukey's ``Ninther,'' median of three medians of three. + s := (hi - lo) / 8 + medianOfThree(data, lo, lo+s, lo+2*s) + medianOfThree(data, m, m-s, m+s) + medianOfThree(data, hi-1, hi-1-s, hi-1-2*s) + } + medianOfThree(data, lo, m, hi-1) + + // Invariants are: + // data[lo] = pivot (set up by ChoosePivot) + // data[lo < i < a] < pivot + // data[a <= i < b] <= pivot + // data[b <= i < c] unexamined + // data[c <= i < hi-1] > pivot + // data[hi-1] >= pivot + pivot := lo + a, c := lo+1, hi-1 + + for ; a < c && data[a].literal < data[pivot].literal; a++ { + } + b := a + for { + for ; b < c && data[pivot].literal > data[b].literal; b++ { // data[b] <= pivot + } + for ; b < c && data[pivot].literal < data[c-1].literal; c-- { // data[c-1] > pivot + } + if b >= c { + break + } + // data[b] > pivot; data[c-1] <= pivot + data[b], data[c-1] = data[c-1], data[b] + b++ + c-- + } + // If hi-c<3 then there are duplicates (by property of median of nine). + // Let's be a bit more conservative, and set border to 5. + protect := hi-c < 5 + if !protect && hi-c < (hi-lo)/4 { + // Lets test some points for equality to pivot + dups := 0 + if data[pivot].literal > data[hi-1].literal { // data[hi-1] = pivot + data[c], data[hi-1] = data[hi-1], data[c] + c++ + dups++ + } + if data[b-1].literal > data[pivot].literal { // data[b-1] = pivot + b-- + dups++ + } + // m-lo = (hi-lo)/2 > 6 + // b-lo > (hi-lo)*3/4-1 > 8 + // ==> m < b ==> data[m] <= pivot + if data[m].literal > data[pivot].literal { // data[m] = pivot + data[m], data[b-1] = data[b-1], data[m] + b-- + dups++ + } + // if at least 2 points are equal to pivot, assume skewed distribution + protect = dups > 1 + } + if protect { + // Protect against a lot of duplicates + // Add invariant: + // data[a <= i < b] unexamined + // data[b <= i < c] = pivot + for { + for ; a < b && data[b-1].literal > data[pivot].literal; b-- { // data[b] == pivot + } + for ; a < b && data[a].literal < data[pivot].literal; a++ { // data[a] < pivot + } + if a >= b { + break + } + // data[a] == pivot; data[b-1] < pivot + data[a], data[b-1] = data[b-1], data[a] + a++ + b-- + } + } + // Swap pivot into middle + data[pivot], data[b-1] = data[b-1], data[pivot] + return b - 1, c +} + +// Insertion sort +func insertionSort(data []literalNode, a, b int) { + for i := a + 1; i < b; i++ { + for j := i; j > a && data[j].literal < data[j-1].literal; j-- { + data[j], data[j-1] = data[j-1], data[j] + } + } +} + +// maxDepth returns a threshold at which quicksort should switch +// to heapsort. It returns 2*ceil(lg(n+1)). +func maxDepth(n int) int { + var depth int + for i := n; i > 0; i >>= 1 { + depth++ + } + return depth * 2 +} + +// medianOfThree moves the median of the three values data[m0], data[m1], data[m2] into data[m1]. +func medianOfThree(data []literalNode, m1, m0, m2 int) { + // sort 3 elements + if data[m1].literal < data[m0].literal { + data[m1], data[m0] = data[m0], data[m1] + } + // data[m0] <= data[m1] + if data[m2].literal < data[m1].literal { + data[m2], data[m1] = data[m1], data[m2] + // data[m0] <= data[m2] && data[m1] < data[m2] + if data[m1].literal < data[m0].literal { + data[m1], data[m0] = data[m0], data[m1] + } + } + // now data[m0] <= data[m1] <= data[m2] +} diff --git a/vendor/github.com/klauspost/compress/flate/inflate.go b/vendor/github.com/klauspost/compress/flate/inflate.go new file mode 100644 index 0000000..16bc514 --- /dev/null +++ b/vendor/github.com/klauspost/compress/flate/inflate.go @@ -0,0 +1,1010 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package flate implements the DEFLATE compressed data format, described in +// RFC 1951. The gzip and zlib packages implement access to DEFLATE-based file +// formats. +package flate + +import ( + "bufio" + "fmt" + "io" + "math/bits" + "strconv" + "sync" +) + +const ( + maxCodeLen = 16 // max length of Huffman code + maxCodeLenMask = 15 // mask for max length of Huffman code + // The next three numbers come from the RFC section 3.2.7, with the + // additional proviso in section 3.2.5 which implies that distance codes + // 30 and 31 should never occur in compressed data. + maxNumLit = 286 + maxNumDist = 30 + numCodes = 19 // number of codes in Huffman meta-code + + debugDecode = false +) + +// Value of length - 3 and extra bits. +type lengthExtra struct { + length, extra uint8 +} + +var decCodeToLen = [32]lengthExtra{{length: 0x0, extra: 0x0}, {length: 0x1, extra: 0x0}, {length: 0x2, extra: 0x0}, {length: 0x3, extra: 0x0}, {length: 0x4, extra: 0x0}, {length: 0x5, extra: 0x0}, {length: 0x6, extra: 0x0}, {length: 0x7, extra: 0x0}, {length: 0x8, extra: 0x1}, {length: 0xa, extra: 0x1}, {length: 0xc, extra: 0x1}, {length: 0xe, extra: 0x1}, {length: 0x10, extra: 0x2}, {length: 0x14, extra: 0x2}, {length: 0x18, extra: 0x2}, {length: 0x1c, extra: 0x2}, {length: 0x20, extra: 0x3}, {length: 0x28, extra: 0x3}, {length: 0x30, extra: 0x3}, {length: 0x38, extra: 0x3}, {length: 0x40, extra: 0x4}, {length: 0x50, extra: 0x4}, {length: 0x60, extra: 0x4}, {length: 0x70, extra: 0x4}, {length: 0x80, extra: 0x5}, {length: 0xa0, extra: 0x5}, {length: 0xc0, extra: 0x5}, {length: 0xe0, extra: 0x5}, {length: 0xff, extra: 0x0}, {length: 0x0, extra: 0x0}, {length: 0x0, extra: 0x0}, {length: 0x0, extra: 0x0}} + +// Initialize the fixedHuffmanDecoder only once upon first use. +var fixedOnce sync.Once +var fixedHuffmanDecoder huffmanDecoder + +// A CorruptInputError reports the presence of corrupt input at a given offset. +type CorruptInputError int64 + +func (e CorruptInputError) Error() string { + return "flate: corrupt input before offset " + strconv.FormatInt(int64(e), 10) +} + +// An InternalError reports an error in the flate code itself. +type InternalError string + +func (e InternalError) Error() string { return "flate: internal error: " + string(e) } + +// A ReadError reports an error encountered while reading input. +// +// Deprecated: No longer returned. +type ReadError struct { + Offset int64 // byte offset where error occurred + Err error // error returned by underlying Read +} + +func (e *ReadError) Error() string { + return "flate: read error at offset " + strconv.FormatInt(e.Offset, 10) + ": " + e.Err.Error() +} + +// A WriteError reports an error encountered while writing output. +// +// Deprecated: No longer returned. +type WriteError struct { + Offset int64 // byte offset where error occurred + Err error // error returned by underlying Write +} + +func (e *WriteError) Error() string { + return "flate: write error at offset " + strconv.FormatInt(e.Offset, 10) + ": " + e.Err.Error() +} + +// Resetter resets a ReadCloser returned by NewReader or NewReaderDict to +// to switch to a new underlying Reader. This permits reusing a ReadCloser +// instead of allocating a new one. +type Resetter interface { + // Reset discards any buffered data and resets the Resetter as if it was + // newly initialized with the given reader. + Reset(r io.Reader, dict []byte) error +} + +// The data structure for decoding Huffman tables is based on that of +// zlib. There is a lookup table of a fixed bit width (huffmanChunkBits), +// For codes smaller than the table width, there are multiple entries +// (each combination of trailing bits has the same value). For codes +// larger than the table width, the table contains a link to an overflow +// table. The width of each entry in the link table is the maximum code +// size minus the chunk width. +// +// Note that you can do a lookup in the table even without all bits +// filled. Since the extra bits are zero, and the DEFLATE Huffman codes +// have the property that shorter codes come before longer ones, the +// bit length estimate in the result is a lower bound on the actual +// number of bits. +// +// See the following: +// http://www.gzip.org/algorithm.txt + +// chunk & 15 is number of bits +// chunk >> 4 is value, including table link + +const ( + huffmanChunkBits = 9 + huffmanNumChunks = 1 << huffmanChunkBits + huffmanCountMask = 15 + huffmanValueShift = 4 +) + +type huffmanDecoder struct { + maxRead int // the maximum number of bits we can read and not overread + chunks *[huffmanNumChunks]uint16 // chunks as described above + links [][]uint16 // overflow links + linkMask uint32 // mask the width of the link table +} + +// Initialize Huffman decoding tables from array of code lengths. +// Following this function, h is guaranteed to be initialized into a complete +// tree (i.e., neither over-subscribed nor under-subscribed). The exception is a +// degenerate case where the tree has only a single symbol with length 1. Empty +// trees are permitted. +func (h *huffmanDecoder) init(lengths []int) bool { + // Sanity enables additional runtime tests during Huffman + // table construction. It's intended to be used during + // development to supplement the currently ad-hoc unit tests. + const sanity = false + + if h.chunks == nil { + h.chunks = &[huffmanNumChunks]uint16{} + } + if h.maxRead != 0 { + *h = huffmanDecoder{chunks: h.chunks, links: h.links} + } + + // Count number of codes of each length, + // compute maxRead and max length. + var count [maxCodeLen]int + var min, max int + for _, n := range lengths { + if n == 0 { + continue + } + if min == 0 || n < min { + min = n + } + if n > max { + max = n + } + count[n&maxCodeLenMask]++ + } + + // Empty tree. The decompressor.huffSym function will fail later if the tree + // is used. Technically, an empty tree is only valid for the HDIST tree and + // not the HCLEN and HLIT tree. However, a stream with an empty HCLEN tree + // is guaranteed to fail since it will attempt to use the tree to decode the + // codes for the HLIT and HDIST trees. Similarly, an empty HLIT tree is + // guaranteed to fail later since the compressed data section must be + // composed of at least one symbol (the end-of-block marker). + if max == 0 { + return true + } + + code := 0 + var nextcode [maxCodeLen]int + for i := min; i <= max; i++ { + code <<= 1 + nextcode[i&maxCodeLenMask] = code + code += count[i&maxCodeLenMask] + } + + // Check that the coding is complete (i.e., that we've + // assigned all 2-to-the-max possible bit sequences). + // Exception: To be compatible with zlib, we also need to + // accept degenerate single-code codings. See also + // TestDegenerateHuffmanCoding. + if code != 1< huffmanChunkBits { + numLinks := 1 << (uint(max) - huffmanChunkBits) + h.linkMask = uint32(numLinks - 1) + + // create link tables + link := nextcode[huffmanChunkBits+1] >> 1 + if cap(h.links) < huffmanNumChunks-link { + h.links = make([][]uint16, huffmanNumChunks-link) + } else { + h.links = h.links[:huffmanNumChunks-link] + } + for j := uint(link); j < huffmanNumChunks; j++ { + reverse := int(bits.Reverse16(uint16(j))) + reverse >>= uint(16 - huffmanChunkBits) + off := j - uint(link) + if sanity && h.chunks[reverse] != 0 { + panic("impossible: overwriting existing chunk") + } + h.chunks[reverse] = uint16(off<>= uint(16 - n) + if n <= huffmanChunkBits { + for off := reverse; off < len(h.chunks); off += 1 << uint(n) { + // We should never need to overwrite + // an existing chunk. Also, 0 is + // never a valid chunk, because the + // lower 4 "count" bits should be + // between 1 and 15. + if sanity && h.chunks[off] != 0 { + panic("impossible: overwriting existing chunk") + } + h.chunks[off] = chunk + } + } else { + j := reverse & (huffmanNumChunks - 1) + if sanity && h.chunks[j]&huffmanCountMask != huffmanChunkBits+1 { + // Longer codes should have been + // associated with a link table above. + panic("impossible: not an indirect chunk") + } + value := h.chunks[j] >> huffmanValueShift + linktab := h.links[value] + reverse >>= huffmanChunkBits + for off := reverse; off < len(linktab); off += 1 << uint(n-huffmanChunkBits) { + if sanity && linktab[off] != 0 { + panic("impossible: overwriting existing chunk") + } + linktab[off] = chunk + } + } + } + + if sanity { + // Above we've sanity checked that we never overwrote + // an existing entry. Here we additionally check that + // we filled the tables completely. + for i, chunk := range h.chunks { + if chunk == 0 { + // As an exception, in the degenerate + // single-code case, we allow odd + // chunks to be missing. + if code == 1 && i%2 == 1 { + continue + } + panic("impossible: missing chunk") + } + } + for _, linktab := range h.links { + for _, chunk := range linktab { + if chunk == 0 { + panic("impossible: missing chunk") + } + } + } + } + + return true +} + +// The actual read interface needed by NewReader. +// If the passed in io.Reader does not also have ReadByte, +// the NewReader will introduce its own buffering. +type Reader interface { + io.Reader + io.ByteReader +} + +// Decompress state. +type decompressor struct { + // Input source. + r Reader + roffset int64 + + // Huffman decoders for literal/length, distance. + h1, h2 huffmanDecoder + + // Length arrays used to define Huffman codes. + bits *[maxNumLit + maxNumDist]int + codebits *[numCodes]int + + // Output history, buffer. + dict dictDecoder + + // Next step in the decompression, + // and decompression state. + step func(*decompressor) + stepState int + err error + toRead []byte + hl, hd *huffmanDecoder + copyLen int + copyDist int + + // Temporary buffer (avoids repeated allocation). + buf [4]byte + + // Input bits, in top of b. + b uint32 + + nb uint + final bool +} + +func (f *decompressor) nextBlock() { + for f.nb < 1+2 { + if f.err = f.moreBits(); f.err != nil { + return + } + } + f.final = f.b&1 == 1 + f.b >>= 1 + typ := f.b & 3 + f.b >>= 2 + f.nb -= 1 + 2 + switch typ { + case 0: + f.dataBlock() + case 1: + // compressed, fixed Huffman tables + f.hl = &fixedHuffmanDecoder + f.hd = nil + f.huffmanBlockDecoder()() + case 2: + // compressed, dynamic Huffman tables + if f.err = f.readHuffman(); f.err != nil { + break + } + f.hl = &f.h1 + f.hd = &f.h2 + f.huffmanBlockDecoder()() + default: + // 3 is reserved. + if debugDecode { + fmt.Println("reserved data block encountered") + } + f.err = CorruptInputError(f.roffset) + } +} + +func (f *decompressor) Read(b []byte) (int, error) { + for { + if len(f.toRead) > 0 { + n := copy(b, f.toRead) + f.toRead = f.toRead[n:] + if len(f.toRead) == 0 { + return n, f.err + } + return n, nil + } + if f.err != nil { + return 0, f.err + } + f.step(f) + if f.err != nil && len(f.toRead) == 0 { + f.toRead = f.dict.readFlush() // Flush what's left in case of error + } + } +} + +// Support the io.WriteTo interface for io.Copy and friends. +func (f *decompressor) WriteTo(w io.Writer) (int64, error) { + total := int64(0) + flushed := false + for { + if len(f.toRead) > 0 { + n, err := w.Write(f.toRead) + total += int64(n) + if err != nil { + f.err = err + return total, err + } + if n != len(f.toRead) { + return total, io.ErrShortWrite + } + f.toRead = f.toRead[:0] + } + if f.err != nil && flushed { + if f.err == io.EOF { + return total, nil + } + return total, f.err + } + if f.err == nil { + f.step(f) + } + if len(f.toRead) == 0 && f.err != nil && !flushed { + f.toRead = f.dict.readFlush() // Flush what's left in case of error + flushed = true + } + } +} + +func (f *decompressor) Close() error { + if f.err == io.EOF { + return nil + } + return f.err +} + +// RFC 1951 section 3.2.7. +// Compression with dynamic Huffman codes + +var codeOrder = [...]int{16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15} + +func (f *decompressor) readHuffman() error { + // HLIT[5], HDIST[5], HCLEN[4]. + for f.nb < 5+5+4 { + if err := f.moreBits(); err != nil { + return err + } + } + nlit := int(f.b&0x1F) + 257 + if nlit > maxNumLit { + if debugDecode { + fmt.Println("nlit > maxNumLit", nlit) + } + return CorruptInputError(f.roffset) + } + f.b >>= 5 + ndist := int(f.b&0x1F) + 1 + if ndist > maxNumDist { + if debugDecode { + fmt.Println("ndist > maxNumDist", ndist) + } + return CorruptInputError(f.roffset) + } + f.b >>= 5 + nclen := int(f.b&0xF) + 4 + // numCodes is 19, so nclen is always valid. + f.b >>= 4 + f.nb -= 5 + 5 + 4 + + // (HCLEN+4)*3 bits: code lengths in the magic codeOrder order. + for i := 0; i < nclen; i++ { + for f.nb < 3 { + if err := f.moreBits(); err != nil { + return err + } + } + f.codebits[codeOrder[i]] = int(f.b & 0x7) + f.b >>= 3 + f.nb -= 3 + } + for i := nclen; i < len(codeOrder); i++ { + f.codebits[codeOrder[i]] = 0 + } + if !f.h1.init(f.codebits[0:]) { + if debugDecode { + fmt.Println("init codebits failed") + } + return CorruptInputError(f.roffset) + } + + // HLIT + 257 code lengths, HDIST + 1 code lengths, + // using the code length Huffman code. + for i, n := 0, nlit+ndist; i < n; { + x, err := f.huffSym(&f.h1) + if err != nil { + return err + } + if x < 16 { + // Actual length. + f.bits[i] = x + i++ + continue + } + // Repeat previous length or zero. + var rep int + var nb uint + var b int + switch x { + default: + return InternalError("unexpected length code") + case 16: + rep = 3 + nb = 2 + if i == 0 { + if debugDecode { + fmt.Println("i==0") + } + return CorruptInputError(f.roffset) + } + b = f.bits[i-1] + case 17: + rep = 3 + nb = 3 + b = 0 + case 18: + rep = 11 + nb = 7 + b = 0 + } + for f.nb < nb { + if err := f.moreBits(); err != nil { + if debugDecode { + fmt.Println("morebits:", err) + } + return err + } + } + rep += int(f.b & uint32(1<<(nb®SizeMaskUint32)-1)) + f.b >>= nb & regSizeMaskUint32 + f.nb -= nb + if i+rep > n { + if debugDecode { + fmt.Println("i+rep > n", i, rep, n) + } + return CorruptInputError(f.roffset) + } + for j := 0; j < rep; j++ { + f.bits[i] = b + i++ + } + } + + if !f.h1.init(f.bits[0:nlit]) || !f.h2.init(f.bits[nlit:nlit+ndist]) { + if debugDecode { + fmt.Println("init2 failed") + } + return CorruptInputError(f.roffset) + } + + // As an optimization, we can initialize the maxRead bits to read at a time + // for the HLIT tree to the length of the EOB marker since we know that + // every block must terminate with one. This preserves the property that + // we never read any extra bytes after the end of the DEFLATE stream. + if f.h1.maxRead < f.bits[endBlockMarker] { + f.h1.maxRead = f.bits[endBlockMarker] + } + if !f.final { + // If not the final block, the smallest block possible is + // a predefined table, BTYPE=01, with a single EOB marker. + // This will take up 3 + 7 bits. + f.h1.maxRead += 10 + } + + return nil +} + +// Decode a single Huffman block from f. +// hl and hd are the Huffman states for the lit/length values +// and the distance values, respectively. If hd == nil, using the +// fixed distance encoding associated with fixed Huffman blocks. +func (f *decompressor) huffmanBlockGeneric() { + const ( + stateInit = iota // Zero value must be stateInit + stateDict + ) + + switch f.stepState { + case stateInit: + goto readLiteral + case stateDict: + goto copyHistory + } + +readLiteral: + // Read literal and/or (length, distance) according to RFC section 3.2.3. + { + var v int + { + // Inlined v, err := f.huffSym(f.hl) + // Since a huffmanDecoder can be empty or be composed of a degenerate tree + // with single element, huffSym must error on these two edge cases. In both + // cases, the chunks slice will be 0 for the invalid sequence, leading it + // satisfy the n == 0 check below. + n := uint(f.hl.maxRead) + // Optimization. Compiler isn't smart enough to keep f.b,f.nb in registers, + // but is smart enough to keep local variables in registers, so use nb and b, + // inline call to moreBits and reassign b,nb back to f on return. + nb, b := f.nb, f.b + for { + for nb < n { + c, err := f.r.ReadByte() + if err != nil { + f.b = b + f.nb = nb + f.err = noEOF(err) + return + } + f.roffset++ + b |= uint32(c) << (nb & regSizeMaskUint32) + nb += 8 + } + chunk := f.hl.chunks[b&(huffmanNumChunks-1)] + n = uint(chunk & huffmanCountMask) + if n > huffmanChunkBits { + chunk = f.hl.links[chunk>>huffmanValueShift][(b>>huffmanChunkBits)&f.hl.linkMask] + n = uint(chunk & huffmanCountMask) + } + if n <= nb { + if n == 0 { + f.b = b + f.nb = nb + if debugDecode { + fmt.Println("huffsym: n==0") + } + f.err = CorruptInputError(f.roffset) + return + } + f.b = b >> (n & regSizeMaskUint32) + f.nb = nb - n + v = int(chunk >> huffmanValueShift) + break + } + } + } + + var n uint // number of bits extra + var length int + var err error + switch { + case v < 256: + f.dict.writeByte(byte(v)) + if f.dict.availWrite() == 0 { + f.toRead = f.dict.readFlush() + f.step = (*decompressor).huffmanBlockGeneric + f.stepState = stateInit + return + } + goto readLiteral + case v == 256: + f.finishBlock() + return + // otherwise, reference to older data + case v < 265: + length = v - (257 - 3) + n = 0 + case v < 269: + length = v*2 - (265*2 - 11) + n = 1 + case v < 273: + length = v*4 - (269*4 - 19) + n = 2 + case v < 277: + length = v*8 - (273*8 - 35) + n = 3 + case v < 281: + length = v*16 - (277*16 - 67) + n = 4 + case v < 285: + length = v*32 - (281*32 - 131) + n = 5 + case v < maxNumLit: + length = 258 + n = 0 + default: + if debugDecode { + fmt.Println(v, ">= maxNumLit") + } + f.err = CorruptInputError(f.roffset) + return + } + if n > 0 { + for f.nb < n { + if err = f.moreBits(); err != nil { + if debugDecode { + fmt.Println("morebits n>0:", err) + } + f.err = err + return + } + } + length += int(f.b & uint32(1<<(n®SizeMaskUint32)-1)) + f.b >>= n & regSizeMaskUint32 + f.nb -= n + } + + var dist uint32 + if f.hd == nil { + for f.nb < 5 { + if err = f.moreBits(); err != nil { + if debugDecode { + fmt.Println("morebits f.nb<5:", err) + } + f.err = err + return + } + } + dist = uint32(bits.Reverse8(uint8(f.b & 0x1F << 3))) + f.b >>= 5 + f.nb -= 5 + } else { + sym, err := f.huffSym(f.hd) + if err != nil { + if debugDecode { + fmt.Println("huffsym:", err) + } + f.err = err + return + } + dist = uint32(sym) + } + + switch { + case dist < 4: + dist++ + case dist < maxNumDist: + nb := uint(dist-2) >> 1 + // have 1 bit in bottom of dist, need nb more. + extra := (dist & 1) << (nb & regSizeMaskUint32) + for f.nb < nb { + if err = f.moreBits(); err != nil { + if debugDecode { + fmt.Println("morebits f.nb>= nb & regSizeMaskUint32 + f.nb -= nb + dist = 1<<((nb+1)®SizeMaskUint32) + 1 + extra + default: + if debugDecode { + fmt.Println("dist too big:", dist, maxNumDist) + } + f.err = CorruptInputError(f.roffset) + return + } + + // No check on length; encoding can be prescient. + if dist > uint32(f.dict.histSize()) { + if debugDecode { + fmt.Println("dist > f.dict.histSize():", dist, f.dict.histSize()) + } + f.err = CorruptInputError(f.roffset) + return + } + + f.copyLen, f.copyDist = length, int(dist) + goto copyHistory + } + +copyHistory: + // Perform a backwards copy according to RFC section 3.2.3. + { + cnt := f.dict.tryWriteCopy(f.copyDist, f.copyLen) + if cnt == 0 { + cnt = f.dict.writeCopy(f.copyDist, f.copyLen) + } + f.copyLen -= cnt + + if f.dict.availWrite() == 0 || f.copyLen > 0 { + f.toRead = f.dict.readFlush() + f.step = (*decompressor).huffmanBlockGeneric // We need to continue this work + f.stepState = stateDict + return + } + goto readLiteral + } +} + +// Copy a single uncompressed data block from input to output. +func (f *decompressor) dataBlock() { + // Uncompressed. + // Discard current half-byte. + left := (f.nb) & 7 + f.nb -= left + f.b >>= left + + offBytes := f.nb >> 3 + // Unfilled values will be overwritten. + f.buf[0] = uint8(f.b) + f.buf[1] = uint8(f.b >> 8) + f.buf[2] = uint8(f.b >> 16) + f.buf[3] = uint8(f.b >> 24) + + f.roffset += int64(offBytes) + f.nb, f.b = 0, 0 + + // Length then ones-complement of length. + nr, err := io.ReadFull(f.r, f.buf[offBytes:4]) + f.roffset += int64(nr) + if err != nil { + f.err = noEOF(err) + return + } + n := uint16(f.buf[0]) | uint16(f.buf[1])<<8 + nn := uint16(f.buf[2]) | uint16(f.buf[3])<<8 + if nn != ^n { + if debugDecode { + ncomp := ^n + fmt.Println("uint16(nn) != uint16(^n)", nn, ncomp) + } + f.err = CorruptInputError(f.roffset) + return + } + + if n == 0 { + f.toRead = f.dict.readFlush() + f.finishBlock() + return + } + + f.copyLen = int(n) + f.copyData() +} + +// copyData copies f.copyLen bytes from the underlying reader into f.hist. +// It pauses for reads when f.hist is full. +func (f *decompressor) copyData() { + buf := f.dict.writeSlice() + if len(buf) > f.copyLen { + buf = buf[:f.copyLen] + } + + cnt, err := io.ReadFull(f.r, buf) + f.roffset += int64(cnt) + f.copyLen -= cnt + f.dict.writeMark(cnt) + if err != nil { + f.err = noEOF(err) + return + } + + if f.dict.availWrite() == 0 || f.copyLen > 0 { + f.toRead = f.dict.readFlush() + f.step = (*decompressor).copyData + return + } + f.finishBlock() +} + +func (f *decompressor) finishBlock() { + if f.final { + if f.dict.availRead() > 0 { + f.toRead = f.dict.readFlush() + } + f.err = io.EOF + } + f.step = (*decompressor).nextBlock +} + +// noEOF returns err, unless err == io.EOF, in which case it returns io.ErrUnexpectedEOF. +func noEOF(e error) error { + if e == io.EOF { + return io.ErrUnexpectedEOF + } + return e +} + +func (f *decompressor) moreBits() error { + c, err := f.r.ReadByte() + if err != nil { + return noEOF(err) + } + f.roffset++ + f.b |= uint32(c) << (f.nb & regSizeMaskUint32) + f.nb += 8 + return nil +} + +// Read the next Huffman-encoded symbol from f according to h. +func (f *decompressor) huffSym(h *huffmanDecoder) (int, error) { + // Since a huffmanDecoder can be empty or be composed of a degenerate tree + // with single element, huffSym must error on these two edge cases. In both + // cases, the chunks slice will be 0 for the invalid sequence, leading it + // satisfy the n == 0 check below. + n := uint(h.maxRead) + // Optimization. Compiler isn't smart enough to keep f.b,f.nb in registers, + // but is smart enough to keep local variables in registers, so use nb and b, + // inline call to moreBits and reassign b,nb back to f on return. + nb, b := f.nb, f.b + for { + for nb < n { + c, err := f.r.ReadByte() + if err != nil { + f.b = b + f.nb = nb + return 0, noEOF(err) + } + f.roffset++ + b |= uint32(c) << (nb & regSizeMaskUint32) + nb += 8 + } + chunk := h.chunks[b&(huffmanNumChunks-1)] + n = uint(chunk & huffmanCountMask) + if n > huffmanChunkBits { + chunk = h.links[chunk>>huffmanValueShift][(b>>huffmanChunkBits)&h.linkMask] + n = uint(chunk & huffmanCountMask) + } + if n <= nb { + if n == 0 { + f.b = b + f.nb = nb + if debugDecode { + fmt.Println("huffsym: n==0") + } + f.err = CorruptInputError(f.roffset) + return 0, f.err + } + f.b = b >> (n & regSizeMaskUint32) + f.nb = nb - n + return int(chunk >> huffmanValueShift), nil + } + } +} + +func makeReader(r io.Reader) Reader { + if rr, ok := r.(Reader); ok { + return rr + } + return bufio.NewReader(r) +} + +func fixedHuffmanDecoderInit() { + fixedOnce.Do(func() { + // These come from the RFC section 3.2.6. + var bits [288]int + for i := 0; i < 144; i++ { + bits[i] = 8 + } + for i := 144; i < 256; i++ { + bits[i] = 9 + } + for i := 256; i < 280; i++ { + bits[i] = 7 + } + for i := 280; i < 288; i++ { + bits[i] = 8 + } + fixedHuffmanDecoder.init(bits[:]) + }) +} + +func (f *decompressor) Reset(r io.Reader, dict []byte) error { + *f = decompressor{ + r: makeReader(r), + bits: f.bits, + codebits: f.codebits, + h1: f.h1, + h2: f.h2, + dict: f.dict, + step: (*decompressor).nextBlock, + } + f.dict.init(maxMatchOffset, dict) + return nil +} + +// NewReader returns a new ReadCloser that can be used +// to read the uncompressed version of r. +// If r does not also implement io.ByteReader, +// the decompressor may read more data than necessary from r. +// It is the caller's responsibility to call Close on the ReadCloser +// when finished reading. +// +// The ReadCloser returned by NewReader also implements Resetter. +func NewReader(r io.Reader) io.ReadCloser { + fixedHuffmanDecoderInit() + + var f decompressor + f.r = makeReader(r) + f.bits = new([maxNumLit + maxNumDist]int) + f.codebits = new([numCodes]int) + f.step = (*decompressor).nextBlock + f.dict.init(maxMatchOffset, nil) + return &f +} + +// NewReaderDict is like NewReader but initializes the reader +// with a preset dictionary. The returned Reader behaves as if +// the uncompressed data stream started with the given dictionary, +// which has already been read. NewReaderDict is typically used +// to read data compressed by NewWriterDict. +// +// The ReadCloser returned by NewReader also implements Resetter. +func NewReaderDict(r io.Reader, dict []byte) io.ReadCloser { + fixedHuffmanDecoderInit() + + var f decompressor + f.r = makeReader(r) + f.bits = new([maxNumLit + maxNumDist]int) + f.codebits = new([numCodes]int) + f.step = (*decompressor).nextBlock + f.dict.init(maxMatchOffset, dict) + return &f +} diff --git a/vendor/github.com/klauspost/compress/flate/inflate_gen.go b/vendor/github.com/klauspost/compress/flate/inflate_gen.go new file mode 100644 index 0000000..cc6db27 --- /dev/null +++ b/vendor/github.com/klauspost/compress/flate/inflate_gen.go @@ -0,0 +1,1002 @@ +// Code generated by go generate gen_inflate.go. DO NOT EDIT. + +package flate + +import ( + "bufio" + "bytes" + "fmt" + "math/bits" + "strings" +) + +// Decode a single Huffman block from f. +// hl and hd are the Huffman states for the lit/length values +// and the distance values, respectively. If hd == nil, using the +// fixed distance encoding associated with fixed Huffman blocks. +func (f *decompressor) huffmanBytesBuffer() { + const ( + stateInit = iota // Zero value must be stateInit + stateDict + ) + fr := f.r.(*bytes.Buffer) + + switch f.stepState { + case stateInit: + goto readLiteral + case stateDict: + goto copyHistory + } + +readLiteral: + // Read literal and/or (length, distance) according to RFC section 3.2.3. + { + var v int + { + // Inlined v, err := f.huffSym(f.hl) + // Since a huffmanDecoder can be empty or be composed of a degenerate tree + // with single element, huffSym must error on these two edge cases. In both + // cases, the chunks slice will be 0 for the invalid sequence, leading it + // satisfy the n == 0 check below. + n := uint(f.hl.maxRead) + // Optimization. Compiler isn't smart enough to keep f.b,f.nb in registers, + // but is smart enough to keep local variables in registers, so use nb and b, + // inline call to moreBits and reassign b,nb back to f on return. + nb, b := f.nb, f.b + for { + for nb < n { + c, err := fr.ReadByte() + if err != nil { + f.b = b + f.nb = nb + f.err = noEOF(err) + return + } + f.roffset++ + b |= uint32(c) << (nb & regSizeMaskUint32) + nb += 8 + } + chunk := f.hl.chunks[b&(huffmanNumChunks-1)] + n = uint(chunk & huffmanCountMask) + if n > huffmanChunkBits { + chunk = f.hl.links[chunk>>huffmanValueShift][(b>>huffmanChunkBits)&f.hl.linkMask] + n = uint(chunk & huffmanCountMask) + } + if n <= nb { + if n == 0 { + f.b = b + f.nb = nb + if debugDecode { + fmt.Println("huffsym: n==0") + } + f.err = CorruptInputError(f.roffset) + return + } + f.b = b >> (n & regSizeMaskUint32) + f.nb = nb - n + v = int(chunk >> huffmanValueShift) + break + } + } + } + + var length int + switch { + case v < 256: + f.dict.writeByte(byte(v)) + if f.dict.availWrite() == 0 { + f.toRead = f.dict.readFlush() + f.step = (*decompressor).huffmanBytesBuffer + f.stepState = stateInit + return + } + goto readLiteral + case v == 256: + f.finishBlock() + return + // otherwise, reference to older data + case v < 265: + length = v - (257 - 3) + case v < maxNumLit: + val := decCodeToLen[(v - 257)] + length = int(val.length) + 3 + n := uint(val.extra) + for f.nb < n { + c, err := fr.ReadByte() + if err != nil { + if debugDecode { + fmt.Println("morebits n>0:", err) + } + f.err = err + return + } + f.roffset++ + f.b |= uint32(c) << f.nb + f.nb += 8 + } + length += int(f.b & uint32(1<<(n®SizeMaskUint32)-1)) + f.b >>= n & regSizeMaskUint32 + f.nb -= n + default: + if debugDecode { + fmt.Println(v, ">= maxNumLit") + } + f.err = CorruptInputError(f.roffset) + return + } + + var dist uint32 + if f.hd == nil { + for f.nb < 5 { + c, err := fr.ReadByte() + if err != nil { + if debugDecode { + fmt.Println("morebits f.nb<5:", err) + } + f.err = err + return + } + f.roffset++ + f.b |= uint32(c) << f.nb + f.nb += 8 + } + dist = uint32(bits.Reverse8(uint8(f.b & 0x1F << 3))) + f.b >>= 5 + f.nb -= 5 + } else { + // Since a huffmanDecoder can be empty or be composed of a degenerate tree + // with single element, huffSym must error on these two edge cases. In both + // cases, the chunks slice will be 0 for the invalid sequence, leading it + // satisfy the n == 0 check below. + n := uint(f.hd.maxRead) + // Optimization. Compiler isn't smart enough to keep f.b,f.nb in registers, + // but is smart enough to keep local variables in registers, so use nb and b, + // inline call to moreBits and reassign b,nb back to f on return. + nb, b := f.nb, f.b + for { + for nb < n { + c, err := fr.ReadByte() + if err != nil { + f.b = b + f.nb = nb + f.err = noEOF(err) + return + } + f.roffset++ + b |= uint32(c) << (nb & regSizeMaskUint32) + nb += 8 + } + chunk := f.hd.chunks[b&(huffmanNumChunks-1)] + n = uint(chunk & huffmanCountMask) + if n > huffmanChunkBits { + chunk = f.hd.links[chunk>>huffmanValueShift][(b>>huffmanChunkBits)&f.hd.linkMask] + n = uint(chunk & huffmanCountMask) + } + if n <= nb { + if n == 0 { + f.b = b + f.nb = nb + if debugDecode { + fmt.Println("huffsym: n==0") + } + f.err = CorruptInputError(f.roffset) + return + } + f.b = b >> (n & regSizeMaskUint32) + f.nb = nb - n + dist = uint32(chunk >> huffmanValueShift) + break + } + } + } + + switch { + case dist < 4: + dist++ + case dist < maxNumDist: + nb := uint(dist-2) >> 1 + // have 1 bit in bottom of dist, need nb more. + extra := (dist & 1) << (nb & regSizeMaskUint32) + for f.nb < nb { + c, err := fr.ReadByte() + if err != nil { + if debugDecode { + fmt.Println("morebits f.nb>= nb & regSizeMaskUint32 + f.nb -= nb + dist = 1<<((nb+1)®SizeMaskUint32) + 1 + extra + default: + if debugDecode { + fmt.Println("dist too big:", dist, maxNumDist) + } + f.err = CorruptInputError(f.roffset) + return + } + + // No check on length; encoding can be prescient. + if dist > uint32(f.dict.histSize()) { + if debugDecode { + fmt.Println("dist > f.dict.histSize():", dist, f.dict.histSize()) + } + f.err = CorruptInputError(f.roffset) + return + } + + f.copyLen, f.copyDist = length, int(dist) + goto copyHistory + } + +copyHistory: + // Perform a backwards copy according to RFC section 3.2.3. + { + cnt := f.dict.tryWriteCopy(f.copyDist, f.copyLen) + if cnt == 0 { + cnt = f.dict.writeCopy(f.copyDist, f.copyLen) + } + f.copyLen -= cnt + + if f.dict.availWrite() == 0 || f.copyLen > 0 { + f.toRead = f.dict.readFlush() + f.step = (*decompressor).huffmanBytesBuffer // We need to continue this work + f.stepState = stateDict + return + } + goto readLiteral + } +} + +// Decode a single Huffman block from f. +// hl and hd are the Huffman states for the lit/length values +// and the distance values, respectively. If hd == nil, using the +// fixed distance encoding associated with fixed Huffman blocks. +func (f *decompressor) huffmanBytesReader() { + const ( + stateInit = iota // Zero value must be stateInit + stateDict + ) + fr := f.r.(*bytes.Reader) + + switch f.stepState { + case stateInit: + goto readLiteral + case stateDict: + goto copyHistory + } + +readLiteral: + // Read literal and/or (length, distance) according to RFC section 3.2.3. + { + var v int + { + // Inlined v, err := f.huffSym(f.hl) + // Since a huffmanDecoder can be empty or be composed of a degenerate tree + // with single element, huffSym must error on these two edge cases. In both + // cases, the chunks slice will be 0 for the invalid sequence, leading it + // satisfy the n == 0 check below. + n := uint(f.hl.maxRead) + // Optimization. Compiler isn't smart enough to keep f.b,f.nb in registers, + // but is smart enough to keep local variables in registers, so use nb and b, + // inline call to moreBits and reassign b,nb back to f on return. + nb, b := f.nb, f.b + for { + for nb < n { + c, err := fr.ReadByte() + if err != nil { + f.b = b + f.nb = nb + f.err = noEOF(err) + return + } + f.roffset++ + b |= uint32(c) << (nb & regSizeMaskUint32) + nb += 8 + } + chunk := f.hl.chunks[b&(huffmanNumChunks-1)] + n = uint(chunk & huffmanCountMask) + if n > huffmanChunkBits { + chunk = f.hl.links[chunk>>huffmanValueShift][(b>>huffmanChunkBits)&f.hl.linkMask] + n = uint(chunk & huffmanCountMask) + } + if n <= nb { + if n == 0 { + f.b = b + f.nb = nb + if debugDecode { + fmt.Println("huffsym: n==0") + } + f.err = CorruptInputError(f.roffset) + return + } + f.b = b >> (n & regSizeMaskUint32) + f.nb = nb - n + v = int(chunk >> huffmanValueShift) + break + } + } + } + + var length int + switch { + case v < 256: + f.dict.writeByte(byte(v)) + if f.dict.availWrite() == 0 { + f.toRead = f.dict.readFlush() + f.step = (*decompressor).huffmanBytesReader + f.stepState = stateInit + return + } + goto readLiteral + case v == 256: + f.finishBlock() + return + // otherwise, reference to older data + case v < 265: + length = v - (257 - 3) + case v < maxNumLit: + val := decCodeToLen[(v - 257)] + length = int(val.length) + 3 + n := uint(val.extra) + for f.nb < n { + c, err := fr.ReadByte() + if err != nil { + if debugDecode { + fmt.Println("morebits n>0:", err) + } + f.err = err + return + } + f.roffset++ + f.b |= uint32(c) << f.nb + f.nb += 8 + } + length += int(f.b & uint32(1<<(n®SizeMaskUint32)-1)) + f.b >>= n & regSizeMaskUint32 + f.nb -= n + default: + if debugDecode { + fmt.Println(v, ">= maxNumLit") + } + f.err = CorruptInputError(f.roffset) + return + } + + var dist uint32 + if f.hd == nil { + for f.nb < 5 { + c, err := fr.ReadByte() + if err != nil { + if debugDecode { + fmt.Println("morebits f.nb<5:", err) + } + f.err = err + return + } + f.roffset++ + f.b |= uint32(c) << f.nb + f.nb += 8 + } + dist = uint32(bits.Reverse8(uint8(f.b & 0x1F << 3))) + f.b >>= 5 + f.nb -= 5 + } else { + // Since a huffmanDecoder can be empty or be composed of a degenerate tree + // with single element, huffSym must error on these two edge cases. In both + // cases, the chunks slice will be 0 for the invalid sequence, leading it + // satisfy the n == 0 check below. + n := uint(f.hd.maxRead) + // Optimization. Compiler isn't smart enough to keep f.b,f.nb in registers, + // but is smart enough to keep local variables in registers, so use nb and b, + // inline call to moreBits and reassign b,nb back to f on return. + nb, b := f.nb, f.b + for { + for nb < n { + c, err := fr.ReadByte() + if err != nil { + f.b = b + f.nb = nb + f.err = noEOF(err) + return + } + f.roffset++ + b |= uint32(c) << (nb & regSizeMaskUint32) + nb += 8 + } + chunk := f.hd.chunks[b&(huffmanNumChunks-1)] + n = uint(chunk & huffmanCountMask) + if n > huffmanChunkBits { + chunk = f.hd.links[chunk>>huffmanValueShift][(b>>huffmanChunkBits)&f.hd.linkMask] + n = uint(chunk & huffmanCountMask) + } + if n <= nb { + if n == 0 { + f.b = b + f.nb = nb + if debugDecode { + fmt.Println("huffsym: n==0") + } + f.err = CorruptInputError(f.roffset) + return + } + f.b = b >> (n & regSizeMaskUint32) + f.nb = nb - n + dist = uint32(chunk >> huffmanValueShift) + break + } + } + } + + switch { + case dist < 4: + dist++ + case dist < maxNumDist: + nb := uint(dist-2) >> 1 + // have 1 bit in bottom of dist, need nb more. + extra := (dist & 1) << (nb & regSizeMaskUint32) + for f.nb < nb { + c, err := fr.ReadByte() + if err != nil { + if debugDecode { + fmt.Println("morebits f.nb>= nb & regSizeMaskUint32 + f.nb -= nb + dist = 1<<((nb+1)®SizeMaskUint32) + 1 + extra + default: + if debugDecode { + fmt.Println("dist too big:", dist, maxNumDist) + } + f.err = CorruptInputError(f.roffset) + return + } + + // No check on length; encoding can be prescient. + if dist > uint32(f.dict.histSize()) { + if debugDecode { + fmt.Println("dist > f.dict.histSize():", dist, f.dict.histSize()) + } + f.err = CorruptInputError(f.roffset) + return + } + + f.copyLen, f.copyDist = length, int(dist) + goto copyHistory + } + +copyHistory: + // Perform a backwards copy according to RFC section 3.2.3. + { + cnt := f.dict.tryWriteCopy(f.copyDist, f.copyLen) + if cnt == 0 { + cnt = f.dict.writeCopy(f.copyDist, f.copyLen) + } + f.copyLen -= cnt + + if f.dict.availWrite() == 0 || f.copyLen > 0 { + f.toRead = f.dict.readFlush() + f.step = (*decompressor).huffmanBytesReader // We need to continue this work + f.stepState = stateDict + return + } + goto readLiteral + } +} + +// Decode a single Huffman block from f. +// hl and hd are the Huffman states for the lit/length values +// and the distance values, respectively. If hd == nil, using the +// fixed distance encoding associated with fixed Huffman blocks. +func (f *decompressor) huffmanBufioReader() { + const ( + stateInit = iota // Zero value must be stateInit + stateDict + ) + fr := f.r.(*bufio.Reader) + + switch f.stepState { + case stateInit: + goto readLiteral + case stateDict: + goto copyHistory + } + +readLiteral: + // Read literal and/or (length, distance) according to RFC section 3.2.3. + { + var v int + { + // Inlined v, err := f.huffSym(f.hl) + // Since a huffmanDecoder can be empty or be composed of a degenerate tree + // with single element, huffSym must error on these two edge cases. In both + // cases, the chunks slice will be 0 for the invalid sequence, leading it + // satisfy the n == 0 check below. + n := uint(f.hl.maxRead) + // Optimization. Compiler isn't smart enough to keep f.b,f.nb in registers, + // but is smart enough to keep local variables in registers, so use nb and b, + // inline call to moreBits and reassign b,nb back to f on return. + nb, b := f.nb, f.b + for { + for nb < n { + c, err := fr.ReadByte() + if err != nil { + f.b = b + f.nb = nb + f.err = noEOF(err) + return + } + f.roffset++ + b |= uint32(c) << (nb & regSizeMaskUint32) + nb += 8 + } + chunk := f.hl.chunks[b&(huffmanNumChunks-1)] + n = uint(chunk & huffmanCountMask) + if n > huffmanChunkBits { + chunk = f.hl.links[chunk>>huffmanValueShift][(b>>huffmanChunkBits)&f.hl.linkMask] + n = uint(chunk & huffmanCountMask) + } + if n <= nb { + if n == 0 { + f.b = b + f.nb = nb + if debugDecode { + fmt.Println("huffsym: n==0") + } + f.err = CorruptInputError(f.roffset) + return + } + f.b = b >> (n & regSizeMaskUint32) + f.nb = nb - n + v = int(chunk >> huffmanValueShift) + break + } + } + } + + var length int + switch { + case v < 256: + f.dict.writeByte(byte(v)) + if f.dict.availWrite() == 0 { + f.toRead = f.dict.readFlush() + f.step = (*decompressor).huffmanBufioReader + f.stepState = stateInit + return + } + goto readLiteral + case v == 256: + f.finishBlock() + return + // otherwise, reference to older data + case v < 265: + length = v - (257 - 3) + case v < maxNumLit: + val := decCodeToLen[(v - 257)] + length = int(val.length) + 3 + n := uint(val.extra) + for f.nb < n { + c, err := fr.ReadByte() + if err != nil { + if debugDecode { + fmt.Println("morebits n>0:", err) + } + f.err = err + return + } + f.roffset++ + f.b |= uint32(c) << f.nb + f.nb += 8 + } + length += int(f.b & uint32(1<<(n®SizeMaskUint32)-1)) + f.b >>= n & regSizeMaskUint32 + f.nb -= n + default: + if debugDecode { + fmt.Println(v, ">= maxNumLit") + } + f.err = CorruptInputError(f.roffset) + return + } + + var dist uint32 + if f.hd == nil { + for f.nb < 5 { + c, err := fr.ReadByte() + if err != nil { + if debugDecode { + fmt.Println("morebits f.nb<5:", err) + } + f.err = err + return + } + f.roffset++ + f.b |= uint32(c) << f.nb + f.nb += 8 + } + dist = uint32(bits.Reverse8(uint8(f.b & 0x1F << 3))) + f.b >>= 5 + f.nb -= 5 + } else { + // Since a huffmanDecoder can be empty or be composed of a degenerate tree + // with single element, huffSym must error on these two edge cases. In both + // cases, the chunks slice will be 0 for the invalid sequence, leading it + // satisfy the n == 0 check below. + n := uint(f.hd.maxRead) + // Optimization. Compiler isn't smart enough to keep f.b,f.nb in registers, + // but is smart enough to keep local variables in registers, so use nb and b, + // inline call to moreBits and reassign b,nb back to f on return. + nb, b := f.nb, f.b + for { + for nb < n { + c, err := fr.ReadByte() + if err != nil { + f.b = b + f.nb = nb + f.err = noEOF(err) + return + } + f.roffset++ + b |= uint32(c) << (nb & regSizeMaskUint32) + nb += 8 + } + chunk := f.hd.chunks[b&(huffmanNumChunks-1)] + n = uint(chunk & huffmanCountMask) + if n > huffmanChunkBits { + chunk = f.hd.links[chunk>>huffmanValueShift][(b>>huffmanChunkBits)&f.hd.linkMask] + n = uint(chunk & huffmanCountMask) + } + if n <= nb { + if n == 0 { + f.b = b + f.nb = nb + if debugDecode { + fmt.Println("huffsym: n==0") + } + f.err = CorruptInputError(f.roffset) + return + } + f.b = b >> (n & regSizeMaskUint32) + f.nb = nb - n + dist = uint32(chunk >> huffmanValueShift) + break + } + } + } + + switch { + case dist < 4: + dist++ + case dist < maxNumDist: + nb := uint(dist-2) >> 1 + // have 1 bit in bottom of dist, need nb more. + extra := (dist & 1) << (nb & regSizeMaskUint32) + for f.nb < nb { + c, err := fr.ReadByte() + if err != nil { + if debugDecode { + fmt.Println("morebits f.nb>= nb & regSizeMaskUint32 + f.nb -= nb + dist = 1<<((nb+1)®SizeMaskUint32) + 1 + extra + default: + if debugDecode { + fmt.Println("dist too big:", dist, maxNumDist) + } + f.err = CorruptInputError(f.roffset) + return + } + + // No check on length; encoding can be prescient. + if dist > uint32(f.dict.histSize()) { + if debugDecode { + fmt.Println("dist > f.dict.histSize():", dist, f.dict.histSize()) + } + f.err = CorruptInputError(f.roffset) + return + } + + f.copyLen, f.copyDist = length, int(dist) + goto copyHistory + } + +copyHistory: + // Perform a backwards copy according to RFC section 3.2.3. + { + cnt := f.dict.tryWriteCopy(f.copyDist, f.copyLen) + if cnt == 0 { + cnt = f.dict.writeCopy(f.copyDist, f.copyLen) + } + f.copyLen -= cnt + + if f.dict.availWrite() == 0 || f.copyLen > 0 { + f.toRead = f.dict.readFlush() + f.step = (*decompressor).huffmanBufioReader // We need to continue this work + f.stepState = stateDict + return + } + goto readLiteral + } +} + +// Decode a single Huffman block from f. +// hl and hd are the Huffman states for the lit/length values +// and the distance values, respectively. If hd == nil, using the +// fixed distance encoding associated with fixed Huffman blocks. +func (f *decompressor) huffmanStringsReader() { + const ( + stateInit = iota // Zero value must be stateInit + stateDict + ) + fr := f.r.(*strings.Reader) + + switch f.stepState { + case stateInit: + goto readLiteral + case stateDict: + goto copyHistory + } + +readLiteral: + // Read literal and/or (length, distance) according to RFC section 3.2.3. + { + var v int + { + // Inlined v, err := f.huffSym(f.hl) + // Since a huffmanDecoder can be empty or be composed of a degenerate tree + // with single element, huffSym must error on these two edge cases. In both + // cases, the chunks slice will be 0 for the invalid sequence, leading it + // satisfy the n == 0 check below. + n := uint(f.hl.maxRead) + // Optimization. Compiler isn't smart enough to keep f.b,f.nb in registers, + // but is smart enough to keep local variables in registers, so use nb and b, + // inline call to moreBits and reassign b,nb back to f on return. + nb, b := f.nb, f.b + for { + for nb < n { + c, err := fr.ReadByte() + if err != nil { + f.b = b + f.nb = nb + f.err = noEOF(err) + return + } + f.roffset++ + b |= uint32(c) << (nb & regSizeMaskUint32) + nb += 8 + } + chunk := f.hl.chunks[b&(huffmanNumChunks-1)] + n = uint(chunk & huffmanCountMask) + if n > huffmanChunkBits { + chunk = f.hl.links[chunk>>huffmanValueShift][(b>>huffmanChunkBits)&f.hl.linkMask] + n = uint(chunk & huffmanCountMask) + } + if n <= nb { + if n == 0 { + f.b = b + f.nb = nb + if debugDecode { + fmt.Println("huffsym: n==0") + } + f.err = CorruptInputError(f.roffset) + return + } + f.b = b >> (n & regSizeMaskUint32) + f.nb = nb - n + v = int(chunk >> huffmanValueShift) + break + } + } + } + + var length int + switch { + case v < 256: + f.dict.writeByte(byte(v)) + if f.dict.availWrite() == 0 { + f.toRead = f.dict.readFlush() + f.step = (*decompressor).huffmanStringsReader + f.stepState = stateInit + return + } + goto readLiteral + case v == 256: + f.finishBlock() + return + // otherwise, reference to older data + case v < 265: + length = v - (257 - 3) + case v < maxNumLit: + val := decCodeToLen[(v - 257)] + length = int(val.length) + 3 + n := uint(val.extra) + for f.nb < n { + c, err := fr.ReadByte() + if err != nil { + if debugDecode { + fmt.Println("morebits n>0:", err) + } + f.err = err + return + } + f.roffset++ + f.b |= uint32(c) << f.nb + f.nb += 8 + } + length += int(f.b & uint32(1<<(n®SizeMaskUint32)-1)) + f.b >>= n & regSizeMaskUint32 + f.nb -= n + default: + if debugDecode { + fmt.Println(v, ">= maxNumLit") + } + f.err = CorruptInputError(f.roffset) + return + } + + var dist uint32 + if f.hd == nil { + for f.nb < 5 { + c, err := fr.ReadByte() + if err != nil { + if debugDecode { + fmt.Println("morebits f.nb<5:", err) + } + f.err = err + return + } + f.roffset++ + f.b |= uint32(c) << f.nb + f.nb += 8 + } + dist = uint32(bits.Reverse8(uint8(f.b & 0x1F << 3))) + f.b >>= 5 + f.nb -= 5 + } else { + // Since a huffmanDecoder can be empty or be composed of a degenerate tree + // with single element, huffSym must error on these two edge cases. In both + // cases, the chunks slice will be 0 for the invalid sequence, leading it + // satisfy the n == 0 check below. + n := uint(f.hd.maxRead) + // Optimization. Compiler isn't smart enough to keep f.b,f.nb in registers, + // but is smart enough to keep local variables in registers, so use nb and b, + // inline call to moreBits and reassign b,nb back to f on return. + nb, b := f.nb, f.b + for { + for nb < n { + c, err := fr.ReadByte() + if err != nil { + f.b = b + f.nb = nb + f.err = noEOF(err) + return + } + f.roffset++ + b |= uint32(c) << (nb & regSizeMaskUint32) + nb += 8 + } + chunk := f.hd.chunks[b&(huffmanNumChunks-1)] + n = uint(chunk & huffmanCountMask) + if n > huffmanChunkBits { + chunk = f.hd.links[chunk>>huffmanValueShift][(b>>huffmanChunkBits)&f.hd.linkMask] + n = uint(chunk & huffmanCountMask) + } + if n <= nb { + if n == 0 { + f.b = b + f.nb = nb + if debugDecode { + fmt.Println("huffsym: n==0") + } + f.err = CorruptInputError(f.roffset) + return + } + f.b = b >> (n & regSizeMaskUint32) + f.nb = nb - n + dist = uint32(chunk >> huffmanValueShift) + break + } + } + } + + switch { + case dist < 4: + dist++ + case dist < maxNumDist: + nb := uint(dist-2) >> 1 + // have 1 bit in bottom of dist, need nb more. + extra := (dist & 1) << (nb & regSizeMaskUint32) + for f.nb < nb { + c, err := fr.ReadByte() + if err != nil { + if debugDecode { + fmt.Println("morebits f.nb>= nb & regSizeMaskUint32 + f.nb -= nb + dist = 1<<((nb+1)®SizeMaskUint32) + 1 + extra + default: + if debugDecode { + fmt.Println("dist too big:", dist, maxNumDist) + } + f.err = CorruptInputError(f.roffset) + return + } + + // No check on length; encoding can be prescient. + if dist > uint32(f.dict.histSize()) { + if debugDecode { + fmt.Println("dist > f.dict.histSize():", dist, f.dict.histSize()) + } + f.err = CorruptInputError(f.roffset) + return + } + + f.copyLen, f.copyDist = length, int(dist) + goto copyHistory + } + +copyHistory: + // Perform a backwards copy according to RFC section 3.2.3. + { + cnt := f.dict.tryWriteCopy(f.copyDist, f.copyLen) + if cnt == 0 { + cnt = f.dict.writeCopy(f.copyDist, f.copyLen) + } + f.copyLen -= cnt + + if f.dict.availWrite() == 0 || f.copyLen > 0 { + f.toRead = f.dict.readFlush() + f.step = (*decompressor).huffmanStringsReader // We need to continue this work + f.stepState = stateDict + return + } + goto readLiteral + } +} + +func (f *decompressor) huffmanBlockDecoder() func() { + switch f.r.(type) { + case *bytes.Buffer: + return f.huffmanBytesBuffer + case *bytes.Reader: + return f.huffmanBytesReader + case *bufio.Reader: + return f.huffmanBufioReader + case *strings.Reader: + return f.huffmanStringsReader + default: + return f.huffmanBlockGeneric + } +} diff --git a/vendor/github.com/klauspost/compress/flate/level1.go b/vendor/github.com/klauspost/compress/flate/level1.go new file mode 100644 index 0000000..1e5eea3 --- /dev/null +++ b/vendor/github.com/klauspost/compress/flate/level1.go @@ -0,0 +1,179 @@ +package flate + +import "fmt" + +// fastGen maintains the table for matches, +// and the previous byte block for level 2. +// This is the generic implementation. +type fastEncL1 struct { + fastGen + table [tableSize]tableEntry +} + +// EncodeL1 uses a similar algorithm to level 1 +func (e *fastEncL1) Encode(dst *tokens, src []byte) { + const ( + inputMargin = 12 - 1 + minNonLiteralBlockSize = 1 + 1 + inputMargin + ) + if debugDeflate && e.cur < 0 { + panic(fmt.Sprint("e.cur < 0: ", e.cur)) + } + + // Protect against e.cur wraparound. + for e.cur >= bufferReset { + if len(e.hist) == 0 { + for i := range e.table[:] { + e.table[i] = tableEntry{} + } + e.cur = maxMatchOffset + break + } + // Shift down everything in the table that isn't already too far away. + minOff := e.cur + int32(len(e.hist)) - maxMatchOffset + for i := range e.table[:] { + v := e.table[i].offset + if v <= minOff { + v = 0 + } else { + v = v - e.cur + maxMatchOffset + } + e.table[i].offset = v + } + e.cur = maxMatchOffset + } + + s := e.addBlock(src) + + // This check isn't in the Snappy implementation, but there, the caller + // instead of the callee handles this case. + if len(src) < minNonLiteralBlockSize { + // We do not fill the token table. + // This will be picked up by caller. + dst.n = uint16(len(src)) + return + } + + // Override src + src = e.hist + nextEmit := s + + // sLimit is when to stop looking for offset/length copies. The inputMargin + // lets us use a fast path for emitLiteral in the main loop, while we are + // looking for copies. + sLimit := int32(len(src) - inputMargin) + + // nextEmit is where in src the next emitLiteral should start from. + cv := load3232(src, s) + + for { + const skipLog = 5 + const doEvery = 2 + + nextS := s + var candidate tableEntry + for { + nextHash := hash(cv) + candidate = e.table[nextHash] + nextS = s + doEvery + (s-nextEmit)>>skipLog + if nextS > sLimit { + goto emitRemainder + } + + now := load6432(src, nextS) + e.table[nextHash] = tableEntry{offset: s + e.cur} + nextHash = hash(uint32(now)) + + offset := s - (candidate.offset - e.cur) + if offset < maxMatchOffset && cv == load3232(src, candidate.offset-e.cur) { + e.table[nextHash] = tableEntry{offset: nextS + e.cur} + break + } + + // Do one right away... + cv = uint32(now) + s = nextS + nextS++ + candidate = e.table[nextHash] + now >>= 8 + e.table[nextHash] = tableEntry{offset: s + e.cur} + + offset = s - (candidate.offset - e.cur) + if offset < maxMatchOffset && cv == load3232(src, candidate.offset-e.cur) { + e.table[nextHash] = tableEntry{offset: nextS + e.cur} + break + } + cv = uint32(now) + s = nextS + } + + // A 4-byte match has been found. We'll later see if more than 4 bytes + // match. But, prior to the match, src[nextEmit:s] are unmatched. Emit + // them as literal bytes. + for { + // Invariant: we have a 4-byte match at s, and no need to emit any + // literal bytes prior to s. + + // Extend the 4-byte match as long as possible. + t := candidate.offset - e.cur + l := e.matchlenLong(s+4, t+4, src) + 4 + + // Extend backwards + for t > 0 && s > nextEmit && src[t-1] == src[s-1] { + s-- + t-- + l++ + } + if nextEmit < s { + emitLiteral(dst, src[nextEmit:s]) + } + + // Save the match found + dst.AddMatchLong(l, uint32(s-t-baseMatchOffset)) + s += l + nextEmit = s + if nextS >= s { + s = nextS + 1 + } + if s >= sLimit { + // Index first pair after match end. + if int(s+l+4) < len(src) { + cv := load3232(src, s) + e.table[hash(cv)] = tableEntry{offset: s + e.cur} + } + goto emitRemainder + } + + // We could immediately start working at s now, but to improve + // compression we first update the hash table at s-2 and at s. If + // another emitCopy is not our next move, also calculate nextHash + // at s+1. At least on GOARCH=amd64, these three hash calculations + // are faster as one load64 call (with some shifts) instead of + // three load32 calls. + x := load6432(src, s-2) + o := e.cur + s - 2 + prevHash := hash(uint32(x)) + e.table[prevHash] = tableEntry{offset: o} + x >>= 16 + currHash := hash(uint32(x)) + candidate = e.table[currHash] + e.table[currHash] = tableEntry{offset: o + 2} + + offset := s - (candidate.offset - e.cur) + if offset > maxMatchOffset || uint32(x) != load3232(src, candidate.offset-e.cur) { + cv = uint32(x >> 8) + s++ + break + } + } + } + +emitRemainder: + if int(nextEmit) < len(src) { + // If nothing was added, don't encode literals. + if dst.n == 0 { + return + } + emitLiteral(dst, src[nextEmit:]) + } +} diff --git a/vendor/github.com/klauspost/compress/flate/level2.go b/vendor/github.com/klauspost/compress/flate/level2.go new file mode 100644 index 0000000..234c438 --- /dev/null +++ b/vendor/github.com/klauspost/compress/flate/level2.go @@ -0,0 +1,205 @@ +package flate + +import "fmt" + +// fastGen maintains the table for matches, +// and the previous byte block for level 2. +// This is the generic implementation. +type fastEncL2 struct { + fastGen + table [bTableSize]tableEntry +} + +// EncodeL2 uses a similar algorithm to level 1, but is capable +// of matching across blocks giving better compression at a small slowdown. +func (e *fastEncL2) Encode(dst *tokens, src []byte) { + const ( + inputMargin = 12 - 1 + minNonLiteralBlockSize = 1 + 1 + inputMargin + ) + + if debugDeflate && e.cur < 0 { + panic(fmt.Sprint("e.cur < 0: ", e.cur)) + } + + // Protect against e.cur wraparound. + for e.cur >= bufferReset { + if len(e.hist) == 0 { + for i := range e.table[:] { + e.table[i] = tableEntry{} + } + e.cur = maxMatchOffset + break + } + // Shift down everything in the table that isn't already too far away. + minOff := e.cur + int32(len(e.hist)) - maxMatchOffset + for i := range e.table[:] { + v := e.table[i].offset + if v <= minOff { + v = 0 + } else { + v = v - e.cur + maxMatchOffset + } + e.table[i].offset = v + } + e.cur = maxMatchOffset + } + + s := e.addBlock(src) + + // This check isn't in the Snappy implementation, but there, the caller + // instead of the callee handles this case. + if len(src) < minNonLiteralBlockSize { + // We do not fill the token table. + // This will be picked up by caller. + dst.n = uint16(len(src)) + return + } + + // Override src + src = e.hist + nextEmit := s + + // sLimit is when to stop looking for offset/length copies. The inputMargin + // lets us use a fast path for emitLiteral in the main loop, while we are + // looking for copies. + sLimit := int32(len(src) - inputMargin) + + // nextEmit is where in src the next emitLiteral should start from. + cv := load3232(src, s) + for { + // When should we start skipping if we haven't found matches in a long while. + const skipLog = 5 + const doEvery = 2 + + nextS := s + var candidate tableEntry + for { + nextHash := hash4u(cv, bTableBits) + s = nextS + nextS = s + doEvery + (s-nextEmit)>>skipLog + if nextS > sLimit { + goto emitRemainder + } + candidate = e.table[nextHash] + now := load6432(src, nextS) + e.table[nextHash] = tableEntry{offset: s + e.cur} + nextHash = hash4u(uint32(now), bTableBits) + + offset := s - (candidate.offset - e.cur) + if offset < maxMatchOffset && cv == load3232(src, candidate.offset-e.cur) { + e.table[nextHash] = tableEntry{offset: nextS + e.cur} + break + } + + // Do one right away... + cv = uint32(now) + s = nextS + nextS++ + candidate = e.table[nextHash] + now >>= 8 + e.table[nextHash] = tableEntry{offset: s + e.cur} + + offset = s - (candidate.offset - e.cur) + if offset < maxMatchOffset && cv == load3232(src, candidate.offset-e.cur) { + break + } + cv = uint32(now) + } + + // A 4-byte match has been found. We'll later see if more than 4 bytes + // match. But, prior to the match, src[nextEmit:s] are unmatched. Emit + // them as literal bytes. + + // Call emitCopy, and then see if another emitCopy could be our next + // move. Repeat until we find no match for the input immediately after + // what was consumed by the last emitCopy call. + // + // If we exit this loop normally then we need to call emitLiteral next, + // though we don't yet know how big the literal will be. We handle that + // by proceeding to the next iteration of the main loop. We also can + // exit this loop via goto if we get close to exhausting the input. + for { + // Invariant: we have a 4-byte match at s, and no need to emit any + // literal bytes prior to s. + + // Extend the 4-byte match as long as possible. + t := candidate.offset - e.cur + l := e.matchlenLong(s+4, t+4, src) + 4 + + // Extend backwards + for t > 0 && s > nextEmit && src[t-1] == src[s-1] { + s-- + t-- + l++ + } + if nextEmit < s { + emitLiteral(dst, src[nextEmit:s]) + } + + dst.AddMatchLong(l, uint32(s-t-baseMatchOffset)) + s += l + nextEmit = s + if nextS >= s { + s = nextS + 1 + } + + if s >= sLimit { + // Index first pair after match end. + if int(s+l+4) < len(src) { + cv := load3232(src, s) + e.table[hash4u(cv, bTableBits)] = tableEntry{offset: s + e.cur} + } + goto emitRemainder + } + + // Store every second hash in-between, but offset by 1. + for i := s - l + 2; i < s-5; i += 7 { + x := load6432(src, i) + nextHash := hash4u(uint32(x), bTableBits) + e.table[nextHash] = tableEntry{offset: e.cur + i} + // Skip one + x >>= 16 + nextHash = hash4u(uint32(x), bTableBits) + e.table[nextHash] = tableEntry{offset: e.cur + i + 2} + // Skip one + x >>= 16 + nextHash = hash4u(uint32(x), bTableBits) + e.table[nextHash] = tableEntry{offset: e.cur + i + 4} + } + + // We could immediately start working at s now, but to improve + // compression we first update the hash table at s-2 to s. If + // another emitCopy is not our next move, also calculate nextHash + // at s+1. At least on GOARCH=amd64, these three hash calculations + // are faster as one load64 call (with some shifts) instead of + // three load32 calls. + x := load6432(src, s-2) + o := e.cur + s - 2 + prevHash := hash4u(uint32(x), bTableBits) + prevHash2 := hash4u(uint32(x>>8), bTableBits) + e.table[prevHash] = tableEntry{offset: o} + e.table[prevHash2] = tableEntry{offset: o + 1} + currHash := hash4u(uint32(x>>16), bTableBits) + candidate = e.table[currHash] + e.table[currHash] = tableEntry{offset: o + 2} + + offset := s - (candidate.offset - e.cur) + if offset > maxMatchOffset || uint32(x>>16) != load3232(src, candidate.offset-e.cur) { + cv = uint32(x >> 24) + s++ + break + } + } + } + +emitRemainder: + if int(nextEmit) < len(src) { + // If nothing was added, don't encode literals. + if dst.n == 0 { + return + } + + emitLiteral(dst, src[nextEmit:]) + } +} diff --git a/vendor/github.com/klauspost/compress/flate/level3.go b/vendor/github.com/klauspost/compress/flate/level3.go new file mode 100644 index 0000000..c22b424 --- /dev/null +++ b/vendor/github.com/klauspost/compress/flate/level3.go @@ -0,0 +1,229 @@ +package flate + +import "fmt" + +// fastEncL3 +type fastEncL3 struct { + fastGen + table [tableSize]tableEntryPrev +} + +// Encode uses a similar algorithm to level 2, will check up to two candidates. +func (e *fastEncL3) Encode(dst *tokens, src []byte) { + const ( + inputMargin = 8 - 1 + minNonLiteralBlockSize = 1 + 1 + inputMargin + ) + + if debugDeflate && e.cur < 0 { + panic(fmt.Sprint("e.cur < 0: ", e.cur)) + } + + // Protect against e.cur wraparound. + for e.cur >= bufferReset { + if len(e.hist) == 0 { + for i := range e.table[:] { + e.table[i] = tableEntryPrev{} + } + e.cur = maxMatchOffset + break + } + // Shift down everything in the table that isn't already too far away. + minOff := e.cur + int32(len(e.hist)) - maxMatchOffset + for i := range e.table[:] { + v := e.table[i] + if v.Cur.offset <= minOff { + v.Cur.offset = 0 + } else { + v.Cur.offset = v.Cur.offset - e.cur + maxMatchOffset + } + if v.Prev.offset <= minOff { + v.Prev.offset = 0 + } else { + v.Prev.offset = v.Prev.offset - e.cur + maxMatchOffset + } + e.table[i] = v + } + e.cur = maxMatchOffset + } + + s := e.addBlock(src) + + // Skip if too small. + if len(src) < minNonLiteralBlockSize { + // We do not fill the token table. + // This will be picked up by caller. + dst.n = uint16(len(src)) + return + } + + // Override src + src = e.hist + nextEmit := s + + // sLimit is when to stop looking for offset/length copies. The inputMargin + // lets us use a fast path for emitLiteral in the main loop, while we are + // looking for copies. + sLimit := int32(len(src) - inputMargin) + + // nextEmit is where in src the next emitLiteral should start from. + cv := load3232(src, s) + for { + const skipLog = 6 + nextS := s + var candidate tableEntry + for { + nextHash := hash(cv) + s = nextS + nextS = s + 1 + (s-nextEmit)>>skipLog + if nextS > sLimit { + goto emitRemainder + } + candidates := e.table[nextHash] + now := load3232(src, nextS) + + // Safe offset distance until s + 4... + minOffset := e.cur + s - (maxMatchOffset - 4) + e.table[nextHash] = tableEntryPrev{Prev: candidates.Cur, Cur: tableEntry{offset: s + e.cur}} + + // Check both candidates + candidate = candidates.Cur + if candidate.offset < minOffset { + cv = now + // Previous will also be invalid, we have nothing. + continue + } + + if cv == load3232(src, candidate.offset-e.cur) { + if candidates.Prev.offset < minOffset || cv != load3232(src, candidates.Prev.offset-e.cur) { + break + } + // Both match and are valid, pick longest. + offset := s - (candidate.offset - e.cur) + o2 := s - (candidates.Prev.offset - e.cur) + l1, l2 := matchLen(src[s+4:], src[s-offset+4:]), matchLen(src[s+4:], src[s-o2+4:]) + if l2 > l1 { + candidate = candidates.Prev + } + break + } else { + // We only check if value mismatches. + // Offset will always be invalid in other cases. + candidate = candidates.Prev + if candidate.offset > minOffset && cv == load3232(src, candidate.offset-e.cur) { + break + } + } + cv = now + } + + // Call emitCopy, and then see if another emitCopy could be our next + // move. Repeat until we find no match for the input immediately after + // what was consumed by the last emitCopy call. + // + // If we exit this loop normally then we need to call emitLiteral next, + // though we don't yet know how big the literal will be. We handle that + // by proceeding to the next iteration of the main loop. We also can + // exit this loop via goto if we get close to exhausting the input. + for { + // Invariant: we have a 4-byte match at s, and no need to emit any + // literal bytes prior to s. + + // Extend the 4-byte match as long as possible. + // + t := candidate.offset - e.cur + l := e.matchlenLong(s+4, t+4, src) + 4 + + // Extend backwards + for t > 0 && s > nextEmit && src[t-1] == src[s-1] { + s-- + t-- + l++ + } + if nextEmit < s { + emitLiteral(dst, src[nextEmit:s]) + } + + dst.AddMatchLong(l, uint32(s-t-baseMatchOffset)) + s += l + nextEmit = s + if nextS >= s { + s = nextS + 1 + } + + if s >= sLimit { + t += l + // Index first pair after match end. + if int(t+4) < len(src) && t > 0 { + cv := load3232(src, t) + nextHash := hash(cv) + e.table[nextHash] = tableEntryPrev{ + Prev: e.table[nextHash].Cur, + Cur: tableEntry{offset: e.cur + t}, + } + } + goto emitRemainder + } + + // We could immediately start working at s now, but to improve + // compression we first update the hash table at s-3 to s. + x := load6432(src, s-3) + prevHash := hash(uint32(x)) + e.table[prevHash] = tableEntryPrev{ + Prev: e.table[prevHash].Cur, + Cur: tableEntry{offset: e.cur + s - 3}, + } + x >>= 8 + prevHash = hash(uint32(x)) + + e.table[prevHash] = tableEntryPrev{ + Prev: e.table[prevHash].Cur, + Cur: tableEntry{offset: e.cur + s - 2}, + } + x >>= 8 + prevHash = hash(uint32(x)) + + e.table[prevHash] = tableEntryPrev{ + Prev: e.table[prevHash].Cur, + Cur: tableEntry{offset: e.cur + s - 1}, + } + x >>= 8 + currHash := hash(uint32(x)) + candidates := e.table[currHash] + cv = uint32(x) + e.table[currHash] = tableEntryPrev{ + Prev: candidates.Cur, + Cur: tableEntry{offset: s + e.cur}, + } + + // Check both candidates + candidate = candidates.Cur + minOffset := e.cur + s - (maxMatchOffset - 4) + + if candidate.offset > minOffset && cv != load3232(src, candidate.offset-e.cur) { + // We only check if value mismatches. + // Offset will always be invalid in other cases. + candidate = candidates.Prev + if candidate.offset > minOffset && cv == load3232(src, candidate.offset-e.cur) { + offset := s - (candidate.offset - e.cur) + if offset <= maxMatchOffset { + continue + } + } + } + cv = uint32(x >> 8) + s++ + break + } + } + +emitRemainder: + if int(nextEmit) < len(src) { + // If nothing was added, don't encode literals. + if dst.n == 0 { + return + } + + emitLiteral(dst, src[nextEmit:]) + } +} diff --git a/vendor/github.com/klauspost/compress/flate/level4.go b/vendor/github.com/klauspost/compress/flate/level4.go new file mode 100644 index 0000000..e62f0c0 --- /dev/null +++ b/vendor/github.com/klauspost/compress/flate/level4.go @@ -0,0 +1,212 @@ +package flate + +import "fmt" + +type fastEncL4 struct { + fastGen + table [tableSize]tableEntry + bTable [tableSize]tableEntry +} + +func (e *fastEncL4) Encode(dst *tokens, src []byte) { + const ( + inputMargin = 12 - 1 + minNonLiteralBlockSize = 1 + 1 + inputMargin + ) + if debugDeflate && e.cur < 0 { + panic(fmt.Sprint("e.cur < 0: ", e.cur)) + } + // Protect against e.cur wraparound. + for e.cur >= bufferReset { + if len(e.hist) == 0 { + for i := range e.table[:] { + e.table[i] = tableEntry{} + } + for i := range e.bTable[:] { + e.bTable[i] = tableEntry{} + } + e.cur = maxMatchOffset + break + } + // Shift down everything in the table that isn't already too far away. + minOff := e.cur + int32(len(e.hist)) - maxMatchOffset + for i := range e.table[:] { + v := e.table[i].offset + if v <= minOff { + v = 0 + } else { + v = v - e.cur + maxMatchOffset + } + e.table[i].offset = v + } + for i := range e.bTable[:] { + v := e.bTable[i].offset + if v <= minOff { + v = 0 + } else { + v = v - e.cur + maxMatchOffset + } + e.bTable[i].offset = v + } + e.cur = maxMatchOffset + } + + s := e.addBlock(src) + + // This check isn't in the Snappy implementation, but there, the caller + // instead of the callee handles this case. + if len(src) < minNonLiteralBlockSize { + // We do not fill the token table. + // This will be picked up by caller. + dst.n = uint16(len(src)) + return + } + + // Override src + src = e.hist + nextEmit := s + + // sLimit is when to stop looking for offset/length copies. The inputMargin + // lets us use a fast path for emitLiteral in the main loop, while we are + // looking for copies. + sLimit := int32(len(src) - inputMargin) + + // nextEmit is where in src the next emitLiteral should start from. + cv := load6432(src, s) + for { + const skipLog = 6 + const doEvery = 1 + + nextS := s + var t int32 + for { + nextHashS := hash4x64(cv, tableBits) + nextHashL := hash7(cv, tableBits) + + s = nextS + nextS = s + doEvery + (s-nextEmit)>>skipLog + if nextS > sLimit { + goto emitRemainder + } + // Fetch a short+long candidate + sCandidate := e.table[nextHashS] + lCandidate := e.bTable[nextHashL] + next := load6432(src, nextS) + entry := tableEntry{offset: s + e.cur} + e.table[nextHashS] = entry + e.bTable[nextHashL] = entry + + t = lCandidate.offset - e.cur + if s-t < maxMatchOffset && uint32(cv) == load3232(src, lCandidate.offset-e.cur) { + // We got a long match. Use that. + break + } + + t = sCandidate.offset - e.cur + if s-t < maxMatchOffset && uint32(cv) == load3232(src, sCandidate.offset-e.cur) { + // Found a 4 match... + lCandidate = e.bTable[hash7(next, tableBits)] + + // If the next long is a candidate, check if we should use that instead... + lOff := nextS - (lCandidate.offset - e.cur) + if lOff < maxMatchOffset && load3232(src, lCandidate.offset-e.cur) == uint32(next) { + l1, l2 := matchLen(src[s+4:], src[t+4:]), matchLen(src[nextS+4:], src[nextS-lOff+4:]) + if l2 > l1 { + s = nextS + t = lCandidate.offset - e.cur + } + } + break + } + cv = next + } + + // A 4-byte match has been found. We'll later see if more than 4 bytes + // match. But, prior to the match, src[nextEmit:s] are unmatched. Emit + // them as literal bytes. + + // Extend the 4-byte match as long as possible. + l := e.matchlenLong(s+4, t+4, src) + 4 + + // Extend backwards + for t > 0 && s > nextEmit && src[t-1] == src[s-1] { + s-- + t-- + l++ + } + if nextEmit < s { + emitLiteral(dst, src[nextEmit:s]) + } + if debugDeflate { + if t >= s { + panic("s-t") + } + if (s - t) > maxMatchOffset { + panic(fmt.Sprintln("mmo", t)) + } + if l < baseMatchLength { + panic("bml") + } + } + + dst.AddMatchLong(l, uint32(s-t-baseMatchOffset)) + s += l + nextEmit = s + if nextS >= s { + s = nextS + 1 + } + + if s >= sLimit { + // Index first pair after match end. + if int(s+8) < len(src) { + cv := load6432(src, s) + e.table[hash4x64(cv, tableBits)] = tableEntry{offset: s + e.cur} + e.bTable[hash7(cv, tableBits)] = tableEntry{offset: s + e.cur} + } + goto emitRemainder + } + + // Store every 3rd hash in-between + if true { + i := nextS + if i < s-1 { + cv := load6432(src, i) + t := tableEntry{offset: i + e.cur} + t2 := tableEntry{offset: t.offset + 1} + e.bTable[hash7(cv, tableBits)] = t + e.bTable[hash7(cv>>8, tableBits)] = t2 + e.table[hash4u(uint32(cv>>8), tableBits)] = t2 + + i += 3 + for ; i < s-1; i += 3 { + cv := load6432(src, i) + t := tableEntry{offset: i + e.cur} + t2 := tableEntry{offset: t.offset + 1} + e.bTable[hash7(cv, tableBits)] = t + e.bTable[hash7(cv>>8, tableBits)] = t2 + e.table[hash4u(uint32(cv>>8), tableBits)] = t2 + } + } + } + + // We could immediately start working at s now, but to improve + // compression we first update the hash table at s-1 and at s. + x := load6432(src, s-1) + o := e.cur + s - 1 + prevHashS := hash4x64(x, tableBits) + prevHashL := hash7(x, tableBits) + e.table[prevHashS] = tableEntry{offset: o} + e.bTable[prevHashL] = tableEntry{offset: o} + cv = x >> 8 + } + +emitRemainder: + if int(nextEmit) < len(src) { + // If nothing was added, don't encode literals. + if dst.n == 0 { + return + } + + emitLiteral(dst, src[nextEmit:]) + } +} diff --git a/vendor/github.com/klauspost/compress/flate/level5.go b/vendor/github.com/klauspost/compress/flate/level5.go new file mode 100644 index 0000000..293a3a3 --- /dev/null +++ b/vendor/github.com/klauspost/compress/flate/level5.go @@ -0,0 +1,294 @@ +package flate + +import "fmt" + +type fastEncL5 struct { + fastGen + table [tableSize]tableEntry + bTable [tableSize]tableEntryPrev +} + +func (e *fastEncL5) Encode(dst *tokens, src []byte) { + const ( + inputMargin = 12 - 1 + minNonLiteralBlockSize = 1 + 1 + inputMargin + ) + if debugDeflate && e.cur < 0 { + panic(fmt.Sprint("e.cur < 0: ", e.cur)) + } + + // Protect against e.cur wraparound. + for e.cur >= bufferReset { + if len(e.hist) == 0 { + for i := range e.table[:] { + e.table[i] = tableEntry{} + } + for i := range e.bTable[:] { + e.bTable[i] = tableEntryPrev{} + } + e.cur = maxMatchOffset + break + } + // Shift down everything in the table that isn't already too far away. + minOff := e.cur + int32(len(e.hist)) - maxMatchOffset + for i := range e.table[:] { + v := e.table[i].offset + if v <= minOff { + v = 0 + } else { + v = v - e.cur + maxMatchOffset + } + e.table[i].offset = v + } + for i := range e.bTable[:] { + v := e.bTable[i] + if v.Cur.offset <= minOff { + v.Cur.offset = 0 + v.Prev.offset = 0 + } else { + v.Cur.offset = v.Cur.offset - e.cur + maxMatchOffset + if v.Prev.offset <= minOff { + v.Prev.offset = 0 + } else { + v.Prev.offset = v.Prev.offset - e.cur + maxMatchOffset + } + } + e.bTable[i] = v + } + e.cur = maxMatchOffset + } + + s := e.addBlock(src) + + // This check isn't in the Snappy implementation, but there, the caller + // instead of the callee handles this case. + if len(src) < minNonLiteralBlockSize { + // We do not fill the token table. + // This will be picked up by caller. + dst.n = uint16(len(src)) + return + } + + // Override src + src = e.hist + nextEmit := s + + // sLimit is when to stop looking for offset/length copies. The inputMargin + // lets us use a fast path for emitLiteral in the main loop, while we are + // looking for copies. + sLimit := int32(len(src) - inputMargin) + + // nextEmit is where in src the next emitLiteral should start from. + cv := load6432(src, s) + for { + const skipLog = 6 + const doEvery = 1 + + nextS := s + var l int32 + var t int32 + for { + nextHashS := hash4x64(cv, tableBits) + nextHashL := hash7(cv, tableBits) + + s = nextS + nextS = s + doEvery + (s-nextEmit)>>skipLog + if nextS > sLimit { + goto emitRemainder + } + // Fetch a short+long candidate + sCandidate := e.table[nextHashS] + lCandidate := e.bTable[nextHashL] + next := load6432(src, nextS) + entry := tableEntry{offset: s + e.cur} + e.table[nextHashS] = entry + eLong := &e.bTable[nextHashL] + eLong.Cur, eLong.Prev = entry, eLong.Cur + + nextHashS = hash4x64(next, tableBits) + nextHashL = hash7(next, tableBits) + + t = lCandidate.Cur.offset - e.cur + if s-t < maxMatchOffset { + if uint32(cv) == load3232(src, lCandidate.Cur.offset-e.cur) { + // Store the next match + e.table[nextHashS] = tableEntry{offset: nextS + e.cur} + eLong := &e.bTable[nextHashL] + eLong.Cur, eLong.Prev = tableEntry{offset: nextS + e.cur}, eLong.Cur + + t2 := lCandidate.Prev.offset - e.cur + if s-t2 < maxMatchOffset && uint32(cv) == load3232(src, lCandidate.Prev.offset-e.cur) { + l = e.matchlen(s+4, t+4, src) + 4 + ml1 := e.matchlen(s+4, t2+4, src) + 4 + if ml1 > l { + t = t2 + l = ml1 + break + } + } + break + } + t = lCandidate.Prev.offset - e.cur + if s-t < maxMatchOffset && uint32(cv) == load3232(src, lCandidate.Prev.offset-e.cur) { + // Store the next match + e.table[nextHashS] = tableEntry{offset: nextS + e.cur} + eLong := &e.bTable[nextHashL] + eLong.Cur, eLong.Prev = tableEntry{offset: nextS + e.cur}, eLong.Cur + break + } + } + + t = sCandidate.offset - e.cur + if s-t < maxMatchOffset && uint32(cv) == load3232(src, sCandidate.offset-e.cur) { + // Found a 4 match... + l = e.matchlen(s+4, t+4, src) + 4 + lCandidate = e.bTable[nextHashL] + // Store the next match + + e.table[nextHashS] = tableEntry{offset: nextS + e.cur} + eLong := &e.bTable[nextHashL] + eLong.Cur, eLong.Prev = tableEntry{offset: nextS + e.cur}, eLong.Cur + + // If the next long is a candidate, use that... + t2 := lCandidate.Cur.offset - e.cur + if nextS-t2 < maxMatchOffset { + if load3232(src, lCandidate.Cur.offset-e.cur) == uint32(next) { + ml := e.matchlen(nextS+4, t2+4, src) + 4 + if ml > l { + t = t2 + s = nextS + l = ml + break + } + } + // If the previous long is a candidate, use that... + t2 = lCandidate.Prev.offset - e.cur + if nextS-t2 < maxMatchOffset && load3232(src, lCandidate.Prev.offset-e.cur) == uint32(next) { + ml := e.matchlen(nextS+4, t2+4, src) + 4 + if ml > l { + t = t2 + s = nextS + l = ml + break + } + } + } + break + } + cv = next + } + + // A 4-byte match has been found. We'll later see if more than 4 bytes + // match. But, prior to the match, src[nextEmit:s] are unmatched. Emit + // them as literal bytes. + + if l == 0 { + // Extend the 4-byte match as long as possible. + l = e.matchlenLong(s+4, t+4, src) + 4 + } else if l == maxMatchLength { + l += e.matchlenLong(s+l, t+l, src) + } + + // Try to locate a better match by checking the end of best match... + if sAt := s + l; l < 30 && sAt < sLimit { + eLong := e.bTable[hash7(load6432(src, sAt), tableBits)].Cur.offset + // Test current + t2 := eLong - e.cur - l + off := s - t2 + if t2 >= 0 && off < maxMatchOffset && off > 0 { + if l2 := e.matchlenLong(s, t2, src); l2 > l { + t = t2 + l = l2 + } + } + } + + // Extend backwards + for t > 0 && s > nextEmit && src[t-1] == src[s-1] { + s-- + t-- + l++ + } + if nextEmit < s { + emitLiteral(dst, src[nextEmit:s]) + } + if debugDeflate { + if t >= s { + panic(fmt.Sprintln("s-t", s, t)) + } + if (s - t) > maxMatchOffset { + panic(fmt.Sprintln("mmo", s-t)) + } + if l < baseMatchLength { + panic("bml") + } + } + + dst.AddMatchLong(l, uint32(s-t-baseMatchOffset)) + s += l + nextEmit = s + if nextS >= s { + s = nextS + 1 + } + + if s >= sLimit { + goto emitRemainder + } + + // Store every 3rd hash in-between. + if true { + const hashEvery = 3 + i := s - l + 1 + if i < s-1 { + cv := load6432(src, i) + t := tableEntry{offset: i + e.cur} + e.table[hash4x64(cv, tableBits)] = t + eLong := &e.bTable[hash7(cv, tableBits)] + eLong.Cur, eLong.Prev = t, eLong.Cur + + // Do an long at i+1 + cv >>= 8 + t = tableEntry{offset: t.offset + 1} + eLong = &e.bTable[hash7(cv, tableBits)] + eLong.Cur, eLong.Prev = t, eLong.Cur + + // We only have enough bits for a short entry at i+2 + cv >>= 8 + t = tableEntry{offset: t.offset + 1} + e.table[hash4x64(cv, tableBits)] = t + + // Skip one - otherwise we risk hitting 's' + i += 4 + for ; i < s-1; i += hashEvery { + cv := load6432(src, i) + t := tableEntry{offset: i + e.cur} + t2 := tableEntry{offset: t.offset + 1} + eLong := &e.bTable[hash7(cv, tableBits)] + eLong.Cur, eLong.Prev = t, eLong.Cur + e.table[hash4u(uint32(cv>>8), tableBits)] = t2 + } + } + } + + // We could immediately start working at s now, but to improve + // compression we first update the hash table at s-1 and at s. + x := load6432(src, s-1) + o := e.cur + s - 1 + prevHashS := hash4x64(x, tableBits) + prevHashL := hash7(x, tableBits) + e.table[prevHashS] = tableEntry{offset: o} + eLong := &e.bTable[prevHashL] + eLong.Cur, eLong.Prev = tableEntry{offset: o}, eLong.Cur + cv = x >> 8 + } + +emitRemainder: + if int(nextEmit) < len(src) { + // If nothing was added, don't encode literals. + if dst.n == 0 { + return + } + + emitLiteral(dst, src[nextEmit:]) + } +} diff --git a/vendor/github.com/klauspost/compress/flate/level6.go b/vendor/github.com/klauspost/compress/flate/level6.go new file mode 100644 index 0000000..a709977 --- /dev/null +++ b/vendor/github.com/klauspost/compress/flate/level6.go @@ -0,0 +1,307 @@ +package flate + +import "fmt" + +type fastEncL6 struct { + fastGen + table [tableSize]tableEntry + bTable [tableSize]tableEntryPrev +} + +func (e *fastEncL6) Encode(dst *tokens, src []byte) { + const ( + inputMargin = 12 - 1 + minNonLiteralBlockSize = 1 + 1 + inputMargin + ) + if debugDeflate && e.cur < 0 { + panic(fmt.Sprint("e.cur < 0: ", e.cur)) + } + + // Protect against e.cur wraparound. + for e.cur >= bufferReset { + if len(e.hist) == 0 { + for i := range e.table[:] { + e.table[i] = tableEntry{} + } + for i := range e.bTable[:] { + e.bTable[i] = tableEntryPrev{} + } + e.cur = maxMatchOffset + break + } + // Shift down everything in the table that isn't already too far away. + minOff := e.cur + int32(len(e.hist)) - maxMatchOffset + for i := range e.table[:] { + v := e.table[i].offset + if v <= minOff { + v = 0 + } else { + v = v - e.cur + maxMatchOffset + } + e.table[i].offset = v + } + for i := range e.bTable[:] { + v := e.bTable[i] + if v.Cur.offset <= minOff { + v.Cur.offset = 0 + v.Prev.offset = 0 + } else { + v.Cur.offset = v.Cur.offset - e.cur + maxMatchOffset + if v.Prev.offset <= minOff { + v.Prev.offset = 0 + } else { + v.Prev.offset = v.Prev.offset - e.cur + maxMatchOffset + } + } + e.bTable[i] = v + } + e.cur = maxMatchOffset + } + + s := e.addBlock(src) + + // This check isn't in the Snappy implementation, but there, the caller + // instead of the callee handles this case. + if len(src) < minNonLiteralBlockSize { + // We do not fill the token table. + // This will be picked up by caller. + dst.n = uint16(len(src)) + return + } + + // Override src + src = e.hist + nextEmit := s + + // sLimit is when to stop looking for offset/length copies. The inputMargin + // lets us use a fast path for emitLiteral in the main loop, while we are + // looking for copies. + sLimit := int32(len(src) - inputMargin) + + // nextEmit is where in src the next emitLiteral should start from. + cv := load6432(src, s) + // Repeat MUST be > 1 and within range + repeat := int32(1) + for { + const skipLog = 7 + const doEvery = 1 + + nextS := s + var l int32 + var t int32 + for { + nextHashS := hash4x64(cv, tableBits) + nextHashL := hash7(cv, tableBits) + s = nextS + nextS = s + doEvery + (s-nextEmit)>>skipLog + if nextS > sLimit { + goto emitRemainder + } + // Fetch a short+long candidate + sCandidate := e.table[nextHashS] + lCandidate := e.bTable[nextHashL] + next := load6432(src, nextS) + entry := tableEntry{offset: s + e.cur} + e.table[nextHashS] = entry + eLong := &e.bTable[nextHashL] + eLong.Cur, eLong.Prev = entry, eLong.Cur + + // Calculate hashes of 'next' + nextHashS = hash4x64(next, tableBits) + nextHashL = hash7(next, tableBits) + + t = lCandidate.Cur.offset - e.cur + if s-t < maxMatchOffset { + if uint32(cv) == load3232(src, lCandidate.Cur.offset-e.cur) { + // Long candidate matches at least 4 bytes. + + // Store the next match + e.table[nextHashS] = tableEntry{offset: nextS + e.cur} + eLong := &e.bTable[nextHashL] + eLong.Cur, eLong.Prev = tableEntry{offset: nextS + e.cur}, eLong.Cur + + // Check the previous long candidate as well. + t2 := lCandidate.Prev.offset - e.cur + if s-t2 < maxMatchOffset && uint32(cv) == load3232(src, lCandidate.Prev.offset-e.cur) { + l = e.matchlen(s+4, t+4, src) + 4 + ml1 := e.matchlen(s+4, t2+4, src) + 4 + if ml1 > l { + t = t2 + l = ml1 + break + } + } + break + } + // Current value did not match, but check if previous long value does. + t = lCandidate.Prev.offset - e.cur + if s-t < maxMatchOffset && uint32(cv) == load3232(src, lCandidate.Prev.offset-e.cur) { + // Store the next match + e.table[nextHashS] = tableEntry{offset: nextS + e.cur} + eLong := &e.bTable[nextHashL] + eLong.Cur, eLong.Prev = tableEntry{offset: nextS + e.cur}, eLong.Cur + break + } + } + + t = sCandidate.offset - e.cur + if s-t < maxMatchOffset && uint32(cv) == load3232(src, sCandidate.offset-e.cur) { + // Found a 4 match... + l = e.matchlen(s+4, t+4, src) + 4 + + // Look up next long candidate (at nextS) + lCandidate = e.bTable[nextHashL] + + // Store the next match + e.table[nextHashS] = tableEntry{offset: nextS + e.cur} + eLong := &e.bTable[nextHashL] + eLong.Cur, eLong.Prev = tableEntry{offset: nextS + e.cur}, eLong.Cur + + // Check repeat at s + repOff + const repOff = 1 + t2 := s - repeat + repOff + if load3232(src, t2) == uint32(cv>>(8*repOff)) { + ml := e.matchlen(s+4+repOff, t2+4, src) + 4 + if ml > l { + t = t2 + l = ml + s += repOff + // Not worth checking more. + break + } + } + + // If the next long is a candidate, use that... + t2 = lCandidate.Cur.offset - e.cur + if nextS-t2 < maxMatchOffset { + if load3232(src, lCandidate.Cur.offset-e.cur) == uint32(next) { + ml := e.matchlen(nextS+4, t2+4, src) + 4 + if ml > l { + t = t2 + s = nextS + l = ml + // This is ok, but check previous as well. + } + } + // If the previous long is a candidate, use that... + t2 = lCandidate.Prev.offset - e.cur + if nextS-t2 < maxMatchOffset && load3232(src, lCandidate.Prev.offset-e.cur) == uint32(next) { + ml := e.matchlen(nextS+4, t2+4, src) + 4 + if ml > l { + t = t2 + s = nextS + l = ml + break + } + } + } + break + } + cv = next + } + + // A 4-byte match has been found. We'll later see if more than 4 bytes + // match. But, prior to the match, src[nextEmit:s] are unmatched. Emit + // them as literal bytes. + + // Extend the 4-byte match as long as possible. + if l == 0 { + l = e.matchlenLong(s+4, t+4, src) + 4 + } else if l == maxMatchLength { + l += e.matchlenLong(s+l, t+l, src) + } + + // Try to locate a better match by checking the end-of-match... + if sAt := s + l; sAt < sLimit { + eLong := &e.bTable[hash7(load6432(src, sAt), tableBits)] + // Test current + t2 := eLong.Cur.offset - e.cur - l + off := s - t2 + if off < maxMatchOffset { + if off > 0 && t2 >= 0 { + if l2 := e.matchlenLong(s, t2, src); l2 > l { + t = t2 + l = l2 + } + } + // Test next: + t2 = eLong.Prev.offset - e.cur - l + off := s - t2 + if off > 0 && off < maxMatchOffset && t2 >= 0 { + if l2 := e.matchlenLong(s, t2, src); l2 > l { + t = t2 + l = l2 + } + } + } + } + + // Extend backwards + for t > 0 && s > nextEmit && src[t-1] == src[s-1] { + s-- + t-- + l++ + } + if nextEmit < s { + emitLiteral(dst, src[nextEmit:s]) + } + if false { + if t >= s { + panic(fmt.Sprintln("s-t", s, t)) + } + if (s - t) > maxMatchOffset { + panic(fmt.Sprintln("mmo", s-t)) + } + if l < baseMatchLength { + panic("bml") + } + } + + dst.AddMatchLong(l, uint32(s-t-baseMatchOffset)) + repeat = s - t + s += l + nextEmit = s + if nextS >= s { + s = nextS + 1 + } + + if s >= sLimit { + // Index after match end. + for i := nextS + 1; i < int32(len(src))-8; i += 2 { + cv := load6432(src, i) + e.table[hash4x64(cv, tableBits)] = tableEntry{offset: i + e.cur} + eLong := &e.bTable[hash7(cv, tableBits)] + eLong.Cur, eLong.Prev = tableEntry{offset: i + e.cur}, eLong.Cur + } + goto emitRemainder + } + + // Store every long hash in-between and every second short. + if true { + for i := nextS + 1; i < s-1; i += 2 { + cv := load6432(src, i) + t := tableEntry{offset: i + e.cur} + t2 := tableEntry{offset: t.offset + 1} + eLong := &e.bTable[hash7(cv, tableBits)] + eLong2 := &e.bTable[hash7(cv>>8, tableBits)] + e.table[hash4x64(cv, tableBits)] = t + eLong.Cur, eLong.Prev = t, eLong.Cur + eLong2.Cur, eLong2.Prev = t2, eLong2.Cur + } + } + + // We could immediately start working at s now, but to improve + // compression we first update the hash table at s-1 and at s. + cv = load6432(src, s) + } + +emitRemainder: + if int(nextEmit) < len(src) { + // If nothing was added, don't encode literals. + if dst.n == 0 { + return + } + + emitLiteral(dst, src[nextEmit:]) + } +} diff --git a/vendor/github.com/klauspost/compress/flate/regmask_amd64.go b/vendor/github.com/klauspost/compress/flate/regmask_amd64.go new file mode 100644 index 0000000..6ed2806 --- /dev/null +++ b/vendor/github.com/klauspost/compress/flate/regmask_amd64.go @@ -0,0 +1,37 @@ +package flate + +const ( + // Masks for shifts with register sizes of the shift value. + // This can be used to work around the x86 design of shifting by mod register size. + // It can be used when a variable shift is always smaller than the register size. + + // reg8SizeMaskX - shift value is 8 bits, shifted is X + reg8SizeMask8 = 7 + reg8SizeMask16 = 15 + reg8SizeMask32 = 31 + reg8SizeMask64 = 63 + + // reg16SizeMaskX - shift value is 16 bits, shifted is X + reg16SizeMask8 = reg8SizeMask8 + reg16SizeMask16 = reg8SizeMask16 + reg16SizeMask32 = reg8SizeMask32 + reg16SizeMask64 = reg8SizeMask64 + + // reg32SizeMaskX - shift value is 32 bits, shifted is X + reg32SizeMask8 = reg8SizeMask8 + reg32SizeMask16 = reg8SizeMask16 + reg32SizeMask32 = reg8SizeMask32 + reg32SizeMask64 = reg8SizeMask64 + + // reg64SizeMaskX - shift value is 64 bits, shifted is X + reg64SizeMask8 = reg8SizeMask8 + reg64SizeMask16 = reg8SizeMask16 + reg64SizeMask32 = reg8SizeMask32 + reg64SizeMask64 = reg8SizeMask64 + + // regSizeMaskUintX - shift value is uint, shifted is X + regSizeMaskUint8 = reg8SizeMask8 + regSizeMaskUint16 = reg8SizeMask16 + regSizeMaskUint32 = reg8SizeMask32 + regSizeMaskUint64 = reg8SizeMask64 +) diff --git a/vendor/github.com/klauspost/compress/flate/regmask_other.go b/vendor/github.com/klauspost/compress/flate/regmask_other.go new file mode 100644 index 0000000..f477a5d --- /dev/null +++ b/vendor/github.com/klauspost/compress/flate/regmask_other.go @@ -0,0 +1,39 @@ +//+build !amd64 + +package flate + +const ( + // Masks for shifts with register sizes of the shift value. + // This can be used to work around the x86 design of shifting by mod register size. + // It can be used when a variable shift is always smaller than the register size. + + // reg8SizeMaskX - shift value is 8 bits, shifted is X + reg8SizeMask8 = 0xff + reg8SizeMask16 = 0xff + reg8SizeMask32 = 0xff + reg8SizeMask64 = 0xff + + // reg16SizeMaskX - shift value is 16 bits, shifted is X + reg16SizeMask8 = 0xffff + reg16SizeMask16 = 0xffff + reg16SizeMask32 = 0xffff + reg16SizeMask64 = 0xffff + + // reg32SizeMaskX - shift value is 32 bits, shifted is X + reg32SizeMask8 = 0xffffffff + reg32SizeMask16 = 0xffffffff + reg32SizeMask32 = 0xffffffff + reg32SizeMask64 = 0xffffffff + + // reg64SizeMaskX - shift value is 64 bits, shifted is X + reg64SizeMask8 = 0xffffffffffffffff + reg64SizeMask16 = 0xffffffffffffffff + reg64SizeMask32 = 0xffffffffffffffff + reg64SizeMask64 = 0xffffffffffffffff + + // regSizeMaskUintX - shift value is uint, shifted is X + regSizeMaskUint8 = ^uint(0) + regSizeMaskUint16 = ^uint(0) + regSizeMaskUint32 = ^uint(0) + regSizeMaskUint64 = ^uint(0) +) diff --git a/vendor/github.com/klauspost/compress/flate/stateless.go b/vendor/github.com/klauspost/compress/flate/stateless.go new file mode 100644 index 0000000..53e8991 --- /dev/null +++ b/vendor/github.com/klauspost/compress/flate/stateless.go @@ -0,0 +1,297 @@ +package flate + +import ( + "io" + "math" + "sync" +) + +const ( + maxStatelessBlock = math.MaxInt16 + // dictionary will be taken from maxStatelessBlock, so limit it. + maxStatelessDict = 8 << 10 + + slTableBits = 13 + slTableSize = 1 << slTableBits + slTableShift = 32 - slTableBits +) + +type statelessWriter struct { + dst io.Writer + closed bool +} + +func (s *statelessWriter) Close() error { + if s.closed { + return nil + } + s.closed = true + // Emit EOF block + return StatelessDeflate(s.dst, nil, true, nil) +} + +func (s *statelessWriter) Write(p []byte) (n int, err error) { + err = StatelessDeflate(s.dst, p, false, nil) + if err != nil { + return 0, err + } + return len(p), nil +} + +func (s *statelessWriter) Reset(w io.Writer) { + s.dst = w + s.closed = false +} + +// NewStatelessWriter will do compression but without maintaining any state +// between Write calls. +// There will be no memory kept between Write calls, +// but compression and speed will be suboptimal. +// Because of this, the size of actual Write calls will affect output size. +func NewStatelessWriter(dst io.Writer) io.WriteCloser { + return &statelessWriter{dst: dst} +} + +// bitWriterPool contains bit writers that can be reused. +var bitWriterPool = sync.Pool{ + New: func() interface{} { + return newHuffmanBitWriter(nil) + }, +} + +// StatelessDeflate allows to compress directly to a Writer without retaining state. +// When returning everything will be flushed. +// Up to 8KB of an optional dictionary can be given which is presumed to presumed to precede the block. +// Longer dictionaries will be truncated and will still produce valid output. +// Sending nil dictionary is perfectly fine. +func StatelessDeflate(out io.Writer, in []byte, eof bool, dict []byte) error { + var dst tokens + bw := bitWriterPool.Get().(*huffmanBitWriter) + bw.reset(out) + defer func() { + // don't keep a reference to our output + bw.reset(nil) + bitWriterPool.Put(bw) + }() + if eof && len(in) == 0 { + // Just write an EOF block. + // Could be faster... + bw.writeStoredHeader(0, true) + bw.flush() + return bw.err + } + + // Truncate dict + if len(dict) > maxStatelessDict { + dict = dict[len(dict)-maxStatelessDict:] + } + + for len(in) > 0 { + todo := in + if len(todo) > maxStatelessBlock-len(dict) { + todo = todo[:maxStatelessBlock-len(dict)] + } + in = in[len(todo):] + uncompressed := todo + if len(dict) > 0 { + // combine dict and source + bufLen := len(todo) + len(dict) + combined := make([]byte, bufLen) + copy(combined, dict) + copy(combined[len(dict):], todo) + todo = combined + } + // Compress + statelessEnc(&dst, todo, int16(len(dict))) + isEof := eof && len(in) == 0 + + if dst.n == 0 { + bw.writeStoredHeader(len(uncompressed), isEof) + if bw.err != nil { + return bw.err + } + bw.writeBytes(uncompressed) + } else if int(dst.n) > len(uncompressed)-len(uncompressed)>>4 { + // If we removed less than 1/16th, huffman compress the block. + bw.writeBlockHuff(isEof, uncompressed, len(in) == 0) + } else { + bw.writeBlockDynamic(&dst, isEof, uncompressed, len(in) == 0) + } + if len(in) > 0 { + // Retain a dict if we have more + dict = todo[len(todo)-maxStatelessDict:] + dst.Reset() + } + if bw.err != nil { + return bw.err + } + } + if !eof { + // Align, only a stored block can do that. + bw.writeStoredHeader(0, false) + } + bw.flush() + return bw.err +} + +func hashSL(u uint32) uint32 { + return (u * 0x1e35a7bd) >> slTableShift +} + +func load3216(b []byte, i int16) uint32 { + // Help the compiler eliminate bounds checks on the read so it can be done in a single read. + b = b[i:] + b = b[:4] + return uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 +} + +func load6416(b []byte, i int16) uint64 { + // Help the compiler eliminate bounds checks on the read so it can be done in a single read. + b = b[i:] + b = b[:8] + return uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | + uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 +} + +func statelessEnc(dst *tokens, src []byte, startAt int16) { + const ( + inputMargin = 12 - 1 + minNonLiteralBlockSize = 1 + 1 + inputMargin + ) + + type tableEntry struct { + offset int16 + } + + var table [slTableSize]tableEntry + + // This check isn't in the Snappy implementation, but there, the caller + // instead of the callee handles this case. + if len(src)-int(startAt) < minNonLiteralBlockSize { + // We do not fill the token table. + // This will be picked up by caller. + dst.n = 0 + return + } + // Index until startAt + if startAt > 0 { + cv := load3232(src, 0) + for i := int16(0); i < startAt; i++ { + table[hashSL(cv)] = tableEntry{offset: i} + cv = (cv >> 8) | (uint32(src[i+4]) << 24) + } + } + + s := startAt + 1 + nextEmit := startAt + // sLimit is when to stop looking for offset/length copies. The inputMargin + // lets us use a fast path for emitLiteral in the main loop, while we are + // looking for copies. + sLimit := int16(len(src) - inputMargin) + + // nextEmit is where in src the next emitLiteral should start from. + cv := load3216(src, s) + + for { + const skipLog = 5 + const doEvery = 2 + + nextS := s + var candidate tableEntry + for { + nextHash := hashSL(cv) + candidate = table[nextHash] + nextS = s + doEvery + (s-nextEmit)>>skipLog + if nextS > sLimit || nextS <= 0 { + goto emitRemainder + } + + now := load6416(src, nextS) + table[nextHash] = tableEntry{offset: s} + nextHash = hashSL(uint32(now)) + + if cv == load3216(src, candidate.offset) { + table[nextHash] = tableEntry{offset: nextS} + break + } + + // Do one right away... + cv = uint32(now) + s = nextS + nextS++ + candidate = table[nextHash] + now >>= 8 + table[nextHash] = tableEntry{offset: s} + + if cv == load3216(src, candidate.offset) { + table[nextHash] = tableEntry{offset: nextS} + break + } + cv = uint32(now) + s = nextS + } + + // A 4-byte match has been found. We'll later see if more than 4 bytes + // match. But, prior to the match, src[nextEmit:s] are unmatched. Emit + // them as literal bytes. + for { + // Invariant: we have a 4-byte match at s, and no need to emit any + // literal bytes prior to s. + + // Extend the 4-byte match as long as possible. + t := candidate.offset + l := int16(matchLen(src[s+4:], src[t+4:]) + 4) + + // Extend backwards + for t > 0 && s > nextEmit && src[t-1] == src[s-1] { + s-- + t-- + l++ + } + if nextEmit < s { + emitLiteral(dst, src[nextEmit:s]) + } + + // Save the match found + dst.AddMatchLong(int32(l), uint32(s-t-baseMatchOffset)) + s += l + nextEmit = s + if nextS >= s { + s = nextS + 1 + } + if s >= sLimit { + goto emitRemainder + } + + // We could immediately start working at s now, but to improve + // compression we first update the hash table at s-2 and at s. If + // another emitCopy is not our next move, also calculate nextHash + // at s+1. At least on GOARCH=amd64, these three hash calculations + // are faster as one load64 call (with some shifts) instead of + // three load32 calls. + x := load6416(src, s-2) + o := s - 2 + prevHash := hashSL(uint32(x)) + table[prevHash] = tableEntry{offset: o} + x >>= 16 + currHash := hashSL(uint32(x)) + candidate = table[currHash] + table[currHash] = tableEntry{offset: o + 2} + + if uint32(x) != load3216(src, candidate.offset) { + cv = uint32(x >> 8) + s++ + break + } + } + } + +emitRemainder: + if int(nextEmit) < len(src) { + // If nothing was added, don't encode literals. + if dst.n == 0 { + return + } + emitLiteral(dst, src[nextEmit:]) + } +} diff --git a/vendor/github.com/klauspost/compress/flate/token.go b/vendor/github.com/klauspost/compress/flate/token.go new file mode 100644 index 0000000..eb862d7 --- /dev/null +++ b/vendor/github.com/klauspost/compress/flate/token.go @@ -0,0 +1,380 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package flate + +import ( + "bytes" + "encoding/binary" + "fmt" + "io" + "math" +) + +const ( + // From top + // 2 bits: type 0 = literal 1=EOF 2=Match 3=Unused + // 8 bits: xlength = length - MIN_MATCH_LENGTH + // 5 bits offsetcode + // 16 bits xoffset = offset - MIN_OFFSET_SIZE, or literal + lengthShift = 22 + offsetMask = 1<maxnumlit + offHist [32]uint16 // offset codes + litHist [256]uint16 // codes 0->255 + n uint16 // Must be able to contain maxStoreBlockSize + tokens [maxStoreBlockSize + 1]token +} + +func (t *tokens) Reset() { + if t.n == 0 { + return + } + t.n = 0 + t.nLits = 0 + for i := range t.litHist[:] { + t.litHist[i] = 0 + } + for i := range t.extraHist[:] { + t.extraHist[i] = 0 + } + for i := range t.offHist[:] { + t.offHist[i] = 0 + } +} + +func (t *tokens) Fill() { + if t.n == 0 { + return + } + for i, v := range t.litHist[:] { + if v == 0 { + t.litHist[i] = 1 + t.nLits++ + } + } + for i, v := range t.extraHist[:literalCount-256] { + if v == 0 { + t.nLits++ + t.extraHist[i] = 1 + } + } + for i, v := range t.offHist[:offsetCodeCount] { + if v == 0 { + t.offHist[i] = 1 + } + } +} + +func indexTokens(in []token) tokens { + var t tokens + t.indexTokens(in) + return t +} + +func (t *tokens) indexTokens(in []token) { + t.Reset() + for _, tok := range in { + if tok < matchType { + t.AddLiteral(tok.literal()) + continue + } + t.AddMatch(uint32(tok.length()), tok.offset()&matchOffsetOnlyMask) + } +} + +// emitLiteral writes a literal chunk and returns the number of bytes written. +func emitLiteral(dst *tokens, lit []byte) { + ol := int(dst.n) + for i, v := range lit { + dst.tokens[(i+ol)&maxStoreBlockSize] = token(v) + dst.litHist[v]++ + } + dst.n += uint16(len(lit)) + dst.nLits += len(lit) +} + +func (t *tokens) AddLiteral(lit byte) { + t.tokens[t.n] = token(lit) + t.litHist[lit]++ + t.n++ + t.nLits++ +} + +// from https://stackoverflow.com/a/28730362 +func mFastLog2(val float32) float32 { + ux := int32(math.Float32bits(val)) + log2 := (float32)(((ux >> 23) & 255) - 128) + ux &= -0x7f800001 + ux += 127 << 23 + uval := math.Float32frombits(uint32(ux)) + log2 += ((-0.34484843)*uval+2.02466578)*uval - 0.67487759 + return log2 +} + +// EstimatedBits will return an minimum size estimated by an *optimal* +// compression of the block. +// The size of the block +func (t *tokens) EstimatedBits() int { + shannon := float32(0) + bits := int(0) + nMatches := 0 + if t.nLits > 0 { + invTotal := 1.0 / float32(t.nLits) + for _, v := range t.litHist[:] { + if v > 0 { + n := float32(v) + shannon += atLeastOne(-mFastLog2(n*invTotal)) * n + } + } + // Just add 15 for EOB + shannon += 15 + for i, v := range t.extraHist[1 : literalCount-256] { + if v > 0 { + n := float32(v) + shannon += atLeastOne(-mFastLog2(n*invTotal)) * n + bits += int(lengthExtraBits[i&31]) * int(v) + nMatches += int(v) + } + } + } + if nMatches > 0 { + invTotal := 1.0 / float32(nMatches) + for i, v := range t.offHist[:offsetCodeCount] { + if v > 0 { + n := float32(v) + shannon += atLeastOne(-mFastLog2(n*invTotal)) * n + bits += int(offsetExtraBits[i&31]) * int(v) + } + } + } + return int(shannon) + bits +} + +// AddMatch adds a match to the tokens. +// This function is very sensitive to inlining and right on the border. +func (t *tokens) AddMatch(xlength uint32, xoffset uint32) { + if debugDeflate { + if xlength >= maxMatchLength+baseMatchLength { + panic(fmt.Errorf("invalid length: %v", xlength)) + } + if xoffset >= maxMatchOffset+baseMatchOffset { + panic(fmt.Errorf("invalid offset: %v", xoffset)) + } + } + oCode := offsetCode(xoffset) + xoffset |= oCode << 16 + t.nLits++ + + t.extraHist[lengthCodes1[uint8(xlength)]]++ + t.offHist[oCode]++ + t.tokens[t.n] = token(matchType | xlength<= maxMatchOffset+baseMatchOffset { + panic(fmt.Errorf("invalid offset: %v", xoffset)) + } + } + oc := offsetCode(xoffset) + xoffset |= oc << 16 + for xlength > 0 { + xl := xlength + if xl > 258 { + // We need to have at least baseMatchLength left over for next loop. + xl = 258 - baseMatchLength + } + xlength -= xl + xl -= baseMatchLength + t.nLits++ + t.extraHist[lengthCodes1[uint8(xl)]]++ + t.offHist[oc]++ + t.tokens[t.n] = token(matchType | uint32(xl)<> lengthShift) } + +// The code is never more than 8 bits, but is returned as uint32 for convenience. +func lengthCode(len uint8) uint32 { return uint32(lengthCodes[len]) } + +// Returns the offset code corresponding to a specific offset +func offsetCode(off uint32) uint32 { + if false { + if off < uint32(len(offsetCodes)) { + return offsetCodes[off&255] + } else if off>>7 < uint32(len(offsetCodes)) { + return offsetCodes[(off>>7)&255] + 14 + } else { + return offsetCodes[(off>>14)&255] + 28 + } + } + if off < uint32(len(offsetCodes)) { + return offsetCodes[uint8(off)] + } + return offsetCodes14[uint8(off>>7)] +} diff --git a/vendor/github.com/syossan27/tebata/.gitignore b/vendor/github.com/leaanthony/clir/.gitignore similarity index 65% rename from vendor/github.com/syossan27/tebata/.gitignore rename to vendor/github.com/leaanthony/clir/.gitignore index 4d3cf0d..c14df4a 100644 --- a/vendor/github.com/syossan27/tebata/.gitignore +++ b/vendor/github.com/leaanthony/clir/.gitignore @@ -1,5 +1,6 @@ # Binaries for programs and plugins *.exe +*.exe~ *.dll *.so *.dylib @@ -9,8 +10,4 @@ # Output of the go coverage tool, specifically when used with LiteIDE *.out - -# Project-local glide cache, RE: https://github.com/Masterminds/glide/issues/736 -.glide/ - -vendor/ +examples/otherargs/otherargs diff --git a/vendor/github.com/syossan27/tebata/LICENSE b/vendor/github.com/leaanthony/clir/LICENSE similarity index 97% rename from vendor/github.com/syossan27/tebata/LICENSE rename to vendor/github.com/leaanthony/clir/LICENSE index 6a3f6a3..558a6a2 100644 --- a/vendor/github.com/syossan27/tebata/LICENSE +++ b/vendor/github.com/leaanthony/clir/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2018 syossan27 +Copyright (c) 2019 Lea Anthony Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/vendor/github.com/leaanthony/clir/README.md b/vendor/github.com/leaanthony/clir/README.md new file mode 100644 index 0000000..fe3c6af --- /dev/null +++ b/vendor/github.com/leaanthony/clir/README.md @@ -0,0 +1,83 @@ +

+
+

+

+ A Simple and Clear CLI library. Dependency free.

+ + + Awesome + + CodeFactor + CodeFactor + + + + + +

+ +### Features + + * Nested Subcommands + * Uses the standard library `flag` package + * Auto-generated help + * Custom banners + * Hidden Subcommands + * Default Subcommand + * Dependency free + +### Example + +```go +package main + +import ( + "fmt" + "log" + + "github.com/leaanthony/clir" +) + +func main() { + + // Create new cli + cli := clir.NewCli("Flags", "A simple example", "v0.0.1") + + // Name + name := "Anonymous" + cli.StringFlag("name", "Your name", &name) + + // Define action for the command + cli.Action(func() error { + fmt.Printf("Hello %s!\n", name) + return nil + }) + + if err := cli.Run(); err != nil { + fmt.Printf("Error encountered : %v\n") + } + +} +``` + +#### Generated Help + +```shell +$ flags --help +Flags v0.0.1 - A simple example + +Flags: + + -help + Get help on the 'flags' command. + -name string + Your name +``` + +#### Documentation + +The main documentation may be found [here](https://clir.leaanthony.com). + +#### License Status + +[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fleaanthony%2Fclir.svg?type=large)](https://app.fossa.com/projects/git%2Bgithub.com%2Fleaanthony%2Fclir?ref=badge_large) diff --git a/vendor/github.com/leaanthony/clir/action.go b/vendor/github.com/leaanthony/clir/action.go new file mode 100644 index 0000000..ebb302c --- /dev/null +++ b/vendor/github.com/leaanthony/clir/action.go @@ -0,0 +1,5 @@ +package clir + +// Action represents a function that gets calls when the command is called by +// the user +type Action func() error diff --git a/vendor/github.com/leaanthony/clir/cli.go b/vendor/github.com/leaanthony/clir/cli.go new file mode 100644 index 0000000..e75bdc1 --- /dev/null +++ b/vendor/github.com/leaanthony/clir/cli.go @@ -0,0 +1,125 @@ +package clir + +import ( + "fmt" + "log" + "os" +) + +// Cli - The main application object +type Cli struct { + version string + rootCommand *Command + defaultCommand *Command + preRunCommand func(*Cli) error + bannerFunction func(*Cli) string +} + +// Version - Get the Application version string +func (c *Cli) Version() string { + return c.version +} + +// Name - Get the Application Name +func (c *Cli) Name() string { + return c.rootCommand.name +} + +// ShortDescription - Get the Application short description +func (c *Cli) ShortDescription() string { + return c.rootCommand.shortdescription +} + +// SetBannerFunction is used to set the function that is called +// to get the banner string. +func (c *Cli) SetBannerFunction(fn func(*Cli) string) { + c.bannerFunction = fn +} + +// Abort prints the given error and terminates the application +func (c *Cli) Abort(err error) { + log.Fatal(err) + os.Exit(1) +} + +// AddCommand - Adds a command to the application +func (c *Cli) AddCommand(command *Command) { + c.rootCommand.AddCommand(command) +} + +// PrintBanner prints the application banner! +func (c *Cli) PrintBanner() { + fmt.Println(c.bannerFunction(c)) + fmt.Println("") +} + +// PrintHelp - Prints the application's help +func (c *Cli) PrintHelp() { + c.rootCommand.PrintHelp() +} + +// Run - Runs the application with the given arguments +func (c *Cli) Run(args ...string) error { + if c.preRunCommand != nil { + err := c.preRunCommand(c) + if err != nil { + return err + } + } + if len(args) == 0 { + args = os.Args[1:] + } + return c.rootCommand.run(args) +} + +// DefaultCommand - Sets the given command as the command to run when +// no other commands given +func (c *Cli) DefaultCommand(defaultCommand *Command) *Cli { + c.defaultCommand = defaultCommand + return c +} + +// NewSubCommand - Creates a new SubCommand for the application +func (c *Cli) NewSubCommand(name, description string) *Command { + return c.rootCommand.NewSubCommand(name, description) +} + +// PreRun - Calls the given function before running the specific command +func (c *Cli) PreRun(callback func(*Cli) error) { + c.preRunCommand = callback +} + +// BoolFlag - Adds a boolean flag to the root command +func (c *Cli) BoolFlag(name, description string, variable *bool) *Cli { + c.rootCommand.BoolFlag(name, description, variable) + return c +} + +// StringFlag - Adds a string flag to the root command +func (c *Cli) StringFlag(name, description string, variable *string) *Cli { + c.rootCommand.StringFlag(name, description, variable) + return c +} + +// IntFlag - Adds an int flag to the root command +func (c *Cli) IntFlag(name, description string, variable *int) *Cli { + c.rootCommand.IntFlag(name, description, variable) + return c +} + +// Action - Define an action from this command +func (c *Cli) Action(callback Action) *Cli { + c.rootCommand.Action(callback) + return c +} + +// LongDescription - Sets the long description for the command +func (c *Cli) LongDescription(longdescription string) *Cli { + c.rootCommand.LongDescription(longdescription) + return c +} + +// OtherArgs - Returns the non-flag arguments passed to the cli. NOTE: This should only be called within the context of an action. +func (c *Cli) OtherArgs() []string { + return c.rootCommand.flags.Args() +} diff --git a/vendor/github.com/leaanthony/clir/clir.go b/vendor/github.com/leaanthony/clir/clir.go new file mode 100644 index 0000000..eaced18 --- /dev/null +++ b/vendor/github.com/leaanthony/clir/clir.go @@ -0,0 +1,28 @@ +// Package clir provides a simple API for creating command line apps +package clir + +import ( + "fmt" +) + +// defaultBannerFunction prints a banner for the application. +// If version is a blank string, it is ignored. +func defaultBannerFunction(c *Cli) string { + version := "" + if len(c.Version()) > 0 { + version = " " + c.Version() + } + return fmt.Sprintf("%s%s - %s", c.Name(), version, c.ShortDescription()) +} + +// NewCli - Creates a new Cli application object +func NewCli(name, description, version string) *Cli { + result := &Cli{ + version: version, + bannerFunction: defaultBannerFunction, + } + result.rootCommand = NewCommand(name, description) + result.rootCommand.setApp(result) + result.rootCommand.setParentCommandPath("") + return result +} diff --git a/vendor/github.com/leaanthony/clir/clir_logo.png b/vendor/github.com/leaanthony/clir/clir_logo.png new file mode 100644 index 0000000..3244238 Binary files /dev/null and b/vendor/github.com/leaanthony/clir/clir_logo.png differ diff --git a/vendor/github.com/leaanthony/clir/command.go b/vendor/github.com/leaanthony/clir/command.go new file mode 100644 index 0000000..2fb13ab --- /dev/null +++ b/vendor/github.com/leaanthony/clir/command.go @@ -0,0 +1,230 @@ +package clir + +import ( + "flag" + "fmt" + "os" + "strings" +) + +// Command represents a command that may be run by the user +type Command struct { + name string + commandPath string + shortdescription string + longdescription string + subCommands []*Command + subCommandsMap map[string]*Command + longestSubcommand int + actionCallback Action + app *Cli + flags *flag.FlagSet + flagCount int + helpFlag bool + hidden bool +} + +// NewCommand creates a new Command +// func NewCommand(name string, description string, app *Cli, parentCommandPath string) *Command { +func NewCommand(name string, description string) *Command { + result := &Command{ + name: name, + shortdescription: description, + subCommandsMap: make(map[string]*Command), + hidden: false, + } + + return result +} + +func (c *Command) setParentCommandPath(parentCommandPath string) { + // Set up command path + if parentCommandPath != "" { + c.commandPath += parentCommandPath + " " + } + c.commandPath += c.name + + // Set up flag set + c.flags = flag.NewFlagSet(c.commandPath, flag.ContinueOnError) + c.BoolFlag("help", "Get help on the '"+strings.ToLower(c.commandPath)+"' command.", &c.helpFlag) + + // result.Flags.Usage = result.PrintHelp + +} + +func (c *Command) setApp(app *Cli) { + c.app = app +} + +// parseFlags parses the given flags +func (c *Command) parseFlags(args []string) error { + // Parse flags + tmp := os.Stderr + os.Stderr = nil + err := c.flags.Parse(args) + os.Stderr = tmp + return err +} + +// Run - Runs the Command with the given arguments +func (c *Command) run(args []string) error { + + // If we have arguments, process them + if len(args) > 0 { + // Check for subcommand + subcommand := c.subCommandsMap[args[0]] + if subcommand != nil { + return subcommand.run(args[1:]) + } + + // Parse flags + err := c.parseFlags(args) + if err != nil { + fmt.Printf("Error: %s\n\n", err.Error()) + c.PrintHelp() + return err + } + + // Help takes precedence + if c.helpFlag { + c.PrintHelp() + return nil + } + } + + // Do we have an action? + if c.actionCallback != nil { + return c.actionCallback() + } + + // If we haven't specified a subcommand + // check for an app level default command + if c.app.defaultCommand != nil { + // Prevent recursion! + if c.app.defaultCommand != c { + // only run default command if no args passed + if len(args) == 0 { + return c.app.defaultCommand.run(args) + } + } + } + + // Nothing left we can do + c.PrintHelp() + + return nil +} + +// Action - Define an action from this command +func (c *Command) Action(callback Action) *Command { + c.actionCallback = callback + return c +} + +// PrintHelp - Output the help text for this command +func (c *Command) PrintHelp() { + c.app.PrintBanner() + + commandTitle := c.commandPath + if c.shortdescription != "" { + commandTitle += " - " + c.shortdescription + } + // Ignore root command + if c.commandPath != c.name { + fmt.Println(commandTitle) + } + if c.longdescription != "" { + fmt.Println(c.longdescription + "\n") + } + if len(c.subCommands) > 0 { + fmt.Println("Available commands:") + fmt.Println("") + for _, subcommand := range c.subCommands { + if subcommand.isHidden() { + continue + } + spacer := strings.Repeat(" ", 3+c.longestSubcommand-len(subcommand.name)) + isDefault := "" + if subcommand.isDefaultCommand() { + isDefault = "[default]" + } + fmt.Printf(" %s%s%s %s\n", subcommand.name, spacer, subcommand.shortdescription, isDefault) + } + fmt.Println("") + } + if c.flagCount > 0 { + fmt.Println("Flags:") + fmt.Println() + c.flags.SetOutput(os.Stdout) + c.flags.PrintDefaults() + c.flags.SetOutput(os.Stderr) + + } + fmt.Println() +} + +// isDefaultCommand returns true if called on the default command +func (c *Command) isDefaultCommand() bool { + return c.app.defaultCommand == c +} + +// isHidden returns true if the command is a hidden command +func (c *Command) isHidden() bool { + return c.hidden +} + +// Hidden hides the command from the Help system +func (c *Command) Hidden() { + c.hidden = true +} + +// NewSubCommand - Creates a new subcommand +func (c *Command) NewSubCommand(name, description string) *Command { + result := NewCommand(name, description) + c.AddCommand(result) + return result +} + +// AddCommand - Adds a subcommand +func (c *Command) AddCommand(command *Command) { + command.setApp(c.app) + command.setParentCommandPath(c.commandPath) + name := command.name + c.subCommands = append(c.subCommands, command) + c.subCommandsMap[name] = command + if len(name) > c.longestSubcommand { + c.longestSubcommand = len(name) + } +} + +// BoolFlag - Adds a boolean flag to the command +func (c *Command) BoolFlag(name, description string, variable *bool) *Command { + c.flags.BoolVar(variable, name, *variable, description) + c.flagCount++ + return c +} + +// StringFlag - Adds a string flag to the command +func (c *Command) StringFlag(name, description string, variable *string) *Command { + c.flags.StringVar(variable, name, *variable, description) + c.flagCount++ + return c +} + +// IntFlag - Adds an int flag to the command +func (c *Command) IntFlag(name, description string, variable *int) *Command { + c.flags.IntVar(variable, name, *variable, description) + c.flagCount++ + return c +} + +// LongDescription - Sets the long description for the command +func (c *Command) LongDescription(longdescription string) *Command { + c.longdescription = longdescription + return c +} + +// OtherArgs - Returns the non-flag arguments passed to the subcommand. NOTE: This should only be called within the context of an action. +func (c *Command) OtherArgs() []string { + return c.flags.Args() +} diff --git a/vendor/github.com/leaanthony/clir/go.mod b/vendor/github.com/leaanthony/clir/go.mod new file mode 100644 index 0000000..2d37390 --- /dev/null +++ b/vendor/github.com/leaanthony/clir/go.mod @@ -0,0 +1,3 @@ +module github.com/leaanthony/clir + +go 1.12 diff --git a/vendor/github.com/leaanthony/clir/go.sum b/vendor/github.com/leaanthony/clir/go.sum new file mode 100644 index 0000000..e69de29 diff --git a/vendor/github.com/leaanthony/go-ansi-parser/LICENSE b/vendor/github.com/leaanthony/go-ansi-parser/LICENSE new file mode 100644 index 0000000..f2f37a2 --- /dev/null +++ b/vendor/github.com/leaanthony/go-ansi-parser/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021-Present Lea Anthony + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/leaanthony/go-ansi-parser/README.md b/vendor/github.com/leaanthony/go-ansi-parser/README.md new file mode 100644 index 0000000..5d1a4ca --- /dev/null +++ b/vendor/github.com/leaanthony/go-ansi-parser/README.md @@ -0,0 +1,86 @@ + +

+
+

+

+ A library for parsing ANSI encoded strings

+ + + + CodeFactor + +

+ +Go ANSI Parser converts strings with [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code) +into a slice of structs that represent styled text. Features: + + * Can parse ANSI 16, 256 and TrueColor + * Supports all styles: Regular, Bold, Faint, Italic, Blinking, Inversed, Invisible, Underlined, Strikethrough + * Provides RGB, Hex, HSL, ANSI ID and Name for parsed colours + * Truncation - works with emojis and grapheme clusters + * Length - works with emojis and grapheme clusters + * Cleanse - removes the ansi escape codes + * Configurable colour map for customisation + * 100% Test Coverage + +# Installation +```shell +go get github.com/leaanthony/go-ansi-parser +``` + +## Usage + +### Parse +```go +text, err := ansi.Parse("\u001b[1;31;40mHello World\033[0m") + +// is the equivalent of... + +text := []*ansi.StyledText{ + { + Label: "Hello World", + FgCol: &ansi.Col{ + Id: 9, + Hex: "#ff0000", + Rgb: &ansi.Rgb{ R: 255, G: 0, B: 0 }, + Hsl: &ansi.Hsl{ H: 0, S: 100, L: 50 }, + Name: "Red", + }, + BgCol: &ansi.Col{ + Id: 0, + Hex: "#000000", + Rgb: &ansi.Rgb{0, 0, 0}, + Hsl: &ansi.Hsl{0, 0, 0}, + Name: "Black", + }, + Style: 1, + }, +} +``` +### Truncating +```go +shorter, err := ansi.Truncate("\u001b[1;31;40mHello\033[0m \u001b[0;30mWorld!\033[0m", 8) + +// is the equivalent of... + +shorter := "\u001b[1;31;40mHello\033[0m \u001b[0;30mWo\033[0m" +``` +### Cleanse +```go +cleaner, err := ansi.Cleanse("\u001b[1;31;40mHello\033[0m \u001b[0;30mWorld!\033[0m") + +// is the equivalent of... + +cleaner := "Hello World!" +``` +### Length +```go +length, err := ansi.Length("\u001b[1;31;40mHello\033[0m \u001b[0;30mWorld!\033[0m") + +// is the equivalent of... + +length := 12 + +// Works with grapheme clusters and emoji +length, err := ansi.Length("\u001b[1;31;40m👩🏽‍🔧😎\033[0m") // 2 +``` diff --git a/vendor/github.com/leaanthony/go-ansi-parser/ansi.go b/vendor/github.com/leaanthony/go-ansi-parser/ansi.go new file mode 100644 index 0000000..b75b6e3 --- /dev/null +++ b/vendor/github.com/leaanthony/go-ansi-parser/ansi.go @@ -0,0 +1,424 @@ +package ansi + +import ( + "fmt" + "github.com/rivo/uniseg" + "strconv" + "strings" +) + +// TextStyle is a type representing the +// ansi text styles +type TextStyle int + +const ( + // Bold Style + Bold TextStyle = 1 << 0 + // Faint Style + Faint TextStyle = 1 << 1 + // Italic Style + Italic TextStyle = 1 << 2 + // Blinking Style + Blinking TextStyle = 1 << 3 + // Inversed Style + Inversed TextStyle = 1 << 4 + // Invisible Style + Invisible TextStyle = 1 << 5 + // Underlined Style + Underlined TextStyle = 1 << 6 + // Strikethrough Style + Strikethrough TextStyle = 1 << 7 +) + +// StyledText represents a single formatted string +type StyledText struct { + Label string + FgCol *Col + BgCol *Col + Style TextStyle +} + +func (s *StyledText) styleToParams() []string { + var params []string + if s.Bold() { + params = append(params, "1") + } + if s.Faint() { + params = append(params, "2") + } + if s.Italic() { + params = append(params, "3") + } + if s.Underlined() { + params = append(params, "4") + } + if s.Blinking() { + params = append(params, "5") + } + if s.Inversed() { + params = append(params, "7") + } + if s.Invisible() { + params = append(params, "8") + } + if s.Strikethrough() { + params = append(params, "9") + } + if s.FgCol != nil { + // Do we have an ID? + switch true { + case s.FgCol.Id < 16: + offset := 30 + id := s.FgCol.Id + // Adjust when bold has been applied to the id + if s.Bold() && id > 7 && id < 16 { + id -= 8 + } + params = append(params, fmt.Sprintf("%d", id+offset)) + case s.FgCol.Id < 256: + params = append(params, []string{"38", "5", fmt.Sprintf("%d", s.FgCol.Id)}...) + case s.FgCol.Id == 256: + r := fmt.Sprintf("%d", s.FgCol.Rgb.R) + g := fmt.Sprintf("%d", s.FgCol.Rgb.G) + b := fmt.Sprintf("%d", s.FgCol.Rgb.B) + params = append(params, []string{"38", "2", r, g, b}...) + } + } + if s.BgCol != nil { + // Do we have an ID? + switch true { + case s.BgCol.Id < 16: + params = append(params, fmt.Sprintf("%d", s.BgCol.Id+40)) + case s.BgCol.Id < 256: + params = append(params, []string{"48", "5", fmt.Sprintf("%d", s.BgCol.Id)}...) + case s.BgCol.Id == 256: + r := fmt.Sprintf("%d", s.BgCol.Rgb.R) + g := fmt.Sprintf("%d", s.BgCol.Rgb.G) + b := fmt.Sprintf("%d", s.BgCol.Rgb.B) + params = append(params, []string{"48", "2", r, g, b}...) + } + } + return params +} + +func (s *StyledText) String() string { + params := strings.Join(s.styleToParams(), ";") + return "\033[0;" + params + "m" + s.Label + "\033[0m" +} + +// Bold will return true if the text has a Bold style +func (s *StyledText) Bold() bool { + return s.Style&Bold == Bold +} + +// Faint will return true if the text has a Faint style +func (s *StyledText) Faint() bool { + return s.Style&Faint == Faint +} + +// Italic will return true if the text has an Italic style +func (s *StyledText) Italic() bool { + return s.Style&Italic == Italic +} + +// Blinking will return true if the text has a Blinking style +func (s *StyledText) Blinking() bool { + return s.Style&Blinking == Blinking +} + +// Inversed will return true if the text has an Inversed style +func (s *StyledText) Inversed() bool { + return s.Style&Inversed == Inversed +} + +// Invisible will return true if the text has an Invisible style +func (s *StyledText) Invisible() bool { + return s.Style&Invisible == Invisible +} + +// Underlined will return true if the text has an Underlined style +func (s *StyledText) Underlined() bool { + return s.Style&Underlined == Underlined +} + +// Strikethrough will return true if the text has a Strikethrough style +func (s *StyledText) Strikethrough() bool { + return s.Style&Strikethrough == Strikethrough +} + +// ColourMap maps ansi identifiers to a colour +var ColourMap = map[string]map[string]*Col{ + "Regular": { + "30": Cols[0], + "31": Cols[1], + "32": Cols[2], + "33": Cols[3], + "34": Cols[4], + "35": Cols[5], + "36": Cols[6], + "37": Cols[7], + }, + "Bold": { + "30": Cols[8], + "31": Cols[9], + "32": Cols[10], + "33": Cols[11], + "34": Cols[12], + "35": Cols[13], + "36": Cols[14], + "37": Cols[15], + }, + "Faint": { + "30": Cols[0], + "31": Cols[1], + "32": Cols[2], + "33": Cols[3], + "34": Cols[4], + "35": Cols[5], + "36": Cols[6], + "37": Cols[7], + }, +} + +// Parse will convert an ansi encoded string and return +// a slice of StyledText structs that represent the text. +// If parsing is unsuccessful, an error is returned. +func Parse(input string) ([]*StyledText, error) { + var result []*StyledText + invalid := fmt.Errorf("invalid ansi string") + missingTerminator := fmt.Errorf("missing escape terminator 'm'") + invalidTrueColorSequence := fmt.Errorf("invalid TrueColor sequence") + invalid256ColSequence := fmt.Errorf("invalid 256 colour sequence") + index := 0 + var currentStyledText *StyledText = &StyledText{} + + if len(input) == 0 { + return nil, invalid + } + + for { + // Read all chars to next escape code + esc := strings.Index(input, "\033[") + + // If no more esc chars, save what's left and return + if esc == -1 { + text := input[index:] + if len(text) > 0 { + currentStyledText.Label = text + result = append(result, currentStyledText) + } + return result, nil + } + label := input[:esc] + if len(label) > 0 { + currentStyledText.Label = label + result = append(result, currentStyledText) + currentStyledText = &StyledText{ + Label: "", + FgCol: currentStyledText.FgCol, + BgCol: currentStyledText.BgCol, + Style: currentStyledText.Style, + } + } + input = input[esc:] + // skip + input = input[2:] + + // Read in params + endesc := strings.Index(input, "m") + if endesc == -1 { + return nil, missingTerminator + } + paramText := input[:endesc] + input = input[endesc+1:] + params := strings.Split(paramText, ";") + colourMap := ColourMap["Regular"] + skip := 0 + for index, param := range params { + if skip > 0 { + skip-- + continue + } + switch param { + case "0": + colourMap = ColourMap["Regular"] + currentStyledText.Style = 0 + currentStyledText.FgCol = nil + currentStyledText.BgCol = nil + case "1": + // Bold + colourMap = ColourMap["Bold"] + currentStyledText.Style |= Bold + case "2": + // Dim/Feint + colourMap = ColourMap["Faint"] + currentStyledText.Style |= Faint + case "3": + // Italic + currentStyledText.Style |= Italic + case "4": + // Underlined + currentStyledText.Style |= Underlined + case "5": + // Blinking + currentStyledText.Style |= Blinking + case "7": + // Inversed + currentStyledText.Style |= Inversed + case "8": + // Invisible + currentStyledText.Style |= Invisible + case "9": + // Strikethrough + currentStyledText.Style |= Strikethrough + case "30", "31", "32", "33", "34", "35", "36", "37": + currentStyledText.FgCol = colourMap[param] + case "40", "41", "42", "43", "44", "45", "46", "47": + bgcol := "3" + param[1:] // Equivalent of -10 + currentStyledText.BgCol = colourMap[bgcol] + case "38", "48": + if len(params)-index < 3 { + return nil, invalid + } + // 256 colours + if params[index+1] == "5" { + skip = 2 + colIndexText := params[index+2] + colIndex, err := strconv.Atoi(colIndexText) + if err != nil { + return nil, invalid256ColSequence + } + if colIndex < 0 || colIndex > 255 { + return nil, invalid256ColSequence + } + if param == "38" { + currentStyledText.FgCol = Cols[colIndex] + continue + } + currentStyledText.BgCol = Cols[colIndex] + continue + } + // we must have 4 params left + if len(params)-index < 5 { + return nil, invalidTrueColorSequence + } + if params[index+1] != "2" { + return nil, invalidTrueColorSequence + } + var r, g, b uint8 + ri, err := strconv.Atoi(params[index+2]) + if err != nil { + return nil, invalidTrueColorSequence + } + gi, err := strconv.Atoi(params[index+3]) + if err != nil { + return nil, invalidTrueColorSequence + } + bi, err := strconv.Atoi(params[index+4]) + if err != nil { + return nil, invalidTrueColorSequence + } + if bi > 255 || gi > 255 || ri > 255 { + return nil, invalidTrueColorSequence + } + if bi < 0 || gi < 0 || ri < 0 { + return nil, invalidTrueColorSequence + } + r = uint8(ri) + g = uint8(gi) + b = uint8(bi) + skip = 4 + colvalue := fmt.Sprintf("#%02x%02x%02x", r, g, b) + if param == "38" { + currentStyledText.FgCol = &Col{Id: 256, Hex: colvalue, Rgb: Rgb{r, g, b}} + continue + } + currentStyledText.BgCol = &Col{Id: 256, Hex: colvalue, Rgb: Rgb{r, g, b}} + default: + return nil, invalid + } + } + } +} + +func HasEscapeCodes(input string) bool { + return strings.IndexAny(input, "\033[") != -1 +} + +func String(input []*StyledText) string { + var result strings.Builder + for _, text := range input { + params := text.styleToParams() + if len(params) == 0 { + result.WriteString(text.Label) + continue + } + result.WriteString(text.String()) + + //result.WriteString("\033[0;") + //result.WriteString(strings.Join(params, ";")) + //result.WriteString("m") + //result.WriteString(text.Label) + //result.WriteString("\033[0m") + } + return result.String() +} + +func Truncate(input string, maxChars int) (string, error) { + parsed, err := Parse(input) + if err != nil { + return "", err + } + charsLeft := maxChars + var result []*StyledText + for _, element := range parsed { + userPerceivedChars := uniseg.GraphemeClusterCount(element.Label) + if userPerceivedChars >= charsLeft { + var newLabel []rune + graphemes := uniseg.NewGraphemes(element.Label) + for graphemes.Next() { + newLabel = append(newLabel, graphemes.Runes()...) + charsLeft-- + if charsLeft == 0 { + element.Label = string(newLabel) + result = append(result, element) + return String(result), nil + } + } + } + result = append(result, element) + charsLeft -= userPerceivedChars + } + return String(result), nil +} + +func Cleanse(input string) (string, error) { + if input == "" { + return "", nil + } + parsed, err := Parse(input) + if err != nil { + return "", err + } + var result strings.Builder + for _, element := range parsed { + result.WriteString(element.Label) + } + return result.String(), nil +} + +func Length(input string) (int, error) { + if input == "" { + return 0, nil + } + parsed, err := Parse(input) + if err != nil { + return -1, err + } + var result int + for _, element := range parsed { + userPerceivedChars := uniseg.GraphemeClusterCount(element.Label) + result += userPerceivedChars + } + return result, nil +} diff --git a/vendor/github.com/leaanthony/go-ansi-parser/cols.go b/vendor/github.com/leaanthony/go-ansi-parser/cols.go new file mode 100644 index 0000000..2637db5 --- /dev/null +++ b/vendor/github.com/leaanthony/go-ansi-parser/cols.go @@ -0,0 +1,1823 @@ +package ansi + +// Rgb represents an RGB colour value +// with 8bits per channel +type Rgb struct { + R uint8 `json:"r"` + G uint8 `json:"g"` + B uint8 `json:"b"` +} + +// Hsl represents the HSL value of the colour +type Hsl struct { + H float64 `json:"h"` + S float64 `json:"s"` + L float64 `json:"l"` +} + +// Col represents a colour value. +// The Id is the ANSI colour ID. +type Col struct { + Id int `json:"id"` + Hex string `json:"hex"` + Rgb Rgb `json:"rgb"` + Hsl Hsl `json:"hsl"` + Name string `json:"name"` +} + +// Cols represents the default colour definitions +// used by the library. This may be overridden. +var Cols = []*Col{ + { + Id: 0, + Hex: "#000000", + Rgb: Rgb{0, 0, 0}, + Hsl: Hsl{0, 0, 0}, + Name: "Black", + }, + { + Id: 1, + Hex: "#800000", + Rgb: Rgb{128, 0, 0}, + Hsl: Hsl{0, 100, 25}, + Name: "Maroon", + }, + { + Id: 2, + Hex: "#008000", + Rgb: Rgb{0, 128, 0}, + Hsl: Hsl{120, 100, 25}, + Name: "Green", + }, + { + Id: 3, + Hex: "#808000", + Rgb: Rgb{128, 128, 0}, + Hsl: Hsl{60, 100, 25}, + Name: "Olive", + }, + { + Id: 4, + Hex: "#000080", + Rgb: Rgb{0, 0, 128}, + Hsl: Hsl{240, 100, 25}, + Name: "Navy", + }, + { + Id: 5, + Hex: "#800080", + Rgb: Rgb{128, 0, 128}, + Hsl: Hsl{300, 100, 25}, + Name: "Purple", + }, + { + Id: 6, + Hex: "#008080", + Rgb: Rgb{0, 128, 128}, + Hsl: Hsl{180, 100, 25}, + Name: "Teal", + }, + { + Id: 7, + Hex: "#c0c0c0", + Rgb: Rgb{192, 192, 192}, + Hsl: Hsl{0, 0, 75}, + Name: "Silver", + }, + { + Id: 8, + Hex: "#808080", + Rgb: Rgb{128, 128, 128}, + Hsl: Hsl{0, 0, 50}, + Name: "Grey", + }, + { + Id: 9, + Hex: "#ff0000", + Rgb: Rgb{255, 0, 0}, + Hsl: Hsl{0, 100, 50}, + Name: "Red", + }, + { + Id: 10, + Hex: "#00ff00", + Rgb: Rgb{0, 255, 0}, + Hsl: Hsl{120, 100, 50}, + Name: "Lime", + }, + { + Id: 11, + Hex: "#ffff00", + Rgb: Rgb{255, 255, 0}, + Hsl: Hsl{60, 100, 50}, + Name: "Yellow", + }, + { + Id: 12, + Hex: "#0000ff", + Rgb: Rgb{0, 0, 255}, + Hsl: Hsl{240, 100, 50}, + Name: "Blue", + }, + { + Id: 13, + Hex: "#ff00ff", + Rgb: Rgb{255, 0, 255}, + Hsl: Hsl{300, 100, 50}, + Name: "Fuchsia", + }, + { + Id: 14, + Hex: "#00ffff", + Rgb: Rgb{0, 255, 255}, + Hsl: Hsl{180, 100, 50}, + Name: "Aqua", + }, + { + Id: 15, + Hex: "#ffffff", + Rgb: Rgb{255, 255, 255}, + Hsl: Hsl{0, 0, 100}, + Name: "White", + }, + { + Id: 16, + Hex: "#000000", + Rgb: Rgb{0, 0, 0}, + Hsl: Hsl{0, 0, 0}, + Name: "Grey0", + }, + { + Id: 17, + Hex: "#00005f", + Rgb: Rgb{0, 0, 95}, + Hsl: Hsl{240, 100, 18}, + Name: "NavyBlue", + }, + { + Id: 18, + Hex: "#000087", + Rgb: Rgb{0, 0, 135}, + Hsl: Hsl{240, 100, 26}, + Name: "DarkBlue", + }, + { + Id: 19, + Hex: "#0000af", + Rgb: Rgb{0, 0, 175}, + Hsl: Hsl{240, 100, 34}, + Name: "Blue3", + }, + { + Id: 20, + Hex: "#0000d7", + Rgb: Rgb{0, 0, 215}, + Hsl: Hsl{240, 100, 42}, + Name: "Blue3", + }, + { + Id: 21, + Hex: "#0000ff", + Rgb: Rgb{0, 0, 255}, + Hsl: Hsl{240, 100, 50}, + Name: "Blue1", + }, + { + Id: 22, + Hex: "#005f00", + Rgb: Rgb{0, 95, 0}, + Hsl: Hsl{120, 100, 18}, + Name: "DarkGreen", + }, + { + Id: 23, + Hex: "#005f5f", + Rgb: Rgb{0, 95, 95}, + Hsl: Hsl{180, 100, 18}, + Name: "DeepSkyBlue4", + }, + { + Id: 24, + Hex: "#005f87", + Rgb: Rgb{0, 95, 135}, + Hsl: Hsl{197.777777777778, 100, 26}, + Name: "DeepSkyBlue4", + }, + { + Id: 25, + Hex: "#005faf", + Rgb: Rgb{0, 95, 175}, + Hsl: Hsl{207.428571428571, 100, 34}, + Name: "DeepSkyBlue4", + }, + { + Id: 26, + Hex: "#005fd7", + Rgb: Rgb{0, 95, 215}, + Hsl: Hsl{213.488372093023, 100, 42}, + Name: "DodgerBlue3", + }, + { + Id: 27, + Hex: "#005fff", + Rgb: Rgb{0, 95, 255}, + Hsl: Hsl{217.647058823529, 100, 50}, + Name: "DodgerBlue2", + }, + { + Id: 28, + Hex: "#008700", + Rgb: Rgb{0, 135, 0}, + Hsl: Hsl{120, 100, 26}, + Name: "Green4", + }, + { + Id: 29, + Hex: "#00875f", + Rgb: Rgb{0, 135, 95}, + Hsl: Hsl{162.222222222222, 100, 26}, + Name: "SpringGreen4", + }, + { + Id: 30, + Hex: "#008787", + Rgb: Rgb{0, 135, 135}, + Hsl: Hsl{180, 100, 26}, + Name: "Turquoise4", + }, + { + Id: 31, + Hex: "#0087af", + Rgb: Rgb{0, 135, 175}, + Hsl: Hsl{193.714285714286, 100, 34}, + Name: "DeepSkyBlue3", + }, + { + Id: 32, + Hex: "#0087d7", + Rgb: Rgb{0, 135, 215}, + Hsl: Hsl{202.325581395349, 100, 42}, + Name: "DeepSkyBlue3", + }, + { + Id: 33, + Hex: "#0087ff", + Rgb: Rgb{0, 135, 255}, + Hsl: Hsl{208.235294117647, 100, 50}, + Name: "DodgerBlue1", + }, + { + Id: 34, + Hex: "#00af00", + Rgb: Rgb{0, 175, 0}, + Hsl: Hsl{120, 100, 34}, + Name: "Green3", + }, + { + Id: 35, + Hex: "#00af5f", + Rgb: Rgb{0, 175, 95}, + Hsl: Hsl{152.571428571429, 100, 34}, + Name: "SpringGreen3", + }, + { + Id: 36, + Hex: "#00af87", + Rgb: Rgb{0, 175, 135}, + Hsl: Hsl{166.285714285714, 100, 34}, + Name: "DarkCyan", + }, + { + Id: 37, + Hex: "#00afaf", + Rgb: Rgb{0, 175, 175}, + Hsl: Hsl{180, 100, 34}, + Name: "LightSeaGreen", + }, + { + Id: 38, + Hex: "#00afd7", + Rgb: Rgb{0, 175, 215}, + Hsl: Hsl{191.162790697674, 100, 42}, + Name: "DeepSkyBlue2", + }, + { + Id: 39, + Hex: "#00afff", + Rgb: Rgb{0, 175, 255}, + Hsl: Hsl{198.823529411765, 100, 50}, + Name: "DeepSkyBlue1", + }, + { + Id: 40, + Hex: "#00d700", + Rgb: Rgb{0, 215, 0}, + Hsl: Hsl{120, 100, 42}, + Name: "Green3", + }, + { + Id: 41, + Hex: "#00d75f", + Rgb: Rgb{0, 215, 95}, + Hsl: Hsl{146.511627906977, 100, 42}, + Name: "SpringGreen3", + }, + { + Id: 42, + Hex: "#00d787", + Rgb: Rgb{0, 215, 135}, + Hsl: Hsl{157.674418604651, 100, 42}, + Name: "SpringGreen2", + }, + { + Id: 43, + Hex: "#00d7af", + Rgb: Rgb{0, 215, 175}, + Hsl: Hsl{168.837209302326, 100, 42}, + Name: "Cyan3", + }, + { + Id: 44, + Hex: "#00d7d7", + Rgb: Rgb{0, 215, 215}, + Hsl: Hsl{180, 100, 42}, + Name: "DarkTurquoise", + }, + { + Id: 45, + Hex: "#00d7ff", + Rgb: Rgb{0, 215, 255}, + Hsl: Hsl{189.411764705882, 100, 50}, + Name: "Turquoise2", + }, + { + Id: 46, + Hex: "#00ff00", + Rgb: Rgb{0, 255, 0}, + Hsl: Hsl{120, 100, 50}, + Name: "Green1", + }, + { + Id: 47, + Hex: "#00ff5f", + Rgb: Rgb{0, 255, 95}, + Hsl: Hsl{142.352941176471, 100, 50}, + Name: "SpringGreen2", + }, + { + Id: 48, + Hex: "#00ff87", + Rgb: Rgb{0, 255, 135}, + Hsl: Hsl{151.764705882353, 100, 50}, + Name: "SpringGreen1", + }, + { + Id: 49, + Hex: "#00ffaf", + Rgb: Rgb{0, 255, 175}, + Hsl: Hsl{161.176470588235, 100, 50}, + Name: "MediumSpringGreen", + }, + { + Id: 50, + Hex: "#00ffd7", + Rgb: Rgb{0, 255, 215}, + Hsl: Hsl{170.588235294118, 100, 50}, + Name: "Cyan2", + }, + { + Id: 51, + Hex: "#00ffff", + Rgb: Rgb{0, 255, 255}, + Hsl: Hsl{180, 100, 50}, + Name: "Cyan1", + }, + { + Id: 52, + Hex: "#5f0000", + Rgb: Rgb{95, 0, 0}, + Hsl: Hsl{0, 100, 18}, + Name: "DarkRed", + }, + { + Id: 53, + Hex: "#5f005f", + Rgb: Rgb{95, 0, 95}, + Hsl: Hsl{300, 100, 18}, + Name: "DeepPink4", + }, + { + Id: 54, + Hex: "#5f0087", + Rgb: Rgb{95, 0, 135}, + Hsl: Hsl{282.222222222222, 100, 26}, + Name: "Purple4", + }, + { + Id: 55, + Hex: "#5f00af", + Rgb: Rgb{95, 0, 175}, + Hsl: Hsl{272.571428571429, 100, 34}, + Name: "Purple4", + }, + { + Id: 56, + Hex: "#5f00d7", + Rgb: Rgb{95, 0, 215}, + Hsl: Hsl{266.511627906977, 100, 42}, + Name: "Purple3", + }, + { + Id: 57, + Hex: "#5f00ff", + Rgb: Rgb{95, 0, 255}, + Hsl: Hsl{262.352941176471, 100, 50}, + Name: "BlueViolet", + }, + { + Id: 58, + Hex: "#5f5f00", + Rgb: Rgb{95, 95, 0}, + Hsl: Hsl{60, 100, 18}, + Name: "Orange4", + }, + { + Id: 59, + Hex: "#5f5f5f", + Rgb: Rgb{95, 95, 95}, + Hsl: Hsl{0, 0, 37}, + Name: "Grey37", + }, + { + Id: 60, + Hex: "#5f5f87", + Rgb: Rgb{95, 95, 135}, + Hsl: Hsl{240, 17, 45}, + Name: "MediumPurple4", + }, + { + Id: 61, + Hex: "#5f5faf", + Rgb: Rgb{95, 95, 175}, + Hsl: Hsl{240, 33, 52}, + Name: "SlateBlue3", + }, + { + Id: 62, + Hex: "#5f5fd7", + Rgb: Rgb{95, 95, 215}, + Hsl: Hsl{240, 60, 60}, + Name: "SlateBlue3", + }, + { + Id: 63, + Hex: "#5f5fff", + Rgb: Rgb{95, 95, 255}, + Hsl: Hsl{240, 100, 68}, + Name: "RoyalBlue1", + }, + { + Id: 64, + Hex: "#5f8700", + Rgb: Rgb{95, 135, 0}, + Hsl: Hsl{77.7777777777778, 100, 26}, + Name: "Chartreuse4", + }, + { + Id: 65, + Hex: "#5f875f", + Rgb: Rgb{95, 135, 95}, + Hsl: Hsl{120, 17, 45}, + Name: "DarkSeaGreen4", + }, + { + Id: 66, + Hex: "#5f8787", + Rgb: Rgb{95, 135, 135}, + Hsl: Hsl{180, 17, 45}, + Name: "PaleTurquoise4", + }, + { + Id: 67, + Hex: "#5f87af", + Rgb: Rgb{95, 135, 175}, + Hsl: Hsl{210, 33, 52}, + Name: "SteelBlue", + }, + { + Id: 68, + Hex: "#5f87d7", + Rgb: Rgb{95, 135, 215}, + Hsl: Hsl{220, 60, 60}, + Name: "SteelBlue3", + }, + { + Id: 69, + Hex: "#5f87ff", + Rgb: Rgb{95, 135, 255}, + Hsl: Hsl{225, 100, 68}, + Name: "CornflowerBlue", + }, + { + Id: 70, + Hex: "#5faf00", + Rgb: Rgb{95, 175, 0}, + Hsl: Hsl{87.4285714285714, 100, 34}, + Name: "Chartreuse3", + }, + { + Id: 71, + Hex: "#5faf5f", + Rgb: Rgb{95, 175, 95}, + Hsl: Hsl{120, 33, 52}, + Name: "DarkSeaGreen4", + }, + { + Id: 72, + Hex: "#5faf87", + Rgb: Rgb{95, 175, 135}, + Hsl: Hsl{150, 33, 52}, + Name: "CadetBlue", + }, + { + Id: 73, + Hex: "#5fafaf", + Rgb: Rgb{95, 175, 175}, + Hsl: Hsl{180, 33, 52}, + Name: "CadetBlue", + }, + { + Id: 74, + Hex: "#5fafd7", + Rgb: Rgb{95, 175, 215}, + Hsl: Hsl{200, 60, 60}, + Name: "SkyBlue3", + }, + { + Id: 75, + Hex: "#5fafff", + Rgb: Rgb{95, 175, 255}, + Hsl: Hsl{210, 100, 68}, + Name: "SteelBlue1", + }, + { + Id: 76, + Hex: "#5fd700", + Rgb: Rgb{95, 215, 0}, + Hsl: Hsl{93.4883720930233, 100, 42}, + Name: "Chartreuse3", + }, + { + Id: 77, + Hex: "#5fd75f", + Rgb: Rgb{95, 215, 95}, + Hsl: Hsl{120, 60, 60}, + Name: "PaleGreen3", + }, + { + Id: 78, + Hex: "#5fd787", + Rgb: Rgb{95, 215, 135}, + Hsl: Hsl{140, 60, 60}, + Name: "SeaGreen3", + }, + { + Id: 79, + Hex: "#5fd7af", + Rgb: Rgb{95, 215, 175}, + Hsl: Hsl{160, 60, 60}, + Name: "Aquamarine3", + }, + { + Id: 80, + Hex: "#5fd7d7", + Rgb: Rgb{95, 215, 215}, + Hsl: Hsl{180, 60, 60}, + Name: "MediumTurquoise", + }, + { + Id: 81, + Hex: "#5fd7ff", + Rgb: Rgb{95, 215, 255}, + Hsl: Hsl{195, 100, 68}, + Name: "SteelBlue1", + }, + { + Id: 82, + Hex: "#5fff00", + Rgb: Rgb{95, 255, 0}, + Hsl: Hsl{97.6470588235294, 100, 50}, + Name: "Chartreuse2", + }, + { + Id: 83, + Hex: "#5fff5f", + Rgb: Rgb{95, 255, 95}, + Hsl: Hsl{120, 100, 68}, + Name: "SeaGreen2", + }, + { + Id: 84, + Hex: "#5fff87", + Rgb: Rgb{95, 255, 135}, + Hsl: Hsl{135, 100, 68}, + Name: "SeaGreen1", + }, + { + Id: 85, + Hex: "#5fffaf", + Rgb: Rgb{95, 255, 175}, + Hsl: Hsl{150, 100, 68}, + Name: "SeaGreen1", + }, + { + Id: 86, + Hex: "#5fffd7", + Rgb: Rgb{95, 255, 215}, + Hsl: Hsl{165, 100, 68}, + Name: "Aquamarine1", + }, + { + Id: 87, + Hex: "#5fffff", + Rgb: Rgb{95, 255, 255}, + Hsl: Hsl{180, 100, 68}, + Name: "DarkSlateGray2", + }, + { + Id: 88, + Hex: "#870000", + Rgb: Rgb{135, 0, 0}, + Hsl: Hsl{0, 100, 26}, + Name: "DarkRed", + }, + { + Id: 89, + Hex: "#87005f", + Rgb: Rgb{135, 0, 95}, + Hsl: Hsl{317.777777777778, 100, 26}, + Name: "DeepPink4", + }, + { + Id: 90, + Hex: "#870087", + Rgb: Rgb{135, 0, 135}, + Hsl: Hsl{300, 100, 26}, + Name: "DarkMagenta", + }, + { + Id: 91, + Hex: "#8700af", + Rgb: Rgb{135, 0, 175}, + Hsl: Hsl{286.285714285714, 100, 34}, + Name: "DarkMagenta", + }, + { + Id: 92, + Hex: "#8700d7", + Rgb: Rgb{135, 0, 215}, + Hsl: Hsl{277.674418604651, 100, 42}, + Name: "DarkViolet", + }, + { + Id: 93, + Hex: "#8700ff", + Rgb: Rgb{135, 0, 255}, + Hsl: Hsl{271.764705882353, 100, 50}, + Name: "Purple", + }, + { + Id: 94, + Hex: "#875f00", + Rgb: Rgb{135, 95, 0}, + Hsl: Hsl{42.2222222222222, 100, 26}, + Name: "Orange4", + }, + { + Id: 95, + Hex: "#875f5f", + Rgb: Rgb{135, 95, 95}, + Hsl: Hsl{0, 17, 45}, + Name: "LightPink4", + }, + { + Id: 96, + Hex: "#875f87", + Rgb: Rgb{135, 95, 135}, + Hsl: Hsl{300, 17, 45}, + Name: "Plum4", + }, + { + Id: 97, + Hex: "#875faf", + Rgb: Rgb{135, 95, 175}, + Hsl: Hsl{270, 33, 52}, + Name: "MediumPurple3", + }, + { + Id: 98, + Hex: "#875fd7", + Rgb: Rgb{135, 95, 215}, + Hsl: Hsl{260, 60, 60}, + Name: "MediumPurple3", + }, + { + Id: 99, + Hex: "#875fff", + Rgb: Rgb{135, 95, 255}, + Hsl: Hsl{255, 100, 68}, + Name: "SlateBlue1", + }, + { + Id: 100, + Hex: "#878700", + Rgb: Rgb{135, 135, 0}, + Hsl: Hsl{60, 100, 26}, + Name: "Yellow4", + }, + { + Id: 101, + Hex: "#87875f", + Rgb: Rgb{135, 135, 95}, + Hsl: Hsl{60, 17, 45}, + Name: "Wheat4", + }, + { + Id: 102, + Hex: "#878787", + Rgb: Rgb{135, 135, 135}, + Hsl: Hsl{0, 0, 52}, + Name: "Grey53", + }, + { + Id: 103, + Hex: "#8787af", + Rgb: Rgb{135, 135, 175}, + Hsl: Hsl{240, 20, 60}, + Name: "LightSlateGrey", + }, + { + Id: 104, + Hex: "#8787d7", + Rgb: Rgb{135, 135, 215}, + Hsl: Hsl{240, 50, 68}, + Name: "MediumPurple", + }, + { + Id: 105, + Hex: "#8787ff", + Rgb: Rgb{135, 135, 255}, + Hsl: Hsl{240, 100, 76}, + Name: "LightSlateBlue", + }, + { + Id: 106, + Hex: "#87af00", + Rgb: Rgb{135, 175, 0}, + Hsl: Hsl{73.7142857142857, 100, 34}, + Name: "Yellow4", + }, + { + Id: 107, + Hex: "#87af5f", + Rgb: Rgb{135, 175, 95}, + Hsl: Hsl{90, 33, 52}, + Name: "DarkOliveGreen3", + }, + { + Id: 108, + Hex: "#87af87", + Rgb: Rgb{135, 175, 135}, + Hsl: Hsl{120, 20, 60}, + Name: "DarkSeaGreen", + }, + { + Id: 109, + Hex: "#87afaf", + Rgb: Rgb{135, 175, 175}, + Hsl: Hsl{180, 20, 60}, + Name: "LightSkyBlue3", + }, + { + Id: 110, + Hex: "#87afd7", + Rgb: Rgb{135, 175, 215}, + Hsl: Hsl{210, 50, 68}, + Name: "LightSkyBlue3", + }, + { + Id: 111, + Hex: "#87afff", + Rgb: Rgb{135, 175, 255}, + Hsl: Hsl{220, 100, 76}, + Name: "SkyBlue2", + }, + { + Id: 112, + Hex: "#87d700", + Rgb: Rgb{135, 215, 0}, + Hsl: Hsl{82.3255813953488, 100, 42}, + Name: "Chartreuse2", + }, + { + Id: 113, + Hex: "#87d75f", + Rgb: Rgb{135, 215, 95}, + Hsl: Hsl{100, 60, 60}, + Name: "DarkOliveGreen3", + }, + { + Id: 114, + Hex: "#87d787", + Rgb: Rgb{135, 215, 135}, + Hsl: Hsl{120, 50, 68}, + Name: "PaleGreen3", + }, + { + Id: 115, + Hex: "#87d7af", + Rgb: Rgb{135, 215, 175}, + Hsl: Hsl{150, 50, 68}, + Name: "DarkSeaGreen3", + }, + { + Id: 116, + Hex: "#87d7d7", + Rgb: Rgb{135, 215, 215}, + Hsl: Hsl{180, 50, 68}, + Name: "DarkSlateGray3", + }, + { + Id: 117, + Hex: "#87d7ff", + Rgb: Rgb{135, 215, 255}, + Hsl: Hsl{200, 100, 76}, + Name: "SkyBlue1", + }, + { + Id: 118, + Hex: "#87ff00", + Rgb: Rgb{135, 255, 0}, + Hsl: Hsl{88.2352941176471, 100, 50}, + Name: "Chartreuse1", + }, + { + Id: 119, + Hex: "#87ff5f", + Rgb: Rgb{135, 255, 95}, + Hsl: Hsl{105, 100, 68}, + Name: "LightGreen", + }, + { + Id: 120, + Hex: "#87ff87", + Rgb: Rgb{135, 255, 135}, + Hsl: Hsl{120, 100, 76}, + Name: "LightGreen", + }, + { + Id: 121, + Hex: "#87ffaf", + Rgb: Rgb{135, 255, 175}, + Hsl: Hsl{140, 100, 76}, + Name: "PaleGreen1", + }, + { + Id: 122, + Hex: "#87ffd7", + Rgb: Rgb{135, 255, 215}, + Hsl: Hsl{160, 100, 76}, + Name: "Aquamarine1", + }, + { + Id: 123, + Hex: "#87ffff", + Rgb: Rgb{135, 255, 255}, + Hsl: Hsl{180, 100, 76}, + Name: "DarkSlateGray1", + }, + { + Id: 124, + Hex: "#af0000", + Rgb: Rgb{175, 0, 0}, + Hsl: Hsl{0, 100, 34}, + Name: "Red3", + }, + { + Id: 125, + Hex: "#af005f", + Rgb: Rgb{175, 0, 95}, + Hsl: Hsl{327.428571428571, 100, 34}, + Name: "DeepPink4", + }, + { + Id: 126, + Hex: "#af0087", + Rgb: Rgb{175, 0, 135}, + Hsl: Hsl{313.714285714286, 100, 34}, + Name: "MediumVioletRed", + }, + { + Id: 127, + Hex: "#af00af", + Rgb: Rgb{175, 0, 175}, + Hsl: Hsl{300, 100, 34}, + Name: "Magenta3", + }, + { + Id: 128, + Hex: "#af00d7", + Rgb: Rgb{175, 0, 215}, + Hsl: Hsl{288.837209302326, 100, 42}, + Name: "DarkViolet", + }, + { + Id: 129, + Hex: "#af00ff", + Rgb: Rgb{175, 0, 255}, + Hsl: Hsl{281.176470588235, 100, 50}, + Name: "Purple", + }, + { + Id: 130, + Hex: "#af5f00", + Rgb: Rgb{175, 95, 0}, + Hsl: Hsl{32.5714285714286, 100, 34}, + Name: "DarkOrange3", + }, + { + Id: 131, + Hex: "#af5f5f", + Rgb: Rgb{175, 95, 95}, + Hsl: Hsl{0, 33, 52}, + Name: "IndianRed", + }, + { + Id: 132, + Hex: "#af5f87", + Rgb: Rgb{175, 95, 135}, + Hsl: Hsl{330, 33, 52}, + Name: "HotPink3", + }, + { + Id: 133, + Hex: "#af5faf", + Rgb: Rgb{175, 95, 175}, + Hsl: Hsl{300, 33, 52}, + Name: "MediumOrchid3", + }, + { + Id: 134, + Hex: "#af5fd7", + Rgb: Rgb{175, 95, 215}, + Hsl: Hsl{280, 60, 60}, + Name: "MediumOrchid", + }, + { + Id: 135, + Hex: "#af5fff", + Rgb: Rgb{175, 95, 255}, + Hsl: Hsl{270, 100, 68}, + Name: "MediumPurple2", + }, + { + Id: 136, + Hex: "#af8700", + Rgb: Rgb{175, 135, 0}, + Hsl: Hsl{46.2857142857143, 100, 34}, + Name: "DarkGoldenrod", + }, + { + Id: 137, + Hex: "#af875f", + Rgb: Rgb{175, 135, 95}, + Hsl: Hsl{30, 33, 52}, + Name: "LightSalmon3", + }, + { + Id: 138, + Hex: "#af8787", + Rgb: Rgb{175, 135, 135}, + Hsl: Hsl{0, 20, 60}, + Name: "RosyBrown", + }, + { + Id: 139, + Hex: "#af87af", + Rgb: Rgb{175, 135, 175}, + Hsl: Hsl{300, 20, 60}, + Name: "Grey63", + }, + { + Id: 140, + Hex: "#af87d7", + Rgb: Rgb{175, 135, 215}, + Hsl: Hsl{270, 50, 68}, + Name: "MediumPurple2", + }, + { + Id: 141, + Hex: "#af87ff", + Rgb: Rgb{175, 135, 255}, + Hsl: Hsl{260, 100, 76}, + Name: "MediumPurple1", + }, + { + Id: 142, + Hex: "#afaf00", + Rgb: Rgb{175, 175, 0}, + Hsl: Hsl{60, 100, 34}, + Name: "Gold3", + }, + { + Id: 143, + Hex: "#afaf5f", + Rgb: Rgb{175, 175, 95}, + Hsl: Hsl{60, 33, 52}, + Name: "DarkKhaki", + }, + { + Id: 144, + Hex: "#afaf87", + Rgb: Rgb{175, 175, 135}, + Hsl: Hsl{60, 20, 60}, + Name: "NavajoWhite3", + }, + { + Id: 145, + Hex: "#afafaf", + Rgb: Rgb{175, 175, 175}, + Hsl: Hsl{0, 0, 68}, + Name: "Grey69", + }, + { + Id: 146, + Hex: "#afafd7", + Rgb: Rgb{175, 175, 215}, + Hsl: Hsl{240, 33, 76}, + Name: "LightSteelBlue3", + }, + { + Id: 147, + Hex: "#afafff", + Rgb: Rgb{175, 175, 255}, + Hsl: Hsl{240, 100, 84}, + Name: "LightSteelBlue", + }, + { + Id: 148, + Hex: "#afd700", + Rgb: Rgb{175, 215, 0}, + Hsl: Hsl{71.1627906976744, 100, 42}, + Name: "Yellow3", + }, + { + Id: 149, + Hex: "#afd75f", + Rgb: Rgb{175, 215, 95}, + Hsl: Hsl{80, 60, 60}, + Name: "DarkOliveGreen3", + }, + { + Id: 150, + Hex: "#afd787", + Rgb: Rgb{175, 215, 135}, + Hsl: Hsl{90, 50, 68}, + Name: "DarkSeaGreen3", + }, + { + Id: 151, + Hex: "#afd7af", + Rgb: Rgb{175, 215, 175}, + Hsl: Hsl{120, 33, 76}, + Name: "DarkSeaGreen2", + }, + { + Id: 152, + Hex: "#afd7d7", + Rgb: Rgb{175, 215, 215}, + Hsl: Hsl{180, 33, 76}, + Name: "LightCyan3", + }, + { + Id: 153, + Hex: "#afd7ff", + Rgb: Rgb{175, 215, 255}, + Hsl: Hsl{210, 100, 84}, + Name: "LightSkyBlue1", + }, + { + Id: 154, + Hex: "#afff00", + Rgb: Rgb{175, 255, 0}, + Hsl: Hsl{78.8235294117647, 100, 50}, + Name: "GreenYellow", + }, + { + Id: 155, + Hex: "#afff5f", + Rgb: Rgb{175, 255, 95}, + Hsl: Hsl{90, 100, 68}, + Name: "DarkOliveGreen2", + }, + { + Id: 156, + Hex: "#afff87", + Rgb: Rgb{175, 255, 135}, + Hsl: Hsl{100, 100, 76}, + Name: "PaleGreen1", + }, + { + Id: 157, + Hex: "#afffaf", + Rgb: Rgb{175, 255, 175}, + Hsl: Hsl{120, 100, 84}, + Name: "DarkSeaGreen2", + }, + { + Id: 158, + Hex: "#afffd7", + Rgb: Rgb{175, 255, 215}, + Hsl: Hsl{150, 100, 84}, + Name: "DarkSeaGreen1", + }, + { + Id: 159, + Hex: "#afffff", + Rgb: Rgb{175, 255, 255}, + Hsl: Hsl{180, 100, 84}, + Name: "PaleTurquoise1", + }, + { + Id: 160, + Hex: "#d70000", + Rgb: Rgb{215, 0, 0}, + Hsl: Hsl{0, 100, 42}, + Name: "Red3", + }, + { + Id: 161, + Hex: "#d7005f", + Rgb: Rgb{215, 0, 95}, + Hsl: Hsl{333.488372093023, 100, 42}, + Name: "DeepPink3", + }, + { + Id: 162, + Hex: "#d70087", + Rgb: Rgb{215, 0, 135}, + Hsl: Hsl{322.325581395349, 100, 42}, + Name: "DeepPink3", + }, + { + Id: 163, + Hex: "#d700af", + Rgb: Rgb{215, 0, 175}, + Hsl: Hsl{311.162790697674, 100, 42}, + Name: "Magenta3", + }, + { + Id: 164, + Hex: "#d700d7", + Rgb: Rgb{215, 0, 215}, + Hsl: Hsl{300, 100, 42}, + Name: "Magenta3", + }, + { + Id: 165, + Hex: "#d700ff", + Rgb: Rgb{215, 0, 255}, + Hsl: Hsl{290.588235294118, 100, 50}, + Name: "Magenta2", + }, + { + Id: 166, + Hex: "#d75f00", + Rgb: Rgb{215, 95, 0}, + Hsl: Hsl{26.5116279069767, 100, 42}, + Name: "DarkOrange3", + }, + { + Id: 167, + Hex: "#d75f5f", + Rgb: Rgb{215, 95, 95}, + Hsl: Hsl{0, 60, 60}, + Name: "IndianRed", + }, + { + Id: 168, + Hex: "#d75f87", + Rgb: Rgb{215, 95, 135}, + Hsl: Hsl{340, 60, 60}, + Name: "HotPink3", + }, + { + Id: 169, + Hex: "#d75faf", + Rgb: Rgb{215, 95, 175}, + Hsl: Hsl{320, 60, 60}, + Name: "HotPink2", + }, + { + Id: 170, + Hex: "#d75fd7", + Rgb: Rgb{215, 95, 215}, + Hsl: Hsl{300, 60, 60}, + Name: "Orchid", + }, + { + Id: 171, + Hex: "#d75fff", + Rgb: Rgb{215, 95, 255}, + Hsl: Hsl{285, 100, 68}, + Name: "MediumOrchid1", + }, + { + Id: 172, + Hex: "#d78700", + Rgb: Rgb{215, 135, 0}, + Hsl: Hsl{37.6744186046512, 100, 42}, + Name: "Orange3", + }, + { + Id: 173, + Hex: "#d7875f", + Rgb: Rgb{215, 135, 95}, + Hsl: Hsl{20, 60, 60}, + Name: "LightSalmon3", + }, + { + Id: 174, + Hex: "#d78787", + Rgb: Rgb{215, 135, 135}, + Hsl: Hsl{0, 50, 68}, + Name: "LightPink3", + }, + { + Id: 175, + Hex: "#d787af", + Rgb: Rgb{215, 135, 175}, + Hsl: Hsl{330, 50, 68}, + Name: "Pink3", + }, + { + Id: 176, + Hex: "#d787d7", + Rgb: Rgb{215, 135, 215}, + Hsl: Hsl{300, 50, 68}, + Name: "Plum3", + }, + { + Id: 177, + Hex: "#d787ff", + Rgb: Rgb{215, 135, 255}, + Hsl: Hsl{280, 100, 76}, + Name: "Violet", + }, + { + Id: 178, + Hex: "#d7af00", + Rgb: Rgb{215, 175, 0}, + Hsl: Hsl{48.8372093023256, 100, 42}, + Name: "Gold3", + }, + { + Id: 179, + Hex: "#d7af5f", + Rgb: Rgb{215, 175, 95}, + Hsl: Hsl{40, 60, 60}, + Name: "LightGoldenrod3", + }, + { + Id: 180, + Hex: "#d7af87", + Rgb: Rgb{215, 175, 135}, + Hsl: Hsl{30, 50, 68}, + Name: "Tan", + }, + { + Id: 181, + Hex: "#d7afaf", + Rgb: Rgb{215, 175, 175}, + Hsl: Hsl{0, 33, 76}, + Name: "MistyRose3", + }, + { + Id: 182, + Hex: "#d7afd7", + Rgb: Rgb{215, 175, 215}, + Hsl: Hsl{300, 33, 76}, + Name: "Thistle3", + }, + { + Id: 183, + Hex: "#d7afff", + Rgb: Rgb{215, 175, 255}, + Hsl: Hsl{270, 100, 84}, + Name: "Plum2", + }, + { + Id: 184, + Hex: "#d7d700", + Rgb: Rgb{215, 215, 0}, + Hsl: Hsl{60, 100, 42}, + Name: "Yellow3", + }, + { + Id: 185, + Hex: "#d7d75f", + Rgb: Rgb{215, 215, 95}, + Hsl: Hsl{60, 60, 60}, + Name: "Khaki3", + }, + { + Id: 186, + Hex: "#d7d787", + Rgb: Rgb{215, 215, 135}, + Hsl: Hsl{60, 50, 68}, + Name: "LightGoldenrod2", + }, + { + Id: 187, + Hex: "#d7d7af", + Rgb: Rgb{215, 215, 175}, + Hsl: Hsl{60, 33, 76}, + Name: "LightYellow3", + }, + { + Id: 188, + Hex: "#d7d7d7", + Rgb: Rgb{215, 215, 215}, + Hsl: Hsl{0, 0, 84}, + Name: "Grey84", + }, + { + Id: 189, + Hex: "#d7d7ff", + Rgb: Rgb{215, 215, 255}, + Hsl: Hsl{240, 100, 92}, + Name: "LightSteelBlue1", + }, + { + Id: 190, + Hex: "#d7ff00", + Rgb: Rgb{215, 255, 0}, + Hsl: Hsl{69.4117647058823, 100, 50}, + Name: "Yellow2", + }, + { + Id: 191, + Hex: "#d7ff5f", + Rgb: Rgb{215, 255, 95}, + Hsl: Hsl{75, 100, 68}, + Name: "DarkOliveGreen1", + }, + { + Id: 192, + Hex: "#d7ff87", + Rgb: Rgb{215, 255, 135}, + Hsl: Hsl{80, 100, 76}, + Name: "DarkOliveGreen1", + }, + { + Id: 193, + Hex: "#d7ffaf", + Rgb: Rgb{215, 255, 175}, + Hsl: Hsl{90, 100, 84}, + Name: "DarkSeaGreen1", + }, + { + Id: 194, + Hex: "#d7ffd7", + Rgb: Rgb{215, 255, 215}, + Hsl: Hsl{120, 100, 92}, + Name: "Honeydew2", + }, + { + Id: 195, + Hex: "#d7ffff", + Rgb: Rgb{215, 255, 255}, + Hsl: Hsl{180, 100, 92}, + Name: "LightCyan1", + }, + { + Id: 196, + Hex: "#ff0000", + Rgb: Rgb{255, 0, 0}, + Hsl: Hsl{0, 100, 50}, + Name: "Red1", + }, + { + Id: 197, + Hex: "#ff005f", + Rgb: Rgb{255, 0, 95}, + Hsl: Hsl{337.647058823529, 100, 50}, + Name: "DeepPink2", + }, + { + Id: 198, + Hex: "#ff0087", + Rgb: Rgb{255, 0, 135}, + Hsl: Hsl{328.235294117647, 100, 50}, + Name: "DeepPink1", + }, + { + Id: 199, + Hex: "#ff00af", + Rgb: Rgb{255, 0, 175}, + Hsl: Hsl{318.823529411765, 100, 50}, + Name: "DeepPink1", + }, + { + Id: 200, + Hex: "#ff00d7", + Rgb: Rgb{255, 0, 215}, + Hsl: Hsl{309.411764705882, 100, 50}, + Name: "Magenta2", + }, + { + Id: 201, + Hex: "#ff00ff", + Rgb: Rgb{255, 0, 255}, + Hsl: Hsl{300, 100, 50}, + Name: "Magenta1", + }, + { + Id: 202, + Hex: "#ff5f00", + Rgb: Rgb{255, 95, 0}, + Hsl: Hsl{22.3529411764706, 100, 50}, + Name: "OrangeRed1", + }, + { + Id: 203, + Hex: "#ff5f5f", + Rgb: Rgb{255, 95, 95}, + Hsl: Hsl{0, 100, 68}, + Name: "IndianRed1", + }, + { + Id: 204, + Hex: "#ff5f87", + Rgb: Rgb{255, 95, 135}, + Hsl: Hsl{345, 100, 68}, + Name: "IndianRed1", + }, + { + Id: 205, + Hex: "#ff5faf", + Rgb: Rgb{255, 95, 175}, + Hsl: Hsl{330, 100, 68}, + Name: "HotPink", + }, + { + Id: 206, + Hex: "#ff5fd7", + Rgb: Rgb{255, 95, 215}, + Hsl: Hsl{315, 100, 68}, + Name: "HotPink", + }, + { + Id: 207, + Hex: "#ff5fff", + Rgb: Rgb{255, 95, 255}, + Hsl: Hsl{300, 100, 68}, + Name: "MediumOrchid1", + }, + { + Id: 208, + Hex: "#ff8700", + Rgb: Rgb{255, 135, 0}, + Hsl: Hsl{31.7647058823529, 100, 50}, + Name: "DarkOrange", + }, + { + Id: 209, + Hex: "#ff875f", + Rgb: Rgb{255, 135, 95}, + Hsl: Hsl{15, 100, 68}, + Name: "Salmon1", + }, + { + Id: 210, + Hex: "#ff8787", + Rgb: Rgb{255, 135, 135}, + Hsl: Hsl{0, 100, 76}, + Name: "LightCoral", + }, + { + Id: 211, + Hex: "#ff87af", + Rgb: Rgb{255, 135, 175}, + Hsl: Hsl{340, 100, 76}, + Name: "PaleVioletRed1", + }, + { + Id: 212, + Hex: "#ff87d7", + Rgb: Rgb{255, 135, 215}, + Hsl: Hsl{320, 100, 76}, + Name: "Orchid2", + }, + { + Id: 213, + Hex: "#ff87ff", + Rgb: Rgb{255, 135, 255}, + Hsl: Hsl{300, 100, 76}, + Name: "Orchid1", + }, + { + Id: 214, + Hex: "#ffaf00", + Rgb: Rgb{255, 175, 0}, + Hsl: Hsl{41.1764705882353, 100, 50}, + Name: "Orange1", + }, + { + Id: 215, + Hex: "#ffaf5f", + Rgb: Rgb{255, 175, 95}, + Hsl: Hsl{30, 100, 68}, + Name: "SandyBrown", + }, + { + Id: 216, + Hex: "#ffaf87", + Rgb: Rgb{255, 175, 135}, + Hsl: Hsl{20, 100, 76}, + Name: "LightSalmon1", + }, + { + Id: 217, + Hex: "#ffafaf", + Rgb: Rgb{255, 175, 175}, + Hsl: Hsl{0, 100, 84}, + Name: "LightPink1", + }, + { + Id: 218, + Hex: "#ffafd7", + Rgb: Rgb{255, 175, 215}, + Hsl: Hsl{330, 100, 84}, + Name: "Pink1", + }, + { + Id: 219, + Hex: "#ffafff", + Rgb: Rgb{255, 175, 255}, + Hsl: Hsl{300, 100, 84}, + Name: "Plum1", + }, + { + Id: 220, + Hex: "#ffd700", + Rgb: Rgb{255, 215, 0}, + Hsl: Hsl{50.5882352941176, 100, 50}, + Name: "Gold1", + }, + { + Id: 221, + Hex: "#ffd75f", + Rgb: Rgb{255, 215, 95}, + Hsl: Hsl{45, 100, 68}, + Name: "LightGoldenrod2", + }, + { + Id: 222, + Hex: "#ffd787", + Rgb: Rgb{255, 215, 135}, + Hsl: Hsl{40, 100, 76}, + Name: "LightGoldenrod2", + }, + { + Id: 223, + Hex: "#ffd7af", + Rgb: Rgb{255, 215, 175}, + Hsl: Hsl{30, 100, 84}, + Name: "NavajoWhite1", + }, + { + Id: 224, + Hex: "#ffd7d7", + Rgb: Rgb{255, 215, 215}, + Hsl: Hsl{0, 100, 92}, + Name: "MistyRose1", + }, + { + Id: 225, + Hex: "#ffd7ff", + Rgb: Rgb{255, 215, 255}, + Hsl: Hsl{300, 100, 92}, + Name: "Thistle1", + }, + { + Id: 226, + Hex: "#ffff00", + Rgb: Rgb{255, 255, 0}, + Hsl: Hsl{60, 100, 50}, + Name: "Yellow1", + }, + { + Id: 227, + Hex: "#ffff5f", + Rgb: Rgb{255, 255, 95}, + Hsl: Hsl{60, 100, 68}, + Name: "LightGoldenrod1", + }, + { + Id: 228, + Hex: "#ffff87", + Rgb: Rgb{255, 255, 135}, + Hsl: Hsl{60, 100, 76}, + Name: "Khaki1", + }, + { + Id: 229, + Hex: "#ffffaf", + Rgb: Rgb{255, 255, 175}, + Hsl: Hsl{60, 100, 84}, + Name: "Wheat1", + }, + { + Id: 230, + Hex: "#ffffd7", + Rgb: Rgb{255, 255, 215}, + Hsl: Hsl{60, 100, 92}, + Name: "Cornsilk1", + }, + { + Id: 231, + Hex: "#ffffff", + Rgb: Rgb{255, 255, 255}, + Hsl: Hsl{0, 0, 100}, + Name: "Grey100", + }, + { + Id: 232, + Hex: "#080808", + Rgb: Rgb{8, 8, 8}, + Hsl: Hsl{0, 0, 3}, + Name: "Grey3", + }, + { + Id: 233, + Hex: "#121212", + Rgb: Rgb{18, 18, 18}, + Hsl: Hsl{0, 0, 7}, + Name: "Grey7", + }, + { + Id: 234, + Hex: "#1c1c1c", + Rgb: Rgb{28, 28, 28}, + Hsl: Hsl{0, 0, 10}, + Name: "Grey11", + }, + { + Id: 235, + Hex: "#262626", + Rgb: Rgb{38, 38, 38}, + Hsl: Hsl{0, 0, 14}, + Name: "Grey15", + }, + { + Id: 236, + Hex: "#303030", + Rgb: Rgb{48, 48, 48}, + Hsl: Hsl{0, 0, 18}, + Name: "Grey19", + }, + { + Id: 237, + Hex: "#3a3a3a", + Rgb: Rgb{58, 58, 58}, + Hsl: Hsl{0, 0, 22}, + Name: "Grey23", + }, + { + Id: 238, + Hex: "#444444", + Rgb: Rgb{68, 68, 68}, + Hsl: Hsl{0, 0, 26}, + Name: "Grey27", + }, + { + Id: 239, + Hex: "#4e4e4e", + Rgb: Rgb{78, 78, 78}, + Hsl: Hsl{0, 0, 30}, + Name: "Grey30", + }, + { + Id: 240, + Hex: "#585858", + Rgb: Rgb{88, 88, 88}, + Hsl: Hsl{0, 0, 34}, + Name: "Grey35", + }, + { + Id: 241, + Hex: "#626262", + Rgb: Rgb{98, 98, 98}, + Hsl: Hsl{0, 0, 37}, + Name: "Grey39", + }, + { + Id: 242, + Hex: "#6c6c6c", + Rgb: Rgb{108, 108, 108}, + Hsl: Hsl{0, 0, 40}, + Name: "Grey42", + }, + { + Id: 243, + Hex: "#767676", + Rgb: Rgb{118, 118, 118}, + Hsl: Hsl{0, 0, 46}, + Name: "Grey46", + }, + { + Id: 244, + Hex: "#808080", + Rgb: Rgb{128, 128, 128}, + Hsl: Hsl{0, 0, 50}, + Name: "Grey50", + }, + { + Id: 245, + Hex: "#8a8a8a", + Rgb: Rgb{138, 138, 138}, + Hsl: Hsl{0, 0, 54}, + Name: "Grey54", + }, + { + Id: 246, + Hex: "#949494", + Rgb: Rgb{148, 148, 148}, + Hsl: Hsl{0, 0, 58}, + Name: "Grey58", + }, + { + Id: 247, + Hex: "#9e9e9e", + Rgb: Rgb{158, 158, 158}, + Hsl: Hsl{0, 0, 61}, + Name: "Grey62", + }, + { + Id: 248, + Hex: "#a8a8a8", + Rgb: Rgb{168, 168, 168}, + Hsl: Hsl{0, 0, 65}, + Name: "Grey66", + }, + { + Id: 249, + Hex: "#b2b2b2", + Rgb: Rgb{178, 178, 178}, + Hsl: Hsl{0, 0, 69}, + Name: "Grey70", + }, + { + Id: 250, + Hex: "#bcbcbc", + Rgb: Rgb{188, 188, 188}, + Hsl: Hsl{0, 0, 73}, + Name: "Grey74", + }, + { + Id: 251, + Hex: "#c6c6c6", + Rgb: Rgb{198, 198, 198}, + Hsl: Hsl{0, 0, 77}, + Name: "Grey78", + }, + { + Id: 252, + Hex: "#d0d0d0", + Rgb: Rgb{208, 208, 208}, + Hsl: Hsl{0, 0, 81}, + Name: "Grey82", + }, + { + Id: 253, + Hex: "#dadada", + Rgb: Rgb{218, 218, 218}, + Hsl: Hsl{0, 0, 85}, + Name: "Grey85", + }, + { + Id: 254, + Hex: "#e4e4e4", + Rgb: Rgb{228, 228, 228}, + Hsl: Hsl{0, 0, 89}, + Name: "Grey89", + }, + { + Id: 255, + Hex: "#eeeeee", + Rgb: Rgb{238, 238, 238}, + Hsl: Hsl{0, 0, 93}, + Name: "Grey93", + }, +} diff --git a/vendor/github.com/leaanthony/go-ansi-parser/go.mod b/vendor/github.com/leaanthony/go-ansi-parser/go.mod new file mode 100644 index 0000000..86938ec --- /dev/null +++ b/vendor/github.com/leaanthony/go-ansi-parser/go.mod @@ -0,0 +1,8 @@ +module github.com/leaanthony/go-ansi-parser + +go 1.16 + +require ( + github.com/matryer/is v1.4.0 + github.com/rivo/uniseg v0.2.0 +) diff --git a/vendor/github.com/leaanthony/go-ansi-parser/go.sum b/vendor/github.com/leaanthony/go-ansi-parser/go.sum new file mode 100644 index 0000000..a386317 --- /dev/null +++ b/vendor/github.com/leaanthony/go-ansi-parser/go.sum @@ -0,0 +1,4 @@ +github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE= +github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= +github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= diff --git a/vendor/github.com/leaanthony/go-ansi-parser/logo.png b/vendor/github.com/leaanthony/go-ansi-parser/logo.png new file mode 100644 index 0000000..2158ab2 Binary files /dev/null and b/vendor/github.com/leaanthony/go-ansi-parser/logo.png differ diff --git a/vendor/github.com/wailsapp/wails/lib/renderer/webview/LICENSE b/vendor/github.com/leaanthony/go-common-file-dialog/LICENSE similarity index 96% rename from vendor/github.com/wailsapp/wails/lib/renderer/webview/LICENSE rename to vendor/github.com/leaanthony/go-common-file-dialog/LICENSE index b18604b..508b697 100644 --- a/vendor/github.com/wailsapp/wails/lib/renderer/webview/LICENSE +++ b/vendor/github.com/leaanthony/go-common-file-dialog/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2017 Serge Zaitsev +Copyright (c) 2019 Harry Phillips Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/vendor/github.com/leaanthony/go-common-file-dialog/cfd/CommonFileDialog.go b/vendor/github.com/leaanthony/go-common-file-dialog/cfd/CommonFileDialog.go new file mode 100644 index 0000000..58e97aa --- /dev/null +++ b/vendor/github.com/leaanthony/go-common-file-dialog/cfd/CommonFileDialog.go @@ -0,0 +1,72 @@ +// Cross-platform. + +// Common File Dialogs +package cfd + +type Dialog interface { + // Show the dialog to the user. + // Blocks until the user has closed the dialog. + Show() error + // Sets the dialog's parent window. Use 0 to set the dialog to have no parent window. + SetParentWindowHandle(hwnd uintptr) + // Show the dialog to the user. + // Blocks until the user has closed the dialog and returns their selection. + // Returns an error if the user cancelled the dialog. + // Do not use for the Open Multiple Files dialog. Use ShowAndGetResults instead. + ShowAndGetResult() (string, error) + // Sets the title of the dialog window. + SetTitle(title string) error + // Sets the "role" of the dialog. This is used to derive the dialog's GUID, which the + // OS will use to differentiate it from dialogs that are intended for other purposes. + // This means that, for example, a dialog with role "Import" will have a different + // previous location that it will open to than a dialog with role "Open". Can be any string. + SetRole(role string) error + // Sets the folder used as a default if there is not a recently used folder value available + SetDefaultFolder(defaultFolder string) error + // Sets the folder that the dialog always opens to. + // If this is set, it will override the "default folder" behaviour and the dialog will always open to this folder. + SetFolder(folder string) error + // Gets the selected file or folder path, as an absolute path eg. "C:\Folder\file.txt" + // Do not use for the Open Multiple Files dialog. Use GetResults instead. + GetResult() (string, error) + // Sets the file name, I.E. the contents of the file name text box. + // For Select Folder Dialog, sets folder name. + SetFileName(fileName string) error + // Release the resources allocated to this Dialog. + // Should be called when the dialog is finished with. + Release() error +} + +type FileDialog interface { + Dialog + // Set the list of file filters that the user can select. + SetFileFilters(fileFilter []FileFilter) error + // Set the selected item from the list of file filters (set using SetFileFilters) by its index. Defaults to 0 (the first item in the list) if not called. + SetSelectedFileFilterIndex(index uint) error + // Sets the default extension applied when a user does not provide one as part of the file name. + // If the user selects a different file filter, the default extension will be automatically updated to match the new file filter. + // For Open / Open Multiple File Dialog, this only has an effect when the user specifies a file name with no extension and a file with the default extension exists. + // For Save File Dialog, this extension will be used whenever a user does not specify an extension. + SetDefaultExtension(defaultExtension string) error +} + +type OpenFileDialog interface { + FileDialog +} + +type OpenMultipleFilesDialog interface { + FileDialog + // Show the dialog to the user. + // Blocks until the user has closed the dialog and returns the selected files. + ShowAndGetResults() ([]string, error) + // Gets the selected file paths, as absolute paths eg. "C:\Folder\file.txt" + GetResults() ([]string, error) +} + +type SelectFolderDialog interface { + Dialog +} + +type SaveFileDialog interface { // TODO Properties + FileDialog +} diff --git a/vendor/github.com/leaanthony/go-common-file-dialog/cfd/CommonFileDialog_nonWindows.go b/vendor/github.com/leaanthony/go-common-file-dialog/cfd/CommonFileDialog_nonWindows.go new file mode 100644 index 0000000..3935218 --- /dev/null +++ b/vendor/github.com/leaanthony/go-common-file-dialog/cfd/CommonFileDialog_nonWindows.go @@ -0,0 +1,27 @@ +// +build !windows + +package cfd + +import "fmt" + +var unsupportedError = fmt.Errorf("common file dialogs are only available on windows") + +// TODO doc +func NewOpenFileDialog(config DialogConfig) (OpenFileDialog, error) { + return nil, unsupportedError +} + +// TODO doc +func NewOpenMultipleFilesDialog(config DialogConfig) (OpenMultipleFilesDialog, error) { + return nil, unsupportedError +} + +// TODO doc +func NewSelectFolderDialog(config DialogConfig) (SelectFolderDialog, error) { + return nil, unsupportedError +} + +// TODO doc +func NewSaveFileDialog(config DialogConfig) (SaveFileDialog, error) { + return nil, unsupportedError +} diff --git a/vendor/github.com/leaanthony/go-common-file-dialog/cfd/CommonFileDialog_windows.go b/vendor/github.com/leaanthony/go-common-file-dialog/cfd/CommonFileDialog_windows.go new file mode 100644 index 0000000..a4eda12 --- /dev/null +++ b/vendor/github.com/leaanthony/go-common-file-dialog/cfd/CommonFileDialog_windows.go @@ -0,0 +1,78 @@ +// +build windows + +package cfd + +import "github.com/go-ole/go-ole" + +func initialize() { + // Swallow error + _ = ole.CoInitializeEx(0, ole.COINIT_APARTMENTTHREADED|ole.COINIT_DISABLE_OLE1DDE) +} + +// TODO doc +func NewOpenFileDialog(config DialogConfig) (OpenFileDialog, error) { + initialize() + + openDialog, err := newIFileOpenDialog() + if err != nil { + return nil, err + } + err = config.apply(openDialog) + if err != nil { + return nil, err + } + return openDialog, nil +} + +// TODO doc +func NewOpenMultipleFilesDialog(config DialogConfig) (OpenMultipleFilesDialog, error) { + initialize() + + openDialog, err := newIFileOpenDialog() + if err != nil { + return nil, err + } + err = config.apply(openDialog) + if err != nil { + return nil, err + } + err = openDialog.setIsMultiselect(true) + if err != nil { + return nil, err + } + return openDialog, nil +} + +// TODO doc +func NewSelectFolderDialog(config DialogConfig) (SelectFolderDialog, error) { + initialize() + + openDialog, err := newIFileOpenDialog() + if err != nil { + return nil, err + } + err = config.apply(openDialog) + if err != nil { + return nil, err + } + err = openDialog.setPickFolders(true) + if err != nil { + return nil, err + } + return openDialog, nil +} + +// TODO doc +func NewSaveFileDialog(config DialogConfig) (SaveFileDialog, error) { + initialize() + + saveDialog, err := newIFileSaveDialog() + if err != nil { + return nil, err + } + err = config.apply(saveDialog) + if err != nil { + return nil, err + } + return saveDialog, nil +} diff --git a/vendor/github.com/leaanthony/go-common-file-dialog/cfd/DialogConfig.go b/vendor/github.com/leaanthony/go-common-file-dialog/cfd/DialogConfig.go new file mode 100644 index 0000000..76e7a05 --- /dev/null +++ b/vendor/github.com/leaanthony/go-common-file-dialog/cfd/DialogConfig.go @@ -0,0 +1,120 @@ +// Cross-platform. + +package cfd + +type FileFilter struct { + // The display name of the filter (That is shown to the user) + DisplayName string + // The filter pattern. Eg. "*.txt;*.png" to select all txt and png files, "*.*" to select any files, etc. + Pattern string +} + +type DialogConfig struct { + // The title of the dialog + Title string + // The role of the dialog. This is used to derive the dialog's GUID, which the + // OS will use to differentiate it from dialogs that are intended for other purposes. + // This means that, for example, a dialog with role "Import" will have a different + // previous location that it will open to than a dialog with role "Open". Can be any string. + Role string + // The default folder - the folder that is used the first time the user opens it + // (after the first time their last used location is used). + DefaultFolder string + // The initial folder - the folder that the dialog always opens to if not empty. + // If this is not empty, it will override the "default folder" behaviour and + // the dialog will always open to this folder. + Folder string + // The file filters that restrict which types of files the dialog is able to choose. + // Ignored by Select Folder Dialog. + FileFilters []FileFilter + // Sets the initially selected file filter. This is an index of FileFilters. + // Ignored by Select Folder Dialog. + SelectedFileFilterIndex uint + // The initial name of the file (I.E. the text in the file name text box) when the user opens the dialog. + // For the Select Folder Dialog, this sets the initial folder name. + FileName string + // The default extension applied when a user does not provide one as part of the file name. + // If the user selects a different file filter, the default extension will be automatically updated to match the new file filter. + // For Open / Open Multiple File Dialog, this only has an effect when the user specifies a file name with no extension and a file with the default extension exists. + // For Save File Dialog, this extension will be used whenever a user does not specify an extension. + // Ignored by Select Folder Dialog. + DefaultExtension string + // ParentWindowHandle is the handle (HWND) to the parent window of the dialog. + // If left as 0 / nil, the dialog will have no parent window. + ParentWindowHandle uintptr +} + +var defaultFilters = []FileFilter{ + { + DisplayName: "All Files (*.*)", + Pattern: "*.*", + }, +} + +func (config *DialogConfig) apply(dialog Dialog) (err error) { + if config.Role != "" { + err = dialog.SetTitle(config.Title) + if err != nil { + return + } + } + + if config.Role != "" { + err = dialog.SetRole(config.Role) + if err != nil { + return + } + } + + if config.Folder != "" { + err = dialog.SetFolder(config.Folder) + if err != nil { + return + } + } + + if config.DefaultFolder != "" { + err = dialog.SetDefaultFolder(config.DefaultFolder) + if err != nil { + return + } + } + + if config.FileName != "" { + err = dialog.SetFileName(config.FileName) + if err != nil { + return + } + } + + dialog.SetParentWindowHandle(config.ParentWindowHandle) + + if dialog, ok := dialog.(FileDialog); ok { + var fileFilters []FileFilter + if config.FileFilters != nil && len(config.FileFilters) > 0 { + fileFilters = config.FileFilters + } else { + fileFilters = defaultFilters + } + err = dialog.SetFileFilters(fileFilters) + if err != nil { + return + } + + if config.SelectedFileFilterIndex != 0 { + err = dialog.SetSelectedFileFilterIndex(config.SelectedFileFilterIndex) + if err != nil { + return + } + } + + if config.DefaultExtension != "" { + err = dialog.SetDefaultExtension(config.DefaultExtension) + if err != nil { + return + } + } + } + + return +} diff --git a/vendor/github.com/leaanthony/go-common-file-dialog/cfd/errors.go b/vendor/github.com/leaanthony/go-common-file-dialog/cfd/errors.go new file mode 100644 index 0000000..c097c8e --- /dev/null +++ b/vendor/github.com/leaanthony/go-common-file-dialog/cfd/errors.go @@ -0,0 +1,7 @@ +package cfd + +import "errors" + +var ( + ErrorCancelled = errors.New("cancelled by user") +) diff --git a/vendor/github.com/leaanthony/go-common-file-dialog/cfd/iFileOpenDialog.go b/vendor/github.com/leaanthony/go-common-file-dialog/cfd/iFileOpenDialog.go new file mode 100644 index 0000000..e0dcea2 --- /dev/null +++ b/vendor/github.com/leaanthony/go-common-file-dialog/cfd/iFileOpenDialog.go @@ -0,0 +1,196 @@ +// +build windows + +package cfd + +import ( + "github.com/go-ole/go-ole" + "github.com/leaanthony/go-common-file-dialog/util" + "syscall" + "unsafe" +) + +var ( + fileOpenDialogCLSID = ole.NewGUID("{DC1C5A9C-E88A-4dde-A5A1-60F82A20AEF7}") + fileOpenDialogIID = ole.NewGUID("{d57c7288-d4ad-4768-be02-9d969532d960}") +) + +type iFileOpenDialog struct { + vtbl *iFileOpenDialogVtbl + parentWindowHandle uintptr +} + +type iFileOpenDialogVtbl struct { + iFileDialogVtbl + + GetResults uintptr // func (ppenum **IShellItemArray) HRESULT + GetSelectedItems uintptr +} + +func newIFileOpenDialog() (*iFileOpenDialog, error) { + if unknown, err := ole.CreateInstance(fileOpenDialogCLSID, fileOpenDialogIID); err == nil { + return (*iFileOpenDialog)(unsafe.Pointer(unknown)), nil + } else { + return nil, err + } +} + +func (fileOpenDialog *iFileOpenDialog) Show() error { + return fileOpenDialog.vtbl.show(unsafe.Pointer(fileOpenDialog), fileOpenDialog.parentWindowHandle) +} + +func (fileOpenDialog *iFileOpenDialog) SetParentWindowHandle(hwnd uintptr) { + fileOpenDialog.parentWindowHandle = hwnd +} + +func (fileOpenDialog *iFileOpenDialog) ShowAndGetResult() (string, error) { + isMultiselect, err := fileOpenDialog.isMultiselect() + if err != nil { + return "", err + } + if isMultiselect { + // We should panic as this error is caused by the developer using the library + panic("use ShowAndGetResults for open multiple files dialog") + } + if err := fileOpenDialog.Show(); err != nil { + return "", err + } + return fileOpenDialog.GetResult() +} + +func (fileOpenDialog *iFileOpenDialog) ShowAndGetResults() ([]string, error) { + isMultiselect, err := fileOpenDialog.isMultiselect() + if err != nil { + return nil, err + } + if !isMultiselect { + // We should panic as this error is caused by the developer using the library + panic("use ShowAndGetResult for open single file dialog") + } + if err := fileOpenDialog.Show(); err != nil { + return nil, err + } + return fileOpenDialog.GetResults() +} + +func (fileOpenDialog *iFileOpenDialog) SetTitle(title string) error { + return fileOpenDialog.vtbl.setTitle(unsafe.Pointer(fileOpenDialog), title) +} + +func (fileOpenDialog *iFileOpenDialog) GetResult() (string, error) { + isMultiselect, err := fileOpenDialog.isMultiselect() + if err != nil { + return "", err + } + if isMultiselect { + // We should panic as this error is caused by the developer using the library + panic("use GetResults for open multiple files dialog") + } + return fileOpenDialog.vtbl.getResultString(unsafe.Pointer(fileOpenDialog)) +} + +func (fileOpenDialog *iFileOpenDialog) Release() error { + return fileOpenDialog.vtbl.release(unsafe.Pointer(fileOpenDialog)) +} + +func (fileOpenDialog *iFileOpenDialog) SetDefaultFolder(defaultFolderPath string) error { + return fileOpenDialog.vtbl.setDefaultFolder(unsafe.Pointer(fileOpenDialog), defaultFolderPath) +} + +func (fileOpenDialog *iFileOpenDialog) SetFolder(defaultFolderPath string) error { + return fileOpenDialog.vtbl.setFolder(unsafe.Pointer(fileOpenDialog), defaultFolderPath) +} + +func (fileOpenDialog *iFileOpenDialog) SetFileFilters(filter []FileFilter) error { + return fileOpenDialog.vtbl.setFileTypes(unsafe.Pointer(fileOpenDialog), filter) +} + +func (fileOpenDialog *iFileOpenDialog) SetRole(role string) error { + return fileOpenDialog.vtbl.setClientGuid(unsafe.Pointer(fileOpenDialog), util.StringToUUID(role)) +} + +// This should only be callable when the user asks for a multi select because +// otherwise they will be given the Dialog interface which does not expose this function. +func (fileOpenDialog *iFileOpenDialog) GetResults() ([]string, error) { + isMultiselect, err := fileOpenDialog.isMultiselect() + if err != nil { + return nil, err + } + if !isMultiselect { + // We should panic as this error is caused by the developer using the library + panic("use GetResult for open single file dialog") + } + return fileOpenDialog.vtbl.getResultsStrings(unsafe.Pointer(fileOpenDialog)) +} + +func (fileOpenDialog *iFileOpenDialog) SetDefaultExtension(defaultExtension string) error { + return fileOpenDialog.vtbl.setDefaultExtension(unsafe.Pointer(fileOpenDialog), defaultExtension) +} + +func (fileOpenDialog *iFileOpenDialog) SetFileName(initialFileName string) error { + return fileOpenDialog.vtbl.setFileName(unsafe.Pointer(fileOpenDialog), initialFileName) +} + +func (fileOpenDialog *iFileOpenDialog) SetSelectedFileFilterIndex(index uint) error { + return fileOpenDialog.vtbl.setSelectedFileFilterIndex(unsafe.Pointer(fileOpenDialog), index) +} + +func (fileOpenDialog *iFileOpenDialog) setPickFolders(pickFolders bool) error { + const FosPickfolders = 0x20 + if pickFolders { + return fileOpenDialog.vtbl.addOption(unsafe.Pointer(fileOpenDialog), FosPickfolders) + } else { + return fileOpenDialog.vtbl.removeOption(unsafe.Pointer(fileOpenDialog), FosPickfolders) + } +} + +const FosAllowMultiselect = 0x200 + +func (fileOpenDialog *iFileOpenDialog) isMultiselect() (bool, error) { + options, err := fileOpenDialog.vtbl.getOptions(unsafe.Pointer(fileOpenDialog)) + if err != nil { + return false, err + } + return options&FosAllowMultiselect != 0, nil +} + +func (fileOpenDialog *iFileOpenDialog) setIsMultiselect(isMultiselect bool) error { + if isMultiselect { + return fileOpenDialog.vtbl.addOption(unsafe.Pointer(fileOpenDialog), FosAllowMultiselect) + } else { + return fileOpenDialog.vtbl.removeOption(unsafe.Pointer(fileOpenDialog), FosAllowMultiselect) + } +} + +func (vtbl *iFileOpenDialogVtbl) getResults(objPtr unsafe.Pointer) (*iShellItemArray, error) { + var shellItemArray *iShellItemArray + ret, _, _ := syscall.Syscall(vtbl.GetResults, + 1, + uintptr(objPtr), + uintptr(unsafe.Pointer(&shellItemArray)), + 0) + return shellItemArray, hresultToError(ret) +} + +func (vtbl *iFileOpenDialogVtbl) getResultsStrings(objPtr unsafe.Pointer) ([]string, error) { + shellItemArray, err := vtbl.getResults(objPtr) + if err != nil { + return nil, err + } + if shellItemArray == nil { + return nil, ErrorCancelled + } + defer shellItemArray.vtbl.release(unsafe.Pointer(shellItemArray)) + count, err := shellItemArray.vtbl.getCount(unsafe.Pointer(shellItemArray)) + if err != nil { + return nil, err + } + var results []string + for i := uintptr(0); i < count; i++ { + newItem, err := shellItemArray.vtbl.getItemAt(unsafe.Pointer(shellItemArray), i) + if err != nil { + return nil, err + } + results = append(results, newItem) + } + return results, nil +} diff --git a/vendor/github.com/leaanthony/go-common-file-dialog/cfd/iFileSaveDialog.go b/vendor/github.com/leaanthony/go-common-file-dialog/cfd/iFileSaveDialog.go new file mode 100644 index 0000000..b3d81a9 --- /dev/null +++ b/vendor/github.com/leaanthony/go-common-file-dialog/cfd/iFileSaveDialog.go @@ -0,0 +1,92 @@ +// +build windows + +package cfd + +import ( + "github.com/go-ole/go-ole" + "github.com/leaanthony/go-common-file-dialog/util" + "unsafe" +) + +var ( + saveFileDialogCLSID = ole.NewGUID("{C0B4E2F3-BA21-4773-8DBA-335EC946EB8B}") + saveFileDialogIID = ole.NewGUID("{84bccd23-5fde-4cdb-aea4-af64b83d78ab}") +) + +type iFileSaveDialog struct { + vtbl *iFileSaveDialogVtbl + parentWindowHandle uintptr +} + +type iFileSaveDialogVtbl struct { + iFileDialogVtbl + + SetSaveAsItem uintptr + SetProperties uintptr + SetCollectedProperties uintptr + GetProperties uintptr + ApplyProperties uintptr +} + +func newIFileSaveDialog() (*iFileSaveDialog, error) { + if unknown, err := ole.CreateInstance(saveFileDialogCLSID, saveFileDialogIID); err == nil { + return (*iFileSaveDialog)(unsafe.Pointer(unknown)), nil + } else { + return nil, err + } +} + +func (fileSaveDialog *iFileSaveDialog) Show() error { + return fileSaveDialog.vtbl.show(unsafe.Pointer(fileSaveDialog), fileSaveDialog.parentWindowHandle) +} + +func (fileSaveDialog *iFileSaveDialog) SetParentWindowHandle(hwnd uintptr) { + fileSaveDialog.parentWindowHandle = hwnd +} + +func (fileSaveDialog *iFileSaveDialog) ShowAndGetResult() (string, error) { + if err := fileSaveDialog.Show(); err != nil { + return "", err + } + return fileSaveDialog.GetResult() +} + +func (fileSaveDialog *iFileSaveDialog) SetTitle(title string) error { + return fileSaveDialog.vtbl.setTitle(unsafe.Pointer(fileSaveDialog), title) +} + +func (fileSaveDialog *iFileSaveDialog) GetResult() (string, error) { + return fileSaveDialog.vtbl.getResultString(unsafe.Pointer(fileSaveDialog)) +} + +func (fileSaveDialog *iFileSaveDialog) Release() error { + return fileSaveDialog.vtbl.release(unsafe.Pointer(fileSaveDialog)) +} + +func (fileSaveDialog *iFileSaveDialog) SetDefaultFolder(defaultFolderPath string) error { + return fileSaveDialog.vtbl.setDefaultFolder(unsafe.Pointer(fileSaveDialog), defaultFolderPath) +} + +func (fileSaveDialog *iFileSaveDialog) SetFolder(defaultFolderPath string) error { + return fileSaveDialog.vtbl.setFolder(unsafe.Pointer(fileSaveDialog), defaultFolderPath) +} + +func (fileSaveDialog *iFileSaveDialog) SetFileFilters(filter []FileFilter) error { + return fileSaveDialog.vtbl.setFileTypes(unsafe.Pointer(fileSaveDialog), filter) +} + +func (fileSaveDialog *iFileSaveDialog) SetRole(role string) error { + return fileSaveDialog.vtbl.setClientGuid(unsafe.Pointer(fileSaveDialog), util.StringToUUID(role)) +} + +func (fileSaveDialog *iFileSaveDialog) SetDefaultExtension(defaultExtension string) error { + return fileSaveDialog.vtbl.setDefaultExtension(unsafe.Pointer(fileSaveDialog), defaultExtension) +} + +func (fileSaveDialog *iFileSaveDialog) SetFileName(initialFileName string) error { + return fileSaveDialog.vtbl.setFileName(unsafe.Pointer(fileSaveDialog), initialFileName) +} + +func (fileSaveDialog *iFileSaveDialog) SetSelectedFileFilterIndex(index uint) error { + return fileSaveDialog.vtbl.setSelectedFileFilterIndex(unsafe.Pointer(fileSaveDialog), index) +} diff --git a/vendor/github.com/leaanthony/go-common-file-dialog/cfd/iShellItem.go b/vendor/github.com/leaanthony/go-common-file-dialog/cfd/iShellItem.go new file mode 100644 index 0000000..9251303 --- /dev/null +++ b/vendor/github.com/leaanthony/go-common-file-dialog/cfd/iShellItem.go @@ -0,0 +1,52 @@ +// +build windows + +package cfd + +import ( + "github.com/go-ole/go-ole" + "syscall" + "unsafe" +) + +var ( + procSHCreateItemFromParsingName = syscall.NewLazyDLL("Shell32.dll").NewProc("SHCreateItemFromParsingName") + iidShellItem = ole.NewGUID("43826d1e-e718-42ee-bc55-a1e261c37bfe") +) + +type iShellItem struct { + vtbl *iShellItemVtbl +} + +type iShellItemVtbl struct { + iUnknownVtbl + BindToHandler uintptr + GetParent uintptr + GetDisplayName uintptr // func (sigdnName SIGDN, ppszName *LPWSTR) HRESULT + GetAttributes uintptr + Compare uintptr +} + +func newIShellItem(path string) (*iShellItem, error) { + var shellItem *iShellItem + pathPtr := ole.SysAllocString(path) + ret, _, _ := procSHCreateItemFromParsingName.Call( + uintptr(unsafe.Pointer(pathPtr)), + 0, + uintptr(unsafe.Pointer(iidShellItem)), + uintptr(unsafe.Pointer(&shellItem))) + return shellItem, hresultToError(ret) +} + +func (vtbl *iShellItemVtbl) getDisplayName(objPtr unsafe.Pointer) (string, error) { + var ptr *uint16 + ret, _, _ := syscall.Syscall(vtbl.GetDisplayName, + 2, + uintptr(objPtr), + 0x80058000, // SIGDN_FILESYSPATH + uintptr(unsafe.Pointer(&ptr))) + if err := hresultToError(ret); err != nil { + return "", err + } + defer ole.CoTaskMemFree(uintptr(unsafe.Pointer(ptr))) + return ole.LpOleStrToString(ptr), nil +} diff --git a/vendor/github.com/leaanthony/go-common-file-dialog/cfd/iShellItemArray.go b/vendor/github.com/leaanthony/go-common-file-dialog/cfd/iShellItemArray.go new file mode 100644 index 0000000..1f59441 --- /dev/null +++ b/vendor/github.com/leaanthony/go-common-file-dialog/cfd/iShellItemArray.go @@ -0,0 +1,66 @@ +//+build windows + +package cfd + +import ( + "github.com/go-ole/go-ole" + "syscall" + "unsafe" +) + +const ( + iidShellItemArrayGUID = "{b63ea76d-1f85-456f-a19c-48159efa858b}" +) + +var ( + iidShellItemArray *ole.GUID +) + +func init() { + iidShellItemArray, _ = ole.IIDFromString(iidShellItemArrayGUID) +} + +type iShellItemArray struct { + vtbl *iShellItemArrayVtbl +} + +type iShellItemArrayVtbl struct { + iUnknownVtbl + BindToHandler uintptr + GetPropertyStore uintptr + GetPropertyDescriptionList uintptr + GetAttributes uintptr + GetCount uintptr // func (pdwNumItems *DWORD) HRESULT + GetItemAt uintptr // func (dwIndex DWORD, ppsi **IShellItem) HRESULT + EnumItems uintptr +} + +func (vtbl *iShellItemArrayVtbl) getCount(objPtr unsafe.Pointer) (uintptr, error) { + var count uintptr + ret, _, _ := syscall.Syscall(vtbl.GetCount, + 1, + uintptr(objPtr), + uintptr(unsafe.Pointer(&count)), + 0) + if err := hresultToError(ret); err != nil { + return 0, err + } + return count, nil +} + +func (vtbl *iShellItemArrayVtbl) getItemAt(objPtr unsafe.Pointer, index uintptr) (string, error) { + var shellItem *iShellItem + ret, _, _ := syscall.Syscall(vtbl.GetItemAt, + 2, + uintptr(objPtr), + index, + uintptr(unsafe.Pointer(&shellItem))) + if err := hresultToError(ret); err != nil { + return "", err + } + if shellItem == nil { + return "", ErrorCancelled + } + defer shellItem.vtbl.release(unsafe.Pointer(shellItem)) + return shellItem.vtbl.getDisplayName(unsafe.Pointer(shellItem)) +} diff --git a/vendor/github.com/leaanthony/go-common-file-dialog/cfd/vtblCommon.go b/vendor/github.com/leaanthony/go-common-file-dialog/cfd/vtblCommon.go new file mode 100644 index 0000000..da95d83 --- /dev/null +++ b/vendor/github.com/leaanthony/go-common-file-dialog/cfd/vtblCommon.go @@ -0,0 +1,47 @@ +// +build windows + +package cfd + +type comDlgFilterSpec struct { + pszName *int16 + pszSpec *int16 +} + +type iUnknownVtbl struct { + QueryInterface uintptr + AddRef uintptr + Release uintptr +} + +type iModalWindowVtbl struct { + iUnknownVtbl + Show uintptr // func (hwndOwner HWND) HRESULT +} + +type iFileDialogVtbl struct { + iModalWindowVtbl + SetFileTypes uintptr // func (cFileTypes UINT, rgFilterSpec *COMDLG_FILTERSPEC) HRESULT + SetFileTypeIndex uintptr // func(iFileType UINT) HRESULT + GetFileTypeIndex uintptr + Advise uintptr + Unadvise uintptr + SetOptions uintptr // func (fos FILEOPENDIALOGOPTIONS) HRESULT + GetOptions uintptr // func (pfos *FILEOPENDIALOGOPTIONS) HRESULT + SetDefaultFolder uintptr // func (psi *IShellItem) HRESULT + SetFolder uintptr // func (psi *IShellItem) HRESULT + GetFolder uintptr + GetCurrentSelection uintptr + SetFileName uintptr // func (pszName LPCWSTR) HRESULT + GetFileName uintptr + SetTitle uintptr // func(pszTitle LPCWSTR) HRESULT + SetOkButtonLabel uintptr + SetFileNameLabel uintptr + GetResult uintptr // func (ppsi **IShellItem) HRESULT + AddPlace uintptr + SetDefaultExtension uintptr // func (pszDefaultExtension LPCWSTR) HRESULT + // This can only be used from a callback. + Close uintptr + SetClientGuid uintptr // func (guid REFGUID) HRESULT + ClearClientData uintptr + SetFilter uintptr +} diff --git a/vendor/github.com/leaanthony/go-common-file-dialog/cfd/vtblCommonFunc.go b/vendor/github.com/leaanthony/go-common-file-dialog/cfd/vtblCommonFunc.go new file mode 100644 index 0000000..27b85ef --- /dev/null +++ b/vendor/github.com/leaanthony/go-common-file-dialog/cfd/vtblCommonFunc.go @@ -0,0 +1,226 @@ +// +build windows + +package cfd + +import ( + "fmt" + "github.com/go-ole/go-ole" + "strings" + "syscall" + "unsafe" +) + +func hresultToError(hr uintptr) error { + if hr < 0 { + return ole.NewError(hr) + } + return nil +} + +func (vtbl *iUnknownVtbl) release(objPtr unsafe.Pointer) error { + ret, _, _ := syscall.Syscall(vtbl.Release, + 0, + uintptr(objPtr), + 0, + 0) + return hresultToError(ret) +} + +func (vtbl *iModalWindowVtbl) show(objPtr unsafe.Pointer, hwnd uintptr) error { + ret, _, _ := syscall.Syscall(vtbl.Show, + 1, + uintptr(objPtr), + hwnd, + 0) + return hresultToError(ret) +} + +func (vtbl *iFileDialogVtbl) setFileTypes(objPtr unsafe.Pointer, filters []FileFilter) error { + cFileTypes := len(filters) + if cFileTypes < 0 { + return fmt.Errorf("must specify at least one filter") + } + comDlgFilterSpecs := make([]comDlgFilterSpec, cFileTypes) + for i := 0; i < cFileTypes; i++ { + filter := &filters[i] + comDlgFilterSpecs[i] = comDlgFilterSpec{ + pszName: ole.SysAllocString(filter.DisplayName), + pszSpec: ole.SysAllocString(filter.Pattern), + } + } + ret, _, _ := syscall.Syscall(vtbl.SetFileTypes, + 2, + uintptr(objPtr), + uintptr(cFileTypes), + uintptr(unsafe.Pointer(&comDlgFilterSpecs[0]))) + return hresultToError(ret) +} + +// Options are: +// FOS_OVERWRITEPROMPT = 0x2, +// FOS_STRICTFILETYPES = 0x4, +// FOS_NOCHANGEDIR = 0x8, +// FOS_PICKFOLDERS = 0x20, +// FOS_FORCEFILESYSTEM = 0x40, +// FOS_ALLNONSTORAGEITEMS = 0x80, +// FOS_NOVALIDATE = 0x100, +// FOS_ALLOWMULTISELECT = 0x200, +// FOS_PATHMUSTEXIST = 0x800, +// FOS_FILEMUSTEXIST = 0x1000, +// FOS_CREATEPROMPT = 0x2000, +// FOS_SHAREAWARE = 0x4000, +// FOS_NOREADONLYRETURN = 0x8000, +// FOS_NOTESTFILECREATE = 0x10000, +// FOS_HIDEMRUPLACES = 0x20000, +// FOS_HIDEPINNEDPLACES = 0x40000, +// FOS_NODEREFERENCELINKS = 0x100000, +// FOS_OKBUTTONNEEDSINTERACTION = 0x200000, +// FOS_DONTADDTORECENT = 0x2000000, +// FOS_FORCESHOWHIDDEN = 0x10000000, +// FOS_DEFAULTNOMINIMODE = 0x20000000, +// FOS_FORCEPREVIEWPANEON = 0x40000000, +// FOS_SUPPORTSTREAMABLEITEMS = 0x80000000 +func (vtbl *iFileDialogVtbl) setOptions(objPtr unsafe.Pointer, options uint32) error { + ret, _, _ := syscall.Syscall(vtbl.SetOptions, + 1, + uintptr(objPtr), + uintptr(options), + 0) + return hresultToError(ret) +} + +func (vtbl *iFileDialogVtbl) getOptions(objPtr unsafe.Pointer) (uint32, error) { + var options uint32 + ret, _, _ := syscall.Syscall(vtbl.GetOptions, + 1, + uintptr(objPtr), + uintptr(unsafe.Pointer(&options)), + 0) + return options, hresultToError(ret) +} + +func (vtbl *iFileDialogVtbl) addOption(objPtr unsafe.Pointer, option uint32) error { + if options, err := vtbl.getOptions(objPtr); err == nil { + return vtbl.setOptions(objPtr, options|option) + } else { + return err + } +} + +func (vtbl *iFileDialogVtbl) removeOption(objPtr unsafe.Pointer, option uint32) error { + if options, err := vtbl.getOptions(objPtr); err == nil { + return vtbl.setOptions(objPtr, options&^option) + } else { + return err + } +} + +func (vtbl *iFileDialogVtbl) setDefaultFolder(objPtr unsafe.Pointer, path string) error { + shellItem, err := newIShellItem(path) + if err != nil { + return err + } + defer shellItem.vtbl.release(unsafe.Pointer(shellItem)) + ret, _, _ := syscall.Syscall(vtbl.SetDefaultFolder, + 1, + uintptr(objPtr), + uintptr(unsafe.Pointer(shellItem)), + 0) + return hresultToError(ret) +} + +func (vtbl *iFileDialogVtbl) setFolder(objPtr unsafe.Pointer, path string) error { + shellItem, err := newIShellItem(path) + if err != nil { + return err + } + defer shellItem.vtbl.release(unsafe.Pointer(shellItem)) + ret, _, _ := syscall.Syscall(vtbl.SetFolder, + 1, + uintptr(objPtr), + uintptr(unsafe.Pointer(shellItem)), + 0) + return hresultToError(ret) +} + +func (vtbl *iFileDialogVtbl) setTitle(objPtr unsafe.Pointer, title string) error { + titlePtr := ole.SysAllocString(title) + ret, _, _ := syscall.Syscall(vtbl.SetTitle, + 1, + uintptr(objPtr), + uintptr(unsafe.Pointer(titlePtr)), + 0) + return hresultToError(ret) +} + +func (vtbl *iFileDialogVtbl) close(objPtr unsafe.Pointer) error { + ret, _, _ := syscall.Syscall(vtbl.Close, + 1, + uintptr(objPtr), + 0, + 0) + return hresultToError(ret) +} + +func (vtbl *iFileDialogVtbl) getResult(objPtr unsafe.Pointer) (*iShellItem, error) { + var shellItem *iShellItem + ret, _, _ := syscall.Syscall(vtbl.GetResult, + 1, + uintptr(objPtr), + uintptr(unsafe.Pointer(&shellItem)), + 0) + return shellItem, hresultToError(ret) +} + +func (vtbl *iFileDialogVtbl) getResultString(objPtr unsafe.Pointer) (string, error) { + shellItem, err := vtbl.getResult(objPtr) + if err != nil { + return "", err + } + if shellItem == nil { + return "", ErrorCancelled + } + defer shellItem.vtbl.release(unsafe.Pointer(shellItem)) + return shellItem.vtbl.getDisplayName(unsafe.Pointer(shellItem)) +} + +func (vtbl *iFileDialogVtbl) setClientGuid(objPtr unsafe.Pointer, guid *ole.GUID) error { + ret, _, _ := syscall.Syscall(vtbl.SetClientGuid, + 1, + uintptr(objPtr), + uintptr(unsafe.Pointer(guid)), + 0) + return hresultToError(ret) +} + +func (vtbl *iFileDialogVtbl) setDefaultExtension(objPtr unsafe.Pointer, defaultExtension string) error { + if defaultExtension[0] == '.' { + defaultExtension = strings.TrimPrefix(defaultExtension, ".") + } + defaultExtensionPtr := ole.SysAllocString(defaultExtension) + ret, _, _ := syscall.Syscall(vtbl.SetDefaultExtension, + 1, + uintptr(objPtr), + uintptr(unsafe.Pointer(defaultExtensionPtr)), + 0) + return hresultToError(ret) +} + +func (vtbl *iFileDialogVtbl) setFileName(objPtr unsafe.Pointer, fileName string) error { + fileNamePtr := ole.SysAllocString(fileName) + ret, _, _ := syscall.Syscall(vtbl.SetFileName, + 1, + uintptr(objPtr), + uintptr(unsafe.Pointer(fileNamePtr)), + 0) + return hresultToError(ret) +} + +func (vtbl *iFileDialogVtbl) setSelectedFileFilterIndex(objPtr unsafe.Pointer, index uint) error { + ret, _, _ := syscall.Syscall(vtbl.SetFileTypeIndex, + 1, + uintptr(objPtr), + uintptr(index+1), // SetFileTypeIndex counts from 1 + 0) + return hresultToError(ret) +} diff --git a/vendor/github.com/leaanthony/go-common-file-dialog/util/util.go b/vendor/github.com/leaanthony/go-common-file-dialog/util/util.go new file mode 100644 index 0000000..723fbed --- /dev/null +++ b/vendor/github.com/leaanthony/go-common-file-dialog/util/util.go @@ -0,0 +1,10 @@ +package util + +import ( + "github.com/go-ole/go-ole" + "github.com/google/uuid" +) + +func StringToUUID(str string) *ole.GUID { + return ole.NewGUID(uuid.NewSHA1(uuid.Nil, []byte(str)).String()) +} diff --git a/vendor/github.com/leaanthony/idgen/.gitignore b/vendor/github.com/leaanthony/idgen/.gitignore new file mode 100644 index 0000000..a09c56d --- /dev/null +++ b/vendor/github.com/leaanthony/idgen/.gitignore @@ -0,0 +1 @@ +/.idea diff --git a/vendor/github.com/leaanthony/idgen/LICENSE b/vendor/github.com/leaanthony/idgen/LICENSE new file mode 100644 index 0000000..f2f37a2 --- /dev/null +++ b/vendor/github.com/leaanthony/idgen/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021-Present Lea Anthony + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/leaanthony/idgen/README.md b/vendor/github.com/leaanthony/idgen/README.md new file mode 100644 index 0000000..edfec25 --- /dev/null +++ b/vendor/github.com/leaanthony/idgen/README.md @@ -0,0 +1,50 @@ +# idgen + +`idgen` only does 1 thing: generates unique uints. IDs may be released so they can be reused. It can provide "MaxUint" unique IDs. + +## Why did you make this? + +I needed a way of generating a load of IDs for Windows Menus & MenuItems. They will sometimes need to be regenerated and thus the IDs +would need recalculating. Whilst it was probably ok to just increment a counter, I needed a way to guarantee that some long running +process wasn't going to hit that upper limit and screw up the application. + +## Installation + +`go get github.com/leaanthony/idgen` + +## Usage + +```go +package main + +import "github.com/leaanthony/idgen" + +func main() { + + // Create a new generator + generator := idgen.New() + + // Get an ID + id, err := generator.NewID() + if err != nil { + // We have run out of available IDs + } + + limited := generator.NewWithMaximum(1) + + // Get the only ID available + id, err = limited.NewID() + // err == nil + + // Get another when no more are available + _, err = limited.NewID() + // err != nil + + // Release the id we had + limited.ReleaseID(id) + + // Now we can get the ID again + id, err = limited.NewID() + // err == nil +} +``` diff --git a/vendor/github.com/leaanthony/idgen/go.mod b/vendor/github.com/leaanthony/idgen/go.mod new file mode 100644 index 0000000..4fd0740 --- /dev/null +++ b/vendor/github.com/leaanthony/idgen/go.mod @@ -0,0 +1,5 @@ +module github.com/leaanthony/idgen + +go 1.16 + +require github.com/matryer/is v1.4.0 diff --git a/vendor/github.com/leaanthony/idgen/go.sum b/vendor/github.com/leaanthony/idgen/go.sum new file mode 100644 index 0000000..ddd6bbf --- /dev/null +++ b/vendor/github.com/leaanthony/idgen/go.sum @@ -0,0 +1,2 @@ +github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE= +github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= diff --git a/vendor/github.com/leaanthony/idgen/idgen.go b/vendor/github.com/leaanthony/idgen/idgen.go new file mode 100644 index 0000000..ef501ac --- /dev/null +++ b/vendor/github.com/leaanthony/idgen/idgen.go @@ -0,0 +1,57 @@ +package idgen + +import ( + "errors" +) + +//Generator generates unique IDs (uint) +type Generator struct { + counter uint + usedIDs map[uint]struct{} + maximum uint +} + +//New creates a new ID (uint) Generator +func New() *Generator { + return &Generator{ + usedIDs: make(map[uint]struct{}), + maximum: ^uint(0), // MaxUInt + } +} + +// NewWithMaximum creates a new ID (uint) Generator with +// a maximum number of unique IDs that may be generated +func NewWithMaximum(maximum uint) *Generator { + return &Generator{ + usedIDs: make(map[uint]struct{}), + maximum: maximum, + } +} + +// NewID returns an ID that has not been previously issued. +// Returns an error if all available IDs have been issued. +func (g *Generator) NewID() (uint, error) { + + startID := g.counter + for { + _, exists := g.usedIDs[g.counter] + if !exists { + g.usedIDs[g.counter] = struct{}{} + return g.counter, nil + } + g.counter++ + // Wrap at max size + if g.counter >= g.maximum { + g.counter = 0 + } + // Check if we have looped + if g.counter == startID { + return 0, errors.New("maximum number of unique IDs generated") + } + } +} + +// ReleaseID frees up the given ID so that it may be reused +func (g *Generator) ReleaseID(ID uint) { + delete(g.usedIDs, ID) +} diff --git a/vendor/github.com/leaanthony/spinner/.gitignore b/vendor/github.com/leaanthony/spinner/.gitignore deleted file mode 100644 index 1ebb4fa..0000000 --- a/vendor/github.com/leaanthony/spinner/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -example/example -/example/example.exe -/.vscode -/vendor \ No newline at end of file diff --git a/vendor/github.com/leaanthony/spinner/LICENSE b/vendor/github.com/leaanthony/spinner/LICENSE deleted file mode 100644 index 7e01c45..0000000 --- a/vendor/github.com/leaanthony/spinner/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2018 Lea Anthony - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/leaanthony/spinner/README.md b/vendor/github.com/leaanthony/spinner/README.md deleted file mode 100644 index ca0037d..0000000 --- a/vendor/github.com/leaanthony/spinner/README.md +++ /dev/null @@ -1,214 +0,0 @@ -# Spinner - -A simple, configurable, multi-platform terminal spinner. - -[![MIT license](https://img.shields.io/badge/License-MIT-blue.svg)](https://github.com/leaanthony/spinner/blob/master/LICENSE) -[![GitHub version](https://badge.fury.io/gh/leaanthony%2Fspinner.svg)](https://github.com/leaanthony/spinner) -[![Go Report Card](https://goreportcard.com/badge/github.com/leaanthony/spinner)](https://goreportcard.com/report/github.com/leaanthony/spinner) -[![Godoc Reference](https://godoc.org/github.com/leaanthony/spinner?status.svg)](http://godoc.org/github.com/leaanthony/spinner) -[![contributions welcome](https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat)](https://github.com/leaanthony/spinner/issues) -## Demo -![demo](spinner_mac.gif) - -Spinner running on a Mac. See the [Linux](#linux-demo) and [Windows](#windows-demo) demos. - -## About - -Spinner is for giving the user visual feedback during processing in command line apps. It has the following features: - - * Works cross-platform - * Completely customisable (messages, symbols, spinners) - * Sensible defaults for non-VT100 systems - * Smoooothe! (no ghost cursors, minimal text updates) - * Minimal memory allocation (Reusable spinner) - * Graceful handling of Ctrl-C interrupts - -Tested on: - - * Windows 10 - * MacOS 10.13.5 - * Ubuntu 18.04 LTS - -## Installation - -``` -go get -u github.com/leaanthony/spinner -``` - -## Usage - -### New Spinner - -Spinners are created using New(optionalMessage string), which takes an optional message to display. - -``` - myspinner := spinner.New("Processing images") -``` -or -``` - myspinner := spinner.New() -``` - -### Starting the spinner - -To start the spinner, simply call Start(optionalMessage string). If the optional message is passed, it will be used as the spinner message. - -``` - myspinner := spinner.New("Processing images") - myspinner.Start() -``` -is equivalent to -``` - myspinner := spinner.New() - myspinner.Start("Processing images") -``` -It's possible to reuse an existing spinner by calling Start() on a spinner that has been previously stopped with Error() or Success(). - -## Updating the spinner message - -The spinner message can be updated with UpdateMessage(string) whilst running. - -``` - myspinner := spinner.New() - myspinner.Start("Processing images") - time.Sleep(time.Second * 2) - myspinner.UpdateMessage("Adding funny text") - time.Sleep(time.Second * 2) - myspinner.Success("Your memes are ready") -``` - -### Stop with Success - -To stop the spinner and indicate successful completion, call the Success(optionalMessage string) method. This will print a success symbol with the original message - all in green. If the optional string is given, it will be used instead of the original message. - -``` - // Default - myspinner := spinner.New("Processing images") - myspinner.Start() - time.Sleep(time.Second * 2) - myspinner.Success() - - // Custom Message - myspinner := spinner.New("Processing audio") - myspinner.Start() - time.Sleep(time.Second * 2) - myspinner.Success("It took a while, but that was successful!") -``` - -### Stop with Error - -To stop the spinner and indicate an error, call the Error(optionalMessage string) method. -This has the same functionality as Success(), but will print an error symbol and it will all be in red. - -``` - // Default - myspinner := spinner.New("Processing images") - myspinner.Start() - time.Sleep(time.Second * 2) - myspinner.Error() - - // Custom message - myspinner := spinner.New("Processing audio") - myspinner.Start() - time.Sleep(time.Second * 2) - myspinner.Error("Too many lolcats!") -``` - -### Success/Error using custom formatter - -In addition to Success() and Error(), there is Successf() and Errorf(). Both take the same parameters: (format string, args ...interface{}). This is identical to fmt.Sprintf (which it uses under the hood). - -``` - // Formatted Success - a = spinner.New("This is a formatted custom success message") - a.Start() - time.Sleep(time.Second * 2) - spin := "Spinner" - awesome := "Awesome" - a.Successf("%s is %s!", spin, awesome) - - // Formatted Error - a = spinner.New("This is a formatted custom error message") - a.Start() - secs := 2 - time.Sleep(time.Second * time.Duration(secs)) - a.Errorf("I waited %d seconds to error!", secs) -``` - -### Custom Success/Error Symbols - -Both Success() and Error() use symbols (as well as colour) to indicate their status. -These symbols default to spaces on Windows and ✓ & ✗ on other (vt100 compatible) platforms. They can be set manually using the SetSuccessSymbol(symbol string) and SetErrorSymbol(symbol string) methods. - -``` - myspinner := spinner.New("Processing images") - - // Custom symbols - myspinner.SetErrorSymbol("💩") - myspinner.SetSuccessSymbol("🏆") - - myspinner.Start() - time.Sleep(time.Second * 2) - myspinner.Error("It broke :(") -``` - -### Custom Spinner - -By default, the spinner used is the spinning bar animation on Windows and the snake animation for other platforms. This can be customised using SetSpinFrames(frames []string). It takes a slice of strings defining the spinner symbols. - -``` - myspinner := spinner.New("Processing images") - myspinner.SetSpinFrames([]string{"^", ">", "v", "<"}) - myspinner.Start() - time.Sleep(time.Second * 2) - myspinner.Success() -``` - -### Resuse Spinner - -It's possible to reuse an existing spinner by calling the Restart(message string) method. This restarts the spinner with the given message. - -``` - myspinner := spinner.New("Processing images") - myspinner.SetSpinFrames([]string{"^", ">", "v", "<"}) - myspinner.Start() - time.Sleep(time.Second * 2) - myspinner.Success() - - myspinner.Restart("Spinner reuse!") - time.Sleep(time.Second * 2) - myspinner.Success() -``` - -## Handling Ctrl-C Interrupts - -By default, Ctrl-C will error out the current spinner with the message "Aborted (ctrl-c)". A custom message can be set using SetAbortMessage(string). - -``` - myspinner := spinner.New("💣 Tick...tick...tick...") - myspinner.SetAbortMessage("Defused!") - myspinner.Start() - time.Sleep(time.Second * 5) - myspinner.Success("💥 Boom!") -``` - -## Rationale - -I tried to find a simple, true cross platform spinner for Go that did what I wanted and couldn't find one. I'm sure they exist, but this was fun. - -## Linux Demo -![demo](spinner_ubuntu.gif) - -## Windows Demo -![demo](spinner_windows.gif) - -## With a little help from my friends - -This project uses the awesome [Color] library. The code for handling windows cursor hiding and showing was split off into a different project ([wincursor]) - -[Color]: https://github.com/fatih/color -[wincursor]: https://github.com/leaanthony/wincursor - ---- -[![Maintenance](https://img.shields.io/badge/Maintained%3F-yes-green.svg)](https://github.com/leaanthony/spinner/graphs/commit-activity) -[![HitCount](http://hits.dwyl.io/leaanthony/spinner.svg)](http://hits.dwyl.io/leaanthony/spinner) diff --git a/vendor/github.com/leaanthony/spinner/RELEASES.md b/vendor/github.com/leaanthony/spinner/RELEASES.md deleted file mode 100644 index 922b761..0000000 --- a/vendor/github.com/leaanthony/spinner/RELEASES.md +++ /dev/null @@ -1,28 +0,0 @@ -# Releases - -## 0.5.0 - WIP -* Trim messages to fit console width - * Attempts to handle console resizes -* Fixed race conditions: Dynamic updates safe - -## 0.4 - 17 July 2018 -Added UpdateMessage(string) -Handle ctrl-c interrupts -Added SetAbortMessage(string) to set message shown on ctrl-c -Updated documentation - -## 0.3 - 15 July 2018 -Made message for New/NewSpinner optional -Start() now takes an optional message -Removed Restart() -Use '>' as defualt success symbol on Windows -Use '!' as defualt error symbol on Windows - -## 0.2.1 - 11 July 2018 -Issue warning if attempting to stop a non-running spinner - -## 0.2 - 10 July 2018 -Added custom Sussess/Error functions: Successf() and Error() - -## 0.1 - 6 July 2018 -Initial Release diff --git a/vendor/github.com/leaanthony/spinner/cursor_vt100.go b/vendor/github.com/leaanthony/spinner/cursor_vt100.go deleted file mode 100644 index 4bcdd19..0000000 --- a/vendor/github.com/leaanthony/spinner/cursor_vt100.go +++ /dev/null @@ -1,23 +0,0 @@ -// +build !windows - -package spinner - -import ( - "fmt" -) - -func init() { - -} - -func showCursor() { - fmt.Printf("\033[?25h") -} - -func hideCursor() { - fmt.Printf("\033[?25l") -} - -func (s *Spinner) clearCurrentLine() { - fmt.Printf("\r\033[0K") -} diff --git a/vendor/github.com/leaanthony/spinner/cursor_windows.go b/vendor/github.com/leaanthony/spinner/cursor_windows.go deleted file mode 100644 index 8e633f6..0000000 --- a/vendor/github.com/leaanthony/spinner/cursor_windows.go +++ /dev/null @@ -1,30 +0,0 @@ -// +build windows - -package spinner - -import ( - "fmt" - - "github.com/leaanthony/wincursor" -) - -func showCursor() { - wincursor.Show() -} - -func hideCursor() { - wincursor.Hide() -} - -func (s *Spinner) clearCurrentLine() { - // *shudder* - fmt.Printf("\r") - - // Get the current line length - var length = len(s.getMessage()) + len(s.getCurrentSpinnerFrame()) + 1 - - for i := 0; i < length; i++ { - fmt.Printf(" ") - } - fmt.Printf("\r") -} diff --git a/vendor/github.com/leaanthony/spinner/go.mod b/vendor/github.com/leaanthony/spinner/go.mod deleted file mode 100644 index f5d45a5..0000000 --- a/vendor/github.com/leaanthony/spinner/go.mod +++ /dev/null @@ -1,10 +0,0 @@ -module github.com/leaanthony/spinner - -require ( - github.com/fatih/color v1.7.0 - github.com/leaanthony/synx v0.1.0 - github.com/leaanthony/wincursor v0.1.0 - github.com/mattn/go-colorable v0.0.9 // indirect - github.com/mattn/go-isatty v0.0.4 - golang.org/x/sys v0.0.0-20181228144115-9a3f9b0469bb // indirect -) diff --git a/vendor/github.com/leaanthony/spinner/go.sum b/vendor/github.com/leaanthony/spinner/go.sum deleted file mode 100644 index 5b4cda9..0000000 --- a/vendor/github.com/leaanthony/spinner/go.sum +++ /dev/null @@ -1,12 +0,0 @@ -github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/leaanthony/synx v0.1.0 h1:R0lmg2w6VMb8XcotOwAe5DLyzwjLrskNkwU7LLWsyL8= -github.com/leaanthony/synx v0.1.0/go.mod h1:Iz7eybeeG8bdq640iR+CwYb8p+9EOsgMWghkSRyZcqs= -github.com/leaanthony/wincursor v0.1.0 h1:Dsyp68QcF5cCs65AMBmxoYNEm0n8K7mMchG6a8fYxf8= -github.com/leaanthony/wincursor v0.1.0/go.mod h1:7TVwwrzSH/2Y9gLOGH+VhA+bZhoWXBRgbGNTMk+yimE= -github.com/mattn/go-colorable v0.0.9 h1:UVL0vNpWh04HeJXV0KLcaT7r06gOH2l4OW6ddYRUIY4= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-isatty v0.0.4 h1:bnP0vzxcAdeI1zdubAl5PjU6zsERjGZb7raWodagDYs= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -golang.org/x/sys v0.0.0-20181228144115-9a3f9b0469bb h1:pf3XwC90UUdNPYWZdFjhGBE7DUFuK3Ct1zWmZ65QN30= -golang.org/x/sys v0.0.0-20181228144115-9a3f9b0469bb/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= diff --git a/vendor/github.com/leaanthony/spinner/spinner.go b/vendor/github.com/leaanthony/spinner/spinner.go deleted file mode 100644 index 1090219..0000000 --- a/vendor/github.com/leaanthony/spinner/spinner.go +++ /dev/null @@ -1,334 +0,0 @@ -// spinner provides visual feedback for command line applications - -package spinner - -import ( - "fmt" - "os" - "os/signal" - "runtime" - "strings" - "time" - - "github.com/fatih/color" - "github.com/leaanthony/synx" - isatty "github.com/mattn/go-isatty" -) - -// Specialise the type -type status int - -// Status code constants. -const ( - errorStatus status = iota - successStatus -) - -// Gets the default spinner frames based on the operating system. -func getDefaultSpinnerFrames() []string { - switch runtime.GOOS { - case "windows": - return []string{"|", "/", "-", "\\"} - default: - return []string{"⣾", "⣽", "⣻", "⢿", "⡿", "⣟", "⣯", "⣷"} - } -} - -// Gets the default status symbols based on the operating system. -func getStatusSymbols() (successSymbol, errorSymbol string) { - switch runtime.GOOS { - case "windows": - return ">", "!" - default: - return "✓", "✗" - } -} - -// Spinner defines our spinner data. -type Spinner struct { - message *synx.String // message to display - stopChan chan struct{} // exit channel - speedUpdated *synx.Bool // Indicates speed has been updated - exitStatus status // Status of exit - successSymbol *synx.String // Symbol printed when Success() called - errorSymbol *synx.String // Symbol printed when Error() called - spinFrames *synx.StringSlice // Spinset frames - frameNumber int // Current frame [default 0] - termWidth *synx.Int // Terminal width - termHeight *synx.Int // Terminal Height - spinSpeed *synx.Int // Delay between spinner updates in milliseconds [default 100ms] - currentLine *synx.String // The current line being displayed - running *synx.Bool // Indicates if the spinner is running - abortMessage *synx.String // Printed when handling ctrl-c interrupt - isTerminal *synx.Bool // Flag indicating if we are outputting to terminal -} - -// NewSpinner creates a new spinner and sets up the default values. -func NewSpinner(optionalMessage ...string) *Spinner { - successSymbol, errorSymbol := getStatusSymbols() - // Blank message by default - message := "" - if len(optionalMessage) > 0 { - message = optionalMessage[0] - } - result := &Spinner{ - message: synx.NewString(message), - stopChan: make(chan struct{}), - speedUpdated: synx.NewBool(true), - successSymbol: synx.NewString(successSymbol), - errorSymbol: synx.NewString(errorSymbol), - spinFrames: synx.NewStringSlice(getDefaultSpinnerFrames()), - spinSpeed: synx.NewInt(100), - termWidth: synx.NewInt(1), - termHeight: synx.NewInt(1), - abortMessage: synx.NewString("Aborted."), - frameNumber: 0, - running: synx.NewBool(false), - isTerminal: synx.NewBool(isatty.IsTerminal(os.Stdout.Fd())), - } - - return result -} - -// New is solely here to make code cleaner for importers. -// EG: spinner.New(...) -func New(message ...string) *Spinner { - return NewSpinner(message...) -} - -// SetSuccessSymbol sets the symbol displayed on success. -func (s *Spinner) SetSuccessSymbol(symbol string) { - s.successSymbol.SetValue(symbol) -} - -// getSuccessSymbol sets the symbol displayed on error. -func (s *Spinner) getSuccessSymbol() string { - return s.successSymbol.GetValue() -} - -// SetErrorSymbol sets the symbol displayed on error. -func (s *Spinner) SetErrorSymbol(symbol string) { - s.errorSymbol.SetValue(symbol) -} - -// getErrorSymbol sets the symbol displayed on error. -func (s *Spinner) getErrorSymbol() (symbol string) { - return s.errorSymbol.GetValue() -} - -// SetSpinFrames makes the spinner use the given characters. -func (s *Spinner) SetSpinFrames(frames []string) { - s.spinFrames.SetValue(frames) -} - -func (s *Spinner) getNextSpinnerFrame() (result string) { - // Check if the current frame is valid. If not, loop to start - s.frameNumber = s.frameNumber % s.spinFrames.Length() - result = s.spinFrames.GetElement(s.frameNumber) - s.frameNumber++ - return -} - -func (s *Spinner) getCurrentSpinnerFrame() (result string) { - s.frameNumber = s.frameNumber % s.spinFrames.Length() - result = s.spinFrames.GetElement(s.frameNumber) - return result -} - -// SetSpinSpeed sets the speed of the spinner animation. -// The lower the value, the faster the spin. -func (s *Spinner) SetSpinSpeed(ms int) { - // Floor to a speed of 1 - if ms < 1 { - ms = 1 - } - s.spinSpeed.SetValue(ms) - s.speedUpdated.SetValue(true) -} - -// getSpinSpeed gets the speed of the spinner animation. -func (s *Spinner) getSpinSpeed() (ms int) { - return s.spinSpeed.GetValue() -} - -// UpdateMessage sets the spinner message. -// Can be flickery if not appending so use with care. -func (s *Spinner) UpdateMessage(message string) { - // Clear line if this isn't an append. - // for smoother screen updates. - if strings.Index(message, s.getMessage()) != 0 { - s.clearCurrentLine() - } - s.setMessage(message) -} - -// SetAbortMessage sets the message that gets printed when -// the user kills the spinners by pressing ctrl-c. -func (s *Spinner) SetAbortMessage(message string) { - s.abortMessage.SetValue(message) -} - -func (s *Spinner) getAbortMessage() string { - return s.abortMessage.GetValue() -} - -func (s *Spinner) setMessage(message string) { - s.message.SetValue(message) -} - -func (s *Spinner) getMessage() string { - return s.message.GetValue() -} - -func (s *Spinner) getRunning() bool { - return s.running.GetValue() -} - -func (s *Spinner) setRunning(value bool) { - s.running.SetValue(value) -} - -func (s *Spinner) printSuccess(message string, args ...interface{}) { - color.HiGreen(message, args...) -} - -// Start the spinner! -func (s *Spinner) Start(optionalMessage ...string) { - - // If we're trying to start an already running spinner, - // add a slight delay and retry. This allows the spinner - // to complete a previous stop command gracefully. - count := 0 - maxCount := 10 - for s.getRunning() == true && count < maxCount { - // - time.Sleep(time.Millisecond * 50) - count++ - } - - // Did we fail? - if count == maxCount { - s.Error("Tried to start a running spinner with message: " + s.getMessage()) - return - } - - // If we have a message, set it - if len(optionalMessage) > 0 { - s.setMessage(optionalMessage[0]) - } - - // make it look tidier. - hideCursor() - - // Store the fact we are now running. - s.setRunning(true) - - // Handle ctrl-c - go func(stopChan chan struct{}) { - sigchan := make(chan os.Signal, 10) - signal.Notify(sigchan, os.Interrupt) - <-sigchan - // Notify and clean up - s.stopChan <- struct{}{} - fmt.Println("") - color.HiRed("\r%s %s", s.getErrorSymbol(), s.getAbortMessage()) - os.Exit(1) - }(s.stopChan) - - // spawn off a goroutine to handle the animation. - go func() { - - ticker := time.NewTicker(time.Millisecond * time.Duration(s.spinSpeed.GetValue())) - - // Let's go! - for { - select { - // For each frame tick - case <-ticker.C: - // Rewind to start of line and print the current frame and message. - // Note: We don't fully clear the line here as this causes flickering. - fmt.Printf("\r") - fmt.Printf("%s %s", s.getNextSpinnerFrame(), s.getMessage()) - - // Do we need to update the ticker? - if s.speedUpdated.GetValue() == true { - ticker.Stop() - ticker = time.NewTicker(time.Millisecond * time.Duration(s.spinSpeed.GetValue())) - } - - // If we get a stop signal - case <-s.stopChan: - - // Store the fact we aren't running - s.setRunning(false) - - // Quit the animation - return - } - } - }() -} - -// stop will stop the spinner. -// The final message will either be the current message -// or the optional, given message. -// Success status will print the message in green. -// Error status will print the message in red. -func (s *Spinner) stop(message ...string) { - - var finalMessage = s.getMessage() - - // If we have an optional message, save it. - if len(message) > 0 { - finalMessage = message[0] - } - - // Ensure we are running before issuing stop signal. - if s.running.GetValue() { - // Issue stop signal to animation. - s.stopChan <- struct{}{} - } - - // Clear the line, because a new message may be shorter than the original. - s.clearCurrentLine() - - // Output the symbol and message depending on the status code. - if s.exitStatus == errorStatus { - color.HiRed("\r%s %s", s.getErrorSymbol(), finalMessage) - } else { - color.HiGreen("\r%s %s", s.getSuccessSymbol(), finalMessage) - } - - // Show the cursor again - showCursor() -} - -// Error stops the spinner and sets the status code to error. -// Optional message to print instead of current message. -func (s *Spinner) Error(message ...string) { - s.exitStatus = errorStatus - s.stop(message...) -} - -// Errorf stops the spinner, formats and sets the status code to error. -// Formats and prints the given message instead of current message. -func (s *Spinner) Errorf(format string, args ...interface{}) { - s.exitStatus = errorStatus - message := fmt.Sprintf(format, args...) - s.stop(message) -} - -// Success stops the spinner and sets the status code to success. -// Optional message to print instead of current message. -func (s *Spinner) Success(message ...string) { - s.exitStatus = successStatus - s.stop(message...) -} - -// Successf stops the spinner, formats and sets the status code to success. -// Formats and prints the given message instead of current message. -func (s *Spinner) Successf(format string, args ...interface{}) { - s.exitStatus = successStatus - message := fmt.Sprintf(format, args...) - s.stop(message) -} diff --git a/vendor/github.com/leaanthony/spinner/spinner_mac.gif b/vendor/github.com/leaanthony/spinner/spinner_mac.gif deleted file mode 100644 index b78e9b3..0000000 Binary files a/vendor/github.com/leaanthony/spinner/spinner_mac.gif and /dev/null differ diff --git a/vendor/github.com/leaanthony/spinner/spinner_ubuntu.gif b/vendor/github.com/leaanthony/spinner/spinner_ubuntu.gif deleted file mode 100644 index f78f8f2..0000000 Binary files a/vendor/github.com/leaanthony/spinner/spinner_ubuntu.gif and /dev/null differ diff --git a/vendor/github.com/leaanthony/spinner/spinner_windows.gif b/vendor/github.com/leaanthony/spinner/spinner_windows.gif deleted file mode 100644 index c143158..0000000 Binary files a/vendor/github.com/leaanthony/spinner/spinner_windows.gif and /dev/null differ diff --git a/vendor/github.com/leaanthony/synx/LICENSE b/vendor/github.com/leaanthony/synx/LICENSE deleted file mode 100644 index 75ba423..0000000 --- a/vendor/github.com/leaanthony/synx/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2018-Present Lea Anthony - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. \ No newline at end of file diff --git a/vendor/github.com/leaanthony/synx/README.md b/vendor/github.com/leaanthony/synx/README.md deleted file mode 100644 index 34822d0..0000000 --- a/vendor/github.com/leaanthony/synx/README.md +++ /dev/null @@ -1,47 +0,0 @@ -# Synx - -Simple wrappers to allow concurrent writes to scalar types. - -## Install - -```go get github.com/leaanthony/synx``` - -## Usage - -Each supported type has a New function, EG NewInt(). This takes an intial value. -Accessing the value is simply through GetValue() and SetValue(). - -### New - -Create a new Synx wrapper for type. - -``` - var a = synx.NewInt(0) -``` - -### GetValue() - -Return the current value of the scalar. - -``` - var b := a.GetValue() -``` - -## SetValue() - -Update the current value of the scalar. - -``` - var c := a.SetValue(100) -``` - -## Lock() / Unlock() - -Enables / Disables the synchronisation locks for the scalar - -``` - c.Lock() - // Perform operations requiring exclusive lock - c.Unlock() -``` - diff --git a/vendor/github.com/leaanthony/synx/bool.go b/vendor/github.com/leaanthony/synx/bool.go deleted file mode 100644 index 979e52d..0000000 --- a/vendor/github.com/leaanthony/synx/bool.go +++ /dev/null @@ -1,30 +0,0 @@ -package synx - -// Bool represents a boolean value -type Bool struct { - locker - value bool -} - -// NewBool creates a new wrapper type for a Bool value -func NewBool(value bool) *Bool { - return &Bool{ - locker: newLock(), - value: value, - } -} - -// SetValue sets the value to the given value -func (s *Bool) SetValue(value bool) { - s.Lock() - s.value = value - s.Unlock() -} - -// GetValue returns the current value -func (s *Bool) GetValue() (value bool) { - s.Lock() - value = s.value - s.Unlock() - return -} diff --git a/vendor/github.com/leaanthony/synx/go.mod b/vendor/github.com/leaanthony/synx/go.mod deleted file mode 100644 index 9ffbb31..0000000 --- a/vendor/github.com/leaanthony/synx/go.mod +++ /dev/null @@ -1 +0,0 @@ -module github.com/leaanthony/synx diff --git a/vendor/github.com/leaanthony/synx/int.go b/vendor/github.com/leaanthony/synx/int.go deleted file mode 100644 index 2068f15..0000000 --- a/vendor/github.com/leaanthony/synx/int.go +++ /dev/null @@ -1,30 +0,0 @@ -package synx - -// Int represents an int type -type Int struct { - locker - value int -} - -// NewInt creates a new wrapper type for an int value -func NewInt(value int) *Int { - return &Int{ - locker: newLock(), - value: value, - } -} - -// SetValue sets the value -func (s *Int) SetValue(value int) { - s.Lock() - s.value = value - s.Unlock() -} - -// GetValue returns the value originally given -func (s *Int) GetValue() (value int) { - s.Lock() - value = s.value - s.Unlock() - return -} diff --git a/vendor/github.com/leaanthony/synx/locker.go b/vendor/github.com/leaanthony/synx/locker.go deleted file mode 100644 index 0aba20e..0000000 --- a/vendor/github.com/leaanthony/synx/locker.go +++ /dev/null @@ -1,25 +0,0 @@ -package synx - -import ( - "sync" -) - -type locker struct { - lock *sync.Mutex -} - -func newLock() locker { - return locker{ - lock: &sync.Mutex{}, - } -} - -// Lock the mutex -func (l *locker) Lock() { - l.lock.Lock() -} - -// Unlock the mutex -func (l *locker) Unlock() { - l.lock.Unlock() -} diff --git a/vendor/github.com/leaanthony/synx/string.go b/vendor/github.com/leaanthony/synx/string.go deleted file mode 100644 index a3b7da1..0000000 --- a/vendor/github.com/leaanthony/synx/string.go +++ /dev/null @@ -1,30 +0,0 @@ -package synx - -// String represents a string type -type String struct { - locker - value string -} - -// NewString creates a new wrapper for a string value -func NewString(value string) *String { - return &String{ - locker: newLock(), - value: value, - } -} - -// SetValue sets the value -func (s *String) SetValue(value string) { - s.Lock() - s.value = value - s.Unlock() -} - -// GetValue returns the value originally given -func (s *String) GetValue() (value string) { - s.Lock() - value = s.value - s.Unlock() - return -} diff --git a/vendor/github.com/leaanthony/synx/stringSlice.go b/vendor/github.com/leaanthony/synx/stringSlice.go deleted file mode 100644 index b0a3127..0000000 --- a/vendor/github.com/leaanthony/synx/stringSlice.go +++ /dev/null @@ -1,43 +0,0 @@ -package synx - -// StringSlice represents a string slice type -type StringSlice struct { - locker - value []string -} - -// NewStringSlice creates a new wrapper for a string slice -func NewStringSlice(value []string) *StringSlice { - return &StringSlice{ - locker: newLock(), - value: value, - } -} - -// SetValue sets the value -func (s *StringSlice) SetValue(value []string) { - s.Lock() - s.value = value - s.Unlock() -} - -// GetValue returns the value originally given -func (s *StringSlice) GetValue() (value []string) { - s.Lock() - value = s.value - s.Unlock() - return -} - -// GetElement returns the value at the given element index -func (s *StringSlice) GetElement(index int) (value string) { - s.Lock() - value = s.value[index] - s.Unlock() - return -} - -// Length returns the number of elements in the slice -func (s *StringSlice) Length() (length int) { - return len(s.GetValue()) -} diff --git a/vendor/github.com/leaanthony/webview2runtime/.gitignore b/vendor/github.com/leaanthony/webview2runtime/.gitignore new file mode 100644 index 0000000..723ef36 --- /dev/null +++ b/vendor/github.com/leaanthony/webview2runtime/.gitignore @@ -0,0 +1 @@ +.idea \ No newline at end of file diff --git a/vendor/github.com/leaanthony/webview2runtime/LICENSE b/vendor/github.com/leaanthony/webview2runtime/LICENSE new file mode 100644 index 0000000..a2be85f --- /dev/null +++ b/vendor/github.com/leaanthony/webview2runtime/LICENSE @@ -0,0 +1,8 @@ +The MIT License (MIT) +Copyright © 2021 Lea Anthony + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/vendor/github.com/leaanthony/webview2runtime/README.md b/vendor/github.com/leaanthony/webview2runtime/README.md new file mode 100644 index 0000000..ebcfedd --- /dev/null +++ b/vendor/github.com/leaanthony/webview2runtime/README.md @@ -0,0 +1,65 @@ +# WebView2Runtime + +This package provides the following capabilities for managing and installing the WebView2 runtime: + +- Retrieve version of installed WebView2 runtime +- Determine if the installed version is older than the required version +- Download and run the official Microsoft Bootstrapper +- Run an embedded version of the official Microsoft Bootstrapper +- Open a browser to the WebView2 download page +- Utility methods for user notifications and confirmations + +## Usage + +The general workflow should be: + +- Check if there's a version installed using `GetInstalledVersion()` +- If so, check it's new enough to support your application using `IsOlderThan()` +- Decide what strategy you're comfortable with to inform the user / install the runtime. + +## Documentation + +Please consult the [package documentation](https://pkg.go.dev/github.com/leaanthony/webview2runtime). + +### Example + +```go +package mypackage + +import "github.com/leaanthony/webview2runtime" + +func BootstrapRuntime() error { + var err error + shouldInstall := true + message := "The WebView2 runtime is required. Press Ok to install." + installedVersion := webview2runtime.GetInstalledVersion() + if installedVersion != nil { + shouldInstall, err = installedVersion.IsOlderThan("90.0.818.66") + if err != nil { + _ = webview2runtime.Error(err.Error(), "Error") + return err + } + if shouldInstall { + message = "The WebView2 runtime needs updating. Press Ok to install." + } + } + if shouldInstall { + confirmed, err := webview2runtime.Confirm(message, "Missing Requirements") + if err != nil { + return err + } + if confirmed { + installedCorrectly, err := webview2runtime.InstallUsingBootstrapper() + if err != nil { + _ = webview2runtime.Error(err.Error(), "Error") + return err + } + if !installedCorrectly { + err = webview2runtime.Error("The runtime failed to install correctly. Please try again.", "Error") + return err + } + } + } + return nil +} +``` \ No newline at end of file diff --git a/vendor/github.com/leaanthony/webview2runtime/go.mod b/vendor/github.com/leaanthony/webview2runtime/go.mod new file mode 100644 index 0000000..3d40880 --- /dev/null +++ b/vendor/github.com/leaanthony/webview2runtime/go.mod @@ -0,0 +1,5 @@ +module github.com/leaanthony/webview2runtime + +go 1.16 + +require golang.org/x/sys v0.0.0-20210611083646-a4fc73990273 diff --git a/vendor/github.com/leaanthony/webview2runtime/go.sum b/vendor/github.com/leaanthony/webview2runtime/go.sum new file mode 100644 index 0000000..501fac9 --- /dev/null +++ b/vendor/github.com/leaanthony/webview2runtime/go.sum @@ -0,0 +1,2 @@ +golang.org/x/sys v0.0.0-20210611083646-a4fc73990273 h1:faDu4veV+8pcThn4fewv6TVlNCezafGoC1gM/mxQLbQ= +golang.org/x/sys v0.0.0-20210611083646-a4fc73990273/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= diff --git a/vendor/github.com/leaanthony/webview2runtime/webview2runtime.go b/vendor/github.com/leaanthony/webview2runtime/webview2runtime.go new file mode 100644 index 0000000..78e031f --- /dev/null +++ b/vendor/github.com/leaanthony/webview2runtime/webview2runtime.go @@ -0,0 +1,203 @@ +// +build windows + +package webview2runtime + +import ( + _ "embed" + "golang.org/x/sys/windows/registry" + "io" + "net/http" + "os" + "os/exec" + "path/filepath" + "runtime" + "syscall" + "unsafe" +) + +//go:embed MicrosoftEdgeWebview2Setup.exe +var setupexe []byte + +// Info contains all the information about an installation of the webview2 runtime. +type Info struct { + Location string + Name string + Version string + SilentUninstall string +} + +// IsOlderThan returns true if the installed version is older than the given required version. +// Returns error if something goes wrong. +func (i *Info) IsOlderThan(requiredVersion string) (bool, error) { + var mod = syscall.NewLazyDLL("WebView2Loader.dll") + var CompareBrowserVersions = mod.NewProc("CompareBrowserVersions") + v1, err := syscall.UTF16PtrFromString(i.Version) + if err != nil { + return false, err + } + v2, err := syscall.UTF16PtrFromString(requiredVersion) + if err != nil { + return false, err + } + var result int = 9 + _, _, err = CompareBrowserVersions.Call(uintptr(unsafe.Pointer(v1)), uintptr(unsafe.Pointer(v2)), uintptr(unsafe.Pointer(&result))) + if result < -1 || result > 1 { + return false, err + } + return result == -1, nil +} + +// GetInstalledVersion returns the installed version of the webview2 runtime. +// If there is no version installed, a blank string is returned. +func GetInstalledVersion() *Info { + var regkey = `SOFTWARE\WOW6432Node\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}` + if runtime.GOARCH == "386" { + regkey = `SOFTWARE\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}` + } + + k, err := registry.OpenKey(registry.LOCAL_MACHINE, regkey, registry.QUERY_VALUE) + if err != nil { + // Cannot open key = not installed + return nil + } + + info := &Info{} + info.Location = getKeyValue(k, "location") + info.Name = getKeyValue(k, "name") + info.Version = getKeyValue(k, "pv") + info.SilentUninstall = getKeyValue(k, "SilentUninstall") + + return info +} + +func getKeyValue(k registry.Key, name string) string { + result, _, _ := k.GetStringValue(name) + return result +} + +func downloadBootstrapper() (string, error) { + bootstrapperURL := `https://go.microsoft.com/fwlink/p/?LinkId=2124703` + installer := filepath.Join(os.TempDir(), `MicrosoftEdgeWebview2Setup.exe`) + + // Download installer + out, err := os.Create(installer) + defer out.Close() + if err != nil { + return "", err + } + resp, err := http.Get(bootstrapperURL) + defer resp.Body.Close() + if err != nil { + err = out.Close() + return "", err + } + _, err = io.Copy(out, resp.Body) + if err != nil { + return "", err + } + + return installer, nil +} + +// InstallUsingEmbeddedBootstrapper will download the bootstrapper from Microsoft and run it to install +// the latest version of the runtime. +// Returns true if the installer ran successfully. +// Returns an error if something goes wrong +func InstallUsingEmbeddedBootstrapper() (bool, error) { + + installer := filepath.Join(os.TempDir(), `MicrosoftEdgeWebview2Setup.exe`) + err := os.WriteFile(installer, setupexe, 0755) + if err != nil { + return false, err + } + result, err := runInstaller(installer) + if err != nil { + return false, err + } + + return result, os.Remove(installer) + +} + +// InstallUsingBootstrapper will extract the embedded bootstrapper from Microsoft and run it to install +// the latest version of the runtime. +// Returns true if the installer ran successfully. +// Returns an error if something goes wrong +func InstallUsingBootstrapper() (bool, error) { + + installer, err := downloadBootstrapper() + if err != nil { + return false, err + } + + result, err := runInstaller(installer) + if err != nil { + return false, err + } + + return result, os.Remove(installer) + +} + +func runInstaller(installer string) (bool, error) { + // Credit: https://stackoverflow.com/a/10385867 + cmd := exec.Command(installer) + if err := cmd.Start(); err != nil { + return false, err + } + if err := cmd.Wait(); err != nil { + if exiterr, ok := err.(*exec.ExitError); ok { + if status, ok := exiterr.Sys().(syscall.WaitStatus); ok { + return status.ExitStatus() == 0, nil + } + } + } + return true, nil +} + +// Confirm will prompt the user with a message and OK / CANCEL buttons. +// Returns true if OK is selected by the user. +// Returns an error if something went wrong. +func Confirm(caption string, title string) (bool, error) { + var flags uint = 0x00000001 // MB_OKCANCEL + result, err := MessageBox(caption, title, flags) + if err != nil { + return false, err + } + return result == 1, nil +} + +// Error will an error message to the user. +// Returns an error if something went wrong. +func Error(caption string, title string) error { + var flags uint = 0x00000010 // MB_ICONERROR + _, err := MessageBox(caption, title, flags) + return err +} + +// MessageBox prompts the user with the given caption and title. +// Flags may be provided to customise the dialog. +// Returns an error if something went wrong. +func MessageBox(caption string, title string, flags uint) (int, error) { + captionUTF16, err := syscall.UTF16PtrFromString(caption) + if err != nil { + return -1, err + } + titleUTF16, err := syscall.UTF16PtrFromString(title) + if err != nil { + return -1, err + } + ret, _, _ := syscall.NewLazyDLL("user32.dll").NewProc("MessageBoxW").Call( + uintptr(0), + uintptr(unsafe.Pointer(captionUTF16)), + uintptr(unsafe.Pointer(titleUTF16)), + uintptr(flags)) + + return int(ret), nil +} + +// OpenInstallerDownloadWebpage will open the browser on the WebView2 download page +func OpenInstallerDownloadWebpage() error { + cmd := exec.Command("rundll32", "url.dll,FileProtocolHandler", "https://developer.microsoft.com/en-us/microsoft-edge/webview2/") + return cmd.Run() +} diff --git a/vendor/github.com/leaanthony/wincursor/LICENSE b/vendor/github.com/leaanthony/wincursor/LICENSE deleted file mode 100644 index 75ba423..0000000 --- a/vendor/github.com/leaanthony/wincursor/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2018-Present Lea Anthony - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. \ No newline at end of file diff --git a/vendor/github.com/leaanthony/wincursor/README.md b/vendor/github.com/leaanthony/wincursor/README.md deleted file mode 100644 index 7ddbcd2..0000000 --- a/vendor/github.com/leaanthony/wincursor/README.md +++ /dev/null @@ -1,59 +0,0 @@ -# WinCursor - -This is a simple library to show/hide the cursor in the windows terminal. Works in both Command Prompt and PowerShell. - -## Installation - -``` -go get -u github.com/leaanthony/wincursor -``` - -## Usage - -It's pretty simple really... - -``` -import github.com/leaanthony/wincursor" - -func main() { - wincursor.Hide() // This will hide the cursor - wincursor.Show() // This will show the cursor -} -``` - -## Rationale - -I was making a cross-platform spinner and wanted to hide the cursor on Windows. This turned out to be a lot harder than it should have been. Once I got it working, I decided to pull out the relevant functions into a new package so others don't need to go through the same pain 😀 - -## With a little help from my friends - -Original idea from this awesome [stackoverflow answer]. - -Some code on how to implement that from [go-ansiterm]. - -[stackoverflow answer]: https://stackoverflow.com/a/10455937 -[go-ansiterm]: https://github.com/Azure/go-ansiterm - -## go-ansiterm license - -The MIT License (MIT) - -Copyright (c) 2015 Microsoft Corporation - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. \ No newline at end of file diff --git a/vendor/github.com/leaanthony/wincursor/go.mod b/vendor/github.com/leaanthony/wincursor/go.mod deleted file mode 100644 index cb35d8a..0000000 --- a/vendor/github.com/leaanthony/wincursor/go.mod +++ /dev/null @@ -1 +0,0 @@ -module github.com/leaanthony/wincursor diff --git a/vendor/github.com/leaanthony/wincursor/wincursor.go b/vendor/github.com/leaanthony/wincursor/wincursor.go deleted file mode 100644 index 941b975..0000000 --- a/vendor/github.com/leaanthony/wincursor/wincursor.go +++ /dev/null @@ -1,80 +0,0 @@ -// +build windows - -package wincursor - -// Some parts from https://github.com/Azure/go-ansiterm - -import ( - "syscall" - "unsafe" -) - -var ( - modkernel32 = syscall.NewLazyDLL("kernel32.dll") - getConsoleCursorInfoProc = modkernel32.NewProc("GetConsoleCursorInfo") - setConsoleCursorInfoProc = modkernel32.NewProc("SetConsoleCursorInfo") -) - -// ConsoleCursorInfo holds the cursor information data -type ConsoleCursorInfo struct { - Size uint32 - Visible int32 -} - -// checkError evaluates the results of a Windows API call and returns the error if it failed. -func checkError(r1, r2 uintptr, err error) error { - // Windows APIs return non-zero to indicate success - if r1 != 0 { - return nil - } - - // Return the error if provided, otherwise default to EINVAL - if err != nil { - return err - } - return syscall.EINVAL -} - -// getConsoleCursorInfo - get the cursor information -func getConsoleCursorInfo(handle uintptr, cursorInfo *ConsoleCursorInfo) error { - r1, r2, err := getConsoleCursorInfoProc.Call(handle, uintptr(unsafe.Pointer(cursorInfo)), 0) - return checkError(r1, r2, err) -} - -// setConsoleCursorInfo - set the cursor information -func setConsoleCursorInfo(handle uintptr, cursorInfo *ConsoleCursorInfo) error { - r1, r2, err := setConsoleCursorInfoProc.Call(handle, uintptr(unsafe.Pointer(cursorInfo)), 0) - return checkError(r1, r2, err) -} - -// setCursorVisible - takes a boolean and sets the visibility of -// the cursor to this value -func setCursorVisible(visible bool) error { - var cursor ConsoleCursorInfo - // -11 is stdout on windows - fd, err := syscall.GetStdHandle(-11) - if err != nil { - return err - } - err = getConsoleCursorInfo(uintptr(fd), &cursor) - if err != nil { - return err - } - if visible { - cursor.Visible = 1 - } else { - cursor.Visible = 0 - } - err = setConsoleCursorInfo(uintptr(fd), &cursor) - return err -} - -// Show shows the windows console cursor -func Show() error { - return setCursorVisible(true) -} - -// Hide hides the windows console cursor -func Hide() error { - return setCursorVisible(false) -} diff --git a/vendor/github.com/go-playground/colors/.gitignore b/vendor/github.com/logrusorgru/aurora/.gitignore similarity index 84% rename from vendor/github.com/go-playground/colors/.gitignore rename to vendor/github.com/logrusorgru/aurora/.gitignore index daf913b..dbcb7cc 100644 --- a/vendor/github.com/go-playground/colors/.gitignore +++ b/vendor/github.com/logrusorgru/aurora/.gitignore @@ -22,3 +22,13 @@ _testmain.go *.exe *.test *.prof +*.out + +# coverage + +cover.html + +# benchcmp + +*.cmp + diff --git a/vendor/github.com/logrusorgru/aurora/.travis.yml b/vendor/github.com/logrusorgru/aurora/.travis.yml new file mode 100644 index 0000000..570e361 --- /dev/null +++ b/vendor/github.com/logrusorgru/aurora/.travis.yml @@ -0,0 +1,9 @@ +language: go +go: + - tip +before_install: + - go get github.com/axw/gocov/gocov + - go get github.com/mattn/goveralls + - go get golang.org/x/tools/cmd/cover +script: + - $HOME/gopath/bin/goveralls -service=travis-ci diff --git a/vendor/github.com/logrusorgru/aurora/AUTHORS.md b/vendor/github.com/logrusorgru/aurora/AUTHORS.md new file mode 100644 index 0000000..0ee9e3e --- /dev/null +++ b/vendor/github.com/logrusorgru/aurora/AUTHORS.md @@ -0,0 +1,8 @@ +AUTHORS +======= + +- Konstantin Ivanov @logrusorgru +- Mattias Eriksson @snaggen +- Ousmane Traore @otraore +- Simon Legner @simon04 +- Sevenate @sevenate diff --git a/vendor/github.com/logrusorgru/aurora/CHANGELOG.md b/vendor/github.com/logrusorgru/aurora/CHANGELOG.md new file mode 100644 index 0000000..ad0a202 --- /dev/null +++ b/vendor/github.com/logrusorgru/aurora/CHANGELOG.md @@ -0,0 +1,59 @@ +Changes +======= + +--- +16:05:02 +Thursday, July 2, 2020 + +Change license from the WTFPL to the Unlicense due to pkg.go.dev restriction. + +--- +15:39:40 +Wednesday, April 17, 2019 + +- Bright background and foreground colors +- 8-bit indexed colors `Index`, `BgIndex` +- 24 grayscale colors `Gray`, `BgGray` +- `Yellow` and `BgYellow` methods, mark Brow and BgBrown as deprecated + Following specifications, correct name of the colors are yellow, but + by historical reason they are called brown. Both, the `Yellow` and the + `Brown` methods (including `Bg+`) represents the same colors. The Brown + are leaved for backward compatibility until Go modules production release. +- Additional formats + + `Faint` that is opposite to the `Bold` + + `DoublyUnderline` + + `Fraktur` + + `Italic` + + `Underline` + + `SlowBlink` with `Blink` alias + + `RapidBlink` + + `Reverse` that is alias for the `Inverse` + + `Conceal` with `Hidden` alias + + `CrossedOut` with `StrikeThrough` alias + + `Framed` + + `Encircled` + + `Overlined` +- Add AUTHORS.md file and change all copyright notices. +- `Reset` method to create clear value. `Reset` method that replaces + `Bleach` method. The `Bleach` method was marked as deprecated. + +--- + +14:25:49 +Friday, August 18, 2017 + +- LICENSE.md changed to LICENSE +- fix email in README.md +- add "no warranty" to README.md +- set proper copyright date + +--- + +16:59:28 +Tuesday, November 8, 2016 + +- Rid out off sync.Pool +- Little optimizations (very little) +- Improved benchmarks + +--- diff --git a/vendor/github.com/logrusorgru/aurora/LICENSE b/vendor/github.com/logrusorgru/aurora/LICENSE new file mode 100644 index 0000000..68a49da --- /dev/null +++ b/vendor/github.com/logrusorgru/aurora/LICENSE @@ -0,0 +1,24 @@ +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to diff --git a/vendor/github.com/logrusorgru/aurora/README.md b/vendor/github.com/logrusorgru/aurora/README.md new file mode 100644 index 0000000..e0afce1 --- /dev/null +++ b/vendor/github.com/logrusorgru/aurora/README.md @@ -0,0 +1,314 @@ +Aurora +====== + +[![go.dev reference](https://img.shields.io/badge/go.dev-reference-007d9c?logo=go&logoColor=white)](https://pkg.go.dev/github.com/logrusorgru/aurora?tab=doc) +[![Unlicense](https://img.shields.io/badge/license-unlicense-blue.svg)](http://unlicense.org/) +[![Build Status](https://travis-ci.org/logrusorgru/aurora.svg)](https://travis-ci.org/logrusorgru/aurora) +[![Coverage Status](https://coveralls.io/repos/logrusorgru/aurora/badge.svg?branch=master)](https://coveralls.io/r/logrusorgru/aurora?branch=master) +[![GoReportCard](https://goreportcard.com/badge/logrusorgru/aurora)](https://goreportcard.com/report/logrusorgru/aurora) +[![Gitter](https://img.shields.io/badge/chat-on_gitter-46bc99.svg?logo=data:image%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMTQiIHdpZHRoPSIxNCI%2BPGcgZmlsbD0iI2ZmZiI%2BPHJlY3QgeD0iMCIgeT0iMyIgd2lkdGg9IjEiIGhlaWdodD0iNSIvPjxyZWN0IHg9IjIiIHk9IjQiIHdpZHRoPSIxIiBoZWlnaHQ9IjciLz48cmVjdCB4PSI0IiB5PSI0IiB3aWR0aD0iMSIgaGVpZ2h0PSI3Ii8%2BPHJlY3QgeD0iNiIgeT0iNCIgd2lkdGg9IjEiIGhlaWdodD0iNCIvPjwvZz48L3N2Zz4%3D&logoWidth=10)](https://gitter.im/logrusorgru/aurora) + +Ultimate ANSI colors for Golang. The package supports Printf/Sprintf etc. + + +![aurora logo](https://github.com/logrusorgru/aurora/blob/master/gopher_aurora.png) + +# TOC + +- [Installation](#installation) +- [Usage](#usage) + + [Simple](#simple) + + [Printf](#printf) + + [aurora.Sprintf](#aurorasprintf) + + [Enable/Disable colors](#enabledisable-colors) +- [Chains](#chains) +- [Colorize](#colorize) +- [Grayscale](#grayscale) +- [8-bit colors](#8-bit-colors) +- [Supported Colors & Formats](#supported-colors--formats) + + [All colors](#all-colors) + + [Standard and bright colors](#standard-and-bright-colors) + + [Formats are likely supported](#formats-are-likely-supported) + + [Formats are likely unsupported](#formats-are-likely-unsupported) +- [Limitations](#limitations) + + [Windows](#windows) + + [TTY](#tty) +- [Licensing](#licensing) + +# Installation + +Get +``` +go get -u github.com/logrusorgru/aurora +``` +Test +``` +go test -cover github.com/logrusorgru/aurora +``` + +# Usage + +### Simple + +```go +package main + +import ( + "fmt" + + . "github.com/logrusorgru/aurora" +) + +func main() { + fmt.Println("Hello,", Magenta("Aurora")) + fmt.Println(Bold(Cyan("Cya!"))) +} + +``` + +![simple png](https://github.com/logrusorgru/aurora/blob/master/simple.png) + +### Printf + +```go +package main + +import ( + "fmt" + + . "github.com/logrusorgru/aurora" +) + +func main() { + fmt.Printf("Got it %d times\n", Green(1240)) + fmt.Printf("PI is %+1.2e\n", Cyan(3.14)) +} + +``` + +![printf png](https://github.com/logrusorgru/aurora/blob/master/printf.png) + +### aurora.Sprintf + +```go +package main + +import ( + "fmt" + + . "github.com/logrusorgru/aurora" +) + +func main() { + fmt.Println(Sprintf(Magenta("Got it %d times"), Green(1240))) +} + +``` + +![sprintf png](https://github.com/logrusorgru/aurora/blob/master/sprintf.png) + +### Enable/Disable colors + +```go +package main + +import ( + "fmt" + "flag" + + "github.com/logrusorgru/aurora" +) + +// colorizer +var au aurora.Aurora + +var colors = flag.Bool("colors", false, "enable or disable colors") + +func init() { + flag.Parse() + au = aurora.NewAurora(*colors) +} + +func main() { + // use colorizer + fmt.Println(au.Green("Hello")) +} + +``` +Without flags: +![disable png](https://github.com/logrusorgru/aurora/blob/master/disable.png) + +With `-colors` flag: +![enable png](https://github.com/logrusorgru/aurora/blob/master/enable.png) + +# Chains + +The following samples are equal + +```go +x := BgMagenta(Bold(Red("x"))) +``` + +```go +x := Red("x").Bold().BgMagenta() +``` + +The second is more readable + +# Colorize + +There is `Colorize` function that allows to choose some colors and +format from a side + +```go + +func getColors() Color { + // some stuff that returns appropriate colors and format +} + +// [...] + +func main() { + fmt.Println(Colorize("Greeting", getColors())) +} + +``` +Less complicated example + +```go +x := Colorize("Greeting", GreenFg|GrayBg|BoldFm) +``` + +Unlike other color functions and methods (such as Red/BgBlue etc) +a `Colorize` clears previous colors + +```go +x := Red("x").Colorize(BgGreen) // will be with green background only +``` + +# Grayscale + +```go +fmt.Println(" ", + Gray(1-1, " 00-23 ").BgGray(24-1), + Gray(4-1, " 03-19 ").BgGray(20-1), + Gray(8-1, " 07-15 ").BgGray(16-1), + Gray(12-1, " 11-11 ").BgGray(12-1), + Gray(16-1, " 15-07 ").BgGray(8-1), + Gray(20-1, " 19-03 ").BgGray(4-1), + Gray(24-1, " 23-00 ").BgGray(1-1), +) +``` + +![grayscale png](https://github.com/logrusorgru/aurora/blob/master/aurora_grayscale.png) + +# 8-bit colors + +Methods `Index` and `BgIndex` implements 8-bit colors. + +| Index/BgIndex | Meaning | Foreground | Background | +| -------------- | --------------- | ---------- | ---------- | +| 0- 7 | standard colors | 30- 37 | 40- 47 | +| 8- 15 | bright colors | 90- 97 | 100-107 | +| 16-231 | 216 colors | 38;5;n | 48;5;n | +| 232-255 | 24 grayscale | 38;5;n | 48;5;n | + + +# Supported colors & formats + +- formats + + bold (1) + + faint (2) + + doubly-underline (21) + + fraktur (20) + + italic (3) + + underline (4) + + slow blink (5) + + rapid blink (6) + + reverse video (7) + + conceal (8) + + crossed out (9) + + framed (51) + + encircled (52) + + overlined (53) +- background and foreground colors, including bright + + black + + red + + green + + yellow (brown) + + blue + + magenta + + cyan + + white + + 24 grayscale colors + + 216 8-bit colors + +### All colors + +![linux png](https://github.com/logrusorgru/aurora/blob/master/aurora_colors_black.png) +![white png](https://github.com/logrusorgru/aurora/blob/master/aurora_colors_white.png) + +### Standard and bright colors + +![linux black standard png](https://github.com/logrusorgru/aurora/blob/master/aurora_black_standard.png) +![linux white standard png](https://github.com/logrusorgru/aurora/blob/master/aurora_white_standard.png) + +### Formats are likely supported + +![formats supported gif](https://github.com/logrusorgru/aurora/blob/master/aurora_formats.gif) + +### Formats are likely unsupported + +![formats rarely supported png](https://github.com/logrusorgru/aurora/blob/master/aurora_rarely_supported.png) + +# Limitations + +There is no way to represent `%T` and `%p` with colors using +a standard approach + +```go +package main + +import ( + "fmt" + + . "github.com/logrusorgru/aurora" +) + +func main() { + r := Red("red") + var i int + fmt.Printf("%T %p\n", r, Green(&i)) +} +``` + +Output will be without colors + +``` +aurora.value %!p(aurora.value={0xc42000a310 768 0}) +``` + +The obvious workaround is `Red(fmt.Sprintf("%T", some))` + +### Windows + +The Aurora provides ANSI colors only, so there is no support for Windows. That said, there are workarounds available. +Check out these comments to learn more: + +- [Using go-colorable](https://github.com/logrusorgru/aurora/issues/2#issuecomment-299014211). +- [Using registry for Windows 10](https://github.com/logrusorgru/aurora/issues/10#issue-476361247). + +### TTY + +The Aurora has no internal TTY detectors by design. Take a look + [this comment](https://github.com/logrusorgru/aurora/issues/2#issuecomment-299030108) if you want turn +on colors for a terminal only, and turn them off for a file. + +### Licensing + +Copyright © 2016-2020 The Aurora Authors. This work is free. +It comes without any warranty, to the extent permitted by applicable +law. You can redistribute it and/or modify it under the terms of the +the Unlicense. See the LICENSE file for more details. + + diff --git a/vendor/github.com/logrusorgru/aurora/aurora.go b/vendor/github.com/logrusorgru/aurora/aurora.go new file mode 100644 index 0000000..3b30230 --- /dev/null +++ b/vendor/github.com/logrusorgru/aurora/aurora.go @@ -0,0 +1,725 @@ +// +// Copyright (c) 2016-2020 The Aurora Authors. All rights reserved. +// This program is free software. It comes without any warranty, +// to the extent permitted by applicable law. You can redistribute +// it and/or modify it under the terms of the Unlicense. See LICENSE +// file for more details or see below. +// + +// +// This is free and unencumbered software released into the public domain. +// +// Anyone is free to copy, modify, publish, use, compile, sell, or +// distribute this software, either in source code form or as a compiled +// binary, for any purpose, commercial or non-commercial, and by any +// means. +// +// In jurisdictions that recognize copyright laws, the author or authors +// of this software dedicate any and all copyright interest in the +// software to the public domain. We make this dedication for the benefit +// of the public at large and to the detriment of our heirs and +// successors. We intend this dedication to be an overt act of +// relinquishment in perpetuity of all present and future rights to this +// software under copyright law. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +// OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// +// For more information, please refer to +// + +// Package aurora implements ANSI-colors +package aurora + +import ( + "fmt" +) + +// An Aurora implements colorizer interface. +// It also can be a non-colorizer +type Aurora interface { + + // Reset wraps given argument returning Value + // without formats and colors. + Reset(arg interface{}) Value + + // + // Formats + // + // + // Bold or increased intensity (1). + Bold(arg interface{}) Value + // Faint, decreased intensity (2). + Faint(arg interface{}) Value + // + // DoublyUnderline or Bold off, double-underline + // per ECMA-48 (21). + DoublyUnderline(arg interface{}) Value + // Fraktur, rarely supported (20). + Fraktur(arg interface{}) Value + // + // Italic, not widely supported, sometimes + // treated as inverse (3). + Italic(arg interface{}) Value + // Underline (4). + Underline(arg interface{}) Value + // + // SlowBlink, blinking less than 150 + // per minute (5). + SlowBlink(arg interface{}) Value + // RapidBlink, blinking 150+ per minute, + // not widely supported (6). + RapidBlink(arg interface{}) Value + // Blink is alias for the SlowBlink. + Blink(arg interface{}) Value + // + // Reverse video, swap foreground and + // background colors (7). + Reverse(arg interface{}) Value + // Inverse is alias for the Reverse + Inverse(arg interface{}) Value + // + // Conceal, hidden, not widely supported (8). + Conceal(arg interface{}) Value + // Hidden is alias for the Conceal + Hidden(arg interface{}) Value + // + // CrossedOut, characters legible, but + // marked for deletion (9). + CrossedOut(arg interface{}) Value + // StrikeThrough is alias for the CrossedOut. + StrikeThrough(arg interface{}) Value + // + // Framed (51). + Framed(arg interface{}) Value + // Encircled (52). + Encircled(arg interface{}) Value + // + // Overlined (53). + Overlined(arg interface{}) Value + + // + // Foreground colors + // + // + // Black foreground color (30) + Black(arg interface{}) Value + // Red foreground color (31) + Red(arg interface{}) Value + // Green foreground color (32) + Green(arg interface{}) Value + // Yellow foreground color (33) + Yellow(arg interface{}) Value + // Brown foreground color (33) + // + // Deprecated: use Yellow instead, following specification + Brown(arg interface{}) Value + // Blue foreground color (34) + Blue(arg interface{}) Value + // Magenta foreground color (35) + Magenta(arg interface{}) Value + // Cyan foreground color (36) + Cyan(arg interface{}) Value + // White foreground color (37) + White(arg interface{}) Value + // + // Bright foreground colors + // + // BrightBlack foreground color (90) + BrightBlack(arg interface{}) Value + // BrightRed foreground color (91) + BrightRed(arg interface{}) Value + // BrightGreen foreground color (92) + BrightGreen(arg interface{}) Value + // BrightYellow foreground color (93) + BrightYellow(arg interface{}) Value + // BrightBlue foreground color (94) + BrightBlue(arg interface{}) Value + // BrightMagenta foreground color (95) + BrightMagenta(arg interface{}) Value + // BrightCyan foreground color (96) + BrightCyan(arg interface{}) Value + // BrightWhite foreground color (97) + BrightWhite(arg interface{}) Value + // + // Other + // + // Index of pre-defined 8-bit foreground color + // from 0 to 255 (38;5;n). + // + // 0- 7: standard colors (as in ESC [ 30–37 m) + // 8- 15: high intensity colors (as in ESC [ 90–97 m) + // 16-231: 6 × 6 × 6 cube (216 colors): 16 + 36 × r + 6 × g + b (0 ≤ r, g, b ≤ 5) + // 232-255: grayscale from black to white in 24 steps + // + Index(n uint8, arg interface{}) Value + // Gray from 0 to 23. + Gray(n uint8, arg interface{}) Value + + // + // Background colors + // + // + // BgBlack background color (40) + BgBlack(arg interface{}) Value + // BgRed background color (41) + BgRed(arg interface{}) Value + // BgGreen background color (42) + BgGreen(arg interface{}) Value + // BgYellow background color (43) + BgYellow(arg interface{}) Value + // BgBrown background color (43) + // + // Deprecated: use BgYellow instead, following specification + BgBrown(arg interface{}) Value + // BgBlue background color (44) + BgBlue(arg interface{}) Value + // BgMagenta background color (45) + BgMagenta(arg interface{}) Value + // BgCyan background color (46) + BgCyan(arg interface{}) Value + // BgWhite background color (47) + BgWhite(arg interface{}) Value + // + // Bright background colors + // + // BgBrightBlack background color (100) + BgBrightBlack(arg interface{}) Value + // BgBrightRed background color (101) + BgBrightRed(arg interface{}) Value + // BgBrightGreen background color (102) + BgBrightGreen(arg interface{}) Value + // BgBrightYellow background color (103) + BgBrightYellow(arg interface{}) Value + // BgBrightBlue background color (104) + BgBrightBlue(arg interface{}) Value + // BgBrightMagenta background color (105) + BgBrightMagenta(arg interface{}) Value + // BgBrightCyan background color (106) + BgBrightCyan(arg interface{}) Value + // BgBrightWhite background color (107) + BgBrightWhite(arg interface{}) Value + // + // Other + // + // BgIndex of 8-bit pre-defined background color + // from 0 to 255 (48;5;n). + // + // 0- 7: standard colors (as in ESC [ 40–47 m) + // 8- 15: high intensity colors (as in ESC [100–107 m) + // 16-231: 6 × 6 × 6 cube (216 colors): 16 + 36 × r + 6 × g + b (0 ≤ r, g, b ≤ 5) + // 232-255: grayscale from black to white in 24 steps + // + BgIndex(n uint8, arg interface{}) Value + // BgGray from 0 to 23. + BgGray(n uint8, arg interface{}) Value + + // + // Special + // + // Colorize removes existing colors and + // formats of the argument and applies given. + Colorize(arg interface{}, color Color) Value + + // + // Support methods + // + // Sprintf allows to use colored format. + Sprintf(format interface{}, args ...interface{}) string +} + +// NewAurora returns a new Aurora interface that +// will support or not support colors depending +// the enableColors argument +func NewAurora(enableColors bool) Aurora { + if enableColors { + return aurora{} + } + return auroraClear{} +} + +// no colors + +type auroraClear struct{} + +func (auroraClear) Reset(arg interface{}) Value { return valueClear{arg} } + +func (auroraClear) Bold(arg interface{}) Value { + return valueClear{arg} +} + +func (auroraClear) Faint(arg interface{}) Value { + return valueClear{arg} +} + +func (auroraClear) DoublyUnderline(arg interface{}) Value { + return valueClear{arg} +} + +func (auroraClear) Fraktur(arg interface{}) Value { + return valueClear{arg} +} + +func (auroraClear) Italic(arg interface{}) Value { + return valueClear{arg} +} + +func (auroraClear) Underline(arg interface{}) Value { + return valueClear{arg} +} + +func (auroraClear) SlowBlink(arg interface{}) Value { + return valueClear{arg} +} + +func (auroraClear) RapidBlink(arg interface{}) Value { + return valueClear{arg} +} + +func (auroraClear) Blink(arg interface{}) Value { + return valueClear{arg} +} + +func (auroraClear) Reverse(arg interface{}) Value { + return valueClear{arg} +} + +func (auroraClear) Inverse(arg interface{}) Value { + return valueClear{arg} +} + +func (auroraClear) Conceal(arg interface{}) Value { + return valueClear{arg} +} + +func (auroraClear) Hidden(arg interface{}) Value { + return valueClear{arg} +} + +func (auroraClear) CrossedOut(arg interface{}) Value { + return valueClear{arg} +} + +func (auroraClear) StrikeThrough(arg interface{}) Value { + return valueClear{arg} +} + +func (auroraClear) Framed(arg interface{}) Value { + return valueClear{arg} +} + +func (auroraClear) Encircled(arg interface{}) Value { + return valueClear{arg} +} + +func (auroraClear) Overlined(arg interface{}) Value { + return valueClear{arg} +} + +func (auroraClear) Black(arg interface{}) Value { + return valueClear{arg} +} + +func (auroraClear) Red(arg interface{}) Value { + return valueClear{arg} +} + +func (auroraClear) Green(arg interface{}) Value { + return valueClear{arg} +} + +func (auroraClear) Yellow(arg interface{}) Value { + return valueClear{arg} +} + +func (auroraClear) Brown(arg interface{}) Value { + return valueClear{arg} +} + +func (auroraClear) Blue(arg interface{}) Value { + return valueClear{arg} +} + +func (auroraClear) Magenta(arg interface{}) Value { + return valueClear{arg} +} + +func (auroraClear) Cyan(arg interface{}) Value { + return valueClear{arg} +} + +func (auroraClear) White(arg interface{}) Value { + return valueClear{arg} +} + +func (auroraClear) BrightBlack(arg interface{}) Value { + return valueClear{arg} +} + +func (auroraClear) BrightRed(arg interface{}) Value { + return valueClear{arg} +} + +func (auroraClear) BrightGreen(arg interface{}) Value { + return valueClear{arg} +} + +func (auroraClear) BrightYellow(arg interface{}) Value { + return valueClear{arg} +} + +func (auroraClear) BrightBlue(arg interface{}) Value { + return valueClear{arg} +} + +func (auroraClear) BrightMagenta(arg interface{}) Value { + return valueClear{arg} +} + +func (auroraClear) BrightCyan(arg interface{}) Value { + return valueClear{arg} +} + +func (auroraClear) BrightWhite(arg interface{}) Value { + return valueClear{arg} +} + +func (auroraClear) Index(_ uint8, arg interface{}) Value { + return valueClear{arg} +} + +func (auroraClear) Gray(_ uint8, arg interface{}) Value { + return valueClear{arg} +} + +func (auroraClear) BgBlack(arg interface{}) Value { + return valueClear{arg} +} + +func (auroraClear) BgRed(arg interface{}) Value { + return valueClear{arg} +} + +func (auroraClear) BgGreen(arg interface{}) Value { + return valueClear{arg} +} + +func (auroraClear) BgYellow(arg interface{}) Value { + return valueClear{arg} +} + +func (auroraClear) BgBrown(arg interface{}) Value { + return valueClear{arg} +} + +func (auroraClear) BgBlue(arg interface{}) Value { + return valueClear{arg} +} + +func (auroraClear) BgMagenta(arg interface{}) Value { + return valueClear{arg} +} + +func (auroraClear) BgCyan(arg interface{}) Value { + return valueClear{arg} +} + +func (auroraClear) BgWhite(arg interface{}) Value { + return valueClear{arg} +} + +func (auroraClear) BgBrightBlack(arg interface{}) Value { + return valueClear{arg} +} + +func (auroraClear) BgBrightRed(arg interface{}) Value { + return valueClear{arg} +} + +func (auroraClear) BgBrightGreen(arg interface{}) Value { + return valueClear{arg} +} + +func (auroraClear) BgBrightYellow(arg interface{}) Value { + return valueClear{arg} +} + +func (auroraClear) BgBrightBlue(arg interface{}) Value { + return valueClear{arg} +} + +func (auroraClear) BgBrightMagenta(arg interface{}) Value { + return valueClear{arg} +} + +func (auroraClear) BgBrightCyan(arg interface{}) Value { + return valueClear{arg} +} + +func (auroraClear) BgBrightWhite(arg interface{}) Value { + return valueClear{arg} +} + +func (auroraClear) BgIndex(_ uint8, arg interface{}) Value { + return valueClear{arg} +} + +func (auroraClear) BgGray(_ uint8, arg interface{}) Value { + return valueClear{arg} +} + +func (auroraClear) Colorize(arg interface{}, _ Color) Value { + return valueClear{arg} +} + +func (auroraClear) Sprintf(format interface{}, args ...interface{}) string { + if str, ok := format.(string); ok { + return fmt.Sprintf(str, args...) + } + return fmt.Sprintf(fmt.Sprint(format), args...) +} + +// colorized + +type aurora struct{} + +func (aurora) Reset(arg interface{}) Value { + return Reset(arg) +} + +func (aurora) Bold(arg interface{}) Value { + return Bold(arg) +} + +func (aurora) Faint(arg interface{}) Value { + return Faint(arg) +} + +func (aurora) DoublyUnderline(arg interface{}) Value { + return DoublyUnderline(arg) +} + +func (aurora) Fraktur(arg interface{}) Value { + return Fraktur(arg) +} + +func (aurora) Italic(arg interface{}) Value { + return Italic(arg) +} + +func (aurora) Underline(arg interface{}) Value { + return Underline(arg) +} + +func (aurora) SlowBlink(arg interface{}) Value { + return SlowBlink(arg) +} + +func (aurora) RapidBlink(arg interface{}) Value { + return RapidBlink(arg) +} + +func (aurora) Blink(arg interface{}) Value { + return Blink(arg) +} + +func (aurora) Reverse(arg interface{}) Value { + return Reverse(arg) +} + +func (aurora) Inverse(arg interface{}) Value { + return Inverse(arg) +} + +func (aurora) Conceal(arg interface{}) Value { + return Conceal(arg) +} + +func (aurora) Hidden(arg interface{}) Value { + return Hidden(arg) +} + +func (aurora) CrossedOut(arg interface{}) Value { + return CrossedOut(arg) +} + +func (aurora) StrikeThrough(arg interface{}) Value { + return StrikeThrough(arg) +} + +func (aurora) Framed(arg interface{}) Value { + return Framed(arg) +} + +func (aurora) Encircled(arg interface{}) Value { + return Encircled(arg) +} + +func (aurora) Overlined(arg interface{}) Value { + return Overlined(arg) +} + +func (aurora) Black(arg interface{}) Value { + return Black(arg) +} + +func (aurora) Red(arg interface{}) Value { + return Red(arg) +} + +func (aurora) Green(arg interface{}) Value { + return Green(arg) +} + +func (aurora) Yellow(arg interface{}) Value { + return Yellow(arg) +} + +func (aurora) Brown(arg interface{}) Value { + return Brown(arg) +} + +func (aurora) Blue(arg interface{}) Value { + return Blue(arg) +} + +func (aurora) Magenta(arg interface{}) Value { + return Magenta(arg) +} + +func (aurora) Cyan(arg interface{}) Value { + return Cyan(arg) +} + +func (aurora) White(arg interface{}) Value { + return White(arg) +} + +func (aurora) BrightBlack(arg interface{}) Value { + return BrightBlack(arg) +} + +func (aurora) BrightRed(arg interface{}) Value { + return BrightRed(arg) +} + +func (aurora) BrightGreen(arg interface{}) Value { + return BrightGreen(arg) +} + +func (aurora) BrightYellow(arg interface{}) Value { + return BrightYellow(arg) +} + +func (aurora) BrightBlue(arg interface{}) Value { + return BrightBlue(arg) +} + +func (aurora) BrightMagenta(arg interface{}) Value { + return BrightMagenta(arg) +} + +func (aurora) BrightCyan(arg interface{}) Value { + return BrightCyan(arg) +} + +func (aurora) BrightWhite(arg interface{}) Value { + return BrightWhite(arg) +} + +func (aurora) Index(index uint8, arg interface{}) Value { + return Index(index, arg) +} + +func (aurora) Gray(n uint8, arg interface{}) Value { + return Gray(n, arg) +} + +func (aurora) BgBlack(arg interface{}) Value { + return BgBlack(arg) +} + +func (aurora) BgRed(arg interface{}) Value { + return BgRed(arg) +} + +func (aurora) BgGreen(arg interface{}) Value { + return BgGreen(arg) +} + +func (aurora) BgYellow(arg interface{}) Value { + return BgYellow(arg) +} + +func (aurora) BgBrown(arg interface{}) Value { + return BgBrown(arg) +} + +func (aurora) BgBlue(arg interface{}) Value { + return BgBlue(arg) +} + +func (aurora) BgMagenta(arg interface{}) Value { + return BgMagenta(arg) +} + +func (aurora) BgCyan(arg interface{}) Value { + return BgCyan(arg) +} + +func (aurora) BgWhite(arg interface{}) Value { + return BgWhite(arg) +} + +func (aurora) BgBrightBlack(arg interface{}) Value { + return BgBrightBlack(arg) +} + +func (aurora) BgBrightRed(arg interface{}) Value { + return BgBrightRed(arg) +} + +func (aurora) BgBrightGreen(arg interface{}) Value { + return BgBrightGreen(arg) +} + +func (aurora) BgBrightYellow(arg interface{}) Value { + return BgBrightYellow(arg) +} + +func (aurora) BgBrightBlue(arg interface{}) Value { + return BgBrightBlue(arg) +} + +func (aurora) BgBrightMagenta(arg interface{}) Value { + return BgBrightMagenta(arg) +} + +func (aurora) BgBrightCyan(arg interface{}) Value { + return BgBrightCyan(arg) +} + +func (aurora) BgBrightWhite(arg interface{}) Value { + return BgBrightWhite(arg) +} + +func (aurora) BgIndex(n uint8, arg interface{}) Value { + return BgIndex(n, arg) +} + +func (aurora) BgGray(n uint8, arg interface{}) Value { + return BgGray(n, arg) +} + +func (aurora) Colorize(arg interface{}, color Color) Value { + return Colorize(arg, color) +} + +func (aurora) Sprintf(format interface{}, args ...interface{}) string { + return Sprintf(format, args...) +} diff --git a/vendor/github.com/logrusorgru/aurora/aurora_black_standard.png b/vendor/github.com/logrusorgru/aurora/aurora_black_standard.png new file mode 100644 index 0000000..83658d6 Binary files /dev/null and b/vendor/github.com/logrusorgru/aurora/aurora_black_standard.png differ diff --git a/vendor/github.com/logrusorgru/aurora/aurora_colors_black.png b/vendor/github.com/logrusorgru/aurora/aurora_colors_black.png new file mode 100644 index 0000000..61b1602 Binary files /dev/null and b/vendor/github.com/logrusorgru/aurora/aurora_colors_black.png differ diff --git a/vendor/github.com/logrusorgru/aurora/aurora_colors_white.png b/vendor/github.com/logrusorgru/aurora/aurora_colors_white.png new file mode 100644 index 0000000..ec42b07 Binary files /dev/null and b/vendor/github.com/logrusorgru/aurora/aurora_colors_white.png differ diff --git a/vendor/github.com/logrusorgru/aurora/aurora_formats.gif b/vendor/github.com/logrusorgru/aurora/aurora_formats.gif new file mode 100644 index 0000000..670dd1c Binary files /dev/null and b/vendor/github.com/logrusorgru/aurora/aurora_formats.gif differ diff --git a/vendor/github.com/logrusorgru/aurora/aurora_grayscale.png b/vendor/github.com/logrusorgru/aurora/aurora_grayscale.png new file mode 100644 index 0000000..40ecac6 Binary files /dev/null and b/vendor/github.com/logrusorgru/aurora/aurora_grayscale.png differ diff --git a/vendor/github.com/logrusorgru/aurora/aurora_rarely_supported.png b/vendor/github.com/logrusorgru/aurora/aurora_rarely_supported.png new file mode 100644 index 0000000..51b7b6d Binary files /dev/null and b/vendor/github.com/logrusorgru/aurora/aurora_rarely_supported.png differ diff --git a/vendor/github.com/logrusorgru/aurora/aurora_white_standard.png b/vendor/github.com/logrusorgru/aurora/aurora_white_standard.png new file mode 100644 index 0000000..1fe99d7 Binary files /dev/null and b/vendor/github.com/logrusorgru/aurora/aurora_white_standard.png differ diff --git a/vendor/github.com/logrusorgru/aurora/color.go b/vendor/github.com/logrusorgru/aurora/color.go new file mode 100644 index 0000000..486fb67 --- /dev/null +++ b/vendor/github.com/logrusorgru/aurora/color.go @@ -0,0 +1,398 @@ +// +// Copyright (c) 2016-2020 The Aurora Authors. All rights reserved. +// This program is free software. It comes without any warranty, +// to the extent permitted by applicable law. You can redistribute +// it and/or modify it under the terms of the Unlicense. See LICENSE +// file for more details or see below. +// + +// +// This is free and unencumbered software released into the public domain. +// +// Anyone is free to copy, modify, publish, use, compile, sell, or +// distribute this software, either in source code form or as a compiled +// binary, for any purpose, commercial or non-commercial, and by any +// means. +// +// In jurisdictions that recognize copyright laws, the author or authors +// of this software dedicate any and all copyright interest in the +// software to the public domain. We make this dedication for the benefit +// of the public at large and to the detriment of our heirs and +// successors. We intend this dedication to be an overt act of +// relinquishment in perpetuity of all present and future rights to this +// software under copyright law. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +// OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// +// For more information, please refer to +// + +package aurora + +// A Color type is a color. It can contain +// one background color, one foreground color +// and a format, including ideogram related +// formats. +type Color uint + +/* + + Developer note. + + The int type is architecture depended and can be + represented as int32 or int64. + + Thus, we can use 32-bits only to be fast and + cross-platform. + + All supported formats requires 14 bits. It is + first 14 bits. + + A foreground color requires 8 bit + 1 bit (presence flag). + And the same for background color. + + The Color representations + + [ bg 8 bit ] [fg 8 bit ] [ fg/bg 2 bits ] [ fm 14 bits ] + + https://play.golang.org/p/fq2zcNstFoF + +*/ + +// Special formats +const ( + BoldFm Color = 1 << iota // 1 + FaintFm // 2 + ItalicFm // 3 + UnderlineFm // 4 + SlowBlinkFm // 5 + RapidBlinkFm // 6 + ReverseFm // 7 + ConcealFm // 8 + CrossedOutFm // 9 + + FrakturFm // 20 + DoublyUnderlineFm // 21 or bold off for some systems + + FramedFm // 51 + EncircledFm // 52 + OverlinedFm // 53 + + InverseFm = ReverseFm // alias to ReverseFm + BlinkFm = SlowBlinkFm // alias to SlowBlinkFm + HiddenFm = ConcealFm // alias to ConcealFm + StrikeThroughFm = CrossedOutFm // alias to CrossedOutFm + + maskFm = BoldFm | FaintFm | + ItalicFm | UnderlineFm | + SlowBlinkFm | RapidBlinkFm | + ReverseFm | + ConcealFm | CrossedOutFm | + + FrakturFm | DoublyUnderlineFm | + + FramedFm | EncircledFm | OverlinedFm + + flagFg Color = 1 << 14 // presence flag (14th bit) + flagBg Color = 1 << 15 // presence flag (15th bit) + + shiftFg = 16 // shift for foreground (starting from 16th bit) + shiftBg = 24 // shift for background (starting from 24th bit) +) + +// Foreground colors and related formats +const ( + + // 8 bits + + // [ 0; 7] - 30-37 + // [ 8; 15] - 90-97 + // [ 16; 231] - RGB + // [232; 255] - grayscale + + BlackFg Color = (iota << shiftFg) | flagFg // 30, 90 + RedFg // 31, 91 + GreenFg // 32, 92 + YellowFg // 33, 93 + BlueFg // 34, 94 + MagentaFg // 35, 95 + CyanFg // 36, 96 + WhiteFg // 37, 97 + + BrightFg Color = ((1 << 3) << shiftFg) | flagFg // -> 90 + + // the BrightFg itself doesn't represent + // a color, thus it has not flagFg + + // 5 bits + + // BrownFg represents brown foreground color. + // + // Deprecated: use YellowFg instead, following specifications + BrownFg = YellowFg + + // + maskFg = (0xff << shiftFg) | flagFg +) + +// Background colors and related formats +const ( + + // 8 bits + + // [ 0; 7] - 40-47 + // [ 8; 15] - 100-107 + // [ 16; 231] - RGB + // [232; 255] - grayscale + + BlackBg Color = (iota << shiftBg) | flagBg // 40, 100 + RedBg // 41, 101 + GreenBg // 42, 102 + YellowBg // 43, 103 + BlueBg // 44, 104 + MagentaBg // 45, 105 + CyanBg // 46, 106 + WhiteBg // 47, 107 + + BrightBg Color = ((1 << 3) << shiftBg) | flagBg // -> 100 + + // the BrightBg itself doesn't represent + // a color, thus it has not flagBg + + // 5 bits + + // BrownBg represents brown foreground color. + // + // Deprecated: use YellowBg instead, following specifications + BrownBg = YellowBg + + // + maskBg = (0xff << shiftBg) | flagBg +) + +const ( + availFlags = "-+# 0" + esc = "\033[" + clear = esc + "0m" +) + +// IsValid returns true always +// +// Deprecated: don't use this method anymore +func (c Color) IsValid() bool { + return true +} + +// Nos returns string like 1;7;31;45. It +// may be an empty string for empty color. +// If the zero is true, then the string +// is prepended with 0; +func (c Color) Nos(zero bool) string { + return string(c.appendNos(make([]byte, 0, 59), zero)) +} + +func appendCond(bs []byte, cond, semi bool, vals ...byte) []byte { + if !cond { + return bs + } + return appendSemi(bs, semi, vals...) +} + +// if the semi is true, then prepend with semicolon +func appendSemi(bs []byte, semi bool, vals ...byte) []byte { + if semi { + bs = append(bs, ';') + } + return append(bs, vals...) +} + +func itoa(t byte) string { + var ( + a [3]byte + j = 2 + ) + for i := 0; i < 3; i, j = i+1, j-1 { + a[j] = '0' + t%10 + if t = t / 10; t == 0 { + break + } + } + return string(a[j:]) +} + +func (c Color) appendFg(bs []byte, zero bool) []byte { + + if zero || c&maskFm != 0 { + bs = append(bs, ';') + } + + // 0- 7 : 30-37 + // 8-15 : 90-97 + // > 15 : 38;5;val + + switch fg := (c & maskFg) >> shiftFg; { + case fg <= 7: + // '3' and the value itself + bs = append(bs, '3', '0'+byte(fg)) + case fg <= 15: + // '9' and the value itself + bs = append(bs, '9', '0'+byte(fg&^0x08)) // clear bright flag + default: + bs = append(bs, '3', '8', ';', '5', ';') + bs = append(bs, itoa(byte(fg))...) + } + return bs +} + +func (c Color) appendBg(bs []byte, zero bool) []byte { + + if zero || c&(maskFm|maskFg) != 0 { + bs = append(bs, ';') + } + + // 0- 7 : 40- 47 + // 8-15 : 100-107 + // > 15 : 48;5;val + + switch fg := (c & maskBg) >> shiftBg; { + case fg <= 7: + // '3' and the value itself + bs = append(bs, '4', '0'+byte(fg)) + case fg <= 15: + // '1', '0' and the value itself + bs = append(bs, '1', '0', '0'+byte(fg&^0x08)) // clear bright flag + default: + bs = append(bs, '4', '8', ';', '5', ';') + bs = append(bs, itoa(byte(fg))...) + } + return bs +} + +func (c Color) appendFm9(bs []byte, zero bool) []byte { + + bs = appendCond(bs, c&ItalicFm != 0, + zero || c&(BoldFm|FaintFm) != 0, + '3') + bs = appendCond(bs, c&UnderlineFm != 0, + zero || c&(BoldFm|FaintFm|ItalicFm) != 0, + '4') + // don't combine slow and rapid blink using only + // on of them, preferring slow blink + if c&SlowBlinkFm != 0 { + bs = appendSemi(bs, + zero || c&(BoldFm|FaintFm|ItalicFm|UnderlineFm) != 0, + '5') + } else if c&RapidBlinkFm != 0 { + bs = appendSemi(bs, + zero || c&(BoldFm|FaintFm|ItalicFm|UnderlineFm) != 0, + '6') + } + + // including 1-2 + const mask6i = BoldFm | FaintFm | + ItalicFm | UnderlineFm | + SlowBlinkFm | RapidBlinkFm + + bs = appendCond(bs, c&ReverseFm != 0, + zero || c&(mask6i) != 0, + '7') + bs = appendCond(bs, c&ConcealFm != 0, + zero || c&(mask6i|ReverseFm) != 0, + '8') + bs = appendCond(bs, c&CrossedOutFm != 0, + zero || c&(mask6i|ReverseFm|ConcealFm) != 0, + '9') + + return bs +} + +// append 1;3;38;5;216 like string that represents ANSI +// color of the Color; the zero argument requires +// appending of '0' before to reset previous format +// and colors +func (c Color) appendNos(bs []byte, zero bool) []byte { + + if zero { + bs = append(bs, '0') // reset previous + } + + // formats + // + + if c&maskFm != 0 { + + // 1-2 + + // don't combine bold and faint using only on of them, preferring bold + + if c&BoldFm != 0 { + bs = appendSemi(bs, zero, '1') + } else if c&FaintFm != 0 { + bs = appendSemi(bs, zero, '2') + } + + // 3-9 + + const mask9 = ItalicFm | UnderlineFm | + SlowBlinkFm | RapidBlinkFm | + ReverseFm | ConcealFm | CrossedOutFm + + if c&mask9 != 0 { + bs = c.appendFm9(bs, zero) + } + + // 20-21 + + const ( + mask21 = FrakturFm | DoublyUnderlineFm + mask9i = BoldFm | FaintFm | mask9 + ) + + if c&mask21 != 0 { + bs = appendCond(bs, c&FrakturFm != 0, + zero || c&mask9i != 0, + '2', '0') + bs = appendCond(bs, c&DoublyUnderlineFm != 0, + zero || c&(mask9i|FrakturFm) != 0, + '2', '1') + } + + // 50-53 + + const ( + mask53 = FramedFm | EncircledFm | OverlinedFm + mask21i = mask9i | mask21 + ) + + if c&mask53 != 0 { + bs = appendCond(bs, c&FramedFm != 0, + zero || c&mask21i != 0, + '5', '1') + bs = appendCond(bs, c&EncircledFm != 0, + zero || c&(mask21i|FramedFm) != 0, + '5', '2') + bs = appendCond(bs, c&OverlinedFm != 0, + zero || c&(mask21i|FramedFm|EncircledFm) != 0, + '5', '3') + } + + } + + // foreground + if c&maskFg != 0 { + bs = c.appendFg(bs, zero) + } + + // background + if c&maskBg != 0 { + bs = c.appendBg(bs, zero) + } + + return bs +} diff --git a/vendor/github.com/logrusorgru/aurora/disable.png b/vendor/github.com/logrusorgru/aurora/disable.png new file mode 100644 index 0000000..0dd1d63 Binary files /dev/null and b/vendor/github.com/logrusorgru/aurora/disable.png differ diff --git a/vendor/github.com/logrusorgru/aurora/enable.png b/vendor/github.com/logrusorgru/aurora/enable.png new file mode 100644 index 0000000..a488367 Binary files /dev/null and b/vendor/github.com/logrusorgru/aurora/enable.png differ diff --git a/vendor/github.com/logrusorgru/aurora/gopher_aurora.png b/vendor/github.com/logrusorgru/aurora/gopher_aurora.png new file mode 100644 index 0000000..8f61bb2 Binary files /dev/null and b/vendor/github.com/logrusorgru/aurora/gopher_aurora.png differ diff --git a/vendor/github.com/logrusorgru/aurora/printf.png b/vendor/github.com/logrusorgru/aurora/printf.png new file mode 100644 index 0000000..5978844 Binary files /dev/null and b/vendor/github.com/logrusorgru/aurora/printf.png differ diff --git a/vendor/github.com/logrusorgru/aurora/simple.png b/vendor/github.com/logrusorgru/aurora/simple.png new file mode 100644 index 0000000..50edf04 Binary files /dev/null and b/vendor/github.com/logrusorgru/aurora/simple.png differ diff --git a/vendor/github.com/logrusorgru/aurora/sprintf.go b/vendor/github.com/logrusorgru/aurora/sprintf.go new file mode 100644 index 0000000..b92d593 --- /dev/null +++ b/vendor/github.com/logrusorgru/aurora/sprintf.go @@ -0,0 +1,68 @@ +// +// Copyright (c) 2016-2020 The Aurora Authors. All rights reserved. +// This program is free software. It comes without any warranty, +// to the extent permitted by applicable law. You can redistribute +// it and/or modify it under the terms of the Unlicense. See LICENSE +// file for more details or see below. +// + +// +// This is free and unencumbered software released into the public domain. +// +// Anyone is free to copy, modify, publish, use, compile, sell, or +// distribute this software, either in source code form or as a compiled +// binary, for any purpose, commercial or non-commercial, and by any +// means. +// +// In jurisdictions that recognize copyright laws, the author or authors +// of this software dedicate any and all copyright interest in the +// software to the public domain. We make this dedication for the benefit +// of the public at large and to the detriment of our heirs and +// successors. We intend this dedication to be an overt act of +// relinquishment in perpetuity of all present and future rights to this +// software under copyright law. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +// OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// +// For more information, please refer to +// + +package aurora + +import ( + "fmt" +) + +// Sprintf allows to use Value as format. For example +// +// v := Sprintf(Red("total: +3.5f points"), Blue(3.14)) +// +// In this case "total:" and "points" will be red, but +// 3.14 will be blue. But, in another example +// +// v := Sprintf(Red("total: +3.5f points"), 3.14) +// +// full string will be red. And no way to clear 3.14 to +// default format and color +func Sprintf(format interface{}, args ...interface{}) string { + switch ft := format.(type) { + case string: + return fmt.Sprintf(ft, args...) + case Value: + for i, v := range args { + if val, ok := v.(Value); ok { + args[i] = val.setTail(ft.Color()) + continue + } + } + return fmt.Sprintf(ft.String(), args...) + } + // unknown type of format (we hope it's a string) + return fmt.Sprintf(fmt.Sprint(format), args...) +} diff --git a/vendor/github.com/logrusorgru/aurora/sprintf.png b/vendor/github.com/logrusorgru/aurora/sprintf.png new file mode 100644 index 0000000..df2b2cc Binary files /dev/null and b/vendor/github.com/logrusorgru/aurora/sprintf.png differ diff --git a/vendor/github.com/logrusorgru/aurora/value.go b/vendor/github.com/logrusorgru/aurora/value.go new file mode 100644 index 0000000..feda25a --- /dev/null +++ b/vendor/github.com/logrusorgru/aurora/value.go @@ -0,0 +1,745 @@ +// +// Copyright (c) 2016-2020 The Aurora Authors. All rights reserved. +// This program is free software. It comes without any warranty, +// to the extent permitted by applicable law. You can redistribute +// it and/or modify it under the terms of the Unlicense. See LICENSE +// file for more details or see below. +// + +// +// This is free and unencumbered software released into the public domain. +// +// Anyone is free to copy, modify, publish, use, compile, sell, or +// distribute this software, either in source code form or as a compiled +// binary, for any purpose, commercial or non-commercial, and by any +// means. +// +// In jurisdictions that recognize copyright laws, the author or authors +// of this software dedicate any and all copyright interest in the +// software to the public domain. We make this dedication for the benefit +// of the public at large and to the detriment of our heirs and +// successors. We intend this dedication to be an overt act of +// relinquishment in perpetuity of all present and future rights to this +// software under copyright law. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +// OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// +// For more information, please refer to +// + +package aurora + +import ( + "fmt" + "strconv" + "unicode/utf8" +) + +// A Value represents any printable value +// with it's color +type Value interface { + // String returns string with colors. If there are any color + // or format the string will be terminated with \033[0m + fmt.Stringer + // Format implements fmt.Formatter interface + fmt.Formatter + // Color returns value's color + Color() Color + // Value returns value's value (welcome to the tautology club) + Value() interface{} + + // internals + tail() Color + setTail(Color) Value + + // Bleach returns copy of original value without colors + // + // Deprecated: use Reset instead. + Bleach() Value + // Reset colors and formats + Reset() Value + + // + // Formats + // + // + // Bold or increased intensity (1). + Bold() Value + // Faint, decreased intensity, reset the Bold (2). + Faint() Value + // + // DoublyUnderline or Bold off, double-underline + // per ECMA-48 (21). It depends. + DoublyUnderline() Value + // Fraktur, rarely supported (20). + Fraktur() Value + // + // Italic, not widely supported, sometimes + // treated as inverse (3). + Italic() Value + // Underline (4). + Underline() Value + // + // SlowBlink, blinking less than 150 + // per minute (5). + SlowBlink() Value + // RapidBlink, blinking 150+ per minute, + // not widely supported (6). + RapidBlink() Value + // Blink is alias for the SlowBlink. + Blink() Value + // + // Reverse video, swap foreground and + // background colors (7). + Reverse() Value + // Inverse is alias for the Reverse + Inverse() Value + // + // Conceal, hidden, not widely supported (8). + Conceal() Value + // Hidden is alias for the Conceal + Hidden() Value + // + // CrossedOut, characters legible, but + // marked for deletion (9). + CrossedOut() Value + // StrikeThrough is alias for the CrossedOut. + StrikeThrough() Value + // + // Framed (51). + Framed() Value + // Encircled (52). + Encircled() Value + // + // Overlined (53). + Overlined() Value + + // + // Foreground colors + // + // + // Black foreground color (30) + Black() Value + // Red foreground color (31) + Red() Value + // Green foreground color (32) + Green() Value + // Yellow foreground color (33) + Yellow() Value + // Brown foreground color (33) + // + // Deprecated: use Yellow instead, following specification + Brown() Value + // Blue foreground color (34) + Blue() Value + // Magenta foreground color (35) + Magenta() Value + // Cyan foreground color (36) + Cyan() Value + // White foreground color (37) + White() Value + // + // Bright foreground colors + // + // BrightBlack foreground color (90) + BrightBlack() Value + // BrightRed foreground color (91) + BrightRed() Value + // BrightGreen foreground color (92) + BrightGreen() Value + // BrightYellow foreground color (93) + BrightYellow() Value + // BrightBlue foreground color (94) + BrightBlue() Value + // BrightMagenta foreground color (95) + BrightMagenta() Value + // BrightCyan foreground color (96) + BrightCyan() Value + // BrightWhite foreground color (97) + BrightWhite() Value + // + // Other + // + // Index of pre-defined 8-bit foreground color + // from 0 to 255 (38;5;n). + // + // 0- 7: standard colors (as in ESC [ 30–37 m) + // 8- 15: high intensity colors (as in ESC [ 90–97 m) + // 16-231: 6 × 6 × 6 cube (216 colors): 16 + 36 × r + 6 × g + b (0 ≤ r, g, b ≤ 5) + // 232-255: grayscale from black to white in 24 steps + // + Index(n uint8) Value + // Gray from 0 to 24. + Gray(n uint8) Value + + // + // Background colors + // + // + // BgBlack background color (40) + BgBlack() Value + // BgRed background color (41) + BgRed() Value + // BgGreen background color (42) + BgGreen() Value + // BgYellow background color (43) + BgYellow() Value + // BgBrown background color (43) + // + // Deprecated: use BgYellow instead, following specification + BgBrown() Value + // BgBlue background color (44) + BgBlue() Value + // BgMagenta background color (45) + BgMagenta() Value + // BgCyan background color (46) + BgCyan() Value + // BgWhite background color (47) + BgWhite() Value + // + // Bright background colors + // + // BgBrightBlack background color (100) + BgBrightBlack() Value + // BgBrightRed background color (101) + BgBrightRed() Value + // BgBrightGreen background color (102) + BgBrightGreen() Value + // BgBrightYellow background color (103) + BgBrightYellow() Value + // BgBrightBlue background color (104) + BgBrightBlue() Value + // BgBrightMagenta background color (105) + BgBrightMagenta() Value + // BgBrightCyan background color (106) + BgBrightCyan() Value + // BgBrightWhite background color (107) + BgBrightWhite() Value + // + // Other + // + // BgIndex of 8-bit pre-defined background color + // from 0 to 255 (48;5;n). + // + // 0- 7: standard colors (as in ESC [ 40–47 m) + // 8- 15: high intensity colors (as in ESC [100–107 m) + // 16-231: 6 × 6 × 6 cube (216 colors): 16 + 36 × r + 6 × g + b (0 ≤ r, g, b ≤ 5) + // 232-255: grayscale from black to white in 24 steps + // + BgIndex(n uint8) Value + // BgGray from 0 to 24. + BgGray(n uint8) Value + + // + // Special + // + // Colorize removes existing colors and + // formats of the argument and applies given. + Colorize(color Color) Value +} + +// Value without colors + +type valueClear struct { + value interface{} +} + +func (vc valueClear) String() string { return fmt.Sprint(vc.value) } + +func (vc valueClear) Color() Color { return 0 } +func (vc valueClear) Value() interface{} { return vc.value } + +func (vc valueClear) tail() Color { return 0 } +func (vc valueClear) setTail(Color) Value { return vc } + +func (vc valueClear) Bleach() Value { return vc } +func (vc valueClear) Reset() Value { return vc } + +func (vc valueClear) Bold() Value { return vc } +func (vc valueClear) Faint() Value { return vc } +func (vc valueClear) DoublyUnderline() Value { return vc } +func (vc valueClear) Fraktur() Value { return vc } +func (vc valueClear) Italic() Value { return vc } +func (vc valueClear) Underline() Value { return vc } +func (vc valueClear) SlowBlink() Value { return vc } +func (vc valueClear) RapidBlink() Value { return vc } +func (vc valueClear) Blink() Value { return vc } +func (vc valueClear) Reverse() Value { return vc } +func (vc valueClear) Inverse() Value { return vc } +func (vc valueClear) Conceal() Value { return vc } +func (vc valueClear) Hidden() Value { return vc } +func (vc valueClear) CrossedOut() Value { return vc } +func (vc valueClear) StrikeThrough() Value { return vc } +func (vc valueClear) Framed() Value { return vc } +func (vc valueClear) Encircled() Value { return vc } +func (vc valueClear) Overlined() Value { return vc } + +func (vc valueClear) Black() Value { return vc } +func (vc valueClear) Red() Value { return vc } +func (vc valueClear) Green() Value { return vc } +func (vc valueClear) Yellow() Value { return vc } +func (vc valueClear) Brown() Value { return vc } +func (vc valueClear) Blue() Value { return vc } +func (vc valueClear) Magenta() Value { return vc } +func (vc valueClear) Cyan() Value { return vc } +func (vc valueClear) White() Value { return vc } +func (vc valueClear) BrightBlack() Value { return vc } +func (vc valueClear) BrightRed() Value { return vc } +func (vc valueClear) BrightGreen() Value { return vc } +func (vc valueClear) BrightYellow() Value { return vc } +func (vc valueClear) BrightBlue() Value { return vc } +func (vc valueClear) BrightMagenta() Value { return vc } +func (vc valueClear) BrightCyan() Value { return vc } +func (vc valueClear) BrightWhite() Value { return vc } +func (vc valueClear) Index(uint8) Value { return vc } +func (vc valueClear) Gray(uint8) Value { return vc } + +func (vc valueClear) BgBlack() Value { return vc } +func (vc valueClear) BgRed() Value { return vc } +func (vc valueClear) BgGreen() Value { return vc } +func (vc valueClear) BgYellow() Value { return vc } +func (vc valueClear) BgBrown() Value { return vc } +func (vc valueClear) BgBlue() Value { return vc } +func (vc valueClear) BgMagenta() Value { return vc } +func (vc valueClear) BgCyan() Value { return vc } +func (vc valueClear) BgWhite() Value { return vc } +func (vc valueClear) BgBrightBlack() Value { return vc } +func (vc valueClear) BgBrightRed() Value { return vc } +func (vc valueClear) BgBrightGreen() Value { return vc } +func (vc valueClear) BgBrightYellow() Value { return vc } +func (vc valueClear) BgBrightBlue() Value { return vc } +func (vc valueClear) BgBrightMagenta() Value { return vc } +func (vc valueClear) BgBrightCyan() Value { return vc } +func (vc valueClear) BgBrightWhite() Value { return vc } +func (vc valueClear) BgIndex(uint8) Value { return vc } +func (vc valueClear) BgGray(uint8) Value { return vc } +func (vc valueClear) Colorize(Color) Value { return vc } + +func (vc valueClear) Format(s fmt.State, verb rune) { + // it's enough for many cases (%-+020.10f) + // % - 1 + // availFlags - 3 (5) + // width - 2 + // prec - 3 (.23) + // verb - 1 + // -------------- + // 10 + format := make([]byte, 1, 10) + format[0] = '%' + var f byte + for i := 0; i < len(availFlags); i++ { + if f = availFlags[i]; s.Flag(int(f)) { + format = append(format, f) + } + } + var width, prec int + var ok bool + if width, ok = s.Width(); ok { + format = strconv.AppendInt(format, int64(width), 10) + } + if prec, ok = s.Precision(); ok { + format = append(format, '.') + format = strconv.AppendInt(format, int64(prec), 10) + } + if verb > utf8.RuneSelf { + format = append(format, string(verb)...) + } else { + format = append(format, byte(verb)) + } + fmt.Fprintf(s, string(format), vc.value) +} + +// Value within colors + +type value struct { + value interface{} // value as it + color Color // this color + tailColor Color // tail color +} + +func (v value) String() string { + if v.color != 0 { + if v.tailColor != 0 { + return esc + v.color.Nos(true) + "m" + + fmt.Sprint(v.value) + + esc + v.tailColor.Nos(true) + "m" + } + return esc + v.color.Nos(false) + "m" + fmt.Sprint(v.value) + clear + } + return fmt.Sprint(v.value) +} + +func (v value) Color() Color { return v.color } + +func (v value) Bleach() Value { + v.color, v.tailColor = 0, 0 + return v +} + +func (v value) Reset() Value { + v.color, v.tailColor = 0, 0 + return v +} + +func (v value) tail() Color { return v.tailColor } + +func (v value) setTail(t Color) Value { + v.tailColor = t + return v +} + +func (v value) Value() interface{} { return v.value } + +func (v value) Format(s fmt.State, verb rune) { + + // it's enough for many cases (%-+020.10f) + // % - 1 + // availFlags - 3 (5) + // width - 2 + // prec - 3 (.23) + // verb - 1 + // -------------- + // 10 + // + + // \033[ 5 + // 0;1;3;4;5;7;8;9;20;21;51;52;53 30 + // 38;5;216 8 + // 48;5;216 8 + // m 1 + // + + // \033[0m 7 + // + // x2 (possible tail color) + // + // 10 + 59 * 2 = 128 + + format := make([]byte, 0, 128) + if v.color != 0 { + format = append(format, esc...) + format = v.color.appendNos(format, v.tailColor != 0) + format = append(format, 'm') + } + format = append(format, '%') + var f byte + for i := 0; i < len(availFlags); i++ { + if f = availFlags[i]; s.Flag(int(f)) { + format = append(format, f) + } + } + var width, prec int + var ok bool + if width, ok = s.Width(); ok { + format = strconv.AppendInt(format, int64(width), 10) + } + if prec, ok = s.Precision(); ok { + format = append(format, '.') + format = strconv.AppendInt(format, int64(prec), 10) + } + if verb > utf8.RuneSelf { + format = append(format, string(verb)...) + } else { + format = append(format, byte(verb)) + } + if v.color != 0 { + if v.tailColor != 0 { + // set next (previous) format clearing current one + format = append(format, esc...) + format = v.tailColor.appendNos(format, true) + format = append(format, 'm') + } else { + format = append(format, clear...) // just clear + } + } + fmt.Fprintf(s, string(format), v.value) +} + +func (v value) Bold() Value { + v.color = (v.color &^ FaintFm) | BoldFm + return v +} + +func (v value) Faint() Value { + v.color = (v.color &^ BoldFm) | FaintFm + return v +} + +func (v value) DoublyUnderline() Value { + v.color |= DoublyUnderlineFm + return v +} + +func (v value) Fraktur() Value { + v.color |= FrakturFm + return v +} + +func (v value) Italic() Value { + v.color |= ItalicFm + return v +} + +func (v value) Underline() Value { + v.color |= UnderlineFm + return v +} + +func (v value) SlowBlink() Value { + v.color = (v.color &^ RapidBlinkFm) | SlowBlinkFm + return v +} + +func (v value) RapidBlink() Value { + v.color = (v.color &^ SlowBlinkFm) | RapidBlinkFm + return v +} + +func (v value) Blink() Value { + return v.SlowBlink() +} + +func (v value) Reverse() Value { + v.color |= ReverseFm + return v +} + +func (v value) Inverse() Value { + return v.Reverse() +} + +func (v value) Conceal() Value { + v.color |= ConcealFm + return v +} + +func (v value) Hidden() Value { + return v.Conceal() +} + +func (v value) CrossedOut() Value { + v.color |= CrossedOutFm + return v +} + +func (v value) StrikeThrough() Value { + return v.CrossedOut() +} + +func (v value) Framed() Value { + v.color |= FramedFm + return v +} + +func (v value) Encircled() Value { + v.color |= EncircledFm + return v +} + +func (v value) Overlined() Value { + v.color |= OverlinedFm + return v +} + +func (v value) Black() Value { + v.color = (v.color &^ maskFg) | BlackFg + return v +} + +func (v value) Red() Value { + v.color = (v.color &^ maskFg) | RedFg + return v +} + +func (v value) Green() Value { + v.color = (v.color &^ maskFg) | GreenFg + return v +} + +func (v value) Yellow() Value { + v.color = (v.color &^ maskFg) | YellowFg + return v +} + +func (v value) Brown() Value { + return v.Yellow() +} + +func (v value) Blue() Value { + v.color = (v.color &^ maskFg) | BlueFg + return v +} + +func (v value) Magenta() Value { + v.color = (v.color &^ maskFg) | MagentaFg + return v +} + +func (v value) Cyan() Value { + v.color = (v.color &^ maskFg) | CyanFg + return v +} + +func (v value) White() Value { + v.color = (v.color &^ maskFg) | WhiteFg + return v +} + +func (v value) BrightBlack() Value { + v.color = (v.color &^ maskFg) | BrightFg | BlackFg + return v +} + +func (v value) BrightRed() Value { + v.color = (v.color &^ maskFg) | BrightFg | RedFg + return v +} + +func (v value) BrightGreen() Value { + v.color = (v.color &^ maskFg) | BrightFg | GreenFg + return v +} + +func (v value) BrightYellow() Value { + v.color = (v.color &^ maskFg) | BrightFg | YellowFg + return v +} + +func (v value) BrightBlue() Value { + v.color = (v.color &^ maskFg) | BrightFg | BlueFg + return v +} + +func (v value) BrightMagenta() Value { + v.color = (v.color &^ maskFg) | BrightFg | MagentaFg + return v +} + +func (v value) BrightCyan() Value { + v.color = (v.color &^ maskFg) | BrightFg | CyanFg + return v +} + +func (v value) BrightWhite() Value { + v.color = (v.color &^ maskFg) | BrightFg | WhiteFg + return v +} + +func (v value) Index(n uint8) Value { + v.color = (v.color &^ maskFg) | (Color(n) << shiftFg) | flagFg + return v +} + +func (v value) Gray(n uint8) Value { + if n > 23 { + n = 23 + } + v.color = (v.color &^ maskFg) | (Color(232+n) << shiftFg) | flagFg + return v +} + +func (v value) BgBlack() Value { + v.color = (v.color &^ maskBg) | BlackBg + return v +} + +func (v value) BgRed() Value { + v.color = (v.color &^ maskBg) | RedBg + return v +} + +func (v value) BgGreen() Value { + v.color = (v.color &^ maskBg) | GreenBg + return v +} + +func (v value) BgYellow() Value { + v.color = (v.color &^ maskBg) | YellowBg + return v +} + +func (v value) BgBrown() Value { + return v.BgYellow() +} + +func (v value) BgBlue() Value { + v.color = (v.color &^ maskBg) | BlueBg + return v +} + +func (v value) BgMagenta() Value { + v.color = (v.color &^ maskBg) | MagentaBg + return v +} + +func (v value) BgCyan() Value { + v.color = (v.color &^ maskBg) | CyanBg + return v +} + +func (v value) BgWhite() Value { + v.color = (v.color &^ maskBg) | WhiteBg + return v +} + +func (v value) BgBrightBlack() Value { + v.color = (v.color &^ maskBg) | BrightBg | BlackBg + return v +} + +func (v value) BgBrightRed() Value { + v.color = (v.color &^ maskBg) | BrightBg | RedBg + return v +} + +func (v value) BgBrightGreen() Value { + v.color = (v.color &^ maskBg) | BrightBg | GreenBg + return v +} + +func (v value) BgBrightYellow() Value { + v.color = (v.color &^ maskBg) | BrightBg | YellowBg + return v +} + +func (v value) BgBrightBlue() Value { + v.color = (v.color &^ maskBg) | BrightBg | BlueBg + return v +} + +func (v value) BgBrightMagenta() Value { + v.color = (v.color &^ maskBg) | BrightBg | MagentaBg + return v +} + +func (v value) BgBrightCyan() Value { + v.color = (v.color &^ maskBg) | BrightBg | CyanBg + return v +} + +func (v value) BgBrightWhite() Value { + v.color = (v.color &^ maskBg) | BrightBg | WhiteBg + return v +} + +func (v value) BgIndex(n uint8) Value { + v.color = (v.color &^ maskBg) | (Color(n) << shiftBg) | flagBg + return v +} + +func (v value) BgGray(n uint8) Value { + if n > 23 { + n = 23 + } + v.color = (v.color &^ maskBg) | (Color(232+n) << shiftBg) | flagBg + return v +} + +func (v value) Colorize(color Color) Value { + v.color = color + return v +} diff --git a/vendor/github.com/logrusorgru/aurora/wrap.go b/vendor/github.com/logrusorgru/aurora/wrap.go new file mode 100644 index 0000000..44e1aa6 --- /dev/null +++ b/vendor/github.com/logrusorgru/aurora/wrap.go @@ -0,0 +1,558 @@ +// +// Copyright (c) 2016-2020 The Aurora Authors. All rights reserved. +// This program is free software. It comes without any warranty, +// to the extent permitted by applicable law. You can redistribute +// it and/or modify it under the terms of the Unlicense. See LICENSE +// file for more details or see below. +// + +// +// This is free and unencumbered software released into the public domain. +// +// Anyone is free to copy, modify, publish, use, compile, sell, or +// distribute this software, either in source code form or as a compiled +// binary, for any purpose, commercial or non-commercial, and by any +// means. +// +// In jurisdictions that recognize copyright laws, the author or authors +// of this software dedicate any and all copyright interest in the +// software to the public domain. We make this dedication for the benefit +// of the public at large and to the detriment of our heirs and +// successors. We intend this dedication to be an overt act of +// relinquishment in perpetuity of all present and future rights to this +// software under copyright law. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +// OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// +// For more information, please refer to +// + +package aurora + +// Colorize wraps given value into Value with +// given colors. For example +// +// s := Colorize("some", BlueFg|GreenBg|BoldFm) +// +// returns a Value with blue foreground, green +// background and bold. Unlike functions like +// Red/BgBlue/Bold etc. This function clears +// all previous colors and formats. Thus +// +// s := Colorize(Red("some"), BgBlue) +// +// clears red color from value +func Colorize(arg interface{}, color Color) Value { + if val, ok := arg.(value); ok { + val.color = color + return val + } + return value{arg, color, 0} +} + +// Reset wraps given argument returning Value +// without formats and colors. +func Reset(arg interface{}) Value { + if val, ok := arg.(Value); ok { + return val.Reset() + } + return value{value: arg} +} + +// +// Formats +// + +// Bold or increased intensity (1). +func Bold(arg interface{}) Value { + if val, ok := arg.(Value); ok { + return val.Bold() + } + return value{value: arg, color: BoldFm} +} + +// Faint decreases intensity (2). +// The Faint rejects the Bold. +func Faint(arg interface{}) Value { + if val, ok := arg.(Value); ok { + return val.Faint() + } + return value{value: arg, color: FaintFm} +} + +// DoublyUnderline or Bold off, double-underline +// per ECMA-48 (21). +func DoublyUnderline(arg interface{}) Value { + if val, ok := arg.(Value); ok { + return val.DoublyUnderline() + } + return value{value: arg, color: DoublyUnderlineFm} +} + +// Fraktur is rarely supported (20). +func Fraktur(arg interface{}) Value { + if val, ok := arg.(Value); ok { + return val.Fraktur() + } + return value{value: arg, color: FrakturFm} +} + +// Italic is not widely supported, sometimes +// treated as inverse (3). +func Italic(arg interface{}) Value { + if val, ok := arg.(Value); ok { + return val.Italic() + } + return value{value: arg, color: ItalicFm} +} + +// Underline (4). +func Underline(arg interface{}) Value { + if val, ok := arg.(Value); ok { + return val.Underline() + } + return value{value: arg, color: UnderlineFm} +} + +// SlowBlink makes text blink less than +// 150 per minute (5). +func SlowBlink(arg interface{}) Value { + if val, ok := arg.(Value); ok { + return val.SlowBlink() + } + return value{value: arg, color: SlowBlinkFm} +} + +// RapidBlink makes text blink 150+ per +// minute. It is not widely supported (6). +func RapidBlink(arg interface{}) Value { + if val, ok := arg.(Value); ok { + return val.RapidBlink() + } + return value{value: arg, color: RapidBlinkFm} +} + +// Blink is alias for the SlowBlink. +func Blink(arg interface{}) Value { + return SlowBlink(arg) +} + +// Reverse video, swap foreground and +// background colors (7). +func Reverse(arg interface{}) Value { + if val, ok := arg.(Value); ok { + return val.Reverse() + } + return value{value: arg, color: ReverseFm} +} + +// Inverse is alias for the Reverse +func Inverse(arg interface{}) Value { + return Reverse(arg) +} + +// Conceal hides text, preserving an ability to select +// the text and copy it. It is not widely supported (8). +func Conceal(arg interface{}) Value { + if val, ok := arg.(Value); ok { + return val.Conceal() + } + return value{value: arg, color: ConcealFm} +} + +// Hidden is alias for the Conceal +func Hidden(arg interface{}) Value { + return Conceal(arg) +} + +// CrossedOut makes characters legible, but +// marked for deletion (9). +func CrossedOut(arg interface{}) Value { + if val, ok := arg.(Value); ok { + return val.CrossedOut() + } + return value{value: arg, color: CrossedOutFm} +} + +// StrikeThrough is alias for the CrossedOut. +func StrikeThrough(arg interface{}) Value { + return CrossedOut(arg) +} + +// Framed (51). +func Framed(arg interface{}) Value { + if val, ok := arg.(Value); ok { + return val.Framed() + } + return value{value: arg, color: FramedFm} +} + +// Encircled (52). +func Encircled(arg interface{}) Value { + if val, ok := arg.(Value); ok { + return val.Encircled() + } + return value{value: arg, color: EncircledFm} +} + +// Overlined (53). +func Overlined(arg interface{}) Value { + if val, ok := arg.(Value); ok { + return val.Overlined() + } + return value{value: arg, color: OverlinedFm} +} + +// +// Foreground colors +// +// + +// Black foreground color (30) +func Black(arg interface{}) Value { + if val, ok := arg.(Value); ok { + return val.Black() + } + return value{value: arg, color: BlackFg} +} + +// Red foreground color (31) +func Red(arg interface{}) Value { + if val, ok := arg.(Value); ok { + return val.Red() + } + return value{value: arg, color: RedFg} +} + +// Green foreground color (32) +func Green(arg interface{}) Value { + if val, ok := arg.(Value); ok { + return val.Green() + } + return value{value: arg, color: GreenFg} +} + +// Yellow foreground color (33) +func Yellow(arg interface{}) Value { + if val, ok := arg.(Value); ok { + return val.Yellow() + } + return value{value: arg, color: YellowFg} +} + +// Brown foreground color (33) +// +// Deprecated: use Yellow instead, following specification +func Brown(arg interface{}) Value { + return Yellow(arg) +} + +// Blue foreground color (34) +func Blue(arg interface{}) Value { + if val, ok := arg.(Value); ok { + return val.Blue() + } + return value{value: arg, color: BlueFg} +} + +// Magenta foreground color (35) +func Magenta(arg interface{}) Value { + if val, ok := arg.(Value); ok { + return val.Magenta() + } + return value{value: arg, color: MagentaFg} +} + +// Cyan foreground color (36) +func Cyan(arg interface{}) Value { + if val, ok := arg.(Value); ok { + return val.Cyan() + } + return value{value: arg, color: CyanFg} +} + +// White foreground color (37) +func White(arg interface{}) Value { + if val, ok := arg.(Value); ok { + return val.White() + } + return value{value: arg, color: WhiteFg} +} + +// +// Bright foreground colors +// + +// BrightBlack foreground color (90) +func BrightBlack(arg interface{}) Value { + if val, ok := arg.(Value); ok { + return val.BrightBlack() + } + return value{value: arg, color: BrightFg | BlackFg} +} + +// BrightRed foreground color (91) +func BrightRed(arg interface{}) Value { + if val, ok := arg.(Value); ok { + return val.BrightRed() + } + return value{value: arg, color: BrightFg | RedFg} +} + +// BrightGreen foreground color (92) +func BrightGreen(arg interface{}) Value { + if val, ok := arg.(Value); ok { + return val.BrightGreen() + } + return value{value: arg, color: BrightFg | GreenFg} +} + +// BrightYellow foreground color (93) +func BrightYellow(arg interface{}) Value { + if val, ok := arg.(Value); ok { + return val.BrightYellow() + } + return value{value: arg, color: BrightFg | YellowFg} +} + +// BrightBlue foreground color (94) +func BrightBlue(arg interface{}) Value { + if val, ok := arg.(Value); ok { + return val.BrightBlue() + } + return value{value: arg, color: BrightFg | BlueFg} +} + +// BrightMagenta foreground color (95) +func BrightMagenta(arg interface{}) Value { + if val, ok := arg.(Value); ok { + return val.BrightMagenta() + } + return value{value: arg, color: BrightFg | MagentaFg} +} + +// BrightCyan foreground color (96) +func BrightCyan(arg interface{}) Value { + if val, ok := arg.(Value); ok { + return val.BrightCyan() + } + return value{value: arg, color: BrightFg | CyanFg} +} + +// BrightWhite foreground color (97) +func BrightWhite(arg interface{}) Value { + if val, ok := arg.(Value); ok { + return val.BrightWhite() + } + return value{value: arg, color: BrightFg | WhiteFg} +} + +// +// Other +// + +// Index of pre-defined 8-bit foreground color +// from 0 to 255 (38;5;n). +// +// 0- 7: standard colors (as in ESC [ 30–37 m) +// 8- 15: high intensity colors (as in ESC [ 90–97 m) +// 16-231: 6 × 6 × 6 cube (216 colors): 16 + 36 × r + 6 × g + b (0 ≤ r, g, b ≤ 5) +// 232-255: grayscale from black to white in 24 steps +// +func Index(n uint8, arg interface{}) Value { + if val, ok := arg.(Value); ok { + return val.Index(n) + } + return value{value: arg, color: (Color(n) << shiftFg) | flagFg} +} + +// Gray from 0 to 24. +func Gray(n uint8, arg interface{}) Value { + if val, ok := arg.(Value); ok { + return val.Gray(n) + } + if n > 23 { + n = 23 + } + return value{value: arg, color: (Color(232+n) << shiftFg) | flagFg} +} + +// +// Background colors +// +// + +// BgBlack background color (40) +func BgBlack(arg interface{}) Value { + if val, ok := arg.(Value); ok { + return val.BgBlack() + } + return value{value: arg, color: BlackBg} +} + +// BgRed background color (41) +func BgRed(arg interface{}) Value { + if val, ok := arg.(Value); ok { + return val.BgRed() + } + return value{value: arg, color: RedBg} +} + +// BgGreen background color (42) +func BgGreen(arg interface{}) Value { + if val, ok := arg.(Value); ok { + return val.BgGreen() + } + return value{value: arg, color: GreenBg} +} + +// BgYellow background color (43) +func BgYellow(arg interface{}) Value { + if val, ok := arg.(Value); ok { + return val.BgYellow() + } + return value{value: arg, color: YellowBg} +} + +// BgBrown background color (43) +// +// Deprecated: use BgYellow instead, following specification +func BgBrown(arg interface{}) Value { + return BgYellow(arg) +} + +// BgBlue background color (44) +func BgBlue(arg interface{}) Value { + if val, ok := arg.(Value); ok { + return val.BgBlue() + } + return value{value: arg, color: BlueBg} +} + +// BgMagenta background color (45) +func BgMagenta(arg interface{}) Value { + if val, ok := arg.(Value); ok { + return val.BgMagenta() + } + return value{value: arg, color: MagentaBg} +} + +// BgCyan background color (46) +func BgCyan(arg interface{}) Value { + if val, ok := arg.(Value); ok { + return val.BgCyan() + } + return value{value: arg, color: CyanBg} +} + +// BgWhite background color (47) +func BgWhite(arg interface{}) Value { + if val, ok := arg.(Value); ok { + return val.BgWhite() + } + return value{value: arg, color: WhiteBg} +} + +// +// Bright background colors +// + +// BgBrightBlack background color (100) +func BgBrightBlack(arg interface{}) Value { + if val, ok := arg.(Value); ok { + return val.BgBrightBlack() + } + return value{value: arg, color: BrightBg | BlackBg} +} + +// BgBrightRed background color (101) +func BgBrightRed(arg interface{}) Value { + if val, ok := arg.(Value); ok { + return val.BgBrightRed() + } + return value{value: arg, color: BrightBg | RedBg} +} + +// BgBrightGreen background color (102) +func BgBrightGreen(arg interface{}) Value { + if val, ok := arg.(Value); ok { + return val.BgBrightGreen() + } + return value{value: arg, color: BrightBg | GreenBg} +} + +// BgBrightYellow background color (103) +func BgBrightYellow(arg interface{}) Value { + if val, ok := arg.(Value); ok { + return val.BgBrightYellow() + } + return value{value: arg, color: BrightBg | YellowBg} +} + +// BgBrightBlue background color (104) +func BgBrightBlue(arg interface{}) Value { + if val, ok := arg.(Value); ok { + return val.BgBrightBlue() + } + return value{value: arg, color: BrightBg | BlueBg} +} + +// BgBrightMagenta background color (105) +func BgBrightMagenta(arg interface{}) Value { + if val, ok := arg.(Value); ok { + return val.BgBrightMagenta() + } + return value{value: arg, color: BrightBg | MagentaBg} +} + +// BgBrightCyan background color (106) +func BgBrightCyan(arg interface{}) Value { + if val, ok := arg.(Value); ok { + return val.BgBrightCyan() + } + return value{value: arg, color: BrightBg | CyanBg} +} + +// BgBrightWhite background color (107) +func BgBrightWhite(arg interface{}) Value { + if val, ok := arg.(Value); ok { + return val.BgBrightWhite() + } + return value{value: arg, color: BrightBg | WhiteBg} +} + +// +// Other +// + +// BgIndex of 8-bit pre-defined background color +// from 0 to 255 (48;5;n). +// +// 0- 7: standard colors (as in ESC [ 40–47 m) +// 8- 15: high intensity colors (as in ESC [100–107 m) +// 16-231: 6 × 6 × 6 cube (216 colors): 16 + 36 × r + 6 × g + b (0 ≤ r, g, b ≤ 5) +// 232-255: grayscale from black to white in 24 steps +// +func BgIndex(n uint8, arg interface{}) Value { + if val, ok := arg.(Value); ok { + return val.BgIndex(n) + } + return value{value: arg, color: (Color(n) << shiftBg) | flagBg} +} + +// BgGray from 0 to 24. +func BgGray(n uint8, arg interface{}) Value { + if val, ok := arg.(Value); ok { + return val.BgGray(n) + } + if n > 23 { + n = 23 + } + return value{value: arg, color: (Color(n+232) << shiftBg) | flagBg} +} diff --git a/vendor/github.com/mattn/go-colorable/.travis.yml b/vendor/github.com/mattn/go-colorable/.travis.yml deleted file mode 100644 index 7942c56..0000000 --- a/vendor/github.com/mattn/go-colorable/.travis.yml +++ /dev/null @@ -1,15 +0,0 @@ -language: go -sudo: false -go: - - 1.13.x - - tip - -before_install: - - go get -t -v ./... - -script: - - ./go.test.sh - -after_success: - - bash <(curl -s https://codecov.io/bash) - diff --git a/vendor/github.com/mattn/go-colorable/README.md b/vendor/github.com/mattn/go-colorable/README.md deleted file mode 100644 index e055952..0000000 --- a/vendor/github.com/mattn/go-colorable/README.md +++ /dev/null @@ -1,48 +0,0 @@ -# go-colorable - -[![Build Status](https://travis-ci.org/mattn/go-colorable.svg?branch=master)](https://travis-ci.org/mattn/go-colorable) -[![Codecov](https://codecov.io/gh/mattn/go-colorable/branch/master/graph/badge.svg)](https://codecov.io/gh/mattn/go-colorable) -[![GoDoc](https://godoc.org/github.com/mattn/go-colorable?status.svg)](http://godoc.org/github.com/mattn/go-colorable) -[![Go Report Card](https://goreportcard.com/badge/mattn/go-colorable)](https://goreportcard.com/report/mattn/go-colorable) - -Colorable writer for windows. - -For example, most of logger packages doesn't show colors on windows. (I know we can do it with ansicon. But I don't want.) -This package is possible to handle escape sequence for ansi color on windows. - -## Too Bad! - -![](https://raw.githubusercontent.com/mattn/go-colorable/gh-pages/bad.png) - - -## So Good! - -![](https://raw.githubusercontent.com/mattn/go-colorable/gh-pages/good.png) - -## Usage - -```go -logrus.SetFormatter(&logrus.TextFormatter{ForceColors: true}) -logrus.SetOutput(colorable.NewColorableStdout()) - -logrus.Info("succeeded") -logrus.Warn("not correct") -logrus.Error("something error") -logrus.Fatal("panic") -``` - -You can compile above code on non-windows OSs. - -## Installation - -``` -$ go get github.com/mattn/go-colorable -``` - -# License - -MIT - -# Author - -Yasuhiro Matsumoto (a.k.a mattn) diff --git a/vendor/github.com/mattn/go-colorable/colorable_appengine.go b/vendor/github.com/mattn/go-colorable/colorable_appengine.go deleted file mode 100644 index 1f7806f..0000000 --- a/vendor/github.com/mattn/go-colorable/colorable_appengine.go +++ /dev/null @@ -1,37 +0,0 @@ -// +build appengine - -package colorable - -import ( - "io" - "os" - - _ "github.com/mattn/go-isatty" -) - -// NewColorable returns new instance of Writer which handles escape sequence. -func NewColorable(file *os.File) io.Writer { - if file == nil { - panic("nil passed instead of *os.File to NewColorable()") - } - - return file -} - -// NewColorableStdout returns new instance of Writer which handles escape sequence for stdout. -func NewColorableStdout() io.Writer { - return os.Stdout -} - -// NewColorableStderr returns new instance of Writer which handles escape sequence for stderr. -func NewColorableStderr() io.Writer { - return os.Stderr -} - -// EnableColorsStdout enable colors if possible. -func EnableColorsStdout(enabled *bool) func() { - if enabled != nil { - *enabled = true - } - return func() {} -} diff --git a/vendor/github.com/mattn/go-colorable/colorable_others.go b/vendor/github.com/mattn/go-colorable/colorable_others.go deleted file mode 100644 index 08cbd1e..0000000 --- a/vendor/github.com/mattn/go-colorable/colorable_others.go +++ /dev/null @@ -1,38 +0,0 @@ -// +build !windows -// +build !appengine - -package colorable - -import ( - "io" - "os" - - _ "github.com/mattn/go-isatty" -) - -// NewColorable returns new instance of Writer which handles escape sequence. -func NewColorable(file *os.File) io.Writer { - if file == nil { - panic("nil passed instead of *os.File to NewColorable()") - } - - return file -} - -// NewColorableStdout returns new instance of Writer which handles escape sequence for stdout. -func NewColorableStdout() io.Writer { - return os.Stdout -} - -// NewColorableStderr returns new instance of Writer which handles escape sequence for stderr. -func NewColorableStderr() io.Writer { - return os.Stderr -} - -// EnableColorsStdout enable colors if possible. -func EnableColorsStdout(enabled *bool) func() { - if enabled != nil { - *enabled = true - } - return func() {} -} diff --git a/vendor/github.com/mattn/go-colorable/colorable_windows.go b/vendor/github.com/mattn/go-colorable/colorable_windows.go deleted file mode 100644 index 41215d7..0000000 --- a/vendor/github.com/mattn/go-colorable/colorable_windows.go +++ /dev/null @@ -1,1043 +0,0 @@ -// +build windows -// +build !appengine - -package colorable - -import ( - "bytes" - "io" - "math" - "os" - "strconv" - "strings" - "sync" - "syscall" - "unsafe" - - "github.com/mattn/go-isatty" -) - -const ( - foregroundBlue = 0x1 - foregroundGreen = 0x2 - foregroundRed = 0x4 - foregroundIntensity = 0x8 - foregroundMask = (foregroundRed | foregroundBlue | foregroundGreen | foregroundIntensity) - backgroundBlue = 0x10 - backgroundGreen = 0x20 - backgroundRed = 0x40 - backgroundIntensity = 0x80 - backgroundMask = (backgroundRed | backgroundBlue | backgroundGreen | backgroundIntensity) - commonLvbUnderscore = 0x8000 - - cENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x4 -) - -const ( - genericRead = 0x80000000 - genericWrite = 0x40000000 -) - -const ( - consoleTextmodeBuffer = 0x1 -) - -type wchar uint16 -type short int16 -type dword uint32 -type word uint16 - -type coord struct { - x short - y short -} - -type smallRect struct { - left short - top short - right short - bottom short -} - -type consoleScreenBufferInfo struct { - size coord - cursorPosition coord - attributes word - window smallRect - maximumWindowSize coord -} - -type consoleCursorInfo struct { - size dword - visible int32 -} - -var ( - kernel32 = syscall.NewLazyDLL("kernel32.dll") - procGetConsoleScreenBufferInfo = kernel32.NewProc("GetConsoleScreenBufferInfo") - procSetConsoleTextAttribute = kernel32.NewProc("SetConsoleTextAttribute") - procSetConsoleCursorPosition = kernel32.NewProc("SetConsoleCursorPosition") - procFillConsoleOutputCharacter = kernel32.NewProc("FillConsoleOutputCharacterW") - procFillConsoleOutputAttribute = kernel32.NewProc("FillConsoleOutputAttribute") - procGetConsoleCursorInfo = kernel32.NewProc("GetConsoleCursorInfo") - procSetConsoleCursorInfo = kernel32.NewProc("SetConsoleCursorInfo") - procSetConsoleTitle = kernel32.NewProc("SetConsoleTitleW") - procGetConsoleMode = kernel32.NewProc("GetConsoleMode") - procSetConsoleMode = kernel32.NewProc("SetConsoleMode") - procCreateConsoleScreenBuffer = kernel32.NewProc("CreateConsoleScreenBuffer") -) - -// Writer provides colorable Writer to the console -type Writer struct { - out io.Writer - handle syscall.Handle - althandle syscall.Handle - oldattr word - oldpos coord - rest bytes.Buffer - mutex sync.Mutex -} - -// NewColorable returns new instance of Writer which handles escape sequence from File. -func NewColorable(file *os.File) io.Writer { - if file == nil { - panic("nil passed instead of *os.File to NewColorable()") - } - - if isatty.IsTerminal(file.Fd()) { - var mode uint32 - if r, _, _ := procGetConsoleMode.Call(file.Fd(), uintptr(unsafe.Pointer(&mode))); r != 0 && mode&cENABLE_VIRTUAL_TERMINAL_PROCESSING != 0 { - return file - } - var csbi consoleScreenBufferInfo - handle := syscall.Handle(file.Fd()) - procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) - return &Writer{out: file, handle: handle, oldattr: csbi.attributes, oldpos: coord{0, 0}} - } - return file -} - -// NewColorableStdout returns new instance of Writer which handles escape sequence for stdout. -func NewColorableStdout() io.Writer { - return NewColorable(os.Stdout) -} - -// NewColorableStderr returns new instance of Writer which handles escape sequence for stderr. -func NewColorableStderr() io.Writer { - return NewColorable(os.Stderr) -} - -var color256 = map[int]int{ - 0: 0x000000, - 1: 0x800000, - 2: 0x008000, - 3: 0x808000, - 4: 0x000080, - 5: 0x800080, - 6: 0x008080, - 7: 0xc0c0c0, - 8: 0x808080, - 9: 0xff0000, - 10: 0x00ff00, - 11: 0xffff00, - 12: 0x0000ff, - 13: 0xff00ff, - 14: 0x00ffff, - 15: 0xffffff, - 16: 0x000000, - 17: 0x00005f, - 18: 0x000087, - 19: 0x0000af, - 20: 0x0000d7, - 21: 0x0000ff, - 22: 0x005f00, - 23: 0x005f5f, - 24: 0x005f87, - 25: 0x005faf, - 26: 0x005fd7, - 27: 0x005fff, - 28: 0x008700, - 29: 0x00875f, - 30: 0x008787, - 31: 0x0087af, - 32: 0x0087d7, - 33: 0x0087ff, - 34: 0x00af00, - 35: 0x00af5f, - 36: 0x00af87, - 37: 0x00afaf, - 38: 0x00afd7, - 39: 0x00afff, - 40: 0x00d700, - 41: 0x00d75f, - 42: 0x00d787, - 43: 0x00d7af, - 44: 0x00d7d7, - 45: 0x00d7ff, - 46: 0x00ff00, - 47: 0x00ff5f, - 48: 0x00ff87, - 49: 0x00ffaf, - 50: 0x00ffd7, - 51: 0x00ffff, - 52: 0x5f0000, - 53: 0x5f005f, - 54: 0x5f0087, - 55: 0x5f00af, - 56: 0x5f00d7, - 57: 0x5f00ff, - 58: 0x5f5f00, - 59: 0x5f5f5f, - 60: 0x5f5f87, - 61: 0x5f5faf, - 62: 0x5f5fd7, - 63: 0x5f5fff, - 64: 0x5f8700, - 65: 0x5f875f, - 66: 0x5f8787, - 67: 0x5f87af, - 68: 0x5f87d7, - 69: 0x5f87ff, - 70: 0x5faf00, - 71: 0x5faf5f, - 72: 0x5faf87, - 73: 0x5fafaf, - 74: 0x5fafd7, - 75: 0x5fafff, - 76: 0x5fd700, - 77: 0x5fd75f, - 78: 0x5fd787, - 79: 0x5fd7af, - 80: 0x5fd7d7, - 81: 0x5fd7ff, - 82: 0x5fff00, - 83: 0x5fff5f, - 84: 0x5fff87, - 85: 0x5fffaf, - 86: 0x5fffd7, - 87: 0x5fffff, - 88: 0x870000, - 89: 0x87005f, - 90: 0x870087, - 91: 0x8700af, - 92: 0x8700d7, - 93: 0x8700ff, - 94: 0x875f00, - 95: 0x875f5f, - 96: 0x875f87, - 97: 0x875faf, - 98: 0x875fd7, - 99: 0x875fff, - 100: 0x878700, - 101: 0x87875f, - 102: 0x878787, - 103: 0x8787af, - 104: 0x8787d7, - 105: 0x8787ff, - 106: 0x87af00, - 107: 0x87af5f, - 108: 0x87af87, - 109: 0x87afaf, - 110: 0x87afd7, - 111: 0x87afff, - 112: 0x87d700, - 113: 0x87d75f, - 114: 0x87d787, - 115: 0x87d7af, - 116: 0x87d7d7, - 117: 0x87d7ff, - 118: 0x87ff00, - 119: 0x87ff5f, - 120: 0x87ff87, - 121: 0x87ffaf, - 122: 0x87ffd7, - 123: 0x87ffff, - 124: 0xaf0000, - 125: 0xaf005f, - 126: 0xaf0087, - 127: 0xaf00af, - 128: 0xaf00d7, - 129: 0xaf00ff, - 130: 0xaf5f00, - 131: 0xaf5f5f, - 132: 0xaf5f87, - 133: 0xaf5faf, - 134: 0xaf5fd7, - 135: 0xaf5fff, - 136: 0xaf8700, - 137: 0xaf875f, - 138: 0xaf8787, - 139: 0xaf87af, - 140: 0xaf87d7, - 141: 0xaf87ff, - 142: 0xafaf00, - 143: 0xafaf5f, - 144: 0xafaf87, - 145: 0xafafaf, - 146: 0xafafd7, - 147: 0xafafff, - 148: 0xafd700, - 149: 0xafd75f, - 150: 0xafd787, - 151: 0xafd7af, - 152: 0xafd7d7, - 153: 0xafd7ff, - 154: 0xafff00, - 155: 0xafff5f, - 156: 0xafff87, - 157: 0xafffaf, - 158: 0xafffd7, - 159: 0xafffff, - 160: 0xd70000, - 161: 0xd7005f, - 162: 0xd70087, - 163: 0xd700af, - 164: 0xd700d7, - 165: 0xd700ff, - 166: 0xd75f00, - 167: 0xd75f5f, - 168: 0xd75f87, - 169: 0xd75faf, - 170: 0xd75fd7, - 171: 0xd75fff, - 172: 0xd78700, - 173: 0xd7875f, - 174: 0xd78787, - 175: 0xd787af, - 176: 0xd787d7, - 177: 0xd787ff, - 178: 0xd7af00, - 179: 0xd7af5f, - 180: 0xd7af87, - 181: 0xd7afaf, - 182: 0xd7afd7, - 183: 0xd7afff, - 184: 0xd7d700, - 185: 0xd7d75f, - 186: 0xd7d787, - 187: 0xd7d7af, - 188: 0xd7d7d7, - 189: 0xd7d7ff, - 190: 0xd7ff00, - 191: 0xd7ff5f, - 192: 0xd7ff87, - 193: 0xd7ffaf, - 194: 0xd7ffd7, - 195: 0xd7ffff, - 196: 0xff0000, - 197: 0xff005f, - 198: 0xff0087, - 199: 0xff00af, - 200: 0xff00d7, - 201: 0xff00ff, - 202: 0xff5f00, - 203: 0xff5f5f, - 204: 0xff5f87, - 205: 0xff5faf, - 206: 0xff5fd7, - 207: 0xff5fff, - 208: 0xff8700, - 209: 0xff875f, - 210: 0xff8787, - 211: 0xff87af, - 212: 0xff87d7, - 213: 0xff87ff, - 214: 0xffaf00, - 215: 0xffaf5f, - 216: 0xffaf87, - 217: 0xffafaf, - 218: 0xffafd7, - 219: 0xffafff, - 220: 0xffd700, - 221: 0xffd75f, - 222: 0xffd787, - 223: 0xffd7af, - 224: 0xffd7d7, - 225: 0xffd7ff, - 226: 0xffff00, - 227: 0xffff5f, - 228: 0xffff87, - 229: 0xffffaf, - 230: 0xffffd7, - 231: 0xffffff, - 232: 0x080808, - 233: 0x121212, - 234: 0x1c1c1c, - 235: 0x262626, - 236: 0x303030, - 237: 0x3a3a3a, - 238: 0x444444, - 239: 0x4e4e4e, - 240: 0x585858, - 241: 0x626262, - 242: 0x6c6c6c, - 243: 0x767676, - 244: 0x808080, - 245: 0x8a8a8a, - 246: 0x949494, - 247: 0x9e9e9e, - 248: 0xa8a8a8, - 249: 0xb2b2b2, - 250: 0xbcbcbc, - 251: 0xc6c6c6, - 252: 0xd0d0d0, - 253: 0xdadada, - 254: 0xe4e4e4, - 255: 0xeeeeee, -} - -// `\033]0;TITLESTR\007` -func doTitleSequence(er *bytes.Reader) error { - var c byte - var err error - - c, err = er.ReadByte() - if err != nil { - return err - } - if c != '0' && c != '2' { - return nil - } - c, err = er.ReadByte() - if err != nil { - return err - } - if c != ';' { - return nil - } - title := make([]byte, 0, 80) - for { - c, err = er.ReadByte() - if err != nil { - return err - } - if c == 0x07 || c == '\n' { - break - } - title = append(title, c) - } - if len(title) > 0 { - title8, err := syscall.UTF16PtrFromString(string(title)) - if err == nil { - procSetConsoleTitle.Call(uintptr(unsafe.Pointer(title8))) - } - } - return nil -} - -// returns Atoi(s) unless s == "" in which case it returns def -func atoiWithDefault(s string, def int) (int, error) { - if s == "" { - return def, nil - } - return strconv.Atoi(s) -} - -// Write writes data on console -func (w *Writer) Write(data []byte) (n int, err error) { - w.mutex.Lock() - defer w.mutex.Unlock() - var csbi consoleScreenBufferInfo - procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) - - handle := w.handle - - var er *bytes.Reader - if w.rest.Len() > 0 { - var rest bytes.Buffer - w.rest.WriteTo(&rest) - w.rest.Reset() - rest.Write(data) - er = bytes.NewReader(rest.Bytes()) - } else { - er = bytes.NewReader(data) - } - var bw [1]byte -loop: - for { - c1, err := er.ReadByte() - if err != nil { - break loop - } - if c1 != 0x1b { - bw[0] = c1 - w.out.Write(bw[:]) - continue - } - c2, err := er.ReadByte() - if err != nil { - break loop - } - - switch c2 { - case '>': - continue - case ']': - w.rest.WriteByte(c1) - w.rest.WriteByte(c2) - er.WriteTo(&w.rest) - if bytes.IndexByte(w.rest.Bytes(), 0x07) == -1 { - break loop - } - er = bytes.NewReader(w.rest.Bytes()[2:]) - err := doTitleSequence(er) - if err != nil { - break loop - } - w.rest.Reset() - continue - // https://github.com/mattn/go-colorable/issues/27 - case '7': - procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) - w.oldpos = csbi.cursorPosition - continue - case '8': - procSetConsoleCursorPosition.Call(uintptr(handle), *(*uintptr)(unsafe.Pointer(&w.oldpos))) - continue - case 0x5b: - // execute part after switch - default: - continue - } - - w.rest.WriteByte(c1) - w.rest.WriteByte(c2) - er.WriteTo(&w.rest) - - var buf bytes.Buffer - var m byte - for i, c := range w.rest.Bytes()[2:] { - if ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || c == '@' { - m = c - er = bytes.NewReader(w.rest.Bytes()[2+i+1:]) - w.rest.Reset() - break - } - buf.Write([]byte(string(c))) - } - if m == 0 { - break loop - } - - switch m { - case 'A': - n, err = atoiWithDefault(buf.String(), 1) - if err != nil { - continue - } - procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) - csbi.cursorPosition.y -= short(n) - procSetConsoleCursorPosition.Call(uintptr(handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) - case 'B': - n, err = atoiWithDefault(buf.String(), 1) - if err != nil { - continue - } - procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) - csbi.cursorPosition.y += short(n) - procSetConsoleCursorPosition.Call(uintptr(handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) - case 'C': - n, err = atoiWithDefault(buf.String(), 1) - if err != nil { - continue - } - procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) - csbi.cursorPosition.x += short(n) - procSetConsoleCursorPosition.Call(uintptr(handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) - case 'D': - n, err = atoiWithDefault(buf.String(), 1) - if err != nil { - continue - } - procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) - csbi.cursorPosition.x -= short(n) - if csbi.cursorPosition.x < 0 { - csbi.cursorPosition.x = 0 - } - procSetConsoleCursorPosition.Call(uintptr(handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) - case 'E': - n, err = strconv.Atoi(buf.String()) - if err != nil { - continue - } - procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) - csbi.cursorPosition.x = 0 - csbi.cursorPosition.y += short(n) - procSetConsoleCursorPosition.Call(uintptr(handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) - case 'F': - n, err = strconv.Atoi(buf.String()) - if err != nil { - continue - } - procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) - csbi.cursorPosition.x = 0 - csbi.cursorPosition.y -= short(n) - procSetConsoleCursorPosition.Call(uintptr(handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) - case 'G': - n, err = strconv.Atoi(buf.String()) - if err != nil { - continue - } - if n < 1 { - n = 1 - } - procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) - csbi.cursorPosition.x = short(n - 1) - procSetConsoleCursorPosition.Call(uintptr(handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) - case 'H', 'f': - procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) - if buf.Len() > 0 { - token := strings.Split(buf.String(), ";") - switch len(token) { - case 1: - n1, err := strconv.Atoi(token[0]) - if err != nil { - continue - } - csbi.cursorPosition.y = short(n1 - 1) - case 2: - n1, err := strconv.Atoi(token[0]) - if err != nil { - continue - } - n2, err := strconv.Atoi(token[1]) - if err != nil { - continue - } - csbi.cursorPosition.x = short(n2 - 1) - csbi.cursorPosition.y = short(n1 - 1) - } - } else { - csbi.cursorPosition.y = 0 - } - procSetConsoleCursorPosition.Call(uintptr(handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) - case 'J': - n := 0 - if buf.Len() > 0 { - n, err = strconv.Atoi(buf.String()) - if err != nil { - continue - } - } - var count, written dword - var cursor coord - procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) - switch n { - case 0: - cursor = coord{x: csbi.cursorPosition.x, y: csbi.cursorPosition.y} - count = dword(csbi.size.x) - dword(csbi.cursorPosition.x) + dword(csbi.size.y-csbi.cursorPosition.y)*dword(csbi.size.x) - case 1: - cursor = coord{x: csbi.window.left, y: csbi.window.top} - count = dword(csbi.size.x) - dword(csbi.cursorPosition.x) + dword(csbi.window.top-csbi.cursorPosition.y)*dword(csbi.size.x) - case 2: - cursor = coord{x: csbi.window.left, y: csbi.window.top} - count = dword(csbi.size.x) - dword(csbi.cursorPosition.x) + dword(csbi.size.y-csbi.cursorPosition.y)*dword(csbi.size.x) - } - procFillConsoleOutputCharacter.Call(uintptr(handle), uintptr(' '), uintptr(count), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written))) - procFillConsoleOutputAttribute.Call(uintptr(handle), uintptr(csbi.attributes), uintptr(count), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written))) - case 'K': - n := 0 - if buf.Len() > 0 { - n, err = strconv.Atoi(buf.String()) - if err != nil { - continue - } - } - procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) - var cursor coord - var count, written dword - switch n { - case 0: - cursor = coord{x: csbi.cursorPosition.x, y: csbi.cursorPosition.y} - count = dword(csbi.size.x - csbi.cursorPosition.x) - case 1: - cursor = coord{x: csbi.window.left, y: csbi.cursorPosition.y} - count = dword(csbi.size.x - csbi.cursorPosition.x) - case 2: - cursor = coord{x: csbi.window.left, y: csbi.cursorPosition.y} - count = dword(csbi.size.x) - } - procFillConsoleOutputCharacter.Call(uintptr(handle), uintptr(' '), uintptr(count), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written))) - procFillConsoleOutputAttribute.Call(uintptr(handle), uintptr(csbi.attributes), uintptr(count), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written))) - case 'X': - n := 0 - if buf.Len() > 0 { - n, err = strconv.Atoi(buf.String()) - if err != nil { - continue - } - } - procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) - var cursor coord - var written dword - cursor = coord{x: csbi.cursorPosition.x, y: csbi.cursorPosition.y} - procFillConsoleOutputCharacter.Call(uintptr(handle), uintptr(' '), uintptr(n), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written))) - procFillConsoleOutputAttribute.Call(uintptr(handle), uintptr(csbi.attributes), uintptr(n), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written))) - case 'm': - procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) - attr := csbi.attributes - cs := buf.String() - if cs == "" { - procSetConsoleTextAttribute.Call(uintptr(handle), uintptr(w.oldattr)) - continue - } - token := strings.Split(cs, ";") - for i := 0; i < len(token); i++ { - ns := token[i] - if n, err = strconv.Atoi(ns); err == nil { - switch { - case n == 0 || n == 100: - attr = w.oldattr - case n == 4: - attr |= commonLvbUnderscore - case (1 <= n && n <= 3) || n == 5: - attr |= foregroundIntensity - case n == 7 || n == 27: - attr = - (attr &^ (foregroundMask | backgroundMask)) | - ((attr & foregroundMask) << 4) | - ((attr & backgroundMask) >> 4) - case n == 22: - attr &^= foregroundIntensity - case n == 24: - attr &^= commonLvbUnderscore - case 30 <= n && n <= 37: - attr &= backgroundMask - if (n-30)&1 != 0 { - attr |= foregroundRed - } - if (n-30)&2 != 0 { - attr |= foregroundGreen - } - if (n-30)&4 != 0 { - attr |= foregroundBlue - } - case n == 38: // set foreground color. - if i < len(token)-2 && (token[i+1] == "5" || token[i+1] == "05") { - if n256, err := strconv.Atoi(token[i+2]); err == nil { - if n256foreAttr == nil { - n256setup() - } - attr &= backgroundMask - attr |= n256foreAttr[n256%len(n256foreAttr)] - i += 2 - } - } else if len(token) == 5 && token[i+1] == "2" { - var r, g, b int - r, _ = strconv.Atoi(token[i+2]) - g, _ = strconv.Atoi(token[i+3]) - b, _ = strconv.Atoi(token[i+4]) - i += 4 - if r > 127 { - attr |= foregroundRed - } - if g > 127 { - attr |= foregroundGreen - } - if b > 127 { - attr |= foregroundBlue - } - } else { - attr = attr & (w.oldattr & backgroundMask) - } - case n == 39: // reset foreground color. - attr &= backgroundMask - attr |= w.oldattr & foregroundMask - case 40 <= n && n <= 47: - attr &= foregroundMask - if (n-40)&1 != 0 { - attr |= backgroundRed - } - if (n-40)&2 != 0 { - attr |= backgroundGreen - } - if (n-40)&4 != 0 { - attr |= backgroundBlue - } - case n == 48: // set background color. - if i < len(token)-2 && token[i+1] == "5" { - if n256, err := strconv.Atoi(token[i+2]); err == nil { - if n256backAttr == nil { - n256setup() - } - attr &= foregroundMask - attr |= n256backAttr[n256%len(n256backAttr)] - i += 2 - } - } else if len(token) == 5 && token[i+1] == "2" { - var r, g, b int - r, _ = strconv.Atoi(token[i+2]) - g, _ = strconv.Atoi(token[i+3]) - b, _ = strconv.Atoi(token[i+4]) - i += 4 - if r > 127 { - attr |= backgroundRed - } - if g > 127 { - attr |= backgroundGreen - } - if b > 127 { - attr |= backgroundBlue - } - } else { - attr = attr & (w.oldattr & foregroundMask) - } - case n == 49: // reset foreground color. - attr &= foregroundMask - attr |= w.oldattr & backgroundMask - case 90 <= n && n <= 97: - attr = (attr & backgroundMask) - attr |= foregroundIntensity - if (n-90)&1 != 0 { - attr |= foregroundRed - } - if (n-90)&2 != 0 { - attr |= foregroundGreen - } - if (n-90)&4 != 0 { - attr |= foregroundBlue - } - case 100 <= n && n <= 107: - attr = (attr & foregroundMask) - attr |= backgroundIntensity - if (n-100)&1 != 0 { - attr |= backgroundRed - } - if (n-100)&2 != 0 { - attr |= backgroundGreen - } - if (n-100)&4 != 0 { - attr |= backgroundBlue - } - } - procSetConsoleTextAttribute.Call(uintptr(handle), uintptr(attr)) - } - } - case 'h': - var ci consoleCursorInfo - cs := buf.String() - if cs == "5>" { - procGetConsoleCursorInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&ci))) - ci.visible = 0 - procSetConsoleCursorInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&ci))) - } else if cs == "?25" { - procGetConsoleCursorInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&ci))) - ci.visible = 1 - procSetConsoleCursorInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&ci))) - } else if cs == "?1049" { - if w.althandle == 0 { - h, _, _ := procCreateConsoleScreenBuffer.Call(uintptr(genericRead|genericWrite), 0, 0, uintptr(consoleTextmodeBuffer), 0, 0) - w.althandle = syscall.Handle(h) - if w.althandle != 0 { - handle = w.althandle - } - } - } - case 'l': - var ci consoleCursorInfo - cs := buf.String() - if cs == "5>" { - procGetConsoleCursorInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&ci))) - ci.visible = 1 - procSetConsoleCursorInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&ci))) - } else if cs == "?25" { - procGetConsoleCursorInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&ci))) - ci.visible = 0 - procSetConsoleCursorInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&ci))) - } else if cs == "?1049" { - if w.althandle != 0 { - syscall.CloseHandle(w.althandle) - w.althandle = 0 - handle = w.handle - } - } - case 's': - procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) - w.oldpos = csbi.cursorPosition - case 'u': - procSetConsoleCursorPosition.Call(uintptr(handle), *(*uintptr)(unsafe.Pointer(&w.oldpos))) - } - } - - return len(data), nil -} - -type consoleColor struct { - rgb int - red bool - green bool - blue bool - intensity bool -} - -func (c consoleColor) foregroundAttr() (attr word) { - if c.red { - attr |= foregroundRed - } - if c.green { - attr |= foregroundGreen - } - if c.blue { - attr |= foregroundBlue - } - if c.intensity { - attr |= foregroundIntensity - } - return -} - -func (c consoleColor) backgroundAttr() (attr word) { - if c.red { - attr |= backgroundRed - } - if c.green { - attr |= backgroundGreen - } - if c.blue { - attr |= backgroundBlue - } - if c.intensity { - attr |= backgroundIntensity - } - return -} - -var color16 = []consoleColor{ - {0x000000, false, false, false, false}, - {0x000080, false, false, true, false}, - {0x008000, false, true, false, false}, - {0x008080, false, true, true, false}, - {0x800000, true, false, false, false}, - {0x800080, true, false, true, false}, - {0x808000, true, true, false, false}, - {0xc0c0c0, true, true, true, false}, - {0x808080, false, false, false, true}, - {0x0000ff, false, false, true, true}, - {0x00ff00, false, true, false, true}, - {0x00ffff, false, true, true, true}, - {0xff0000, true, false, false, true}, - {0xff00ff, true, false, true, true}, - {0xffff00, true, true, false, true}, - {0xffffff, true, true, true, true}, -} - -type hsv struct { - h, s, v float32 -} - -func (a hsv) dist(b hsv) float32 { - dh := a.h - b.h - switch { - case dh > 0.5: - dh = 1 - dh - case dh < -0.5: - dh = -1 - dh - } - ds := a.s - b.s - dv := a.v - b.v - return float32(math.Sqrt(float64(dh*dh + ds*ds + dv*dv))) -} - -func toHSV(rgb int) hsv { - r, g, b := float32((rgb&0xFF0000)>>16)/256.0, - float32((rgb&0x00FF00)>>8)/256.0, - float32(rgb&0x0000FF)/256.0 - min, max := minmax3f(r, g, b) - h := max - min - if h > 0 { - if max == r { - h = (g - b) / h - if h < 0 { - h += 6 - } - } else if max == g { - h = 2 + (b-r)/h - } else { - h = 4 + (r-g)/h - } - } - h /= 6.0 - s := max - min - if max != 0 { - s /= max - } - v := max - return hsv{h: h, s: s, v: v} -} - -type hsvTable []hsv - -func toHSVTable(rgbTable []consoleColor) hsvTable { - t := make(hsvTable, len(rgbTable)) - for i, c := range rgbTable { - t[i] = toHSV(c.rgb) - } - return t -} - -func (t hsvTable) find(rgb int) consoleColor { - hsv := toHSV(rgb) - n := 7 - l := float32(5.0) - for i, p := range t { - d := hsv.dist(p) - if d < l { - l, n = d, i - } - } - return color16[n] -} - -func minmax3f(a, b, c float32) (min, max float32) { - if a < b { - if b < c { - return a, c - } else if a < c { - return a, b - } else { - return c, b - } - } else { - if a < c { - return b, c - } else if b < c { - return b, a - } else { - return c, a - } - } -} - -var n256foreAttr []word -var n256backAttr []word - -func n256setup() { - n256foreAttr = make([]word, 256) - n256backAttr = make([]word, 256) - t := toHSVTable(color16) - for i, rgb := range color256 { - c := t.find(rgb) - n256foreAttr[i] = c.foregroundAttr() - n256backAttr[i] = c.backgroundAttr() - } -} - -// EnableColorsStdout enable colors if possible. -func EnableColorsStdout(enabled *bool) func() { - var mode uint32 - h := os.Stdout.Fd() - if r, _, _ := procGetConsoleMode.Call(h, uintptr(unsafe.Pointer(&mode))); r != 0 { - if r, _, _ = procSetConsoleMode.Call(h, uintptr(mode|cENABLE_VIRTUAL_TERMINAL_PROCESSING)); r != 0 { - if enabled != nil { - *enabled = true - } - return func() { - procSetConsoleMode.Call(h, uintptr(mode)) - } - } - } - if enabled != nil { - *enabled = true - } - return func() {} -} diff --git a/vendor/github.com/mattn/go-colorable/go.mod b/vendor/github.com/mattn/go-colorable/go.mod deleted file mode 100644 index 1e590b8..0000000 --- a/vendor/github.com/mattn/go-colorable/go.mod +++ /dev/null @@ -1,8 +0,0 @@ -module github.com/mattn/go-colorable - -require ( - github.com/mattn/go-isatty v0.0.12 - golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae // indirect -) - -go 1.13 diff --git a/vendor/github.com/mattn/go-colorable/go.sum b/vendor/github.com/mattn/go-colorable/go.sum deleted file mode 100644 index cf5b95d..0000000 --- a/vendor/github.com/mattn/go-colorable/go.sum +++ /dev/null @@ -1,5 +0,0 @@ -github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae h1:/WDfKMnPU+m5M4xB+6x4kaepxRw6jWvR5iDRdvjHgy8= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/vendor/github.com/mattn/go-colorable/go.test.sh b/vendor/github.com/mattn/go-colorable/go.test.sh deleted file mode 100644 index 012162b..0000000 --- a/vendor/github.com/mattn/go-colorable/go.test.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/env bash - -set -e -echo "" > coverage.txt - -for d in $(go list ./... | grep -v vendor); do - go test -race -coverprofile=profile.out -covermode=atomic "$d" - if [ -f profile.out ]; then - cat profile.out >> coverage.txt - rm profile.out - fi -done diff --git a/vendor/github.com/mattn/go-colorable/noncolorable.go b/vendor/github.com/mattn/go-colorable/noncolorable.go deleted file mode 100644 index 95f2c6b..0000000 --- a/vendor/github.com/mattn/go-colorable/noncolorable.go +++ /dev/null @@ -1,55 +0,0 @@ -package colorable - -import ( - "bytes" - "io" -) - -// NonColorable holds writer but removes escape sequence. -type NonColorable struct { - out io.Writer -} - -// NewNonColorable returns new instance of Writer which removes escape sequence from Writer. -func NewNonColorable(w io.Writer) io.Writer { - return &NonColorable{out: w} -} - -// Write writes data on console -func (w *NonColorable) Write(data []byte) (n int, err error) { - er := bytes.NewReader(data) - var bw [1]byte -loop: - for { - c1, err := er.ReadByte() - if err != nil { - break loop - } - if c1 != 0x1b { - bw[0] = c1 - w.out.Write(bw[:]) - continue - } - c2, err := er.ReadByte() - if err != nil { - break loop - } - if c2 != 0x5b { - continue - } - - var buf bytes.Buffer - for { - c, err := er.ReadByte() - if err != nil { - break loop - } - if ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || c == '@' { - break - } - buf.Write([]byte(string(c))) - } - } - - return len(data), nil -} diff --git a/vendor/github.com/mattn/go-isatty/.travis.yml b/vendor/github.com/mattn/go-isatty/.travis.yml deleted file mode 100644 index 604314d..0000000 --- a/vendor/github.com/mattn/go-isatty/.travis.yml +++ /dev/null @@ -1,14 +0,0 @@ -language: go -sudo: false -go: - - 1.13.x - - tip - -before_install: - - go get -t -v ./... - -script: - - ./go.test.sh - -after_success: - - bash <(curl -s https://codecov.io/bash) diff --git a/vendor/github.com/mattn/go-isatty/LICENSE b/vendor/github.com/mattn/go-isatty/LICENSE deleted file mode 100644 index 65dc692..0000000 --- a/vendor/github.com/mattn/go-isatty/LICENSE +++ /dev/null @@ -1,9 +0,0 @@ -Copyright (c) Yasuhiro MATSUMOTO - -MIT License (Expat) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/mattn/go-isatty/README.md b/vendor/github.com/mattn/go-isatty/README.md deleted file mode 100644 index 3841835..0000000 --- a/vendor/github.com/mattn/go-isatty/README.md +++ /dev/null @@ -1,50 +0,0 @@ -# go-isatty - -[![Godoc Reference](https://godoc.org/github.com/mattn/go-isatty?status.svg)](http://godoc.org/github.com/mattn/go-isatty) -[![Codecov](https://codecov.io/gh/mattn/go-isatty/branch/master/graph/badge.svg)](https://codecov.io/gh/mattn/go-isatty) -[![Coverage Status](https://coveralls.io/repos/github/mattn/go-isatty/badge.svg?branch=master)](https://coveralls.io/github/mattn/go-isatty?branch=master) -[![Go Report Card](https://goreportcard.com/badge/mattn/go-isatty)](https://goreportcard.com/report/mattn/go-isatty) - -isatty for golang - -## Usage - -```go -package main - -import ( - "fmt" - "github.com/mattn/go-isatty" - "os" -) - -func main() { - if isatty.IsTerminal(os.Stdout.Fd()) { - fmt.Println("Is Terminal") - } else if isatty.IsCygwinTerminal(os.Stdout.Fd()) { - fmt.Println("Is Cygwin/MSYS2 Terminal") - } else { - fmt.Println("Is Not Terminal") - } -} -``` - -## Installation - -``` -$ go get github.com/mattn/go-isatty -``` - -## License - -MIT - -## Author - -Yasuhiro Matsumoto (a.k.a mattn) - -## Thanks - -* k-takata: base idea for IsCygwinTerminal - - https://github.com/k-takata/go-iscygpty diff --git a/vendor/github.com/mattn/go-isatty/doc.go b/vendor/github.com/mattn/go-isatty/doc.go deleted file mode 100644 index 17d4f90..0000000 --- a/vendor/github.com/mattn/go-isatty/doc.go +++ /dev/null @@ -1,2 +0,0 @@ -// Package isatty implements interface to isatty -package isatty diff --git a/vendor/github.com/mattn/go-isatty/go.mod b/vendor/github.com/mattn/go-isatty/go.mod deleted file mode 100644 index 605c4c2..0000000 --- a/vendor/github.com/mattn/go-isatty/go.mod +++ /dev/null @@ -1,5 +0,0 @@ -module github.com/mattn/go-isatty - -go 1.12 - -require golang.org/x/sys v0.0.0-20200116001909-b77594299b42 diff --git a/vendor/github.com/mattn/go-isatty/go.sum b/vendor/github.com/mattn/go-isatty/go.sum deleted file mode 100644 index 912e29c..0000000 --- a/vendor/github.com/mattn/go-isatty/go.sum +++ /dev/null @@ -1,2 +0,0 @@ -golang.org/x/sys v0.0.0-20200116001909-b77594299b42 h1:vEOn+mP2zCOVzKckCZy6YsCtDblrpj/w7B9nxGNELpg= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/vendor/github.com/mattn/go-isatty/go.test.sh b/vendor/github.com/mattn/go-isatty/go.test.sh deleted file mode 100644 index 012162b..0000000 --- a/vendor/github.com/mattn/go-isatty/go.test.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/env bash - -set -e -echo "" > coverage.txt - -for d in $(go list ./... | grep -v vendor); do - go test -race -coverprofile=profile.out -covermode=atomic "$d" - if [ -f profile.out ]; then - cat profile.out >> coverage.txt - rm profile.out - fi -done diff --git a/vendor/github.com/mattn/go-isatty/isatty_bsd.go b/vendor/github.com/mattn/go-isatty/isatty_bsd.go deleted file mode 100644 index 711f288..0000000 --- a/vendor/github.com/mattn/go-isatty/isatty_bsd.go +++ /dev/null @@ -1,18 +0,0 @@ -// +build darwin freebsd openbsd netbsd dragonfly -// +build !appengine - -package isatty - -import "golang.org/x/sys/unix" - -// IsTerminal return true if the file descriptor is terminal. -func IsTerminal(fd uintptr) bool { - _, err := unix.IoctlGetTermios(int(fd), unix.TIOCGETA) - return err == nil -} - -// IsCygwinTerminal return true if the file descriptor is a cygwin or msys2 -// terminal. This is also always false on this environment. -func IsCygwinTerminal(fd uintptr) bool { - return false -} diff --git a/vendor/github.com/mattn/go-isatty/isatty_others.go b/vendor/github.com/mattn/go-isatty/isatty_others.go deleted file mode 100644 index 3eba4cb..0000000 --- a/vendor/github.com/mattn/go-isatty/isatty_others.go +++ /dev/null @@ -1,15 +0,0 @@ -// +build appengine js nacl wasm - -package isatty - -// IsTerminal returns true if the file descriptor is terminal which -// is always false on js and appengine classic which is a sandboxed PaaS. -func IsTerminal(fd uintptr) bool { - return false -} - -// IsCygwinTerminal() return true if the file descriptor is a cygwin or msys2 -// terminal. This is also always false on this environment. -func IsCygwinTerminal(fd uintptr) bool { - return false -} diff --git a/vendor/github.com/mattn/go-isatty/isatty_plan9.go b/vendor/github.com/mattn/go-isatty/isatty_plan9.go deleted file mode 100644 index c5b6e0c..0000000 --- a/vendor/github.com/mattn/go-isatty/isatty_plan9.go +++ /dev/null @@ -1,22 +0,0 @@ -// +build plan9 - -package isatty - -import ( - "syscall" -) - -// IsTerminal returns true if the given file descriptor is a terminal. -func IsTerminal(fd uintptr) bool { - path, err := syscall.Fd2path(int(fd)) - if err != nil { - return false - } - return path == "/dev/cons" || path == "/mnt/term/dev/cons" -} - -// IsCygwinTerminal return true if the file descriptor is a cygwin or msys2 -// terminal. This is also always false on this environment. -func IsCygwinTerminal(fd uintptr) bool { - return false -} diff --git a/vendor/github.com/mattn/go-isatty/isatty_solaris.go b/vendor/github.com/mattn/go-isatty/isatty_solaris.go deleted file mode 100644 index 3010670..0000000 --- a/vendor/github.com/mattn/go-isatty/isatty_solaris.go +++ /dev/null @@ -1,21 +0,0 @@ -// +build solaris -// +build !appengine - -package isatty - -import ( - "golang.org/x/sys/unix" -) - -// IsTerminal returns true if the given file descriptor is a terminal. -// see: https://src.illumos.org/source/xref/illumos-gate/usr/src/lib/libc/port/gen/isatty.c -func IsTerminal(fd uintptr) bool { - _, err := unix.IoctlGetTermio(int(fd), unix.TCGETA) - return err == nil -} - -// IsCygwinTerminal return true if the file descriptor is a cygwin or msys2 -// terminal. This is also always false on this environment. -func IsCygwinTerminal(fd uintptr) bool { - return false -} diff --git a/vendor/github.com/mattn/go-isatty/isatty_tcgets.go b/vendor/github.com/mattn/go-isatty/isatty_tcgets.go deleted file mode 100644 index 4e7b850..0000000 --- a/vendor/github.com/mattn/go-isatty/isatty_tcgets.go +++ /dev/null @@ -1,18 +0,0 @@ -// +build linux aix zos -// +build !appengine - -package isatty - -import "golang.org/x/sys/unix" - -// IsTerminal return true if the file descriptor is terminal. -func IsTerminal(fd uintptr) bool { - _, err := unix.IoctlGetTermios(int(fd), unix.TCGETS) - return err == nil -} - -// IsCygwinTerminal return true if the file descriptor is a cygwin or msys2 -// terminal. This is also always false on this environment. -func IsCygwinTerminal(fd uintptr) bool { - return false -} diff --git a/vendor/github.com/mattn/go-isatty/isatty_windows.go b/vendor/github.com/mattn/go-isatty/isatty_windows.go deleted file mode 100644 index 1fa8691..0000000 --- a/vendor/github.com/mattn/go-isatty/isatty_windows.go +++ /dev/null @@ -1,125 +0,0 @@ -// +build windows -// +build !appengine - -package isatty - -import ( - "errors" - "strings" - "syscall" - "unicode/utf16" - "unsafe" -) - -const ( - objectNameInfo uintptr = 1 - fileNameInfo = 2 - fileTypePipe = 3 -) - -var ( - kernel32 = syscall.NewLazyDLL("kernel32.dll") - ntdll = syscall.NewLazyDLL("ntdll.dll") - procGetConsoleMode = kernel32.NewProc("GetConsoleMode") - procGetFileInformationByHandleEx = kernel32.NewProc("GetFileInformationByHandleEx") - procGetFileType = kernel32.NewProc("GetFileType") - procNtQueryObject = ntdll.NewProc("NtQueryObject") -) - -func init() { - // Check if GetFileInformationByHandleEx is available. - if procGetFileInformationByHandleEx.Find() != nil { - procGetFileInformationByHandleEx = nil - } -} - -// IsTerminal return true if the file descriptor is terminal. -func IsTerminal(fd uintptr) bool { - var st uint32 - r, _, e := syscall.Syscall(procGetConsoleMode.Addr(), 2, fd, uintptr(unsafe.Pointer(&st)), 0) - return r != 0 && e == 0 -} - -// Check pipe name is used for cygwin/msys2 pty. -// Cygwin/MSYS2 PTY has a name like: -// \{cygwin,msys}-XXXXXXXXXXXXXXXX-ptyN-{from,to}-master -func isCygwinPipeName(name string) bool { - token := strings.Split(name, "-") - if len(token) < 5 { - return false - } - - if token[0] != `\msys` && - token[0] != `\cygwin` && - token[0] != `\Device\NamedPipe\msys` && - token[0] != `\Device\NamedPipe\cygwin` { - return false - } - - if token[1] == "" { - return false - } - - if !strings.HasPrefix(token[2], "pty") { - return false - } - - if token[3] != `from` && token[3] != `to` { - return false - } - - if token[4] != "master" { - return false - } - - return true -} - -// getFileNameByHandle use the undocomented ntdll NtQueryObject to get file full name from file handler -// since GetFileInformationByHandleEx is not avilable under windows Vista and still some old fashion -// guys are using Windows XP, this is a workaround for those guys, it will also work on system from -// Windows vista to 10 -// see https://stackoverflow.com/a/18792477 for details -func getFileNameByHandle(fd uintptr) (string, error) { - if procNtQueryObject == nil { - return "", errors.New("ntdll.dll: NtQueryObject not supported") - } - - var buf [4 + syscall.MAX_PATH]uint16 - var result int - r, _, e := syscall.Syscall6(procNtQueryObject.Addr(), 5, - fd, objectNameInfo, uintptr(unsafe.Pointer(&buf)), uintptr(2*len(buf)), uintptr(unsafe.Pointer(&result)), 0) - if r != 0 { - return "", e - } - return string(utf16.Decode(buf[4 : 4+buf[0]/2])), nil -} - -// IsCygwinTerminal() return true if the file descriptor is a cygwin or msys2 -// terminal. -func IsCygwinTerminal(fd uintptr) bool { - if procGetFileInformationByHandleEx == nil { - name, err := getFileNameByHandle(fd) - if err != nil { - return false - } - return isCygwinPipeName(name) - } - - // Cygwin/msys's pty is a pipe. - ft, _, e := syscall.Syscall(procGetFileType.Addr(), 1, fd, 0, 0) - if ft != fileTypePipe || e != 0 { - return false - } - - var buf [2 + syscall.MAX_PATH]uint16 - r, _, e := syscall.Syscall6(procGetFileInformationByHandleEx.Addr(), - 4, fd, fileNameInfo, uintptr(unsafe.Pointer(&buf)), - uintptr(len(buf)*2), 0, 0) - if r == 0 || e != 0 { - return false - } - - l := *(*uint32)(unsafe.Pointer(&buf)) - return isCygwinPipeName(string(utf16.Decode(buf[2 : 2+l/2]))) -} diff --git a/vendor/github.com/nfnt/resize/.travis.yml b/vendor/github.com/nfnt/resize/.travis.yml deleted file mode 100644 index 5ff08e7..0000000 --- a/vendor/github.com/nfnt/resize/.travis.yml +++ /dev/null @@ -1,7 +0,0 @@ -language: go - -go: - - "1.x" - - "1.1" - - "1.4" - - "1.10" diff --git a/vendor/github.com/nfnt/resize/LICENSE b/vendor/github.com/nfnt/resize/LICENSE deleted file mode 100644 index 7836cad..0000000 --- a/vendor/github.com/nfnt/resize/LICENSE +++ /dev/null @@ -1,13 +0,0 @@ -Copyright (c) 2012, Jan Schlicht - -Permission to use, copy, modify, and/or distribute this software for any purpose -with or without fee is hereby granted, provided that the above copyright notice -and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS -OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER -TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF -THIS SOFTWARE. diff --git a/vendor/github.com/nfnt/resize/README.md b/vendor/github.com/nfnt/resize/README.md deleted file mode 100644 index 372777d..0000000 --- a/vendor/github.com/nfnt/resize/README.md +++ /dev/null @@ -1,151 +0,0 @@ -# This package is no longer being updated! Please look for alternatives if that bothers you. - -Resize -====== - -Image resizing for the [Go programming language](http://golang.org) with common interpolation methods. - -[![Build Status](https://travis-ci.org/nfnt/resize.svg)](https://travis-ci.org/nfnt/resize) - -Installation ------------- - -```bash -$ go get github.com/nfnt/resize -``` - -It's that easy! - -Usage ------ - -This package needs at least Go 1.1. Import package with - -```go -import "github.com/nfnt/resize" -``` - -The resize package provides 2 functions: - -* `resize.Resize` creates a scaled image with new dimensions (`width`, `height`) using the interpolation function `interp`. - If either `width` or `height` is set to 0, it will be set to an aspect ratio preserving value. -* `resize.Thumbnail` downscales an image preserving its aspect ratio to the maximum dimensions (`maxWidth`, `maxHeight`). - It will return the original image if original sizes are smaller than the provided dimensions. - -```go -resize.Resize(width, height uint, img image.Image, interp resize.InterpolationFunction) image.Image -resize.Thumbnail(maxWidth, maxHeight uint, img image.Image, interp resize.InterpolationFunction) image.Image -``` - -The provided interpolation functions are (from fast to slow execution time) - -- `NearestNeighbor`: [Nearest-neighbor interpolation](http://en.wikipedia.org/wiki/Nearest-neighbor_interpolation) -- `Bilinear`: [Bilinear interpolation](http://en.wikipedia.org/wiki/Bilinear_interpolation) -- `Bicubic`: [Bicubic interpolation](http://en.wikipedia.org/wiki/Bicubic_interpolation) -- `MitchellNetravali`: [Mitchell-Netravali interpolation](http://dl.acm.org/citation.cfm?id=378514) -- `Lanczos2`: [Lanczos resampling](http://en.wikipedia.org/wiki/Lanczos_resampling) with a=2 -- `Lanczos3`: [Lanczos resampling](http://en.wikipedia.org/wiki/Lanczos_resampling) with a=3 - -Which of these methods gives the best results depends on your use case. - -Sample usage: - -```go -package main - -import ( - "github.com/nfnt/resize" - "image/jpeg" - "log" - "os" -) - -func main() { - // open "test.jpg" - file, err := os.Open("test.jpg") - if err != nil { - log.Fatal(err) - } - - // decode jpeg into image.Image - img, err := jpeg.Decode(file) - if err != nil { - log.Fatal(err) - } - file.Close() - - // resize to width 1000 using Lanczos resampling - // and preserve aspect ratio - m := resize.Resize(1000, 0, img, resize.Lanczos3) - - out, err := os.Create("test_resized.jpg") - if err != nil { - log.Fatal(err) - } - defer out.Close() - - // write new image to file - jpeg.Encode(out, m, nil) -} -``` - -Caveats -------- - -* Optimized access routines are used for `image.RGBA`, `image.NRGBA`, `image.RGBA64`, `image.NRGBA64`, `image.YCbCr`, `image.Gray`, and `image.Gray16` types. All other image types are accessed in a generic way that will result in slow processing speed. -* JPEG images are stored in `image.YCbCr`. This image format stores data in a way that will decrease processing speed. A resize may be up to 2 times slower than with `image.RGBA`. - - -Downsizing Samples -------- - -Downsizing is not as simple as it might look like. Images have to be filtered before they are scaled down, otherwise aliasing might occur. -Filtering is highly subjective: Applying too much will blur the whole image, too little will make aliasing become apparent. -Resize tries to provide sane defaults that should suffice in most cases. - -### Artificial sample - -Original image -![Rings](http://nfnt.github.com/img/rings_lg_orig.png) - - - - - - - - - - - - - - -

Nearest-Neighbor

Bilinear

Bicubic

Mitchell-Netravali

Lanczos2

Lanczos3
- -### Real-Life sample - -Original image -![Original](http://nfnt.github.com/img/IMG_3694_720.jpg) - - - - - - - - - - - - - - -

Nearest-Neighbor

Bilinear

Bicubic

Mitchell-Netravali

Lanczos2

Lanczos3
- - -License -------- - -Copyright (c) 2012 Jan Schlicht -Resize is released under a MIT style license. diff --git a/vendor/github.com/nfnt/resize/converter.go b/vendor/github.com/nfnt/resize/converter.go deleted file mode 100644 index f9c520d..0000000 --- a/vendor/github.com/nfnt/resize/converter.go +++ /dev/null @@ -1,438 +0,0 @@ -/* -Copyright (c) 2012, Jan Schlicht - -Permission to use, copy, modify, and/or distribute this software for any purpose -with or without fee is hereby granted, provided that the above copyright notice -and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS -OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER -TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF -THIS SOFTWARE. -*/ - -package resize - -import "image" - -// Keep value in [0,255] range. -func clampUint8(in int32) uint8 { - // casting a negative int to an uint will result in an overflown - // large uint. this behavior will be exploited here and in other functions - // to achieve a higher performance. - if uint32(in) < 256 { - return uint8(in) - } - if in > 255 { - return 255 - } - return 0 -} - -// Keep value in [0,65535] range. -func clampUint16(in int64) uint16 { - if uint64(in) < 65536 { - return uint16(in) - } - if in > 65535 { - return 65535 - } - return 0 -} - -func resizeGeneric(in image.Image, out *image.RGBA64, scale float64, coeffs []int32, offset []int, filterLength int) { - newBounds := out.Bounds() - maxX := in.Bounds().Dx() - 1 - - for x := newBounds.Min.X; x < newBounds.Max.X; x++ { - for y := newBounds.Min.Y; y < newBounds.Max.Y; y++ { - var rgba [4]int64 - var sum int64 - start := offset[y] - ci := y * filterLength - for i := 0; i < filterLength; i++ { - coeff := coeffs[ci+i] - if coeff != 0 { - xi := start + i - switch { - case xi < 0: - xi = 0 - case xi >= maxX: - xi = maxX - } - - r, g, b, a := in.At(xi+in.Bounds().Min.X, x+in.Bounds().Min.Y).RGBA() - - rgba[0] += int64(coeff) * int64(r) - rgba[1] += int64(coeff) * int64(g) - rgba[2] += int64(coeff) * int64(b) - rgba[3] += int64(coeff) * int64(a) - sum += int64(coeff) - } - } - - offset := (y-newBounds.Min.Y)*out.Stride + (x-newBounds.Min.X)*8 - - value := clampUint16(rgba[0] / sum) - out.Pix[offset+0] = uint8(value >> 8) - out.Pix[offset+1] = uint8(value) - value = clampUint16(rgba[1] / sum) - out.Pix[offset+2] = uint8(value >> 8) - out.Pix[offset+3] = uint8(value) - value = clampUint16(rgba[2] / sum) - out.Pix[offset+4] = uint8(value >> 8) - out.Pix[offset+5] = uint8(value) - value = clampUint16(rgba[3] / sum) - out.Pix[offset+6] = uint8(value >> 8) - out.Pix[offset+7] = uint8(value) - } - } -} - -func resizeRGBA(in *image.RGBA, out *image.RGBA, scale float64, coeffs []int16, offset []int, filterLength int) { - newBounds := out.Bounds() - maxX := in.Bounds().Dx() - 1 - - for x := newBounds.Min.X; x < newBounds.Max.X; x++ { - row := in.Pix[x*in.Stride:] - for y := newBounds.Min.Y; y < newBounds.Max.Y; y++ { - var rgba [4]int32 - var sum int32 - start := offset[y] - ci := y * filterLength - for i := 0; i < filterLength; i++ { - coeff := coeffs[ci+i] - if coeff != 0 { - xi := start + i - switch { - case uint(xi) < uint(maxX): - xi *= 4 - case xi >= maxX: - xi = 4 * maxX - default: - xi = 0 - } - - rgba[0] += int32(coeff) * int32(row[xi+0]) - rgba[1] += int32(coeff) * int32(row[xi+1]) - rgba[2] += int32(coeff) * int32(row[xi+2]) - rgba[3] += int32(coeff) * int32(row[xi+3]) - sum += int32(coeff) - } - } - - xo := (y-newBounds.Min.Y)*out.Stride + (x-newBounds.Min.X)*4 - - out.Pix[xo+0] = clampUint8(rgba[0] / sum) - out.Pix[xo+1] = clampUint8(rgba[1] / sum) - out.Pix[xo+2] = clampUint8(rgba[2] / sum) - out.Pix[xo+3] = clampUint8(rgba[3] / sum) - } - } -} - -func resizeNRGBA(in *image.NRGBA, out *image.RGBA, scale float64, coeffs []int16, offset []int, filterLength int) { - newBounds := out.Bounds() - maxX := in.Bounds().Dx() - 1 - - for x := newBounds.Min.X; x < newBounds.Max.X; x++ { - row := in.Pix[x*in.Stride:] - for y := newBounds.Min.Y; y < newBounds.Max.Y; y++ { - var rgba [4]int32 - var sum int32 - start := offset[y] - ci := y * filterLength - for i := 0; i < filterLength; i++ { - coeff := coeffs[ci+i] - if coeff != 0 { - xi := start + i - switch { - case uint(xi) < uint(maxX): - xi *= 4 - case xi >= maxX: - xi = 4 * maxX - default: - xi = 0 - } - - // Forward alpha-premultiplication - a := int32(row[xi+3]) - r := int32(row[xi+0]) * a - r /= 0xff - g := int32(row[xi+1]) * a - g /= 0xff - b := int32(row[xi+2]) * a - b /= 0xff - - rgba[0] += int32(coeff) * r - rgba[1] += int32(coeff) * g - rgba[2] += int32(coeff) * b - rgba[3] += int32(coeff) * a - sum += int32(coeff) - } - } - - xo := (y-newBounds.Min.Y)*out.Stride + (x-newBounds.Min.X)*4 - - out.Pix[xo+0] = clampUint8(rgba[0] / sum) - out.Pix[xo+1] = clampUint8(rgba[1] / sum) - out.Pix[xo+2] = clampUint8(rgba[2] / sum) - out.Pix[xo+3] = clampUint8(rgba[3] / sum) - } - } -} - -func resizeRGBA64(in *image.RGBA64, out *image.RGBA64, scale float64, coeffs []int32, offset []int, filterLength int) { - newBounds := out.Bounds() - maxX := in.Bounds().Dx() - 1 - - for x := newBounds.Min.X; x < newBounds.Max.X; x++ { - row := in.Pix[x*in.Stride:] - for y := newBounds.Min.Y; y < newBounds.Max.Y; y++ { - var rgba [4]int64 - var sum int64 - start := offset[y] - ci := y * filterLength - for i := 0; i < filterLength; i++ { - coeff := coeffs[ci+i] - if coeff != 0 { - xi := start + i - switch { - case uint(xi) < uint(maxX): - xi *= 8 - case xi >= maxX: - xi = 8 * maxX - default: - xi = 0 - } - - rgba[0] += int64(coeff) * (int64(row[xi+0])<<8 | int64(row[xi+1])) - rgba[1] += int64(coeff) * (int64(row[xi+2])<<8 | int64(row[xi+3])) - rgba[2] += int64(coeff) * (int64(row[xi+4])<<8 | int64(row[xi+5])) - rgba[3] += int64(coeff) * (int64(row[xi+6])<<8 | int64(row[xi+7])) - sum += int64(coeff) - } - } - - xo := (y-newBounds.Min.Y)*out.Stride + (x-newBounds.Min.X)*8 - - value := clampUint16(rgba[0] / sum) - out.Pix[xo+0] = uint8(value >> 8) - out.Pix[xo+1] = uint8(value) - value = clampUint16(rgba[1] / sum) - out.Pix[xo+2] = uint8(value >> 8) - out.Pix[xo+3] = uint8(value) - value = clampUint16(rgba[2] / sum) - out.Pix[xo+4] = uint8(value >> 8) - out.Pix[xo+5] = uint8(value) - value = clampUint16(rgba[3] / sum) - out.Pix[xo+6] = uint8(value >> 8) - out.Pix[xo+7] = uint8(value) - } - } -} - -func resizeNRGBA64(in *image.NRGBA64, out *image.RGBA64, scale float64, coeffs []int32, offset []int, filterLength int) { - newBounds := out.Bounds() - maxX := in.Bounds().Dx() - 1 - - for x := newBounds.Min.X; x < newBounds.Max.X; x++ { - row := in.Pix[x*in.Stride:] - for y := newBounds.Min.Y; y < newBounds.Max.Y; y++ { - var rgba [4]int64 - var sum int64 - start := offset[y] - ci := y * filterLength - for i := 0; i < filterLength; i++ { - coeff := coeffs[ci+i] - if coeff != 0 { - xi := start + i - switch { - case uint(xi) < uint(maxX): - xi *= 8 - case xi >= maxX: - xi = 8 * maxX - default: - xi = 0 - } - - // Forward alpha-premultiplication - a := int64(uint16(row[xi+6])<<8 | uint16(row[xi+7])) - r := int64(uint16(row[xi+0])<<8|uint16(row[xi+1])) * a - r /= 0xffff - g := int64(uint16(row[xi+2])<<8|uint16(row[xi+3])) * a - g /= 0xffff - b := int64(uint16(row[xi+4])<<8|uint16(row[xi+5])) * a - b /= 0xffff - - rgba[0] += int64(coeff) * r - rgba[1] += int64(coeff) * g - rgba[2] += int64(coeff) * b - rgba[3] += int64(coeff) * a - sum += int64(coeff) - } - } - - xo := (y-newBounds.Min.Y)*out.Stride + (x-newBounds.Min.X)*8 - - value := clampUint16(rgba[0] / sum) - out.Pix[xo+0] = uint8(value >> 8) - out.Pix[xo+1] = uint8(value) - value = clampUint16(rgba[1] / sum) - out.Pix[xo+2] = uint8(value >> 8) - out.Pix[xo+3] = uint8(value) - value = clampUint16(rgba[2] / sum) - out.Pix[xo+4] = uint8(value >> 8) - out.Pix[xo+5] = uint8(value) - value = clampUint16(rgba[3] / sum) - out.Pix[xo+6] = uint8(value >> 8) - out.Pix[xo+7] = uint8(value) - } - } -} - -func resizeGray(in *image.Gray, out *image.Gray, scale float64, coeffs []int16, offset []int, filterLength int) { - newBounds := out.Bounds() - maxX := in.Bounds().Dx() - 1 - - for x := newBounds.Min.X; x < newBounds.Max.X; x++ { - row := in.Pix[(x-newBounds.Min.X)*in.Stride:] - for y := newBounds.Min.Y; y < newBounds.Max.Y; y++ { - var gray int32 - var sum int32 - start := offset[y] - ci := y * filterLength - for i := 0; i < filterLength; i++ { - coeff := coeffs[ci+i] - if coeff != 0 { - xi := start + i - switch { - case xi < 0: - xi = 0 - case xi >= maxX: - xi = maxX - } - gray += int32(coeff) * int32(row[xi]) - sum += int32(coeff) - } - } - - offset := (y-newBounds.Min.Y)*out.Stride + (x - newBounds.Min.X) - out.Pix[offset] = clampUint8(gray / sum) - } - } -} - -func resizeGray16(in *image.Gray16, out *image.Gray16, scale float64, coeffs []int32, offset []int, filterLength int) { - newBounds := out.Bounds() - maxX := in.Bounds().Dx() - 1 - - for x := newBounds.Min.X; x < newBounds.Max.X; x++ { - row := in.Pix[x*in.Stride:] - for y := newBounds.Min.Y; y < newBounds.Max.Y; y++ { - var gray int64 - var sum int64 - start := offset[y] - ci := y * filterLength - for i := 0; i < filterLength; i++ { - coeff := coeffs[ci+i] - if coeff != 0 { - xi := start + i - switch { - case uint(xi) < uint(maxX): - xi *= 2 - case xi >= maxX: - xi = 2 * maxX - default: - xi = 0 - } - gray += int64(coeff) * int64(uint16(row[xi+0])<<8|uint16(row[xi+1])) - sum += int64(coeff) - } - } - - offset := (y-newBounds.Min.Y)*out.Stride + (x-newBounds.Min.X)*2 - value := clampUint16(gray / sum) - out.Pix[offset+0] = uint8(value >> 8) - out.Pix[offset+1] = uint8(value) - } - } -} - -func resizeYCbCr(in *ycc, out *ycc, scale float64, coeffs []int16, offset []int, filterLength int) { - newBounds := out.Bounds() - maxX := in.Bounds().Dx() - 1 - - for x := newBounds.Min.X; x < newBounds.Max.X; x++ { - row := in.Pix[x*in.Stride:] - for y := newBounds.Min.Y; y < newBounds.Max.Y; y++ { - var p [3]int32 - var sum int32 - start := offset[y] - ci := y * filterLength - for i := 0; i < filterLength; i++ { - coeff := coeffs[ci+i] - if coeff != 0 { - xi := start + i - switch { - case uint(xi) < uint(maxX): - xi *= 3 - case xi >= maxX: - xi = 3 * maxX - default: - xi = 0 - } - p[0] += int32(coeff) * int32(row[xi+0]) - p[1] += int32(coeff) * int32(row[xi+1]) - p[2] += int32(coeff) * int32(row[xi+2]) - sum += int32(coeff) - } - } - - xo := (y-newBounds.Min.Y)*out.Stride + (x-newBounds.Min.X)*3 - out.Pix[xo+0] = clampUint8(p[0] / sum) - out.Pix[xo+1] = clampUint8(p[1] / sum) - out.Pix[xo+2] = clampUint8(p[2] / sum) - } - } -} - -func nearestYCbCr(in *ycc, out *ycc, scale float64, coeffs []bool, offset []int, filterLength int) { - newBounds := out.Bounds() - maxX := in.Bounds().Dx() - 1 - - for x := newBounds.Min.X; x < newBounds.Max.X; x++ { - row := in.Pix[x*in.Stride:] - for y := newBounds.Min.Y; y < newBounds.Max.Y; y++ { - var p [3]float32 - var sum float32 - start := offset[y] - ci := y * filterLength - for i := 0; i < filterLength; i++ { - if coeffs[ci+i] { - xi := start + i - switch { - case uint(xi) < uint(maxX): - xi *= 3 - case xi >= maxX: - xi = 3 * maxX - default: - xi = 0 - } - p[0] += float32(row[xi+0]) - p[1] += float32(row[xi+1]) - p[2] += float32(row[xi+2]) - sum++ - } - } - - xo := (y-newBounds.Min.Y)*out.Stride + (x-newBounds.Min.X)*3 - out.Pix[xo+0] = floatToUint8(p[0] / sum) - out.Pix[xo+1] = floatToUint8(p[1] / sum) - out.Pix[xo+2] = floatToUint8(p[2] / sum) - } - } -} diff --git a/vendor/github.com/nfnt/resize/filters.go b/vendor/github.com/nfnt/resize/filters.go deleted file mode 100644 index 4ce04e3..0000000 --- a/vendor/github.com/nfnt/resize/filters.go +++ /dev/null @@ -1,143 +0,0 @@ -/* -Copyright (c) 2012, Jan Schlicht - -Permission to use, copy, modify, and/or distribute this software for any purpose -with or without fee is hereby granted, provided that the above copyright notice -and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS -OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER -TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF -THIS SOFTWARE. -*/ - -package resize - -import ( - "math" -) - -func nearest(in float64) float64 { - if in >= -0.5 && in < 0.5 { - return 1 - } - return 0 -} - -func linear(in float64) float64 { - in = math.Abs(in) - if in <= 1 { - return 1 - in - } - return 0 -} - -func cubic(in float64) float64 { - in = math.Abs(in) - if in <= 1 { - return in*in*(1.5*in-2.5) + 1.0 - } - if in <= 2 { - return in*(in*(2.5-0.5*in)-4.0) + 2.0 - } - return 0 -} - -func mitchellnetravali(in float64) float64 { - in = math.Abs(in) - if in <= 1 { - return (7.0*in*in*in - 12.0*in*in + 5.33333333333) * 0.16666666666 - } - if in <= 2 { - return (-2.33333333333*in*in*in + 12.0*in*in - 20.0*in + 10.6666666667) * 0.16666666666 - } - return 0 -} - -func sinc(x float64) float64 { - x = math.Abs(x) * math.Pi - if x >= 1.220703e-4 { - return math.Sin(x) / x - } - return 1 -} - -func lanczos2(in float64) float64 { - if in > -2 && in < 2 { - return sinc(in) * sinc(in*0.5) - } - return 0 -} - -func lanczos3(in float64) float64 { - if in > -3 && in < 3 { - return sinc(in) * sinc(in*0.3333333333333333) - } - return 0 -} - -// range [-256,256] -func createWeights8(dy, filterLength int, blur, scale float64, kernel func(float64) float64) ([]int16, []int, int) { - filterLength = filterLength * int(math.Max(math.Ceil(blur*scale), 1)) - filterFactor := math.Min(1./(blur*scale), 1) - - coeffs := make([]int16, dy*filterLength) - start := make([]int, dy) - for y := 0; y < dy; y++ { - interpX := scale*(float64(y)+0.5) - 0.5 - start[y] = int(interpX) - filterLength/2 + 1 - interpX -= float64(start[y]) - for i := 0; i < filterLength; i++ { - in := (interpX - float64(i)) * filterFactor - coeffs[y*filterLength+i] = int16(kernel(in) * 256) - } - } - - return coeffs, start, filterLength -} - -// range [-65536,65536] -func createWeights16(dy, filterLength int, blur, scale float64, kernel func(float64) float64) ([]int32, []int, int) { - filterLength = filterLength * int(math.Max(math.Ceil(blur*scale), 1)) - filterFactor := math.Min(1./(blur*scale), 1) - - coeffs := make([]int32, dy*filterLength) - start := make([]int, dy) - for y := 0; y < dy; y++ { - interpX := scale*(float64(y)+0.5) - 0.5 - start[y] = int(interpX) - filterLength/2 + 1 - interpX -= float64(start[y]) - for i := 0; i < filterLength; i++ { - in := (interpX - float64(i)) * filterFactor - coeffs[y*filterLength+i] = int32(kernel(in) * 65536) - } - } - - return coeffs, start, filterLength -} - -func createWeightsNearest(dy, filterLength int, blur, scale float64) ([]bool, []int, int) { - filterLength = filterLength * int(math.Max(math.Ceil(blur*scale), 1)) - filterFactor := math.Min(1./(blur*scale), 1) - - coeffs := make([]bool, dy*filterLength) - start := make([]int, dy) - for y := 0; y < dy; y++ { - interpX := scale*(float64(y)+0.5) - 0.5 - start[y] = int(interpX) - filterLength/2 + 1 - interpX -= float64(start[y]) - for i := 0; i < filterLength; i++ { - in := (interpX - float64(i)) * filterFactor - if in >= -0.5 && in < 0.5 { - coeffs[y*filterLength+i] = true - } else { - coeffs[y*filterLength+i] = false - } - } - } - - return coeffs, start, filterLength -} diff --git a/vendor/github.com/nfnt/resize/nearest.go b/vendor/github.com/nfnt/resize/nearest.go deleted file mode 100644 index 888039d..0000000 --- a/vendor/github.com/nfnt/resize/nearest.go +++ /dev/null @@ -1,318 +0,0 @@ -/* -Copyright (c) 2014, Charlie Vieth - -Permission to use, copy, modify, and/or distribute this software for any purpose -with or without fee is hereby granted, provided that the above copyright notice -and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS -OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER -TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF -THIS SOFTWARE. -*/ - -package resize - -import "image" - -func floatToUint8(x float32) uint8 { - // Nearest-neighbor values are always - // positive no need to check lower-bound. - if x > 0xfe { - return 0xff - } - return uint8(x) -} - -func floatToUint16(x float32) uint16 { - if x > 0xfffe { - return 0xffff - } - return uint16(x) -} - -func nearestGeneric(in image.Image, out *image.RGBA64, scale float64, coeffs []bool, offset []int, filterLength int) { - newBounds := out.Bounds() - maxX := in.Bounds().Dx() - 1 - - for x := newBounds.Min.X; x < newBounds.Max.X; x++ { - for y := newBounds.Min.Y; y < newBounds.Max.Y; y++ { - var rgba [4]float32 - var sum float32 - start := offset[y] - ci := y * filterLength - for i := 0; i < filterLength; i++ { - if coeffs[ci+i] { - xi := start + i - switch { - case xi < 0: - xi = 0 - case xi >= maxX: - xi = maxX - } - r, g, b, a := in.At(xi+in.Bounds().Min.X, x+in.Bounds().Min.Y).RGBA() - rgba[0] += float32(r) - rgba[1] += float32(g) - rgba[2] += float32(b) - rgba[3] += float32(a) - sum++ - } - } - - offset := (y-newBounds.Min.Y)*out.Stride + (x-newBounds.Min.X)*8 - value := floatToUint16(rgba[0] / sum) - out.Pix[offset+0] = uint8(value >> 8) - out.Pix[offset+1] = uint8(value) - value = floatToUint16(rgba[1] / sum) - out.Pix[offset+2] = uint8(value >> 8) - out.Pix[offset+3] = uint8(value) - value = floatToUint16(rgba[2] / sum) - out.Pix[offset+4] = uint8(value >> 8) - out.Pix[offset+5] = uint8(value) - value = floatToUint16(rgba[3] / sum) - out.Pix[offset+6] = uint8(value >> 8) - out.Pix[offset+7] = uint8(value) - } - } -} - -func nearestRGBA(in *image.RGBA, out *image.RGBA, scale float64, coeffs []bool, offset []int, filterLength int) { - newBounds := out.Bounds() - maxX := in.Bounds().Dx() - 1 - - for x := newBounds.Min.X; x < newBounds.Max.X; x++ { - row := in.Pix[x*in.Stride:] - for y := newBounds.Min.Y; y < newBounds.Max.Y; y++ { - var rgba [4]float32 - var sum float32 - start := offset[y] - ci := y * filterLength - for i := 0; i < filterLength; i++ { - if coeffs[ci+i] { - xi := start + i - switch { - case uint(xi) < uint(maxX): - xi *= 4 - case xi >= maxX: - xi = 4 * maxX - default: - xi = 0 - } - rgba[0] += float32(row[xi+0]) - rgba[1] += float32(row[xi+1]) - rgba[2] += float32(row[xi+2]) - rgba[3] += float32(row[xi+3]) - sum++ - } - } - - xo := (y-newBounds.Min.Y)*out.Stride + (x-newBounds.Min.X)*4 - out.Pix[xo+0] = floatToUint8(rgba[0] / sum) - out.Pix[xo+1] = floatToUint8(rgba[1] / sum) - out.Pix[xo+2] = floatToUint8(rgba[2] / sum) - out.Pix[xo+3] = floatToUint8(rgba[3] / sum) - } - } -} - -func nearestNRGBA(in *image.NRGBA, out *image.NRGBA, scale float64, coeffs []bool, offset []int, filterLength int) { - newBounds := out.Bounds() - maxX := in.Bounds().Dx() - 1 - - for x := newBounds.Min.X; x < newBounds.Max.X; x++ { - row := in.Pix[x*in.Stride:] - for y := newBounds.Min.Y; y < newBounds.Max.Y; y++ { - var rgba [4]float32 - var sum float32 - start := offset[y] - ci := y * filterLength - for i := 0; i < filterLength; i++ { - if coeffs[ci+i] { - xi := start + i - switch { - case uint(xi) < uint(maxX): - xi *= 4 - case xi >= maxX: - xi = 4 * maxX - default: - xi = 0 - } - rgba[0] += float32(row[xi+0]) - rgba[1] += float32(row[xi+1]) - rgba[2] += float32(row[xi+2]) - rgba[3] += float32(row[xi+3]) - sum++ - } - } - - xo := (y-newBounds.Min.Y)*out.Stride + (x-newBounds.Min.X)*4 - out.Pix[xo+0] = floatToUint8(rgba[0] / sum) - out.Pix[xo+1] = floatToUint8(rgba[1] / sum) - out.Pix[xo+2] = floatToUint8(rgba[2] / sum) - out.Pix[xo+3] = floatToUint8(rgba[3] / sum) - } - } -} - -func nearestRGBA64(in *image.RGBA64, out *image.RGBA64, scale float64, coeffs []bool, offset []int, filterLength int) { - newBounds := out.Bounds() - maxX := in.Bounds().Dx() - 1 - - for x := newBounds.Min.X; x < newBounds.Max.X; x++ { - row := in.Pix[x*in.Stride:] - for y := newBounds.Min.Y; y < newBounds.Max.Y; y++ { - var rgba [4]float32 - var sum float32 - start := offset[y] - ci := y * filterLength - for i := 0; i < filterLength; i++ { - if coeffs[ci+i] { - xi := start + i - switch { - case uint(xi) < uint(maxX): - xi *= 8 - case xi >= maxX: - xi = 8 * maxX - default: - xi = 0 - } - rgba[0] += float32(uint16(row[xi+0])<<8 | uint16(row[xi+1])) - rgba[1] += float32(uint16(row[xi+2])<<8 | uint16(row[xi+3])) - rgba[2] += float32(uint16(row[xi+4])<<8 | uint16(row[xi+5])) - rgba[3] += float32(uint16(row[xi+6])<<8 | uint16(row[xi+7])) - sum++ - } - } - - xo := (y-newBounds.Min.Y)*out.Stride + (x-newBounds.Min.X)*8 - value := floatToUint16(rgba[0] / sum) - out.Pix[xo+0] = uint8(value >> 8) - out.Pix[xo+1] = uint8(value) - value = floatToUint16(rgba[1] / sum) - out.Pix[xo+2] = uint8(value >> 8) - out.Pix[xo+3] = uint8(value) - value = floatToUint16(rgba[2] / sum) - out.Pix[xo+4] = uint8(value >> 8) - out.Pix[xo+5] = uint8(value) - value = floatToUint16(rgba[3] / sum) - out.Pix[xo+6] = uint8(value >> 8) - out.Pix[xo+7] = uint8(value) - } - } -} - -func nearestNRGBA64(in *image.NRGBA64, out *image.NRGBA64, scale float64, coeffs []bool, offset []int, filterLength int) { - newBounds := out.Bounds() - maxX := in.Bounds().Dx() - 1 - - for x := newBounds.Min.X; x < newBounds.Max.X; x++ { - row := in.Pix[x*in.Stride:] - for y := newBounds.Min.Y; y < newBounds.Max.Y; y++ { - var rgba [4]float32 - var sum float32 - start := offset[y] - ci := y * filterLength - for i := 0; i < filterLength; i++ { - if coeffs[ci+i] { - xi := start + i - switch { - case uint(xi) < uint(maxX): - xi *= 8 - case xi >= maxX: - xi = 8 * maxX - default: - xi = 0 - } - rgba[0] += float32(uint16(row[xi+0])<<8 | uint16(row[xi+1])) - rgba[1] += float32(uint16(row[xi+2])<<8 | uint16(row[xi+3])) - rgba[2] += float32(uint16(row[xi+4])<<8 | uint16(row[xi+5])) - rgba[3] += float32(uint16(row[xi+6])<<8 | uint16(row[xi+7])) - sum++ - } - } - - xo := (y-newBounds.Min.Y)*out.Stride + (x-newBounds.Min.X)*8 - value := floatToUint16(rgba[0] / sum) - out.Pix[xo+0] = uint8(value >> 8) - out.Pix[xo+1] = uint8(value) - value = floatToUint16(rgba[1] / sum) - out.Pix[xo+2] = uint8(value >> 8) - out.Pix[xo+3] = uint8(value) - value = floatToUint16(rgba[2] / sum) - out.Pix[xo+4] = uint8(value >> 8) - out.Pix[xo+5] = uint8(value) - value = floatToUint16(rgba[3] / sum) - out.Pix[xo+6] = uint8(value >> 8) - out.Pix[xo+7] = uint8(value) - } - } -} - -func nearestGray(in *image.Gray, out *image.Gray, scale float64, coeffs []bool, offset []int, filterLength int) { - newBounds := out.Bounds() - maxX := in.Bounds().Dx() - 1 - - for x := newBounds.Min.X; x < newBounds.Max.X; x++ { - row := in.Pix[x*in.Stride:] - for y := newBounds.Min.Y; y < newBounds.Max.Y; y++ { - var gray float32 - var sum float32 - start := offset[y] - ci := y * filterLength - for i := 0; i < filterLength; i++ { - if coeffs[ci+i] { - xi := start + i - switch { - case xi < 0: - xi = 0 - case xi >= maxX: - xi = maxX - } - gray += float32(row[xi]) - sum++ - } - } - - offset := (y-newBounds.Min.Y)*out.Stride + (x - newBounds.Min.X) - out.Pix[offset] = floatToUint8(gray / sum) - } - } -} - -func nearestGray16(in *image.Gray16, out *image.Gray16, scale float64, coeffs []bool, offset []int, filterLength int) { - newBounds := out.Bounds() - maxX := in.Bounds().Dx() - 1 - - for x := newBounds.Min.X; x < newBounds.Max.X; x++ { - row := in.Pix[x*in.Stride:] - for y := newBounds.Min.Y; y < newBounds.Max.Y; y++ { - var gray float32 - var sum float32 - start := offset[y] - ci := y * filterLength - for i := 0; i < filterLength; i++ { - if coeffs[ci+i] { - xi := start + i - switch { - case uint(xi) < uint(maxX): - xi *= 2 - case xi >= maxX: - xi = 2 * maxX - default: - xi = 0 - } - gray += float32(uint16(row[xi+0])<<8 | uint16(row[xi+1])) - sum++ - } - } - - offset := (y-newBounds.Min.Y)*out.Stride + (x-newBounds.Min.X)*2 - value := floatToUint16(gray / sum) - out.Pix[offset+0] = uint8(value >> 8) - out.Pix[offset+1] = uint8(value) - } - } -} diff --git a/vendor/github.com/nfnt/resize/resize.go b/vendor/github.com/nfnt/resize/resize.go deleted file mode 100644 index 0d7fbf6..0000000 --- a/vendor/github.com/nfnt/resize/resize.go +++ /dev/null @@ -1,620 +0,0 @@ -/* -Copyright (c) 2012, Jan Schlicht - -Permission to use, copy, modify, and/or distribute this software for any purpose -with or without fee is hereby granted, provided that the above copyright notice -and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS -OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER -TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF -THIS SOFTWARE. -*/ - -// Package resize implements various image resizing methods. -// -// The package works with the Image interface described in the image package. -// Various interpolation methods are provided and multiple processors may be -// utilized in the computations. -// -// Example: -// imgResized := resize.Resize(1000, 0, imgOld, resize.MitchellNetravali) -package resize - -import ( - "image" - "runtime" - "sync" -) - -// An InterpolationFunction provides the parameters that describe an -// interpolation kernel. It returns the number of samples to take -// and the kernel function to use for sampling. -type InterpolationFunction int - -// InterpolationFunction constants -const ( - // Nearest-neighbor interpolation - NearestNeighbor InterpolationFunction = iota - // Bilinear interpolation - Bilinear - // Bicubic interpolation (with cubic hermite spline) - Bicubic - // Mitchell-Netravali interpolation - MitchellNetravali - // Lanczos interpolation (a=2) - Lanczos2 - // Lanczos interpolation (a=3) - Lanczos3 -) - -// kernal, returns an InterpolationFunctions taps and kernel. -func (i InterpolationFunction) kernel() (int, func(float64) float64) { - switch i { - case Bilinear: - return 2, linear - case Bicubic: - return 4, cubic - case MitchellNetravali: - return 4, mitchellnetravali - case Lanczos2: - return 4, lanczos2 - case Lanczos3: - return 6, lanczos3 - default: - // Default to NearestNeighbor. - return 2, nearest - } -} - -// values <1 will sharpen the image -var blur = 1.0 - -// Resize scales an image to new width and height using the interpolation function interp. -// A new image with the given dimensions will be returned. -// If one of the parameters width or height is set to 0, its size will be calculated so that -// the aspect ratio is that of the originating image. -// The resizing algorithm uses channels for parallel computation. -// If the input image has width or height of 0, it is returned unchanged. -func Resize(width, height uint, img image.Image, interp InterpolationFunction) image.Image { - scaleX, scaleY := calcFactors(width, height, float64(img.Bounds().Dx()), float64(img.Bounds().Dy())) - if width == 0 { - width = uint(0.7 + float64(img.Bounds().Dx())/scaleX) - } - if height == 0 { - height = uint(0.7 + float64(img.Bounds().Dy())/scaleY) - } - - // Trivial case: return input image - if int(width) == img.Bounds().Dx() && int(height) == img.Bounds().Dy() { - return img - } - - // Input image has no pixels - if img.Bounds().Dx() <= 0 || img.Bounds().Dy() <= 0 { - return img - } - - if interp == NearestNeighbor { - return resizeNearest(width, height, scaleX, scaleY, img, interp) - } - - taps, kernel := interp.kernel() - cpus := runtime.GOMAXPROCS(0) - wg := sync.WaitGroup{} - - // Generic access to image.Image is slow in tight loops. - // The optimal access has to be determined from the concrete image type. - switch input := img.(type) { - case *image.RGBA: - // 8-bit precision - temp := image.NewRGBA(image.Rect(0, 0, input.Bounds().Dy(), int(width))) - result := image.NewRGBA(image.Rect(0, 0, int(width), int(height))) - - // horizontal filter, results in transposed temporary image - coeffs, offset, filterLength := createWeights8(temp.Bounds().Dy(), taps, blur, scaleX, kernel) - wg.Add(cpus) - for i := 0; i < cpus; i++ { - slice := makeSlice(temp, i, cpus).(*image.RGBA) - go func() { - defer wg.Done() - resizeRGBA(input, slice, scaleX, coeffs, offset, filterLength) - }() - } - wg.Wait() - - // horizontal filter on transposed image, result is not transposed - coeffs, offset, filterLength = createWeights8(result.Bounds().Dy(), taps, blur, scaleY, kernel) - wg.Add(cpus) - for i := 0; i < cpus; i++ { - slice := makeSlice(result, i, cpus).(*image.RGBA) - go func() { - defer wg.Done() - resizeRGBA(temp, slice, scaleY, coeffs, offset, filterLength) - }() - } - wg.Wait() - return result - case *image.NRGBA: - // 8-bit precision - temp := image.NewRGBA(image.Rect(0, 0, input.Bounds().Dy(), int(width))) - result := image.NewRGBA(image.Rect(0, 0, int(width), int(height))) - - // horizontal filter, results in transposed temporary image - coeffs, offset, filterLength := createWeights8(temp.Bounds().Dy(), taps, blur, scaleX, kernel) - wg.Add(cpus) - for i := 0; i < cpus; i++ { - slice := makeSlice(temp, i, cpus).(*image.RGBA) - go func() { - defer wg.Done() - resizeNRGBA(input, slice, scaleX, coeffs, offset, filterLength) - }() - } - wg.Wait() - - // horizontal filter on transposed image, result is not transposed - coeffs, offset, filterLength = createWeights8(result.Bounds().Dy(), taps, blur, scaleY, kernel) - wg.Add(cpus) - for i := 0; i < cpus; i++ { - slice := makeSlice(result, i, cpus).(*image.RGBA) - go func() { - defer wg.Done() - resizeRGBA(temp, slice, scaleY, coeffs, offset, filterLength) - }() - } - wg.Wait() - return result - - case *image.YCbCr: - // 8-bit precision - // accessing the YCbCr arrays in a tight loop is slow. - // converting the image to ycc increases performance by 2x. - temp := newYCC(image.Rect(0, 0, input.Bounds().Dy(), int(width)), input.SubsampleRatio) - result := newYCC(image.Rect(0, 0, int(width), int(height)), image.YCbCrSubsampleRatio444) - - coeffs, offset, filterLength := createWeights8(temp.Bounds().Dy(), taps, blur, scaleX, kernel) - in := imageYCbCrToYCC(input) - wg.Add(cpus) - for i := 0; i < cpus; i++ { - slice := makeSlice(temp, i, cpus).(*ycc) - go func() { - defer wg.Done() - resizeYCbCr(in, slice, scaleX, coeffs, offset, filterLength) - }() - } - wg.Wait() - - coeffs, offset, filterLength = createWeights8(result.Bounds().Dy(), taps, blur, scaleY, kernel) - wg.Add(cpus) - for i := 0; i < cpus; i++ { - slice := makeSlice(result, i, cpus).(*ycc) - go func() { - defer wg.Done() - resizeYCbCr(temp, slice, scaleY, coeffs, offset, filterLength) - }() - } - wg.Wait() - return result.YCbCr() - case *image.RGBA64: - // 16-bit precision - temp := image.NewRGBA64(image.Rect(0, 0, input.Bounds().Dy(), int(width))) - result := image.NewRGBA64(image.Rect(0, 0, int(width), int(height))) - - // horizontal filter, results in transposed temporary image - coeffs, offset, filterLength := createWeights16(temp.Bounds().Dy(), taps, blur, scaleX, kernel) - wg.Add(cpus) - for i := 0; i < cpus; i++ { - slice := makeSlice(temp, i, cpus).(*image.RGBA64) - go func() { - defer wg.Done() - resizeRGBA64(input, slice, scaleX, coeffs, offset, filterLength) - }() - } - wg.Wait() - - // horizontal filter on transposed image, result is not transposed - coeffs, offset, filterLength = createWeights16(result.Bounds().Dy(), taps, blur, scaleY, kernel) - wg.Add(cpus) - for i := 0; i < cpus; i++ { - slice := makeSlice(result, i, cpus).(*image.RGBA64) - go func() { - defer wg.Done() - resizeRGBA64(temp, slice, scaleY, coeffs, offset, filterLength) - }() - } - wg.Wait() - return result - case *image.NRGBA64: - // 16-bit precision - temp := image.NewRGBA64(image.Rect(0, 0, input.Bounds().Dy(), int(width))) - result := image.NewRGBA64(image.Rect(0, 0, int(width), int(height))) - - // horizontal filter, results in transposed temporary image - coeffs, offset, filterLength := createWeights16(temp.Bounds().Dy(), taps, blur, scaleX, kernel) - wg.Add(cpus) - for i := 0; i < cpus; i++ { - slice := makeSlice(temp, i, cpus).(*image.RGBA64) - go func() { - defer wg.Done() - resizeNRGBA64(input, slice, scaleX, coeffs, offset, filterLength) - }() - } - wg.Wait() - - // horizontal filter on transposed image, result is not transposed - coeffs, offset, filterLength = createWeights16(result.Bounds().Dy(), taps, blur, scaleY, kernel) - wg.Add(cpus) - for i := 0; i < cpus; i++ { - slice := makeSlice(result, i, cpus).(*image.RGBA64) - go func() { - defer wg.Done() - resizeRGBA64(temp, slice, scaleY, coeffs, offset, filterLength) - }() - } - wg.Wait() - return result - case *image.Gray: - // 8-bit precision - temp := image.NewGray(image.Rect(0, 0, input.Bounds().Dy(), int(width))) - result := image.NewGray(image.Rect(0, 0, int(width), int(height))) - - // horizontal filter, results in transposed temporary image - coeffs, offset, filterLength := createWeights8(temp.Bounds().Dy(), taps, blur, scaleX, kernel) - wg.Add(cpus) - for i := 0; i < cpus; i++ { - slice := makeSlice(temp, i, cpus).(*image.Gray) - go func() { - defer wg.Done() - resizeGray(input, slice, scaleX, coeffs, offset, filterLength) - }() - } - wg.Wait() - - // horizontal filter on transposed image, result is not transposed - coeffs, offset, filterLength = createWeights8(result.Bounds().Dy(), taps, blur, scaleY, kernel) - wg.Add(cpus) - for i := 0; i < cpus; i++ { - slice := makeSlice(result, i, cpus).(*image.Gray) - go func() { - defer wg.Done() - resizeGray(temp, slice, scaleY, coeffs, offset, filterLength) - }() - } - wg.Wait() - return result - case *image.Gray16: - // 16-bit precision - temp := image.NewGray16(image.Rect(0, 0, input.Bounds().Dy(), int(width))) - result := image.NewGray16(image.Rect(0, 0, int(width), int(height))) - - // horizontal filter, results in transposed temporary image - coeffs, offset, filterLength := createWeights16(temp.Bounds().Dy(), taps, blur, scaleX, kernel) - wg.Add(cpus) - for i := 0; i < cpus; i++ { - slice := makeSlice(temp, i, cpus).(*image.Gray16) - go func() { - defer wg.Done() - resizeGray16(input, slice, scaleX, coeffs, offset, filterLength) - }() - } - wg.Wait() - - // horizontal filter on transposed image, result is not transposed - coeffs, offset, filterLength = createWeights16(result.Bounds().Dy(), taps, blur, scaleY, kernel) - wg.Add(cpus) - for i := 0; i < cpus; i++ { - slice := makeSlice(result, i, cpus).(*image.Gray16) - go func() { - defer wg.Done() - resizeGray16(temp, slice, scaleY, coeffs, offset, filterLength) - }() - } - wg.Wait() - return result - default: - // 16-bit precision - temp := image.NewRGBA64(image.Rect(0, 0, img.Bounds().Dy(), int(width))) - result := image.NewRGBA64(image.Rect(0, 0, int(width), int(height))) - - // horizontal filter, results in transposed temporary image - coeffs, offset, filterLength := createWeights16(temp.Bounds().Dy(), taps, blur, scaleX, kernel) - wg.Add(cpus) - for i := 0; i < cpus; i++ { - slice := makeSlice(temp, i, cpus).(*image.RGBA64) - go func() { - defer wg.Done() - resizeGeneric(img, slice, scaleX, coeffs, offset, filterLength) - }() - } - wg.Wait() - - // horizontal filter on transposed image, result is not transposed - coeffs, offset, filterLength = createWeights16(result.Bounds().Dy(), taps, blur, scaleY, kernel) - wg.Add(cpus) - for i := 0; i < cpus; i++ { - slice := makeSlice(result, i, cpus).(*image.RGBA64) - go func() { - defer wg.Done() - resizeRGBA64(temp, slice, scaleY, coeffs, offset, filterLength) - }() - } - wg.Wait() - return result - } -} - -func resizeNearest(width, height uint, scaleX, scaleY float64, img image.Image, interp InterpolationFunction) image.Image { - taps, _ := interp.kernel() - cpus := runtime.GOMAXPROCS(0) - wg := sync.WaitGroup{} - - switch input := img.(type) { - case *image.RGBA: - // 8-bit precision - temp := image.NewRGBA(image.Rect(0, 0, input.Bounds().Dy(), int(width))) - result := image.NewRGBA(image.Rect(0, 0, int(width), int(height))) - - // horizontal filter, results in transposed temporary image - coeffs, offset, filterLength := createWeightsNearest(temp.Bounds().Dy(), taps, blur, scaleX) - wg.Add(cpus) - for i := 0; i < cpus; i++ { - slice := makeSlice(temp, i, cpus).(*image.RGBA) - go func() { - defer wg.Done() - nearestRGBA(input, slice, scaleX, coeffs, offset, filterLength) - }() - } - wg.Wait() - - // horizontal filter on transposed image, result is not transposed - coeffs, offset, filterLength = createWeightsNearest(result.Bounds().Dy(), taps, blur, scaleY) - wg.Add(cpus) - for i := 0; i < cpus; i++ { - slice := makeSlice(result, i, cpus).(*image.RGBA) - go func() { - defer wg.Done() - nearestRGBA(temp, slice, scaleY, coeffs, offset, filterLength) - }() - } - wg.Wait() - return result - case *image.NRGBA: - // 8-bit precision - temp := image.NewNRGBA(image.Rect(0, 0, input.Bounds().Dy(), int(width))) - result := image.NewNRGBA(image.Rect(0, 0, int(width), int(height))) - - // horizontal filter, results in transposed temporary image - coeffs, offset, filterLength := createWeightsNearest(temp.Bounds().Dy(), taps, blur, scaleX) - wg.Add(cpus) - for i := 0; i < cpus; i++ { - slice := makeSlice(temp, i, cpus).(*image.NRGBA) - go func() { - defer wg.Done() - nearestNRGBA(input, slice, scaleX, coeffs, offset, filterLength) - }() - } - wg.Wait() - - // horizontal filter on transposed image, result is not transposed - coeffs, offset, filterLength = createWeightsNearest(result.Bounds().Dy(), taps, blur, scaleY) - wg.Add(cpus) - for i := 0; i < cpus; i++ { - slice := makeSlice(result, i, cpus).(*image.NRGBA) - go func() { - defer wg.Done() - nearestNRGBA(temp, slice, scaleY, coeffs, offset, filterLength) - }() - } - wg.Wait() - return result - case *image.YCbCr: - // 8-bit precision - // accessing the YCbCr arrays in a tight loop is slow. - // converting the image to ycc increases performance by 2x. - temp := newYCC(image.Rect(0, 0, input.Bounds().Dy(), int(width)), input.SubsampleRatio) - result := newYCC(image.Rect(0, 0, int(width), int(height)), image.YCbCrSubsampleRatio444) - - coeffs, offset, filterLength := createWeightsNearest(temp.Bounds().Dy(), taps, blur, scaleX) - in := imageYCbCrToYCC(input) - wg.Add(cpus) - for i := 0; i < cpus; i++ { - slice := makeSlice(temp, i, cpus).(*ycc) - go func() { - defer wg.Done() - nearestYCbCr(in, slice, scaleX, coeffs, offset, filterLength) - }() - } - wg.Wait() - - coeffs, offset, filterLength = createWeightsNearest(result.Bounds().Dy(), taps, blur, scaleY) - wg.Add(cpus) - for i := 0; i < cpus; i++ { - slice := makeSlice(result, i, cpus).(*ycc) - go func() { - defer wg.Done() - nearestYCbCr(temp, slice, scaleY, coeffs, offset, filterLength) - }() - } - wg.Wait() - return result.YCbCr() - case *image.RGBA64: - // 16-bit precision - temp := image.NewRGBA64(image.Rect(0, 0, input.Bounds().Dy(), int(width))) - result := image.NewRGBA64(image.Rect(0, 0, int(width), int(height))) - - // horizontal filter, results in transposed temporary image - coeffs, offset, filterLength := createWeightsNearest(temp.Bounds().Dy(), taps, blur, scaleX) - wg.Add(cpus) - for i := 0; i < cpus; i++ { - slice := makeSlice(temp, i, cpus).(*image.RGBA64) - go func() { - defer wg.Done() - nearestRGBA64(input, slice, scaleX, coeffs, offset, filterLength) - }() - } - wg.Wait() - - // horizontal filter on transposed image, result is not transposed - coeffs, offset, filterLength = createWeightsNearest(result.Bounds().Dy(), taps, blur, scaleY) - wg.Add(cpus) - for i := 0; i < cpus; i++ { - slice := makeSlice(result, i, cpus).(*image.RGBA64) - go func() { - defer wg.Done() - nearestRGBA64(temp, slice, scaleY, coeffs, offset, filterLength) - }() - } - wg.Wait() - return result - case *image.NRGBA64: - // 16-bit precision - temp := image.NewNRGBA64(image.Rect(0, 0, input.Bounds().Dy(), int(width))) - result := image.NewNRGBA64(image.Rect(0, 0, int(width), int(height))) - - // horizontal filter, results in transposed temporary image - coeffs, offset, filterLength := createWeightsNearest(temp.Bounds().Dy(), taps, blur, scaleX) - wg.Add(cpus) - for i := 0; i < cpus; i++ { - slice := makeSlice(temp, i, cpus).(*image.NRGBA64) - go func() { - defer wg.Done() - nearestNRGBA64(input, slice, scaleX, coeffs, offset, filterLength) - }() - } - wg.Wait() - - // horizontal filter on transposed image, result is not transposed - coeffs, offset, filterLength = createWeightsNearest(result.Bounds().Dy(), taps, blur, scaleY) - wg.Add(cpus) - for i := 0; i < cpus; i++ { - slice := makeSlice(result, i, cpus).(*image.NRGBA64) - go func() { - defer wg.Done() - nearestNRGBA64(temp, slice, scaleY, coeffs, offset, filterLength) - }() - } - wg.Wait() - return result - case *image.Gray: - // 8-bit precision - temp := image.NewGray(image.Rect(0, 0, input.Bounds().Dy(), int(width))) - result := image.NewGray(image.Rect(0, 0, int(width), int(height))) - - // horizontal filter, results in transposed temporary image - coeffs, offset, filterLength := createWeightsNearest(temp.Bounds().Dy(), taps, blur, scaleX) - wg.Add(cpus) - for i := 0; i < cpus; i++ { - slice := makeSlice(temp, i, cpus).(*image.Gray) - go func() { - defer wg.Done() - nearestGray(input, slice, scaleX, coeffs, offset, filterLength) - }() - } - wg.Wait() - - // horizontal filter on transposed image, result is not transposed - coeffs, offset, filterLength = createWeightsNearest(result.Bounds().Dy(), taps, blur, scaleY) - wg.Add(cpus) - for i := 0; i < cpus; i++ { - slice := makeSlice(result, i, cpus).(*image.Gray) - go func() { - defer wg.Done() - nearestGray(temp, slice, scaleY, coeffs, offset, filterLength) - }() - } - wg.Wait() - return result - case *image.Gray16: - // 16-bit precision - temp := image.NewGray16(image.Rect(0, 0, input.Bounds().Dy(), int(width))) - result := image.NewGray16(image.Rect(0, 0, int(width), int(height))) - - // horizontal filter, results in transposed temporary image - coeffs, offset, filterLength := createWeightsNearest(temp.Bounds().Dy(), taps, blur, scaleX) - wg.Add(cpus) - for i := 0; i < cpus; i++ { - slice := makeSlice(temp, i, cpus).(*image.Gray16) - go func() { - defer wg.Done() - nearestGray16(input, slice, scaleX, coeffs, offset, filterLength) - }() - } - wg.Wait() - - // horizontal filter on transposed image, result is not transposed - coeffs, offset, filterLength = createWeightsNearest(result.Bounds().Dy(), taps, blur, scaleY) - wg.Add(cpus) - for i := 0; i < cpus; i++ { - slice := makeSlice(result, i, cpus).(*image.Gray16) - go func() { - defer wg.Done() - nearestGray16(temp, slice, scaleY, coeffs, offset, filterLength) - }() - } - wg.Wait() - return result - default: - // 16-bit precision - temp := image.NewRGBA64(image.Rect(0, 0, img.Bounds().Dy(), int(width))) - result := image.NewRGBA64(image.Rect(0, 0, int(width), int(height))) - - // horizontal filter, results in transposed temporary image - coeffs, offset, filterLength := createWeightsNearest(temp.Bounds().Dy(), taps, blur, scaleX) - wg.Add(cpus) - for i := 0; i < cpus; i++ { - slice := makeSlice(temp, i, cpus).(*image.RGBA64) - go func() { - defer wg.Done() - nearestGeneric(img, slice, scaleX, coeffs, offset, filterLength) - }() - } - wg.Wait() - - // horizontal filter on transposed image, result is not transposed - coeffs, offset, filterLength = createWeightsNearest(result.Bounds().Dy(), taps, blur, scaleY) - wg.Add(cpus) - for i := 0; i < cpus; i++ { - slice := makeSlice(result, i, cpus).(*image.RGBA64) - go func() { - defer wg.Done() - nearestRGBA64(temp, slice, scaleY, coeffs, offset, filterLength) - }() - } - wg.Wait() - return result - } - -} - -// Calculates scaling factors using old and new image dimensions. -func calcFactors(width, height uint, oldWidth, oldHeight float64) (scaleX, scaleY float64) { - if width == 0 { - if height == 0 { - scaleX = 1.0 - scaleY = 1.0 - } else { - scaleY = oldHeight / float64(height) - scaleX = scaleY - } - } else { - scaleX = oldWidth / float64(width) - if height == 0 { - scaleY = scaleX - } else { - scaleY = oldHeight / float64(height) - } - } - return -} - -type imageWithSubImage interface { - image.Image - SubImage(image.Rectangle) image.Image -} - -func makeSlice(img imageWithSubImage, i, n int) image.Image { - return img.SubImage(image.Rect(img.Bounds().Min.X, img.Bounds().Min.Y+i*img.Bounds().Dy()/n, img.Bounds().Max.X, img.Bounds().Min.Y+(i+1)*img.Bounds().Dy()/n)) -} diff --git a/vendor/github.com/nfnt/resize/thumbnail.go b/vendor/github.com/nfnt/resize/thumbnail.go deleted file mode 100644 index 9efc246..0000000 --- a/vendor/github.com/nfnt/resize/thumbnail.go +++ /dev/null @@ -1,55 +0,0 @@ -/* -Copyright (c) 2012, Jan Schlicht - -Permission to use, copy, modify, and/or distribute this software for any purpose -with or without fee is hereby granted, provided that the above copyright notice -and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS -OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER -TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF -THIS SOFTWARE. -*/ - -package resize - -import ( - "image" -) - -// Thumbnail will downscale provided image to max width and height preserving -// original aspect ratio and using the interpolation function interp. -// It will return original image, without processing it, if original sizes -// are already smaller than provided constraints. -func Thumbnail(maxWidth, maxHeight uint, img image.Image, interp InterpolationFunction) image.Image { - origBounds := img.Bounds() - origWidth := uint(origBounds.Dx()) - origHeight := uint(origBounds.Dy()) - newWidth, newHeight := origWidth, origHeight - - // Return original image if it have same or smaller size as constraints - if maxWidth >= origWidth && maxHeight >= origHeight { - return img - } - - // Preserve aspect ratio - if origWidth > maxWidth { - newHeight = uint(origHeight * maxWidth / origWidth) - if newHeight < 1 { - newHeight = 1 - } - newWidth = maxWidth - } - - if newHeight > maxHeight { - newWidth = uint(newWidth * maxHeight / newHeight) - if newWidth < 1 { - newWidth = 1 - } - newHeight = maxHeight - } - return Resize(newWidth, newHeight, img, interp) -} diff --git a/vendor/github.com/nfnt/resize/ycc.go b/vendor/github.com/nfnt/resize/ycc.go deleted file mode 100644 index 143e4d0..0000000 --- a/vendor/github.com/nfnt/resize/ycc.go +++ /dev/null @@ -1,387 +0,0 @@ -/* -Copyright (c) 2014, Charlie Vieth - -Permission to use, copy, modify, and/or distribute this software for any purpose -with or without fee is hereby granted, provided that the above copyright notice -and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS -OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER -TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF -THIS SOFTWARE. -*/ - -package resize - -import ( - "image" - "image/color" -) - -// ycc is an in memory YCbCr image. The Y, Cb and Cr samples are held in a -// single slice to increase resizing performance. -type ycc struct { - // Pix holds the image's pixels, in Y, Cb, Cr order. The pixel at - // (x, y) starts at Pix[(y-Rect.Min.Y)*Stride + (x-Rect.Min.X)*3]. - Pix []uint8 - // Stride is the Pix stride (in bytes) between vertically adjacent pixels. - Stride int - // Rect is the image's bounds. - Rect image.Rectangle - // SubsampleRatio is the subsample ratio of the original YCbCr image. - SubsampleRatio image.YCbCrSubsampleRatio -} - -// PixOffset returns the index of the first element of Pix that corresponds to -// the pixel at (x, y). -func (p *ycc) PixOffset(x, y int) int { - return (y-p.Rect.Min.Y)*p.Stride + (x-p.Rect.Min.X)*3 -} - -func (p *ycc) Bounds() image.Rectangle { - return p.Rect -} - -func (p *ycc) ColorModel() color.Model { - return color.YCbCrModel -} - -func (p *ycc) At(x, y int) color.Color { - if !(image.Point{x, y}.In(p.Rect)) { - return color.YCbCr{} - } - i := p.PixOffset(x, y) - return color.YCbCr{ - p.Pix[i+0], - p.Pix[i+1], - p.Pix[i+2], - } -} - -func (p *ycc) Opaque() bool { - return true -} - -// SubImage returns an image representing the portion of the image p visible -// through r. The returned value shares pixels with the original image. -func (p *ycc) SubImage(r image.Rectangle) image.Image { - r = r.Intersect(p.Rect) - if r.Empty() { - return &ycc{SubsampleRatio: p.SubsampleRatio} - } - i := p.PixOffset(r.Min.X, r.Min.Y) - return &ycc{ - Pix: p.Pix[i:], - Stride: p.Stride, - Rect: r, - SubsampleRatio: p.SubsampleRatio, - } -} - -// newYCC returns a new ycc with the given bounds and subsample ratio. -func newYCC(r image.Rectangle, s image.YCbCrSubsampleRatio) *ycc { - w, h := r.Dx(), r.Dy() - buf := make([]uint8, 3*w*h) - return &ycc{Pix: buf, Stride: 3 * w, Rect: r, SubsampleRatio: s} -} - -// Copy of image.YCbCrSubsampleRatio constants - this allows us to support -// older versions of Go where these constants are not defined (i.e. Go 1.4) -const ( - ycbcrSubsampleRatio444 image.YCbCrSubsampleRatio = iota - ycbcrSubsampleRatio422 - ycbcrSubsampleRatio420 - ycbcrSubsampleRatio440 - ycbcrSubsampleRatio411 - ycbcrSubsampleRatio410 -) - -// YCbCr converts ycc to a YCbCr image with the same subsample ratio -// as the YCbCr image that ycc was generated from. -func (p *ycc) YCbCr() *image.YCbCr { - ycbcr := image.NewYCbCr(p.Rect, p.SubsampleRatio) - switch ycbcr.SubsampleRatio { - case ycbcrSubsampleRatio422: - return p.ycbcr422(ycbcr) - case ycbcrSubsampleRatio420: - return p.ycbcr420(ycbcr) - case ycbcrSubsampleRatio440: - return p.ycbcr440(ycbcr) - case ycbcrSubsampleRatio444: - return p.ycbcr444(ycbcr) - case ycbcrSubsampleRatio411: - return p.ycbcr411(ycbcr) - case ycbcrSubsampleRatio410: - return p.ycbcr410(ycbcr) - } - return ycbcr -} - -// imageYCbCrToYCC converts a YCbCr image to a ycc image for resizing. -func imageYCbCrToYCC(in *image.YCbCr) *ycc { - w, h := in.Rect.Dx(), in.Rect.Dy() - p := ycc{ - Pix: make([]uint8, 3*w*h), - Stride: 3 * w, - Rect: image.Rect(0, 0, w, h), - SubsampleRatio: in.SubsampleRatio, - } - switch in.SubsampleRatio { - case ycbcrSubsampleRatio422: - return convertToYCC422(in, &p) - case ycbcrSubsampleRatio420: - return convertToYCC420(in, &p) - case ycbcrSubsampleRatio440: - return convertToYCC440(in, &p) - case ycbcrSubsampleRatio444: - return convertToYCC444(in, &p) - case ycbcrSubsampleRatio411: - return convertToYCC411(in, &p) - case ycbcrSubsampleRatio410: - return convertToYCC410(in, &p) - } - return &p -} - -func (p *ycc) ycbcr422(ycbcr *image.YCbCr) *image.YCbCr { - var off int - Pix := p.Pix - Y := ycbcr.Y - Cb := ycbcr.Cb - Cr := ycbcr.Cr - for y := 0; y < ycbcr.Rect.Max.Y-ycbcr.Rect.Min.Y; y++ { - yy := y * ycbcr.YStride - cy := y * ycbcr.CStride - for x := 0; x < ycbcr.Rect.Max.X-ycbcr.Rect.Min.X; x++ { - ci := cy + x/2 - Y[yy+x] = Pix[off+0] - Cb[ci] = Pix[off+1] - Cr[ci] = Pix[off+2] - off += 3 - } - } - return ycbcr -} - -func (p *ycc) ycbcr420(ycbcr *image.YCbCr) *image.YCbCr { - var off int - Pix := p.Pix - Y := ycbcr.Y - Cb := ycbcr.Cb - Cr := ycbcr.Cr - for y := 0; y < ycbcr.Rect.Max.Y-ycbcr.Rect.Min.Y; y++ { - yy := y * ycbcr.YStride - cy := (y / 2) * ycbcr.CStride - for x := 0; x < ycbcr.Rect.Max.X-ycbcr.Rect.Min.X; x++ { - ci := cy + x/2 - Y[yy+x] = Pix[off+0] - Cb[ci] = Pix[off+1] - Cr[ci] = Pix[off+2] - off += 3 - } - } - return ycbcr -} - -func (p *ycc) ycbcr440(ycbcr *image.YCbCr) *image.YCbCr { - var off int - Pix := p.Pix - Y := ycbcr.Y - Cb := ycbcr.Cb - Cr := ycbcr.Cr - for y := 0; y < ycbcr.Rect.Max.Y-ycbcr.Rect.Min.Y; y++ { - yy := y * ycbcr.YStride - cy := (y / 2) * ycbcr.CStride - for x := 0; x < ycbcr.Rect.Max.X-ycbcr.Rect.Min.X; x++ { - ci := cy + x - Y[yy+x] = Pix[off+0] - Cb[ci] = Pix[off+1] - Cr[ci] = Pix[off+2] - off += 3 - } - } - return ycbcr -} - -func (p *ycc) ycbcr444(ycbcr *image.YCbCr) *image.YCbCr { - var off int - Pix := p.Pix - Y := ycbcr.Y - Cb := ycbcr.Cb - Cr := ycbcr.Cr - for y := 0; y < ycbcr.Rect.Max.Y-ycbcr.Rect.Min.Y; y++ { - yy := y * ycbcr.YStride - cy := y * ycbcr.CStride - for x := 0; x < ycbcr.Rect.Max.X-ycbcr.Rect.Min.X; x++ { - ci := cy + x - Y[yy+x] = Pix[off+0] - Cb[ci] = Pix[off+1] - Cr[ci] = Pix[off+2] - off += 3 - } - } - return ycbcr -} - -func (p *ycc) ycbcr411(ycbcr *image.YCbCr) *image.YCbCr { - var off int - Pix := p.Pix - Y := ycbcr.Y - Cb := ycbcr.Cb - Cr := ycbcr.Cr - for y := 0; y < ycbcr.Rect.Max.Y-ycbcr.Rect.Min.Y; y++ { - yy := y * ycbcr.YStride - cy := y * ycbcr.CStride - for x := 0; x < ycbcr.Rect.Max.X-ycbcr.Rect.Min.X; x++ { - ci := cy + x/4 - Y[yy+x] = Pix[off+0] - Cb[ci] = Pix[off+1] - Cr[ci] = Pix[off+2] - off += 3 - } - } - return ycbcr -} - -func (p *ycc) ycbcr410(ycbcr *image.YCbCr) *image.YCbCr { - var off int - Pix := p.Pix - Y := ycbcr.Y - Cb := ycbcr.Cb - Cr := ycbcr.Cr - for y := 0; y < ycbcr.Rect.Max.Y-ycbcr.Rect.Min.Y; y++ { - yy := y * ycbcr.YStride - cy := (y / 2) * ycbcr.CStride - for x := 0; x < ycbcr.Rect.Max.X-ycbcr.Rect.Min.X; x++ { - ci := cy + x/4 - Y[yy+x] = Pix[off+0] - Cb[ci] = Pix[off+1] - Cr[ci] = Pix[off+2] - off += 3 - } - } - return ycbcr -} - -func convertToYCC422(in *image.YCbCr, p *ycc) *ycc { - var off int - Pix := p.Pix - Y := in.Y - Cb := in.Cb - Cr := in.Cr - for y := 0; y < in.Rect.Max.Y-in.Rect.Min.Y; y++ { - yy := y * in.YStride - cy := y * in.CStride - for x := 0; x < in.Rect.Max.X-in.Rect.Min.X; x++ { - ci := cy + x/2 - Pix[off+0] = Y[yy+x] - Pix[off+1] = Cb[ci] - Pix[off+2] = Cr[ci] - off += 3 - } - } - return p -} - -func convertToYCC420(in *image.YCbCr, p *ycc) *ycc { - var off int - Pix := p.Pix - Y := in.Y - Cb := in.Cb - Cr := in.Cr - for y := 0; y < in.Rect.Max.Y-in.Rect.Min.Y; y++ { - yy := y * in.YStride - cy := (y / 2) * in.CStride - for x := 0; x < in.Rect.Max.X-in.Rect.Min.X; x++ { - ci := cy + x/2 - Pix[off+0] = Y[yy+x] - Pix[off+1] = Cb[ci] - Pix[off+2] = Cr[ci] - off += 3 - } - } - return p -} - -func convertToYCC440(in *image.YCbCr, p *ycc) *ycc { - var off int - Pix := p.Pix - Y := in.Y - Cb := in.Cb - Cr := in.Cr - for y := 0; y < in.Rect.Max.Y-in.Rect.Min.Y; y++ { - yy := y * in.YStride - cy := (y / 2) * in.CStride - for x := 0; x < in.Rect.Max.X-in.Rect.Min.X; x++ { - ci := cy + x - Pix[off+0] = Y[yy+x] - Pix[off+1] = Cb[ci] - Pix[off+2] = Cr[ci] - off += 3 - } - } - return p -} - -func convertToYCC444(in *image.YCbCr, p *ycc) *ycc { - var off int - Pix := p.Pix - Y := in.Y - Cb := in.Cb - Cr := in.Cr - for y := 0; y < in.Rect.Max.Y-in.Rect.Min.Y; y++ { - yy := y * in.YStride - cy := y * in.CStride - for x := 0; x < in.Rect.Max.X-in.Rect.Min.X; x++ { - ci := cy + x - Pix[off+0] = Y[yy+x] - Pix[off+1] = Cb[ci] - Pix[off+2] = Cr[ci] - off += 3 - } - } - return p -} - -func convertToYCC411(in *image.YCbCr, p *ycc) *ycc { - var off int - Pix := p.Pix - Y := in.Y - Cb := in.Cb - Cr := in.Cr - for y := 0; y < in.Rect.Max.Y-in.Rect.Min.Y; y++ { - yy := y * in.YStride - cy := y * in.CStride - for x := 0; x < in.Rect.Max.X-in.Rect.Min.X; x++ { - ci := cy + x/4 - Pix[off+0] = Y[yy+x] - Pix[off+1] = Cb[ci] - Pix[off+2] = Cr[ci] - off += 3 - } - } - return p -} - -func convertToYCC410(in *image.YCbCr, p *ycc) *ycc { - var off int - Pix := p.Pix - Y := in.Y - Cb := in.Cb - Cr := in.Cr - for y := 0; y < in.Rect.Max.Y-in.Rect.Min.Y; y++ { - yy := y * in.YStride - cy := (y / 2) * in.CStride - for x := 0; x < in.Rect.Max.X-in.Rect.Min.X; x++ { - ci := cy + x/4 - Pix[off+0] = Y[yy+x] - Pix[off+1] = Cb[ci] - Pix[off+2] = Cr[ci] - off += 3 - } - } - return p -} diff --git a/vendor/github.com/pkg/browser/LICENSE b/vendor/github.com/pkg/browser/LICENSE deleted file mode 100644 index 65f78fb..0000000 --- a/vendor/github.com/pkg/browser/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ -Copyright (c) 2014, Dave Cheney -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/pkg/browser/README.md b/vendor/github.com/pkg/browser/README.md deleted file mode 100644 index 72b1976..0000000 --- a/vendor/github.com/pkg/browser/README.md +++ /dev/null @@ -1,55 +0,0 @@ - -# browser - import "github.com/pkg/browser" - -Package browser provides helpers to open files, readers, and urls in a browser window. - -The choice of which browser is started is entirely client dependant. - - - - - -## Variables -``` go -var Stderr io.Writer = os.Stderr -``` -Stderr is the io.Writer to which executed commands write standard error. - -``` go -var Stdout io.Writer = os.Stdout -``` -Stdout is the io.Writer to which executed commands write standard output. - - -## func OpenFile -``` go -func OpenFile(path string) error -``` -OpenFile opens new browser window for the file path. - - -## func OpenReader -``` go -func OpenReader(r io.Reader) error -``` -OpenReader consumes the contents of r and presents the -results in a new browser window. - - -## func OpenURL -``` go -func OpenURL(url string) error -``` -OpenURL opens a new browser window pointing to url. - - - - - - - - - -- - - -Generated by [godoc2md](http://godoc.org/github.com/davecheney/godoc2md) diff --git a/vendor/github.com/pkg/browser/browser.go b/vendor/github.com/pkg/browser/browser.go deleted file mode 100644 index d7969d7..0000000 --- a/vendor/github.com/pkg/browser/browser.go +++ /dev/null @@ -1,57 +0,0 @@ -// Package browser provides helpers to open files, readers, and urls in a browser window. -// -// The choice of which browser is started is entirely client dependant. -package browser - -import ( - "fmt" - "io" - "io/ioutil" - "os" - "os/exec" - "path/filepath" -) - -// Stdout is the io.Writer to which executed commands write standard output. -var Stdout io.Writer = os.Stdout - -// Stderr is the io.Writer to which executed commands write standard error. -var Stderr io.Writer = os.Stderr - -// OpenFile opens new browser window for the file path. -func OpenFile(path string) error { - path, err := filepath.Abs(path) - if err != nil { - return err - } - return OpenURL("file://" + path) -} - -// OpenReader consumes the contents of r and presents the -// results in a new browser window. -func OpenReader(r io.Reader) error { - f, err := ioutil.TempFile("", "browser.*.html") - if err != nil { - return fmt.Errorf("browser: could not create temporary file: %v", err) - } - if _, err := io.Copy(f, r); err != nil { - f.Close() - return fmt.Errorf("browser: caching temporary file failed: %v", err) - } - if err := f.Close(); err != nil { - return fmt.Errorf("browser: caching temporary file failed: %v", err) - } - return OpenFile(f.Name()) -} - -// OpenURL opens a new browser window pointing to url. -func OpenURL(url string) error { - return openBrowser(url) -} - -func runCmd(prog string, args ...string) error { - cmd := exec.Command(prog, args...) - cmd.Stdout = Stdout - cmd.Stderr = Stderr - return cmd.Run() -} diff --git a/vendor/github.com/pkg/browser/browser_darwin.go b/vendor/github.com/pkg/browser/browser_darwin.go deleted file mode 100644 index 8507cf7..0000000 --- a/vendor/github.com/pkg/browser/browser_darwin.go +++ /dev/null @@ -1,5 +0,0 @@ -package browser - -func openBrowser(url string) error { - return runCmd("open", url) -} diff --git a/vendor/github.com/pkg/browser/browser_freebsd.go b/vendor/github.com/pkg/browser/browser_freebsd.go deleted file mode 100644 index 4fc7ff0..0000000 --- a/vendor/github.com/pkg/browser/browser_freebsd.go +++ /dev/null @@ -1,14 +0,0 @@ -package browser - -import ( - "errors" - "os/exec" -) - -func openBrowser(url string) error { - err := runCmd("xdg-open", url) - if e, ok := err.(*exec.Error); ok && e.Err == exec.ErrNotFound { - return errors.New("xdg-open: command not found - install xdg-utils from ports(8)") - } - return err -} diff --git a/vendor/github.com/pkg/browser/browser_linux.go b/vendor/github.com/pkg/browser/browser_linux.go deleted file mode 100644 index d26cddd..0000000 --- a/vendor/github.com/pkg/browser/browser_linux.go +++ /dev/null @@ -1,21 +0,0 @@ -package browser - -import ( - "os/exec" - "strings" -) - -func openBrowser(url string) error { - providers := []string{"xdg-open", "x-www-browser", "www-browser"} - - // There are multiple possible providers to open a browser on linux - // One of them is xdg-open, another is x-www-browser, then there's www-browser, etc. - // Look for one that exists and run it - for _, provider := range providers { - if _, err := exec.LookPath(provider); err == nil { - return runCmd(provider, url) - } - } - - return &exec.Error{Name: strings.Join(providers, ","), Err: exec.ErrNotFound} -} diff --git a/vendor/github.com/pkg/browser/browser_openbsd.go b/vendor/github.com/pkg/browser/browser_openbsd.go deleted file mode 100644 index 4fc7ff0..0000000 --- a/vendor/github.com/pkg/browser/browser_openbsd.go +++ /dev/null @@ -1,14 +0,0 @@ -package browser - -import ( - "errors" - "os/exec" -) - -func openBrowser(url string) error { - err := runCmd("xdg-open", url) - if e, ok := err.(*exec.Error); ok && e.Err == exec.ErrNotFound { - return errors.New("xdg-open: command not found - install xdg-utils from ports(8)") - } - return err -} diff --git a/vendor/github.com/pkg/browser/browser_unsupported.go b/vendor/github.com/pkg/browser/browser_unsupported.go deleted file mode 100644 index af26ff9..0000000 --- a/vendor/github.com/pkg/browser/browser_unsupported.go +++ /dev/null @@ -1,13 +0,0 @@ -// +build !linux,!windows,!darwin,!openbsd,!freebsd - -package browser - -import ( - "fmt" - "os/exec" - "runtime" -) - -func openBrowser(url string) error { - return fmt.Errorf("openBrowser: unsupported operating system: %v", runtime.GOOS) -} diff --git a/vendor/github.com/pkg/browser/browser_windows.go b/vendor/github.com/pkg/browser/browser_windows.go deleted file mode 100644 index 63e1929..0000000 --- a/vendor/github.com/pkg/browser/browser_windows.go +++ /dev/null @@ -1,7 +0,0 @@ -package browser - -import "golang.org/x/sys/windows" - -func openBrowser(url string) error { - return windows.ShellExecute(0, nil, windows.StringToUTF16Ptr(url), nil, nil, windows.SW_SHOWNORMAL) -} diff --git a/vendor/github.com/pkg/browser/go.mod b/vendor/github.com/pkg/browser/go.mod deleted file mode 100644 index f769897..0000000 --- a/vendor/github.com/pkg/browser/go.mod +++ /dev/null @@ -1,5 +0,0 @@ -module github.com/pkg/browser - -go 1.14 - -require golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71 diff --git a/vendor/github.com/pkg/browser/go.sum b/vendor/github.com/pkg/browser/go.sum deleted file mode 100644 index b459315..0000000 --- a/vendor/github.com/pkg/browser/go.sum +++ /dev/null @@ -1,2 +0,0 @@ -golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71 h1:X/2sJAybVknnUnV7AD2HdT6rm2p5BP6eH2j+igduWgk= -golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= diff --git a/vendor/github.com/rivo/uniseg/LICENSE.txt b/vendor/github.com/rivo/uniseg/LICENSE.txt new file mode 100644 index 0000000..5040f1e --- /dev/null +++ b/vendor/github.com/rivo/uniseg/LICENSE.txt @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Oliver Kuederle + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/rivo/uniseg/README.md b/vendor/github.com/rivo/uniseg/README.md new file mode 100644 index 0000000..f8da293 --- /dev/null +++ b/vendor/github.com/rivo/uniseg/README.md @@ -0,0 +1,62 @@ +# Unicode Text Segmentation for Go + +[![Godoc Reference](https://img.shields.io/badge/godoc-reference-blue.svg)](https://godoc.org/github.com/rivo/uniseg) +[![Go Report](https://img.shields.io/badge/go%20report-A%2B-brightgreen.svg)](https://goreportcard.com/report/github.com/rivo/uniseg) + +This Go package implements Unicode Text Segmentation according to [Unicode Standard Annex #29](http://unicode.org/reports/tr29/) (Unicode version 12.0.0). + +At this point, only the determination of grapheme cluster boundaries is implemented. + +## Background + +In Go, [strings are read-only slices of bytes](https://blog.golang.org/strings). They can be turned into Unicode code points using the `for` loop or by casting: `[]rune(str)`. However, multiple code points may be combined into one user-perceived character or what the Unicode specification calls "grapheme cluster". Here are some examples: + +|String|Bytes (UTF-8)|Code points (runes)|Grapheme clusters| +|-|-|-|-| +|Käse|6 bytes: `4b 61 cc 88 73 65`|5 code points: `4b 61 308 73 65`|4 clusters: `[4b],[61 308],[73],[65]`| +|🏳️‍🌈|14 bytes: `f0 9f 8f b3 ef b8 8f e2 80 8d f0 9f 8c 88`|4 code points: `1f3f3 fe0f 200d 1f308`|1 cluster: `[1f3f3 fe0f 200d 1f308]`| +|🇩🇪|8 bytes: `f0 9f 87 a9 f0 9f 87 aa`|2 code points: `1f1e9 1f1ea`|1 cluster: `[1f1e9 1f1ea]`| + +This package provides a tool to iterate over these grapheme clusters. This may be used to determine the number of user-perceived characters, to split strings in their intended places, or to extract individual characters which form a unit. + +## Installation + +```bash +go get github.com/rivo/uniseg +``` + +## Basic Example + +```go +package uniseg + +import ( + "fmt" + + "github.com/rivo/uniseg" +) + +func main() { + gr := uniseg.NewGraphemes("👍🏼!") + for gr.Next() { + fmt.Printf("%x ", gr.Runes()) + } + // Output: [1f44d 1f3fc] [21] +} +``` + +## Documentation + +Refer to https://godoc.org/github.com/rivo/uniseg for the package's documentation. + +## Dependencies + +This package does not depend on any packages outside the standard library. + +## Your Feedback + +Add your issue here on GitHub. Feel free to get in touch if you have any questions. + +## Version + +Version tags will be introduced once Golang modules are official. Consider this version 0.1. diff --git a/vendor/github.com/rivo/uniseg/doc.go b/vendor/github.com/rivo/uniseg/doc.go new file mode 100644 index 0000000..60c737d --- /dev/null +++ b/vendor/github.com/rivo/uniseg/doc.go @@ -0,0 +1,8 @@ +/* +Package uniseg implements Unicode Text Segmentation according to Unicode +Standard Annex #29 (http://unicode.org/reports/tr29/). + +At this point, only the determination of grapheme cluster boundaries is +implemented. +*/ +package uniseg diff --git a/vendor/github.com/rivo/uniseg/go.mod b/vendor/github.com/rivo/uniseg/go.mod new file mode 100644 index 0000000..a54280b --- /dev/null +++ b/vendor/github.com/rivo/uniseg/go.mod @@ -0,0 +1,3 @@ +module github.com/rivo/uniseg + +go 1.12 diff --git a/vendor/github.com/rivo/uniseg/grapheme.go b/vendor/github.com/rivo/uniseg/grapheme.go new file mode 100644 index 0000000..207157f --- /dev/null +++ b/vendor/github.com/rivo/uniseg/grapheme.go @@ -0,0 +1,268 @@ +package uniseg + +import "unicode/utf8" + +// The states of the grapheme cluster parser. +const ( + grAny = iota + grCR + grControlLF + grL + grLVV + grLVTT + grPrepend + grExtendedPictographic + grExtendedPictographicZWJ + grRIOdd + grRIEven +) + +// The grapheme cluster parser's breaking instructions. +const ( + grNoBoundary = iota + grBoundary +) + +// The grapheme cluster parser's state transitions. Maps (state, property) to +// (new state, breaking instruction, rule number). The breaking instruction +// always refers to the boundary between the last and next code point. +// +// This map is queried as follows: +// +// 1. Find specific state + specific property. Stop if found. +// 2. Find specific state + any property. +// 3. Find any state + specific property. +// 4. If only (2) or (3) (but not both) was found, stop. +// 5. If both (2) and (3) were found, use state and breaking instruction from +// the transition with the lower rule number, prefer (3) if rule numbers +// are equal. Stop. +// 6. Assume grAny and grBoundary. +var grTransitions = map[[2]int][3]int{ + // GB5 + {grAny, prCR}: {grCR, grBoundary, 50}, + {grAny, prLF}: {grControlLF, grBoundary, 50}, + {grAny, prControl}: {grControlLF, grBoundary, 50}, + + // GB4 + {grCR, prAny}: {grAny, grBoundary, 40}, + {grControlLF, prAny}: {grAny, grBoundary, 40}, + + // GB3. + {grCR, prLF}: {grAny, grNoBoundary, 30}, + + // GB6. + {grAny, prL}: {grL, grBoundary, 9990}, + {grL, prL}: {grL, grNoBoundary, 60}, + {grL, prV}: {grLVV, grNoBoundary, 60}, + {grL, prLV}: {grLVV, grNoBoundary, 60}, + {grL, prLVT}: {grLVTT, grNoBoundary, 60}, + + // GB7. + {grAny, prLV}: {grLVV, grBoundary, 9990}, + {grAny, prV}: {grLVV, grBoundary, 9990}, + {grLVV, prV}: {grLVV, grNoBoundary, 70}, + {grLVV, prT}: {grLVTT, grNoBoundary, 70}, + + // GB8. + {grAny, prLVT}: {grLVTT, grBoundary, 9990}, + {grAny, prT}: {grLVTT, grBoundary, 9990}, + {grLVTT, prT}: {grLVTT, grNoBoundary, 80}, + + // GB9. + {grAny, prExtend}: {grAny, grNoBoundary, 90}, + {grAny, prZWJ}: {grAny, grNoBoundary, 90}, + + // GB9a. + {grAny, prSpacingMark}: {grAny, grNoBoundary, 91}, + + // GB9b. + {grAny, prPreprend}: {grPrepend, grBoundary, 9990}, + {grPrepend, prAny}: {grAny, grNoBoundary, 92}, + + // GB11. + {grAny, prExtendedPictographic}: {grExtendedPictographic, grBoundary, 9990}, + {grExtendedPictographic, prExtend}: {grExtendedPictographic, grNoBoundary, 110}, + {grExtendedPictographic, prZWJ}: {grExtendedPictographicZWJ, grNoBoundary, 110}, + {grExtendedPictographicZWJ, prExtendedPictographic}: {grExtendedPictographic, grNoBoundary, 110}, + + // GB12 / GB13. + {grAny, prRegionalIndicator}: {grRIOdd, grBoundary, 9990}, + {grRIOdd, prRegionalIndicator}: {grRIEven, grNoBoundary, 120}, + {grRIEven, prRegionalIndicator}: {grRIOdd, grBoundary, 120}, +} + +// Graphemes implements an iterator over Unicode extended grapheme clusters, +// specified in the Unicode Standard Annex #29. Grapheme clusters correspond to +// "user-perceived characters". These characters often consist of multiple +// code points (e.g. the "woman kissing woman" emoji consists of 8 code points: +// woman + ZWJ + heavy black heart (2 code points) + ZWJ + kiss mark + ZWJ + +// woman) and the rules described in Annex #29 must be applied to group those +// code points into clusters perceived by the user as one character. +type Graphemes struct { + // The code points over which this class iterates. + codePoints []rune + + // The (byte-based) indices of the code points into the original string plus + // len(original string). Thus, len(indices) = len(codePoints) + 1. + indices []int + + // The current grapheme cluster to be returned. These are indices into + // codePoints/indices. If start == end, we either haven't started iterating + // yet (0) or the iteration has already completed (1). + start, end int + + // The index of the next code point to be parsed. + pos int + + // The current state of the code point parser. + state int +} + +// NewGraphemes returns a new grapheme cluster iterator. +func NewGraphemes(s string) *Graphemes { + l := utf8.RuneCountInString(s) + codePoints := make([]rune, l) + indices := make([]int, l+1) + i := 0 + for pos, r := range s { + codePoints[i] = r + indices[i] = pos + i++ + } + indices[l] = len(s) + g := &Graphemes{ + codePoints: codePoints, + indices: indices, + } + g.Next() // Parse ahead. + return g +} + +// Next advances the iterator by one grapheme cluster and returns false if no +// clusters are left. This function must be called before the first cluster is +// accessed. +func (g *Graphemes) Next() bool { + g.start = g.end + + // The state transition gives us a boundary instruction BEFORE the next code + // point so we always need to stay ahead by one code point. + + // Parse the next code point. + for g.pos <= len(g.codePoints) { + // GB2. + if g.pos == len(g.codePoints) { + g.end = g.pos + g.pos++ + break + } + + // Determine the property of the next character. + nextProperty := property(g.codePoints[g.pos]) + g.pos++ + + // Find the applicable transition. + var boundary bool + transition, ok := grTransitions[[2]int{g.state, nextProperty}] + if ok { + // We have a specific transition. We'll use it. + g.state = transition[0] + boundary = transition[1] == grBoundary + } else { + // No specific transition found. Try the less specific ones. + transAnyProp, okAnyProp := grTransitions[[2]int{g.state, prAny}] + transAnyState, okAnyState := grTransitions[[2]int{grAny, nextProperty}] + if okAnyProp && okAnyState { + // Both apply. We'll use a mix (see comments for grTransitions). + g.state = transAnyState[0] + boundary = transAnyState[1] == grBoundary + if transAnyProp[2] < transAnyState[2] { + g.state = transAnyProp[0] + boundary = transAnyProp[1] == grBoundary + } + } else if okAnyProp { + // We only have a specific state. + g.state = transAnyProp[0] + boundary = transAnyProp[1] == grBoundary + // This branch will probably never be reached because okAnyState will + // always be true given the current transition map. But we keep it here + // for future modifications to the transition map where this may not be + // true anymore. + } else if okAnyState { + // We only have a specific property. + g.state = transAnyState[0] + boundary = transAnyState[1] == grBoundary + } else { + // No known transition. GB999: Any x Any. + g.state = grAny + boundary = true + } + } + + // If we found a cluster boundary, let's stop here. The current cluster will + // be the one that just ended. + if g.pos-1 == 0 /* GB1 */ || boundary { + g.end = g.pos - 1 + break + } + } + + return g.start != g.end +} + +// Runes returns a slice of runes (code points) which corresponds to the current +// grapheme cluster. If the iterator is already past the end or Next() has not +// yet been called, nil is returned. +func (g *Graphemes) Runes() []rune { + if g.start == g.end { + return nil + } + return g.codePoints[g.start:g.end] +} + +// Str returns a substring of the original string which corresponds to the +// current grapheme cluster. If the iterator is already past the end or Next() +// has not yet been called, an empty string is returned. +func (g *Graphemes) Str() string { + if g.start == g.end { + return "" + } + return string(g.codePoints[g.start:g.end]) +} + +// Bytes returns a byte slice which corresponds to the current grapheme cluster. +// If the iterator is already past the end or Next() has not yet been called, +// nil is returned. +func (g *Graphemes) Bytes() []byte { + if g.start == g.end { + return nil + } + return []byte(string(g.codePoints[g.start:g.end])) +} + +// Positions returns the interval of the current grapheme cluster as byte +// positions into the original string. The first returned value "from" indexes +// the first byte and the second returned value "to" indexes the first byte that +// is not included anymore, i.e. str[from:to] is the current grapheme cluster of +// the original string "str". If Next() has not yet been called, both values are +// 0. If the iterator is already past the end, both values are 1. +func (g *Graphemes) Positions() (int, int) { + return g.indices[g.start], g.indices[g.end] +} + +// Reset puts the iterator into its initial state such that the next call to +// Next() sets it to the first grapheme cluster again. +func (g *Graphemes) Reset() { + g.start, g.end, g.pos, g.state = 0, 0, 0, grAny + g.Next() // Parse ahead again. +} + +// GraphemeClusterCount returns the number of user-perceived characters +// (grapheme clusters) for the given string. To calculate this number, it +// iterates through the string using the Graphemes iterator. +func GraphemeClusterCount(s string) (n int) { + g := NewGraphemes(s) + for g.Next() { + n++ + } + return +} diff --git a/vendor/github.com/rivo/uniseg/properties.go b/vendor/github.com/rivo/uniseg/properties.go new file mode 100644 index 0000000..a75ab58 --- /dev/null +++ b/vendor/github.com/rivo/uniseg/properties.go @@ -0,0 +1,1658 @@ +package uniseg + +// The unicode properties. Only the ones needed in the context of this package +// are included. +const ( + prAny = iota + prPreprend + prCR + prLF + prControl + prExtend + prRegionalIndicator + prSpacingMark + prL + prV + prT + prLV + prLVT + prZWJ + prExtendedPictographic +) + +// Maps code point ranges to their properties. In the context of this package, +// any code point that is not contained may map to "prAny". The code point +// ranges in this slice are numerically sorted. +// +// These ranges were taken from +// http://www.unicode.org/Public/UCD/latest/ucd/auxiliary/GraphemeBreakProperty.txt +// as well as +// https://unicode.org/Public/emoji/latest/emoji-data.txt +// ("Extended_Pictographic" only) on March 11, 2019. See +// https://www.unicode.org/license.html for the Unicode license agreement. +var codePoints = [][3]int{ + {0x0000, 0x0009, prControl}, // Cc [10] .. + {0x000A, 0x000A, prLF}, // Cc + {0x000B, 0x000C, prControl}, // Cc [2] .. + {0x000D, 0x000D, prCR}, // Cc + {0x000E, 0x001F, prControl}, // Cc [18] .. + {0x007F, 0x009F, prControl}, // Cc [33] .. + {0x00A9, 0x00A9, prExtendedPictographic}, // 1.1 [1] (©️) copyright + {0x00AD, 0x00AD, prControl}, // Cf SOFT HYPHEN + {0x00AE, 0x00AE, prExtendedPictographic}, // 1.1 [1] (®️) registered + {0x0300, 0x036F, prExtend}, // Mn [112] COMBINING GRAVE ACCENT..COMBINING LATIN SMALL LETTER X + {0x0483, 0x0487, prExtend}, // Mn [5] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC POKRYTIE + {0x0488, 0x0489, prExtend}, // Me [2] COMBINING CYRILLIC HUNDRED THOUSANDS SIGN..COMBINING CYRILLIC MILLIONS SIGN + {0x0591, 0x05BD, prExtend}, // Mn [45] HEBREW ACCENT ETNAHTA..HEBREW POINT METEG + {0x05BF, 0x05BF, prExtend}, // Mn HEBREW POINT RAFE + {0x05C1, 0x05C2, prExtend}, // Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT + {0x05C4, 0x05C5, prExtend}, // Mn [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT + {0x05C7, 0x05C7, prExtend}, // Mn HEBREW POINT QAMATS QATAN + {0x0600, 0x0605, prPreprend}, // Cf [6] ARABIC NUMBER SIGN..ARABIC NUMBER MARK ABOVE + {0x0610, 0x061A, prExtend}, // Mn [11] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL KASRA + {0x061C, 0x061C, prControl}, // Cf ARABIC LETTER MARK + {0x064B, 0x065F, prExtend}, // Mn [21] ARABIC FATHATAN..ARABIC WAVY HAMZA BELOW + {0x0670, 0x0670, prExtend}, // Mn ARABIC LETTER SUPERSCRIPT ALEF + {0x06D6, 0x06DC, prExtend}, // Mn [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN + {0x06DD, 0x06DD, prPreprend}, // Cf ARABIC END OF AYAH + {0x06DF, 0x06E4, prExtend}, // Mn [6] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH MADDA + {0x06E7, 0x06E8, prExtend}, // Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON + {0x06EA, 0x06ED, prExtend}, // Mn [4] ARABIC EMPTY CENTRE LOW STOP..ARABIC SMALL LOW MEEM + {0x070F, 0x070F, prPreprend}, // Cf SYRIAC ABBREVIATION MARK + {0x0711, 0x0711, prExtend}, // Mn SYRIAC LETTER SUPERSCRIPT ALAPH + {0x0730, 0x074A, prExtend}, // Mn [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH + {0x07A6, 0x07B0, prExtend}, // Mn [11] THAANA ABAFILI..THAANA SUKUN + {0x07EB, 0x07F3, prExtend}, // Mn [9] NKO COMBINING SHORT HIGH TONE..NKO COMBINING DOUBLE DOT ABOVE + {0x07FD, 0x07FD, prExtend}, // Mn NKO DANTAYALAN + {0x0816, 0x0819, prExtend}, // Mn [4] SAMARITAN MARK IN..SAMARITAN MARK DAGESH + {0x081B, 0x0823, prExtend}, // Mn [9] SAMARITAN MARK EPENTHETIC YUT..SAMARITAN VOWEL SIGN A + {0x0825, 0x0827, prExtend}, // Mn [3] SAMARITAN VOWEL SIGN SHORT A..SAMARITAN VOWEL SIGN U + {0x0829, 0x082D, prExtend}, // Mn [5] SAMARITAN VOWEL SIGN LONG I..SAMARITAN MARK NEQUDAA + {0x0859, 0x085B, prExtend}, // Mn [3] MANDAIC AFFRICATION MARK..MANDAIC GEMINATION MARK + {0x08D3, 0x08E1, prExtend}, // Mn [15] ARABIC SMALL LOW WAW..ARABIC SMALL HIGH SIGN SAFHA + {0x08E2, 0x08E2, prPreprend}, // Cf ARABIC DISPUTED END OF AYAH + {0x08E3, 0x0902, prExtend}, // Mn [32] ARABIC TURNED DAMMA BELOW..DEVANAGARI SIGN ANUSVARA + {0x0903, 0x0903, prSpacingMark}, // Mc DEVANAGARI SIGN VISARGA + {0x093A, 0x093A, prExtend}, // Mn DEVANAGARI VOWEL SIGN OE + {0x093B, 0x093B, prSpacingMark}, // Mc DEVANAGARI VOWEL SIGN OOE + {0x093C, 0x093C, prExtend}, // Mn DEVANAGARI SIGN NUKTA + {0x093E, 0x0940, prSpacingMark}, // Mc [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II + {0x0941, 0x0948, prExtend}, // Mn [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI + {0x0949, 0x094C, prSpacingMark}, // Mc [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU + {0x094D, 0x094D, prExtend}, // Mn DEVANAGARI SIGN VIRAMA + {0x094E, 0x094F, prSpacingMark}, // Mc [2] DEVANAGARI VOWEL SIGN PRISHTHAMATRA E..DEVANAGARI VOWEL SIGN AW + {0x0951, 0x0957, prExtend}, // Mn [7] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI VOWEL SIGN UUE + {0x0962, 0x0963, prExtend}, // Mn [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL + {0x0981, 0x0981, prExtend}, // Mn BENGALI SIGN CANDRABINDU + {0x0982, 0x0983, prSpacingMark}, // Mc [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA + {0x09BC, 0x09BC, prExtend}, // Mn BENGALI SIGN NUKTA + {0x09BE, 0x09BE, prExtend}, // Mc BENGALI VOWEL SIGN AA + {0x09BF, 0x09C0, prSpacingMark}, // Mc [2] BENGALI VOWEL SIGN I..BENGALI VOWEL SIGN II + {0x09C1, 0x09C4, prExtend}, // Mn [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR + {0x09C7, 0x09C8, prSpacingMark}, // Mc [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI + {0x09CB, 0x09CC, prSpacingMark}, // Mc [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU + {0x09CD, 0x09CD, prExtend}, // Mn BENGALI SIGN VIRAMA + {0x09D7, 0x09D7, prExtend}, // Mc BENGALI AU LENGTH MARK + {0x09E2, 0x09E3, prExtend}, // Mn [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL + {0x09FE, 0x09FE, prExtend}, // Mn BENGALI SANDHI MARK + {0x0A01, 0x0A02, prExtend}, // Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI + {0x0A03, 0x0A03, prSpacingMark}, // Mc GURMUKHI SIGN VISARGA + {0x0A3C, 0x0A3C, prExtend}, // Mn GURMUKHI SIGN NUKTA + {0x0A3E, 0x0A40, prSpacingMark}, // Mc [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II + {0x0A41, 0x0A42, prExtend}, // Mn [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU + {0x0A47, 0x0A48, prExtend}, // Mn [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI + {0x0A4B, 0x0A4D, prExtend}, // Mn [3] GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA + {0x0A51, 0x0A51, prExtend}, // Mn GURMUKHI SIGN UDAAT + {0x0A70, 0x0A71, prExtend}, // Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK + {0x0A75, 0x0A75, prExtend}, // Mn GURMUKHI SIGN YAKASH + {0x0A81, 0x0A82, prExtend}, // Mn [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA + {0x0A83, 0x0A83, prSpacingMark}, // Mc GUJARATI SIGN VISARGA + {0x0ABC, 0x0ABC, prExtend}, // Mn GUJARATI SIGN NUKTA + {0x0ABE, 0x0AC0, prSpacingMark}, // Mc [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II + {0x0AC1, 0x0AC5, prExtend}, // Mn [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E + {0x0AC7, 0x0AC8, prExtend}, // Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI + {0x0AC9, 0x0AC9, prSpacingMark}, // Mc GUJARATI VOWEL SIGN CANDRA O + {0x0ACB, 0x0ACC, prSpacingMark}, // Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU + {0x0ACD, 0x0ACD, prExtend}, // Mn GUJARATI SIGN VIRAMA + {0x0AE2, 0x0AE3, prExtend}, // Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL + {0x0AFA, 0x0AFF, prExtend}, // Mn [6] GUJARATI SIGN SUKUN..GUJARATI SIGN TWO-CIRCLE NUKTA ABOVE + {0x0B01, 0x0B01, prExtend}, // Mn ORIYA SIGN CANDRABINDU + {0x0B02, 0x0B03, prSpacingMark}, // Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA + {0x0B3C, 0x0B3C, prExtend}, // Mn ORIYA SIGN NUKTA + {0x0B3E, 0x0B3E, prExtend}, // Mc ORIYA VOWEL SIGN AA + {0x0B3F, 0x0B3F, prExtend}, // Mn ORIYA VOWEL SIGN I + {0x0B40, 0x0B40, prSpacingMark}, // Mc ORIYA VOWEL SIGN II + {0x0B41, 0x0B44, prExtend}, // Mn [4] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC RR + {0x0B47, 0x0B48, prSpacingMark}, // Mc [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI + {0x0B4B, 0x0B4C, prSpacingMark}, // Mc [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU + {0x0B4D, 0x0B4D, prExtend}, // Mn ORIYA SIGN VIRAMA + {0x0B56, 0x0B56, prExtend}, // Mn ORIYA AI LENGTH MARK + {0x0B57, 0x0B57, prExtend}, // Mc ORIYA AU LENGTH MARK + {0x0B62, 0x0B63, prExtend}, // Mn [2] ORIYA VOWEL SIGN VOCALIC L..ORIYA VOWEL SIGN VOCALIC LL + {0x0B82, 0x0B82, prExtend}, // Mn TAMIL SIGN ANUSVARA + {0x0BBE, 0x0BBE, prExtend}, // Mc TAMIL VOWEL SIGN AA + {0x0BBF, 0x0BBF, prSpacingMark}, // Mc TAMIL VOWEL SIGN I + {0x0BC0, 0x0BC0, prExtend}, // Mn TAMIL VOWEL SIGN II + {0x0BC1, 0x0BC2, prSpacingMark}, // Mc [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU + {0x0BC6, 0x0BC8, prSpacingMark}, // Mc [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI + {0x0BCA, 0x0BCC, prSpacingMark}, // Mc [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU + {0x0BCD, 0x0BCD, prExtend}, // Mn TAMIL SIGN VIRAMA + {0x0BD7, 0x0BD7, prExtend}, // Mc TAMIL AU LENGTH MARK + {0x0C00, 0x0C00, prExtend}, // Mn TELUGU SIGN COMBINING CANDRABINDU ABOVE + {0x0C01, 0x0C03, prSpacingMark}, // Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA + {0x0C04, 0x0C04, prExtend}, // Mn TELUGU SIGN COMBINING ANUSVARA ABOVE + {0x0C3E, 0x0C40, prExtend}, // Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II + {0x0C41, 0x0C44, prSpacingMark}, // Mc [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR + {0x0C46, 0x0C48, prExtend}, // Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI + {0x0C4A, 0x0C4D, prExtend}, // Mn [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA + {0x0C55, 0x0C56, prExtend}, // Mn [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK + {0x0C62, 0x0C63, prExtend}, // Mn [2] TELUGU VOWEL SIGN VOCALIC L..TELUGU VOWEL SIGN VOCALIC LL + {0x0C81, 0x0C81, prExtend}, // Mn KANNADA SIGN CANDRABINDU + {0x0C82, 0x0C83, prSpacingMark}, // Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA + {0x0CBC, 0x0CBC, prExtend}, // Mn KANNADA SIGN NUKTA + {0x0CBE, 0x0CBE, prSpacingMark}, // Mc KANNADA VOWEL SIGN AA + {0x0CBF, 0x0CBF, prExtend}, // Mn KANNADA VOWEL SIGN I + {0x0CC0, 0x0CC1, prSpacingMark}, // Mc [2] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN U + {0x0CC2, 0x0CC2, prExtend}, // Mc KANNADA VOWEL SIGN UU + {0x0CC3, 0x0CC4, prSpacingMark}, // Mc [2] KANNADA VOWEL SIGN VOCALIC R..KANNADA VOWEL SIGN VOCALIC RR + {0x0CC6, 0x0CC6, prExtend}, // Mn KANNADA VOWEL SIGN E + {0x0CC7, 0x0CC8, prSpacingMark}, // Mc [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI + {0x0CCA, 0x0CCB, prSpacingMark}, // Mc [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO + {0x0CCC, 0x0CCD, prExtend}, // Mn [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA + {0x0CD5, 0x0CD6, prExtend}, // Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK + {0x0CE2, 0x0CE3, prExtend}, // Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL + {0x0D00, 0x0D01, prExtend}, // Mn [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU + {0x0D02, 0x0D03, prSpacingMark}, // Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA + {0x0D3B, 0x0D3C, prExtend}, // Mn [2] MALAYALAM SIGN VERTICAL BAR VIRAMA..MALAYALAM SIGN CIRCULAR VIRAMA + {0x0D3E, 0x0D3E, prExtend}, // Mc MALAYALAM VOWEL SIGN AA + {0x0D3F, 0x0D40, prSpacingMark}, // Mc [2] MALAYALAM VOWEL SIGN I..MALAYALAM VOWEL SIGN II + {0x0D41, 0x0D44, prExtend}, // Mn [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR + {0x0D46, 0x0D48, prSpacingMark}, // Mc [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI + {0x0D4A, 0x0D4C, prSpacingMark}, // Mc [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU + {0x0D4D, 0x0D4D, prExtend}, // Mn MALAYALAM SIGN VIRAMA + {0x0D4E, 0x0D4E, prPreprend}, // Lo MALAYALAM LETTER DOT REPH + {0x0D57, 0x0D57, prExtend}, // Mc MALAYALAM AU LENGTH MARK + {0x0D62, 0x0D63, prExtend}, // Mn [2] MALAYALAM VOWEL SIGN VOCALIC L..MALAYALAM VOWEL SIGN VOCALIC LL + {0x0D82, 0x0D83, prSpacingMark}, // Mc [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA + {0x0DCA, 0x0DCA, prExtend}, // Mn SINHALA SIGN AL-LAKUNA + {0x0DCF, 0x0DCF, prExtend}, // Mc SINHALA VOWEL SIGN AELA-PILLA + {0x0DD0, 0x0DD1, prSpacingMark}, // Mc [2] SINHALA VOWEL SIGN KETTI AEDA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA + {0x0DD2, 0x0DD4, prExtend}, // Mn [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA + {0x0DD6, 0x0DD6, prExtend}, // Mn SINHALA VOWEL SIGN DIGA PAA-PILLA + {0x0DD8, 0x0DDE, prSpacingMark}, // Mc [7] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA + {0x0DDF, 0x0DDF, prExtend}, // Mc SINHALA VOWEL SIGN GAYANUKITTA + {0x0DF2, 0x0DF3, prSpacingMark}, // Mc [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA + {0x0E31, 0x0E31, prExtend}, // Mn THAI CHARACTER MAI HAN-AKAT + {0x0E33, 0x0E33, prSpacingMark}, // Lo THAI CHARACTER SARA AM + {0x0E34, 0x0E3A, prExtend}, // Mn [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU + {0x0E47, 0x0E4E, prExtend}, // Mn [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN + {0x0EB1, 0x0EB1, prExtend}, // Mn LAO VOWEL SIGN MAI KAN + {0x0EB3, 0x0EB3, prSpacingMark}, // Lo LAO VOWEL SIGN AM + {0x0EB4, 0x0EBC, prExtend}, // Mn [9] LAO VOWEL SIGN I..LAO SEMIVOWEL SIGN LO + {0x0EC8, 0x0ECD, prExtend}, // Mn [6] LAO TONE MAI EK..LAO NIGGAHITA + {0x0F18, 0x0F19, prExtend}, // Mn [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS + {0x0F35, 0x0F35, prExtend}, // Mn TIBETAN MARK NGAS BZUNG NYI ZLA + {0x0F37, 0x0F37, prExtend}, // Mn TIBETAN MARK NGAS BZUNG SGOR RTAGS + {0x0F39, 0x0F39, prExtend}, // Mn TIBETAN MARK TSA -PHRU + {0x0F3E, 0x0F3F, prSpacingMark}, // Mc [2] TIBETAN SIGN YAR TSHES..TIBETAN SIGN MAR TSHES + {0x0F71, 0x0F7E, prExtend}, // Mn [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO + {0x0F7F, 0x0F7F, prSpacingMark}, // Mc TIBETAN SIGN RNAM BCAD + {0x0F80, 0x0F84, prExtend}, // Mn [5] TIBETAN VOWEL SIGN REVERSED I..TIBETAN MARK HALANTA + {0x0F86, 0x0F87, prExtend}, // Mn [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS + {0x0F8D, 0x0F97, prExtend}, // Mn [11] TIBETAN SUBJOINED SIGN LCE TSA CAN..TIBETAN SUBJOINED LETTER JA + {0x0F99, 0x0FBC, prExtend}, // Mn [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA + {0x0FC6, 0x0FC6, prExtend}, // Mn TIBETAN SYMBOL PADMA GDAN + {0x102D, 0x1030, prExtend}, // Mn [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU + {0x1031, 0x1031, prSpacingMark}, // Mc MYANMAR VOWEL SIGN E + {0x1032, 0x1037, prExtend}, // Mn [6] MYANMAR VOWEL SIGN AI..MYANMAR SIGN DOT BELOW + {0x1039, 0x103A, prExtend}, // Mn [2] MYANMAR SIGN VIRAMA..MYANMAR SIGN ASAT + {0x103B, 0x103C, prSpacingMark}, // Mc [2] MYANMAR CONSONANT SIGN MEDIAL YA..MYANMAR CONSONANT SIGN MEDIAL RA + {0x103D, 0x103E, prExtend}, // Mn [2] MYANMAR CONSONANT SIGN MEDIAL WA..MYANMAR CONSONANT SIGN MEDIAL HA + {0x1056, 0x1057, prSpacingMark}, // Mc [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR + {0x1058, 0x1059, prExtend}, // Mn [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL + {0x105E, 0x1060, prExtend}, // Mn [3] MYANMAR CONSONANT SIGN MON MEDIAL NA..MYANMAR CONSONANT SIGN MON MEDIAL LA + {0x1071, 0x1074, prExtend}, // Mn [4] MYANMAR VOWEL SIGN GEBA KAREN I..MYANMAR VOWEL SIGN KAYAH EE + {0x1082, 0x1082, prExtend}, // Mn MYANMAR CONSONANT SIGN SHAN MEDIAL WA + {0x1084, 0x1084, prSpacingMark}, // Mc MYANMAR VOWEL SIGN SHAN E + {0x1085, 0x1086, prExtend}, // Mn [2] MYANMAR VOWEL SIGN SHAN E ABOVE..MYANMAR VOWEL SIGN SHAN FINAL Y + {0x108D, 0x108D, prExtend}, // Mn MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE + {0x109D, 0x109D, prExtend}, // Mn MYANMAR VOWEL SIGN AITON AI + {0x1100, 0x115F, prL}, // Lo [96] HANGUL CHOSEONG KIYEOK..HANGUL CHOSEONG FILLER + {0x1160, 0x11A7, prV}, // Lo [72] HANGUL JUNGSEONG FILLER..HANGUL JUNGSEONG O-YAE + {0x11A8, 0x11FF, prT}, // Lo [88] HANGUL JONGSEONG KIYEOK..HANGUL JONGSEONG SSANGNIEUN + {0x135D, 0x135F, prExtend}, // Mn [3] ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK..ETHIOPIC COMBINING GEMINATION MARK + {0x1712, 0x1714, prExtend}, // Mn [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA + {0x1732, 0x1734, prExtend}, // Mn [3] HANUNOO VOWEL SIGN I..HANUNOO SIGN PAMUDPOD + {0x1752, 0x1753, prExtend}, // Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U + {0x1772, 0x1773, prExtend}, // Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U + {0x17B4, 0x17B5, prExtend}, // Mn [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA + {0x17B6, 0x17B6, prSpacingMark}, // Mc KHMER VOWEL SIGN AA + {0x17B7, 0x17BD, prExtend}, // Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA + {0x17BE, 0x17C5, prSpacingMark}, // Mc [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU + {0x17C6, 0x17C6, prExtend}, // Mn KHMER SIGN NIKAHIT + {0x17C7, 0x17C8, prSpacingMark}, // Mc [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU + {0x17C9, 0x17D3, prExtend}, // Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT + {0x17DD, 0x17DD, prExtend}, // Mn KHMER SIGN ATTHACAN + {0x180B, 0x180D, prExtend}, // Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE + {0x180E, 0x180E, prControl}, // Cf MONGOLIAN VOWEL SEPARATOR + {0x1885, 0x1886, prExtend}, // Mn [2] MONGOLIAN LETTER ALI GALI BALUDA..MONGOLIAN LETTER ALI GALI THREE BALUDA + {0x18A9, 0x18A9, prExtend}, // Mn MONGOLIAN LETTER ALI GALI DAGALGA + {0x1920, 0x1922, prExtend}, // Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U + {0x1923, 0x1926, prSpacingMark}, // Mc [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU + {0x1927, 0x1928, prExtend}, // Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O + {0x1929, 0x192B, prSpacingMark}, // Mc [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA + {0x1930, 0x1931, prSpacingMark}, // Mc [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA + {0x1932, 0x1932, prExtend}, // Mn LIMBU SMALL LETTER ANUSVARA + {0x1933, 0x1938, prSpacingMark}, // Mc [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA + {0x1939, 0x193B, prExtend}, // Mn [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I + {0x1A17, 0x1A18, prExtend}, // Mn [2] BUGINESE VOWEL SIGN I..BUGINESE VOWEL SIGN U + {0x1A19, 0x1A1A, prSpacingMark}, // Mc [2] BUGINESE VOWEL SIGN E..BUGINESE VOWEL SIGN O + {0x1A1B, 0x1A1B, prExtend}, // Mn BUGINESE VOWEL SIGN AE + {0x1A55, 0x1A55, prSpacingMark}, // Mc TAI THAM CONSONANT SIGN MEDIAL RA + {0x1A56, 0x1A56, prExtend}, // Mn TAI THAM CONSONANT SIGN MEDIAL LA + {0x1A57, 0x1A57, prSpacingMark}, // Mc TAI THAM CONSONANT SIGN LA TANG LAI + {0x1A58, 0x1A5E, prExtend}, // Mn [7] TAI THAM SIGN MAI KANG LAI..TAI THAM CONSONANT SIGN SA + {0x1A60, 0x1A60, prExtend}, // Mn TAI THAM SIGN SAKOT + {0x1A62, 0x1A62, prExtend}, // Mn TAI THAM VOWEL SIGN MAI SAT + {0x1A65, 0x1A6C, prExtend}, // Mn [8] TAI THAM VOWEL SIGN I..TAI THAM VOWEL SIGN OA BELOW + {0x1A6D, 0x1A72, prSpacingMark}, // Mc [6] TAI THAM VOWEL SIGN OY..TAI THAM VOWEL SIGN THAM AI + {0x1A73, 0x1A7C, prExtend}, // Mn [10] TAI THAM VOWEL SIGN OA ABOVE..TAI THAM SIGN KHUEN-LUE KARAN + {0x1A7F, 0x1A7F, prExtend}, // Mn TAI THAM COMBINING CRYPTOGRAMMIC DOT + {0x1AB0, 0x1ABD, prExtend}, // Mn [14] COMBINING DOUBLED CIRCUMFLEX ACCENT..COMBINING PARENTHESES BELOW + {0x1ABE, 0x1ABE, prExtend}, // Me COMBINING PARENTHESES OVERLAY + {0x1B00, 0x1B03, prExtend}, // Mn [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG + {0x1B04, 0x1B04, prSpacingMark}, // Mc BALINESE SIGN BISAH + {0x1B34, 0x1B34, prExtend}, // Mn BALINESE SIGN REREKAN + {0x1B35, 0x1B35, prExtend}, // Mc BALINESE VOWEL SIGN TEDUNG + {0x1B36, 0x1B3A, prExtend}, // Mn [5] BALINESE VOWEL SIGN ULU..BALINESE VOWEL SIGN RA REPA + {0x1B3B, 0x1B3B, prSpacingMark}, // Mc BALINESE VOWEL SIGN RA REPA TEDUNG + {0x1B3C, 0x1B3C, prExtend}, // Mn BALINESE VOWEL SIGN LA LENGA + {0x1B3D, 0x1B41, prSpacingMark}, // Mc [5] BALINESE VOWEL SIGN LA LENGA TEDUNG..BALINESE VOWEL SIGN TALING REPA TEDUNG + {0x1B42, 0x1B42, prExtend}, // Mn BALINESE VOWEL SIGN PEPET + {0x1B43, 0x1B44, prSpacingMark}, // Mc [2] BALINESE VOWEL SIGN PEPET TEDUNG..BALINESE ADEG ADEG + {0x1B6B, 0x1B73, prExtend}, // Mn [9] BALINESE MUSICAL SYMBOL COMBINING TEGEH..BALINESE MUSICAL SYMBOL COMBINING GONG + {0x1B80, 0x1B81, prExtend}, // Mn [2] SUNDANESE SIGN PANYECEK..SUNDANESE SIGN PANGLAYAR + {0x1B82, 0x1B82, prSpacingMark}, // Mc SUNDANESE SIGN PANGWISAD + {0x1BA1, 0x1BA1, prSpacingMark}, // Mc SUNDANESE CONSONANT SIGN PAMINGKAL + {0x1BA2, 0x1BA5, prExtend}, // Mn [4] SUNDANESE CONSONANT SIGN PANYAKRA..SUNDANESE VOWEL SIGN PANYUKU + {0x1BA6, 0x1BA7, prSpacingMark}, // Mc [2] SUNDANESE VOWEL SIGN PANAELAENG..SUNDANESE VOWEL SIGN PANOLONG + {0x1BA8, 0x1BA9, prExtend}, // Mn [2] SUNDANESE VOWEL SIGN PAMEPET..SUNDANESE VOWEL SIGN PANEULEUNG + {0x1BAA, 0x1BAA, prSpacingMark}, // Mc SUNDANESE SIGN PAMAAEH + {0x1BAB, 0x1BAD, prExtend}, // Mn [3] SUNDANESE SIGN VIRAMA..SUNDANESE CONSONANT SIGN PASANGAN WA + {0x1BE6, 0x1BE6, prExtend}, // Mn BATAK SIGN TOMPI + {0x1BE7, 0x1BE7, prSpacingMark}, // Mc BATAK VOWEL SIGN E + {0x1BE8, 0x1BE9, prExtend}, // Mn [2] BATAK VOWEL SIGN PAKPAK E..BATAK VOWEL SIGN EE + {0x1BEA, 0x1BEC, prSpacingMark}, // Mc [3] BATAK VOWEL SIGN I..BATAK VOWEL SIGN O + {0x1BED, 0x1BED, prExtend}, // Mn BATAK VOWEL SIGN KARO O + {0x1BEE, 0x1BEE, prSpacingMark}, // Mc BATAK VOWEL SIGN U + {0x1BEF, 0x1BF1, prExtend}, // Mn [3] BATAK VOWEL SIGN U FOR SIMALUNGUN SA..BATAK CONSONANT SIGN H + {0x1BF2, 0x1BF3, prSpacingMark}, // Mc [2] BATAK PANGOLAT..BATAK PANONGONAN + {0x1C24, 0x1C2B, prSpacingMark}, // Mc [8] LEPCHA SUBJOINED LETTER YA..LEPCHA VOWEL SIGN UU + {0x1C2C, 0x1C33, prExtend}, // Mn [8] LEPCHA VOWEL SIGN E..LEPCHA CONSONANT SIGN T + {0x1C34, 0x1C35, prSpacingMark}, // Mc [2] LEPCHA CONSONANT SIGN NYIN-DO..LEPCHA CONSONANT SIGN KANG + {0x1C36, 0x1C37, prExtend}, // Mn [2] LEPCHA SIGN RAN..LEPCHA SIGN NUKTA + {0x1CD0, 0x1CD2, prExtend}, // Mn [3] VEDIC TONE KARSHANA..VEDIC TONE PRENKHA + {0x1CD4, 0x1CE0, prExtend}, // Mn [13] VEDIC SIGN YAJURVEDIC MIDLINE SVARITA..VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA + {0x1CE1, 0x1CE1, prSpacingMark}, // Mc VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA + {0x1CE2, 0x1CE8, prExtend}, // Mn [7] VEDIC SIGN VISARGA SVARITA..VEDIC SIGN VISARGA ANUDATTA WITH TAIL + {0x1CED, 0x1CED, prExtend}, // Mn VEDIC SIGN TIRYAK + {0x1CF4, 0x1CF4, prExtend}, // Mn VEDIC TONE CANDRA ABOVE + {0x1CF7, 0x1CF7, prSpacingMark}, // Mc VEDIC SIGN ATIKRAMA + {0x1CF8, 0x1CF9, prExtend}, // Mn [2] VEDIC TONE RING ABOVE..VEDIC TONE DOUBLE RING ABOVE + {0x1DC0, 0x1DF9, prExtend}, // Mn [58] COMBINING DOTTED GRAVE ACCENT..COMBINING WIDE INVERTED BRIDGE BELOW + {0x1DFB, 0x1DFF, prExtend}, // Mn [5] COMBINING DELETION MARK..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW + {0x200B, 0x200B, prControl}, // Cf ZERO WIDTH SPACE + {0x200C, 0x200C, prExtend}, // Cf ZERO WIDTH NON-JOINER + {0x200D, 0x200D, prZWJ}, // Cf ZERO WIDTH JOINER + {0x200E, 0x200F, prControl}, // Cf [2] LEFT-TO-RIGHT MARK..RIGHT-TO-LEFT MARK + {0x2028, 0x2028, prControl}, // Zl LINE SEPARATOR + {0x2029, 0x2029, prControl}, // Zp PARAGRAPH SEPARATOR + {0x202A, 0x202E, prControl}, // Cf [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE + {0x203C, 0x203C, prExtendedPictographic}, // 1.1 [1] (‼️) double exclamation mark + {0x2049, 0x2049, prExtendedPictographic}, // 3.0 [1] (⁉️) exclamation question mark + {0x2060, 0x2064, prControl}, // Cf [5] WORD JOINER..INVISIBLE PLUS + {0x2065, 0x2065, prControl}, // Cn + {0x2066, 0x206F, prControl}, // Cf [10] LEFT-TO-RIGHT ISOLATE..NOMINAL DIGIT SHAPES + {0x20D0, 0x20DC, prExtend}, // Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE + {0x20DD, 0x20E0, prExtend}, // Me [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE BACKSLASH + {0x20E1, 0x20E1, prExtend}, // Mn COMBINING LEFT RIGHT ARROW ABOVE + {0x20E2, 0x20E4, prExtend}, // Me [3] COMBINING ENCLOSING SCREEN..COMBINING ENCLOSING UPWARD POINTING TRIANGLE + {0x20E5, 0x20F0, prExtend}, // Mn [12] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING ASTERISK ABOVE + {0x2122, 0x2122, prExtendedPictographic}, // 1.1 [1] (™️) trade mark + {0x2139, 0x2139, prExtendedPictographic}, // 3.0 [1] (ℹ️) information + {0x2194, 0x2199, prExtendedPictographic}, // 1.1 [6] (↔️..↙️) left-right arrow..down-left arrow + {0x21A9, 0x21AA, prExtendedPictographic}, // 1.1 [2] (↩️..↪️) right arrow curving left..left arrow curving right + {0x231A, 0x231B, prExtendedPictographic}, // 1.1 [2] (⌚..⌛) watch..hourglass done + {0x2328, 0x2328, prExtendedPictographic}, // 1.1 [1] (⌨️) keyboard + {0x2388, 0x2388, prExtendedPictographic}, // 3.0 [1] (⎈) HELM SYMBOL + {0x23CF, 0x23CF, prExtendedPictographic}, // 4.0 [1] (⏏️) eject button + {0x23E9, 0x23F3, prExtendedPictographic}, // 6.0 [11] (⏩..⏳) fast-forward button..hourglass not done + {0x23F8, 0x23FA, prExtendedPictographic}, // 7.0 [3] (⏸️..⏺️) pause button..record button + {0x24C2, 0x24C2, prExtendedPictographic}, // 1.1 [1] (Ⓜ️) circled M + {0x25AA, 0x25AB, prExtendedPictographic}, // 1.1 [2] (▪️..▫️) black small square..white small square + {0x25B6, 0x25B6, prExtendedPictographic}, // 1.1 [1] (▶️) play button + {0x25C0, 0x25C0, prExtendedPictographic}, // 1.1 [1] (◀️) reverse button + {0x25FB, 0x25FE, prExtendedPictographic}, // 3.2 [4] (◻️..◾) white medium square..black medium-small square + {0x2600, 0x2605, prExtendedPictographic}, // 1.1 [6] (☀️..★) sun..BLACK STAR + {0x2607, 0x2612, prExtendedPictographic}, // 1.1 [12] (☇..☒) LIGHTNING..BALLOT BOX WITH X + {0x2614, 0x2615, prExtendedPictographic}, // 4.0 [2] (☔..☕) umbrella with rain drops..hot beverage + {0x2616, 0x2617, prExtendedPictographic}, // 3.2 [2] (☖..☗) WHITE SHOGI PIECE..BLACK SHOGI PIECE + {0x2618, 0x2618, prExtendedPictographic}, // 4.1 [1] (☘️) shamrock + {0x2619, 0x2619, prExtendedPictographic}, // 3.0 [1] (☙) REVERSED ROTATED FLORAL HEART BULLET + {0x261A, 0x266F, prExtendedPictographic}, // 1.1 [86] (☚..♯) BLACK LEFT POINTING INDEX..MUSIC SHARP SIGN + {0x2670, 0x2671, prExtendedPictographic}, // 3.0 [2] (♰..♱) WEST SYRIAC CROSS..EAST SYRIAC CROSS + {0x2672, 0x267D, prExtendedPictographic}, // 3.2 [12] (♲..♽) UNIVERSAL RECYCLING SYMBOL..PARTIALLY-RECYCLED PAPER SYMBOL + {0x267E, 0x267F, prExtendedPictographic}, // 4.1 [2] (♾️..♿) infinity..wheelchair symbol + {0x2680, 0x2685, prExtendedPictographic}, // 3.2 [6] (⚀..⚅) DIE FACE-1..DIE FACE-6 + {0x2690, 0x2691, prExtendedPictographic}, // 4.0 [2] (⚐..⚑) WHITE FLAG..BLACK FLAG + {0x2692, 0x269C, prExtendedPictographic}, // 4.1 [11] (⚒️..⚜️) hammer and pick..fleur-de-lis + {0x269D, 0x269D, prExtendedPictographic}, // 5.1 [1] (⚝) OUTLINED WHITE STAR + {0x269E, 0x269F, prExtendedPictographic}, // 5.2 [2] (⚞..⚟) THREE LINES CONVERGING RIGHT..THREE LINES CONVERGING LEFT + {0x26A0, 0x26A1, prExtendedPictographic}, // 4.0 [2] (⚠️..⚡) warning..high voltage + {0x26A2, 0x26B1, prExtendedPictographic}, // 4.1 [16] (⚢..⚱️) DOUBLED FEMALE SIGN..funeral urn + {0x26B2, 0x26B2, prExtendedPictographic}, // 5.0 [1] (⚲) NEUTER + {0x26B3, 0x26BC, prExtendedPictographic}, // 5.1 [10] (⚳..⚼) CERES..SESQUIQUADRATE + {0x26BD, 0x26BF, prExtendedPictographic}, // 5.2 [3] (⚽..⚿) soccer ball..SQUARED KEY + {0x26C0, 0x26C3, prExtendedPictographic}, // 5.1 [4] (⛀..⛃) WHITE DRAUGHTS MAN..BLACK DRAUGHTS KING + {0x26C4, 0x26CD, prExtendedPictographic}, // 5.2 [10] (⛄..⛍) snowman without snow..DISABLED CAR + {0x26CE, 0x26CE, prExtendedPictographic}, // 6.0 [1] (⛎) Ophiuchus + {0x26CF, 0x26E1, prExtendedPictographic}, // 5.2 [19] (⛏️..⛡) pick..RESTRICTED LEFT ENTRY-2 + {0x26E2, 0x26E2, prExtendedPictographic}, // 6.0 [1] (⛢) ASTRONOMICAL SYMBOL FOR URANUS + {0x26E3, 0x26E3, prExtendedPictographic}, // 5.2 [1] (⛣) HEAVY CIRCLE WITH STROKE AND TWO DOTS ABOVE + {0x26E4, 0x26E7, prExtendedPictographic}, // 6.0 [4] (⛤..⛧) PENTAGRAM..INVERTED PENTAGRAM + {0x26E8, 0x26FF, prExtendedPictographic}, // 5.2 [24] (⛨..⛿) BLACK CROSS ON SHIELD..WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE + {0x2700, 0x2700, prExtendedPictographic}, // 7.0 [1] (✀) BLACK SAFETY SCISSORS + {0x2701, 0x2704, prExtendedPictographic}, // 1.1 [4] (✁..✄) UPPER BLADE SCISSORS..WHITE SCISSORS + {0x2705, 0x2705, prExtendedPictographic}, // 6.0 [1] (✅) check mark button + {0x2708, 0x2709, prExtendedPictographic}, // 1.1 [2] (✈️..✉️) airplane..envelope + {0x270A, 0x270B, prExtendedPictographic}, // 6.0 [2] (✊..✋) raised fist..raised hand + {0x270C, 0x2712, prExtendedPictographic}, // 1.1 [7] (✌️..✒️) victory hand..black nib + {0x2714, 0x2714, prExtendedPictographic}, // 1.1 [1] (✔️) check mark + {0x2716, 0x2716, prExtendedPictographic}, // 1.1 [1] (✖️) multiplication sign + {0x271D, 0x271D, prExtendedPictographic}, // 1.1 [1] (✝️) latin cross + {0x2721, 0x2721, prExtendedPictographic}, // 1.1 [1] (✡️) star of David + {0x2728, 0x2728, prExtendedPictographic}, // 6.0 [1] (✨) sparkles + {0x2733, 0x2734, prExtendedPictographic}, // 1.1 [2] (✳️..✴️) eight-spoked asterisk..eight-pointed star + {0x2744, 0x2744, prExtendedPictographic}, // 1.1 [1] (❄️) snowflake + {0x2747, 0x2747, prExtendedPictographic}, // 1.1 [1] (❇️) sparkle + {0x274C, 0x274C, prExtendedPictographic}, // 6.0 [1] (❌) cross mark + {0x274E, 0x274E, prExtendedPictographic}, // 6.0 [1] (❎) cross mark button + {0x2753, 0x2755, prExtendedPictographic}, // 6.0 [3] (❓..❕) question mark..white exclamation mark + {0x2757, 0x2757, prExtendedPictographic}, // 5.2 [1] (❗) exclamation mark + {0x2763, 0x2767, prExtendedPictographic}, // 1.1 [5] (❣️..❧) heart exclamation..ROTATED FLORAL HEART BULLET + {0x2795, 0x2797, prExtendedPictographic}, // 6.0 [3] (➕..➗) plus sign..division sign + {0x27A1, 0x27A1, prExtendedPictographic}, // 1.1 [1] (➡️) right arrow + {0x27B0, 0x27B0, prExtendedPictographic}, // 6.0 [1] (➰) curly loop + {0x27BF, 0x27BF, prExtendedPictographic}, // 6.0 [1] (➿) double curly loop + {0x2934, 0x2935, prExtendedPictographic}, // 3.2 [2] (⤴️..⤵️) right arrow curving up..right arrow curving down + {0x2B05, 0x2B07, prExtendedPictographic}, // 4.0 [3] (⬅️..⬇️) left arrow..down arrow + {0x2B1B, 0x2B1C, prExtendedPictographic}, // 5.1 [2] (⬛..⬜) black large square..white large square + {0x2B50, 0x2B50, prExtendedPictographic}, // 5.1 [1] (⭐) star + {0x2B55, 0x2B55, prExtendedPictographic}, // 5.2 [1] (⭕) hollow red circle + {0x2CEF, 0x2CF1, prExtend}, // Mn [3] COPTIC COMBINING NI ABOVE..COPTIC COMBINING SPIRITUS LENIS + {0x2D7F, 0x2D7F, prExtend}, // Mn TIFINAGH CONSONANT JOINER + {0x2DE0, 0x2DFF, prExtend}, // Mn [32] COMBINING CYRILLIC LETTER BE..COMBINING CYRILLIC LETTER IOTIFIED BIG YUS + {0x302A, 0x302D, prExtend}, // Mn [4] IDEOGRAPHIC LEVEL TONE MARK..IDEOGRAPHIC ENTERING TONE MARK + {0x302E, 0x302F, prExtend}, // Mc [2] HANGUL SINGLE DOT TONE MARK..HANGUL DOUBLE DOT TONE MARK + {0x3030, 0x3030, prExtendedPictographic}, // 1.1 [1] (〰️) wavy dash + {0x303D, 0x303D, prExtendedPictographic}, // 3.2 [1] (〽️) part alternation mark + {0x3099, 0x309A, prExtend}, // Mn [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK + {0x3297, 0x3297, prExtendedPictographic}, // 1.1 [1] (㊗️) Japanese “congratulations” button + {0x3299, 0x3299, prExtendedPictographic}, // 1.1 [1] (㊙️) Japanese “secret” button + {0xA66F, 0xA66F, prExtend}, // Mn COMBINING CYRILLIC VZMET + {0xA670, 0xA672, prExtend}, // Me [3] COMBINING CYRILLIC TEN MILLIONS SIGN..COMBINING CYRILLIC THOUSAND MILLIONS SIGN + {0xA674, 0xA67D, prExtend}, // Mn [10] COMBINING CYRILLIC LETTER UKRAINIAN IE..COMBINING CYRILLIC PAYEROK + {0xA69E, 0xA69F, prExtend}, // Mn [2] COMBINING CYRILLIC LETTER EF..COMBINING CYRILLIC LETTER IOTIFIED E + {0xA6F0, 0xA6F1, prExtend}, // Mn [2] BAMUM COMBINING MARK KOQNDON..BAMUM COMBINING MARK TUKWENTIS + {0xA802, 0xA802, prExtend}, // Mn SYLOTI NAGRI SIGN DVISVARA + {0xA806, 0xA806, prExtend}, // Mn SYLOTI NAGRI SIGN HASANTA + {0xA80B, 0xA80B, prExtend}, // Mn SYLOTI NAGRI SIGN ANUSVARA + {0xA823, 0xA824, prSpacingMark}, // Mc [2] SYLOTI NAGRI VOWEL SIGN A..SYLOTI NAGRI VOWEL SIGN I + {0xA825, 0xA826, prExtend}, // Mn [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL SIGN E + {0xA827, 0xA827, prSpacingMark}, // Mc SYLOTI NAGRI VOWEL SIGN OO + {0xA880, 0xA881, prSpacingMark}, // Mc [2] SAURASHTRA SIGN ANUSVARA..SAURASHTRA SIGN VISARGA + {0xA8B4, 0xA8C3, prSpacingMark}, // Mc [16] SAURASHTRA CONSONANT SIGN HAARU..SAURASHTRA VOWEL SIGN AU + {0xA8C4, 0xA8C5, prExtend}, // Mn [2] SAURASHTRA SIGN VIRAMA..SAURASHTRA SIGN CANDRABINDU + {0xA8E0, 0xA8F1, prExtend}, // Mn [18] COMBINING DEVANAGARI DIGIT ZERO..COMBINING DEVANAGARI SIGN AVAGRAHA + {0xA8FF, 0xA8FF, prExtend}, // Mn DEVANAGARI VOWEL SIGN AY + {0xA926, 0xA92D, prExtend}, // Mn [8] KAYAH LI VOWEL UE..KAYAH LI TONE CALYA PLOPHU + {0xA947, 0xA951, prExtend}, // Mn [11] REJANG VOWEL SIGN I..REJANG CONSONANT SIGN R + {0xA952, 0xA953, prSpacingMark}, // Mc [2] REJANG CONSONANT SIGN H..REJANG VIRAMA + {0xA960, 0xA97C, prL}, // Lo [29] HANGUL CHOSEONG TIKEUT-MIEUM..HANGUL CHOSEONG SSANGYEORINHIEUH + {0xA980, 0xA982, prExtend}, // Mn [3] JAVANESE SIGN PANYANGGA..JAVANESE SIGN LAYAR + {0xA983, 0xA983, prSpacingMark}, // Mc JAVANESE SIGN WIGNYAN + {0xA9B3, 0xA9B3, prExtend}, // Mn JAVANESE SIGN CECAK TELU + {0xA9B4, 0xA9B5, prSpacingMark}, // Mc [2] JAVANESE VOWEL SIGN TARUNG..JAVANESE VOWEL SIGN TOLONG + {0xA9B6, 0xA9B9, prExtend}, // Mn [4] JAVANESE VOWEL SIGN WULU..JAVANESE VOWEL SIGN SUKU MENDUT + {0xA9BA, 0xA9BB, prSpacingMark}, // Mc [2] JAVANESE VOWEL SIGN TALING..JAVANESE VOWEL SIGN DIRGA MURE + {0xA9BC, 0xA9BD, prExtend}, // Mn [2] JAVANESE VOWEL SIGN PEPET..JAVANESE CONSONANT SIGN KERET + {0xA9BE, 0xA9C0, prSpacingMark}, // Mc [3] JAVANESE CONSONANT SIGN PENGKAL..JAVANESE PANGKON + {0xA9E5, 0xA9E5, prExtend}, // Mn MYANMAR SIGN SHAN SAW + {0xAA29, 0xAA2E, prExtend}, // Mn [6] CHAM VOWEL SIGN AA..CHAM VOWEL SIGN OE + {0xAA2F, 0xAA30, prSpacingMark}, // Mc [2] CHAM VOWEL SIGN O..CHAM VOWEL SIGN AI + {0xAA31, 0xAA32, prExtend}, // Mn [2] CHAM VOWEL SIGN AU..CHAM VOWEL SIGN UE + {0xAA33, 0xAA34, prSpacingMark}, // Mc [2] CHAM CONSONANT SIGN YA..CHAM CONSONANT SIGN RA + {0xAA35, 0xAA36, prExtend}, // Mn [2] CHAM CONSONANT SIGN LA..CHAM CONSONANT SIGN WA + {0xAA43, 0xAA43, prExtend}, // Mn CHAM CONSONANT SIGN FINAL NG + {0xAA4C, 0xAA4C, prExtend}, // Mn CHAM CONSONANT SIGN FINAL M + {0xAA4D, 0xAA4D, prSpacingMark}, // Mc CHAM CONSONANT SIGN FINAL H + {0xAA7C, 0xAA7C, prExtend}, // Mn MYANMAR SIGN TAI LAING TONE-2 + {0xAAB0, 0xAAB0, prExtend}, // Mn TAI VIET MAI KANG + {0xAAB2, 0xAAB4, prExtend}, // Mn [3] TAI VIET VOWEL I..TAI VIET VOWEL U + {0xAAB7, 0xAAB8, prExtend}, // Mn [2] TAI VIET MAI KHIT..TAI VIET VOWEL IA + {0xAABE, 0xAABF, prExtend}, // Mn [2] TAI VIET VOWEL AM..TAI VIET TONE MAI EK + {0xAAC1, 0xAAC1, prExtend}, // Mn TAI VIET TONE MAI THO + {0xAAEB, 0xAAEB, prSpacingMark}, // Mc MEETEI MAYEK VOWEL SIGN II + {0xAAEC, 0xAAED, prExtend}, // Mn [2] MEETEI MAYEK VOWEL SIGN UU..MEETEI MAYEK VOWEL SIGN AAI + {0xAAEE, 0xAAEF, prSpacingMark}, // Mc [2] MEETEI MAYEK VOWEL SIGN AU..MEETEI MAYEK VOWEL SIGN AAU + {0xAAF5, 0xAAF5, prSpacingMark}, // Mc MEETEI MAYEK VOWEL SIGN VISARGA + {0xAAF6, 0xAAF6, prExtend}, // Mn MEETEI MAYEK VIRAMA + {0xABE3, 0xABE4, prSpacingMark}, // Mc [2] MEETEI MAYEK VOWEL SIGN ONAP..MEETEI MAYEK VOWEL SIGN INAP + {0xABE5, 0xABE5, prExtend}, // Mn MEETEI MAYEK VOWEL SIGN ANAP + {0xABE6, 0xABE7, prSpacingMark}, // Mc [2] MEETEI MAYEK VOWEL SIGN YENAP..MEETEI MAYEK VOWEL SIGN SOUNAP + {0xABE8, 0xABE8, prExtend}, // Mn MEETEI MAYEK VOWEL SIGN UNAP + {0xABE9, 0xABEA, prSpacingMark}, // Mc [2] MEETEI MAYEK VOWEL SIGN CHEINAP..MEETEI MAYEK VOWEL SIGN NUNG + {0xABEC, 0xABEC, prSpacingMark}, // Mc MEETEI MAYEK LUM IYEK + {0xABED, 0xABED, prExtend}, // Mn MEETEI MAYEK APUN IYEK + {0xAC00, 0xAC00, prLV}, // Lo HANGUL SYLLABLE GA + {0xAC01, 0xAC1B, prLVT}, // Lo [27] HANGUL SYLLABLE GAG..HANGUL SYLLABLE GAH + {0xAC1C, 0xAC1C, prLV}, // Lo HANGUL SYLLABLE GAE + {0xAC1D, 0xAC37, prLVT}, // Lo [27] HANGUL SYLLABLE GAEG..HANGUL SYLLABLE GAEH + {0xAC38, 0xAC38, prLV}, // Lo HANGUL SYLLABLE GYA + {0xAC39, 0xAC53, prLVT}, // Lo [27] HANGUL SYLLABLE GYAG..HANGUL SYLLABLE GYAH + {0xAC54, 0xAC54, prLV}, // Lo HANGUL SYLLABLE GYAE + {0xAC55, 0xAC6F, prLVT}, // Lo [27] HANGUL SYLLABLE GYAEG..HANGUL SYLLABLE GYAEH + {0xAC70, 0xAC70, prLV}, // Lo HANGUL SYLLABLE GEO + {0xAC71, 0xAC8B, prLVT}, // Lo [27] HANGUL SYLLABLE GEOG..HANGUL SYLLABLE GEOH + {0xAC8C, 0xAC8C, prLV}, // Lo HANGUL SYLLABLE GE + {0xAC8D, 0xACA7, prLVT}, // Lo [27] HANGUL SYLLABLE GEG..HANGUL SYLLABLE GEH + {0xACA8, 0xACA8, prLV}, // Lo HANGUL SYLLABLE GYEO + {0xACA9, 0xACC3, prLVT}, // Lo [27] HANGUL SYLLABLE GYEOG..HANGUL SYLLABLE GYEOH + {0xACC4, 0xACC4, prLV}, // Lo HANGUL SYLLABLE GYE + {0xACC5, 0xACDF, prLVT}, // Lo [27] HANGUL SYLLABLE GYEG..HANGUL SYLLABLE GYEH + {0xACE0, 0xACE0, prLV}, // Lo HANGUL SYLLABLE GO + {0xACE1, 0xACFB, prLVT}, // Lo [27] HANGUL SYLLABLE GOG..HANGUL SYLLABLE GOH + {0xACFC, 0xACFC, prLV}, // Lo HANGUL SYLLABLE GWA + {0xACFD, 0xAD17, prLVT}, // Lo [27] HANGUL SYLLABLE GWAG..HANGUL SYLLABLE GWAH + {0xAD18, 0xAD18, prLV}, // Lo HANGUL SYLLABLE GWAE + {0xAD19, 0xAD33, prLVT}, // Lo [27] HANGUL SYLLABLE GWAEG..HANGUL SYLLABLE GWAEH + {0xAD34, 0xAD34, prLV}, // Lo HANGUL SYLLABLE GOE + {0xAD35, 0xAD4F, prLVT}, // Lo [27] HANGUL SYLLABLE GOEG..HANGUL SYLLABLE GOEH + {0xAD50, 0xAD50, prLV}, // Lo HANGUL SYLLABLE GYO + {0xAD51, 0xAD6B, prLVT}, // Lo [27] HANGUL SYLLABLE GYOG..HANGUL SYLLABLE GYOH + {0xAD6C, 0xAD6C, prLV}, // Lo HANGUL SYLLABLE GU + {0xAD6D, 0xAD87, prLVT}, // Lo [27] HANGUL SYLLABLE GUG..HANGUL SYLLABLE GUH + {0xAD88, 0xAD88, prLV}, // Lo HANGUL SYLLABLE GWEO + {0xAD89, 0xADA3, prLVT}, // Lo [27] HANGUL SYLLABLE GWEOG..HANGUL SYLLABLE GWEOH + {0xADA4, 0xADA4, prLV}, // Lo HANGUL SYLLABLE GWE + {0xADA5, 0xADBF, prLVT}, // Lo [27] HANGUL SYLLABLE GWEG..HANGUL SYLLABLE GWEH + {0xADC0, 0xADC0, prLV}, // Lo HANGUL SYLLABLE GWI + {0xADC1, 0xADDB, prLVT}, // Lo [27] HANGUL SYLLABLE GWIG..HANGUL SYLLABLE GWIH + {0xADDC, 0xADDC, prLV}, // Lo HANGUL SYLLABLE GYU + {0xADDD, 0xADF7, prLVT}, // Lo [27] HANGUL SYLLABLE GYUG..HANGUL SYLLABLE GYUH + {0xADF8, 0xADF8, prLV}, // Lo HANGUL SYLLABLE GEU + {0xADF9, 0xAE13, prLVT}, // Lo [27] HANGUL SYLLABLE GEUG..HANGUL SYLLABLE GEUH + {0xAE14, 0xAE14, prLV}, // Lo HANGUL SYLLABLE GYI + {0xAE15, 0xAE2F, prLVT}, // Lo [27] HANGUL SYLLABLE GYIG..HANGUL SYLLABLE GYIH + {0xAE30, 0xAE30, prLV}, // Lo HANGUL SYLLABLE GI + {0xAE31, 0xAE4B, prLVT}, // Lo [27] HANGUL SYLLABLE GIG..HANGUL SYLLABLE GIH + {0xAE4C, 0xAE4C, prLV}, // Lo HANGUL SYLLABLE GGA + {0xAE4D, 0xAE67, prLVT}, // Lo [27] HANGUL SYLLABLE GGAG..HANGUL SYLLABLE GGAH + {0xAE68, 0xAE68, prLV}, // Lo HANGUL SYLLABLE GGAE + {0xAE69, 0xAE83, prLVT}, // Lo [27] HANGUL SYLLABLE GGAEG..HANGUL SYLLABLE GGAEH + {0xAE84, 0xAE84, prLV}, // Lo HANGUL SYLLABLE GGYA + {0xAE85, 0xAE9F, prLVT}, // Lo [27] HANGUL SYLLABLE GGYAG..HANGUL SYLLABLE GGYAH + {0xAEA0, 0xAEA0, prLV}, // Lo HANGUL SYLLABLE GGYAE + {0xAEA1, 0xAEBB, prLVT}, // Lo [27] HANGUL SYLLABLE GGYAEG..HANGUL SYLLABLE GGYAEH + {0xAEBC, 0xAEBC, prLV}, // Lo HANGUL SYLLABLE GGEO + {0xAEBD, 0xAED7, prLVT}, // Lo [27] HANGUL SYLLABLE GGEOG..HANGUL SYLLABLE GGEOH + {0xAED8, 0xAED8, prLV}, // Lo HANGUL SYLLABLE GGE + {0xAED9, 0xAEF3, prLVT}, // Lo [27] HANGUL SYLLABLE GGEG..HANGUL SYLLABLE GGEH + {0xAEF4, 0xAEF4, prLV}, // Lo HANGUL SYLLABLE GGYEO + {0xAEF5, 0xAF0F, prLVT}, // Lo [27] HANGUL SYLLABLE GGYEOG..HANGUL SYLLABLE GGYEOH + {0xAF10, 0xAF10, prLV}, // Lo HANGUL SYLLABLE GGYE + {0xAF11, 0xAF2B, prLVT}, // Lo [27] HANGUL SYLLABLE GGYEG..HANGUL SYLLABLE GGYEH + {0xAF2C, 0xAF2C, prLV}, // Lo HANGUL SYLLABLE GGO + {0xAF2D, 0xAF47, prLVT}, // Lo [27] HANGUL SYLLABLE GGOG..HANGUL SYLLABLE GGOH + {0xAF48, 0xAF48, prLV}, // Lo HANGUL SYLLABLE GGWA + {0xAF49, 0xAF63, prLVT}, // Lo [27] HANGUL SYLLABLE GGWAG..HANGUL SYLLABLE GGWAH + {0xAF64, 0xAF64, prLV}, // Lo HANGUL SYLLABLE GGWAE + {0xAF65, 0xAF7F, prLVT}, // Lo [27] HANGUL SYLLABLE GGWAEG..HANGUL SYLLABLE GGWAEH + {0xAF80, 0xAF80, prLV}, // Lo HANGUL SYLLABLE GGOE + {0xAF81, 0xAF9B, prLVT}, // Lo [27] HANGUL SYLLABLE GGOEG..HANGUL SYLLABLE GGOEH + {0xAF9C, 0xAF9C, prLV}, // Lo HANGUL SYLLABLE GGYO + {0xAF9D, 0xAFB7, prLVT}, // Lo [27] HANGUL SYLLABLE GGYOG..HANGUL SYLLABLE GGYOH + {0xAFB8, 0xAFB8, prLV}, // Lo HANGUL SYLLABLE GGU + {0xAFB9, 0xAFD3, prLVT}, // Lo [27] HANGUL SYLLABLE GGUG..HANGUL SYLLABLE GGUH + {0xAFD4, 0xAFD4, prLV}, // Lo HANGUL SYLLABLE GGWEO + {0xAFD5, 0xAFEF, prLVT}, // Lo [27] HANGUL SYLLABLE GGWEOG..HANGUL SYLLABLE GGWEOH + {0xAFF0, 0xAFF0, prLV}, // Lo HANGUL SYLLABLE GGWE + {0xAFF1, 0xB00B, prLVT}, // Lo [27] HANGUL SYLLABLE GGWEG..HANGUL SYLLABLE GGWEH + {0xB00C, 0xB00C, prLV}, // Lo HANGUL SYLLABLE GGWI + {0xB00D, 0xB027, prLVT}, // Lo [27] HANGUL SYLLABLE GGWIG..HANGUL SYLLABLE GGWIH + {0xB028, 0xB028, prLV}, // Lo HANGUL SYLLABLE GGYU + {0xB029, 0xB043, prLVT}, // Lo [27] HANGUL SYLLABLE GGYUG..HANGUL SYLLABLE GGYUH + {0xB044, 0xB044, prLV}, // Lo HANGUL SYLLABLE GGEU + {0xB045, 0xB05F, prLVT}, // Lo [27] HANGUL SYLLABLE GGEUG..HANGUL SYLLABLE GGEUH + {0xB060, 0xB060, prLV}, // Lo HANGUL SYLLABLE GGYI + {0xB061, 0xB07B, prLVT}, // Lo [27] HANGUL SYLLABLE GGYIG..HANGUL SYLLABLE GGYIH + {0xB07C, 0xB07C, prLV}, // Lo HANGUL SYLLABLE GGI + {0xB07D, 0xB097, prLVT}, // Lo [27] HANGUL SYLLABLE GGIG..HANGUL SYLLABLE GGIH + {0xB098, 0xB098, prLV}, // Lo HANGUL SYLLABLE NA + {0xB099, 0xB0B3, prLVT}, // Lo [27] HANGUL SYLLABLE NAG..HANGUL SYLLABLE NAH + {0xB0B4, 0xB0B4, prLV}, // Lo HANGUL SYLLABLE NAE + {0xB0B5, 0xB0CF, prLVT}, // Lo [27] HANGUL SYLLABLE NAEG..HANGUL SYLLABLE NAEH + {0xB0D0, 0xB0D0, prLV}, // Lo HANGUL SYLLABLE NYA + {0xB0D1, 0xB0EB, prLVT}, // Lo [27] HANGUL SYLLABLE NYAG..HANGUL SYLLABLE NYAH + {0xB0EC, 0xB0EC, prLV}, // Lo HANGUL SYLLABLE NYAE + {0xB0ED, 0xB107, prLVT}, // Lo [27] HANGUL SYLLABLE NYAEG..HANGUL SYLLABLE NYAEH + {0xB108, 0xB108, prLV}, // Lo HANGUL SYLLABLE NEO + {0xB109, 0xB123, prLVT}, // Lo [27] HANGUL SYLLABLE NEOG..HANGUL SYLLABLE NEOH + {0xB124, 0xB124, prLV}, // Lo HANGUL SYLLABLE NE + {0xB125, 0xB13F, prLVT}, // Lo [27] HANGUL SYLLABLE NEG..HANGUL SYLLABLE NEH + {0xB140, 0xB140, prLV}, // Lo HANGUL SYLLABLE NYEO + {0xB141, 0xB15B, prLVT}, // Lo [27] HANGUL SYLLABLE NYEOG..HANGUL SYLLABLE NYEOH + {0xB15C, 0xB15C, prLV}, // Lo HANGUL SYLLABLE NYE + {0xB15D, 0xB177, prLVT}, // Lo [27] HANGUL SYLLABLE NYEG..HANGUL SYLLABLE NYEH + {0xB178, 0xB178, prLV}, // Lo HANGUL SYLLABLE NO + {0xB179, 0xB193, prLVT}, // Lo [27] HANGUL SYLLABLE NOG..HANGUL SYLLABLE NOH + {0xB194, 0xB194, prLV}, // Lo HANGUL SYLLABLE NWA + {0xB195, 0xB1AF, prLVT}, // Lo [27] HANGUL SYLLABLE NWAG..HANGUL SYLLABLE NWAH + {0xB1B0, 0xB1B0, prLV}, // Lo HANGUL SYLLABLE NWAE + {0xB1B1, 0xB1CB, prLVT}, // Lo [27] HANGUL SYLLABLE NWAEG..HANGUL SYLLABLE NWAEH + {0xB1CC, 0xB1CC, prLV}, // Lo HANGUL SYLLABLE NOE + {0xB1CD, 0xB1E7, prLVT}, // Lo [27] HANGUL SYLLABLE NOEG..HANGUL SYLLABLE NOEH + {0xB1E8, 0xB1E8, prLV}, // Lo HANGUL SYLLABLE NYO + {0xB1E9, 0xB203, prLVT}, // Lo [27] HANGUL SYLLABLE NYOG..HANGUL SYLLABLE NYOH + {0xB204, 0xB204, prLV}, // Lo HANGUL SYLLABLE NU + {0xB205, 0xB21F, prLVT}, // Lo [27] HANGUL SYLLABLE NUG..HANGUL SYLLABLE NUH + {0xB220, 0xB220, prLV}, // Lo HANGUL SYLLABLE NWEO + {0xB221, 0xB23B, prLVT}, // Lo [27] HANGUL SYLLABLE NWEOG..HANGUL SYLLABLE NWEOH + {0xB23C, 0xB23C, prLV}, // Lo HANGUL SYLLABLE NWE + {0xB23D, 0xB257, prLVT}, // Lo [27] HANGUL SYLLABLE NWEG..HANGUL SYLLABLE NWEH + {0xB258, 0xB258, prLV}, // Lo HANGUL SYLLABLE NWI + {0xB259, 0xB273, prLVT}, // Lo [27] HANGUL SYLLABLE NWIG..HANGUL SYLLABLE NWIH + {0xB274, 0xB274, prLV}, // Lo HANGUL SYLLABLE NYU + {0xB275, 0xB28F, prLVT}, // Lo [27] HANGUL SYLLABLE NYUG..HANGUL SYLLABLE NYUH + {0xB290, 0xB290, prLV}, // Lo HANGUL SYLLABLE NEU + {0xB291, 0xB2AB, prLVT}, // Lo [27] HANGUL SYLLABLE NEUG..HANGUL SYLLABLE NEUH + {0xB2AC, 0xB2AC, prLV}, // Lo HANGUL SYLLABLE NYI + {0xB2AD, 0xB2C7, prLVT}, // Lo [27] HANGUL SYLLABLE NYIG..HANGUL SYLLABLE NYIH + {0xB2C8, 0xB2C8, prLV}, // Lo HANGUL SYLLABLE NI + {0xB2C9, 0xB2E3, prLVT}, // Lo [27] HANGUL SYLLABLE NIG..HANGUL SYLLABLE NIH + {0xB2E4, 0xB2E4, prLV}, // Lo HANGUL SYLLABLE DA + {0xB2E5, 0xB2FF, prLVT}, // Lo [27] HANGUL SYLLABLE DAG..HANGUL SYLLABLE DAH + {0xB300, 0xB300, prLV}, // Lo HANGUL SYLLABLE DAE + {0xB301, 0xB31B, prLVT}, // Lo [27] HANGUL SYLLABLE DAEG..HANGUL SYLLABLE DAEH + {0xB31C, 0xB31C, prLV}, // Lo HANGUL SYLLABLE DYA + {0xB31D, 0xB337, prLVT}, // Lo [27] HANGUL SYLLABLE DYAG..HANGUL SYLLABLE DYAH + {0xB338, 0xB338, prLV}, // Lo HANGUL SYLLABLE DYAE + {0xB339, 0xB353, prLVT}, // Lo [27] HANGUL SYLLABLE DYAEG..HANGUL SYLLABLE DYAEH + {0xB354, 0xB354, prLV}, // Lo HANGUL SYLLABLE DEO + {0xB355, 0xB36F, prLVT}, // Lo [27] HANGUL SYLLABLE DEOG..HANGUL SYLLABLE DEOH + {0xB370, 0xB370, prLV}, // Lo HANGUL SYLLABLE DE + {0xB371, 0xB38B, prLVT}, // Lo [27] HANGUL SYLLABLE DEG..HANGUL SYLLABLE DEH + {0xB38C, 0xB38C, prLV}, // Lo HANGUL SYLLABLE DYEO + {0xB38D, 0xB3A7, prLVT}, // Lo [27] HANGUL SYLLABLE DYEOG..HANGUL SYLLABLE DYEOH + {0xB3A8, 0xB3A8, prLV}, // Lo HANGUL SYLLABLE DYE + {0xB3A9, 0xB3C3, prLVT}, // Lo [27] HANGUL SYLLABLE DYEG..HANGUL SYLLABLE DYEH + {0xB3C4, 0xB3C4, prLV}, // Lo HANGUL SYLLABLE DO + {0xB3C5, 0xB3DF, prLVT}, // Lo [27] HANGUL SYLLABLE DOG..HANGUL SYLLABLE DOH + {0xB3E0, 0xB3E0, prLV}, // Lo HANGUL SYLLABLE DWA + {0xB3E1, 0xB3FB, prLVT}, // Lo [27] HANGUL SYLLABLE DWAG..HANGUL SYLLABLE DWAH + {0xB3FC, 0xB3FC, prLV}, // Lo HANGUL SYLLABLE DWAE + {0xB3FD, 0xB417, prLVT}, // Lo [27] HANGUL SYLLABLE DWAEG..HANGUL SYLLABLE DWAEH + {0xB418, 0xB418, prLV}, // Lo HANGUL SYLLABLE DOE + {0xB419, 0xB433, prLVT}, // Lo [27] HANGUL SYLLABLE DOEG..HANGUL SYLLABLE DOEH + {0xB434, 0xB434, prLV}, // Lo HANGUL SYLLABLE DYO + {0xB435, 0xB44F, prLVT}, // Lo [27] HANGUL SYLLABLE DYOG..HANGUL SYLLABLE DYOH + {0xB450, 0xB450, prLV}, // Lo HANGUL SYLLABLE DU + {0xB451, 0xB46B, prLVT}, // Lo [27] HANGUL SYLLABLE DUG..HANGUL SYLLABLE DUH + {0xB46C, 0xB46C, prLV}, // Lo HANGUL SYLLABLE DWEO + {0xB46D, 0xB487, prLVT}, // Lo [27] HANGUL SYLLABLE DWEOG..HANGUL SYLLABLE DWEOH + {0xB488, 0xB488, prLV}, // Lo HANGUL SYLLABLE DWE + {0xB489, 0xB4A3, prLVT}, // Lo [27] HANGUL SYLLABLE DWEG..HANGUL SYLLABLE DWEH + {0xB4A4, 0xB4A4, prLV}, // Lo HANGUL SYLLABLE DWI + {0xB4A5, 0xB4BF, prLVT}, // Lo [27] HANGUL SYLLABLE DWIG..HANGUL SYLLABLE DWIH + {0xB4C0, 0xB4C0, prLV}, // Lo HANGUL SYLLABLE DYU + {0xB4C1, 0xB4DB, prLVT}, // Lo [27] HANGUL SYLLABLE DYUG..HANGUL SYLLABLE DYUH + {0xB4DC, 0xB4DC, prLV}, // Lo HANGUL SYLLABLE DEU + {0xB4DD, 0xB4F7, prLVT}, // Lo [27] HANGUL SYLLABLE DEUG..HANGUL SYLLABLE DEUH + {0xB4F8, 0xB4F8, prLV}, // Lo HANGUL SYLLABLE DYI + {0xB4F9, 0xB513, prLVT}, // Lo [27] HANGUL SYLLABLE DYIG..HANGUL SYLLABLE DYIH + {0xB514, 0xB514, prLV}, // Lo HANGUL SYLLABLE DI + {0xB515, 0xB52F, prLVT}, // Lo [27] HANGUL SYLLABLE DIG..HANGUL SYLLABLE DIH + {0xB530, 0xB530, prLV}, // Lo HANGUL SYLLABLE DDA + {0xB531, 0xB54B, prLVT}, // Lo [27] HANGUL SYLLABLE DDAG..HANGUL SYLLABLE DDAH + {0xB54C, 0xB54C, prLV}, // Lo HANGUL SYLLABLE DDAE + {0xB54D, 0xB567, prLVT}, // Lo [27] HANGUL SYLLABLE DDAEG..HANGUL SYLLABLE DDAEH + {0xB568, 0xB568, prLV}, // Lo HANGUL SYLLABLE DDYA + {0xB569, 0xB583, prLVT}, // Lo [27] HANGUL SYLLABLE DDYAG..HANGUL SYLLABLE DDYAH + {0xB584, 0xB584, prLV}, // Lo HANGUL SYLLABLE DDYAE + {0xB585, 0xB59F, prLVT}, // Lo [27] HANGUL SYLLABLE DDYAEG..HANGUL SYLLABLE DDYAEH + {0xB5A0, 0xB5A0, prLV}, // Lo HANGUL SYLLABLE DDEO + {0xB5A1, 0xB5BB, prLVT}, // Lo [27] HANGUL SYLLABLE DDEOG..HANGUL SYLLABLE DDEOH + {0xB5BC, 0xB5BC, prLV}, // Lo HANGUL SYLLABLE DDE + {0xB5BD, 0xB5D7, prLVT}, // Lo [27] HANGUL SYLLABLE DDEG..HANGUL SYLLABLE DDEH + {0xB5D8, 0xB5D8, prLV}, // Lo HANGUL SYLLABLE DDYEO + {0xB5D9, 0xB5F3, prLVT}, // Lo [27] HANGUL SYLLABLE DDYEOG..HANGUL SYLLABLE DDYEOH + {0xB5F4, 0xB5F4, prLV}, // Lo HANGUL SYLLABLE DDYE + {0xB5F5, 0xB60F, prLVT}, // Lo [27] HANGUL SYLLABLE DDYEG..HANGUL SYLLABLE DDYEH + {0xB610, 0xB610, prLV}, // Lo HANGUL SYLLABLE DDO + {0xB611, 0xB62B, prLVT}, // Lo [27] HANGUL SYLLABLE DDOG..HANGUL SYLLABLE DDOH + {0xB62C, 0xB62C, prLV}, // Lo HANGUL SYLLABLE DDWA + {0xB62D, 0xB647, prLVT}, // Lo [27] HANGUL SYLLABLE DDWAG..HANGUL SYLLABLE DDWAH + {0xB648, 0xB648, prLV}, // Lo HANGUL SYLLABLE DDWAE + {0xB649, 0xB663, prLVT}, // Lo [27] HANGUL SYLLABLE DDWAEG..HANGUL SYLLABLE DDWAEH + {0xB664, 0xB664, prLV}, // Lo HANGUL SYLLABLE DDOE + {0xB665, 0xB67F, prLVT}, // Lo [27] HANGUL SYLLABLE DDOEG..HANGUL SYLLABLE DDOEH + {0xB680, 0xB680, prLV}, // Lo HANGUL SYLLABLE DDYO + {0xB681, 0xB69B, prLVT}, // Lo [27] HANGUL SYLLABLE DDYOG..HANGUL SYLLABLE DDYOH + {0xB69C, 0xB69C, prLV}, // Lo HANGUL SYLLABLE DDU + {0xB69D, 0xB6B7, prLVT}, // Lo [27] HANGUL SYLLABLE DDUG..HANGUL SYLLABLE DDUH + {0xB6B8, 0xB6B8, prLV}, // Lo HANGUL SYLLABLE DDWEO + {0xB6B9, 0xB6D3, prLVT}, // Lo [27] HANGUL SYLLABLE DDWEOG..HANGUL SYLLABLE DDWEOH + {0xB6D4, 0xB6D4, prLV}, // Lo HANGUL SYLLABLE DDWE + {0xB6D5, 0xB6EF, prLVT}, // Lo [27] HANGUL SYLLABLE DDWEG..HANGUL SYLLABLE DDWEH + {0xB6F0, 0xB6F0, prLV}, // Lo HANGUL SYLLABLE DDWI + {0xB6F1, 0xB70B, prLVT}, // Lo [27] HANGUL SYLLABLE DDWIG..HANGUL SYLLABLE DDWIH + {0xB70C, 0xB70C, prLV}, // Lo HANGUL SYLLABLE DDYU + {0xB70D, 0xB727, prLVT}, // Lo [27] HANGUL SYLLABLE DDYUG..HANGUL SYLLABLE DDYUH + {0xB728, 0xB728, prLV}, // Lo HANGUL SYLLABLE DDEU + {0xB729, 0xB743, prLVT}, // Lo [27] HANGUL SYLLABLE DDEUG..HANGUL SYLLABLE DDEUH + {0xB744, 0xB744, prLV}, // Lo HANGUL SYLLABLE DDYI + {0xB745, 0xB75F, prLVT}, // Lo [27] HANGUL SYLLABLE DDYIG..HANGUL SYLLABLE DDYIH + {0xB760, 0xB760, prLV}, // Lo HANGUL SYLLABLE DDI + {0xB761, 0xB77B, prLVT}, // Lo [27] HANGUL SYLLABLE DDIG..HANGUL SYLLABLE DDIH + {0xB77C, 0xB77C, prLV}, // Lo HANGUL SYLLABLE RA + {0xB77D, 0xB797, prLVT}, // Lo [27] HANGUL SYLLABLE RAG..HANGUL SYLLABLE RAH + {0xB798, 0xB798, prLV}, // Lo HANGUL SYLLABLE RAE + {0xB799, 0xB7B3, prLVT}, // Lo [27] HANGUL SYLLABLE RAEG..HANGUL SYLLABLE RAEH + {0xB7B4, 0xB7B4, prLV}, // Lo HANGUL SYLLABLE RYA + {0xB7B5, 0xB7CF, prLVT}, // Lo [27] HANGUL SYLLABLE RYAG..HANGUL SYLLABLE RYAH + {0xB7D0, 0xB7D0, prLV}, // Lo HANGUL SYLLABLE RYAE + {0xB7D1, 0xB7EB, prLVT}, // Lo [27] HANGUL SYLLABLE RYAEG..HANGUL SYLLABLE RYAEH + {0xB7EC, 0xB7EC, prLV}, // Lo HANGUL SYLLABLE REO + {0xB7ED, 0xB807, prLVT}, // Lo [27] HANGUL SYLLABLE REOG..HANGUL SYLLABLE REOH + {0xB808, 0xB808, prLV}, // Lo HANGUL SYLLABLE RE + {0xB809, 0xB823, prLVT}, // Lo [27] HANGUL SYLLABLE REG..HANGUL SYLLABLE REH + {0xB824, 0xB824, prLV}, // Lo HANGUL SYLLABLE RYEO + {0xB825, 0xB83F, prLVT}, // Lo [27] HANGUL SYLLABLE RYEOG..HANGUL SYLLABLE RYEOH + {0xB840, 0xB840, prLV}, // Lo HANGUL SYLLABLE RYE + {0xB841, 0xB85B, prLVT}, // Lo [27] HANGUL SYLLABLE RYEG..HANGUL SYLLABLE RYEH + {0xB85C, 0xB85C, prLV}, // Lo HANGUL SYLLABLE RO + {0xB85D, 0xB877, prLVT}, // Lo [27] HANGUL SYLLABLE ROG..HANGUL SYLLABLE ROH + {0xB878, 0xB878, prLV}, // Lo HANGUL SYLLABLE RWA + {0xB879, 0xB893, prLVT}, // Lo [27] HANGUL SYLLABLE RWAG..HANGUL SYLLABLE RWAH + {0xB894, 0xB894, prLV}, // Lo HANGUL SYLLABLE RWAE + {0xB895, 0xB8AF, prLVT}, // Lo [27] HANGUL SYLLABLE RWAEG..HANGUL SYLLABLE RWAEH + {0xB8B0, 0xB8B0, prLV}, // Lo HANGUL SYLLABLE ROE + {0xB8B1, 0xB8CB, prLVT}, // Lo [27] HANGUL SYLLABLE ROEG..HANGUL SYLLABLE ROEH + {0xB8CC, 0xB8CC, prLV}, // Lo HANGUL SYLLABLE RYO + {0xB8CD, 0xB8E7, prLVT}, // Lo [27] HANGUL SYLLABLE RYOG..HANGUL SYLLABLE RYOH + {0xB8E8, 0xB8E8, prLV}, // Lo HANGUL SYLLABLE RU + {0xB8E9, 0xB903, prLVT}, // Lo [27] HANGUL SYLLABLE RUG..HANGUL SYLLABLE RUH + {0xB904, 0xB904, prLV}, // Lo HANGUL SYLLABLE RWEO + {0xB905, 0xB91F, prLVT}, // Lo [27] HANGUL SYLLABLE RWEOG..HANGUL SYLLABLE RWEOH + {0xB920, 0xB920, prLV}, // Lo HANGUL SYLLABLE RWE + {0xB921, 0xB93B, prLVT}, // Lo [27] HANGUL SYLLABLE RWEG..HANGUL SYLLABLE RWEH + {0xB93C, 0xB93C, prLV}, // Lo HANGUL SYLLABLE RWI + {0xB93D, 0xB957, prLVT}, // Lo [27] HANGUL SYLLABLE RWIG..HANGUL SYLLABLE RWIH + {0xB958, 0xB958, prLV}, // Lo HANGUL SYLLABLE RYU + {0xB959, 0xB973, prLVT}, // Lo [27] HANGUL SYLLABLE RYUG..HANGUL SYLLABLE RYUH + {0xB974, 0xB974, prLV}, // Lo HANGUL SYLLABLE REU + {0xB975, 0xB98F, prLVT}, // Lo [27] HANGUL SYLLABLE REUG..HANGUL SYLLABLE REUH + {0xB990, 0xB990, prLV}, // Lo HANGUL SYLLABLE RYI + {0xB991, 0xB9AB, prLVT}, // Lo [27] HANGUL SYLLABLE RYIG..HANGUL SYLLABLE RYIH + {0xB9AC, 0xB9AC, prLV}, // Lo HANGUL SYLLABLE RI + {0xB9AD, 0xB9C7, prLVT}, // Lo [27] HANGUL SYLLABLE RIG..HANGUL SYLLABLE RIH + {0xB9C8, 0xB9C8, prLV}, // Lo HANGUL SYLLABLE MA + {0xB9C9, 0xB9E3, prLVT}, // Lo [27] HANGUL SYLLABLE MAG..HANGUL SYLLABLE MAH + {0xB9E4, 0xB9E4, prLV}, // Lo HANGUL SYLLABLE MAE + {0xB9E5, 0xB9FF, prLVT}, // Lo [27] HANGUL SYLLABLE MAEG..HANGUL SYLLABLE MAEH + {0xBA00, 0xBA00, prLV}, // Lo HANGUL SYLLABLE MYA + {0xBA01, 0xBA1B, prLVT}, // Lo [27] HANGUL SYLLABLE MYAG..HANGUL SYLLABLE MYAH + {0xBA1C, 0xBA1C, prLV}, // Lo HANGUL SYLLABLE MYAE + {0xBA1D, 0xBA37, prLVT}, // Lo [27] HANGUL SYLLABLE MYAEG..HANGUL SYLLABLE MYAEH + {0xBA38, 0xBA38, prLV}, // Lo HANGUL SYLLABLE MEO + {0xBA39, 0xBA53, prLVT}, // Lo [27] HANGUL SYLLABLE MEOG..HANGUL SYLLABLE MEOH + {0xBA54, 0xBA54, prLV}, // Lo HANGUL SYLLABLE ME + {0xBA55, 0xBA6F, prLVT}, // Lo [27] HANGUL SYLLABLE MEG..HANGUL SYLLABLE MEH + {0xBA70, 0xBA70, prLV}, // Lo HANGUL SYLLABLE MYEO + {0xBA71, 0xBA8B, prLVT}, // Lo [27] HANGUL SYLLABLE MYEOG..HANGUL SYLLABLE MYEOH + {0xBA8C, 0xBA8C, prLV}, // Lo HANGUL SYLLABLE MYE + {0xBA8D, 0xBAA7, prLVT}, // Lo [27] HANGUL SYLLABLE MYEG..HANGUL SYLLABLE MYEH + {0xBAA8, 0xBAA8, prLV}, // Lo HANGUL SYLLABLE MO + {0xBAA9, 0xBAC3, prLVT}, // Lo [27] HANGUL SYLLABLE MOG..HANGUL SYLLABLE MOH + {0xBAC4, 0xBAC4, prLV}, // Lo HANGUL SYLLABLE MWA + {0xBAC5, 0xBADF, prLVT}, // Lo [27] HANGUL SYLLABLE MWAG..HANGUL SYLLABLE MWAH + {0xBAE0, 0xBAE0, prLV}, // Lo HANGUL SYLLABLE MWAE + {0xBAE1, 0xBAFB, prLVT}, // Lo [27] HANGUL SYLLABLE MWAEG..HANGUL SYLLABLE MWAEH + {0xBAFC, 0xBAFC, prLV}, // Lo HANGUL SYLLABLE MOE + {0xBAFD, 0xBB17, prLVT}, // Lo [27] HANGUL SYLLABLE MOEG..HANGUL SYLLABLE MOEH + {0xBB18, 0xBB18, prLV}, // Lo HANGUL SYLLABLE MYO + {0xBB19, 0xBB33, prLVT}, // Lo [27] HANGUL SYLLABLE MYOG..HANGUL SYLLABLE MYOH + {0xBB34, 0xBB34, prLV}, // Lo HANGUL SYLLABLE MU + {0xBB35, 0xBB4F, prLVT}, // Lo [27] HANGUL SYLLABLE MUG..HANGUL SYLLABLE MUH + {0xBB50, 0xBB50, prLV}, // Lo HANGUL SYLLABLE MWEO + {0xBB51, 0xBB6B, prLVT}, // Lo [27] HANGUL SYLLABLE MWEOG..HANGUL SYLLABLE MWEOH + {0xBB6C, 0xBB6C, prLV}, // Lo HANGUL SYLLABLE MWE + {0xBB6D, 0xBB87, prLVT}, // Lo [27] HANGUL SYLLABLE MWEG..HANGUL SYLLABLE MWEH + {0xBB88, 0xBB88, prLV}, // Lo HANGUL SYLLABLE MWI + {0xBB89, 0xBBA3, prLVT}, // Lo [27] HANGUL SYLLABLE MWIG..HANGUL SYLLABLE MWIH + {0xBBA4, 0xBBA4, prLV}, // Lo HANGUL SYLLABLE MYU + {0xBBA5, 0xBBBF, prLVT}, // Lo [27] HANGUL SYLLABLE MYUG..HANGUL SYLLABLE MYUH + {0xBBC0, 0xBBC0, prLV}, // Lo HANGUL SYLLABLE MEU + {0xBBC1, 0xBBDB, prLVT}, // Lo [27] HANGUL SYLLABLE MEUG..HANGUL SYLLABLE MEUH + {0xBBDC, 0xBBDC, prLV}, // Lo HANGUL SYLLABLE MYI + {0xBBDD, 0xBBF7, prLVT}, // Lo [27] HANGUL SYLLABLE MYIG..HANGUL SYLLABLE MYIH + {0xBBF8, 0xBBF8, prLV}, // Lo HANGUL SYLLABLE MI + {0xBBF9, 0xBC13, prLVT}, // Lo [27] HANGUL SYLLABLE MIG..HANGUL SYLLABLE MIH + {0xBC14, 0xBC14, prLV}, // Lo HANGUL SYLLABLE BA + {0xBC15, 0xBC2F, prLVT}, // Lo [27] HANGUL SYLLABLE BAG..HANGUL SYLLABLE BAH + {0xBC30, 0xBC30, prLV}, // Lo HANGUL SYLLABLE BAE + {0xBC31, 0xBC4B, prLVT}, // Lo [27] HANGUL SYLLABLE BAEG..HANGUL SYLLABLE BAEH + {0xBC4C, 0xBC4C, prLV}, // Lo HANGUL SYLLABLE BYA + {0xBC4D, 0xBC67, prLVT}, // Lo [27] HANGUL SYLLABLE BYAG..HANGUL SYLLABLE BYAH + {0xBC68, 0xBC68, prLV}, // Lo HANGUL SYLLABLE BYAE + {0xBC69, 0xBC83, prLVT}, // Lo [27] HANGUL SYLLABLE BYAEG..HANGUL SYLLABLE BYAEH + {0xBC84, 0xBC84, prLV}, // Lo HANGUL SYLLABLE BEO + {0xBC85, 0xBC9F, prLVT}, // Lo [27] HANGUL SYLLABLE BEOG..HANGUL SYLLABLE BEOH + {0xBCA0, 0xBCA0, prLV}, // Lo HANGUL SYLLABLE BE + {0xBCA1, 0xBCBB, prLVT}, // Lo [27] HANGUL SYLLABLE BEG..HANGUL SYLLABLE BEH + {0xBCBC, 0xBCBC, prLV}, // Lo HANGUL SYLLABLE BYEO + {0xBCBD, 0xBCD7, prLVT}, // Lo [27] HANGUL SYLLABLE BYEOG..HANGUL SYLLABLE BYEOH + {0xBCD8, 0xBCD8, prLV}, // Lo HANGUL SYLLABLE BYE + {0xBCD9, 0xBCF3, prLVT}, // Lo [27] HANGUL SYLLABLE BYEG..HANGUL SYLLABLE BYEH + {0xBCF4, 0xBCF4, prLV}, // Lo HANGUL SYLLABLE BO + {0xBCF5, 0xBD0F, prLVT}, // Lo [27] HANGUL SYLLABLE BOG..HANGUL SYLLABLE BOH + {0xBD10, 0xBD10, prLV}, // Lo HANGUL SYLLABLE BWA + {0xBD11, 0xBD2B, prLVT}, // Lo [27] HANGUL SYLLABLE BWAG..HANGUL SYLLABLE BWAH + {0xBD2C, 0xBD2C, prLV}, // Lo HANGUL SYLLABLE BWAE + {0xBD2D, 0xBD47, prLVT}, // Lo [27] HANGUL SYLLABLE BWAEG..HANGUL SYLLABLE BWAEH + {0xBD48, 0xBD48, prLV}, // Lo HANGUL SYLLABLE BOE + {0xBD49, 0xBD63, prLVT}, // Lo [27] HANGUL SYLLABLE BOEG..HANGUL SYLLABLE BOEH + {0xBD64, 0xBD64, prLV}, // Lo HANGUL SYLLABLE BYO + {0xBD65, 0xBD7F, prLVT}, // Lo [27] HANGUL SYLLABLE BYOG..HANGUL SYLLABLE BYOH + {0xBD80, 0xBD80, prLV}, // Lo HANGUL SYLLABLE BU + {0xBD81, 0xBD9B, prLVT}, // Lo [27] HANGUL SYLLABLE BUG..HANGUL SYLLABLE BUH + {0xBD9C, 0xBD9C, prLV}, // Lo HANGUL SYLLABLE BWEO + {0xBD9D, 0xBDB7, prLVT}, // Lo [27] HANGUL SYLLABLE BWEOG..HANGUL SYLLABLE BWEOH + {0xBDB8, 0xBDB8, prLV}, // Lo HANGUL SYLLABLE BWE + {0xBDB9, 0xBDD3, prLVT}, // Lo [27] HANGUL SYLLABLE BWEG..HANGUL SYLLABLE BWEH + {0xBDD4, 0xBDD4, prLV}, // Lo HANGUL SYLLABLE BWI + {0xBDD5, 0xBDEF, prLVT}, // Lo [27] HANGUL SYLLABLE BWIG..HANGUL SYLLABLE BWIH + {0xBDF0, 0xBDF0, prLV}, // Lo HANGUL SYLLABLE BYU + {0xBDF1, 0xBE0B, prLVT}, // Lo [27] HANGUL SYLLABLE BYUG..HANGUL SYLLABLE BYUH + {0xBE0C, 0xBE0C, prLV}, // Lo HANGUL SYLLABLE BEU + {0xBE0D, 0xBE27, prLVT}, // Lo [27] HANGUL SYLLABLE BEUG..HANGUL SYLLABLE BEUH + {0xBE28, 0xBE28, prLV}, // Lo HANGUL SYLLABLE BYI + {0xBE29, 0xBE43, prLVT}, // Lo [27] HANGUL SYLLABLE BYIG..HANGUL SYLLABLE BYIH + {0xBE44, 0xBE44, prLV}, // Lo HANGUL SYLLABLE BI + {0xBE45, 0xBE5F, prLVT}, // Lo [27] HANGUL SYLLABLE BIG..HANGUL SYLLABLE BIH + {0xBE60, 0xBE60, prLV}, // Lo HANGUL SYLLABLE BBA + {0xBE61, 0xBE7B, prLVT}, // Lo [27] HANGUL SYLLABLE BBAG..HANGUL SYLLABLE BBAH + {0xBE7C, 0xBE7C, prLV}, // Lo HANGUL SYLLABLE BBAE + {0xBE7D, 0xBE97, prLVT}, // Lo [27] HANGUL SYLLABLE BBAEG..HANGUL SYLLABLE BBAEH + {0xBE98, 0xBE98, prLV}, // Lo HANGUL SYLLABLE BBYA + {0xBE99, 0xBEB3, prLVT}, // Lo [27] HANGUL SYLLABLE BBYAG..HANGUL SYLLABLE BBYAH + {0xBEB4, 0xBEB4, prLV}, // Lo HANGUL SYLLABLE BBYAE + {0xBEB5, 0xBECF, prLVT}, // Lo [27] HANGUL SYLLABLE BBYAEG..HANGUL SYLLABLE BBYAEH + {0xBED0, 0xBED0, prLV}, // Lo HANGUL SYLLABLE BBEO + {0xBED1, 0xBEEB, prLVT}, // Lo [27] HANGUL SYLLABLE BBEOG..HANGUL SYLLABLE BBEOH + {0xBEEC, 0xBEEC, prLV}, // Lo HANGUL SYLLABLE BBE + {0xBEED, 0xBF07, prLVT}, // Lo [27] HANGUL SYLLABLE BBEG..HANGUL SYLLABLE BBEH + {0xBF08, 0xBF08, prLV}, // Lo HANGUL SYLLABLE BBYEO + {0xBF09, 0xBF23, prLVT}, // Lo [27] HANGUL SYLLABLE BBYEOG..HANGUL SYLLABLE BBYEOH + {0xBF24, 0xBF24, prLV}, // Lo HANGUL SYLLABLE BBYE + {0xBF25, 0xBF3F, prLVT}, // Lo [27] HANGUL SYLLABLE BBYEG..HANGUL SYLLABLE BBYEH + {0xBF40, 0xBF40, prLV}, // Lo HANGUL SYLLABLE BBO + {0xBF41, 0xBF5B, prLVT}, // Lo [27] HANGUL SYLLABLE BBOG..HANGUL SYLLABLE BBOH + {0xBF5C, 0xBF5C, prLV}, // Lo HANGUL SYLLABLE BBWA + {0xBF5D, 0xBF77, prLVT}, // Lo [27] HANGUL SYLLABLE BBWAG..HANGUL SYLLABLE BBWAH + {0xBF78, 0xBF78, prLV}, // Lo HANGUL SYLLABLE BBWAE + {0xBF79, 0xBF93, prLVT}, // Lo [27] HANGUL SYLLABLE BBWAEG..HANGUL SYLLABLE BBWAEH + {0xBF94, 0xBF94, prLV}, // Lo HANGUL SYLLABLE BBOE + {0xBF95, 0xBFAF, prLVT}, // Lo [27] HANGUL SYLLABLE BBOEG..HANGUL SYLLABLE BBOEH + {0xBFB0, 0xBFB0, prLV}, // Lo HANGUL SYLLABLE BBYO + {0xBFB1, 0xBFCB, prLVT}, // Lo [27] HANGUL SYLLABLE BBYOG..HANGUL SYLLABLE BBYOH + {0xBFCC, 0xBFCC, prLV}, // Lo HANGUL SYLLABLE BBU + {0xBFCD, 0xBFE7, prLVT}, // Lo [27] HANGUL SYLLABLE BBUG..HANGUL SYLLABLE BBUH + {0xBFE8, 0xBFE8, prLV}, // Lo HANGUL SYLLABLE BBWEO + {0xBFE9, 0xC003, prLVT}, // Lo [27] HANGUL SYLLABLE BBWEOG..HANGUL SYLLABLE BBWEOH + {0xC004, 0xC004, prLV}, // Lo HANGUL SYLLABLE BBWE + {0xC005, 0xC01F, prLVT}, // Lo [27] HANGUL SYLLABLE BBWEG..HANGUL SYLLABLE BBWEH + {0xC020, 0xC020, prLV}, // Lo HANGUL SYLLABLE BBWI + {0xC021, 0xC03B, prLVT}, // Lo [27] HANGUL SYLLABLE BBWIG..HANGUL SYLLABLE BBWIH + {0xC03C, 0xC03C, prLV}, // Lo HANGUL SYLLABLE BBYU + {0xC03D, 0xC057, prLVT}, // Lo [27] HANGUL SYLLABLE BBYUG..HANGUL SYLLABLE BBYUH + {0xC058, 0xC058, prLV}, // Lo HANGUL SYLLABLE BBEU + {0xC059, 0xC073, prLVT}, // Lo [27] HANGUL SYLLABLE BBEUG..HANGUL SYLLABLE BBEUH + {0xC074, 0xC074, prLV}, // Lo HANGUL SYLLABLE BBYI + {0xC075, 0xC08F, prLVT}, // Lo [27] HANGUL SYLLABLE BBYIG..HANGUL SYLLABLE BBYIH + {0xC090, 0xC090, prLV}, // Lo HANGUL SYLLABLE BBI + {0xC091, 0xC0AB, prLVT}, // Lo [27] HANGUL SYLLABLE BBIG..HANGUL SYLLABLE BBIH + {0xC0AC, 0xC0AC, prLV}, // Lo HANGUL SYLLABLE SA + {0xC0AD, 0xC0C7, prLVT}, // Lo [27] HANGUL SYLLABLE SAG..HANGUL SYLLABLE SAH + {0xC0C8, 0xC0C8, prLV}, // Lo HANGUL SYLLABLE SAE + {0xC0C9, 0xC0E3, prLVT}, // Lo [27] HANGUL SYLLABLE SAEG..HANGUL SYLLABLE SAEH + {0xC0E4, 0xC0E4, prLV}, // Lo HANGUL SYLLABLE SYA + {0xC0E5, 0xC0FF, prLVT}, // Lo [27] HANGUL SYLLABLE SYAG..HANGUL SYLLABLE SYAH + {0xC100, 0xC100, prLV}, // Lo HANGUL SYLLABLE SYAE + {0xC101, 0xC11B, prLVT}, // Lo [27] HANGUL SYLLABLE SYAEG..HANGUL SYLLABLE SYAEH + {0xC11C, 0xC11C, prLV}, // Lo HANGUL SYLLABLE SEO + {0xC11D, 0xC137, prLVT}, // Lo [27] HANGUL SYLLABLE SEOG..HANGUL SYLLABLE SEOH + {0xC138, 0xC138, prLV}, // Lo HANGUL SYLLABLE SE + {0xC139, 0xC153, prLVT}, // Lo [27] HANGUL SYLLABLE SEG..HANGUL SYLLABLE SEH + {0xC154, 0xC154, prLV}, // Lo HANGUL SYLLABLE SYEO + {0xC155, 0xC16F, prLVT}, // Lo [27] HANGUL SYLLABLE SYEOG..HANGUL SYLLABLE SYEOH + {0xC170, 0xC170, prLV}, // Lo HANGUL SYLLABLE SYE + {0xC171, 0xC18B, prLVT}, // Lo [27] HANGUL SYLLABLE SYEG..HANGUL SYLLABLE SYEH + {0xC18C, 0xC18C, prLV}, // Lo HANGUL SYLLABLE SO + {0xC18D, 0xC1A7, prLVT}, // Lo [27] HANGUL SYLLABLE SOG..HANGUL SYLLABLE SOH + {0xC1A8, 0xC1A8, prLV}, // Lo HANGUL SYLLABLE SWA + {0xC1A9, 0xC1C3, prLVT}, // Lo [27] HANGUL SYLLABLE SWAG..HANGUL SYLLABLE SWAH + {0xC1C4, 0xC1C4, prLV}, // Lo HANGUL SYLLABLE SWAE + {0xC1C5, 0xC1DF, prLVT}, // Lo [27] HANGUL SYLLABLE SWAEG..HANGUL SYLLABLE SWAEH + {0xC1E0, 0xC1E0, prLV}, // Lo HANGUL SYLLABLE SOE + {0xC1E1, 0xC1FB, prLVT}, // Lo [27] HANGUL SYLLABLE SOEG..HANGUL SYLLABLE SOEH + {0xC1FC, 0xC1FC, prLV}, // Lo HANGUL SYLLABLE SYO + {0xC1FD, 0xC217, prLVT}, // Lo [27] HANGUL SYLLABLE SYOG..HANGUL SYLLABLE SYOH + {0xC218, 0xC218, prLV}, // Lo HANGUL SYLLABLE SU + {0xC219, 0xC233, prLVT}, // Lo [27] HANGUL SYLLABLE SUG..HANGUL SYLLABLE SUH + {0xC234, 0xC234, prLV}, // Lo HANGUL SYLLABLE SWEO + {0xC235, 0xC24F, prLVT}, // Lo [27] HANGUL SYLLABLE SWEOG..HANGUL SYLLABLE SWEOH + {0xC250, 0xC250, prLV}, // Lo HANGUL SYLLABLE SWE + {0xC251, 0xC26B, prLVT}, // Lo [27] HANGUL SYLLABLE SWEG..HANGUL SYLLABLE SWEH + {0xC26C, 0xC26C, prLV}, // Lo HANGUL SYLLABLE SWI + {0xC26D, 0xC287, prLVT}, // Lo [27] HANGUL SYLLABLE SWIG..HANGUL SYLLABLE SWIH + {0xC288, 0xC288, prLV}, // Lo HANGUL SYLLABLE SYU + {0xC289, 0xC2A3, prLVT}, // Lo [27] HANGUL SYLLABLE SYUG..HANGUL SYLLABLE SYUH + {0xC2A4, 0xC2A4, prLV}, // Lo HANGUL SYLLABLE SEU + {0xC2A5, 0xC2BF, prLVT}, // Lo [27] HANGUL SYLLABLE SEUG..HANGUL SYLLABLE SEUH + {0xC2C0, 0xC2C0, prLV}, // Lo HANGUL SYLLABLE SYI + {0xC2C1, 0xC2DB, prLVT}, // Lo [27] HANGUL SYLLABLE SYIG..HANGUL SYLLABLE SYIH + {0xC2DC, 0xC2DC, prLV}, // Lo HANGUL SYLLABLE SI + {0xC2DD, 0xC2F7, prLVT}, // Lo [27] HANGUL SYLLABLE SIG..HANGUL SYLLABLE SIH + {0xC2F8, 0xC2F8, prLV}, // Lo HANGUL SYLLABLE SSA + {0xC2F9, 0xC313, prLVT}, // Lo [27] HANGUL SYLLABLE SSAG..HANGUL SYLLABLE SSAH + {0xC314, 0xC314, prLV}, // Lo HANGUL SYLLABLE SSAE + {0xC315, 0xC32F, prLVT}, // Lo [27] HANGUL SYLLABLE SSAEG..HANGUL SYLLABLE SSAEH + {0xC330, 0xC330, prLV}, // Lo HANGUL SYLLABLE SSYA + {0xC331, 0xC34B, prLVT}, // Lo [27] HANGUL SYLLABLE SSYAG..HANGUL SYLLABLE SSYAH + {0xC34C, 0xC34C, prLV}, // Lo HANGUL SYLLABLE SSYAE + {0xC34D, 0xC367, prLVT}, // Lo [27] HANGUL SYLLABLE SSYAEG..HANGUL SYLLABLE SSYAEH + {0xC368, 0xC368, prLV}, // Lo HANGUL SYLLABLE SSEO + {0xC369, 0xC383, prLVT}, // Lo [27] HANGUL SYLLABLE SSEOG..HANGUL SYLLABLE SSEOH + {0xC384, 0xC384, prLV}, // Lo HANGUL SYLLABLE SSE + {0xC385, 0xC39F, prLVT}, // Lo [27] HANGUL SYLLABLE SSEG..HANGUL SYLLABLE SSEH + {0xC3A0, 0xC3A0, prLV}, // Lo HANGUL SYLLABLE SSYEO + {0xC3A1, 0xC3BB, prLVT}, // Lo [27] HANGUL SYLLABLE SSYEOG..HANGUL SYLLABLE SSYEOH + {0xC3BC, 0xC3BC, prLV}, // Lo HANGUL SYLLABLE SSYE + {0xC3BD, 0xC3D7, prLVT}, // Lo [27] HANGUL SYLLABLE SSYEG..HANGUL SYLLABLE SSYEH + {0xC3D8, 0xC3D8, prLV}, // Lo HANGUL SYLLABLE SSO + {0xC3D9, 0xC3F3, prLVT}, // Lo [27] HANGUL SYLLABLE SSOG..HANGUL SYLLABLE SSOH + {0xC3F4, 0xC3F4, prLV}, // Lo HANGUL SYLLABLE SSWA + {0xC3F5, 0xC40F, prLVT}, // Lo [27] HANGUL SYLLABLE SSWAG..HANGUL SYLLABLE SSWAH + {0xC410, 0xC410, prLV}, // Lo HANGUL SYLLABLE SSWAE + {0xC411, 0xC42B, prLVT}, // Lo [27] HANGUL SYLLABLE SSWAEG..HANGUL SYLLABLE SSWAEH + {0xC42C, 0xC42C, prLV}, // Lo HANGUL SYLLABLE SSOE + {0xC42D, 0xC447, prLVT}, // Lo [27] HANGUL SYLLABLE SSOEG..HANGUL SYLLABLE SSOEH + {0xC448, 0xC448, prLV}, // Lo HANGUL SYLLABLE SSYO + {0xC449, 0xC463, prLVT}, // Lo [27] HANGUL SYLLABLE SSYOG..HANGUL SYLLABLE SSYOH + {0xC464, 0xC464, prLV}, // Lo HANGUL SYLLABLE SSU + {0xC465, 0xC47F, prLVT}, // Lo [27] HANGUL SYLLABLE SSUG..HANGUL SYLLABLE SSUH + {0xC480, 0xC480, prLV}, // Lo HANGUL SYLLABLE SSWEO + {0xC481, 0xC49B, prLVT}, // Lo [27] HANGUL SYLLABLE SSWEOG..HANGUL SYLLABLE SSWEOH + {0xC49C, 0xC49C, prLV}, // Lo HANGUL SYLLABLE SSWE + {0xC49D, 0xC4B7, prLVT}, // Lo [27] HANGUL SYLLABLE SSWEG..HANGUL SYLLABLE SSWEH + {0xC4B8, 0xC4B8, prLV}, // Lo HANGUL SYLLABLE SSWI + {0xC4B9, 0xC4D3, prLVT}, // Lo [27] HANGUL SYLLABLE SSWIG..HANGUL SYLLABLE SSWIH + {0xC4D4, 0xC4D4, prLV}, // Lo HANGUL SYLLABLE SSYU + {0xC4D5, 0xC4EF, prLVT}, // Lo [27] HANGUL SYLLABLE SSYUG..HANGUL SYLLABLE SSYUH + {0xC4F0, 0xC4F0, prLV}, // Lo HANGUL SYLLABLE SSEU + {0xC4F1, 0xC50B, prLVT}, // Lo [27] HANGUL SYLLABLE SSEUG..HANGUL SYLLABLE SSEUH + {0xC50C, 0xC50C, prLV}, // Lo HANGUL SYLLABLE SSYI + {0xC50D, 0xC527, prLVT}, // Lo [27] HANGUL SYLLABLE SSYIG..HANGUL SYLLABLE SSYIH + {0xC528, 0xC528, prLV}, // Lo HANGUL SYLLABLE SSI + {0xC529, 0xC543, prLVT}, // Lo [27] HANGUL SYLLABLE SSIG..HANGUL SYLLABLE SSIH + {0xC544, 0xC544, prLV}, // Lo HANGUL SYLLABLE A + {0xC545, 0xC55F, prLVT}, // Lo [27] HANGUL SYLLABLE AG..HANGUL SYLLABLE AH + {0xC560, 0xC560, prLV}, // Lo HANGUL SYLLABLE AE + {0xC561, 0xC57B, prLVT}, // Lo [27] HANGUL SYLLABLE AEG..HANGUL SYLLABLE AEH + {0xC57C, 0xC57C, prLV}, // Lo HANGUL SYLLABLE YA + {0xC57D, 0xC597, prLVT}, // Lo [27] HANGUL SYLLABLE YAG..HANGUL SYLLABLE YAH + {0xC598, 0xC598, prLV}, // Lo HANGUL SYLLABLE YAE + {0xC599, 0xC5B3, prLVT}, // Lo [27] HANGUL SYLLABLE YAEG..HANGUL SYLLABLE YAEH + {0xC5B4, 0xC5B4, prLV}, // Lo HANGUL SYLLABLE EO + {0xC5B5, 0xC5CF, prLVT}, // Lo [27] HANGUL SYLLABLE EOG..HANGUL SYLLABLE EOH + {0xC5D0, 0xC5D0, prLV}, // Lo HANGUL SYLLABLE E + {0xC5D1, 0xC5EB, prLVT}, // Lo [27] HANGUL SYLLABLE EG..HANGUL SYLLABLE EH + {0xC5EC, 0xC5EC, prLV}, // Lo HANGUL SYLLABLE YEO + {0xC5ED, 0xC607, prLVT}, // Lo [27] HANGUL SYLLABLE YEOG..HANGUL SYLLABLE YEOH + {0xC608, 0xC608, prLV}, // Lo HANGUL SYLLABLE YE + {0xC609, 0xC623, prLVT}, // Lo [27] HANGUL SYLLABLE YEG..HANGUL SYLLABLE YEH + {0xC624, 0xC624, prLV}, // Lo HANGUL SYLLABLE O + {0xC625, 0xC63F, prLVT}, // Lo [27] HANGUL SYLLABLE OG..HANGUL SYLLABLE OH + {0xC640, 0xC640, prLV}, // Lo HANGUL SYLLABLE WA + {0xC641, 0xC65B, prLVT}, // Lo [27] HANGUL SYLLABLE WAG..HANGUL SYLLABLE WAH + {0xC65C, 0xC65C, prLV}, // Lo HANGUL SYLLABLE WAE + {0xC65D, 0xC677, prLVT}, // Lo [27] HANGUL SYLLABLE WAEG..HANGUL SYLLABLE WAEH + {0xC678, 0xC678, prLV}, // Lo HANGUL SYLLABLE OE + {0xC679, 0xC693, prLVT}, // Lo [27] HANGUL SYLLABLE OEG..HANGUL SYLLABLE OEH + {0xC694, 0xC694, prLV}, // Lo HANGUL SYLLABLE YO + {0xC695, 0xC6AF, prLVT}, // Lo [27] HANGUL SYLLABLE YOG..HANGUL SYLLABLE YOH + {0xC6B0, 0xC6B0, prLV}, // Lo HANGUL SYLLABLE U + {0xC6B1, 0xC6CB, prLVT}, // Lo [27] HANGUL SYLLABLE UG..HANGUL SYLLABLE UH + {0xC6CC, 0xC6CC, prLV}, // Lo HANGUL SYLLABLE WEO + {0xC6CD, 0xC6E7, prLVT}, // Lo [27] HANGUL SYLLABLE WEOG..HANGUL SYLLABLE WEOH + {0xC6E8, 0xC6E8, prLV}, // Lo HANGUL SYLLABLE WE + {0xC6E9, 0xC703, prLVT}, // Lo [27] HANGUL SYLLABLE WEG..HANGUL SYLLABLE WEH + {0xC704, 0xC704, prLV}, // Lo HANGUL SYLLABLE WI + {0xC705, 0xC71F, prLVT}, // Lo [27] HANGUL SYLLABLE WIG..HANGUL SYLLABLE WIH + {0xC720, 0xC720, prLV}, // Lo HANGUL SYLLABLE YU + {0xC721, 0xC73B, prLVT}, // Lo [27] HANGUL SYLLABLE YUG..HANGUL SYLLABLE YUH + {0xC73C, 0xC73C, prLV}, // Lo HANGUL SYLLABLE EU + {0xC73D, 0xC757, prLVT}, // Lo [27] HANGUL SYLLABLE EUG..HANGUL SYLLABLE EUH + {0xC758, 0xC758, prLV}, // Lo HANGUL SYLLABLE YI + {0xC759, 0xC773, prLVT}, // Lo [27] HANGUL SYLLABLE YIG..HANGUL SYLLABLE YIH + {0xC774, 0xC774, prLV}, // Lo HANGUL SYLLABLE I + {0xC775, 0xC78F, prLVT}, // Lo [27] HANGUL SYLLABLE IG..HANGUL SYLLABLE IH + {0xC790, 0xC790, prLV}, // Lo HANGUL SYLLABLE JA + {0xC791, 0xC7AB, prLVT}, // Lo [27] HANGUL SYLLABLE JAG..HANGUL SYLLABLE JAH + {0xC7AC, 0xC7AC, prLV}, // Lo HANGUL SYLLABLE JAE + {0xC7AD, 0xC7C7, prLVT}, // Lo [27] HANGUL SYLLABLE JAEG..HANGUL SYLLABLE JAEH + {0xC7C8, 0xC7C8, prLV}, // Lo HANGUL SYLLABLE JYA + {0xC7C9, 0xC7E3, prLVT}, // Lo [27] HANGUL SYLLABLE JYAG..HANGUL SYLLABLE JYAH + {0xC7E4, 0xC7E4, prLV}, // Lo HANGUL SYLLABLE JYAE + {0xC7E5, 0xC7FF, prLVT}, // Lo [27] HANGUL SYLLABLE JYAEG..HANGUL SYLLABLE JYAEH + {0xC800, 0xC800, prLV}, // Lo HANGUL SYLLABLE JEO + {0xC801, 0xC81B, prLVT}, // Lo [27] HANGUL SYLLABLE JEOG..HANGUL SYLLABLE JEOH + {0xC81C, 0xC81C, prLV}, // Lo HANGUL SYLLABLE JE + {0xC81D, 0xC837, prLVT}, // Lo [27] HANGUL SYLLABLE JEG..HANGUL SYLLABLE JEH + {0xC838, 0xC838, prLV}, // Lo HANGUL SYLLABLE JYEO + {0xC839, 0xC853, prLVT}, // Lo [27] HANGUL SYLLABLE JYEOG..HANGUL SYLLABLE JYEOH + {0xC854, 0xC854, prLV}, // Lo HANGUL SYLLABLE JYE + {0xC855, 0xC86F, prLVT}, // Lo [27] HANGUL SYLLABLE JYEG..HANGUL SYLLABLE JYEH + {0xC870, 0xC870, prLV}, // Lo HANGUL SYLLABLE JO + {0xC871, 0xC88B, prLVT}, // Lo [27] HANGUL SYLLABLE JOG..HANGUL SYLLABLE JOH + {0xC88C, 0xC88C, prLV}, // Lo HANGUL SYLLABLE JWA + {0xC88D, 0xC8A7, prLVT}, // Lo [27] HANGUL SYLLABLE JWAG..HANGUL SYLLABLE JWAH + {0xC8A8, 0xC8A8, prLV}, // Lo HANGUL SYLLABLE JWAE + {0xC8A9, 0xC8C3, prLVT}, // Lo [27] HANGUL SYLLABLE JWAEG..HANGUL SYLLABLE JWAEH + {0xC8C4, 0xC8C4, prLV}, // Lo HANGUL SYLLABLE JOE + {0xC8C5, 0xC8DF, prLVT}, // Lo [27] HANGUL SYLLABLE JOEG..HANGUL SYLLABLE JOEH + {0xC8E0, 0xC8E0, prLV}, // Lo HANGUL SYLLABLE JYO + {0xC8E1, 0xC8FB, prLVT}, // Lo [27] HANGUL SYLLABLE JYOG..HANGUL SYLLABLE JYOH + {0xC8FC, 0xC8FC, prLV}, // Lo HANGUL SYLLABLE JU + {0xC8FD, 0xC917, prLVT}, // Lo [27] HANGUL SYLLABLE JUG..HANGUL SYLLABLE JUH + {0xC918, 0xC918, prLV}, // Lo HANGUL SYLLABLE JWEO + {0xC919, 0xC933, prLVT}, // Lo [27] HANGUL SYLLABLE JWEOG..HANGUL SYLLABLE JWEOH + {0xC934, 0xC934, prLV}, // Lo HANGUL SYLLABLE JWE + {0xC935, 0xC94F, prLVT}, // Lo [27] HANGUL SYLLABLE JWEG..HANGUL SYLLABLE JWEH + {0xC950, 0xC950, prLV}, // Lo HANGUL SYLLABLE JWI + {0xC951, 0xC96B, prLVT}, // Lo [27] HANGUL SYLLABLE JWIG..HANGUL SYLLABLE JWIH + {0xC96C, 0xC96C, prLV}, // Lo HANGUL SYLLABLE JYU + {0xC96D, 0xC987, prLVT}, // Lo [27] HANGUL SYLLABLE JYUG..HANGUL SYLLABLE JYUH + {0xC988, 0xC988, prLV}, // Lo HANGUL SYLLABLE JEU + {0xC989, 0xC9A3, prLVT}, // Lo [27] HANGUL SYLLABLE JEUG..HANGUL SYLLABLE JEUH + {0xC9A4, 0xC9A4, prLV}, // Lo HANGUL SYLLABLE JYI + {0xC9A5, 0xC9BF, prLVT}, // Lo [27] HANGUL SYLLABLE JYIG..HANGUL SYLLABLE JYIH + {0xC9C0, 0xC9C0, prLV}, // Lo HANGUL SYLLABLE JI + {0xC9C1, 0xC9DB, prLVT}, // Lo [27] HANGUL SYLLABLE JIG..HANGUL SYLLABLE JIH + {0xC9DC, 0xC9DC, prLV}, // Lo HANGUL SYLLABLE JJA + {0xC9DD, 0xC9F7, prLVT}, // Lo [27] HANGUL SYLLABLE JJAG..HANGUL SYLLABLE JJAH + {0xC9F8, 0xC9F8, prLV}, // Lo HANGUL SYLLABLE JJAE + {0xC9F9, 0xCA13, prLVT}, // Lo [27] HANGUL SYLLABLE JJAEG..HANGUL SYLLABLE JJAEH + {0xCA14, 0xCA14, prLV}, // Lo HANGUL SYLLABLE JJYA + {0xCA15, 0xCA2F, prLVT}, // Lo [27] HANGUL SYLLABLE JJYAG..HANGUL SYLLABLE JJYAH + {0xCA30, 0xCA30, prLV}, // Lo HANGUL SYLLABLE JJYAE + {0xCA31, 0xCA4B, prLVT}, // Lo [27] HANGUL SYLLABLE JJYAEG..HANGUL SYLLABLE JJYAEH + {0xCA4C, 0xCA4C, prLV}, // Lo HANGUL SYLLABLE JJEO + {0xCA4D, 0xCA67, prLVT}, // Lo [27] HANGUL SYLLABLE JJEOG..HANGUL SYLLABLE JJEOH + {0xCA68, 0xCA68, prLV}, // Lo HANGUL SYLLABLE JJE + {0xCA69, 0xCA83, prLVT}, // Lo [27] HANGUL SYLLABLE JJEG..HANGUL SYLLABLE JJEH + {0xCA84, 0xCA84, prLV}, // Lo HANGUL SYLLABLE JJYEO + {0xCA85, 0xCA9F, prLVT}, // Lo [27] HANGUL SYLLABLE JJYEOG..HANGUL SYLLABLE JJYEOH + {0xCAA0, 0xCAA0, prLV}, // Lo HANGUL SYLLABLE JJYE + {0xCAA1, 0xCABB, prLVT}, // Lo [27] HANGUL SYLLABLE JJYEG..HANGUL SYLLABLE JJYEH + {0xCABC, 0xCABC, prLV}, // Lo HANGUL SYLLABLE JJO + {0xCABD, 0xCAD7, prLVT}, // Lo [27] HANGUL SYLLABLE JJOG..HANGUL SYLLABLE JJOH + {0xCAD8, 0xCAD8, prLV}, // Lo HANGUL SYLLABLE JJWA + {0xCAD9, 0xCAF3, prLVT}, // Lo [27] HANGUL SYLLABLE JJWAG..HANGUL SYLLABLE JJWAH + {0xCAF4, 0xCAF4, prLV}, // Lo HANGUL SYLLABLE JJWAE + {0xCAF5, 0xCB0F, prLVT}, // Lo [27] HANGUL SYLLABLE JJWAEG..HANGUL SYLLABLE JJWAEH + {0xCB10, 0xCB10, prLV}, // Lo HANGUL SYLLABLE JJOE + {0xCB11, 0xCB2B, prLVT}, // Lo [27] HANGUL SYLLABLE JJOEG..HANGUL SYLLABLE JJOEH + {0xCB2C, 0xCB2C, prLV}, // Lo HANGUL SYLLABLE JJYO + {0xCB2D, 0xCB47, prLVT}, // Lo [27] HANGUL SYLLABLE JJYOG..HANGUL SYLLABLE JJYOH + {0xCB48, 0xCB48, prLV}, // Lo HANGUL SYLLABLE JJU + {0xCB49, 0xCB63, prLVT}, // Lo [27] HANGUL SYLLABLE JJUG..HANGUL SYLLABLE JJUH + {0xCB64, 0xCB64, prLV}, // Lo HANGUL SYLLABLE JJWEO + {0xCB65, 0xCB7F, prLVT}, // Lo [27] HANGUL SYLLABLE JJWEOG..HANGUL SYLLABLE JJWEOH + {0xCB80, 0xCB80, prLV}, // Lo HANGUL SYLLABLE JJWE + {0xCB81, 0xCB9B, prLVT}, // Lo [27] HANGUL SYLLABLE JJWEG..HANGUL SYLLABLE JJWEH + {0xCB9C, 0xCB9C, prLV}, // Lo HANGUL SYLLABLE JJWI + {0xCB9D, 0xCBB7, prLVT}, // Lo [27] HANGUL SYLLABLE JJWIG..HANGUL SYLLABLE JJWIH + {0xCBB8, 0xCBB8, prLV}, // Lo HANGUL SYLLABLE JJYU + {0xCBB9, 0xCBD3, prLVT}, // Lo [27] HANGUL SYLLABLE JJYUG..HANGUL SYLLABLE JJYUH + {0xCBD4, 0xCBD4, prLV}, // Lo HANGUL SYLLABLE JJEU + {0xCBD5, 0xCBEF, prLVT}, // Lo [27] HANGUL SYLLABLE JJEUG..HANGUL SYLLABLE JJEUH + {0xCBF0, 0xCBF0, prLV}, // Lo HANGUL SYLLABLE JJYI + {0xCBF1, 0xCC0B, prLVT}, // Lo [27] HANGUL SYLLABLE JJYIG..HANGUL SYLLABLE JJYIH + {0xCC0C, 0xCC0C, prLV}, // Lo HANGUL SYLLABLE JJI + {0xCC0D, 0xCC27, prLVT}, // Lo [27] HANGUL SYLLABLE JJIG..HANGUL SYLLABLE JJIH + {0xCC28, 0xCC28, prLV}, // Lo HANGUL SYLLABLE CA + {0xCC29, 0xCC43, prLVT}, // Lo [27] HANGUL SYLLABLE CAG..HANGUL SYLLABLE CAH + {0xCC44, 0xCC44, prLV}, // Lo HANGUL SYLLABLE CAE + {0xCC45, 0xCC5F, prLVT}, // Lo [27] HANGUL SYLLABLE CAEG..HANGUL SYLLABLE CAEH + {0xCC60, 0xCC60, prLV}, // Lo HANGUL SYLLABLE CYA + {0xCC61, 0xCC7B, prLVT}, // Lo [27] HANGUL SYLLABLE CYAG..HANGUL SYLLABLE CYAH + {0xCC7C, 0xCC7C, prLV}, // Lo HANGUL SYLLABLE CYAE + {0xCC7D, 0xCC97, prLVT}, // Lo [27] HANGUL SYLLABLE CYAEG..HANGUL SYLLABLE CYAEH + {0xCC98, 0xCC98, prLV}, // Lo HANGUL SYLLABLE CEO + {0xCC99, 0xCCB3, prLVT}, // Lo [27] HANGUL SYLLABLE CEOG..HANGUL SYLLABLE CEOH + {0xCCB4, 0xCCB4, prLV}, // Lo HANGUL SYLLABLE CE + {0xCCB5, 0xCCCF, prLVT}, // Lo [27] HANGUL SYLLABLE CEG..HANGUL SYLLABLE CEH + {0xCCD0, 0xCCD0, prLV}, // Lo HANGUL SYLLABLE CYEO + {0xCCD1, 0xCCEB, prLVT}, // Lo [27] HANGUL SYLLABLE CYEOG..HANGUL SYLLABLE CYEOH + {0xCCEC, 0xCCEC, prLV}, // Lo HANGUL SYLLABLE CYE + {0xCCED, 0xCD07, prLVT}, // Lo [27] HANGUL SYLLABLE CYEG..HANGUL SYLLABLE CYEH + {0xCD08, 0xCD08, prLV}, // Lo HANGUL SYLLABLE CO + {0xCD09, 0xCD23, prLVT}, // Lo [27] HANGUL SYLLABLE COG..HANGUL SYLLABLE COH + {0xCD24, 0xCD24, prLV}, // Lo HANGUL SYLLABLE CWA + {0xCD25, 0xCD3F, prLVT}, // Lo [27] HANGUL SYLLABLE CWAG..HANGUL SYLLABLE CWAH + {0xCD40, 0xCD40, prLV}, // Lo HANGUL SYLLABLE CWAE + {0xCD41, 0xCD5B, prLVT}, // Lo [27] HANGUL SYLLABLE CWAEG..HANGUL SYLLABLE CWAEH + {0xCD5C, 0xCD5C, prLV}, // Lo HANGUL SYLLABLE COE + {0xCD5D, 0xCD77, prLVT}, // Lo [27] HANGUL SYLLABLE COEG..HANGUL SYLLABLE COEH + {0xCD78, 0xCD78, prLV}, // Lo HANGUL SYLLABLE CYO + {0xCD79, 0xCD93, prLVT}, // Lo [27] HANGUL SYLLABLE CYOG..HANGUL SYLLABLE CYOH + {0xCD94, 0xCD94, prLV}, // Lo HANGUL SYLLABLE CU + {0xCD95, 0xCDAF, prLVT}, // Lo [27] HANGUL SYLLABLE CUG..HANGUL SYLLABLE CUH + {0xCDB0, 0xCDB0, prLV}, // Lo HANGUL SYLLABLE CWEO + {0xCDB1, 0xCDCB, prLVT}, // Lo [27] HANGUL SYLLABLE CWEOG..HANGUL SYLLABLE CWEOH + {0xCDCC, 0xCDCC, prLV}, // Lo HANGUL SYLLABLE CWE + {0xCDCD, 0xCDE7, prLVT}, // Lo [27] HANGUL SYLLABLE CWEG..HANGUL SYLLABLE CWEH + {0xCDE8, 0xCDE8, prLV}, // Lo HANGUL SYLLABLE CWI + {0xCDE9, 0xCE03, prLVT}, // Lo [27] HANGUL SYLLABLE CWIG..HANGUL SYLLABLE CWIH + {0xCE04, 0xCE04, prLV}, // Lo HANGUL SYLLABLE CYU + {0xCE05, 0xCE1F, prLVT}, // Lo [27] HANGUL SYLLABLE CYUG..HANGUL SYLLABLE CYUH + {0xCE20, 0xCE20, prLV}, // Lo HANGUL SYLLABLE CEU + {0xCE21, 0xCE3B, prLVT}, // Lo [27] HANGUL SYLLABLE CEUG..HANGUL SYLLABLE CEUH + {0xCE3C, 0xCE3C, prLV}, // Lo HANGUL SYLLABLE CYI + {0xCE3D, 0xCE57, prLVT}, // Lo [27] HANGUL SYLLABLE CYIG..HANGUL SYLLABLE CYIH + {0xCE58, 0xCE58, prLV}, // Lo HANGUL SYLLABLE CI + {0xCE59, 0xCE73, prLVT}, // Lo [27] HANGUL SYLLABLE CIG..HANGUL SYLLABLE CIH + {0xCE74, 0xCE74, prLV}, // Lo HANGUL SYLLABLE KA + {0xCE75, 0xCE8F, prLVT}, // Lo [27] HANGUL SYLLABLE KAG..HANGUL SYLLABLE KAH + {0xCE90, 0xCE90, prLV}, // Lo HANGUL SYLLABLE KAE + {0xCE91, 0xCEAB, prLVT}, // Lo [27] HANGUL SYLLABLE KAEG..HANGUL SYLLABLE KAEH + {0xCEAC, 0xCEAC, prLV}, // Lo HANGUL SYLLABLE KYA + {0xCEAD, 0xCEC7, prLVT}, // Lo [27] HANGUL SYLLABLE KYAG..HANGUL SYLLABLE KYAH + {0xCEC8, 0xCEC8, prLV}, // Lo HANGUL SYLLABLE KYAE + {0xCEC9, 0xCEE3, prLVT}, // Lo [27] HANGUL SYLLABLE KYAEG..HANGUL SYLLABLE KYAEH + {0xCEE4, 0xCEE4, prLV}, // Lo HANGUL SYLLABLE KEO + {0xCEE5, 0xCEFF, prLVT}, // Lo [27] HANGUL SYLLABLE KEOG..HANGUL SYLLABLE KEOH + {0xCF00, 0xCF00, prLV}, // Lo HANGUL SYLLABLE KE + {0xCF01, 0xCF1B, prLVT}, // Lo [27] HANGUL SYLLABLE KEG..HANGUL SYLLABLE KEH + {0xCF1C, 0xCF1C, prLV}, // Lo HANGUL SYLLABLE KYEO + {0xCF1D, 0xCF37, prLVT}, // Lo [27] HANGUL SYLLABLE KYEOG..HANGUL SYLLABLE KYEOH + {0xCF38, 0xCF38, prLV}, // Lo HANGUL SYLLABLE KYE + {0xCF39, 0xCF53, prLVT}, // Lo [27] HANGUL SYLLABLE KYEG..HANGUL SYLLABLE KYEH + {0xCF54, 0xCF54, prLV}, // Lo HANGUL SYLLABLE KO + {0xCF55, 0xCF6F, prLVT}, // Lo [27] HANGUL SYLLABLE KOG..HANGUL SYLLABLE KOH + {0xCF70, 0xCF70, prLV}, // Lo HANGUL SYLLABLE KWA + {0xCF71, 0xCF8B, prLVT}, // Lo [27] HANGUL SYLLABLE KWAG..HANGUL SYLLABLE KWAH + {0xCF8C, 0xCF8C, prLV}, // Lo HANGUL SYLLABLE KWAE + {0xCF8D, 0xCFA7, prLVT}, // Lo [27] HANGUL SYLLABLE KWAEG..HANGUL SYLLABLE KWAEH + {0xCFA8, 0xCFA8, prLV}, // Lo HANGUL SYLLABLE KOE + {0xCFA9, 0xCFC3, prLVT}, // Lo [27] HANGUL SYLLABLE KOEG..HANGUL SYLLABLE KOEH + {0xCFC4, 0xCFC4, prLV}, // Lo HANGUL SYLLABLE KYO + {0xCFC5, 0xCFDF, prLVT}, // Lo [27] HANGUL SYLLABLE KYOG..HANGUL SYLLABLE KYOH + {0xCFE0, 0xCFE0, prLV}, // Lo HANGUL SYLLABLE KU + {0xCFE1, 0xCFFB, prLVT}, // Lo [27] HANGUL SYLLABLE KUG..HANGUL SYLLABLE KUH + {0xCFFC, 0xCFFC, prLV}, // Lo HANGUL SYLLABLE KWEO + {0xCFFD, 0xD017, prLVT}, // Lo [27] HANGUL SYLLABLE KWEOG..HANGUL SYLLABLE KWEOH + {0xD018, 0xD018, prLV}, // Lo HANGUL SYLLABLE KWE + {0xD019, 0xD033, prLVT}, // Lo [27] HANGUL SYLLABLE KWEG..HANGUL SYLLABLE KWEH + {0xD034, 0xD034, prLV}, // Lo HANGUL SYLLABLE KWI + {0xD035, 0xD04F, prLVT}, // Lo [27] HANGUL SYLLABLE KWIG..HANGUL SYLLABLE KWIH + {0xD050, 0xD050, prLV}, // Lo HANGUL SYLLABLE KYU + {0xD051, 0xD06B, prLVT}, // Lo [27] HANGUL SYLLABLE KYUG..HANGUL SYLLABLE KYUH + {0xD06C, 0xD06C, prLV}, // Lo HANGUL SYLLABLE KEU + {0xD06D, 0xD087, prLVT}, // Lo [27] HANGUL SYLLABLE KEUG..HANGUL SYLLABLE KEUH + {0xD088, 0xD088, prLV}, // Lo HANGUL SYLLABLE KYI + {0xD089, 0xD0A3, prLVT}, // Lo [27] HANGUL SYLLABLE KYIG..HANGUL SYLLABLE KYIH + {0xD0A4, 0xD0A4, prLV}, // Lo HANGUL SYLLABLE KI + {0xD0A5, 0xD0BF, prLVT}, // Lo [27] HANGUL SYLLABLE KIG..HANGUL SYLLABLE KIH + {0xD0C0, 0xD0C0, prLV}, // Lo HANGUL SYLLABLE TA + {0xD0C1, 0xD0DB, prLVT}, // Lo [27] HANGUL SYLLABLE TAG..HANGUL SYLLABLE TAH + {0xD0DC, 0xD0DC, prLV}, // Lo HANGUL SYLLABLE TAE + {0xD0DD, 0xD0F7, prLVT}, // Lo [27] HANGUL SYLLABLE TAEG..HANGUL SYLLABLE TAEH + {0xD0F8, 0xD0F8, prLV}, // Lo HANGUL SYLLABLE TYA + {0xD0F9, 0xD113, prLVT}, // Lo [27] HANGUL SYLLABLE TYAG..HANGUL SYLLABLE TYAH + {0xD114, 0xD114, prLV}, // Lo HANGUL SYLLABLE TYAE + {0xD115, 0xD12F, prLVT}, // Lo [27] HANGUL SYLLABLE TYAEG..HANGUL SYLLABLE TYAEH + {0xD130, 0xD130, prLV}, // Lo HANGUL SYLLABLE TEO + {0xD131, 0xD14B, prLVT}, // Lo [27] HANGUL SYLLABLE TEOG..HANGUL SYLLABLE TEOH + {0xD14C, 0xD14C, prLV}, // Lo HANGUL SYLLABLE TE + {0xD14D, 0xD167, prLVT}, // Lo [27] HANGUL SYLLABLE TEG..HANGUL SYLLABLE TEH + {0xD168, 0xD168, prLV}, // Lo HANGUL SYLLABLE TYEO + {0xD169, 0xD183, prLVT}, // Lo [27] HANGUL SYLLABLE TYEOG..HANGUL SYLLABLE TYEOH + {0xD184, 0xD184, prLV}, // Lo HANGUL SYLLABLE TYE + {0xD185, 0xD19F, prLVT}, // Lo [27] HANGUL SYLLABLE TYEG..HANGUL SYLLABLE TYEH + {0xD1A0, 0xD1A0, prLV}, // Lo HANGUL SYLLABLE TO + {0xD1A1, 0xD1BB, prLVT}, // Lo [27] HANGUL SYLLABLE TOG..HANGUL SYLLABLE TOH + {0xD1BC, 0xD1BC, prLV}, // Lo HANGUL SYLLABLE TWA + {0xD1BD, 0xD1D7, prLVT}, // Lo [27] HANGUL SYLLABLE TWAG..HANGUL SYLLABLE TWAH + {0xD1D8, 0xD1D8, prLV}, // Lo HANGUL SYLLABLE TWAE + {0xD1D9, 0xD1F3, prLVT}, // Lo [27] HANGUL SYLLABLE TWAEG..HANGUL SYLLABLE TWAEH + {0xD1F4, 0xD1F4, prLV}, // Lo HANGUL SYLLABLE TOE + {0xD1F5, 0xD20F, prLVT}, // Lo [27] HANGUL SYLLABLE TOEG..HANGUL SYLLABLE TOEH + {0xD210, 0xD210, prLV}, // Lo HANGUL SYLLABLE TYO + {0xD211, 0xD22B, prLVT}, // Lo [27] HANGUL SYLLABLE TYOG..HANGUL SYLLABLE TYOH + {0xD22C, 0xD22C, prLV}, // Lo HANGUL SYLLABLE TU + {0xD22D, 0xD247, prLVT}, // Lo [27] HANGUL SYLLABLE TUG..HANGUL SYLLABLE TUH + {0xD248, 0xD248, prLV}, // Lo HANGUL SYLLABLE TWEO + {0xD249, 0xD263, prLVT}, // Lo [27] HANGUL SYLLABLE TWEOG..HANGUL SYLLABLE TWEOH + {0xD264, 0xD264, prLV}, // Lo HANGUL SYLLABLE TWE + {0xD265, 0xD27F, prLVT}, // Lo [27] HANGUL SYLLABLE TWEG..HANGUL SYLLABLE TWEH + {0xD280, 0xD280, prLV}, // Lo HANGUL SYLLABLE TWI + {0xD281, 0xD29B, prLVT}, // Lo [27] HANGUL SYLLABLE TWIG..HANGUL SYLLABLE TWIH + {0xD29C, 0xD29C, prLV}, // Lo HANGUL SYLLABLE TYU + {0xD29D, 0xD2B7, prLVT}, // Lo [27] HANGUL SYLLABLE TYUG..HANGUL SYLLABLE TYUH + {0xD2B8, 0xD2B8, prLV}, // Lo HANGUL SYLLABLE TEU + {0xD2B9, 0xD2D3, prLVT}, // Lo [27] HANGUL SYLLABLE TEUG..HANGUL SYLLABLE TEUH + {0xD2D4, 0xD2D4, prLV}, // Lo HANGUL SYLLABLE TYI + {0xD2D5, 0xD2EF, prLVT}, // Lo [27] HANGUL SYLLABLE TYIG..HANGUL SYLLABLE TYIH + {0xD2F0, 0xD2F0, prLV}, // Lo HANGUL SYLLABLE TI + {0xD2F1, 0xD30B, prLVT}, // Lo [27] HANGUL SYLLABLE TIG..HANGUL SYLLABLE TIH + {0xD30C, 0xD30C, prLV}, // Lo HANGUL SYLLABLE PA + {0xD30D, 0xD327, prLVT}, // Lo [27] HANGUL SYLLABLE PAG..HANGUL SYLLABLE PAH + {0xD328, 0xD328, prLV}, // Lo HANGUL SYLLABLE PAE + {0xD329, 0xD343, prLVT}, // Lo [27] HANGUL SYLLABLE PAEG..HANGUL SYLLABLE PAEH + {0xD344, 0xD344, prLV}, // Lo HANGUL SYLLABLE PYA + {0xD345, 0xD35F, prLVT}, // Lo [27] HANGUL SYLLABLE PYAG..HANGUL SYLLABLE PYAH + {0xD360, 0xD360, prLV}, // Lo HANGUL SYLLABLE PYAE + {0xD361, 0xD37B, prLVT}, // Lo [27] HANGUL SYLLABLE PYAEG..HANGUL SYLLABLE PYAEH + {0xD37C, 0xD37C, prLV}, // Lo HANGUL SYLLABLE PEO + {0xD37D, 0xD397, prLVT}, // Lo [27] HANGUL SYLLABLE PEOG..HANGUL SYLLABLE PEOH + {0xD398, 0xD398, prLV}, // Lo HANGUL SYLLABLE PE + {0xD399, 0xD3B3, prLVT}, // Lo [27] HANGUL SYLLABLE PEG..HANGUL SYLLABLE PEH + {0xD3B4, 0xD3B4, prLV}, // Lo HANGUL SYLLABLE PYEO + {0xD3B5, 0xD3CF, prLVT}, // Lo [27] HANGUL SYLLABLE PYEOG..HANGUL SYLLABLE PYEOH + {0xD3D0, 0xD3D0, prLV}, // Lo HANGUL SYLLABLE PYE + {0xD3D1, 0xD3EB, prLVT}, // Lo [27] HANGUL SYLLABLE PYEG..HANGUL SYLLABLE PYEH + {0xD3EC, 0xD3EC, prLV}, // Lo HANGUL SYLLABLE PO + {0xD3ED, 0xD407, prLVT}, // Lo [27] HANGUL SYLLABLE POG..HANGUL SYLLABLE POH + {0xD408, 0xD408, prLV}, // Lo HANGUL SYLLABLE PWA + {0xD409, 0xD423, prLVT}, // Lo [27] HANGUL SYLLABLE PWAG..HANGUL SYLLABLE PWAH + {0xD424, 0xD424, prLV}, // Lo HANGUL SYLLABLE PWAE + {0xD425, 0xD43F, prLVT}, // Lo [27] HANGUL SYLLABLE PWAEG..HANGUL SYLLABLE PWAEH + {0xD440, 0xD440, prLV}, // Lo HANGUL SYLLABLE POE + {0xD441, 0xD45B, prLVT}, // Lo [27] HANGUL SYLLABLE POEG..HANGUL SYLLABLE POEH + {0xD45C, 0xD45C, prLV}, // Lo HANGUL SYLLABLE PYO + {0xD45D, 0xD477, prLVT}, // Lo [27] HANGUL SYLLABLE PYOG..HANGUL SYLLABLE PYOH + {0xD478, 0xD478, prLV}, // Lo HANGUL SYLLABLE PU + {0xD479, 0xD493, prLVT}, // Lo [27] HANGUL SYLLABLE PUG..HANGUL SYLLABLE PUH + {0xD494, 0xD494, prLV}, // Lo HANGUL SYLLABLE PWEO + {0xD495, 0xD4AF, prLVT}, // Lo [27] HANGUL SYLLABLE PWEOG..HANGUL SYLLABLE PWEOH + {0xD4B0, 0xD4B0, prLV}, // Lo HANGUL SYLLABLE PWE + {0xD4B1, 0xD4CB, prLVT}, // Lo [27] HANGUL SYLLABLE PWEG..HANGUL SYLLABLE PWEH + {0xD4CC, 0xD4CC, prLV}, // Lo HANGUL SYLLABLE PWI + {0xD4CD, 0xD4E7, prLVT}, // Lo [27] HANGUL SYLLABLE PWIG..HANGUL SYLLABLE PWIH + {0xD4E8, 0xD4E8, prLV}, // Lo HANGUL SYLLABLE PYU + {0xD4E9, 0xD503, prLVT}, // Lo [27] HANGUL SYLLABLE PYUG..HANGUL SYLLABLE PYUH + {0xD504, 0xD504, prLV}, // Lo HANGUL SYLLABLE PEU + {0xD505, 0xD51F, prLVT}, // Lo [27] HANGUL SYLLABLE PEUG..HANGUL SYLLABLE PEUH + {0xD520, 0xD520, prLV}, // Lo HANGUL SYLLABLE PYI + {0xD521, 0xD53B, prLVT}, // Lo [27] HANGUL SYLLABLE PYIG..HANGUL SYLLABLE PYIH + {0xD53C, 0xD53C, prLV}, // Lo HANGUL SYLLABLE PI + {0xD53D, 0xD557, prLVT}, // Lo [27] HANGUL SYLLABLE PIG..HANGUL SYLLABLE PIH + {0xD558, 0xD558, prLV}, // Lo HANGUL SYLLABLE HA + {0xD559, 0xD573, prLVT}, // Lo [27] HANGUL SYLLABLE HAG..HANGUL SYLLABLE HAH + {0xD574, 0xD574, prLV}, // Lo HANGUL SYLLABLE HAE + {0xD575, 0xD58F, prLVT}, // Lo [27] HANGUL SYLLABLE HAEG..HANGUL SYLLABLE HAEH + {0xD590, 0xD590, prLV}, // Lo HANGUL SYLLABLE HYA + {0xD591, 0xD5AB, prLVT}, // Lo [27] HANGUL SYLLABLE HYAG..HANGUL SYLLABLE HYAH + {0xD5AC, 0xD5AC, prLV}, // Lo HANGUL SYLLABLE HYAE + {0xD5AD, 0xD5C7, prLVT}, // Lo [27] HANGUL SYLLABLE HYAEG..HANGUL SYLLABLE HYAEH + {0xD5C8, 0xD5C8, prLV}, // Lo HANGUL SYLLABLE HEO + {0xD5C9, 0xD5E3, prLVT}, // Lo [27] HANGUL SYLLABLE HEOG..HANGUL SYLLABLE HEOH + {0xD5E4, 0xD5E4, prLV}, // Lo HANGUL SYLLABLE HE + {0xD5E5, 0xD5FF, prLVT}, // Lo [27] HANGUL SYLLABLE HEG..HANGUL SYLLABLE HEH + {0xD600, 0xD600, prLV}, // Lo HANGUL SYLLABLE HYEO + {0xD601, 0xD61B, prLVT}, // Lo [27] HANGUL SYLLABLE HYEOG..HANGUL SYLLABLE HYEOH + {0xD61C, 0xD61C, prLV}, // Lo HANGUL SYLLABLE HYE + {0xD61D, 0xD637, prLVT}, // Lo [27] HANGUL SYLLABLE HYEG..HANGUL SYLLABLE HYEH + {0xD638, 0xD638, prLV}, // Lo HANGUL SYLLABLE HO + {0xD639, 0xD653, prLVT}, // Lo [27] HANGUL SYLLABLE HOG..HANGUL SYLLABLE HOH + {0xD654, 0xD654, prLV}, // Lo HANGUL SYLLABLE HWA + {0xD655, 0xD66F, prLVT}, // Lo [27] HANGUL SYLLABLE HWAG..HANGUL SYLLABLE HWAH + {0xD670, 0xD670, prLV}, // Lo HANGUL SYLLABLE HWAE + {0xD671, 0xD68B, prLVT}, // Lo [27] HANGUL SYLLABLE HWAEG..HANGUL SYLLABLE HWAEH + {0xD68C, 0xD68C, prLV}, // Lo HANGUL SYLLABLE HOE + {0xD68D, 0xD6A7, prLVT}, // Lo [27] HANGUL SYLLABLE HOEG..HANGUL SYLLABLE HOEH + {0xD6A8, 0xD6A8, prLV}, // Lo HANGUL SYLLABLE HYO + {0xD6A9, 0xD6C3, prLVT}, // Lo [27] HANGUL SYLLABLE HYOG..HANGUL SYLLABLE HYOH + {0xD6C4, 0xD6C4, prLV}, // Lo HANGUL SYLLABLE HU + {0xD6C5, 0xD6DF, prLVT}, // Lo [27] HANGUL SYLLABLE HUG..HANGUL SYLLABLE HUH + {0xD6E0, 0xD6E0, prLV}, // Lo HANGUL SYLLABLE HWEO + {0xD6E1, 0xD6FB, prLVT}, // Lo [27] HANGUL SYLLABLE HWEOG..HANGUL SYLLABLE HWEOH + {0xD6FC, 0xD6FC, prLV}, // Lo HANGUL SYLLABLE HWE + {0xD6FD, 0xD717, prLVT}, // Lo [27] HANGUL SYLLABLE HWEG..HANGUL SYLLABLE HWEH + {0xD718, 0xD718, prLV}, // Lo HANGUL SYLLABLE HWI + {0xD719, 0xD733, prLVT}, // Lo [27] HANGUL SYLLABLE HWIG..HANGUL SYLLABLE HWIH + {0xD734, 0xD734, prLV}, // Lo HANGUL SYLLABLE HYU + {0xD735, 0xD74F, prLVT}, // Lo [27] HANGUL SYLLABLE HYUG..HANGUL SYLLABLE HYUH + {0xD750, 0xD750, prLV}, // Lo HANGUL SYLLABLE HEU + {0xD751, 0xD76B, prLVT}, // Lo [27] HANGUL SYLLABLE HEUG..HANGUL SYLLABLE HEUH + {0xD76C, 0xD76C, prLV}, // Lo HANGUL SYLLABLE HYI + {0xD76D, 0xD787, prLVT}, // Lo [27] HANGUL SYLLABLE HYIG..HANGUL SYLLABLE HYIH + {0xD788, 0xD788, prLV}, // Lo HANGUL SYLLABLE HI + {0xD789, 0xD7A3, prLVT}, // Lo [27] HANGUL SYLLABLE HIG..HANGUL SYLLABLE HIH + {0xD7B0, 0xD7C6, prV}, // Lo [23] HANGUL JUNGSEONG O-YEO..HANGUL JUNGSEONG ARAEA-E + {0xD7CB, 0xD7FB, prT}, // Lo [49] HANGUL JONGSEONG NIEUN-RIEUL..HANGUL JONGSEONG PHIEUPH-THIEUTH + {0xFB1E, 0xFB1E, prExtend}, // Mn HEBREW POINT JUDEO-SPANISH VARIKA + {0xFE00, 0xFE0F, prExtend}, // Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16 + {0xFE20, 0xFE2F, prExtend}, // Mn [16] COMBINING LIGATURE LEFT HALF..COMBINING CYRILLIC TITLO RIGHT HALF + {0xFEFF, 0xFEFF, prControl}, // Cf ZERO WIDTH NO-BREAK SPACE + {0xFF9E, 0xFF9F, prExtend}, // Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK + {0xFFF0, 0xFFF8, prControl}, // Cn [9] .. + {0xFFF9, 0xFFFB, prControl}, // Cf [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR + {0x101FD, 0x101FD, prExtend}, // Mn PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE + {0x102E0, 0x102E0, prExtend}, // Mn COPTIC EPACT THOUSANDS MARK + {0x10376, 0x1037A, prExtend}, // Mn [5] COMBINING OLD PERMIC LETTER AN..COMBINING OLD PERMIC LETTER SII + {0x10A01, 0x10A03, prExtend}, // Mn [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL SIGN VOCALIC R + {0x10A05, 0x10A06, prExtend}, // Mn [2] KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O + {0x10A0C, 0x10A0F, prExtend}, // Mn [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA + {0x10A38, 0x10A3A, prExtend}, // Mn [3] KHAROSHTHI SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW + {0x10A3F, 0x10A3F, prExtend}, // Mn KHAROSHTHI VIRAMA + {0x10AE5, 0x10AE6, prExtend}, // Mn [2] MANICHAEAN ABBREVIATION MARK ABOVE..MANICHAEAN ABBREVIATION MARK BELOW + {0x10D24, 0x10D27, prExtend}, // Mn [4] HANIFI ROHINGYA SIGN HARBAHAY..HANIFI ROHINGYA SIGN TASSI + {0x10F46, 0x10F50, prExtend}, // Mn [11] SOGDIAN COMBINING DOT BELOW..SOGDIAN COMBINING STROKE BELOW + {0x11000, 0x11000, prSpacingMark}, // Mc BRAHMI SIGN CANDRABINDU + {0x11001, 0x11001, prExtend}, // Mn BRAHMI SIGN ANUSVARA + {0x11002, 0x11002, prSpacingMark}, // Mc BRAHMI SIGN VISARGA + {0x11038, 0x11046, prExtend}, // Mn [15] BRAHMI VOWEL SIGN AA..BRAHMI VIRAMA + {0x1107F, 0x11081, prExtend}, // Mn [3] BRAHMI NUMBER JOINER..KAITHI SIGN ANUSVARA + {0x11082, 0x11082, prSpacingMark}, // Mc KAITHI SIGN VISARGA + {0x110B0, 0x110B2, prSpacingMark}, // Mc [3] KAITHI VOWEL SIGN AA..KAITHI VOWEL SIGN II + {0x110B3, 0x110B6, prExtend}, // Mn [4] KAITHI VOWEL SIGN U..KAITHI VOWEL SIGN AI + {0x110B7, 0x110B8, prSpacingMark}, // Mc [2] KAITHI VOWEL SIGN O..KAITHI VOWEL SIGN AU + {0x110B9, 0x110BA, prExtend}, // Mn [2] KAITHI SIGN VIRAMA..KAITHI SIGN NUKTA + {0x110BD, 0x110BD, prPreprend}, // Cf KAITHI NUMBER SIGN + {0x110CD, 0x110CD, prPreprend}, // Cf KAITHI NUMBER SIGN ABOVE + {0x11100, 0x11102, prExtend}, // Mn [3] CHAKMA SIGN CANDRABINDU..CHAKMA SIGN VISARGA + {0x11127, 0x1112B, prExtend}, // Mn [5] CHAKMA VOWEL SIGN A..CHAKMA VOWEL SIGN UU + {0x1112C, 0x1112C, prSpacingMark}, // Mc CHAKMA VOWEL SIGN E + {0x1112D, 0x11134, prExtend}, // Mn [8] CHAKMA VOWEL SIGN AI..CHAKMA MAAYYAA + {0x11145, 0x11146, prSpacingMark}, // Mc [2] CHAKMA VOWEL SIGN AA..CHAKMA VOWEL SIGN EI + {0x11173, 0x11173, prExtend}, // Mn MAHAJANI SIGN NUKTA + {0x11180, 0x11181, prExtend}, // Mn [2] SHARADA SIGN CANDRABINDU..SHARADA SIGN ANUSVARA + {0x11182, 0x11182, prSpacingMark}, // Mc SHARADA SIGN VISARGA + {0x111B3, 0x111B5, prSpacingMark}, // Mc [3] SHARADA VOWEL SIGN AA..SHARADA VOWEL SIGN II + {0x111B6, 0x111BE, prExtend}, // Mn [9] SHARADA VOWEL SIGN U..SHARADA VOWEL SIGN O + {0x111BF, 0x111C0, prSpacingMark}, // Mc [2] SHARADA VOWEL SIGN AU..SHARADA SIGN VIRAMA + {0x111C2, 0x111C3, prPreprend}, // Lo [2] SHARADA SIGN JIHVAMULIYA..SHARADA SIGN UPADHMANIYA + {0x111C9, 0x111CC, prExtend}, // Mn [4] SHARADA SANDHI MARK..SHARADA EXTRA SHORT VOWEL MARK + {0x1122C, 0x1122E, prSpacingMark}, // Mc [3] KHOJKI VOWEL SIGN AA..KHOJKI VOWEL SIGN II + {0x1122F, 0x11231, prExtend}, // Mn [3] KHOJKI VOWEL SIGN U..KHOJKI VOWEL SIGN AI + {0x11232, 0x11233, prSpacingMark}, // Mc [2] KHOJKI VOWEL SIGN O..KHOJKI VOWEL SIGN AU + {0x11234, 0x11234, prExtend}, // Mn KHOJKI SIGN ANUSVARA + {0x11235, 0x11235, prSpacingMark}, // Mc KHOJKI SIGN VIRAMA + {0x11236, 0x11237, prExtend}, // Mn [2] KHOJKI SIGN NUKTA..KHOJKI SIGN SHADDA + {0x1123E, 0x1123E, prExtend}, // Mn KHOJKI SIGN SUKUN + {0x112DF, 0x112DF, prExtend}, // Mn KHUDAWADI SIGN ANUSVARA + {0x112E0, 0x112E2, prSpacingMark}, // Mc [3] KHUDAWADI VOWEL SIGN AA..KHUDAWADI VOWEL SIGN II + {0x112E3, 0x112EA, prExtend}, // Mn [8] KHUDAWADI VOWEL SIGN U..KHUDAWADI SIGN VIRAMA + {0x11300, 0x11301, prExtend}, // Mn [2] GRANTHA SIGN COMBINING ANUSVARA ABOVE..GRANTHA SIGN CANDRABINDU + {0x11302, 0x11303, prSpacingMark}, // Mc [2] GRANTHA SIGN ANUSVARA..GRANTHA SIGN VISARGA + {0x1133B, 0x1133C, prExtend}, // Mn [2] COMBINING BINDU BELOW..GRANTHA SIGN NUKTA + {0x1133E, 0x1133E, prExtend}, // Mc GRANTHA VOWEL SIGN AA + {0x1133F, 0x1133F, prSpacingMark}, // Mc GRANTHA VOWEL SIGN I + {0x11340, 0x11340, prExtend}, // Mn GRANTHA VOWEL SIGN II + {0x11341, 0x11344, prSpacingMark}, // Mc [4] GRANTHA VOWEL SIGN U..GRANTHA VOWEL SIGN VOCALIC RR + {0x11347, 0x11348, prSpacingMark}, // Mc [2] GRANTHA VOWEL SIGN EE..GRANTHA VOWEL SIGN AI + {0x1134B, 0x1134D, prSpacingMark}, // Mc [3] GRANTHA VOWEL SIGN OO..GRANTHA SIGN VIRAMA + {0x11357, 0x11357, prExtend}, // Mc GRANTHA AU LENGTH MARK + {0x11362, 0x11363, prSpacingMark}, // Mc [2] GRANTHA VOWEL SIGN VOCALIC L..GRANTHA VOWEL SIGN VOCALIC LL + {0x11366, 0x1136C, prExtend}, // Mn [7] COMBINING GRANTHA DIGIT ZERO..COMBINING GRANTHA DIGIT SIX + {0x11370, 0x11374, prExtend}, // Mn [5] COMBINING GRANTHA LETTER A..COMBINING GRANTHA LETTER PA + {0x11435, 0x11437, prSpacingMark}, // Mc [3] NEWA VOWEL SIGN AA..NEWA VOWEL SIGN II + {0x11438, 0x1143F, prExtend}, // Mn [8] NEWA VOWEL SIGN U..NEWA VOWEL SIGN AI + {0x11440, 0x11441, prSpacingMark}, // Mc [2] NEWA VOWEL SIGN O..NEWA VOWEL SIGN AU + {0x11442, 0x11444, prExtend}, // Mn [3] NEWA SIGN VIRAMA..NEWA SIGN ANUSVARA + {0x11445, 0x11445, prSpacingMark}, // Mc NEWA SIGN VISARGA + {0x11446, 0x11446, prExtend}, // Mn NEWA SIGN NUKTA + {0x1145E, 0x1145E, prExtend}, // Mn NEWA SANDHI MARK + {0x114B0, 0x114B0, prExtend}, // Mc TIRHUTA VOWEL SIGN AA + {0x114B1, 0x114B2, prSpacingMark}, // Mc [2] TIRHUTA VOWEL SIGN I..TIRHUTA VOWEL SIGN II + {0x114B3, 0x114B8, prExtend}, // Mn [6] TIRHUTA VOWEL SIGN U..TIRHUTA VOWEL SIGN VOCALIC LL + {0x114B9, 0x114B9, prSpacingMark}, // Mc TIRHUTA VOWEL SIGN E + {0x114BA, 0x114BA, prExtend}, // Mn TIRHUTA VOWEL SIGN SHORT E + {0x114BB, 0x114BC, prSpacingMark}, // Mc [2] TIRHUTA VOWEL SIGN AI..TIRHUTA VOWEL SIGN O + {0x114BD, 0x114BD, prExtend}, // Mc TIRHUTA VOWEL SIGN SHORT O + {0x114BE, 0x114BE, prSpacingMark}, // Mc TIRHUTA VOWEL SIGN AU + {0x114BF, 0x114C0, prExtend}, // Mn [2] TIRHUTA SIGN CANDRABINDU..TIRHUTA SIGN ANUSVARA + {0x114C1, 0x114C1, prSpacingMark}, // Mc TIRHUTA SIGN VISARGA + {0x114C2, 0x114C3, prExtend}, // Mn [2] TIRHUTA SIGN VIRAMA..TIRHUTA SIGN NUKTA + {0x115AF, 0x115AF, prExtend}, // Mc SIDDHAM VOWEL SIGN AA + {0x115B0, 0x115B1, prSpacingMark}, // Mc [2] SIDDHAM VOWEL SIGN I..SIDDHAM VOWEL SIGN II + {0x115B2, 0x115B5, prExtend}, // Mn [4] SIDDHAM VOWEL SIGN U..SIDDHAM VOWEL SIGN VOCALIC RR + {0x115B8, 0x115BB, prSpacingMark}, // Mc [4] SIDDHAM VOWEL SIGN E..SIDDHAM VOWEL SIGN AU + {0x115BC, 0x115BD, prExtend}, // Mn [2] SIDDHAM SIGN CANDRABINDU..SIDDHAM SIGN ANUSVARA + {0x115BE, 0x115BE, prSpacingMark}, // Mc SIDDHAM SIGN VISARGA + {0x115BF, 0x115C0, prExtend}, // Mn [2] SIDDHAM SIGN VIRAMA..SIDDHAM SIGN NUKTA + {0x115DC, 0x115DD, prExtend}, // Mn [2] SIDDHAM VOWEL SIGN ALTERNATE U..SIDDHAM VOWEL SIGN ALTERNATE UU + {0x11630, 0x11632, prSpacingMark}, // Mc [3] MODI VOWEL SIGN AA..MODI VOWEL SIGN II + {0x11633, 0x1163A, prExtend}, // Mn [8] MODI VOWEL SIGN U..MODI VOWEL SIGN AI + {0x1163B, 0x1163C, prSpacingMark}, // Mc [2] MODI VOWEL SIGN O..MODI VOWEL SIGN AU + {0x1163D, 0x1163D, prExtend}, // Mn MODI SIGN ANUSVARA + {0x1163E, 0x1163E, prSpacingMark}, // Mc MODI SIGN VISARGA + {0x1163F, 0x11640, prExtend}, // Mn [2] MODI SIGN VIRAMA..MODI SIGN ARDHACANDRA + {0x116AB, 0x116AB, prExtend}, // Mn TAKRI SIGN ANUSVARA + {0x116AC, 0x116AC, prSpacingMark}, // Mc TAKRI SIGN VISARGA + {0x116AD, 0x116AD, prExtend}, // Mn TAKRI VOWEL SIGN AA + {0x116AE, 0x116AF, prSpacingMark}, // Mc [2] TAKRI VOWEL SIGN I..TAKRI VOWEL SIGN II + {0x116B0, 0x116B5, prExtend}, // Mn [6] TAKRI VOWEL SIGN U..TAKRI VOWEL SIGN AU + {0x116B6, 0x116B6, prSpacingMark}, // Mc TAKRI SIGN VIRAMA + {0x116B7, 0x116B7, prExtend}, // Mn TAKRI SIGN NUKTA + {0x1171D, 0x1171F, prExtend}, // Mn [3] AHOM CONSONANT SIGN MEDIAL LA..AHOM CONSONANT SIGN MEDIAL LIGATING RA + {0x11720, 0x11721, prSpacingMark}, // Mc [2] AHOM VOWEL SIGN A..AHOM VOWEL SIGN AA + {0x11722, 0x11725, prExtend}, // Mn [4] AHOM VOWEL SIGN I..AHOM VOWEL SIGN UU + {0x11726, 0x11726, prSpacingMark}, // Mc AHOM VOWEL SIGN E + {0x11727, 0x1172B, prExtend}, // Mn [5] AHOM VOWEL SIGN AW..AHOM SIGN KILLER + {0x1182C, 0x1182E, prSpacingMark}, // Mc [3] DOGRA VOWEL SIGN AA..DOGRA VOWEL SIGN II + {0x1182F, 0x11837, prExtend}, // Mn [9] DOGRA VOWEL SIGN U..DOGRA SIGN ANUSVARA + {0x11838, 0x11838, prSpacingMark}, // Mc DOGRA SIGN VISARGA + {0x11839, 0x1183A, prExtend}, // Mn [2] DOGRA SIGN VIRAMA..DOGRA SIGN NUKTA + {0x119D1, 0x119D3, prSpacingMark}, // Mc [3] NANDINAGARI VOWEL SIGN AA..NANDINAGARI VOWEL SIGN II + {0x119D4, 0x119D7, prExtend}, // Mn [4] NANDINAGARI VOWEL SIGN U..NANDINAGARI VOWEL SIGN VOCALIC RR + {0x119DA, 0x119DB, prExtend}, // Mn [2] NANDINAGARI VOWEL SIGN E..NANDINAGARI VOWEL SIGN AI + {0x119DC, 0x119DF, prSpacingMark}, // Mc [4] NANDINAGARI VOWEL SIGN O..NANDINAGARI SIGN VISARGA + {0x119E0, 0x119E0, prExtend}, // Mn NANDINAGARI SIGN VIRAMA + {0x119E4, 0x119E4, prSpacingMark}, // Mc NANDINAGARI VOWEL SIGN PRISHTHAMATRA E + {0x11A01, 0x11A0A, prExtend}, // Mn [10] ZANABAZAR SQUARE VOWEL SIGN I..ZANABAZAR SQUARE VOWEL LENGTH MARK + {0x11A33, 0x11A38, prExtend}, // Mn [6] ZANABAZAR SQUARE FINAL CONSONANT MARK..ZANABAZAR SQUARE SIGN ANUSVARA + {0x11A39, 0x11A39, prSpacingMark}, // Mc ZANABAZAR SQUARE SIGN VISARGA + {0x11A3A, 0x11A3A, prPreprend}, // Lo ZANABAZAR SQUARE CLUSTER-INITIAL LETTER RA + {0x11A3B, 0x11A3E, prExtend}, // Mn [4] ZANABAZAR SQUARE CLUSTER-FINAL LETTER YA..ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA + {0x11A47, 0x11A47, prExtend}, // Mn ZANABAZAR SQUARE SUBJOINER + {0x11A51, 0x11A56, prExtend}, // Mn [6] SOYOMBO VOWEL SIGN I..SOYOMBO VOWEL SIGN OE + {0x11A57, 0x11A58, prSpacingMark}, // Mc [2] SOYOMBO VOWEL SIGN AI..SOYOMBO VOWEL SIGN AU + {0x11A59, 0x11A5B, prExtend}, // Mn [3] SOYOMBO VOWEL SIGN VOCALIC R..SOYOMBO VOWEL LENGTH MARK + {0x11A84, 0x11A89, prPreprend}, // Lo [6] SOYOMBO SIGN JIHVAMULIYA..SOYOMBO CLUSTER-INITIAL LETTER SA + {0x11A8A, 0x11A96, prExtend}, // Mn [13] SOYOMBO FINAL CONSONANT SIGN G..SOYOMBO SIGN ANUSVARA + {0x11A97, 0x11A97, prSpacingMark}, // Mc SOYOMBO SIGN VISARGA + {0x11A98, 0x11A99, prExtend}, // Mn [2] SOYOMBO GEMINATION MARK..SOYOMBO SUBJOINER + {0x11C2F, 0x11C2F, prSpacingMark}, // Mc BHAIKSUKI VOWEL SIGN AA + {0x11C30, 0x11C36, prExtend}, // Mn [7] BHAIKSUKI VOWEL SIGN I..BHAIKSUKI VOWEL SIGN VOCALIC L + {0x11C38, 0x11C3D, prExtend}, // Mn [6] BHAIKSUKI VOWEL SIGN E..BHAIKSUKI SIGN ANUSVARA + {0x11C3E, 0x11C3E, prSpacingMark}, // Mc BHAIKSUKI SIGN VISARGA + {0x11C3F, 0x11C3F, prExtend}, // Mn BHAIKSUKI SIGN VIRAMA + {0x11C92, 0x11CA7, prExtend}, // Mn [22] MARCHEN SUBJOINED LETTER KA..MARCHEN SUBJOINED LETTER ZA + {0x11CA9, 0x11CA9, prSpacingMark}, // Mc MARCHEN SUBJOINED LETTER YA + {0x11CAA, 0x11CB0, prExtend}, // Mn [7] MARCHEN SUBJOINED LETTER RA..MARCHEN VOWEL SIGN AA + {0x11CB1, 0x11CB1, prSpacingMark}, // Mc MARCHEN VOWEL SIGN I + {0x11CB2, 0x11CB3, prExtend}, // Mn [2] MARCHEN VOWEL SIGN U..MARCHEN VOWEL SIGN E + {0x11CB4, 0x11CB4, prSpacingMark}, // Mc MARCHEN VOWEL SIGN O + {0x11CB5, 0x11CB6, prExtend}, // Mn [2] MARCHEN SIGN ANUSVARA..MARCHEN SIGN CANDRABINDU + {0x11D31, 0x11D36, prExtend}, // Mn [6] MASARAM GONDI VOWEL SIGN AA..MASARAM GONDI VOWEL SIGN VOCALIC R + {0x11D3A, 0x11D3A, prExtend}, // Mn MASARAM GONDI VOWEL SIGN E + {0x11D3C, 0x11D3D, prExtend}, // Mn [2] MASARAM GONDI VOWEL SIGN AI..MASARAM GONDI VOWEL SIGN O + {0x11D3F, 0x11D45, prExtend}, // Mn [7] MASARAM GONDI VOWEL SIGN AU..MASARAM GONDI VIRAMA + {0x11D46, 0x11D46, prPreprend}, // Lo MASARAM GONDI REPHA + {0x11D47, 0x11D47, prExtend}, // Mn MASARAM GONDI RA-KARA + {0x11D8A, 0x11D8E, prSpacingMark}, // Mc [5] GUNJALA GONDI VOWEL SIGN AA..GUNJALA GONDI VOWEL SIGN UU + {0x11D90, 0x11D91, prExtend}, // Mn [2] GUNJALA GONDI VOWEL SIGN EE..GUNJALA GONDI VOWEL SIGN AI + {0x11D93, 0x11D94, prSpacingMark}, // Mc [2] GUNJALA GONDI VOWEL SIGN OO..GUNJALA GONDI VOWEL SIGN AU + {0x11D95, 0x11D95, prExtend}, // Mn GUNJALA GONDI SIGN ANUSVARA + {0x11D96, 0x11D96, prSpacingMark}, // Mc GUNJALA GONDI SIGN VISARGA + {0x11D97, 0x11D97, prExtend}, // Mn GUNJALA GONDI VIRAMA + {0x11EF3, 0x11EF4, prExtend}, // Mn [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U + {0x11EF5, 0x11EF6, prSpacingMark}, // Mc [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O + {0x13430, 0x13438, prControl}, // Cf [9] EGYPTIAN HIEROGLYPH VERTICAL JOINER..EGYPTIAN HIEROGLYPH END SEGMENT + {0x16AF0, 0x16AF4, prExtend}, // Mn [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE + {0x16B30, 0x16B36, prExtend}, // Mn [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM + {0x16F4F, 0x16F4F, prExtend}, // Mn MIAO SIGN CONSONANT MODIFIER BAR + {0x16F51, 0x16F87, prSpacingMark}, // Mc [55] MIAO SIGN ASPIRATION..MIAO VOWEL SIGN UI + {0x16F8F, 0x16F92, prExtend}, // Mn [4] MIAO TONE RIGHT..MIAO TONE BELOW + {0x1BC9D, 0x1BC9E, prExtend}, // Mn [2] DUPLOYAN THICK LETTER SELECTOR..DUPLOYAN DOUBLE MARK + {0x1BCA0, 0x1BCA3, prControl}, // Cf [4] SHORTHAND FORMAT LETTER OVERLAP..SHORTHAND FORMAT UP STEP + {0x1D165, 0x1D165, prExtend}, // Mc MUSICAL SYMBOL COMBINING STEM + {0x1D166, 0x1D166, prSpacingMark}, // Mc MUSICAL SYMBOL COMBINING SPRECHGESANG STEM + {0x1D167, 0x1D169, prExtend}, // Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3 + {0x1D16D, 0x1D16D, prSpacingMark}, // Mc MUSICAL SYMBOL COMBINING AUGMENTATION DOT + {0x1D16E, 0x1D172, prExtend}, // Mc [5] MUSICAL SYMBOL COMBINING FLAG-1..MUSICAL SYMBOL COMBINING FLAG-5 + {0x1D173, 0x1D17A, prControl}, // Cf [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE + {0x1D17B, 0x1D182, prExtend}, // Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE + {0x1D185, 0x1D18B, prExtend}, // Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE + {0x1D1AA, 0x1D1AD, prExtend}, // Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO + {0x1D242, 0x1D244, prExtend}, // Mn [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME + {0x1DA00, 0x1DA36, prExtend}, // Mn [55] SIGNWRITING HEAD RIM..SIGNWRITING AIR SUCKING IN + {0x1DA3B, 0x1DA6C, prExtend}, // Mn [50] SIGNWRITING MOUTH CLOSED NEUTRAL..SIGNWRITING EXCITEMENT + {0x1DA75, 0x1DA75, prExtend}, // Mn SIGNWRITING UPPER BODY TILTING FROM HIP JOINTS + {0x1DA84, 0x1DA84, prExtend}, // Mn SIGNWRITING LOCATION HEAD NECK + {0x1DA9B, 0x1DA9F, prExtend}, // Mn [5] SIGNWRITING FILL MODIFIER-2..SIGNWRITING FILL MODIFIER-6 + {0x1DAA1, 0x1DAAF, prExtend}, // Mn [15] SIGNWRITING ROTATION MODIFIER-2..SIGNWRITING ROTATION MODIFIER-16 + {0x1E000, 0x1E006, prExtend}, // Mn [7] COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE + {0x1E008, 0x1E018, prExtend}, // Mn [17] COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU + {0x1E01B, 0x1E021, prExtend}, // Mn [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI + {0x1E023, 0x1E024, prExtend}, // Mn [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS + {0x1E026, 0x1E02A, prExtend}, // Mn [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA + {0x1E130, 0x1E136, prExtend}, // Mn [7] NYIAKENG PUACHUE HMONG TONE-B..NYIAKENG PUACHUE HMONG TONE-D + {0x1E2EC, 0x1E2EF, prExtend}, // Mn [4] WANCHO TONE TUP..WANCHO TONE KOINI + {0x1E8D0, 0x1E8D6, prExtend}, // Mn [7] MENDE KIKAKUI COMBINING NUMBER TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS + {0x1E944, 0x1E94A, prExtend}, // Mn [7] ADLAM ALIF LENGTHENER..ADLAM NUKTA + {0x1F000, 0x1F02B, prExtendedPictographic}, // 5.1 [44] (🀀..🀫) MAHJONG TILE EAST WIND..MAHJONG TILE BACK + {0x1F02C, 0x1F02F, prExtendedPictographic}, // NA [4] (🀬..🀯) .. + {0x1F030, 0x1F093, prExtendedPictographic}, // 5.1[100] (🀰..🂓) DOMINO TILE HORIZONTAL BACK..DOMINO TILE VERTICAL-06-06 + {0x1F094, 0x1F09F, prExtendedPictographic}, // NA [12] (🂔..🂟) .. + {0x1F0A0, 0x1F0AE, prExtendedPictographic}, // 6.0 [15] (🂠..🂮) PLAYING CARD BACK..PLAYING CARD KING OF SPADES + {0x1F0AF, 0x1F0B0, prExtendedPictographic}, // NA [2] (🂯..🂰) .. + {0x1F0B1, 0x1F0BE, prExtendedPictographic}, // 6.0 [14] (🂱..🂾) PLAYING CARD ACE OF HEARTS..PLAYING CARD KING OF HEARTS + {0x1F0BF, 0x1F0BF, prExtendedPictographic}, // 7.0 [1] (🂿) PLAYING CARD RED JOKER + {0x1F0C0, 0x1F0C0, prExtendedPictographic}, // NA [1] (🃀) + {0x1F0C1, 0x1F0CF, prExtendedPictographic}, // 6.0 [15] (🃁..🃏) PLAYING CARD ACE OF DIAMONDS..joker + {0x1F0D0, 0x1F0D0, prExtendedPictographic}, // NA [1] (🃐) + {0x1F0D1, 0x1F0DF, prExtendedPictographic}, // 6.0 [15] (🃑..🃟) PLAYING CARD ACE OF CLUBS..PLAYING CARD WHITE JOKER + {0x1F0E0, 0x1F0F5, prExtendedPictographic}, // 7.0 [22] (🃠..🃵) PLAYING CARD FOOL..PLAYING CARD TRUMP-21 + {0x1F0F6, 0x1F0FF, prExtendedPictographic}, // NA [10] (🃶..🃿) .. + {0x1F10D, 0x1F10F, prExtendedPictographic}, // NA [3] (🄍..🄏) .. + {0x1F12F, 0x1F12F, prExtendedPictographic}, // 11.0 [1] (🄯) COPYLEFT SYMBOL + {0x1F16C, 0x1F16C, prExtendedPictographic}, // 12.0 [1] (🅬) RAISED MR SIGN + {0x1F16D, 0x1F16F, prExtendedPictographic}, // NA [3] (🅭..🅯) .. + {0x1F170, 0x1F171, prExtendedPictographic}, // 6.0 [2] (🅰️..🅱️) A button (blood type)..B button (blood type) + {0x1F17E, 0x1F17E, prExtendedPictographic}, // 6.0 [1] (🅾️) O button (blood type) + {0x1F17F, 0x1F17F, prExtendedPictographic}, // 5.2 [1] (🅿️) P button + {0x1F18E, 0x1F18E, prExtendedPictographic}, // 6.0 [1] (🆎) AB button (blood type) + {0x1F191, 0x1F19A, prExtendedPictographic}, // 6.0 [10] (🆑..🆚) CL button..VS button + {0x1F1AD, 0x1F1E5, prExtendedPictographic}, // NA [57] (🆭..🇥) .. + {0x1F1E6, 0x1F1FF, prRegionalIndicator}, // So [26] REGIONAL INDICATOR SYMBOL LETTER A..REGIONAL INDICATOR SYMBOL LETTER Z + {0x1F201, 0x1F202, prExtendedPictographic}, // 6.0 [2] (🈁..🈂️) Japanese “here” button..Japanese “service charge” button + {0x1F203, 0x1F20F, prExtendedPictographic}, // NA [13] (🈃..🈏) .. + {0x1F21A, 0x1F21A, prExtendedPictographic}, // 5.2 [1] (🈚) Japanese “free of charge” button + {0x1F22F, 0x1F22F, prExtendedPictographic}, // 5.2 [1] (🈯) Japanese “reserved” button + {0x1F232, 0x1F23A, prExtendedPictographic}, // 6.0 [9] (🈲..🈺) Japanese “prohibited” button..Japanese “open for business” button + {0x1F23C, 0x1F23F, prExtendedPictographic}, // NA [4] (🈼..🈿) .. + {0x1F249, 0x1F24F, prExtendedPictographic}, // NA [7] (🉉..🉏) .. + {0x1F250, 0x1F251, prExtendedPictographic}, // 6.0 [2] (🉐..🉑) Japanese “bargain” button..Japanese “acceptable” button + {0x1F252, 0x1F25F, prExtendedPictographic}, // NA [14] (🉒..🉟) .. + {0x1F260, 0x1F265, prExtendedPictographic}, // 10.0 [6] (🉠..🉥) ROUNDED SYMBOL FOR FU..ROUNDED SYMBOL FOR CAI + {0x1F266, 0x1F2FF, prExtendedPictographic}, // NA[154] (🉦..🋿) .. + {0x1F300, 0x1F320, prExtendedPictographic}, // 6.0 [33] (🌀..🌠) cyclone..shooting star + {0x1F321, 0x1F32C, prExtendedPictographic}, // 7.0 [12] (🌡️..🌬️) thermometer..wind face + {0x1F32D, 0x1F32F, prExtendedPictographic}, // 8.0 [3] (🌭..🌯) hot dog..burrito + {0x1F330, 0x1F335, prExtendedPictographic}, // 6.0 [6] (🌰..🌵) chestnut..cactus + {0x1F336, 0x1F336, prExtendedPictographic}, // 7.0 [1] (🌶️) hot pepper + {0x1F337, 0x1F37C, prExtendedPictographic}, // 6.0 [70] (🌷..🍼) tulip..baby bottle + {0x1F37D, 0x1F37D, prExtendedPictographic}, // 7.0 [1] (🍽️) fork and knife with plate + {0x1F37E, 0x1F37F, prExtendedPictographic}, // 8.0 [2] (🍾..🍿) bottle with popping cork..popcorn + {0x1F380, 0x1F393, prExtendedPictographic}, // 6.0 [20] (🎀..🎓) ribbon..graduation cap + {0x1F394, 0x1F39F, prExtendedPictographic}, // 7.0 [12] (🎔..🎟️) HEART WITH TIP ON THE LEFT..admission tickets + {0x1F3A0, 0x1F3C4, prExtendedPictographic}, // 6.0 [37] (🎠..🏄) carousel horse..person surfing + {0x1F3C5, 0x1F3C5, prExtendedPictographic}, // 7.0 [1] (🏅) sports medal + {0x1F3C6, 0x1F3CA, prExtendedPictographic}, // 6.0 [5] (🏆..🏊) trophy..person swimming + {0x1F3CB, 0x1F3CE, prExtendedPictographic}, // 7.0 [4] (🏋️..🏎️) person lifting weights..racing car + {0x1F3CF, 0x1F3D3, prExtendedPictographic}, // 8.0 [5] (🏏..🏓) cricket game..ping pong + {0x1F3D4, 0x1F3DF, prExtendedPictographic}, // 7.0 [12] (🏔️..🏟️) snow-capped mountain..stadium + {0x1F3E0, 0x1F3F0, prExtendedPictographic}, // 6.0 [17] (🏠..🏰) house..castle + {0x1F3F1, 0x1F3F7, prExtendedPictographic}, // 7.0 [7] (🏱..🏷️) WHITE PENNANT..label + {0x1F3F8, 0x1F3FA, prExtendedPictographic}, // 8.0 [3] (🏸..🏺) badminton..amphora + {0x1F3FB, 0x1F3FF, prExtend}, // Sk [5] EMOJI MODIFIER FITZPATRICK TYPE-1-2..EMOJI MODIFIER FITZPATRICK TYPE-6 + {0x1F400, 0x1F43E, prExtendedPictographic}, // 6.0 [63] (🐀..🐾) rat..paw prints + {0x1F43F, 0x1F43F, prExtendedPictographic}, // 7.0 [1] (🐿️) chipmunk + {0x1F440, 0x1F440, prExtendedPictographic}, // 6.0 [1] (👀) eyes + {0x1F441, 0x1F441, prExtendedPictographic}, // 7.0 [1] (👁️) eye + {0x1F442, 0x1F4F7, prExtendedPictographic}, // 6.0[182] (👂..📷) ear..camera + {0x1F4F8, 0x1F4F8, prExtendedPictographic}, // 7.0 [1] (📸) camera with flash + {0x1F4F9, 0x1F4FC, prExtendedPictographic}, // 6.0 [4] (📹..📼) video camera..videocassette + {0x1F4FD, 0x1F4FE, prExtendedPictographic}, // 7.0 [2] (📽️..📾) film projector..PORTABLE STEREO + {0x1F4FF, 0x1F4FF, prExtendedPictographic}, // 8.0 [1] (📿) prayer beads + {0x1F500, 0x1F53D, prExtendedPictographic}, // 6.0 [62] (🔀..🔽) shuffle tracks button..downwards button + {0x1F546, 0x1F54A, prExtendedPictographic}, // 7.0 [5] (🕆..🕊️) WHITE LATIN CROSS..dove + {0x1F54B, 0x1F54F, prExtendedPictographic}, // 8.0 [5] (🕋..🕏) kaaba..BOWL OF HYGIEIA + {0x1F550, 0x1F567, prExtendedPictographic}, // 6.0 [24] (🕐..🕧) one o’clock..twelve-thirty + {0x1F568, 0x1F579, prExtendedPictographic}, // 7.0 [18] (🕨..🕹️) RIGHT SPEAKER..joystick + {0x1F57A, 0x1F57A, prExtendedPictographic}, // 9.0 [1] (🕺) man dancing + {0x1F57B, 0x1F5A3, prExtendedPictographic}, // 7.0 [41] (🕻..🖣) LEFT HAND TELEPHONE RECEIVER..BLACK DOWN POINTING BACKHAND INDEX + {0x1F5A4, 0x1F5A4, prExtendedPictographic}, // 9.0 [1] (🖤) black heart + {0x1F5A5, 0x1F5FA, prExtendedPictographic}, // 7.0 [86] (🖥️..🗺️) desktop computer..world map + {0x1F5FB, 0x1F5FF, prExtendedPictographic}, // 6.0 [5] (🗻..🗿) mount fuji..moai + {0x1F600, 0x1F600, prExtendedPictographic}, // 6.1 [1] (😀) grinning face + {0x1F601, 0x1F610, prExtendedPictographic}, // 6.0 [16] (😁..😐) beaming face with smiling eyes..neutral face + {0x1F611, 0x1F611, prExtendedPictographic}, // 6.1 [1] (😑) expressionless face + {0x1F612, 0x1F614, prExtendedPictographic}, // 6.0 [3] (😒..😔) unamused face..pensive face + {0x1F615, 0x1F615, prExtendedPictographic}, // 6.1 [1] (😕) confused face + {0x1F616, 0x1F616, prExtendedPictographic}, // 6.0 [1] (😖) confounded face + {0x1F617, 0x1F617, prExtendedPictographic}, // 6.1 [1] (😗) kissing face + {0x1F618, 0x1F618, prExtendedPictographic}, // 6.0 [1] (😘) face blowing a kiss + {0x1F619, 0x1F619, prExtendedPictographic}, // 6.1 [1] (😙) kissing face with smiling eyes + {0x1F61A, 0x1F61A, prExtendedPictographic}, // 6.0 [1] (😚) kissing face with closed eyes + {0x1F61B, 0x1F61B, prExtendedPictographic}, // 6.1 [1] (😛) face with tongue + {0x1F61C, 0x1F61E, prExtendedPictographic}, // 6.0 [3] (😜..😞) winking face with tongue..disappointed face + {0x1F61F, 0x1F61F, prExtendedPictographic}, // 6.1 [1] (😟) worried face + {0x1F620, 0x1F625, prExtendedPictographic}, // 6.0 [6] (😠..😥) angry face..sad but relieved face + {0x1F626, 0x1F627, prExtendedPictographic}, // 6.1 [2] (😦..😧) frowning face with open mouth..anguished face + {0x1F628, 0x1F62B, prExtendedPictographic}, // 6.0 [4] (😨..😫) fearful face..tired face + {0x1F62C, 0x1F62C, prExtendedPictographic}, // 6.1 [1] (😬) grimacing face + {0x1F62D, 0x1F62D, prExtendedPictographic}, // 6.0 [1] (😭) loudly crying face + {0x1F62E, 0x1F62F, prExtendedPictographic}, // 6.1 [2] (😮..😯) face with open mouth..hushed face + {0x1F630, 0x1F633, prExtendedPictographic}, // 6.0 [4] (😰..😳) anxious face with sweat..flushed face + {0x1F634, 0x1F634, prExtendedPictographic}, // 6.1 [1] (😴) sleeping face + {0x1F635, 0x1F640, prExtendedPictographic}, // 6.0 [12] (😵..🙀) dizzy face..weary cat + {0x1F641, 0x1F642, prExtendedPictographic}, // 7.0 [2] (🙁..🙂) slightly frowning face..slightly smiling face + {0x1F643, 0x1F644, prExtendedPictographic}, // 8.0 [2] (🙃..🙄) upside-down face..face with rolling eyes + {0x1F645, 0x1F64F, prExtendedPictographic}, // 6.0 [11] (🙅..🙏) person gesturing NO..folded hands + {0x1F680, 0x1F6C5, prExtendedPictographic}, // 6.0 [70] (🚀..🛅) rocket..left luggage + {0x1F6C6, 0x1F6CF, prExtendedPictographic}, // 7.0 [10] (🛆..🛏️) TRIANGLE WITH ROUNDED CORNERS..bed + {0x1F6D0, 0x1F6D0, prExtendedPictographic}, // 8.0 [1] (🛐) place of worship + {0x1F6D1, 0x1F6D2, prExtendedPictographic}, // 9.0 [2] (🛑..🛒) stop sign..shopping cart + {0x1F6D3, 0x1F6D4, prExtendedPictographic}, // 10.0 [2] (🛓..🛔) STUPA..PAGODA + {0x1F6D5, 0x1F6D5, prExtendedPictographic}, // 12.0 [1] (🛕) hindu temple + {0x1F6D6, 0x1F6DF, prExtendedPictographic}, // NA [10] (🛖..🛟) .. + {0x1F6E0, 0x1F6EC, prExtendedPictographic}, // 7.0 [13] (🛠️..🛬) hammer and wrench..airplane arrival + {0x1F6ED, 0x1F6EF, prExtendedPictographic}, // NA [3] (🛭..🛯) .. + {0x1F6F0, 0x1F6F3, prExtendedPictographic}, // 7.0 [4] (🛰️..🛳️) satellite..passenger ship + {0x1F6F4, 0x1F6F6, prExtendedPictographic}, // 9.0 [3] (🛴..🛶) kick scooter..canoe + {0x1F6F7, 0x1F6F8, prExtendedPictographic}, // 10.0 [2] (🛷..🛸) sled..flying saucer + {0x1F6F9, 0x1F6F9, prExtendedPictographic}, // 11.0 [1] (🛹) skateboard + {0x1F6FA, 0x1F6FA, prExtendedPictographic}, // 12.0 [1] (🛺) auto rickshaw + {0x1F6FB, 0x1F6FF, prExtendedPictographic}, // NA [5] (🛻..🛿) .. + {0x1F774, 0x1F77F, prExtendedPictographic}, // NA [12] (🝴..🝿) .. + {0x1F7D5, 0x1F7D8, prExtendedPictographic}, // 11.0 [4] (🟕..🟘) CIRCLED TRIANGLE..NEGATIVE CIRCLED SQUARE + {0x1F7D9, 0x1F7DF, prExtendedPictographic}, // NA [7] (🟙..🟟) .. + {0x1F7E0, 0x1F7EB, prExtendedPictographic}, // 12.0 [12] (🟠..🟫) orange circle..brown square + {0x1F7EC, 0x1F7FF, prExtendedPictographic}, // NA [20] (🟬..🟿) .. + {0x1F80C, 0x1F80F, prExtendedPictographic}, // NA [4] (🠌..🠏) .. + {0x1F848, 0x1F84F, prExtendedPictographic}, // NA [8] (🡈..🡏) .. + {0x1F85A, 0x1F85F, prExtendedPictographic}, // NA [6] (🡚..🡟) .. + {0x1F888, 0x1F88F, prExtendedPictographic}, // NA [8] (🢈..🢏) .. + {0x1F8AE, 0x1F8FF, prExtendedPictographic}, // NA [82] (🢮..🣿) .. + {0x1F90C, 0x1F90C, prExtendedPictographic}, // NA [1] (🤌) + {0x1F90D, 0x1F90F, prExtendedPictographic}, // 12.0 [3] (🤍..🤏) white heart..pinching hand + {0x1F910, 0x1F918, prExtendedPictographic}, // 8.0 [9] (🤐..🤘) zipper-mouth face..sign of the horns + {0x1F919, 0x1F91E, prExtendedPictographic}, // 9.0 [6] (🤙..🤞) call me hand..crossed fingers + {0x1F91F, 0x1F91F, prExtendedPictographic}, // 10.0 [1] (🤟) love-you gesture + {0x1F920, 0x1F927, prExtendedPictographic}, // 9.0 [8] (🤠..🤧) cowboy hat face..sneezing face + {0x1F928, 0x1F92F, prExtendedPictographic}, // 10.0 [8] (🤨..🤯) face with raised eyebrow..exploding head + {0x1F930, 0x1F930, prExtendedPictographic}, // 9.0 [1] (🤰) pregnant woman + {0x1F931, 0x1F932, prExtendedPictographic}, // 10.0 [2] (🤱..🤲) breast-feeding..palms up together + {0x1F933, 0x1F93A, prExtendedPictographic}, // 9.0 [8] (🤳..🤺) selfie..person fencing + {0x1F93C, 0x1F93E, prExtendedPictographic}, // 9.0 [3] (🤼..🤾) people wrestling..person playing handball + {0x1F93F, 0x1F93F, prExtendedPictographic}, // 12.0 [1] (🤿) diving mask + {0x1F940, 0x1F945, prExtendedPictographic}, // 9.0 [6] (🥀..🥅) wilted flower..goal net + {0x1F947, 0x1F94B, prExtendedPictographic}, // 9.0 [5] (🥇..🥋) 1st place medal..martial arts uniform + {0x1F94C, 0x1F94C, prExtendedPictographic}, // 10.0 [1] (🥌) curling stone + {0x1F94D, 0x1F94F, prExtendedPictographic}, // 11.0 [3] (🥍..🥏) lacrosse..flying disc + {0x1F950, 0x1F95E, prExtendedPictographic}, // 9.0 [15] (🥐..🥞) croissant..pancakes + {0x1F95F, 0x1F96B, prExtendedPictographic}, // 10.0 [13] (🥟..🥫) dumpling..canned food + {0x1F96C, 0x1F970, prExtendedPictographic}, // 11.0 [5] (🥬..🥰) leafy green..smiling face with hearts + {0x1F971, 0x1F971, prExtendedPictographic}, // 12.0 [1] (🥱) yawning face + {0x1F972, 0x1F972, prExtendedPictographic}, // NA [1] (🥲) + {0x1F973, 0x1F976, prExtendedPictographic}, // 11.0 [4] (🥳..🥶) partying face..cold face + {0x1F977, 0x1F979, prExtendedPictographic}, // NA [3] (🥷..🥹) .. + {0x1F97A, 0x1F97A, prExtendedPictographic}, // 11.0 [1] (🥺) pleading face + {0x1F97B, 0x1F97B, prExtendedPictographic}, // 12.0 [1] (🥻) sari + {0x1F97C, 0x1F97F, prExtendedPictographic}, // 11.0 [4] (🥼..🥿) lab coat..flat shoe + {0x1F980, 0x1F984, prExtendedPictographic}, // 8.0 [5] (🦀..🦄) crab..unicorn + {0x1F985, 0x1F991, prExtendedPictographic}, // 9.0 [13] (🦅..🦑) eagle..squid + {0x1F992, 0x1F997, prExtendedPictographic}, // 10.0 [6] (🦒..🦗) giraffe..cricket + {0x1F998, 0x1F9A2, prExtendedPictographic}, // 11.0 [11] (🦘..🦢) kangaroo..swan + {0x1F9A3, 0x1F9A4, prExtendedPictographic}, // NA [2] (🦣..🦤) .. + {0x1F9A5, 0x1F9AA, prExtendedPictographic}, // 12.0 [6] (🦥..🦪) sloth..oyster + {0x1F9AB, 0x1F9AD, prExtendedPictographic}, // NA [3] (🦫..🦭) .. + {0x1F9AE, 0x1F9AF, prExtendedPictographic}, // 12.0 [2] (🦮..🦯) guide dog..probing cane + {0x1F9B0, 0x1F9B9, prExtendedPictographic}, // 11.0 [10] (🦰..🦹) red hair..supervillain + {0x1F9BA, 0x1F9BF, prExtendedPictographic}, // 12.0 [6] (🦺..🦿) safety vest..mechanical leg + {0x1F9C0, 0x1F9C0, prExtendedPictographic}, // 8.0 [1] (🧀) cheese wedge + {0x1F9C1, 0x1F9C2, prExtendedPictographic}, // 11.0 [2] (🧁..🧂) cupcake..salt + {0x1F9C3, 0x1F9CA, prExtendedPictographic}, // 12.0 [8] (🧃..🧊) beverage box..ice cube + {0x1F9CB, 0x1F9CC, prExtendedPictographic}, // NA [2] (🧋..🧌) .. + {0x1F9CD, 0x1F9CF, prExtendedPictographic}, // 12.0 [3] (🧍..🧏) person standing..deaf person + {0x1F9D0, 0x1F9E6, prExtendedPictographic}, // 10.0 [23] (🧐..🧦) face with monocle..socks + {0x1F9E7, 0x1F9FF, prExtendedPictographic}, // 11.0 [25] (🧧..🧿) red envelope..nazar amulet + {0x1FA00, 0x1FA53, prExtendedPictographic}, // 12.0 [84] (🨀..🩓) NEUTRAL CHESS KING..BLACK CHESS KNIGHT-BISHOP + {0x1FA54, 0x1FA5F, prExtendedPictographic}, // NA [12] (🩔..🩟) .. + {0x1FA60, 0x1FA6D, prExtendedPictographic}, // 11.0 [14] (🩠..🩭) XIANGQI RED GENERAL..XIANGQI BLACK SOLDIER + {0x1FA6E, 0x1FA6F, prExtendedPictographic}, // NA [2] (🩮..🩯) .. + {0x1FA70, 0x1FA73, prExtendedPictographic}, // 12.0 [4] (🩰..🩳) ballet shoes..shorts + {0x1FA74, 0x1FA77, prExtendedPictographic}, // NA [4] (🩴..🩷) .. + {0x1FA78, 0x1FA7A, prExtendedPictographic}, // 12.0 [3] (🩸..🩺) drop of blood..stethoscope + {0x1FA7B, 0x1FA7F, prExtendedPictographic}, // NA [5] (🩻..🩿) .. + {0x1FA80, 0x1FA82, prExtendedPictographic}, // 12.0 [3] (🪀..🪂) yo-yo..parachute + {0x1FA83, 0x1FA8F, prExtendedPictographic}, // NA [13] (🪃..🪏) .. + {0x1FA90, 0x1FA95, prExtendedPictographic}, // 12.0 [6] (🪐..🪕) ringed planet..banjo + {0x1FA96, 0x1FFFD, prExtendedPictographic}, // NA[1384] (🪖..🿽) .. + {0xE0000, 0xE0000, prControl}, // Cn + {0xE0001, 0xE0001, prControl}, // Cf LANGUAGE TAG + {0xE0002, 0xE001F, prControl}, // Cn [30] .. + {0xE0020, 0xE007F, prExtend}, // Cf [96] TAG SPACE..CANCEL TAG + {0xE0080, 0xE00FF, prControl}, // Cn [128] .. + {0xE0100, 0xE01EF, prExtend}, // Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 + {0xE01F0, 0xE0FFF, prControl}, // Cn [3600] .. +} + +// property returns the Unicode property value (see constants above) of the +// given code point. +func property(r rune) int { + // Run a binary search. + from := 0 + to := len(codePoints) + for to > from { + middle := (from + to) / 2 + cpRange := codePoints[middle] + if int(r) < cpRange[0] { + to = middle + continue + } + if int(r) > cpRange[1] { + from = middle + 1 + continue + } + return cpRange[2] + } + return prAny +} diff --git a/vendor/github.com/sirupsen/logrus/.gitignore b/vendor/github.com/sirupsen/logrus/.gitignore deleted file mode 100644 index 1fb13ab..0000000 --- a/vendor/github.com/sirupsen/logrus/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -logrus -vendor - -.idea/ diff --git a/vendor/github.com/sirupsen/logrus/.golangci.yml b/vendor/github.com/sirupsen/logrus/.golangci.yml deleted file mode 100644 index 65dc285..0000000 --- a/vendor/github.com/sirupsen/logrus/.golangci.yml +++ /dev/null @@ -1,40 +0,0 @@ -run: - # do not run on test files yet - tests: false - -# all available settings of specific linters -linters-settings: - errcheck: - # report about not checking of errors in type assetions: `a := b.(MyStruct)`; - # default is false: such cases aren't reported by default. - check-type-assertions: false - - # report about assignment of errors to blank identifier: `num, _ := strconv.Atoi(numStr)`; - # default is false: such cases aren't reported by default. - check-blank: false - - lll: - line-length: 100 - tab-width: 4 - - prealloc: - simple: false - range-loops: false - for-loops: false - - whitespace: - multi-if: false # Enforces newlines (or comments) after every multi-line if statement - multi-func: false # Enforces newlines (or comments) after every multi-line function signature - -linters: - enable: - - megacheck - - govet - disable: - - maligned - - prealloc - disable-all: false - presets: - - bugs - - unused - fast: false diff --git a/vendor/github.com/sirupsen/logrus/.travis.yml b/vendor/github.com/sirupsen/logrus/.travis.yml deleted file mode 100644 index c1dbd5a..0000000 --- a/vendor/github.com/sirupsen/logrus/.travis.yml +++ /dev/null @@ -1,15 +0,0 @@ -language: go -go_import_path: github.com/sirupsen/logrus -git: - depth: 1 -env: - - GO111MODULE=on -go: 1.15.x -os: linux -install: - - ./travis/install.sh -script: - - cd ci - - go run mage.go -v -w ../ crossBuild - - go run mage.go -v -w ../ lint - - go run mage.go -v -w ../ test diff --git a/vendor/github.com/sirupsen/logrus/CHANGELOG.md b/vendor/github.com/sirupsen/logrus/CHANGELOG.md deleted file mode 100644 index 7567f61..0000000 --- a/vendor/github.com/sirupsen/logrus/CHANGELOG.md +++ /dev/null @@ -1,259 +0,0 @@ -# 1.8.1 -Code quality: - * move magefile in its own subdir/submodule to remove magefile dependency on logrus consumer - * improve timestamp format documentation - -Fixes: - * fix race condition on logger hooks - - -# 1.8.0 - -Correct versioning number replacing v1.7.1. - -# 1.7.1 - -Beware this release has introduced a new public API and its semver is therefore incorrect. - -Code quality: - * use go 1.15 in travis - * use magefile as task runner - -Fixes: - * small fixes about new go 1.13 error formatting system - * Fix for long time race condiction with mutating data hooks - -Features: - * build support for zos - -# 1.7.0 -Fixes: - * the dependency toward a windows terminal library has been removed - -Features: - * a new buffer pool management API has been added - * a set of `Fn()` functions have been added - -# 1.6.0 -Fixes: - * end of line cleanup - * revert the entry concurrency bug fix whic leads to deadlock under some circumstances - * update dependency on go-windows-terminal-sequences to fix a crash with go 1.14 - -Features: - * add an option to the `TextFormatter` to completely disable fields quoting - -# 1.5.0 -Code quality: - * add golangci linter run on travis - -Fixes: - * add mutex for hooks concurrent access on `Entry` data - * caller function field for go1.14 - * fix build issue for gopherjs target - -Feature: - * add an hooks/writer sub-package whose goal is to split output on different stream depending on the trace level - * add a `DisableHTMLEscape` option in the `JSONFormatter` - * add `ForceQuote` and `PadLevelText` options in the `TextFormatter` - -# 1.4.2 - * Fixes build break for plan9, nacl, solaris -# 1.4.1 -This new release introduces: - * Enhance TextFormatter to not print caller information when they are empty (#944) - * Remove dependency on golang.org/x/crypto (#932, #943) - -Fixes: - * Fix Entry.WithContext method to return a copy of the initial entry (#941) - -# 1.4.0 -This new release introduces: - * Add `DeferExitHandler`, similar to `RegisterExitHandler` but prepending the handler to the list of handlers (semantically like `defer`) (#848). - * Add `CallerPrettyfier` to `JSONFormatter` and `TextFormatter` (#909, #911) - * Add `Entry.WithContext()` and `Entry.Context`, to set a context on entries to be used e.g. in hooks (#919). - -Fixes: - * Fix wrong method calls `Logger.Print` and `Logger.Warningln` (#893). - * Update `Entry.Logf` to not do string formatting unless the log level is enabled (#903) - * Fix infinite recursion on unknown `Level.String()` (#907) - * Fix race condition in `getCaller` (#916). - - -# 1.3.0 -This new release introduces: - * Log, Logf, Logln functions for Logger and Entry that take a Level - -Fixes: - * Building prometheus node_exporter on AIX (#840) - * Race condition in TextFormatter (#468) - * Travis CI import path (#868) - * Remove coloured output on Windows (#862) - * Pointer to func as field in JSONFormatter (#870) - * Properly marshal Levels (#873) - -# 1.2.0 -This new release introduces: - * A new method `SetReportCaller` in the `Logger` to enable the file, line and calling function from which the trace has been issued - * A new trace level named `Trace` whose level is below `Debug` - * A configurable exit function to be called upon a Fatal trace - * The `Level` object now implements `encoding.TextUnmarshaler` interface - -# 1.1.1 -This is a bug fix release. - * fix the build break on Solaris - * don't drop a whole trace in JSONFormatter when a field param is a function pointer which can not be serialized - -# 1.1.0 -This new release introduces: - * several fixes: - * a fix for a race condition on entry formatting - * proper cleanup of previously used entries before putting them back in the pool - * the extra new line at the end of message in text formatter has been removed - * a new global public API to check if a level is activated: IsLevelEnabled - * the following methods have been added to the Logger object - * IsLevelEnabled - * SetFormatter - * SetOutput - * ReplaceHooks - * introduction of go module - * an indent configuration for the json formatter - * output colour support for windows - * the field sort function is now configurable for text formatter - * the CLICOLOR and CLICOLOR\_FORCE environment variable support in text formater - -# 1.0.6 - -This new release introduces: - * a new api WithTime which allows to easily force the time of the log entry - which is mostly useful for logger wrapper - * a fix reverting the immutability of the entry given as parameter to the hooks - a new configuration field of the json formatter in order to put all the fields - in a nested dictionnary - * a new SetOutput method in the Logger - * a new configuration of the textformatter to configure the name of the default keys - * a new configuration of the text formatter to disable the level truncation - -# 1.0.5 - -* Fix hooks race (#707) -* Fix panic deadlock (#695) - -# 1.0.4 - -* Fix race when adding hooks (#612) -* Fix terminal check in AppEngine (#635) - -# 1.0.3 - -* Replace example files with testable examples - -# 1.0.2 - -* bug: quote non-string values in text formatter (#583) -* Make (*Logger) SetLevel a public method - -# 1.0.1 - -* bug: fix escaping in text formatter (#575) - -# 1.0.0 - -* Officially changed name to lower-case -* bug: colors on Windows 10 (#541) -* bug: fix race in accessing level (#512) - -# 0.11.5 - -* feature: add writer and writerlevel to entry (#372) - -# 0.11.4 - -* bug: fix undefined variable on solaris (#493) - -# 0.11.3 - -* formatter: configure quoting of empty values (#484) -* formatter: configure quoting character (default is `"`) (#484) -* bug: fix not importing io correctly in non-linux environments (#481) - -# 0.11.2 - -* bug: fix windows terminal detection (#476) - -# 0.11.1 - -* bug: fix tty detection with custom out (#471) - -# 0.11.0 - -* performance: Use bufferpool to allocate (#370) -* terminal: terminal detection for app-engine (#343) -* feature: exit handler (#375) - -# 0.10.0 - -* feature: Add a test hook (#180) -* feature: `ParseLevel` is now case-insensitive (#326) -* feature: `FieldLogger` interface that generalizes `Logger` and `Entry` (#308) -* performance: avoid re-allocations on `WithFields` (#335) - -# 0.9.0 - -* logrus/text_formatter: don't emit empty msg -* logrus/hooks/airbrake: move out of main repository -* logrus/hooks/sentry: move out of main repository -* logrus/hooks/papertrail: move out of main repository -* logrus/hooks/bugsnag: move out of main repository -* logrus/core: run tests with `-race` -* logrus/core: detect TTY based on `stderr` -* logrus/core: support `WithError` on logger -* logrus/core: Solaris support - -# 0.8.7 - -* logrus/core: fix possible race (#216) -* logrus/doc: small typo fixes and doc improvements - - -# 0.8.6 - -* hooks/raven: allow passing an initialized client - -# 0.8.5 - -* logrus/core: revert #208 - -# 0.8.4 - -* formatter/text: fix data race (#218) - -# 0.8.3 - -* logrus/core: fix entry log level (#208) -* logrus/core: improve performance of text formatter by 40% -* logrus/core: expose `LevelHooks` type -* logrus/core: add support for DragonflyBSD and NetBSD -* formatter/text: print structs more verbosely - -# 0.8.2 - -* logrus: fix more Fatal family functions - -# 0.8.1 - -* logrus: fix not exiting on `Fatalf` and `Fatalln` - -# 0.8.0 - -* logrus: defaults to stderr instead of stdout -* hooks/sentry: add special field for `*http.Request` -* formatter/text: ignore Windows for colors - -# 0.7.3 - -* formatter/\*: allow configuration of timestamp layout - -# 0.7.2 - -* formatter/text: Add configuration option for time format (#158) diff --git a/vendor/github.com/sirupsen/logrus/LICENSE b/vendor/github.com/sirupsen/logrus/LICENSE deleted file mode 100644 index f090cb4..0000000 --- a/vendor/github.com/sirupsen/logrus/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Simon Eskildsen - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/vendor/github.com/sirupsen/logrus/README.md b/vendor/github.com/sirupsen/logrus/README.md deleted file mode 100644 index 5152b6a..0000000 --- a/vendor/github.com/sirupsen/logrus/README.md +++ /dev/null @@ -1,513 +0,0 @@ -# Logrus :walrus: [![Build Status](https://travis-ci.org/sirupsen/logrus.svg?branch=master)](https://travis-ci.org/sirupsen/logrus) [![GoDoc](https://godoc.org/github.com/sirupsen/logrus?status.svg)](https://godoc.org/github.com/sirupsen/logrus) - -Logrus is a structured logger for Go (golang), completely API compatible with -the standard library logger. - -**Logrus is in maintenance-mode.** We will not be introducing new features. It's -simply too hard to do in a way that won't break many people's projects, which is -the last thing you want from your Logging library (again...). - -This does not mean Logrus is dead. Logrus will continue to be maintained for -security, (backwards compatible) bug fixes, and performance (where we are -limited by the interface). - -I believe Logrus' biggest contribution is to have played a part in today's -widespread use of structured logging in Golang. There doesn't seem to be a -reason to do a major, breaking iteration into Logrus V2, since the fantastic Go -community has built those independently. Many fantastic alternatives have sprung -up. Logrus would look like those, had it been re-designed with what we know -about structured logging in Go today. Check out, for example, -[Zerolog][zerolog], [Zap][zap], and [Apex][apex]. - -[zerolog]: https://github.com/rs/zerolog -[zap]: https://github.com/uber-go/zap -[apex]: https://github.com/apex/log - -**Seeing weird case-sensitive problems?** It's in the past been possible to -import Logrus as both upper- and lower-case. Due to the Go package environment, -this caused issues in the community and we needed a standard. Some environments -experienced problems with the upper-case variant, so the lower-case was decided. -Everything using `logrus` will need to use the lower-case: -`github.com/sirupsen/logrus`. Any package that isn't, should be changed. - -To fix Glide, see [these -comments](https://github.com/sirupsen/logrus/issues/553#issuecomment-306591437). -For an in-depth explanation of the casing issue, see [this -comment](https://github.com/sirupsen/logrus/issues/570#issuecomment-313933276). - -Nicely color-coded in development (when a TTY is attached, otherwise just -plain text): - -![Colored](http://i.imgur.com/PY7qMwd.png) - -With `log.SetFormatter(&log.JSONFormatter{})`, for easy parsing by logstash -or Splunk: - -```json -{"animal":"walrus","level":"info","msg":"A group of walrus emerges from the -ocean","size":10,"time":"2014-03-10 19:57:38.562264131 -0400 EDT"} - -{"level":"warning","msg":"The group's number increased tremendously!", -"number":122,"omg":true,"time":"2014-03-10 19:57:38.562471297 -0400 EDT"} - -{"animal":"walrus","level":"info","msg":"A giant walrus appears!", -"size":10,"time":"2014-03-10 19:57:38.562500591 -0400 EDT"} - -{"animal":"walrus","level":"info","msg":"Tremendously sized cow enters the ocean.", -"size":9,"time":"2014-03-10 19:57:38.562527896 -0400 EDT"} - -{"level":"fatal","msg":"The ice breaks!","number":100,"omg":true, -"time":"2014-03-10 19:57:38.562543128 -0400 EDT"} -``` - -With the default `log.SetFormatter(&log.TextFormatter{})` when a TTY is not -attached, the output is compatible with the -[logfmt](http://godoc.org/github.com/kr/logfmt) format: - -```text -time="2015-03-26T01:27:38-04:00" level=debug msg="Started observing beach" animal=walrus number=8 -time="2015-03-26T01:27:38-04:00" level=info msg="A group of walrus emerges from the ocean" animal=walrus size=10 -time="2015-03-26T01:27:38-04:00" level=warning msg="The group's number increased tremendously!" number=122 omg=true -time="2015-03-26T01:27:38-04:00" level=debug msg="Temperature changes" temperature=-4 -time="2015-03-26T01:27:38-04:00" level=panic msg="It's over 9000!" animal=orca size=9009 -time="2015-03-26T01:27:38-04:00" level=fatal msg="The ice breaks!" err=&{0x2082280c0 map[animal:orca size:9009] 2015-03-26 01:27:38.441574009 -0400 EDT panic It's over 9000!} number=100 omg=true -``` -To ensure this behaviour even if a TTY is attached, set your formatter as follows: - -```go - log.SetFormatter(&log.TextFormatter{ - DisableColors: true, - FullTimestamp: true, - }) -``` - -#### Logging Method Name - -If you wish to add the calling method as a field, instruct the logger via: -```go -log.SetReportCaller(true) -``` -This adds the caller as 'method' like so: - -```json -{"animal":"penguin","level":"fatal","method":"github.com/sirupsen/arcticcreatures.migrate","msg":"a penguin swims by", -"time":"2014-03-10 19:57:38.562543129 -0400 EDT"} -``` - -```text -time="2015-03-26T01:27:38-04:00" level=fatal method=github.com/sirupsen/arcticcreatures.migrate msg="a penguin swims by" animal=penguin -``` -Note that this does add measurable overhead - the cost will depend on the version of Go, but is -between 20 and 40% in recent tests with 1.6 and 1.7. You can validate this in your -environment via benchmarks: -``` -go test -bench=.*CallerTracing -``` - - -#### Case-sensitivity - -The organization's name was changed to lower-case--and this will not be changed -back. If you are getting import conflicts due to case sensitivity, please use -the lower-case import: `github.com/sirupsen/logrus`. - -#### Example - -The simplest way to use Logrus is simply the package-level exported logger: - -```go -package main - -import ( - log "github.com/sirupsen/logrus" -) - -func main() { - log.WithFields(log.Fields{ - "animal": "walrus", - }).Info("A walrus appears") -} -``` - -Note that it's completely api-compatible with the stdlib logger, so you can -replace your `log` imports everywhere with `log "github.com/sirupsen/logrus"` -and you'll now have the flexibility of Logrus. You can customize it all you -want: - -```go -package main - -import ( - "os" - log "github.com/sirupsen/logrus" -) - -func init() { - // Log as JSON instead of the default ASCII formatter. - log.SetFormatter(&log.JSONFormatter{}) - - // Output to stdout instead of the default stderr - // Can be any io.Writer, see below for File example - log.SetOutput(os.Stdout) - - // Only log the warning severity or above. - log.SetLevel(log.WarnLevel) -} - -func main() { - log.WithFields(log.Fields{ - "animal": "walrus", - "size": 10, - }).Info("A group of walrus emerges from the ocean") - - log.WithFields(log.Fields{ - "omg": true, - "number": 122, - }).Warn("The group's number increased tremendously!") - - log.WithFields(log.Fields{ - "omg": true, - "number": 100, - }).Fatal("The ice breaks!") - - // A common pattern is to re-use fields between logging statements by re-using - // the logrus.Entry returned from WithFields() - contextLogger := log.WithFields(log.Fields{ - "common": "this is a common field", - "other": "I also should be logged always", - }) - - contextLogger.Info("I'll be logged with common and other field") - contextLogger.Info("Me too") -} -``` - -For more advanced usage such as logging to multiple locations from the same -application, you can also create an instance of the `logrus` Logger: - -```go -package main - -import ( - "os" - "github.com/sirupsen/logrus" -) - -// Create a new instance of the logger. You can have any number of instances. -var log = logrus.New() - -func main() { - // The API for setting attributes is a little different than the package level - // exported logger. See Godoc. - log.Out = os.Stdout - - // You could set this to any `io.Writer` such as a file - // file, err := os.OpenFile("logrus.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666) - // if err == nil { - // log.Out = file - // } else { - // log.Info("Failed to log to file, using default stderr") - // } - - log.WithFields(logrus.Fields{ - "animal": "walrus", - "size": 10, - }).Info("A group of walrus emerges from the ocean") -} -``` - -#### Fields - -Logrus encourages careful, structured logging through logging fields instead of -long, unparseable error messages. For example, instead of: `log.Fatalf("Failed -to send event %s to topic %s with key %d")`, you should log the much more -discoverable: - -```go -log.WithFields(log.Fields{ - "event": event, - "topic": topic, - "key": key, -}).Fatal("Failed to send event") -``` - -We've found this API forces you to think about logging in a way that produces -much more useful logging messages. We've been in countless situations where just -a single added field to a log statement that was already there would've saved us -hours. The `WithFields` call is optional. - -In general, with Logrus using any of the `printf`-family functions should be -seen as a hint you should add a field, however, you can still use the -`printf`-family functions with Logrus. - -#### Default Fields - -Often it's helpful to have fields _always_ attached to log statements in an -application or parts of one. For example, you may want to always log the -`request_id` and `user_ip` in the context of a request. Instead of writing -`log.WithFields(log.Fields{"request_id": request_id, "user_ip": user_ip})` on -every line, you can create a `logrus.Entry` to pass around instead: - -```go -requestLogger := log.WithFields(log.Fields{"request_id": request_id, "user_ip": user_ip}) -requestLogger.Info("something happened on that request") # will log request_id and user_ip -requestLogger.Warn("something not great happened") -``` - -#### Hooks - -You can add hooks for logging levels. For example to send errors to an exception -tracking service on `Error`, `Fatal` and `Panic`, info to StatsD or log to -multiple places simultaneously, e.g. syslog. - -Logrus comes with [built-in hooks](hooks/). Add those, or your custom hook, in -`init`: - -```go -import ( - log "github.com/sirupsen/logrus" - "gopkg.in/gemnasium/logrus-airbrake-hook.v2" // the package is named "airbrake" - logrus_syslog "github.com/sirupsen/logrus/hooks/syslog" - "log/syslog" -) - -func init() { - - // Use the Airbrake hook to report errors that have Error severity or above to - // an exception tracker. You can create custom hooks, see the Hooks section. - log.AddHook(airbrake.NewHook(123, "xyz", "production")) - - hook, err := logrus_syslog.NewSyslogHook("udp", "localhost:514", syslog.LOG_INFO, "") - if err != nil { - log.Error("Unable to connect to local syslog daemon") - } else { - log.AddHook(hook) - } -} -``` -Note: Syslog hook also support connecting to local syslog (Ex. "/dev/log" or "/var/run/syslog" or "/var/run/log"). For the detail, please check the [syslog hook README](hooks/syslog/README.md). - -A list of currently known service hooks can be found in this wiki [page](https://github.com/sirupsen/logrus/wiki/Hooks) - - -#### Level logging - -Logrus has seven logging levels: Trace, Debug, Info, Warning, Error, Fatal and Panic. - -```go -log.Trace("Something very low level.") -log.Debug("Useful debugging information.") -log.Info("Something noteworthy happened!") -log.Warn("You should probably take a look at this.") -log.Error("Something failed but I'm not quitting.") -// Calls os.Exit(1) after logging -log.Fatal("Bye.") -// Calls panic() after logging -log.Panic("I'm bailing.") -``` - -You can set the logging level on a `Logger`, then it will only log entries with -that severity or anything above it: - -```go -// Will log anything that is info or above (warn, error, fatal, panic). Default. -log.SetLevel(log.InfoLevel) -``` - -It may be useful to set `log.Level = logrus.DebugLevel` in a debug or verbose -environment if your application has that. - -#### Entries - -Besides the fields added with `WithField` or `WithFields` some fields are -automatically added to all logging events: - -1. `time`. The timestamp when the entry was created. -2. `msg`. The logging message passed to `{Info,Warn,Error,Fatal,Panic}` after - the `AddFields` call. E.g. `Failed to send event.` -3. `level`. The logging level. E.g. `info`. - -#### Environments - -Logrus has no notion of environment. - -If you wish for hooks and formatters to only be used in specific environments, -you should handle that yourself. For example, if your application has a global -variable `Environment`, which is a string representation of the environment you -could do: - -```go -import ( - log "github.com/sirupsen/logrus" -) - -init() { - // do something here to set environment depending on an environment variable - // or command-line flag - if Environment == "production" { - log.SetFormatter(&log.JSONFormatter{}) - } else { - // The TextFormatter is default, you don't actually have to do this. - log.SetFormatter(&log.TextFormatter{}) - } -} -``` - -This configuration is how `logrus` was intended to be used, but JSON in -production is mostly only useful if you do log aggregation with tools like -Splunk or Logstash. - -#### Formatters - -The built-in logging formatters are: - -* `logrus.TextFormatter`. Logs the event in colors if stdout is a tty, otherwise - without colors. - * *Note:* to force colored output when there is no TTY, set the `ForceColors` - field to `true`. To force no colored output even if there is a TTY set the - `DisableColors` field to `true`. For Windows, see - [github.com/mattn/go-colorable](https://github.com/mattn/go-colorable). - * When colors are enabled, levels are truncated to 4 characters by default. To disable - truncation set the `DisableLevelTruncation` field to `true`. - * When outputting to a TTY, it's often helpful to visually scan down a column where all the levels are the same width. Setting the `PadLevelText` field to `true` enables this behavior, by adding padding to the level text. - * All options are listed in the [generated docs](https://godoc.org/github.com/sirupsen/logrus#TextFormatter). -* `logrus.JSONFormatter`. Logs fields as JSON. - * All options are listed in the [generated docs](https://godoc.org/github.com/sirupsen/logrus#JSONFormatter). - -Third party logging formatters: - -* [`FluentdFormatter`](https://github.com/joonix/log). Formats entries that can be parsed by Kubernetes and Google Container Engine. -* [`GELF`](https://github.com/fabienm/go-logrus-formatters). Formats entries so they comply to Graylog's [GELF 1.1 specification](http://docs.graylog.org/en/2.4/pages/gelf.html). -* [`logstash`](https://github.com/bshuster-repo/logrus-logstash-hook). Logs fields as [Logstash](http://logstash.net) Events. -* [`prefixed`](https://github.com/x-cray/logrus-prefixed-formatter). Displays log entry source along with alternative layout. -* [`zalgo`](https://github.com/aybabtme/logzalgo). Invoking the Power of Zalgo. -* [`nested-logrus-formatter`](https://github.com/antonfisher/nested-logrus-formatter). Converts logrus fields to a nested structure. -* [`powerful-logrus-formatter`](https://github.com/zput/zxcTool). get fileName, log's line number and the latest function's name when print log; Sava log to files. -* [`caption-json-formatter`](https://github.com/nolleh/caption_json_formatter). logrus's message json formatter with human-readable caption added. - -You can define your formatter by implementing the `Formatter` interface, -requiring a `Format` method. `Format` takes an `*Entry`. `entry.Data` is a -`Fields` type (`map[string]interface{}`) with all your fields as well as the -default ones (see Entries section above): - -```go -type MyJSONFormatter struct { -} - -log.SetFormatter(new(MyJSONFormatter)) - -func (f *MyJSONFormatter) Format(entry *Entry) ([]byte, error) { - // Note this doesn't include Time, Level and Message which are available on - // the Entry. Consult `godoc` on information about those fields or read the - // source of the official loggers. - serialized, err := json.Marshal(entry.Data) - if err != nil { - return nil, fmt.Errorf("Failed to marshal fields to JSON, %w", err) - } - return append(serialized, '\n'), nil -} -``` - -#### Logger as an `io.Writer` - -Logrus can be transformed into an `io.Writer`. That writer is the end of an `io.Pipe` and it is your responsibility to close it. - -```go -w := logger.Writer() -defer w.Close() - -srv := http.Server{ - // create a stdlib log.Logger that writes to - // logrus.Logger. - ErrorLog: log.New(w, "", 0), -} -``` - -Each line written to that writer will be printed the usual way, using formatters -and hooks. The level for those entries is `info`. - -This means that we can override the standard library logger easily: - -```go -logger := logrus.New() -logger.Formatter = &logrus.JSONFormatter{} - -// Use logrus for standard log output -// Note that `log` here references stdlib's log -// Not logrus imported under the name `log`. -log.SetOutput(logger.Writer()) -``` - -#### Rotation - -Log rotation is not provided with Logrus. Log rotation should be done by an -external program (like `logrotate(8)`) that can compress and delete old log -entries. It should not be a feature of the application-level logger. - -#### Tools - -| Tool | Description | -| ---- | ----------- | -|[Logrus Mate](https://github.com/gogap/logrus_mate)|Logrus mate is a tool for Logrus to manage loggers, you can initial logger's level, hook and formatter by config file, the logger will be generated with different configs in different environments.| -|[Logrus Viper Helper](https://github.com/heirko/go-contrib/tree/master/logrusHelper)|An Helper around Logrus to wrap with spf13/Viper to load configuration with fangs! And to simplify Logrus configuration use some behavior of [Logrus Mate](https://github.com/gogap/logrus_mate). [sample](https://github.com/heirko/iris-contrib/blob/master/middleware/logrus-logger/example) | - -#### Testing - -Logrus has a built in facility for asserting the presence of log messages. This is implemented through the `test` hook and provides: - -* decorators for existing logger (`test.NewLocal` and `test.NewGlobal`) which basically just adds the `test` hook -* a test logger (`test.NewNullLogger`) that just records log messages (and does not output any): - -```go -import( - "github.com/sirupsen/logrus" - "github.com/sirupsen/logrus/hooks/test" - "github.com/stretchr/testify/assert" - "testing" -) - -func TestSomething(t*testing.T){ - logger, hook := test.NewNullLogger() - logger.Error("Helloerror") - - assert.Equal(t, 1, len(hook.Entries)) - assert.Equal(t, logrus.ErrorLevel, hook.LastEntry().Level) - assert.Equal(t, "Helloerror", hook.LastEntry().Message) - - hook.Reset() - assert.Nil(t, hook.LastEntry()) -} -``` - -#### Fatal handlers - -Logrus can register one or more functions that will be called when any `fatal` -level message is logged. The registered handlers will be executed before -logrus performs an `os.Exit(1)`. This behavior may be helpful if callers need -to gracefully shutdown. Unlike a `panic("Something went wrong...")` call which can be intercepted with a deferred `recover` a call to `os.Exit(1)` can not be intercepted. - -``` -... -handler := func() { - // gracefully shutdown something... -} -logrus.RegisterExitHandler(handler) -... -``` - -#### Thread safety - -By default, Logger is protected by a mutex for concurrent writes. The mutex is held when calling hooks and writing logs. -If you are sure such locking is not needed, you can call logger.SetNoLock() to disable the locking. - -Situation when locking is not needed includes: - -* You have no hooks registered, or hooks calling is already thread-safe. - -* Writing to logger.Out is already thread-safe, for example: - - 1) logger.Out is protected by locks. - - 2) logger.Out is an os.File handler opened with `O_APPEND` flag, and every write is smaller than 4k. (This allows multi-thread/multi-process writing) - - (Refer to http://www.notthewizard.com/2014/06/17/are-files-appends-really-atomic/) diff --git a/vendor/github.com/sirupsen/logrus/alt_exit.go b/vendor/github.com/sirupsen/logrus/alt_exit.go deleted file mode 100644 index 8fd189e..0000000 --- a/vendor/github.com/sirupsen/logrus/alt_exit.go +++ /dev/null @@ -1,76 +0,0 @@ -package logrus - -// The following code was sourced and modified from the -// https://github.com/tebeka/atexit package governed by the following license: -// -// Copyright (c) 2012 Miki Tebeka . -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of -// this software and associated documentation files (the "Software"), to deal in -// the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software is furnished to do so, -// subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -import ( - "fmt" - "os" -) - -var handlers = []func(){} - -func runHandler(handler func()) { - defer func() { - if err := recover(); err != nil { - fmt.Fprintln(os.Stderr, "Error: Logrus exit handler error:", err) - } - }() - - handler() -} - -func runHandlers() { - for _, handler := range handlers { - runHandler(handler) - } -} - -// Exit runs all the Logrus atexit handlers and then terminates the program using os.Exit(code) -func Exit(code int) { - runHandlers() - os.Exit(code) -} - -// RegisterExitHandler appends a Logrus Exit handler to the list of handlers, -// call logrus.Exit to invoke all handlers. The handlers will also be invoked when -// any Fatal log entry is made. -// -// This method is useful when a caller wishes to use logrus to log a fatal -// message but also needs to gracefully shutdown. An example usecase could be -// closing database connections, or sending a alert that the application is -// closing. -func RegisterExitHandler(handler func()) { - handlers = append(handlers, handler) -} - -// DeferExitHandler prepends a Logrus Exit handler to the list of handlers, -// call logrus.Exit to invoke all handlers. The handlers will also be invoked when -// any Fatal log entry is made. -// -// This method is useful when a caller wishes to use logrus to log a fatal -// message but also needs to gracefully shutdown. An example usecase could be -// closing database connections, or sending a alert that the application is -// closing. -func DeferExitHandler(handler func()) { - handlers = append([]func(){handler}, handlers...) -} diff --git a/vendor/github.com/sirupsen/logrus/appveyor.yml b/vendor/github.com/sirupsen/logrus/appveyor.yml deleted file mode 100644 index df9d65c..0000000 --- a/vendor/github.com/sirupsen/logrus/appveyor.yml +++ /dev/null @@ -1,14 +0,0 @@ -version: "{build}" -platform: x64 -clone_folder: c:\gopath\src\github.com\sirupsen\logrus -environment: - GOPATH: c:\gopath -branches: - only: - - master -install: - - set PATH=%GOPATH%\bin;c:\go\bin;%PATH% - - go version -build_script: - - go get -t - - go test diff --git a/vendor/github.com/sirupsen/logrus/buffer_pool.go b/vendor/github.com/sirupsen/logrus/buffer_pool.go deleted file mode 100644 index 4545dec..0000000 --- a/vendor/github.com/sirupsen/logrus/buffer_pool.go +++ /dev/null @@ -1,52 +0,0 @@ -package logrus - -import ( - "bytes" - "sync" -) - -var ( - bufferPool BufferPool -) - -type BufferPool interface { - Put(*bytes.Buffer) - Get() *bytes.Buffer -} - -type defaultPool struct { - pool *sync.Pool -} - -func (p *defaultPool) Put(buf *bytes.Buffer) { - p.pool.Put(buf) -} - -func (p *defaultPool) Get() *bytes.Buffer { - return p.pool.Get().(*bytes.Buffer) -} - -func getBuffer() *bytes.Buffer { - return bufferPool.Get() -} - -func putBuffer(buf *bytes.Buffer) { - buf.Reset() - bufferPool.Put(buf) -} - -// SetBufferPool allows to replace the default logrus buffer pool -// to better meets the specific needs of an application. -func SetBufferPool(bp BufferPool) { - bufferPool = bp -} - -func init() { - SetBufferPool(&defaultPool{ - pool: &sync.Pool{ - New: func() interface{} { - return new(bytes.Buffer) - }, - }, - }) -} diff --git a/vendor/github.com/sirupsen/logrus/doc.go b/vendor/github.com/sirupsen/logrus/doc.go deleted file mode 100644 index da67aba..0000000 --- a/vendor/github.com/sirupsen/logrus/doc.go +++ /dev/null @@ -1,26 +0,0 @@ -/* -Package logrus is a structured logger for Go, completely API compatible with the standard library logger. - - -The simplest way to use Logrus is simply the package-level exported logger: - - package main - - import ( - log "github.com/sirupsen/logrus" - ) - - func main() { - log.WithFields(log.Fields{ - "animal": "walrus", - "number": 1, - "size": 10, - }).Info("A walrus appears") - } - -Output: - time="2015-09-07T08:48:33Z" level=info msg="A walrus appears" animal=walrus number=1 size=10 - -For a full guide visit https://github.com/sirupsen/logrus -*/ -package logrus diff --git a/vendor/github.com/sirupsen/logrus/entry.go b/vendor/github.com/sirupsen/logrus/entry.go deleted file mode 100644 index 07a1e5f..0000000 --- a/vendor/github.com/sirupsen/logrus/entry.go +++ /dev/null @@ -1,431 +0,0 @@ -package logrus - -import ( - "bytes" - "context" - "fmt" - "os" - "reflect" - "runtime" - "strings" - "sync" - "time" -) - -var ( - - // qualified package name, cached at first use - logrusPackage string - - // Positions in the call stack when tracing to report the calling method - minimumCallerDepth int - - // Used for caller information initialisation - callerInitOnce sync.Once -) - -const ( - maximumCallerDepth int = 25 - knownLogrusFrames int = 4 -) - -func init() { - // start at the bottom of the stack before the package-name cache is primed - minimumCallerDepth = 1 -} - -// Defines the key when adding errors using WithError. -var ErrorKey = "error" - -// An entry is the final or intermediate Logrus logging entry. It contains all -// the fields passed with WithField{,s}. It's finally logged when Trace, Debug, -// Info, Warn, Error, Fatal or Panic is called on it. These objects can be -// reused and passed around as much as you wish to avoid field duplication. -type Entry struct { - Logger *Logger - - // Contains all the fields set by the user. - Data Fields - - // Time at which the log entry was created - Time time.Time - - // Level the log entry was logged at: Trace, Debug, Info, Warn, Error, Fatal or Panic - // This field will be set on entry firing and the value will be equal to the one in Logger struct field. - Level Level - - // Calling method, with package name - Caller *runtime.Frame - - // Message passed to Trace, Debug, Info, Warn, Error, Fatal or Panic - Message string - - // When formatter is called in entry.log(), a Buffer may be set to entry - Buffer *bytes.Buffer - - // Contains the context set by the user. Useful for hook processing etc. - Context context.Context - - // err may contain a field formatting error - err string -} - -func NewEntry(logger *Logger) *Entry { - return &Entry{ - Logger: logger, - // Default is three fields, plus one optional. Give a little extra room. - Data: make(Fields, 6), - } -} - -func (entry *Entry) Dup() *Entry { - data := make(Fields, len(entry.Data)) - for k, v := range entry.Data { - data[k] = v - } - return &Entry{Logger: entry.Logger, Data: data, Time: entry.Time, Context: entry.Context, err: entry.err} -} - -// Returns the bytes representation of this entry from the formatter. -func (entry *Entry) Bytes() ([]byte, error) { - return entry.Logger.Formatter.Format(entry) -} - -// Returns the string representation from the reader and ultimately the -// formatter. -func (entry *Entry) String() (string, error) { - serialized, err := entry.Bytes() - if err != nil { - return "", err - } - str := string(serialized) - return str, nil -} - -// Add an error as single field (using the key defined in ErrorKey) to the Entry. -func (entry *Entry) WithError(err error) *Entry { - return entry.WithField(ErrorKey, err) -} - -// Add a context to the Entry. -func (entry *Entry) WithContext(ctx context.Context) *Entry { - dataCopy := make(Fields, len(entry.Data)) - for k, v := range entry.Data { - dataCopy[k] = v - } - return &Entry{Logger: entry.Logger, Data: dataCopy, Time: entry.Time, err: entry.err, Context: ctx} -} - -// Add a single field to the Entry. -func (entry *Entry) WithField(key string, value interface{}) *Entry { - return entry.WithFields(Fields{key: value}) -} - -// Add a map of fields to the Entry. -func (entry *Entry) WithFields(fields Fields) *Entry { - data := make(Fields, len(entry.Data)+len(fields)) - for k, v := range entry.Data { - data[k] = v - } - fieldErr := entry.err - for k, v := range fields { - isErrField := false - if t := reflect.TypeOf(v); t != nil { - switch { - case t.Kind() == reflect.Func, t.Kind() == reflect.Ptr && t.Elem().Kind() == reflect.Func: - isErrField = true - } - } - if isErrField { - tmp := fmt.Sprintf("can not add field %q", k) - if fieldErr != "" { - fieldErr = entry.err + ", " + tmp - } else { - fieldErr = tmp - } - } else { - data[k] = v - } - } - return &Entry{Logger: entry.Logger, Data: data, Time: entry.Time, err: fieldErr, Context: entry.Context} -} - -// Overrides the time of the Entry. -func (entry *Entry) WithTime(t time.Time) *Entry { - dataCopy := make(Fields, len(entry.Data)) - for k, v := range entry.Data { - dataCopy[k] = v - } - return &Entry{Logger: entry.Logger, Data: dataCopy, Time: t, err: entry.err, Context: entry.Context} -} - -// getPackageName reduces a fully qualified function name to the package name -// There really ought to be to be a better way... -func getPackageName(f string) string { - for { - lastPeriod := strings.LastIndex(f, ".") - lastSlash := strings.LastIndex(f, "/") - if lastPeriod > lastSlash { - f = f[:lastPeriod] - } else { - break - } - } - - return f -} - -// getCaller retrieves the name of the first non-logrus calling function -func getCaller() *runtime.Frame { - // cache this package's fully-qualified name - callerInitOnce.Do(func() { - pcs := make([]uintptr, maximumCallerDepth) - _ = runtime.Callers(0, pcs) - - // dynamic get the package name and the minimum caller depth - for i := 0; i < maximumCallerDepth; i++ { - funcName := runtime.FuncForPC(pcs[i]).Name() - if strings.Contains(funcName, "getCaller") { - logrusPackage = getPackageName(funcName) - break - } - } - - minimumCallerDepth = knownLogrusFrames - }) - - // Restrict the lookback frames to avoid runaway lookups - pcs := make([]uintptr, maximumCallerDepth) - depth := runtime.Callers(minimumCallerDepth, pcs) - frames := runtime.CallersFrames(pcs[:depth]) - - for f, again := frames.Next(); again; f, again = frames.Next() { - pkg := getPackageName(f.Function) - - // If the caller isn't part of this package, we're done - if pkg != logrusPackage { - return &f //nolint:scopelint - } - } - - // if we got here, we failed to find the caller's context - return nil -} - -func (entry Entry) HasCaller() (has bool) { - return entry.Logger != nil && - entry.Logger.ReportCaller && - entry.Caller != nil -} - -func (entry *Entry) log(level Level, msg string) { - var buffer *bytes.Buffer - - newEntry := entry.Dup() - - if newEntry.Time.IsZero() { - newEntry.Time = time.Now() - } - - newEntry.Level = level - newEntry.Message = msg - - newEntry.Logger.mu.Lock() - reportCaller := newEntry.Logger.ReportCaller - newEntry.Logger.mu.Unlock() - - if reportCaller { - newEntry.Caller = getCaller() - } - - newEntry.fireHooks() - - buffer = getBuffer() - defer func() { - newEntry.Buffer = nil - putBuffer(buffer) - }() - buffer.Reset() - newEntry.Buffer = buffer - - newEntry.write() - - newEntry.Buffer = nil - - // To avoid Entry#log() returning a value that only would make sense for - // panic() to use in Entry#Panic(), we avoid the allocation by checking - // directly here. - if level <= PanicLevel { - panic(newEntry) - } -} - -func (entry *Entry) fireHooks() { - var tmpHooks LevelHooks - entry.Logger.mu.Lock() - tmpHooks = make(LevelHooks, len(entry.Logger.Hooks)) - for k, v := range entry.Logger.Hooks { - tmpHooks[k] = v - } - entry.Logger.mu.Unlock() - - err := tmpHooks.Fire(entry.Level, entry) - if err != nil { - fmt.Fprintf(os.Stderr, "Failed to fire hook: %v\n", err) - } -} - -func (entry *Entry) write() { - serialized, err := entry.Logger.Formatter.Format(entry) - if err != nil { - fmt.Fprintf(os.Stderr, "Failed to obtain reader, %v\n", err) - return - } - entry.Logger.mu.Lock() - defer entry.Logger.mu.Unlock() - if _, err := entry.Logger.Out.Write(serialized); err != nil { - fmt.Fprintf(os.Stderr, "Failed to write to log, %v\n", err) - } -} - -func (entry *Entry) Log(level Level, args ...interface{}) { - if entry.Logger.IsLevelEnabled(level) { - entry.log(level, fmt.Sprint(args...)) - } -} - -func (entry *Entry) Trace(args ...interface{}) { - entry.Log(TraceLevel, args...) -} - -func (entry *Entry) Debug(args ...interface{}) { - entry.Log(DebugLevel, args...) -} - -func (entry *Entry) Print(args ...interface{}) { - entry.Info(args...) -} - -func (entry *Entry) Info(args ...interface{}) { - entry.Log(InfoLevel, args...) -} - -func (entry *Entry) Warn(args ...interface{}) { - entry.Log(WarnLevel, args...) -} - -func (entry *Entry) Warning(args ...interface{}) { - entry.Warn(args...) -} - -func (entry *Entry) Error(args ...interface{}) { - entry.Log(ErrorLevel, args...) -} - -func (entry *Entry) Fatal(args ...interface{}) { - entry.Log(FatalLevel, args...) - entry.Logger.Exit(1) -} - -func (entry *Entry) Panic(args ...interface{}) { - entry.Log(PanicLevel, args...) -} - -// Entry Printf family functions - -func (entry *Entry) Logf(level Level, format string, args ...interface{}) { - if entry.Logger.IsLevelEnabled(level) { - entry.Log(level, fmt.Sprintf(format, args...)) - } -} - -func (entry *Entry) Tracef(format string, args ...interface{}) { - entry.Logf(TraceLevel, format, args...) -} - -func (entry *Entry) Debugf(format string, args ...interface{}) { - entry.Logf(DebugLevel, format, args...) -} - -func (entry *Entry) Infof(format string, args ...interface{}) { - entry.Logf(InfoLevel, format, args...) -} - -func (entry *Entry) Printf(format string, args ...interface{}) { - entry.Infof(format, args...) -} - -func (entry *Entry) Warnf(format string, args ...interface{}) { - entry.Logf(WarnLevel, format, args...) -} - -func (entry *Entry) Warningf(format string, args ...interface{}) { - entry.Warnf(format, args...) -} - -func (entry *Entry) Errorf(format string, args ...interface{}) { - entry.Logf(ErrorLevel, format, args...) -} - -func (entry *Entry) Fatalf(format string, args ...interface{}) { - entry.Logf(FatalLevel, format, args...) - entry.Logger.Exit(1) -} - -func (entry *Entry) Panicf(format string, args ...interface{}) { - entry.Logf(PanicLevel, format, args...) -} - -// Entry Println family functions - -func (entry *Entry) Logln(level Level, args ...interface{}) { - if entry.Logger.IsLevelEnabled(level) { - entry.Log(level, entry.sprintlnn(args...)) - } -} - -func (entry *Entry) Traceln(args ...interface{}) { - entry.Logln(TraceLevel, args...) -} - -func (entry *Entry) Debugln(args ...interface{}) { - entry.Logln(DebugLevel, args...) -} - -func (entry *Entry) Infoln(args ...interface{}) { - entry.Logln(InfoLevel, args...) -} - -func (entry *Entry) Println(args ...interface{}) { - entry.Infoln(args...) -} - -func (entry *Entry) Warnln(args ...interface{}) { - entry.Logln(WarnLevel, args...) -} - -func (entry *Entry) Warningln(args ...interface{}) { - entry.Warnln(args...) -} - -func (entry *Entry) Errorln(args ...interface{}) { - entry.Logln(ErrorLevel, args...) -} - -func (entry *Entry) Fatalln(args ...interface{}) { - entry.Logln(FatalLevel, args...) - entry.Logger.Exit(1) -} - -func (entry *Entry) Panicln(args ...interface{}) { - entry.Logln(PanicLevel, args...) -} - -// Sprintlnn => Sprint no newline. This is to get the behavior of how -// fmt.Sprintln where spaces are always added between operands, regardless of -// their type. Instead of vendoring the Sprintln implementation to spare a -// string allocation, we do the simplest thing. -func (entry *Entry) sprintlnn(args ...interface{}) string { - msg := fmt.Sprintln(args...) - return msg[:len(msg)-1] -} diff --git a/vendor/github.com/sirupsen/logrus/exported.go b/vendor/github.com/sirupsen/logrus/exported.go deleted file mode 100644 index 017c30c..0000000 --- a/vendor/github.com/sirupsen/logrus/exported.go +++ /dev/null @@ -1,270 +0,0 @@ -package logrus - -import ( - "context" - "io" - "time" -) - -var ( - // std is the name of the standard logger in stdlib `log` - std = New() -) - -func StandardLogger() *Logger { - return std -} - -// SetOutput sets the standard logger output. -func SetOutput(out io.Writer) { - std.SetOutput(out) -} - -// SetFormatter sets the standard logger formatter. -func SetFormatter(formatter Formatter) { - std.SetFormatter(formatter) -} - -// SetReportCaller sets whether the standard logger will include the calling -// method as a field. -func SetReportCaller(include bool) { - std.SetReportCaller(include) -} - -// SetLevel sets the standard logger level. -func SetLevel(level Level) { - std.SetLevel(level) -} - -// GetLevel returns the standard logger level. -func GetLevel() Level { - return std.GetLevel() -} - -// IsLevelEnabled checks if the log level of the standard logger is greater than the level param -func IsLevelEnabled(level Level) bool { - return std.IsLevelEnabled(level) -} - -// AddHook adds a hook to the standard logger hooks. -func AddHook(hook Hook) { - std.AddHook(hook) -} - -// WithError creates an entry from the standard logger and adds an error to it, using the value defined in ErrorKey as key. -func WithError(err error) *Entry { - return std.WithField(ErrorKey, err) -} - -// WithContext creates an entry from the standard logger and adds a context to it. -func WithContext(ctx context.Context) *Entry { - return std.WithContext(ctx) -} - -// WithField creates an entry from the standard logger and adds a field to -// it. If you want multiple fields, use `WithFields`. -// -// Note that it doesn't log until you call Debug, Print, Info, Warn, Fatal -// or Panic on the Entry it returns. -func WithField(key string, value interface{}) *Entry { - return std.WithField(key, value) -} - -// WithFields creates an entry from the standard logger and adds multiple -// fields to it. This is simply a helper for `WithField`, invoking it -// once for each field. -// -// Note that it doesn't log until you call Debug, Print, Info, Warn, Fatal -// or Panic on the Entry it returns. -func WithFields(fields Fields) *Entry { - return std.WithFields(fields) -} - -// WithTime creates an entry from the standard logger and overrides the time of -// logs generated with it. -// -// Note that it doesn't log until you call Debug, Print, Info, Warn, Fatal -// or Panic on the Entry it returns. -func WithTime(t time.Time) *Entry { - return std.WithTime(t) -} - -// Trace logs a message at level Trace on the standard logger. -func Trace(args ...interface{}) { - std.Trace(args...) -} - -// Debug logs a message at level Debug on the standard logger. -func Debug(args ...interface{}) { - std.Debug(args...) -} - -// Print logs a message at level Info on the standard logger. -func Print(args ...interface{}) { - std.Print(args...) -} - -// Info logs a message at level Info on the standard logger. -func Info(args ...interface{}) { - std.Info(args...) -} - -// Warn logs a message at level Warn on the standard logger. -func Warn(args ...interface{}) { - std.Warn(args...) -} - -// Warning logs a message at level Warn on the standard logger. -func Warning(args ...interface{}) { - std.Warning(args...) -} - -// Error logs a message at level Error on the standard logger. -func Error(args ...interface{}) { - std.Error(args...) -} - -// Panic logs a message at level Panic on the standard logger. -func Panic(args ...interface{}) { - std.Panic(args...) -} - -// Fatal logs a message at level Fatal on the standard logger then the process will exit with status set to 1. -func Fatal(args ...interface{}) { - std.Fatal(args...) -} - -// TraceFn logs a message from a func at level Trace on the standard logger. -func TraceFn(fn LogFunction) { - std.TraceFn(fn) -} - -// DebugFn logs a message from a func at level Debug on the standard logger. -func DebugFn(fn LogFunction) { - std.DebugFn(fn) -} - -// PrintFn logs a message from a func at level Info on the standard logger. -func PrintFn(fn LogFunction) { - std.PrintFn(fn) -} - -// InfoFn logs a message from a func at level Info on the standard logger. -func InfoFn(fn LogFunction) { - std.InfoFn(fn) -} - -// WarnFn logs a message from a func at level Warn on the standard logger. -func WarnFn(fn LogFunction) { - std.WarnFn(fn) -} - -// WarningFn logs a message from a func at level Warn on the standard logger. -func WarningFn(fn LogFunction) { - std.WarningFn(fn) -} - -// ErrorFn logs a message from a func at level Error on the standard logger. -func ErrorFn(fn LogFunction) { - std.ErrorFn(fn) -} - -// PanicFn logs a message from a func at level Panic on the standard logger. -func PanicFn(fn LogFunction) { - std.PanicFn(fn) -} - -// FatalFn logs a message from a func at level Fatal on the standard logger then the process will exit with status set to 1. -func FatalFn(fn LogFunction) { - std.FatalFn(fn) -} - -// Tracef logs a message at level Trace on the standard logger. -func Tracef(format string, args ...interface{}) { - std.Tracef(format, args...) -} - -// Debugf logs a message at level Debug on the standard logger. -func Debugf(format string, args ...interface{}) { - std.Debugf(format, args...) -} - -// Printf logs a message at level Info on the standard logger. -func Printf(format string, args ...interface{}) { - std.Printf(format, args...) -} - -// Infof logs a message at level Info on the standard logger. -func Infof(format string, args ...interface{}) { - std.Infof(format, args...) -} - -// Warnf logs a message at level Warn on the standard logger. -func Warnf(format string, args ...interface{}) { - std.Warnf(format, args...) -} - -// Warningf logs a message at level Warn on the standard logger. -func Warningf(format string, args ...interface{}) { - std.Warningf(format, args...) -} - -// Errorf logs a message at level Error on the standard logger. -func Errorf(format string, args ...interface{}) { - std.Errorf(format, args...) -} - -// Panicf logs a message at level Panic on the standard logger. -func Panicf(format string, args ...interface{}) { - std.Panicf(format, args...) -} - -// Fatalf logs a message at level Fatal on the standard logger then the process will exit with status set to 1. -func Fatalf(format string, args ...interface{}) { - std.Fatalf(format, args...) -} - -// Traceln logs a message at level Trace on the standard logger. -func Traceln(args ...interface{}) { - std.Traceln(args...) -} - -// Debugln logs a message at level Debug on the standard logger. -func Debugln(args ...interface{}) { - std.Debugln(args...) -} - -// Println logs a message at level Info on the standard logger. -func Println(args ...interface{}) { - std.Println(args...) -} - -// Infoln logs a message at level Info on the standard logger. -func Infoln(args ...interface{}) { - std.Infoln(args...) -} - -// Warnln logs a message at level Warn on the standard logger. -func Warnln(args ...interface{}) { - std.Warnln(args...) -} - -// Warningln logs a message at level Warn on the standard logger. -func Warningln(args ...interface{}) { - std.Warningln(args...) -} - -// Errorln logs a message at level Error on the standard logger. -func Errorln(args ...interface{}) { - std.Errorln(args...) -} - -// Panicln logs a message at level Panic on the standard logger. -func Panicln(args ...interface{}) { - std.Panicln(args...) -} - -// Fatalln logs a message at level Fatal on the standard logger then the process will exit with status set to 1. -func Fatalln(args ...interface{}) { - std.Fatalln(args...) -} diff --git a/vendor/github.com/sirupsen/logrus/formatter.go b/vendor/github.com/sirupsen/logrus/formatter.go deleted file mode 100644 index 4088837..0000000 --- a/vendor/github.com/sirupsen/logrus/formatter.go +++ /dev/null @@ -1,78 +0,0 @@ -package logrus - -import "time" - -// Default key names for the default fields -const ( - defaultTimestampFormat = time.RFC3339 - FieldKeyMsg = "msg" - FieldKeyLevel = "level" - FieldKeyTime = "time" - FieldKeyLogrusError = "logrus_error" - FieldKeyFunc = "func" - FieldKeyFile = "file" -) - -// The Formatter interface is used to implement a custom Formatter. It takes an -// `Entry`. It exposes all the fields, including the default ones: -// -// * `entry.Data["msg"]`. The message passed from Info, Warn, Error .. -// * `entry.Data["time"]`. The timestamp. -// * `entry.Data["level"]. The level the entry was logged at. -// -// Any additional fields added with `WithField` or `WithFields` are also in -// `entry.Data`. Format is expected to return an array of bytes which are then -// logged to `logger.Out`. -type Formatter interface { - Format(*Entry) ([]byte, error) -} - -// This is to not silently overwrite `time`, `msg`, `func` and `level` fields when -// dumping it. If this code wasn't there doing: -// -// logrus.WithField("level", 1).Info("hello") -// -// Would just silently drop the user provided level. Instead with this code -// it'll logged as: -// -// {"level": "info", "fields.level": 1, "msg": "hello", "time": "..."} -// -// It's not exported because it's still using Data in an opinionated way. It's to -// avoid code duplication between the two default formatters. -func prefixFieldClashes(data Fields, fieldMap FieldMap, reportCaller bool) { - timeKey := fieldMap.resolve(FieldKeyTime) - if t, ok := data[timeKey]; ok { - data["fields."+timeKey] = t - delete(data, timeKey) - } - - msgKey := fieldMap.resolve(FieldKeyMsg) - if m, ok := data[msgKey]; ok { - data["fields."+msgKey] = m - delete(data, msgKey) - } - - levelKey := fieldMap.resolve(FieldKeyLevel) - if l, ok := data[levelKey]; ok { - data["fields."+levelKey] = l - delete(data, levelKey) - } - - logrusErrKey := fieldMap.resolve(FieldKeyLogrusError) - if l, ok := data[logrusErrKey]; ok { - data["fields."+logrusErrKey] = l - delete(data, logrusErrKey) - } - - // If reportCaller is not set, 'func' will not conflict. - if reportCaller { - funcKey := fieldMap.resolve(FieldKeyFunc) - if l, ok := data[funcKey]; ok { - data["fields."+funcKey] = l - } - fileKey := fieldMap.resolve(FieldKeyFile) - if l, ok := data[fileKey]; ok { - data["fields."+fileKey] = l - } - } -} diff --git a/vendor/github.com/sirupsen/logrus/go.mod b/vendor/github.com/sirupsen/logrus/go.mod deleted file mode 100644 index b3919d5..0000000 --- a/vendor/github.com/sirupsen/logrus/go.mod +++ /dev/null @@ -1,10 +0,0 @@ -module github.com/sirupsen/logrus - -require ( - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/stretchr/testify v1.2.2 - golang.org/x/sys v0.0.0-20191026070338-33540a1f6037 -) - -go 1.13 diff --git a/vendor/github.com/sirupsen/logrus/go.sum b/vendor/github.com/sirupsen/logrus/go.sum deleted file mode 100644 index 694c18b..0000000 --- a/vendor/github.com/sirupsen/logrus/go.sum +++ /dev/null @@ -1,8 +0,0 @@ -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037 h1:YyJpGZS1sBuBCzLAR1VEpK193GlqGZbnPFnPV/5Rsb4= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/vendor/github.com/sirupsen/logrus/hooks.go b/vendor/github.com/sirupsen/logrus/hooks.go deleted file mode 100644 index 3f151cd..0000000 --- a/vendor/github.com/sirupsen/logrus/hooks.go +++ /dev/null @@ -1,34 +0,0 @@ -package logrus - -// A hook to be fired when logging on the logging levels returned from -// `Levels()` on your implementation of the interface. Note that this is not -// fired in a goroutine or a channel with workers, you should handle such -// functionality yourself if your call is non-blocking and you don't wish for -// the logging calls for levels returned from `Levels()` to block. -type Hook interface { - Levels() []Level - Fire(*Entry) error -} - -// Internal type for storing the hooks on a logger instance. -type LevelHooks map[Level][]Hook - -// Add a hook to an instance of logger. This is called with -// `log.Hooks.Add(new(MyHook))` where `MyHook` implements the `Hook` interface. -func (hooks LevelHooks) Add(hook Hook) { - for _, level := range hook.Levels() { - hooks[level] = append(hooks[level], hook) - } -} - -// Fire all the hooks for the passed level. Used by `entry.log` to fire -// appropriate hooks for a log entry. -func (hooks LevelHooks) Fire(level Level, entry *Entry) error { - for _, hook := range hooks[level] { - if err := hook.Fire(entry); err != nil { - return err - } - } - - return nil -} diff --git a/vendor/github.com/sirupsen/logrus/json_formatter.go b/vendor/github.com/sirupsen/logrus/json_formatter.go deleted file mode 100644 index c96dc56..0000000 --- a/vendor/github.com/sirupsen/logrus/json_formatter.go +++ /dev/null @@ -1,128 +0,0 @@ -package logrus - -import ( - "bytes" - "encoding/json" - "fmt" - "runtime" -) - -type fieldKey string - -// FieldMap allows customization of the key names for default fields. -type FieldMap map[fieldKey]string - -func (f FieldMap) resolve(key fieldKey) string { - if k, ok := f[key]; ok { - return k - } - - return string(key) -} - -// JSONFormatter formats logs into parsable json -type JSONFormatter struct { - // TimestampFormat sets the format used for marshaling timestamps. - // The format to use is the same than for time.Format or time.Parse from the standard - // library. - // The standard Library already provides a set of predefined format. - TimestampFormat string - - // DisableTimestamp allows disabling automatic timestamps in output - DisableTimestamp bool - - // DisableHTMLEscape allows disabling html escaping in output - DisableHTMLEscape bool - - // DataKey allows users to put all the log entry parameters into a nested dictionary at a given key. - DataKey string - - // FieldMap allows users to customize the names of keys for default fields. - // As an example: - // formatter := &JSONFormatter{ - // FieldMap: FieldMap{ - // FieldKeyTime: "@timestamp", - // FieldKeyLevel: "@level", - // FieldKeyMsg: "@message", - // FieldKeyFunc: "@caller", - // }, - // } - FieldMap FieldMap - - // CallerPrettyfier can be set by the user to modify the content - // of the function and file keys in the json data when ReportCaller is - // activated. If any of the returned value is the empty string the - // corresponding key will be removed from json fields. - CallerPrettyfier func(*runtime.Frame) (function string, file string) - - // PrettyPrint will indent all json logs - PrettyPrint bool -} - -// Format renders a single log entry -func (f *JSONFormatter) Format(entry *Entry) ([]byte, error) { - data := make(Fields, len(entry.Data)+4) - for k, v := range entry.Data { - switch v := v.(type) { - case error: - // Otherwise errors are ignored by `encoding/json` - // https://github.com/sirupsen/logrus/issues/137 - data[k] = v.Error() - default: - data[k] = v - } - } - - if f.DataKey != "" { - newData := make(Fields, 4) - newData[f.DataKey] = data - data = newData - } - - prefixFieldClashes(data, f.FieldMap, entry.HasCaller()) - - timestampFormat := f.TimestampFormat - if timestampFormat == "" { - timestampFormat = defaultTimestampFormat - } - - if entry.err != "" { - data[f.FieldMap.resolve(FieldKeyLogrusError)] = entry.err - } - if !f.DisableTimestamp { - data[f.FieldMap.resolve(FieldKeyTime)] = entry.Time.Format(timestampFormat) - } - data[f.FieldMap.resolve(FieldKeyMsg)] = entry.Message - data[f.FieldMap.resolve(FieldKeyLevel)] = entry.Level.String() - if entry.HasCaller() { - funcVal := entry.Caller.Function - fileVal := fmt.Sprintf("%s:%d", entry.Caller.File, entry.Caller.Line) - if f.CallerPrettyfier != nil { - funcVal, fileVal = f.CallerPrettyfier(entry.Caller) - } - if funcVal != "" { - data[f.FieldMap.resolve(FieldKeyFunc)] = funcVal - } - if fileVal != "" { - data[f.FieldMap.resolve(FieldKeyFile)] = fileVal - } - } - - var b *bytes.Buffer - if entry.Buffer != nil { - b = entry.Buffer - } else { - b = &bytes.Buffer{} - } - - encoder := json.NewEncoder(b) - encoder.SetEscapeHTML(!f.DisableHTMLEscape) - if f.PrettyPrint { - encoder.SetIndent("", " ") - } - if err := encoder.Encode(data); err != nil { - return nil, fmt.Errorf("failed to marshal fields to JSON, %w", err) - } - - return b.Bytes(), nil -} diff --git a/vendor/github.com/sirupsen/logrus/logger.go b/vendor/github.com/sirupsen/logrus/logger.go deleted file mode 100644 index 3377044..0000000 --- a/vendor/github.com/sirupsen/logrus/logger.go +++ /dev/null @@ -1,404 +0,0 @@ -package logrus - -import ( - "context" - "io" - "os" - "sync" - "sync/atomic" - "time" -) - -// LogFunction For big messages, it can be more efficient to pass a function -// and only call it if the log level is actually enables rather than -// generating the log message and then checking if the level is enabled -type LogFunction func() []interface{} - -type Logger struct { - // The logs are `io.Copy`'d to this in a mutex. It's common to set this to a - // file, or leave it default which is `os.Stderr`. You can also set this to - // something more adventurous, such as logging to Kafka. - Out io.Writer - // Hooks for the logger instance. These allow firing events based on logging - // levels and log entries. For example, to send errors to an error tracking - // service, log to StatsD or dump the core on fatal errors. - Hooks LevelHooks - // All log entries pass through the formatter before logged to Out. The - // included formatters are `TextFormatter` and `JSONFormatter` for which - // TextFormatter is the default. In development (when a TTY is attached) it - // logs with colors, but to a file it wouldn't. You can easily implement your - // own that implements the `Formatter` interface, see the `README` or included - // formatters for examples. - Formatter Formatter - - // Flag for whether to log caller info (off by default) - ReportCaller bool - - // The logging level the logger should log at. This is typically (and defaults - // to) `logrus.Info`, which allows Info(), Warn(), Error() and Fatal() to be - // logged. - Level Level - // Used to sync writing to the log. Locking is enabled by Default - mu MutexWrap - // Reusable empty entry - entryPool sync.Pool - // Function to exit the application, defaults to `os.Exit()` - ExitFunc exitFunc -} - -type exitFunc func(int) - -type MutexWrap struct { - lock sync.Mutex - disabled bool -} - -func (mw *MutexWrap) Lock() { - if !mw.disabled { - mw.lock.Lock() - } -} - -func (mw *MutexWrap) Unlock() { - if !mw.disabled { - mw.lock.Unlock() - } -} - -func (mw *MutexWrap) Disable() { - mw.disabled = true -} - -// Creates a new logger. Configuration should be set by changing `Formatter`, -// `Out` and `Hooks` directly on the default logger instance. You can also just -// instantiate your own: -// -// var log = &logrus.Logger{ -// Out: os.Stderr, -// Formatter: new(logrus.TextFormatter), -// Hooks: make(logrus.LevelHooks), -// Level: logrus.DebugLevel, -// } -// -// It's recommended to make this a global instance called `log`. -func New() *Logger { - return &Logger{ - Out: os.Stderr, - Formatter: new(TextFormatter), - Hooks: make(LevelHooks), - Level: InfoLevel, - ExitFunc: os.Exit, - ReportCaller: false, - } -} - -func (logger *Logger) newEntry() *Entry { - entry, ok := logger.entryPool.Get().(*Entry) - if ok { - return entry - } - return NewEntry(logger) -} - -func (logger *Logger) releaseEntry(entry *Entry) { - entry.Data = map[string]interface{}{} - logger.entryPool.Put(entry) -} - -// WithField allocates a new entry and adds a field to it. -// Debug, Print, Info, Warn, Error, Fatal or Panic must be then applied to -// this new returned entry. -// If you want multiple fields, use `WithFields`. -func (logger *Logger) WithField(key string, value interface{}) *Entry { - entry := logger.newEntry() - defer logger.releaseEntry(entry) - return entry.WithField(key, value) -} - -// Adds a struct of fields to the log entry. All it does is call `WithField` for -// each `Field`. -func (logger *Logger) WithFields(fields Fields) *Entry { - entry := logger.newEntry() - defer logger.releaseEntry(entry) - return entry.WithFields(fields) -} - -// Add an error as single field to the log entry. All it does is call -// `WithError` for the given `error`. -func (logger *Logger) WithError(err error) *Entry { - entry := logger.newEntry() - defer logger.releaseEntry(entry) - return entry.WithError(err) -} - -// Add a context to the log entry. -func (logger *Logger) WithContext(ctx context.Context) *Entry { - entry := logger.newEntry() - defer logger.releaseEntry(entry) - return entry.WithContext(ctx) -} - -// Overrides the time of the log entry. -func (logger *Logger) WithTime(t time.Time) *Entry { - entry := logger.newEntry() - defer logger.releaseEntry(entry) - return entry.WithTime(t) -} - -func (logger *Logger) Logf(level Level, format string, args ...interface{}) { - if logger.IsLevelEnabled(level) { - entry := logger.newEntry() - entry.Logf(level, format, args...) - logger.releaseEntry(entry) - } -} - -func (logger *Logger) Tracef(format string, args ...interface{}) { - logger.Logf(TraceLevel, format, args...) -} - -func (logger *Logger) Debugf(format string, args ...interface{}) { - logger.Logf(DebugLevel, format, args...) -} - -func (logger *Logger) Infof(format string, args ...interface{}) { - logger.Logf(InfoLevel, format, args...) -} - -func (logger *Logger) Printf(format string, args ...interface{}) { - entry := logger.newEntry() - entry.Printf(format, args...) - logger.releaseEntry(entry) -} - -func (logger *Logger) Warnf(format string, args ...interface{}) { - logger.Logf(WarnLevel, format, args...) -} - -func (logger *Logger) Warningf(format string, args ...interface{}) { - logger.Warnf(format, args...) -} - -func (logger *Logger) Errorf(format string, args ...interface{}) { - logger.Logf(ErrorLevel, format, args...) -} - -func (logger *Logger) Fatalf(format string, args ...interface{}) { - logger.Logf(FatalLevel, format, args...) - logger.Exit(1) -} - -func (logger *Logger) Panicf(format string, args ...interface{}) { - logger.Logf(PanicLevel, format, args...) -} - -func (logger *Logger) Log(level Level, args ...interface{}) { - if logger.IsLevelEnabled(level) { - entry := logger.newEntry() - entry.Log(level, args...) - logger.releaseEntry(entry) - } -} - -func (logger *Logger) LogFn(level Level, fn LogFunction) { - if logger.IsLevelEnabled(level) { - entry := logger.newEntry() - entry.Log(level, fn()...) - logger.releaseEntry(entry) - } -} - -func (logger *Logger) Trace(args ...interface{}) { - logger.Log(TraceLevel, args...) -} - -func (logger *Logger) Debug(args ...interface{}) { - logger.Log(DebugLevel, args...) -} - -func (logger *Logger) Info(args ...interface{}) { - logger.Log(InfoLevel, args...) -} - -func (logger *Logger) Print(args ...interface{}) { - entry := logger.newEntry() - entry.Print(args...) - logger.releaseEntry(entry) -} - -func (logger *Logger) Warn(args ...interface{}) { - logger.Log(WarnLevel, args...) -} - -func (logger *Logger) Warning(args ...interface{}) { - logger.Warn(args...) -} - -func (logger *Logger) Error(args ...interface{}) { - logger.Log(ErrorLevel, args...) -} - -func (logger *Logger) Fatal(args ...interface{}) { - logger.Log(FatalLevel, args...) - logger.Exit(1) -} - -func (logger *Logger) Panic(args ...interface{}) { - logger.Log(PanicLevel, args...) -} - -func (logger *Logger) TraceFn(fn LogFunction) { - logger.LogFn(TraceLevel, fn) -} - -func (logger *Logger) DebugFn(fn LogFunction) { - logger.LogFn(DebugLevel, fn) -} - -func (logger *Logger) InfoFn(fn LogFunction) { - logger.LogFn(InfoLevel, fn) -} - -func (logger *Logger) PrintFn(fn LogFunction) { - entry := logger.newEntry() - entry.Print(fn()...) - logger.releaseEntry(entry) -} - -func (logger *Logger) WarnFn(fn LogFunction) { - logger.LogFn(WarnLevel, fn) -} - -func (logger *Logger) WarningFn(fn LogFunction) { - logger.WarnFn(fn) -} - -func (logger *Logger) ErrorFn(fn LogFunction) { - logger.LogFn(ErrorLevel, fn) -} - -func (logger *Logger) FatalFn(fn LogFunction) { - logger.LogFn(FatalLevel, fn) - logger.Exit(1) -} - -func (logger *Logger) PanicFn(fn LogFunction) { - logger.LogFn(PanicLevel, fn) -} - -func (logger *Logger) Logln(level Level, args ...interface{}) { - if logger.IsLevelEnabled(level) { - entry := logger.newEntry() - entry.Logln(level, args...) - logger.releaseEntry(entry) - } -} - -func (logger *Logger) Traceln(args ...interface{}) { - logger.Logln(TraceLevel, args...) -} - -func (logger *Logger) Debugln(args ...interface{}) { - logger.Logln(DebugLevel, args...) -} - -func (logger *Logger) Infoln(args ...interface{}) { - logger.Logln(InfoLevel, args...) -} - -func (logger *Logger) Println(args ...interface{}) { - entry := logger.newEntry() - entry.Println(args...) - logger.releaseEntry(entry) -} - -func (logger *Logger) Warnln(args ...interface{}) { - logger.Logln(WarnLevel, args...) -} - -func (logger *Logger) Warningln(args ...interface{}) { - logger.Warnln(args...) -} - -func (logger *Logger) Errorln(args ...interface{}) { - logger.Logln(ErrorLevel, args...) -} - -func (logger *Logger) Fatalln(args ...interface{}) { - logger.Logln(FatalLevel, args...) - logger.Exit(1) -} - -func (logger *Logger) Panicln(args ...interface{}) { - logger.Logln(PanicLevel, args...) -} - -func (logger *Logger) Exit(code int) { - runHandlers() - if logger.ExitFunc == nil { - logger.ExitFunc = os.Exit - } - logger.ExitFunc(code) -} - -//When file is opened with appending mode, it's safe to -//write concurrently to a file (within 4k message on Linux). -//In these cases user can choose to disable the lock. -func (logger *Logger) SetNoLock() { - logger.mu.Disable() -} - -func (logger *Logger) level() Level { - return Level(atomic.LoadUint32((*uint32)(&logger.Level))) -} - -// SetLevel sets the logger level. -func (logger *Logger) SetLevel(level Level) { - atomic.StoreUint32((*uint32)(&logger.Level), uint32(level)) -} - -// GetLevel returns the logger level. -func (logger *Logger) GetLevel() Level { - return logger.level() -} - -// AddHook adds a hook to the logger hooks. -func (logger *Logger) AddHook(hook Hook) { - logger.mu.Lock() - defer logger.mu.Unlock() - logger.Hooks.Add(hook) -} - -// IsLevelEnabled checks if the log level of the logger is greater than the level param -func (logger *Logger) IsLevelEnabled(level Level) bool { - return logger.level() >= level -} - -// SetFormatter sets the logger formatter. -func (logger *Logger) SetFormatter(formatter Formatter) { - logger.mu.Lock() - defer logger.mu.Unlock() - logger.Formatter = formatter -} - -// SetOutput sets the logger output. -func (logger *Logger) SetOutput(output io.Writer) { - logger.mu.Lock() - defer logger.mu.Unlock() - logger.Out = output -} - -func (logger *Logger) SetReportCaller(reportCaller bool) { - logger.mu.Lock() - defer logger.mu.Unlock() - logger.ReportCaller = reportCaller -} - -// ReplaceHooks replaces the logger hooks and returns the old ones -func (logger *Logger) ReplaceHooks(hooks LevelHooks) LevelHooks { - logger.mu.Lock() - oldHooks := logger.Hooks - logger.Hooks = hooks - logger.mu.Unlock() - return oldHooks -} diff --git a/vendor/github.com/sirupsen/logrus/logrus.go b/vendor/github.com/sirupsen/logrus/logrus.go deleted file mode 100644 index 2f16224..0000000 --- a/vendor/github.com/sirupsen/logrus/logrus.go +++ /dev/null @@ -1,186 +0,0 @@ -package logrus - -import ( - "fmt" - "log" - "strings" -) - -// Fields type, used to pass to `WithFields`. -type Fields map[string]interface{} - -// Level type -type Level uint32 - -// Convert the Level to a string. E.g. PanicLevel becomes "panic". -func (level Level) String() string { - if b, err := level.MarshalText(); err == nil { - return string(b) - } else { - return "unknown" - } -} - -// ParseLevel takes a string level and returns the Logrus log level constant. -func ParseLevel(lvl string) (Level, error) { - switch strings.ToLower(lvl) { - case "panic": - return PanicLevel, nil - case "fatal": - return FatalLevel, nil - case "error": - return ErrorLevel, nil - case "warn", "warning": - return WarnLevel, nil - case "info": - return InfoLevel, nil - case "debug": - return DebugLevel, nil - case "trace": - return TraceLevel, nil - } - - var l Level - return l, fmt.Errorf("not a valid logrus Level: %q", lvl) -} - -// UnmarshalText implements encoding.TextUnmarshaler. -func (level *Level) UnmarshalText(text []byte) error { - l, err := ParseLevel(string(text)) - if err != nil { - return err - } - - *level = l - - return nil -} - -func (level Level) MarshalText() ([]byte, error) { - switch level { - case TraceLevel: - return []byte("trace"), nil - case DebugLevel: - return []byte("debug"), nil - case InfoLevel: - return []byte("info"), nil - case WarnLevel: - return []byte("warning"), nil - case ErrorLevel: - return []byte("error"), nil - case FatalLevel: - return []byte("fatal"), nil - case PanicLevel: - return []byte("panic"), nil - } - - return nil, fmt.Errorf("not a valid logrus level %d", level) -} - -// A constant exposing all logging levels -var AllLevels = []Level{ - PanicLevel, - FatalLevel, - ErrorLevel, - WarnLevel, - InfoLevel, - DebugLevel, - TraceLevel, -} - -// These are the different logging levels. You can set the logging level to log -// on your instance of logger, obtained with `logrus.New()`. -const ( - // PanicLevel level, highest level of severity. Logs and then calls panic with the - // message passed to Debug, Info, ... - PanicLevel Level = iota - // FatalLevel level. Logs and then calls `logger.Exit(1)`. It will exit even if the - // logging level is set to Panic. - FatalLevel - // ErrorLevel level. Logs. Used for errors that should definitely be noted. - // Commonly used for hooks to send errors to an error tracking service. - ErrorLevel - // WarnLevel level. Non-critical entries that deserve eyes. - WarnLevel - // InfoLevel level. General operational entries about what's going on inside the - // application. - InfoLevel - // DebugLevel level. Usually only enabled when debugging. Very verbose logging. - DebugLevel - // TraceLevel level. Designates finer-grained informational events than the Debug. - TraceLevel -) - -// Won't compile if StdLogger can't be realized by a log.Logger -var ( - _ StdLogger = &log.Logger{} - _ StdLogger = &Entry{} - _ StdLogger = &Logger{} -) - -// StdLogger is what your logrus-enabled library should take, that way -// it'll accept a stdlib logger and a logrus logger. There's no standard -// interface, this is the closest we get, unfortunately. -type StdLogger interface { - Print(...interface{}) - Printf(string, ...interface{}) - Println(...interface{}) - - Fatal(...interface{}) - Fatalf(string, ...interface{}) - Fatalln(...interface{}) - - Panic(...interface{}) - Panicf(string, ...interface{}) - Panicln(...interface{}) -} - -// The FieldLogger interface generalizes the Entry and Logger types -type FieldLogger interface { - WithField(key string, value interface{}) *Entry - WithFields(fields Fields) *Entry - WithError(err error) *Entry - - Debugf(format string, args ...interface{}) - Infof(format string, args ...interface{}) - Printf(format string, args ...interface{}) - Warnf(format string, args ...interface{}) - Warningf(format string, args ...interface{}) - Errorf(format string, args ...interface{}) - Fatalf(format string, args ...interface{}) - Panicf(format string, args ...interface{}) - - Debug(args ...interface{}) - Info(args ...interface{}) - Print(args ...interface{}) - Warn(args ...interface{}) - Warning(args ...interface{}) - Error(args ...interface{}) - Fatal(args ...interface{}) - Panic(args ...interface{}) - - Debugln(args ...interface{}) - Infoln(args ...interface{}) - Println(args ...interface{}) - Warnln(args ...interface{}) - Warningln(args ...interface{}) - Errorln(args ...interface{}) - Fatalln(args ...interface{}) - Panicln(args ...interface{}) - - // IsDebugEnabled() bool - // IsInfoEnabled() bool - // IsWarnEnabled() bool - // IsErrorEnabled() bool - // IsFatalEnabled() bool - // IsPanicEnabled() bool -} - -// Ext1FieldLogger (the first extension to FieldLogger) is superfluous, it is -// here for consistancy. Do not use. Use Logger or Entry instead. -type Ext1FieldLogger interface { - FieldLogger - Tracef(format string, args ...interface{}) - Trace(args ...interface{}) - Traceln(args ...interface{}) -} diff --git a/vendor/github.com/sirupsen/logrus/terminal_check_appengine.go b/vendor/github.com/sirupsen/logrus/terminal_check_appengine.go deleted file mode 100644 index 2403de9..0000000 --- a/vendor/github.com/sirupsen/logrus/terminal_check_appengine.go +++ /dev/null @@ -1,11 +0,0 @@ -// +build appengine - -package logrus - -import ( - "io" -) - -func checkIfTerminal(w io.Writer) bool { - return true -} diff --git a/vendor/github.com/sirupsen/logrus/terminal_check_bsd.go b/vendor/github.com/sirupsen/logrus/terminal_check_bsd.go deleted file mode 100644 index 4997899..0000000 --- a/vendor/github.com/sirupsen/logrus/terminal_check_bsd.go +++ /dev/null @@ -1,13 +0,0 @@ -// +build darwin dragonfly freebsd netbsd openbsd -// +build !js - -package logrus - -import "golang.org/x/sys/unix" - -const ioctlReadTermios = unix.TIOCGETA - -func isTerminal(fd int) bool { - _, err := unix.IoctlGetTermios(fd, ioctlReadTermios) - return err == nil -} diff --git a/vendor/github.com/sirupsen/logrus/terminal_check_js.go b/vendor/github.com/sirupsen/logrus/terminal_check_js.go deleted file mode 100644 index ebdae3e..0000000 --- a/vendor/github.com/sirupsen/logrus/terminal_check_js.go +++ /dev/null @@ -1,7 +0,0 @@ -// +build js - -package logrus - -func isTerminal(fd int) bool { - return false -} diff --git a/vendor/github.com/sirupsen/logrus/terminal_check_no_terminal.go b/vendor/github.com/sirupsen/logrus/terminal_check_no_terminal.go deleted file mode 100644 index 97af92c..0000000 --- a/vendor/github.com/sirupsen/logrus/terminal_check_no_terminal.go +++ /dev/null @@ -1,11 +0,0 @@ -// +build js nacl plan9 - -package logrus - -import ( - "io" -) - -func checkIfTerminal(w io.Writer) bool { - return false -} diff --git a/vendor/github.com/sirupsen/logrus/terminal_check_notappengine.go b/vendor/github.com/sirupsen/logrus/terminal_check_notappengine.go deleted file mode 100644 index 3293fb3..0000000 --- a/vendor/github.com/sirupsen/logrus/terminal_check_notappengine.go +++ /dev/null @@ -1,17 +0,0 @@ -// +build !appengine,!js,!windows,!nacl,!plan9 - -package logrus - -import ( - "io" - "os" -) - -func checkIfTerminal(w io.Writer) bool { - switch v := w.(type) { - case *os.File: - return isTerminal(int(v.Fd())) - default: - return false - } -} diff --git a/vendor/github.com/sirupsen/logrus/terminal_check_solaris.go b/vendor/github.com/sirupsen/logrus/terminal_check_solaris.go deleted file mode 100644 index f6710b3..0000000 --- a/vendor/github.com/sirupsen/logrus/terminal_check_solaris.go +++ /dev/null @@ -1,11 +0,0 @@ -package logrus - -import ( - "golang.org/x/sys/unix" -) - -// IsTerminal returns true if the given file descriptor is a terminal. -func isTerminal(fd int) bool { - _, err := unix.IoctlGetTermio(fd, unix.TCGETA) - return err == nil -} diff --git a/vendor/github.com/sirupsen/logrus/terminal_check_unix.go b/vendor/github.com/sirupsen/logrus/terminal_check_unix.go deleted file mode 100644 index 04748b8..0000000 --- a/vendor/github.com/sirupsen/logrus/terminal_check_unix.go +++ /dev/null @@ -1,13 +0,0 @@ -// +build linux aix zos -// +build !js - -package logrus - -import "golang.org/x/sys/unix" - -const ioctlReadTermios = unix.TCGETS - -func isTerminal(fd int) bool { - _, err := unix.IoctlGetTermios(fd, ioctlReadTermios) - return err == nil -} diff --git a/vendor/github.com/sirupsen/logrus/terminal_check_windows.go b/vendor/github.com/sirupsen/logrus/terminal_check_windows.go deleted file mode 100644 index 2879eb5..0000000 --- a/vendor/github.com/sirupsen/logrus/terminal_check_windows.go +++ /dev/null @@ -1,27 +0,0 @@ -// +build !appengine,!js,windows - -package logrus - -import ( - "io" - "os" - - "golang.org/x/sys/windows" -) - -func checkIfTerminal(w io.Writer) bool { - switch v := w.(type) { - case *os.File: - handle := windows.Handle(v.Fd()) - var mode uint32 - if err := windows.GetConsoleMode(handle, &mode); err != nil { - return false - } - mode |= windows.ENABLE_VIRTUAL_TERMINAL_PROCESSING - if err := windows.SetConsoleMode(handle, mode); err != nil { - return false - } - return true - } - return false -} diff --git a/vendor/github.com/sirupsen/logrus/text_formatter.go b/vendor/github.com/sirupsen/logrus/text_formatter.go deleted file mode 100644 index be2c6ef..0000000 --- a/vendor/github.com/sirupsen/logrus/text_formatter.go +++ /dev/null @@ -1,339 +0,0 @@ -package logrus - -import ( - "bytes" - "fmt" - "os" - "runtime" - "sort" - "strconv" - "strings" - "sync" - "time" - "unicode/utf8" -) - -const ( - red = 31 - yellow = 33 - blue = 36 - gray = 37 -) - -var baseTimestamp time.Time - -func init() { - baseTimestamp = time.Now() -} - -// TextFormatter formats logs into text -type TextFormatter struct { - // Set to true to bypass checking for a TTY before outputting colors. - ForceColors bool - - // Force disabling colors. - DisableColors bool - - // Force quoting of all values - ForceQuote bool - - // DisableQuote disables quoting for all values. - // DisableQuote will have a lower priority than ForceQuote. - // If both of them are set to true, quote will be forced on all values. - DisableQuote bool - - // Override coloring based on CLICOLOR and CLICOLOR_FORCE. - https://bixense.com/clicolors/ - EnvironmentOverrideColors bool - - // Disable timestamp logging. useful when output is redirected to logging - // system that already adds timestamps. - DisableTimestamp bool - - // Enable logging the full timestamp when a TTY is attached instead of just - // the time passed since beginning of execution. - FullTimestamp bool - - // TimestampFormat to use for display when a full timestamp is printed. - // The format to use is the same than for time.Format or time.Parse from the standard - // library. - // The standard Library already provides a set of predefined format. - TimestampFormat string - - // The fields are sorted by default for a consistent output. For applications - // that log extremely frequently and don't use the JSON formatter this may not - // be desired. - DisableSorting bool - - // The keys sorting function, when uninitialized it uses sort.Strings. - SortingFunc func([]string) - - // Disables the truncation of the level text to 4 characters. - DisableLevelTruncation bool - - // PadLevelText Adds padding the level text so that all the levels output at the same length - // PadLevelText is a superset of the DisableLevelTruncation option - PadLevelText bool - - // QuoteEmptyFields will wrap empty fields in quotes if true - QuoteEmptyFields bool - - // Whether the logger's out is to a terminal - isTerminal bool - - // FieldMap allows users to customize the names of keys for default fields. - // As an example: - // formatter := &TextFormatter{ - // FieldMap: FieldMap{ - // FieldKeyTime: "@timestamp", - // FieldKeyLevel: "@level", - // FieldKeyMsg: "@message"}} - FieldMap FieldMap - - // CallerPrettyfier can be set by the user to modify the content - // of the function and file keys in the data when ReportCaller is - // activated. If any of the returned value is the empty string the - // corresponding key will be removed from fields. - CallerPrettyfier func(*runtime.Frame) (function string, file string) - - terminalInitOnce sync.Once - - // The max length of the level text, generated dynamically on init - levelTextMaxLength int -} - -func (f *TextFormatter) init(entry *Entry) { - if entry.Logger != nil { - f.isTerminal = checkIfTerminal(entry.Logger.Out) - } - // Get the max length of the level text - for _, level := range AllLevels { - levelTextLength := utf8.RuneCount([]byte(level.String())) - if levelTextLength > f.levelTextMaxLength { - f.levelTextMaxLength = levelTextLength - } - } -} - -func (f *TextFormatter) isColored() bool { - isColored := f.ForceColors || (f.isTerminal && (runtime.GOOS != "windows")) - - if f.EnvironmentOverrideColors { - switch force, ok := os.LookupEnv("CLICOLOR_FORCE"); { - case ok && force != "0": - isColored = true - case ok && force == "0", os.Getenv("CLICOLOR") == "0": - isColored = false - } - } - - return isColored && !f.DisableColors -} - -// Format renders a single log entry -func (f *TextFormatter) Format(entry *Entry) ([]byte, error) { - data := make(Fields) - for k, v := range entry.Data { - data[k] = v - } - prefixFieldClashes(data, f.FieldMap, entry.HasCaller()) - keys := make([]string, 0, len(data)) - for k := range data { - keys = append(keys, k) - } - - var funcVal, fileVal string - - fixedKeys := make([]string, 0, 4+len(data)) - if !f.DisableTimestamp { - fixedKeys = append(fixedKeys, f.FieldMap.resolve(FieldKeyTime)) - } - fixedKeys = append(fixedKeys, f.FieldMap.resolve(FieldKeyLevel)) - if entry.Message != "" { - fixedKeys = append(fixedKeys, f.FieldMap.resolve(FieldKeyMsg)) - } - if entry.err != "" { - fixedKeys = append(fixedKeys, f.FieldMap.resolve(FieldKeyLogrusError)) - } - if entry.HasCaller() { - if f.CallerPrettyfier != nil { - funcVal, fileVal = f.CallerPrettyfier(entry.Caller) - } else { - funcVal = entry.Caller.Function - fileVal = fmt.Sprintf("%s:%d", entry.Caller.File, entry.Caller.Line) - } - - if funcVal != "" { - fixedKeys = append(fixedKeys, f.FieldMap.resolve(FieldKeyFunc)) - } - if fileVal != "" { - fixedKeys = append(fixedKeys, f.FieldMap.resolve(FieldKeyFile)) - } - } - - if !f.DisableSorting { - if f.SortingFunc == nil { - sort.Strings(keys) - fixedKeys = append(fixedKeys, keys...) - } else { - if !f.isColored() { - fixedKeys = append(fixedKeys, keys...) - f.SortingFunc(fixedKeys) - } else { - f.SortingFunc(keys) - } - } - } else { - fixedKeys = append(fixedKeys, keys...) - } - - var b *bytes.Buffer - if entry.Buffer != nil { - b = entry.Buffer - } else { - b = &bytes.Buffer{} - } - - f.terminalInitOnce.Do(func() { f.init(entry) }) - - timestampFormat := f.TimestampFormat - if timestampFormat == "" { - timestampFormat = defaultTimestampFormat - } - if f.isColored() { - f.printColored(b, entry, keys, data, timestampFormat) - } else { - - for _, key := range fixedKeys { - var value interface{} - switch { - case key == f.FieldMap.resolve(FieldKeyTime): - value = entry.Time.Format(timestampFormat) - case key == f.FieldMap.resolve(FieldKeyLevel): - value = entry.Level.String() - case key == f.FieldMap.resolve(FieldKeyMsg): - value = entry.Message - case key == f.FieldMap.resolve(FieldKeyLogrusError): - value = entry.err - case key == f.FieldMap.resolve(FieldKeyFunc) && entry.HasCaller(): - value = funcVal - case key == f.FieldMap.resolve(FieldKeyFile) && entry.HasCaller(): - value = fileVal - default: - value = data[key] - } - f.appendKeyValue(b, key, value) - } - } - - b.WriteByte('\n') - return b.Bytes(), nil -} - -func (f *TextFormatter) printColored(b *bytes.Buffer, entry *Entry, keys []string, data Fields, timestampFormat string) { - var levelColor int - switch entry.Level { - case DebugLevel, TraceLevel: - levelColor = gray - case WarnLevel: - levelColor = yellow - case ErrorLevel, FatalLevel, PanicLevel: - levelColor = red - case InfoLevel: - levelColor = blue - default: - levelColor = blue - } - - levelText := strings.ToUpper(entry.Level.String()) - if !f.DisableLevelTruncation && !f.PadLevelText { - levelText = levelText[0:4] - } - if f.PadLevelText { - // Generates the format string used in the next line, for example "%-6s" or "%-7s". - // Based on the max level text length. - formatString := "%-" + strconv.Itoa(f.levelTextMaxLength) + "s" - // Formats the level text by appending spaces up to the max length, for example: - // - "INFO " - // - "WARNING" - levelText = fmt.Sprintf(formatString, levelText) - } - - // Remove a single newline if it already exists in the message to keep - // the behavior of logrus text_formatter the same as the stdlib log package - entry.Message = strings.TrimSuffix(entry.Message, "\n") - - caller := "" - if entry.HasCaller() { - funcVal := fmt.Sprintf("%s()", entry.Caller.Function) - fileVal := fmt.Sprintf("%s:%d", entry.Caller.File, entry.Caller.Line) - - if f.CallerPrettyfier != nil { - funcVal, fileVal = f.CallerPrettyfier(entry.Caller) - } - - if fileVal == "" { - caller = funcVal - } else if funcVal == "" { - caller = fileVal - } else { - caller = fileVal + " " + funcVal - } - } - - switch { - case f.DisableTimestamp: - fmt.Fprintf(b, "\x1b[%dm%s\x1b[0m%s %-44s ", levelColor, levelText, caller, entry.Message) - case !f.FullTimestamp: - fmt.Fprintf(b, "\x1b[%dm%s\x1b[0m[%04d]%s %-44s ", levelColor, levelText, int(entry.Time.Sub(baseTimestamp)/time.Second), caller, entry.Message) - default: - fmt.Fprintf(b, "\x1b[%dm%s\x1b[0m[%s]%s %-44s ", levelColor, levelText, entry.Time.Format(timestampFormat), caller, entry.Message) - } - for _, k := range keys { - v := data[k] - fmt.Fprintf(b, " \x1b[%dm%s\x1b[0m=", levelColor, k) - f.appendValue(b, v) - } -} - -func (f *TextFormatter) needsQuoting(text string) bool { - if f.ForceQuote { - return true - } - if f.QuoteEmptyFields && len(text) == 0 { - return true - } - if f.DisableQuote { - return false - } - for _, ch := range text { - if !((ch >= 'a' && ch <= 'z') || - (ch >= 'A' && ch <= 'Z') || - (ch >= '0' && ch <= '9') || - ch == '-' || ch == '.' || ch == '_' || ch == '/' || ch == '@' || ch == '^' || ch == '+') { - return true - } - } - return false -} - -func (f *TextFormatter) appendKeyValue(b *bytes.Buffer, key string, value interface{}) { - if b.Len() > 0 { - b.WriteByte(' ') - } - b.WriteString(key) - b.WriteByte('=') - f.appendValue(b, value) -} - -func (f *TextFormatter) appendValue(b *bytes.Buffer, value interface{}) { - stringVal, ok := value.(string) - if !ok { - stringVal = fmt.Sprint(value) - } - - if !f.needsQuoting(stringVal) { - b.WriteString(stringVal) - } else { - b.WriteString(fmt.Sprintf("%q", stringVal)) - } -} diff --git a/vendor/github.com/sirupsen/logrus/writer.go b/vendor/github.com/sirupsen/logrus/writer.go deleted file mode 100644 index 72e8e3a..0000000 --- a/vendor/github.com/sirupsen/logrus/writer.go +++ /dev/null @@ -1,70 +0,0 @@ -package logrus - -import ( - "bufio" - "io" - "runtime" -) - -// Writer at INFO level. See WriterLevel for details. -func (logger *Logger) Writer() *io.PipeWriter { - return logger.WriterLevel(InfoLevel) -} - -// WriterLevel returns an io.Writer that can be used to write arbitrary text to -// the logger at the given log level. Each line written to the writer will be -// printed in the usual way using formatters and hooks. The writer is part of an -// io.Pipe and it is the callers responsibility to close the writer when done. -// This can be used to override the standard library logger easily. -func (logger *Logger) WriterLevel(level Level) *io.PipeWriter { - return NewEntry(logger).WriterLevel(level) -} - -func (entry *Entry) Writer() *io.PipeWriter { - return entry.WriterLevel(InfoLevel) -} - -func (entry *Entry) WriterLevel(level Level) *io.PipeWriter { - reader, writer := io.Pipe() - - var printFunc func(args ...interface{}) - - switch level { - case TraceLevel: - printFunc = entry.Trace - case DebugLevel: - printFunc = entry.Debug - case InfoLevel: - printFunc = entry.Info - case WarnLevel: - printFunc = entry.Warn - case ErrorLevel: - printFunc = entry.Error - case FatalLevel: - printFunc = entry.Fatal - case PanicLevel: - printFunc = entry.Panic - default: - printFunc = entry.Print - } - - go entry.writerScanner(reader, printFunc) - runtime.SetFinalizer(writer, writerFinalizer) - - return writer -} - -func (entry *Entry) writerScanner(reader *io.PipeReader, printFunc func(args ...interface{})) { - scanner := bufio.NewScanner(reader) - for scanner.Scan() { - printFunc(scanner.Text()) - } - if err := scanner.Err(); err != nil { - entry.Errorf("Error while reading from Writer: %s", err) - } - reader.Close() -} - -func writerFinalizer(writer *io.PipeWriter) { - writer.Close() -} diff --git a/vendor/github.com/syossan27/tebata/Gopkg.lock b/vendor/github.com/syossan27/tebata/Gopkg.lock deleted file mode 100644 index 8394275..0000000 --- a/vendor/github.com/syossan27/tebata/Gopkg.lock +++ /dev/null @@ -1,15 +0,0 @@ -# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. - - -[[projects]] - name = "github.com/koron/go-dproxy" - packages = ["."] - revision = "009e1192eaace40a885c5b93c37613b3cae820d6" - version = "v1.1" - -[solve-meta] - analyzer-name = "dep" - analyzer-version = 1 - inputs-digest = "85c4a26c074ee00402aa40ca74a171aea55dbb0b7ff61456e07e931d5c5bd5cf" - solver-name = "gps-cdcl" - solver-version = 1 diff --git a/vendor/github.com/syossan27/tebata/Gopkg.toml b/vendor/github.com/syossan27/tebata/Gopkg.toml deleted file mode 100644 index 653f719..0000000 --- a/vendor/github.com/syossan27/tebata/Gopkg.toml +++ /dev/null @@ -1,34 +0,0 @@ -# Gopkg.toml example -# -# Refer to https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md -# for detailed Gopkg.toml documentation. -# -# required = ["github.com/user/thing/cmd/thing"] -# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"] -# -# [[constraint]] -# name = "github.com/user/project" -# version = "1.0.0" -# -# [[constraint]] -# name = "github.com/user/project2" -# branch = "dev" -# source = "github.com/myfork/project2" -# -# [[override]] -# name = "github.com/x/y" -# version = "2.4.0" -# -# [prune] -# non-go = false -# go-tests = true -# unused-packages = true - - -[prune] - go-tests = true - unused-packages = true - -[[constraint]] - name = "github.com/koron/go-dproxy" - version = "1.1.0" diff --git a/vendor/github.com/syossan27/tebata/README.md b/vendor/github.com/syossan27/tebata/README.md deleted file mode 100644 index 6048ed5..0000000 --- a/vendor/github.com/syossan27/tebata/README.md +++ /dev/null @@ -1,67 +0,0 @@ -# Tebata(手旗) - -[![GoDoc](https://godoc.org/github.com/syossan27/tebata?status.svg)](https://godoc.org/github.com/syossan27/tebata) -[![MIT License](http://img.shields.io/badge/license-MIT-blue.svg?style=flat-square)](https://github.com/syossan27/tebata/blob/master/LICENSE) - -![logo](https://github.com/syossan27/tebata/blob/master/resources/logo.png) - -## Overview - -Simple linux signal handler for Go - -## Installation - -``` -go get -u github.com/syossan27/tebata -``` - -## Usage - -```go -package main - -import ( - "fmt" - "strconv" - "syscall" - - "github.com/syossan27/tebata" -) - -func main() { - t := tebata.New(syscall.SIGINT, syscall.SIGTERM) - - // Do function when catch signal. - t.Reserve(sum, 1, 2) - t.Reserve(hello) - t.Reserve(os.Exit, 0) - - for { - // Do something - } -} - -func sum(firstArg, secondArg int) { - fmt.Println(strconv.Itoa(firstArg + secondArg)) -} - -func hello() { - fmt.Println("Hello") -} - -// Expect output when type Ctrl + C: -// 3 -// Hello -``` - - -## Why? - -Look this article. - -[How to implement a signal handler in Go](https://dev.to/syossan27/how-to-implement-a-signal-handler-in-go--582c) - -## Artwork credits -The Go gopher was designed by [Renée French](http://reneefrench.blogspot.com/). -The gopher side portrait is designed by [Takuya Ueda](https://twitter.com/tenntenn). -Licensed under the "Creative CommonsAttribution 3.0" license. diff --git a/vendor/github.com/syossan27/tebata/tebata.go b/vendor/github.com/syossan27/tebata/tebata.go deleted file mode 100644 index 471e16e..0000000 --- a/vendor/github.com/syossan27/tebata/tebata.go +++ /dev/null @@ -1,101 +0,0 @@ -package tebata - -import ( - "fmt" - "os" - "os/signal" - "reflect" - "sync" -) - -// Tebata struct has any status. -type Tebata struct { - mutex *sync.Mutex - signalCh chan os.Signal - reservedFunction []functionData -} - -type functionData struct { - function interface{} - args []interface{} -} - -// New Tebata struct, and start to catch signal. -func New(signals ...os.Signal) *Tebata { - s := &Tebata{ - mutex: new(sync.Mutex), - signalCh: make(chan os.Signal, 1), - } - signal.Notify(s.signalCh, signals...) - go s.listen() - return s -} - -func (s *Tebata) listen() { - for { - select { - case <-s.signalCh: - s.exec() - } - } -} - -func (s *Tebata) exec() { - defer s.mutex.Unlock() - s.mutex.Lock() - for _, rf := range s.reservedFunction { - argsValueOf := reflect.ValueOf(rf.args) - argsKind := argsValueOf.Kind() - argsTypeName := argsValueOf.Type().Name() - - switch argsKind { - case reflect.Slice: - // Expand argsValue for convert args element from interface{} to reflect.Value - var argsValue []reflect.Value - argsInterface := argsValueOf.Interface().([]interface{}) - for _, arg := range argsInterface { - argsValue = append(argsValue, reflect.ValueOf(arg)) - } - - // Call function - function := reflect.ValueOf(rf.function) - function.Call(argsValue) - default: - panic(fmt.Sprintf("Invalid function arguments. arguments type: %s", argsTypeName)) - } - } -} - -// Reserve the function to be executed when receiving the Linux signal. -func (s *Tebata) Reserve(function interface{}, args ...interface{}) error { - defer s.mutex.Unlock() - s.mutex.Lock() - if reflect.ValueOf(function).Kind() != reflect.Func { - return fmt.Errorf("Invalid \"function\" argument.\n Expect Type: func") - } - if reflect.ValueOf(args).Kind() != reflect.Slice { - return fmt.Errorf("Invalid \"args\" argument.\n Expect Type: slice") - } - - s.reservedFunction = append( - s.reservedFunction, - functionData{ - function, - convertInterfaceSlice(args), - }, - ) - - return nil -} - -func convertInterfaceSlice(args interface{}) (convertedSlice []interface{}) { - a := reflect.ValueOf(args) - length := a.Len() - convertedSlice = make([]interface{}, length) - - for i := 0; i < length; i++ { - convertedSlice[i] = a.Index(i).Interface() - } - - return convertedSlice -} diff --git a/vendor/github.com/wailsapp/wails/.eslintignore b/vendor/github.com/wailsapp/wails/.eslintignore deleted file mode 100644 index 6b6c207..0000000 --- a/vendor/github.com/wailsapp/wails/.eslintignore +++ /dev/null @@ -1 +0,0 @@ -runtime/assets/default.html \ No newline at end of file diff --git a/vendor/github.com/wailsapp/wails/.eslintrc b/vendor/github.com/wailsapp/wails/.eslintrc deleted file mode 100644 index 570dfef..0000000 --- a/vendor/github.com/wailsapp/wails/.eslintrc +++ /dev/null @@ -1,30 +0,0 @@ -{ - "env": { - "browser": true, - "es6": true, - "node": true, - }, - "extends": "eslint:recommended", - "parserOptions": { - "ecmaVersion": 2016, - "sourceType": "module", - }, - "rules": { - "indent": [ - "error", - "tab" - ], - "linebreak-style": [ - "error", - "unix" - ], - "quotes": [ - "error", - "single" - ], - "semi": [ - "error", - "always" - ] - } -} \ No newline at end of file diff --git a/vendor/github.com/wailsapp/wails/.gitignore b/vendor/github.com/wailsapp/wails/.gitignore deleted file mode 100644 index e2476fd..0000000 --- a/vendor/github.com/wailsapp/wails/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -# Binaries for programs and plugins -*.exe -*.exe~ -*.dll -*.so -*.dylib - -# Test binary, build with `go test -c` -*.test - -# Output of the go coverage tool, specifically when used with LiteIDE -*.out - -examples/**/example* -!examples/**/*.* -cmd/wails/wails -.DS_Store -tmp -node_modules/ -v2/test/kitchensink/frontend/public -v2/internal/ffenestri/runtime.c -v2/internal/runtime/assets/desktop.js -v2/test/kitchensink/build/darwin/desktop/kitchensink -v2/test/kitchensink/frontend/package.json.md5 diff --git a/vendor/github.com/wailsapp/wails/.goreleaser.yml b/vendor/github.com/wailsapp/wails/.goreleaser.yml deleted file mode 100644 index a576998..0000000 --- a/vendor/github.com/wailsapp/wails/.goreleaser.yml +++ /dev/null @@ -1,34 +0,0 @@ -# This is an example goreleaser.yaml file with some sane defaults. -# Make sure to check the documentation at http://goreleaser.com - -builds: -- env: - - CGO_ENABLED=0 - goos: - - windows - - linux - - darwin - goarch: - - 386 - - amd64 - ignore: - - goos: darwin - goarch: 386 - main: ./cmd/wails/main.go -archive: - replacements: - darwin: Darwin - linux: Linux - windows: Windows - 386: i386 - amd64: x86_64 -checksum: - name_template: 'checksums.txt' -snapshot: - name_template: "{{ .Tag }}-next" -changelog: - sort: asc - filters: - exclude: - - '^docs:' - - '^test:' diff --git a/vendor/github.com/wailsapp/wails/.hound.yml b/vendor/github.com/wailsapp/wails/.hound.yml deleted file mode 100644 index c74b4a1..0000000 --- a/vendor/github.com/wailsapp/wails/.hound.yml +++ /dev/null @@ -1,6 +0,0 @@ -jshint: - config_file: .jshintrc -eslint: - enabled: true - config_file: .eslintrc - ignore_file: .eslintignore \ No newline at end of file diff --git a/vendor/github.com/wailsapp/wails/.jshintrc b/vendor/github.com/wailsapp/wails/.jshintrc deleted file mode 100644 index 53b202c..0000000 --- a/vendor/github.com/wailsapp/wails/.jshintrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "esversion": 6 -} \ No newline at end of file diff --git a/vendor/github.com/wailsapp/wails/CHANGELOG.md b/vendor/github.com/wailsapp/wails/CHANGELOG.md deleted file mode 100644 index e742829..0000000 --- a/vendor/github.com/wailsapp/wails/CHANGELOG.md +++ /dev/null @@ -1,34 +0,0 @@ - -2019-07-20 **v0.17.6-pre** -* Significant refactor of runtime -* Removed wailsbridge file - now a unified approach taken -* Fixed React on Windows - Thanks [Florian Didran](https://github.com/fdidron)! - -2019-06-18 **v0.16.0** -* React template FTW! - Thanks [admin_3.exe](https://github.com/bh90210)! -* Updated contributors -* Arch Linux detection without lsb-release -* Removed deprecated methods for dealing with JS/CSS in the backend - -2019-05-29 **v0.14.11-pre** -* Windows fix for spinner - -2019-05-29 **v0.14.10-pre** -* Windows fix for Vuetify - -2019-05-29 **v0.14.9-pre** -* Vuetify project template 🎉 - -2019-05-29 **v0.14.8-pre** -* Updated Ubuntu npm install command - -2019-05-22 **v0.14.7-pre** -* New projects are built automatically when initialised -* Go 1.12 is now a minimum requirement - -2019-05-21 **v0.14.6-pre** -* Hotfix for module dependency issue - -2019-05-20 **v0.14.5-pre** -* Added developer tooling - New Template Generator -* Documentation fixes - Thanks [admin_3.exe](https://github.com/bh90210)! diff --git a/vendor/github.com/wailsapp/wails/CONTRIBUTORS.md b/vendor/github.com/wailsapp/wails/CONTRIBUTORS.md deleted file mode 100644 index d5119e9..0000000 --- a/vendor/github.com/wailsapp/wails/CONTRIBUTORS.md +++ /dev/null @@ -1,48 +0,0 @@ -# Contributors - -Wails is what it is because of the time and effort given by these great people. A huge thank you to each and every one! - - * [Dustin Krysak](https://wiki.ubuntu.com/bashfulrobot) - * [Qais Patankar](https://github.com/qaisjp) - * [Anthony Lee](https://github.com/alee792) - * [Adrian Lanzafame](https://github.com/lanzafame) - * [Mattn](https://github.com/mattn) - * [0xflotus](https://github.com/0xflotus) - * [Michael D Henderson](https://github.com/mdhender) - * [fred2104](https://github.com/fishfishfish2104) - * [intelwalk](https://github.com/intelwalk) - * [Mark Stenglein](https://github.com/ocelotsloth) - * [admin_3.exe](https://github.com/bh90210) - * [iceleo-com](https://github.com/iceleo-com) - * [fallendusk](https://github.com/fallendusk) - * [Nikolai Zimmermann](https://github.com/Chronophylos) - * [Toyam Cox](https://github.com/Vaelatern) - * [Robin Eklind](https://github.com/mewmew) - * [Kris Raney](https://github.com/kraney) - * [Jack Mordaunt](https://github.com/JackMordaunt) - * [Michael Hipp](https://github.com/MichaelHipp) - * [Travis McLane](https://github.com/tmclane) - * [Reuben Thomas-Davis](https://github.com/Rested) - * [Jarek](https://github.com/Jarek-SRT) - * [Konez2k](https://github.com/konez2k) - * [msms](https://github.com/sayuthisobri) - * [dedo1911](https://github.com/dedo1911) - * [Florian Didron](https://github.com/fdidron) - * [Christopher Murphy](https://github.com/Splode) - * [Zámbó, Levente](https://github.com/Lyimmi) - * [artem](https://github.com/Unix4ever) - * [Tim Kipp](https://github.com/timkippdev) - * [Dmitry Gomzyakov](https://github.com/kyoto44) - * [Arthur Wiebe](https://github.com/artooro) - * [Ilgıt Yıldırım](https://github.com/ilgityildirim) - * [Altynbek](https://github.com/gelleson) - * [Kyle](https://github.com/kmuchmore) - * [Balakrishna Prasad Ganne](https://github.com/aayush420) - * [Charaf Rezrazi](https://github.com/Rezrazi) - * [misitebao](https://github.com/misitebao) - * [Elie Grenon](https://github.com/DrunkenPoney) - * [SophieAu](https://github.com/SophieAu) - * [Alexander Matviychuk](https://github.com/alexmat) - * [RH12503](https://github.com/RH12503) - * [hi019](https://github.com/hi019) - * [Igor Minen](https://github.com/Igogrek) diff --git a/vendor/github.com/wailsapp/wails/README.md b/vendor/github.com/wailsapp/wails/README.md deleted file mode 100644 index 782d57e..0000000 --- a/vendor/github.com/wailsapp/wails/README.md +++ /dev/null @@ -1,300 +0,0 @@ -

-
-

-

- Build desktop applications using Go & Web Technologies.

- - - - CodeFactor - CodeFactor - - - Awesome - Release Pipelines -

- - - -## Internationalization - -English | [简体中文](README.zh_CN.md) - -The traditional method of providing web interfaces to Go programs is via a built-in web server. Wails offers a different approach: it provides the ability to wrap both Go code and a web frontend into a single binary. Tools are provided to make this easy for you by handling project creation, compilation and bundling. All you have to do is get creative! - -The official docs can be found at [https://wails.app](https://wails.app). - - - -## Contents - -- [1. Internationalization](#nav-1) -- [2. Contents](#nav-2) -- [3. Features](#nav-3) -- [4. Sponsors](#nav-4) -- [5. Installation](#nav-5) - - [5.1 MacOS](#nav-5-1) - - [5.2 Linux](#nav-5-2) - - [5.2.1 Debian/Ubuntu](#nav-5-2-1) - - [5.2.2 Arch Linux / ArchLabs / Ctlos Linux](#nav-5-2-2) - - [5.2.3 Centos](#nav-5-2-3) - - [5.2.4 Fedora](#nav-5-2-4) - - [5.2.5 VoidLinux & VoidLinux-musl](#nav-5-2-5) - - [5.2.6 Gentoo](#nav-5-2-6) - - [5.3 Windows](#nav-5-3) -- [6. Installation](#nav-6) -- [7. Next Steps](#nav-7) -- [8. FAQ](#nav-8) -- [9. Contributors](#nav-9) -- [10. Special Mentions](#nav-10) -- [11. Licensing](#nav-11) -- [12. Special Thanks](#nav-12) - - - -## Features - -- Use standard Go for the backend -- Use any frontend technology to build your UI -- Quickly create Vue, Vuetify or React frontends for your Go programs -- Expose Go methods/functions to the frontend via a single bind command -- Uses native rendering engines - no embedded browser -- Shared events system -- Native file dialogs -- Powerful cli tool -- Multiplatform - - - -## Sponsors - -This project is supported by these kind people / companies: - - - - - - - - - - - - - - - - - - - - - - - - - -## Installation - -Wails uses cgo to bind to the native rendering engines so a number of platform dependent libraries are needed as well as an installation of Go. The basic requirements are: - -- Go 1.16 -- npm - - - -### MacOS - -Make sure you have the xcode command line tools installed. This can be done by running: - -`xcode-select --install` - - - -### Linux - - - -#### Debian/Ubuntu - -`sudo apt install libgtk-3-dev libwebkit2gtk-4.0-dev` - -_Debian: 8, 9, 10_ - -_Ubuntu: 16.04, 18.04, 19.04_ - -_Also succesfully tested on: Zorin 15, Parrot 4.7, Linuxmint 19, Elementary 5, Kali, Neon_, Pop!\_OS - - - -#### Arch Linux / ArchLabs / Ctlos Linux - -`sudo pacman -S webkit2gtk gtk3` - -_Also succesfully test on: Manjaro & ArcoLinux_ - - - -#### Centos - -`sudo yum install webkitgtk3-devel gtk3-devel` - -_CentOS 6, 7_ - - - -#### Fedora - -`sudo yum install webkit2gtk3-devel gtk3-devel` - -_Fedora 29, 30_ - - - -#### VoidLinux & VoidLinux-musl - -`xbps-install gtk+3-devel webkit2gtk-devel` - - - -#### Gentoo - -`sudo emerge gtk+:3 webkit-gtk` - - - -### Windows - -Windows requires gcc and related tooling. The recommended download is from [http://tdm-gcc.tdragon.net/download](http://tdm-gcc.tdragon.net/download). Once this is installed, you are good to go. - - - -## Installation - -**Ensure Go modules are enabled: GO111MODULE=on and go/bin is in your PATH variable.** - -Installation is as simple as running the following command: - -
-go get -u github.com/wailsapp/wails/cmd/wails
-
- - - -## Next Steps - -It is recommended at this stage to read the comprehensive documentation at [https://wails.app](https://wails.app). - - - -## FAQ - -- Is this an alternative to Electron? - - Depends on your requirements. It's designed to make it easy for Go programmers to make lightweight desktop applications or add a frontend to their existing applications. Whilst Wails does not currently offer hooks into native elements such as menus, this may change in the future. - -- Who is this project aimed at? - - Go programmers who want to bundle an HTML/JS/CSS frontend with their applications, without resorting to creating a server and opening a browser to view it. - -- What's with the name? - - When I saw WebView, I thought "What I really want is tooling around building a WebView app, a bit like Rails is to Ruby". So initially it was a play on words (Webview on Rails). It just so happened to also be a homophone of the English name for the [Country](https://en.wikipedia.org/wiki/Wales) I am from. So it stuck. - - - -## Contributors - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -## Special Mentions - -Without the following people, this project would never have existed: - -- [Dustin Krysak](https://wiki.ubuntu.com/bashfulrobot) - His support and feedback has been immense. More patience than you can throw a stick at (Not long now Dustin!). -- [Serge Zaitsev](https://github.com/zserge) - Creator of [Webview](https://github.com/zserge/webview) which Wails uses for the windowing. -- [Byron](https://github.com/bh90210) - At times, Byron has single handedly kept this project alive. Without his incredible input, we never would have got to v1. - -This project was mainly coded to the following albums: - -- [Manic Street Preachers - Resistance Is Futile](https://open.spotify.com/album/1R2rsEUqXjIvAbzM0yHrxA) -- [Manic Street Preachers - This Is My Truth, Tell Me Yours](https://open.spotify.com/album/4VzCL9kjhgGQeKCiojK1YN) -- [The Midnight - Endless Summer](https://open.spotify.com/album/4Krg8zvprquh7TVn9OxZn8) -- [Gary Newman - Savage (Songs from a Broken World)](https://open.spotify.com/album/3kMfsD07Q32HRWKRrpcexr) -- [Steve Vai - Passion & Warfare](https://open.spotify.com/album/0oL0OhrE2rYVns4IGj8h2m) -- [Ben Howard - Every Kingdom](https://open.spotify.com/album/1nJsbWm3Yy2DW1KIc1OKle) -- [Ben Howard - Noonday Dream](https://open.spotify.com/album/6astw05cTiXEc2OvyByaPs) -- [Adwaith - Melyn](https://open.spotify.com/album/2vBE40Rp60tl7rNqIZjaXM) -- [Gwidaith Hen Fran - Cedors Hen Wrach](https://open.spotify.com/album/3v2hrfNGINPLuDP0YDTOjm) -- [Metallica - Metallica](https://open.spotify.com/album/2Kh43m04B1UkVcpcRa1Zug) -- [Bloc Party - Silent Alarm](https://open.spotify.com/album/6SsIdN05HQg2GwYLfXuzLB) -- [Maxthor - Another World](https://open.spotify.com/album/3tklE2Fgw1hCIUstIwPBJF) -- [Alun Tan Lan - Y Distawrwydd](https://open.spotify.com/album/0c32OywcLpdJCWWMC6vB8v) - - - -## Licensing - -[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fwailsapp%2Fwails.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2Fwailsapp%2Fwails?ref=badge_large) - - - -## Special Thanks - -

-
- A *huge* thanks to Pace for sponsoring the project and helping the efforts to get Wails ported to Apple Silicon!

- If you are looking for a Project Management tool that's powerful but quick and easy to use, check them out!

-

- -

- A special thank you to JetBrains for donating licenses to us!

- Please click the logo to let them know your appreciation!

- -

diff --git a/vendor/github.com/wailsapp/wails/README.zh_CN.md b/vendor/github.com/wailsapp/wails/README.zh_CN.md deleted file mode 100644 index 547adc1..0000000 --- a/vendor/github.com/wailsapp/wails/README.zh_CN.md +++ /dev/null @@ -1,297 +0,0 @@ -

-
-

-

- 使用 Go 和 Web 技术构建桌面应用程序。

- - - - CodeFactor - CodeFactor - - - Awesome - Release Pipelines -

- - - -## 国际化 - -[English](README.md) | 简体中文 - -向 Go 程序提供 Web 接口的传统方法是通过内置 Web 服务器。Wails 提供了一种不同的方法:它提供了将 Go 代码和 Web 前端都包装成单个二进制文件的能力。通过处理项目创建、编译和打包,可为您提供工具,使您轻松做到这一点。你所要做的就是发挥创造力! - -官方文档可以在 [https://wails.app](https://wails.app)中找到。 -国内镜像站点 [https://wails.top](https://wails.top) - - - -## 内容目录 - -- [1. 国际化](#nav-1) -- [2. 内容目录](#nav-2) -- [3. 特征](#nav-3) -- [4. 赞助商](#nav-4) -- [5. 安装](#nav-5) - - [5.1 MacOS](#nav-5-1) - - [5.2 Linux](#nav-5-2) - - [5.2.1 Debian/Ubuntu](#nav-5-2-1) - - [5.2.2 Arch Linux / ArchLabs / Ctlos Linux](#nav-5-2-2) - - [5.2.3 Centos](#nav-5-2-3) - - [5.2.4 Fedora](#nav-5-2-4) - - [5.2.5 VoidLinux & VoidLinux-musl](#nav-5-2-5) - - [5.2.6 Gentoo](#nav-5-2-6) - - [5.3 Windows](#nav-5-3) -- [6. 安装](#nav-6) -- [7. 下一步](#nav-7) -- [8. 常见问题](#nav-8) -- [9. 贡献者](#nav-9) -- [10. 特别提及](#nav-10) -- [11. 许可协议](#nav-11) -- [12. 特别感谢](#nav-12) - - - -## 特征 - -- 后端使用标准 Go -- 使用任意前端技术构建 UI 界面 -- 快速为您的 Go 应用生成 Vue、Vuetify、React 前端代码 -- 通过简单的绑定命令将 Go 方法暴露到前端 -- 使用原生渲染引擎 - 无嵌入式浏览器 -- 共享事件系统 -- 原生文件系统对话框 -- 强大的命令行工具 -- 跨多个平台 - - - -## 赞助商 - -这个项目由以下这些人或者公司支持: - - - - - - - - - - - - - - - - - - - - - -## 安装 - -Wails 使用 cgo 与原生渲染引擎结合,因此需要一些依赖平台的库以及 Go 的安装。基本要求是: - -- Go 1.16 -- npm - - - -### MacOS - -请确保已安装 xcode 命令行工具。这可以通过运行下面的命令来完成: - -`xcode-select --install` - - - -### Linux - - - -#### Debian/Ubuntu - -`sudo apt install libgtk-3-dev libwebkit2gtk-4.0-dev` - -_Debian: 8, 9, 10_ - -_Ubuntu: 16.04, 18.04, 19.04_ - -_Also succesfully tested on: Zorin 15, Parrot 4.7, Linuxmint 19, Elementary 5, Kali, Neon_, Pop!\_OS - - - -#### Arch Linux / ArchLabs / Ctlos Linux - -`sudo pacman -S webkit2gtk gtk3` - -_Also succesfully test on: Manjaro & ArcoLinux_ - - - -#### Centos - -`sudo yum install webkitgtk3-devel gtk3-devel` - -_CentOS 6, 7_ - - - -#### Fedora - -`sudo yum install webkit2gtk3-devel gtk3-devel` - -_Fedora 29, 30_ - - - -#### VoidLinux & VoidLinux-musl - -`xbps-install gtk+3-devel webkit2gtk-devel` - - - -#### Gentoo - -`sudo emerge gtk+:3 webkit-gtk` - - - -### Windows - -Windows 需要 GCC 和相关工具。 建议从 [http://tdm-gcc.tdragon.net/download](http://tdm-gcc.tdragon.net/download)下载, 安装完成,您就可以开始了。 - - - -## 安装 - -**确保 Go modules 是开启的: GO111MODULE=on 并且 go/bin 在您的 PATH 变量中.** - -安装很简单,运行以下命令: - -
-go get -u github.com/wailsapp/wails/cmd/wails
-
- - - -## 下一步 - -建议在此时阅读[https://wails.app](https://wails.app)上面的文档. - - - -## 常见问题 - -- 它是 Electron 的替代品吗? - - 取决于您的要求。它旨在使 Go 程序员可以轻松制作轻量级桌面应用程序或在其现有应用程序中添加前端。尽管 Wails 当前不提供对诸如菜单之类的本机元素的钩子,但将来可能会改变。 - -- 这个项目针对的是谁? - - 希望将 HTML / JS / CSS 前端与其应用程序捆绑在一起的程序员,而无需借助创建服务并打开浏览器进行查看的方式。 - -- 名字怎么来的? - - 当我看到 WebView 时,我想"我真正想要的是围绕构建 WebView 应用程序工作,有点像 Rails 对于 Ruby"。因此,最初它是一个文字游戏(Webview on Rails)。碰巧也是我来自的[国家](https://en.wikipedia.org/wiki/Wales)的英文名字的同音。所以就是他了。 - - - -## 贡献者 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -## 特别提及 - -如果没有以下人员,此项目将永远不会存在: - -- [Dustin Krysak](https://wiki.ubuntu.com/bashfulrobot) - His support and feedback has been immense. More patience than you can throw a stick at (Not long now Dustin!). -- [Serge Zaitsev](https://github.com/zserge) - Creator of [Webview](https://github.com/zserge/webview) which Wails uses for the windowing. -- [Byron](https://github.com/bh90210) - At times, Byron has single handedly kept this project alive. Without his incredible input, we never would have got to v1. - -This project was mainly coded to the following albums: - -- [Manic Street Preachers - Resistance Is Futile](https://open.spotify.com/album/1R2rsEUqXjIvAbzM0yHrxA) -- [Manic Street Preachers - This Is My Truth, Tell Me Yours](https://open.spotify.com/album/4VzCL9kjhgGQeKCiojK1YN) -- [The Midnight - Endless Summer](https://open.spotify.com/album/4Krg8zvprquh7TVn9OxZn8) -- [Gary Newman - Savage (Songs from a Broken World)](https://open.spotify.com/album/3kMfsD07Q32HRWKRrpcexr) -- [Steve Vai - Passion & Warfare](https://open.spotify.com/album/0oL0OhrE2rYVns4IGj8h2m) -- [Ben Howard - Every Kingdom](https://open.spotify.com/album/1nJsbWm3Yy2DW1KIc1OKle) -- [Ben Howard - Noonday Dream](https://open.spotify.com/album/6astw05cTiXEc2OvyByaPs) -- [Adwaith - Melyn](https://open.spotify.com/album/2vBE40Rp60tl7rNqIZjaXM) -- [Gwidaith Hen Fran - Cedors Hen Wrach](https://open.spotify.com/album/3v2hrfNGINPLuDP0YDTOjm) -- [Metallica - Metallica](https://open.spotify.com/album/2Kh43m04B1UkVcpcRa1Zug) -- [Bloc Party - Silent Alarm](https://open.spotify.com/album/6SsIdN05HQg2GwYLfXuzLB) -- [Maxthor - Another World](https://open.spotify.com/album/3tklE2Fgw1hCIUstIwPBJF) -- [Alun Tan Lan - Y Distawrwydd](https://open.spotify.com/album/0c32OywcLpdJCWWMC6vB8v) - - - -## 许可协议 - -[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fwailsapp%2Fwails.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2Fwailsapp%2Fwails?ref=badge_large) - - - -## 特别感谢 - -

-
- 非常感谢Pace对项目的赞助,并帮助将Wails移植到Apple Silicon

- 如果您正在寻找一个强大的项目管理工具,并且快速和易于使用,可以看看他们!

-

- -

- 特别感谢JetBrains向我们捐赠许可!

- 请点击logo让他们知道你的感激之情!

- -

diff --git a/vendor/github.com/wailsapp/wails/app.go b/vendor/github.com/wailsapp/wails/app.go deleted file mode 100644 index 95a8a7e..0000000 --- a/vendor/github.com/wailsapp/wails/app.go +++ /dev/null @@ -1,174 +0,0 @@ -package wails - -import ( - "os" - "syscall" - - "github.com/syossan27/tebata" - "github.com/wailsapp/wails/cmd" - "github.com/wailsapp/wails/lib/binding" - "github.com/wailsapp/wails/lib/event" - "github.com/wailsapp/wails/lib/interfaces" - "github.com/wailsapp/wails/lib/ipc" - "github.com/wailsapp/wails/lib/logger" - "github.com/wailsapp/wails/lib/renderer" - wailsruntime "github.com/wailsapp/wails/runtime" -) - -// -------------------------------- Compile time Flags ------------------------------ - -// BuildMode indicates what mode we are in -var BuildMode = cmd.BuildModeProd - -// Runtime is the Go Runtime struct -type Runtime = wailsruntime.Runtime - -// Store is a state store used for syncing with -// the front end -type Store = wailsruntime.Store - -// CustomLogger is a specialised logger -type CustomLogger = logger.CustomLogger - -// ---------------------------------------------------------------------------------- - -// App defines the main application struct -type App struct { - config *AppConfig // The Application configuration object - cli *cmd.Cli // In debug mode, we have a cli - renderer interfaces.Renderer // The renderer is what we will render the app to - logLevel string // The log level of the app - ipc interfaces.IPCManager // Handles the IPC calls - log *logger.CustomLogger // Logger - bindingManager interfaces.BindingManager // Handles binding of Go code to renderer - eventManager interfaces.EventManager // Handles all the events - runtime interfaces.Runtime // The runtime object for registered structs -} - -// CreateApp creates the application window with the given configuration -// If none given, the defaults are used -func CreateApp(optionalConfig ...*AppConfig) *App { - var userConfig *AppConfig - if len(optionalConfig) > 0 { - userConfig = optionalConfig[0] - } - - result := &App{ - logLevel: "debug", - renderer: renderer.NewWebView(), - ipc: ipc.NewManager(), - bindingManager: binding.NewManager(), - eventManager: event.NewManager(), - log: logger.NewCustomLogger("App"), - } - - appconfig, err := newConfig(userConfig) - if err != nil { - result.log.Fatalf("Cannot use custom HTML: %s", err.Error()) - } - result.config = appconfig - - // Set up the CLI if not in release mode - if BuildMode != cmd.BuildModeProd { - result.cli = result.setupCli() - } else { - // Disable Inspector in release mode - result.config.DisableInspector = true - } - - // Platform specific init - platformInit() - - return result -} - -// Run the app -func (a *App) Run() error { - - if BuildMode != cmd.BuildModeProd { - return a.cli.Run() - } - - a.logLevel = "error" - err := a.start() - if err != nil { - a.log.Error(err.Error()) - } - return err -} - -func (a *App) start() error { - - // Set the log level - logger.SetLogLevel(a.logLevel) - - // Log starup - a.log.Info("Starting") - - // Check if we are to run in bridge mode - if BuildMode == cmd.BuildModeBridge { - a.renderer = renderer.NewBridge() - } - - // Initialise the renderer - err := a.renderer.Initialise(a.config, a.ipc, a.eventManager) - if err != nil { - return err - } - - // Start signal handler - t := tebata.New(os.Interrupt, os.Kill, syscall.SIGTERM, syscall.SIGINT, syscall.SIGKILL) - t.Reserve(func() { - a.log.Debug("SIGNAL CAUGHT! Starting Shutdown") - a.renderer.Close() - }) - - // Start event manager and give it our renderer - a.eventManager.Start(a.renderer) - - // Start the IPC Manager and give it the event manager and binding manager - a.ipc.Start(a.eventManager, a.bindingManager) - - // Create the runtime - a.runtime = wailsruntime.NewRuntime(a.eventManager, a.renderer) - - // Start binding manager and give it our renderer - err = a.bindingManager.Start(a.renderer, a.runtime) - if err != nil { - return err - } - - // Defer the shutdown - defer a.shutdown() - - // Run the renderer - err = a.renderer.Run() - if err != nil { - return err - } - - return nil -} - -// shutdown the app -func (a *App) shutdown() { - // Make sure this is only called once - a.log.Debug("Shutting down") - - // Shutdown Binding Manager - a.bindingManager.Shutdown() - - // Shutdown IPC Manager - a.ipc.Shutdown() - - // Shutdown Event Manager - a.eventManager.Shutdown() - - a.log.Debug("Cleanly Shutdown") -} - -// Bind allows the user to bind the given object -// with the application -func (a *App) Bind(object interface{}) { - a.bindingManager.Bind(object) -} diff --git a/vendor/github.com/wailsapp/wails/app_other.go b/vendor/github.com/wailsapp/wails/app_other.go deleted file mode 100644 index 5d63c4c..0000000 --- a/vendor/github.com/wailsapp/wails/app_other.go +++ /dev/null @@ -1,7 +0,0 @@ -// +build linux darwin !windows - -package wails - -func platformInit() { - -} diff --git a/vendor/github.com/wailsapp/wails/app_windows.go b/vendor/github.com/wailsapp/wails/app_windows.go deleted file mode 100644 index 6386d41..0000000 --- a/vendor/github.com/wailsapp/wails/app_windows.go +++ /dev/null @@ -1,27 +0,0 @@ -// +build windows !linux !darwin - -package wails - -import ( - "fmt" - "log" - "syscall" -) - -func platformInit() { - err := SetProcessDPIAware() - if err != nil { - log.Fatalf(err.Error()) - } -} - -// SetProcessDPIAware via user32.dll -// https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setprocessdpiaware -// Also, thanks Jack Mordaunt! https://github.com/wailsapp/wails/issues/293 -func SetProcessDPIAware() error { - status, r, err := syscall.NewLazyDLL("user32.dll").NewProc("SetProcessDPIAware").Call() - if status == 0 { - return fmt.Errorf("exit status %d: %v %v", status, r, err) - } - return nil -} diff --git a/vendor/github.com/wailsapp/wails/cli.go b/vendor/github.com/wailsapp/wails/cli.go deleted file mode 100644 index 1a26f68..0000000 --- a/vendor/github.com/wailsapp/wails/cli.go +++ /dev/null @@ -1,27 +0,0 @@ -package wails - -import ( - "github.com/wailsapp/wails/cmd" -) - -// setupCli creates a new cli handler for the application -func (app *App) setupCli() *cmd.Cli { - - // Create a new cli - result := cmd.NewCli(app.config.Title, "Debug build") - result.Version(cmd.Version) - - // Setup cli to handle loglevel - result. - StringFlag("loglevel", "Sets the log level [debug|info|error|panic|fatal]. Default debug", &app.logLevel). - Action(app.start) - - // Banner - result.PreRun(func(cli *cmd.Cli) error { - log := cmd.NewLogger() - log.YellowUnderline(app.config.Title + " - Debug Build") - return nil - }) - - return result -} diff --git a/vendor/github.com/wailsapp/wails/cmd/build.go b/vendor/github.com/wailsapp/wails/cmd/build.go deleted file mode 100644 index 945fbfc..0000000 --- a/vendor/github.com/wailsapp/wails/cmd/build.go +++ /dev/null @@ -1,10 +0,0 @@ -package cmd - -const ( - // BuildModeProd indicates we are building for prod mode - BuildModeProd = "prod" - // BuildModeDebug indicates we are building for debug mode - BuildModeDebug = "debug" - // BuildModeBridge indicates we are building for bridge mode - BuildModeBridge = "bridge" -) diff --git a/vendor/github.com/wailsapp/wails/cmd/cli.go b/vendor/github.com/wailsapp/wails/cmd/cli.go deleted file mode 100644 index d52a445..0000000 --- a/vendor/github.com/wailsapp/wails/cmd/cli.go +++ /dev/null @@ -1,285 +0,0 @@ -package cmd - -import ( - "flag" - "fmt" - "os" - "strings" -) - -// NewCli - Creates a new Cli application object -func NewCli(name, description string) *Cli { - result := &Cli{} - result.rootCommand = NewCommand(name, description, result, "") - result.log = NewLogger() - return result -} - -// Cli - The main application object -type Cli struct { - rootCommand *Command - defaultCommand *Command - preRunCommand func(*Cli) error - log *Logger -} - -// Version - Set the Application version string -func (c *Cli) Version(version string) { - c.rootCommand.AppVersion = version -} - -// PrintHelp - Prints the application's help -func (c *Cli) PrintHelp() { - c.rootCommand.PrintHelp() -} - -// Run - Runs the application with the given arguments -func (c *Cli) Run(args ...string) error { - if c.preRunCommand != nil { - err := c.preRunCommand(c) - if err != nil { - return err - } - } - if len(args) == 0 { - args = os.Args[1:] - } - return c.rootCommand.Run(args) -} - -// DefaultCommand - Sets the given command as the command to run when -// no other commands given -func (c *Cli) DefaultCommand(defaultCommand *Command) *Cli { - c.defaultCommand = defaultCommand - return c -} - -// Command - Adds a command to the application -func (c *Cli) Command(name, description string) *Command { - return c.rootCommand.Command(name, description) -} - -// PreRun - Calls the given function before running the specific command -func (c *Cli) PreRun(callback func(*Cli) error) { - c.preRunCommand = callback -} - -// BoolFlag - Adds a boolean flag to the root command -func (c *Cli) BoolFlag(name, description string, variable *bool) *Command { - c.rootCommand.BoolFlag(name, description, variable) - return c.rootCommand -} - -// StringFlag - Adds a string flag to the root command -func (c *Cli) StringFlag(name, description string, variable *string) *Command { - c.rootCommand.StringFlag(name, description, variable) - return c.rootCommand -} - -// Action represents a function that gets calls when the command is called by -// the user -type Action func() error - -// Command represents a command that may be run by the user -type Command struct { - Name string - CommandPath string - Shortdescription string - Longdescription string - AppVersion string - SubCommands []*Command - SubCommandsMap map[string]*Command - longestSubcommand int - ActionCallback Action - App *Cli - Flags *flag.FlagSet - flagCount int - log *Logger - helpFlag bool - hidden bool -} - -// NewCommand creates a new Command -func NewCommand(name string, description string, app *Cli, parentCommandPath string) *Command { - result := &Command{ - Name: name, - Shortdescription: description, - SubCommandsMap: make(map[string]*Command), - App: app, - log: NewLogger(), - hidden: false, - } - - // Set up command path - if parentCommandPath != "" { - result.CommandPath += parentCommandPath + " " - } - result.CommandPath += name - - // Set up flag set - result.Flags = flag.NewFlagSet(result.CommandPath, flag.ContinueOnError) - result.BoolFlag("help", "Get help on the '"+result.CommandPath+"' command.", &result.helpFlag) - - // result.Flags.Usage = result.PrintHelp - - return result -} - -// parseFlags parses the given flags -func (c *Command) parseFlags(args []string) error { - // Parse flags - tmp := os.Stderr - os.Stderr = nil - err := c.Flags.Parse(args) - os.Stderr = tmp - if err != nil { - fmt.Printf("Error: %s\n\n", err.Error()) - c.PrintHelp() - } - return err -} - -// Run - Runs the Command with the given arguments -func (c *Command) Run(args []string) error { - - // If we have arguments, process them - if len(args) > 0 { - // Check for subcommand - subcommand := c.SubCommandsMap[args[0]] - if subcommand != nil { - return subcommand.Run(args[1:]) - } - - // Parse flags - err := c.parseFlags(args) - if err != nil { - fmt.Printf("Error: %s\n\n", err.Error()) - c.PrintHelp() - return err - } - - // Help takes precedence - if c.helpFlag { - c.PrintHelp() - return nil - } - } - - // Do we have an action? - if c.ActionCallback != nil { - return c.ActionCallback() - } - - // If we haven't specified a subcommand - // check for an app level default command - if c.App.defaultCommand != nil { - // Prevent recursion! - if c.App.defaultCommand != c { - // only run default command if no args passed - if len(args) == 0 { - return c.App.defaultCommand.Run(args) - } - } - } - - // Nothing left we can do - c.PrintHelp() - - return nil -} - -// Action - Define an action from this command -func (c *Command) Action(callback Action) *Command { - c.ActionCallback = callback - return c -} - -// PrintHelp - Output the help text for this command -func (c *Command) PrintHelp() { - c.log.PrintBanner() - - commandTitle := c.CommandPath - if c.Shortdescription != "" { - commandTitle += " - " + c.Shortdescription - } - // Ignore root command - if c.CommandPath != c.Name { - c.log.Yellow(commandTitle) - } - if c.Longdescription != "" { - fmt.Println() - fmt.Println(c.Longdescription + "\n") - } - if len(c.SubCommands) > 0 { - c.log.White("Available commands:") - fmt.Println("") - for _, subcommand := range c.SubCommands { - if subcommand.isHidden() { - continue - } - spacer := strings.Repeat(" ", 3+c.longestSubcommand-len(subcommand.Name)) - isDefault := "" - if subcommand.isDefaultCommand() { - isDefault = "[default]" - } - fmt.Printf(" %s%s%s %s\n", subcommand.Name, spacer, subcommand.Shortdescription, isDefault) - } - fmt.Println("") - } - if c.flagCount > 0 { - c.log.White("Flags:") - fmt.Println() - c.Flags.SetOutput(os.Stdout) - c.Flags.PrintDefaults() - c.Flags.SetOutput(os.Stderr) - - } - fmt.Println() -} - -// isDefaultCommand returns true if called on the default command -func (c *Command) isDefaultCommand() bool { - return c.App.defaultCommand == c -} - -// isHidden returns true if the command is a hidden command -func (c *Command) isHidden() bool { - return c.hidden -} - -// Hidden hides the command from the Help system -func (c *Command) Hidden() { - c.hidden = true -} - -// Command - Defines a subcommand -func (c *Command) Command(name, description string) *Command { - result := NewCommand(name, description, c.App, c.CommandPath) - result.log = c.log - c.SubCommands = append(c.SubCommands, result) - c.SubCommandsMap[name] = result - if len(name) > c.longestSubcommand { - c.longestSubcommand = len(name) - } - return result -} - -// BoolFlag - Adds a boolean flag to the command -func (c *Command) BoolFlag(name, description string, variable *bool) *Command { - c.Flags.BoolVar(variable, name, *variable, description) - c.flagCount++ - return c -} - -// StringFlag - Adds a string flag to the command -func (c *Command) StringFlag(name, description string, variable *string) *Command { - c.Flags.StringVar(variable, name, *variable, description) - c.flagCount++ - return c -} - -// LongDescription - Sets the long description for the command -func (c *Command) LongDescription(Longdescription string) *Command { - c.Longdescription = Longdescription - return c -} diff --git a/vendor/github.com/wailsapp/wails/cmd/fs.go b/vendor/github.com/wailsapp/wails/cmd/fs.go deleted file mode 100644 index 0c39e2a..0000000 --- a/vendor/github.com/wailsapp/wails/cmd/fs.go +++ /dev/null @@ -1,251 +0,0 @@ -package cmd - -import ( - "bytes" - "crypto/md5" - "encoding/json" - "fmt" - "io" - "io/ioutil" - "log" - "os" - "path" - "path/filepath" - "runtime" - "strings" - - "github.com/leaanthony/slicer" -) - -// FSHelper - Wrapper struct for File System utility commands -type FSHelper struct { -} - -// NewFSHelper - Returns a new FSHelper -func NewFSHelper() *FSHelper { - result := &FSHelper{} - return result -} - -// DirExists - Returns true if the given path resolves to a directory on the filesystem -func (fs *FSHelper) DirExists(path string) bool { - fi, err := os.Lstat(path) - if err != nil { - return false - } - - return fi.Mode().IsDir() -} - -// FileExists returns a boolean value indicating whether -// the given file exists -func (fs *FSHelper) FileExists(path string) bool { - fi, err := os.Lstat(path) - if err != nil { - return false - } - - return fi.Mode().IsRegular() -} - -// FindFile returns the first occurrence of match inside path. -func (fs *FSHelper) FindFile(path, match string) (string, error) { - files, err := ioutil.ReadDir(path) - if err != nil { - return "", err - } - - for _, f := range files { - if !f.IsDir() && strings.Contains(f.Name(), match) { - return f.Name(), nil - } - } - - return "", fmt.Errorf("file not found") -} - -// CreateFile creates a file at the given filename location with the contents -// set to the given data. It will create intermediary directories if needed. -func (fs *FSHelper) CreateFile(filename string, data []byte) error { - // Ensure directory exists - fs.MkDirs(filepath.Dir(filename)) - return ioutil.WriteFile(filename, data, 0644) -} - -// MkDirs creates the given nested directories. -// Returns error on failure -func (fs *FSHelper) MkDirs(fullPath string, mode ...os.FileMode) error { - var perms os.FileMode - perms = 0700 - if len(mode) == 1 { - perms = mode[0] - } - return os.MkdirAll(fullPath, perms) -} - -// CopyFile from source to target -func (fs *FSHelper) CopyFile(source, target string) error { - s, err := os.Open(source) - if err != nil { - return err - } - defer s.Close() - d, err := os.Create(target) - if err != nil { - return err - } - if _, err := io.Copy(d, s); err != nil { - d.Close() - return err - } - return d.Close() -} - -// Cwd returns the current working directory -// Aborts on Failure -func (fs *FSHelper) Cwd() string { - cwd, err := os.Getwd() - if err != nil { - log.Fatal("Unable to get working directory!") - } - return cwd -} - -// RemoveFile removes the given filename -func (fs *FSHelper) RemoveFile(filename string) error { - return os.Remove(filename) -} - -// RemoveFiles removes the given filenames -func (fs *FSHelper) RemoveFiles(files []string, continueOnError bool) error { - for _, filename := range files { - err := os.Remove(filename) - if err != nil && !continueOnError { - return err - } - } - return nil -} - -// Dir holds information about a directory -type Dir struct { - localPath string - fullPath string -} - -// Directory creates a new Dir struct with the given directory path -func (fs *FSHelper) Directory(dir string) (*Dir, error) { - fullPath, err := filepath.Abs(dir) - return &Dir{fullPath: fullPath}, err -} - -// LocalDir creates a new Dir struct based on a path relative to the caller -func (fs *FSHelper) LocalDir(dir string) (*Dir, error) { - _, filename, _, _ := runtime.Caller(1) - fullPath, err := filepath.Abs(filepath.Join(path.Dir(filename), dir)) - return &Dir{ - localPath: dir, - fullPath: fullPath, - }, err -} - -// LoadRelativeFile loads the given file relative to the caller's directory -func (fs *FSHelper) LoadRelativeFile(relativePath string) ([]byte, error) { - _, filename, _, _ := runtime.Caller(0) - fullPath, err := filepath.Abs(filepath.Join(path.Dir(filename), relativePath)) - if err != nil { - return nil, err - } - return ioutil.ReadFile(fullPath) -} - -// GetSubdirs will return a list of FQPs to subdirectories in the given directory -func (d *Dir) GetSubdirs() (map[string]string, error) { - - // Read in the directory information - fileInfo, err := ioutil.ReadDir(d.fullPath) - if err != nil { - return nil, err - } - - // Allocate space for the list - subdirs := make(map[string]string) - - // Pull out the directories and store in the map as - // map["directoryName"] = "path/to/directoryName" - for _, file := range fileInfo { - if file.IsDir() { - subdirs[file.Name()] = filepath.Join(d.fullPath, file.Name()) - } - } - return subdirs, nil -} - -// GetAllFilenames returns all filename in and below this directory -func (d *Dir) GetAllFilenames() (*slicer.StringSlicer, error) { - result := slicer.String() - err := filepath.Walk(d.fullPath, func(dir string, info os.FileInfo, err error) error { - if dir == d.fullPath { - return nil - } - if err != nil { - return err - } - - // Don't copy template metadata - result.Add(dir) - - return nil - }) - return result, err -} - -// MkDir creates the given directory. -// Returns error on failure -func (fs *FSHelper) MkDir(dir string) error { - return os.Mkdir(dir, 0700) -} - -// SaveAsJSON saves the JSON representation of the given data to the given filename -func (fs *FSHelper) SaveAsJSON(data interface{}, filename string) error { - - var buf bytes.Buffer - e := json.NewEncoder(&buf) - e.SetEscapeHTML(false) - e.SetIndent("", " ") - e.Encode(data) - - err := ioutil.WriteFile(filename, buf.Bytes(), 0755) - if err != nil { - return err - } - return nil -} - -// LoadAsString will attempt to load the given file and return -// its contents as a string -func (fs *FSHelper) LoadAsString(filename string) (string, error) { - bytes, err := fs.LoadAsBytes(filename) - return string(bytes), err -} - -// LoadAsBytes returns the contents of the file as a byte slice -func (fs *FSHelper) LoadAsBytes(filename string) ([]byte, error) { - return ioutil.ReadFile(filename) -} - -// FileMD5 returns the md5sum of the given file -func (fs *FSHelper) FileMD5(filename string) (string, error) { - f, err := os.Open(filename) - if err != nil { - return "", err - } - defer f.Close() - - h := md5.New() - if _, err := io.Copy(h, f); err != nil { - return "", err - } - - return fmt.Sprintf("%x", h.Sum(nil)), nil -} diff --git a/vendor/github.com/wailsapp/wails/cmd/github.go b/vendor/github.com/wailsapp/wails/cmd/github.go deleted file mode 100644 index c71c00c..0000000 --- a/vendor/github.com/wailsapp/wails/cmd/github.go +++ /dev/null @@ -1,108 +0,0 @@ -package cmd - -import ( - "encoding/json" - "fmt" - "io/ioutil" - "net/http" - "sort" -) - -// GitHubHelper is a utility class for interacting with GitHub -type GitHubHelper struct { -} - -// NewGitHubHelper returns a new GitHub Helper -func NewGitHubHelper() *GitHubHelper { - return &GitHubHelper{} -} - -// GetVersionTags gets the list of tags on the Wails repo -// It returns a list of sorted tags in descending order -func (g *GitHubHelper) GetVersionTags() ([]*SemanticVersion, error) { - - result := []*SemanticVersion{} - var err error - - resp, err := http.Get("https://api.github.com/repos/wailsapp/wails/releases") - if err != nil { - return result, err - } - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - return result, err - } - - data := []map[string]interface{}{} - err = json.Unmarshal(body, &data) - if err != nil { - return result, err - } - - // Convert tag data to Version structs - for _, tag := range data { - version := tag["name"].(string) - semver, err := NewSemanticVersion(version) - if err != nil { - return result, err - } - result = append(result, semver) - } - - // Reverse Sort - sort.Sort(sort.Reverse(SemverCollection(result))) - - return result, err -} - -// GetLatestStableRelease gets the latest stable release on GitHub -func (g *GitHubHelper) GetLatestStableRelease() (result *SemanticVersion, err error) { - - tags, err := g.GetVersionTags() - if err != nil { - return nil, err - } - - for _, tag := range tags { - if tag.IsRelease() { - return tag, nil - } - } - - return nil, fmt.Errorf("no release tag found") -} - -// GetLatestPreRelease gets the latest prerelease on GitHub -func (g *GitHubHelper) GetLatestPreRelease() (result *SemanticVersion, err error) { - - tags, err := g.GetVersionTags() - if err != nil { - return nil, err - } - - for _, tag := range tags { - if tag.IsPreRelease() { - return tag, nil - } - } - - return nil, fmt.Errorf("no prerelease tag found") -} - -// IsValidTag returns true if the given string is a valid tag -func (g *GitHubHelper) IsValidTag(tagVersion string) (bool, error) { - if tagVersion[0] == 'v' { - tagVersion = tagVersion[1:] - } - tags, err := g.GetVersionTags() - if err != nil { - return false, err - } - - for _, tag := range tags { - if tag.String() == tagVersion { - return true, nil - } - } - return false, nil -} diff --git a/vendor/github.com/wailsapp/wails/cmd/gomod.go b/vendor/github.com/wailsapp/wails/cmd/gomod.go deleted file mode 100644 index a9ca7d9..0000000 --- a/vendor/github.com/wailsapp/wails/cmd/gomod.go +++ /dev/null @@ -1,78 +0,0 @@ -package cmd - -import ( - "fmt" - "path/filepath" - "regexp" - - "github.com/Masterminds/semver" -) - -func GetWailsVersion() (*semver.Version, error) { - var FS = NewFSHelper() - var result *semver.Version - - // Load file - var err error - goModFile, err := filepath.Abs(filepath.Join(".", "go.mod")) - if err != nil { - return nil, fmt.Errorf("Unable to load go.mod at %s", goModFile) - } - goMod, err := FS.LoadAsString(goModFile) - if err != nil { - return nil, fmt.Errorf("Unable to load go.mod") - } - - // Find wails version - versionRegexp := regexp.MustCompile(`.*github.com/wailsapp/wails.*(v\d+.\d+.\d+(?:-pre\d+)?)`) - versions := versionRegexp.FindStringSubmatch(goMod) - - if len(versions) != 2 { - return nil, fmt.Errorf("Unable to determine Wails version") - } - - version := versions[1] - result, err = semver.NewVersion(version) - if err != nil { - return nil, fmt.Errorf("Unable to parse Wails version: %s", version) - } - return result, nil - -} - -func GetCurrentVersion() (*semver.Version, error) { - result, err := semver.NewVersion(Version) - if err != nil { - return nil, fmt.Errorf("Unable to parse Wails version: %s", Version) - } - return result, nil -} - -func GoModOutOfSync() (bool, error) { - gomodversion, err := GetWailsVersion() - if err != nil { - return true, err - } - currentVersion, err := GetCurrentVersion() - if err != nil { - return true, err - } - result := !currentVersion.Equal(gomodversion) - return result, nil -} - -func UpdateGoModVersion() error { - currentVersion, err := GetCurrentVersion() - if err != nil { - return err - } - currentVersionString := currentVersion.String() - - requireLine := "-require=github.com/wailsapp/wails@v" + currentVersionString - - // Issue: go mod edit -require=github.com/wailsapp/wails@1.0.2-pre5 - helper := NewProgramHelper() - command := []string{"go", "mod", "edit", requireLine} - return helper.RunCommandArray(command) - -} diff --git a/vendor/github.com/wailsapp/wails/cmd/helpers.go b/vendor/github.com/wailsapp/wails/cmd/helpers.go deleted file mode 100644 index fdcad93..0000000 --- a/vendor/github.com/wailsapp/wails/cmd/helpers.go +++ /dev/null @@ -1,542 +0,0 @@ -package cmd - -import ( - "fmt" - "os" - "os/exec" - "os/user" - "path/filepath" - "runtime" - "strconv" - "strings" - "time" - - "github.com/leaanthony/slicer" - "github.com/leaanthony/spinner" - wailsruntime "github.com/wailsapp/wails/runtime" -) - -const xgoVersion = "1.16.3" - -var fs = NewFSHelper() - -// ValidateFrontendConfig checks if the frontend config is valid -func ValidateFrontendConfig(projectOptions *ProjectOptions) error { - if projectOptions.FrontEnd.Dir == "" { - return fmt.Errorf("Frontend directory not set in project.json") - } - if projectOptions.FrontEnd.Build == "" { - return fmt.Errorf("Frontend build command not set in project.json") - } - if projectOptions.FrontEnd.Install == "" { - return fmt.Errorf("Frontend install command not set in project.json") - } - if projectOptions.FrontEnd.Bridge == "" { - return fmt.Errorf("Frontend bridge config not set in project.json") - } - - return nil -} - -// InstallGoDependencies will run go get in the current directory -func InstallGoDependencies(verbose bool) error { - var depSpinner *spinner.Spinner - if !verbose { - depSpinner = spinner.New("Ensuring Dependencies are up to date...") - depSpinner.SetSpinSpeed(50) - depSpinner.Start() - } - err := NewProgramHelper(verbose).RunCommand("go mod tidy") - if err != nil { - if !verbose { - depSpinner.Error() - } - return err - } - if !verbose { - depSpinner.Success() - } - return nil -} - -func InitializeCrossCompilation(verbose bool) error { - // Check Docker - if err := CheckIfInstalled("docker"); err != nil { - return err - } - - var packSpinner *spinner.Spinner - msg := fmt.Sprintf("Pulling wailsapp/xgo:%s docker image... (may take a while)", xgoVersion) - if !verbose { - packSpinner = spinner.New(msg) - packSpinner.SetSpinSpeed(50) - packSpinner.Start() - } else { - println(msg) - } - - err := NewProgramHelper(verbose).RunCommandArray([]string{"docker", - "pull", fmt.Sprintf("wailsapp/xgo:%s", xgoVersion)}) - - if err != nil { - if packSpinner != nil { - packSpinner.Error() - } - return err - } - if packSpinner != nil { - packSpinner.Success() - } - - return nil -} - -// BuildDocker builds the project using the cross compiling wailsapp/xgo: container -func BuildDocker(binaryName string, buildMode string, projectOptions *ProjectOptions) error { - var packSpinner *spinner.Spinner - if buildMode == BuildModeBridge { - return fmt.Errorf("you cant serve the application in cross-compilation") - } - - // Check build directory - buildDirectory := filepath.Join(fs.Cwd(), "build") - if !fs.DirExists(buildDirectory) { - err := fs.MkDir(buildDirectory) - if err != nil { - return err - } - } - - buildCommand := slicer.String() - userid := 1000 - currentUser, _ := user.Current() - if i, err := strconv.Atoi(currentUser.Uid); err == nil { - userid = i - } - for _, arg := range []string{ - "docker", - "run", - "--rm", - "-v", fmt.Sprintf("%s:/build", filepath.Join(fs.Cwd(), "build")), - "-v", fmt.Sprintf("%s:/source", fs.Cwd()), - "-e", fmt.Sprintf("LOCAL_USER_ID=%v", userid), - "-e", fmt.Sprintf("FLAG_TAGS=%s", projectOptions.Tags), - "-e", fmt.Sprintf("FLAG_LDFLAGS=%s", ldFlags(projectOptions, buildMode)), - "-e", "FLAG_V=false", - "-e", "FLAG_X=false", - "-e", "FLAG_RACE=false", - "-e", "FLAG_BUILDMODE=default", - "-e", "FLAG_TRIMPATH=false", - "-e", fmt.Sprintf("TARGETS=%s/%s", projectOptions.Platform, projectOptions.Architecture), - "-e", "GOPROXY=", - "-e", "GO111MODULE=on", - } { - buildCommand.Add(arg) - } - - if projectOptions.GoPath != "" { - buildCommand.Add("-v") - buildCommand.Add(fmt.Sprintf("%s:/go", projectOptions.GoPath)) - } - - buildCommand.Add(fmt.Sprintf("wailsapp/xgo:%s", xgoVersion)) - buildCommand.Add(".") - - compileMessage := fmt.Sprintf( - "Packing + Compiling project for %s/%s using docker image wailsapp/xgo:%s", - projectOptions.Platform, projectOptions.Architecture, xgoVersion) - - if buildMode == BuildModeDebug { - compileMessage += " (Debug Mode)" - } - - if !projectOptions.Verbose { - packSpinner = spinner.New(compileMessage + "...") - packSpinner.SetSpinSpeed(50) - packSpinner.Start() - } else { - println(compileMessage) - } - - err := NewProgramHelper(projectOptions.Verbose).RunCommandArray(buildCommand.AsSlice()) - if err != nil { - if packSpinner != nil { - packSpinner.Error() - } - return err - } - if packSpinner != nil { - packSpinner.Success() - } - - return nil -} - -// BuildNative builds on the target platform itself. -func BuildNative(binaryName string, forceRebuild bool, buildMode string, projectOptions *ProjectOptions) error { - - if err := CheckWindres(); err != nil { - return err - } - - compileMessage := "Packing + Compiling project" - - if buildMode == BuildModeDebug { - compileMessage += " (Debug Mode)" - } - - var packSpinner *spinner.Spinner - if !projectOptions.Verbose { - packSpinner = spinner.New(compileMessage + "...") - packSpinner.SetSpinSpeed(50) - packSpinner.Start() - } else { - println(compileMessage) - } - - buildCommand := slicer.String() - buildCommand.Add("go") - - buildCommand.Add("build") - - if binaryName != "" { - // Alter binary name based on OS - switch projectOptions.Platform { - case "windows": - if !strings.HasSuffix(binaryName, ".exe") { - binaryName += ".exe" - } - default: - if strings.HasSuffix(binaryName, ".exe") { - binaryName = strings.TrimSuffix(binaryName, ".exe") - } - } - buildCommand.Add("-o", filepath.Join("build", binaryName)) - } - - // If we are forcing a rebuild - if forceRebuild { - buildCommand.Add("-a") - } - - buildCommand.AddSlice([]string{"-ldflags", ldFlags(projectOptions, buildMode)}) - - if projectOptions.Tags != "" { - buildCommand.AddSlice([]string{"--tags", projectOptions.Tags}) - } - - if projectOptions.Verbose { - fmt.Printf("Command: %v\n", buildCommand.AsSlice()) - } - - err := NewProgramHelper(projectOptions.Verbose).RunCommandArray(buildCommand.AsSlice()) - if err != nil { - if packSpinner != nil { - packSpinner.Error() - } - return err - } - if packSpinner != nil { - packSpinner.Success() - } - - return nil -} - -// BuildApplication will attempt to build the project based on the given inputs -func BuildApplication(binaryName string, forceRebuild bool, buildMode string, packageApp bool, projectOptions *ProjectOptions) error { - var err error - - if projectOptions.CrossCompile { - if err := InitializeCrossCompilation(projectOptions.Verbose); err != nil { - return err - } - } - - helper := NewPackageHelper(projectOptions.Platform) - - // Generate windows resources - if projectOptions.Platform == "windows" { - if err := helper.PackageWindows(projectOptions, false); err != nil { - return err - } - } - - if projectOptions.CrossCompile { - err = BuildDocker(binaryName, buildMode, projectOptions) - } else { - err = BuildNative(binaryName, forceRebuild, buildMode, projectOptions) - } - if err != nil { - return err - } - - if packageApp { - err = PackageApplication(projectOptions) - if err != nil { - return err - } - } - - return nil -} - -// PackageApplication will attempt to package the application in a platform dependent way -func PackageApplication(projectOptions *ProjectOptions) error { - var packageSpinner *spinner.Spinner - if projectOptions.Verbose { - packageSpinner = spinner.New("Packaging application...") - packageSpinner.SetSpinSpeed(50) - packageSpinner.Start() - } - - err := NewPackageHelper(projectOptions.Platform).Package(projectOptions) - if err != nil { - if packageSpinner != nil { - packageSpinner.Error() - } - return err - } - if packageSpinner != nil { - packageSpinner.Success() - } - return nil -} - -// BuildFrontend runs the given build command -func BuildFrontend(projectOptions *ProjectOptions) error { - var buildFESpinner *spinner.Spinner - if !projectOptions.Verbose { - buildFESpinner = spinner.New("Building frontend...") - buildFESpinner.SetSpinSpeed(50) - buildFESpinner.Start() - } else { - println("Building frontend...") - } - err := NewProgramHelper(projectOptions.Verbose).RunCommand(projectOptions.FrontEnd.Build) - if err != nil { - if buildFESpinner != nil { - buildFESpinner.Error() - } - return err - } - if buildFESpinner != nil { - buildFESpinner.Success() - } - return nil -} - -// CheckWindres checks if Windres is installed and if not, aborts -func CheckWindres() (err error) { - if runtime.GOOS != "windows" { // FIXME: Handle windows cross-compile for windows! - return nil - } - programHelper := NewProgramHelper() - if !programHelper.IsInstalled("windres") { - return fmt.Errorf("windres not installed. It comes by default with mingw. Ensure you have installed mingw correctly") - } - return nil -} - -// CheckIfInstalled returns if application is installed -func CheckIfInstalled(application string) (err error) { - programHelper := NewProgramHelper() - if !programHelper.IsInstalled(application) { - return fmt.Errorf("%s not installed. Ensure you have installed %s correctly", application, application) - } - return nil -} - -// InstallFrontendDeps attempts to install the frontend dependencies based on the given options -func InstallFrontendDeps(projectDir string, projectOptions *ProjectOptions, forceRebuild bool, caller string) error { - - // Install frontend deps - err := os.Chdir(projectOptions.FrontEnd.Dir) - if err != nil { - return err - } - - // Check if frontend deps have been updated - var feSpinner *spinner.Spinner - if !projectOptions.Verbose { - feSpinner = spinner.New("Ensuring frontend dependencies are up to date (This may take a while)") - feSpinner.SetSpinSpeed(50) - feSpinner.Start() - } else { - println("Ensuring frontend dependencies are up to date (This may take a while)") - } - - requiresNPMInstall := true - - // Read in package.json MD5 - fs := NewFSHelper() - packageJSONMD5, err := fs.FileMD5("package.json") - if err != nil { - return err - } - - const md5sumFile = "package.json.md5" - - // If node_modules does not exist, force a rebuild. - nodeModulesPath, err := filepath.Abs(filepath.Join(".", "node_modules")) - if err != nil { - return err - } - if !fs.DirExists(nodeModulesPath) { - forceRebuild = true - } - - // If we aren't forcing the install and the md5sum file exists - if !forceRebuild && fs.FileExists(md5sumFile) { - // Yes - read contents - savedMD5sum, err := fs.LoadAsString(md5sumFile) - // File exists - if err == nil { - // Compare md5 - if savedMD5sum == packageJSONMD5 { - // Same - no need for reinstall - requiresNPMInstall = false - if feSpinner != nil { - feSpinner.Success("Skipped frontend dependencies (-f to force rebuild)") - } else { - println("Skipped frontend dependencies (-f to force rebuild)") - } - } - } - } - - // Md5 sum package.json - // Different? Build - if requiresNPMInstall || forceRebuild { - // Install dependencies - err = NewProgramHelper(projectOptions.Verbose).RunCommand(projectOptions.FrontEnd.Install) - if err != nil { - if feSpinner != nil { - feSpinner.Error() - } - return err - } - if feSpinner != nil { - feSpinner.Success() - } - - // Update md5sum file - err := os.WriteFile(md5sumFile, []byte(packageJSONMD5), 0644) - if err != nil { - return err - } - } - - // Install the runtime - if caller == "build" { - err = InstallProdRuntime(projectDir, projectOptions) - } else { - err = InstallBridge(projectDir, projectOptions) - } - if err != nil { - return err - } - - // Build frontend - err = BuildFrontend(projectOptions) - if err != nil { - return err - } - return nil -} - -// InstallBridge installs the relevant bridge javascript library -func InstallBridge(projectDir string, projectOptions *ProjectOptions) error { - bridgeFileTarget := filepath.Join(projectDir, projectOptions.FrontEnd.Dir, "node_modules", "@wailsapp", "runtime", "init.js") - err := fs.CreateFile(bridgeFileTarget, wailsruntime.BridgeJS) - return err -} - -// InstallProdRuntime installs the production runtime -func InstallProdRuntime(projectDir string, projectOptions *ProjectOptions) error { - bridgeFileTarget := filepath.Join(projectDir, projectOptions.FrontEnd.Dir, "node_modules", "@wailsapp", "runtime", "init.js") - err := fs.CreateFile(bridgeFileTarget, wailsruntime.InitJS) - return err -} - -// ServeProject attempts to serve up the current project so that it may be connected to -// via the Wails bridge -func ServeProject(projectOptions *ProjectOptions, logger *Logger) error { - go func() { - time.Sleep(2 * time.Second) - if projectOptions.Platform == "windows" { - logger.Yellow("*** Please note: Windows builds use mshtml which is only compatible with IE11. We strongly recommend only using IE11 when running 'wails serve'! For more information, please read https://wails.app/guides/windows/ ***") - } - logger.Green(">>>>> To connect, you will need to run '" + projectOptions.FrontEnd.Serve + "' in the '" + projectOptions.FrontEnd.Dir + "' directory <<<<<") - }() - location, err := filepath.Abs(filepath.Join("build", projectOptions.BinaryName)) - if err != nil { - return err - } - - logger.Yellow("Serving Application: " + location) - var args []string - if len(os.Args) > 2 { - foundArgSep := false - for index, arg := range os.Args[2:] { - if arg == "--" { - foundArgSep = true - continue - } - if foundArgSep { - args = os.Args[index:] - break - } - } - logger.Yellow("Passing arguments: %+v", args) - } - cmd := exec.Command(location, args...) - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr - err = cmd.Run() - if err != nil { - return err - } - - return nil -} - -func ldFlags(po *ProjectOptions, buildMode string) string { - // Setup ld flags - ldflags := "-w -s " - if buildMode == BuildModeDebug { - ldflags = "" - } - - // Add windows flags - if po.Platform == "windows" && buildMode == BuildModeProd { - ldflags += "-H windowsgui " - } - - if po.UseFirebug { - ldflags += "-X github.com/wailsapp/wails/lib/renderer.UseFirebug=true " - } - - ldflags += "-X github.com/wailsapp/wails.BuildMode=" + buildMode - - // Add additional ldflags passed in via the `ldflags` cli flag - if len(po.LdFlags) > 0 { - ldflags += " " + po.LdFlags - } - - // If we wish to generate typescript - if po.typescriptDefsFilename != "" { - cwd, err := os.Getwd() - if err == nil { - filename := filepath.Join(cwd, po.FrontEnd.Dir, po.typescriptDefsFilename) - ldflags += " -X github.com/wailsapp/wails/lib/binding.typescriptDefinitionFilename=" + filename - } - } - return ldflags -} - -func getGitConfigValue(key string) (string, error) { - output, err := exec.Command("git", "config", "--get", "--null", key).Output() - // When using --null git appends a null character (\u0000) to the command output - return strings.TrimRight(string(output), "\u0000"), err -} diff --git a/vendor/github.com/wailsapp/wails/cmd/linux.go b/vendor/github.com/wailsapp/wails/cmd/linux.go deleted file mode 100644 index 81dcd6f..0000000 --- a/vendor/github.com/wailsapp/wails/cmd/linux.go +++ /dev/null @@ -1,320 +0,0 @@ -package cmd - -import ( - "fmt" - "io/ioutil" - "net/url" - "os" - "runtime" - "strings" - - "github.com/pkg/browser" -) - -// LinuxDistribution is of type int -type LinuxDistribution int - -const ( - // Unknown is the catch-all distro - Unknown LinuxDistribution = iota - // Debian distribution - Debian - // Ubuntu distribution - Ubuntu - // Arch linux distribution - Arch - // CentOS linux distribution - CentOS - // Fedora linux distribution - Fedora - // Gentoo distribution - Gentoo - // Zorin distribution - Zorin - // Parrot distribution - Parrot - // Linuxmint distribution - Linuxmint - // VoidLinux distribution - VoidLinux - // Elementary distribution - Elementary - // Kali distribution - Kali - // Neon distribution - Neon - // ArcoLinux distribution - ArcoLinux - // Manjaro distribution - Manjaro - // ManjaroARM distribution - ManjaroARM - // Deepin distribution - Deepin - // Raspbian distribution - Raspbian - // Tumbleweed (OpenSUSE) distribution - Tumbleweed - // Leap (OpenSUSE) distribution - Leap - // ArchLabs distribution - ArchLabs - // PopOS distribution - PopOS - // Solus distribution - Solus - // Ctlos Linux distribution - Ctlos - // EndeavourOS linux distribution - EndeavourOS - // Crux linux distribution - Crux - // RHEL distribution - RHEL -) - -// DistroInfo contains all the information relating to a linux distribution -type DistroInfo struct { - Distribution LinuxDistribution - Name string - ID string - Description string - Release string -} - -// GetLinuxDistroInfo returns information about the running linux distribution -func GetLinuxDistroInfo() *DistroInfo { - result := &DistroInfo{ - Distribution: Unknown, - ID: "unknown", - Name: "Unknown", - } - _, err := os.Stat("/etc/os-release") - if !os.IsNotExist(err) { - osRelease, _ := ioutil.ReadFile("/etc/os-release") - result = parseOsRelease(string(osRelease)) - } - return result -} - -// parseOsRelease parses the given os-release data and returns -// a DistroInfo struct with the details -func parseOsRelease(osRelease string) *DistroInfo { - result := &DistroInfo{Distribution: Unknown} - - // Default value - osID := "unknown" - osNAME := "Unknown" - version := "" - - // Split into lines - lines := strings.Split(osRelease, "\n") - // Iterate lines - for _, line := range lines { - // Split each line by the equals char - splitLine := strings.SplitN(line, "=", 2) - // Check we have - if len(splitLine) != 2 { - continue - } - switch splitLine[0] { - case "ID": - osID = strings.ToLower(strings.Trim(splitLine[1], "\"")) - case "NAME": - osNAME = strings.Trim(splitLine[1], "\"") - case "VERSION_ID": - version = strings.Trim(splitLine[1], "\"") - } - } - - // Check distro name against list of distros - switch osID { - case "fedora": - result.Distribution = Fedora - case "centos": - result.Distribution = CentOS - case "rhel": - result.Distribution = RHEL - case "arch": - result.Distribution = Arch - case "archlabs": - result.Distribution = ArchLabs - case "ctlos": - result.Distribution = Ctlos - case "debian": - result.Distribution = Debian - case "ubuntu": - result.Distribution = Ubuntu - case "gentoo": - result.Distribution = Gentoo - case "zorin": - result.Distribution = Zorin - case "parrot": - result.Distribution = Parrot - case "linuxmint": - result.Distribution = Linuxmint - case "void": - result.Distribution = VoidLinux - case "elementary": - result.Distribution = Elementary - case "kali": - result.Distribution = Kali - case "neon": - result.Distribution = Neon - case "arcolinux": - result.Distribution = ArcoLinux - case "manjaro": - result.Distribution = Manjaro - case "manjaro-arm": - result.Distribution = ManjaroARM - case "deepin": - result.Distribution = Deepin - case "raspbian": - result.Distribution = Raspbian - case "opensuse-tumbleweed": - result.Distribution = Tumbleweed - case "opensuse-leap": - result.Distribution = Leap - case "pop": - result.Distribution = PopOS - case "solus": - result.Distribution = Solus - case "endeavouros": - result.Distribution = EndeavourOS - case "crux": - result.Distribution = Crux - default: - result.Distribution = Unknown - } - - result.Name = osNAME - result.ID = osID - result.Release = version - - return result -} - -// CheckPkgInstalled is all functions that use local programs to see if a package is installed -type CheckPkgInstalled func(string) (bool, error) - -// EqueryInstalled uses equery to see if a package is installed -func EqueryInstalled(packageName string) (bool, error) { - program := NewProgramHelper() - equery := program.FindProgram("equery") - if equery == nil { - return false, fmt.Errorf("cannont check dependencies: equery not found") - } - _, _, exitCode, _ := equery.Run("l", packageName) - return exitCode == 0, nil -} - -// DpkgInstalled uses dpkg to see if a package is installed -func DpkgInstalled(packageName string) (bool, error) { - program := NewProgramHelper() - dpkg := program.FindProgram("dpkg") - if dpkg == nil { - return false, fmt.Errorf("cannot check dependencies: dpkg not found") - } - _, _, exitCode, _ := dpkg.Run("-L", packageName) - return exitCode == 0, nil -} - -// EOpkgInstalled uses dpkg to see if a package is installed -func EOpkgInstalled(packageName string) (bool, error) { - program := NewProgramHelper() - eopkg := program.FindProgram("eopkg") - if eopkg == nil { - return false, fmt.Errorf("cannot check dependencies: eopkg not found") - } - stdout, _, _, _ := eopkg.Run("info", packageName) - return strings.HasPrefix(stdout, "Installed"), nil -} - -// PacmanInstalled uses pacman to see if a package is installed. -func PacmanInstalled(packageName string) (bool, error) { - program := NewProgramHelper() - pacman := program.FindProgram("pacman") - if pacman == nil { - return false, fmt.Errorf("cannot check dependencies: pacman not found") - } - _, _, exitCode, _ := pacman.Run("-Qs", packageName) - return exitCode == 0, nil -} - -// XbpsInstalled uses pacman to see if a package is installed. -func XbpsInstalled(packageName string) (bool, error) { - program := NewProgramHelper() - xbpsQuery := program.FindProgram("xbps-query") - if xbpsQuery == nil { - return false, fmt.Errorf("cannot check dependencies: xbps-query not found") - } - _, _, exitCode, _ := xbpsQuery.Run("-S", packageName) - return exitCode == 0, nil -} - -// RpmInstalled uses rpm to see if a package is installed -func RpmInstalled(packageName string) (bool, error) { - program := NewProgramHelper() - rpm := program.FindProgram("rpm") - if rpm == nil { - return false, fmt.Errorf("cannot check dependencies: rpm not found") - } - _, _, exitCode, _ := rpm.Run("--query", packageName) - return exitCode == 0, nil -} - -// PrtGetInstalled uses prt-get to see if a package is installed -func PrtGetInstalled(packageName string) (bool, error) { - program := NewProgramHelper() - prtget := program.FindProgram("prt-get") - if prtget == nil { - return false, fmt.Errorf("cannot check dependencies: prt-get not found") - } - _, _, exitCode, _ := prtget.Run("isinst", packageName) - return exitCode == 0, nil -} - -// RequestSupportForDistribution promts the user to submit a request to support their -// currently unsupported distribution -func RequestSupportForDistribution(distroInfo *DistroInfo) error { - var logger = NewLogger() - defaultError := fmt.Errorf("unable to check libraries on distribution '%s'", distroInfo.Name) - - logger.Yellow("Distribution '%s' is not currently supported, but we would love to!", distroInfo.Name) - q := fmt.Sprintf("Would you like to submit a request to support distribution '%s'?", distroInfo.Name) - result := Prompt(q, "yes") - if strings.ToLower(result) != "yes" { - return defaultError - } - - title := fmt.Sprintf("Support Distribution '%s'", distroInfo.Name) - - var str strings.Builder - - gomodule, exists := os.LookupEnv("GO111MODULE") - if !exists { - gomodule = "(Not Set)" - } - - str.WriteString("\n| Name | Value |\n| ----- | ----- |\n") - str.WriteString(fmt.Sprintf("| Wails Version | %s |\n", Version)) - str.WriteString(fmt.Sprintf("| Go Version | %s |\n", runtime.Version())) - str.WriteString(fmt.Sprintf("| Platform | %s |\n", runtime.GOOS)) - str.WriteString(fmt.Sprintf("| Arch | %s |\n", runtime.GOARCH)) - str.WriteString(fmt.Sprintf("| GO111MODULE | %s |\n", gomodule)) - str.WriteString(fmt.Sprintf("| Distribution ID | %s |\n", distroInfo.ID)) - str.WriteString(fmt.Sprintf("| Distribution Name | %s |\n", distroInfo.Name)) - str.WriteString(fmt.Sprintf("| Distribution Version | %s |\n", distroInfo.Release)) - - body := fmt.Sprintf("**Description**\nDistribution '%s' is currently unsupported.\n\n**Further Information**\n\n%s\n\n*Please add any extra information here, EG: libraries that are needed to make the distribution work, or commands to install them*", distroInfo.ID, str.String()) - fullURL := "https://github.com/wailsapp/wails/issues/new?" - params := "title=" + title + "&body=" + body - - fmt.Println("Opening browser to file request.") - browser.OpenURL(fullURL + url.PathEscape(params)) - result = Prompt("We have a guide for adding support for your distribution. Would you like to view it?", "yes") - if strings.ToLower(result) == "yes" { - browser.OpenURL("https://wails.app/guides/distro/") - } - return nil -} diff --git a/vendor/github.com/wailsapp/wails/cmd/linuxdb.go b/vendor/github.com/wailsapp/wails/cmd/linuxdb.go deleted file mode 100644 index fbea6b6..0000000 --- a/vendor/github.com/wailsapp/wails/cmd/linuxdb.go +++ /dev/null @@ -1,93 +0,0 @@ -package cmd - -import ( - "log" - - "gopkg.in/yaml.v3" -) - -// LinuxDB is the database for linux distribution data. -type LinuxDB struct { - Distributions map[string]*Distribution `yaml:"distributions"` -} - -// Distribution holds the os-release ID and a map of releases. -type Distribution struct { - ID string `yaml:"id"` - Releases map[string]*Release `yaml:"releases"` -} - -// GetRelease attempts to return the specific Release information -// for the given release name. If there is no specific match, the -// default release data is returned. -func (d *Distribution) GetRelease(version string) *Release { - result := d.Releases[version] - if result == nil { - result = d.Releases["default"] - } - return result -} - -// Release holds the name and version of the release as given by -// os-release. Programs is a slice of dependant programs required -// to be present on the local installation for Wails to function. -// Libraries is a slice of libraries that must be present for Wails -// applications to compile. -type Release struct { - Name string `yaml:"name"` - Version string `yaml:"version"` - GccVersionCommand string `yaml:"gccversioncommand"` - Programs []*Prerequisite `yaml:"programs"` - Libraries []*Prerequisite `yaml:"libraries"` -} - -// Prerequisite is a simple struct containing a program/library name -// plus the distribution specific help text indicating how to install -// it. -type Prerequisite struct { - Name string `yaml:"name"` - Help string `yaml:"help,omitempty"` -} - -// Load will load the given filename from disk and attempt to -// import the data into the LinuxDB. -func (l *LinuxDB) Load(filename string) error { - if fs.FileExists(filename) { - data, err := fs.LoadAsBytes(filename) - if err != nil { - return err - } - return l.ImportData(data) - } - return nil -} - -// ImportData will unmarshal the given YAML formatted data -// into the LinuxDB -func (l *LinuxDB) ImportData(data []byte) error { - return yaml.Unmarshal(data, l) -} - -// GetDistro returns the Distribution information for the -// given distribution name. If the distribution is not supported, -// nil is returned. -func (l *LinuxDB) GetDistro(distro string) *Distribution { - return l.Distributions[distro] -} - -// NewLinuxDB creates a new LinuxDB instance from the bundled -// linuxdb.yaml file. -func NewLinuxDB() *LinuxDB { - data, err := fs.LoadRelativeFile("./linuxdb.yaml") - if err != nil { - log.Fatal("Could not load linuxdb.yaml") - } - result := LinuxDB{ - Distributions: make(map[string]*Distribution), - } - err = result.ImportData(data) - if err != nil { - log.Fatal(err) - } - return &result -} diff --git a/vendor/github.com/wailsapp/wails/cmd/linuxdb.yaml b/vendor/github.com/wailsapp/wails/cmd/linuxdb.yaml deleted file mode 100644 index 04db56c..0000000 --- a/vendor/github.com/wailsapp/wails/cmd/linuxdb.yaml +++ /dev/null @@ -1,347 +0,0 @@ ---- -distributions: - debian: - id: debian - releases: - default: - name: Debian - version: default - gccversioncommand: &gccdumpversion -dumpversion - programs: &debiandefaultprograms - - name: gcc - help: Please install with `sudo apt-get install build-essential` and try again - - name: pkg-config - help: Please install with `sudo apt-get install pkg-config` and try again - - name: npm - help: Please install with `curl -sL https://deb.nodesource.com/setup_12.x | sudo bash - && sudo apt-get install -y nodejs` and try again - libraries: &debiandefaultlibraries - - name: libgtk-3-dev - help: Please install with `sudo apt-get install libgtk-3-dev` and try again - - name: libwebkit2gtk-4.0-dev - help: Please install with `sudo apt-get install libwebkit2gtk-4.0-dev` and try again - ubuntu: - id: ubuntu - releases: - default: - version: default - name: Ubuntu - gccversioncommand: &gccdumpfullversion -dumpfullversion - programs: *debiandefaultprograms - libraries: *debiandefaultlibraries - pop: - id: pop - releases: - default: - version: default - name: Pop!_OS - gccversioncommand: &gccdumpfullversion -dumpfullversion - programs: *debiandefaultprograms - libraries: *debiandefaultlibraries - kali: - id: kali - releases: - default: - version: default - name: Kali GNU/Linux - gccversioncommand: *gccdumpfullversion - programs: *debiandefaultprograms - libraries: *debiandefaultlibraries - parrot: - id: parrot - releases: - default: - version: default - name: Parrot GNU/Linux - gccversioncommand: *gccdumpversion - programs: *debiandefaultprograms - libraries: *debiandefaultlibraries - zorin: - id: zorin - releases: - default: - version: default - name: Zorin - gccversioncommand: *gccdumpversion - programs: *debiandefaultprograms - libraries: *debiandefaultlibraries - linuxmint: - id: linuxmint - releases: - default: - version: default - name: Linux Mint - gccversioncommand: *gccdumpversion - programs: *debiandefaultprograms - libraries: *debiandefaultlibraries - elementary: - id: elementary - releases: - default: - version: default - name: elementary OS - gccversioncommand: *gccdumpfullversion - programs: *debiandefaultprograms - libraries: *debiandefaultlibraries - neon: - id: neon - releases: - default: - version: default - name: KDE neon - gccversioncommand: *gccdumpfullversion - programs: *debiandefaultprograms - libraries: *debiandefaultlibraries - deepin: - id: deepin - releases: - default: - version: default - name: Deepin - gccversioncommand: *gccdumpfullversion - programs: *debiandefaultprograms - libraries: *debiandefaultlibraries - void: - id: void - releases: - default: - version: default - name: VoidLinux - gccversioncommand: *gccdumpversion - programs: - - name: gcc - help: Please install with `xbps-install base-devel` and try again - - name: pkg-config - help: Please install with `xbps-install pkg-config` and try again - - name: npm - help: Please install with `xbps-install nodejs` and try again - libraries: - - name: gtk+3-devel - help: Please install with `xbps-install gtk+3-devel` and try again - - name: webkit2gtk-devel - help: Please install with `xbps-install webkit2gtk-devel` and try again - centos: - id: centos - releases: - default: - version: default - name: CentOS Linux - gccversioncommand: *gccdumpversion - programs: - - name: gcc - help: Please install with `sudo yum install gcc-c++ make` and try again - - name: pkg-config - help: Please install with `sudo yum install pkgconf-pkg-config` and try again - - name: npm - help: Please install with `sudo yum install epel-release && sudo yum install nodejs` and try again - libraries: - - name: gtk3-devel - help: Please install with `sudo yum install gtk3-devel` and try again - - name: webkitgtk3-devel - help: Please install with `sudo yum install webkitgtk3-devel` and try again - rhel: - id: rhel - releases: - default: - version: default - name: Red Hat Enterprise Linux - gccversioncommand: *gccdumpversion - programs: - - name: gcc - help: Please install with `sudo yum install gcc-c++ make` and try again - - name: pkg-config - help: Please install with `sudo yum install pkgconf-pkg-config` and try again - - name: npm - help: Please install with `sudo yum install epel-release && sudo yum install nodejs` and try again - libraries: - - name: gtk3-devel - help: Please install with `sudo yum install gtk3-devel` and try again - - name: webkitgtk3-devel - help: Please install with `sudo yum install webkitgtk3-devel` and try again - fedora: - id: fedora - releases: - default: - version: default - name: Fedora - gccversioncommand: *gccdumpfullversion - programs: - - name: gcc - help: Please install with `sudo yum install gcc-c++ make` and try again - - name: pkg-config - help: Please install with `sudo yum install pkgconf-pkg-config` and try again - - name: npm - help: Please install `sudo yum install nodejs` and try again - libraries: - - name: gtk3-devel - help: Please install with `sudo yum install gtk3-devel` and try again - - name: webkit2gtk3-devel - help: Please install with `sudo yum install webkit2gtk3-devel` and try again - arch: - id: arch - releases: - default: - version: default - name: Arch Linux - gccversioncommand: *gccdumpversion - programs: &archdefaultprograms - - name: gcc - help: Please install with `sudo pacman -S gcc` and try again - - name: pkgconf - help: Please install with `sudo pacman -S pkgconf` and try again - - name: npm - help: Please install with `sudo pacman -S npm` and try again - libraries: &archdefaultlibraries - - name: gtk3 - help: Please install with `sudo pacman -S gtk3` and try again - - name: webkit2gtk - help: Please install with `sudo pacman -S webkit2gtk` and try again - arcolinux: - id: arcolinux - releases: - default: - version: default - name: ArcoLinux - gccversioncommand: *gccdumpversion - programs: *archdefaultprograms - libraries: *archdefaultlibraries - archlabs: - id: archlabs - releases: - default: - version: default - name: ArchLabs - gccversioncommand: *gccdumpversion - programs: *archdefaultprograms - libraries: *archdefaultlibraries - ctlos: - id: ctlos - releases: - default: - version: default - name: Ctlos Linux - gccversioncommand: *gccdumpversion - programs: *archdefaultprograms - libraries: *archdefaultlibraries - endeavouros: - id: endeavouros - releases: - default: - version: default - name: EndeavourOS - gccversioncommand: *gccdumpversion - programs: *archdefaultprograms - libraries: *archdefaultlibraries - manjaro: - id: manjaro - releases: - default: - version: default - name: Manjaro Linux - gccversioncommand: *gccdumpversion - programs: *archdefaultprograms - libraries: *archdefaultlibraries - manjaro-arm: - id: manjaro-arm - releases: - default: - version: default - name: Manjaro-ARM - gccversioncommand: *gccdumpversion - programs: *archdefaultprograms - libraries: *archdefaultlibraries - gentoo: - id: gentoo - releases: - default: - version: default - name: Gentoo - gccversioncommand: *gccdumpversion - programs: - - name: gcc - help: Please install using your system's package manager - - name: pkg-config - help: Please install using your system's package manager - - name: npm - help: Please install using your system's package manager - libraries: - - name: gtk+:3 - help: Please install with `sudo emerge gtk+:3` and try again - - name: webkit-gtk - help: Please install with `sudo emerge webkit-gtk` and try again - - raspbian: - id: raspbian - releases: - default: - version: default - name: Raspbian - gccversioncommand: *gccdumpfullversion - programs: *debiandefaultprograms - libraries: *debiandefaultlibraries - solus: - id: solus - releases: - default: - version: default - name: Solus - gccversioncommand: *gccdumpfullversion - programs: &solusdefaultprograms - - name: gcc - help: Please install with `sudo eopkg it -c system.devel` and try again - - name: pkg-config - help: Please install with `sudo eopkg it -c system.devel` and try again - - name: npm - help: Please install with `sudo eopkg it nodejs` and try again - libraries: &solusdefaultlibraries - - name: libgtk-3-devel - help: Please install with `sudo eopkg it libgtk-3-devel` and try again - - name: libwebkit-gtk-devel - help: Please install with `sudo eopkg it libwebkit-gtk-devel` and try again - - opensuse-tumbleweed: - id: opensuse-tumbleweed - releases: - default: - version: default - name: openSUSE Tumbleweed - gccversioncommand: *gccdumpfullversion - programs: &opensusedefaultprograms - - name: gcc - help: Please install with `sudo zypper in gcc-c++` and try again - - name: pkg-config - help: Please install with `sudo zypper in pkgconf-pkg-config` and try again - - name: npm - help: Please install `sudo zypper in nodejs` and try again - libraries: &opensusedefaultlibraries - - name: gtk3-devel - help: Please install with `sudo zypper in gtk3-devel` and try again - - name: webkit2gtk3-devel - help: Please install with `sudo zypper in webkit2gtk3-devel` and try again - opensuse-leap: - id: opensuse-leap - releases: - default: - version: default - name: openSUSE Leap - gccversioncommand: *gccdumpfullversion - programs: *opensusedefaultprograms - libraries: *opensusedefaultlibraries - crux: - id: crux - releases: - default: - version: default - name: Crux Linux - gccversioncommand: *gccdumpversion - programs: - - name: gcc - help: Please install with `sudo prt-get depinst gcc-c++ make` and try again - - name: pkg-config - help: Please install with `sudo prt-get depinst pkg-config` and try again - - name: npm - help: Please install with `sudo prt-get depinst nodejs` and try again - libraries: - - name: gtk3 - help: Please install with `sudo prt-get depinst gtk3` and try again - - name: webkitgtk - help: Please install with `sudo prt-get depinst webkitgtk` and try again diff --git a/vendor/github.com/wailsapp/wails/cmd/log.go b/vendor/github.com/wailsapp/wails/cmd/log.go deleted file mode 100644 index 4163839..0000000 --- a/vendor/github.com/wailsapp/wails/cmd/log.go +++ /dev/null @@ -1,130 +0,0 @@ -package cmd - -import ( - "fmt" - "strings" - - "github.com/fatih/color" -) - -// Logger struct -type Logger struct { - errorOnly bool -} - -// NewLogger creates a new logger! -func NewLogger() *Logger { - return &Logger{errorOnly: false} -} - -// SetErrorOnly ensures that only errors are logged out -func (l *Logger) SetErrorOnly(errorOnly bool) { - l.errorOnly = errorOnly -} - -// Yellow - Outputs yellow text -func (l *Logger) Yellow(format string, a ...interface{}) { - if l.errorOnly { - return - } - color.New(color.FgHiYellow).PrintfFunc()(format+"\n", a...) -} - -// Yellowf - Outputs yellow text without the newline -func (l *Logger) Yellowf(format string, a ...interface{}) { - if l.errorOnly { - return - } - - color.New(color.FgHiYellow).PrintfFunc()(format, a...) -} - -// Green - Outputs Green text -func (l *Logger) Green(format string, a ...interface{}) { - if l.errorOnly { - return - } - - color.New(color.FgHiGreen).PrintfFunc()(format+"\n", a...) -} - -// White - Outputs White text -func (l *Logger) White(format string, a ...interface{}) { - if l.errorOnly { - return - } - - color.New(color.FgHiWhite).PrintfFunc()(format+"\n", a...) -} - -// WhiteUnderline - Outputs White text with underline -func (l *Logger) WhiteUnderline(format string, a ...interface{}) { - if l.errorOnly { - return - } - - l.White(format, a...) - l.White(l.underline(format)) -} - -// YellowUnderline - Outputs Yellow text with underline -func (l *Logger) YellowUnderline(format string, a ...interface{}) { - if l.errorOnly { - return - } - - l.Yellow(format, a...) - l.Yellow(l.underline(format)) -} - -// underline returns a string of a line, the length of the message given to it -func (l *Logger) underline(message string) string { - if l.errorOnly { - return "" - } - - return strings.Repeat("-", len(message)) -} - -// Red - Outputs Red text -func (l *Logger) Red(format string, a ...interface{}) { - if l.errorOnly { - return - } - - color.New(color.FgHiRed).PrintfFunc()(format+"\n", a...) -} - -// Error - Outputs an Error message -func (l *Logger) Error(format string, a ...interface{}) { - color.New(color.FgHiRed).PrintfFunc()("Error: "+format+"\n", a...) -} - -// PrintSmallBanner prints a condensed banner -func (l *Logger) PrintSmallBanner(message ...string) { - yellow := color.New(color.FgYellow).SprintFunc() - red := color.New(color.FgRed).SprintFunc() - msg := "" - if len(message) > 0 { - msg = " - " + message[0] - } - fmt.Printf("%s %s%s\n", yellow("Wails"), red(Version), msg) -} - -// PrintBanner prints the Wails banner before running commands -func (l *Logger) PrintBanner() error { - banner1 := ` _ __ _ __ -| | / /___ _(_) /____ -| | /| / / __ ` + "`" + `/ / / ___/ -| |/ |/ / /_/ / / (__ ) ` - banner2 := `|__/|__/\__,_/_/_/____/ ` - - l.Yellowf(banner1) - l.Red(Version) - l.Yellowf(banner2) - l.Green("https://wails.app") - l.White("The lightweight framework for web-like apps") - fmt.Println() - - return nil -} diff --git a/vendor/github.com/wailsapp/wails/cmd/package.go b/vendor/github.com/wailsapp/wails/cmd/package.go deleted file mode 100644 index 8b21346..0000000 --- a/vendor/github.com/wailsapp/wails/cmd/package.go +++ /dev/null @@ -1,426 +0,0 @@ -package cmd - -import ( - "bufio" - "bytes" - "encoding/binary" - "fmt" - "image" - "image/png" - "io/ioutil" - "os" - "path" - "path/filepath" - "runtime" - "strings" - "text/template" - "time" - - "github.com/jackmordaunt/icns" - "golang.org/x/image/draw" -) - -// PackageHelper helps with the 'wails package' command -type PackageHelper struct { - platform string - fs *FSHelper - log *Logger - system *SystemHelper -} - -// NewPackageHelper creates a new PackageHelper! -func NewPackageHelper(platform string) *PackageHelper { - return &PackageHelper{ - platform: platform, - fs: NewFSHelper(), - log: NewLogger(), - system: NewSystemHelper(), - } -} - -type plistData struct { - Title string - Exe string - PackageID string - Version string - Author string - Date string -} - -func newPlistData(title, exe, packageID, version, author string) *plistData { - now := time.Now().Format(time.RFC822) - return &plistData{ - Title: title, - Exe: exe, - Version: version, - PackageID: packageID, - Author: author, - Date: now, - } -} - -type windowsIcoHeader struct { - _ uint16 - imageType uint16 - imageCount uint16 -} - -type windowsIcoDescriptor struct { - width uint8 - height uint8 - colours uint8 - _ uint8 - planes uint16 - bpp uint16 - size uint32 - offset uint32 -} - -type windowsIcoContainer struct { - Header windowsIcoDescriptor - Data []byte -} - -func generateWindowsIcon(pngFilename string, iconfile string) error { - sizes := []int{256, 128, 64, 48, 32, 16} - - pngfile, err := os.Open(pngFilename) - if err != nil { - return err - } - defer pngfile.Close() - - pngdata, err := png.Decode(pngfile) - if err != nil { - return err - } - - icons := []windowsIcoContainer{} - - for _, size := range sizes { - rect := image.Rect(0, 0, int(size), int(size)) - rawdata := image.NewRGBA(rect) - scale := draw.CatmullRom - scale.Scale(rawdata, rect, pngdata, pngdata.Bounds(), draw.Over, nil) - - icondata := new(bytes.Buffer) - writer := bufio.NewWriter(icondata) - err = png.Encode(writer, rawdata) - if err != nil { - return err - } - writer.Flush() - - imgSize := size - if imgSize >= 256 { - imgSize = 0 - } - - data := icondata.Bytes() - - icn := windowsIcoContainer{ - Header: windowsIcoDescriptor{ - width: uint8(imgSize), - height: uint8(imgSize), - planes: 1, - bpp: 32, - size: uint32(len(data)), - }, - Data: data, - } - icons = append(icons, icn) - } - - outfile, err := os.Create(iconfile) - if err != nil { - return err - } - defer outfile.Close() - - ico := windowsIcoHeader{ - imageType: 1, - imageCount: uint16(len(sizes)), - } - err = binary.Write(outfile, binary.LittleEndian, ico) - if err != nil { - return err - } - - offset := uint32(6 + 16*len(sizes)) - for _, icon := range icons { - icon.Header.offset = offset - err = binary.Write(outfile, binary.LittleEndian, icon.Header) - if err != nil { - return err - } - offset += icon.Header.size - } - for _, icon := range icons { - _, err = outfile.Write(icon.Data) - if err != nil { - return err - } - } - return nil -} - -func defaultString(val string, defaultVal string) string { - if val != "" { - return val - } - return defaultVal -} - -func (b *PackageHelper) getPackageFileBaseDir() string { - // Calculate template base dir - _, filename, _, _ := runtime.Caller(1) - return filepath.Join(path.Dir(filename), "packages", b.platform) -} - -// Package the application into a platform specific package -func (b *PackageHelper) Package(po *ProjectOptions) error { - switch b.platform { - case "darwin": - return b.packageOSX(po) - case "windows": - return b.PackageWindows(po, true) - case "linux": - return b.packageLinux(po) - default: - return fmt.Errorf("platform '%s' not supported for bundling yet", b.platform) - } -} - -func (b *PackageHelper) packageLinux(po *ProjectOptions) error { - return nil -} - -// Package the application for OSX -func (b *PackageHelper) packageOSX(po *ProjectOptions) error { - build := path.Join(b.fs.Cwd(), "build") - - system := NewSystemHelper() - config, err := system.LoadConfig() - if err != nil { - return err - } - - name := defaultString(po.Name, "WailsTest") - exe := defaultString(po.BinaryName, name) - version := defaultString(po.Version, "0.1.0") - author := defaultString(config.Name, "Anonymous") - packageID := strings.Join([]string{"wails", name, version}, ".") - plistData := newPlistData(name, exe, packageID, version, author) - appname := po.Name + ".app" - plistFilename := path.Join(build, appname, "Contents", "Info.plist") - customPlist := path.Join(b.fs.Cwd(), "info.plist") - - // Check binary exists - source := path.Join(build, exe) - if po.CrossCompile == true { - file, err := b.fs.FindFile(build, "darwin") - if err != nil { - return err - } - source = path.Join(build, file) - } - - if !b.fs.FileExists(source) { - // We need to build! - return fmt.Errorf("Target '%s' not available. Has it been compiled yet?", source) - } - // Remove the existing package - os.RemoveAll(appname) - - // Create directories - exeDir := path.Join(build, appname, "/Contents/MacOS") - b.fs.MkDirs(exeDir, 0755) - resourceDir := path.Join(build, appname, "/Contents/Resources") - b.fs.MkDirs(resourceDir, 0755) - - // Do we have a custom plist in the project directory? - if !fs.FileExists(customPlist) { - - // No - create a new plist from our defaults - tmpl := template.New("infoPlist") - plistFile := filepath.Join(b.getPackageFileBaseDir(), "info.plist") - infoPlist, err := ioutil.ReadFile(plistFile) - if err != nil { - return err - } - tmpl.Parse(string(infoPlist)) - - // Write the template to a buffer - var tpl bytes.Buffer - err = tmpl.Execute(&tpl, plistData) - if err != nil { - return err - } - - // Save to the package - err = ioutil.WriteFile(plistFilename, tpl.Bytes(), 0644) - if err != nil { - return err - } - - // Also write to project directory for customisation - err = ioutil.WriteFile(customPlist, tpl.Bytes(), 0644) - if err != nil { - return err - } - } else { - // Yes - we have a plist. Copy it to the package verbatim - err = fs.CopyFile(customPlist, plistFilename) - if err != nil { - return err - } - } - - // Copy executable - target := path.Join(exeDir, exe) - err = b.fs.CopyFile(source, target) - if err != nil { - return err - } - - err = os.Chmod(target, 0755) - if err != nil { - return err - } - err = b.packageIconOSX(resourceDir) - return err -} - -// CleanWindows removes any windows related files found in the directory -func (b *PackageHelper) CleanWindows(po *ProjectOptions) { - pdir := b.fs.Cwd() - basename := strings.TrimSuffix(po.BinaryName, ".exe") - exts := []string{".ico", ".exe.manifest", ".rc", "-res.syso"} - rsrcs := []string{} - for _, ext := range exts { - rsrcs = append(rsrcs, filepath.Join(pdir, basename+ext)) - } - b.fs.RemoveFiles(rsrcs, true) -} - -// PackageWindows packages the application for windows platforms -func (b *PackageHelper) PackageWindows(po *ProjectOptions, cleanUp bool) error { - outputDir := b.fs.Cwd() - basename := strings.TrimSuffix(po.BinaryName, ".exe") - - // Copy default icon if needed - icon, err := b.copyIcon() - if err != nil { - return err - } - - // Generate icon from PNG - err = generateWindowsIcon(icon, basename+".ico") - if err != nil { - return err - } - - // Copy manifest - tgtManifestFile := filepath.Join(outputDir, basename+".exe.manifest") - if !b.fs.FileExists(tgtManifestFile) { - srcManifestfile := filepath.Join(b.getPackageFileBaseDir(), "wails.exe.manifest") - err := b.fs.CopyFile(srcManifestfile, tgtManifestFile) - if err != nil { - return err - } - } - - // Copy rc file - tgtRCFile := filepath.Join(outputDir, basename+".rc") - if !b.fs.FileExists(tgtRCFile) { - srcRCfile := filepath.Join(b.getPackageFileBaseDir(), "wails.rc") - rcfilebytes, err := ioutil.ReadFile(srcRCfile) - if err != nil { - return err - } - rcfiledata := strings.Replace(string(rcfilebytes), "$NAME$", basename, -1) - err = ioutil.WriteFile(tgtRCFile, []byte(rcfiledata), 0755) - if err != nil { - return err - } - } - - // Build syso - sysofile := filepath.Join(outputDir, basename+"-res.syso") - - // cross-compile - if b.platform != runtime.GOOS { - args := []string{ - "docker", "run", "--rm", - "-v", outputDir + ":/build", - "--entrypoint", "/bin/sh", - "wailsapp/xgo:1.16.3", - "-c", "/usr/bin/x86_64-w64-mingw32-windres -o /build/" + basename + "-res.syso /build/" + basename + ".rc", - } - if err := NewProgramHelper().RunCommandArray(args); err != nil { - return err - } - } else { - batfile, err := fs.LocalDir(".") - if err != nil { - return err - } - - windresBatFile := filepath.Join(batfile.fullPath, "windres.bat") - windresCommand := []string{windresBatFile, sysofile, tgtRCFile} - err = NewProgramHelper().RunCommandArray(windresCommand) - if err != nil { - return err - } - } - return nil -} - -func (b *PackageHelper) copyIcon() (string, error) { - - // TODO: Read this from project.json - const appIconFilename = "appicon.png" - srcIcon := path.Join(b.fs.Cwd(), appIconFilename) - - // Check if appicon.png exists - if !b.fs.FileExists(srcIcon) { - - // Install default icon - iconfile := filepath.Join(b.getPackageFileBaseDir(), "icon.png") - iconData, err := ioutil.ReadFile(iconfile) - if err != nil { - return "", err - } - err = ioutil.WriteFile(srcIcon, iconData, 0644) - if err != nil { - return "", err - } - } - return srcIcon, nil -} - -func (b *PackageHelper) packageIconOSX(resourceDir string) error { - - srcIcon, err := b.copyIcon() - if err != nil { - return err - } - tgtBundle := path.Join(resourceDir, "iconfile.icns") - imageFile, err := os.Open(srcIcon) - if err != nil { - return err - } - defer imageFile.Close() - srcImg, _, err := image.Decode(imageFile) - if err != nil { - return err - - } - dest, err := os.Create(tgtBundle) - if err != nil { - return err - - } - defer dest.Close() - return icns.Encode(dest, srcImg) -} diff --git a/vendor/github.com/wailsapp/wails/cmd/prerequisites.go b/vendor/github.com/wailsapp/wails/cmd/prerequisites.go deleted file mode 100644 index 3f88ae8..0000000 --- a/vendor/github.com/wailsapp/wails/cmd/prerequisites.go +++ /dev/null @@ -1,100 +0,0 @@ -package cmd - -import ( - "fmt" - "runtime" -) - -func newPrerequisite(name, help string) *Prerequisite { - return &Prerequisite{Name: name, Help: help} -} - -// Prerequisites is a list of things required to use Wails -type Prerequisites []*Prerequisite - -// Add given prereq object to list -func (p *Prerequisites) Add(prereq *Prerequisite) { - *p = append(*p, prereq) -} - -// GetRequiredPrograms returns a list of programs required for the platform -func GetRequiredPrograms() (*Prerequisites, error) { - switch runtime.GOOS { - case "darwin": - return getRequiredProgramsOSX(), nil - case "linux": - return getRequiredProgramsLinux(), nil - case "windows": - return getRequiredProgramsWindows(), nil - default: - return nil, fmt.Errorf("platform '%s' not supported at this time", runtime.GOOS) - } -} - -func getRequiredProgramsOSX() *Prerequisites { - result := &Prerequisites{} - result.Add(newPrerequisite("clang", "Please install with `xcode-select --install` and try again")) - result.Add(newPrerequisite("npm", "Please install from https://nodejs.org/en/download/ and try again")) - return result -} - -func getRequiredProgramsLinux() *Prerequisites { - result := &Prerequisites{} - distroInfo := GetLinuxDistroInfo() - if distroInfo.Distribution != Unknown { - var linuxDB = NewLinuxDB() - distro := linuxDB.GetDistro(distroInfo.ID) - release := distro.GetRelease(distroInfo.Release) - for _, program := range release.Programs { - result.Add(program) - } - } - return result -} - -// TODO: Test this on Windows -func getRequiredProgramsWindows() *Prerequisites { - result := &Prerequisites{} - result.Add(newPrerequisite("gcc", "Please install gcc from here and try again: http://tdm-gcc.tdragon.net/download. You will need to add the bin directory to your path, EG: C:\\TDM-GCC-64\\bin\\")) - result.Add(newPrerequisite("npm", "Please install node/npm from here and try again: https://nodejs.org/en/download/")) - return result -} - -// GetRequiredLibraries returns a list of libraries (packages) required for the platform -func GetRequiredLibraries() (*Prerequisites, error) { - switch runtime.GOOS { - case "darwin": - return getRequiredLibrariesOSX() - case "linux": - return getRequiredLibrariesLinux() - case "windows": - return getRequiredLibrariesWindows() - default: - return nil, fmt.Errorf("platform '%s' not supported at this time", runtime.GOOS) - } -} - -func getRequiredLibrariesOSX() (*Prerequisites, error) { - result := &Prerequisites{} - return result, nil -} - -func getRequiredLibrariesLinux() (*Prerequisites, error) { - result := &Prerequisites{} - // The Linux Distribution DB - distroInfo := GetLinuxDistroInfo() - if distroInfo.Distribution != Unknown { - var linuxDB = NewLinuxDB() - distro := linuxDB.GetDistro(distroInfo.ID) - release := distro.GetRelease(distroInfo.Release) - for _, library := range release.Libraries { - result.Add(library) - } - } - return result, nil -} - -func getRequiredLibrariesWindows() (*Prerequisites, error) { - result := &Prerequisites{} - return result, nil -} diff --git a/vendor/github.com/wailsapp/wails/cmd/program.go b/vendor/github.com/wailsapp/wails/cmd/program.go deleted file mode 100644 index 733bd51..0000000 --- a/vendor/github.com/wailsapp/wails/cmd/program.go +++ /dev/null @@ -1,162 +0,0 @@ -package cmd - -import ( - "bytes" - "fmt" - "os" - "os/exec" - "path/filepath" - "strings" - "syscall" -) - -// ProgramHelper - Utility functions around installed applications -type ProgramHelper struct { - shell *ShellHelper - verbose bool -} - -// NewProgramHelper - Creates a new ProgramHelper -func NewProgramHelper(verbose ...bool) *ProgramHelper { - result := &ProgramHelper{ - shell: NewShellHelper(), - } - if len(verbose) > 0 { - result.verbose = verbose[0] - if result.verbose { - result.shell.SetVerbose() - } - } - return result -} - -// IsInstalled tries to determine if the given binary name is installed -func (p *ProgramHelper) IsInstalled(programName string) bool { - _, err := exec.LookPath(programName) - return err == nil -} - -// Program - A struct to define an installed application/binary -type Program struct { - Name string `json:"name"` - Path string `json:"path"` - verbose bool -} - -// FindProgram attempts to find the given program on the system.FindProgram -// Returns a struct with the name and path to the program -func (p *ProgramHelper) FindProgram(programName string) *Program { - path, err := exec.LookPath(programName) - if err != nil { - return nil - } - path, err = filepath.Abs(path) - if err != nil { - return nil - } - return &Program{ - Name: programName, - Path: path, - verbose: p.verbose, - } -} - -// GetFullPathToBinary returns the full path the the current binary -func (p *Program) GetFullPathToBinary() (string, error) { - return filepath.Abs(p.Path) -} - -// Run will execute the program with the given parameters -// Returns stdout + stderr as strings and an error if one occurred -func (p *Program) Run(vars ...string) (stdout, stderr string, exitCode int, err error) { - command, err := p.GetFullPathToBinary() - if err != nil { - return "", "", 1, err - } - cmd := exec.Command(command, vars...) - if !p.verbose { - var stdo, stde bytes.Buffer - cmd.Stdout = &stdo - cmd.Stderr = &stde - err = cmd.Run() - stdout = string(stdo.Bytes()) - stderr = string(stde.Bytes()) - } else { - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr - err = cmd.Run() - } - - // https://stackoverflow.com/questions/10385551/get-exit-code-go - if err != nil { - // try to get the exit code - if exitError, ok := err.(*exec.ExitError); ok { - ws := exitError.Sys().(syscall.WaitStatus) - exitCode = ws.ExitStatus() - } else { - exitCode = 1 - if stderr == "" { - stderr = err.Error() - } - } - } else { - // success, exitCode should be 0 if go is ok - ws := cmd.ProcessState.Sys().(syscall.WaitStatus) - exitCode = ws.ExitStatus() - } - return -} - -// InstallGoPackage installs the given Go package -func (p *ProgramHelper) InstallGoPackage(packageName string) error { - args := strings.Split("get "+packageName, " ") - _, stderr, err := p.shell.Run("go", args...) - if err != nil { - fmt.Println(stderr) - } - return err -} - -// InstallNPMPackage installs the given npm package -func (p *ProgramHelper) InstallNPMPackage(packageName string, save bool) error { - args := strings.Split("install "+packageName, " ") - if save { - args = append(args, "--save") - } - _, stderr, err := p.shell.Run("npm", args...) - if err != nil { - fmt.Println(stderr) - } - return err -} - -// RunCommand runs the given command -func (p *ProgramHelper) RunCommand(command string) error { - args := strings.Split(command, " ") - return p.RunCommandArray(args) -} - -// RunCommandArray runs the command specified in the array -func (p *ProgramHelper) RunCommandArray(args []string, dir ...string) error { - programCommand := args[0] - // TODO: Run FindProgram here and get the full path to the exe - program, err := exec.LookPath(programCommand) - if err != nil { - fmt.Printf("ERROR: Looks like '%s' isn't installed. Please install and try again.", programCommand) - return err - } - - args = args[1:] - var stderr string - var stdout string - if len(dir) > 0 { - stdout, stderr, err = p.shell.RunInDirectory(dir[0], program, args...) - } else { - stdout, stderr, err = p.shell.Run(program, args...) - } - if err != nil { - fmt.Println(stderr) - fmt.Println(stdout) - } - return err -} diff --git a/vendor/github.com/wailsapp/wails/cmd/project.go b/vendor/github.com/wailsapp/wails/cmd/project.go deleted file mode 100644 index efe7725..0000000 --- a/vendor/github.com/wailsapp/wails/cmd/project.go +++ /dev/null @@ -1,407 +0,0 @@ -package cmd - -import ( - "encoding/json" - "fmt" - "io/ioutil" - "os" - "path/filepath" - "runtime" - "sort" - "strings" - - "github.com/leaanthony/slicer" -) - -// PackageManager indicates different package managers -type PackageManager int - -const ( - // UNKNOWN package manager - UNKNOWN PackageManager = iota - // NPM package manager - NPM - // YARN package manager - YARN -) - -type author struct { - Name string `json:"name"` - Email string `json:"email"` -} - -type frontend struct { - Dir string `json:"dir"` - Install string `json:"install"` - Build string `json:"build"` - Bridge string `json:"bridge"` - Serve string `json:"serve"` -} - -type framework struct { - Name string `json:"name"` - BuildTag string `json:"buildtag"` - Options map[string]string `json:"options,omitempty"` -} - -// ProjectHelper is a helper struct for managing projects -type ProjectHelper struct { - log *Logger - system *SystemHelper - templates *TemplateHelper -} - -// NewProjectHelper creates a new Project helper struct -func NewProjectHelper() *ProjectHelper { - return &ProjectHelper{ - log: NewLogger(), - system: NewSystemHelper(), - templates: NewTemplateHelper(), - } -} - -// GenerateProject generates a new project using the options given -func (ph *ProjectHelper) GenerateProject(projectOptions *ProjectOptions) error { - - // Calculate project path - projectPath, err := filepath.Abs(projectOptions.OutputDirectory) - if err != nil { - return err - } - - _ = projectPath - - if fs.DirExists(projectPath) { - return fmt.Errorf("directory '%s' already exists", projectPath) - } - - // Create project directory - err = fs.MkDir(projectPath) - if err != nil { - return err - } - - // Create and save project config - err = projectOptions.WriteProjectConfig() - if err != nil { - return err - } - - err = ph.templates.InstallTemplate(projectPath, projectOptions) - if err != nil { - return err - } - - // // If we are on windows, dump a windows_resource.json - // if runtime.GOOS == "windows" { - // ph.GenerateWindowsResourceConfig(projectOptions) - // } - - return nil -} - -// // GenerateWindowsResourceConfig generates the default windows resource file -// func (ph *ProjectHelper) GenerateWindowsResourceConfig(po *ProjectOptions) { - -// fmt.Println(buffer.String()) - -// // vi.Build() -// // vi.Walk() -// // err := vi.WriteSyso(outPath, runtime.GOARCH) -// } - -// LoadProjectConfig loads the project config from the given directory -func (ph *ProjectHelper) LoadProjectConfig(dir string) (*ProjectOptions, error) { - po := ph.NewProjectOptions() - err := po.LoadConfig(dir) - return po, err -} - -// NewProjectOptions creates a new default set of project options -func (ph *ProjectHelper) NewProjectOptions() *ProjectOptions { - result := ProjectOptions{ - Name: "", - Description: "Enter your project description", - Version: "0.1.0", - BinaryName: "", - system: ph.system, - log: ph.log, - templates: ph.templates, - Author: &author{}, - } - - // Populate system config - config, err := ph.system.LoadConfig() - if err == nil { - result.Author.Name = config.Name - result.Author.Email = config.Email - } - - return &result -} - -// ProjectOptions holds all the options available for a project -type ProjectOptions struct { - Name string `json:"name"` - Description string `json:"description"` - Author *author `json:"author,omitempty"` - Version string `json:"version"` - OutputDirectory string `json:"-"` - UseDefaults bool `json:"-"` - Template string `json:"-"` - BinaryName string `json:"binaryname"` - FrontEnd *frontend `json:"frontend,omitempty"` - Tags string `json:"tags"` - NPMProjectName string `json:"-"` - system *SystemHelper - log *Logger - templates *TemplateHelper - selectedTemplate *TemplateDetails - WailsVersion string - typescriptDefsFilename string - Verbose bool `json:"-"` - CrossCompile bool - Platform string - Architecture string - LdFlags string - GoPath string - UseFirebug bool - - // Supported platforms - Platforms []string `json:"platforms,omitempty"` -} - -// PlatformSupported returns true if the template is supported -// on the current platform -func (po *ProjectOptions) PlatformSupported() bool { - - // Default is all platforms supported - if len(po.Platforms) == 0 { - return true - } - - // Check that the platform is in the list - platformsSupported := slicer.String(po.Platforms) - return platformsSupported.Contains(runtime.GOOS) -} - -// Defaults sets the default project template -func (po *ProjectOptions) Defaults() { - po.Template = "vuebasic" - po.WailsVersion = Version -} - -// SetTypescriptDefsFilename indicates that we want to generate typescript bindings to the given file -func (po *ProjectOptions) SetTypescriptDefsFilename(filename string) { - po.typescriptDefsFilename = filename -} - -// GetNPMBinaryName returns the type of package manager used by the project -func (po *ProjectOptions) GetNPMBinaryName() (PackageManager, error) { - if po.FrontEnd == nil { - return UNKNOWN, fmt.Errorf("No frontend specified in project options") - } - - if strings.Index(po.FrontEnd.Install, "npm") > -1 { - return NPM, nil - } - - if strings.Index(po.FrontEnd.Install, "yarn") > -1 { - return YARN, nil - } - - return UNKNOWN, nil -} - -// PromptForInputs asks the user to input project details -func (po *ProjectOptions) PromptForInputs() error { - - processProjectName(po) - - processBinaryName(po) - - err := processOutputDirectory(po) - if err != nil { - return err - } - - // Process Templates - templateList := slicer.Interface() - options := slicer.String() - templateDetails, err := po.templates.GetTemplateDetails() - if err != nil { - return err - } - - if po.Template != "" { - // Check template is valid if given - if templateDetails[po.Template] == nil { - keys := make([]string, 0, len(templateDetails)) - for k := range templateDetails { - keys = append(keys, k) - } - return fmt.Errorf("invalid template name '%s'. Valid options: %s", po.Template, strings.Join(keys, ", ")) - } - po.selectedTemplate = templateDetails[po.Template] - } else { - - keys := make([]string, 0) - for k := range templateDetails { - keys = append(keys, k) - } - sort.Strings(keys) - for _, k := range keys { - templateDetail := templateDetails[k] - templateList.Add(templateDetail) - if !templateDetail.Metadata.PlatformSupported() { - templateDetail.Metadata.Name = "* " + templateDetail.Metadata.Name - } - options.Add(fmt.Sprintf("%s - %s", templateDetail.Metadata.Name, templateDetail.Metadata.ShortDescription)) - } - - templateIndex := 0 - - if len(options.AsSlice()) > 1 { - templateIndex = PromptSelection("Please select a template (* means unsupported on current platform)", options.AsSlice(), 0) - } - - if len(templateList.AsSlice()) == 0 { - return fmt.Errorf("aborting: no templates found") - } - - // After selection do this.... - po.selectedTemplate = templateList.AsSlice()[templateIndex].(*TemplateDetails) - } - - po.selectedTemplate.Metadata.Name = strings.TrimPrefix(po.selectedTemplate.Metadata.Name, "* ") - if !po.selectedTemplate.Metadata.PlatformSupported() { - println("WARNING: This template is unsupported on this platform!") - } - fmt.Println("Template: " + po.selectedTemplate.Metadata.Name) - - // Setup NPM Project name - po.NPMProjectName = strings.ToLower(strings.Replace(po.Name, " ", "_", -1)) - - // Fix template name - po.Template = strings.Split(po.selectedTemplate.Path, string(os.PathSeparator))[0] - - // // Populate template details - templateMetadata := po.selectedTemplate.Metadata - - err = processTemplateMetadata(templateMetadata, po) - if err != nil { - return err - } - - return nil -} - -// WriteProjectConfig writes the project configuration into -// the project directory -func (po *ProjectOptions) WriteProjectConfig() error { - targetDir, err := filepath.Abs(po.OutputDirectory) - if err != nil { - return err - } - - targetFile := filepath.Join(targetDir, "project.json") - filedata, err := json.MarshalIndent(po, "", " ") - if err != nil { - return err - } - - return ioutil.WriteFile(targetFile, filedata, 0600) -} - -// LoadConfig loads the project configuration file from the -// given directory -func (po *ProjectOptions) LoadConfig(projectDir string) error { - targetFile := filepath.Join(projectDir, "project.json") - rawBytes, err := ioutil.ReadFile(targetFile) - if err != nil { - return err - } - return json.Unmarshal(rawBytes, po) -} - -func computeBinaryName(projectName string) string { - if projectName == "" { - return "" - } - var binaryNameComputed = strings.ToLower(projectName) - binaryNameComputed = strings.Replace(binaryNameComputed, " ", "-", -1) - binaryNameComputed = strings.Replace(binaryNameComputed, string(filepath.Separator), "-", -1) - binaryNameComputed = strings.Replace(binaryNameComputed, ":", "-", -1) - return binaryNameComputed -} - -func processOutputDirectory(po *ProjectOptions) error { - // po.OutputDirectory - if po.OutputDirectory == "" { - po.OutputDirectory = PromptRequired("Project directory name", computeBinaryName(po.Name)) - } - projectPath, err := filepath.Abs(po.OutputDirectory) - if err != nil { - return err - } - - if NewFSHelper().DirExists(projectPath) { - return fmt.Errorf("directory '%s' already exists", projectPath) - } - - fmt.Println("Project Directory: " + po.OutputDirectory) - return nil -} - -func processProjectName(po *ProjectOptions) { - if po.Name == "" { - po.Name = Prompt("The name of the project", "My Project") - } - fmt.Println("Project Name: " + po.Name) -} - -func processBinaryName(po *ProjectOptions) { - if po.BinaryName == "" { - var binaryNameComputed = computeBinaryName(po.Name) - po.BinaryName = Prompt("The output binary name", binaryNameComputed) - } - fmt.Println("Output binary Name: " + po.BinaryName) -} - -func processTemplateMetadata(templateMetadata *TemplateMetadata, po *ProjectOptions) error { - if templateMetadata.FrontendDir != "" { - po.FrontEnd = &frontend{} - po.FrontEnd.Dir = templateMetadata.FrontendDir - } - if templateMetadata.Install != "" { - if po.FrontEnd == nil { - return fmt.Errorf("install set in template metadata but not frontenddir") - } - po.FrontEnd.Install = templateMetadata.Install - } - if templateMetadata.Build != "" { - if po.FrontEnd == nil { - return fmt.Errorf("build set in template metadata but not frontenddir") - } - po.FrontEnd.Build = templateMetadata.Build - } - - if templateMetadata.Bridge != "" { - if po.FrontEnd == nil { - return fmt.Errorf("bridge set in template metadata but not frontenddir") - } - po.FrontEnd.Bridge = templateMetadata.Bridge - } - - if templateMetadata.Serve != "" { - if po.FrontEnd == nil { - return fmt.Errorf("serve set in template metadata but not frontenddir") - } - po.FrontEnd.Serve = templateMetadata.Serve - } - - // Save platforms - po.Platforms = templateMetadata.Platforms - - return nil -} diff --git a/vendor/github.com/wailsapp/wails/cmd/prompt.go b/vendor/github.com/wailsapp/wails/cmd/prompt.go deleted file mode 100644 index dac324f..0000000 --- a/vendor/github.com/wailsapp/wails/cmd/prompt.go +++ /dev/null @@ -1,80 +0,0 @@ -package cmd - -import ( - "bufio" - "fmt" - "os" - "strconv" - "strings" -) - -// Prompt asks the user for a value -func Prompt(question string, defaultValue ...string) string { - var answer string - - if len(defaultValue) > 0 { - answer = defaultValue[0] - question = fmt.Sprintf("%s (%s)", question, answer) - } - fmt.Printf(question + ": ") - reader := bufio.NewReader(os.Stdin) - input, _ := reader.ReadString('\n') - input = strings.TrimSpace(input) - - if input != "" { - answer = input - } - - return answer -} - -// PromptRequired calls Prompt repeatedly until a value is given -func PromptRequired(question string, defaultValue ...string) string { - for { - result := Prompt(question, defaultValue...) - if result != "" { - return result - } - } -} - -// PromptSelection asks the user to choose an option -func PromptSelection(question string, options []string, optionalDefaultValue ...int) int { - - defaultValue := -1 - message := "Please choose an option" - fmt.Println(question + ":") - - if len(optionalDefaultValue) > 0 { - defaultValue = optionalDefaultValue[0] + 1 - message = fmt.Sprintf("%s [%d]", message, defaultValue) - } - - for index, option := range options { - fmt.Printf(" %d: %s\n", index+1, option) - } - - selectedValue := -1 - - for { - choice := Prompt(message) - if choice == "" && defaultValue > -1 { - selectedValue = defaultValue - 1 - break - } - - // index - number, err := strconv.Atoi(choice) - if err == nil { - if number > 0 && number <= len(options) { - selectedValue = number - 1 - break - } else { - continue - } - } - - } - - return selectedValue -} diff --git a/vendor/github.com/wailsapp/wails/cmd/semver.go b/vendor/github.com/wailsapp/wails/cmd/semver.go deleted file mode 100644 index ab94052..0000000 --- a/vendor/github.com/wailsapp/wails/cmd/semver.go +++ /dev/null @@ -1,106 +0,0 @@ -package cmd - -import ( - "fmt" - - "github.com/Masterminds/semver" -) - -// SemanticVersion is a struct containing a semantic version -type SemanticVersion struct { - Version *semver.Version -} - -// NewSemanticVersion creates a new SemanticVersion object with the given version string -func NewSemanticVersion(version string) (*SemanticVersion, error) { - semverVersion, err := semver.NewVersion(version) - if err != nil { - return nil, err - } - return &SemanticVersion{ - Version: semverVersion, - }, nil -} - -// IsRelease returns true if it's a release version -func (s *SemanticVersion) IsRelease() bool { - // Limit to v1 - if s.Version.Major() != 1 { - return false - } - return len(s.Version.Prerelease()) == 0 && len(s.Version.Metadata()) == 0 -} - -// IsPreRelease returns true if it's a prerelease version -func (s *SemanticVersion) IsPreRelease() bool { - // Limit to v1 - if s.Version.Major() != 1 { - return false - } - return len(s.Version.Prerelease()) > 0 -} - -func (s *SemanticVersion) String() string { - return s.Version.String() -} - -// IsGreaterThan returns true if this version is greater than the given version -func (s *SemanticVersion) IsGreaterThan(version *SemanticVersion) (bool, error) { - // Set up new constraint - constraint, err := semver.NewConstraint("> " + version.Version.String()) - if err != nil { - return false, err - } - - // Check if the desired one is greater than the requested on - success, msgs := constraint.Validate(s.Version) - if !success { - return false, msgs[0] - } - return true, nil -} - -// IsGreaterThanOrEqual returns true if this version is greater than or equal the given version -func (s *SemanticVersion) IsGreaterThanOrEqual(version *SemanticVersion) (bool, error) { - // Set up new constraint - constraint, err := semver.NewConstraint(">= " + version.Version.String()) - if err != nil { - return false, err - } - - // Check if the desired one is greater than the requested on - success, msgs := constraint.Validate(s.Version) - if !success { - return false, msgs[0] - } - return true, nil -} - -// MainVersion returns the main version of any version+prerelease+metadata -// EG: MainVersion("1.2.3-pre") => "1.2.3" -func (s *SemanticVersion) MainVersion() *SemanticVersion { - mainVersion := fmt.Sprintf("%d.%d.%d", s.Version.Major(), s.Version.Minor(), s.Version.Patch()) - result, _ := NewSemanticVersion(mainVersion) - return result -} - -// SemverCollection is a collection of SemanticVersion objects -type SemverCollection []*SemanticVersion - -// Len returns the length of a collection. The number of Version instances -// on the slice. -func (c SemverCollection) Len() int { - return len(c) -} - -// Less is needed for the sort interface to compare two Version objects on the -// slice. If checks if one is less than the other. -func (c SemverCollection) Less(i, j int) bool { - return c[i].Version.LessThan(c[j].Version) -} - -// Swap is needed for the sort interface to replace the Version objects -// at two different positions in the slice. -func (c SemverCollection) Swap(i, j int) { - c[i], c[j] = c[j], c[i] -} diff --git a/vendor/github.com/wailsapp/wails/cmd/shell.go b/vendor/github.com/wailsapp/wails/cmd/shell.go deleted file mode 100644 index 53c227d..0000000 --- a/vendor/github.com/wailsapp/wails/cmd/shell.go +++ /dev/null @@ -1,61 +0,0 @@ -package cmd - -import ( - "bytes" - "os" - "os/exec" -) - -// ShellHelper helps with Shell commands -type ShellHelper struct { - verbose bool -} - -// NewShellHelper creates a new ShellHelper! -func NewShellHelper() *ShellHelper { - return &ShellHelper{} -} - -// SetVerbose sets the verbose flag -func (sh *ShellHelper) SetVerbose() { - sh.verbose = true -} - -// Run the given command -func (sh *ShellHelper) Run(command string, vars ...string) (stdout, stderr string, err error) { - cmd := exec.Command(command, vars...) - cmd.Env = append(os.Environ(), "GO111MODULE=on") - if !sh.verbose { - var stdo, stde bytes.Buffer - cmd.Stdout = &stdo - cmd.Stderr = &stde - err = cmd.Run() - stdout = string(stdo.Bytes()) - stderr = string(stde.Bytes()) - } else { - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr - err = cmd.Run() - } - return -} - -// RunInDirectory runs the given command in the given directory -func (sh *ShellHelper) RunInDirectory(dir string, command string, vars ...string) (stdout, stderr string, err error) { - cmd := exec.Command(command, vars...) - cmd.Dir = dir - cmd.Env = append(os.Environ(), "GO111MODULE=on") - if !sh.verbose { - var stdo, stde bytes.Buffer - cmd.Stdout = &stdo - cmd.Stderr = &stde - err = cmd.Run() - stdout = string(stdo.Bytes()) - stderr = string(stde.Bytes()) - } else { - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr - err = cmd.Run() - } - return -} diff --git a/vendor/github.com/wailsapp/wails/cmd/system.go b/vendor/github.com/wailsapp/wails/cmd/system.go deleted file mode 100644 index 76ab0b2..0000000 --- a/vendor/github.com/wailsapp/wails/cmd/system.go +++ /dev/null @@ -1,316 +0,0 @@ -package cmd - -import ( - "encoding/json" - "fmt" - "io/ioutil" - "log" - "os" - "path/filepath" - "runtime" - "strconv" - "time" -) - -// SystemHelper - Defines everything related to the system -type SystemHelper struct { - log *Logger - fs *FSHelper - configFilename string - homeDir string - wailsSystemDir string - wailsSystemConfig string -} - -// NewSystemHelper - Creates a new System Helper -func NewSystemHelper() *SystemHelper { - result := &SystemHelper{ - fs: NewFSHelper(), - log: NewLogger(), - configFilename: "wails.json", - } - result.setSystemDirs() - return result -} - -// Internal -// setSystemDirs calculates the system directories it is interested in -func (s *SystemHelper) setSystemDirs() { - var err error - s.homeDir, err = os.UserHomeDir() - if err != nil { - log.Fatal("Cannot find home directory! Please file a bug report!") - } - - // TODO: A better config system - s.wailsSystemDir = filepath.Join(s.homeDir, ".wails") - s.wailsSystemConfig = filepath.Join(s.wailsSystemDir, s.configFilename) -} - -// ConfigFileExists - Returns true if it does! -func (s *SystemHelper) ConfigFileExists() bool { - return s.fs.FileExists(s.wailsSystemConfig) -} - -// SystemDirExists - Returns true if it does! -func (s *SystemHelper) systemDirExists() bool { - return s.fs.DirExists(s.wailsSystemDir) -} - -// LoadConfig attempts to load the Wails system config -func (s *SystemHelper) LoadConfig() (*SystemConfig, error) { - return NewSystemConfig(s.wailsSystemConfig) -} - -// ConfigFileIsValid checks if the config file is valid -func (s *SystemHelper) ConfigFileIsValid() bool { - _, err := NewSystemConfig(s.wailsSystemConfig) - return err == nil -} - -// GetAuthor returns a formatted string of the user's name and email -func (s *SystemHelper) GetAuthor() (string, error) { - var config *SystemConfig - config, err := s.LoadConfig() - if err != nil { - return "", err - } - - return fmt.Sprintf("%s <%s>", config.Name, config.Email), nil -} - -// BackupConfig attempts to backup the system config file -func (s *SystemHelper) BackupConfig() (string, error) { - now := strconv.FormatInt(time.Now().UTC().UnixNano(), 10) - backupFilename := s.wailsSystemConfig + "." + now - err := s.fs.CopyFile(s.wailsSystemConfig, backupFilename) - if err != nil { - return "", err - } - return backupFilename, nil -} - -func (s *SystemHelper) setup() error { - - systemConfig := make(map[string]string) - - // Try to load current values - ignore errors - config, _ := s.LoadConfig() - - if config.Name != "" { - systemConfig["name"] = PromptRequired("What is your name", config.Name) - } else if n, err := getGitConfigValue("user.name"); err == nil && n != "" { - systemConfig["name"] = PromptRequired("What is your name", n) - } else { - systemConfig["name"] = PromptRequired("What is your name") - } - - if config.Email != "" { - systemConfig["email"] = PromptRequired("What is your email address", config.Email) - } else if e, err := getGitConfigValue("user.email"); err == nil && e != "" { - systemConfig["email"] = PromptRequired("What is your email address", e) - } else { - systemConfig["email"] = PromptRequired("What is your email address") - } - - // Create the directory - err := s.fs.MkDirs(s.wailsSystemDir) - if err != nil { - return err - } - - // Save - configData, err := json.Marshal(&systemConfig) - if err != nil { - return err - } - err = ioutil.WriteFile(s.wailsSystemConfig, configData, 0755) - if err != nil { - return err - } - fmt.Println() - s.log.White("Wails config saved to: " + s.wailsSystemConfig) - s.log.White("Feel free to customise these settings.") - fmt.Println() - - return nil -} - -const introText = ` -Wails is a lightweight framework for creating web-like desktop apps in Go. -I'll need to ask you a few questions so I can fill in your project templates and then I will try and see if you have the correct dependencies installed. If you don't have the right tools installed, I'll try and suggest how to install them. -` - -// CheckInitialised checks if the system has been set up -// and if not, runs setup -func (s *SystemHelper) CheckInitialised() error { - if !s.systemDirExists() { - s.log.Yellow("System not initialised. Running setup.") - return s.setup() - } - return nil -} - -// Initialise attempts to set up the Wails system. -// An error is returns if there is a problem -func (s *SystemHelper) Initialise() error { - - // System dir doesn't exist - if !s.systemDirExists() { - s.log.Green("Welcome to Wails!") - s.log.Green(introText) - return s.setup() - } - - // Config doesn't exist - if !s.ConfigFileExists() { - s.log.Green("Looks like the system config is missing.") - s.log.Green("To get you back on track, I'll need to ask you a few things...") - return s.setup() - } - - // Config exists but isn't valid. - if !s.ConfigFileIsValid() { - s.log.Green("Looks like the system config got corrupted.") - backupFile, err := s.BackupConfig() - if err != nil { - s.log.Green("I tried to backup your config file but got this error: %s", err.Error()) - } else { - s.log.Green("Just in case you needed it, I backed up your config file here: %s", backupFile) - } - s.log.Green("To get you back on track, I'll need to ask you a few things...") - return s.setup() - } - - return s.setup() -} - -// SystemConfig - Defines system wide configuration data -type SystemConfig struct { - Name string `json:"name"` - Email string `json:"email"` -} - -// NewSystemConfig - Creates a new SystemConfig helper object -func NewSystemConfig(filename string) (*SystemConfig, error) { - result := &SystemConfig{} - err := result.load(filename) - return result, err -} - -// Save - Saves the system config to the given filename -func (sc *SystemConfig) Save(filename string) error { - // Convert config to JSON string - theJSON, err := json.MarshalIndent(sc, "", " ") - if err != nil { - return err - } - - // Write it out to the config file - return ioutil.WriteFile(filename, theJSON, 0644) -} - -func (sc *SystemConfig) load(filename string) error { - configData, err := ioutil.ReadFile(filename) - if err != nil { - return err - } - // Load and unmarshall! - err = json.Unmarshal(configData, &sc) - if err != nil { - return err - } - return nil -} - -// CheckDependenciesSilent checks for dependencies but -// only outputs if there's an error -func CheckDependenciesSilent(logger *Logger) (bool, error) { - logger.SetErrorOnly(true) - result, err := CheckDependencies(logger) - logger.SetErrorOnly(false) - return result, err -} - -// CheckDependencies will look for Wails dependencies on the system -// Errors are reported in error and the bool return value is whether -// the dependencies are all installed. -func CheckDependencies(logger *Logger) (bool, error) { - - switch runtime.GOOS { - case "darwin": - logger.Yellow("Detected Platform: OSX") - case "windows": - logger.Yellow("Detected Platform: Windows") - case "linux": - logger.Yellow("Detected Platform: Linux") - default: - return false, fmt.Errorf("Platform %s is currently not supported", runtime.GOOS) - } - - logger.Yellow("Checking for prerequisites...") - // Check we have a cgo capable environment - - requiredPrograms, err := GetRequiredPrograms() - if err != nil { - return false, nil - } - errors := false - programHelper := NewProgramHelper() - for _, program := range *requiredPrograms { - bin := programHelper.FindProgram(program.Name) - if bin == nil { - errors = true - logger.Error("Program '%s' not found. %s", program.Name, program.Help) - } else { - logger.Green("Program '%s' found: %s", program.Name, bin.Path) - } - } - - // Linux has library deps - if runtime.GOOS == "linux" { - // Check library prerequisites - requiredLibraries, err := GetRequiredLibraries() - if err != nil { - return false, err - } - - var libraryChecker CheckPkgInstalled - distroInfo := GetLinuxDistroInfo() - - switch distroInfo.Distribution { - case Ubuntu, Debian, Zorin, Parrot, Linuxmint, Elementary, Kali, Neon, Deepin, Raspbian, PopOS: - libraryChecker = DpkgInstalled - case Arch, ArcoLinux, ArchLabs, Ctlos, Manjaro, ManjaroARM, EndeavourOS: - libraryChecker = PacmanInstalled - case CentOS, Fedora, Tumbleweed, Leap, RHEL: - libraryChecker = RpmInstalled - case Gentoo: - libraryChecker = EqueryInstalled - case VoidLinux: - libraryChecker = XbpsInstalled - case Solus: - libraryChecker = EOpkgInstalled - case Crux: - libraryChecker = PrtGetInstalled - default: - return false, RequestSupportForDistribution(distroInfo) - } - - for _, library := range *requiredLibraries { - installed, err := libraryChecker(library.Name) - if err != nil { - return false, err - } - if !installed { - errors = true - logger.Error("Library '%s' not found. %s", library.Name, library.Help) - } else { - logger.Green("Library '%s' installed.", library.Name) - } - } - } - logger.White("") - - return !errors, err -} diff --git a/vendor/github.com/wailsapp/wails/cmd/templates.go b/vendor/github.com/wailsapp/wails/cmd/templates.go deleted file mode 100644 index fe1c68d..0000000 --- a/vendor/github.com/wailsapp/wails/cmd/templates.go +++ /dev/null @@ -1,270 +0,0 @@ -package cmd - -import ( - "bytes" - "encoding/json" - "fmt" - "io/ioutil" - "log" - "path/filepath" - "runtime" - "strings" - "text/template" - - "github.com/kennygrant/sanitize" - "github.com/leaanthony/slicer" -) - -// TemplateMetadata holds all the metadata for a Wails template -type TemplateMetadata struct { - Name string `json:"name"` - Version string `json:"version"` - ShortDescription string `json:"shortdescription"` - Description string `json:"description"` - Install string `json:"install"` - Build string `json:"build"` - Author string `json:"author"` - Created string `json:"created"` - FrontendDir string `json:"frontenddir"` - Serve string `json:"serve"` - Bridge string `json:"bridge"` - WailsDir string `json:"wailsdir"` - TemplateDependencies []*TemplateDependency `json:"dependencies,omitempty"` - - // List of platforms that this template is supported on. - // No value means all platforms. A platform name is the same string - // as `runtime.GOOS` will return, eg: "darwin". NOTE: This is - // case sensitive. - Platforms []string `json:"platforms,omitempty"` -} - -// PlatformSupported returns true if this template supports the -// currently running platform -func (m *TemplateMetadata) PlatformSupported() bool { - - // Default is all platforms supported - if len(m.Platforms) == 0 { - return true - } - - // Check that the platform is in the list - platformsSupported := slicer.String(m.Platforms) - return platformsSupported.Contains(runtime.GOOS) -} - -// TemplateDependency defines a binary dependency for the template -// EG: ng for angular -type TemplateDependency struct { - Bin string `json:"bin"` - Help string `json:"help"` -} - -// TemplateDetails holds information about a specific template -type TemplateDetails struct { - Name string - Path string - Metadata *TemplateMetadata - fs *FSHelper -} - -// TemplateHelper is a utility object to help with processing templates -type TemplateHelper struct { - templateDir *Dir - fs *FSHelper - metadataFilename string -} - -// NewTemplateHelper creates a new template helper -func NewTemplateHelper() *TemplateHelper { - - templateDir, err := fs.LocalDir("./templates") - if err != nil { - log.Fatal("Unable to find the template directory. Please reinstall Wails.") - } - - return &TemplateHelper{ - templateDir: templateDir, - metadataFilename: "template.json", - } -} - -// IsValidTemplate returns true if the given template name resides on disk -func (t *TemplateHelper) IsValidTemplate(templateName string) bool { - pathToTemplate := filepath.Join(t.templateDir.fullPath, templateName) - return t.fs.DirExists(pathToTemplate) -} - -// SanitizeFilename sanitizes the given string to make a valid filename -func (t *TemplateHelper) SanitizeFilename(name string) string { - return sanitize.Name(name) -} - -// CreateNewTemplate creates a new template based on the given directory name and string -func (t *TemplateHelper) CreateNewTemplate(dirname string, details *TemplateMetadata) (string, error) { - - // Check if this template has already been created - if t.IsValidTemplate(dirname) { - return "", fmt.Errorf("cannot create template in directory '%s' - already exists", dirname) - } - - targetDir := filepath.Join(t.templateDir.fullPath, dirname) - err := t.fs.MkDir(targetDir) - if err != nil { - return "", err - } - targetMetadata := filepath.Join(targetDir, t.metadataFilename) - err = t.fs.SaveAsJSON(details, targetMetadata) - - return targetDir, err -} - -// LoadMetadata loads the template's 'metadata.json' file -func (t *TemplateHelper) LoadMetadata(dir string) (*TemplateMetadata, error) { - templateFile := filepath.Join(dir, t.metadataFilename) - result := &TemplateMetadata{} - if !t.fs.FileExists(templateFile) { - return nil, nil - } - rawJSON, err := ioutil.ReadFile(templateFile) - if err != nil { - return nil, err - } - err = json.Unmarshal(rawJSON, &result) - return result, err -} - -// GetTemplateDetails returns a map of Template structs containing details -// of the found templates -func (t *TemplateHelper) GetTemplateDetails() (map[string]*TemplateDetails, error) { - - // Get the subdirectory details - templateDirs, err := t.templateDir.GetSubdirs() - if err != nil { - return nil, err - } - - result := make(map[string]*TemplateDetails) - - for name, dir := range templateDirs { - result[name] = &TemplateDetails{ - Path: dir, - } - metadata, err := t.LoadMetadata(dir) - if err != nil { - return nil, err - } - - result[name].Metadata = metadata - if metadata.Name != "" { - result[name].Name = metadata.Name - } else { - // Ignore bad templates? - result[name] = nil - } - } - - return result, nil -} - -// GetTemplateFilenames returns all the filenames of the given template -func (t *TemplateHelper) GetTemplateFilenames(template *TemplateDetails) (*slicer.StringSlicer, error) { - - // Get the subdirectory details - templateDir, err := t.fs.Directory(template.Path) - if err != nil { - return nil, err - } - return templateDir.GetAllFilenames() -} - -// InstallTemplate installs the template given in the project options to the -// project path given -func (t *TemplateHelper) InstallTemplate(projectPath string, projectOptions *ProjectOptions) error { - - // Check dependencies before installing - dependencies := projectOptions.selectedTemplate.Metadata.TemplateDependencies - if dependencies != nil { - programHelper := NewProgramHelper() - logger := NewLogger() - errors := []string{} - for _, dep := range dependencies { - program := programHelper.FindProgram(dep.Bin) - if program == nil { - errors = append(errors, dep.Help) - } - } - if len(errors) > 0 { - mainError := "template dependencies not installed" - if len(errors) == 1 { - mainError = errors[0] - } else { - for _, error := range errors { - logger.Red(error) - } - } - return fmt.Errorf(mainError) - } - } - - // Get template files - templateFilenames, err := t.GetTemplateFilenames(projectOptions.selectedTemplate) - if err != nil { - return err - } - - templatePath := projectOptions.selectedTemplate.Path - - // Save the version - projectOptions.WailsVersion = Version - - templateJSONFilename := filepath.Join(templatePath, t.metadataFilename) - - templateFiles := templateFilenames.Filter(func(filename string) bool { - filename = filepath.FromSlash(filename) - return strings.HasPrefix(filename, templatePath) && filename != templateJSONFilename - }) - - templateFiles.Each(func(templateFile string) { - - // Setup filenames - relativeFilename := strings.TrimPrefix(templateFile, templatePath)[1:] - targetFilename, err := filepath.Abs(filepath.Join(projectOptions.OutputDirectory, relativeFilename)) - if err != nil { - return - } - filedata, err := t.fs.LoadAsBytes(templateFile) - if err != nil { - return - } - - // If file is a template, process it - if strings.HasSuffix(templateFile, ".template") { - templateData := string(filedata) - tmpl := template.New(templateFile) - tmpl.Parse(templateData) - var tpl bytes.Buffer - err = tmpl.Execute(&tpl, projectOptions) - if err != nil { - return - } - - // Remove template suffix - targetFilename = strings.TrimSuffix(targetFilename, ".template") - - // Set the filedata to the template result - filedata = tpl.Bytes() - } - - // Normal file, just copy it - err = fs.CreateFile(targetFilename, filedata) - if err != nil { - return - } - }) - - if err != nil { - return err - } - - return nil -} diff --git a/vendor/github.com/wailsapp/wails/cmd/version.go b/vendor/github.com/wailsapp/wails/cmd/version.go deleted file mode 100644 index a8f5d3b..0000000 --- a/vendor/github.com/wailsapp/wails/cmd/version.go +++ /dev/null @@ -1,4 +0,0 @@ -package cmd - -// Version - Wails version -const Version = "v1.16.6" diff --git a/vendor/github.com/wailsapp/wails/cmd/windows.go b/vendor/github.com/wailsapp/wails/cmd/windows.go deleted file mode 100644 index 774730f..0000000 --- a/vendor/github.com/wailsapp/wails/cmd/windows.go +++ /dev/null @@ -1,19 +0,0 @@ -// +build windows - -package cmd - -import ( - "os" - - "golang.org/x/sys/windows" -) - -// Credit: https://stackoverflow.com/a/52579002 - -func init() { - stdout := windows.Handle(os.Stdout.Fd()) - var originalMode uint32 - - _ = windows.GetConsoleMode(stdout, &originalMode) - _ = windows.SetConsoleMode(stdout, originalMode|windows.ENABLE_VIRTUAL_TERMINAL_PROCESSING) -} diff --git a/vendor/github.com/wailsapp/wails/cmd/windres.bat b/vendor/github.com/wailsapp/wails/cmd/windres.bat deleted file mode 100644 index 1ce33a4..0000000 --- a/vendor/github.com/wailsapp/wails/cmd/windres.bat +++ /dev/null @@ -1 +0,0 @@ -windres.exe -o %1 %2 \ No newline at end of file diff --git a/vendor/github.com/wailsapp/wails/config.go b/vendor/github.com/wailsapp/wails/config.go deleted file mode 100644 index 3833dfd..0000000 --- a/vendor/github.com/wailsapp/wails/config.go +++ /dev/null @@ -1,210 +0,0 @@ -package wails - -import ( - "net/url" - "strings" - - "github.com/wailsapp/wails/runtime" -) - -// AppConfig is the configuration structure used when creating a Wails App object -type AppConfig struct { - // The width and height of your application in pixels - Width, Height int - - // The title to put in the title bar - Title string - - // The HTML your app should use. If you leave it blank, a default will be used: - //
- HTML string - - // The Javascript your app should use. Normally this should be generated by a bundler. - JS string - - // The CSS your app should use. Normally this should be generated by a bundler. - CSS string - - // The colour of your window. Can take "#fff", "rgb(255,255,255)", "rgba(255,255,255,1)" formats - Colour string - - // Indicates whether your app should be resizable - Resizable bool - - // Minimum width of a resizable window. If set, MinHeight should also be set. - MinWidth int - - // Minimum height of a resizable window. If set, MinWidth should also be set. - MinHeight int - - // Maximum width of a resizable window. If set, MaxHeight should also be set. - MaxWidth int - - // Maximum height of a resizable window. If set, MaxWidth should also be set. - MaxHeight int - - // Indicated if the devtools should be disabled - DisableInspector bool -} - -// GetWidth returns the desired width -func (a *AppConfig) GetWidth() int { - return a.Width -} - -// GetHeight returns the desired height -func (a *AppConfig) GetHeight() int { - return a.Height -} - -// GetTitle returns the desired window title -func (a *AppConfig) GetTitle() string { - return a.Title -} - -// GetHTML returns the default HTML -func (a *AppConfig) GetHTML() string { - if len(a.HTML) > 0 { - a.HTML = url.QueryEscape(a.HTML) - a.HTML = "data:text/html," + strings.ReplaceAll(a.HTML, "+", "%20") - a.HTML = strings.ReplaceAll(a.HTML, "%3D", "=") - } - return a.HTML -} - -// GetResizable returns true if the window should be resizable -func (a *AppConfig) GetResizable() bool { - return a.Resizable -} - -// GetMinWidth returns the minimum width of the window -func (a *AppConfig) GetMinWidth() int { - return a.MinWidth -} - -// GetMinHeight returns the minimum height of the window -func (a *AppConfig) GetMinHeight() int { - return a.MinHeight -} - -// GetMaxWidth returns the maximum width of the window -func (a *AppConfig) GetMaxWidth() int { - return a.MaxWidth -} - -// GetMaxHeight returns the maximum height of the window -func (a *AppConfig) GetMaxHeight() int { - return a.MaxHeight -} - -// GetDisableInspector returns true if the inspector should be disabled -func (a *AppConfig) GetDisableInspector() bool { - return a.DisableInspector -} - -// GetColour returns the colour -func (a *AppConfig) GetColour() string { - return a.Colour -} - -// GetCSS returns the user CSS -func (a *AppConfig) GetCSS() string { - return a.CSS -} - -// GetJS returns the user Javascript -func (a *AppConfig) GetJS() string { - return a.JS -} - -func (a *AppConfig) merge(in *AppConfig) error { - if in.CSS != "" { - a.CSS = in.CSS - } - if in.Title != "" { - a.Title = runtime.ProcessEncoding(in.Title) - } - - if in.Colour != "" { - a.Colour = in.Colour - } - - if in.HTML != "" { - a.HTML = in.HTML - } - - if in.JS != "" { - a.JS = in.JS - } - - if in.HTML != "" { - a.HTML = in.HTML - } - - if in.Width != 0 { - a.Width = in.Width - } - if in.Height != 0 { - a.Height = in.Height - } - - if in.MinWidth != 0 { - a.MinWidth = in.MinWidth - } - - if in.MinHeight != 0 { - a.MinHeight = in.MinHeight - } - - if in.MaxWidth != 0 { - a.MaxWidth = in.MaxWidth - } - - if in.MaxHeight != 0 { - a.MaxHeight = in.MaxHeight - } - - a.Resizable = in.Resizable - a.DisableInspector = in.DisableInspector - - return nil -} - -// Creates the default configuration -func newConfig(userConfig *AppConfig) (*AppConfig, error) { - result := &AppConfig{ - Width: 800, - Height: 600, - Resizable: true, - MinWidth: -1, - MinHeight: -1, - MaxWidth: -1, - MaxHeight: -1, - Title: "My Wails App", - Colour: "", - HTML: defaultHTML, - } - - if userConfig != nil { - err := result.merge(userConfig) - if err != nil { - return nil, err - } - } - - return result, nil -} - -var defaultHTML = ` - - - - - - - - -
- - -` diff --git a/vendor/github.com/wailsapp/wails/go.mod b/vendor/github.com/wailsapp/wails/go.mod deleted file mode 100644 index ff37b58..0000000 --- a/vendor/github.com/wailsapp/wails/go.mod +++ /dev/null @@ -1,30 +0,0 @@ -module github.com/wailsapp/wails - -require ( - github.com/Masterminds/semver v1.4.2 - github.com/abadojack/whatlanggo v1.0.1 - github.com/fatih/color v1.7.0 - github.com/go-playground/colors v1.2.0 - github.com/gorilla/websocket v1.4.0 - github.com/jackmordaunt/icns v1.0.0 - github.com/kennygrant/sanitize v1.2.4 - github.com/konsorten/go-windows-terminal-sequences v1.0.2 // indirect - github.com/leaanthony/slicer v1.4.0 - github.com/leaanthony/spinner v0.5.3 - github.com/mattn/go-colorable v0.1.1 // indirect - github.com/mattn/go-isatty v0.0.7 // indirect - github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 // indirect - github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4 - github.com/pkg/errors v0.8.1 // indirect - github.com/sirupsen/logrus v1.4.1 - github.com/stretchr/testify v1.3.0 // indirect - github.com/syossan27/tebata v0.0.0-20180602121909-b283fe4bc5ba - golang.org/x/image v0.0.0-20200430140353-33d19683fad8 - golang.org/x/net v0.0.0-20200625001655-4c5254603344 // indirect - golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd - golang.org/x/text v0.3.0 - gopkg.in/AlecAivazis/survey.v1 v1.8.4 - gopkg.in/yaml.v3 v3.0.0-20190709130402-674ba3eaed22 -) - -go 1.16 diff --git a/vendor/github.com/wailsapp/wails/go.sum b/vendor/github.com/wailsapp/wails/go.sum deleted file mode 100644 index 2c697c8..0000000 --- a/vendor/github.com/wailsapp/wails/go.sum +++ /dev/null @@ -1,88 +0,0 @@ -github.com/Masterminds/semver v1.4.2 h1:WBLTQ37jOCzSLtXNdoo8bNM8876KhNqOKvrlGITgsTc= -github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Netflix/go-expect v0.0.0-20180615182759-c93bf25de8e8 h1:xzYJEypr/85nBpB11F9br+3HUrpgb+fcm5iADzXXYEw= -github.com/Netflix/go-expect v0.0.0-20180615182759-c93bf25de8e8/go.mod h1:oX5x61PbNXchhh0oikYAH+4Pcfw5LKv21+Jnpr6r6Pc= -github.com/abadojack/whatlanggo v1.0.1 h1:19N6YogDnf71CTHm3Mp2qhYfkRdyvbgwWdd2EPxJRG4= -github.com/abadojack/whatlanggo v1.0.1/go.mod h1:66WiQbSbJBIlOZMsvbKe5m6pzQovxCH9B/K8tQB2uoc= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/go-playground/colors v1.2.0 h1:0EdjTXKrr2g1L/LQTYtIqabeHpZuGZz1U4osS1T8+5M= -github.com/go-playground/colors v1.2.0/go.mod h1:miw1R2JIE19cclPxsXqNdzLZsk4DP4iF+m88bRc7kfM= -github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/hinshun/vt10x v0.0.0-20180616224451-1954e6464174 h1:WlZsjVhE8Af9IcZDGgJGQpNflI3+MJSBhsgT5PCtzBQ= -github.com/hinshun/vt10x v0.0.0-20180616224451-1954e6464174/go.mod h1:DqJ97dSdRW1W22yXSB90986pcOyQ7r45iio1KN2ez1A= -github.com/jackmordaunt/icns v1.0.0 h1:RYSxplerf/l/DUd09AHtITwckkv/mqjVv4DjYdPmAMQ= -github.com/jackmordaunt/icns v1.0.0/go.mod h1:7TTQVEuGzVVfOPPlLNHJIkzA6CoV7aH1Dv9dW351oOo= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= -github.com/kennygrant/sanitize v1.2.4 h1:gN25/otpP5vAsO2djbMhF/LQX6R7+O1TB4yv8NzpJ3o= -github.com/kennygrant/sanitize v1.2.4/go.mod h1:LGsjYYtgxbetdg5owWB2mpgUL6e2nfw2eObZ0u0qvak= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/pty v1.1.1 h1:VkoXIwSboBpnk99O/KFauAEILuNHv5DVFKZMBN/gUgw= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/leaanthony/slicer v1.4.0 h1:Q9u4w+UBU4WHjXnEDdz+eRLMKF/rnyosRBiqULnc1J8= -github.com/leaanthony/slicer v1.4.0/go.mod h1:FwrApmf8gOrpzEWM2J/9Lh79tyq8KTX5AzRtwV7m4AY= -github.com/leaanthony/spinner v0.5.3 h1:IMTvgdQCec5QA4qRy0wil4XsRP+QcG1OwLWVK/LPZ5Y= -github.com/leaanthony/spinner v0.5.3/go.mod h1:oHlrvWicr++CVV7ALWYi+qHk/XNA91D9IJ48IqmpVUo= -github.com/leaanthony/synx v0.1.0 h1:R0lmg2w6VMb8XcotOwAe5DLyzwjLrskNkwU7LLWsyL8= -github.com/leaanthony/synx v0.1.0/go.mod h1:Iz7eybeeG8bdq640iR+CwYb8p+9EOsgMWghkSRyZcqs= -github.com/leaanthony/wincursor v0.1.0 h1:Dsyp68QcF5cCs65AMBmxoYNEm0n8K7mMchG6a8fYxf8= -github.com/leaanthony/wincursor v0.1.0/go.mod h1:7TVwwrzSH/2Y9gLOGH+VhA+bZhoWXBRgbGNTMk+yimE= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.1 h1:G1f5SKeVxmagw/IyvzvtZE4Gybcc4Tr1tf7I8z0XgOg= -github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.7 h1:UvyT9uN+3r7yLEYSlJsbQGdsaB/a0DlgWP3pql6iwOc= -github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4= -github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= -github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ= -github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= -github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4 h1:49lOXmGaUpV9Fz3gd7TFZY106KVlPVa5jcYD1gaQf98= -github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= -github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/sirupsen/logrus v1.4.1 h1:GL2rEmy6nsikmW0r8opw9JIRScdMF5hA8cOYLH7In1k= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/syossan27/tebata v0.0.0-20180602121909-b283fe4bc5ba h1:2DHfQOxcpWdGf5q5IzCUFPNvRX9Icf+09RvQK2VnJq0= -github.com/syossan27/tebata v0.0.0-20180602121909-b283fe4bc5ba/go.mod h1:iLnlXG2Pakcii2CU0cbY07DRCSvpWNa7nFxtevhOChk= -golang.org/x/crypto v0.0.0-20190123085648-057139ce5d2b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/image v0.0.0-20200430140353-33d19683fad8 h1:6WW6V3x1P/jokJBpRQYUJnMHRP6isStQwCozxnU7XQw= -golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20200625001655-4c5254603344 h1:vGXIOMxbNfDTk/aXCmfdLgkrSV+Z2tcbze+pEc3v5W4= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/sys v0.0.0-20180606202747-9527bec2660b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181228144115-9a3f9b0469bb/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd h1:xhmwyvizuTgC2qz7ZlMluP20uW+C3Rm0FD/WLDX8884= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -gopkg.in/AlecAivazis/survey.v1 v1.8.4 h1:10xXXN3wgIhPheb5NI58zFgZv32Ana7P3Tl4shW+0Qc= -gopkg.in/AlecAivazis/survey.v1 v1.8.4/go.mod h1:iBNOmqKz/NUbZx3bA+4hAGLRC7fSK7tgtVDT4tB22XA= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v3 v3.0.0-20190709130402-674ba3eaed22 h1:0efs3hwEZhFKsCoP8l6dDB1AZWMgnEl3yWXWRZTOaEA= -gopkg.in/yaml.v3 v3.0.0-20190709130402-674ba3eaed22/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/vendor/github.com/wailsapp/wails/jetbrains-grayscale.png b/vendor/github.com/wailsapp/wails/jetbrains-grayscale.png deleted file mode 100644 index c5bf0ab..0000000 Binary files a/vendor/github.com/wailsapp/wails/jetbrains-grayscale.png and /dev/null differ diff --git a/vendor/github.com/wailsapp/wails/lib/binding/function.go b/vendor/github.com/wailsapp/wails/lib/binding/function.go deleted file mode 100644 index 9a41f0e..0000000 --- a/vendor/github.com/wailsapp/wails/lib/binding/function.go +++ /dev/null @@ -1,170 +0,0 @@ -package binding - -import ( - "bytes" - "encoding/json" - "fmt" - "reflect" - "runtime" - "strings" - - "github.com/wailsapp/wails/lib/logger" -) - -type boundFunction struct { - fullName string - function reflect.Value - functionType reflect.Type - inputs []reflect.Type - returnTypes []reflect.Type - log *logger.CustomLogger - hasErrorReturnType bool -} - -// Creates a new bound function based on the given method + type -func newBoundFunction(object interface{}) (*boundFunction, error) { - - objectValue := reflect.ValueOf(object) - objectType := reflect.TypeOf(object) - - name := runtime.FuncForPC(objectValue.Pointer()).Name() - if strings.Contains(name, "/") { - parts := strings.Split(name, "/") - name = parts[len(parts)-1] - } - - result := &boundFunction{ - fullName: name, - function: objectValue, - functionType: objectType, - log: logger.NewCustomLogger(name), - } - - err := result.processParameters() - - return result, err -} - -func (b *boundFunction) processParameters() error { - - // Param processing - functionType := b.functionType - - // Input parameters - inputParamCount := functionType.NumIn() - if inputParamCount > 0 { - b.inputs = make([]reflect.Type, inputParamCount) - // We start at 1 as the first param is the struct - for index := 0; index < inputParamCount; index++ { - param := functionType.In(index) - name := param.Name() - kind := param.Kind() - b.inputs[index] = param - typ := param - index := index - b.log.DebugFields("Input param", logger.Fields{ - "index": index, - "name": name, - "kind": kind, - "typ": typ, - }) - } - } - - // Process return/output declarations - returnParamsCount := functionType.NumOut() - // Guard against bad number of return types - switch returnParamsCount { - case 0: - case 1: - // Check if it's an error type - param := functionType.Out(0) - paramName := param.Name() - if paramName == "error" { - b.hasErrorReturnType = true - } - // Save return type - b.returnTypes = append(b.returnTypes, param) - case 2: - // Check the second return type is an error - secondParam := functionType.Out(1) - secondParamName := secondParam.Name() - if secondParamName != "error" { - return fmt.Errorf("last return type of method '%s' must be an error (got %s)", b.fullName, secondParamName) - } - - // Check the second return type is an error - firstParam := functionType.Out(0) - firstParamName := firstParam.Name() - if firstParamName == "error" { - return fmt.Errorf("first return type of method '%s' must not be an error", b.fullName) - } - b.hasErrorReturnType = true - - // Save return types - b.returnTypes = append(b.returnTypes, firstParam) - b.returnTypes = append(b.returnTypes, secondParam) - - default: - return fmt.Errorf("cannot register method '%s' with %d return parameters. Please use up to 2", b.fullName, returnParamsCount) - } - - return nil -} - -// call the method with the given data -func (b *boundFunction) call(data string) ([]reflect.Value, error) { - - // The data will be an array of values so we will decode the - // input data into - var jsArgs []interface{} - d := json.NewDecoder(bytes.NewBufferString(data)) - // d.UseNumber() - err := d.Decode(&jsArgs) - if err != nil { - return nil, fmt.Errorf("Invalid data passed to method call: %s", err.Error()) - } - - // Check correct number of inputs - if len(jsArgs) != len(b.inputs) { - return nil, fmt.Errorf("Invalid number of parameters given to %s. Expected %d but got %d", b.fullName, len(b.inputs), len(jsArgs)) - } - - // Set up call - args := make([]reflect.Value, len(b.inputs)) - for index := 0; index < len(b.inputs); index++ { - - // Set the input values - value, err := b.setInputValue(index, b.inputs[index], jsArgs[index]) - if err != nil { - return nil, err - } - args[index] = value - } - b.log.Debugf("Unmarshalled Args: %+v\n", jsArgs) - b.log.Debugf("Converted Args: %+v\n", args) - results := b.function.Call(args) - - b.log.Debugf("results = %+v", results) - return results, nil -} - -// Attempts to set the method input for parameter with the given value -func (b *boundFunction) setInputValue(index int, typ reflect.Type, val interface{}) (result reflect.Value, err error) { - - // Catch type conversion panics thrown by convert - defer func() { - if r := recover(); r != nil { - // Modify error - err = fmt.Errorf("%s for parameter %d of function %s", r.(string)[23:], index+1, b.fullName) - } - }() - - // Translate javascript null values - if val == nil { - result = reflect.Zero(typ) - } else { - result = reflect.ValueOf(val).Convert(typ) - } - return result, err -} diff --git a/vendor/github.com/wailsapp/wails/lib/binding/internal.go b/vendor/github.com/wailsapp/wails/lib/binding/internal.go deleted file mode 100644 index ef6cf43..0000000 --- a/vendor/github.com/wailsapp/wails/lib/binding/internal.go +++ /dev/null @@ -1,71 +0,0 @@ -package binding - -import ( - "fmt" - "strings" - - "github.com/wailsapp/wails/lib/logger" - "github.com/wailsapp/wails/lib/messages" - "github.com/wailsapp/wails/runtime" -) - -type internalMethods struct { - log *logger.CustomLogger - browser *runtime.Browser -} - -func newInternalMethods() *internalMethods { - return &internalMethods{ - log: logger.NewCustomLogger("InternalCall"), - browser: runtime.NewBrowser(), - } -} - -func (i *internalMethods) processCall(callData *messages.CallData) (interface{}, error) { - if !strings.HasPrefix(callData.BindingName, ".wails.") { - return nil, fmt.Errorf("Invalid call signature '%s'", callData.BindingName) - } - - // Strip prefix - var splitCall = strings.Split(callData.BindingName, ".")[2:] - if len(splitCall) != 2 { - return nil, fmt.Errorf("Invalid call signature '%s'", callData.BindingName) - } - - group := splitCall[0] - switch group { - case "Browser": - return i.processBrowserCommand(splitCall[1], callData.Data) - default: - return nil, fmt.Errorf("Unknown internal command group '%s'", group) - } -} - -func (i *internalMethods) processBrowserCommand(command string, data interface{}) (interface{}, error) { - switch command { - case "OpenURL": - url := data.(string) - // Strip string quotes. Credit: https://stackoverflow.com/a/44222648 - if url[0] == '"' { - url = url[1:] - } - if i := len(url) - 1; url[i] == '"' { - url = url[:i] - } - i.log.Debugf("Calling Browser.OpenURL with '%s'", url) - return nil, i.browser.OpenURL(url) - case "OpenFile": - filename := data.(string) - // Strip string quotes. Credit: https://stackoverflow.com/a/44222648 - if filename[0] == '"' { - filename = filename[1:] - } - if i := len(filename) - 1; filename[i] == '"' { - filename = filename[:i] - } - i.log.Debugf("Calling Browser.OpenFile with '%s'", filename) - return nil, i.browser.OpenFile(filename) - default: - return nil, fmt.Errorf("Unknown Browser command '%s'", command) - } -} diff --git a/vendor/github.com/wailsapp/wails/lib/binding/manager.go b/vendor/github.com/wailsapp/wails/lib/binding/manager.go deleted file mode 100644 index e721fc2..0000000 --- a/vendor/github.com/wailsapp/wails/lib/binding/manager.go +++ /dev/null @@ -1,372 +0,0 @@ -package binding - -import ( - "fmt" - "io/ioutil" - "os" - "path/filepath" - "reflect" - "strings" - "unicode" - - "github.com/wailsapp/wails/lib/interfaces" - "github.com/wailsapp/wails/lib/logger" - "github.com/wailsapp/wails/lib/messages" -) - -var typescriptDefinitionFilename = "" - -// Manager handles method binding -type Manager struct { - methods map[string]*boundMethod - functions map[string]*boundFunction - internalMethods *internalMethods - initMethods []*boundMethod - shutdownMethods []*boundMethod - log *logger.CustomLogger - renderer interfaces.Renderer - runtime interfaces.Runtime // The runtime object to pass to bound structs - objectsToBind []interface{} - bindPackageNames bool // Package name should be considered when binding - structList map[string][]string // structList["mystruct"] = []string{"Method1", "Method2"} -} - -// NewManager creates a new Manager struct -func NewManager() interfaces.BindingManager { - - result := &Manager{ - methods: make(map[string]*boundMethod), - functions: make(map[string]*boundFunction), - log: logger.NewCustomLogger("Bind"), - internalMethods: newInternalMethods(), - structList: make(map[string][]string), - } - return result -} - -// BindPackageNames sets a flag to indicate package names should be considered when binding -func (b *Manager) BindPackageNames() { - b.bindPackageNames = true -} - -// Start the binding manager -func (b *Manager) Start(renderer interfaces.Renderer, runtime interfaces.Runtime) error { - b.log.Info("Starting") - b.renderer = renderer - b.runtime = runtime - err := b.initialise() - if err != nil { - b.log.Errorf("Binding error: %s", err.Error()) - return err - } - err = b.callWailsInitMethods() - return err -} - -func (b *Manager) initialise() error { - - var err error - // var binding *boundMethod - - b.log.Info("Binding Go Functions/Methods") - - // Create bindings for objects - for _, object := range b.objectsToBind { - - // Safeguard against nils - if object == nil { - return fmt.Errorf("attempted to bind nil object") - } - - // Determine kind of object - objectType := reflect.TypeOf(object) - objectKind := objectType.Kind() - - switch objectKind { - case reflect.Ptr: - err = b.bindMethod(object) - case reflect.Func: - // spew.Dump(result.objectType.String()) - err = b.bindFunction(object) - default: - err = fmt.Errorf("cannot bind object of type '%s'", objectKind.String()) - } - - // Return error if set - if err != nil { - return err - } - } - - // If we wish to generate a typescript definition file... - if typescriptDefinitionFilename != "" { - err := b.generateTypescriptDefinitions() - if err != nil { - return err - } - } - return nil -} - -// Generate typescript -func (b *Manager) generateTypescriptDefinitions() error { - - var output strings.Builder - - for structname, methodList := range b.structList { - structname = strings.SplitN(structname, ".", 2)[1] - output.WriteString(fmt.Sprintf("interface %s {\n", structname)) - for _, method := range methodList { - output.WriteString(fmt.Sprintf("\t%s(...args : any[]):Promise\n", method)) - } - output.WriteString("}\n") - } - - output.WriteString("\n") - output.WriteString("interface Backend {\n") - - for structname := range b.structList { - structname = strings.SplitN(structname, ".", 2)[1] - output.WriteString(fmt.Sprintf("\t%[1]s: %[1]s\n", structname)) - } - output.WriteString("}\n") - - globals := ` -declare global { - interface Window { - backend: Backend; - } -} -export {};` - output.WriteString(globals) - - b.log.Info("Written Typescript file: " + typescriptDefinitionFilename) - - dir := filepath.Dir(typescriptDefinitionFilename) - os.MkdirAll(dir, 0755) - return ioutil.WriteFile(typescriptDefinitionFilename, []byte(output.String()), 0755) -} - -// bind the given struct method -func (b *Manager) bindMethod(object interface{}) error { - - objectType := reflect.TypeOf(object) - baseName := objectType.String() - - // Strip pointer if there - if baseName[0] == '*' { - baseName = baseName[1:] - } - - b.log.Debugf("Processing struct: %s", baseName) - - // Calc actual name - actualName := strings.TrimPrefix(baseName, "main.") - if b.structList[actualName] == nil { - b.structList[actualName] = []string{} - } - - // Iterate over method definitions - for i := 0; i < objectType.NumMethod(); i++ { - - // Get method definition - methodDef := objectType.Method(i) - methodName := methodDef.Name - fullMethodName := baseName + "." + methodName - method := reflect.ValueOf(object).MethodByName(methodName) - - b.structList[actualName] = append(b.structList[actualName], methodName) - - // Skip unexported methods - if !unicode.IsUpper([]rune(methodName)[0]) { - continue - } - - // Create a new boundMethod - newMethod, err := newBoundMethod(methodName, fullMethodName, method, objectType) - if err != nil { - return err - } - - // Check if it's a wails init function - if newMethod.isWailsInit { - b.log.Debugf("Detected WailsInit function: %s", fullMethodName) - b.initMethods = append(b.initMethods, newMethod) - } else if newMethod.isWailsShutdown { - b.log.Debugf("Detected WailsShutdown function: %s", fullMethodName) - b.shutdownMethods = append(b.shutdownMethods, newMethod) - } else { - // Save boundMethod - b.log.Infof("Bound Method: %s()", fullMethodName) - b.methods[fullMethodName] = newMethod - - // Inform renderer of new binding - b.renderer.NewBinding(fullMethodName) - } - } - - return nil -} - -// bind the given function object -func (b *Manager) bindFunction(object interface{}) error { - - newFunction, err := newBoundFunction(object) - if err != nil { - return err - } - - // Save method - b.log.Infof("Bound Function: %s()", newFunction.fullName) - b.functions[newFunction.fullName] = newFunction - - // Register with Renderer - b.renderer.NewBinding(newFunction.fullName) - - return nil -} - -// Bind saves the given object to be bound at start time -func (b *Manager) Bind(object interface{}) { - // Store binding - b.objectsToBind = append(b.objectsToBind, object) -} - -func (b *Manager) processInternalCall(callData *messages.CallData) (interface{}, error) { - // Strip prefix - return b.internalMethods.processCall(callData) -} - -func (b *Manager) processFunctionCall(callData *messages.CallData) (interface{}, error) { - // Return values - var result []reflect.Value - var err error - - function := b.functions[callData.BindingName] - if function == nil { - return nil, fmt.Errorf("Invalid function name '%s'", callData.BindingName) - } - result, err = function.call(callData.Data) - if err != nil { - return nil, err - } - - // Do we have an error return type? - if function.hasErrorReturnType { - // We do - last result is an error type - // Check if the last result was nil - b.log.Debugf("# of return types: %d", len(function.returnTypes)) - b.log.Debugf("# of results: %d", len(result)) - errorResult := result[len(function.returnTypes)-1] - if !errorResult.IsNil() { - // It wasn't - we have an error - return nil, errorResult.Interface().(error) - } - } - // fmt.Printf("result = '%+v'\n", result) - if len(result) > 0 { - return result[0].Interface(), nil - } - return nil, nil -} - -func (b *Manager) processMethodCall(callData *messages.CallData) (interface{}, error) { - // Return values - var result []reflect.Value - var err error - - // do we have this method? - method := b.methods[callData.BindingName] - if method == nil { - return nil, fmt.Errorf("Invalid method name '%s'", callData.BindingName) - } - - result, err = method.call(callData.Data) - if err != nil { - return nil, err - } - - // Do we have an error return type? - if method.hasErrorReturnType { - // We do - last result is an error type - // Check if the last result was nil - b.log.Debugf("# of return types: %d", len(method.returnTypes)) - b.log.Debugf("# of results: %d", len(result)) - errorResult := result[len(method.returnTypes)-1] - if !errorResult.IsNil() { - // It wasn't - we have an error - return nil, errorResult.Interface().(error) - } - } - if result != nil { - return result[0].Interface(), nil - } - return nil, nil -} - -// ProcessCall processes the given call request -func (b *Manager) ProcessCall(callData *messages.CallData) (result interface{}, err error) { - b.log.Debugf("Wanting to call %s", callData.BindingName) - - // Determine if this is function call or method call by the number of - // dots in the binding name - dotCount := 0 - for _, character := range callData.BindingName { - if character == '.' { - dotCount++ - } - } - - // We need to catch reflect related panics and return - // a decent error message - // TODO: DEBUG THIS! - - defer func() { - if r := recover(); r != nil { - err = fmt.Errorf("%s", r.(string)) - } - }() - - switch dotCount { - case 1: - result, err = b.processFunctionCall(callData) - case 2: - result, err = b.processMethodCall(callData) - case 3: - result, err = b.processInternalCall(callData) - default: - result = nil - err = fmt.Errorf("Invalid binding name '%s'", callData.BindingName) - } - return -} - -// callWailsInitMethods calls all of the WailsInit methods that were -// registered with the runtime object -func (b *Manager) callWailsInitMethods() error { - // Create reflect value for runtime object - runtimeValue := reflect.ValueOf(b.runtime) - params := []reflect.Value{runtimeValue} - - // Iterate initMethods - for _, initMethod := range b.initMethods { - // Call - result := initMethod.method.Call(params) - // Check errors - err := result[0].Interface() - if err != nil { - return err.(error) - } - } - return nil -} - -// Shutdown the binding manager -func (b *Manager) Shutdown() { - b.log.Debug("Shutdown called") - for _, method := range b.shutdownMethods { - b.log.Debugf("Calling Shutdown for method: %s", method.fullName) - method.call("[]") - } - b.log.Debug("Shutdown complete") -} diff --git a/vendor/github.com/wailsapp/wails/lib/binding/method.go b/vendor/github.com/wailsapp/wails/lib/binding/method.go deleted file mode 100644 index 9a0a326..0000000 --- a/vendor/github.com/wailsapp/wails/lib/binding/method.go +++ /dev/null @@ -1,236 +0,0 @@ -package binding - -import ( - "bytes" - "encoding/json" - "fmt" - "reflect" - - "github.com/wailsapp/wails/lib/logger" -) - -type boundMethod struct { - Name string - fullName string - method reflect.Value - inputs []reflect.Type - returnTypes []reflect.Type - log *logger.CustomLogger - hasErrorReturnType bool // Indicates if there is an error return type - isWailsInit bool - isWailsShutdown bool -} - -// Creates a new bound method based on the given method + type -func newBoundMethod(name string, fullName string, method reflect.Value, objectType reflect.Type) (*boundMethod, error) { - result := &boundMethod{ - Name: name, - method: method, - fullName: fullName, - } - - // Setup logger - result.log = logger.NewCustomLogger(result.fullName) - - // Check if Parameters are valid - err := result.processParameters() - - // Are we a WailsInit method? - if result.Name == "WailsInit" { - err = result.processWailsInit() - } - - // Are we a WailsShutdown method? - if result.Name == "WailsShutdown" { - err = result.processWailsShutdown() - } - - return result, err -} - -func (b *boundMethod) processParameters() error { - - // Param processing - methodType := b.method.Type() - - // Input parameters - inputParamCount := methodType.NumIn() - if inputParamCount > 0 { - b.inputs = make([]reflect.Type, inputParamCount) - // We start at 1 as the first param is the struct - for index := 0; index < inputParamCount; index++ { - param := methodType.In(index) - name := param.Name() - kind := param.Kind() - b.inputs[index] = param - typ := param - index := index - b.log.DebugFields("Input param", logger.Fields{ - "index": index, - "name": name, - "kind": kind, - "typ": typ, - }) - } - } - - // Process return/output declarations - returnParamsCount := methodType.NumOut() - // Guard against bad number of return types - switch returnParamsCount { - case 0: - case 1: - // Check if it's an error type - param := methodType.Out(0) - paramName := param.Name() - if paramName == "error" { - b.hasErrorReturnType = true - } - // Save return type - b.returnTypes = append(b.returnTypes, param) - case 2: - // Check the second return type is an error - secondParam := methodType.Out(1) - secondParamName := secondParam.Name() - if secondParamName != "error" { - return fmt.Errorf("last return type of method '%s' must be an error (got %s)", b.Name, secondParamName) - } - - // Check the second return type is an error - firstParam := methodType.Out(0) - firstParamName := firstParam.Name() - if firstParamName == "error" { - return fmt.Errorf("first return type of method '%s' must not be an error", b.Name) - } - b.hasErrorReturnType = true - - // Save return types - b.returnTypes = append(b.returnTypes, firstParam) - b.returnTypes = append(b.returnTypes, secondParam) - - default: - return fmt.Errorf("cannot register method '%s' with %d return parameters. Please use up to 2", b.Name, returnParamsCount) - } - - return nil -} - -// call the method with the given data -func (b *boundMethod) call(data string) ([]reflect.Value, error) { - - // The data will be an array of values so we will decode the - // input data into - var jsArgs []interface{} - d := json.NewDecoder(bytes.NewBufferString(data)) - // d.UseNumber() - err := d.Decode(&jsArgs) - if err != nil { - return nil, fmt.Errorf("Invalid data passed to method call: %s", err.Error()) - } - - // Check correct number of inputs - if len(jsArgs) != len(b.inputs) { - return nil, fmt.Errorf("Invalid number of parameters given to %s. Expected %d but got %d", b.fullName, len(b.inputs), len(jsArgs)) - } - - // Set up call - args := make([]reflect.Value, len(b.inputs)) - for index := 0; index < len(b.inputs); index++ { - - // Set the input values - value, err := b.setInputValue(index, b.inputs[index], jsArgs[index]) - if err != nil { - return nil, err - } - args[index] = value - } - b.log.Debugf("Unmarshalled Args: %+v\n", jsArgs) - b.log.Debugf("Converted Args: %+v\n", args) - results := b.method.Call(args) - - b.log.Debugf("results = %+v", results) - return results, nil -} - -// Attempts to set the method input for parameter with the given value -func (b *boundMethod) setInputValue(index int, typ reflect.Type, val interface{}) (result reflect.Value, err error) { - - // Catch type conversion panics thrown by convert - defer func() { - if r := recover(); r != nil { - // Modify error - fmt.Printf("Recovery message: %+v\n", r) - err = fmt.Errorf("%s for parameter %d of method %s", r.(string)[23:], index+1, b.fullName) - } - }() - - // Do the conversion - // Handle nil values - if val == nil { - switch typ.Kind() { - case reflect.Chan, - reflect.Func, - reflect.Interface, - reflect.Map, - reflect.Ptr, - reflect.Slice: - b.log.Debug("Converting nil to type") - result = reflect.ValueOf(val).Convert(typ) - default: - b.log.Debug("Cannot convert nil to type, returning error") - return reflect.Zero(typ), fmt.Errorf("Unable to use null value for parameter %d of method %s", index+1, b.fullName) - } - } else { - result = reflect.ValueOf(val).Convert(typ) - } - - return result, err -} - -func (b *boundMethod) processWailsInit() error { - // We must have only 1 input, it must be *wails.Runtime - if len(b.inputs) != 1 { - return fmt.Errorf("Invalid WailsInit() definition. Expected 1 input, but got %d", len(b.inputs)) - } - - // It must be *wails.Runtime - inputName := b.inputs[0].String() - b.log.Debugf("WailsInit input type: %s", inputName) - if inputName != "*runtime.Runtime" { - return fmt.Errorf("Invalid WailsInit() definition. Expected input to be wails.Runtime, but got %s", inputName) - } - - // We must have only 1 output, it must be error - if len(b.returnTypes) != 1 { - return fmt.Errorf("Invalid WailsInit() definition. Expected 1 return type, but got %d", len(b.returnTypes)) - } - - // It must be *wails.Runtime - outputName := b.returnTypes[0].String() - b.log.Debugf("WailsInit output type: %s", outputName) - if outputName != "error" { - return fmt.Errorf("Invalid WailsInit() definition. Expected input to be error, but got %s", outputName) - } - - // We are indeed a wails Init method - b.isWailsInit = true - - return nil -} - -func (b *boundMethod) processWailsShutdown() error { - // We must not have any inputs - if len(b.inputs) != 0 { - return fmt.Errorf("Invalid WailsShutdown() definition. Expected 0 inputs, but got %d", len(b.inputs)) - } - - // We must have only 1 output, it must be error - if len(b.returnTypes) != 0 { - return fmt.Errorf("Invalid WailsShutdown() definition. Expected 0 return types, but got %d", len(b.returnTypes)) - } - - // We are indeed a wails Shutdown method - b.isWailsShutdown = true - - return nil -} diff --git a/vendor/github.com/wailsapp/wails/lib/event/manager.go b/vendor/github.com/wailsapp/wails/lib/event/manager.go deleted file mode 100644 index 23e4f31..0000000 --- a/vendor/github.com/wailsapp/wails/lib/event/manager.go +++ /dev/null @@ -1,180 +0,0 @@ -package event - -import ( - "fmt" - "sync" - - "github.com/wailsapp/wails/lib/interfaces" - "github.com/wailsapp/wails/lib/logger" - "github.com/wailsapp/wails/lib/messages" -) - -// Manager handles and processes events -type Manager struct { - incomingEvents chan *messages.EventData - quitChannel chan struct{} - listeners map[string][]*eventListener - running bool - log *logger.CustomLogger - renderer interfaces.Renderer // Messages will be dispatched to the frontend - wg sync.WaitGroup - mu sync.Mutex -} - -// NewManager creates a new event manager with a 100 event buffer -func NewManager() interfaces.EventManager { - return &Manager{ - incomingEvents: make(chan *messages.EventData, 100), - quitChannel: make(chan struct{}, 1), - listeners: make(map[string][]*eventListener), - running: false, - log: logger.NewCustomLogger("Events"), - } -} - -// PushEvent places the given event on to the event queue -func (e *Manager) PushEvent(eventData *messages.EventData) { - e.incomingEvents <- eventData -} - -// eventListener holds a callback function which is invoked when -// the event listened for is emitted. It has a counter which indicates -// how the total number of events it is interested in. A value of zero -// means it does not expire (default). -type eventListener struct { - callback func(...interface{}) // Function to call with emitted event data - counter uint // Expire after counter callbacks. 0 = infinite - expired bool // Indicates if the listener has expired -} - -// Creates a new event listener from the given callback function -func (e *Manager) addEventListener(eventName string, callback func(...interface{}), counter uint) error { - - // Sanity check inputs - if callback == nil { - return fmt.Errorf("nil callback bassed to addEventListener") - } - - // Check event has been registered before - if e.listeners[eventName] == nil { - e.listeners[eventName] = []*eventListener{} - } - - // Create the callback - listener := &eventListener{ - callback: callback, - counter: counter, - } - - // Register listener - e.listeners[eventName] = append(e.listeners[eventName], listener) - - // All good mate - return nil -} - -// On adds a listener for the given event -func (e *Manager) On(eventName string, callback func(...interface{})) { - // Add a persistent eventListener (counter = 0) - err := e.addEventListener(eventName, callback, 0) - if err != nil { - e.log.Error(err.Error()) - } -} - -// Once adds a listener for the given event that will auto remove -// after one callback -func (e *Manager) Once(eventName string, callback func(...interface{})) { - // Add a persistent eventListener (counter = 0) - err := e.addEventListener(eventName, callback, 1) - if err != nil { - e.log.Error(err.Error()) - } -} - -// OnMultiple adds a listener for the given event that will trigger -// at most times. -func (e *Manager) OnMultiple(eventName string, callback func(...interface{}), counter uint) { - // Add a persistent eventListener (counter = 0) - err := e.addEventListener(eventName, callback, counter) - if err != nil { - e.log.Error(err.Error()) - } -} - -// Emit broadcasts the given event to the subscribed listeners -func (e *Manager) Emit(eventName string, optionalData ...interface{}) { - e.incomingEvents <- &messages.EventData{Name: eventName, Data: optionalData} -} - -// Start the event manager's queue processing -func (e *Manager) Start(renderer interfaces.Renderer) { - - e.log.Info("Starting") - - // Store renderer - e.renderer = renderer - - // Set up waitgroup so we can wait for goroutine to quit - e.running = true - e.wg.Add(1) - - // Run main loop in separate goroutine - go func() { - e.log.Info("Listening") - for e.running { - // TODO: Listen for application exit - select { - case event := <-e.incomingEvents: - e.log.DebugFields("Got Event", logger.Fields{ - "data": event.Data, - "name": event.Name, - }) - - // Notify renderer - err := e.renderer.NotifyEvent(event) - if err != nil { - e.log.Error(err.Error()) - } - - e.mu.Lock() - - // Iterate listeners - for _, listener := range e.listeners[event.Name] { - - if !listener.expired { - // Call listener, perhaps with data - if event.Data == nil { - go listener.callback() - } else { - unpacked := event.Data.([]interface{}) - go listener.callback(unpacked...) - } - } - - // Update listen counter - if listener.counter > 0 { - listener.counter = listener.counter - 1 - if listener.counter == 0 { - listener.expired = true - } - } - } - - e.mu.Unlock() - - case <-e.quitChannel: - e.running = false - } - } - e.wg.Done() - }() -} - -// Shutdown is called when exiting the Application -func (e *Manager) Shutdown() { - e.log.Debug("Shutting Down") - e.quitChannel <- struct{}{} - e.log.Debug("Waiting for main loop to exit") - e.wg.Wait() -} diff --git a/vendor/github.com/wailsapp/wails/lib/interfaces/appconfig.go b/vendor/github.com/wailsapp/wails/lib/interfaces/appconfig.go deleted file mode 100644 index 2feb157..0000000 --- a/vendor/github.com/wailsapp/wails/lib/interfaces/appconfig.go +++ /dev/null @@ -1,18 +0,0 @@ -package interfaces - -// AppConfig is the application config interface -type AppConfig interface { - GetWidth() int - GetHeight() int - GetTitle() string - GetMinWidth() int - GetMinHeight() int - GetMaxWidth() int - GetMaxHeight() int - GetResizable() bool - GetHTML() string - GetDisableInspector() bool - GetColour() string - GetCSS() string - GetJS() string -} diff --git a/vendor/github.com/wailsapp/wails/lib/interfaces/bindingmanager.go b/vendor/github.com/wailsapp/wails/lib/interfaces/bindingmanager.go deleted file mode 100644 index e145d3b..0000000 --- a/vendor/github.com/wailsapp/wails/lib/interfaces/bindingmanager.go +++ /dev/null @@ -1,11 +0,0 @@ -package interfaces - -import "github.com/wailsapp/wails/lib/messages" - -// BindingManager is the binding manager interface -type BindingManager interface { - Bind(object interface{}) - Start(renderer Renderer, runtime Runtime) error - ProcessCall(callData *messages.CallData) (result interface{}, err error) - Shutdown() -} diff --git a/vendor/github.com/wailsapp/wails/lib/interfaces/eventmanager.go b/vendor/github.com/wailsapp/wails/lib/interfaces/eventmanager.go deleted file mode 100644 index 4805ee2..0000000 --- a/vendor/github.com/wailsapp/wails/lib/interfaces/eventmanager.go +++ /dev/null @@ -1,14 +0,0 @@ -package interfaces - -import "github.com/wailsapp/wails/lib/messages" - -// EventManager is the event manager interface -type EventManager interface { - PushEvent(*messages.EventData) - Emit(eventName string, optionalData ...interface{}) - OnMultiple(eventName string, callback func(...interface{}), counter uint) - Once(eventName string, callback func(...interface{})) - On(eventName string, callback func(...interface{})) - Start(Renderer) - Shutdown() -} diff --git a/vendor/github.com/wailsapp/wails/lib/interfaces/ipcmanager.go b/vendor/github.com/wailsapp/wails/lib/interfaces/ipcmanager.go deleted file mode 100644 index bc6a3cc..0000000 --- a/vendor/github.com/wailsapp/wails/lib/interfaces/ipcmanager.go +++ /dev/null @@ -1,13 +0,0 @@ -package interfaces - -// CallbackFunc defines the signature of a function required to be provided to the -// Dispatch function so that the response may be returned -type CallbackFunc func(string) error - -// IPCManager is the event manager interface -type IPCManager interface { - BindRenderer(Renderer) - Dispatch(message string, f CallbackFunc) - Start(eventManager EventManager, bindingManager BindingManager) - Shutdown() -} diff --git a/vendor/github.com/wailsapp/wails/lib/interfaces/renderer.go b/vendor/github.com/wailsapp/wails/lib/interfaces/renderer.go deleted file mode 100644 index 8f5dbfb..0000000 --- a/vendor/github.com/wailsapp/wails/lib/interfaces/renderer.go +++ /dev/null @@ -1,33 +0,0 @@ -package interfaces - -import ( - "github.com/wailsapp/wails/lib/messages" -) - -// Renderer is an interface describing a Wails target to render the app to -type Renderer interface { - Initialise(AppConfig, IPCManager, EventManager) error - Run() error - - // Binding - NewBinding(bindingName string) error - - // Events - NotifyEvent(eventData *messages.EventData) error - - // Dialog Runtime - SelectFile(title string, filter string) string - SelectDirectory() string - SelectSaveFile(title string, filter string) string - - // Window Runtime - SetColour(string) error - - SetMinSize(width, height int) - SetMaxSize(width, height int) - - Fullscreen() - UnFullscreen() - SetTitle(title string) - Close() -} diff --git a/vendor/github.com/wailsapp/wails/lib/interfaces/runtime.go b/vendor/github.com/wailsapp/wails/lib/interfaces/runtime.go deleted file mode 100644 index dfc0e6b..0000000 --- a/vendor/github.com/wailsapp/wails/lib/interfaces/runtime.go +++ /dev/null @@ -1,4 +0,0 @@ -package interfaces - -// Runtime interface -type Runtime interface{} diff --git a/vendor/github.com/wailsapp/wails/lib/ipc/call.go b/vendor/github.com/wailsapp/wails/lib/ipc/call.go deleted file mode 100644 index f332e74..0000000 --- a/vendor/github.com/wailsapp/wails/lib/ipc/call.go +++ /dev/null @@ -1,35 +0,0 @@ -package ipc - -import ( - "fmt" - - "github.com/wailsapp/wails/lib/messages" -) - -func init() { - messageProcessors["call"] = processCallData -} - -func processCallData(message *ipcMessage) (*ipcMessage, error) { - - var payload messages.CallData - - // Decode binding call data - payloadMap := message.Payload.(map[string]interface{}) - - // Check for binding name - if payloadMap["bindingName"] == nil { - return nil, fmt.Errorf("bindingName not given in call") - } - payload.BindingName = payloadMap["bindingName"].(string) - - // Check for data - if payloadMap["data"] != nil { - payload.Data = payloadMap["data"].(string) - } - - // Reassign payload to decoded data - message.Payload = &payload - - return message, nil -} diff --git a/vendor/github.com/wailsapp/wails/lib/ipc/event.go b/vendor/github.com/wailsapp/wails/lib/ipc/event.go deleted file mode 100644 index 9dc9b1a..0000000 --- a/vendor/github.com/wailsapp/wails/lib/ipc/event.go +++ /dev/null @@ -1,37 +0,0 @@ -package ipc - -import ( - "encoding/json" - - "github.com/wailsapp/wails/lib/messages" -) - -// Register the message handler -func init() { - messageProcessors["event"] = processEventData -} - -// This processes the given event message -func processEventData(message *ipcMessage) (*ipcMessage, error) { - - // TODO: Is it worth double checking this is actually an event message, - // even though that's done by the caller? - var payload messages.EventData - - // Decode event data - payloadMap := message.Payload.(map[string]interface{}) - payload.Name = payloadMap["name"].(string) - - // decode the payload data - var data []interface{} - err := json.Unmarshal([]byte(payloadMap["data"].(string)), &data) - if err != nil { - return nil, err - } - payload.Data = data - - // Reassign payload to decoded data - message.Payload = &payload - - return message, nil -} diff --git a/vendor/github.com/wailsapp/wails/lib/ipc/log.go b/vendor/github.com/wailsapp/wails/lib/ipc/log.go deleted file mode 100644 index 4bf75a9..0000000 --- a/vendor/github.com/wailsapp/wails/lib/ipc/log.go +++ /dev/null @@ -1,24 +0,0 @@ -package ipc - -import "github.com/wailsapp/wails/lib/messages" - -// Register the message handler -func init() { - messageProcessors["log"] = processLogData -} - -// This processes the given log message -func processLogData(message *ipcMessage) (*ipcMessage, error) { - - var payload messages.LogData - - // Decode event data - payloadMap := message.Payload.(map[string]interface{}) - payload.Level = payloadMap["level"].(string) - payload.Message = payloadMap["message"].(string) - - // Reassign payload to decoded data - message.Payload = &payload - - return message, nil -} diff --git a/vendor/github.com/wailsapp/wails/lib/ipc/manager.go b/vendor/github.com/wailsapp/wails/lib/ipc/manager.go deleted file mode 100644 index 8cff6e3..0000000 --- a/vendor/github.com/wailsapp/wails/lib/ipc/manager.go +++ /dev/null @@ -1,182 +0,0 @@ -package ipc - -import ( - "fmt" - "sync" - - "github.com/wailsapp/wails/lib/interfaces" - "github.com/wailsapp/wails/lib/logger" - "github.com/wailsapp/wails/lib/messages" -) - -// Manager manages the IPC subsystem -type Manager struct { - renderer interfaces.Renderer // The renderer - messageQueue chan *ipcMessage - quitChannel chan struct{} - // signals chan os.Signal - log *logger.CustomLogger - eventManager interfaces.EventManager - bindingManager interfaces.BindingManager - running bool - wg sync.WaitGroup -} - -// NewManager creates a new IPC Manager -func NewManager() interfaces.IPCManager { - result := &Manager{ - messageQueue: make(chan *ipcMessage, 100), - quitChannel: make(chan struct{}), - // signals: make(chan os.Signal, 1), - log: logger.NewCustomLogger("IPC"), - } - return result -} - -// BindRenderer sets the renderer, returns the dispatch function -func (i *Manager) BindRenderer(renderer interfaces.Renderer) { - i.renderer = renderer -} - -// Start the IPC Manager -func (i *Manager) Start(eventManager interfaces.EventManager, bindingManager interfaces.BindingManager) { - - // Store manager references - i.eventManager = eventManager - i.bindingManager = bindingManager - - i.log.Info("Starting") - // signal.Notify(manager.signals, os.Interrupt) - i.running = true - - // Keep track of this goroutine - i.wg.Add(1) - go func() { - for i.running { - select { - case incomingMessage := <-i.messageQueue: - i.log.DebugFields("Processing message", logger.Fields{ - "1D": &incomingMessage, - }) - switch incomingMessage.Type { - case "call": - callData := incomingMessage.Payload.(*messages.CallData) - i.log.DebugFields("Processing call", logger.Fields{ - "1D": &incomingMessage, - "bindingName": callData.BindingName, - "data": callData.Data, - }) - go func() { - result, err := bindingManager.ProcessCall(callData) - i.log.DebugFields("processed call", logger.Fields{"result": result, "err": err}) - if err != nil { - incomingMessage.ReturnError(err.Error()) - } else { - incomingMessage.ReturnSuccess(result) - } - i.log.DebugFields("Finished processing call", logger.Fields{ - "1D": &incomingMessage, - }) - }() - case "event": - - // Extract event data - eventData := incomingMessage.Payload.(*messages.EventData) - - // Log - i.log.DebugFields("Processing event", logger.Fields{ - "name": eventData.Name, - "data": eventData.Data, - }) - - // Push the event to the event manager - i.eventManager.PushEvent(eventData) - - // Log - i.log.DebugFields("Finished processing event", logger.Fields{ - "name": eventData.Name, - }) - case "log": - logdata := incomingMessage.Payload.(*messages.LogData) - switch logdata.Level { - case "info": - logger.GlobalLogger.Info(logdata.Message) - case "debug": - logger.GlobalLogger.Debug(logdata.Message) - case "warning": - logger.GlobalLogger.Warn(logdata.Message) - case "error": - logger.GlobalLogger.Error(logdata.Message) - case "fatal": - logger.GlobalLogger.Fatal(logdata.Message) - default: - logger.ErrorFields("Invalid log level sent", logger.Fields{ - "level": logdata.Level, - "message": logdata.Message, - }) - } - default: - i.log.Debugf("bad message sent to MessageQueue! Unknown type: %s", incomingMessage.Type) - } - - // Log - i.log.DebugFields("Finished processing message", logger.Fields{ - "1D": &incomingMessage, - }) - case <-i.quitChannel: - i.running = false - } - } - i.log.Debug("Stopping") - i.wg.Done() - }() -} - -// Dispatch receives JSON encoded messages from the renderer. -// It processes the message to ensure that it is valid and places -// the processed message on the message queue -func (i *Manager) Dispatch(message string, cb interfaces.CallbackFunc) { - - // Create a new IPC Message - incomingMessage, err := newIPCMessage(message, i.SendResponse(cb)) - if err != nil { - i.log.ErrorFields("Could not understand incoming message! ", map[string]interface{}{ - "message": message, - "error": err, - }) - return - } - - // Put message on queue - i.log.DebugFields("Message received", map[string]interface{}{ - "type": incomingMessage.Type, - "payload": incomingMessage.Payload, - }) - - // Put incoming message on the message queue - i.messageQueue <- incomingMessage -} - -// SendResponse sends the given response back to the frontend -// It sends the data back to the correct renderer by way of the provided callback function -func (i *Manager) SendResponse(cb interfaces.CallbackFunc) func(i *ipcResponse) error { - - return func(response *ipcResponse) error { - // Serialise the Message - data, err := response.Serialise() - if err != nil { - fmt.Printf(err.Error()) - return err - } - return cb(data) - } - -} - -// Shutdown is called when exiting the Application -func (i *Manager) Shutdown() { - i.log.Debug("Shutdown called") - i.quitChannel <- struct{}{} - i.log.Debug("Waiting of main loop shutdown") - i.wg.Wait() -} diff --git a/vendor/github.com/wailsapp/wails/lib/ipc/message.go b/vendor/github.com/wailsapp/wails/lib/ipc/message.go deleted file mode 100644 index 8c09ab9..0000000 --- a/vendor/github.com/wailsapp/wails/lib/ipc/message.go +++ /dev/null @@ -1,93 +0,0 @@ -package ipc - -import ( - "encoding/json" - "fmt" -) - -// Message handler -type messageProcessorFunc func(*ipcMessage) (*ipcMessage, error) - -var messageProcessors = make(map[string]messageProcessorFunc) - -// ipcMessage is the struct version of the Message sent from the frontend. -// The payload has the specialised message data -type ipcMessage struct { - Type string `json:"type"` - Payload interface{} `json:"payload"` - CallbackID string `json:"callbackid,omitempty"` - sendResponse func(*ipcResponse) error -} - -func parseMessage(incomingMessage string) (*ipcMessage, error) { - // Parse message - var message ipcMessage - err := json.Unmarshal([]byte(incomingMessage), &message) - return &message, err -} - -func newIPCMessage(incomingMessage string, responseFunction func(*ipcResponse) error) (*ipcMessage, error) { - - // Parse the Message - message, err := parseMessage(incomingMessage) - if err != nil { - return nil, err - } - - // Check message type is valid - messageProcessor := messageProcessors[message.Type] - if messageProcessor == nil { - return nil, fmt.Errorf("unknown message type: %s", message.Type) - } - - // Process message payload - message, err = messageProcessor(message) - if err != nil { - return nil, err - } - - // Set the response function - message.sendResponse = responseFunction - - return message, nil -} - -// hasCallbackID checks if the message can send an error back to the frontend -func (m *ipcMessage) hasCallbackID() error { - if m.CallbackID == "" { - return fmt.Errorf("attempted to return error to message with no Callback ID") - } - return nil -} - -// ReturnError returns an error back to the frontend -func (m *ipcMessage) ReturnError(format string, args ...interface{}) error { - - // Ignore ReturnError if no callback ID given - err := m.hasCallbackID() - if err != nil { - return err - } - - // Create response - response := newErrorResponse(m.CallbackID, fmt.Sprintf(format, args...)) - - // Send response - return m.sendResponse(response) -} - -// ReturnSuccess returns a success message back with the given data -func (m *ipcMessage) ReturnSuccess(data interface{}) error { - - // Ignore ReturnSuccess if no callback ID given - err := m.hasCallbackID() - if err != nil { - return err - } - - // Create the response - response := newSuccessResponse(m.CallbackID, data) - - // Send response - return m.sendResponse(response) -} diff --git a/vendor/github.com/wailsapp/wails/lib/ipc/response.go b/vendor/github.com/wailsapp/wails/lib/ipc/response.go deleted file mode 100644 index 3006b3b..0000000 --- a/vendor/github.com/wailsapp/wails/lib/ipc/response.go +++ /dev/null @@ -1,45 +0,0 @@ -package ipc - -import ( - "encoding/hex" - "encoding/json" -) - -// ipcResponse contains the response data from an RPC call -type ipcResponse struct { - CallbackID string `json:"callbackid"` - ErrorMessage string `json:"error,omitempty"` - Data interface{} `json:"data,omitempty"` -} - -// newErrorResponse returns the given error message to the frontend with the callbackid -func newErrorResponse(callbackID string, errorMessage string) *ipcResponse { - // Create response object - result := &ipcResponse{ - CallbackID: callbackID, - ErrorMessage: errorMessage, - } - return result -} - -// newSuccessResponse returns the given data to the frontend with the callbackid -func newSuccessResponse(callbackID string, data interface{}) *ipcResponse { - - // Create response object - result := &ipcResponse{ - CallbackID: callbackID, - Data: data, - } - - return result -} - -// Serialise formats the response to a string -func (i *ipcResponse) Serialise() (string, error) { - b, err := json.Marshal(i) - if err != nil { - return "", err - } - result := hex.EncodeToString(b) - return result, err -} diff --git a/vendor/github.com/wailsapp/wails/lib/logger/custom.go b/vendor/github.com/wailsapp/wails/lib/logger/custom.go deleted file mode 100644 index fd055d0..0000000 --- a/vendor/github.com/wailsapp/wails/lib/logger/custom.go +++ /dev/null @@ -1,104 +0,0 @@ -package logger - -// CustomLogger is a wrapper object to logrus -type CustomLogger struct { - prefix string - errorOnly bool -} - -// NewCustomLogger creates a new custom logger with the given prefix -func NewCustomLogger(prefix string) *CustomLogger { - return &CustomLogger{ - prefix: "[" + prefix + "] ", - } -} - -// Info level message -func (c *CustomLogger) Info(message string) { - GlobalLogger.Info(c.prefix + message) -} - -// Infof - formatted message -func (c *CustomLogger) Infof(message string, args ...interface{}) { - GlobalLogger.Infof(c.prefix+message, args...) -} - -// InfoFields - message with fields -func (c *CustomLogger) InfoFields(message string, fields Fields) { - GlobalLogger.WithFields(map[string]interface{}(fields)).Info(c.prefix + message) -} - -// Debug level message -func (c *CustomLogger) Debug(message string) { - GlobalLogger.Debug(c.prefix + message) -} - -// Debugf - formatted message -func (c *CustomLogger) Debugf(message string, args ...interface{}) { - GlobalLogger.Debugf(c.prefix+message, args...) -} - -// DebugFields - message with fields -func (c *CustomLogger) DebugFields(message string, fields Fields) { - GlobalLogger.WithFields(map[string]interface{}(fields)).Debug(c.prefix + message) -} - -// Warn level message -func (c *CustomLogger) Warn(message string) { - GlobalLogger.Warn(c.prefix + message) -} - -// Warnf - formatted message -func (c *CustomLogger) Warnf(message string, args ...interface{}) { - GlobalLogger.Warnf(c.prefix+message, args...) -} - -// WarnFields - message with fields -func (c *CustomLogger) WarnFields(message string, fields Fields) { - GlobalLogger.WithFields(map[string]interface{}(fields)).Warn(c.prefix + message) -} - -// Error level message -func (c *CustomLogger) Error(message string) { - GlobalLogger.Error(c.prefix + message) -} - -// Errorf - formatted message -func (c *CustomLogger) Errorf(message string, args ...interface{}) { - GlobalLogger.Errorf(c.prefix+message, args...) -} - -// ErrorFields - message with fields -func (c *CustomLogger) ErrorFields(message string, fields Fields) { - GlobalLogger.WithFields(map[string]interface{}(fields)).Error(c.prefix + message) -} - -// Fatal level message -func (c *CustomLogger) Fatal(message string) { - GlobalLogger.Fatal(c.prefix + message) -} - -// Fatalf - formatted message -func (c *CustomLogger) Fatalf(message string, args ...interface{}) { - GlobalLogger.Fatalf(c.prefix+message, args...) -} - -// FatalFields - message with fields -func (c *CustomLogger) FatalFields(message string, fields Fields) { - GlobalLogger.WithFields(map[string]interface{}(fields)).Fatal(c.prefix + message) -} - -// Panic level message -func (c *CustomLogger) Panic(message string) { - GlobalLogger.Panic(c.prefix + message) -} - -// Panicf - formatted message -func (c *CustomLogger) Panicf(message string, args ...interface{}) { - GlobalLogger.Panicf(c.prefix+message, args...) -} - -// PanicFields - message with fields -func (c *CustomLogger) PanicFields(message string, fields Fields) { - GlobalLogger.WithFields(map[string]interface{}(fields)).Panic(c.prefix + message) -} diff --git a/vendor/github.com/wailsapp/wails/lib/logger/log.go b/vendor/github.com/wailsapp/wails/lib/logger/log.go deleted file mode 100644 index 7913286..0000000 --- a/vendor/github.com/wailsapp/wails/lib/logger/log.go +++ /dev/null @@ -1,47 +0,0 @@ -package logger - -import ( - "os" - "strings" - - "github.com/sirupsen/logrus" -) - -// GlobalLogger is the global logger -var GlobalLogger = logrus.New() - -// Fields is used by the customLogger object to output -// fields along with a message -type Fields map[string]interface{} - -// Default options for the global logger -func init() { - GlobalLogger.SetOutput(os.Stdout) - GlobalLogger.SetLevel(logrus.DebugLevel) -} - -// ErrorFields is a helper for logging fields to the global logger -func ErrorFields(message string, fields Fields) { - GlobalLogger.WithFields(map[string]interface{}(fields)).Error(message) -} - -// SetLogLevel sets the log level to the given level -func SetLogLevel(level string) { - switch strings.ToLower(level) { - case "info": - GlobalLogger.SetLevel(logrus.InfoLevel) - case "debug": - GlobalLogger.SetLevel(logrus.DebugLevel) - case "warn": - GlobalLogger.SetLevel(logrus.WarnLevel) - case "error": - GlobalLogger.SetLevel(logrus.ErrorLevel) - case "fatal": - GlobalLogger.SetLevel(logrus.FatalLevel) - case "panic": - GlobalLogger.SetLevel(logrus.PanicLevel) - default: - GlobalLogger.SetLevel(logrus.DebugLevel) - GlobalLogger.Warnf("Log level '%s' not recognised. Setting to Debug.", level) - } -} diff --git a/vendor/github.com/wailsapp/wails/lib/messages/calldata.go b/vendor/github.com/wailsapp/wails/lib/messages/calldata.go deleted file mode 100644 index d3da1d4..0000000 --- a/vendor/github.com/wailsapp/wails/lib/messages/calldata.go +++ /dev/null @@ -1,7 +0,0 @@ -package messages - -// CallData represents a call to a Go function/method -type CallData struct { - BindingName string `json:"bindingName"` - Data string `json:"data,omitempty"` -} diff --git a/vendor/github.com/wailsapp/wails/lib/messages/eventdata.go b/vendor/github.com/wailsapp/wails/lib/messages/eventdata.go deleted file mode 100644 index c15ba08..0000000 --- a/vendor/github.com/wailsapp/wails/lib/messages/eventdata.go +++ /dev/null @@ -1,7 +0,0 @@ -package messages - -// EventData represents an event sent from the frontend -type EventData struct { - Name string `json:"name"` - Data interface{} `json:"data"` -} diff --git a/vendor/github.com/wailsapp/wails/lib/messages/logdata.go b/vendor/github.com/wailsapp/wails/lib/messages/logdata.go deleted file mode 100644 index 068b6a7..0000000 --- a/vendor/github.com/wailsapp/wails/lib/messages/logdata.go +++ /dev/null @@ -1,7 +0,0 @@ -package messages - -// LogData represents a call to log from the frontend -type LogData struct { - Level string `json:"level"` - Message string `json:"string"` -} diff --git a/vendor/github.com/wailsapp/wails/lib/renderer/bridge.go b/vendor/github.com/wailsapp/wails/lib/renderer/bridge.go deleted file mode 100644 index 44da784..0000000 --- a/vendor/github.com/wailsapp/wails/lib/renderer/bridge.go +++ /dev/null @@ -1,10 +0,0 @@ -package renderer - -import ( - bridge "github.com/wailsapp/wails/lib/renderer/bridge" -) - -// NewBridge returns a new Bridge struct -func NewBridge() *bridge.Bridge { - return &bridge.Bridge{} -} diff --git a/vendor/github.com/wailsapp/wails/lib/renderer/bridge/bridge.go b/vendor/github.com/wailsapp/wails/lib/renderer/bridge/bridge.go deleted file mode 100644 index 3fd3646..0000000 --- a/vendor/github.com/wailsapp/wails/lib/renderer/bridge/bridge.go +++ /dev/null @@ -1,230 +0,0 @@ -package renderer - -import ( - "encoding/json" - "fmt" - "net/http" - "sync" - - "github.com/gorilla/websocket" - "github.com/wailsapp/wails/lib/interfaces" - "github.com/wailsapp/wails/lib/logger" - "github.com/wailsapp/wails/lib/messages" -) - -type messageType int - -const ( - jsMessage messageType = iota - cssMessage - htmlMessage - notifyMessage - bindingMessage - callbackMessage - wailsRuntimeMessage -) - -func (m messageType) toString() string { - return [...]string{"j", "s", "h", "n", "b", "c", "w"}[m] -} - -// Bridge is a backend that opens a local web server -// and renders the files over a websocket -type Bridge struct { - // Common - log *logger.CustomLogger - ipcManager interfaces.IPCManager - appConfig interfaces.AppConfig - eventManager interfaces.EventManager - bindingCache []string - - // Bridge specific - server *http.Server - - lock sync.Mutex - sessions map[string]*session -} - -// Initialise the Bridge Renderer -func (h *Bridge) Initialise(appConfig interfaces.AppConfig, ipcManager interfaces.IPCManager, eventManager interfaces.EventManager) error { - h.sessions = map[string]*session{} - h.ipcManager = ipcManager - h.appConfig = appConfig - h.eventManager = eventManager - ipcManager.BindRenderer(h) - h.log = logger.NewCustomLogger("Bridge") - return nil -} - -func (h *Bridge) wsBridgeHandler(w http.ResponseWriter, r *http.Request) { - conn, err := websocket.Upgrade(w, r, w.Header(), 1024, 1024) - if err != nil { - http.Error(w, "Could not open websocket connection", http.StatusBadRequest) - } - h.log.Infof("Connection from frontend accepted [%s].", conn.RemoteAddr().String()) - h.startSession(conn) -} - -func (h *Bridge) startSession(conn *websocket.Conn) { - s := newSession(conn, - h.bindingCache, - h.ipcManager, - logger.NewCustomLogger("BridgeSession"), - h.eventManager) - - conn.SetCloseHandler(func(int, string) error { - h.log.Infof("Connection dropped [%s].", s.Identifier()) - h.eventManager.Emit("wails:bridge:session:closed", s.Identifier()) - h.lock.Lock() - defer h.lock.Unlock() - delete(h.sessions, s.Identifier()) - return nil - }) - - h.lock.Lock() - defer h.lock.Unlock() - go s.start(len(h.sessions) == 0) - h.sessions[s.Identifier()] = s -} - -// Run the app in Bridge mode! -func (h *Bridge) Run() error { - h.server = &http.Server{Addr: ":34115"} - http.HandleFunc("/bridge", h.wsBridgeHandler) - - h.log.Info("Bridge mode started.") - h.log.Info("The frontend will connect automatically.") - - err := h.server.ListenAndServe() - if err != nil && err != http.ErrServerClosed { - h.log.Fatal(err.Error()) - } - return err -} - -// NewBinding creates a new binding with the frontend -func (h *Bridge) NewBinding(methodName string) error { - h.bindingCache = append(h.bindingCache, methodName) - return nil -} - -// SelectFile is unsupported for Bridge but required -// for the Renderer interface -func (h *Bridge) SelectFile(title string, filter string) string { - h.log.Warn("SelectFile() unsupported in bridge mode") - return "" -} - -// SelectDirectory is unsupported for Bridge but required -// for the Renderer interface -func (h *Bridge) SelectDirectory() string { - h.log.Warn("SelectDirectory() unsupported in bridge mode") - return "" -} - -// SelectSaveFile is unsupported for Bridge but required -// for the Renderer interface -func (h *Bridge) SelectSaveFile(title string, filter string) string { - h.log.Warn("SelectSaveFile() unsupported in bridge mode") - return "" -} - -// NotifyEvent notifies the frontend of an event -func (h *Bridge) NotifyEvent(event *messages.EventData) error { - - // Look out! Nils about! - var err error - if event == nil { - err = fmt.Errorf("Sent nil event to renderer.webViewRenderer") - h.log.Error(err.Error()) - return err - } - - // Default data is a blank array - data := []byte("[]") - - // Process event data - if event.Data != nil { - // Marshall the data - data, err = json.Marshal(event.Data) - if err != nil { - h.log.Errorf("Cannot marshal JSON data in event: %s ", err.Error()) - return err - } - } - - // Double encode data to ensure everything is escaped correctly. - data, err = json.Marshal(string(data)) - if err != nil { - h.log.Errorf("Cannot marshal JSON data in event: %s ", err.Error()) - return err - } - - message := "window.wails._.Notify('" + event.Name + "'," + string(data) + ")" - dead := []*session{} - for _, session := range h.sessions { - err := session.evalJS(message, notifyMessage) - if err != nil { - h.log.Debugf("Failed to send message to %s - Removing listener : %v", session.Identifier(), err) - h.log.Infof("Connection from [%v] unresponsive - dropping", session.Identifier()) - dead = append(dead, session) - } - } - h.lock.Lock() - defer h.lock.Unlock() - for _, session := range dead { - delete(h.sessions, session.Identifier()) - } - - return nil -} - -// SetColour is unsupported for Bridge but required -// for the Renderer interface -func (h *Bridge) SetColour(colour string) error { - h.log.WarnFields("SetColour ignored for Bridge more", logger.Fields{"col": colour}) - return nil -} - -// SetMinSize is unsupported for Bridge but required -// for the Renderer interface -func (h *Bridge) SetMinSize(width, height int) { - h.log.Warn("SetMinSize() unsupported in bridge mode") -} - -// SetMaxSize is unsupported for Bridge but required -// for the Renderer interface -func (h *Bridge) SetMaxSize(width, height int) { - h.log.Warn("SetMaxSize() unsupported in bridge mode") -} - -// Fullscreen is unsupported for Bridge but required -// for the Renderer interface -func (h *Bridge) Fullscreen() { - h.log.Warn("Fullscreen() unsupported in bridge mode") -} - -// UnFullscreen is unsupported for Bridge but required -// for the Renderer interface -func (h *Bridge) UnFullscreen() { - h.log.Warn("UnFullscreen() unsupported in bridge mode") -} - -// SetTitle is currently unsupported for Bridge but required -// for the Renderer interface -func (h *Bridge) SetTitle(title string) { - h.log.WarnFields("SetTitle() unsupported in bridge mode", logger.Fields{"title": title}) -} - -// Close is unsupported for Bridge but required -// for the Renderer interface -func (h *Bridge) Close() { - h.log.Debug("Shutting down") - for _, session := range h.sessions { - session.Shutdown() - } - err := h.server.Close() - if err != nil { - h.log.Errorf(err.Error()) - } -} diff --git a/vendor/github.com/wailsapp/wails/lib/renderer/bridge/session.go b/vendor/github.com/wailsapp/wails/lib/renderer/bridge/session.go deleted file mode 100644 index c858393..0000000 --- a/vendor/github.com/wailsapp/wails/lib/renderer/bridge/session.go +++ /dev/null @@ -1,135 +0,0 @@ -package renderer - -import ( - "time" - - "github.com/wailsapp/wails/runtime" - - "github.com/gorilla/websocket" - "github.com/wailsapp/wails/lib/interfaces" - "github.com/wailsapp/wails/lib/logger" -) - -// TODO Move this back into bridge.go - -// session represents a single websocket session -type session struct { - bindingCache []string - conn *websocket.Conn - eventManager interfaces.EventManager - log *logger.CustomLogger - ipc interfaces.IPCManager - - // Mutex for writing to the socket - shutdown chan bool - writeChan chan []byte - - done bool -} - -func newSession(conn *websocket.Conn, bindingCache []string, ipc interfaces.IPCManager, logger *logger.CustomLogger, eventMgr interfaces.EventManager) *session { - return &session{ - conn: conn, - bindingCache: bindingCache, - ipc: ipc, - log: logger, - eventManager: eventMgr, - shutdown: make(chan bool), - writeChan: make(chan []byte, 100), - } -} - -// Identifier returns a string identifier for the remote connection. -// Taking the form of the client's :. -func (s *session) Identifier() string { - if s.conn != nil { - return s.conn.RemoteAddr().String() - } - return "" -} - -func (s *session) sendMessage(msg string) error { - if !s.done { - s.writeChan <- []byte(msg) - } - return nil -} - -func (s *session) start(firstSession bool) { - s.log.Infof("Connected to frontend.") - go s.writePump() - - s.evalJS(runtime.WailsJS, wailsRuntimeMessage) - - // Inject bindings - for _, binding := range s.bindingCache { - s.evalJS(binding, bindingMessage) - } - s.eventManager.Emit("wails:bridge:session:started", s.Identifier()) - - // Emit that everything is loaded and ready - if firstSession { - s.eventManager.Emit("wails:ready") - } - - for { - messageType, buffer, err := s.conn.ReadMessage() - if messageType == -1 { - return - } - if err != nil { - s.log.Errorf("Error reading message: %v", err) - continue - } - - s.log.Debugf("Got message: %#v\n", string(buffer)) - - s.ipc.Dispatch(string(buffer), s.Callback) - - if s.done { - break - } - } -} - -// Callback sends a callback to the frontend -func (s *session) Callback(data string) error { - return s.evalJS(data, callbackMessage) -} - -func (s *session) evalJS(js string, mtype messageType) error { - // Prepend message type to message - return s.sendMessage(mtype.toString() + js) -} - -// Shutdown -func (s *session) Shutdown() { - s.done = true - s.shutdown <- true - s.log.Debugf("session %v exit", s.Identifier()) -} - -// writePump pulls messages from the writeChan and sends them to the client -// since it uses a channel to read the messages the socket is protected without locks -func (s *session) writePump() { - s.log.Debugf("Session %v - writePump start", s.Identifier()) - for { - select { - case msg, ok := <-s.writeChan: - s.conn.SetWriteDeadline(time.Now().Add(1 * time.Second)) - if !ok { - s.log.Debug("writeChan was closed!") - s.conn.WriteMessage(websocket.CloseMessage, []byte{}) - return - } - - if err := s.conn.WriteMessage(websocket.TextMessage, msg); err != nil { - s.log.Debug(err.Error()) - return - } - case <-s.shutdown: - break - } - } - s.log.Debug("writePump exiting...") -} diff --git a/vendor/github.com/wailsapp/wails/lib/renderer/webview.go b/vendor/github.com/wailsapp/wails/lib/renderer/webview.go deleted file mode 100644 index d122a3e..0000000 --- a/vendor/github.com/wailsapp/wails/lib/renderer/webview.go +++ /dev/null @@ -1,463 +0,0 @@ -package renderer - -import ( - "encoding/json" - "fmt" - "math/rand" - "strings" - "sync" - "time" - - "github.com/wailsapp/wails/runtime" - - "github.com/go-playground/colors" - "github.com/wailsapp/wails/lib/interfaces" - "github.com/wailsapp/wails/lib/logger" - "github.com/wailsapp/wails/lib/messages" - wv "github.com/wailsapp/wails/lib/renderer/webview" -) - -// WebView defines the main webview application window -// Default values in [] - -// UseFirebug indicates whether to inject the firebug console -var UseFirebug = "" - -type WebView struct { - window wv.WebView // The webview object - ipc interfaces.IPCManager - log *logger.CustomLogger - config interfaces.AppConfig - eventManager interfaces.EventManager - bindingCache []string - maximumSizeSet bool -} - -// NewWebView returns a new WebView struct -func NewWebView() *WebView { - return &WebView{} -} - -// Initialise sets up the WebView -func (w *WebView) Initialise(config interfaces.AppConfig, ipc interfaces.IPCManager, eventManager interfaces.EventManager) error { - - // Store reference to eventManager - w.eventManager = eventManager - - // Set up logger - w.log = logger.NewCustomLogger("WebView") - - // Set up the dispatcher function - w.ipc = ipc - ipc.BindRenderer(w) - - // Save the config - w.config = config - - width := config.GetWidth() - height := config.GetHeight() - - // Clamp width and height - minWidth, minHeight := config.GetMinWidth(), config.GetMinHeight() - maxWidth, maxHeight := config.GetMaxWidth(), config.GetMaxHeight() - setMinSize := minWidth != -1 && minHeight != -1 - setMaxSize := maxWidth != -1 && maxHeight != -1 - - if setMinSize { - if width < minWidth { - width = minWidth - } - if height < minHeight { - height = minHeight - } - } - - if setMaxSize { - if width > maxWidth { - width = maxWidth - } - if height > maxHeight { - height = maxHeight - } - } - - // Create the WebView instance - w.window = wv.NewWebview(wv.Settings{ - Width: width, - Height: height, - Title: config.GetTitle(), - Resizable: config.GetResizable(), - URL: config.GetHTML(), - Debug: !config.GetDisableInspector(), - ExternalInvokeCallback: func(_ wv.WebView, message string) { - w.ipc.Dispatch(message, w.callback) - }, - }) - - // Set minimum and maximum sizes - if setMinSize { - w.SetMinSize(minWidth, minHeight) - } - if setMaxSize { - w.SetMaxSize(maxWidth, maxHeight) - } - - // Set minimum and maximum sizes - if setMinSize { - w.SetMinSize(minWidth, minHeight) - } - if setMaxSize { - w.SetMaxSize(maxWidth, maxHeight) - } - - // SignalManager.OnExit(w.Exit) - - // Set colour - color := config.GetColour() - if color != "" { - err := w.SetColour(color) - if err != nil { - return err - } - } - - w.log.Info("Initialised") - return nil -} - -// SetColour sets the window colour -func (w *WebView) SetColour(colour string) error { - color, err := colors.Parse(colour) - if err != nil { - return err - } - rgba := color.ToRGBA() - alpha := uint8(255 * rgba.A) - w.window.Dispatch(func() { - w.window.SetColor(rgba.R, rgba.G, rgba.B, alpha) - }) - - return nil -} - -// evalJS evaluates the given js in the WebView -// I should rename this to evilJS lol -func (w *WebView) evalJS(js string) error { - outputJS := fmt.Sprintf("%.45s", js) - if len(js) > 45 { - outputJS += "..." - } - w.log.DebugFields("Eval", logger.Fields{"js": outputJS}) - // - w.window.Dispatch(func() { - w.window.Eval(js) - }) - return nil -} - -// Escape the Javascripts! -func escapeJS(js string) (string, error) { - result := strings.Replace(js, "\\", "\\\\", -1) - result = strings.Replace(result, "'", "\\'", -1) - result = strings.Replace(result, "\n", "\\n", -1) - return result, nil -} - -// evalJSSync evaluates the given js in the WebView synchronously -// Do not call this from the main thread or you'll nuke your app because -// you won't get the callback. -func (w *WebView) evalJSSync(js string) error { - - minified, err := escapeJS(js) - - if err != nil { - return err - } - - outputJS := fmt.Sprintf("%.45s", js) - if len(js) > 45 { - outputJS += "..." - } - w.log.DebugFields("EvalSync", logger.Fields{"js": outputJS}) - - ID := fmt.Sprintf("syncjs:%d:%d", time.Now().Unix(), rand.Intn(9999)) - var wg sync.WaitGroup - wg.Add(1) - - go func() { - exit := false - // We are done when we receive the Callback ID - w.log.Debug("SyncJS: sending with ID = " + ID) - w.eventManager.On(ID, func(...interface{}) { - w.log.Debug("SyncJS: Got callback ID = " + ID) - wg.Done() - exit = true - }) - command := fmt.Sprintf("wails._.AddScript('%s', '%s')", minified, ID) - w.window.Dispatch(func() { - w.window.Eval(command) - }) - for exit == false { - time.Sleep(time.Millisecond * 1) - } - }() - - wg.Wait() - - return nil -} - -// injectCSS adds the given CSS to the WebView -func (w *WebView) injectCSS(css string) { - w.window.Dispatch(func() { - w.window.InjectCSS(css) - }) -} - -// Exit closes the window -func (w *WebView) Exit() { - w.window.Exit() -} - -// Run the window main loop -func (w *WebView) Run() error { - - w.log.Info("Running...") - - // Inject firebug in debug mode on Windows - if UseFirebug != "" { - w.log.Debug("Injecting Firebug") - w.evalJS(`window.usefirebug=true;`) - } - - // Runtime assets - w.log.DebugFields("Injecting wails JS runtime", logger.Fields{"js": runtime.WailsJS}) - w.evalJS(runtime.WailsJS) - - // Ping the wait channel when the wails runtime is loaded - w.eventManager.On("wails:loaded", func(...interface{}) { - - // Run this in a different go routine to free up the main process - go func() { - - // Inject Bindings - for _, binding := range w.bindingCache { - w.evalJSSync(binding) - } - - // Inject user CSS - if w.config.GetCSS() != "" { - outputCSS := fmt.Sprintf("%.45s", w.config.GetCSS()) - if len(outputCSS) > 45 { - outputCSS += "..." - } - w.log.DebugFields("Inject User CSS", logger.Fields{"css": outputCSS}) - w.injectCSS(w.config.GetCSS()) - } else { - // Use default wails css - - w.log.Debug("Injecting Default Wails CSS: " + runtime.WailsCSS) - w.injectCSS(runtime.WailsCSS) - } - - // Inject user JS - if w.config.GetJS() != "" { - outputJS := fmt.Sprintf("%.45s", w.config.GetJS()) - if len(outputJS) > 45 { - outputJS += "..." - } - w.log.DebugFields("Inject User JS", logger.Fields{"js": outputJS}) - w.evalJSSync(w.config.GetJS()) - } - - // Emit that everything is loaded and ready - w.eventManager.Emit("wails:ready") - }() - }) - - // Kick off main window loop - w.window.Run() - - return nil -} - -// NewBinding registers a new binding with the frontend -func (w *WebView) NewBinding(methodName string) error { - objectCode := fmt.Sprintf("window.wails._.NewBinding('%s');", methodName) - w.bindingCache = append(w.bindingCache, objectCode) - return nil -} - -// SelectFile opens a dialog that allows the user to select a file -func (w *WebView) SelectFile(title string, filter string) string { - var result string - - // We need to run this on the main thread, however Dispatch is - // non-blocking so we launch this in a goroutine and wait for - // dispatch to finish before returning the result - var wg sync.WaitGroup - wg.Add(1) - go func() { - w.window.Dispatch(func() { - result = w.window.Dialog(wv.DialogTypeOpen, 0, title, "", filter) - wg.Done() - }) - }() - - defer w.focus() // Ensure the main window is put back into focus afterwards - - wg.Wait() - return result -} - -// SelectDirectory opens a dialog that allows the user to select a directory -func (w *WebView) SelectDirectory() string { - var result string - // We need to run this on the main thread, however Dispatch is - // non-blocking so we launch this in a goroutine and wait for - // dispatch to finish before returning the result - var wg sync.WaitGroup - wg.Add(1) - go func() { - w.window.Dispatch(func() { - result = w.window.Dialog(wv.DialogTypeOpen, wv.DialogFlagDirectory, "Select Directory", "", "") - wg.Done() - }) - }() - - defer w.focus() // Ensure the main window is put back into focus afterwards - - wg.Wait() - return result -} - -// SelectSaveFile opens a dialog that allows the user to select a file to save -func (w *WebView) SelectSaveFile(title string, filter string) string { - var result string - // We need to run this on the main thread, however Dispatch is - // non-blocking so we launch this in a goroutine and wait for - // dispatch to finish before returning the result - var wg sync.WaitGroup - wg.Add(1) - go func() { - w.window.Dispatch(func() { - result = w.window.Dialog(wv.DialogTypeSave, 0, title, "", filter) - wg.Done() - }) - }() - - defer w.focus() // Ensure the main window is put back into focus afterwards - - wg.Wait() - return result -} - -// focus puts the main window into focus -func (w *WebView) focus() { - w.window.Dispatch(func() { - w.window.Focus() - }) -} - -// callback sends a callback to the frontend -func (w *WebView) callback(data string) error { - callbackCMD := fmt.Sprintf("window.wails._.Callback('%s');", data) - return w.evalJS(callbackCMD) -} - -// NotifyEvent notifies the frontend about a backend runtime event -func (w *WebView) NotifyEvent(event *messages.EventData) error { - - // Look out! Nils about! - var err error - if event == nil { - err = fmt.Errorf("Sent nil event to renderer.WebView") - w.log.Error(err.Error()) - return err - } - - // Default data is a blank array - data := []byte("[]") - - // Process event data - if event.Data != nil { - // Marshall the data - data, err = json.Marshal(event.Data) - if err != nil { - w.log.Errorf("Cannot unmarshall JSON data in event: %s ", err.Error()) - return err - } - } - - // Double encode data to ensure everything is escaped correctly. - data, err = json.Marshal(string(data)) - if err != nil { - w.log.Errorf("Cannot marshal JSON data in event: %s ", err.Error()) - return err - } - - message := "window.wails._.Notify('" + event.Name + "'," + string(data) + ")" - return w.evalJS(message) -} - -// SetMinSize sets the minimum size of a resizable window -func (w *WebView) SetMinSize(width, height int) { - if w.config.GetResizable() == false { - w.log.Warn("Cannot call SetMinSize() - App.Resizable = false") - return - } - w.window.Dispatch(func() { - w.window.SetMinSize(width, height) - }) -} - -// SetMaxSize sets the maximum size of a resizable window -func (w *WebView) SetMaxSize(width, height int) { - if w.config.GetResizable() == false { - w.log.Warn("Cannot call SetMaxSize() - App.Resizable = false") - return - } - w.maximumSizeSet = true - w.window.Dispatch(func() { - w.window.SetMaxSize(width, height) - }) -} - -// Fullscreen makes the main window go fullscreen -func (w *WebView) Fullscreen() { - if w.config.GetResizable() == false { - w.log.Warn("Cannot call Fullscreen() - App.Resizable = false") - return - } else if w.maximumSizeSet { - w.log.Warn("Cannot call Fullscreen() - Maximum size of window set") - return - } - w.window.Dispatch(func() { - w.window.SetFullscreen(true) - }) -} - -// UnFullscreen returns the window to the position prior to a fullscreen call -func (w *WebView) UnFullscreen() { - if w.config.GetResizable() == false { - w.log.Warn("Cannot call UnFullscreen() - App.Resizable = false") - return - } - w.window.Dispatch(func() { - w.window.SetFullscreen(false) - }) -} - -// SetTitle sets the window title -func (w *WebView) SetTitle(title string) { - w.window.Dispatch(func() { - w.window.SetTitle(title) - }) -} - -// Close closes the window -func (w *WebView) Close() { - w.window.Dispatch(func() { - w.window.Terminate() - }) -} diff --git a/vendor/github.com/wailsapp/wails/lib/renderer/webview/webview.go b/vendor/github.com/wailsapp/wails/lib/renderer/webview/webview.go deleted file mode 100644 index 60ce89e..0000000 --- a/vendor/github.com/wailsapp/wails/lib/renderer/webview/webview.go +++ /dev/null @@ -1,411 +0,0 @@ -// Package webview implements Go bindings to https://github.com/zserge/webview C library. -// It is a modified version of webview.go from that repository -// Bindings closely repeat the C APIs and include both, a simplified -// single-function API to just open a full-screen webview window, and a more -// advanced and featureful set of APIs, including Go-to-JavaScript bindings. -// -// The library uses gtk-webkit, Cocoa/Webkit and MSHTML (IE8..11) as a browser -// engine and supports Linux, MacOS and Windows 7..10 respectively. -// -package webview - -/* -#cgo linux openbsd freebsd CFLAGS: -DWEBVIEW_GTK=1 -Wno-deprecated-declarations -#cgo linux openbsd freebsd pkg-config: gtk+-3.0 webkit2gtk-4.0 - -#cgo windows CFLAGS: -DWEBVIEW_WINAPI=1 -std=c99 -#cgo windows LDFLAGS: -lole32 -lcomctl32 -loleaut32 -luuid -lgdi32 - -#cgo darwin CFLAGS: -DWEBVIEW_COCOA=1 -x objective-c -#cgo darwin LDFLAGS: -framework Cocoa -framework WebKit - -#include -#include -#define WEBVIEW_STATIC -#define WEBVIEW_IMPLEMENTATION -#include "webview.h" - -extern void _webviewExternalInvokeCallback(void *, void *); - -static inline void CgoWebViewFree(void *w) { - free((void *)((struct webview *)w)->title); - free((void *)((struct webview *)w)->url); - free(w); -} - -static inline void *CgoWebViewCreate(int width, int height, char *title, char *url, int resizable, int debug) { - struct webview *w = (struct webview *) calloc(1, sizeof(*w)); - w->width = width; - w->height = height; - w->title = title; - w->url = url; - w->resizable = resizable; - w->debug = debug; - w->external_invoke_cb = (webview_external_invoke_cb_t) _webviewExternalInvokeCallback; - if (webview_init(w) != 0) { - CgoWebViewFree(w); - return NULL; - } - return (void *)w; -} - -static inline int CgoWebViewLoop(void *w, int blocking) { - return webview_loop((struct webview *)w, blocking); -} - -static inline void CgoWebViewTerminate(void *w) { - webview_terminate((struct webview *)w); -} - -static inline void CgoWebViewExit(void *w) { - webview_exit((struct webview *)w); -} - -static inline void CgoWebViewSetTitle(void *w, char *title) { - webview_set_title((struct webview *)w, title); -} - -static inline void CgoWebViewFocus(void *w) { - webview_focus((struct webview *)w); -} - -static inline void CgoWebViewMinSize(void *w, int width, int height) { - webview_minsize((struct webview *)w, width, height); -} - -static inline void CgoWebViewMaxSize(void *w, int width, int height) { - webview_maxsize((struct webview *)w, width, height); -} - -static inline void CgoWebViewSetFullscreen(void *w, int fullscreen) { - webview_set_fullscreen((struct webview *)w, fullscreen); -} - -static inline void CgoWebViewSetColor(void *w, uint8_t r, uint8_t g, uint8_t b, uint8_t a) { - webview_set_color((struct webview *)w, r, g, b, a); -} - -static inline void CgoDialog(void *w, int dlgtype, int flags, -char *title, char *arg, char *res, size_t ressz, char *filter) { - webview_dialog(w, dlgtype, flags, - (const char*)title, (const char*) arg, res, ressz, filter); -} - -static inline int CgoWebViewEval(void *w, char *js) { - return webview_eval((struct webview *)w, js); -} - -static inline void CgoWebViewInjectCSS(void *w, char *css) { - webview_inject_css((struct webview *)w, css); -} - -extern void _webviewDispatchGoCallback(void *); -static inline void _webview_dispatch_cb(struct webview *w, void *arg) { - _webviewDispatchGoCallback(arg); -} -static inline void CgoWebViewDispatch(void *w, uintptr_t arg) { - webview_dispatch((struct webview *)w, _webview_dispatch_cb, (void *)arg); -} -*/ -import "C" -import ( - "errors" - "runtime" - "sync" - "unsafe" -) - -func init() { - // Ensure that main.main is called from the main thread - runtime.LockOSThread() -} - -// Open is a simplified API to open a single native window with a full-size webview in -// it. It can be helpful if you want to communicate with the core app using XHR -// or WebSockets (as opposed to using JavaScript bindings). -// -// Window appearance can be customized using title, width, height and resizable parameters. -// URL must be provided and can user either a http or https protocol, or be a -// local file:// URL. On some platforms "data:" URLs are also supported -// (Linux/MacOS). -func Open(title, url string, w, h int, resizable bool) error { - titleStr := C.CString(title) - defer C.free(unsafe.Pointer(titleStr)) - urlStr := C.CString(url) - defer C.free(unsafe.Pointer(urlStr)) - resize := C.int(0) - if resizable { - resize = C.int(1) - } - - r := C.webview(titleStr, urlStr, C.int(w), C.int(h), resize) - if r != 0 { - return errors.New("failed to create webview") - } - return nil -} - -// ExternalInvokeCallbackFunc is a function type that is called every time -// "window.external.invoke()" is called from JavaScript. Data is the only -// obligatory string parameter passed into the "invoke(data)" function from -// JavaScript. To pass more complex data serialized JSON or base64 encoded -// string can be used. -type ExternalInvokeCallbackFunc func(w WebView, data string) - -// Settings is a set of parameters to customize the initial WebView appearance -// and behavior. It is passed into the webview.New() constructor. -type Settings struct { - // WebView main window title - Title string - // URL to open in a webview - URL string - // Window width in pixels - Width int - // Window height in pixels - Height int - // Allows/disallows window resizing - Resizable bool - // Enable debugging tools (Linux/BSD/MacOS, on Windows use Firebug) - Debug bool - // A callback that is executed when JavaScript calls "window.external.invoke()" - ExternalInvokeCallback ExternalInvokeCallbackFunc -} - -// WebView is an interface that wraps the basic methods for controlling the UI -// loop, handling multithreading and providing JavaScript bindings. -type WebView interface { - // Run() starts the main UI loop until the user closes the webview window or - // Terminate() is called. - Run() - // Loop() runs a single iteration of the main UI. - Loop(blocking bool) bool - // SetTitle() changes window title. This method must be called from the main - // thread only. See Dispatch() for more details. - SetTitle(title string) - - // Focus() puts the main window into focus - Focus() - - // SetMinSize() sets the minimum size of the window - SetMinSize(width, height int) - - // SetMaxSize() sets the maximum size of the window - SetMaxSize(width, height int) - - // SetFullscreen() controls window full-screen mode. This method must be - // called from the main thread only. See Dispatch() for more details. - SetFullscreen(fullscreen bool) - // SetColor() changes window background color. This method must be called from - // the main thread only. See Dispatch() for more details. - SetColor(r, g, b, a uint8) - // Eval() evaluates an arbitrary JS code inside the webview. This method must - // be called from the main thread only. See Dispatch() for more details. - Eval(js string) error - // InjectJS() injects an arbitrary block of CSS code using the JS API. This - // method must be called from the main thread only. See Dispatch() for more - // details. - InjectCSS(css string) - // Dialog() opens a system dialog of the given type and title. String - // argument can be provided for certain dialogs, such as alert boxes. For - // alert boxes argument is a message inside the dialog box. - Dialog(dlgType DialogType, flags int, title string, arg string, filter string) string - // Terminate() breaks the main UI loop. This method must be called from the main thread - // only. See Dispatch() for more details. - Terminate() - // Dispatch() schedules some arbitrary function to be executed on the main UI - // thread. This may be helpful if you want to run some JavaScript from - // background threads/goroutines, or to terminate the app. - Dispatch(func()) - // Exit() closes the window and cleans up the resources. Use Terminate() to - // forcefully break out of the main UI loop. - Exit() -} - -// DialogType is an enumeration of all supported system dialog types -type DialogType int - -const ( - // DialogTypeOpen is a system file open dialog - DialogTypeOpen DialogType = iota - // DialogTypeSave is a system file save dialog - DialogTypeSave - // DialogTypeAlert is a system alert dialog (message box) - DialogTypeAlert -) - -const ( - // DialogFlagFile is a normal file picker dialog - DialogFlagFile = C.WEBVIEW_DIALOG_FLAG_FILE - // DialogFlagDirectory is an open directory dialog - DialogFlagDirectory = C.WEBVIEW_DIALOG_FLAG_DIRECTORY - // DialogFlagInfo is an info alert dialog - DialogFlagInfo = C.WEBVIEW_DIALOG_FLAG_INFO - // DialogFlagWarning is a warning alert dialog - DialogFlagWarning = C.WEBVIEW_DIALOG_FLAG_WARNING - // DialogFlagError is an error dialog - DialogFlagError = C.WEBVIEW_DIALOG_FLAG_ERROR -) - -var ( - m sync.Mutex - index uintptr - fns = map[uintptr]func(){} - cbs = map[WebView]ExternalInvokeCallbackFunc{} -) - -type webview struct { - w unsafe.Pointer -} - -var _ WebView = &webview{} - -func boolToInt(b bool) int { - if b { - return 1 - } - return 0 -} - -// NewWebview creates and opens a new webview window using the given settings. The -// returned object implements the WebView interface. This function returns nil -// if a window can not be created. -func NewWebview(settings Settings) WebView { - if settings.Width == 0 { - settings.Width = 640 - } - if settings.Height == 0 { - settings.Height = 480 - } - if settings.Title == "" { - settings.Title = "WebView" - } - w := &webview{} - w.w = C.CgoWebViewCreate(C.int(settings.Width), C.int(settings.Height), - C.CString(settings.Title), C.CString(settings.URL), - C.int(boolToInt(settings.Resizable)), C.int(boolToInt(settings.Debug))) - m.Lock() - if settings.ExternalInvokeCallback != nil { - cbs[w] = settings.ExternalInvokeCallback - } else { - cbs[w] = func(w WebView, data string) {} - } - m.Unlock() - return w -} - -func (w *webview) Loop(blocking bool) bool { - block := C.int(0) - if blocking { - block = 1 - } - return C.CgoWebViewLoop(w.w, block) == 0 -} - -func (w *webview) Run() { - for w.Loop(true) { - } -} - -func (w *webview) Exit() { - C.CgoWebViewExit(w.w) -} - -func (w *webview) Dispatch(f func()) { - m.Lock() - for ; fns[index] != nil; index++ { - } - fns[index] = f - m.Unlock() - C.CgoWebViewDispatch(w.w, C.uintptr_t(index)) -} - -func (w *webview) SetTitle(title string) { - p := C.CString(title) - defer C.free(unsafe.Pointer(p)) - C.CgoWebViewSetTitle(w.w, p) -} - -func (w *webview) SetColor(r, g, b, a uint8) { - C.CgoWebViewSetColor(w.w, C.uint8_t(r), C.uint8_t(g), C.uint8_t(b), C.uint8_t(a)) -} - -func (w *webview) Focus() { - C.CgoWebViewFocus(w.w) -} - -func (w *webview) SetMinSize(width, height int) { - C.CgoWebViewMinSize(w.w, C.int(width), C.int(height)) -} - -func (w *webview) SetMaxSize(width, height int) { - C.CgoWebViewMaxSize(w.w, C.int(width), C.int(height)) -} - -func (w *webview) SetFullscreen(fullscreen bool) { - C.CgoWebViewSetFullscreen(w.w, C.int(boolToInt(fullscreen))) -} - -func (w *webview) Dialog(dlgType DialogType, flags int, title string, arg string, filter string) string { - const maxPath = 4096 - titlePtr := C.CString(title) - defer C.free(unsafe.Pointer(titlePtr)) - argPtr := C.CString(arg) - defer C.free(unsafe.Pointer(argPtr)) - resultPtr := (*C.char)(C.calloc((C.size_t)(unsafe.Sizeof((*C.char)(nil))), (C.size_t)(maxPath))) - defer C.free(unsafe.Pointer(resultPtr)) - filterPtr := C.CString(filter) - defer C.free(unsafe.Pointer(filterPtr)) - C.CgoDialog(w.w, C.int(dlgType), C.int(flags), titlePtr, - argPtr, resultPtr, C.size_t(maxPath), filterPtr) - return C.GoString(resultPtr) -} - -func (w *webview) Eval(js string) error { - p := C.CString(js) - defer C.free(unsafe.Pointer(p)) - switch C.CgoWebViewEval(w.w, p) { - case -1: - return errors.New("evaluation failed") - } - return nil -} - -func (w *webview) InjectCSS(css string) { - p := C.CString(css) - defer C.free(unsafe.Pointer(p)) - C.CgoWebViewInjectCSS(w.w, p) -} - -func (w *webview) Terminate() { - C.CgoWebViewTerminate(w.w) -} - -//export _webviewDispatchGoCallback -func _webviewDispatchGoCallback(index unsafe.Pointer) { - var f func() - m.Lock() - f = fns[uintptr(index)] - delete(fns, uintptr(index)) - m.Unlock() - if f != nil { - f() - } -} - -//export _webviewExternalInvokeCallback -func _webviewExternalInvokeCallback(w unsafe.Pointer, data unsafe.Pointer) { - m.Lock() - var ( - cb ExternalInvokeCallbackFunc - wv WebView - ) - for wv, cb = range cbs { - if wv.(*webview).w == w { - break - } - } - m.Unlock() - if cb != nil { - cb(wv, C.GoString((*C.char)(data))) - } -} diff --git a/vendor/github.com/wailsapp/wails/lib/renderer/webview/webview.h b/vendor/github.com/wailsapp/wails/lib/renderer/webview/webview.h deleted file mode 100644 index 53b6c9c..0000000 --- a/vendor/github.com/wailsapp/wails/lib/renderer/webview/webview.h +++ /dev/null @@ -1,2506 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2017 Serge Zaitsev - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -#ifndef WEBVIEW_H -#define WEBVIEW_H - -#ifdef __cplusplus -extern "C" -{ -#endif - -#ifdef WEBVIEW_STATIC -#define WEBVIEW_API static -#else -#define WEBVIEW_API extern -#endif - -#include -#include -#include - -#if defined(WEBVIEW_GTK) -#include -#include -#include - - struct webview_priv - { - GtkWidget *window; - GtkWidget *scroller; - GtkWidget *webview; - GtkWidget *inspector_window; - GAsyncQueue *queue; - int ready; - int js_busy; - int should_exit; - - int min_width; - int min_height; - int max_width; - int max_height; - }; -#elif defined(WEBVIEW_WINAPI) -#define CINTERFACE -#include - -#include -#include -#include -#include -#include - -#include - -struct webview_priv -{ - HWND hwnd; - IOleObject **browser; - BOOL is_fullscreen; - DWORD saved_style; - DWORD saved_ex_style; - RECT saved_rect; - - int min_width; - int min_height; - int max_width; - int max_height; -}; -#elif defined(WEBVIEW_COCOA) -#import -#import -#import - -struct webview_priv -{ - NSAutoreleasePool *pool; - NSWindow *window; - WebView *webview; - id delegate; - int should_exit; -}; -#else -#error "Define one of: WEBVIEW_GTK, WEBVIEW_COCOA or WEBVIEW_WINAPI" -#endif - - struct webview; - - typedef void (*webview_external_invoke_cb_t)(struct webview *w, - const char *arg); - - struct webview - { - const char *url; - const char *title; - int width; - int height; - int resizable; - int transparentTitlebar; - int debug; - webview_external_invoke_cb_t external_invoke_cb; - struct webview_priv priv; - void *userdata; - }; - - enum webview_dialog_type - { - WEBVIEW_DIALOG_TYPE_OPEN = 0, - WEBVIEW_DIALOG_TYPE_SAVE = 1, - WEBVIEW_DIALOG_TYPE_ALERT = 2 - }; - -#define WEBVIEW_DIALOG_FLAG_FILE (0 << 0) -#define WEBVIEW_DIALOG_FLAG_DIRECTORY (1 << 0) - -#define WEBVIEW_DIALOG_FLAG_INFO (1 << 1) -#define WEBVIEW_DIALOG_FLAG_WARNING (2 << 1) -#define WEBVIEW_DIALOG_FLAG_ERROR (3 << 1) -#define WEBVIEW_DIALOG_FLAG_ALERT_MASK (3 << 1) - - typedef void (*webview_dispatch_fn)(struct webview *w, void *arg); - - struct webview_dispatch_arg - { - webview_dispatch_fn fn; - struct webview *w; - void *arg; - }; - -#define DEFAULT_URL \ - "data:text/" \ - "html,%3C%21DOCTYPE%20html%3E%0A%3Chtml%20lang=%22en%22%3E%0A%3Chead%3E%" \ - "3Cmeta%20charset=%22utf-8%22%3E%3Cmeta%20http-equiv=%22IE=edge%22%" \ - "20content=%22IE=edge%22%3E%3C%2Fhead%3E%0A%3Cbody%3E%3Cdiv%20id=%22app%22%" \ - "3E%3C%2Fdiv%3E%3Cscript%20type=%22text%2Fjavascript%22%3E%3C%2Fscript%3E%" \ - "3C%2Fbody%3E%0A%3C%2Fhtml%3E" - -#define CSS_INJECT_FUNCTION \ - "(function(e){var " \ - "t=document.createElement('style'),d=document.head||document." \ - "getElementsByTagName('head')[0];t.setAttribute('type','text/" \ - "css'),t.styleSheet?t.styleSheet.cssText=e:t.appendChild(document." \ - "createTextNode(e)),d.appendChild(t)})" - - static const char *webview_check_url(const char *url) - { - if (url == NULL || strlen(url) == 0) - { - return DEFAULT_URL; - } - return url; - } - - WEBVIEW_API int webview(const char *title, const char *url, int width, - int height, int resizable); - - WEBVIEW_API int webview_init(struct webview *w); - WEBVIEW_API int webview_loop(struct webview *w, int blocking); - WEBVIEW_API int webview_eval(struct webview *w, const char *js); - WEBVIEW_API int webview_inject_css(struct webview *w, const char *css); - WEBVIEW_API void webview_set_title(struct webview *w, const char *title); - WEBVIEW_API void webview_focus(struct webview *w); - WEBVIEW_API void webview_minsize(struct webview *w, int width, int height); - WEBVIEW_API void webview_maxsize(struct webview *w, int width, int height); - WEBVIEW_API void webview_set_fullscreen(struct webview *w, int fullscreen); - WEBVIEW_API void webview_set_color(struct webview *w, uint8_t r, uint8_t g, - uint8_t b, uint8_t a); - WEBVIEW_API void webview_dialog(struct webview *w, - enum webview_dialog_type dlgtype, int flags, - const char *title, const char *arg, - char *result, size_t resultsz, char *filter); - WEBVIEW_API void webview_dispatch(struct webview *w, webview_dispatch_fn fn, - void *arg); - WEBVIEW_API void webview_terminate(struct webview *w); - WEBVIEW_API void webview_exit(struct webview *w); - WEBVIEW_API void webview_debug(const char *format, ...); - WEBVIEW_API void webview_print_log(const char *s); - -#ifdef WEBVIEW_IMPLEMENTATION -#undef WEBVIEW_IMPLEMENTATION - - WEBVIEW_API int webview(const char *title, const char *url, int width, - int height, int resizable) - { - struct webview webview; - memset(&webview, 0, sizeof(webview)); - webview.title = title; - webview.url = url; - webview.width = width; - webview.height = height; - webview.resizable = resizable; - int r = webview_init(&webview); - if (r != 0) - { - return r; - } - while (webview_loop(&webview, 1) == 0) - { - } - webview_exit(&webview); - return 0; - } - - WEBVIEW_API void webview_debug(const char *format, ...) - { - char buf[4096]; - va_list ap; - va_start(ap, format); - vsnprintf(buf, sizeof(buf), format, ap); - webview_print_log(buf); - va_end(ap); - } - - static int webview_js_encode(const char *s, char *esc, size_t n) - { - int r = 1; /* At least one byte for trailing zero */ - for (; *s; s++) - { - const unsigned char c = *s; - if (c >= 0x20 && c < 0x80 && strchr("<>\\'\"", c) == NULL) - { - if (n > 0) - { - *esc++ = c; - n--; - } - r++; - } - else - { - if (n > 0) - { - snprintf(esc, n, "\\x%02x", (int)c); - esc += 4; - n -= 4; - } - r += 4; - } - } - return r; - } - - WEBVIEW_API int webview_inject_css(struct webview *w, const char *css) - { - int n = webview_js_encode(css, NULL, 0); - char *esc = (char *)calloc(1, sizeof(CSS_INJECT_FUNCTION) + n + 4); - if (esc == NULL) - { - return -1; - } - char *js = (char *)calloc(1, n); - webview_js_encode(css, js, n); - snprintf(esc, sizeof(CSS_INJECT_FUNCTION) + n + 4, "%s(\"%s\")", - CSS_INJECT_FUNCTION, js); - int r = webview_eval(w, esc); - free(js); - free(esc); - return r; - } - -#if defined(WEBVIEW_GTK) - static void external_message_received_cb(WebKitUserContentManager *m, - WebKitJavascriptResult *r, - gpointer arg) - { - (void)m; - struct webview *w = (struct webview *)arg; - if (w->external_invoke_cb == NULL) - { - return; - } - JSGlobalContextRef context = webkit_javascript_result_get_global_context(r); - JSValueRef value = webkit_javascript_result_get_value(r); - JSStringRef js = JSValueToStringCopy(context, value, NULL); - size_t n = JSStringGetMaximumUTF8CStringSize(js); - char *s = g_new(char, n); - JSStringGetUTF8CString(js, s, n); - w->external_invoke_cb(w, s); - JSStringRelease(js); - g_free(s); - } - - static void webview_load_changed_cb(WebKitWebView *webview, - WebKitLoadEvent event, gpointer arg) - { - (void)webview; - struct webview *w = (struct webview *)arg; - if (event == WEBKIT_LOAD_FINISHED) - { - w->priv.ready = 1; - } - } - - static void webview_destroy_cb(GtkWidget *widget, gpointer arg) - { - (void)widget; - struct webview *w = (struct webview *)arg; - webview_terminate(w); - } - - static gboolean webview_context_menu_cb(WebKitWebView *webview, - GtkWidget *default_menu, - WebKitHitTestResult *hit_test_result, - gboolean triggered_with_keyboard, - gpointer userdata) - { - (void)webview; - (void)default_menu; - (void)hit_test_result; - (void)triggered_with_keyboard; - (void)userdata; - return TRUE; - } - - WEBVIEW_API int webview_init(struct webview *w) - { - if (gtk_init_check(0, NULL) == FALSE) - { - return -1; - } - - w->priv.ready = 0; - w->priv.should_exit = 0; - w->priv.queue = g_async_queue_new(); - w->priv.window = gtk_window_new(GTK_WINDOW_TOPLEVEL); - - w->priv.min_width = -1; - w->priv.min_height = -1; - w->priv.max_width = -1; - w->priv.max_height = -1; - - gtk_window_set_title(GTK_WINDOW(w->priv.window), w->title); - - if (w->resizable) - { - gtk_window_set_default_size(GTK_WINDOW(w->priv.window), w->width, - w->height); - } - else - { - gtk_widget_set_size_request(w->priv.window, w->width, w->height); - } - gtk_window_set_resizable(GTK_WINDOW(w->priv.window), !!w->resizable); - gtk_window_set_position(GTK_WINDOW(w->priv.window), GTK_WIN_POS_CENTER); - - w->priv.scroller = gtk_scrolled_window_new(NULL, NULL); - gtk_container_add(GTK_CONTAINER(w->priv.window), w->priv.scroller); - - WebKitUserContentManager *m = webkit_user_content_manager_new(); - webkit_user_content_manager_register_script_message_handler(m, "external"); - g_signal_connect(m, "script-message-received::external", - G_CALLBACK(external_message_received_cb), w); - - w->priv.webview = webkit_web_view_new_with_user_content_manager(m); - webkit_web_view_load_uri(WEBKIT_WEB_VIEW(w->priv.webview), - webview_check_url(w->url)); - g_signal_connect(G_OBJECT(w->priv.webview), "load-changed", - G_CALLBACK(webview_load_changed_cb), w); - gtk_container_add(GTK_CONTAINER(w->priv.scroller), w->priv.webview); - - if (w->debug) - { - WebKitSettings *settings = - webkit_web_view_get_settings(WEBKIT_WEB_VIEW(w->priv.webview)); - webkit_settings_set_enable_write_console_messages_to_stdout(settings, true); - webkit_settings_set_enable_developer_extras(settings, true); - webkit_settings_set_hardware_acceleration_policy(settings, WEBKIT_HARDWARE_ACCELERATION_POLICY_ALWAYS); - } - else - { - g_signal_connect(G_OBJECT(w->priv.webview), "context-menu", - G_CALLBACK(webview_context_menu_cb), w); - } - - gtk_widget_show_all(w->priv.window); - - webkit_web_view_run_javascript( - WEBKIT_WEB_VIEW(w->priv.webview), - "window.external={invoke:function(x){" - "window.webkit.messageHandlers.external.postMessage(x);}}", - NULL, NULL, NULL); - - g_signal_connect(G_OBJECT(w->priv.window), "destroy", - G_CALLBACK(webview_destroy_cb), w); - return 0; - } - - WEBVIEW_API int webview_loop(struct webview *w, int blocking) - { - gtk_main_iteration_do(blocking); - return w->priv.should_exit; - } - - WEBVIEW_API void webview_set_title(struct webview *w, const char *title) - { - gtk_window_set_title(GTK_WINDOW(w->priv.window), title); - } - - WEBVIEW_API void webview_focus(struct webview *w) - { - gtk_window_present(GTK_WINDOW(w->priv.window)); - } - - WEBVIEW_API void webview_minsize(struct webview *w, int width, int height) { - - w->priv.min_width = width; - w->priv.min_height = height; - - GdkGeometry hints; - GdkWindowHints usedHints = (GdkWindowHints) GDK_HINT_MIN_SIZE; - - hints.min_width = w->priv.min_width; - hints.min_height = w->priv.min_height; - if (w->priv.max_width != -1) { - hints.max_width = w->priv.max_width; - hints.max_height = w->priv.max_height; - usedHints = (GdkWindowHints)(GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE); - } - - gtk_window_set_geometry_hints(GTK_WINDOW(w->priv.window), w->priv.window, &hints, usedHints); - } - - WEBVIEW_API void webview_maxsize(struct webview *w, int width, int height) { - - w->priv.max_width = width; - w->priv.max_height = height; - - GdkGeometry hints; - GdkWindowHints usedHints = (GdkWindowHints) GDK_HINT_MAX_SIZE; - - if (w->priv.min_width != -1) { - hints.min_width = w->priv.min_width; - hints.min_height = w->priv.min_height; - usedHints = (GdkWindowHints)(GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE); - } - hints.max_width = w->priv.max_width; - hints.max_height = w->priv.max_height; - - gtk_window_set_geometry_hints(GTK_WINDOW(w->priv.window), w->priv.window, &hints, usedHints); - } - - WEBVIEW_API void webview_set_fullscreen(struct webview *w, int fullscreen) - { - if (fullscreen) - { - gtk_window_fullscreen(GTK_WINDOW(w->priv.window)); - } - else - { - gtk_window_unfullscreen(GTK_WINDOW(w->priv.window)); - } - } - - WEBVIEW_API void webview_set_color(struct webview *w, uint8_t r, uint8_t g, - uint8_t b, uint8_t a) - { - GdkRGBA color = {r / 255.0, g / 255.0, b / 255.0, a / 255.0}; - webkit_web_view_set_background_color(WEBKIT_WEB_VIEW(w->priv.webview), - &color); - } - - WEBVIEW_API void webview_dialog(struct webview *w, - enum webview_dialog_type dlgtype, int flags, - const char *title, const char *arg, - char *result, size_t resultsz, char *filter) - { - GtkWidget *dlg; - if (result != NULL) - { - result[0] = '\0'; - } - if (dlgtype == WEBVIEW_DIALOG_TYPE_OPEN || - dlgtype == WEBVIEW_DIALOG_TYPE_SAVE) - { - dlg = gtk_file_chooser_dialog_new( - title, GTK_WINDOW(w->priv.window), - (dlgtype == WEBVIEW_DIALOG_TYPE_OPEN - ? (flags & WEBVIEW_DIALOG_FLAG_DIRECTORY - ? GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER - : GTK_FILE_CHOOSER_ACTION_OPEN) - : GTK_FILE_CHOOSER_ACTION_SAVE), - "_Cancel", GTK_RESPONSE_CANCEL, - (dlgtype == WEBVIEW_DIALOG_TYPE_OPEN ? "_Open" : "_Save"), - GTK_RESPONSE_ACCEPT, NULL); - if (filter[0] != '\0') { - GtkFileFilter *file_filter = gtk_file_filter_new(); - gchar **filters = g_strsplit(filter, ",", -1); - gint i; - for(i = 0; filters && filters[i]; i++) { - gtk_file_filter_add_pattern(file_filter, filters[i]); - } - gtk_file_filter_set_name(file_filter, filter); - gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dlg), file_filter); - g_strfreev(filters); - } - gtk_file_chooser_set_local_only(GTK_FILE_CHOOSER(dlg), FALSE); - gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(dlg), FALSE); - gtk_file_chooser_set_show_hidden(GTK_FILE_CHOOSER(dlg), TRUE); - gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(dlg), TRUE); - gtk_file_chooser_set_create_folders(GTK_FILE_CHOOSER(dlg), TRUE); - gint response = gtk_dialog_run(GTK_DIALOG(dlg)); - if (response == GTK_RESPONSE_ACCEPT) - { - gchar *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dlg)); - g_strlcpy(result, filename, resultsz); - g_free(filename); - } - gtk_widget_destroy(dlg); - } - else if (dlgtype == WEBVIEW_DIALOG_TYPE_ALERT) - { - GtkMessageType type = GTK_MESSAGE_OTHER; - switch (flags & WEBVIEW_DIALOG_FLAG_ALERT_MASK) - { - case WEBVIEW_DIALOG_FLAG_INFO: - type = GTK_MESSAGE_INFO; - break; - case WEBVIEW_DIALOG_FLAG_WARNING: - type = GTK_MESSAGE_WARNING; - break; - case WEBVIEW_DIALOG_FLAG_ERROR: - type = GTK_MESSAGE_ERROR; - break; - } - dlg = gtk_message_dialog_new(GTK_WINDOW(w->priv.window), GTK_DIALOG_MODAL, - type, GTK_BUTTONS_OK, "%s", title); - gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dlg), "%s", - arg); - gtk_dialog_run(GTK_DIALOG(dlg)); - gtk_widget_destroy(dlg); - } - } - - static void webview_eval_finished(GObject *object, GAsyncResult *result, - gpointer userdata) - { - (void)object; - (void)result; - struct webview *w = (struct webview *)userdata; - w->priv.js_busy = 0; - } - - WEBVIEW_API int webview_eval(struct webview *w, const char *js) - { - while (w->priv.ready == 0) - { - g_main_context_iteration(NULL, TRUE); - } - w->priv.js_busy = 1; - webkit_web_view_run_javascript(WEBKIT_WEB_VIEW(w->priv.webview), js, NULL, - webview_eval_finished, w); - while (w->priv.js_busy) - { - g_main_context_iteration(NULL, TRUE); - } - return 0; - } - - static gboolean webview_dispatch_wrapper(gpointer userdata) - { - struct webview *w = (struct webview *)userdata; - for (;;) - { - struct webview_dispatch_arg *arg = - (struct webview_dispatch_arg *)g_async_queue_try_pop(w->priv.queue); - if (arg == NULL) - { - break; - } - (arg->fn)(w, arg->arg); - g_free(arg); - } - return FALSE; - } - - WEBVIEW_API void webview_dispatch(struct webview *w, webview_dispatch_fn fn, - void *arg) - { - struct webview_dispatch_arg *context = - (struct webview_dispatch_arg *)g_new(struct webview_dispatch_arg *, 1); - context->w = w; - context->arg = arg; - context->fn = fn; - g_async_queue_lock(w->priv.queue); - g_async_queue_push_unlocked(w->priv.queue, context); - if (g_async_queue_length_unlocked(w->priv.queue) == 1) - { - gdk_threads_add_idle(webview_dispatch_wrapper, w); - } - g_async_queue_unlock(w->priv.queue); - } - - WEBVIEW_API void webview_terminate(struct webview *w) - { - w->priv.should_exit = 1; - } - - WEBVIEW_API void webview_exit(struct webview *w) { (void)w; } - WEBVIEW_API void webview_print_log(const char *s) - { - fprintf(stderr, "%s\n", s); - } - -#endif /* WEBVIEW_GTK */ - -#if defined(WEBVIEW_WINAPI) - -#pragma comment(lib, "user32.lib") -#pragma comment(lib, "ole32.lib") -#pragma comment(lib, "oleaut32.lib") - -#define WM_WEBVIEW_DISPATCH (WM_APP + 1) - - typedef struct - { - IOleInPlaceFrame frame; - HWND window; - } _IOleInPlaceFrameEx; - - typedef struct - { - IOleInPlaceSite inplace; - _IOleInPlaceFrameEx frame; - } _IOleInPlaceSiteEx; - - typedef struct - { - IDocHostUIHandler ui; - } _IDocHostUIHandlerEx; - - typedef struct - { - IOleClientSite client; - _IOleInPlaceSiteEx inplace; - _IDocHostUIHandlerEx ui; - IDispatch external; - } _IOleClientSiteEx; - -#ifdef __cplusplus -#define iid_ref(x) &(x) -#define iid_unref(x) *(x) -#else -#define iid_ref(x) (x) -#define iid_unref(x) (x) -#endif - - static inline WCHAR *webview_to_utf16(const char *s) - { - DWORD size = MultiByteToWideChar(CP_UTF8, 0, s, -1, 0, 0); - WCHAR *ws = (WCHAR *)GlobalAlloc(GMEM_FIXED, sizeof(WCHAR) * size); - if (ws == NULL) - { - return NULL; - } - MultiByteToWideChar(CP_UTF8, 0, s, -1, ws, size); - return ws; - } - - static inline char *webview_from_utf16(WCHAR *ws) - { - int n = WideCharToMultiByte(CP_UTF8, 0, ws, -1, NULL, 0, NULL, NULL); - char *s = (char *)GlobalAlloc(GMEM_FIXED, n); - if (s == NULL) - { - return NULL; - } - WideCharToMultiByte(CP_UTF8, 0, ws, -1, s, n, NULL, NULL); - return s; - } - - static int iid_eq(REFIID a, const IID *b) - { - return memcmp((const void *)iid_ref(a), (const void *)b, sizeof(GUID)) == 0; - } - - static HRESULT STDMETHODCALLTYPE JS_QueryInterface(IDispatch FAR *This, - REFIID riid, - LPVOID FAR *ppvObj) - { - if (iid_eq(riid, &IID_IDispatch)) - { - *ppvObj = This; - return S_OK; - } - *ppvObj = 0; - return E_NOINTERFACE; - } - static ULONG STDMETHODCALLTYPE JS_AddRef(IDispatch FAR *This) { return 1; } - static ULONG STDMETHODCALLTYPE JS_Release(IDispatch FAR *This) { return 1; } - static HRESULT STDMETHODCALLTYPE JS_GetTypeInfoCount(IDispatch FAR *This, - UINT *pctinfo) - { - return S_OK; - } - static HRESULT STDMETHODCALLTYPE JS_GetTypeInfo(IDispatch FAR *This, - UINT iTInfo, LCID lcid, - ITypeInfo **ppTInfo) - { - return S_OK; - } -#define WEBVIEW_JS_INVOKE_ID 0x1000 - static HRESULT STDMETHODCALLTYPE JS_GetIDsOfNames(IDispatch FAR *This, - REFIID riid, - LPOLESTR *rgszNames, - UINT cNames, LCID lcid, - DISPID *rgDispId) - { - if (cNames != 1) - { - return S_FALSE; - } - if (wcscmp(rgszNames[0], L"invoke") == 0) - { - rgDispId[0] = WEBVIEW_JS_INVOKE_ID; - return S_OK; - } - return S_FALSE; - } - - static HRESULT STDMETHODCALLTYPE - JS_Invoke(IDispatch FAR *This, DISPID dispIdMember, REFIID riid, LCID lcid, - WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, - EXCEPINFO *pExcepInfo, UINT *puArgErr) - { - size_t offset = (size_t) & ((_IOleClientSiteEx *)NULL)->external; - _IOleClientSiteEx *ex = (_IOleClientSiteEx *)((char *)(This)-offset); - struct webview *w = (struct webview *)GetWindowLongPtr( - ex->inplace.frame.window, GWLP_USERDATA); - if (pDispParams->cArgs == 1 && pDispParams->rgvarg[0].vt == VT_BSTR) - { - BSTR bstr = pDispParams->rgvarg[0].bstrVal; - char *s = webview_from_utf16(bstr); - if (s != NULL) - { - if (dispIdMember == WEBVIEW_JS_INVOKE_ID) - { - if (w->external_invoke_cb != NULL) - { - w->external_invoke_cb(w, s); - } - } - else - { - return S_FALSE; - } - GlobalFree(s); - } - } - return S_OK; - } - - static IDispatchVtbl ExternalDispatchTable = { - JS_QueryInterface, JS_AddRef, JS_Release, JS_GetTypeInfoCount, - JS_GetTypeInfo, JS_GetIDsOfNames, JS_Invoke}; - - static ULONG STDMETHODCALLTYPE Site_AddRef(IOleClientSite FAR *This) - { - return 1; - } - static ULONG STDMETHODCALLTYPE Site_Release(IOleClientSite FAR *This) - { - return 1; - } - static HRESULT STDMETHODCALLTYPE Site_SaveObject(IOleClientSite FAR *This) - { - return E_NOTIMPL; - } - static HRESULT STDMETHODCALLTYPE Site_GetMoniker(IOleClientSite FAR *This, - DWORD dwAssign, - DWORD dwWhichMoniker, - IMoniker **ppmk) - { - return E_NOTIMPL; - } - static HRESULT STDMETHODCALLTYPE - Site_GetContainer(IOleClientSite FAR *This, LPOLECONTAINER FAR *ppContainer) - { - *ppContainer = 0; - return E_NOINTERFACE; - } - static HRESULT STDMETHODCALLTYPE Site_ShowObject(IOleClientSite FAR *This) - { - return NOERROR; - } - static HRESULT STDMETHODCALLTYPE Site_OnShowWindow(IOleClientSite FAR *This, - BOOL fShow) - { - return E_NOTIMPL; - } - static HRESULT STDMETHODCALLTYPE - Site_RequestNewObjectLayout(IOleClientSite FAR *This) - { - return E_NOTIMPL; - } - static HRESULT STDMETHODCALLTYPE Site_QueryInterface(IOleClientSite FAR *This, - REFIID riid, - void **ppvObject) - { - if (iid_eq(riid, &IID_IUnknown) || iid_eq(riid, &IID_IOleClientSite)) - { - *ppvObject = &((_IOleClientSiteEx *)This)->client; - } - else if (iid_eq(riid, &IID_IOleInPlaceSite)) - { - *ppvObject = &((_IOleClientSiteEx *)This)->inplace; - } - else if (iid_eq(riid, &IID_IDocHostUIHandler)) - { - *ppvObject = &((_IOleClientSiteEx *)This)->ui; - } - else - { - *ppvObject = 0; - return (E_NOINTERFACE); - } - return S_OK; - } - static HRESULT STDMETHODCALLTYPE InPlace_QueryInterface( - IOleInPlaceSite FAR *This, REFIID riid, LPVOID FAR *ppvObj) - { - return (Site_QueryInterface( - (IOleClientSite *)((char *)This - sizeof(IOleClientSite)), riid, ppvObj)); - } - static ULONG STDMETHODCALLTYPE InPlace_AddRef(IOleInPlaceSite FAR *This) - { - return 1; - } - static ULONG STDMETHODCALLTYPE InPlace_Release(IOleInPlaceSite FAR *This) - { - return 1; - } - static HRESULT STDMETHODCALLTYPE InPlace_GetWindow(IOleInPlaceSite FAR *This, - HWND FAR *lphwnd) - { - *lphwnd = ((_IOleInPlaceSiteEx FAR *)This)->frame.window; - return S_OK; - } - static HRESULT STDMETHODCALLTYPE - InPlace_ContextSensitiveHelp(IOleInPlaceSite FAR *This, BOOL fEnterMode) - { - return E_NOTIMPL; - } - static HRESULT STDMETHODCALLTYPE - InPlace_CanInPlaceActivate(IOleInPlaceSite FAR *This) - { - return S_OK; - } - static HRESULT STDMETHODCALLTYPE - InPlace_OnInPlaceActivate(IOleInPlaceSite FAR *This) - { - return S_OK; - } - static HRESULT STDMETHODCALLTYPE - InPlace_OnUIActivate(IOleInPlaceSite FAR *This) - { - return S_OK; - } - static HRESULT STDMETHODCALLTYPE InPlace_GetWindowContext( - IOleInPlaceSite FAR *This, LPOLEINPLACEFRAME FAR *lplpFrame, - LPOLEINPLACEUIWINDOW FAR *lplpDoc, LPRECT lprcPosRect, LPRECT lprcClipRect, - LPOLEINPLACEFRAMEINFO lpFrameInfo) - { - *lplpFrame = (LPOLEINPLACEFRAME) & ((_IOleInPlaceSiteEx *)This)->frame; - *lplpDoc = 0; - lpFrameInfo->fMDIApp = FALSE; - lpFrameInfo->hwndFrame = ((_IOleInPlaceFrameEx *)*lplpFrame)->window; - lpFrameInfo->haccel = 0; - lpFrameInfo->cAccelEntries = 0; - return S_OK; - } - static HRESULT STDMETHODCALLTYPE InPlace_Scroll(IOleInPlaceSite FAR *This, - SIZE scrollExtent) - { - return E_NOTIMPL; - } - static HRESULT STDMETHODCALLTYPE - InPlace_OnUIDeactivate(IOleInPlaceSite FAR *This, BOOL fUndoable) - { - return S_OK; - } - static HRESULT STDMETHODCALLTYPE - InPlace_OnInPlaceDeactivate(IOleInPlaceSite FAR *This) - { - return S_OK; - } - static HRESULT STDMETHODCALLTYPE - InPlace_DiscardUndoState(IOleInPlaceSite FAR *This) - { - return E_NOTIMPL; - } - static HRESULT STDMETHODCALLTYPE - InPlace_DeactivateAndUndo(IOleInPlaceSite FAR *This) - { - return E_NOTIMPL; - } - static HRESULT STDMETHODCALLTYPE - InPlace_OnPosRectChange(IOleInPlaceSite FAR *This, LPCRECT lprcPosRect) - { - IOleObject *browserObject; - IOleInPlaceObject *inplace; - browserObject = *((IOleObject **)((char *)This - sizeof(IOleObject *) - - sizeof(IOleClientSite))); - if (!browserObject->lpVtbl->QueryInterface(browserObject, - iid_unref(&IID_IOleInPlaceObject), - (void **)&inplace)) - { - inplace->lpVtbl->SetObjectRects(inplace, lprcPosRect, lprcPosRect); - inplace->lpVtbl->Release(inplace); - } - return S_OK; - } - static HRESULT STDMETHODCALLTYPE Frame_QueryInterface( - IOleInPlaceFrame FAR *This, REFIID riid, LPVOID FAR *ppvObj) - { - return E_NOTIMPL; - } - static ULONG STDMETHODCALLTYPE Frame_AddRef(IOleInPlaceFrame FAR *This) - { - return 1; - } - static ULONG STDMETHODCALLTYPE Frame_Release(IOleInPlaceFrame FAR *This) - { - return 1; - } - static HRESULT STDMETHODCALLTYPE Frame_GetWindow(IOleInPlaceFrame FAR *This, - HWND FAR *lphwnd) - { - *lphwnd = ((_IOleInPlaceFrameEx *)This)->window; - return S_OK; - } - static HRESULT STDMETHODCALLTYPE - Frame_ContextSensitiveHelp(IOleInPlaceFrame FAR *This, BOOL fEnterMode) - { - return E_NOTIMPL; - } - static HRESULT STDMETHODCALLTYPE Frame_GetBorder(IOleInPlaceFrame FAR *This, - LPRECT lprectBorder) - { - return E_NOTIMPL; - } - static HRESULT STDMETHODCALLTYPE Frame_RequestBorderSpace( - IOleInPlaceFrame FAR *This, LPCBORDERWIDTHS pborderwidths) - { - return E_NOTIMPL; - } - static HRESULT STDMETHODCALLTYPE Frame_SetBorderSpace( - IOleInPlaceFrame FAR *This, LPCBORDERWIDTHS pborderwidths) - { - return E_NOTIMPL; - } - static HRESULT STDMETHODCALLTYPE Frame_SetActiveObject( - IOleInPlaceFrame FAR *This, IOleInPlaceActiveObject *pActiveObject, - LPCOLESTR pszObjName) - { - return S_OK; - } - static HRESULT STDMETHODCALLTYPE - Frame_InsertMenus(IOleInPlaceFrame FAR *This, HMENU hmenuShared, - LPOLEMENUGROUPWIDTHS lpMenuWidths) - { - return E_NOTIMPL; - } - static HRESULT STDMETHODCALLTYPE Frame_SetMenu(IOleInPlaceFrame FAR *This, - HMENU hmenuShared, - HOLEMENU holemenu, - HWND hwndActiveObject) - { - return S_OK; - } - static HRESULT STDMETHODCALLTYPE Frame_RemoveMenus(IOleInPlaceFrame FAR *This, - HMENU hmenuShared) - { - return E_NOTIMPL; - } - static HRESULT STDMETHODCALLTYPE Frame_SetStatusText(IOleInPlaceFrame FAR *This, - LPCOLESTR pszStatusText) - { - return S_OK; - } - static HRESULT STDMETHODCALLTYPE - Frame_EnableModeless(IOleInPlaceFrame FAR *This, BOOL fEnable) - { - return S_OK; - } - static HRESULT STDMETHODCALLTYPE - Frame_TranslateAccelerator(IOleInPlaceFrame FAR *This, LPMSG lpmsg, WORD wID) - { - return E_NOTIMPL; - } - static HRESULT STDMETHODCALLTYPE UI_QueryInterface(IDocHostUIHandler FAR *This, - REFIID riid, - LPVOID FAR *ppvObj) - { - return (Site_QueryInterface((IOleClientSite *)((char *)This - - sizeof(IOleClientSite) - - sizeof(_IOleInPlaceSiteEx)), - riid, ppvObj)); - } - static ULONG STDMETHODCALLTYPE UI_AddRef(IDocHostUIHandler FAR *This) - { - return 1; - } - static ULONG STDMETHODCALLTYPE UI_Release(IDocHostUIHandler FAR *This) - { - return 1; - } - static HRESULT STDMETHODCALLTYPE UI_ShowContextMenu( - IDocHostUIHandler FAR *This, DWORD dwID, POINT __RPC_FAR *ppt, - IUnknown __RPC_FAR *pcmdtReserved, IDispatch __RPC_FAR *pdispReserved) - { - return S_OK; - } - static HRESULT STDMETHODCALLTYPE - UI_GetHostInfo(IDocHostUIHandler FAR *This, DOCHOSTUIINFO __RPC_FAR *pInfo) - { - pInfo->cbSize = sizeof(DOCHOSTUIINFO); - pInfo->dwFlags = DOCHOSTUIFLAG_NO3DBORDER; - pInfo->dwDoubleClick = DOCHOSTUIDBLCLK_DEFAULT; - return S_OK; - } - static HRESULT STDMETHODCALLTYPE UI_ShowUI( - IDocHostUIHandler FAR *This, DWORD dwID, - IOleInPlaceActiveObject __RPC_FAR *pActiveObject, - IOleCommandTarget __RPC_FAR *pCommandTarget, - IOleInPlaceFrame __RPC_FAR *pFrame, IOleInPlaceUIWindow __RPC_FAR *pDoc) - { - return S_OK; - } - static HRESULT STDMETHODCALLTYPE UI_HideUI(IDocHostUIHandler FAR *This) - { - return S_OK; - } - static HRESULT STDMETHODCALLTYPE UI_UpdateUI(IDocHostUIHandler FAR *This) - { - return S_OK; - } - static HRESULT STDMETHODCALLTYPE UI_EnableModeless(IDocHostUIHandler FAR *This, - BOOL fEnable) - { - return S_OK; - } - static HRESULT STDMETHODCALLTYPE - UI_OnDocWindowActivate(IDocHostUIHandler FAR *This, BOOL fActivate) - { - return S_OK; - } - static HRESULT STDMETHODCALLTYPE - UI_OnFrameWindowActivate(IDocHostUIHandler FAR *This, BOOL fActivate) - { - return S_OK; - } - static HRESULT STDMETHODCALLTYPE - UI_ResizeBorder(IDocHostUIHandler FAR *This, LPCRECT prcBorder, - IOleInPlaceUIWindow __RPC_FAR *pUIWindow, BOOL fRameWindow) - { - return S_OK; - } - static HRESULT STDMETHODCALLTYPE - UI_TranslateAccelerator(IDocHostUIHandler FAR *This, LPMSG lpMsg, - const GUID __RPC_FAR *pguidCmdGroup, DWORD nCmdID) - { - return S_FALSE; - } - static HRESULT STDMETHODCALLTYPE UI_GetOptionKeyPath( - IDocHostUIHandler FAR *This, LPOLESTR __RPC_FAR *pchKey, DWORD dw) - { - return S_FALSE; - } - static HRESULT STDMETHODCALLTYPE UI_GetDropTarget( - IDocHostUIHandler FAR *This, IDropTarget __RPC_FAR *pDropTarget, - IDropTarget __RPC_FAR *__RPC_FAR *ppDropTarget) - { - return S_FALSE; - } - static HRESULT STDMETHODCALLTYPE UI_GetExternal( - IDocHostUIHandler FAR *This, IDispatch __RPC_FAR *__RPC_FAR *ppDispatch) - { - *ppDispatch = (IDispatch *)(This + 1); - return S_OK; - } - static HRESULT STDMETHODCALLTYPE UI_TranslateUrl( - IDocHostUIHandler FAR *This, DWORD dwTranslate, OLECHAR __RPC_FAR *pchURLIn, - OLECHAR __RPC_FAR *__RPC_FAR *ppchURLOut) - { - *ppchURLOut = 0; - return S_FALSE; - } - static HRESULT STDMETHODCALLTYPE - UI_FilterDataObject(IDocHostUIHandler FAR *This, IDataObject __RPC_FAR *pDO, - IDataObject __RPC_FAR *__RPC_FAR *ppDORet) - { - *ppDORet = 0; - return S_FALSE; - } - - static const TCHAR *classname = TEXT("WebView"); - static const SAFEARRAYBOUND ArrayBound = {1, 0}; - - static IOleClientSiteVtbl MyIOleClientSiteTable = { - Site_QueryInterface, Site_AddRef, Site_Release, - Site_SaveObject, Site_GetMoniker, Site_GetContainer, - Site_ShowObject, Site_OnShowWindow, Site_RequestNewObjectLayout}; - static IOleInPlaceSiteVtbl MyIOleInPlaceSiteTable = { - InPlace_QueryInterface, - InPlace_AddRef, - InPlace_Release, - InPlace_GetWindow, - InPlace_ContextSensitiveHelp, - InPlace_CanInPlaceActivate, - InPlace_OnInPlaceActivate, - InPlace_OnUIActivate, - InPlace_GetWindowContext, - InPlace_Scroll, - InPlace_OnUIDeactivate, - InPlace_OnInPlaceDeactivate, - InPlace_DiscardUndoState, - InPlace_DeactivateAndUndo, - InPlace_OnPosRectChange}; - - static IOleInPlaceFrameVtbl MyIOleInPlaceFrameTable = { - Frame_QueryInterface, - Frame_AddRef, - Frame_Release, - Frame_GetWindow, - Frame_ContextSensitiveHelp, - Frame_GetBorder, - Frame_RequestBorderSpace, - Frame_SetBorderSpace, - Frame_SetActiveObject, - Frame_InsertMenus, - Frame_SetMenu, - Frame_RemoveMenus, - Frame_SetStatusText, - Frame_EnableModeless, - Frame_TranslateAccelerator}; - - static IDocHostUIHandlerVtbl MyIDocHostUIHandlerTable = { - UI_QueryInterface, - UI_AddRef, - UI_Release, - UI_ShowContextMenu, - UI_GetHostInfo, - UI_ShowUI, - UI_HideUI, - UI_UpdateUI, - UI_EnableModeless, - UI_OnDocWindowActivate, - UI_OnFrameWindowActivate, - UI_ResizeBorder, - UI_TranslateAccelerator, - UI_GetOptionKeyPath, - UI_GetDropTarget, - UI_GetExternal, - UI_TranslateUrl, - UI_FilterDataObject}; - - static void UnEmbedBrowserObject(struct webview *w) - { - if (w->priv.browser != NULL) - { - (*w->priv.browser)->lpVtbl->Close(*w->priv.browser, OLECLOSE_NOSAVE); - (*w->priv.browser)->lpVtbl->Release(*w->priv.browser); - GlobalFree(w->priv.browser); - w->priv.browser = NULL; - } - } - - static int EmbedBrowserObject(struct webview *w) - { - RECT rect; - IWebBrowser2 *webBrowser2 = NULL; - LPCLASSFACTORY pClassFactory = NULL; - _IOleClientSiteEx *_iOleClientSiteEx = NULL; - IOleObject **browser = (IOleObject **)GlobalAlloc( - GMEM_FIXED, sizeof(IOleObject *) + sizeof(_IOleClientSiteEx)); - if (browser == NULL) - { - goto error; - } - w->priv.browser = browser; - - _iOleClientSiteEx = (_IOleClientSiteEx *)(browser + 1); - _iOleClientSiteEx->client.lpVtbl = &MyIOleClientSiteTable; - _iOleClientSiteEx->inplace.inplace.lpVtbl = &MyIOleInPlaceSiteTable; - _iOleClientSiteEx->inplace.frame.frame.lpVtbl = &MyIOleInPlaceFrameTable; - _iOleClientSiteEx->inplace.frame.window = w->priv.hwnd; - _iOleClientSiteEx->ui.ui.lpVtbl = &MyIDocHostUIHandlerTable; - _iOleClientSiteEx->external.lpVtbl = &ExternalDispatchTable; - - if (CoGetClassObject(iid_unref(&CLSID_WebBrowser), - CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER, NULL, - iid_unref(&IID_IClassFactory), - (void **)&pClassFactory) != S_OK) - { - goto error; - } - - if (pClassFactory == NULL) - { - goto error; - } - - if (pClassFactory->lpVtbl->CreateInstance(pClassFactory, 0, - iid_unref(&IID_IOleObject), - (void **)browser) != S_OK) - { - goto error; - } - pClassFactory->lpVtbl->Release(pClassFactory); - if ((*browser)->lpVtbl->SetClientSite( - *browser, (IOleClientSite *)_iOleClientSiteEx) != S_OK) - { - goto error; - } - (*browser)->lpVtbl->SetHostNames(*browser, L"My Host Name", 0); - - if (OleSetContainedObject((struct IUnknown *)(*browser), TRUE) != S_OK) - { - goto error; - } - GetClientRect(w->priv.hwnd, &rect); - if ((*browser)->lpVtbl->DoVerb((*browser), OLEIVERB_SHOW, NULL, - (IOleClientSite *)_iOleClientSiteEx, -1, - w->priv.hwnd, &rect) != S_OK) - { - goto error; - } - if ((*browser)->lpVtbl->QueryInterface((*browser), - iid_unref(&IID_IWebBrowser2), - (void **)&webBrowser2) != S_OK) - { - goto error; - } - - webBrowser2->lpVtbl->put_Left(webBrowser2, 0); - webBrowser2->lpVtbl->put_Top(webBrowser2, 0); - webBrowser2->lpVtbl->put_Width(webBrowser2, rect.right); - webBrowser2->lpVtbl->put_Height(webBrowser2, rect.bottom); - webBrowser2->lpVtbl->Release(webBrowser2); - - return 0; - error: - UnEmbedBrowserObject(w); - if (pClassFactory != NULL) - { - pClassFactory->lpVtbl->Release(pClassFactory); - } - if (browser != NULL) - { - GlobalFree(browser); - } - return -1; - } - -#define WEBVIEW_DATA_URL_PREFIX "data:text/html," - static int DisplayHTMLPage(struct webview *w) - { - IWebBrowser2 *webBrowser2; - VARIANT myURL; - LPDISPATCH lpDispatch; - IHTMLDocument2 *htmlDoc2; - BSTR bstr; - IOleObject *browserObject; - SAFEARRAY *sfArray; - VARIANT *pVar; - browserObject = *w->priv.browser; - int isDataURL = 0; - const char *webview_url = webview_check_url(w->url); - if (!browserObject->lpVtbl->QueryInterface( - browserObject, iid_unref(&IID_IWebBrowser2), (void **)&webBrowser2)) - { - LPCSTR webPageName; - isDataURL = (strncmp(webview_url, WEBVIEW_DATA_URL_PREFIX, - strlen(WEBVIEW_DATA_URL_PREFIX)) == 0); - if (isDataURL) - { - webPageName = "about:blank"; - } - else - { - webPageName = (LPCSTR)webview_url; - } - VariantInit(&myURL); - myURL.vt = VT_BSTR; - // #ifndef UNICODE - { - wchar_t *buffer = webview_to_utf16(webPageName); - if (buffer == NULL) - { - goto badalloc; - } - myURL.bstrVal = SysAllocString(buffer); - GlobalFree(buffer); - } - // #else - // myURL.bstrVal = SysAllocString(webPageName); - // #endif - if (!myURL.bstrVal) - { - badalloc: - webBrowser2->lpVtbl->Release(webBrowser2); - return (-6); - } - webBrowser2->lpVtbl->Navigate2(webBrowser2, &myURL, 0, 0, 0, 0); - VariantClear(&myURL); - if (!isDataURL) - { - return 0; - } - - char *url = (char *)calloc(1, strlen(webview_url) + 1); - char *q = url; - for (const char *p = webview_url + strlen(WEBVIEW_DATA_URL_PREFIX); *q = *p; - p++, q++) - { - if (*q == '%' && *(p + 1) && *(p + 2)) - { - sscanf(p + 1, "%02x", q); - p = p + 2; - } - } - - if (webBrowser2->lpVtbl->get_Document(webBrowser2, &lpDispatch) == S_OK) - { - if (lpDispatch->lpVtbl->QueryInterface(lpDispatch, - iid_unref(&IID_IHTMLDocument2), - (void **)&htmlDoc2) == S_OK) - { - if ((sfArray = SafeArrayCreate(VT_VARIANT, 1, - (SAFEARRAYBOUND *)&ArrayBound))) - { - if (!SafeArrayAccessData(sfArray, (void **)&pVar)) - { - pVar->vt = VT_BSTR; - // #ifndef UNICODE - { - wchar_t *buffer = webview_to_utf16(url); - if (buffer == NULL) - { - goto release; - } - bstr = SysAllocString(buffer); - GlobalFree(buffer); - } - // #else - // bstr = SysAllocString(url); - // #endif - if ((pVar->bstrVal = bstr)) - { - htmlDoc2->lpVtbl->write(htmlDoc2, sfArray); - htmlDoc2->lpVtbl->close(htmlDoc2); - } - } - SafeArrayDestroy(sfArray); - } - release: - free(url); - htmlDoc2->lpVtbl->Release(htmlDoc2); - } - lpDispatch->lpVtbl->Release(lpDispatch); - } - webBrowser2->lpVtbl->Release(webBrowser2); - return (0); - } - return (-5); - } - - static LRESULT CALLBACK wndproc(HWND hwnd, UINT uMsg, WPARAM wParam, - LPARAM lParam) - { - struct webview *w = (struct webview *)GetWindowLongPtr(hwnd, GWLP_USERDATA); - switch (uMsg) - { - case WM_CREATE: - w = (struct webview *)((CREATESTRUCT *)lParam)->lpCreateParams; - w->priv.hwnd = hwnd; - - return EmbedBrowserObject(w); - case WM_GETMINMAXINFO: - { - if (w != NULL) { - // get pixel density - HDC hDC = GetDC(NULL); - double DPIScaleX = GetDeviceCaps(hDC, 88)/96.0; - double DPIScaleY = GetDeviceCaps(hDC, 90)/96.0; - ReleaseDC(NULL, hDC); - - RECT rcClient, rcWind; - POINT ptDiff; - GetClientRect(hwnd, &rcClient); - GetWindowRect(hwnd, &rcWind); - - int widthExtra = (rcWind.right - rcWind.left) - rcClient.right; - int heightExtra = (rcWind.bottom - rcWind.top) - rcClient.bottom; - - LPMINMAXINFO lpMMI = (LPMINMAXINFO)lParam; - - if (w->priv.min_width != -1) { - lpMMI->ptMinTrackSize.x = w->priv.min_width * DPIScaleX + widthExtra; - lpMMI->ptMinTrackSize.y = w->priv.min_height * DPIScaleY + heightExtra; - } - if (w->priv.max_width != -1) { - lpMMI->ptMaxTrackSize.x = w->priv.max_width * DPIScaleX + widthExtra; - lpMMI->ptMaxTrackSize.y = w->priv.max_height * DPIScaleY + heightExtra; - } - } - - return 0; - } - case WM_DESTROY: - UnEmbedBrowserObject(w); - PostQuitMessage(0); - return TRUE; - case WM_SIZE: - { - IWebBrowser2 *webBrowser2; - IOleObject *browser = *w->priv.browser; - if (browser->lpVtbl->QueryInterface(browser, iid_unref(&IID_IWebBrowser2), - (void **)&webBrowser2) == S_OK) - { - RECT rect; - GetClientRect(hwnd, &rect); - webBrowser2->lpVtbl->put_Width(webBrowser2, rect.right); - webBrowser2->lpVtbl->put_Height(webBrowser2, rect.bottom); - } - return TRUE; - } - case WM_WEBVIEW_DISPATCH: - { - webview_dispatch_fn f = (webview_dispatch_fn)wParam; - void *arg = (void *)lParam; - (*f)(w, arg); - return TRUE; - } - } - return DefWindowProc(hwnd, uMsg, wParam, lParam); - } - -#define WEBVIEW_KEY_FEATURE_BROWSER_EMULATION \ - "Software\\Microsoft\\Internet " \ - "Explorer\\Main\\FeatureControl\\FEATURE_BROWSER_EMULATION" - - static int webview_fix_ie_compat_mode() - { - HKEY hKey; - DWORD ie_version = 11000; - TCHAR appname[MAX_PATH + 1]; - TCHAR *p; - if (GetModuleFileName(NULL, appname, MAX_PATH + 1) == 0) - { - return -1; - } - for (p = &appname[strlen(appname) - 1]; p != appname && *p != '\\'; p--) - { - } - p++; - if (RegCreateKey(HKEY_CURRENT_USER, WEBVIEW_KEY_FEATURE_BROWSER_EMULATION, - &hKey) != ERROR_SUCCESS) - { - return -1; - } - if (RegSetValueEx(hKey, p, 0, REG_DWORD, (BYTE *)&ie_version, - sizeof(ie_version)) != ERROR_SUCCESS) - { - RegCloseKey(hKey); - return -1; - } - RegCloseKey(hKey); - return 0; - } - - WEBVIEW_API int webview_init(struct webview *w) - { - w->priv.min_width = -1; - w->priv.max_width = -1; - - WNDCLASSEX wc; - HINSTANCE hInstance; - DWORD style; - RECT clientRect; - RECT rect; - - if (webview_fix_ie_compat_mode() < 0) - { - return -1; - } - - hInstance = GetModuleHandle(NULL); - if (hInstance == NULL) - { - return -1; - } - if (OleInitialize(NULL) != S_OK) - { - return -1; - } - - ZeroMemory(&wc, sizeof(WNDCLASSEX)); - wc.cbSize = sizeof(WNDCLASSEX); - wc.hInstance = hInstance; - wc.lpfnWndProc = wndproc; - wc.lpszClassName = classname; - wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(100)); - wc.hIconSm = LoadIcon(hInstance, MAKEINTRESOURCE(100)); - RegisterClassEx(&wc); - - style = WS_OVERLAPPEDWINDOW; - if (!w->resizable) - { - style = WS_OVERLAPPED | WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU; - } - - // Scale - // Credit: https://github.com/webview/webview/issues/54#issuecomment-379528243 - HDC hDC = GetDC(NULL); - w->width = GetDeviceCaps(hDC, 88)*w->width/96.0; - w->height = GetDeviceCaps(hDC, 90)*w->height/96.0; - ReleaseDC(NULL, hDC); - - rect.left = 0; - rect.top = 0; - rect.right = w->width; - rect.bottom = w->height; - AdjustWindowRect(&rect, WS_OVERLAPPEDWINDOW, 0); - - GetClientRect(GetDesktopWindow(), &clientRect); - int left = (clientRect.right / 2) - ((rect.right - rect.left) / 2); - int top = (clientRect.bottom / 2) - ((rect.bottom - rect.top) / 2); - rect.right = rect.right - rect.left + left; - rect.left = left; - rect.bottom = rect.bottom - rect.top + top; - rect.top = top; - -#ifdef UNICODE - wchar_t *u16title = webview_to_utf16(w->title); - if (u16title == NULL) - { - return -1; - } - - w->priv.hwnd = - CreateWindowEx(0, classname, u16title, style, rect.left, rect.top, - rect.right - rect.left, rect.bottom - rect.top, - HWND_DESKTOP, NULL, hInstance, (void *)w); -#else - w->priv.hwnd = - CreateWindowEx(0, classname, w->title, style, rect.left, rect.top, - rect.right - rect.left, rect.bottom - rect.top, - HWND_DESKTOP, NULL, hInstance, (void *)w); -#endif - - if (w->priv.hwnd == 0) - { - OleUninitialize(); - return -1; - } - - SetWindowLongPtr(w->priv.hwnd, GWLP_USERDATA, (LONG_PTR)w); - - DisplayHTMLPage(w); - -#ifdef UNICODE - SetWindowText(w->priv.hwnd, u16title); - GlobalFree(u16title); -#else - SetWindowText(w->priv.hwnd, w->title); -#endif - - ShowWindow(w->priv.hwnd, SW_SHOWDEFAULT); - UpdateWindow(w->priv.hwnd); - SetFocus(w->priv.hwnd); - - return 0; - } - - WEBVIEW_API int webview_loop(struct webview *w, int blocking) - { - MSG msg; - if (blocking) - { - GetMessage(&msg, 0, 0, 0); - } - else - { - PeekMessage(&msg, 0, 0, 0, PM_REMOVE); - } - switch (msg.message) - { - case WM_QUIT: - return -1; - case WM_COMMAND: - case WM_KEYDOWN: - case WM_KEYUP: - { - // Disable refresh when pressing F5 on windows - if (msg.wParam == VK_F5) - { - break; - } - HRESULT r = S_OK; - IWebBrowser2 *webBrowser2; - IOleObject *browser = *w->priv.browser; - if (browser->lpVtbl->QueryInterface(browser, iid_unref(&IID_IWebBrowser2), - (void **)&webBrowser2) == S_OK) - { - IOleInPlaceActiveObject *pIOIPAO; - if (browser->lpVtbl->QueryInterface( - browser, iid_unref(&IID_IOleInPlaceActiveObject), - (void **)&pIOIPAO) == S_OK) - { - r = pIOIPAO->lpVtbl->TranslateAccelerator(pIOIPAO, &msg); - pIOIPAO->lpVtbl->Release(pIOIPAO); - } - webBrowser2->lpVtbl->Release(webBrowser2); - } - if (r != S_FALSE) - { - break; - } - } - default: - TranslateMessage(&msg); - DispatchMessage(&msg); - } - return 0; - } - - WEBVIEW_API int webview_eval(struct webview *w, const char *js) - { - IWebBrowser2 *webBrowser2; - IHTMLDocument2 *htmlDoc2; - IDispatch *docDispatch; - IDispatch *scriptDispatch; - if ((*w->priv.browser) - ->lpVtbl->QueryInterface((*w->priv.browser), - iid_unref(&IID_IWebBrowser2), - (void **)&webBrowser2) != S_OK) - { - return -1; - } - - if (webBrowser2->lpVtbl->get_Document(webBrowser2, &docDispatch) != S_OK) - { - return -1; - } - if (docDispatch->lpVtbl->QueryInterface(docDispatch, - iid_unref(&IID_IHTMLDocument2), - (void **)&htmlDoc2) != S_OK) - { - return -1; - } - if (htmlDoc2->lpVtbl->get_Script(htmlDoc2, &scriptDispatch) != S_OK) - { - return -1; - } - DISPID dispid; - BSTR evalStr = SysAllocString(L"eval"); - if (scriptDispatch->lpVtbl->GetIDsOfNames( - scriptDispatch, iid_unref(&IID_NULL), &evalStr, 1, - LOCALE_SYSTEM_DEFAULT, &dispid) != S_OK) - { - SysFreeString(evalStr); - return -1; - } - SysFreeString(evalStr); - - DISPPARAMS params; - VARIANT arg; - VARIANT result; - EXCEPINFO excepInfo; - UINT nArgErr = (UINT)-1; - params.cArgs = 1; - params.cNamedArgs = 0; - params.rgvarg = &arg; - arg.vt = VT_BSTR; - static const char *prologue = "(function(){"; - static const char *epilogue = ";})();"; - int n = strlen(prologue) + strlen(epilogue) + strlen(js) + 1; - char *eval = (char *)malloc(n); - snprintf(eval, n, "%s%s%s", prologue, js, epilogue); - wchar_t *buf = webview_to_utf16(eval); - if (buf == NULL) - { - return -1; - } - arg.bstrVal = SysAllocString(buf); - if (scriptDispatch->lpVtbl->Invoke( - scriptDispatch, dispid, iid_unref(&IID_NULL), 0, DISPATCH_METHOD, - ¶ms, &result, &excepInfo, &nArgErr) != S_OK) - { - return -1; - } - SysFreeString(arg.bstrVal); - free(eval); - scriptDispatch->lpVtbl->Release(scriptDispatch); - htmlDoc2->lpVtbl->Release(htmlDoc2); - docDispatch->lpVtbl->Release(docDispatch); - return 0; - } - - WEBVIEW_API void webview_dispatch(struct webview *w, webview_dispatch_fn fn, - void *arg) - { - PostMessageW(w->priv.hwnd, WM_WEBVIEW_DISPATCH, (WPARAM)fn, (LPARAM)arg); - } - - WEBVIEW_API void webview_set_title(struct webview *w, const char *title) - { -#ifdef UNICODE - wchar_t *u16title = webview_to_utf16(title); - if (u16title == NULL) - { - return; - } - SetWindowText(w->priv.hwnd, u16title); - GlobalFree(u16title); -#else - SetWindowText(w->priv.hwnd, title); -#endif - } - - WEBVIEW_API void webview_focus(struct webview *w) - { - SetFocus(w->priv.hwnd); - } - - WEBVIEW_API void webview_minsize(struct webview *w, int width, int height) { - w->priv.min_width = width; - w->priv.min_height = height; - } - - WEBVIEW_API void webview_maxsize(struct webview *w, int width, int height) { - w->priv.max_width = width; - w->priv.max_height = height; - } - - WEBVIEW_API void webview_set_fullscreen(struct webview *w, int fullscreen) - { - if (w->priv.is_fullscreen == !!fullscreen) - { - return; - } - if (w->priv.is_fullscreen == 0) - { - w->priv.saved_style = GetWindowLong(w->priv.hwnd, GWL_STYLE); - w->priv.saved_ex_style = GetWindowLong(w->priv.hwnd, GWL_EXSTYLE); - GetWindowRect(w->priv.hwnd, &w->priv.saved_rect); - } - w->priv.is_fullscreen = !!fullscreen; - if (fullscreen) - { - MONITORINFO monitor_info; - SetWindowLong(w->priv.hwnd, GWL_STYLE, - w->priv.saved_style & ~(WS_CAPTION | WS_THICKFRAME)); - SetWindowLong(w->priv.hwnd, GWL_EXSTYLE, - w->priv.saved_ex_style & - ~(WS_EX_DLGMODALFRAME | WS_EX_WINDOWEDGE | - WS_EX_CLIENTEDGE | WS_EX_STATICEDGE)); - monitor_info.cbSize = sizeof(monitor_info); - GetMonitorInfo(MonitorFromWindow(w->priv.hwnd, MONITOR_DEFAULTTONEAREST), - &monitor_info); - RECT r; - r.left = monitor_info.rcMonitor.left; - r.top = monitor_info.rcMonitor.top; - r.right = monitor_info.rcMonitor.right; - r.bottom = monitor_info.rcMonitor.bottom; - SetWindowPos(w->priv.hwnd, NULL, r.left, r.top, r.right - r.left, - r.bottom - r.top, - SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED); - } - else - { - SetWindowLong(w->priv.hwnd, GWL_STYLE, w->priv.saved_style); - SetWindowLong(w->priv.hwnd, GWL_EXSTYLE, w->priv.saved_ex_style); - SetWindowPos(w->priv.hwnd, NULL, w->priv.saved_rect.left, - w->priv.saved_rect.top, - w->priv.saved_rect.right - w->priv.saved_rect.left, - w->priv.saved_rect.bottom - w->priv.saved_rect.top, - SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED); - } - } - - WEBVIEW_API void webview_set_color(struct webview *w, uint8_t r, uint8_t g, - uint8_t b, uint8_t a) - { - HBRUSH brush = CreateSolidBrush(RGB(r, g, b)); - SetClassLongPtr(w->priv.hwnd, GCLP_HBRBACKGROUND, (LONG_PTR)brush); - } - -/* These are missing parts from MinGW */ -#ifndef __IFileDialog_INTERFACE_DEFINED__ -#define __IFileDialog_INTERFACE_DEFINED__ - enum _FILEOPENDIALOGOPTIONS - { - FOS_OVERWRITEPROMPT = 0x2, - FOS_STRICTFILETYPES = 0x4, - FOS_NOCHANGEDIR = 0x8, - FOS_PICKFOLDERS = 0x20, - FOS_FORCEFILESYSTEM = 0x40, - FOS_ALLNONSTORAGEITEMS = 0x80, - FOS_NOVALIDATE = 0x100, - FOS_ALLOWMULTISELECT = 0x200, - FOS_PATHMUSTEXIST = 0x800, - FOS_FILEMUSTEXIST = 0x1000, - FOS_CREATEPROMPT = 0x2000, - FOS_SHAREAWARE = 0x4000, - FOS_NOREADONLYRETURN = 0x8000, - FOS_NOTESTFILECREATE = 0x10000, - FOS_HIDEMRUPLACES = 0x20000, - FOS_HIDEPINNEDPLACES = 0x40000, - FOS_NODEREFERENCELINKS = 0x100000, - FOS_DONTADDTORECENT = 0x2000000, - FOS_FORCESHOWHIDDEN = 0x10000000, - FOS_DEFAULTNOMINIMODE = 0x20000000, - FOS_FORCEPREVIEWPANEON = 0x40000000 - }; - typedef DWORD FILEOPENDIALOGOPTIONS; - typedef enum FDAP - { - FDAP_BOTTOM = 0, - FDAP_TOP = 1 - } FDAP; - DEFINE_GUID(IID_IFileDialog, 0x42f85136, 0xdb7e, 0x439c, 0x85, 0xf1, 0xe4, 0x07, - 0x5d, 0x13, 0x5f, 0xc8); - typedef struct IFileDialogVtbl - { - BEGIN_INTERFACE - HRESULT(STDMETHODCALLTYPE *QueryInterface) - (IFileDialog *This, REFIID riid, void **ppvObject); - ULONG(STDMETHODCALLTYPE *AddRef) - (IFileDialog *This); - ULONG(STDMETHODCALLTYPE *Release) - (IFileDialog *This); - HRESULT(STDMETHODCALLTYPE *Show) - (IFileDialog *This, HWND hwndOwner); - HRESULT(STDMETHODCALLTYPE *SetFileTypes) - (IFileDialog *This, UINT cFileTypes, const COMDLG_FILTERSPEC *rgFilterSpec); - HRESULT(STDMETHODCALLTYPE *SetFileTypeIndex) - (IFileDialog *This, UINT iFileType); - HRESULT(STDMETHODCALLTYPE *GetFileTypeIndex) - (IFileDialog *This, UINT *piFileType); - HRESULT(STDMETHODCALLTYPE *Advise) - (IFileDialog *This, IFileDialogEvents *pfde, DWORD *pdwCookie); - HRESULT(STDMETHODCALLTYPE *Unadvise) - (IFileDialog *This, DWORD dwCookie); - HRESULT(STDMETHODCALLTYPE *SetOptions) - (IFileDialog *This, FILEOPENDIALOGOPTIONS fos); - HRESULT(STDMETHODCALLTYPE *GetOptions) - (IFileDialog *This, FILEOPENDIALOGOPTIONS *pfos); - HRESULT(STDMETHODCALLTYPE *SetDefaultFolder) - (IFileDialog *This, IShellItem *psi); - HRESULT(STDMETHODCALLTYPE *SetFolder) - (IFileDialog *This, IShellItem *psi); - HRESULT(STDMETHODCALLTYPE *GetFolder) - (IFileDialog *This, IShellItem **ppsi); - HRESULT(STDMETHODCALLTYPE *GetCurrentSelection) - (IFileDialog *This, IShellItem **ppsi); - HRESULT(STDMETHODCALLTYPE *SetFileName) - (IFileDialog *This, LPCWSTR pszName); - HRESULT(STDMETHODCALLTYPE *GetFileName) - (IFileDialog *This, LPWSTR *pszName); - HRESULT(STDMETHODCALLTYPE *SetTitle) - (IFileDialog *This, LPCWSTR pszTitle); - HRESULT(STDMETHODCALLTYPE *SetOkButtonLabel) - (IFileDialog *This, LPCWSTR pszText); - HRESULT(STDMETHODCALLTYPE *SetFileNameLabel) - (IFileDialog *This, LPCWSTR pszLabel); - HRESULT(STDMETHODCALLTYPE *GetResult) - (IFileDialog *This, IShellItem **ppsi); - HRESULT(STDMETHODCALLTYPE *AddPlace) - (IFileDialog *This, IShellItem *psi, FDAP fdap); - HRESULT(STDMETHODCALLTYPE *SetDefaultExtension) - (IFileDialog *This, LPCWSTR pszDefaultExtension); - HRESULT(STDMETHODCALLTYPE *Close) - (IFileDialog *This, HRESULT hr); - HRESULT(STDMETHODCALLTYPE *SetClientGuid) - (IFileDialog *This, REFGUID guid); - HRESULT(STDMETHODCALLTYPE *ClearClientData) - (IFileDialog *This); - HRESULT(STDMETHODCALLTYPE *SetFilter) - (IFileDialog *This, IShellItemFilter *pFilter); - END_INTERFACE - } IFileDialogVtbl; - interface IFileDialog - { - CONST_VTBL IFileDialogVtbl *lpVtbl; - }; - DEFINE_GUID(IID_IFileOpenDialog, 0xd57c7288, 0xd4ad, 0x4768, 0xbe, 0x02, 0x9d, - 0x96, 0x95, 0x32, 0xd9, 0x60); - DEFINE_GUID(IID_IFileSaveDialog, 0x84bccd23, 0x5fde, 0x4cdb, 0xae, 0xa4, 0xaf, - 0x64, 0xb8, 0x3d, 0x78, 0xab); -#endif - - WEBVIEW_API void webview_dialog(struct webview *w, - enum webview_dialog_type dlgtype, int flags, - const char *title, const char *arg, - char *result, size_t resultsz, char *filter) - { - if (dlgtype == WEBVIEW_DIALOG_TYPE_OPEN || - dlgtype == WEBVIEW_DIALOG_TYPE_SAVE) - { - IFileDialog *dlg = NULL; - IShellItem *res = NULL; - WCHAR *ws = NULL; - char *s = NULL; - FILEOPENDIALOGOPTIONS opts, add_opts; - if (dlgtype == WEBVIEW_DIALOG_TYPE_OPEN) - { - if (CoCreateInstance( - iid_unref(&CLSID_FileOpenDialog), NULL, CLSCTX_INPROC_SERVER, - iid_unref(&IID_IFileOpenDialog), (void **)&dlg) != S_OK) - { - goto error_dlg; - } - if (flags & WEBVIEW_DIALOG_FLAG_DIRECTORY) - { - add_opts |= FOS_PICKFOLDERS; - } - add_opts |= FOS_NOCHANGEDIR | FOS_ALLNONSTORAGEITEMS | FOS_NOVALIDATE | - FOS_PATHMUSTEXIST | FOS_FILEMUSTEXIST | FOS_SHAREAWARE | - FOS_NOTESTFILECREATE | FOS_NODEREFERENCELINKS | - FOS_FORCESHOWHIDDEN | FOS_DEFAULTNOMINIMODE; - } - else - { - if (CoCreateInstance( - iid_unref(&CLSID_FileSaveDialog), NULL, CLSCTX_INPROC_SERVER, - iid_unref(&IID_IFileSaveDialog), (void **)&dlg) != S_OK) - { - goto error_dlg; - } - add_opts |= FOS_OVERWRITEPROMPT | FOS_NOCHANGEDIR | - FOS_ALLNONSTORAGEITEMS | FOS_NOVALIDATE | FOS_SHAREAWARE | - FOS_NOTESTFILECREATE | FOS_NODEREFERENCELINKS | - FOS_FORCESHOWHIDDEN | FOS_DEFAULTNOMINIMODE; - } - if (filter[0] != '\0') - { - int count; - int i=0; - char* token; - char* filter_dup = strdup(filter); - for (count=1; filter[count]; filter[count]==',' ? count++ : *filter++); - COMDLG_FILTERSPEC rgSpec[count]; - char* filters[count]; - token = strtok(filter_dup, ","); - while(token != NULL) - { - filters[i] = token; - token = strtok(NULL, ","); - i++; - } - for (int i=0; i < count; i++) { - wchar_t *wFilter = (wchar_t *)malloc(4096); - MultiByteToWideChar(CP_ACP, 0, filters[i], -1, wFilter, 4096); - rgSpec[i].pszName = wFilter; - rgSpec[i].pszSpec = wFilter; - } - if (dlg->lpVtbl->SetFileTypes(dlg, count, rgSpec) != S_OK) { - goto error_dlg; - } - } - if (dlg->lpVtbl->GetOptions(dlg, &opts) != S_OK) - { - goto error_dlg; - } - opts &= ~FOS_NOREADONLYRETURN; - opts |= add_opts; - if (dlg->lpVtbl->SetOptions(dlg, opts) != S_OK) - { - goto error_dlg; - } - if (dlg->lpVtbl->Show(dlg, w->priv.hwnd) != S_OK) - { - goto error_dlg; - } - if (dlg->lpVtbl->GetResult(dlg, &res) != S_OK) - { - goto error_dlg; - } - if (res->lpVtbl->GetDisplayName(res, SIGDN_FILESYSPATH, &ws) != S_OK) - { - goto error_result; - } - s = webview_from_utf16(ws); - strncpy(result, s, resultsz); - result[resultsz - 1] = '\0'; - CoTaskMemFree(ws); - error_result: - res->lpVtbl->Release(res); - error_dlg: - dlg->lpVtbl->Release(dlg); - return; - } - else if (dlgtype == WEBVIEW_DIALOG_TYPE_ALERT) - { -#if 0 - /* MinGW often doesn't contain TaskDialog, we'll use MessageBox for now */ - WCHAR *wtitle = webview_to_utf16(title); - WCHAR *warg = webview_to_utf16(arg); - TaskDialog(w->priv.hwnd, NULL, NULL, wtitle, warg, 0, NULL, NULL); - GlobalFree(warg); - GlobalFree(wtitle); -#else - UINT type = MB_OK; - switch (flags & WEBVIEW_DIALOG_FLAG_ALERT_MASK) - { - case WEBVIEW_DIALOG_FLAG_INFO: - type |= MB_ICONINFORMATION; - break; - case WEBVIEW_DIALOG_FLAG_WARNING: - type |= MB_ICONWARNING; - break; - case WEBVIEW_DIALOG_FLAG_ERROR: - type |= MB_ICONERROR; - break; - } - MessageBox(w->priv.hwnd, arg, title, type); -#endif - } - } - - WEBVIEW_API void webview_terminate(struct webview *w) { PostQuitMessage(0); } - WEBVIEW_API void webview_exit(struct webview *w) { OleUninitialize(); } - WEBVIEW_API void webview_print_log(const char *s) { OutputDebugString(s); } - -#endif /* WEBVIEW_WINAPI */ - -#if defined(WEBVIEW_COCOA) -#if (!defined MAC_OS_X_VERSION_10_12) || \ - MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_12 -#define NSAlertStyleWarning NSWarningAlertStyle -#define NSAlertStyleCritical NSCriticalAlertStyle -#define NSWindowStyleMaskResizable NSResizableWindowMask -#define NSWindowStyleMaskMiniaturizable NSMiniaturizableWindowMask -#define NSWindowStyleMaskTitled NSTitledWindowMask -#define NSWindowStyleMaskClosable NSClosableWindowMask -#define NSWindowStyleMaskFullScreen NSFullScreenWindowMask -#define NSEventMaskAny NSAnyEventMask -#define NSEventModifierFlagCommand NSCommandKeyMask -#define NSEventModifierFlagOption NSAlternateKeyMask -#define NSAlertStyleInformational NSInformationalAlertStyle -#endif /* MAC_OS_X_VERSION_10_12 */ -#if (!defined MAC_OS_X_VERSION_10_13) || \ - MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_13 -#define NSModalResponseOK NSFileHandlingPanelOKButton -#endif /* MAC_OS_X_VERSION_10_12, MAC_OS_X_VERSION_10_13 */ - static void webview_window_will_close(id self, SEL cmd, id notification) - { - struct webview *w = - (struct webview *)objc_getAssociatedObject(self, "webview"); - webview_terminate(w); - } - - static BOOL webview_is_selector_excluded_from_web_script(id self, SEL cmd, - SEL selector) - { - return selector != @selector(invoke:); - } - - static NSString *webview_webscript_name_for_selector(id self, SEL cmd, - SEL selector) - { - return selector == @selector(invoke:) ? @"invoke" : nil; - } - - static void webview_did_clear_window_object(id self, SEL cmd, id webview, - id script, id frame) - { - [script setValue:self forKey:@"external"]; - } - - static void webview_run_input_open_panel(id self, SEL cmd, id webview, - id listener, BOOL allowMultiple) - { - char filename[256] = ""; - struct webview *w = - (struct webview *)objc_getAssociatedObject(self, "webview"); - - webview_dialog(w, WEBVIEW_DIALOG_TYPE_OPEN, WEBVIEW_DIALOG_FLAG_FILE, "", "", - filename, 255, ""); - filename[255] = '\0'; - if (strlen(filename) > 0) - { - [listener chooseFilename:[NSString stringWithUTF8String:filename]]; - } - else - { - [listener cancel]; - } - } - - static void webview_external_invoke(id self, SEL cmd, id arg) - { - struct webview *w = - (struct webview *)objc_getAssociatedObject(self, "webview"); - if (w == NULL || w->external_invoke_cb == NULL) - { - return; - } - if ([arg isKindOfClass:[NSString class]] == NO) - { - return; - } - w->external_invoke_cb(w, [(NSString *)(arg) UTF8String]); - } - - WEBVIEW_API int webview_init(struct webview *w) - { - w->priv.pool = [[NSAutoreleasePool alloc] init]; - [NSApplication sharedApplication]; - - Class webViewDelegateClass = - objc_allocateClassPair([NSObject class], "WebViewDelegate", 0); - class_addMethod(webViewDelegateClass, sel_registerName("windowWillClose:"), - (IMP)webview_window_will_close, "v@:@"); - class_addMethod(object_getClass(webViewDelegateClass), - sel_registerName("isSelectorExcludedFromWebScript:"), - (IMP)webview_is_selector_excluded_from_web_script, "c@::"); - class_addMethod(object_getClass(webViewDelegateClass), - sel_registerName("webScriptNameForSelector:"), - (IMP)webview_webscript_name_for_selector, "c@::"); - class_addMethod(webViewDelegateClass, - sel_registerName("webView:didClearWindowObject:forFrame:"), - (IMP)webview_did_clear_window_object, "v@:@@@"); - class_addMethod( - webViewDelegateClass, - sel_registerName("webView:runOpenPanelForFileButtonWithResultListener:" - "allowMultipleFiles:"), - (IMP)webview_run_input_open_panel, "v@:@@c"); - class_addMethod(webViewDelegateClass, sel_registerName("invoke:"), - (IMP)webview_external_invoke, "v@:@"); - objc_registerClassPair(webViewDelegateClass); - - w->priv.delegate = [[webViewDelegateClass alloc] init]; - objc_setAssociatedObject(w->priv.delegate, "webview", (id)(w), - OBJC_ASSOCIATION_ASSIGN); - - // Disable damn smart quotes - // Credit: https://stackoverflow.com/a/31640511 - [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"NSAutomaticQuoteSubstitutionEnabled"]; - - NSRect r = NSMakeRect(0, 0, w->width, w->height); - NSUInteger style = NSWindowStyleMaskTitled | NSWindowStyleMaskClosable | - NSWindowStyleMaskMiniaturizable; - if (w->resizable) - { - style = style | NSWindowStyleMaskResizable; - // style = style | NSTexturedBackgroundWindowMask; - // style = style | NSUnifiedTitleAndToolbarWindowMask; - } - - // Transparent title bar - // if (w->transparentTitlebar) { - // style = style | NSFullSizeContentViewWindowMask | NSUnifiedTitleAndToolbarWindowMask | NSTexturedBackgroundWindowMask; - // } - - w->priv.window = [[NSWindow alloc] initWithContentRect:r - styleMask:style - backing:NSBackingStoreBuffered - defer:NO]; - [w->priv.window autorelease]; - - // Title - NSString *nsTitle = [NSString stringWithUTF8String:w->title]; - [w->priv.window setTitle:nsTitle]; - - [w->priv.window setDelegate:w->priv.delegate]; - [w->priv.window center]; - - // NSToolbar *toolbar = [[NSToolbar alloc] initWithIdentifier:@"wat"]; - // toolbar.showsBaselineSeparator = NO; - // [w->priv.window setToolbar:toolbar]; - - // if (w->transparentTitlebar) { - - // // Configure window look with hidden toolbar - // [w->priv.window setTitlebarAppearsTransparent:YES]; - // [w->priv.window setTitleVisibility:NSWindowTitleHidden]; - // // w->priv.window.isMovableByWindowBackground = true; - // } - - [[NSUserDefaults standardUserDefaults] setBool:!!w->debug - forKey:@"WebKitDeveloperExtras"]; - [[NSUserDefaults standardUserDefaults] synchronize]; - w->priv.webview = - [[WebView alloc] initWithFrame:r - frameName:@"WebView" - groupName:nil]; - NSURL *nsURL = [NSURL - URLWithString:[NSString stringWithUTF8String:webview_check_url(w->url)]]; - [[w->priv.webview mainFrame] loadRequest:[NSURLRequest requestWithURL:nsURL]]; - - [w->priv.webview setAutoresizesSubviews:YES]; - [w->priv.webview - setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable]; - w->priv.webview.frameLoadDelegate = w->priv.delegate; - w->priv.webview.UIDelegate = w->priv.delegate; - [[w->priv.window contentView] addSubview:w->priv.webview]; - [w->priv.window orderFrontRegardless]; - - // Disable scrolling - make this configurable - // [[[w->priv.webview mainFrame] frameView] setAllowsScrolling:NO]; - - // ----> Enables WebGL but won't pass the app store guidelines - // - // WebPreferences *p = [w->priv.webview preferences]; - // if ([p respondsToSelector:@selector(setWebGLEnabled:)]) { - // [p setWebGLEnabled:YES]; - // } - - [NSApp setActivationPolicy:NSApplicationActivationPolicyRegular]; - [NSApp finishLaunching]; - [NSApp activateIgnoringOtherApps:YES]; - - NSMenu *menubar = [[[NSMenu alloc] initWithTitle:@""] autorelease]; - - NSMenuItem *appMenuItem = - [[[NSMenuItem alloc] initWithTitle:@"wails app" action:NULL keyEquivalent:@""] - autorelease]; - NSMenu *appMenu = [[[NSMenu alloc] initWithTitle:@"wails app"] autorelease]; - [appMenuItem setSubmenu:appMenu]; - [menubar addItem:appMenuItem]; - - NSMenuItem *item = [[[NSMenuItem alloc] initWithTitle:@"Hide" - action:@selector(hide:) - keyEquivalent:@"h"] autorelease]; - [appMenu addItem:item]; - item = [[[NSMenuItem alloc] initWithTitle:@"Hide Others" - action:@selector(hideOtherApplications:) - keyEquivalent:@"h"] autorelease]; - [item setKeyEquivalentModifierMask:(NSEventModifierFlagOption | - NSEventModifierFlagCommand)]; - [appMenu addItem:item]; - item = [[[NSMenuItem alloc] initWithTitle:@"Show All" - action:@selector(unhideAllApplications:) - keyEquivalent:@""] autorelease]; - [appMenu addItem:item]; - [appMenu addItem:[NSMenuItem separatorItem]]; - - NSMenuItem *editMenuItem = - [[[NSMenuItem alloc] initWithTitle:@"Edit" action:NULL keyEquivalent:@""] - autorelease]; - NSMenu *editMenu = [[[NSMenu alloc] initWithTitle:@"Edit"] autorelease]; - [editMenuItem setSubmenu:editMenu]; - [menubar addItem:editMenuItem]; - - item = [[[NSMenuItem alloc] initWithTitle:@"Cut" - action:@selector(cut:) - keyEquivalent:@"x"] autorelease]; - [editMenu addItem:item]; - - item = [[[NSMenuItem alloc] initWithTitle:@"Copy" - action:@selector(copy:) - keyEquivalent:@"c"] autorelease]; - [editMenu addItem:item]; - - item = [[[NSMenuItem alloc] initWithTitle:@"Paste" - action:@selector(paste:) - keyEquivalent:@"v"] autorelease]; - [editMenu addItem:item]; - - item = [[[NSMenuItem alloc] initWithTitle:@"Select All" - action:@selector(selectAll:) - keyEquivalent:@"a"] autorelease]; - [editMenu addItem:item]; - - [appMenu addItem:[NSMenuItem separatorItem]]; - - item = [[[NSMenuItem alloc] initWithTitle:@"Quit" - action:@selector(terminate:) - keyEquivalent:@"q"] autorelease]; - [appMenu addItem:item]; - - [NSApp setMainMenu:menubar]; - - w->priv.should_exit = 0; - return 0; - } - - WEBVIEW_API int webview_loop(struct webview *w, int blocking) - { - NSDate *until = (blocking ? [NSDate distantFuture] : [NSDate distantPast]); - NSEvent *event = [NSApp nextEventMatchingMask:NSEventMaskAny - untilDate:until - inMode:NSDefaultRunLoopMode - dequeue:YES]; - if (event) - { - [NSApp sendEvent:event]; - } - return w->priv.should_exit; - } - - WEBVIEW_API int webview_eval(struct webview *w, const char *js) - { - NSString *nsJS = [NSString stringWithUTF8String:js]; - [[w->priv.webview windowScriptObject] evaluateWebScript:nsJS]; - return 0; - } - - WEBVIEW_API void webview_set_title(struct webview *w, const char *title) - { - NSString *nsTitle = [NSString stringWithUTF8String:title]; - [w->priv.window setTitle:nsTitle]; - } - - WEBVIEW_API void webview_focus(struct webview *w) - { - [w->priv.window makeKeyWindow]; - } - - WEBVIEW_API void webview_minsize(struct webview *w, int width, int height) { - NSSize size; - size.width = width; - size.height = height; - [w->priv.window setMinSize:size]; - } - - WEBVIEW_API void webview_maxsize(struct webview *w, int width, int height) { - NSSize size; - size.width = width; - size.height = height; - [w->priv.window setMaxSize:size]; - - NSButton *button = [w->priv.window standardWindowButton:NSWindowZoomButton]; - [button performSelectorOnMainThread:@selector(setEnabled:) withObject:NO - waitUntilDone:NO]; - } - - WEBVIEW_API void webview_set_fullscreen(struct webview *w, int fullscreen) - { - int b = ((([w->priv.window styleMask] & NSWindowStyleMaskFullScreen) == - NSWindowStyleMaskFullScreen) - ? 1 - : 0); - if (b != fullscreen) - { - [w->priv.window toggleFullScreen:nil]; - } - } - - WEBVIEW_API void webview_set_color(struct webview *w, uint8_t r, uint8_t g, - uint8_t b, uint8_t a) - { - [w->priv.window setBackgroundColor:[NSColor colorWithRed:(CGFloat)r / 255.0 - green:(CGFloat)g / 255.0 - blue:(CGFloat)b / 255.0 - alpha:(CGFloat)a / 255.0]]; - if (0.5 >= ((r / 255.0 * 299.0) + (g / 255.0 * 587.0) + (b / 255.0 * 114.0)) / - 1000.0) - { - [w->priv.window - setAppearance:[NSAppearance - appearanceNamed:NSAppearanceNameVibrantDark]]; - } - else - { - [w->priv.window - setAppearance:[NSAppearance - appearanceNamed:NSAppearanceNameVibrantLight]]; - } - [w->priv.window setOpaque:NO]; - [w->priv.window setTitlebarAppearsTransparent:YES]; - [w->priv.webview setDrawsBackground:NO]; - } - - WEBVIEW_API void webview_dialog(struct webview *w, - enum webview_dialog_type dlgtype, int flags, - const char *title, const char *arg, - char *result, size_t resultsz, char *filter) - { - if (dlgtype == WEBVIEW_DIALOG_TYPE_OPEN || - dlgtype == WEBVIEW_DIALOG_TYPE_SAVE) - { - NSSavePanel *panel; - NSString *filter_str = [NSString stringWithUTF8String:filter]; - filter_str = [filter_str stringByReplacingOccurrencesOfString:@"*." - withString:@""]; - NSArray *fileTypes = [filter_str componentsSeparatedByString:@","]; - if (dlgtype == WEBVIEW_DIALOG_TYPE_OPEN) - { - NSOpenPanel *openPanel = [NSOpenPanel openPanel]; - if (flags & WEBVIEW_DIALOG_FLAG_DIRECTORY) - { - [openPanel setCanChooseFiles:NO]; - [openPanel setCanChooseDirectories:YES]; - } - else - { - [openPanel setCanChooseFiles:YES]; - [openPanel setCanChooseDirectories:NO]; - if(filter[0] != NULL) - { - [openPanel setAllowedFileTypes:fileTypes]; - } - } - [openPanel setResolvesAliases:NO]; - [openPanel setAllowsMultipleSelection:NO]; - panel = openPanel; - } - else - { - panel = [NSSavePanel savePanel]; - } - [panel setCanCreateDirectories:YES]; - [panel setShowsHiddenFiles:YES]; - [panel setExtensionHidden:NO]; - [panel setCanSelectHiddenExtension:NO]; - if(filter[0] != NULL) - { - [panel setAllowedFileTypes:fileTypes]; - } - [panel setTreatsFilePackagesAsDirectories:YES]; - [panel setNameFieldStringValue:@"Temp"]; // Necessary to prevent crash when replacing files - [panel setNameFieldStringValue:@"Untitled"]; - [panel beginSheetModalForWindow:w->priv.window - completionHandler:^(NSInteger result) { - [NSApp stopModalWithCode:result]; - }]; - if ([NSApp runModalForWindow:panel] == NSModalResponseOK) - { - const char *filename = [[[panel URL] path] UTF8String]; - strlcpy(result, filename, resultsz); - } - } - else if (dlgtype == WEBVIEW_DIALOG_TYPE_ALERT) - { - NSAlert *a = [NSAlert new]; - switch (flags & WEBVIEW_DIALOG_FLAG_ALERT_MASK) - { - case WEBVIEW_DIALOG_FLAG_INFO: - [a setAlertStyle:NSAlertStyleInformational]; - break; - case WEBVIEW_DIALOG_FLAG_WARNING: - NSLog(@"warning"); - [a setAlertStyle:NSAlertStyleWarning]; - break; - case WEBVIEW_DIALOG_FLAG_ERROR: - NSLog(@"error"); - [a setAlertStyle:NSAlertStyleCritical]; - break; - } - [a setShowsHelp:NO]; - [a setShowsSuppressionButton:NO]; - [a setMessageText:[NSString stringWithUTF8String:title]]; - [a setInformativeText:[NSString stringWithUTF8String:arg]]; - [a addButtonWithTitle:@"OK"]; - [a runModal]; - [a release]; - } - } - - static void webview_dispatch_cb(void *arg) - { - struct webview_dispatch_arg *context = (struct webview_dispatch_arg *)arg; - (context->fn)(context->w, context->arg); - free(context); - } - - WEBVIEW_API void webview_dispatch(struct webview *w, webview_dispatch_fn fn, - void *arg) - { - struct webview_dispatch_arg *context = (struct webview_dispatch_arg *)malloc( - sizeof(struct webview_dispatch_arg)); - context->w = w; - context->arg = arg; - context->fn = fn; - dispatch_async_f(dispatch_get_main_queue(), context, webview_dispatch_cb); - } - - WEBVIEW_API void webview_terminate(struct webview *w) - { - w->priv.should_exit = 1; - } - WEBVIEW_API void webview_exit(struct webview *w) { [NSApp terminate:NSApp]; } - WEBVIEW_API void webview_print_log(const char *s) { NSLog(@"%s", s); } - -#endif /* WEBVIEW_COCOA */ - -#endif /* WEBVIEW_IMPLEMENTATION */ - -#ifdef __cplusplus -} -#endif - -#endif /* WEBVIEW_H */ \ No newline at end of file diff --git a/vendor/github.com/wailsapp/wails/logo_cropped.png b/vendor/github.com/wailsapp/wails/logo_cropped.png deleted file mode 100644 index 380c3d7..0000000 Binary files a/vendor/github.com/wailsapp/wails/logo_cropped.png and /dev/null differ diff --git a/vendor/github.com/wailsapp/wails/pace.jpeg b/vendor/github.com/wailsapp/wails/pace.jpeg deleted file mode 100644 index 8978856..0000000 Binary files a/vendor/github.com/wailsapp/wails/pace.jpeg and /dev/null differ diff --git a/vendor/github.com/wailsapp/wails/package-lock.json b/vendor/github.com/wailsapp/wails/package-lock.json deleted file mode 100644 index 48e341a..0000000 --- a/vendor/github.com/wailsapp/wails/package-lock.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "lockfileVersion": 1 -} diff --git a/vendor/github.com/wailsapp/wails/runtime/assets.go b/vendor/github.com/wailsapp/wails/runtime/assets.go deleted file mode 100644 index 96aaad2..0000000 --- a/vendor/github.com/wailsapp/wails/runtime/assets.go +++ /dev/null @@ -1,15 +0,0 @@ -package runtime - -import _ "embed" - -//go:embed assets/bridge.js -var BridgeJS []byte - -//go:embed assets/wails.js -var WailsJS string - -//go:embed assets/wails.css -var WailsCSS string - -//go:embed js/runtime/init.js -var InitJS []byte diff --git a/vendor/github.com/wailsapp/wails/runtime/assets/bridge.js b/vendor/github.com/wailsapp/wails/runtime/assets/bridge.js deleted file mode 100644 index 5c2f73e..0000000 --- a/vendor/github.com/wailsapp/wails/runtime/assets/bridge.js +++ /dev/null @@ -1,210 +0,0 @@ -/* - _ __ _ __ -| | / /___ _(_) /____ -| | /| / / __ `/ / / ___/ -| |/ |/ / /_/ / / (__ ) -|__/|__/\__,_/_/_/____/ -The lightweight framework for web-like apps -(c) Lea Anthony 2019-present -*/ -/* jshint esversion: 6 */ - -function init() { - // Bridge object - window.wailsbridge = { - reconnectOverlay: null, - reconnectTimer: 300, - wsURL: 'ws://' + window.location.hostname + ':34115/bridge', - connectionState: null, - config: {}, - websocket: null, - callback: null, - overlayHTML: - '
Wails Bridge


Waiting for backend
', - overlayCSS: - '.wails-reconnect-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.6);font-family:sans-serif;display:none;z-index:999999}.wails-reconnect-overlay-content{padding:20px 30px;text-align:center;width:20em;position:relative;height:14em;border-radius:1em;margin:5% auto 0;background-color:#fff;box-shadow:1px 1px 20px 3px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC8AAAAuCAMAAACPpbA7AAAAqFBMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAAAAEBAQAAAAAAAAAAAAEBAQEBAQDAwMBAQEAAAABAQEAAAAAAAAAAAABAQEAAAAAAAACAgICAgIBAQEAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAACAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBQWKCj6oAAAAN3RSTlMALiIqDhkGBAswJjP0GxP6NR4W9/ztjRDMhWU50G9g5eHXvbZ9XEI9xZTcqZl2aldKo55QwoCvZUgzhAAAAs9JREFUSMeNleeWqjAUhU0BCaH3Itiw9zKT93+zG02QK1hm/5HF+jzZJ6fQe6cyXE+jg9X7o9wxuylIIf4Tv2V3+bOrEXnf8dwQ/KQIGDN2/S+4OmVCVXL/ScBnfibxURqIByP/hONE8r8T+bDMlQ98KSl7Y8hzjpS8v1qtDh8u5f8KQpGpfnPPhqG8JeogN37Hq9eaN2xRhIwAaGnvws8F1ShxqK5ob2twYi1FAMD4rXsYtnC/JEiRbl4cUrCWhnMCLRFemXezXbb59QK4WASOsm6n2W1+4CBT2JmtzQ6fsrbGubR/NFbd2g5Y179+5w/GEHaKsHjYCet7CgrXU3txarNC7YxOVJtIj4/ERzMdZfzc31hp+8cD6eGILgarZY9uZ12hAs03vfBD9C171gS5Omz7OcvxALQIn4u8RRBBBcsi9WW2woO9ipLgfzpYlggg3ZRdROUC8KT7QLqq3W9KB5BbdFVg4929kdwp6+qaZnMCCNBdj+NyN1W885Ry/AL3D4AQbsVV4noCiM/C83kyYq80XlDAYQtralOiDzoRAHlotWl8q2tjvYlOgcg1A8jEApZa+C06TBdAz2Qv0wu11I/zZOyJQ6EwGez2P2b8PIQr1hwwnAZsAxwA4UAYOyXUxM/xp6tHAn4GUmPGM9R28oVxgC0e/zQJJI6DyhyZ1r7uzRQhpcW7x7vTaWSzKSG6aep77kroTEl3U81uSVaUTtgEINfC8epx+Q4F9SpplHG84Ek6m4RAq9/TLkOBrxyeuddZhHvGIp1XXfFy3Z3vtwNblKGiDn+J+92vwwABHghj7HnzlS1H5kB49AZvdGCFgiBPq69qfXPr3y++yilF0ON4R8eR7spAsLpZ95NqAW5tab1c4vkZm6aleajchMwYTdILQQTwE2OV411ZM9WztDjPql12caBi6gDpUKmDd4U1XNdQxZ4LIXQ5/Tr4P7I9tYcFrDK3AAAAAElFTkSuQmCC);background-repeat:no-repeat;background-position:center}.wails-reconnect-overlay-title{font-size:2em}.wails-reconnect-overlay-message{font-size:1.3em}.wails-reconnect-overlay-loadingspinner{pointer-events:none;width:2.5em;height:2.5em;border:.4em solid transparent;border-color:#3E67EC #eee #eee;border-radius:50%;animation:loadingspin 1s linear infinite;margin:auto;padding:2.5em}@keyframes loadingspin{100%{transform:rotate(360deg)}}', - log: function (message) { - // eslint-disable-next-line - console.log( - '%c wails bridge %c ' + message + ' ', - 'background: #aa0000; color: #fff; border-radius: 3px 0px 0px 3px; padding: 1px; font-size: 0.7rem', - 'background: #009900; color: #fff; border-radius: 0px 3px 3px 0px; padding: 1px; font-size: 0.7rem' - ); - } - }; -} - -// Adapted from webview - thanks zserge! -function injectCSS(css) { - var elem = document.createElement('style'); - elem.setAttribute('type', 'text/css'); - if (elem.styleSheet) { - elem.styleSheet.cssText = css; - } else { - elem.appendChild(document.createTextNode(css)); - } - var head = document.head || document.getElementsByTagName('head')[0]; - head.appendChild(elem); -} - -// Creates a node in the Dom -function createNode(parent, elementType, id, className, content) { - var d = document.createElement(elementType); - if (id) { - d.id = id; - } - if (className) { - d.className = className; - } - if (content) { - d.innerHTML = content; - } - parent.appendChild(d); - return d; -} - -// Sets up the overlay -function setupOverlay() { - var body = document.body; - var wailsBridgeNode = createNode(body, 'div', 'wails-bridge'); - wailsBridgeNode.innerHTML = window.wailsbridge.overlayHTML; - - // Inject the overlay CSS - injectCSS(window.wailsbridge.overlayCSS); -} - -// Start the Wails Bridge -function startBridge() { - // Setup the overlay - setupOverlay(); - - window.wailsbridge.websocket = null; - window.wailsbridge.connectTimer = null; - window.wailsbridge.reconnectOverlay = document.querySelector( - '.wails-reconnect-overlay' - ); - window.wailsbridge.connectionState = 'disconnected'; - - // Shows the overlay - function showReconnectOverlay() { - window.wailsbridge.reconnectOverlay.style.display = 'block'; - } - - // Hides the overlay - function hideReconnectOverlay() { - window.wailsbridge.reconnectOverlay.style.display = 'none'; - } - - // Adds a script to the Dom. - // Removes it if second parameter is true. - function addScript(script, remove) { - var s = document.createElement('script'); - s.setAttribute('type', 'text/javascript'); - s.textContent = script; - document.head.appendChild(s); - - // Remove internal messages from the DOM - if (remove) { - s.parentNode.removeChild(s); - } - } - - // Handles incoming websocket connections - function handleConnect() { - window.wailsbridge.log('Connected to backend'); - hideReconnectOverlay(); - clearInterval(window.wailsbridge.connectTimer); - window.wailsbridge.websocket.onclose = handleDisconnect; - window.wailsbridge.websocket.onmessage = handleMessage; - window.wailsbridge.connectionState = 'connected'; - } - - // Handles websocket disconnects - function handleDisconnect() { - window.wailsbridge.log('Disconnected from backend'); - window.wailsbridge.websocket = null; - window.wailsbridge.connectionState = 'disconnected'; - showReconnectOverlay(); - connect(); - } - - // Try to connect to the backend every 300ms (default value). - // Change this value in the main wailsbridge object. - function connect() { - window.wailsbridge.connectTimer = setInterval(function () { - if (window.wailsbridge.websocket == null) { - window.wailsbridge.websocket = new WebSocket(window.wailsbridge.wsURL); - window.wailsbridge.websocket.onopen = handleConnect; - window.wailsbridge.websocket.onerror = function (e) { - e.stopImmediatePropagation(); - e.stopPropagation(); - e.preventDefault(); - window.wailsbridge.websocket = null; - return false; - }; - } - }, window.wailsbridge.reconnectTimer); - } - - function handleMessage(message) { - // As a bridge we ignore js and css injections - switch (message.data[0]) { - // Wails library - inject! - case 'w': - addScript(message.data.slice(1)); - - // Now wails runtime is loaded, wails for the ready event - // and callback to the main app - window.wails.Events.On('wails:loaded', function () { - window.wailsbridge.log('Wails Ready'); - if (window.wailsbridge.callback) { - window.wailsbridge.log('Notifying application'); - window.wailsbridge.callback(window.wails); - } - }); - window.wailsbridge.log('Loaded Wails Runtime'); - break; - // Notifications - case 'n': - addScript(message.data.slice(1), true); - break; - // Binding - case 'b': - var binding = message.data.slice(1); - //log("Binding: " + binding) - window.wails._.NewBinding(binding); - break; - // Call back - case 'c': - var callbackData = message.data.slice(1); - window.wails._.Callback(callbackData); - break; - default: - window.wails.Log.Error('Unknown message type received: ' + message.data[0]); - } - } - - // Start by showing the overlay... - showReconnectOverlay(); - - // ...and attempt to connect - connect(); -} - -function start(callback) { - - // Set up the bridge - init(); - - // Save the callback - window.wailsbridge.callback = callback; - - // Start Bridge - startBridge(); -} - -function Init(callback) { - start(callback); -} - -module.exports = Init; diff --git a/vendor/github.com/wailsapp/wails/runtime/assets/wails.css b/vendor/github.com/wailsapp/wails/runtime/assets/wails.css deleted file mode 100644 index b807abe..0000000 --- a/vendor/github.com/wailsapp/wails/runtime/assets/wails.css +++ /dev/null @@ -1,39 +0,0 @@ -/* - Some css from https://gist.github.com/abelaska/9c9eda70d31315f27a564be2ee490cf4 - Many thanks! -*/ - -/* https://fonts.google.com/specimen/Roboto?selection.family=Roboto:300,400,500,700 https://www.fontsquirrel.com/tools/webfont-generator */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - src:url(data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAAGSwABMAAAAAtfwAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAABqAAAABwAAAAcZSXU3EdERUYAAAHEAAAAlQAAAOYXGhVYR1BPUwAAAlwAAAdrAAAQ5noXPxxHU1VCAAAJyAAAATQAAAKy3SOq409TLzIAAAr8AAAAUwAAAGCgNqyhY21hcAAAC1AAAAGPAAAB6gODigBjdnQgAAAM4AAAAEIAAABCEToKw2ZwZ20AAA0kAAABsQAAAmVTtC+nZ2FzcAAADtgAAAAIAAAACAAAABBnbHlmAAAO4AAATFsAAIy8VrEAaGhlYWQAAFs8AAAAMwAAADYN24w7aGhlYQAAW3AAAAAgAAAAJA8tBb1obXR4AABbkAAAAnoAAAOqnWlWT2xvY2EAAF4MAAAByQAAAdgbwD2ObWF4cAAAX9gAAAAgAAAAIAIIAaduYW1lAABf+AAAAc0AAAPGOTyS+XBvc3QAAGHIAAAB8gAAAu/ZWLW+cHJlcAAAY7wAAADqAAABofgPHd13ZWJmAABkqAAAAAYAAAAGcF9X0gAAAAEAAAAAzD2izwAAAADE8BEuAAAAANP4IN542h3P2UoCYBBA4fP/eO1D+KiVCppaKC64laaCuaK44NqLdJngU3RqDgPfXA4BSLrf/E0kReDBfeTJK22BjEWy5HSeZ12gqEu86FfKukJV1yxQt0iDpm7R1h26+s0i7/R0nw89sMDQIiPG+pOJnjLTcxZ6yUqv2eitBXYW2XPQR076zEVfLfLFj75x14n/n/gFJoIscwAAAHja3Zd7cJTlFcafbzeXJSHJbpKu4WKLRQK0AS14CaGh2uEWwWltICIXO9TRdiplaNpxtO3YzhgQ0UoL0qKNJQK2CknGtoYkA0iA0FZLLVKpCRgpFjUkS4moM/0rp7/vzbJJIAah/3XPPO/3fu/9POe8Z88nT1KaFuspJU2fOXeeht/1QPkyjftm+d336oZlS7+/XNOVxBiZKcAjqc+b1+8t0O8tSD35rhXfW6FRrsx3ZYErJ917d/lyFTLUk+fKoCsDrpQrma2hytVIXa2C+KjPxZ/L4s/a+LPLzQx4k5Lv4S2NmVdrNm1pCiHSGE2j/R5khL6FjNRDWq0rtUZParQqVaXJ2o8U6gAyRSeRov/3lYJbnbVm6heMqdRmNeglHdRR/VMdXrX3ex31Grx93pve2UBuID9QGCgP3B9YF9gIOgASzAvmB28KzgSLmdsrB1mjR472Ciusu1CYe1OgUJXB+9wpPBVaC+UipaNnEfafqmwVK4oWUU4fpS/HRuEvo22/FtgZLbLjvGXYu7rZPtRSWjw9QltAt9i/6e3QtQpbVNlgjJVpYvd/YCJXM+wtzbJOzQYlYA4oBfNBGavdwcyF1q4l4CHmVYCVYBV4GKwGW1hjK3gW/Ab8FjwHtrHGdlANakAtqAM7QD1oAI1gF3vsBi+BPaCJvfaBZvqOct42cNx8nRfZXlduRa8FykTDTUqBqyMqspOaajEVW5uqwAGQTM8L9Jym9RCth2g9hK8kwW2Z1bHOn7S8u0EP2jhWulXP2+Paac/gDxkwc7MijHpbS5XjWrJoGUpLJy2ZSBp9/rhM+xs92fDcQW8L1uhwc5ZbLSv/lZWrWHkvKzfpLfu7O/87nHoidpkCKsHT4NdgE/DUyqlzGRHG+uH4WbKxUjtWasdK7VipHQu1u3228dwOqkENqHXMtauFua3gGHjTrTULfmaDEjAHzAfbwHZQDWpALWgGQd2Cxgs0CR+McJZS2urADlAPGkAj8BiXAdNhq8C3KrBXBfaqwF4VTscYOsbQMYaOMXSMoWOMs8zVKH0FfBWU2k90u/3MeXsd9R2gHjSARuBxO5NYLR3+c7jnYzVO44mC1+DTk3WdrtcN+HIRd6SYGPAllXCmuax+m76mUpWhxULWXqKvExEqtFKr9DCRYY0e1WP6qR7Xem3g9v9SG4kUVdquatUQU19UnXaonnjQqCbt49a1wOcxuAyk5fsxI3VNqEVXEWFkG2y1vWoHLGb7sd0l/Lg9l/mz1Ynah+Aj+7Gdsedtp22m/ipMRexlLLL2E6z0DmgHL5/X/sFFZ/7rEs7becGeHeBI/P1Eoucp67BTF8w+3QN+uYm2M8SnwX/ZA52WSNHzi1CL+Cfx6+ft16H/4Wfv2imn4Yk+baeIDefqWxK1pnO17hfw7d7Re7pP2yt2m33XIva6/fAi+92HzT8Y0GJZPXa1VrfHLjvhc2aFiZm/s7X2tK0Hj8FGmKYwc8L2jDVYs/2FEQ/ajyjz3eg8C1uX/cHV6+ywvc7zcP997aR91O9sn3HlsT4tR+y4z0ycncy+Nu43c6Urm8/ntseX7L3e2dbp1oo4m76WGHm4z6zNVm97rAX8ET+IEJOzGZ9trdzZt/uMm0A0kx20KvTs8cKM+H6dPXv3njbuOR9nk92D9L1/ubcKO7u5dnagNfszf0kee3aQvkHjgG287D3vH4wh63LPrgHjCH6KLf2YELvInV85wH14392Vj7WBveHKDQP2xQbc85No2zWQNhedNc0KbLpNBmPxqFSaUvm3TbU5Vm6rbB0jsmwoN/sH7n5/g/fX7Nt940o8uuAZ9mdQk/Cj986x2Xuqnn8Ae9Z+bruJw7u54acSfMaf9grY6d+N7u+490cuhaHeGNiv9YFBGGhL1FrPvwtkgTfiC2EyhGzEIzcYQ1s+EiRLGMu/9DgkmWxhPPlDgSbA3kQkRO5wjYaQP1zL98MXyHJSySQmM/I6JJ1sopB/0ClIiLyiiBgwFcnUF5Essoxi9pyGRDQDySY/mUn0noXkkn2U6FPkH3PJ0v0MJEoOUqorNA/JIRspUx75yEIN42tzsYaTlyyhficywn2xBMhM1nDyR8lMUrRW6zjbeiRZTyCp5CpPUq/UJs5WhYS1Rc9xhm1ILtlLLbu/iETJXxrZtwkZpr1IDlnMPur+90/YfY14akM8HUc8x2YK4sFAOqXPbBQdI8zx+Y3G+fWZDenzSMixOdxxFyIPu57yRmSEY3CIYzDNMZjuGBzqGLzCMZjhGMxzDAZhrgSd5yBJjrVkx1qKYy1Z85Ek3Y6k6g4k0zGY5Rgc6RjMcgyGtQIZ1ofHkOMrpF8hIcdammMtw7EWhLNaVvb5SnZ8pWiX9rC+z1qW4yvLfTWG1IwkOe4y9A+9wS5+Pug5HqMuL+xhM+rYjLJ/nmNTfdgMOB6DsDietQrwtSHwNI22GTAwzPnOSOc7V8LCPH3a+ctnnbaj0fVOvnl93ca6r9oJ7qu22GnyZafJbPRo1K0uXy11Zy3jlG3w5p9pyX8BOZPW4wB42rWRz0oCYRTFf6PTaBItwkqCwJVEixYREi0i+yMhzhjD5MJFJENJpSJDBkGrnqIHaN1TtOgReoN8iMDuXL9CbVsDc86cc79779z7YQEZnq0M9mG5GrAS3kdt1lvRxQ077eZtlwq2nGE4JClkiZrUM1PaYQ2n1DjKUzzwA0G3VhX0SnVBv+YKBqd+nn3NsTUnQWqsQmoskhSVDsNOj83LqBmy3b5qNdlTPO72OxGeYqDYUDzXzPhJSL6tHPfgBx3F9Hc3nWKWLAU2KLJLGY86Z3rOweeaR5544dX81Zvhd1NpoP0sPkcs2xxxznDB8JaZcF7erH5ZuBr77XtT/oKZ6m/cWMUbiO/zQ7bias/KhD8Q/8T4ScGc1sHsM8uqqZVgTuIP9LnTG1tkieX/cr8Ar3NDVXjaY2BmYWDUYWBlYGGdxWrMwMAoD6GZLzKkMTEwMIAwBDxg4PofwKBYD2Qqgvju/v7uIAW/WdgY/gEZHMVMwQoMjPNBcixWrBuAlAIDEwAcWAwaAHjaY2BgYGaAYBkGRgYQeALkMYL5LAwngLQegwKQxQdkMTHwMtQx/GcMZqxgOsZ0R4FLQURBSkFOQUlBTUFfwUohXmGNopLqn98s//+DTQKpV2BYwBgEVc+gIKAgoSADVW8JV88IVM/IwPj/6/8n/w//L/zv+4/h7+sHJx4cfnDgwf4Hex7sfLDxwYoHLQ8s7h++9Yr1GdSdJABGNiAGexJIM4FdhqaAgYGFlY2dg5OLm4eXj19AUEhYRFRMXEJSSlpGVk5eQVFJWUVVTV1DU0tbR1dP38DQyNjE1MzcwtLK2sbWzt7B0cnZxdXN3cPTy9vH188/IDAoOCQ0LDwiMio6JjYuPiExiaG9o6tnysz5SxYvXb5sxao1q9eu27B+46Yt27Zu37lj7559+xmKU9Oy7lUuKsx5Wp7N0DmboYSBIaMC7LrcWoaVu5tS8kHsvLr7yc1tMw4fuXb99p0bN3cxHDrK8OTho+cvGKpu3WVo7W3p654wcVL/tOkMU+fOm8Nw7HgRUFM1EAMANK6KqQAAAAQ6BbAAaABcAGIAZQBmAGcAaQBqAGsAbABzAKEAewBzAHcAeAB5AHoAewB8AH4AgACkAKUAcQBfAFUAdQBEBREAAHjaXVG7TltBEN0NDwOBxNggOdoUs5mQxnuhBQnE1Y1iZDuF5QhpN3KRi3EBH0CBRA3arxmgoaRImwYhF0h8Qj4hEjNriKI0Ozuzc86ZM0vKkap36WvPU+ckkMLdBs02/U5ItbMA96Tr642MtIMHWmxm9Mp1+/4LBpvRlDtqAOU9bykPGU07gVq0p/7R/AqG+/wf8zsYtDTT9NQ6CekhBOabcUuD7xnNussP+oLV4WIwMKSYpuIuP6ZS/rc052rLsLWR0byDMxH5yTRAU2ttBJr+1CHV83EUS5DLprE2mJiy/iQTwYXJdFVTtcz42sFdsrPoYIMqzYEH2MNWeQweDg8mFNK3JMosDRH2YqvECBGTHAo55dzJ/qRA+UgSxrxJSjvjhrUGxpHXwKA2T7P/PJtNbW8dwvhZHMF3vxlLOvjIhtoYEWI7YimACURCRlX5hhrPvSwG5FL7z0CUgOXxj3+dCLTu2EQ8l7V1DjFWCHp+29zyy4q7VrnOi0J3b6pqqNIpzftezr7HA54eC8NBY8Gbz/v+SoH6PCyuNGgOBEN6N3r/orXqiKu8Fz6yJ9O/sVoAAAAAAQAB//8AD3jazX0HfBTV9vDcKduS3exsySabutmQEBKysEsSQlVEUYqIFRARkC69BkKTJgqCgo2OgBQLzmwWBLFgARQLCoq9YXvB+tTnE8gO3zn3zm66+N73//6/7z3Jzu4mM+ece+7p51yO57pzHD9cuoETOCNXrBIu0ClsFLN+DKoG6ZNOYYGHS04V8GMJPw4bDdk1ncIEPw/JPrmFT/Z157O1XPKwNlq64dzj3cU3Obglt/bCn6SLpHBmzgrPCJs4rlAVbNVhC88VEsUWULhTquStxn9VVokzFaqJ9mo1icCrVXZUCUYTn+sp51SLIDuUxPI2bcvalQaT3S5DTp4zJPjXFvVu3bp3kW2OceIVOYFAjq91a2n5+W84+uxVYkfyuYHjRHg6PJsjXKEihSLExlnEQsUQJIoloJBTEcHOtRILI6KdS4XPBbtqIIURE/vQTD9UE0gh16ZtGgm5hZATfqwShrrWi0Nd8ITDK7Sj9Ad95g3wOBXwTeOyyC1c2Av4ht3JqaFQKGwElMOmhES4jnDEa7QWVvFyekauJ6RyYnWVy5OSlusJRiSRfiXYM7PwK0mqrjKYLVb4iijZAcV7KpJq5zoCoKl21cgAhXdho8lSWHWJUTQXKia7mgxfuNkX7mT8wu2EL9x2RCSSSL9QfaRQKfU+0+Wb31tx7kLLM12++D0JLxSvvYr3Gp0AA/1pwJ/wtCpzqgkuku1VluQEJ96tyupOhF+w058y/enCn/g7Hvo78Fcp9K/gnmmx+6TH7pOBv1OVGfvNLPxcuMTOC4iwXUaKpGdkZhU3+J9yiRcWw1nic/rgX0jAfyG3X/C5fYLfif/K4KsbiP06rZoU9L2tL+nYd3jfb/59HXdB+7nP8D7akT639ZlGOl6nHSbrbiEHhpAtGv03ROtxizaSrMN/8DkHHDP1QhshariHK+Q2ceECWE0lL6SKQnW4QESyFrQ0F4btsLCKM6R6zdVhuxc/tstm4O6igGI9pWbI1UqGXSHZp2SVc1QrXEAlDvxItcMCtAxGnGw584KKk66o4gmqfviN5KDaGvaBPQM4P6Fcccphi+gtLy9XjA4lG7aEV4QNwlmT/bBBgBwhV3IoWFrSLi+/mJS0Ky0rCbkzidvfLs+fY3C7kkV44zIY3f6SYjK1Yt+2lVX37ju979UnRiovztx2z8rNq8mtm/u+WTXitU/I1g3qw7Mn3tO1x8vrt71uO3bM/o+jGw88MKfizpnjHxi9/TXb889Zv+I4iRt/4XtpsXSYS+S8XCbXimvPrWU0UovF6rAIVFE9YnWkxF8gWgvVEri0W+ilXawmSjnu/YiVbjPFaledwJlG9s5oV7PgXSF7V2hX28K7PPpO7QAkcYJoiIiCJS0TUFfbFsqOvek5/pYFGVRUlBTLDjUts7xc9djhKj2jHMlTgnIjg7gM/py8MkqqzoTRxkk8pEX864bfjn/kz0c2z6ncPnTUTTeMGH39dWPW8kd7RcvJw4/8sQ3+GzLqphtHjLrx+tHitVcsfPzxZT0WPL5r0S0Vs4ZcdcusiuE1HnFKm/Mrt1218LHdd/eAH4sGV8wadtWQ6TNuA0k77sIP4nHpFaBdAVfCzeXCKSgt0pGAOQYmItWQEUhVSsVkFjBSFuUQtRWwRyu72gYurfZqnXqqCyRnGby2aQUEsYjpOfl2pA9Sq0pOTm0BbxSXrKQAjUI5smMfZ7Qmp+YXMfZpV9qVUMYJoXhNIqS0JOQyevz5NhKnWBnJNxqcLk9ZF/hFpM64uRttN/Xdt3b5Ezu2kHtvnrjg6L3z+h6f+vbvMyNrb368uzbGVvzKojsXXXLtuIHDppGpY5+bYRnzaL+14Ufm3Lt8jla85pk/H//H6qv7vxdetLlPD/JBkn8LP232juHFE3pePWYeh/tvptiNO21AbmvLJHiEp+KbKIaAwlPZ3ZHJbhRpSBuBh/0ilaOEcMAeEGZKI2WxG2n54D3acY7ec4XWih9vGMI5OCdHFCclrsVRrbqokHe285Iyj43n3S4v8RjzLGTFpA/mZHRbOLLrrTuGZ8z/YDzf+yOyntzQs18g8qf2+ivvaPO0D3v26U2uIw/R+/vg/jzcX6b3dwQU8ZRqhfs72f1LvUA9C8kvS/bClrQQo2/YziFDdg/JmHdq0vhTd2gzryB55M5vjpM7SODyPn20Pdrwf3yijdH2XA33zuDnCj1Bv9i4cRyoZRA8JECUJIoDD7tEYrvETmW7kucloMuLX+NUjhS/htL+h3Yv56KQtymcXbEdEhViV/hDvMrbiotBH6NsJarEU5EDCp/AhQHZo0wSQkILj+Q0JpB8Z0Y26S2ONpHuPq3q8xtOvXHDh+L1IyrJFG35/BFTtY+6krbaO51JEcDbi1stthX3cQnctRyIPsUYUom1WpGCsJgoKTkLCFDC4SURUGgmBhTLKYUPqmZntSIGw2YLfmc2wq9ZzHhp4czA9YyUJT4ZrA+3T/bLvUh4FjmoXT6LnzaJnNCKJ2mZ5DRb707aLySJexYsmwxOMQYigo0zIweZkINUCXaNmd7OQ4Wmy9jpZmH6ik9mL1o/9+35+Pdt+Wt4O78XdmwOR8W3oRr/EUUMAF0LI4IX76dKMZjcbcnn/DUjRuDf3gf2TyduA2eCPR42xqyf2AVRzHUtINVCb0FNHJRE97W+prj4mtZX+tu2vaJ1a4pL5oVF/BlYfwG4C8wvNKIACvZoDwmRTH7IuOgjcw2tz56k9kjFhR+Ef4OMsYJF0oELJ+CDZYMunVNQuKRTCGwgXGx23AKqCVg1A8WJDaRnglhOt5Jsd4SCDnjh/Tm804VvyuR28MZgrPj64w++Fk9/8sG303Y/suVRsu3Rrdt5/hoiATidtOPa+9q/tDe0F0k5aX1W+5PwZ0nKOcKd+53iEwYg90l7OQPXggtLKP94ipQxoEinVBFAMQEoogR8yFNASlqEYLXD5BdXhXjPpP3neknZeJ8xYHelAp6p3O1c2IZYJsSwTDZWh5Optk7mkMO8FOFUQDiVyU2jE1bESc0nK7CZ04iXThuwWRoqm1Qgg5gAZFATgCJKUrmSLMPfUK3Srguh8tJgJMCGJSQmGN1jJr656NUv52/RxvLRmknktzlDtq5cs1dMrDw29cTekb/u1UpGDOJLVz3T/+5Hnn0Q4B8G6/Q7wF/IreLCLRF+EeFviaCA/QpqAVFxASqudPzMlWIGQy6hZTqo00RcRjA2Uk6pHjQw0NJAE8PDlEULuJTxsyxHdVjOwr+WEwA5NC5kD+gG0BQtqeZMAItCaVGuJMpKDqgKh5JVz7AoJCWhYBxDfy3u1LTw5xSTYRUvPbz+yYP7KuaMWtdv0/0rqiqmHKs88vWSactW/P7Gwg9nkuXLn9r80Op1I6+af92KTY/eOfngyA+eHaMW5R1YcPDr0QeBXy+DdewF/G0BCdefC5tjHBHhEsy8tVARwVg2VFPjHYSe+ZSSGESGVYRg2ETFg8kAxDJTY9iMkgIkISDGAWKkXOFlxUqNARKSwWIERgLHxXgZv3XRV19VRL/lvSVkUnehpqbFCO1eMmmEcMkg5K1doKeTAaYM7n4unBZfm7T42iTh2jgSqyNuS1oSLIg7ERYkk7IZAfVM2DqkADNnMZu76+6zo6ipnVRsAyksqY60szbFeYhTbU6Qw1W2JIdTt3QJ/K3sCFvdaWj6pciqXUZWtMBSqdYUyoShTMIWCHdjvhPNYNDiDromebumyrtWbdgcXnfDvCtu7cF/EF0Vmr7x8Jmvjz//A5n/wNojT285VtgljT8yUXNdc4F771vtXSo3FgLOJukgl8z5ueu5sAux9hr1HWU0V0es2S405awmQDWXooq8Zwki16H0sMvVagt4zQAOC0tWVzlCne0FqO0WZpDZuRawBtmcgHwE0KKhwZXFmA1xWUiGkx6ZNu289q690zNTD3019sj8d7RzFS9vWPHkk2umHPbxCRXkTvKkOEZ7U/v5upu1f59a+fV8Evjm+V8+2/3E23eOZvK/D/CUBdbPAPKbyRgUnCqH28YYQAHDgZYEDhHKmfwmftJHeC66ei4/Vuo58vJzD0g9OZC4Y4EmZtijyVw2V8RVxKgCvGDG+7UyVkdys11moEou3ro1pUoKyBkD7j4fkCeF0UaGy3z8LAFYohg+yPfJjqdNZsHlzcq20a1IKSVzsOS5smoT4LUVCGMDEzqlZdRSy667+fIcdp1y2UIdGo5dPX/cgmqy4PvF4+Y9rL1zMjrzmc3rn31JO7Fu9113Pv7k0mW7ycI5LxW2qpq899QHVZOrWhUemnfw44/IFdqZR7evWPYUWbhgw8b5c3c+Ajwx4sK/hB8Afw+XizyRiNhbBZ0nckzVEVdaIvKEC3miRRx7QDoT2F4OqkbgiTxANzMFeEJMZDyRkwaYcnKtOHXI4Ln6/GWhXM6JPFFMdOuTYTRi4tGFH/+uKdrOZNIKlIzdeMnzE+c8P3rGUysqXmh5YOPKfcLhe39YBBzx7ThthjZttEiyiW/wqAWnl+/8fNWUyz/71zeAy3zQy0ViGehlmSur1cyKPaAmol52IPiKOYhqWbHSF6orJOATNTGJKsW4nnbGLuYzhc3X09vC83H9zVNbxAfPNXJ27lIOZBgoFXicHDNFFMlelSdZbaCG4cGmgGqFBzvgwbwJGNRYrkhylSXBloRMUmuxCDEAqOliZY/XLRjxt/jj6V74RlgmdoS9APYDT5iqpVuAikW3mbj7CB2jV/L7+SFDyex52gnt3XkA9wNkq/C+sJPGh7zMCrJUU9PDUo2WlG5C0d0D/x4QutU8L3QjW8eOJevHjmXPnsN9J7wmdmbPFus/u6zETODxc/ij0XKhz3dzSBsSqNSWDkWaXX/hT6EX8F0K8N1kLpyDa5UOVhSav6o7oTrsFmiIg2r3enyXCIRLkKur8hJTgaJZQNEEO6WmQefEhEQMMrnTc9BRcmTB2iaZkSnd6XBpSKBMGVdzoPO6iLpocuqOEu686/mPdj1xdNhdk2fynY6UZy2ZWbGG31iYn9e6dV5+oXjz9sOvPTHuuXm37p1x78v9hnaZu+qu6ee/14NVlCfmah0NH0kruFKuG7eRC8sYZUgMqR0k8PeCSiigFonVSteAmgIvLQKqiN7zZRTNnHigSu2ua5YXzvVm9n0nu9L5kJpuOKukHeKq0tI7dUaNQuJXVLfkADs/LSY6WxS0CXVD/9AkK37AvygE3NamXJFlJVCudu1A7R6ghZfkhrJFh2ADyy8vn/rSpQ6khEcw0D3q4Hw5ooU4RHzjwe2by7dA/ZRGkG783MRPyYJ/cRfIsMcSpWFPThk62zXu+RV3O5JmvjC+z7Q+IUvfmyrXmp3aDu2Rk9qTr6RsJJ0/HhTulFX+xuhz2sNVfJuEgT0P9G992c0Tt/Umn5Fk8uT372kjta/XnL9z5KCXfn1zG3dhVeGl0SPTFvzzLfIAWXsSnDOTdsdbRf5r8kJfkp03Dx/PXeDFtqr2GqV9JuiGL0E3GMHiKEJrFGgvhKiCiBhMHAFxZjADvRMCyEygJ3AbWoAUIbBu/YJPcPrA5s6fzucveCh6+4PP8ldqn0jKuWswDsoTIRX1xn54xgzqs3lAc4xnT1GTQHJSPZQN2jTFQx+VgpLTR5c2KQk4OKgkMRM1IQlZV5FQaaQnV4PRrkrJ1bj+anoSQGSCNfMksUBRigxvlWx0ggFM2VfXRmvhY4rBV+JjhpxvP9lz5tfK2+evP/uZdj+ZvOmAukFbQq5Zt/spVXtTUl58dvLO3PSX5r/44ehHVt25cZSwfMmKJbCXF4EufAH2ZDo3kAunIj4OwMeRihvR4QabSELUEszV4QQJP0sw4+bMYKgBAoCXGzgWBGwyvDOBEQfogJpQ3YCFKqUyr6OknSM3FBQ9ft6Xw8tudDtKy0IGEfiOX7SMu7DjDElKnlOsrT/y/Tcvv/iKZ06qVv2PrWeX8TOee4kUbYt+TqZqH2jnwzXauwcOfPv7VlKAa47r8RysRwLn5troq5EYWw03rnYyhTMRiJ5Iw3Sq0VWteqigQoKKjgzi4kWkJieXtOPygYoPVZH0zZu0L5/RfiSub0my9tMX2mlJ2aa9/dLSl7UT20eTtkRccJ4UEyoLEYZuFIYeOgTmGAQi8IPEWE8SqqlHDMCYk5g7TF1lM7jKYGsxv1h3hpkjzP7tF5bU/MHvjt4kJEnKmOjHo6N7dFsIn8vi8Zew5zZ+JhLA0vQz9QcmNHjgfmFpzb/4ndEB+LBjY6L92bPuAx45CTySA95ZOAtxdMasBcoY1CdLMIEjk+rNQsMhFdH1x9kfeARojsyRDu+MwbCHuj6eVAAhFxYFGV4Vs1BepzqB99N1s9KHHFMMogdZBmVPWWmZDBwvI+Pk8veRIOG/JA5vZdrxnW/8NPnkXZun9MzVZvH8JdrPux/X/ljNz9tPAuTWb17b8qj2mfbnEzsurAj6ikjF6Oi5m0dup3ENpOPPdP266lLDyKQGZhgEC6WkULt6uH/5IGofUHdAU9UI7B5bN0ygoFMLhKwULpkzp+aQpESn8CvPXcM/E72C0RK8eXI19ft9ddYNnX+8vZBUTf9J8TuerEQpxP62B/iWT8PfJiGsVuq/4DpY4/6Lid7KzhyWpLjDYgEYZWR+jAJZ6YZkvmAZPIBqvh6VOx5a/hQ/5+fX3v2a3Ldp8/5NoqGGHP/jszivfUdp1KYBjcRQfcJQUlAbXBXM5eUMBRIygyFuBKLwZ9ZHN/H3PRh9CiRSzc+CHK2o+YA/eSz67/hzBHiOFJPgSHmdPgZGn2SwFigXC5KZhgljhHfvn8MfB1Ltr90fhhCV1Vfp9zJYQnWgZpE2WxKNliCRDEB2KiFsYEnwoiWBmu+ISlgwJ5bryJgJLrAT8HHK+7fxqXza9kpL9PSt0a/BMTl3XpJgrWfzd5+rES9E50cX1u7V3+levUKnn6EOJPoWBelptqsCQgIyCnamauZosEQRZLAXY1Q16YAQ5DQi758jXDG7suagpJz3iZ+fu0b87HwOs0Vgz6KNnwTebiedW5xgYlFx7q31a+1AATvNM6GUQL9WTbajVS9Zy2tlN5gKHjdKyhzOSQNIcgkNIMlz7yE8uYaQFcJyTdt9QTtS+ctb75z56fjr/+RXPXiUhB7dqn3w8p7XtLe3k/GkjRbV3iGFJGEdMZJW2nva7yy/h/RZTWMFTrCc6kgzJ0gzcwLdg2bcgy4W4kUdGlQsdppelABqN3KdM0GuVZUiKklfKmFqEuX6L18RY/QXbSWZXvXswSe0RZLyj9ff/Dz6FH/gsYcfquIRjllgUPwDaOYGX7kvF3YgzVJjNMtOjDvIyQBAsl1Nx62VxLzj9GTgGsnusKLtZQFPL4lKMwc693Y9b0FVINU4RslIDCjCyuoRcxYQc+djhL9nzTJivkF7/9obdmjRlbN/fuvtH356+9g/+YXbkKLbtbde3fi29nrf73oT4tlOWr9BydqKJKyPk5Xn9gJND+q2ylCd6yyM61QPuv1JlKxWVBIpbC+gNg/idqD+EciMVIyaYfAwEbgOHBYaSrYiV5rLlSRqnXjqk9xI3H4SJ7vft5d8WE0M2+8m4xZpW7QBZNb6Z19RtUcl5fTrK04VRB+w8oOjW/mjyop1j8E+6Q88Ow7on4+2VW5cvuXG5ZudBjtB5aTY8bMUF9oiLWl2Li05FjCDxUlj+Td3UPXBx66gWoAbOw2TTRZ7Zi7d2Sk08OIrrxcZy83PK2kHy9Qo4YYKJ69/5bcvPPbWY1qn0fcT56n7vpk3540ndh4Jk2XHRmo/frlOu7CEbFkXfnDOrHvm9xr7xM53Jr1a+cDeByomrrh96pbxT7w94Qjg2A7W5X5qp3bgwobaGIYZQ180lG04hTwdlgyIogTKOmyglpcBo2C13hnGytuJQzRrpdRjzJhzB6QeVNZsBRpug/tTbziJyj1dhirmkO4Oq4KrGtPjGJFNSGb+sEmgrgENEYNSSM4uLYFXdA9yt84+QUa/M4csqH7oW+17clj4viZ//+tv7BM+qslc89H08/S5YBaI78BzTajXsDogzDEliqFxGg9XOVMsNBMinjI0u7OWkmMmMzl2Z/Q02NXnxawssYYqO8J1Bvn9b7ifgzvCdqJiDdFbhgkK8lAs30M8VM1ZEBUPTf2g9/TimV9m0rgcZ1cch2wsOfLMSyt+8uGnkmIttilJh1ST+aykGOCL8T8thy8SFIO9ymjApHaSvcqWZHUWhuFt9t3Zd/sNsA/Kw/AZvHAR3miyJdEcNnmaNxhNVluSo05WmwA8tMwBkHY0QJphTvKNxN95HrG0LiOdJpL2pW2IcZ62fIa2r0WutgeJ8eHpD8S2549/9LWYD2J96r33nr8H6VIGdH6K6uI8fVebQjSwSkmdGGAamEddIdL4HKos+p/fTMrIr1rGGrKOrFujZZJ/3q/1127kT/NvRR/mR0eD0Ux+TnQxPCMFnrGHrmUbFlFhaynQtVSMp6iuRIobjCycr3LsArGEZxFgzZTV5AB5bmX0V7Bfar4VvDXTop/wuUwfDoT7T6H6sFjXzcaYPSkwo5VapqqRRXtBCujZq1AJ8WFgwuceKAypeUb4rGajsOgW8cyY/uftut7fpr1KfjQsgP1VQqMbkpFGN4iRRjcwU230claxEI0VyVEdeycEY1sLTAm/HHJvIz1PnNBeNe4fedY1Eu7b5sIiQYrla7j6+RpYWn+b6fyQ6ZJy9iT8Lgcw9KIwdME8FQYoFQH8fR0G4yl4XMTAHmyw0xA/gX1vjwFjjEVh3KDjwdz1nTxJeml7Txh+GPnnlRj74T/ka2gcNJ47qo39IHclkD6kcCBpNe2rr+FX348W8OXRo4w+5MJ6YQqH3qw3ZmMZqulFHYRCIF6IMLlm1Qj6N6PET8k+6Xf4m5YcIIKFN0lizGaN8BRo+pcqwZXiKB84/aPufWG89LtWTXX8cLBdj4pX0xz5Qi7sqc2QW6rDSQQuTIbqiJCfjnF3ASMjrViyHIiTqIdYMWuOylZMDQZVp1ytePCL5JRqtRDTI6D/q5LSc/KpeM/xACTuciVfDjs58ELLqYQLJyQ6ylmEMrdjLAGST0NAHtnlcfvz6qXJS/w2MpwYv/9w1V1zt1f88tTedwTfAofU9eXxG16suHNcxXOFp6qOkaxN+yunLVkwkNzx3N6tGrfx6sTQ8GsH7Fl1c8W0oT/x85mNsx7ksgDyPolL4/rpNk5izN2WEP8UoZrmgFkeD8PuvC0YROPMjcaZnsxzYymElIjWRQpaFxhSZiZwKY24ukBi5xuddYLv62dO+eLQ5188d3qaZBz49f07dzw0dUuBgYtuVLWPtfOOqPb+rvtJ9htnqk9VTx5P13swrNUbsFYZ3CA9T+IEHnHSPInTgzEBhDfRWB1OpJop0YR6WLcnHTF7EmMCHjuNCcSsSlVKA0PCQ+1ZahLRkBzz8QxgGFGih1Dp8IMnvbMi/J1pqmnn/K1VVdvm7jZOlaY8N+69s7wtd8sfS999cv6GMyf9x/9xz6Tbtg0iLSmNxwHcJymNvUhjC9LYGndXYzQ2Ao3TGKzO6hh5DRZgKTPQPD1GY9FKaeyU4+F6sOBCQQ/a3Rgw4ymPlMm0fOLLFz+eOnOSNPXzg9/M2vHQp7fc8vFDu/hUWw0pfJK/9Rx3L1hpZ4///DKpOfkjwDkQ4HwP6OsBrTlIzz7YDDobZBirIykWl2TV07rZzL2SaRQJ/E40ykwAqI+gcYo5GRvG3xWTrIJqwowSWmx4Gacw2Jw+NyOuh6b3nL4SSvKBsz6Yd/i7mpqTW4as6dRr8fm7P59Tyd8l7Vp25wGiFW44t0r7rfoyz/5/XdGn/IVlvxGXdcMraMN0BWKrBjfYyf0Z9GGCJXlJIZWTqhU5iEE2gx5+cdEaACdwhS0YdrooC8nAQi6ap3WhTeOhmT3CzEoDmpUIeYiWsHiMeZQ1mL3TtWr3Q907moMdb5tAeE2rED4YtmhHWB6eWDl56bCalsIHbK+N0/oJ7wJ9vaAjR7NqHDUTWMAIUDI+yAU+AF3pwOR/PiVwmpOajZQXsoO0akFtCW/SOJYqdstVoj0xhZmOuPGSwKxXczPhKrkue5TpHnV+GZMgdTiFkhxY5dOphklnXp38ZsfL5j/14C5h6ifPfo1MM6jVponANR67RgqUDec/eef3EddfuUHduGwLKTp3/Ocj5N+jx/9I9+cGEN9vAJ87uctrLXsDYbFIKkOYo4QikqfVaOhOWmTqKKkJTqpNOTUplipD6cF2ItCYQmmUN8zsuH/8nsfITDJrycTHUV4sGjr2lVeiHfij961cPiOahrkEAKYD2OsmLpG7VM/x0li+EQtDaV7AWq8w1MwKQ0GU2bAw1Iwxe4ORZzmQePIFDdAHWD2ou0KamhMIdC8uPveU2OH8Ebq+Fx7WepESeG4il8z15JhX4IZHIgmQ96gR4aGFByZMGkg2G6b/q9UU3DsSpi7duFOEBKqtkOcIkEHAJSvRQyIOqhTwajRfVByeee+K0iOFeflFRfl52uDbrG+KB85f/uAmo6E7QqevCdY3JcZjJGCX4Yam68HIAIjjZrAhv9P8k2CJCe+yWJBkQ8VksukhrYT8tkrreZeBqymYTR7S2kdX8r7F2m1Mhz8GP3IMqMOz9GfhM/QIEhAX/9VGkB6rMHDn6N89CDb1YtgX2bgrqO63eTAmgtuC0S6kpgMHOYOx4HU2hVjJtlPSeVgtAnrdNgcLWqdkU2ZCmQ7eYBKrNkqvF6nwAGtl0x9Oxl42QDPOZw9OFTtFJhDu8g4vTSeDjBWkcvkdYUsFuWPp5K35Ygdl2LATI8Zri6PF/Gv3reC3TY+2408sv+uO+VEvV7sXACdnLP5KvdwYRrgh/ovd4Gm0G6aInfdNqN0OYocDw8fU2w0ck+tiNsCSBFZOh1jMJSbX01CYZzXQkVTlZMe1o7W8jl7kQCHWSaV3Ju0oMO6Bsz5d8QFJnPXJPe9rv1W8tm3ra4N23L7lGO9O2XBuufbOudSN55eRwD9fOnv2Dc+ctyaff53ZH9oQkaewpaNuTIzBRklFAUwVsKY1HttH+8MepImLZN3+wLB+MsZqE6VYrFa3P2DLeurYH6mkbiXD+omG6Z+99OkXz342o3DL+Id2P/bwhE2ttCHSR2uf1D7SzstggWyIfsArtwz75zfHfxk7QpfhQ4STFF5qL8VpWSvDU8GqttTaS0yXU6/EjfJbt5cstbo8tZEuL8NgXmMJ/fLHUwyTKma8//zXs3Y/+P6Q1pvHPPQYk8s715zL4/PWgUA+8fNB3jF0zM86D/JrAFYbePd69IqwICklrMVaHY83Uh5ktSyWugwXV3XAa9P5W08EM4S8wknrfWKHJw5ZxxvnzoymMn4fAbbDBnhWC4yR+OM1LP7aGAk+0gO2mYfGSDxOtM3yaIzEW7eoyMtiJK4g3eTOoJqPMRIvi5Fk+Kmi89AYSXb94pTceHVpg5pk0HojKozbls5dt0r7YnOfUzv3flyxedaMVTNJx429Pw0/9z0JjJk+4foB4zr3ndJvwc6qe2+dN+b6fgN6Xj/j+ru2Pw24eS78wF8l9QW7oi/LnoKKYBwKzi21LYzBOkYFLDHNarjihYUuc32jgksEEtuYOSGzSiG60GgF5ZXInqMVX3xxae/My6RAv8pJYEwQt/b9sGhgYH/LMHnVcv4EwPQw0PuY2IGzo3zBqjtWlCYJOmCmEE36o+SVaVAFiZoQpHWomKA2ChQEcI0kvfEB1Zs9lF0WMyTzHp55joiXV0zjx/34ZITM5g9F+2qvvy8knT9y18bXcM3zQMapAIMBYys0ZkRbINAfj5W9cIZ6Drg/r5L0JldVauOGih1qbhceOK/bbdKLcB8Hd4LFVMKJVhk7Gmg9LpEMGPSujawk1UZWkuORlZd6/mxuHFnpnPTDuyyyIhXbFPGQapfOSop86JmXfvjhS/rrVlogpRolFnHp/O7PM1l622JXzIckTIomHhK4vbxoNNvsLJJCLknkRclgNCdabbCNG7YO0NhKWDAlMY8u5NTjK85YfKVr5TeOFCKOJCTd89kc7fBI7YzVqv08Ekjywi3DhE41r08ZI3Q5f0QY2LFTzU62v9oArcNAo/rxFfL34ittyDztvntILsldqd1H5t+jvaG9wefzTu0q8nT0x+iH5JhWCs/I1noJCuUpPxdbSiy9SEygFSTINzrv1q6oETglQDzB0q4kexG5hnS6QwumDHimsC3p0n98XgmgNEVYed7W/rDtNsNNY1dTXG4CXB6D59SJsxh0R0gw/b04y038vdHFgjM6nn+hv1A5akDN4hGMTt21cfw6Q2cuhevNAcNEHCIXFAtpPYmA9S4RI/2AKKkBJRkDHlTrWYKqlyJHLehkcFsIVvIpJlB+rEijJCiXdCGwQ0GVGJMziMNjLCadib37d2TXbu/v+/eLv2XseozPGk2kb54+Hep7tXb0vT+u6vPPr7VP+l0TPH3wU2Jk9ajar8RD4zU5XN0UW6zQnL3EAjiwF8MjtF8Nz5/tBn9rBtxujeGWEohwDDdHQJUF1DmRhFrc+FMglFQ39W8Ybg5q/YCBiUUXUrlicYA9THErBbVTlgfI5JdlkgxiD7lzZAyam38TX3zxd+/jO7/77rFd2rP9SO4X0e7dz79HOvXuG/rmmc+186O1s58ePB3EXCzZKX4rOAG2GzkscjJbqsNmKunNVuwMAuu3QSFNKiuksccLaaz2aoRUTUxBQO20TMaMZTJ6KSyNhjBpH6LloFgd7L5v69KeSwZdNqSs/+jRO++4cu6+/sEBt5EXH3iuy7VdQ/PGP3Co7JGCGZOo7l6hrSVtQUehX9CFCws0uoPVUVZs04p7A4kSAW+AJr6A95PrOAW80SQwp8AR6xITYH+vAI+gqLdsmGgUPgGXICen+Nz3Yur572h/wYUE4RspDyTknSxHraSHVLdUHc5yIymyMs3MbMDCdRt8LNqoxpSQQjmUQg5YQwcrcRODaoYDi1OxuyeFCfRUO2VfP5ZCotdnc7MyzkQPvKY6FC+Q0eYGgWRJSS2P2RiseadRgINg+04eP/PkMxXrXzXEYhyVu81TTW/eX3HgXd6W+xnxez752H5igx7nWD5l+Sv2r7/xkEy2/27hOPEK8IF83N2sO01NA970BMMG9Ias5mpsTTNYCxUZNCe16assXoOJYeuj+tOFqb9g2Ef1pw94RfHZlWy0D9xJwELZsXYz+JkKX7qYLsAsIRLBhZa/p1y1uJF1YpZrSKhnGmANqzPZiCXVodKy0nzhlv3mTw/sO1n54B1z7zeT/trjZr4bX12TNizkdfFmfslokvPqjyfVO+9X12ufjda+3zNw9Gjr4J7XkmTgq/EXvpFuFf8JFmErbrru17vSQiHMzSktA8zQKgwowik1HVYr3U6rC+zA7kWYogPpphrTaCXm08SUYHO4vRKm6+xg0LpoVStuCCfWaraE35BMNkeC100TegzDNm27kjzYwvllntJsT5nHCJxp9BhpyDDf6KQlCliNU0yybWT85jlLdt2w81HyxKOP3fj4wtnbbtx09auTTz+6vusdpxfc8cWCRZ9d4L5Y1OmRXR9/9fjjNz22YuWT/Z967Iv3d2+/acuV/R7exM+++5flK36+e/nPy5b9DOtdBOu9BuRZMjeN1cXHYvIRu2zjrJjdwXYs4NSIy00/AJPJJTKTCXxh2ynFEVStSRiPC1sp81uNtPgkbKMFBDYXvLMHqaNntcXi+u56SgjW0c0iMaAe8P9Fq8h28ugqrSOZqA0mW7XBldowsgn+TZAUcNlOROUBb/TXniXd+78xgMVmNsflspFW8VLJTAPzuOsEuuuoA2uOS2YB/m2uqKjQfhWEmqjwKv9H1ELvNVKTxVthD5Ryl+Ou9yDnZ4Llm+lBhDK9gFBQD7tfQSnABdUyDLYHFVeskreMZf8D4D4E7EoBftzVQav0CuAlDd+D2az2QFPOJzsusYgJsiczryjY6TJqImeCibyXI64Afd+mrSdW+FxMmKFMS3xz65rLIBAy+boVv/l5yDtZrOkgQGxkZMVxdcuzl2/RNu0ZMH3sjYMI/94XZysOPfLoM10e3vzKc/0rx988tObD8S92XzqvxyOvD5q0eOmTP42bcQm/4anlk/sMvnrIqFUjht/jC6wY98jLp99c/fRdU/sO7t06NGrliOHLfW1WTNh+qH35FKHkuiG926dbp944bEb7HtZp2Gcr5fLV0mGwfTxYVUS7kpJCqtlWrbiDLLJjtsXzxQZvNWYvUKM4vDRZzKkC6pFER60eYQi2qHO9KlZQSfYWsXhKkTSNVlEWF2frr8Adt1/4XvoD1tYGvnQZ96je8eKM9SOmidWR0kACFhuVwmeBUlzxQMhcGPG3pJ/64dOW1Ctq2QJlfHuq/JNYJ2IS60ssYg2bRXY1SLBvMxJiH7QIKiFasqT3MarlgGOwiK6+4EzL8Se0LCmlq98yANrKmOTh9N47WinBCiVywanE6slcR0k7PtefI/ISK/X2t6vVBahgs/NuP0h6kQWk58GItvfIYW3vvhu2kbxdO0nOzh3apzsf1z7aQrz7Sasdt30wdsG8cWPH37Zde/dp/sNjZODRo9qOY4e1Xe8cJ/2PKtobkTAJVYVJW3Wf9vaHA/e898jDX2y95+al28bOeHgr6wfYyFfxf9J6vxbcbI51PJjAs/IG1CyQFrmBiKAbN3l0UyaCKrTTegtQhTlMNzrhg2SqJ0C0otuYk4HmnLccO2poW2IWVr0nu6msDYOx0kT+pbRB/sUtuzx+vRTVxZIvORt3bl1+Tb+Bo27fsXTOau/EJMNNd05fPH5LydSsO74VVkyY3fmGwT2uNIxctGqpdnjQTYWhcdNHz+tUtAvxrOTuFy4RNoLPZOU47BMBA11/qST5Y7QfiGuMLXbBJzlJpVapzSGV+gWrcyYLhV2CiZPAK9ArpWPdbqKZ1SSJNOIWFoWY/63XJGFHm1+eIxRV8JvGarNJ+v9d/5nIjYT98Cvt/0rnglxH7nl9RzhiOyIVdkTbEOX9tvBZ2xBC1DYDZGCrYCSzI/0iE/NqnehOsLGdYKONDJEgY/xQUAnasfVUKQxGcthnBcFIPrvKoeHx2J7ojHsiAx0wOQHzD2Vy2JGai1f5zDXi1LaY+84rV0JyxGhzc1h3oXR0KDn1t0o22ynZtRuFsFpXkI+uZMzJ0ZalVD38kO8fybZLr4P7tL3aDNwuO8Hhu5rkPrpV+/TxXdqnO8h4wq/ZdM+V7U3mkbZeA5/d22/MTWP31O6Yo9qu47hjqrQ3VJWUhBXSJqJqx6P7hB6Vc5dc4h3/cHePPXf1gJ7aThK5/vIbruIpP4yV+gomqrsKOL1sQ6qOX9RdRmO9ZRzLb5L6Dh3KZhkI7/IzYB3NnAu8CyZUYQ1phwCujptOMrCw1WElTrFeUAzDJVmQ4ryJdlw4rPCGIxLdUTFLGUwRV3Is9rZq9ZFVK4ePKB2w+MYbu106ULztrTVrRo1e+cdl/ftfdvnAgViTDz7iP8TfQOYncTfHekEM1bEWT+NftXja4y2e9r9o8ZQbtXhiY8H1ZNNEcqc2a6K2UriMf38k2af1HKn1JPuiBcDwhOvNr+XXSwfA3rldpxLKfifdZ060VcEVN4sszo8lWXZakoUFfJK9OixRj0hKwHgYTVHaEwESNG3syZSAZkpAcyItiFScMvyVLpZo1zRPmwB1Irp7b6pZOaPsNMB2mFwytl/fmwaLL4xbOWfkiNll79zUi3SYcFXXPgOu0ms0+ZX8coA7j1vDhVP11Y3VUycD3Lm08L9OVVNdh5LmonBgALabuYOxAk4fvAPbPB1lbhJcJwXQwA0n0TLaJFgWmqpKItgDmJrF6puwsUzxlSsJspJVrjj0qtpYpRO2ANbpANTVs1HX0T3Gjrn+plveuurGfrfe2K/3kDEbZy5Y3fuKrZsW3rFNmNalX+9uK6/lr+zUpWfPDkPmVIxsPzil1ZqRc+YzmSl+St6gtQLZKOOarxWgUziEOS/c9x38hUerxtolGvPtwDkx/ocR37CdFjDpYWrFEqIB6obhfLAUsbMH00o0U44RfTtG3Azopjn0+LQcr3ilUbd8eevMeXctXpdRMd447L39N2E8Oro4cmDqNIE/f2Tdnrl6Tep1sD98tN6mTI+9CdRkpVWvEZFudUW0qwa0XEEf2CMc+4wLxJqb23EdsSIGE6/XEcvXX1SMe/CzGcIn73EXzl3Dm6a9x+pW+ErSR8gGnzmH1owIturmG4vjqbJtRdghVMS/6W/T5opAAPtPtT5kFdzRxhVzii0Wu6DxZ+MpfQqKXmgaSWAxEDu7J5OuZSHGBMMGTL5pQMYtiY9uWqatv7SsQ5Fp/iXuBweNQ1jn8RvJ21IV6NZCrn6bL249Wg0uEWDKJjt+55HutrHiTwNvrznDP8R8gjv5sGCjus3Ltef0lmawSRICqoxbnGXrbfbazmY7S9TX62xmQelGkyGAv+9UV69RldVrwuMmj75t6rRXp4q2wWtfeGHT4LXPP7duytLFFbdOXbJsOoNlKrdVuExQmN1Qhk6Pm8b34GUqcWk/jCX52ofvxa+2ksXkbm2BU1sSv8D7iHAfTpop7YH7WDg3l4r+qhOjEiDf7SE1WaT58GQam0hO1LuZJRpLqk9E5C0nmyXisNMOtjSdqioPShZEV8RkTkhMpnvejRkOo4XZYQnlcZoLOBmDtcq6/SW+Mp9snIrLYOSP9oyWk8Hknonz54/RJk8gPjAC2dKcX0hHXszhU6Ja/4MH+5MFQcw4Dge8Nuh4+bjVrJKHOpqZAdUGgi2T+paZCXpgpRFXIEIJcZlGsQEPPWyn1SV2kJDhNCq80zzAQf66uKpp4IBFTFbwVCm2LizxSSlXMuW9klG02NOYER5H2UyalObDEfNchvnHjSV7ffTJo00KepGbAXQ4Q+V8K66EK+d+5sIhlA5NiHy1JGTPPhRQ2oTQV1GKg5FcMZSK3aXwrn2wjiqAn0XgwiRY8Ou4UujwXyoFJG8IWKcsqAbh+9ZBtaOuJfailshvhb1yIaRpy4LCIubQlISA2PmtgINKZaWwvJEWCae3LCgv//uaxNyY82Y0r1zIBLYsl9ZlyL/QONHtTfAoz/XX7hCuF/vArvPjNBYnjZbEioHCGRiOzAGf1hNQ7ZZ4UbdVpvNXJNYkpBjtVXnGLFuh6vUy58iLn7HxLA5W8+0F80u1CMCYRmDRvXZPeoYvhxWfOfVAugf8/9KuJGTjjQZ3PPoHdCHx6Vf9x666wchX8MFnPf2WLpi5Ei5PPB5+nXSgwc7WlonH7uwx/vLKGc9mjll0x4oV03ccflXcCz6yD3xl2I+0780YoH1vtr/sfAP+sDfT+Qbyzelv2P2maVi/V6cFjnfTWr7/oWeSfGdIaPjM7mAO1H2kRi2D2me2pc90/uUzXQHWD9AkniXOkNPtzzc2Qvbnn3r/c+KunXUfThKs3AVNszz9dPz5Hjp7JJub3/D5mbHnoz1qCql25lInSKwP0HQqksFM+gw2IMnFTHosochAODOpJCcJvCebTvdxqBLthyKZMg6JwvqKjHI1wavnM+Mo4X7L5HEjeuh+w00o1OtkfGj8jW26d+pcUHzpgMnX9r6vPNC1pG5vo6FsUEVOq5xu7Q1Dpk/o0v78m9jqCPKN4ctReieDTTKqWYqjPZYdUm2wo7xB2vaVcEqVYbvINIaiZoDZQru8ZLC8CQryciVDVszl8SVSbS7YSR4636nuYjUTQWq0dp81EVKqu44PNAwvxfGbTPFzgyab/Ff4RVJZBigrELHpQjkH0YwkM3uKNYNEZDZjzq/3g+wFZJ0uNgYghmkWDiGRE+pjSoQYdjHDhYnThog+N/mavlMm7JjQp1uwbfcrAm0vq4fl2msmTLim77hxfYPdLg2VdOvO7BkZljCL9ow5uDnMv1O4kGo2xJoUjdURmz0RcbVZsXeQXkoYM3UGFAdob5CLol0xo5pJtNOyOXD3wubEmK8HPxPQH7MrVvgdzDeYsP09SMcwMfvPQdHFXID+D9AmPkEWJgtDoj09fJ/o017++ZrjcvSJb0kBb/VLysjo5yOjW0eQJVol+UPoTHFZpHXXe1ULueWsWxVUKZcpNtmlqhQGIhn6ahXV7VfNhqVqyUIaLZvqXsV5KtlJsgPwkhypGf4WeYV0DVMx2uHPa4nBrIRcuHa4k8vr9vY02d5K6tvVf9XtSg7VGt3Nd77WfFzPHNf7p7oZS6gPf9EuVPvFulDlRl2oqB3qdKJGc6li0NtRjSUgof8XYABtUReG01RT6DAYMnU9EYOjDOBwXRwO98XgSG4MR0yD1AXGHVMeMXgK45oj1jfezWigcXU/5m/+CioEyhdSk0CcpgVjxknzIKIvp4fgMXuJIY5ML7VPODUJU3MpmawOrw4KzcjVuhiJTYnUGHZ7G8lTHr0lMgjWH/M6LcCHQ0srntwRT6nGJJrSUY0irXriWIsApnaswE3plchGZ0/Hel157hj88P5H90sjoQTsijwGnDGkkrFE7I78BQ1+FBjLaE66QK9VZbNLrTh+CHvE4/lncPGNrPlRiK02BhB4tsqjK2uX9+x77P7ChR/h/j3oGmPFWk8macNW2ncVUFJDdCgJFlamN0ye6B3SGLpK9tKiNT2PYk/GlRPqrBBCUTev4oyt0reV18eWKb46Z8chbIZIbJF40HKc+DHVBRncLfp0Lbugz99IBS4knE2w0sw5Bv5Qm2fSvBmWrAGUqcGwnXp39nRw02zUTbNhBMvO3HKzizaQskRwnfZ6n+yMN9gjD/r21umyn1JJkr7X2+xJO+0NXh3Jr4132/Nq9Ol4w3307ZHxPf472GJmLou7p1FHLRY8WEKqQ6LTFaxSvIZeb7G1gPjPYsZYFotoJ7N3ybXtt77a9lvVjdNErKkg9IVkOrqlTiuukop+kWpNpyGnuo25TVpmsW7dGxvZZHX7dxuYZByVIbSf19iRrp0Pqyqa6OjNaaqj169Xl0ZEyZqZrZda/2VPL27M5vt698F2/Vu9vaKXiuT/XdhRTTQPO5kGsuFvAS8IVKPEYO9MYc9rBvb8pmBvWRf2nL9F95iwaR6BnUwE/T0U7LVKKIaHn+IRQq+4ER445yozpObBvmkTUH24b9rVRSwTdkqI7ZSQHTtqI63Yu1a1SJfAa0FIduwTJafXZ21N7abWaAKGylVfG3jNLb8oGZraOc2TZGKjvfT3qJPTcJOJOo0SKY1wkuv0pqgEix0KqT4bBlRiE11rKaTmgmDPtautcHwrXLappQ1OdMV+EUUsV1rJYacXG+yVNnTGqerLB4nSqk3536NOE8q7eQI92FiV/z0KrWuk5mnd0XDhiPAW6DmMjsJ/HjMxmsktZKS2uy+5kdzUV9tNRvbV1mnrq+C2g6/RttIf2pq+ZJx2vy4PnhTPSV/SKToF2J1Oa339MSpnJMa7/1KSaNUaTniyJrE2vxSONfblyU8bJdllSU7zocdsZbNz/OBkKk50MCOWZKO3QA8JUvvcgza4k1E13+gvy3PaPTjMCIiaTCncLh+puOuL+28f9cBSgnR8ZsmI0Xftq5zNV8x84fV/PnP72nfOXMOvXoPEW7H7x4j23SYk39AtH+4nvbTza4Uzi5By0buvp5Q8uZLZMrQn2xgAX8zNdWyqKzu5qa5sj96VHU5yuPRRDA07s1FS1+/OxphN4w5tw5XURv9/BgdK3QZd4s+CpG0MiNSWGeoxWNoCLN6mYUlrCpb0WliSm6NJTIrWB0iP7zQBUpd6tjqDiwO4UAZMagwZApYfwn4jxReM8akOJhZ8p3hjk/JisiAGPOVeBx1SoWTK2FSWy1pP3Dg5LzO3NlFVF51m9nt97JqIgDSB6atN2O2019tYQO3iYMNub2u829umd3urPG09bdzvLQAL1PZ8m6h3Vtv3LfwUW3egsngl2KBW4MHr6sz6iCTaqAeUiF3AbjZ2xxCf4IRTl2k3rJURGUfbIl9iBpy2HLltdHiWPgwmyGaks0EU9rx839MV5PJV707+/aS2h3TfeOjph7QnJUV7e+RzlQe+FLVnye7HScrjIsq3h2D9rzSYuCLsUqbQ0fbMNEO1UqDXkrF5kEWOaqwcQhMF+7oSmZQy2mmYOJMNh6QzIf1FmJZN8aAsUhLlsCvNhxEEYx6LCMmZbPAC6zSEXymQw0Y5RR84o6+4jXe7aM0Y7SzUOzGK+ZJ2LFIkyA+98NjaF9J6pF73woB3t1+/r2VOi3WXzb6//9OD5s27+d+iOOrVD3ff3WHIHde2aT965V19V0faZI/IaLdgWOfJS+/sM+SL62+Zqb11/l6a38E+bel32qfdmlv8tzq1i/+DTu2A3qm9Fzu1WxX9z/Zqozy8aL/2MBSRF+nZFgfFbNf69Ljn/xk99lF6FLamg96RHkX/k4RBAX3xRvZslNkXoYxwuR5qidPmD0qbIM47/hu0Cf0HtGlXjzat28RooxYHyv9H2SamMi5Kout0LXIxIl1bT6cwOn1C6dSVe/Vv0AkPVWgVUoNgi3cKgAENhLukScKBnRnpyszwrg3IWIrFEZES9mVJQGlhr6XspUjZrjirFknbOlh+8X2oluNYwq7lautOdKTkf0Tgpkz6ixI7rZFlf1G6D29g1Is67Q/rZzNcyh1rSP3WqOzKQ2oIFHrXYNNM26052sds/HqEd9qVTvhrpfBdaUDtBC91aX+ZfrKDko5J1ipTThJOrFBaONTyrhdla7U1JmhLO5X/5/Rvwoi46BJ0a8KuuNgafNLYbYitg6GUrkM77hKc6nPxXRAKRNqzzEuXQKS1Hsu/tNmNUMKyMSV2THRH2rB3bZqTLt3g0xJYBzUnHfywjvJeU1J+MNT6b+yELu3hr9q0+i/XoH6O56JLsLNh0ueiC/BF40SQwN1w4QfDbPFqrpArAxm0Tz8Dxx9SA2DZZDK+V9wh1WSsVjoHI+29BbAI6Om2l9hkKiZ/ipxo9SgJNBsk02wQjqbQS6jFoJrmwJoGHKWARdMpMpM1CWADKaXlSlAOJxUE0O9Nc6iOPHgtl8PuTD8die5Qs324AbxYVM1l+/JQ3pva168aLvPVpzbr1Haz+RassbMe6WVfDs70Z390w6dvEtv8eQt3zKzeN1dt2em5aa98yUcTDj1xYHngvtPLj3bq9PXy3c/MWjTr5oOtL3B3PWHmD/CVj6xaHCEtNlYJ/Rffv3CM9d7I7WOHT/7nh2MzXvtqxk2Lxw8dNm73iqGTBl1CimaPIT2y1lW9gnbuYK27PkOliHuATVGJtNBzVY2npyhFgUimzt+t6/aI+4CRC/RC3IZTVYppEQjmqRIlZ1pmbh49AkZNLqCGpT5mRU0D+zKcm49VG2piC7h2JnvK6wwHaXr8SoOsVbPTWMjNdVJWTU5mic6rn64CXqTzT8Cmwvknfm7wxSag5DYzAaWFPgElItlc2Tls6PF/PgMFbca/mINyJVqLzc1C4U/QGOH/V/igqfdXc10MaOQ1hxA5yKy7GE5/UJxaXhyngmZwalUXp9z/eo1iBtpfIFaum2bNovZqHZtM1PE7TPFDmbihDoZ+NAkCIbUATIKSYNMIt2+AMA5xyANNnxfHvSpoSjUVqkXwYVFADXqrqUQsysNBkbYMF9IiVVYDJahcgjop6lBF9cM+VouCf4s+zej3vyBXyyY0e7Nsfm1Dlc5fOA3OclvpH/Xzc6ROfs7RMD8n6Pm+TMz3VUj/0KrPB+IzXbjNcL+f/6P7xfJ9mzHfVyG+g5wbuyN/AefsatKZ+vk+Uiff57hovq+1nu+rED+Lsc75HHZ/4cJL8JB06YCe7+ut5/sE/QQ5bJlKDYat9IGNM36O/zrj1yWe8au4KZ6YHa0vy7kDCJ00qtbw4rkHLvwgZhlaUT00Xe8UzTFV08ykajOBudXKa2MzjqvMXpsproAyAchMZjsl65GMFqBK9goGq93pRe5Nju3kVjl48oMBeNaK3bsmu8OJ39tkRWatHqhl8vKN+WU4Fok2TjrZMSF4JASNZnQm+ZSTH/j56PAnO7ba9WXorbveyv9150uh8E+GScfmLXx3TsXAzSPueYrP3zPxkSpy4hti63PZ+V3Lr1ow9rJRV66YddXEc9roCZsv3FP51bJRVSPOnry2/LohJxhv0Rkx0secEzhhaTNTYrBuyRVS08HayQuoHikegmZ15lUuJ2eiqhi9qdoZMkoWWEKRbFbNhQG+LNi1VQZPEhugoQ+VUf04nqGgXPVg0MfbzJAZoSkvqeHkmexGTlGjWTTi+Sbyh3Q2DegonE2Tw3VucjqNv6npNLl6HqtKsmb54mmsvxpQwzRqk0NqhmPysNlBNcKJuO7534KVacsmYSU5mCxsFlj+YLw2kcH7B4U3vxl4WzYFb0EdeP1/j7a1mrBJoG/QE4TNg11XDcZh/5jC3g4rxBrBjuGsrJCaDzujbUDNwZ1RUhcZ7KRsx/ZFO+aH1Z73GEO0FM86bAfSAwzVHGsx3RvFmBZsV67mtKWHVV0c9aa2RzNkyGicFGyeIh/W3y6iTpPDlCatuFI8oS9OlRyU8MUhtSVI+HbBOgtc1oAmagvq91Oh0BYu29ZSoz28FrbAZXemWZm/2RIkaGHb8r9JhSZVfZOE6N5E8q/5/Xdt4z7cK7kTYrG4Bq4SOTf2lCQEcLwbbV+0Ym2karexML14CrsTzFj4GdTPWKCnyMR6VeTYxZXCt9EXWeOK3r6yeNo0bTO2sBQXC5forSzwxAEXpolZ4vO0jrs1VqDSidx5Md7MNsZjrV6ZDjQq0CeTYVDVi6I3GcPpT5skh9vioXOfFZuDVp7m4QASF45uyJbVjNY43pp1TsQXALOFOKXDxbr7/WX0+CKaMIRViHWX5A8Auk8ZfvXg4YNHz/5kxbhBfQffNnzCzB6XkyW9bn7k2MnuNz7yWreufKIPSN5myxtXnlnj21CzrOCR13v89PCE5zsL3sLzr2v9cmAFRu3DsYps3hDIPjvn4no1O3HI3czEoWR94lDYJjtph1vzU4dQStebPLQJPZ0G04ekrizW+78IF0rk+hORBqHH0gAwsSWVvjG4/gC4UvEsq2bg8jYDV5oOV5VNdnn00e1Y1PmXhIuJ4HpQrtLdj4ZwltSpIWewHgZY08GnWtoQWheKluyQ6oXtlResBb6gLvB4joPHGzsTUMejym8xmmiltZIRUP1e5nfhiW2qTcKDhmU1O68OVqoL+7Mz/OVN4teMhKmH7rwm3IeGqL/QOBDIs9lHOh81Mf3IHaA1l38x/Qi7BpuagMRjJ2GDKUjiu/G60M3aENFIZ8OmY3dhYj0tx0bf0SmK+vQ7x19Mv2PTd+tPv5ObnX63uWL6Jzh+99MZrTZNig+/M26Jbn8sNn8Xp9/tGXibPv1O0GkU4xP0vetzRkOiAYPIp2JcgUPv6nEAbwcO8MvoNMXIWm/9GxJYaGb9myL6J43ZoOEaSLc3EQ/GWb3fG830DDo/ZhkdsZOUYtlWesq6ajHHTl8A9zvBRt3vBCEeQ0mpPYoPqygtwXBSBu1+MtNZJnBhNRey0wtxtIsL90KSrDjQMk8DSmSUq9kW2n2Bi9gOD8Dy1NbJ+hBr7E3Xx/zyxnFL/9iwJCL0iJXJ1kSem73h92UzTh9aMm3Gkhe+IHwp6fAEcTzo0ktl3fcTa+Qr7Teb+KtN+/NLWNvBF34wZolXcz7QpaWYT6SzilJDagsDnlQQTtCn3bUDw6swGAnYsxIA54AhbmHkAM45dlpeJqdUK4Eg9lm00RUfWhYt0RvLkuj8KdWUTmuMwgkujGKDS6Zi9I9T7RgJTPakY1SwXUDPnccjgvRnLNhQJ6haa4zkZRvcLfSo6uBZH9+98pMunU7NO/xtVDyy7sTUdkt+X/ZZh84fgy3y74ojW7ccPqodOiL04xfsWr5wP9gfG2uWLV8yb/XZj4dkHPht5rV33ztn4d1giRz+44/jnpf//POtWzJXHzjG7FNan2A4B368i8vGqtW6FQp4nEFmCA/6U1LYzFLw7JO81LvWz3RBnxu7gtO8bGBpw5H1aiJaAngoZ91ihma2QG2Bw7dN1UfX1juIS5qqndoinuFfB11l4grpGcpSCA/BtmPQl3b5RiQvZwI/0hIbMacY6aro+mYLUzHimVoLnnBjxV+EBOkk2GY9ODpkMkTHeTgCqiDFyicibmaQu6nbGklk3irWTyRghbhAzyoRHLEjopuys8c2djt/a+Bl1p1vwdWbXvF/891mfo94l+CC7zxsZoaxmg3zr52+D3+yWTjD7xk5kvYm75H2XfT350nt9d8fJg4lpQYHrEkG7VcX9VPJWds1hjD1lmsc5eMxGN3Del165UBBHDpp0GMdQzOWLYB7dBF7EdmAvVJZHB1QiidTW+qcTC3Hxxnp5zx2GSjMWCHOn7Vk0Yh3WN98wYVUroZ7s+7Z1nXv4Kg927orwTsUXGciM1dUTZy5bsTb82E73CYO5YMUD5lrT7nLHNKRAbM8dvAH4KOYaMe8Ksvs4A+zCUcZSvEeaopkKHZxG8V2cQOc47jzXHexF59AcU/CmbdGNghcBx/ME9rswWigSGyCmFVmx1FZsLHXxI7gjBGmTH/tjgR6si6V2sWIxQOt7ORb7gf6zPZILf2J5maf6Gj8RE+DJxYMEGau2NZfqFjxbOXd2xZ+eEe72cvxBdZmNZ/OS8I2zsr8HyRrAp5VT1+IYqN7zOSlH7IXHNtR25PuYdJj9cjrrh3Jj7zu+pH8cV/f4UP7tOw3ZBjKuB0X/hSn0rPFsRrucv0U06SUEO0aUBNcwWCdk8bTYgMBEDtcSZuXNsY7mGWINXJ1zzRt0ehiBztWlKzTX5fVO+XUX++F8uY4biepoT3xPo62+jNRlcDOzTDpp6kqImMhOmNnXHy0Tk5sog7hhnJbya/176PwQf1Wtfch9ExW1nM/tIlOezaXAXx0B9gPLbi7uLCPniRq0s/vtdHhdz6zlSY0ORHH4kUkkX7gDKmSiB4qnW+Ue0rlDcGgmpoE/IFUTqWt2KlOMB+Sg+Fc2sKdK8I7js7H5dR0n4ynaSucDEYDGNfUnFbMsW77UIm/JGTnYsN83frAtFo9ygkl1x06dIhknr1tiWXS+CPvk23aLfjvwyPTR1qmTTmrfSXwoQHbBxIbKcoa7//x64HbB8if/ppzeybJIwY2Z/p24SGxnJ4h5MLTi2kTkTkxFIoNqhTiE1vwDG2TTQ4Gg9Q3M5zCWTKpmINs6nQhZCgTa07FzLmLTZ+xsa5GOn0G+zQtibqs8NGDt4kcSqOHogl+Qb6d3Ln5KtLh5i1bBl75cLuHpdsvv1wrIu9qRXyqdi3ZE/2ObNGGkJ3aALqGmIhpL7aHHVDCorI4LcQoFta9jo/tpFM16s/WaSv7ZLzB+VeZTYmzW7cY3ECVFJxtxeYtsDivaksOsRHCdnY8AdYYpwYUJ21uwdGP1mDYQc8kcNjx7HhHfNCMgxkQeOo3Ts10O/Qp0jj80Wyix8n/xdkFsjsUI5PcJvLs40tXumbP+3c0WsF3x+MLJj75QsdRJdqF8fT4gpqWekKEzuoV9gAuHm4CF07maOkpcwllhoczqFj1YxZS6IhVno0htQfD7uTY6MbYhAnEw63Pb5TZwV44t5FWn1oJO260DvQ0/gFA1z97gTyxbs7ZmfcPGzUpdvjC3duf7HyupbQys/75Czhn+DeAHWcjPMqFW+DuzM6PTZpPSm8ZYmuhZuYEcTXQ/KWNtkE6vrEFxSWXHRnRgu7IFohALk2H44zCbBmb48LZPvwuOxO+y7bTQWStHGzWoy8Xh1LC4qj52XCV6sJzt2XVkxxbLtWMsR8DGMjJ5U0dN9F4AX36ItY9g+JNup5z5/xb02ZqoQrxrnonUuhrG71dX9uG60tpVMCt5cItkUIev04hNSlLp4+vBaNPWi19WgWUlpQ++Yw+LfPpjDukTz6dd4n08cu0psNPaef3wXf++AR/GpDMzY/RJ8UPq++KUyX1r6nSFGM0PJjjTfLE2rlnKyifCFoUCVOXKndv21OfZ3S++T+wk1BDAHjaY2BkYGBgYmBIEWk/GM9v85VBnoMBBC7/ULgHo//P+CfILs9eCORygNQyMAAAUb0MagB42mNgZGDgKP67loGBvfL/jP9r2OUZgCIo4BUAmmQG+njabZJNSFRRHMXPvff/3hToIghsUzZBRWAwRWgLp4kSzNIgNCrNYGwmcRxJU/xo1KKCIhRR0CyNES37IKKEaBbVIgQ/+ti4iKBVGCFqRZt2Tee9MgbxwY/zv/e+e+975/z1AvLAR/0EllS9x01diC65h6NyFvXWHGpkAVF1Ek26Ex16AF4Txnq5gkPqGnL1QexQc+g227GB7zeTMVJFKsh+cp9cIkUkQsLqMS6oLuRKBudq0Cub0WqGUeI5jDZJ8pyvSFg7cdnyIyGd5CLHzei2HiChvZiRSuRbaZzPQcJe4NpjEuHeRVdbrLV4Ji9xXCawy9qHYfmOTE8W/PIFOTKNdTKFUjWPEbMVPipMCYpMA5QuQKUUIMRvHJBMnJJziMomlOpRBKSWdQiD6g161Uyy38y79UNPBvokjEGJodTd14iofspxOsK6Bxlc6zcfscVehYCZhc+8w0bqMX0HeWocY9TV1nl0u96Po0PK0CQ9KLem6PsEstQLxOUDzpg6dNlhVJvruG3uIiblaHW8tyNciyBibGbmR4meRSHJ13vRKg0Y5n3F6hdGeH4F59vNLVw1Q8z1LertNITsbDSaR/TK8X0FPAVY42Th5pACc0gn09qb/E0WrTJ4l3JYjvj4P07NLFJxs3iF5/IEN1zfV8AeZx86WTCHVNRk8rOaRJw6Q16zX3v/57CcDhygFyecLFJxspB2xB31tCDqCfEefpOpxZCJ0dME4Kljf/xTHWNGn4j/L/hGbaNWcY1ZLGFlI25noV1FUUH2qCC26RBO6yrk6SOs+9BjeTHq7NVB9ksQQedc9k+x/EC17GZdCB97IWDHEUDgD71n29QAAHjaY2Bg0IHDLIYljD1MUky7mH2Yy5iXMV9h0WHJY+ljWcNyheUNqw1rAusBNhe2PnYO9jz2SRxCHBUcWzi+cApwGnH6ce7jquFaxy3BXca9g/sLjxbPDJ4LPO94tXjjeFt4T/Gx8EXxzeNn4Y/jvyDAIGAjkCLwQVBJMEiwQXCN4CHBT0ICQlpCPkJnhJWE64QviRiJNIl8EjUTLRLdI/pJjE+sQmyfOI94ivgu8Q8ScRIrJF5J8kkukLwkxSZlItUitUjqg7QTENZIf5HJk3kjGyBbJicnlyIvIN8iv0z+nPwbhXUKFxQlFFMUDyg5KMUprVC6o8ygbKQcpbxA+YiKgcoW1SbVH2pGajlqa9RV1KdocGjkafzStNFs0DylZaOVotWjtUebT7tI+42Ol84KXR7deXoGekF6p/T59EP0FxhIGAQYLDBUMFxhZGZ0yrjDxMeUx/SIWZDZLnMV8ykWJhYxFi0WWyw5LLuseKySrHZZS1gvstGwSbN5YKtjW2F7zi7ArsfukX2I/QWHDIdzDj8c7XBAH8coxwzHBscZjrsc7zj+cbJwKnJa5XTLWQsI/ZxLgPCTS5hLncsTVyfXK25xAIzfjSsAAAAAAQAAAOsARgAFAAAAAAACAAEAAgAWAAABAAFdAAAAAHjadVFJTgJBFH3d4IAi0YQY46pXxgU0OEYxMRLiGOICiG6MCUMzKIPSgHHv2gMYD+AJPIELhxN4BVeuXPuquhgDqfyq93/9//4EwI8/uKC5PQAuKQ7WsEDNwTp8aCnsov1BYTeW8azwGAJ4U3icPr8KT2BPm1TYA692pPA0/FpKYS+WtKLCM7jQHhX2IaX9KDwLr76r8Bym9BOF3zGvt3k+ENavFP6ET39S+Iv4xcHfLizqr4ihhhvco44SCiiiAQOrCGOFx8Ahf2u0l2FRO0YVWZhEUVrKfBOdKFtqFl+LXC3eOXomGJ2hNCgG4h1v4VlAkxxpeo/2Gm43BuLPZE6b/zVWKOo32YHTwwZlp9PTeh9ncGSukuwnTWmQOc1eLFRkrmvaasgPzMbs0/p/ssQVzrkoZ2yTsUSmquxC5BS1i/mJ2kU9WVqqco45+jSJc9JH1FKUe4hyY2n6OVp/TICW4fMQXTYYGUGI504ekzxdLpP+ddYdYuW9nDYtcW4/hn2cIsk7qDh7p9ad5TljMpyRyC62tSJ9D2T/BuMt5jR4tilh7iRCjy3ea7zbm9qUXedZm9iyqNvpyaJuk6vNncQtLSX+1flX/gctfJBzAAAAeNpt0DdsU3EQx/HvJY6dOL33Qu/w3rOdQreTPHrvnUAS2yEkwcFAaAHRq0BIbCDaAoheBQIGQPQmioCBmS4GYAUn/rNxy0f3k+50OiJorz91VPO/+gISIZFiIRILUVixEU0MdmKJI54EEkkimRRSSSOdDDLJIpsccskjnwIKKaIDHelEZ7rQlW50pwc96UVv+tCXfmjoGDhw4qKYEkopoz8DGMggBjOEobjxUE4FlZgMYzgjGMkoRjOGsYxjPBOYyCQmM4WpTGM6M5jJLGYzh7nMYz5VEsVRNrKJG+znI5vZzQ4OcJxjYmU779nAPrFJNLskhq3c5oPYOcgJfvGT3xzhFA+4x2kWsJA9oV89oob7POQZj3nCUz5Ry0ue84IzePnBXt7witf4Qh/8xjbq8LOIxdTTwCEaWUITAZoJspRlLOczK1hJC6tYw2qucphW1rKO9XzlO9c4yzmu85Z3EitxEi8JkihJkiwpkippki4ZkilZnOcCl7nCHS5yibts4aRkc5NbkiO57JQ8yZcCKZQiq7e+pcmn24INfk3TKpRGWLemVLlH5R6H0qUsa9MIDSp1paF0KJ1Kl7JYWaIsVf7b5w6rq726bq/1e4OBmuqqZl84MsywLtNSGQw0tjcus7xN0xO+I6ShdCidfwEvVqEbAAB42kXOvW7CMBDAcZ8dQghQvvIBSEhh6WKpEjNrw8JSdYqlziy0K2u7dCzPculUwcvwFKxwlyb25t/f55P/4PaN8CO2GLwUJcDRlBtfF0scmi1Gr3T4Mgv09VshUGU5Kv2MQZafhFJXIXXlNjsAa5/dho/GrSz/9c81PELL1OhUm7xVMxmyO3LRuMsO4b1xj90Fe9+nZb19jQdCf/4PwEH92YifDDxBT0q1OVCZcInkkytjLhPYuTLiMgbpypC2j46WcbX28+YGEi6xt3Ql5ZLAwZUpLUkvljPi9NFyzvMzubbzBiN9B2+6bK8AAAABV9JwXgAA) format('woff'); -} -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - src: url(data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAAGasABMAAAAAu5QAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAABqAAAABwAAAAcZSXcQUdERUYAAAHEAAAALQAAADIDBAHsR1BPUwAAAfQAAAhmAAAWrt3KwUFHU1VCAAAKXAAAARQAAAIukaBWGk9TLzIAAAtwAAAAVQAAAGCgmqz0Y21hcAAAC8gAAAGPAAAB6gODigBjdnQgAAANWAAAAD4AAAA+EyEM4GZwZ20AAA2YAAABsQAAAmVTtC+nZ2FzcAAAD0wAAAAIAAAACAAAABBnbHlmAAAPVAAATkcAAI7AeGFB72hlYWQAAF2cAAAAMwAAADYON5slaGhlYQAAXdAAAAAgAAAAJA+JBe5obXR4AABd8AAAAngAAAOqrdxP+2xvY2EAAGBoAAABywAAAdhAGGKAbWF4cAAAYjQAAAAgAAAAIAIIAa9uYW1lAABiVAAAAbQAAAN2LM6FunBvc3QAAGQIAAAB8gAAAu/ZWLW+cHJlcAAAZfwAAACoAAAA+65c0vh3ZWJmAABmpAAAAAYAAAAGd8RX0gAAAAEAAAAAzD2izwAAAADE8BEuAAAAANP4KEN42mNgZGBg4ANiLQYQYGJgYWBkqALiaiBkZqhheAZkP2d4BZYByTMAAF4+BPEAAAB42p2Ye3BV1RXGv3OTm4Qk3OTmRQIk2iICFpACQgBJRwc0IThoAxHB2KFq21HL0LTj1LZjnTGEgBQsFKs2lshD0SR34ti8Rh7h1Vb7QvowEWOGkmJITmpqhelfWf32uiG5nOwI4a757XPufu9vr733OQcOgHg8iCcRveSu5Ssx/uGnSp/A1G+XPvo45j2x7gfrsQTRzAMR+HhxRvHP9/CG729A4PFHS9cjTWOgIVMQg4D+d5ChuaOxOurAGDfhEcbEw4+bkM/4eMTRgMnIY/y3aBPwHdpEPIsKZGMLXsIkVKIKc3CclouTtAXopC2E4zulPcpDOW0rdjBfCL/BYecZpxwhZ6vzglPnnHY6nUu+Wb55vttJ2Lb5Kn2VzD9kVSwXttCQsdw8i7Gscwnlvj3aroO1SGCYKjciCpPkOFbLp1grHfw3Vs7jDvkc6xjjYDPjfFgm/2ZqN2YhWTKQQiZLMWb2/4+jS8NS+Rh3Sw/ySQEpJEVkFSlmbQ+w5BrpQgl5luXKyEZSTjaRCrKXdewj+8lr5HVygLzJOqpJDaklIVJPGkgjaSLN5CDbOEQOkyOkhW0dIyeY9iH72046CEcuRzXcx3Gt5oxvlt2c+Vz5OxZKJxaJi8XSjipyksQhWlo5inqW+B3W9zfhaZnKMvfgDdmGd+RVzuZYanAHgsz1T6xDqsYkMSaRMT2MCdDimWbyBeQvTEmhot1MbaXu3VpmvYRY859YcxVrPsqaW/Cx/FV7+i+GbVLH0jFI5rwlD7SYQtW7qHoXVe+i6l1UvEtre5PXalJDaklIlehCK8u2kTPkIxKFZezpasymPwTZyjLWnIDluBEryL2kSJ7B/fK8+ks97xtII2kizcShJ8cwLZXrYQqmYhpuwa30kzmYi9voHQuxCIuZp4B1L8d9+DqKUIw1KOFqKcNG+uImrpoteI5r4WfYhp3YhRfwS7zIVVSFatSgVtdHPRrQiCY0owXHuJ5aOY4zHIMTM1vXUywykYO5UZeiN0SXR1exX7lU18/209iDFPYhg/VlsGQG+tSLvaRYMF7uxXi9F7MKvJhV4cWsEi/5FgosFFoosrDKglmFXsyq9GJWqZcSC2YVeymzsNFCuYVNFiosmF3Cyz4L+y28ZuF1CwcsmF3IS7WFGgu1FkIW6i00WGi00GSh2YLZJb0csnDYwhELZpf1csyC2YW9mF3ZS7uFDgs5ul97Mfu3F7OfezH7u5cqCyct+NlSHWvuZalTzHWKsae4A87kCbmAVJJXyK/JbvKI7tleEiyYPd2L2eO9mD3fS76FAguFFlZZMGeIF3OmeKm2UGOh1kLIwgkL5szy0mbhjIWPLDg8K6J5Nt/C82kevsZzyXEe0zPET8Xv5HNnKc+iBOrqUkeXurnUyaUuLsfscowux+RyDC777LKPLue0iGE9aSCNpIk0Ez/PljKeJWX07zL6cxn9t0z9xaW/uPQXl/7i0l9c+ouL+Xr6ellh4V4L5rT2Yk5vL+Y092JOdy8NFhotNFlotuBQjxV83liLb3DOfPF6dsduievEl/jkDATlz7Kdal2UT6VCPpd35KdyEYnyhuyRdzGqH5+aTNhlysl/vyBjUPMGI0qeG7h2cv8AV1xwhBbOjtBmN/cic+3h3cty4Zp6e+6ax3U+4r6XQRqf04fn6h0W8wdpkp/I0zomyCt87kuWV+UEV0SyxrxFbjYp8rZkyk7pk+2yVZgmO6RUEiVJDmm+JZzDWCmUcq6jWI3JA/p/ZFLksf5vyhx5X6bLlIiWWweu7ohjsqRIq+y9rPGArhfsakjLlSnyYw2PyHv9dbx+r79X/sbrfRKex9QRe/EuNYG0Dfwb5jPypJztPyjnh1Lom5Dca5iz7i9IuzjUmpwO+11Eaj25gZgRnBnKo2vlrLzP8JOwrw2GAYtCp216yzm+a1An+ndQ2vh+kkIz8Xv4DjhDFbwgf+Q89Emj/Nbktfh/INLTjN/LxnAKPcvEdHjWxvmI3kb66NiBXD3DWnnPzDx3Ap1j9cGUgaRwb/fT+74bTpHN8jLDn18er/xnsJZDuM5feH5Gl18+u3JND/UjIt+wuAi/+uy6e/viKPOzF9Kndz8cjOuz5Ouxlv5AL0m28TF11xVjGsqTMniXbN8T1Id6vfvH1feMq6WMPL6rpYTHI8eHxVUMXE9ebpknWN2wXMXX63HSYsL+8B7xe6mVT8xMXO7n8DNR2gf3r6dG4dU+LOAzSQzP4ARatp4JObof5OBmmsN3+yk8q6fSoviOP41nwHTMYLmZtES+8d+KMXzrn4V4fBWzGT+HFoW5tAS+Deey7gW0RL6PL+RaX0RLxu20AN/MF3PfzaMFsZSWirto6bibloYCWgafgZZjnH49GIciWiZW0tJRTBuPNbQsPrc9iAkooWXhIdpEbKFF4zlsY2+3Ywd7tZMWhV/QfNiFl3hfid3sVRUtCXtxwDzn0tJQjRDbNd/WxqEezWyxhZaFo7R0HKNl6Xe9JP0SkY0PaTn6RSIb7bQcdNBy2M58VTZWlY1VZVPNjst6jb7mu8lk/jP6+vEVml81nagK+vmMehvD+bQs1TFedYyJ0HGM6piiOgZUxzTVcTz1K2BfC2npql2mahen2mViFS0d99Mm4AFaguroUx0zVEef6piIDbRx+nUzqJr6VTs/fkXzq4IxqmBAFRxP/UKs2WiXqdrF4SCOsH6joE+18+mXUT9O0NJVxwD+gQ/YilEzVtVMVTVjVc1UVTOV5TJVTaiajqrpUx2jqOI0zvZ0etwY6pTHuKVUIEs9aKJ6UDZVWMk5MV7zZR3tJI71IdykY5uiX25n6JfbxTqSO3Uk+RxHM+7R705F2tdi9rKdupk+lfwfctf45gAAeNpjYGRgYOBiWMLwjIHFxc0nhEEqubIoh0ErvSg1m8EqJ7Ekj8GLgQWohuH/fwZmIMUI5BHiazCwOUa5KjCYOQeFAElffx8g6ecYBiSD/H2BZEhokAKDE1gPC1gPE4hGMgEhwwykWZOTcwsYFNKKEpMZ1HIy0xMZ9MCkWV5pbhGDDVgdCDCBVYNokIkMcJKVgY2Bj0EB6C4DBgsGByCPAYitGIIYshgaGKYxrIHatQFKHwCrYGS4ADaXkeEJlP4EdR8fEIuAWYwMvmA5THE/NHEhqCupIwriMTJwgMPqOdCXvmA7vVDEXwDFA6DizEBSAmwOAzR8RBhkoWYxMfAA5WsYShnKwOEtyiDGII5dFAAUVDZ0eNpjYGYRZpzAwMrAwjqL1ZiBgVEeQjNfZEhjYmBgAGEIeMDA9T+AQbEeyFQE8d39/d0ZHBiYfrOwMfwD8jmKmYIVGBjng+RYrFg3ACkFBiYATwsM0QAAAHjaY2BgYGaAYBkGRgYQeALkMYL5LAwngLQegwKQxQdkMTHwMtQx/GcMZqxgOsZ0R4FLQURBSkFOQUlBTUFfwUohXmGNopLqn98s//+DTQKpV2BYwBgEVc+gIKAgoSADVW8JV88IVM/IwPj/6/8n/w//L/zv+4/h7+sHJx4cfnDgwf4Hex7sfLDxwYoHLQ8s7h++9Yr1GdSdJABGNiAGexJIM4FdhqaAgYGFlY2dg5OLm4eXj19AUEhYRFRMXEJSSlpGVk5eQVFJWUVVTV1DU0tbR1dP38DQyNjE1MzcwtLK2sbWzt7B0cnZxdXN3cPTy9vH188/IDAoOCQ0LDwiMio6JjYuPiExiaG9o6tnysz5SxYvXb5sxao1q9eu27B+46Yt27Zu37lj7559+xmKU9Oy7lUuKsx5Wp7N0DmboYSBIaMC7LrcWoaVu5tS8kHsvLr7yc1tMw4fuXb99p0bN3cxHDrK8OTho+cvGKpu3WVo7W3p654wcVL/tOkMU+fOm8Nw7HgRUFM1EAMANK6KqQAAAAQ6BbAAnQCDAI8AlwChAKUAswDUAMAAqgCuALkAwADGANsAjACSALsAmgCVAHcAfgCwAKMAhgCnAEQFEQAAeNpdUbtOW0EQ3Q0PA4HE2CA52hSzmZDGe6EFCcTVjWJkO4XlCGk3cpGLcQEfQIFEDdqvGaChpEibBiEXSHxCPiESM2uIojQ7O7NzzpkzS8qRqnfpa89T5ySQwt0GzTb9Tki1swD3pOvrjYy0gwdabGb0ynX7/gsGm9GUO2oA5T1vKQ8ZTTuBWrSn/tH8Cob7/B/zOxi0NNP01DoJ6SEE5ptxS4PvGc26yw/6gtXhYjAwpJim4i4/plL+tzTnasuwtZHRvIMzEfnJNEBTa20Emv7UIdXzcRRLkMumsTaYmLL+JBPBhcl0VVO1zPjawV2ys+hggyrNgQfYw1Z5DB4ODyYU0rckyiwNEfZiq8QIEZMcCjnl3Mn+pED5SBLGvElKO+OGtQbGkdfAoDZPs/88m01tbx3C+FkcwXe/GUs6+MiG2hgRYjtiKYAJREJGVfmGGs+9LAbkUvvPQJSA5fGPf50ItO7YRDyXtXUOMVYIen7b3PLLirtWuc6LQndvqmqo0inN+17OvscDnh4Lw0FjwZvP+/5Kgfo8LK40aA4EQ3o3ev+iteqIq7wXPrIn07+xWgAAAAABAAH//wAPeNq9fQdgFNXW8Nwp23ezszU92WwKIZDAbkJYpIkdGxYERQQEUQSkqXQLvQrSRaqNYmFmsyAJlqBgwfYQH08RUSxPo6hPfT4FssN/zr2zm00I6vu/7//fM8nsJMzcU+7p51yO5y7kOH6Y1JcTOCNXrhKuomvUKOZ8H1IN0tGuUYGHS04V8LaEt6NGQ25j1yjB+2E5IBcF5MCFfL5WSNZod0h9Tz19ofgOB4/kNp35lUyVFM7E2bhLuKiR48pUwdIQNfNcGVHsFQp3WDGHVEluwK8am8SZylSrrUF1EPwpu2oEg5Ev9Ec41SzILsUa6dCxurJTyOcxFBS7w0JwU/Wozp1HVRtfcWwZ2L5bt5vOO0964PR39N3zRBcfNHCcyJm5XpzCVShSOEYsnFksUwwholgqFHI4Jti4LLEsJto4J9wXnKqBlMVM7KaZ3lStpIzr0DGLhL1C2A3f5pFFuRvhS3SRH+Zpa+k3eN9EeNUhgDWLyyPDuWgmwBr1+jLC4XDUCOBGTVYbXMc4kmm0l9XwcnZOoT+scmJDjcefnlXoD8Ukkf5KcObm4a8kqaHGYLbY4VdEya9QMg/HMujClAyn6oNleukneImlrKan120uqzF5faaymJH9lbFCByRqNOFfGEVzmeJ1IjwxG/2FGiBlSqfMuu4Hf9nLecssdd3f+mUjXiiZzho+0+iGxdDvBvwOr60xZ5jgwuessfisbnxajd1rgz9w0u8y/e7B7/g3fvo38K/S6b+CZ2YlnpOdeE4O/k1NbuIv8/C+0NPJCwi5U0bUZOfk5pW3+J/SMxNo4q4KuAPwFRbwK+wN0q+gOwBf1fCricR8kaaRnGuXXEtM1y699u2vLzp+us/SPtrvfZb02UZMF2m/k7Xzya0LySZtMH4t1DbM14aTtfgF94GPCHfXmQ6ibFjHlXEbuGgpUFUpDqui0BAtFRGrpW3MZVEnEFhxh9VMuO3MxNtO2Qwc3q5CsR9WcxwNCpd/WFYJXOQ4VScQwM1o1AZux0rYtdupGoEe/pAahL/zhdT2sAna5FC2V0ucsitqETMjkYhqdMO9fNgTmSLsEM7uC8IOAWyEPb5wqFNVZXFJOamq7FRdFfbmEm+wsjhYYPB6fCJ88BiM3mBVObmrdtmcmasefOTvr768ZeXWPbvnjJ9432zS8elr3np+Rd0h8uzCVfeNvvm+8PkHNz/xvufjo/4T7yx+aupdwycPnbjhzm3vul9+Wf6a4yRuxJnvpJnSfs7OZXK5XFuuM7eG4UgtFxuiImBFTRcbYlXBUtFeplbBpWyll7LYQJQI7v+Yg0HvcKqe5NZTTE41Dz6VsU9lTrUjfCpmTNsF0OJxAORWMSsXIFc7lsmundkFwTalOVRUVJXLLjUrFzCVLsNVdk4EsQMYCYd8OcRjCBYUV1NUdSOVxYAaN/GTIvh1Pv1tfsovEXEjtsyc/eSWB2dsX9C/9yX9blhxw1D+9RHxCBmzhRi2btEa8f6lN/S77JIbxWsvnrn96XmXzNqyZdZVt93a97Krhg+/tjFbHN/r9EM7Lp25bevCS2Zu2zL76tuG9u199bCh1wN7gcS97cwJ8RdpH+CvhAtz87loOkqObERigYGJSrWjAdBViehS8xwgFfJQTrYBLslzquWADputQbE5VTdiBqRnFTJOHjCJEFHK5Zg5u6DICZhRbC6lMKK4ZVXOiEQUj0v1pUcAXwXp8KcZEaWjvJMz2HxFbRk7AQdRPgKsAd+kEdKpKuwx+oMlDhIsKKRIqiZGg9vjr+4Of4fIuu2eJ4f02rd11b4bx4wkF164Zerfjg3p/frtf9e02kdmL5+irQ9smXjvvReGhl1x7WAyd4Ryz71LL3nqhR2z+6+89mpt+oyNZ7aenNDros9r731oLNmWPpUfNHjpdR36db/gxjEc3Yu3iwEuTmV6OUp0XZwTRaKynGdiu5lIR3mekN63k5VeMUA+HaMthWfN1tryKw0jOZlzc0RxUeSaHQ2IRBQtlZmk2m/gBaPT7fMbi0v42ZP/9WDxsj1msrjvPcWzJ5/gr/6cbCLXXzxlrFapfdFXu0/7cvvgcb2fI9eztRbD86tTny8cVu1Nz+/kAo60kJJqXyZsSwsxFq/dw/dff2vJrB8n3vPTLO3Re8lPpCL/fTKC5PYZd5m2XRv23afa7dpTl8Gzs/khQl/QNQ4uyIF6RmWaVqHwh2MS2yIgYVSJp5ID31UtCWGhyC+5jVZS4s4uJ+XmRyyktFx757VpdbHpb4odV48l/bXH71ozQPvpFpKvfT2AeBCGq7hlYqW4i7Ny11INagyrxNygSKEoR1DKcRYQfoTDSyKgwLNVKJbDCh9CTCpiKGq24O/MRvgzixkvgWBlqp2hoCogg/XgDchB+Sqyqo6s0u6s42/ZQbZp/XZoleRthscc7Rip5D4GG6KIU0wVMUGnuRkBViXAqCUBrQmh9VPBB4Iu5xZx59DLj8xcuOXh2w50o88q4vN4O78Ldl0BwqMSQwN+EUWsUDmQMIKMz1alxPq8ReQbPm/1avy3S8GWuZc7CNZEKRc1JSyZxAW1J4CDdFNGNxqoreJFY2VpZPx5542PDOnQs2eH8u7d4XmuMzMFJ9BQAA4BUwppCKtgr/aTMHHxgzfEN083tD95iNozE0BOWEBO2MHC6MJFrfhi2ZCQsghENl2BAzDPhKlqAuTk6NJStYoRygxVTlc45HJ7nXywgHdTUVct091rnHDs+++OCcdONHy2c/7C+bOFWUsemsHz1/9GziedtUPaa//S9mj7SBWpOHH8gy9JxXf/OHyM0Wg7LPAj6XnOwHXnohLKLx5WVcNJvAnAMoLpdVgVHQ1gPSIPSAR4wATrEiUgGg8SiOfgwkCldFEY2GE778qpEy/d+vqpy8SD8PyBsOXDALufG8lFbQi5GSBHxlc9cOER8LEeDjkwnSLBD0jwO1UZXmKA9xpk/AODFdhQNuClbIMlZMBvZT+gRjCjGDSDvanYQS7KqkGmKqOykMo+MwEmrSIJIecdSISP3jqh/aBN4T9uvJj8PrbvggkLHhGFN3//u/oP7R/ajatn8x3u39h3/LL1ixh+bjlzQjgJ6y/mZnLRIly/iJQrwqWAfVoWzUBQXHDPlYH3XD4z2GjWogxQlTYkbQk1lcEmQBPCG1IItRXUAvjkRMsiGyjdhuDGB1UoWjPyCouoKrSChaAUgOSXlbyI4nIp2c0NhWBVGMByIlTBhKQ3op0g5hfeUrfqvjkPrVu+cOHMVWcmLamNv/rut1PvnDTzDKcN186QByYsWDTz/nn8an7OeMLNH/fsV0deGRRtV6zcv++fx4Bfq4BmfYC/LSCl+nNRc4IrYpzVzNvLFBGMX0MDNcVBdpkPK7YQMqwihKImKipMBkCMmZquZpQaINQAIOQUElF4GUiF/ELCMhh9wDPghBir+EX7Dxyo084j+33k2tHCT42R1dpz5NrV/IE2SIe1sIfaw5pyuBVcNCtJh6wkHdIoHUwNMa8lKw2Q7zUB8nMpSxF7QwLt6YDtPGY691j3+y/UYk4rdyiOekl12U86FHc9pzrc5eWkxpHmcusGK4F/C0ac3ZsFRpySLqtOGdnOAiRS7emU4cK5hBEmWJAGkhrYTgCiuLwe2KvFa3fIS+99cPnGWZMv6riiN/9tvKbdyHmvf/vLkb3/JvdPv195dJla1aaYP/y0NqGHdvKz41r8MMqNWQBztqRyHi6AdHBxTFwwuWEUGmK2XBeaZDYBQC2goHqBDJYQ+gpZAG0aQBuEn1leWL1kc0Vw1bloM6RRxrJQOji5IqCDQTQmF8xVJ9gMZcss0o9cFyj48AznmfD6S1/8+u5BrbHuscnTlzw8adCmPL7tJWQZ2SatF38/Pkv79wfHtZ/J+d/Eju5euap2/A10D10J/FQEtDOA7GYyBoUm8hBKGJQnHHiu1OhhspsEyZXCh/EnX+FvlNLX3HFqt5SO9tZYwIeDypIA2PQTuagXMZKVMLVKDQ2xooDXDBgpwke3oxjJAIwYcKPhjgP3Kxfw4YLLErxnAwShrV5SILt2mQVvVn4gje6+QBaQ1sUBtYtkVUiDn6Uu2M+Rs60ruufQMHUlcFYgeHyhThR3Yx8cP2Tsib3130+4dfzsM397P167fOaMFY+eumf2sdkL7hw9l8y/96WOHbaP2v3hh7tHb+/Q8YWJL352nHT9/aElU6esJUvHzJ9/bNFcqkOGnTkj/E5hL+Ru1CWpXdB5oQB4wZNlQ17wIORFFHLgdSWdAqzIdIOqxQAqkh/sb5uHwpnlAbTLEaVAVjgKW3dgY5fsdXISFTDVaDGWE8YP1Ywhho15e96HJzVFe7aw5Kv/WLtsHnzfnuG7lkwauL5ww+QpK4S3l307TXtRa+ik9dMmS+vEr09ddP2048tW7h1/fe9dX+7hKDxzQCePFi8EnezmIila2U5wG6NW9lDBaaExBiWNhRq8aC9wuOtkqhKbtLQ7eTWH6WvSXG0LmxP6m+dKwS7pC+82cS7UejZ8pYyvdCcME0Vy1lRIDgdoK3i5uUJ1wMs9urESM1ltThnRl2KyCMn3l1LjJchen7BhxP8kXg/74VLuVWGK2Bv2A9gPPOHKktuAikUvkbyXCqH4Q/x4vvsyMmWfpsX3Ic7WkCXCEeE9GuvJZFaQsYGaHkZYvKlCNSetHwJfa4RejS8JvciSTZvIxs2bmT6bw+0TjoqXs3eLzd9dXWUGE8E7h18ZHyncsK+eGIjwkjZnGb778jO/CvcC/6XD3ruHi+YjvbItuib3GhuiXqrJvVSTF6Tynw34LyOkWoH/cgGZVqfqYrqdiiYMFcWENG92HvqDrlygrdkJ280go02oerPhhsFK9x2yJqA4jYDG6056EF0+ed2JsNLl/Be7Xjz02OjLavnQlTOvv2vE8Gk3siiTOOCx199Sd2wfdc2aiQuunzto9IiJowY08izuRPnxXu08wwFpNei+Xtz7zEZTnGE1B5xhaq9FpAYlVKGWiQ1KzwrVDz+CFaqIvvAF1BfWIwElTjWf+cLowVyoa5rdpyTUNA6lq1PpXq9muU8qmfXwoaZb1+7usih8z1+QvyBoAGMvwsUys7p2605jJSTlmqqhEuR90gbwky8/bxVdwbKKUDX6hyZAWwCle1kINnRFRLHKSnlE7RmhhhEgL5OARSS6BAOId+oGFld3cqEI8wsG3NouLlAg8kaDS8RPfuoo8kUG3PY9iBvxfK/tGJn240ky7Dmb7cOde6o6Lez90DJ32uSXR1zzQJ9K9/JxiwxurVaLvqm9EbPalpKSgzft7FrU/Z0Rp7Q1Nfwtjmv6dx1TSMo797znEXKMuMnzP36m3aR99bP2zda+133zzpNEWFHWI374689iZDZZ87o27z+/a8v3tgtOKAkdJ1uOPbRm+CAz+S3nByY/wMuWckCnGMFKacdFOaSXEKaKJWYwcQREoQHVorUCGRD0iwkwgfouDAZ6UAgI7oCQzbfbyrffvzC+Yf6r5MffJeVUHzJNm8Vn8tuofw/fxXnUV/NxedxQ9hY1DaQu1V95IHX9PvoqP74qn3J9mhXs15CSxnx6K3zKQk0jWRswZqdmpTFvR/WlUSdP8SOjK3kuRcLFyYFUpVIUAIXiLIXNzJRxYBs5+v2Pdw+7d772jfY66TbnUe1zrZ4U3Ld60RLtS0nZVz98fVmg9oF9n61fOIUY1943atJo2PMTQW9+CHs3m7uBRTdVN8DgptEutx9sJwnBASsiapPwns2MmziHguMEAJw0aInhXj98MoWoDvU5gRWlTN0zqXQBe3H+YDnwDZ9DPC7korBBDOZzEx8mlh3fkHT/3owtq3YffC266ensvVna8R80TXuTX7HoLVL5pBb/6rl12r9OL/5e++bh2NenyXikMeL/NcC/lfNynXXs2xLY9yLKfXSNNiuNoaDrbAQ0+9GatiVcaESp6PKDXSMaS1C3VVXyJcFt5NGXSOFGslH7aN+hA8d+azj8maRs1Q68OfBd7cBT/Hpwos/0/Z24eZSZuI6L6Tou0VdhTqxCBB6QGLtJuCAbC0ZYmQtN3WszuNegxpgvrTvQzHlmX9uE5fH2/MT4fP4TSdmgtVsfb1zPZDW+twLea+Z6svc2vdMk0XeahKT7etY79RdaW7xwmzAn3oUfGl+PL3Osj09n75oCPHIUeCSPG8GxEJacsC4scGGh7p/FBM6Nz5+NhoavieUd1oTfisyRAZ+MoaiHukMecIco31NHVsxGEeWTadCKmZ5AHH+QDxTwgpcxjRyoCsjAOCB+psBW9X1JfHn1nbRje18nn7086rEqbQfv7K39pkS1E6v5ZfeTy8idDYdJQPtJOzPxV+3TDhFyybr4t3eO2EIqdRxKJkq7HrqUMDIpgTkFwUKxKDRRDvcrH0IlBSoR8EkZKkEzTJigjwtIrOeP7d0bL5AU1NKn+vCb44MYHp+HbxNpbCCQQjMMEODjBXgafknJJz5fj2KH/dsq8DXfhn+bhmu1c4zUUdGe9HFM9FFO5tRYk06NBZ6I/jI6KSDtuaSfWA0voLZpVf38GROXk72nD370M1k2fdGquaLl9MmDJ44l+EySKI46tMCRGG6OGIoKaqtTz5uBQMJmMNiNiJS538Rf5e/8Z7wxCpjpwP8tPr3xEP9kreZJ8nM2vEdKSGzEvI4fQwI/UYFysCCZEaAk4r3b9vLw0FPfN+0Nw7VUNvfTn2WwhFNWnZbgTNVmp9yJiDIAEAanarZTm47KC4xG86LFSq1hBCwqmG0RHTQzQXK7ATq3vO13cpQcPVnv0gqWa0G3pJy+WXwCKF/NDzt9m7gmvjH+Ziq/mbmLdVwaUlbVtFXNTlVgK8Idqpo5Gk9RBFkxRhIYNunLIMh1RAYMfPry3ngQXv2IePupPuKtpzcw2+XMCckMe1eG3duFizo43SSjYj3blNynLnivy6mm6yyD2zLdBS9ySKlSXHSB/ObpBqzGLemqrqIBJ+O9y4j1mR3EunSp9rvyjPaf5S8eqq17W/jbnl0HBX7diPdJr6e3aS///ebD2t6t20jk49PacZIWH0UE4tW++48uz+tpXMENVlaKRAN1FDNb6V40CwnTH9eoWEOKxammoeVtpeY/p7qtcpOyFL0eMRjIIExBlgS28Rk/kjTtt9+0beTGtU88sURbJyn/fvODr+Kv8f94eP6MdQKsY/QZi2QAfHnBH71K96szEvjKQ3wF6QJ8sAAf86RxLY6QWoga3AcsIzlddrS7LDK40pya4UrYWak4NErGIoOOx/wkGkcjGhVA45zJRJypvXNpH8TlSwfJ3W8L77y0M4nL7drevw88pL13w9uT/+1CfJ7SPqP4JMTP8LkV8Pkm3QN+bojObRbGbWiRxOxpFKV2RGl6UlKnhXA7uHWUYiTNjbLZBtymSDIqTdWO3GiOKGnUNvE3Q7fBSLxBkoLyreTz/xDz8pnkhne1fdp2UrJk2+Y12hFJ+ezwvAOh+Cobf2W8hv92xbS5Swnbu31A14ynMbXRXDSYlHPB5rEcgCDqT8N7fjfaIyUViu2wmmlNZOTgIpPl3TwhNR8+uUM0kGbMBI9CtKTlBOme9mOQxpYfaYqe6Vk2INNZOTbk+uI+e199fM1jq/b/dpy4j6767sG9Wx95aONqMvKdodqJr1dpjYvJU7MemXb4nsgl76155vjdb0+etXr6mBunDp/6xBj17xPeYDB2BNqspvYp7EhDU8xDwDAZOmuK4TASICrRqKYECjtqoNaXASNmTZ4cxtg7isO1di9Lrg0bTv0guejzFwEOt8PzXVw1F3VS+afLUmAB6skycYqJcTPmmazMgaXJeCfd7qgcaMgCLgxcGingFr303ObHn91LtDNHwz9qX5K/CZ81Fm/Y8dwG4ePGgne1U04eXkDQ9hbjNJ4T0GHjeGp+N4VzOAOVZ4hzMxrc2QfJBrLp/fiXsObTV4sqqDzCdQMZ/j3CQAxsF0Ztdhmz7vi4GAHMgFhOAqMrPAuzqqm1Ab7V3sd/Wk+jeJxTcdU74C8Uvr6u2/IfFuFdSZHKHYpYrzq9JyVFrq975ZoffqJ/bof7afWqCe8b6uu63/nTP5iLZnEqZhBSVqdigz+v/PFmuG0FrVFjNGDiO81Z40izg9MGH5uctijcQ9/teTAyTWZHmjOR7SY9HbwoGeCmzQ63ZddZyXACyHIlYl9ht78a0OWvdgPOSImRBLvV/zO7lOQ/RjLa5H2+V9u4Q/vA79fe3CEpjVn1zwq/N5qUfcKXoAyKxow5/THjvQjQ512qz4t1qWAK0wAu2Dyoz5kWx8i9KlqojjET9l/QTCLkQy18nAwiAz/XKsk/vtTWamv4Y/z78ff58nh5vIDvHH8D3pEG79hD60M6sOqQJh4wVyjGw1SzIa0MRj1TwBmbsQSwddpRMoVMO6JZAN/xIv7jxjHx43weg+EGeP4UqkfLdf1uTNijAjN6qWWrGllUGSSInocIV5EABkAC3huE3MYfhd8aPxXOXyrO2LD49BTddlimvcFbDQ/A3qyiURTJQKMoNJ1kot68Ueas4M2DwSM5GhKfhFBiW4I5EpTD3mVk8ssva28Yd685OWkNPLfNmZlC50ReiGueF0KCtlH4wYqknDwEf2vW3iAz6Rq6c7hrMKAuVGBQm67BeBheFzOwF4PJgskDAjLDmViMMRHt8YNtABZzwLx3L5mizdlkmLfm90sZnD35jwQP3afJPFVTnAl3pZX0JGX3k7ZPv/wS/xH/j3gp+VzLZf9WPDNCWEO94MyErWZooBcpQIVBPInCisZRqxnfiR+SI5IG/6YNB8BgjtchJmzfGC9zFj1DpxKkFsc4Phj59JWNkqYdobbMaLCBvxWv4nLhGYuaZdRBQTsxUmeCdZicNM1gA3dEKMl2og2PoZjSRJ5dsaGKsLI0exGz5D0YjsLb4MSqbYEzi8CQiDqzC1hMX8nU8+mqD5xapURWPVwkAh4WrNTNUkrnJdJIQRom9fllj98bLC5pKkuorgrmjyakIXb3uKFz6ibsv3fPB2LxK07LgzWb3qm9e0C/dcGHtWdIu217+g6ZMOySa1b33/OE5ljZ35l/7ZydT/a79aZLjyEOULbng1x1cBncIN1OsiZcMokw3QjsQJRMFnJwUNvcYWvAsEMifcgSAMnEmGRF30vm6A1V8usiB43rTvkumcb9S4zuZNzfuKh2LFlw/Mv6d8aa0/rGZq9YNv/5PgYu/upC7bAWd/6uHXp4Oglvf/e9F9/dDrS/Geh2AuiWw92s52fcQCd3VlOMAddtMyRjDCbU6Sw/43Q0izHYaYwhLxljyIrQKIlRt1EZ6mmkwQBWFkV72IFZi5vv/mjFrp9MO0xLRix+dO2SoStMO6R799/1iXaad+dt+M+8I8+NmPtWfXDPgUk3Ddw6jJQgrgfBuv8FuE4DPr+Ni1oQ1/ZEiATjo2o64NoIuM5KXStYooqB5crBkrcA5kEgZcOSvbhk0R6hpiHaUm4LKwMS05OJ0kqwqv1o0yPn8KwcQ0bGGnTi5ZfG1G43j3nthe9r18xRrrnumXlr+HTHSVIxg688xd09j1T+tPtvG8hPj7wPax8Ia/8FcO5lWHfTnIBBZ5EsQ0PMZ3FL6KobkqkwC61PQpvar7MJ4tlvwfyQ3Y07wZTMboFGo5dJrAOXBGiaq9pvCBRw7kAVJcLAqZ88eOjbeFCsWXDrvPC4edq/jmonXuZzTfPuHruGnCnYHF+ifavFr9y0v0+v/gdJgExwLH70ceCZrkCAAwYvrL8/F/VQGwlWrqSFVU5qUOQQBu8MepjHQ2sT3JghD0XdHspWMrCVx51IICNEHCgFZrrS+DGuPEwzNX5jMWUXlnDs+nTd9p49LBVVN9369de1wtNLxjz3krzKPOLW8Usa+wpPI18M1m4QfgbcZnCF3ANc1I+4zQGWMMAKowJhSRdcoNyUcMl0UJMULZM8lhE1OVUD8IahgqZeMlHjOjCZ5JFrBNnqRw/CgNY1mKly4nc5suKNKAUoHxEKicoe5Jhq3ZkvqWZFTi2YZ/C3e18bY9528v17Pjtv8MRn5q4eU//Sd3Wr5u64tu/2uWv44jgpWzTp9Gfv/zys35jlaxYMfICEfnn+4Ebyw6Pvoz0Jov5T2Acyd1GTzUAZya7LGlZnI1NZo8jMqjSxqhjVLMsMDMmeKlfC+W7ANmUSo7yodup+0k+oJSPG3DSvGCTJ86u16fEq/u17xg6+qjEOOF8MSuQO8Auw5vR8Pe9M8wtGS0PUQpKFp8mqUzOtOsUkHlad2swpVac0T6dXm8JSFrM8QFqtdGP77t1v6tr11Adil9Ov0VjymZe1y8mN8F4b5+Ou5GhJoOq1MFrjvuaRB/20FAKJ6gohXe1yA6yGOtMmCXeKFzcNj7vdRgmH6k1I2NfOQEGJm6YMcUXn51d2P79W+6pbZX11VSdYWCftJ9MF14l7Tl+mveEyNLbrgUukOhVwItqALrZkbEanC6UJQ4dNl//I/zQ7JlgSsZnqRHBmce1Qcs1xbQA5/JE2924D1zhoIhmmdY0vIL9O1mYxnb8OvvU1oM7P09+F79AjV4Bk/GqKXK2rNXCn6L9bCHb8JCr7R+m2gt2HsRjcKnSpFlpfCYhLiKEcxkU5TAz5HNTPRhraExIphzKU4kO5rzgwdM/R/YMfiZxgMT9ubRBNlM9YthovQHvJC3dIEw98cW2nZ+8lwwy1d06/fZ617utdF4hdJi167qrB2tx4GX/g7glT74iH+P0nHm38NrEHAA45EedFXCehYH70X9oFJGUX+Fvsgh2GaW80bQOxy7x1zXYByp4BoP8rYR1prF7IntCmdBUZTfVCTXqTlr/lJDWmPZKiKzlQkpjOaZbUHzD90yWfEHny8WVHtR/rtixa/NS2RfO38pn2jdoC7V3NvuH0IhAPsSOfvB795Ai1SbTBYi5dUybaJDT/jFUvTehBPckl9STaJM6QyjObxKsvETVkGs/KG72yasPAk+rCWL0jopL0hBvECJswSjJIilGyzTzuzVe/+Hzv/nHXPT17/bp5W6/XBktHJi3Sjmin5N+096fHf+OfX3Hob89/sJLicpA2WPhRX/dtKbg04rqZfjeg8m6h38FzUbxJ/W60oQlAV29J6nejDOoc9Lud6Xdjk3536tI6KLfU79/urx9j2l47tm5fQ+362U/26//YnA18hp07Q0ofHH2qmBcnkY7/rvtgGe9a8ne2J4En+dWwfjtXmYiYERagpUi3mIEbHHTldiYF0qh9bWnGgCG/F5EnL4oJA7Z0ym7bcdf5YpfpDzueMT6KHIfvQTtoD7wnJSZjaBaToba3H+75nc1iMnam95JV0ikxGUfLmIwzNSZjz29eOFOYLKpoUfeMBQiDaqWF40fcP077+smrj+/Y/VXdg7feNv5O4n3mum9qZ7wxjlw5cHTfSy6/ruv1d/eZvfulFVfc1f+SCy7sfsPkfg/vuPlJhM985gR/g9QTbI2BXFROZpIIdYqpvWEMJeohRQQtaXMk6iE9iXpItEA85uZmB8d4mBocMqtromT30ui7bN5fe+BAp/PzO1920bT7wN4gBu3UkviQ88+3rfKsWsBvZDSYBzQ4KnbhnCh/0OBnoVwpsVATONdyQhpjYAcRbQ2hUUdz6kaBLgKUgJVqIT3Gg9ynG5vF82rf+ODiWkUcdfDZnWQKXx+/6D8bBPfp10be/yZbQwBkYB2swQD+lx7bIcnYDhbCiuA9tRriCbxI3MT2ojZtsdilca/QA7Ur/FOOkw7B82zcw4n6PytGeKgZJRrC4XBCi1EXl3ZxqEam0TG+0y37RJwGbIRyh8LXqxbppKRY6+te+fx7nt43l6tWi0mx1DtUCX8n1gtclJcsGHzZxQuiZLZYm6It8HhgPZONCchwFiwcPXPQkWW7/964kpC/1Wr7V2knz3CrAIrDQtvG/cJ5p18TKhv1mtZSwM8BgKd5bIX8cWwli2phKyklo7UNh7//14faBjL68KlTfJD3a/eQhfGG+CdkpTYSnu/TLhcUeH4aN4xrQr2Tod5J8zyIllNf1VeyeJXZqRgALb6TgBX4UGM0GzA6ZTaklBTATYYEkryikScaloD/+GAFqfJjpt93gDgaX9OuvO1o8KLQLSMKSgELfxfKTudpPwv2VeIVt90Fa+oPOKiBNabEZgy6syQY/lpspj/fNx4TKuNP8pPnCRmPzGz8bLUes9CW8RsM3bh07npOcVfEXCIXEMtorQvsUVNFzEhvECWjQvFhkIRKbEtIzcSsr48lwGhETU3zRaitYKflERIrIqkKdSPdsT4clIvRl0NcfmM56UYqe37A76gpPrhli/BusVrD5z3889+ePx6ecIH2zwNf3HjTV+9q3/eaEPrqhdd/gTXu0H4mF9I4TwGXmt5L1K+zH4nAD+y9HSu1nw0vnewF/9YN8I1PwJdeEeMYfC5wJCTUQzFrE3z8YRBKtKTPweDz8rqB4aJWHliciowegmJxwZ5B+PydQOtXF3cjzpLqXOL3esLeAmyNMLrfMu7cebBYjZIPPti54/T5xHL06+uvbXiLZF4wIXS89v0fH/7lwAufhygNZpJl4o9CAefnbuSUtArVZGyImtISERfFU6EKxlZLd220dFfvUioWWZ2uldbppqGm95iwmselV9Fh/D2PgOyvpjKeR5k/c/fCKxYpPXOuGPTInvmXPrCtd9urriexTe/23Gzh7x5ENnxUtaJw5C2g1xdqa8hw8UrqK1zKMY/MhDVcdmwooN6BVSLgHei+Obam6XUCREaHhjWqWdBlMJp0l8GVKOIS3GH3QvAXqkcV27fahefBGm/fvvvpPNFz+gTj0xFnrMJJqZhWQ4FRG/NaaFjOURGTLJxNTBZBYamhixXhiSFq9xqo3ZvORHeGnTIvVkLlYO2Tw8uCUTasfcIb2XlwwyFHLekZ6J1LIFaMukvuYm1CZ4VCCDYKFfMjDqi1q+oNLBry6OJhK0w7DK8tra15g08LfkByAp9/6v9glR4QmXzjfW9mNnxbQLIRtgHgc6AfFuBm6fUiWQIWtUQNPDODsRXOYC9T5DBNaLhDNZZMg4nBHKBK04NlI6FogCrNAPCIEnAqeWgjeK0NUW9eou9N8bCIvtnKysE82Pvij6gWL3JKwo4NC80MA6yu9XuMAWOAlihWlQzYZP71jZeOvXz/mBEzzKSH9pqpO/8JOf37lW1CvIm/az0RX//hA3XktLXTtcb1R9cOWL/ePHOw6RO0D0ec+UoaIP4ElnZbbjKLN6rerHBYzTc1gHmjWjAdWEbFbzZwUraTLlO2N6jt4Gc2SLYaIhmz0JMPyjUmmy8TL+GuPc3tpcZOPhZcejj2ixIZ/jzNTVOHrhqDyeagHTs9SDFs25JqaqtV+43AhEa/ETV2idHtySUhrGBHMjvIiIV3jF0+Y/mGV/dtXDlr9V3Dl8yat/HgexvnXDFh3+f7xo3bP3bcvgmjF6878O7jq+etmjR5zfy1j7+1b+PSeQtnzZjHT5n6wZSph6ZOOTR50geMj/OA1s+CLPNxd7PMcSKOH3PKDg5obA6rThETsTGPl94Ac8kjorlEfWLHYXDrVDutC4raHUhXu5EWvEQdtHDB4YFP4AmkU+8ukQvwNrMdgJ5elukC9YD/zztKRpJRH2u3kM7aA+QB7YG92hyMbpOIpMRv4R+Ld5j+5DTtJdJr2pPTWT3YcpDJV1KZbKRVxlQq02A+7juB7jvqwJqTUlmAr+V1dXWg2vyNDcIb/H/iFvqsmzRZnAz8X8ldyC3loj7k+hzQcDm0XTMnAwDqoIfqL6IY4EJqFVovIcWNLI6Gb5VT7UZYp5cR77WHi25OJROvM2AZF8Mvq9w0F6ca82VXT4to9eUUdoh06dkLKyG7gcWstAVU5YCtvJMj7vZdelFW8Vc39QrywDR6KlNMWs25RMzlgX/0fGZxSTFykOinTRAlxSUOclNdbN28px46uKt+4K5elxDrsW+IWLt14UObO88ledvGdam76FKt8cuxb168sL7TbJLd7qrrFx656fI+l/fkZ6y+Z/CNI7p3GPPomLr+HecNe+qNz9+Z/uiEWy/qc36fS4c8eOOLfeHm1tc7R8YJnS7u0+ta2XPbRf1H90rPct8GeB0u/ov/UdoPMlvGiiYM7SjWMEZ3lLRQMtKT8LGx7FdiDjZW32LzFegdrA916AqEBVOKEhfDWYyHPMd+SgOwvLNr1zIW8AHOGHDmO+mfQFcHl8NFuK16J4470e+YKTbEqjtYsbipGu51qEZqd6g0l8UKSundArhbWkBbR4tQ63WhSj+NNSCnUSEfa8/qQNs71TBI+OJQrJLdKAoplaz318hqQ88DuMLtZdfzgsudaS0toGWclbIiAs1LO4DIMKb5OL2dz1WYL2JlfqIoQ8wvdFVV8oXBApH3N3OadC1QFaaRwgF7yOXkAdJ7T0zb+dp+beeuCZvARu9JXJs2aN9v3qSd2Hji5Uc3PbNs0IBbRo265eaBy57dsP5F/qMD5KbXX9eeOrBf23rwPdL/9We0j596ihQ9s50UbHlSO/rpXcqhJ1YO7btg6rhJC66/7ZHNh3D/8TVCGuA2iyvixoEkocQEiyajQs2lxbIxQTdsiummBN2H8tQSQpEaYNrRBTq6BNASwKJfBzY6ukBf+GnTQgbc8sAlSFlal0+dnajFKkd0ZsDkDPJ/CUOH7PEnMzMsMeMgy7c8M2raRVdvfmb+7LWZT9oMVzwwccbj08v6Z4+97kZh1ZhJlXM7hW23z1gyR9s35JqC4humjbylTdZDpAfKhOHcamGYUAN+kZ3jsHcFDHr9x3BSsljTCL84mLjgs9xktjZOm0Bm6RdU1t5PJgovCfmcxHVIVG8nuvGoy2moUETq20VFIeF36zVQ2HEXlO8XetTx92/W+hHT/6wnTuRugr3wFd0LuSDnunF1LXdDFuyGcBXl+zDcC1fhisJ5IPvahWKBbvQXAUy6dW+xC7D7V2f6Ksr0EaBu+1CsUO+bDsXasatCGv1L7IceQPhKvfM1IkfdWVa0dwrB3ilGBgijrGwTUarkmDHNzxXjbumGTbGt7o9wqGmDEFZTa/SBNYzpukqQgcEMEqbysIzc1Noe2bSZeNav107QPQIKyvPItgemEPlhh+CcoKy7tP9Vwxa0vk22kYJnniYB3CbxWuGamdOnnh9a2+2GYmdhrTxY1J4j7/O9Ol3WjeneSVJA6EV1Vi6nl4dIDcmL1OQx0G4Sf0AKLFmCvDhDqOenAe2soLV7c3oJPtAoDY1gs8iC1UATO6OJnVbcxwwMz6iHXZjaMQuIV28aGlpc0iT3sWaWTk2xwhkr77xj+fI7Rqyafnl1p969O1WL9Xese3TEnatWbRrV+5JIl8upzhwCPuGv4i+wpjSwH/X+FENDovXU8Eetp85k66ntD1pP5bNaT7HJYQh5cAsZpa3Yoj0pXMC/vJqs14au1m4lG+Lnr8GcfC/+Uf5paQ9gaoyOKeRwN91fbrRLwWVvQpnqs9FQNO3CtTVEJRrrkrD70EnTlk7sPkzXXU2VN7OaKSGlB9Etq5JTR2c+tivwtAUx0azQawsxrR15vUKWxLeRdqN7dr38EnHn+BX333XHyKsffmAUyRx+UcduV0Qof3Tnl/BrpTquGHvLWZ+hmNpnqBTSFoSoWJiQFqkOZFPjoS2l8RA7aQJoyIaixgCdLQHUYDE6jIxkFAJEAWw5ZO1tSoC2ErTSgYgNiIlockoHos4/3TdcfcHFl63rf33vS3tcHLl8/ePT5q+7uNfK7fNmPSVMat+1a3gcf3e3Du27hEtvnTr5juoBGaVL7px+H8A8VfyQz6Y1BPmJPvHWawhoZziZuvcz7d/ih6SYlg9gn6A2WPhB7MK5MCOKXBhNo8VReqgazFkapHYnnTM+hP4Z9rRiuYDVyTryK1ga3ZVslcOogsGmdx4x+xEDl8nIWom8tpbcfvfr3eu2mAduX34NRqXjcx9ft0bIP/3ahLmXaWVsfRfAPulJayCr9fgaawK3UvhEmTPCjhWd2B9D9YEzxrF7HGtkQL7iwsj9IOsuIJZ/Envd9f/UfhOO/p07c6oPb9LYe5bzI8lk4TLOjLrBVIG9Vedudm5qnlrO2pb4j7BdqaJHD/qsu7UryXYO6xF66JNgDKDSHYngBS22FQ7HrE0d7FZB73IwcKzLwSgrZkQbM1yrw4xP7r66X89b82fbHtm0RNtdWdGurXlOZdayIeOwHp1/jPxI+5LLOFq7lGxGtp2zGTnZhDyFDHWtF1954J7G7/gbmX8whY8KJTTHl4k5Fari/BLN4DpR1rLovx1ob2fFkSYbS1dgfB/sDDGSyKkkZlG0mDZhnPLC2kdf2KO9/dLjQ66/btCQ664ZzIsZvTe8uvep3htfeWXjsPETbrtq6Pi7hrD1DOfWCJOEncyeqEYnyEtrsODHcMJr2kOkRPvoveTVGvIQWaJNdWtTkxf4HJHry3HSw9Kz8BwL5+UyuPtYHYDircD2JZ9I8+U+L+LLZ0Nhm9kKFpHh3GyAiQsxEIq6XVRAguCjdSSI4ShvtKBKdoOba7b5qG/rddOuGsUnq0Y9vlbESqb9pIj193qDVYHqsGzsizQp5l+/Ix4h15DJm0eOXK/NX/OpLO5mZDr9Op228Qhv0Hwztm2bQQLZmInsA/C9qcMX4J7RM/HogOZWYCOyA+RfLnU7c1FKO3Kpz8nrXWgSjaCdDSyWXKMUDLDqXif8gZOWqjhBrEazqNTP8gPwQR14lQfY1YCVsrWSJUftHjMiw8kC7h6McVnS4UauHDU6syIpuBCI30xa1QV9ECWEoeRgK3qhOWbIE62qCeCBMYCj70HHFXNtuSrwbP7NRcMoWVpRGbGqTuEMcOLLwzjTRekAZplIb7QLq4XNVEnMasFfJNVJl7+uThCt6P1Uh9QQ/K59KBoOUeuxzMz8HtpNnVFYEqHKRs1rCz/Drmibdp3wTkhWSnEWTJh6wEonWS0po6ag0jlyllKKZrcpjUT+umIyn82ZY86tq8hQRp3yFIYVJp9Tf8W3t8LDPHehdr8wSbySSwdZPFGvdKWpvGw02ALg/voq1DRjsu4c8/k2J2o5qgZyQ1gBmCGjM4VXLlqy3UCL0W1630CGrFrAnlMNwKs1ab6sAOtixjC4RNMQ/kpsmAw7hLSEh0ibAElS8l+4aXSvWlI6eLeVv3v0sOm1/PHn9x0mVTQI2ll6dse4q5bdef+9e4cWjZ4wbsDmt98U17fr2rVde+xoxX1K+/GMlZwRLEDH2R15tqaOvLQKNg+AJFJmyY68sBt/pHTlzf30lY2vpXTmGSu1I402fluz91lae5+plfed3QFoxeRHiy7AW9GiSG0FBPeAWheJd3aCdzo599nvlJve6algvQpE1qsHk++sAii9wRJjc0CX/mfsb4+sWjk8BVZDpo04tR8s27c3cno/Int/Abw/Dzhpasv35yfeD7YsKrWabKcfh7JJjLFMh2N5zCHIo9I+5mEOAbJRHg3M51PpHiNW3l+A/pUHmIc2lZJ8NovCL6umvEgqODSKzyM/+ZuC+M1hu2XywGDnweG8ssi0qTeXdh1Sll3axd8M0JGLPF1cF7a3jZrj6W7v0bHRSOEVGbyG0zq+szGucA6MowWSGVatuJVCtHXRdJhV6LB6SNg8tGnRTuGUaQUWPIMWvGUAlC4KJSOWakWXyJPRAk69lijlOgXG6SzkdDGANU6PPiWge5hFoU7vAk56Ww9FJWAzPkz51wP0nHBODsYsWLrIeYBwORUxB72iHT22wzhHDgnKxj3EnIygAX3iw07C2x0WN+tsYsyv5qSD5LXanJFI81ZYXpcDYMjqPRJAyBY749DU3VOnDbg5/YKOHS68oGOoV7NNsvWZKVNu6HfP2xUX9rr1ootZXdXPHGfsR/vZXNw0Zo0rXJgOgGGNjIaGmMNpQzgdZuyjpJeSgXXiu+jgGdDWipmOarBTs9xsb4iabQn/EL5b0YdzKjL8jWIPqyY7eppIdI7ZhS4ANIgRZrf+BQCTgOAQxgrPx6/08FfFd/v4vY2L0+Jvv0NC5I08SVmjla6Of7+aDNE28mn8J9Rem6hdqPfQlnGLWVYEVCfSorXuWaWsIpajK852qX202BzeRg+EtOyqxUEU+U7Z1dNsk9yZOcHC4jLchW1kpQiLn3KAcsHiNjhGzlYI126fPxKJ/EnzLWlucP9hLy55r8kcP2dfbvyaVDud9XRdbOxJ/f6r/6w71vln3bFyohXOFmnRJUtAOaR0yjb+gEXjiXZZY08Q0M3Xcsn/xlpargG0Rcoa4i8zVaEvwpDJ9ERiHb1gHR7umj9bh/fP1uHTcQI7IHIWVhLqJBU1vzFl0rSw4oQm0XvaLzYa6dpyuNl/vDrchllhNc2C2b9E7d65l1pjM2M9pizToims+cqUWTkfBkdUh5vmq9U0Km3TwHVQvZmsUDEForPC+qmgfdkixJ8EcX3zWD9/5jNwXB8EXsB8UAn4e2huJZNC4mHa14upBSOWIhGBYlZAAwQc+nzgrbJ6ZKqT/2TduTynwLdr9Oe1Pft5mAJq7ZEYo8BHKsgqD9UzHkk8FWVkA3xDXsE8dqle82pJzFg10972ZHFrVOCNzA0VEnTHOISf0buqvonQJ4+wNwhncJDQIKA3Pt+L0cLkG9CfdocxKABGfKKVPiXpomfL7RgvlBtYmRPNv9hpAl9ILa9N6sS2jDDH6+3sIkGYk0txQYZHE/ThioAPv6S6IQfr8mihk1PQ54lkABcSziGAX5LNgoeZjP0cNEyIsjQjFHVSt8+ZjW4f9dgcGAFzMo2PCWXkPI8z2RNdlToKICC7aWsrDgNA1it6LGUigDa6/s1jv5GGw5+RTO2f/NrV/P1NswH4tZpAXCcH4nQALW812++SCewyM3ioc8/q+sUUiAussVxXBmwOu5Sc1aS3AVtAJQSYHg/QXRPzsU++phbhYFOLsArbBGgA5okq+Gg9bEq7MPUDAs3bhlu30RLNxLZWrLPUBuOzrDPYAbTfGOxg7DcOct1a7TgubK3juEjvOK5xSPkFepX2nzQdo1PwR43HN8Be/fPmY7GAxQf//64d9cUfrZ2UoFT489XzjYn4ZmL9nen625xj/aWtrb9tyvoL/yLuE1Lmj4AYxKTPn0MhmJJqKAlHIYWjmru3FTiUigq1DeybyjYVsG+CuG86pwKGplQ12ynVTrUMPrVjn9o1AR2Bn2XVYApL3uygo4KawhUYzsmvjkT+AgJa3Tp/hI32rWynv4KalpuM+j8UR4a4TuuO3J2tYamkQqkIq0GQ4mUgI0MtMKQWgUAvcqqlcFkOl+VNuAnDz9Ii7GX3ZjsoZoIlgJnS8r+ImRZq+o+wckVztf0XEHJ/c31OuBu5d4VPxKFgt3BuM6k2Y1DNaCY3kt7a7onkMnLZRG036T1R26nthE99yNVTNZV+05Sp5BptB+O5x6Uc6QTn5/JB147Q64CDCWzm4N5py0ZXWenoKmzasQOqynDvoIz1YElhsbzTKLslGmNR7C7VZEF7JogNPG4fbeCJWjJLWbUWiOckMv1ohbtZmrLEGKwudnv8pJhi08d0UQlF4uEVty/eOJ9HPD49c8hDS196+Va+cvhTgMfdAyYDSjvz0esQf9OfPLNHOzIUMXjto1/Xk0H/XizMGwPYi+/pibjcNVPvJdxurAQPzMed11qnuL+1TvF0vVM86nR79cD32d3iKJpbdIwfBmncate44WK9v/P/4XpQ3LbsYN+CErbVFUn5ulBNrKkTrCmr9TVlt7amnKY1+c+No4QIbbGwT5nUbH1l7VLsdbo2w2m6tkJu+Nmrw4B+QVj1WTBQmOhE05eKeYx0mbIypjICMo14JwBA7s7GhlengY7lycRyw0Aiu9USkLM2fAuI3m6+x1uH7PHm2xpwT/vIgR/QPq1u2Ulup43Q4CEbdCsYm8mjvMVGB1me3VAuAAc0NZXzzD1r6iwXfkzoUZ57Ct47EOxPO/Dh5SmzSGI2B/V+bIaGmMCGe9GaZn+ix0LlHaGQnlOnnT/paBj7HDQzoA+rCbHaq5QhGU/VEf/yoxO137/QfiDehzZtmqd9JSnaxyNeue+Vr7XXycHVk6auJthLBfS+0+ACH2OWvio2nsRAqxFpzVkZXUpbR4PS1kmjd0Z7Q43FWAhaMgA3AxW0y9PIaI4jQLFSMdAWJL3o85ag0CqU1Twsr7FgeERNy9arpjPQwvRikWLUiMXTFJxEAN3rwaoy1n+ot2xg/RkLtGeQhe/VxfY/cPkLN7y165qdxWUd51aNHNf7xX4L7+h/ROz3t+9qNk5/66LwoKXzrtgYbZf9aH67W66tHLx8wTU3vnf9LSO1j08/jfKZ9n5LGpfLFXDtuNWp3d/F5+r+Lmvq/m5P8RJM7f4OUs13Vvc3Dl4PYvg5L6KWWsE8cGbnBwpoTYneCF6cbAQv+y8bwWkU+0+bwTeDoPz2TxrCpYHakca79K7w5vhpA/hZ+d92x7f/y93x5Xp3POCloLRtuyReFI9LKftfapNHz/hPW+Vrqfj+o355/q0m25jix8DRefwduWdT8VN2Lvx0SOAH9k3CfGqTiqI2dE7/WShC66kNRjXy8gH8ckDWLmd2oKCopCwVW2qwkA5lTOKrQ3N8qQEn5cI/56pk3uBPWWs7Uy0L/oS7xAuS+YVbz+KxE4DDTlxP7t1UHHY5Fw57JHFYXqGWgMkeLikHYVSAJvv5FKPVqRitdiqd8PCMRDaiItYpacZ3a45qpW0YsY2nSWBkuxcgvVsnQLUJGLOkvEvKhu2SRHGPFigux469vE6Rv4Dk1rMZf4rxSa0Y/ef9KfpbZj1G6FQQdRrs1/m4C/d1S04uQAVZGVaLQel3Dv0JYxPlvLO4uiavDUbqCuWW/O1xKtX4NyGZjjutpi5DE9d3xdqONoDPQDFmZOVodkERTdm64N1leFUuq5V0oIYLd0C1rFZ1/uMdUFAMvwlV/zXy6BGnJEWS0cJzkWY1s0YKktRYpJsn56BKHTNQGtMpMYQrdENFp4lhAJW9IfC7j/x30lfpCFzOkjjnVcTa6Umc7q1KZPDUY2G2I8Kp8rmm3FNkKotF2K8iFbFydlWUQiCsooyEcYdkF5S1c3bEUvJycPL+eLqJeh5sqmhp2/JI5L8R4a7WkkZ/KtMvbZFG+kPxLrQ5K68kcFedOWGYJl5Fqx26cbu4aBuMuAXDajlYSTkhWgepeMNIDeW8UKxTZps0e5kSCqudJDZ9i+G9DNBd5lSs+iBwzC5Z6S08sgZxjn2tnULY0Vqtj45H9Ha0Yoq9TXkYpU+mrLpgByjVrqg3J6hPh8+nSdPyNqxSIVOOcvm4S1RTJ5p8c6WWLBc31Sz76YyNHEJnbPQgfkMwX5/Um8C4g5AA+ydXffHJp3fdMWLR7p/3TFBCPZ4b8f438TbG51aumFzRc8Mx7fS88z9fvOWFujuHXroh9OU9i/jNfOacqRNWkg7rn+s7cupd17iX7Lzuuqv7aWcaJigvX5E3b3LshlueXX7lwN6dvufvIiRv1vKnmZ18s3ahPtelHfcIm+wSK9LzXmdPdFHaVcRy9bxX+9R+6gDwdCnLe5W2nPSC1kYgkffKyi0sKqEWR6msFEcUH60vYuNf1KxcQGBhSSnNgRU1z4GdeyxMixzYuafEkH4pCbBWJ8bE16Vmv5AX6QwWsMmw9iqAkezmU1jywI3IZFNYMg3JyC/a55l0CkuW7kRggNeC5rcPq4t2Sna3Pz1DH+z8V8ex0PKJPxjJgjbnl+ceyyL+pB2Jb6WjWZrBlQNwDfmz6TIF55guE9SnyyBEuXk0YmKSo045P/JfjZhBY/EPx8xspobiuWbNkP26kajDBTaiFyR5McYdm8NVCHDlMbiAdEp6hV5HS0HLo6Dl66C10UmmIg8q+fIuADE9IzuXUa3GKWdm0ahaEkg1XaIEPiewTbUhf0BF3bybdW5CCv9IWHbxdYycoL8YPffrcFdwT6dAjnViSmlYzbHQYq1WEEGUDilYqPFZ0HrIAuOgCR817Uz5cLNEpo5qO7kBpaiaBbRX03OoyqmxuyWMPCv5rmgBhhkjSjvghbbt6dghPIYgFVkZOXBV0u4PeKOpJoOhK2kMtIo33RJok8Db3boh0MpGuIoZAfFrEXv8xcmcIja03y7Fm+cUSUpO0XHunGIX2Hzt66S4duR0KZs8w3Or4Fu1/rw2Zz+P5hRTHoll5k0ZxVXI8UvrxH8gayefeeY9+NZOOkPjKZWJbB/qQ74imVJ0nJ1SZINr6Mia1NRiR8Zs4TrxiwRPnc7RB+cIZ16Ad12kz+vxclekTOzBGU7Y1uUO6XN7mmcXrWWJGrf/Lrt4IaPZp3VePf97E6PUqUO4Jql/IqwEuL0Pz4sxtAPpVYadjbSLNQA7upQGUXByj0NInhGSi1V2LJbi008EyWWD0sDGfV40WBxOdyaOCAZ1pMo0fV0aoPhSRJwCothdMZPZ6aJ9nQ4ZODlxlIa/uMRYUo0jm7CtEyeapB6o0Y2UUM69b+x7Dz4+ucPiI5fVz3o+8uOOFy/bevKeD+fMPTq5dssD0x/hAwtvfvgxcmh5w4zxry5eMXTmgI4bOy18cNgE7Xft9oEb4ksf/GzOon2f776lc7fLXsZ4Js6xAR9O5kq5BeeYZINhokxw1YozA7BrvVIy9J0cbaOUopPmYjamqwLVN16xmTdgZuGmj+UyxwwD5OZSmkuws9JDfQSOGsBsi6s00uowHKFVh6vFiJwRrXhXLcfmiF+enUAR2Bwd0GFpnJvL4y7Up7/4E7I+x5CcjMxcH9pjj2Nq6MByjjZngvkWk2S725VMmTWbqdMU7Wllrs6zsOd/PcdsHfEz0LaRxICd1LVmwVq7tTr1J7+1qT8BfepPjWSnuudPBv+g+Gh9+M8+moxsfQIQaUzUQNJ10nl56VwhVrfQdWYn1lkAe8tVkQhDZ7Ajd/L0pWLAGWOMVMAreYBYlz2dnUPjkii2W0Fw88BHK1jexWTUynMgWngtqQ3bJ+cZJfB9AuDAsxvv0+EoS8DREeDIqwCN3VBTmJ4HO8QtJc9xBEe6xon+Mx764WSVXOUMxJpsczncz2L3sypi2Wx/4LGOWSVgBoEKzCvrSEHOo1PDSiKtAf0HgYhWMDCrlR1y8TnR0WKnxCuTWEE7geFlv07f9tyDKRR2o2QvCYNBh8nGJMGJUp6gdo0zAy0Dr5xK95q2ZsQgzURWqG1B2lfgLAvs6HT56QlLNXYpm1ac5rnUNmUoXt1YUF/U9hzISQ0DMHwkdX8zxDzO1IQ/gQuiGwEt92I33ev/QkcFPz3ZM3wJ94zYXqyDKzvnx7MrwUtEzYbtlmZauE1PDkqnCtsRoucFuUM4+CJxEk+ywlpOXl0i/DO+iXXa6P02/Xfv1vbSI4J69BAG0eYbrKxGPp0iVoq7qR1ejBlg2s6Un5i3kpU8Yi4xRS3IOpmoeerjqHuvBOXnjWKay+zJoNaplfXm5GOdq+yJoMdRY+XSafxbdKkGc6RJf6HXJFPEp6YsDW6986VkwNTjS+665bJpw1+d9tnSO27oPW3YO7VDSL/uly7Yuqe618It/fiSjfGFbVe8s1ar36DND658ayWpfmUMvyv/SLw+4+Na564x7MxnnH0E8s/Jebhrzzn9yHuO6UcoDAWOHWVllGscLjcTK+cehISCO3UY0kTMXDYfiCRdpucH/+drw2blGofs8ugz491/uDZMZDYb1HQp9W6ar04MJvOXdH0gk53gg95xjvUp7uS42LOXmKWjj9o2gMCYA+icwYZUqF5fpGm1qptQLLeG0YSkTl36A3qes8XaK5pKQYDHGX730/UXcOtbQuBBsZMdVtNh2+WHmhAeTEBTIwsodXxyC7hq8ixGEy1CBMjVPJm1TAg0UY+9Oj6ZtZRnsiMQAHCa/0QplJOfCrQHA2eZeZFWwT4rMZoK/+gWWdEWeHjqrHwonf+k2yyjUiZAeZIToLz/ixOg2GgmV6SVSVCYSz1rGhRNqZ41Ekp8uymvulIbLJbo83T7pswJTBkRSKdKJqcEqrwzFGo5I5B2JUu21OmAUsp0QPkc0wFX1o57peVwQOOm+IFZrU0HFHRcM10X4Go5puCymILLCzUhv6BCcR6mWs3LavKADjW5omAq09ty8GQzlLz/e4TBOcJ4WmaGrPI4FVZwqVn5tL+MjgTSNWRGLmt9akG6s1jyLEJ+0pwvzyKpdHULzkTa3nHmO6OZnkEYxOy0K3EalidxDKMxcVwQracBJRWzOjwYQrAKybI6/VQ4rJ7Ao7IsoWhaDoYP08x0Tgxc2M1ltNoOexVUD27MNBl5VE3LApzkRNR89FVzKStU4hlm/qby4QBuydSRi8Y7FmqPTdsuXJysIVai4x/TFtW+qowbPnrUs6/w/Hmk6hkir/botcTeVSRNOfSdQ3wo7av3qHwacuaEkROv4vK5duBTr+aiuehRpYcxSIIuLp1xag2rbeFjKBRr78xFmNujaq6iMNO0vJPOtnA6McaCBjyajA7g9054/iTWdOYiqE5ZNeHA63JX1IpCCv1JXQQX5rL4IPwJHkSqtHepATAflbaJUcd6DJR+18PI1X6asT/LDZD0OPKQyR8/NP/NbufvG/vet/GQ8Yk5L0zqPf/Xue/06P76nKPa77WbFs7ftHnB3MeEXN4x/96hq8By2qTNv2fY8Anad3dv3z/qvlljhw0dRzr8+vyH/3h310eH+2VOX0Xjh7Suw3CaznrJxJmLqZUdWHwP6LPBNvOEqCwwH8YhL/ScHmvynB6ssPDLTCIYHM2PEVBtTt1+TK3/OIvxm6pBPmlZOt5UFyKOb8nshNsmfikYQI6ZuDJ6frYUjvEWLk0/vpo7DE4htmVj9a5+CDKr9ErU4zO9J37ZpOiwt/0jobv0DeyfHmyuGngXHlMaSBFBShzREvMz36FpjprzrDlqielpLR2Eqa15yp+19IxT54ZwzaaCcP+D3z3OLxQXCwXwO/9Zs0iahlg8LnzLL4R/QriH+YXSm3/69w9LnfW/Hyx2JJMMbnaWOFcRE5vOEufoWGY6RsyEhBATjdrA/Ebv4CFX3jlQEDvePfyNnpfev3wePKuD6COXUNr+tXPJ3fSQTwcxdhgoPE+GXCHeMmPp0hnDXu8GzyrUviLncTv/+zPOCwcItUMvf//+ZfcOY2ecg3wVO/J7KIwy14tynTmsA6rYQ4m5SPpccYwKyvrgYR1sxUyHATYVvOsoCCcu7qC4mNkCI0nM4Bq6ij5+DsUNXYOpQpHDOlCKja0heUQqbaN26GvQQcTGXDOd2Cw3Q1114qIrw+GBFqi8NIFSWEOhdogfxv3nrDWY/u/WkER5dXPcvzxAqBty1VfzH6l9YtShnpfiz5EHLwCaLuD9fIHwFnh84O9ZKa9ZxDL9hz5uN2aioyj0H3TqbrPpACB1F4y5ecD4u24ZOIY/Vtxv7OiBRf3uGkP1yYozv4rv0vPo3eDVXaSffivj1Dkc02DzhUIpp9PnpoZOkZnS5OQ5Dxmsv6bZSbhFrVyt0M/E3an/3Nj8cNzyFj8BB6O4R/h8Op8gwNHRC0zkWdg5KCb9HN7EXqNzkEYlxx/lJKYeYd3uGt7R/DkKH9If1fQcQk/zZfMPbmxl6kFiRrGYDfZHEGfJ5utzCdnZzw46lDDfbKeJX07EhqWYJNIb7rAqiXieADVBgodV3hAKYYkvOL+A6XQ64zgdhxH6QtFgOn4KivCJC7Gi/6DeZZGVT80OhZPRCHFIbNK7GY95YAcNBKvCLi5x1oBRH2qX1MKcMCgajVpIzi93zvWMvusJ1UDuZ8PtxNiTdw/3TJr0u/aFgc+ZNn86MZC8vMeCb70wff60V98v2JRLioiN2WC3C6vFzvRcKQ83SZ8aZLaFwziLw0OJk5iyg2ewmxxyKBSivqkB6EeVSesnTiFzmZJNwRgMBZaOOZj6QRc2zYMjDvTBuVUBeo4CkXG0LSreoCDfTmYsH0C6jV26dOxNiyoXSYOuuUbrTN7QOvMZ2jiyJP41WaDdS+ZrEyktMdjUWewMu6GKRahx0gso1NTr5FhVqmr1H7p26CgHZHzA6TcYXvJgY71Dz5LI4Kaw0yQUH4t5q2n+cLMjJbDOO/OvHCmhuFmcNUP3kX3Ys2Y1sD4bswmNsr903gR24uQ9/d6LY5/Omz5u4ohPPqnjL6sTnl5y884D3daFRo68hR470diXZlbouRhCA8Di4+5iZ5yDHmBur5PB4QphAsOgH0vgZRM3HXSKnoeO+vC4AA6vJ3Eic3LKJitXVS0eOpCXU+2EjWdJWT1ajxKsGdbfdFwGqVdvI2W10654g52Xce+zu7udaiMN9bw/Uj8xg+oOjjOEYN0lYDM9yUWLac6lTeIkgLSc0jCjg5oXDCEllIwwbXBGG7BdhVJM4Shi9CguwsUX4+KLnGoBoTMk0Y7ODkUDdAZfII9NmsBAV5metSkowv5uIIzaBi3qDA8r4PT7EqRSzX56uLRq8kVaIVegFeIFdAKmHBpCljJajp844tixWm1srbis2SkijK53jkrQtTltKY7aYDVFCc1HFIQTfJqr4ye/kOEnqwk/pRVKCcVPMcNPSTHioATxU0yDfogfPOI+JxQtoBKtIB9+V8D6PfwO1gAULE7gJ70AKO9JYiXjj7HSClMEmp+jQpY24xHASSpCWvKLzjP/B/FwGXgAeNpjYGRgYGBiYHCL3KwZz2/zlUGegwEELv/QcIbR//f8E2QPZ58I5HKA1DIwAAAyxAt7AHjaY2BkYOAo/ruWgYF94f89/7eyhzMARVDAKwCmbQeHeNptk09IVFEUxr9377lvECKpwIgMCzKSsGwxoDCm2FD2T9wU6mQq6Khl9sfIUrLQFMuJ1OmvGBSCNG60KIIQzAi1FrWRCGrhokVSUdoi0mL63pQyiA9+fPeec8/l3PPx1Bd4wc+aBeZUxeKuuopW+YpaaUC1+YBK+YUyqwzlahDNagwb9EnEyyXkWJ1Yo9xIVKvRrvdiOc/XkD5SSA4RN+kiF8k+cpyUWt/RYj1AkixDtpTilmxGix7FHtcWnDapvHsWIeNGrclASAKkivsa1JlHCKlkPJHDcBthPAch+zdzjJsLrF0S0aPs/b4MIVdGsNWkIGBWIt61CumsSZPXiJVXOKAS0KmzsZEao/OQqbsh6izzBaw/h4Ck4KA0oUjSUahG4WGsWCoQsKZwxZoMD8lS6hS6XRpt7Ccg7fBF6gIoUo+pa6l3ECOVaNUTWGdrbNI/kaRfIo6axzOZ1g/0U1eYE2hyZs99mxRz3r3w8U2V8g4J1mcE5RMK2KPf3gWfDiKoh+GXapx3Zm/vZq4PZ9QfNMoOlKhvyCLbVCPqpRVdehLbVRyCvP8U43W6hzyDn77ut93ItdNwjD15nbkvhqsuPO14EfEhCpUcnqAXA9RJ8tYUInHehwWIF/mRteNFFBEvnqJXnvPdztwXwR5GTsQL+hCNNRMesWZwg/qGDMoAGuZ9WEgHdnIWPseLaBwvpBvXHXXdQ4XLixKnJ/0CIT2Cej0GuDqAOVXN9OgjyfoHpqlN1CPMOf/Bf0wmeuwMdFi3UUxSrJtYr8ZRod7Do4a5fojLpgDXnFrlRxXJd+7lv1FkLJRLKtfVSJA2eOxxeOD5C0pV2v542mNgYNCBwyyGRYx9TDJM+5hDmKuYVzHfYOFh8WMpYZnEsovlEqsCawDrBjYtthK2d+xB7GXsXzhiOGZx3OL4xinBacK5hKuGax23EHce9ybudzwqPBN4TvA841XiDeOt4T3Bx8QXxjeL7x9/FP8Z/j8CVgJxglyCNoI5grMEjwneEeIT0hFyE8oQeiXsIrxA+J9InMgaURXRNNFFoh/E1MScxJaJvRI3EZ8g/kFCRWKKxDNJDckAyR2SL6SspDKkdkndkNaSrgHCPTJaMgtkFWRbZFfJhclNk3eR3yJ/Tf6fgozCPYVfii6KExTfKWUodSjdUOZRNlLOUZ6ifEeFQaVAlUn1kpqLWo3aNrVv6nnqdzT8NLZoOmi2aZ7SktDq0dqi9UBbQDtG+5COlc4MnR+6Mbrv9Er0pukL6EfoL9L/YJBgMMfghWGa4TejNmMN41cmW0yrzAzMDpjrmM+wELHYZnHPksPSzrLHisuqz+qJtYX1HBsNmw02H2xTbDfZMdkl2b2w97Cf52DmsMnRx3GN4zUnKRxQw8nMycUpxqnEaZbTAadnzhrOWc6rnG+56ABhgEsZEP5wjXFtcX3l5uZ2wz0BAFGvkboAAAEAAADrAEUABQAAAAAAAgABAAIAFgAAAQABZgAAAAB42n1Sy07CQBQ9LaghIgtjXBhjujIuoIBBE3EjIb4S4gKMboxJoeWhULQtPjau/BA/R9EfcOPaz/DMdABLjJnczpn7OHPm3gJYxBdi0OIJAJe0EGtI8hRiHSlcKRyj/0HhOFbxrPAM0nhReJb+D4XnsIdvhRNIahsKz2NJKyicxLp2pPACLjRX4RROtaHCr1jW1xR+Q04f1Q6R0m2F35HUvRB/xrCiP6GMPm7wCA8dtNBGAAObyCHPZeCQ0T79XTg8HcNFAyZRiZ4u9+q4ypcnh7tDrjt+bWZWWV2nBTQRbWHAOosZ0cgEG1N5Z5LP5z193i60mVQX6hPf3bHeQoQn8899BtmEXosWMGZRq4OezLumr4/m1NvNyCkaaRD32Me27KFPxg6ZXPkScafQL/oj9FcYa9Djyj7ZzBkQ2zJHaGnLPpc4EYt54Slak6bn756IKQSsLCLLdS+XSZ4Jl8l8j7qzVP6b06enwumWsY8T1PjNKM5zRuvshrhH/Bl56T2QLzWY6ZDd4Nqh5TiBIra4F9XfE85lW76vSRViFkKjQB7NJ9OIuYZbejr0e8zu/gCIIoO5eNpt0DdsU3EQx/HvJY6dOL33Qu/w3rOdQreTPHrvnUAS2yEkwcFAaAHRq0BIbCDaAoheBQIGQPQmioCBmS4GYAUn/rNxy0f3k+50OiJorz91VPO/+gISIZFiIRILUVixEU0MdmKJI54EEkkimRRSSSOdDDLJIpsccskjnwIKKaIDHelEZ7rQlW50pwc96UVv+tCXfmjoGDhw4qKYEkopoz8DGMggBjOEobjxUE4FlZgMYzgjGMkoRjOGsYxjPBOYyCQmM4WpTGM6M5jJLGYzh7nMYz5VEsVRNrKJG+znI5vZzQ4OcJxjYmU779nAPrFJNLskhq3c5oPYOcgJfvGT3xzhFA+4x2kWsJA9oV89oob7POQZj3nCUz5Ry0ue84IzePnBXt7witf4Qh/8xjbq8LOIxdTTwCEaWUITAZoJspRlLOczK1hJC6tYw2qucphW1rKO9XzlO9c4yzmu85Z3EitxEi8JkihJkiwpkippki4ZkilZnOcCl7nCHS5yibts4aRkc5NbkiO57JQ8yZcCKZQiq7e+pcmn24INfk3TKpRGWLemVLlH5R6H0qUsa9MIDSp1paF0KJ1Kl7JYWaIsVf7b5w6rq726bq/1e4OBmuqqZl84MsywLtNSGQw0tjcus7xN0xO+I6ShdCidfwEvVqEbAAB42j3NsQrCMBAG4Fxj09baNkIHl0KdA+rsbLJ0EUFowOdw1cVRcfE9rk7i7nPVU2O2+/7/4H9Af0I4swbjddsBXGxnhGqnKG2D5YaOo61QqF3LkNcauVqhqPWdY6C+CAli6zAghDOHqNZPxmHCnGMqo5tDQoiXDkNCUv0AmLqZnNL0GqiOmz0xI+bGc0TMFp7FZyw99Mwnkh6Kl+eYKOd/WizVG/XZR6IAAVfSd8MAAA==) format('woff'); -} -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 500; - src: url(data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAAGa8ABMAAAAAtuwAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAABqAAAABwAAAAcZSXcVEdERUYAAAHEAAAAlQAAAOYXGhVYR1BPUwAAAlwAAAeIAAARIG6ET+JHU1VCAAAJ5AAAATMAAAKy3SKq4E9TLzIAAAsYAAAAVQAAAGCg/q0CY21hcAAAC3AAAAGPAAAB6gODigBjdnQgAAANAAAAAEgAAABIEkwWXmZwZ20AAA1IAAABsQAAAmVTtC+nZ2FzcAAADvwAAAAMAAAADAAIABNnbHlmAAAPCAAATnEAAI3clt85B2hlYWQAAF18AAAAMwAAADYOJptjaGhlYQAAXbAAAAAgAAAAJA94BfVobXR4AABd0AAAAnsAAAOqupBHTmxvY2EAAGBMAAABzQAAAdgqZkzIbWF4cAAAYhwAAAAgAAAAIAIIAa1uYW1lAABiPAAAAdMAAAPMOa6UMXBvc3QAAGQQAAAB8gAAAu/ZWLW+cHJlcAAAZgQAAACwAAABL+4UR593ZWJmAABmtAAAAAYAAAAGd9dX0gAAAAEAAAAAzD2izwAAAADE8BEuAAAAANP4KFZ42h3P2UoCYBBA4fP/eO1D+KiVCppaKC64laaCuaK44NqLdJngU3RqDgPfXA4BSLrf/E0kReDBfeTJK22BjEWy5HSeZ12gqEu86FfKukJV1yxQt0iDpm7R1h26+s0i7/R0nw89sMDQIiPG+pOJnjLTcxZ6yUqv2eitBXYW2XPQR076zEVfLfLFj75x14n/n/gFJoIscwAAAHja3ZdrcFXVFcf/5948LnnePHolgExbIIBFpEQxBENrFUiAttMGIkTQMlTrQCaltNPWmY5fBES06qBtscaSFi00LzuVABlFAg2d2qJFW0sIhEiKNYSrRKxfs/o7O5c86CUU+q1nzX+fc/Zzrf/ae5115ElK0Qr9XAl3zl+8RGNWP7i+UlO+tf6+tZpVuep7VbpTCfSRmQLcEoa8ecPeAsPegjwnrl733XX6tCvzXTnNlTPX3re+SoV09eS5MujKgCvlSkYrTbkap4maFut1Q+xeGbs3xu69bmTAm5lYw1sKIyeqhLoUhRBpkuZSfz8yVg8g4/SwNut6bdGzmqBq1ahAv0cKdRiZrTNI0f/7TMFTzlvz9VP6VOtX2qfXdETtelc9Xr33O7V7+7xD3knvQiA3kB8oDKwP/DCwNbAt0BPoDY5HJgZvCN4WrAh+A3yfsYNyhDn6pX1QmGFrv7ixF6UiWBEoVHXwKaeFp0JrpbxbqdhZhP/nKF/FimBFBO0jtOVYiP0ywV7SMjuvu62Tt3T7p263f2kVNZ4epS6ghfYhrT2aoXDfh8oGk+yLmm4zYCJX8+yUFtg5lYBSsAiUgaWgnNmWM7LCurUSPMy4DWAj2AQeAZvBDuZ4AbwIfg12gl2gljnqQD1oAI2gCewBe8E+0AxeZY394DVwALSw1iHQSls7+naATgAfdtCVR7BrmTL0aN8xJcFVp4rsjOZYVMXWoRpwGCTS8iYtH1B7lNqj1B5lryTAbbkdYJ63VGWVesiq4OoO/cbq9Yr9kv2QDjO3K4teXVqlHFeTSU0aNeeoyUBSaPP7ZdhfaMmG5x5a2/BGjxtTZY3M/AYz1zDzQWZu0Sn7q9P/PbSejl9mg2rwPPgF2G6+lcfpmUuPMN4Px3TJxkvdeKkbL3XjpW481O3WqeVeB+pBA2h0zHWrjbHHwQlwEvjzbmPGBbBUAkrBIrAU1II6UA8aQCNoBf6Yza58Cg4WoskyzWRXZrmZk9kpXXi0C4924dEuPNqFR7toHc2oheieqLBtUDZoBx2gE/jWR7E+ivVRrI9ifRTro9izAC1LQClYBMpsHTpu01022p2HWp7rQD1oAI2giT57wF6wDzSDVuo9znUCq6XiuRwixGRN0VTi502chgLdrFs0i1NQxOkqJnp8QaXovFhf1df0dZWpHGsrWHOl7iWWbNBGbdIjxJQtekyP68d6Qk/rJ8SNn2kbMaZGdapXA9F4t5q0R3uJJM1q0SHOaxuMnMALgZR8P9okbwm16TPEJtkJ22xv2mGL2ov2gq7i6vuHrvHCo/33o0QK2Tk0OG8v23FbY59wXtKUZa/jsc7/Yqb3QDd4/ZL6j6848iq058QNfasDPeCd2PvpgZZN1mNn/2P0B/3gyh2oO09kG/nKjqctMab/yuIpy7fef75kvR79D5evl2P19JC6s0SVi887Bp5WDOyEd9nbg71brMC6babt6DtrF2zjFdb7Cj7/OK7HMqn9Ntjp1qi0N+wkbyWDu8iW2U5khu2GjTBVYcaE7YA1Wqv9mR4P2Y8Y2efG99oU67WX3cgme9v+xv3t4evaGftkmG5TXbl6SM071ukzE2MnY6iPh438jitb43DLXrL3B0ez+0/HfJjF1+Biz28OGbXGDmJTG/gD+yCLaJ5N/2zOS5RIN9gvj2gne8BqsLN/F6bH1jvXv/agtrGdczmfnB+h7aNrPVX42Y21C/HmHM78Ve3YCyO0jRgH7LfXvOaukRiyXnfvjRtH2KfW5WLCySuc+bI45+Ejd1Yu6wM75srlcduioO2arO2NZ80VRxXYvbYUud/W2n6+1Xx2+BoncypXESm30iPT0jiZs9z5HM/7W7bGjx+XzLMd/BE0DNS8Hycquy8A37CXbD/nfz8n/OwAn7G7/Qm84p+Nvh+499lxGIpe1p643NmDIzDQdLlzge4B3cpe8LOibMQjN5hEXT4SJEuYzFd6CpJItjCV/GGaboS96UiI3OEmjSJ/mMGfx+fJhpLJJAroeTOSSjZRyBd0NhIirygiBsxBMnQbkkmWUcyac5EszUOyyU/m+zkPkkv2UapPkX8sJr/3M5AIOUiZrtMSJIdspJysqgLJ4z91hcaQl6zk+R5krPvXCZCZbEHzx8hMkvSktqLb00iinkGSyVWe5bla29GtBglrh3ahQy2SS/bSyOq7kQj5SzPrtiB5OojkkMUc4tn/cwq7/xhPHYinTsRzbCYhHgykUvrMRrAxizE+v5EYvz6zIX0OCTk2xzjuQuRht1Deiox1DI5yDKY4BlMdg2mOwescg+mOwdGOwSDMlWLzIiTBsZboWEtyrCVqKZKgu5BkLUcyHIOZjsFxjsFMx2BY65C8ITyGHF8hPYeEHGspjrV0x1oQzhqZ2ecr0fGVpFd1gPl91jIdX5nufzOkViTBcZeuv+sYq/j5oOd4jLi8sJ/NiGMzwvqjHZsawmbA8RiExanMNY29Ngqe5lI3Dwby3N4Z5/bO9bCwROPdfvmss3YCtt7D37Jv22T3P3yj+x8udpZ8yVlSgh3N+rLLV8ucruVo2QFvvk4r/w1Lq/EaeNq1kc9KAlEUxn+j02QSLcJKgsCVRIsWERItIvvjQpwxhsmFi0iGkkpFhgyCVj1FD9C6p2jRI/QG+RCBnXu8gdm2Bub75nznnu/MORcHyPLsZHGPKrWI1fg+6bDRTi5u2O20bntUceUMoxFpIYeZqXh2KnZZxys3jwuUDsNI0K/XBINyQzCs+4LRaVjgQGtcrUnjTTh4E5mURJk47vbZukxaMTudq3aLfcVKb9BNCBQjxabiuVaaJyWO3z4mGrP5Z9tH5zGYYY4cRTYpsUeFgAZnesIj5JpHnnjh1bq9WX63HkPt5/A5ZtnmmPOWi5a37YQL8ub0y8HX3G89mNIX7VR/o5rITG3u60O24mvP6g99KPqJ1dOCefXBbjLHmvVKMS/5Bwbc6V0usczKf6lfp9VDUQB42mNgZlFk/MLAysDCOovVmIGBUR5CM19kSGNiYGAAYQh4wMD1P4BBsR7IVATx3f393RkcGJh+s7Ax/APyOYqZghUYGOeD5FisWDcAKQUGJgB3rQ1DAAAAeNpjYGBgZoBgGQZGBhB4AuQxgvksDCeAtB6DApDFB2QxMfAy1DH8ZwxmrGA6xnRHgUtBREFKQU5BSUFNQV/BSiFeYY2ikuqf3yz//4NNAqlXYFjAGARVz6AgoCChIANVbwlXzwhUz8jA+P/r/yf/D/8v/O/7j+Hv6wcnHhx+cODB/gd7Hux8sPHBigctDyzuH771ivUZ1J0kAEY2IAZ7EkgzgV2GpoCBgYWVjZ2Dk4ubh5ePX0BQSFhEVExcQlJKWkZWTl5BUUlZRVVNXUNTS1tHV0/fwNDI2MTUzNzC0sraxtbO3sHRydnF1c3dw9PL28fXzz8gMCg4JDQsPCIyKjomNi4+ITGJob2jq2fKzPlLFi9dvmzFqjWr167bsH7jpi3btm7fuWPvnn37GYpT07LuVS4qzHlans3QOZuhhIEhowLsutxahpW7m1LyQey8uvvJzW0zDh+5dv32nRs3dzEcOsrw5OGj5y8Yqm7dZWjtbenrnjBxUv+06QxT586bw3DseBFQUzUQAwA0roqpAAAABDoFsADMAQIAtAC6AMIAxwDSAOoAmQD9ARYA3ADjAO0A8wD9AQYBEwDYAKUA4ACxALwAjADOAJIAxQD1AL8ArACuAEQFEXjaXVG7TltBEN0NDwOBxNggOdoUs5mQxnuhBQnE1Y1iZDuF5QhpN3KRi3EBH0CBRA3arxmgoaRImwYhF0h8Qj4hEjNriKI0Ozuzc86ZM0vKkap36WvPU+ckkMLdBs02/U5ItbMA96Tr642MtIMHWmxm9Mp1+/4LBpvRlDtqAOU9bykPGU07gVq0p/7R/AqG+/wf8zsYtDTT9NQ6CekhBOabcUuD7xnNussP+oLV4WIwMKSYpuIuP6ZS/rc052rLsLWR0byDMxH5yTRAU2ttBJr+1CHV83EUS5DLprE2mJiy/iQTwYXJdFVTtcz42sFdsrPoYIMqzYEH2MNWeQweDg8mFNK3JMosDRH2YqvECBGTHAo55dzJ/qRA+UgSxrxJSjvjhrUGxpHXwKA2T7P/PJtNbW8dwvhZHMF3vxlLOvjIhtoYEWI7YimACURCRlX5hhrPvSwG5FL7z0CUgOXxj3+dCLTu2EQ8l7V1DjFWCHp+29zyy4q7VrnOi0J3b6pqqNIpzftezr7HA54eC8NBY8Gbz/v+SoH6PCyuNGgOBEN6N3r/orXqiKu8Fz6yJ9O/sVoAAAAAAQACAAgAAv//AA942r19B2AU1dbw3JnZXmdLNj3ZLEmAABt2U0ikg9KrCCrSBKlipXelI6ggYkefKIiKzmwWCyqioCIPCz7B+vlsqFGxEBuQHf5z7p3ZbAryvu/7///5ws7uJjPnnHvu6edcjud6cxw/yXAJJ3AmroNCuHDnmEksOBFRjIZPO8cEHi45RcCPDfhxzGQM1XeOEfw8KgWlwqAU7M3nq63I3epUwyWnn+gtvsXBLbnbzp4k2wwyZ+EcXH8uZua4EkUQa2NWnishsjMsc8dka0Qx+GrxR7ZFahwGzlyi2P21iovAq0Py1AgmM98qUMUpVkHyyPaq0o6VZRWRNL/PWFDkDQqh2/ov6993RV8T4dKP3Fg1YEBVZf/+hllnEvD8q4Tf+O5GjhMBgp6czIVlQzRORM4slsjGCJGtYZkciwt+zi+WxEU/54DPBbdiJCVxM/vQQj9UbKSEK+3olaJ+IYr/XPVU6OGnQnB3+1p1Mf2H4jseHvUi4JvF5ZHJXCwT8I350zKi0WjMBCjHzDY7XMc5kmlylNTwUnZOq0BU4Wy1Nb5AelarQCRuEOlXgjs3D78ywFdGi9UBXxE5PyxnHotnUMDkDLeSBmD66Tt4iLWkprvfaympMfvTzCVxE/stU1hDJGYy42+YREuJ7HcjPnE7/UIJkhK5InNP159+G8X5S6x7un77WzleyJnuGj7T5AVg6L9G/BceW2PJMMNFmrvGmmbz4t1qHH47/IKb/ivRf334L/5OgP4O/FU6/Su4Z5Z+n2z9Pjn4OzW5+m/m4edCdzcvIOZuCUmTnZOb16HJ/+Tumbgm5UFvCH6iQhR//CH6E/LiT2XUGxpPDNV1RBq8Y/AX8PPuT9X/dWbgjoGfD3xs4OufV39O7t1Kqh4kD6nj8edB9Y2t6mRyL/7A57CkHOEmnW0vFhnv49px93KxtrCicnFUEU21sbYiUrRtG0tJzA2LK3ujSqa5NubOxI/dkgU4vH1YdhxTcqRamcs/JikELnLcihuI72Xr0wY+jrdm1163YoK1CESUVvB7aRGlA+yANjnA89YqubWkiJlVVYrJC+/zYTNkirA1OEdaK9gaQIWoLy0aqSgv60CKi8rLKirLo/5c4g+VFYUKjH5fmpjLw34x+UPlHcikuqWzbph7df1FtYd2PfTU3pPXTxh/9QzCbZpU8c7zD75+lLywZN01oy+59rKixb9vP+b7+NOM3w8s2Th1wqhpY4dOWXX5zve8+19N+wVpY+Amnv3RsNbwGuzuTC6XK+GquM2MRkrYVhsTgSpKuq02XhFqKzpKlAq4lGz0UrLVErka93/cybB3uhVfctvJZreSB+/asXft3EoE3hUzhr0AyOJzAvY2MSsXsFci7eBNdqhtDpUSFWGgUFaVki5JHiU7pwqpAxSJRtJyiM8YKiiqpKTqQsqKgDReEiCFDV/np3yLlJv4+Lr1O3euW/3044O6dR04aMmAHvwbixNVZMRTq9fs2qF+98TjQ7p27ze4S9dB4rA+K3buXNt3+WOPrrrwkkv69btw5Kg+9fniDX3P3Pp0v1Xbt2/oc/POHSt6j7p4wICLRozoD/QTuJFAP8lwgMvmCrmO3Boulo4SIwsJmA8cZkEChk1AqgiSijJSjlsuQl4yumplY1gpclGWakeo0JTtbsWL5AH5GYXXIiPQQMiqqpLbSTWW/JAbKCTbPTVSRmYBJVZ+OhAro0oOS7s5oz0t1JpxEzBQB8KoAmzjIqSiPOo2BYLFxvxWlECVxGT0+gLd4AtKqJHXPHxJr3flB/95xbSJJKPLv5YcU78Zfr86VE3U3Txz4Qz11bx506Zcm9d1ZM8+I8jaq3bOmrHloifeeGHd6HsG9lXj8+5Q655MTJh9fN9VS4aTuWmj+eEjlg7MqBxZNWw83YPDhXpio3K8A0pxTYQT2UA5SJPfDWIcucTYILGHP58p1PPiYnU+3muZ2pF/2DiOc3NejsgSJazFWat42B+UZZLKgJEXTG5PwFRkJcsW/bKqdMPTZvLEvaWrfl3ID/2WPEj69Lx1htpPPT5SPaIWLlrdk/QjD+C9W8O9h8G9PaABiOwNy8IxxemqRc5WnEx74TMqPFK5mw+TyrRMkkd8VmJqveXpu2/NK132yzIzWfDXavW5WeS/SCRA0sib67LXdFUPqPPfHfyZOlHd1QOfk8UPEmaBnnFy1RyoZ1SmLnyYhnyNQRRAB/BMofHhuIFpMRA8ioEHMGwUjEqDEBUKAwavyUaKvVmVpIOrxkXaVKiHDm6Mxza9I7baOZtcqj5845OXqn9MJ/lq7WTipuvRm9skthWf4WzccKpVTVGFWGplQyTGEZR+nBWEIuHwkggoCO1h2XpM5iOKxV0ri5GYxYrfWUzwa1YLXlo5S4niYEtQHpTAqvAHpZDUmyz5kSxSV/zI9/qM3KnO+EwdQhQml7PV58gY7gfQ7IWcbAnHRY0nrJTqRlhRUHKKEaluQXQDXQlIRZOTmLKrS8gnhEy7+PTo1Re99PT0oxfi/frwFn4E/xbsygLESSGmWvwhshhWOJA+ggPvrxh0GP19eAdvOXAA/3b12d/Jw4TjrFwbLmbRrRz9gsg2tDMUo6OW/tjpLSr07RUqWN2/V+/+/Xv36DZr0KDqqgEMP/7scl6FNRY4iQNTC9cYIGGPD5Ao4fkuLyf2Lza2P/UvantMO/ujWACyxAG8B1xhw4dLJl0KIyLZlNedIESYsFXMUq2So0lTxSZWUa4od3uiEY/X7+ZDBbyXSsNKiW5y07Qffv35B+GHX378+ecbFsy+TrhuwdzrBH5EPakm1erb6jv16uvqK6SS5B0++PxrpN9bL+/ex3B5DAA8awARw5VyMQPKOJ4iZAKD7JgiSrVgVyIXGAhwgRkgEg2wbDyDpzAKjPAY3ynvpBh468jpAeJGes9hIA66A74Z3Awu5kRsbTq2aXCRRm+YxiH3ZVLEMwDxDCYfTfBEk5caRA5gQa8JL71OeHgWfOvNAHKINiCHYgPKyK4qOU0CzUtVSVlXwpbNRIBFy0lXwiSgf9j8L+54//eF69X7+Ufq25Pj0y6bPXHOzcJvK4/OOfrizJ/vVpe/uoOXZj8wZOqy2xcD/ENgvfwAfxtuIxcrRvjRqBCLERSwV0ENICpe+MybRcELWMBmsxVngfq043K2peYzmAuEmgsyofYDNR5aueVcVBJuuHaHlVxY5xKC+x8UpWjLKkY1YJLkIGIIdoTcCrQCvpW9Hjk31ZwoKiHl0SSKoQbkwbjwiaGCVkPqbpp5/c1rVt22+brlM6+7cknd3KMrPj61eOK8xWrdJ++pv5FV4+fNu+HGRfvIDVdPvfH60dc9N+WT/VfuatdGXnDgu8+Rb8tgHS8FPreCNLuU+QiU3eNWm5k4wB6PKlYTyhYq48zHZHsE1w+EiW7TGoBYZrqEZpA7KOUALSugxVXJRJIdiBBBsz0EjBSsDEqmMn7Wmd276xK3/EUWe8iHwof1o/arL5Le+/nx+chbN8HaVANMOWjzZSXXJiu5Ni5cG4+lNu63ZrlgQfy4ILmUzQhIOG0p0oHuecy87nbnXwq1ql0dnLJzn0HxBE45Ze8+TnF6O3QgNU6Xx6sZtQQcMAA+B5co5vCD9q6S0z2wlsiQVlguxZFOWTGaS9gi4d4s9gI7CiBSPH4fBwtz0w/ORZOuW7xufs8rKl4dIjgTL7a+aum7357l/n1QPUXWTr/+oXUr7wtFS/nP3lMfqVb/+OIz9dRXuB6zAfdKw7Ocj8sDfybm4Zj4YDvLZK6N27M9os6D+RRlPyyHNYJ+RSZg7QKswalQMv2SJ2ayexB+FxgsBoQ/O51tKGA3K7XM3FwQFgakchJ0DiyMSIWbYjWbzCZjM3IP/xaY/cwr/1bPvP+x+mvdmg+XLJs+dGUeH72YLCWxN4WPDy5Uf/ngM/UE6fnVwy8/TMzbLx9AZQQIdrEC1tEIMp3JHeQshUPQTWGUNBwjtlDFZDoJkQuFXxN7zvIXiif2rz79gXgC7bSpmmwNcEGwcm/mYn6kSpZuorU11cYL8/0WoEoh3rodpQqsvmzEXVgAF+luKmk9cFmMn9mBSO3hgwIjfbpcLO22ZGbl5fuZhQYkAuMsC9bawwH5CiXFJcBrW49iN1Y1t9CS25GSrhwtW2/yauqi68bO/OXwW79cM+6GhWr9hx+pZ+oWf7rwpveXBmfumXnNnqvJhtl7IqU7Zuz5+OM9M3aUlj83a98XX/5zxrJF1169cgUfnDRnzqRxC2cjb4w5e1r0AB38QIcruZgdqeAwa7wBFmvcm2FH3vAagQoFlAppsB3S3Eo2bAMpQjVOCNBOA6LHbHYH8ka2FBPdIFwB4wz0bqQqOV+CvasLW07yuzlDCOVQJShLnlnolRS3MbOObfiU8Or96oM5oQ++cS7Ytu/rX5ZM67cstOK9xcLB27+/WX1OPdFbnaNeKbwpvPneTcTx5drHRvQf948DuwCfm0FvPyAOA9nj59o3aG7ZF1acqLfTUG/LtgiqbQQftXegqfbmGy5v1hT5wMYKXbgvqdh5rgPYLWvgmRbYYdUcGImKAx/l180W2eiuKTS6naDP4KG2sOKGh6ZppkzM4qCUSjVnUp7fQbdsemsAJC0c8cNU26Ib94iwQhwM+wJsC54wVUy3A24D4ncQfzfhwkSMH8xnvEJm1X39eR2FfSOZJPwsHKNxokxmJZlrqVkiAArmsGJJWkcEfjYKY+sfFsaSSW++SR47dIg9exn3qPC5/myx8bMry9sTePwyfnpiizD+0Z+/++pndf0rHH1257O/CXcD76VzIW4OFyvAtcoGKwvNX8Uv1NZwBWD0ysYokVsl9x9sO7C2FJurtqbIngE0zcMwkxuNfcUIvFgIr3mo7gU/ONc2O1A4O1iAXOmRFIsLeZLLRuPIQ3edpv5cxGhCXVipCV+/V1+CgqLO/In9b35x98Ke/Fc992e2HnP5yGm5/bt17993RR/xQuXtw89u2zp/wO0rt77UukufsRMnXFxfekE/GrJCHCerFxjfMtzOVXA9uac0Gy4HPGk3XlTbasEPVErgpXtYCcBLKAxmChC+F3WDmHssF7uVfOZIo8nfW1M/L5zOQfXjlLu45a77lKz0U3LmPq4mM6tLV1Q7JHlFFVAxbE+FtK7CnfisTfSESsKRTiiZzB7FEqSGUQns1A5VSjXGJ6iGzSStohHRIxjBbix2EnS0KzxIloBgxP3q4YIFIm8yekR8F8DfaFVcVGikm9mLZJxs/4zc9McpMiVmt3+2d3eX6Or+m+7yuJfuv2bETaPKvCsnLzdK6ivqvgPqkZjFfgvJe2fEs92LurwzTVU3jx7L3+ToP6xifG77SPja9eQD4iG7T36iXqX+eFr9970DB/7y5jZivK1tz8Rbr3/yFLmerDmgbjjxq7rtmdYFa1t3/ODwv35fs2HcxeSE9wisAyg9Q0/QGyaQDO24GIdRHyHKzBKjmQOzBHYjteupMQ+7gEZpSjtGwTAPCkHBGxQ8fNFXfLH619zE4Tkvke3/Msinh5KL1V18Hn8F6pTNoJu2UR8uDTTtRPYUEPO11DZW8oTaeCCN4+FRAWNS07rstWDxyS5mxtrgXRZqE4OdqVwDyk8zLE+ai3p5ckCCt3KeRzYgcFIwIjZoi8IgKojiYLlu6W0mdX8S/uqpc25ST/2ufk8y5q76Tn3vrzkrF978h0F+/cCkh9rlK4ve+vTQnGlfGfbMuPLq8bifJ4Nu/AH2ZQ43kkU8FS/g4M3UbdaYAdGxw2d2A35mt6BJzmwlNyDgpoFM2RJRAvDOHEGLCbQGMKAhU/NIyjzAWlwg1IGgTeBn8j9qRDOHn7yJSDW/kqL0es8dtz6q8Du33bnFV5+mvn/qKfXP2/l1a94m1Y+rp39+4JZfa2/68a9V99eqZx4lpUym4Bq8B2tgA/lfqu03u74CfoFpAIDTbqehFfSfTXZdBVByenKIjxdDxZpGQiI+9QopeeRR9Z3Xtj/6xlH+7QOKQX5SPXC43zvq648fOlU77MRpKgfx2QPps/toa2+BJ1P7RIS1NzA2M5hrqfeMQQo7c52pW20BtxpsLuZDa44zc5rZz2ZBSQzkRyYe518wyIfVaw6q3TX5i8/tSGPy3dlzG55pNtBnmhFxa8vP1B5oa/LAzcIDifF8/8Qz+LAhhxJ3sWdNB974BXgjF300akdLgmYtWOHCSn00qxkcG39alqjb0XnMT7VTPxX4HJkiHd6ZIjFvOmUrP4CQj54auGdwlyxqPPgl4Pl03aiMiIEQH6TsAv5spRQsD0pGNJH46aQzyaojuTl/tVVPPa4IbyivDlff51sPUb+LPat+cw9/5w2kP7nxly+J6fcT1/2onrmU5OxLvDdl+nZSzuhnSKfr1k2TDCYmGTC3IFgpBQUhuWq4R/kI6hxQcUBLykD6emHyBL1bIGCCv6W+PjHbICce5seeHsqvTsxnNNwG/zxI4wDBlPXCYADeXoC74Y8hecdt9Shp2N+2P/uj8DX8rQthdXBsmWOiI+nHmOmt3MxxsScdFyvcUUJmJ1S6cw0eITwADc2i9vU3zpw8v149c+zrv8iDs2avnivU1wtH/vhG5zFKIzvuKkojc5JGRHYk9xQfUZy6Da4I1qoqhkIlCVpIkJiAKuvJ4ySS+IrvrL6v9n8UqHPJLqImFtYf5Wc/rVbr/FwEzzLokhqpr9HIqNMoJlAOFsBVRAR14vuB7Hca5DOZDXvDOJ3K5FHavYzWqAa5GKUOKONMxe6i3InEMtrRZgNroVa2hJmMwOg0L1ptNMaKyMUEi72KoYeowZJ7wdXwSptJX/II2Ub61Geow3erF2cAMI+IV4Cm+Jy/+cxWcUJiqZqfhM0QoPv2Io2mxhTIGrarxa0IDCoaALNwNJIiC5JsqtIpbdYoTZD7CGW+M4nEXHh4neg4PVS0nPmTykeQ7YZc2L9u2MGdNQ7yWWqZSM+yJPeqBM+V3CgXEQS6NQOwG2MG0VHVIMPzRU/Aj9ISNmEl7kpPF1KGUSbT5LuIl0wi3i1ks3qiRlF/uKv+he2P7X72sUee5/nHhx8lF+16Qn356LBj6ku7dpHuH/2inibcHwNPguV/9gdNjr9PYwhesJxSpBqoorjFRvekBfekj4IL7A1GvWx10yQjKk8/cqHXJjVSlGIomEGokiwqDm7m2/9G8tRvE+q/SOnqW29for5pkNUjx34C5vxu6bw5G3jM/50VDZnUPwpxQzTfOUOnVz7Si5mmaXbdKaKwOCPUEM1OA5K5PQY0P62S4qDmZ4ZHN7CYGmQ0NAVMhcZGdCxCOo4HOipxpOPyOacfUQ91uUhGWj6/Y+fu5x7b1piW76hHLtu/+XcH0vNH9Q+k5x+qevZ7XS9+RvdBgJugcZuVcZsSAJI6XJSkDiRpelJauyKawKYkzdDks2IHbpMNEgadFQdHw7Gyi9olgSZ2CfEHSSOSc/XEs2EJ6aP+qn6qfkPEZbevXKH+bpC/PLbptfLEPxx8x8Q7fP1N181extM90h/0zTqgfzE3k4u1ovIOvdNWSXnnpsFQkA/pbvws3Ye2SGuapcuy61k6tKpYLs4fUYLwzhdR2uC2Bn88Llrdua3ovk6noZhgVaN4WStMv8EyNU6+ad55Uf/EI/esWLlafWjqGyTv+N0/ram/beWitZvJiLfHq7U/b1X/vIM8t2jNjEvHT53eY/Gb8tfXvbPkhpumjxs646qbdlz3zAez30aZDmsjU9u0mosZG2IaQq0sRNAJk43HcAFiBiMNqYLSjhmp5WXEGHuDh4ZSqL24XK0+I359+PCZbPFrSsPFQMOX4P5urlKLqxo1eSpbonrCBEQqJsrNzAil7pQZI+3OKpZ0kYAe+RkEXjGgs7h+8+2kVb36wZ+n1Y/J18Lh+sime0mZ8Hp99Dv1V2Kjz0WbO4fGarpoeHE8NbtpmBj1k4PqJxRuIrjE+GyBoJlopG6akco5eDrVHSEP8ZNryA0kLfEbMMyZDeKNVCkS0Eic8TjVTRu1CIbFBjIeHxYTRGM0mtRQmkI0alafU0uUm37pQiN5QgenzO9TrBmnDLJt355XTvwyk35u6aDYrGbZus8JoMF34j4BnGyDFd2sZ3hBNFistoYUNtwecDDbmZiMesGB8EZJyEJCpWe+JGnvE+/nZ1T5pPqDerwO8NgjXnTmObEvyOjiMx9RfNoAP9RSe6SoQdfyuq61h6mxofAo90WmYS1UvdL/tyH71T6kFYnAf63UvuRV9SP1DfV1/jP+vcRJ3pnokCjg0xLf43NM8Jxj8Bwz6nRTo/WxhGXTMapxrKh5TCx2r3CmRksC7GYiGWQI/Jeupqugywfzsfqpie/4dLw/rI64nuq3DpruNem2osAMUmp1KiYUIaQKLBl4NSI+5SSIAYegfyj/a8In5iWcgvURsfvhh87s0fT6CvVFPtt4K+BQzmG0wWCkUQveSKMW6DybHJwVc2URxSDVYq7HSktE9O0CpkJIivpXkLsffVR90fTe3lM7X4L7+s4uFybpORqucY4GV9H3Cz/+F4N86l/wu3b1RbKdwtCVwsABDAI48BoMpmOwfeNG7cFuGtQnsJfdOjCCHl0JgM4GYzZo37EDSxVWG0ft/asDw7Oc/0gop3somTNqiOsAZ4VspJyUPEHavlUT4z/iP0i0IW+pUfa3wtkewt00K52p21GmWnqRglQUg8zCnfUzXqZ/01E8wluM+Df5HACIeVmnqNumcd7BWRoyZkFvqCPx7z9k5NQjqGMuB9v0jDgYLIs23Dwt852Njy2Ax7oJXJiNtTEzldNmO7gIQnG2G21rm577UPKARnlu1J1oWPu0LEceRxOtcqEUs7mzUZn6PEo6+pKKgLEcH1zKZkn20ghjqwuaZDcCki/gDxUVN5QKVJbD15cT8vOdY8dfPL1uzj8X7/1SaPOX2z7rsW1v140Z3Hdp/vLVa0h41/N9Rlx1cffL7rv05V1q+qZRUt5F8/c8fNHFF11weCzzNxeBbI0AvVxcFjdFs1OoCPKAmjIgzhl4kaHnwvScnZvmOxSXk7rLfjSztNSd20WlruzHIACi6OHoB4ohQwtro6GLsXUJzIZQQbHJq0dPQwWmRXXTYq9/+cVre6fbAz0evGERv2jOVlATifcWqR+rfznr1WNrZ5NuGx5/Mk+W17GclfA7rFl20tf3wGJ5qK/vSQNFg/E8moezUdfOZkIccljoAnBwUeDRn0tzoT+n5AIKfheKpqSvz+EaNHH1nQA5N4SYv36lznhcnHvFnGVk6bzR88Tj4pxDs79S/+D9GX+SNl88O2beE08Vy7umD77q6cmkiNEc82wC0NzJZXDXsxhvA80FhDeAFwHqHxgb0oUavD6A10AD11iUYnFSIx+zhD4EWwCayxbMZQDlLaxUJ4DBa1lgto23DOyzAJrZxcnYdaWE/Dbku/1PTq/71D7zmb0/1C2dfeeFve6cs4wvPE3C8/i2p7nrVpDIyUefX0nevvkFisfFgIcNaO/nctC29NLYu0ljmyxTbTzN6jXA/kgzsFRU4JhidtfGAjRHFkDVj4EVcwCgdrlpKsmhXTLbkvFIEHNKLDrHeYPldBkuXvzlLf/1a6KL7YG5O6Yt7/HR6m/VL06Rd8w3XDVpIU9yH+bO3qp+o6pXrrp/9eIJM8CvudGzYPF6jtkq/DGjn/NhZs9LbRWAVnZGFc4ArBzBAJrRzKLfXlofgAkSRyTmoclZjxuTsx7q8iMCaTSzR5gJaUQTEkGP0jRIwAREzSEsydf+0YPx7n2Nrcuf+vTTOmFVfGL8gGevuWZ8vH6BsApoOVwdKdqBlhlcK24RFwvQOCtwgZGgEYAELTDT2LuE8YhCyg+ZAFkm44e8JD/QeH1YKcJ0F2pYpwvFjVQjSLYAxkuNyAUcdYZkV5VSAB6GwvmrKPQN7FGpOdXFlaz2qAmnDD9x4Pnptk/UP7+Y+9UFN173yPz1057e++vJlXPu6HPhHfNW8oX1pP1NM898e/SPiUM3rVy+tN9s0uGPbS8sIZ8u3Mtk+3wQ0X/BHnBzgxpsBMo4mL0xOBrkjZQib1DWWLQyAbTwLG6JoWNwNJIt+V4gOZUn0vy6uc+Qyw11E8Zu6gty5MA6dXaiC7/nujE3158Bui8GYG43HKX1oN24mBU5woYcYQ6zQglaEqrXg9ZYaTGoQ2LFoA5rSjEoTYHpRaAAxeI+K/r2XdHHVWe4uFP//p0q+/U7/bVYfeZ1KgPO7lYHkJXwXDuXxg3gKOZoT/CwyH5w2fHJgbAsHqOJZU9ENrkVhw8YMayko/GHhr7Lj3uGtzLdYmAJKhNdI1g9WLHiBoAGFJXOF+oefbBX15cYWF9bVojbzkze/rRk/FMDj9namJ+EdbFj9il1XZJBEqkhSGI4R5Bkcd1AUgLW2zXkJfVb9eWrjVz9unFkmNolsZa8e636IDwHN+NSqqezuaRKp3Y80BZ/GsJH6+uM3GmEbRHYyfNhj+Rw12n2gCMNYyG4RSgBLbTeEcilR3NzGNfksEBAmkR9XCdhK4jCJ4elWlFCGqrkNI9sqpKdkmLxIGlJJqJn0tAL4Jam2QONt4wmb0iiPLbouOmG1z8aOudYzdN83eVTL57mJ3WGvZu6iNXXr9y+/fVXElX8vinjL+ubyOQPvjy3/hed/wGXRvyfxAQ3wd9zvlsD3CJR/icp/B9ozP/HTfP2k+HGusuuuqOvWL14o7o4Uc6/NGXiynpV00VdAA4X2FjdtXiKV5fhtEYnKwlFiqLHOIGfRsQdTN2Y9JgKUIjLIz4qrvXcL+qWJV9v/oRINrLw+Jbj6om6dX+s3TB/7no+y/4gd3at+k1t1UP160jH33e8tO/5R/a9xGwTdbxYqsE2TvOMULs3kCkdVpsL6zCifnRHFN6lq/UkqC6eUQtsEjtN+nvszCYh6XqqnS2wbpNkkDS9kMG06HPrjOde/+LrfbEZPbfMWn7TvDt7qOMNH19zM3gmp11n1KOzE2f5w0te2Pvw3oVMvwPcPMCt6fck3HaPnm1IEesBpHEj/Q7LjP69Ls/9VJ6jfrck9buRrTrFIqnfjZ7GAjwkNdPvr++e7vywbvrjr35ft3zW7RdddOuslXyRStounXG6iNRfR8J/bH9pIflxzh5O2298HPBwcGV6BIuw4DIlvtWaFI8OzRqkkVNrI1ZkahD2yHfGS+8vKyCl0R3VYvX8Dc6vzcsS2fQ5A8CGOwTPKcIYSYjGSAzgZ4UaYiSUUPBZgNreAS/qhWIaI8l06zESN1WGJka8fHjnjSitUVZmshhJTojGSAI0RpLfqFxFK1HGhGnjEAkmsMmAHw3zJo6fNOOvi5/58ZlXf66bOnLoVWNJ7rYhJw+sfHcWuWTkmH4X9Ohd1vrSHetf3HfPRWP6d+3UtduoBaM27R7/GMXPfPZH/gZDD7A5JnIxiWZ0zIyLwSGmdocpotcmioha0vYA/qXJDq9emyg7IzGvpbH5YWeqXOYk4GhqfkistIiuvN8Yys8g5ljdyy937Na25OJB6ndgfhCTeiqeeKRrpfXFACnnr6JwzoV1+FOsZjIJM08s2GLQgTU3BFskGmxBYtsiilWTSSYWb5GtElaVKgab1hxBoy9MLVGbs2hu3RNK17rjxhmvybvJYv6lxEVvLxUsZ16fvuRthCMNZOPHAEdK3IU0jrvYG+Iu9r+Ju0Sz0MNMq//u+Bl17b/E6vrTgpEqYMIFOc5wGJ7RNOZCmsdc3A0xF3cy5tJlwIktjWIuBhZzefW5E7c0i7mk/3djLgB3FnOOQ8ETT3/27BdPnlA/Ovjd1wfF6kQO/1XCz/9w5nX+20QGxSUP6PUd4NI43kL+Pt6SRZW1jeSRkeozxH7obeJUd8P1bx9+wBfyfvV+MinxQ+ITcoN6K0djBQOEY/AMF9VXbDnQk7dhIETL1ngbVsXLsjU00WCyWNHlFSRaQmQzMWMZuJUFYgAQgiK3PBCp6EbsxHj8UyKowyeeKO/e4YoxWSFAuYD/7EyB+rPnRaHXkDHMfhwOOO8DeFJiM1gRRliQ4D+KzQznCxPHhSGJo3z3B/kPDtybKHiV3buTeje/0diFC3ClrKLEwILKfgyIgH+LpWU0mOz2s2QUq9hiIfFIF9IV67XBUzSl5ZC0gKmVUF7W6RVht1y6y7gL/l+qPmjipdiX78c/i6zvdPrDL0Zf8dXR0502TCTjj36Bz39KPUkuoTGcAi41tda4rFyPYsCuemqHetK491RPrMMG2GcD7OkIuwfcBYQ9Iyzzx9C59btoaB9r4vy8ZjpLHi3HEKgA/V1Z1IXwxZW5JIf4ov4C7EAwZcniM8+IcukzsVdfrdn9SRV39t1vR478/h3ubNX66PHnD34R++K1F45HKe1mk+Xip0IYaHclJ7vCmLmNmV00YmID8eUL01yYT8BPfLQUlkbr4wFWKhJo1AiENLaheyjQxIMZIwueKkXwaWtJi1xyeZThUSqreZTds5/Z3H/lxl7FvUa8uPfW/ovv7VXUaxDZ+cQnF6wouG6E/O9Oa4NTR1A9vUrdTO4RB8G+cXE9OKaOLaLOz1jVaQSzH35kV6TGaaSWv5/a4E4/428nOqwWoUqz/vWipyLYvN5VfXv26Nu3R8++9vQj6cI/KwcMqOw0YMAZIvJnVL2PxyZaDUVcPnctJ+eE4z6RhtWc4biBXhE5yHJZEs1l5bCgUjYaBBE5m9q0KH7TGUMWYL4mBz0+HxLLh5dZuVVoz8asgXTcggYQACbdu2YNOSyuIZj0sAbBjpwiftLhZw9ufV782jRn9DdusnT+ZfOMX4uvbTr47GHek32U5Bd88Xn2h/ePn60e7Cvvmjp0zVvZ339fQPIYXmPBh1hk2A9yCWRrBu7NTAHrgWPGZN0FTQTYMc3OkQyjo0R2gyLUTPf8sJxHtZ/XTj1yAdW7CzOmlI8E4BqMsfngE18e5SOPhfYq6fYx1p34BNQHacw4tWOZEHAMNVGjxWUV+UlFHwj6gwGfKWgK0qri4rH3mU+TLd/9Pm3sZVMspFJ919Sdf46c+XZ4cYmJH/nGyUPff/zcuGk3Tz35hrz6kkOHLNeOfp5jdYjHDUPEX7ksrjW3lMUOFX9WNKrkG2vlorBixaBqG9oRkc1YHRYwBKwuMVZvi6sHMNcQgykL/fSQVGO2p2XiJXzqcHn9yfaYGh/HviiS4NddXry0emqMZruTNst0I2DNVBZXUuurMmACpjQFTKh5i01eXy6JdCVg8hQ4yZjVk2bevuHW+/a9et/GWzfPuPKWW1c8+M9DW28acs3eT/fOnPnSZ3tnzll7/2sHH73j9o03zt688a4HD71y/4aNq5YuWcEvmPf27Dlv/3R49uzDuOawzOI+kFlp3CyWo9Fj8XG35OQc1Ddz2zDJGff56Qdg+vhsaPpQT9d5DNZecdB6m5jDicvqMNGCkpiTBgOcPngH1j26vw6nHs/3N4rnw1r6WRYJRDz+l0EyyAXwX7o6lzjUbWSMuq1e3UquhJ8Mg5xYwS9KVNy97i71X6T9XevuxnVcA7J3JpW9JlqhS6UvDcjj3hOwxYm+JMPwUUmAnzXHjx9XTwpZ9ceFg/wfCSvlicvVInG94QAXBjvmdi6WhtyfA1oqh7ZG5mQAQu3DWMdN5K6UAlxEKcUge0T2Is/nw3WpW6nEtikwQorcclv8GCMCYAdlRpW2wOwZ8NMNfiMfC63cWKHd3SLa0nJC7curOyNntPXIrYFUOWD37uaIt215Z8okgUo9QVjcgQd2wdpdTOY2sYCReTBR6PWl5fH0t4uKjZefvH/N/A2rXnhx75idPXoT7ze/EHvdxnkLb5lHlr96+ROr1ZPf/6F+/sfEO2s63LjmhWEDr46Qa+aNGzJodGX0mntnPnd5ZM2kxw9/cXj6snHDR4yaev09Vz932aTnd73+kRAeNjJc7g7PHjahkz+7Nd1X4r+FkOEwZ+YkrgqzFLIrqghWZCR8IaDjaHwGGMfAJADWQnhR9QsmFM5OrTg5koZxkEL9YkyvOb17z+lFDvbG196GkZHevSf17t2RvXA06zDq7I+GL7X+lQruORYdintAXYglNA0Uz6DX8fIOVtEBL+ybDuW4vB0iINzyi+kX+eyL4nz8ojiEWq+Saj0X64dy0cR7vIS9K3ErHUGyt4rEI+yDUESOUH8We2ixhLIToNmxRPJ0t4DEyLAW55eV40pHJFmElS7uACttNDnh5lrvHC10cLMyB4/bI+a38pSX8a1CBaK3kdsD2j5NU6b5RaNeIAPIMtL/hRfU5159RX32xQX3EYl0J967t6g/bXtQ/fnCl7du23X/FZdeMWXq6Msuv/9pdd9L/EeHyOVvvKFuV69Wt795kFxOZqtPqp/veJzk79hOcp54ROWuf+roo3eOv3jNnNlzVg278u6Hj7KY+Aa+RsC+w0yuFXcTSBBa2g/iIT2M5aZyQTguUCJqsc94FhOi1oic5Y7b2BtbGLPk+VRNxj1MrmIclFatO9NZCa0/DbVjTjqmXVA9FEi0oJ06LzGrTarS+AWTMLgPihmBJF8gpCVgWP7FSTY8tmvyrB79dj29Zu29mYo0aNGc5U/Pbj0ia/rAkcJd18yPLo2WOqfetHGFemDCsN7DF868tFXGWtIZcB3FrRNWCjvBv3FwnLecRAVvSHsZBYT6888dfdgL7/aSVep16vVklXZB9etSMkd4VSjkDA32qd7lRt1HIw0cCn6whwXdh9ZqjLCTLSQtFXod5Bc8oQ4j4v+uz0xstEc6ctXcoXPvktII3Qyl7Bt4B6CVZoMQbBOJ51bT73K1Nb6ghd3Rkb2LROSObqUCFrltJB5kn7WOyMFGG6QzbhDMrAmwnnKFFINdggZQ0FMjhgqLqCYt9aBv4irEzyNSzM+F8KraEzM6gxoT/M2+kYJo65lyYcdgbo4WWmZozS/FofPunbUk454n5/UoM1nvc/QctPW2C8f0GbPhvLun/h5h+OrFs7vlXLutd8Bd8NDAXurT5IOuFRddQGjPn8EjjKW6K5fTSjBstcmL1EQwrOFq/gODZ+tW3HtLhaf5W2ANLZyXG8G6NxUv/KWDpjxttcwrNtIgsI/OJ7AxuttY57iRER0Dbm5MJ5jRIFa8aBsTA1LSQ/cQ7UzQlU7B0gdmTL/37qtnuvuVlV944XSx/6dbt356H+kytW+f8rKBVCaM44hQJ9ZT+3y03tthqtXbO81/197pTrZ3+v+mvVNq1t6JTQLjyFUfklHqzg/V54Vh/ItvkPnq6jfURWRF4kJgesJ15u/jY4YXwMe5VqMWGDIpPg16CFZbbXPXRmLEwuEHRonWv9gBHokaw5LDwhweKaAF1Vk+DAMqPkkxSlVVDT6Gi6edfnqxf+edq2+7f/qV68mNiftJzvUVZdU9xadm3bPsxhmTR12/eTExTOnVtrxnBfJIJX8bv9OwB6TsbWClIuwSwC7RIlbJD7AX0Ar+mFigSw5wpeO2VNkr+yNxwnDy6T1+4FXG89hnWZGYiZrlJmx9K9JqNpX0AthdeZKco7WMyXlVsg3fyrQ5PqViqThUHo0kM+AMYZPmWFXuubBzty6rrhi2oqJraY89j95827bVdyq3rX5CWFpUXtn2KnLThFB5cWjiovnT5kbb3Dp9yVLA+TrxCN9Xrwng/rYmAIMR1+0nfvUH8QgJY1kA/P0mdbyYJ1ZzHm4448KYixYhaaFoMG1pENpLLREPC9d7tFIkibVamz0sRmeTaLzAaMcgJFtSYD2a4dSjY8XSppP8ZdMfu6Du36Yr7pg/CGPNiRUbbp4veM68PnJGpdpV6yMTRtL6wkotRsaarm0UJ9HBmWApRD18DFdxjn3GhbVuX28ZF0WOB+F2IbF+Q4LvDf1G/VP49Ch39vRQ3qz5qLfyF5KdwnB4DugGlhNLNhCj3eWopT/6LSt0D/jW/qsGDO7eYyB/qHrw4OoL+veHe81Ue5A3YRWcXGe8F5ZBuhhEBHeLKyzb4Y7gWtOucCSRwNOAnoVGKLBzUqCWa5SxQzGVJDPzFduWJ+8z9ezTZ80tFVmbps1ZG27bPoR9PfxDPG+oYXFEWn+kP4p2+Wqt6edq9GVBHRpmYA2/y8i13ufFxzfNrT/BV6N8msvHhHYgN+0sd0ILg7AJxhpGV0fLSsQdbFs4aB2iNgWFJiVQQMYEjMhpuRNwSxsNhKjUNsHcl0nFvhcf2Lr36TFDB48mY4YMHiNm9H1o/6vb+z64/8DWK6+5esLQCdfMnEztZbAt7tFti0qvECV+EmUvY8CiIPnq529rr+vIbeR2dYFXXZC8wDUXucs4zrDc8ATcA7vQMmDP0Ew5hqXBTU+zYQwpluan3cwgwDSqouOmSWBeq1loicbIlF46VEQz0TC5rmXUbVq7My5BjDdRle2VYuAH0/4n2jav+L0s6YEN0Db4mPPERAMNbxAQk5aqhgWjkzRYm60/VB6sjJabLsM1LGITM8rJzJfGjXtBvffJPU7xYbasZ36g4zF2kFNq4V3btt11Mg34dSjGig1PUXoUcG/o3j2gnBdWnCAs86i/mmdL0qIRIUJICPBzW6YFhrsKGCEKmKHDIgIxKZvKZOxXyabKIjsdyNNKI4/CA3Vo9h7LVrOlmNNvYT0HaNlaM6iwjZkkWm3k9CgGEX6dhmONZktVYyJZSMtqZShleEasF1tQMY9qNPuO0oxsbUnjID9NAfrVg75sxbXmoiCvElysI0qsFtRPPFrWMd1RIreLKlGgb4dIrCyK35W1he8KRPwOkE5VT3GbFT9NqqhO/10VhbEk9LfKI/FS9nVJJNaxFL/u2AYoXqVpsFh6AbUV8yQlB/vQOnpiRW3L8JNSSS4GypdFgfKFbahPIVdUNdNySlZx1X+q5yzNWXfKuVQfuYYtUTCFn4Vl51CHiaeaMTi1tXqqS4VHaf1JiFumZ9e90Wgsh9aeiLVyAKSakKwXx4wfiDQDEgcLp9w1RaY8Z4mS6auFnU+bGk3a5BetqTGTpaiBfjWizY21KIoJGDluzc4JstEvBbrAjZZ1IxXdSNRJXMTo13xS2sBHkhUNPe+7YrCV/4ov7zfl8isvu3R6Hf/zq29/Scr7rujTZ0XfR7eN6Xtj+aKNQ6ZPmD52zKSLlXffFFdoIVjq29N+OlMFZwLr0tm8o87e0FHnCrP+fcJSxqkddd6Q0Lir7gIsJ1yf0lpnqlCP1Kdje12jZ1pbeqa5hWc27+KzEW+QNO3km0tNltR+PrJeM1+Sz62E5+KEmWbPlRqe6wuzvgOCKUVv6nPBPSX+ULGpCcJdies2Iu3fcmfPFKSNaQ7iU7+33X9/vYWinoShHcCQA1bYgqYw5OowYPULiNSaTKffDOYTqtEgzliI5zCXI5dWc6Ah7WFeB4a9c8yUcWRJihMb78/DYIiHZTdILp1OhZl/M528lMSI7jjkrEBD6qBJk2TR0nFV/ygrqrhz6fjiqmklmUXlfCqamddsubwqbL9mk9TZXtWh3sFwFTVceY3e2VgDcA6Ko82TGVVsVgyP07JE8zEaBHWwcSgZ9lpakOgABGMEfQB0BmBl5AxQkAYPlfjaYik2LA/wZTRBkoW7vCnXqRhGWBjsFkBruhYJ07Fbz0JhZ17jr+DdWlhMx20z4CbReQzLmuLmSeLmDsfTmYWX2+BB5IdlyzGcEYeL6Xejusd5Ww429k3xW9BpBLzkLKmGd/uwXwnUF6AHeKIN7atScjEEbnY4LTS6paPa4GMKsEeSbqYxFdtnl44bs2zx+AlzAd0ZPTuEe3S7slsS32sfX7jw8Xn1rQHdfuEe3Us79OrF8Wf/4DjTKNqv5sG6PLT+ZS6qWEx6Y6S5Nu502xFnpwV7JO3JHknwBzx0lAyoedmMkVvJXYsJdEcU6yCxhtNir41ZJN0zhX/RZcKFFyU2molZox7AM4TRba/2A/gC0lahl/B5YoHEt0p87ePvql/iUq3PkXZkfpZBfk2d+ppacYCMUJ/kS/g1rHdK7az1xbbj1rFq2Xgei8a00BErF4XjxdqqtU/tjcVURQjcilDTNlmcDtfWLXmetRu8mbl5RcUsj6EE85FNM4uBh3ODGGVR7Hlw7U0LVFVVna+bljS29v++uZa81eAMnLPRNhFLdRO03qKBpi40zjDkfJ2v7vN1vkp6ixudrJXaAUtAYaR0wda/hdoi2Qtr6sLkdWN4+vzfgKcpHKBBUuBIPKFpDw0Qo5OqDh2OrgCHjxt2Pjj854MjTaOLgjM2mkKkq5dU8ryr65YGyHJ0xcLp/eoDTRYKXw63+O8hxO2YFVVcVmxX1+sDzw2uzLllO92zrIERg1uZdlY0aEHX1OmtQoWjuDzNsWmWbUhF60CTzEMSuTsapyD4swfBAX8I+ABzUW3Bv0SbOZmQwtJQ1q9q0QtCBUJBEdAukaJSJ2SvaD3y1amTrAOXx95dfnHDPVO6dxuSXHaa3VIEXCyDSUMvKoHxQbbVn06aGjqfnP0n3HMB8IkZPGFt2pg2T9WB0h77amnRpd2CDi9vYg6voK85RkDK9bUO1Dcs8qmv9L5h4ezL8IyVsNb4DD/WUSWfgs68l+WEXBHaHs8eWWOwW8CE4LCJLowJohoH/cDD2uUZLwpGkEZYRqe4aNac5owcdLSGkNSdiLv+pgdbva/r09ny6at26kFKkk0N+SP+7J/An79Q3ZEDfjmrrXTrHUQZwJ0E9B44O9lRDOHLmYwtnTRsibI2IxJzU8/SnQ1OoJPWvjkxIudm1oGF8SOlZWrrf1DyagMjSwh6EJYXGiYAqGMS2/559O0DyvHj/PrH+QXJOQD8erVr4peLTpxWhz/O9r4hAPaaBXT8Lc26e6kzAFZatjuARRG25DQIAKnGCqtUgq4WqviG3t8anxFHAHrZ595w3Neg9vOsrCXYKymOAG2PadwaLAckxZrXuEVYaMmA0/uG2zSz3FI7iZtYbihLaF8x2ObYV1zAdW2xszjUUmdxK62zOG4QHXlBrRD873uL0XH4u/5iM27c8zYZi6W6ff//E3YMkP4d7N9Q8XBe4AVCZYcOeyWFvfgcsLduCfY2qbCH/jO66xLn7xCw6ZLo/Di4k9pIx6Md4FHElWEFCMWjrY5HR0st7G2MDtaEArlmmjEgcjlFrBj2hlSMe6aI7Y1iNx3EhXspy9IePs9kn2eGMe2Je6YCtVGR5HlGNPgcuW07Uvc5F8NCUlHSpEolRIvejnCejvefm22iNX/XAy/2aOwPPdS4J17UaMQDjTJgrUu5hRqVcnQqtbJgwlfuEFV8IM3bgjzsyBpdkEKZWH+FbeqZNMdLydPekg8ftoYPW4eV9sAVESzzz0TjUsSQoJIPEqTG4CjpQCnkw9hY6/bnopAm7htRJanLm5PnjKbIkzQhbzCd0BJtaphiqL+0MQutbNAXhBvEHRN+FFeBPcN5LaTSgpE5k4UMIp3VA5vJBaTzZvUA/Ud9jVxNepKeW9S99B917xbSQ30ZZcG0s/8wFBh+4gLgZbfhrtLqjUM6hXMsyVZFnF+S7qYJGvA4aZ9iOkc9LLlI2m2SvIYsFAmyg83vCeHwYi9mzHMkJbMNqyYzWVMMeBqX9zJ6FptClUDJAKFDALDBDylaPG0L8cVeu23UjjseQDLGH1kxeufG/Yk+5I9Rq4GAjw+etnN3O/75XkdJ76evuq3uFXX/ACTggC0/7Sfj31kmVF8CREv8WIEU3H4D2jO0N5zKPh/OWWjeHe5vqTs8TTNvcLKbWapxerw+TYI0bRRHWd2oWfw1FM4tdIwbu1Gb+X8OD3ar1zglD0KCMUNvi/Cg7d64eX0blbgtQGRwa3Y8g6mS7rtBLcGU2RJMWboJKHlod2rcCeuZQYHzsCqKlsili9hGMB7UZWpLUOY1sukZrExGFCTnqKZAiwIinwmI7Iiu1wQUEIIuIBqQqMmzmc3UcKdBSU3lZaah/U5rxalEyMzTE3GNcWlmxjdC6sXGdnxLqN3ZtKiIZz3rwB9ox1Y27Vp30KZrcKiNmsWMjesx3mqncZ7mzeuojFMb2E2abd7Qxi78nOLLLaEzBnzYb5a0++M2B/WQbKbauOBjo4JMSXcOZ0LyjkgER01JbEot6znwYTDXpPV9ReloEq3+AcsfNtf9+hvxqD/Vnfxj8cb1C1SDrH7308E3flbfJz/f/NkKHmTdGljn+4x+rh03V4PGpw2wlNtoNXEs6NBOqsVp60Ws/L7GbiqCBQ1JdNQcgFeTSz+QADAMP4Rw8LqYHmhDh1ZKMV9WkNIuCzc7fNQGcyLp2twbLebu5P0+Ooye9jvqLSF8eZnW/yOtOf72Cx9kXZjWIzbso9eHPlHUsf3SigmXX/TUsCVXDH1OFIcd++mFnV2vvL5HcbsRm9cOeOL54oz92YUje3UcvWbN0EvfHDRswp9nHkHepv3lRo5aae25Fakd5kXn6jAv0TvM5bwwkTtQklDs3WgB6U3mYUSd+tbAyoDkbps7O59G1Rs6zUuA1WMctppXsckY/0G3OQ1xn7/jfAXKxAfP03ZuuFw9Uj+3ofc8lR5tmtLj/B33ckmSHs2b7sONmu6RGm1L2jNqxNIz21GWKP4f0COl+x733nk78K9lsvlv+/Bh49NIvU4PQi3hCEboGuhRci56lCbpEQR6RCk9WgM9WrtxP+j0KAN6tMbknz0vH2PIHaRngCbBgsJiRpSa9MwQGyFT+j/hkmRy4PysslpXBZech13E6mQSYWqSaTQaGf4AGpVx3bj3UmnU6Vw06pKkUbuwUggmeMfCdmaaRyRyd0qxcqBYuVsuw7MvNMc1Lxwv06qcIrG8MprgxWR3uRuPe9AIW9PGdwHY5621MrRwvA2zz3sAvS8okzy73dkFhe1wTiUlv5wOFO7SnMJKO2ylzCur+g9o3bIhf166X9vMlpfOtwBdG5vzV2urIGprcFjj0wu4x/6bnFoUlquiSgFo8HLQ4J11nq3Ja40avJW9CffKPrfcCUNxUfgmGlY6gXLsgmPF8/A4DSwBiErwpBJk7E66tPsf8XGDC5CkZ9L+PxdhFzIzYF6SmkM1e+AcVJU1R6CVtvuf1Y0Dja7GsVQeRsEXfu2/KREj4XglS7h0Ccfba6H7bqkiEox8navLUgVmTamvEPi4mn1VHcZMOPJxdyBzWQkb3Fkt7TZnF7gjVI6W6nRuQYoqXSpBCbcNl5Zo5cf/qUhtSOEUN+RvzitjHVpSx6UldM4jbe+jaZ639AwPypS+Z3804uzhNiBTOnO72Ox7uSCqtDfWYq2Ai7CzdMxgnFRH4uXpxS5HidwxqpQb2ISrLpTGbYHGbVktAVA13Y3sjR5WBZ0eWqt0xfSIppQ6SjGbq1iboy61okWqShaWyKV5lNw8pGz7YpQJ+FW6VMPlti1FKWIux9G/djq/HJyXZKVyUbJUOVARiHhyCJ2a0Y3QsRna7Fud0E5Cguwv+v5U+/K4S0ffeDLx2r+vXX7w/Z8S/Sx3r1o7o0u/i45cn1jf49gq+eDJMZdWr2l/YOo8fgs5MPOqiUtJp61P9hk95bKe3k3Pr1zNq4kf1t6ytbpge6fu/xg0Qr67x5ALSo7w44g59/oF67R5J2pnbUZLSTLvlKvVBzefziIXhuNFGvO2S+2LxohPgb8Wy2Qaj2zBYEkbl+R5VrR5MnNyaX0v1nXnUzpinCSWk48jlBVbLlx70Hmp+vvJLk2yTn8z6IWMTkk5tTj0RZ3QKN8ksLkpYPdgbVWQu7zp5JQ8MMUz2eSUTGCwtDAdXJ7Fhqdk0eEpWVi8ilPLzVnNh6coaYbk2NGWh6hg3cK5B6ksRWtu899MUxF/VY8kFDZRpTE+OYDPFX8/CYbasQUtDYMJacNgYi53flVjjPIQo9zzjoVBm+zvRsNczIKT5xwQQ97TiiZ0nAjglMsVYfS+MU6tAKc8hlOeAYNWtB89n+GUT3HKR5ywAd2cD+LQ5c7MYkfGJZFKR6TSzo1UQ8nFudfqZt2c6v836yUc0U2pxMNs1USGH+hwhl+Ye/A8GOaE5fZRJQN0dhsQeKVhOY3NJ2QNF03QrmlnxrhcMXxfHFbagb4Goahk4TBJG4bx8XCBGofXgCannO+JFbTpUEVPhIq52rbHKzO2Mv0n84Aa6hsYjZLquiVizWGqerlGKlKmhetaYvE+TC0nxiLB+JHJnFyc48h6wymaPyvWc3IkJScn1Z4zITeQJuTqDKfUI2cq6CgYnrsNBOQ07X5tU6YspObjpHPn426r+5VVK8PdxENaPu5ZuOdkw+nG+TiSko+TzpuP65fMx9WJH+ncc6ZYn18jnH0CnnG94TUtH3eV9hSsQcYGLZMVxy9oD03TH/r/JiN3iZaRq3NpCdUhbLFOf4XQGgbr9hXPTQGe725sB1KqBKUUnRYW1AIOxuQhGbmgbXLdNFCUph2JkYuAOZzAmK2kZ0Sr0e3NpIUpaSw4xiltguxsF1HS+pLRzAkUFZuKK3GEEjZh0skidJ6Efp5bMeXYKde/vWLT9R2XHB785JKHB/ykxAffqy45vn7dl0vqNlxz7VqSv3DwklvI+3d+u3j0zgWrZ94wvO3+yOp5M6eof6rXDt+untq05Ms1Sx47uGuWp7TTY0zf0tky4CNhLmLZOabLtJCNKNYHvSh8UQQHzmAlKtqDUjhl+kxNphnWTE9EtNbHTBlyqxrGMCm5JJmKaDaQpsW8XaMpNQ8081WazK0Rv26Wv6NzbOgcOy9ItEu0zEJAl2bZJqxH0ocDM6eCdlvghBgUYD6OtU9mSHGD5PB6cHktLAvp1ktwmo630aIj5xhxczfu9ppzzLkRvwIV2iM57CYVfjy3cFgLk3jk7CT8TYbx5GvDeOIGR1Z2LoVcUkw59HAbg95dce7RPKg1zzGeZzlTmOcY0sMLDTWGDH4C8ONpGFdo8Gfr8OM284T14lHt3KtcDX6sDs1AJsIDheRcabfB401Ld7AliJl8fmoNeAx0hVpYhpTwwznW4j5dnE07x3oI+5MqMtIwgkjHC/aSiyvkSnE3Ubza6Hh1MKFqxJr4moK0HDPtm9KzVkUS7dktxKCCm+0kdzheyK6KqDNGB7xk4C+wFB/NX2UUSp5nQDvmtG7D0lY5mNhzF1a1hPs5wgHnoMPyZjur8FwEeaPRFktUJKkiajQ5rK11O6zmbL7agbDcNqp4QREURfRYLqx7jTsDnXy/PZUDatpYcjXPv1VYaWNnsVxkaeBdkLkxhwHDuHIbj5yNnWXYIdWqzTnokXThdRokbYImxLiNKY5JGgXIJM0caLpVqzSP/Sed7Vcn4/kC14u7Q6wUD8OVC6z5Dhz2fplEquAIzWYqXpENeBKPYfu61VGLM5yzGk6lSRkb4U46wL2E3xKL2Ik5vfprr/xF77+vvls9cGB1Vf/+QscbBg68YYDGo3PFLuIL1P4u5KZzrD0pX5+HkoXB9CI25ZtNQAtpnUnF2rlHihdUrRySdhtFjysjl+V4qOzLx5pSycfqMW1ceiF+J3r0PgtKfJr3kyj9U9N+Rq9W5o5kn35pn42TDwDdx1zed+Pkt+u6k5Jw1dz1O0qiC9dW88VI8ILb3r1H3Qckz73jnS2k4v4r+QlpLyV+lfY9v3kM02t0PhGdGUgnKbU4oQiUVTLH1mxIUWraz5RM+8lWT+q8IkUierio6dwiFPips4um0Vxg4wFGhotoviUV1nHngtVzHlhNqSlBq6TYvVUpcHoIxaQFODFJ2GjGUh8Wh24MqRjQckMMVkJzbtPPBas3nMwTNoO1carQlJIqtHpidupuN4DtPSfYSUGeCvvVydxhE+iLGuUNKQ4gk1je8OZzYdFi8hDHq2B8UcsdNiAmW91yHn7TYgLRwBoaU1mnaTqxEXbN0ompaI5vkk1sguz9TWoD2Twmzd6Z0HQiE90EvpaGMvmbDWUCz1Tysl0NRk6T+UyyrnKbTGlC16P5pCZec0Uaz2sSDzMrgeduVseLlZqNc0nKXLyUUX4ySZ3mp/DuSKTpLD86nFebLKxN8TOkTPGTzjHF7+a66fJrX331Khvit3wODvEzPZT4YK76sXra/ad6RJ/it33PQuAnSl9NxwWx8rsJhUG95TH1lhWh8Qz3MVRqNcTvRhfHyzQAvPiTxKeKXsm1s/Pm6PREEw5nzZBou2EjwjMdl5Fb1RLxmzFS86WobcxOTdfEMKwpP006+6OpPT1PMISZOI9+8pOelaWnxdMjcgz6yXo2pw+jAzZzbZPzzXAKNB4LZY3EXDkYE3BZ6OwWuMAmZzT32PwFA4tjItu5PPSASfAc9UiPxIpKGspqg9rxEsl5hqZJG4ntsYU7hCuSxbUP7Ji/Q/1z86+xf0ycesPofzxN+ApS/STxbPFpVba+O4gj/soRh9jJ+c6LsM6jz/5oPElnfrflImjfYbBdTo9ivF2WIlSD4uya1vC2NBIvcWbjoUAlOFUrmhpZp8ddu1mmrV0exiKNUnq2s7CEJaIVHx3WWoAzCfyZdCgTFtqUeJQ8sOsUsXWy1RRjkoGupCGIq51MhjKES85sAewNWhB3NHF9fmpVj2dnHvspMdK2cfZlt/UZ0ueteX+uX/XHV+rJk6vmz121et7sNQJHdl8/8ZJ5YN78RcLKiLFETfy45patbSNbu/V46inS/tTje57ft33vnr4Z1y5YS2Uqq1Xg6eyVTLTyUqsVsPAcyGS34mEUdM+ygfs1TqPJXMLOfQnjMJYaD/0gYGfb14RBB2J3YTjWw+b4KAEjBiKwdaWhzAGoiWdNBqpSCx6as35q+cPnTSurG+ogxFnN5rsQbrP4udAL9J4ZdjjKHkM0zotcGgaeAXSrPjSP1jkkddNmXR+JnzcoIMItED8RRhl+BxusG7UBjTZE3GHWpsPTQ7tS2l7AmY5bmclPIx9+jHw4UuaINTHpFzR3ib9q4gOnzvHgGk3p+N98dzc/U9wkdITvAs1mgzQMk7hbOM3PpLMROvEzDavO+/udDIO1358o5pMtxkxYg0Lamy+K2I1PD3CAzWX2swMczLgMIivx1KbrTSRThiwaLYj568Yf6TZo5e13M3ijIkeuAh1D72cOxwXtDG4LjsCjzeVW/chxMzv5HOeg+Yym6OXC0WmDxEHLN21dN+UI7bGPqMfIJO5Q6r0sKfdyNr1XgN7LSUyRS4SPyeShny7dfMfKMe/2RN13tZjP/0zxlLielNssUQ1Z2RHRxxgBvnSmO46B8NMxRjrqbNCvnDz8SidDVL+4mtFjYVOyJMnDc91Fjt9HaUNhMIdlKaoRSLYzGBiNcJQSntTk1GDQUMSqNAttx5Iaka5Sv+hOafheY0o2UBTpEFFf5R/nznIWzoMwACk9SRiQDl6dtggDHpTpcrIJChQGi3ZMr+yixopOcqMpBQhK/MqO/fdfKn48edgvax94c8/VN0zqMfjWLf98ZuJ/9cHaI97I9xY+4Rzor9l0nkuyHh1pGzfTMy60FzrZlvXow97UmvTXzJ80Zd7cKRPn88faj5s//8rCsXNvpHJz3dnfDa3p2et+Lp+7UDvF1ZcXjdLxCc6MSCTlJPagfhI7nrGBGEuOZKFztqMWGxwbn+7aqsXLddr5qmSJfjGz8ZGv/Ru9IH9fza3jo3RWQJDTRqvGDXQaBs65xBI6Q8q+o/OJrm4ymIjuuRFwn6zG95H5iHarhvsQvI82kmBEsxkEODfw7Amx1LAfLJDVXCyfGh5m7Txjp1Ab50i+xQHSM4rTbHB+gEGkH3ijYH+jsqZmSOiYwhsj9Hg+cFyB0ul0jnB6AEwQTyQWoq3mIeyiENkZV+khNMQKqOrJYkaI06BPri2PlofKox5OG2NsNGkj5lgOwhjK54SxTz65y0HaJaavzJ581V0PW8hEnJ2q3m/cdvc147LnLTvLqR+bedeGZRu4syQr762CJx+B66eeDB7OIfkEz+iaKWwWR9Hzk3w4MZEiTOzRaNxM90XM4JQiyDJYrqd9RK85luzHDLQfz1iKG6hGafmYJdxPsBRa1wWGP10NrZfobLp8ODiA2tUctpva6AnITF7jCQZEwpm0qIRDgjSTrF83m/Rbe9PKldcu6rrIMGzcOPVC8oLai89Wl5PFia/JbPUWMkulZy5gU2wnsRPsjHIWjcYJLCYANOU6OeKUTinRXjSN0VEKSniDMweZDEmH+wWMftAwWWiVpDGLjfp4ipQRZSOVvREaisF652zMVmFTjZ8OCI/56fw9vxfoo02xQPqAVsbZglnaMSbpqJIdJhr5UGx0HI+DsEoIk35SOAhfHjPIJjY8LarTSUp/lEx/dc3QO4YUrrvh2klHj9bxU/DQh/5Ln7miIPPN0gkTetNzH+oXaAkVdoZWO8ApjbuGneUN+oF5rW6Gj4fiQ4+mCNBRtDwrjnFFYj6/PgUz5vdR1BAfWGGr5jYhXlY2NLUBi5TTKjBbYZDoMPuG8yrIBwcWkN51k/sfYCdWTHh2f+npLEM353Oj2aEVdC0AbuMdAHdrrh33KKucUAra6FP5nblto2w9lPxWETxcA9udAQlqM7YPy8UUjyJ2xEZxEZ2Ph8AX0SAVIEePKs+JxAroLi7It9AxGVgK0E4v+SyChTKawZxsU4Det49mEpX0AD0UGBMRlnQ6Ml0xM2Oy8fEcwZbWMKitY8OpHWSWtqJFa26kK6qurxPfTj3Jo/niNiwwSdKpmLuHixUhldKCGpUUZ45Go7xQIxp5I7T3pYjSqJDRqKgQ6VCENCp0o25AGgUljGfEgnQoRjAPvgsmTzxgZROFOo0CQYl1UzemjL9lyjTni2Cjs0yAKqlcAjRJIUhThmFM838ALf9CqgAAAHjaY2BkYGBgYmBYVO4VGs9v85VBnoMBBC7/0AiD0f9X/1NjD2efAuRygNQyMAAAQY8L5QB42mNgZGDgKP67loGBfcv/1f9XsoczAEVQwCsApcUHfXjabZNdSBVRFIXX7LPPjKkPJhKlmUgEakyoFZoIhV4plPAXNeOaoGamQhkSSuIP15uWGcZAQgVBkEagL0oPCf08hUJYRAS+iGS+1IuQ9RDe9kwpF3HgY505Z8+ZPWvNoe/wQS5jA9hUOoS7NIZGXkYdD6NBL6FeJ6LSqEEZzaGXPiJFDSGBO+Az3mI/PcZpysVNlQaS+mZhQigVioVjQp/QIRQIlwQ/JaHfWMUR3o2T3IVRTkOv+opcKwUXdTlidTQcfULGOXA4KDTKfTsu6yk4lIcnfBW2jpL5CjiWIWuTQlDqEz2t4w1Z+4RCXpS6LHRrG7FWJNJ1DFJ5CRZ/QAllIKCqEScarVpwXD2EIgcZsmcN9+EGp0v/AaEI5fQZNg+hTN7bSVHoJiM0w7ZoFIbNdam9hk4ekVr3udsopgXRZBTRM0RwO66rn9ij15DMJpLUCqJFy2gK2USYFE3QpejwvD+AIHejgWdQqx/BL73uM/5gkH+jRg3Ab/pQpUZxRy2jitvQ43rvzS2K/5Ho4UJcoHXkCln0AFf4Je6pHygQz0YoBm0y36vGpZ9l+PUCzpmHUWJWoUm8z/N83wFrILTuZuHlEAblhd65WYjOC690dejXVg7bYB/O6gCavSzC8LKYk/1W5Rtd33fAfIMzXhaSQzgUH5qmePlX40MvhOc8jqatHLYzinweFJUswvGyuI9+V61pNFg5OO/2pL7BUV/QpeYAywE2lYJyRlaE/H9gTTQg2iJr7jn4j07FmJmObOM16o1ZHDXeI1PFoVUl4JSKQCbNY1A/xS33WWpHKzWjwt1Xzkat3oU2zpbxBPbyLGzrIGzYfwE3Yc4WAHjaY2Bg0IHDHIYljH1MMkx7mAOYy5iXMN9gkWCJYmliWcByiuURqwFrFOsuNju2DnY29hz2CRwiHDUc2zh+cIpwmnEGcR7h6uDaxS3HXcO9i/sbjw7PNJ5zPG94NXjjeFt4L/Hx8CXwLeHn4E/hvybAJuAkUCZwT1BI0EmwQHCO4CbBJ0JMQjJCVkJbhEWE84QvieiIVIh8EDURLRDdI/pBjEusQGyLOJN4nPgh8W8SaRK7JP5JGkhOkzwhJSBlJ1UnNUfqjrQREBZJ35OJkLkhayObJMci5yT3Qz5Pvk9+m/wVhVkK2xSZFP0U1yipKbkpTVA6ovRKWUk5SHmO8j4VN5VnqjvUDNSy1JapvVCPUz+j4aKxStNMs07zkJaQVpPWGq1r2hzaSdoHdCx0pul80Y3QfaVXpTdHX0Q/Rn+Z/h+DHIMVBh8Msww/GVUZ8xifM6kyNTN9ZpZnds3cwXyDhY9FicU8iwuWWpbzrCSsKqxuWLtYn7MJsZlmy2WbYLvNTsJugt0rewf7HQ4mDoccjRwjHGfhgCsctzkecbzj+MVJxsnJKcNpldMbZz3nOOdNQHjN+ZfzL5cyl2eufK4VrlfcMtzeAQBOqJcfAAAAAAEAAADrAEMABQAAAAAAAgABAAIAFgAAAQABZgAAAAB42n2SzU4TURiG3xlQUq0NJo0LV7NyYWBaVEiEjQ2hxAQJKQQ3xKQ/A53QH+hMAW/AS3DNwitw7QUIXgG3wcK1zzlzWlui5OScec/3vef9/kZSUb81I282J+kTO8OennPLsK+CLhyewf7F4Vm91KXDD7Sga4cfwhlpzumdN+9wTnlvx+HHKnoHDuf1wjtx+IkOvK8OF7Tn3To8r7xfdfgpuObwTz3zR3leqeynDl+r4H9z+Jce+d8zfEP+/g+tq68TfdZAsY7UVqpAr1TWEivQJt4+9o4ibu/VU1MhqIKlw7c2fpXYW8Q3QuuMswWzxusGO2UH+mCtsYbqWu4RqKM6/Pt4//MEdzT2beQEb588TRUhdWSVLHNbG1f2Zkp18Z54sa2rzk7RrsOK4Jhox9j6OrzTo3DqNu1pgrv0u217naAYo9SzdZiYJnvTR5P9Fr4mlp7tZwvOENyyHJNL286jwuTq8LLb9JsFLP/uiJlWystVlVjndoXo/NUK4Q/Iu0Tmk5oJli3+gnVtaFu7nItOc7Jrk938CG7QJRPf/FlLll21HQhQiIgasN6yy8xllUmVOV9zjqa1Yus+JDsz6dTmllVUHevu6hRvjGcAt/MH14OSHQB42m3QN2xTcRDH8e8ljp04vfdC7/Des51Ct5M8eu+dQBLbISTBwUBoAdGrQEhsINoCiF4FAgZA9CaKgIGZLgZgBSf+s3HLR/eT7nQ6ImivP3VU87/6AhIhkWIhEgtRWLERTQx2YokjngQSSSKZFFJJI50MMskimxxyySOfAgopogMd6URnutCVbnSnBz3pRW/60Jd+aOgYOHDiopgSSimjPwMYyCAGM4ShuPFQTgWVmAxjOCMYyShGM4axjGM8E5jIJCYzhalMYzozmMksZjOHucxjPlUSxVE2sokb7Ocjm9nNDg5wnGNiZTvv2cA+sUk0uySGrdzmg9g5yAl+8ZPfHOEUD7jHaRawkD2hXz2ihvs85BmPecJTPlHLS57zgjN4+cFe3vCK1/hCH/zGNurws4jF1NPAIRpZQhMBmgmylGUs5zMrWEkLq1jDaq5ymFbWso71fOU71zjLOa7zlncSK3ESLwmSKEmSLCmSKmmSLhmSKVmc5wKXucIdLnKJu2zhpGRzk1uSI7nslDzJlwIplCKrt76lyafbgg1+TdMqlEZYt6ZUuUflHofSpSxr0wgNKnWloXQonUqXslhZoixV/tvnDqurvbpur/V7g4Ga6qpmXzgyzLAu01IZDDS2Ny6zvE3TE74jpKF0KJ1/AS9WoRsAAHjaPc2pDsJAGATgbo/tQe8uCQKSIriySDSK1tQQEpI24RWwaAwSnuUvijfgsWBClnXzjZh5sc+N2N1oyNu3PWOPrq+5bKeUdg2JA8K1mxCXp9Ygq6zIkjuyy+ppjUz5gwPYYwUOOG8FF+BHBQ9wtwo+4C0UAsD/DwyAQE0zCtVhhDbcmLK36gsYg9FMMwHjs2YKJmvNDEylZg5mK80CzJeaAizmmkNQaHYk5BeCvVStAAFX0nfWAAA=) format('woff'); -} -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 700; - src: url(data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAAGewABMAAAAAuyQAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAABqAAAABwAAAAcZSXcVEdERUYAAAHEAAAALQAAADIDBAHsR1BPUwAAAfQAAAi8AAAWio0zBc9HU1VCAAAKsAAAARQAAAIukaBWGk9TLzIAAAvEAAAAVAAAAGChxqztY21hcAAADBgAAAGPAAAB6gODigBjdnQgAAANqAAAAEgAAABIE/EX62ZwZ20AAA3wAAABsQAAAmVTtC+nZ2FzcAAAD6QAAAAMAAAADAAIABNnbHlmAAAPsAAATtYAAI4I4JnRwWhlYWQAAF6IAAAANAAAADYOE5tpaGhlYQAAXrwAAAAgAAAAJA9kBe9obXR4AABe3AAAAnQAAAOqxEI//mxvY2EAAGFQAAABzgAAAdgQHDKSbWF4cAAAYyAAAAAgAAAAIAIIAaxuYW1lAABjQAAAAasAAANsKuiEbHBvc3QAAGTsAAAB8gAAAu/ZWLW+cHJlcAAAZuAAAADHAAABaFqXPht3ZWJmAABnqAAAAAYAAAAGd9dX0gAAAAEAAAAAzD2izwAAAADE8BEuAAAAANP4KFZ42mNgZGBg4ANiLQYQYGJgYWBkqALiaiBkZqhheAZkP2d4BZYByTMAAF4+BPEAAAB42p2Ye3BVxR3Hf+fe5BISyOPmAeE10yKvVpGGhwEKaiuaAH2GYHjpMFTrCEMp7bTjTMc/KoSI1Tra0jilJeUhlDxkWvIaxQQanNpWCtRKeMTUABrCVbDqjH9l+9lfQrLZJEzo/c1n7zl79vnd3+6ePRKISKKslp9I3H33L10mY9Y9sXmDTP3+5kfWy5wNa3+8Ue6TONKIMRLiL7iFu9C6TT/aJMnrH9m8UTI0RjTkiUQkWe8DydLUcVIUJ8PeSbqHmESJl9skj/hEScBEJslC4h/Fxspj2Dh5SkpkvGyXl2Si7JQymSl/wXLlODZXLmHzJAhP1hbdTdoSeU5+JbvlkNRIY/DzoEQOBc8FpcGfgreD94PPQzmh3NDC0POhHdjO0O7Q4dDp0Gly9NpucnbZoV4jZ2632Xw3jLzB51ISataaA1klSYTpJkHCMtG8IkXmmqwyrdyNNO/LveZTWUtMIE8TF5LF5iOedsgMSe38SKIwydwj080M+pchi8y78oC5KnmQD0ugAAphOaWtIOdK0y5r4CnybYGtUAzboAT2UMZe2Acvw344AAcpoxwqoBKqoBpqoBbqoB5eo44j8Do0QCN1HYMmnp2jvS3QCvTcHNXwH/SriDF/uvMMY59LP+eZSzLfxGSBaZEyOA4JEmea6EUDOU7JRrNBnjQbUeXr8kdTIa+aPzCeI9HgXkkjVZuslXSNSSFmBDFXiUnGEnlm0yWbf/IkiqIdPG1G9w7Ns9FUUfJblFxGyUcpuVHeNf/Sll4mPMt9Bu1MZdxSu2uMono7qrejejuqt6N4u5Z2kP9yqIBKqFIl2qWZvGfhPFwAW26phiUaPk/bF1N2keTgIWmadhhj2YbmbWjehuZtaN6G5m08HU2uxbQmnZaU0pJSWlJKS0rJs4nWlMqDZrT62kGuy6ECKqEKqklTA7VQB/XQpO25m54mUeokmSJTZZp8Se7E92bKLJmNx82T+bKA+ZdP3UvlO/JdKZDltHmlrGEWbpGtUizb8PLt8oz8Qp5lnr0ov5Yd8hspZXaWSblUSKVUyWGpZu7USp3US6McY54206fzKBOE39B5GmEtGCc54VnhHeEK2pWLL8RTfwYtmEwbsigti3xZ5LczwyXqYWeMi509LnYmudhZ5WJnmEueR77HEo8Cj0IPO1Nd7Kx1sTPYZY2HndkuWzy2ehR7bPMo8bArhMtej30eL3vs9zjgYVcal3KPCo9KjyqPao8aj1qPOo96D7vCuRzxeN2jwcOuiC7HPOxK6WJXTZcWj1aP0bqGutj11MWurS52nXUp8zjuEU+pJyjpQ1KfJMVJYk8yR6ezO82FnfA7+D3sMnatjzCLR7B6zJY5rClBeOWNWR0UBcXslMmhqfJtXVVdkjzsautiV14Xuwq75HnkeyzxKPSwK7iLXc1dyj0qPCo9qjyaPOyu4HLW47zHBY8keh2jpzF6F6NHMXoRo6UxWhejRTFaEaPmGLXFWE/tfuJS7VHjUetR51HvYfcll3hJNVskCuegBVrB+k0Mv4nhNzH8JobfxPCbGHuK3c1c8jzyPZZ42N3Pxe6ELnZXdLE7pIvdLV3KPSo8Kj2qPOxO61LjUetR51HvYXdpFzvTFsu32INXycNoHkrMsTNt2PaES/IF3oqFWZhmWs2n5oS5av5srpmT5nFTgn1m3jRnmUND+uGrNnwTLvfEfXKTDGm96TTtJbjY9c/bjVBv2iA1vddz1aHhv6HceX7VdJgrpniI7b4oQ/yZD9l53V8Gb+H90nj3Tebv5mdmhqmiX6nc77chPt9AmGKeJKbEpuvsNPvR/nDndXPdFJmpxBebF8wI86hZa47wniem0IYyzOaReJNCzEzNOccUMl7rOyeYU+Zhp+bYIL1ovnkas8dcNs29GmvclX6pVAmzul/8VtNocqwvdF7p/I+Zaf5rS9RH6YPq+gP1lJQBn+2Hb5q3zIXODb3ehGfmDWnEOm769DTlfOL7YPdVtYbTzNv6v86m7vHbU3jYe+YDTg6Oz3U966fQ93ru2zRsMDE8LmrKGIeolnb2Rj7zODuYmGzSXDFvmMfwhKOcOPp5ffcvudfX7Awg/GFXGt6DhR3enQ+X+3qu46Uj+7TfTfM3WnHkxthzAorqnOx69irsU+/7qaY5beYSvtIn/8fO9TX5P3/msyGl+rh/6t55bX1w4HY5sY4f9E1/S609NKRU1wdQ6ID/dLBx6deDnnljzvRcrXDmilvLhT6reeoAZRc4XtU28KoxaL9iN+vtUBTxYve5JZvzfZ6VdP8fh716dWKw0jsv3vI4/lXDStayXfx/4I+E3eX67yJda0b3/RODlOyOZ0jmsjdH2IOTsPGMR6pMYISihJOxgBP2FPbqqViYk/Y03pZulzvINx0bwbn7ThnO2XuGJMpXJIf4mViYk/gsysvFItQwl5TzsJGci+dTw1exZM7HC/CchViaLMLS5X4sUx7AMji953NuXoqN0jP8KE7xBbytLcMyOc8vlzGc6FdKtqzGxnK2X8P1Q9g4TvbbafMznOzj5ZfyAq16EQvrV7EQZ/2XuN4pu2hVGZYie+SAfY/GMjj9V1HvYWwU5/96amzEsuUolinHsGz9ZpeiXwPGyzlsgn4VGC8t2ARpxSZQz12qbFK3WWUz6Wka+a2+mTIJi6q+EfkyFlFNx6mCEc4kswnvwsaojiNUxwTVcZjqmKI6pquOiapjhuo4Fv2sdkuwLNVuuGoXp9oNl0IsSx7ERssKbKTqGK86jlId41XHQDZh2frlMqqaRlS7iPwWi6iCCapgoio4Fv1uaDdctYuT16SB8q2C8apdvH71jEgTlqU6Jso7coZarJpJqmamqpmkamaqmpmoOVrVFNUyUDVDqmMYFadR0+143HB0WkjcIhTIVg8apx40HhWWMSbWa76ovZ1IXx+S27RvU/Sr7B36VXaB9uRr2pM8+lEv39BvPwXa1uW0sgXdbJvW/A/+OxEaeNpjYGRgYOBiWMLwjIHFxc0nhEEqubIoh0ErvSg1m8EqJ7Ekj8GLgQWohuH/fwZmIMUI5BHiazCwOUa5KjCYOQeFAElffx8g6ecYBiSD/H2BZEhokAKDE1gPC1gPE4hGMgEhwwykWZOTcwsYFNKKEpMZ1HIy0xMZ9MCkWV5pbhGDDVgdCDCBVYNokIkMcJKVgY2Bj0EB6C4DBgsGByCPAYitGIIYshgaGKYxrIHatQFKHwCrYGS4ADaXkeEJlP4EdR8fEIuAWYwMvmA5THE/NHEhqCupIwriMTJwgMPqOdCXvmA7vVDEXwDFA6DizEBSAmwOAzR8RBhkoWYxMfAA5WsYShnKwOEtyiDGII5dFAAUVDZ0eNpjYGbRYdrDwMrAwjqL1ZiBgVEeQjNfZEhjYmBgAGEIeMDA9T+AQbEeyFQE8d39/d0ZFBiYfrOwMfwD8jmKmYIVGBjng+RYrFg3ACmgLABkAAz3eNpjYGBgZoBgGQZGBhB4AuQxgvksDCeAtB6DApDFB2QxMfAy1DH8ZwxmrGA6xnRHgUtBREFKQU5BSUFNQV/BSiFeYY2ikuqf3yz//4NNAqlXYFjAGARVz6AgoCChIANVbwlXzwhUz8jA+P/r/yf/D/8v/O/7j+Hv6wcnHhx+cODB/gd7Hux8sPHBigctDyzuH771ivUZ1J0kAEY2IAZ7EkgzgV2GpoCBgYWVjZ2Dk4ubh5ePX0BQSFhEVExcQlJKWkZWTl5BUUlZRVVNXUNTS1tHV0/fwNDI2MTUzNzC0sraxtbO3sHRydnF1c3dw9PL28fXzz8gMCg4JDQsPCIyKjomNi4+ITGJob2jq2fKzPlLFi9dvmzFqjWr167bsH7jpi3btm7fuWPvnn37GYpT07LuVS4qzHlans3QOZuhhIEhowLsutxahpW7m1LyQey8uvvJzW0zDh+5dv32nRs3dzEcOsrw5OGj5y8Yqm7dZWjtbenrnjBxUv+06QxT586bw3DseBFQUzUQAwA0roqpAAAABDoFsADzASsAxQDNANQA3QDhAOsA7wD4ARsAqQEhAU4BDwEXARwBIQEsATABNwFEAQQAswDJAJ8AhACAAFcA0ADSAEQFEXjaXVG7TltBEN0NDwOBxNggOdoUs5mQxnuhBQnE1Y1iZDuF5QhpN3KRi3EBH0CBRA3arxmgoaRImwYhF0h8Qj4hEjNriKI0Ozuzc86ZM0vKkap36WvPU+ckkMLdBs02/U5ItbMA96Tr642MtIMHWmxm9Mp1+/4LBpvRlDtqAOU9bykPGU07gVq0p/7R/AqG+/wf8zsYtDTT9NQ6CekhBOabcUuD7xnNussP+oLV4WIwMKSYpuIuP6ZS/rc052rLsLWR0byDMxH5yTRAU2ttBJr+1CHV83EUS5DLprE2mJiy/iQTwYXJdFVTtcz42sFdsrPoYIMqzYEH2MNWeQweDg8mFNK3JMosDRH2YqvECBGTHAo55dzJ/qRA+UgSxrxJSjvjhrUGxpHXwKA2T7P/PJtNbW8dwvhZHMF3vxlLOvjIhtoYEWI7YimACURCRlX5hhrPvSwG5FL7z0CUgOXxj3+dCLTu2EQ8l7V1DjFWCHp+29zyy4q7VrnOi0J3b6pqqNIpzftezr7HA54eC8NBY8Gbz/v+SoH6PCyuNGgOBEN6N3r/orXqiKu8Fz6yJ9O/sVoAAAAAAQACAAgAAv//AA942rW9B3xUVfYA/O4r09ubmp5MOgkkMEMShl6lSe+9SAdpUlQQK8UCqKAoFqQoVnxvMsiqq8JaUFx1VxHbih2NYoF1dQXy8p1z73uTSQi4v//3fesm82YmvHfOueeefs7leK43x/EzpFGcwJm5CpVwlZ3jZjH/x4hqkv7VOS7wcMmpAn4s4cdxs6ngXOc4wc+jclguCsvh3nyeVkju0eZIo8480Vt8i4NbcqsbfiEvSQpn41xcXy5u5bhyVRDr4naeKyeKu1IhxxQ7PCWtDn8UR6TWZSKWctWZXqd6CLy6ZK9qFWIxTrULsldxxtq2q25fHY0EA35TQb4QFgpWj+vXf9y4/v2Gk/b5v1xy05jRvXqOlg6ec9Pndxc+4YeYOE7krFxPTuEqFSmaICJnEcsVU4QoNoQgIaRzXrE8IaZzdvhc8KgmUp6wsA+t9EPVTsq5tu18cjQgRPFX9yOle94ogbsX3aLNpL/Y8+BR9wO+mVwumcXFMwDfeCCYHo1G42ZAOW6xO+A6wZEMs7O8lpezsgtDUZVz1dX6Q2mZhaFIQhLpV4InJxe/kuArk9XmhK+IklepZBxLpDMw0z1qEMAM0HfwEFt5bfeAz1peawkELeUJM/srcyUign9htuBfmEVruRLwID4JB0MtTMqV6oznull+/ZYLlNue62b99Re8UDI8tXyG2QfA0N8m/A2PrbWmW+Ai6Km1Be0+vFutM+CAP/DQ3zL97cff+Dch+jfwr9Lov4J7Zhr3yTLuk41/U5tj/GUufi509/ACYu6RkTRZ2Tm5Fc3+p3TPwDWpCvsK4CcqRPEnUEB/Cnz4UxP1FXQnJPIdMfd/pv/f+h/o/8mZyOdavwP9DsHP+4cifyPbnyRZ+8hD2lT82ad9/aQ2i2zHH/gclpQj3MSGVmKNaRvXhrudU8oqE6LI2YCymZUJL70iSkWl4jqm5rjrFC7vmKwSuMjxqDKQ2M9WoQw+TrRi136PagaKp0XUIvi7UEStBD4vywHmtsWUVrIqZsZiqtkP78PA9WIZbIDS8lhMyZRrOVeoqDAUU7xeVfbHYCv4wv5gNFJd1b5CrGpfXVMVDeSQQLh9cUG+KeDPEWGPmAMFVRVkIgkvmTd21oSPH1zS7cPah9TXtc8uGzF8/Nift8/rcPS5HW99Qd5Yee2kIcOnDR82d9P0xz70Hvso/T8vX7ly0vBLJ04dNf/mCY8f9R1+Lfg70EPipjSclG6XXuWcXAaXw7XmOnB3cvEy3NltXXVxEdhcDbnqEtUFZaKzXK2GS9lOL2VXHVFilQp3LOGim0txeVRfcqspFo+aC+/asHdtPGoE3pXQd2pHIJIPhEGtXczMARqokTbwJqugDDYQkKm6LdArM6aGZHjNRspUUSmRTVBMFNf4g5HqLoQRxkdCpKj519EIfg3fTtm3cfO+fRs3PX2wz+KePTvW9G7FH95YHyM9lds2Pf3k5tv3HexXfXXvxb3FYX3X7X14Y7/1ex5e17n/gK4DOg/o3+Nckbj00rOb9g1Y//Duzf3WPfzI2prB6y/t3L9/N5CsfYFupdIrXBZXxLXl1nHxEEoHFBFqnq0ubkXCVdiARO2QRGo2cEe2RylGjjKl1ymmSrU4HT9SWwMtHHDp8KheJAvISqCUWmwC3IWY0lpOWDPyCtzIKQ5v3JOWH0P5mReCr9NiSoW8nzM5AgWl8D3QCdimglTpItVNfNVVUY85FC4BuhQWIV1qiNnk84dqujLy9V2yrceAD57Z/U9l8dlOv934sfaXgTv/+aF2juQvGjdnkvZFYNzksYM6tRnQsetAsmHmk3PH3Dvi8ff/dse+tcO0fy27TftaqR8976s3xlzekVzqvpQfMHBptLjfjAFDYZ91Ez4iPiqrK1BS62KaKBLlGF1GNxHVKKcNqdztaLbwEV+yRVuAe3a1FuP3moZyMufjiOKlBLUBnXzsH1S1zyA1IRMvBzzekLnYRlZf/dOtHe7cs2trhw0/rOYzq74hD5JuXe9foHXW3s3V/ql1XHxvF1JFtuK9S+He01LvLRyj+kq/d7XXV+XhS2qCGSQU8NuIuXTTHmH3nR02nFor3PDrrdq788mLJL+KlJPXl97bSTuizfi0zZfaZO1gZ7h3Jt9Z2AL6wwV3B7XLlCRqQrxzjSREhaKQ5DPbSYkvsxOp8b/iJ5WdtIPv7ngmseNDMXP/NWSSdv+qA+O035aQQu3EAuJhMizG3Snmis9wdm441YLmqEocdYoUiXME1QJns5bHCYeXRLDCUx2Viu2YwkdUq1yniJG41YbfWc3wZzYrXto4K6hnnf7h5H8xMo/4yFxtm/YjX0Yksl67SjurzSH3MDgKtC3kOu430MZFnGKlstSMa2yjVAQ2R8WkmlDVW2MUZ5RqZhcxFxT24n8lZOFo7cseV1/1+euLvhwA91tIzvI7+a9hd+UjXiqx1eEPUcRKlQPpIXiQh1RJX/ZwYCEfJWfr6hCWNQ3/Ia+SVkCTVimWiXFBSQBco5smOqo1jbZH8ZpJl/SdNLFf34mb+owe3af3qFEcafh3w438l7B+Aq4foesHkLDHm0mUOPm0D+q/u8bU5o/3qL0AslSsAZngAFnam4vb8OEemyFFEZFMCoUThIGTCkvV7K5Ts9A04th298moOMxeRaQEkz3ePC/85gvyeUK1Q41MN655Sj351znhzKmfzpGcafPnTeYvmztrmsAPJA7SjnTWDmufaL9q72oHSUfiij/1yBNk/P6HH9jL1g1ehLAU50wgueISyi2eImcGg+qYKrrrwC5ErpAIcIUFoBMlgI6nEFUVoYm4l5+Qq30m/PzDh2cGi+PxnpfAVu8PuKdz87m4CzG3G5gH4SJIbxjkkBszKBHSgQjpSSLEzT5q0DiBJX1mvPS54OGZVCKC0hTt1GoEnaG4Y0pQVs0+qjLbdyVsCc0kHAhXka4g/aheuOTa77Z88cfiDdp+fum5DPLBtEnTJ0xfIpxY+69rPnx1wed3abvrXiO/zXuw77RF6xcC/N1h7aIAfym3gosXI/wiwl+MoIC9CaIdUfHCZ94M/MwbtJYn7LbiDFCFdissbSvYh8fUAsDKjUIeBH7cnY1/6YbdqJYBItlmgD4P0LCJcFEQU+wyvAX9z3Scof3LSRV9pWiEKYJU94Mx4BdBjncn4VXjZy//5d7tC+fNnThisfbZqk/XfktMV1+26irtm7qPtR/I5uFzLh//8ZcLJ4ydPqH/0v2zPv3bjEfbtFau/Nv3J5BPa2Ctpuh2/CAubkEOQPZO2OwW4gSbOarabChPqFFvOQaWPK4RCJC4ha6NBcUFyjFYZECFiylEpta8j4RBfBeg8AAvwlzDTyGFDz+sfVb/BMiRnj5ySnjp3LI67VXSqY7nw8g3c4HuPQGWXG4MF89K0j0rSXc3pbtQlwjYstxA7ICljtrOQOw02Dxg76ppQFjVI8d00sadrjRQkkpAVnyUsDnEIKgbRC3wiQD73hvwu0hBfgWZS3Ksl4+dPu/qxbO7Z50YKbStf6Fw9rJ/nFx5fNtNX95I7powc+P1q2+qzojxX5/SDtdo2ncbP1s1/29AxxkA+xDpJS7IFXCTubgfoc8A6CUE2WKvSzjz/BKA7MStX0i5PgRktEeUkEfNBsA9gEARcgZoc9UJRqDikVWLiSr4DCCsJ6Y4ZcXOLCBvYQ2QFoRnI/Bckc4zVCTMqCVDPm2b9crPacvUFz9f9cWmE9o3JH/p7ElXLJt+ydJMvmbOj2T+YfKT8JqyQvvl+KYT15Hun96xe8vylXf274xr0QX4ogeshQnkL5MLyBUqh+CbK1EScOBNUkHF5C8Jky6iWP+W9g7fXnzt+11nTouvgbQ05GAQ7tOGu5GLBwzKULOo3FaXKM4LWIEyxXjriiRlTLhzcAvp9PHCZSl+5gBCoWVdAFaRKgSAUKVyPCPPisvs8Kpuv0Ey1cvBR8Wy6gY3Uyn3qg5T7DzDSN9LeYWp5POhVckup6yeO2nuf98/+se8SfNWa//VOmq/kfCCqZPnL5w0cWHe+D3jxg8fNp5svioRabdn3nOffvLXeXvaRWuv+tsXXx6btHThtClLl/CZY+bNGzNq9gyqF0Y3nBZbAz0CQI8ZXNyJ1HAJunQEazHhS3eiSe1D1i6g1AgC5kEPqgZFBrUN6BcC+kEO+cQFmGWBa+FDpNGMRj5JlxU5puThZkyKRW8o4OEkc1VNoQ9UHM+wrWE4jr7m89tu/3w10e7WEn27k6tyl2w79B3Ju/yyS2ZmLJ48ZrFwaPPPa2/XTu+br23VprrIKSKTYYuI9euV9/aLrtyyawfgdQ3o3FfEiaBzQ7DOSWWrBCpVN+rcNEQFhQdGA7wsMJB+nuaVU66vMbRwc20srDTUMjw3BnZHLTzXChTtyCm+StWJjwsaZodiArfT5HGVqzZ4sA1MLnhwSDdF4lanD03oVHNESAEhZpgmMwwYGm0UqSIJBe6Xau5mYYs4BPYL2Ac8YSqUbhPcHkR2ErlamFT/Gt+R/HaSXK5999Yb2ncA/wYSE03CMRqfyTAsHWpa4HawVKrWpIVD4GeDsObcDcIaEjt5kqgnT7JnX8ltED4TB7Nni02fXSO3gdUKXMn3qX9emL2BhN5+kwS1LT8g7do0/CrEgRfTgBcncvEwrlkWWEponqoB2KIBgcYeqKYGXkwHVziNesCoqU06I+aATt5vF1xyIA3dN5OPOrycGsgCBjU56ZYzNLObwP9Bj/FV7VFKAa3px/nFbfh/v3v0+0unDLvULjZwvfd3vn/AOF6esGnCuDvHiW1e+vCt50dtmzio//Qutz2yc2aHxyYMPTel15gxvXqOHg14jNE6md6XNnBVXA/uSS5uRzxywGP14EXMVadEKtVyeOlWif4rSF9VRIe1J3U/SplTWupB9aGHVNReeuTk4JkxGDBxKZ09SpeDambmH0rGQa42I7NzF4xTkOSV0j2DqKW4JUkr2JJh+YBd9BaWV0Zq0FmzeFVrPjVayoE4FTElR1ZcSJcMUgga3SvYQIAXl1CPtdoL/JdLBBPdoF4unC/yZp4Lw5sQyPm8Qp6wr3y4dcc4viY3/36WzEvY7d++PPqavBk773zI773x9WWbZ3aL2mo6T1xtkrVXtTcPae/us3tIZ9JpxDM9i7u8Mxdk2W0H+AfsvS9tNza7rKTVFdeSd4ifPPPzB9pi7fcGTntvQJ/bfjvyMCG39Cyvf3HIyA/2kUlk5SvatjrtQe2aotztpe3eJzu4hptuHj2MfOR8haPyzcxx0kTQG2awKFpzcfgMbQhmUpgsHJgUsPOA+PZK1UF1iIWyS9t2UVAgYSEs+MKCmc8hQT6sHZpZf3rGfrLggKScGUpaa0f5XDAUBO4G0E1/pb5UkMtJ2phukKJou6o5YCCEgi4eHhUyw6NyqRR1BzAmo7gZ89rhXQZqEylQp+bBBxlugMMVUyVkXwssVRA/sMeUkAxvlRyvIiGQcjiv0QAzF4VRTZSEq6KoLcrJDUQjVuJdOH3x9dqv/wVNQeatfEf78fhXV6x+V1LefGX+7uKsx1e9+yF/aua414WjonrZGNy/o0FHnqXxg8kssqj6ABcftS19IbB7qBHhcNTFHRJ+5rDihsymaHmCdYqHBgwVa0QNAVqWiJqD+sED8s0mZaBaBBzSmMUOlkM0woXCFQT3X4BpgbCJC+dxo7cS3zPnSPs07ah9/S1338Vv3n7rzTbSWtYOAzd8p73E7xv3Lun+hHb6143XfvDlwpMfX7v2B+00uYquO67JJ7AmdpDDHfQ96DBWJCAwkQzwOgI0vIEhYHOQSWKPg1Kao+SF3ZBN/LxoLtH1E1L14EFS+fhe7R8vbbtDeY7/i7pVUp7SDr3Z603tlX3k1Iljg45/g3REGIZTGPoyzlOtAAG1W0TgCYmxHxWszAW0BpgLTN1jK7jHii3CfGHdKwSAAmH95wbh7frJfPf6g/weSfm39vAP2tWnmPzF51bDc61cd/bcxmdaJPpMCxLA1vIz9Qfamz3wBiFRfyU+Dh+24XT9U+xZkxtOSjzwSh7yfbbBK4xBhFQGSYTSstHgDKEhEU7llQDjlQzKK/EAZbMAsJmaD4sRQLZxSNk0suTLhpXJMEzOaJ7YhHFqqsJVYdmEfgg/eQsJPEcEUpip/ct/85X3PkT2PfpYP+1nvssw7cPEC9pX9/E7LvuYdHvs95PXLDvx1aRvvu939tP656fNf5h0NGgoFdC166ZLDTOTGhjXF2yUioKQXDncv3xEsXtQzQE9VXOgrnHNkv/dQFrz/VFy1IMMqY/zg88M5RfX3w7Puwseeoj68+GUNUOnHm8vwN3wR0re8S7SGqUQhbW04aTwB/xbD8JKZY+IFpwr6adY6K1keisCkBIaGVZtcEeM65kJlTVco6MHD6BGfGEpqRg/bfQs0nrV5xu/1TSyb/6sFZcLv5zz3Pr+sh8MOhXBsx3or1M6WZJ0Ioozucf4iOoybHRVsMWY8JJrSNgKgtaMlLmJXEGW1J/l/dp92i33A30W7Cef1V917gO+36PaVJ2vy+FZkiHJcQV0OpkMOsUFysmCZEXEkgsQQNJfIylne5wy1te0hsrsMfq9TLaoDrkYpc4l3M8FFHLIdRg+RoKZAmi/0UiVtZLJDIwU86LNToPDiFxcsDpiOnqAGjzbRwqIDxDcQFaQZeQW7b0cbeXb2pU5AMznYh5okk3802dfFjvXD9eWJnkvn+7fS3SamlIga9y2Vo8qMKhoMMvK0UiIIsiKOWZQ2qKDQpAIRGfAcmDAv0jKue7CwTNDhRfP9eR0X+CkVAF72QNarLPuC/gd+m7OdCRVlwz7VvZQWWkNMnWF4fC4JDp16xW3Z54uOXE7NjHvzaPvI5lkAcm87x7tmwP7ta/vJ5V7tm/bRfbcs20P4Z/u9wHp+/TT2rPHenyg/VXZR3p9/NlvP37V95uffviKS8r2T+ne9HM99d1C5bofJJzNwaGmteHeDCT3poPuTVwxE0AcRE70o5g3MepEqP5sRdIJ1aDFJeEb+A57/linfaLVa38Qx8pr1izSfpSUKz/deOz3+gb+18Vz5t/EIywjtXMS+k9+sFmHcnEZaZZm0CzXkXSaAkCzgIcGjYBmijNCbdXMALCPJLpltMqs4Eu6UMylYW7BEWtKR3PIXGQ6n5YjDVretPz0S9qRqtjF6Pl37b0JLz72h/UCNP2F7ocQN03nOluUkTUEZHW6KVmdguE74d5Q3BE9s0LtlnQ9dQKwK5KsWmhcjEYPrTHFTe2WUDO7hQTCpCBdj4GAauWzCU/Srr+RdNJe1H7++fSS1cuvOiUpJ96963Cn+qdcfKD+B8FyxczZK3Cf9AE7ZRfQvoRbw8ULqTwAJ0EopPsf5Z4HoU+z18XTPPhZmh/tlNJKxXEMKF+nZHoUgjYXB9fo6NCPMNSvBCJqGN75I2orZJlM8CgEqyctpxDXKSwrubhK4LCpjrCeHWN8U1hSXEX925TsWDAkBll0rLgPaUPy5l95pfb6hP+u/eO++39drx1ds3Th1ZtvJdz32penH9VO3kGOnBozeNSEme3WfbXi2TlL3r5xxqJJl/adWjbo68df+GDVMSrvYa2OUJu2Ixc3NcZChDpFiKCTppiO4YLEJRMNlYJSj5uoIjZhcKzRg0PpVCru0npqR8UX/v3vs73EF/D+y4Cu/6D6pEbXJyZdzirWqKFHQNRiAtvCjFeqRyxCUo+gAgE2pa/gMnDLSOubr6oXSRvtfa2+QTtKTghHznXbfCOxCW+c6/Gz9j1xMXsC7fX2NM7TRceN46nJTkPAqL88VH+h4BM9dfT5AugvVaKhKc5EZSAuCeqVsJkMIv3IADJYk7TDIHCfFfui0iRcAcj/z6jeuoOLO6htZgf5jw+LC6IpGk1qL11hmlDaA6Iu5op1HXtqA81dCxUuhT+o2iygge0Hnzu0+9QD9HNrhWq3WRTbQZcq4XfiQQEcccmGbtozvCBKVpu9Mb0MtwccLA4mPsOZJJqJ4NtJuICUv/qL9vMrILRf0N798UcNLPezv4m2s7+KDhDeb5+LULoFMWFKZWJxox7mDT3sqKTGiMqjThCZ9rVS1Uv/HyS12lgyDhxzmYyDq1ptNxjY3/HH+Xc1G/mtvqI+n2gaj8+BX+LP8BwL6ntzk/Wx0sAnylcbbhozi8urnLnJkgBH8KQ/bIRK0k/L194BPb+Yv/3c1PpfeA/cvz/c/0Gq+yp0vWw2olECM1qpZaqaUayQGFg6hhSvImEa9gv05/9R307sXR/hjyui899Pnv1Rt4uv1J7iS00PAo8BX9Nb8pY6DE1IFhrbQPfb7KE5dzBXJHed8U6IGJsGDIkCORq4kiibNmlPmU999sdbn9F7cw03CuuNfAzXNB8DijdMSvip2oeSQtMx8PdO7SnyAoWlO8u/qSKDhdNhMR+DxyZMDAAwOjDXT2BnewygzEYsJhSVC8DwDTs3byaKNnSZKfrZf934jNb8R8JIupeSOaLGGBCJkgI7aU3K3yXl3zy9j/+I/6C+FXlDq2HwkYYc4Xa4ErgMw9ay1tGLFMSiIEKIsPncki/pv2kvHuGrTPhvsjlFAIEq1ukGbIJvkh4L+wrak06v/WjitCNAq94gb0ziYLA6WnFXcvE05Coabs+31MU9BAPW5rq4hcpwiwNcCaEky4P2N0ZNyugmzQXq5HowYI3Gt99dp5YDD+ZyTBkVyXG7Jws9T79XTctAQSFgNMgPl4pFD8W3L6yJNslsBANyMBQIsziIoXUL8s29uYZTaweN6D9C+2zZ0Zte/4GUgY9hnfvojn+S8KU9uy/IWPCRi7R98i+k68Dxl3SZ/NCEN57RyrcPkUs6Lv/LzupLYm2fu5vp3EWAd1egl5vL5GbrdgwVRZjKkRDvdLxIN/JdRMlifhPNd6judMPVpkFYFrSnEhiTUBLKEtXL6WGEdD00jsYwBunlACbuSsw+dJxYbNm8iIRn7H7ti+OHlbnO7Kpbb2sdmDP7lvYmrv6j5dqn2n892jnt0/VXkL5Lb+m5fs+2JXTNe4Lv8RusXRY3Wo8VNM1D0fgfzbfZaZrNbmmMFbgxIcX8P0tEDYJVbWaxgoAbxVSGYUtysBa6p5etZxrDLoCe60ls3735H147xc8YPnP2rDlDZ/DETVa8tfo77Vc+5DtDyr49OHLulodz9t45tv/CAzNJCaU7wCzKQHcXl8YtYbHhRroLhCVE40KI2hEmhDc9FV4/wCtFVAu8s4AzkE6dgQwA249gC0B3MOVoyNFrZcU2IRnzUAKzfXztvdFICM3xkmTku0YG+vf86tUHZ5N87axrweMvfUvC82auq6le+0++qJ60XsGXnuGuWE/a/H7PriXkiSUUj36ARw7QPgD7bQQX9yEKToN1Mm11iaDNhy53UIJ9klOphI6pFl9dPETrs0JoCuSi1sYEj9tDbTUfC9jbZMWtm5/AK5wcoGkqGu/L50DM0qXot+bbrce5hvohro0L9k7e1OP4+p+090kpuZOfMXH0fF7I2k3IraBGGlbMu+6qHRNnk0KyLDR17jImX7IBgeOmANjNYxnkcQJQK64o6Atg6wgG5Ew2ZsP7aH0AJlyckbiXJmO9HkzGemlEChGhFr2dMFPThKYmgh+lWZWQGYibTVjuL3vnP//aeYxQ2H73Bx9ox4VZRyc+84b/c+u9Y46e2y7MYvuyjzZazAe6ZoIuXczF05GuuUBXM0DI+LnQBrBUqj5MrpZQ3sgC6LJY3CvMkiKlQNssTs/+wY6sFX3OdGrno8Li1HQkthxTC53wCh+bZarHkOgAc43ugReX1CDDdyFNecXU58c34pc5iOn67x9Y+WXH6xZsv+K6GbtfPkXCK2bfFOt4/ZyVfLrjD9L26llnv9/07sIpA5WrVi3puIS0+/eWvZeRw5c9jmswB3StG/aBBzOths1AmYdykbNR7sgpcgdljhX5xs2sPqtHRsbmVMnZRMbkofFH5Yo8h4Sv2EemStpnQyddGwOB8sot2uz6gfxTk8ZNP9dAaX45AKRK39K8bx8Wr4s7kCNgb9EiCXdqkUSty8RZQKxgxrJSdblZDafLDk6oBYs4qeAwEif5xQjJ5WMGDhg77s5xMsmXhvcYObJHz5Ejz/widjz7Gj6/Yac2kDwJz3eAJTWQo1RAW4O30ZSRByEIVSriMZps9kYUs0d1plEmSEPDUMQ9FMA9xNsMB4imu8ywYjScAutX4kvmF6a0L7mR5L9YO7D34TF3jwGwXrLeKq48e2vtYdn0mw4d3SeLYI3Gwxo5MIuVukbJ4Iq7MbgiXSC4AoK9AwmQCdpV5DEtoX0/x8Sde6of6aN1qb+ZxOdoz7A9uQZ+PUT1dxaXVPXU1gcC409j+GkNyTdxZzjOgNG0BvZLNqwisxWcAYyl4HahhLRGMcMKZKNiiJWcqbxMa8yCVN5T59iFxSbwDUqlbJ4ykxpABWaOKS5ZtXqRvgQzqYJZxzGE+5uus8FsPoPpFhG39YpX/jl46XvKk9rxfhNuiBDtswHjVtWIHa/a+PDDb71dP4iPTxy1uj6dVyePnFUvUFzm4p4AXGRusE5vawomqgtFEqvyknUcZA+1d3HLoyMsM8BRhuKmIK7GTUEBDSV3xVzisS57+clHedwWV3cRO15zx5E36vvwiYkj5tRLup7qBbA4uXSMBFEVJRvyndbssHIV4H90w/06FBhjcOmWjx+hAImjmu2GNkXThsslfi6vSYq+5+q67Z8QsAq077XWWh0JL1swd8WK+fOW8RnOnedu0X49MeAP7T3S+sz23TvVbY88jPaLNlXsAvC5Ab4JXKMKbSQXAAmetQEn6k9PRFehSVDdenmRX1YdErVZHMxmISEjnc9IBzaLH22WdAJQy7rF4rDNfez1418d2jOzasM782dtiGpTpY/nrdE+1M65z2jvLdV4/vP5ZMS2PXOYbO8JMMsAswtgnp0Cs8NrBKrjJgRfaEZjXfeD4MOogEWH3ZrU+Ba23BT2pMY36RrfQyU67ptmUrznV6/tm+3TtOMzdh06QcKXX7a2pvqmGQv5Eq6BlK5dcqaY1C8Bkt+3ax55adYufa/x71Ge6GLEiQkLTlOC25wAscuo5EL+VN24qxhTAjvamrJjSND3imwZs71tmdipzZ6o2PH6u5za95ZF9Z3Z/u4ANt678MwibgEXz6fxZRP4ZPmNdTD46CB8FnTTUiof6oxiGmdJ99JSKixE9kXUXC9NtpcASOlAKZUnMVR8CdHmzsqnIdQgSlJHbqxJcUxJoV4ekaw4JiGWEq8gHYhXnDduxKi5y7Q1Px96+3fYTKP6D53w4YBvtDc2vHclGTtoeLdoVZe0Yb/ffuhv93Ud1jPatlN55sh3th6Y9hjgZms4yW+UeoMdMkmP3jnsjIPBcaa2iDli1CuKiFbSHgH+pYkTn1GvqLgicZ+1qUnikGlVGDVGZFZ/RFc/YCrIE2TbgyT87LMVPdoWjRqv/cME1gixab8drf+6c3vzJxkkyvel9J8DcsAtdgQ9PUDXjDQoI+lbDTRCMijjpkEZGtzX1bOZBWVQHjlQSduN2CIqJeRD3RAtBiW9fUsN2J+/WOa/sO8AWc6/Wt/nsVm8dva1hTe8Tn1WUA1nAQ4T5ihYbIYkYzOsBCcl/kIDGE5S8cYbpELbop0UO9aX8B9RdQv/DPw76RDcy8ENZ7sQ9RreThVMKbEXb2PsxUtjL6zIx4FGnmq1x2g9IqZHOWAnDK/EYrGUAAp4uAVZJLTxtX++uomEtJOn33rrFMAxlFfqh/Dq2df4x+rHMHgCIPcFgKdp/IRcPH6SSRWsHVRrD+0tUh1/hlRpf4frI4cO8qW8V3uB9Kr/qf5DMlJ7Ep8haANFQtcRdQsjHZZUOGw0B2lDz19P0oQag1whto40t2Cx2dGLFWSw0hnOKcQ2o4lRFYpUdyMCqXnjdVKtDUqb9lm3Hq2HDwvlA9pT+J1nc2JHfZ+QSMdx8PwBsJ5/B3hSYi1Y30ZYIPV/irUMIPWaV7isvoGXFf6h75+oH1/H6NlWu4e/wdQFPKy2rIrEVEfdqCCGNVQ5HUvNqNMkB1nQkC0srUKoitRgkwG4G+aA3xzMJsGQuVCuat92n5hIdLh0MF9bK23rAA8Q3jl89Nmvozuzbl317pcTJn519Pv2u2aSBYf1GMtT2mkykcZk8rnUdBrWdttZibe9MSghR+WnntZOm178oyf823y4/TKAP8RFOFD4qmxigW/+GDqpAYDfFaEB7wCPwccgKi7ZKzOBH8LwfE1xFwLWO4iqQDAaAAeEl/LvEQ8cEO/pUJsg4r64RXvoteqTR78cO/bbf9bFdka++ssHh9/550farsvg+fPISvFVoRPw5Qj6fFiQWrPgtegmCE1eY0sO1ooEqAWSsLMGhhDN7KFeoskELzY2cWCagtEEV8hAum3MpGuIiVEUq/P23z34ut29Og089tyWAdc+cknHfmTHc192vm/epeS572I7ZgwG/Xmdtpm8Ig7iLLBze3NMTVrQOnbSFitrRJXARJdYi5VdwhYrWzotdLKnsw2MZZm1vGAxo7xv285r2MSCL+q7DizhibeNCJ8KC0vWjR7dq9fos8sw28jW87IGu5gmFYP0WcqBIZkIgPLB3o7KhKT3x+TT3YOeoteDkQQQ0IlsRiRTBK1NMNaR8dLBbrNF1AI0NHOAKi5qugfwMgt0D1ibcVtaOm41CfY7NTbRL2N9L82rFZBNC6qK+cvefeH13c/y2i/8jGGzZpHZszEc4eEP3ff680d5f/Bjkp/3+RfZx3ePnn3XQ+FH7xjb/473sr+vyyF5FDeQPzdLL3O53DI9jpIpYIFI3ISxQadQF3fSYL7TZi3Hri6Ts1yRo1j/CHqVFp3yYJIG6uK8jH/GgwZSeI+Sg/mNQLAuHshJtm11D6RbaTOWKudQ15PahdGSJio2FA6EQ34zFi5Hq6tKLttu/v2do6e1L8YM6znGCmLuqKkrv/HspxP7SXz3k18d+f6Lg6PGT5/61clbV/U/dcq78360tYY1fCP1Ek+BH13OXcviemogMxpV86Q6pbRStWFcojVWxiWyWMsSeNCFwMky25ht0IMGmVNLJHMmes6Fcq3FEczAS/jU6fYFqM2Qlwbv/Bz7olSGP3f78NLmrTVZHC7aftKNFMOWLKmhRk9NyAwsZw6ZUfGVmH1+3ApYno0L6yLD1s+4/PaNm+4De+H2TVvnT7910007jrz54PVDF7y0aOFLCxa8uGjxiwtW3Hz/q3/fueX2O65YvvWObTuOHLp/4x3rrl1zE3/1ijeXL39zxco3li17g/GtH9YW8ylBXFtXSsw84ZFdnJP6Rx4XSsSEP0A/ANPD70LTg3qdrmNoNDlZfYSTpvWdZlocEndRJ93lh3eeCHVFsZGRxd0DTeLu0UA4wDI+4Sr6n58MIH5QXf21m7/XDpFu2iHtqKaQofAjSkr9Ln5yffXTV+zTvifBfVc8zdG9f5rcROWpmVbhUolKw+YYdBWwuJG+NAbLZQz3X0dE7Rz8nBYyz30jvM7/Vm9jtvhErbN4v/QKeLYxbjMX9/MsbBXP9CNSmWmAVHkl1lwTpWOl4jymcBG1AsPgEUVGvsY+uIpkk1spbXJTSj1KIX7Z3lentK9UC311aiesCpRR+Lmpublf9GeWRzpQbvGq4WLc+5lgd+7niFxKPwcRnvSNCrE4twa4B0vjGrN6IqaMzTSzl1dI/MFcgn9cSUwTSfi6axcvu17b8uyEXRtI+s+/E4/22ar5C69cRJa+PHnXeu3H01qD9gUpGLH6+PAJK74aWEDGTRnYrcfwmQvvnpeYNPvZJ9798o0x8wf37j9g+sJ7FzwzbtZzTx8+JoT7DCztVTmp65DSvmWMfpPEY8I46ShnAy0R43AlfFHwRqhqEhzJEieTl1YtYImA7KUlTpwqWIAcdjmpC4K0vrSoMWQyaVCXrpde2rXTEPLtkE4dhw1afak0qrr/wDkD+tZUDehf3X7gQI5mB7Bm4EtYQxdYdDXcAWafJnzAxWI5zbEkMuh1orrSLjrhhX1TWY1LXBkFYRYupV+E2RelYfyitBBN7Q5UyXmYaPDQsutEa/auNe3ZU4oiiSj7oDCiRFmfKutHVWOAbqS17O1uFby+DHtpuKoaFzwqY/uKWlopexNmtyfI6c1pNM8e0MsVvB6vmFforWrPFxbki3qHX6CAZdyZ2K+K+k15xaOfJwPJdWTg8y9qB146pB3469X3EZl0J7577tZ+2r1D+7nPSw/ufur+iWMnziSzJo4bf//T2sEX+I+OkPGHD2uPHPm79vBrr5PxZLn2pPb53sdJ3t5HSPYTezRuyb73H75r6oj1S1YtXz9s+j273qfrfTNfKziB1pngia0HSYLUNVOygWWVyGFXBZUJgV5RD4xLilZbBKQr2gj4xl6JojbMFKSXEQydsjBmRVyg+BQvqI0Qbgwsp1X9cKkUyLSCnXoUcRsyD+OeToRWzwZ0BSL7QwV67aifpUxc5OZHn5q1rEf/p57esP7+DNVmHrR6xY1PLy8dmTnv0tHCtoVXRa+NtnXNuf72tdor04Zlthq+6vKxRekbSGfG54O4a4SHhPvB7wAPxFdFooKvQH8ZRNKe++WX5+ayF17wkXXaYm0JWadfsLgWWSEcEoo4iYsyW9RVZ3SjUZfOhIE9veEvLgqGW6uXD/mqwnKBvEbo9Tp/9RPaMCLSe/7f+8HEJnsmwnXiDl9417SL0s3Rjn3TLoqwtcsGwVgWSeR2ot/l6qvduYXdEmHvohEl4lFrYLnLI4l89lmriJLfZMN0wQ2TjXajFxa7Ro7DrkELKN9bKxaCC46aFmS6V/WAwIR9VGsOFuLuUTp5VXd+7E93kRxG0WLOAVkZChQU03oPo/KjpOBPd9LNJH3bviVd2plt9zl7Dnpww4ApfSdt/NOtdO5eYfjNaxZ3zV20p3fIk//Qpb20p8kH3dtf0okw3bxVsgkLJRXWMYfTyyhcdcmLlFwnruFW/mPJtncv8uQa4SF+O6yhDbT7UJbBTfjZDrRUJlz6mtACJL39HV087NQ2MXJj3FPGGIiFDh3wu7CAysTFmonkakMN5a/ZtfDyHTsuX7BnS//2VX36zBOVpbt2nnjggb1z+vWtan8pwAQ+nfCjJIEP607G45w0AkfbMIWLtWF6km2Y6Rdpw5STO4IVhhbI2AQwjgypJ/20v9RrbwhT+RdOkTHaY6e0rWRBfe8ffgAa1/D38ful58GXGqPnusG4ifvpRvOjoeoEW9DF/CvvMSQQbkQTjciZHACBl5q+XidAgD0aqs3JYhp+GZRbI8FoQX+y1Q5FUs0T67fu7LdgK5lSv5Xkdmg3JdJJfGzZg9evvGTZmCv23EJIu5GhkV0r0V/lNwOMz3GF3F1gqSKMMsAop+GD5QDAmE+r9FOiXuDTJOz6OhdRIygQSRDmbPgjeo0lqOJELuskzmRomTNpMyE23hXrtZdxkXZOK5mykm204OXSFrxsNHSVTMQwqjNCSUFVNKLnqQt0tM16f0jbt3u371x19cThK2Ptyjq99diNdzyx/u4DWzc9KazLb1dVMJFsGFtQlps9a9XK+SsjrTbPvXYt3QMzxSP8TCNvz104b49Bhpmvkk7aD+IRUq0dwX97qzZVHCx25LxGHCfuZsWUemzKGqUBYF/SMeMj6JvRsiF3HQ0EW7ysc9KOfXqcasJN4WSmiV5GlAxSlci3kvCwy+7qQMLav03jNszqh+He+jvWrJzLnz37Wu9xbbR+bF+DeSLMpH2ERo0Ua3K2U7RED3YDK6JHZzaqAjwJjn3MsV4AZCsuikwO0mwgsZ0gZZ8MPaH9Lvzrfa7hzFDeosFzbuNzyXvCSM6KesBMc1UsX8XKNHVn2Jjqgb4uXanbJm6aNPmSfhP4Z/uMHn3LqDEU5ulahHwNtrWT68zRVhtXHW1P15nMVanY4Y7pLKSLgTxV4GnRk5XGHbDREUO7oZooY4gS5JPpuR/a7z7wiHlxrw2bO2beufC6vcPKchmN1vMP8B7padCrFVxqmy02vSOrXrzTtkBeT1b4/i7e8+BV537iC0H+rODjQrneY3wJq7BJhJhMhL3i0dGgfcYJJ5OJrNXYUEHYbexzYg0txtj0fEV1XpPpCUblY2DFS6T64F8fePDFpycNHTyBTBoyeJKY3u+hl//2SL8dL7/y4PSFC6YNnbbwcj2nO4pbLajCfcyGqPEJUfB8ouxl1C+/PE/StO/e1l9Xk83kdu1qn3Z18gLvIXIzOU5aKD0O90CLO527mWWuFX+l4omqQRca3vEgdV6CDr2buCVqAqsh1uCtoO2F7OeMGMlsu95ZjMSO82Ykg+KT4+D24pWXdqurftbThGUedj04QReEDpwgODamIFBQFa6JVpln4hplsskS6WTm22PHvqU98pddLnELW7ZzEh0koZKftXZ7d+zYezTI7PqRgOurtHbIBpz9mOG9u1gHBRgdaVgOmgvvc6lDmmvXm7IkDJC1jHM2c+3xC5m2H8vYTJJNAxbZ4O3RklhEXOUBbyVbTlisdhfz8QNp6L+hZZorx80y9gMoLq8qifDKy7WcyWJllnySElZyAaUwEknCM5LsbUFB3Msoc7aBUobc24K+ELnJHGdygE4r5ErBqqwBqzDeDqVMC6ojEWnfLg2c+tZRNQI8UhGJt4/gd+3L4DsxH79rploSdht+mlQvHf4v6gXrodrBn1RFEm3ZPyuPxNu1pRZkKytzkFD71IL2wWEvtFpKzS4FgraT48Vl7ZHEbb1KCVC/fQS+alWE1qCsVMfOU1FqZknsf1VS1vOZdPKF9Ba5ji1TMIVzhfUX0GX1T57HyljLca3wd3Ewl8aFuSu4eBbGK8NiHbjGqht0lJtOM3J7rcngoT4AAUPTOWl1taacDAvQCYRuQcoohAz0IlWzSfY+Y3MHM7PywmgI58jgYKNADmNakKPdvTXtuwHj1YT9LiHg18OFQATOiHr2uXdapIQnXNcdseztgybwJMyffvf9k6SKRkJNO+6d1Gb6uLV7tvYb0PqB8cMOfvCmWMoCozQKw0kTzdXwagdforJ5d5vD6G4DpZec7qEShx5m1xvc7CTsKxCaNbkJWJ03MaXTzQzq/hx2u3FNnmtr6bmWlp97fmOdnfjC5LzmuvXUwkhtsSMHmbXR9Nkeznd+R5/c2NHnr8TKMngwpuB8qQiD60gCBSXm5li7SOmjpPWJ7dtzUzA3eT3Er33nuOOOc84m+EfhNRdk45rmMOQl8Q9V0riex6PYMSSV5WLtAJZjuGlR/eUy9ceGN1Hxl4uBGbOJSv39xM6HGGv5vSAYaflDHmCTjwlm1UKzpEmsaEifbwzp83QEUTMU7TdOyam6siK9ILr3pinFneZUZBa0S0vFNmfR/e6OjnYV9iX3yh2ckYpzdkRa1HG2wasXdF8e7qWmWPuSWIMrkRNV7Y46JT1CW70sx1SXl5YooNOT5a2jnV0uC0Z2zSYaqg3KSiCmZIEw4iU/66VBHReIqXYPECSYdR6qzI4C/FLqfJqgKhsRrNcAvwVGEMvA81YWzDr7Jh/mByYjWgaem+HVxwUBz/NW15/EU67UvXQlt9EToOgmQmx5Q7RLHmdQ4fIi0iFcXuKnXfJxOWjX1RhP8w8EZ3EFQRBjiYvLEkvdLCld4Lhx9IEA+aYmKN9+w6SJN143ZdqaIkB5dscZHTtN75TE+G+jVy4fO2rZirMKoHxD627dWld060ZtI57jzP1B17sbrXiFi6pWm9GsaKtLuDwOxNvlwL5FR7Jv0Ycemyr6mCUverFZD213HCiG5qKX4RAI+/QfwAUQ4gWv8N/6x93kN83v4eedu9al9dxLCklNmqSc1B44qa34gQzSavnefEfsS9La6f2oZeidYXZEj3a11IkKzphajDutPLXJEKvx8sG1zW/em4ozrkqBxw44JF9Gdk5RMbJjvqzmYR4oCDZHINmwqmYUA37ZeeisqY4cuPYFQ7FY7E8aWUkTe/xP21rJP5IW+4U6XDVviinPeneGm2PU7x/yZ52mnj/rNJWNVjJHrFnHKWqKlK7Tc39BLZHsPTXHmIxuCk/f/y/gaQ4HqI0UOOof1DWGDohJoOoiFQ4/2LN/AkfgT+DA/EpQJ43qcMbOI46hVVIp9JShURqBCxjqhOkzBqMTYAyChXLdxaFETyM3qrpBtGZEDIOlJZAVq0fx0uEkIHcdlarXS7sFMTWc7WWmjBXdbBxOwia8oMppjlGLiYFU9B4/P0mQxHNT82wB3/Ac9rjCeqAGLQP/EO3lZBIJSytZn6jVKKgkAoVJQANFDsuXILvFSGtktD/qafcrj32z/A79nq2adM5akp2zeEMByydEyRwz0JSRi+4CyXg8aW/ojEPrQTHh9QTcF/Pc+tSuuI3Xyy6ttKeVZrMdVnRXef2+gsEEGLkYZiy+SFo3LvsfP+h9u0LDk/CMR2HtbbQa7TKj6hVzgwB8iOVysGgyg3r+rgCYoy47mKOclzasmbx1tW76QcDL6tHsRs8neGo4cCaNtjpY9OJUgC9FcwKEQuOyjjSWso60rtAX01jDPx6j1NnUmPjhG04C3/5BdUY2+MWsV9RjdOqkA9cSDufGKFlRlUiMXXNoJhMW2BNA0yDuoY6jJwt8QBft7XBhVM2jVwcGWR2o30OHsVLaprbjw/pF2aTFcoKuhD/R2JWvdSGt74g/9xd16yef8Dcc4Fc2NufzN2iLfvi49/FvtNUHDFkl5YMtZ4Xdd8t53bZKOuwdF1YTKE6acUS9ktx2tTYrZylPhJmyb+zGVQI4hTPItD7utbCNdeYGZNWZTtVK0w5dJV1WbWFYNaeXWgCpHbtCi3ZdSh/vsBZMutTe3vNMumTergLsaA/tXO2nr2Bq5yoIm5abV6mdSutyZYxZ7pdEr9PvKwy12PmLvT7Cxbt/z+C+/uyiHcDSOHA/DjS2rKbCn5MCf2q3MlhlBvzNGpYL9YZlgNyZm5fPem9xCOqfdi5jBPSi3csqFSYX7WEWeCZlUnFI50owi0BxyDZwKMQUbilFIAMQyPDQTmtEAJtSM5B50N1U8uRnJNHnDxndBbBcLXdh+5KOz8UX5GdDcO266KKIVUnP6OGUbmIDryjgVcpVc9freLU28IrC2uRVqukurAxV/LivinBf1VBUWwXrauVWuK9K9USVh47XArxrs62V8LlRK1KJpT24xTqgV1EKvrgk+p15raOsKATjSHJpLNYSIVrcU39CldMt7LP5FydQj+bO1O4UOok6nWxAp0zQMe25q3VK5RqUKkYfqlKJRJGxlTYgQ6tYswnSKAs7IEJe2naSrxOorTUfPiyDD8sq1bagFKp1VlfEmFImx525xXpUB4uV/ZjaLWt7YRLpmqIJXUijzjiPRCcNJdKrkS5kj65NWiLQPqZgzl3WuDs2GlqGcD24t4TfxM1gG3E+K6mxYkzPbCU9SFR763HSlrR7XHuLRB/X3tH+QZaTGIk9qr1Bah7VDmuHHzX22KSGnVKV9BMXAl+uFWoqWuNbYFA425FsIUyDPZbmoUkZZ5D1D6ahkPPjzLb9ZtknZVJX3MkKTguwoMQXpHFKNaMVKxUz21K8ARqHl1k2tMRcUFNM/CFCaejTCVoyCSj4zNO3Dnh+XS3ScM+No/66+VXSth15qf98oN19l0zatpsU8y/GkHLDV3/1mvZUJ6TdJXecfplMe3IJ/58uP3yl+SqBeNvmUn1Ge7d1ud7n/O5tKtQDLTVwB3UjCYW6Ra51eX1+XaQ37+VGkd68n/sZlOEtNHWbOlOD6s/hki8GFzaW14JBgxBhzNHXIlxo0J3XZ34/FcgtQCaZdGMvFbZ07IQ6v+M9oyXAMnWCMSFskRMukMFUBNsbRfB5tDNEcHNAnzBkbkugpjX1GRi8TG4UJ+dNpVIThEYhExq5EaNDDcCvlQVDaDQiUptvt1hoWAZEqprv1TvX0Clw0Z56Kiay8lMTco34tOgjNEfu0fP8hJawvOP8+iKe9ZvD2qAd3qFpx7liraTWuN507tKbzmt5q81BVcD5neeov5t0n3t047+xB134JckXa+HZD4CN66RVuI2+RcLhoh6Zw1aXEAJsFFCyKJf1XbgiEYwie/U+ObQ8vE42Voqa5rRBkXYE5PA4uYvNwMBCiLUkfGLXz9dpP/xy+rPlN1y7+FtJ0f5DFr217sivkvYFb1nxypU85u6AB143hUCm3aRD5qUGnK2OzfoMOuuUYr14jsm3Vu461KVoj5p9dYrZo9hQ9ea5qTa2uetqM80FwAhuvXk6rxXmBoIBGhCxyXFvWg6N66T5WWCuOAiej9mdqQ+7MVYfB17ogSrWuojlHcVV7fUeY3n9f7986dv5XcZuO/HBsAdLq6dfNWRkn+F3LxzXe4ckDvrXT4efWLBvUNGQweu2qq/mpX3Tvn+3ijE9r7x76v4hl4x4/+wjlP9pv7iJo5ZfG8S/sWO8+EId4+VGxzg1C9lYT5zmWeBBa8poGqdzPDm9A0VpJe+3e7Lywvl6BJZ1jpenAd4cto7H2MSL/6F7PNUKvmgH+VKUozP/rItcmgjm8Cq9lTyVHq2a0+PPO+iV8iQ9zm+ir2zSRI/UKCtvw6gRT8toTfmh5P9Aj5RuetyS/0tHfTUT5BfvqxeWGXq/kSYlXAQ9u0aalF+IJm2TNAkDTaKUJlhVWupRKxpp0h4DhhhNcOTmoTFVIT8DdAnn0xIpIExtWkZBEZU/bf8vnNLcRr8ou8w2tEbpn7GM2CFprM9tnEGg00nSgE7VYG+9nkqnjheiU7cknSoq1RJ4KfEo+ShLoskxlmoNyJPqGjTjjVRHZaKaXdV4sNZMJ2dtub8L/FGZfnxFZaI8OfFS7VKNkzw9Wfkl7TA/WUaJnlZBua7b+bRVKzBVkFsd+x+o3HKy5H8h+bwW3AD3n1K/T3NPYFZyEUR9DY7S/due62Zk29kqtLnQKkSSqwD6vUtUzQdt3wG0ffdKJfeYWgTqvMhDzwNROTcNF5W58SO1bZL2ShV+2wk0fg+gdlEuUDTLTtO+VTI8qg1edTLEXuT/wsznOxFA2xQP4sJknmGYDC8kadvKsB0uRGRV9yZKdGHQkJLXYfJgHNC4jKsCGh9MpXHFhWgcTdK4tDIRY8merpWJfD3ZQ0mts3VteXUuhuYYrcvhpZrl33Vad8KYUBFjbiR3NSN3FSWynLDkl1Z4UIAUGQSPtsDhXWPA4UW5/wOHk9SEUSPtfcnE0UVkrmSkkbIM2o9muaQLUv47Pbd0zsFIL1Y35pcE7GM2bRQHU+7ujJX+2EOqlERpsT/tJ20DdMcmUixgt9jqlI6RRFVavttZrrSLqlUSm2vVhQoW5OIyD3Vsg746tSueaaNrqGq5u83ulsXM/JK0tlU0rehVc3KRmFX5SMycwhg11VU7tuy60ddh87cNQhZhkX+oOhQBR5h1n7KhFyU0aZ/UWi5CwnrX9H///eiwQcOnaJ8R6R/vLVvz+tHT9TPsty4fdOOYQf0/WPr7rd3fuua5YyQ8bFS7ZSV7pizibydrxowYfznp9sCTJHbp6L7tfXe9sHAxr/3x3QPLrs5r80KH7lv6DI4/0KFXm4IXyEjiyJo86wrWt9xOn7NSxm1qmgNrYcJKsxxYS4NWavODAeDX0nTaipOfXscyYW4UuV4jDxaQa8WM3DyqzVKTX3ZMfnnRyYldfEJL09zXxea1kGmNaa8WR7doM5rWrwls/gnoeKzFChtzRBonoOSCeZ7BJqBkSFjxQUO3mWwISiYdgpKJRa1oEVsyk0NQaHGpO6YGJXqMzYXGoFCT7mKjUGajKTfiIuNQxF+0I/XP0ZEoqbhkAy7jLz7Nhdqw+S0NdCnQB7rE3Z68WCo2uYhNzp8OdUFr7OKDXYIswnnB8S7kY91/SsUpB/zUCc1xKgScchlOuYBTWiX1VPMYTnkUpzzECd1RSx44I25PRiZlRQOpNEkPl19giRoLPS6yThMNGyp4kbUS/m6YT/WP6kNsRIYf6G2sh8AqsM3NMSwGDMMMwzBgmFOJ4iwd9HRrEGftsRmWud3UB1Er4ZKaUYh/PsU/H/GvQnc8iOVvYeqU1Dp9EstSe5VITKmU4+7W7ahg89K2YJ06F6RKavUEo0uKRm6RROMMZfyOTiJiNYJ6LfF1H6aH62chpfiZqf58w6McRx6TTjXNAZKUHKC7aQ5QIE1ygGNxU1WTsHRKO3K2D53ewnPr4MYbG++ZnIqQ2pzmbkwDqpgFTEkCriNh7QQra4b7ic8b/n/DA/DrXrhvkxwgSckBuv80B3iZwVxmEhbfMnjobFSfOyM0bIdn3C29qucAZ+o5QKxVVrygCx20B9RBH6pnAd3/P2YBZxkLfZKEi42U7iVsOc+cQqClS4zl5LmRwP/DTOWgk0q5KfqcpDwbjTsIFnbsTPJ4MSqZAkAwetoMWvJWTKJjV9F+wSK5021U33jjHi8rHynOY6e3CHLK1KziEnNJDcYVsIWT8wX8PG1eZoq5Cw2ujvzt7Q0L2i1/afA9y7ZO+Cn+xKBbuQay9qctt5+4noSvnD776t5bllxBjn5L7Jfes+TqpdP6lXze9qbLl47TzmhXDnhS+2nbtV9sWLx5/4OLRmBqmc2DAf9IBg7YdIGJMOAuqhkuzNDQzB/TvGVNhsS0iii8R++0wvkxjUNjarOtNnCAcphlWN44QUa1YTWNlBGm5JDYHBk1jHMiva1iLU6UaTlX2GzOzCstODDNZs+IdeenDJkdJ/YCee4EamSjvqUdJoEUHaW4Ko0RP3oTdpo+6QVzuV4aWcEjQtLkWrcke/R8FZ1No7okOnys+YyaxtBJi3NqNqJAuO4Cs2rE70DD9jMG1jTDIT0Fh9SpOkpmEodmg3VymwzWqZUyMrMZBnGzPYuuUqbUOKD8AnN2UMNecNbOcKZcW564w9upZErFAU+xmazjkGHggFvQk8x9hhqPrDGOaglRR9rljrEia4/sD0oMkVqz3UszuapHSk5jaLIaTcMTLS7JDYbM63WBZRFeSSrT6sbF0fGCvebkirh2mDekeLUy8KoEvLIraZ190MM6gPNxp0UonsXo3UaUYo9eboftEsXsCEOc1JKO7lcG22RR+Kw10kBy0DryDDzHCMeyYVI+G/OGrqLY+ahfJGnYIh3WtrDRHBciyT+b7bj6qEEZUafLUaBLGlfIVXKrdMpkGZTJt6F5q7SJqjIojFIwLtqmnGPGUqy0ArNS9bN5PLk6WYrwq3LQG+2w1sKVHJcpZdGOpHIWscYZHWpR+QVokurgM0Kk2BPNaHKtoWB2GYQgfQxTotne7aJ7878a7H93oyEhgAd/rdhL/AiucHpmBYc9ZGaRzXG2YtZU9WEXThYaFVi6haftBCO4DYzTay5wzE83UayfOKFf30njBwwca7zynU6c0D7uPXJEn14jRgoL9QvGs0sBjoOcH7RgITdHz8XkGnNUMjD+XsSKKNiQs3y986k4pYgiX95vEj2utGyWPaJ8mIuq2+Oj7Flr50J09LToVU3WxsPlWIbRzzXLL/r0Inyk/cxRl+yc/br2/fdThvXbOfsdEm5FxMLyecu255TOXVHElwDJsze/d5f2HBA9Y+vRO0nHGwbzftfDWp5tp7p0OM2D0PlDdE6gn5t6gQlEqQm8pkOIUhOL5mRiUbF5U+cRqTIxQkrN5xKhAmg2m2gazTY2HVAkXUpr/lJhnXghWL0Xg9Wcmmy0yaqDnmVlwOklsh42aA4nmpLNZyj1ZUHrppCKQb0+sRFWOousZVh9yfFpzWBtmn80p+QfbSDdqW/eCLbvgmAnJXoz2EcnE5LNoC9NSUYKDAeQTSwXufZCWLSYkKT4KCEUQbIX66mNzKSOopJFZbyekaRlDC4snMZet3wvDeI0Ytg8S9kExxazlM0QHnF+krIZ5jvPS1DybKaTzm/TLzDVKYXfmg12Cp432KnWo3OeiNshOeNJ8cps+c6b9ARc18K0J6L7M01nPolvJXObS7SpYjc6ezidG8U1GzvMxvYpJHVyn8p7IufN7qMTb/VJw/rUPillap/c8tS+JSR/xq7XPv/q0J4Z1evemT/rpmptqvmh+k+XaB9rf7jOaO8t0QT++Fyc2jcLeYzSOMlj116IyufxmHyMMlTIGPMfYuohRA0ifQnO5zHV4qHl+WyICiN/E+46bwla5K4WFuU/53FY8wWSxraUA5/acNI8UnqFC3EFmN3zGqdL0UQvxlDxxHc88YLVtOCpfXYXPd3R3ni6Y5qblregHYhHT9kixhGgVlrbDBfYXk1PfMRWO78Uo2c2eIEIbi8961o124wYkswKXBprhcONR1OwyYbmqdtIQFm1V1gGGHarP8TvPnfL3qv2aSfvJTl77548Z/HYu/cQPkq6PEXku/160bB/C7E/o/zVKZx0PfsUs9dHNJw0/UBni7YCm3Adi9ormVE02ZVwJDlftATeVkYSZa40xLtMStqFOeyMdHSsHL46avvloDbKAutGPiCZ5bRMV2EZO8Ja9dM+DBkJEMigc6Cw/KfMq2LkWJVK6CzSpBHUUqDY1NTal/Q48Yirv9v+7W3rPjj2W/1Sz42zR60bPqT/xyvrbrtFqwD9EF6yYN7SZfPmLuVPkkWTRgyajrbQ2Vvv2sZr2skHl1wTbvN8xx533UXKz963e2f83j17YhnTpi+l9GH1ETbOwvm4HKwga1IhIVdiAa6DRhHo6S2sVqLWbTJbYBd76ehqt7eu1k8/yPCy01zMGNAgDnTE6RbHHZBhwiBHiB3EpFdW0PGGdIp6So1Fy9uhSdXF1y3UjTdWYIirztsEhFsl/ktYCfLKAliibJKiKo8GHsBvMybz6Wuj67NVyfLrfyU1FuGWi58Ls6QG2EsjOexNs7hwircioBTAkUvYskbPN0np4bGTcn2GA534ZsfSGMFNS2PcNEhBgytsqmKLTsLyllzu71vwsVPninBNpob8v/luCz9S3CF0h+9C580qaRxusUV08CNPnoS/D/MjpXV/+vdhaab+93PENPKIKR/WppSepy7q56lbKR0t6Vw6UA7DHRZONk6PpgP+TObAnLmDNowWxLS7J7/fY8iG2/YivB2FU+Qqutal2AefEBrvxx9LSI33k3h2OB4eho6z2YCLO44WTswYIXZff/tj941/tx+bUa+9Q67nvoH7FZ1/P9pQ3/RmIePszZ6DhZ8IuWz4l2u27n9k3Nv9YVstFtMEieIqc/0oJ1qjOsKKM6LPBtZxpuPhWc8zQuxrpADWG0t0toOzCTWixsViSpalzYiTJBLP9RNO8V9SGlE4LKDtojpiioPBkaSVIjEedjXCoSOLxXRW7EAD4yKVijXGRT9KzveaEnVIkriYl3qe/4iYKRw9U+Awp8KBNNaBUF3sAPsLQJAkfU3TNZg89NBoeOVnDv1t3Y4PD0/7pP+QrXd+8ObUj/tiLRT5lZ8ufA3+MfiBdsp/VrFcf9HH4SYsHvohe8EJCjrdMYDGPL/1N81ZcD1/47y5a/lPCuasWT2zfPY1q1HGrm34j7Scnt+OGriPfppsIByN0nEP7sxIJOU090JjUDkO3XJg2CstGQnLSaOHKjc7ZbboAtdrjVNeyUfJq380P322d7NXoMcC7hq+K52XFOb0Y3MSEsUbZ29i2Z+UshHpHKUFzQYo0X0zlFvNF9CZCcn7KHxEv1XjfQjeRx+pMPS8GQpwn3ENP4q9pZe5fG4jF8+lsSq7ft6yS6hLcCTX6ixX/NEExzLsQXiGSD/zRhMS+8wToQGt/GMqb4rQ5j1wjoHuIdo0Hwpa8TDieH7IyJpg0J/GuvKxuSlMlVYGVfss0OjQDwgoqIpWc2F6RkCeEGYz8liyxFSQx5WMe+yxJ2TShZjm3lg4eYL2TSYZpKlkiKZKW+6bO6pw9U3aH9pbFl68Z/U950go99952mdwuWVr7ulsknkOa0uFO8Ur6VlNfu5FjiIdJzZHNBpNWOhujUsubwQZCAsL9Y/otU4MzHwH8EQn3Mx2/PuWDnXC3WVJdhIrvoji9yCTG72nQXZq0cv8yfvp6UTeClHxHXSp9tw/JMV2UOBUu6+igsRtdq9+IJHbz1oAVc6SjMvi4TcF4KlHMwkOWRAKBHkZ2Xb9JjL6weVr7rpuUb9FUu8FC7Rh5GltMJ+j3U4W139JpmoPkWnaDo4OXBI7iB1gR1WxSHqCUEGRep0c0UpHsegvutZpB9YF3uDs68wuxrmKk00Bmv+9mp1xrgRZbF51h6JsfLMcwQY4k4NN8vbTBiSfm47q8NFRHT4ZKOn3JYcR+Vibcrru4gRx5BWe1I1NOlYLMpLj/HMmqDloxmSacdAEmkL+nfzvX6w/VDZ9Qdcj77+vHefXk3xh1tHI3z/t9HO2XNuanjlxbjtLBtEzMcRZgE+QW8jOJTcyDTheBHHxRjDMRY/FCFUqAYoL1pa4I3F/gCLgBVwCfuOUZGQCYzY9ih+bX2ZnTzgJO0y2GQYSwNzkrAz+u6PbyAjt+OgBr+jHZYz865t5Z+xSnm1vf/3EDB7hNv0IcBdzZdxTXLyI5oFKjBMAXFmlUbYWak4+uJAYmnPgqEikNHVQyiuVIopLITvio4ie4FaECBSyKXXuCK1TzYzE8+h8wLwc+C7PQ2fWlblZ6UK4EM93xqxXSR5cpWPorExWg9SkTyc0U6xrGx84eYHY+UeEhFtYx7C+lo0Hh5AZsKrrXi6bfjlbVe1+7bjkpCtrHCbSfIUbV1lfZ0qvEswoFdNq3bBOLdWVrdMqtyCCh6AoaVFccByebrHWKYEIbQkqpuQqYuQqLkKSFCO5imh8EckVxvBJJB6m4jGcC9+FWQNU0M36h/KLDHKFwjT0xl2AHM2YItyMFuSH924n44FFBlIWQWKkEGLYS03ZhbHM/wM/T9QRAAB42mNgZGBgYGJg+Ph/hUE8v81XBnkOBhC4/EMjDEb/n/XPkD2EvZ+BkYEDpJaBAQBwyQzoeNpjYGRg4Cj+u5aBgX3//1n/Z7CHMABFUMArAKOzB2N42m2TX0gUURTGvzn33Bmo7CHWorYl0h4UFJSidfuDtqiZFiS6huA/1gS1zKJ/krXZ2mpZUZYRCEFBpQ9FLz1FFELQY9BD4IsVQQWrD2XQg9V07tjKIg78+O7ce86dud83Q9MohVzWXyCllI+zNIwSfi3cQYP+hmZdgt1WFYrpray9Q466Bz83IWT9RLZahyNUgxj9cWelvlkYE8oF0x8UOoSDws7/63UUxjlaixCvwlYewSXOQo+aQ76TiwM6Ckf7Edc7UKc3I859QlTuj6NJjyFOEdzmHuRon8xHEHdI1h4JA1Kf62mt6eckynhW6kpxQm+HY7vI1plYzT9APIk9FJJntsh5Q8hQ55GnbsKih9jClSjlC+jmPIQ5LtSggqYQ4GHZ7wzaaQO6yOfe53J0yzhmz0htr5xxQGpNXwJhSooGUETPsMz08HJk6E9YL+fNZIYSraQHKCAbT0SzdAE6Pe/D6ONRtPIEWvUQqvkLfMTo0w4a1As02uWoU9dwWbnYxx2IGe/NHBNGlB8x3ot6mkNQKKAxtPEMrqgkqqgDV2kTojI/qMZxSvoj+iXa7DWotU+jSbwv83xfAicBMll4OaRBEfe5yUL0qfBYV7vTCzksgkuwS/ej0csiDS+LKST0Cgx6vi+BPSG+5s3nkA4VuuNUiAHRu8Ko+Fa7kMNibqCYL4qaLNIxWQzhmFHnFVqcIGrMO6lf6FWTOKneAM51IKWUkH/ksxCeB99F+0UPSY1kkUKvxC3bj43WB7Rb77HN+o2wKsZRVYYKFZLv4yMGdRIJ00sxHKZO7Df7yr9RrzPElyIZT8HHXxFwuhBA4B/aQcOFeNpjYGDQgcMchiWMfUxiTJuYnZgzmKcxH2H+wGLCEsNSxbKEZQ+rAKsV6yw2AbYwti3sMuwO7Cc4TDgKOLZwXOD4xMnHWcRlwZXFdYnbhLuMexP3C54Qnh6eVTwveOV4XXgn8Z7jU+LL4DvDr8a/iP+SgICAi8AagQeCAoJ2gjmCLYLbBK8IvhPiEmoTeiHsJLxMhEUkSOSYKI+oj+gM0XOir8QCxKaJPRN3EF8gfkvCQ2KWxD1JFkkfyTrJY5JfpMykQqSmSD2QeiAtJ90j/U2mSuaeLJvsMtkXcvPkpeSt5FPkmxQ8FFIU1in8UvRRPKX4QslEKUOpT+mY0jtlG+U45SsqKaoWqstUH6kpqCWp3VEPUD+lIaWxSuOTpplmh+Y/LQ2tEK02rSfaHtpHdFR02nQ+6bbpielZ6G3Q+6Pvpb/IQMIgzGCJoZLhKiMToxPGXSY2Jr9M55ipmfWYfTNPs2Cw0LIIs+iweGYZYXnPysFqkTWf9SwbFZsMm1u2BrZtti/sMuyO2EvZz3KQcFjhKOPo4DgBB5znuMZxl+Mlx1dOQk5WTglOS5xeOGs5RzlvAsJrzr+cf7lUuPxzVXPtc33l1uTOAgAmbpZrAAAAAQAAAOsAQgAFAAAAAAACAAEAAgAWAAABAAFmAAAAAHjahVLLTsJAFD0t+ECRhTEsXHXlCgr4SsQNSMSYEBdgdENMeBSpFqpt0fgHfoUf40rxC9wYP8Uz0wGp0ZjJ7Zw5986ZM3cKYBUfiEGLJwBcMEKsIclViHUs4krhGNLwFI4TPyo8hwyeFJ4nP1Z4ASV8KpxAUjMUXsaallE4iQ2tpPAKmlpP4RROtWeFX5DW0wq/Iq9P9o6R0psKv2FJVz7fY1jXA1Tg4gYPdGzjEn0EMLCJPAocBo6Ydck7sLg6xhAdmERlMg7n+nSXL1cWZ4tad/x2WVnn7jYjYBwwHLKznPEPeybVfJ7i8mzhzKS30N0O5/2p2+2IQvYPXVv6bDEC6raYtzDg7OGanIvejzubkVU00yEesH992TufijaVhrIP4kzhXPRFOK8x1yEzlP3psmZE3JU1wktf9rfMl2ixLlxF92TI/N4N0f2AO4vIcdzLYVLnW8tkvUffOTqf1fTJ1PiqFRziBA1+s0rznNk2uyHOEX9EQbJVeVODlRbVDY49Rp69L8rXKGKL38mL7Mr79ehixHMD6SF0Xp3qNnDLrM2Mx1rnC3VwgIUAeNpt0DdsU3EQx/HvJY6dOL33Qu/w3rOdQreTPHrvnUAS2yEkwcFAaAHRq0BIbCDaAoheBQIGQPQmioCBmS4GYAUn/rNxy0f3k+50OiJorz91VPO/+gISIZFiIRILUVixEU0MdmKJI54EEkkimRRSSSOdDDLJIpsccskjnwIKKaIDHelEZ7rQlW50pwc96UVv+tCXfmjoGDhw4qKYEkopoz8DGMggBjOEobjxUE4FlZgMYzgjGMkoRjOGsYxjPBOYyCQmM4WpTGM6M5jJLGYzh7nMYz5VEsVRNrKJG+znI5vZzQ4OcJxjYmU779nAPrFJNLskhq3c5oPYOcgJfvGT3xzhFA+4x2kWsJA9oV89oob7POQZj3nCUz5Ry0ue84IzePnBXt7witf4Qh/8xjbq8LOIxdTTwCEaWUITAZoJspRlLOczK1hJC6tYw2qucphW1rKO9XzlO9c4yzmu85Z3EitxEi8JkihJkiwpkippki4ZkilZnOcCl7nCHS5yibts4aRkc5NbkiO57JQ8yZcCKZQiq7e+pcmn24INfk3TKpRGWLemVLlH5R6H0qUsa9MIDSp1paF0KJ1Kl7JYWaIsVf7b5w6rq726bq/1e4OBmuqqZl84MsywLtNSGQw0tjcus7xN0xO+I6ShdCidfwEvVqEbAAB42j3OPw/BYBDH8T5aVf9b2qqIqBAhT2IWs1osWLSJ12G22PAGvImrSbw5fpFz233uhvu+1OdC6mZsyNmmuVL3LF/bOh2Sm23I32M4Z32y9TE1yIwTMvWKrDh5mkFB/1AErIhhA8UrowTYB4YDlBaMMuDMGRWgPGJU4+RtVFTPYNdwrHYZdaD2f9UA6hyhqMlpLrbNQUHn5voEeqA7FrZAbydsg62l0AfbWhiA/kwYgsFD2AHDqTACOxNhF4wkIyNffwG5f2MBAAABV9J31gAA) format('woff'); -} - -html { - font-family: 'Roboto' -} - -.wails-logo { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABAAAAAQACAMAAABIw9uxAAABs1BMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAAAAAAAAAAAAAAABAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAAAiHh8iHh8iHh8AAAAiHh8iHh8iHh8AAAAFBAQhHR4DAgMHBgYAAAAgHB0gHR4JCAgfHBwhHR4hHR4gHB0LCgoiHh8RDw8hHR4AAAAfGxwiHh8iHh8HBgYfHBwAAAAhHR4iHh8fGxwAAAAgHR4eGhshHR4hHR4hHh8AAAAJCAkfHB0gHB0hHR4gHB0gHB0hHR4fHBwiHh8fGxweGxsfHBwiHh8hHR4gHB0iHh8fGxwaFxcAAAAhHR4gHB0aFxcNCwwgHB0XFBUiHh8iHh8eGxwUEhMSEBAgHB0AAAAXFRUhHR4eGxweGxwhHR4ZFhcfHB0bGBgbGBkhHR4WFBUgHB0AAAAeGhsiHh8gHB0fGxwcGRkYFRYgHB0gHB0AAAAAAAAAAAAAAAAAAAAAAAAgHB0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUEhIAAAAjHyAAAACekdHkAAAAj3RSTlMAAwYKGBsvFDcsMiUfEA46IggSJzU8DCn7+PXH7ejwhULUP0bnu7hRp+LQpFXzXL+jq+XXSZ34y+Cgl8KQ2sWIok1hmo1IMm9TsFizZoN1XJZEimt4aoRgLG/ctSdrZiB6d81PNt5/OpKWfnPH8q/JTEAaeyQ9f3Ba7OS9HbCIwp2MZanZlNPftpB1zY48md6yzrkAAIXESURBVHja7MGBAAAAAICg/akXqQIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYPbgQAAAAAAAyP+1EVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVhT04EAAAAAAA8n9tBFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVYe/uepOGwgCOs/JS0UkoU1YIENGAbKjEEbOZAYusvAqDGVAEIlG2oNPINt2dX8E8X9n29JVSHFMGVZ7fhU4vlt38n56etQdkepQFIbSUvLnawGtBCC0db25vd39gQQgtG+thNcOG9s4tCKEl02pkfABbDRf/9QrPghBaDisXXBt4yQqzIsMhgNAyYE6fBUEwLJLqcQQgtCw8tZIfiOgZ3ztOAISWxu1mggXR09aKhBLgBEDo/7ZyGvOBZHihpK+a7QTw/mjl80eDi7PD3Gm/WCzXihffGQtCaBFa3BbI2mUS/5i/GwArdHeQqxVOUvFOJhn0gWInyhX6edqCEFoIT2EbFIEDK0UwGhTxRwOA6eYqe/HMFoxhw0+rtbwXby8QWhyqX/KBwpeipfitGgxz9SUAxYdfJeEbSccOzly4x4jQYtEnI4WWuqR+KzFhAlgu1Ts9iSVZmGCn1MjRlAaOAIQWovXMBxrDM4oS4/fyXAL+b/IfUw4AJp9NJQIwUTBW+U7p4K8ZEFqAldMEaB3XxPpJ+ipxAjCX7gF4DxvxMAuT+SONo9EbC4KS4QRAaG68hTRoBRoupf7bKv5fUwwAT58bsvAb7DaXu201xPBwAiA0Tz0uBFq+1Dmpn8TvkakDgGEm9v+jVg/D720ffCe3FFpenmaHgcABgNAcdGMsjIi25Po9PJoQJ4BQ6uQFwPfs8zZcIl1t8d9YT54CoxMABwBC160b1+UfyFqtcv20ShoAk/qnDrk0XCZYPyNLCr3bAu0eI4MDAKE5+P6chVGxnlQ/LbAJaMHv+r9di4XgMqF4n/bQBjw8aQLgAEBofnrP9PlvFPn8pfptCnkAGPbfauyycKnjgp18Sx2aUCcADgCE5qS37wOdfZt88bdpTe5/wLVhCsmKTWIX2RSaCaCuAHATEKHrdV4fyz+dc2nq14Sq639F0q22YRqbWbvNPm5keYELAITmhznxgw67R5P8bbzRSvN2PlBSJ6P2f14YwlSGNbtgVctOTOofFwAIXaviDuilz25LF3/dVbpYU/uXw/TWoixMZbe4SrgV6gRQby882D9C89JKwJjn5x5N/Wqitf2ftH75fxF/DNP50pfKvyVyE+p3J/2P3P/jc4AIXStPnQW9UFbNX7tMz25XadK/uvz3VjZhSoHPSvlra2u3CGkATO4fXwVA6PpQhQCMGebl/Edu0yvh9CFNjyz/u1wAplW6w4cvWBeQL27e75crb0+4+vNSZJhMp5Phzc0P28PdTmyfOylk+4f5H/g+IELXJpcEMNj9o5X6lTX6ajMJz+w0uf23Sv33ozC1rSwp3ym4+eLtq6dftvwwBf/xbowrlAc9Co8FQGimPHEYt3Gq5K/u07kLaQjUaO3tv+tgB6aXuCO073j4OfX1QxD+BNvu7GWPbuMYQGg2ikYlltxS/m7FqvttGyCxru3fdXCVjNmU03nnzacvfvhrG1GuckHjGEDo75w/hXH+t2r+8ibdai0N4GvYyPJf7N9VCMIVBN5/JqeBzM5xrHDE4BRA6E/VAjBu41DO/5bE7b7RAYDwT5pW3v5xFbbgSh7DdfBnuHIPhwBCV/ejAwYy63L+Mvca5weAuF1a/nv5/JsbYB5bpcYF/ooAoSuphMDA81Ul/zWe0H/2GADYE5vSv6u5A2YTeFrp4RBAaErnETDga5D8pfrJALgbBV6orLz976q0wZySXM5L4QxA6FK5IBgIFKWrP3lSR+h/PeUDXnsg9+/KpsHE/NFCi8IhgNDvUBwYSQ7k/NcFfP+VHRAk3HL/5SSY3s7+Ic4AhCbqDcFIZ03Nn/R/PwJElGz/8f13O2AOvuNMpxONRBKJ3Uwm+djooEF8dQAhQ+UQGOHIzb/0qK7w50cfEB3SP+/gMSyeb7v+5A55MlF9fcj9s1zg4om0D1Qb3ABnAEJ61n0w4q+sild/J7G+/iAMoq/S4T+DbTCD9EPpLUJxCIyeIZCv7ZXSLEjae3k8QwAhrVYYjIT6bjfJX+7/mx9EJbF/G8eCSTy/SW5QdDNAPUfIdtZMJR4DET7p4jIAIVnRD0aCObL6d0rWf0ZA0iH9e4rHYB47L8iMIjOAjACjo4QGB6UgCLYrroWPgPxRz2tBaNGqYGjjrpvPX+2/EgTJ8aqQVPcpmIr/s8Mh/Jxra/oJMHqccKvyLA0AgVRrsXcCTRYAfOnSXhZfYUKL4y2BofQN6fLv4DmdN5+DzHco9NQMgNk8u+lwkFWAdgIQ+hPFe+XUBxYSZWZx0Z2ARiDzrNHv4kOLaO56m2Bo86acP+n/RRIUDb4mexxMKHPX4dCsAeyGE0A+VIw+rSba1d5iglupw7hQpJrDYw3QPJ0FwNAXB9n8c0j9v/aBosO3NDDpoz87D8kE0AwA/aeKjB4r6Mpxezlq/rFRMZiA3azX8E1GNCdNFgxFnCR/kfP+Lqj8t2i66QeT8n+WB4C+f+0EGDlZ9Huua51zad4o/FaYO2TwsUV03ag6GPu6TvqXvAuAxr5Jl/+yZw5+AMgLABsx/uGiurOF59yZZwiXCj3NnuOzy0hnPtehuJz/TQcvBSOOjsJgai8dZADI/SvxE7c1A2BRE+BHEqazXc3juefoutDbYOwT379QP8/huPNS/3CA+Xb/daLONfEOgOSvti9zCbwjE2CeiXU3YHqbjR7OAHQdeulJ/ZPL/02x//ubMCroA9OLOG+55f7l8tX2lf4XswQ4CsCVsJGsBz8BDc1aawuMxcT+CcejLfgXJZziAJDeV9bxElZi7h8wnHsMV/Y4dmqd/Q/psqDldRECY1GSv8jx1rS7/ZfYXRcHgMejbPnrLWYAlH3wR4Jcd9bLAKras6Al1Z9Udsah6T8F/6yEe5UMAPJxBZMxpP/5DYAm/DG2dDbj7YrzdNaCllKFBWPhOyR/gt/++4fF+CWAOgAYsXRmHDXPAVCFvzKseWc6Awa+Om4pLKMDmOD4Lun/zh3+j3ub8E/jpCWA9Hmlk81vh20P/tZGg2aY2Y2AJkRxJ2D5TOw/eE/sXxgAj4Lwj3trtysDQMl8Uv/GRZnq+i/y11tWZma/t3gO4e8WtFwm9h96QfIn/b/7V7f/frF3rk1Na1EYbgq9UEotlELaCR0uA+VahtsAw8VBFFFUlBEQEBzAg6iMNzzf/Atn1l8+OztJV5I2zaVJm9T9zJzzwUEdk7zvetfa2dkIvy9HAMkAOC169Xuv/y/gDvyzj65ZQPcVDPwbCrEVxr8IQ/3nS1Eif0n/5wFY7Tdl5gl1ADECoM4rCJr+CfzUe7Wp1fU2iAC5R2zr0V+Eof75C1H/lMSJb770VRcDUdEBSBMgqqXJ+n8LbpJb/+OSBTzhAR6y3Yd/Dcb6v0T9X7aG/gFmkxFsAtSPd8P1/wpcpvAlVq8FoDNNhZkF/B0YP4cHRP4SiXtoGY7KDoAGgDTuoX8K7jP/NOWGBXDfAWCVOcBfgbH+96j+43Gi/6NWqf8E/lp2ACUChKwRAP0TNvb76rYAjtvhAWA7LMEcoJV5ZPwoxRNE/lT/B9BKrHRIDqCMAULW8cX7fyZ8f+PYAjAFPQbC6zCzgFbnBw8G5LdE/VMDWIfGMzO/cDc6t3T7eWl1anxu7O5U4MEt9tL0dYBUEx3gBXjI9i+1BTgygK4VIDwm70kyB2hlPuXBiK+J3rik/8/QMPiJtdWjy4vSYvZBJVvHN+OTM+ACb5PoAE15sh+Bp0zspuqxAI6wCyIvy69GMwdoRd4JYMRUr6L/JWgIA3dTR8eDGuHHq/CgeL9XgDrJP6HvBOMgMGRCsPRPGP9A/m240mnfAMJnILIvbY9iDtCS/JkAI66I/im9t+A1/NDcwcVINmus/F6EmsD5NwHq4iotO0BTmoB9HjxnYD+lXhCwbwC/Z6hVfmoTYQ7QivQsgBHCiKL/G/CU/PLS+aBK+9VUn9Ag+8D5MtTD13RTBoE4d/GeZ+8d9AFoAOG3IDL/u69PsQDmAC1F23cwgr9Q9H/Og2cU1m6Psyh+nfITSFRN2QhKs+AcIYoO0OAH+2MeGoNwKO16cugAbZMgshxLpfqYA7Qe3BkYsq7ov5QHbxDGDkpa8aP29bLv0KAygulRcMxSp+gAOAYINYrfA9Awxt5ptj3ZjABvgDKeIvQxB2g1XoIhs3GZogBeMLR9nEX1V2hfK/v+CtAIEufz4BB+pLMpY4DYKTSQmae2QwAaQPcmUL50dZUdgBlAq3ANhkwMxiVGJsB1CmM3i1XFj9ov6z4j0llBhiD5QDQaH+fBGZudDW0CsO9qLFPtxAJshwBpb/Q1UPg39NvJzAFaifcFMCI3HZcYXgCXWVi9yBIqxY/ap9JH3aerItsANYHSCjjjRHaAVF8DmgDsuxrNVYfdEIARYBIop796pBDQzZqAFqGvhraPlBX3O3fT6OzRFpb+CvGj9lH4SZmImiRFcQHiAfE1cMR8tDMdiTS2CdiGxiPs9qhDgB0D2AeJJfopdeYArcMzMGQyLrMH7jEwfj5cpfSj+FH7aYJW9u0aIhKSC1AP6FgCR3zOdGqagFANfPcBEBvwL3tshQB0gLZTkHgeizEHaCG+gCE8aQCoRFfBLfJ751mCvvSj+JXML0tfL/uYBrURSB6QyXzNgQPyvXITUHslIEgvABrwLGIrBGAEOFQMvJM4gPRnsDFA8HnCgyFL8ThV6SW4A795P1ip/gShmvhR+niAZyVlI1A8IPN8BhywnsEmwMvChpe9WSx8lEKADQegBpCaVywkRmAO0Br8FsCQlWycCnU6D24wtL6YJejVj6Wfih8LP0ofj+3V0yUi2QD5YdkCigVHnwfDJsD7x3pnBppHYR+/gmTHAV6BzCG5LfIfwZqAYNM2CcZcSFIdXoH6GVidNlC/Rvx67asP7Ce0VUB+kfoA9QApBqTTu04c4L6fNAENmgN+GICm8hgLuIhFA4gJioPstLfLDsDGAMFmHIzZk9U6CvUy803b+OvVr4n9qH1Z+irdd1eg2AA1ASUGpK8dOMCGeGg4+dsbMAfs2YAmM5q21wZIY8BtkJlrlxyANQEB5xUYI4xIcr2FOpm8H84SDNSPpV8vflr08Yg+YyQbIB4g5gCpEbjOg20u+hs0BwyvQdPZ2LHcBmAEeAMKP+iNYmOAgPOGB2NuJMVeQH1sXhipnwZ/ufRHCCh+Vd3XKJ+rRGMCfTQGUAs4BNvcdWQkB/A6ArwGH7Dy0b4DtJWbwe/0bokpgo0BgssHoZYcJM1uCVAH/FhJL3+9+rH0y+Kvon3ODPpTsgXQRiCSXAfbFPszNSNA0BcAtcx/0gwCLEWAx6DwIlI+VolFgIDSfQXG5IpUtNkhcE5urpglaIs/Jn9Uv178qH3OOtQDJAugDnAGdtnrwDmgdxFgxy+Hqg38jMUsDQLQAT6CwoS4Ztr0r6ky6mEVanArVe05cMzMannVD4u/Vv1Y+qWev6b4Q0ZUt4BIp23v4gdJE+B1BIitgF8QntAajg5gHgHwmj6kN0/6liIzgCCyDzXYkIR76by83I6g/Gnxx+ivUb+u9FfRfsgCKg/oVkJArwA2+ex9BOBmwT8UfuC5SJYcoPsL+ntUvIGxGGsCAsqvmvI4fiCyWABnTBwMovw1xV+Z+WPw15d+e9JHVA7QJjnANQ/2WIh6HgEeg5/I71pyAIwA76HMVJI1AUGmZov8jerf6da6jfvhavLXF3+qflr66xM/ogkBZBZ4AjZZ7Oj3diHgOfiL3PN2K6NAjADfsWF6k1SaABYBgkfNUTQvTQCPwAnCUVYtf8z+Feo3LP11JGwRbAO2wR4HGAHQAFpxAFgm90izns+ZRYAvqioh5Tjyu1kECBx/CuYBoJgH++SmRkzkj30/Vb974kcHKLcBEZsd91VUjgDe7AjoOgXfwR/SKm7VAX5CGf4/ejtJgmBzwMBxZhYACJNgn7Vpvfwx+9Pir8z8afLXqz/kBhoH6BBsrgOQCODZGJAbAx/Cn5g7ABpAXx7KbJNbSpsANgcMGo+gFntUwutgm9OTqvLPZNTFn079vFI/OkBYcoBHYIsjGgEi7Z5EgIfgT17hLM/MAcJhVaYqdFAHEIcILAIEitoNAD8tang6Zzv939LZn7H8sfHXqz/kLhxBcYBxsMNmItrvVQTYBZ/CPzd1AIwALwG5SafJfWVzwMAxZh4Asgtgk6ESln+d/JXsrzT+3d169XvmALHkii0tZD0bA76fAb9S+BkxcQA0gCeA/EPvLbmzLAIEihdgHgC2HZf/8sKfXv5Y/D1Vv94B7B2+dR/FlUBXq1p4GfzLStSyA3TlAHkhTnZYBAgYtRsAGBNlXMw5LP+Y/lH+pPVXsr+x+r1zgHWwwWhCigBY1Vp8ACCxnDZxAIwA3wG56xTNMsIiQKAwmUVPi0LedFz+Mf3r5K8v/iFvKb8P0GPr8zv5uDQGxNl2yBV+8uBrnkUsOkD4Mai4Fu8x/Z0sAgSFFyYlUBTyJdhhQl3+K+WPrb+J+r1xgK6ep2CDEo4BXXymU/7ZAmTAutYBjC/qrsY3WAQIGh9moBZ8iUh5eB5ssDaiL//0tR+d/LvN5e+VA8SGwDpHnvQA4+Cc0eLN3AJ4zklNB8BrugMq+P86O1kECBSjFgLAEliH/6wM/7H8K6/9oPxV2T/UGNABUl3XYJ25hAc9wD44Z4Huqxo5WVrOg5fknkci6jeCjC5pn9YvadJjESAwHEJtSACwNQEUzrXlX0n/zZc/oTwIHAPLTCb0PYALqasAjhGK8tYKwvHnSfAO4T9LDhCeABVXGfodNfY6YEDoEaAmszYngJNbqH99+pcOj/C89TdfCuhLfeRtHBHkeg/AbYJjche4tUpk8H5PAI847RDvGn7nz+CSzmpfnCD3m0WAwPDaQgC4tJGXh3H6h+U/mawq/1DDwTHAGVimiD0APtJNOwWQbq3UHqIYL20PgSdspqkD4Of+q17RbVBz1I8RgNxrZgC+5h1vUtDJ02Z9Asivq+M/dv9i+feD/FVjgF2wzGVCvyUwVB8YP+zzTb2+QkhQensXbxfAA8aTFhzgFai568/Ih6qxMaD/GTOvN9Y3AfE3uviP5Z82/3Ty31T54xigax6ssoQ9gCuPdN8pOGZjEK8wnp+coBSXJsB1HuLmnrCRAejM9EE5ArAewO/8gNrMkOdtUABr5JWtfxj/pfJfmf5DzYMjiE3AQ7DKGhqAK4/0EjgmP60dsBI6CFECtYHS1AC4C3+dNFkM5Lh3oOGe+j5xfbYS6HfCZrFxLpu1vAlAOC7rnz6cyvC/vd1H8scmAJsfMwZ6XR0C7IJzjvAKK99UpHSIUA/o/XoHrnLab+IAHJfSGSa582wMGAiegvkIcHEGLDExnSWU239J/9j9+0X+2ATMglUGe+lCoDtDgNQAOGZMrf/yWSqETCZDXYAGga2pArjIqhTnjZcCOE7rpXxcvPesB/A/ZkuAMESet3GwxNCiOv6j/pXy3/zmH5GagBdglfOKIUBzjgFbGaHXGB1WnLBKdBLQBOI3Q+AeJXobjQeBHCdU6wGSbAzod0yfxYNsditnTf8juvafxn8fln9sAnbAKusuvgnwCRyTK5UjluKw6WQZ6gLoAaVRHlxiPqpaCqhqACugYZZkE9YD+B/TLjhPRoDfwAobWv1j+cePzNuQv8HPuewAfXnLIdi9IUC4jtJ8gPrHBRaEmABNAooHFPfcsoBn6ZpLARw3qXMq2gMoL0+zVwH8ypiFlrPIW8qm2vyvj/92y/+f9yHvwCZgGSzyLZ5IyDWtXgN4C46Zla8x1X95gQWJENQeEI0uzrlkAYfpWoNAjlsDLSckArAewO88ATMus9k5Sxlxq5r+29ttln9kO+QdGAGWwCKjouY63NgO8DvvPIhLIUu5xOXXK2M9hBihnaD3gJHxHLiAEFcGgdXGABx3po9M9BlgPYCv4RbAhPxwdiQP5gxMq/Qfda5/5OFhyDPQAZ6CRTbjbk0BR8Ep/AUOAGV5SZeYkBL/R11A7QGZjGgBg3PgArP01T6jMQA3BVqWyRCI9QA+hz7+ZhuBb8EcoYT6x3Darjtp2hb/Fv6EvAOPtLDIpNoAUiiBRm4CvlUNAMpD9hg9TqGvjfyXSlXxABoDiptQP5fppPGZP9xrfelIRFkP4HO6BDDjPpudB1MKev3L7T8eL0WwK0/hLOQV6AC/wCL/xN2ZAvYMgFM2NQMAqn95wlJGMgG1Bygx4GID6iU/jGMAdHQjA4BpEgFYD/A/e+f61LQShnFSKBVopS0Um07LcBluojBaGOiAMAIHr+DRQY+i6CggHD2jovjt/Atnnn/5JEvSN0mTdrO7gX7I7zMzbei+T573srttzRZaoY8UfqE1b/zi33PFbGhqeNwRESQAKXBSUSQAixClskAFAIp/a3cFI5frNHBqANmAnu7PZUiy1JcNPO1X24SHVxcqFc8CtS2pEk/V+SafNS0oin/iISr5jmjRtDw4KbGHk24DnEGYN64CgDP+Ew4cGmDbAFsCBmuQZJ2VAXyTAK0GD9+6HTlAXARoQ9bRks+Fv9CSicD4p/RfgCEdNTNGIzw2RNMy4KWf2gCmCRYTgEQVotzxFAAcgzkJzYaMgKkB+TzZACYBt6qQQl8ISAKoCEjs98Y5QFuTv82TAUxw7E4NiH9W/pMI3kngD42hXgJoDwsv4yr6gDsSHUBPASCZdMW/rwZkMh4J6F7VIcPojaAkQJtuvE8pzgHaGo7F+IljCGj4VlD8k/0X7lEcD0WsAEPgZUpBH/CDDlEO3AUA2pxDEusWgZwzFSAJGP8OGVbZJ/v0ArVH8PKeDlGJc4D2IzOMlmwWZjlTU3tpysc/8QHAlqZFKQFaJ3iZUyAAs4oSgL7AqTwfDfBKwK8SxCkV+vx7gdpbeDlluUpcBGhTeNzo+5GWKnGqPP6JUUA/1zQtwhuDc+Dl4Jr0dqBtiDJDCQAVAILn8kkCcswGuCVgfBTiPAk48V+bhJd5Y0XERYB25TqHAbhdeMHRmyZrypamkvinKuWslrCIQgG0BHj5KN8HnIcgRXcCEGTDCY8N8EhAzyLEueX/6dpNeKmwJREXAdqTL2jNSmEGzSlNeYZTs/LxT/yGwVEiUgW4RAH4IZcAUAcw+HQOQrOgTMAhAQNPyxJ1QPIfjo/XymhgwVEEiKeB24shnhWw+oZ3dyoNp8rHP5EYBjDBnGwuYXKVAnBw7ZqcAGhVCDIz4koAvAWAIAIkgM0F/LcGUX75JgHX0chX0wLERYC2ZA8czD1Bc266hlOVxj8Vln4Y4W9Pu2kGVyQAc7YApAUF4KlkAuDtAFL8B0MSkHNLQN/AKQQpD7Lf2fMNXqORF84iQLwdoJ3orKA1lbFhzuNpqABIZ0aouDxnj6lMrtOELhK9GgGYolFAIQEYqsglAN4OIKXgYSXAygM+FiFGzS5COnOQP3wPUYmLAG3KLjiY+IrmbHpSU+8FErJoRzDZ6LRgCqBYALijYERyFngHglRcHYC+hlk8TgmgcqBtAjZKEKI47rMn4CUambS/cSwAbUauAg5WJ9GU/bGA4VRVL2qNFQGwnBky6aSNBVchAP1yAvCzBEE+UgLQ0+PbAeSXAMoDTBNwWIEQkzcak4B1NPJpkN2pGo8CtR0PwMObEpry1ZOappNK45+Omdkdum4QiQL8BCfDLgHIhBaARQiyxtkB5JcAMgGFexDi/kCf14fMopGZwcG4CtiOJO6Ch1doSrXpcGqHNHTjXPnf6yZ0sniHMk7AyV1LAAbEBOB1EWLoU+4EwOu9ZSQgne5dggjzN1yVCJMVNKIPDsZVwHbkMXg4nmhhTX1TU5UhqmlHYGxlTAwFUG4BHoKTqpwATEKQvxsTAOeLV0QCnMXAAbEvdsvZi9BMluHDeFwFbEvW+GReRzPucaSm0gKQKMOk9M5SAOUWYBecLEkJwG8IcjzmtVkS/2U/E5BdhAArNwbcXiRRhA9zsQC0I0fg4iaa8os6ALypqcCCfQvGYt7EUgCVFmCV2/WKCIC8ATjgSACEJIAqAa+KCM+c59aPc/jxdbDXLpvEAtA+1MDFMppxTAbAszKVCsAuGPo7dvY1O/9OqQV4BE6eyAjAEQR54q6zehMAUQmwTcBFGvBSR2i+s29D84Bn8OPFtbgK2H6kdHAxjGZ8rltTWpk0Ha5MAbZxwVbKVgC1ScASOJmV6QI8ghjDC2SzghIAeROQfjyM0PzlbgVuwI9a0y3UPztiroIv4KKIZpTH3AbAuzIVFwFQTqZM8qqzjAp3MU5iDuC1zE3gHAmAsAmoK0ARYblpClLdkCTW4cdk41nqzoXYESOEfA9QnjtkTb31oA6VAlA/aGbPWKmmAKjtM+TAywsJAZiFGDc9jdaG+VtJE0BpwANZC7ACP5Zs6fI7EiC33BFzBTyGCt77GwBNuQDYfmW5y4BZgCGF1aR34OUze9oekb0A50UIUZxrrAAqckCaCaUByeQ6wrJibUtiFiDgktWZZluoTxDnAFfBGhRQccT/gGd3iloB+AMWTy0FUJppPOdXvH7h7cCLEGO64P0ve/fgKksDkskawnLf8cufwZdSMwHYxY+OmEtnGyqYpaVJqWBwTGTEK1YpWCx1WQqg0gJsgJcFYQH4V4cQw+OeBECtzfIUAtKTobNAx6n/e/Cn0CRtmsZuR8ylU4MK5hoNQLP38onEKj2GxSG7CFttHfAL/1aAftETgf6EGC9cCYB6m0WFAKYA2U8Ihz5G1Z+38GesyWUKy/izI+aySelQwLLXALSwphsSi/QOLCaTtgKoswCz4GRUQADktgEuj3lHAIKfXL4QYChAzz7CsUmFiTL8GQkeBPgJTNa/RTwhdFl8gQoWCwXLm9rHPjeNiKE9iTW6B4vif0wBUioHDvfDzAExAQh9yO06xPjK4j/aRqtbAU7KCMXwoC1MRwhgJHgQ4BC4d/ENYgm4PLQZqOCNuwXQygA8fCixRKlOV0saKLUAP8HLaf81n542B5nbEGLJpwJIjdYoFCDV9aOEULyylekBAhgPFoB1QDc+PVaAS+UPKGHckQGkW1vi+ddKru/Uuy0FUGYBHoKXj/S84cZa9yDGnB3/HHVWZaXAjSLCsGy7+2kOAfCq5jyAD7ECXDLTUMGMdwaguQE4KSVkFug92Gyl08mkylx4C7zcEhQAbRlCfCMDwD8CIK8AeyGdoPXdjhHAQmDepN0GcMY+nRErwGWQ16GCiXAG4O2k1Pok0Sr3pdNKLcAaONFZzUNgY8shhCjd96sAqo9/agZYClBDGP65+IccIYgFv8optaM32EdbxAoQPS+hhFMSAI4S4DZ2JTcEkhFPp9MKLUBOD9MEELoefFL4GJB+gUlLcQmwFSC7HO54UPbtdhDE/UABYL/qjpZwEAtA5HyCEg7Y+5D37tc72KaVJrA6z1BnP5tOu04e6ZDiN3iZ7hfbCnAOISojgpOW8gpwWEQINlkbaCmcAJAyTrPjyhmxAATSblOAwHiYDOA3Ku7Lq8MuzkwRdZ5mjWhQ5od3wctnwTGALQhAe605Ji0VK0Aq9WcopTJ3R1xDIFNB45OJEgy+s+oDI1aAS2AVSrjbmAEEB2OiilkKf4Z4FRBrhgCkk62yDvXb9G+JCUCuDBFGC8J7reUVIFkNZQYNh7LT4jYVv6sBzmBSMeLfJhcLQNQkylDCqLE6uTOAHWDDjn+b0MeCEQWmAIosQAWclAtic0AbklstewUqgNIK8FwHP/PG/2SpiXAGJU6WaGSMyK9f+hCfGhwxD6GGf1g48L0PX+vAB4p/IQXYArHal80KWADJBH2tX2wOaEmwySK011peAdhEUD61Dn6KIz2FooAArIFxbh5JYDIUW4DoeQs1THjDITgUtTWg2qHJCcBTEHf7+rKqNsY+Ay+L/UJdwCOIULzV0AKkGcDoqM8E5rs+gZ/T7lcILwDXi2CcmPHPDnweii1A1PwsQg3f+MNhD8CuxqBWT9gbLX7DwUZfnyoLwF/ueuPuAvIKQA0iPAk2AB3RQQqQyZ/o4Gamt4pg5nxPUqXxiB9DZvjnmQLEAhAxu1BEzVyevb31EkBnYDg8LwJ6isLfJLwApFzhYQiAqy8mvuCX+dvd7ifmDMd8ScwAyLYA5RXgC/g5RWgBoHL0MyP+8yYZQ+Piq4OiZRSKOOUtiX8oA5im+BcUAK0CQu+1LYBsY+woRNVTqAmwK2oA+rkPW4lCAcxC4Bq4KbYWgB6PANBafGCOHtjnPccXB0TKa6jiFWcJILcEgzMr/nMmIgNfmuZajp8HmALI3zWzHmL3M9cTe6lKGwD7QQXcsVwrYPs2lDDlFgB7fvIDLHbM+LcUIM4BfGmzkwDC7IzbhEHVOoU+x3q9OSEBWISD0YEBFhddsmXA/RDnAQY9sfqxq2/uGSCBcqe0ApiFwF0oYcxXAMgb/Zkxgv/ipLc4B4iYKlTxla8GuAeTXfs2OoaYAOx676YWKI1JxOftglATYAsCFKcEWoDqm4GZ1D4UUArYQfEdFtP5VJcJO+ZlKBYAD+2ZAeAVV0n8JUz0FEsr6+REBOAQTmo37LvIpW6b2gEv8ywkafDpuvUmi+LslW80AyTTApQvAzyFAmb8BeAcNm9TlgCYv2ZcBIiSHSjjlGdjzDMwZtl6co17JUILwDs4qRjFcQUW4B54eRFi8Ik4gwD6lFwLUJ56GWAU8oz6C8AebCaM+K+f8xRfHxol96CMaeqJBYbDjyIYv1n8D9G4l4gAJHQ4mbMEgD47Wkc01S9SA9yEAHcaDcBlp8Z2GeAZ5Fnp9+0CfKI/SHUlGUYOEAuAD223EdBksnVP7HkJjEfWPbTmuJfwvKemudVr9oatAFQei9ARzfCWAOQ3Xuj3hQ2A+jLAEqT55nulssPQfe+yBaArFoBIWYc6lloKwGMdjNK5dQ81gymAkABMqM8BRkO8ld2HAfAJwA8hb3X1BoDKAIeQpuZ7pfIX1PlkxP/FIS/sUeMLxCNjH+rYbyUAD2Cxww6bY9NeEuOemlaDizmmAFLTgO/AzYFQCWBajQEQr4zJlwHmIcuqX7XIqb3VLiP+6ZinWAActG0GAH2kaTxQ/2smY8S/Gf4MCQHw+JfZHukc4At4KRdESgCdJSEDQLuAxIeA5bGSgOeQ5ZefALwGsZ+MBSCQds0AgF/NBCAxC5tnOWb/89asl7gAvISLSrepAFJlwJv8eSwJQAjNESmhlRbawgBQEjAJSQ5IAOhK5R0QM0b8Z7PZi3PeYgGIjmOoZL6JALxzlHhZ/OfzKWkBOIRvDuBIyMPyshgiA6CuB/cnvpW6cbU7+MbF6KFOwAkkmaP5CVopVRCVZDprEgtAtBxBKfpYoAA8oyHy4hGLf2vWU2bYU9uGNweQLpKflXkzAJESQL4oawCYvMkZAPkk4A58kbpSeRsOykb899EZL/EoYERsQS0fAwKiswZi04r/LoaUAPyE8hxAOx/lywCESgAbCM+dtjEA9SRguwgpCj7l4nU4GE5n+wzMHCDuA0bIMngprQ2jNdV+XwF4XgVR/pel/10WKYEMgJaj3pAD9Ax4HXno04a5bPqB0BTAtNw2QDIAUvEvnwRMQ4ay3y7qfTgoZ/sY2VgAouQEXBSrswdj97lE/5unLc7mOx7ByeP66z/pFACxuwGO4aZmWgCxVUMrPLceMgNId3XxNR61YYRmpY0MQN0CPIcM+yQA9V/qCE7uGgIwMBALgDzyGcDo6v2CwSq4+Ox9JWa2dDhZteLfmvPqktnvqWkrcHOvm1kAoRzg5WE9y90ohcsA6OPU7wN4304G4H/2zrynbSQM47gHR2gJpaE4URJxKEBCCeISIC5RlnL0oqjQQjlEl7KloN79r19h9Xzltcd23tix4xkf4Kz8k3a1f3RZmZ3nmfeYeacSAizCBzM2o1TNa3FW0b+CfrI7NoCQKMKN/NzjbpVksgQu0qempPjdQhYm5ru08P8ug5UAtADAmwEMw0JvzVByXqQDLCt/Wlvf3yeEMgAqVAXede1zDACarh+qA36GDwq1YxRuzZqNvP1hT09PbAAuhJ0ByF+mdPknV2TuFVs2tuCW50uwkDuk7V/BXwBAk8GJc885wDcAgy3GabfDGZd7AHxvIPifvvYzWgGAEQL8kuGd8VoD+G1ZRLEBXANuUX3mWJO/yg74+TC+8PL58pcDGVbSa12a/O8paAbga+ST9BIWCs3N4jkAdehnz4z5l3c36z/SmfTQBDyBMBNVhwAjEQAYIcAgvPOp1gCmLUvoYU9bm+oAsQGEh+QW5l5U9N/aWkIAyK/Y9s/kzxzA78AX6Tks5AU3ZetrIOldbe5F1527q3BEXvHUBNz1oJWoBQBGCLAF7+zX9E9+pGHiqqdNITYAn/irSM32dysw+bcOIQh2K9t/p/IXjXvwbgAbsFL2lgNQQXTuvv4k/t1zGQ7MUwYQ7jHA0QHjGmBkAgA9BOjIwjNTNfNAXsDMvGEAnbEBhMa2m0+T/lNzCIA3+vbfqaIbgL+Rj9JrWFkVzgGsz3WW3j3qYJnKvd007Ln0lAE8yPg4BcysJgoBgBECLMArWeub6rfvW92k0BYbQNhIObeJdwqa/FOpLPyzTPLXDcBjBYCQzmClz1sO8AREduN+l+ZVW3nYkev2lAGseRwFaowCjkgAoIcAT310Aa2jo9ZhYbCtWTHyttgAQuS12xQ60n/iEv55YcifnfDq9BEAENIhrMj9zfz384gPpp+xrBtA58AEbJijU0AiVrMNUQYjcg3QNgSYgUeGrQcBby/CwpfYAEJn1a0CSPpvXoJf0s9J/graRU+PZwAIqQU1/Kw9nCPeES206+HKv5Oo5bEhS7EVegBR3mr/DyIWAOghwDo8smc1gI1ai22ODcAv/mbTFfuVtWfUn8rwS3aDyb9dgQIArxVAQrqFGp7Rxsw/F2gEFmZf39Ucq3keVmZIliLlxj8Q5UM0AwA9BGjJwBtvrenTEqwsNKvEBhAiG6jLpa5/ln6W4JPZ7/rm/1CFBQC+EgBaiKOwkqUzc9xFgJY0rKT39ZClZ7z2bE7SSwbwCqKc1gQAUXklh4UAw/CE3G8xgO82YVxzIhEbQKjMu91AoZeo9uGTQkJXP4MCAJ4EQPyVjRXe2hzxBjaMKDbFfOuTtQSY5LkH4L8EMHvzo4DrhgB/wxOz1gfVNlHDUYIZQE9sAGHhUsMt01O0zSsT8EXmc7um/h4VZgA+EwBCmkQN5/bdOfEHwUv/6FWLUxlVLFRSI7EDByUIstNtrTVE55Us1QFaZHihYMmf3tn8mMexAYTMnNtT1MYBlNSqDF+UBnTtK41d5e8m/fteztISahh3iM3F06HsK61p2f48gwqjvVptlGyG77/SIUOMfC8FAA+jFQDoIcASvLCaNL8KsI1aBhIKsQGEx4+0WwtQX+XHH+ELebu5rQolAKACACUAnpHeo4YDmp7P2QgswAH5L80A2quioJFWlVRCNNH45nEWMDlNFA4BVVANYBleODW/qHiSQS2phAILfKLle/8bNlGPET0AWFktwh9fHzcbtCmwC16d1AH0vZylTbsik2B2fghnCm2aBaSujJ8+xfSvy1LAZV6AG0rDdKeJXACghQCv4YUhcxfwBWrJJ1KGw8YzAYnragHk2RTKqb0SfHKg1XLIAQLSPyGNo5YjXZy8BjCNOnxc02KAHv1PDaYYCeHTBvMQoxTFU8BmA3iUgTij3aYa4J0caplNmQ0gngocLPdzLmeA+vdHJuGX7J66UTKaVUj/fo8AE9IwaplOJEQagS5X2zPrmgO076ehUE6wxSlcmb8lKpY9MoBIXopTHaAAcUrmr3oJGz7EBuAHaa3Jx5aH9MVVGr7JXvSzUFnzAAf9+zeAEdQyI3ZIfxouzD3UHGClCMw0J1TomBrvvvwbYmR6rT3ASAUAmgG8gThfTE2AwzxsKFQZQPwugCgd73fdbgGETulcDfQ0B6jW/71A9E9IdurNCF3T45htM9PKHOBhah5HbUY+I/gOqahWnkX0FLCpDPgPxNkxNQHs3XdcXTixAXjj3SJa6ncAigiX9LO3SQUyANK//twr6d8n0ipsKFPe7K6aabiT29KOMffstSlon9OuLk7+xHwTYhxH9hBQ9fzkPIQ5rm4C/CvDjk+V4mdsAKKc5TFZ/3nKGYSJ3PdpQJsiRvpX9EL9/5b7vvVPSNuwYUdg8ZzI4EDeYwbAJtW1KYjPq8tBiI+1h4CiJgM1B9iEMAPVTYB52LIfG4BX3mWBEfZPkopt4yw8MmN7U90kf60IaE3//eufkBZgw2CKv4W0yhuSt7XrFqBijKznfqTrh5dRYEwF0TsEVJUDrEOUieomwBPYM0QGoHU/Ivbl0eXXBIB1pn6DkF8DI3Lj++wKIcnftP3TCDDSv28k28+Z4C8CnMjgZHGtXYXuM7HTTLyJ+RqEkKciNwqwFnrSW4D5qspG5yxsSbM/YowMilj3I9J0HUDht2SiqZqXCIPc/PTlSjep35T9s3BZC/8D0j8hLcOOXiYcntWzCm4yu+0G7N1a/gBA/Pc+FvEeYCUHmIAgC1VNgGXYc6AdtWyLDcDTAT+5QzJjSpkDp+/iUgn77dSfqD78Uwn/b98i/ftGegE7jnnf7DtJQ4DVhxX5M/0LPNI1ByEuI94DrOQAwxCkTAMBExnYU1BXUHwVQJxdqGQkhVsaZgd49B7Bc9TNIPWbWn89dPuf0n9B/YsfsN1JcV4HWIUQV6l2GmgodDuvBBFyjRAAsBDgBcTIVY1THocD07EBeOKd5qiyIn+iSm2HHxA8o/0V/VvVz67+kFpU+XvSv/hjW+NuR4EoABAjt9FO+hcYaHIrDRGmG6AEqBnAK4gxSNMUN+DEeWwAXpAMfT9QdP9Ao8oBbi+nEQJjhv6t6mebP8lf2/79h/9cNc0S5/LZhijyOem/cp6Jw5sFhwGb7wHe6YpmJ0ySpKcQY48imxKcKKtLKb4LJMoT6Kwpb9voMMUxNmYRCjukf6v6WezPtBLI9i8g4Xwr1ZDraOdPGuJs9lBIQwFAoOPAZqozgOgGAKoDdECMlcqHLdSfGRYfBBTlUQ46c4r+HzFu66L783kWIaFPD1dg8jcif9r8q+TvS/9CSfwUVxVwG16Y/C7+qNEyRDhviBKgFgIUBc83GTXALRlOTLA/E58D8pwNZ7Zud3R03L/f0cEs4OzlexlhcWDon3r+LPKv2vx1+dP2HyQjsOWIJ4I8ScMT+SdkAJwpzaDQz+/XZRL5qZiSJBUgwrhRA2ydgCNX1QYQ1fQncnRlUEF+cXanq+vH2cbu8shYHmEyQtODmfxJ/cbmz+Qf8PZPjMOWBZ4iwDC8skApAN/anBBSifo7jewkEIsBbEOEU6MG+AzODLMFFZ8DEuMlzGSzCBVqApL+mfxJ/S7yD3O00RcOA/gH3plvM11qcHVniFA2lQAjvQdK0joEkAf0L/uJOpwn4yaAOAe4CTL9WgJg6L+z06x+LfinAwmieI2t++jCqaN8vsIHxW8UArh/2BkEOGiMQwC6AaxBgD79y6YyqMNQbADirOG6oXeyDf2rZX8j8mfq1zZ/kn8IjDkYk3sRaQu+SL9RHUD1N47YZkvwEEBjlACZAfwS+zSW26T6UIdcMhl3AYXZxI2wU3m+nu77095Pm39o/wOXYM+Q2wp6MAufDN9jMYDxiYFNAynXlgCjmgEoBiA06uxIs7Y5l3cD4i6gMH9k3ATyStXoeu2CnFn9JP+Q+AB7Lt1iyDfwTd+ZFgO4O8C2h/eAol8C1BygJJIwsi87ddlU4i6gOJ9xI1xRAMD0z3Z/q/pDXbuT8NYGaMnDP/ktzuuNg+BnrqoEGP02mCSNg5sl9mnHMu91oXgaAC/SBMJA/MQKq4yHr37CScfDLn2kVQTCX3w3nBbBz9vGKQEqCF0H+qR+WnnUdWx4srKkov75UeFv3AiZXlO6ajz38yBs9RMP4MBY/SDynYxgGGtvcb/jLKXBzURj3AMiA9gVqm60ruRcw4S4CSDMNoIlf/Vs+GJn52KuhHo8swYAbNxn+PInTuBAX/0y0iCCovjaPQ04AT/DlvfAop0BKAbwBLxklU/rPYALF3ETQJxFBEducKdcueE7jHocGYs1QTPyH4TZ9OM/zJOtu4bWEBzpfXIAh+/+Dn6OGyoDUAyAP/osdCd7P8CN47gJIMwfBMbiOd3vV7jiG1sxRdEq1+H48HMfOVknipT6ECQjd13uOj8RHAXCzlVE/xAAQ3ot8NbRVJ+7n/YbNcC4CcDNEwTEzKVluNdE3YVv6P+oTS/Y0nu/18RzODFUxwB2ESylp6Z+oJ8ezThlAJE/BMCQzsDL0OMiXCnpBhgPBBRgDoEwemkd7tWNejzWF+vbS4pWw92tBKR17NwG6MghYLL1+4HT4OaoQSYBVJAOwUnxbRbuzMU1QHGKCIKinvrTbK9UGXWY1KPVx1c3d2Jlu85YqZTTYPkFBI5ctx/4XqBORhtgY0TAEnf++TENDi4bzACjwCGCYGaqaraf/q7vKeqwp21WQ7nyzT1fvQknLhz7gE9lhEDh0Lkf+BW8fOlONtgGKHUgSEb743OAwuwiAMZZ8a9K/s0KF3CmqJUAj0YHqV597Qaw5Pw9TpVk6StCYda5HzgLXvYbLQNokiQZATJo/AIa4RhkVJiDfwaN8J+G+ygMur5fvyenB0wZwPWu1o9wYsmpD7iLkEivO/UDM/yzgBotA1AMII8AOY1LAOJ8hW8+Dljkz+Z6No+6BADJEWCVLdZrNQAeaS06LKOWPEJj9Y5tP/A2eHnWcBmA4gBFBEemv9EioCiQh1/S5Sr902i/U5cAoH8MyLWyxcp2q2s3gA44knfQ0QhCZKm9pau2EHACXi4bLgNQDGASwVHojksAN3EMaJj0n6ia7VWCI0WlZPD2I4BLY7GKnQIIv/zZ32r3utx3iOL/YPBTcJJpvAxAMYAZBMdPZgCJuAQgwmt4II0qRqeq9W8853fvW90AoH9aBvBFdYvOmzKA33BmqHoqmGEAtyYRLund2n7gGjgpNGAG0CQVEBjp3rgEIM46hElfDFyAuDDrX3/M++4IHJntLy9CoZisugh0/QawBWfKdpHkZ4TO6p0WSyHgFTg5bcAMoEnaRGCMNeIv4MbZBqOYFjvycy7TY/RJ0j/b/tlrnp0ZOLJ3IbN/s2y5CcjdBgzf+45t+oAnGYTPfDuLhuha1Dr3/mfcA2igDKBJeo/AOCcDaIiLENGgAJWlf8BLdqhb5WjUWLFM/jWj/f6CI+lJMD5pGrsxA3gBZy5rDcB5rYZZCJCWwcdVI2YATdIYAoAcsGGGIUWGRSbilifgRD7We/7lHBg/WxmkfzbZ828Zbsy0Jm7WAKbhzHntQYANXA+Z56ZCwDb4+NSQAXCARcD5hnTAGyfP9P9oFZyMV678rDDvyHQz+Zv13/VrAm7k1Rf4yABoGEDTdTEIZ3b0lURSul/EdbFdXQiYEx0G1tNIAXCAd6vPG9IBb5pbACZabj8qgQ/5P/bO/aeJLIrjnQItpVAoUJg2bUNLijyspCARAmIsysuuoMEXqxJRcFGjrq6/8S9szr+8cx+dMzNM25m5g527mU+yD9esu2C/33se95x7E+/8lb8AwOk4YcCs/6EZ6Mi7/m4bwJ125+mVo2QLXJADIRaxEBCtgSOKV88/GdZhKqvgE9lpvg1Npi5o97kEgPfpnh8qOKNivPPb/xVgYYBApMy1TKz3CDrylX1a0QB+fwqwBK1ZsxrAQ3DD289zIMLZv3oh4M//dQlcyYcZQFfZBliIpnt2wSHvzO/5X8DnGCMxadC/Cp1YLeODAH3dqQGMQhtq/f2m1bKjcy4fPS1f5PwoBPSkK+CIp1JmAJ03nv6PJ6ECwRNYimsGcA8ccoPqHyf+zqfZ4A/TP5Xy6Ap0JHdruOsG8De04ZHlhdkVcMHqVEbjfgVE2GCFgJ5N5ztz8fzrDfwuIE4UfOKM70KQzQG7zT4cKJoBzIIzikb9c+VTxpJN/Z8sQkfUz8NoAPRfGxK6COT/FajFftMDod/BDc1Gydu7IEAlSYOAU3BCQa5toDop8ImnctZAuk69kCYGsA7OuJPB93zpyB8jqcmf6T/emAOk7ftNhpYtDdh6fnMNcKvtF2q6UfJjDlwwi5sRnxaFCwHL4IQZSS/BXII/FKfCDMAT9XsKMYAzaEW+tmDdOcOb/uTYJ4xQBqn+d+cB6bQP1PgkwJDQRkD/56BLJjWtgQvmpgy7kabXwTvVuvZY2io44bmkl2Begz8syLYPOSg0tqkB5MCe01flzLRqSI2H8T1fNvPHIbf/E59OnXYSmr9KF5sAShXasGo0gF1wgfrWsBtJ47wK3nnQGy+AE25IWgLf9uudWdn2IQeFepQYwA+w5Ywt+t0EnRk9difSJcc+J/F45ZsKjiiVmT6wBNCVDOAfaEfBEE4OLnkcjh4fIAgFAZURR/6xJGsA/MuvTQCyfgO6zbZCDOAD2KBuZCjD56BT6dfQL/AQ7XL6KuCQ5dsZQwbQvVsAu9COnOHTtOA2AUD9xyjnOfDMsepsGZCkD2I8BF/AF5HCDMAdUWIA0fd2h8oL/dIv1qHW6QebH92DRP5xTu+MQ/1PM4GgjWAAEJBHAQgqGsA+uEB9Q75nuByFMbUJ18u5rJPwu+AHJUMAINk3oOtQA2jAFb7cHtZrWbdU4GwS/aNyyYv+nKHeikP9ByMAiOxBO7K6AYwtgQtqFv2zPsnk5HkOrpPbcjYBI5HH/vgf+aazj5QMjyIHCmoAO2BlZZjTT1gBztw4H/vRb/1rpBjxigOr5vo33QLCACDyG7nbyQC4Q82CC+Z4fIPLkThjU6dwfRxL2gT06WXqAl2GJmMTJAAoGtHHV6/Co/7HNWrAyQwMmEZ4UqkJSo/G6KIr/RtbAL9/I/CECu3INZtqdXADTwCwT0IbpNqfksnEClwbNWmX4c2AD1xkJL0GFQiIAXy6OqnTr8ufSn4WGG+1v+fF+152fw9JDy060T8KROAOgDAfoC1VbgAx1wkA5jfYJ9HapJoF8B0qSLgP35en6bO3wxKgoAH8ASYq4/0axld+EomfVSA8jeHcHx9ZTUc56fgRtKNSRv13qQWINJwZQA1csDRtym+wT0I9YCQ5vQzXw7SsPTBfZoG+GgKA8BKAa66unfpCJn0Z+jMfk2PlRyoAPEpoGHP3dLTJy8MitGMlY9F/V9aBOnzjs8gM4C244RUPADC/4X0S6gFaJpDYg+ugJO0+/BMQJ3dfz7omwxKgNwd4AAaO+weIAfDjnz/zQcisVOFsUoO3AHjxnp7eqd0KtCV7btV/NzoAyGInAyDzwP0FcMGCqQBA9c/bJMQDqAUkf2bBfxZ4CUC+EtgTEGcFAwA+CRlmAG4NYMO08yc2MEAMgDX8mPxHKMnEu70Ymf3Bs5vIP7p9VMlBe/J4QRb1L1AAECYPbclTRX0FF8yXMQEwtUlS2h+aB7AgYHcJfOeVtCWABghTmGI9wLAE6Bnz4sm1BDEAAn/mh9347xvU0DyAMoLJ+z/12QJ05OxGC/0LFACEuITOBjD+BlxQJF+i+YoztklSxAJYEDCwDj6jTslaAojcA2GeZ8ISoCCmCGAplojFBkz6xxv/xAIIg/R0G9u/V8mDEyrT9voXKABe8xXUgvb/Wi6AC94ZEwCDvzEmUnoQkNxQwxIApwaiLGfCHqAopiJgfYwYAIHqn5/2HOIBlL7kHzOO5VE9z9jqX6ABIMyRAwN45HIGyJoA6Gv9ouk0t4DeXmKijSz4SU3SUWCNeRDljU0AEBqASxS8B7CXHJtMxFD//LBnEAvg9CYfn4IzTllsbK9/gQaAELXOBvAKXFAq44hD85oE1z9DswAMAnbz4CPPpS0BRKogyKI5AAh7gJ5QHgMnHxshBhAj8jdWsocIo7oH9NLy1oeNAnRE/StjejzcHP8LFACvdxnt0vBU3lsBYMAy4kQNTvuLMQgYmZoD/3ghbQkgDoKoN40BQNgD9IjyDDhHg9QACAmufyJ1UspKpbSPLznCCHG2s3Zidy8LbTm+RZRh0n+y+/rvvIdibviRpwLAuN1zh2gBqWYtcLwEfqGWpS0BfPThZfphawAQlgBdo9SBURzRalSTiQTXv17JnmCFLGYBBO0fcv2elKA16lp5ODOM4T9zle7rv/MQ2upnjzOAlgfPo4pOMwhgaUBiHXziLrsFgCUAeULgOohRnA4DAF8fyj7sowZAmTRVstMazAKG2PQvW1of/TgPrVm8MczAS0X68vBu6B/5EzpQyINzlqcsOw54kxSfOtKDAEwDknvgD4/kLQEcghgbXP9hACDId6CoH4gBjE2a9Y+VLGYBKToBTPU/9ECFlpTe9uNEMW8qBkT/0Sr4SO6mXQfQ0uBQCOY04AJ8YUPaEoBoE2C1HAYAvuZiM73MAAimmzoaStMCevT53/TDY2hJgbwabDr+dVPpuv4jv8BPfpoSAPsRZwwCDGnAuQo+8EbaEkAKxHjX1H8YAPgzk7FLDYA4wJilU89gFsBJx1egJbkLeu5TWRiPf4P+o138jfoEPvI1c7UDiAlABFEIpjTgWda3UUAJdwGILgT8kgkDAJ9IA+Euv6nGbvubR3WNFkBJ7RSgFcW16fF+nXFL+E9sGsPjrrAO/nF3qt2SwwhikwYM7hdBlDntvy5pCeAPEKF4H2cv8Q5AGAB4b4sfsR41v+1viqiQKGXi2VxrRZwPj49b5Z8gnoJNhXRX9T+Rva4CwGSHEWdDGsAc4GEBBFmUtwRQEU4AwgDAH5QSAOT6RqkBjBD92yWy2M5qrEIrKg0ySmSVPx8p6A2E/jH09IHzlgUA/CS2TgP6+p7kQYwLNADJSgDRnHjmpXdewwBABGURAFboJ5LP+9gnsgqhp37cJvZnk4RM/XydWAKfDqXpv3f9B2cGzfIxtD5zYtW/XRrAHWC6CEJ8lrYG+AEEWJ0ytgDZHoBwCsArygIAHJColE78kcPavqSqKC838mBPrvJzvDlJ3M/miW2P/54o6r87nIJfzJfNBQAnB5G1EPC+CiLcNy0DkakEsAPeUV9YKoC8/BEGAJ6gK4FOuAEQeLJuTWR76ptgT2G2EWNjhOOcAZQ/CShM4X939T8EfjF3GwsAbTqALQsBzAF2c+CdvLw1wFnwzl+ZKxXAcBGQd5QjgGXtRIqziV8y7nO1kp3aXyiCLfMP3mu9gwQ1AJR/jMs/aZR/APQf2QWfqN7y9MoJpgG8FHiQFemFSVsDnBPuANpUACX52gOGcgBwSAyAOgDTvzmjer1TUcGGbKn2OMauD/E9AkT8RvnzfCIo4b/GIfiD+sq2AOCkEoUOQE23roJX1qStAZ4IhD33zRXA8A6QIMoTgAMWkfJxX1zWNfGxcbhZtIt/Zx7UP/by1iENAKgDoPqZ/AN2/Gssgz88zbgtANg7gJZ4NVTwyE9pa4AHYEJk+1KfZLFP4FBeAlwSA+DTvvy2Tnz7/dHMUg6M5JaWv83UtnYe/qCNLKp/PkAQ0yDi54e/Ln88/gOh/0sQBncAuSwAIJZ24I4K3rgpbQ3wELxSMycAYQtQGGUIlqP8s8j1b4hko6Mn27++7+8++fA6nlZwKojrn18fThAHYOLnsX9T/oE6/nEGVZDNstgzp5Z24BF4oipvDXAZPHJGOoCWBCBsAQqhKIWtKPsoEqhkrd9Q0zgAMQtd/3x+IEGhob+d/INx/GPxWZC709YCgKVw6tYBPoEX5qWtAb4Ej2Rv2SUAYQtQCGXzoBmOEgz9Onv9p0z6JwYwNslA9evyT/UE5/jX7gHnwAfyN4z6T3h45hjbgdwB7oEHatLWAD+BRzaa+g8TAP9Q1i6JsHHdh/UbinutmuE/0z83AI0xCrlGzA9/Lv9gHf+4/ESI7AvTM8deXzlTNNABNsA9z6WtAc6DNyr225fCFqAQyr7CJ9UpKQwA2ulfNwBmAVz8ePgHUP6RyB74wE8sANoXADw5wCy45hY3AFwHJsk5+Bq8UWqxfemyLskXHkyUtNIs7aH+DZq1yf/RAPj4QFP8+uFP8ggu/+DoP5UFcS5s9O8pD8VmAHGAwTvuF4LKWgM8Ak8U7ttvX3p5/CQwHzEZYfKm4tYg+35sKgBc/zwAwGcCBikofqL+gMofu89iW/gwDbUtAHp1gNiSWz1Iuw/wDngh1+Lu5a98IcwARFA0cOGX9hdLAGBvAMwBkF5UPzORwMkf14EKTQBZ9D9iGp1SIt4d4HsWXFGyLgOQpRR24sPdS3Te3SpsBexzJhuobwpXbqSVAaADmIhz9fPDP3jyjwxlfZkAwk8hhqFYABBwgB1wRUXWGuBj/+5eDqUaKsAvRVGC9mGTCYPA8eRubQDUAQgofSZ+pn7+SwTwd6QBohRv2jUAsADoOfxilcAtcMNCswY4xvcBylID3PTv7uXoPQCYVzRCD/AMJvmEKOrfagDcAXi/MN6E/ICJn6s/mPIX3EKFUajNM8CofyEH6Ft0dSQa3gSRqQRwKVp6Qf3/mgeNHUUJLcAXB+DQH9r8LHMAagFmWO0w2OrXHqNTRfV/bj6FxJ85tnYDk2fgnM+SNgF2wD2Vsk3ptY+9TFEdVUIHEEOhmPWPKEYHYKXClAHth83cgRDc34RnIMjzjvoXdoB/q+CYW5JeBF4E16yXTQVAFnp9vwuUrSgjwGdP4FEY+B208we0ACskcwi4+jXWxSeA7RsAeBFN3AEOVHDKlJwXgT0EYnemrpZeRrZUYHxA/Qfq1plUKGZa+AMlTeDCJ0Q5QQ/AfoAYG2b92zUAxB0g3nsPHFKVtAngPhCb1/WPpZfGHHC+kc8kJ3QAfxyg5U9G7ZEi/doBIf7KGKPQlg0AcQfYA2ccS9oEWAaXlKavpF71Eug00mlDKBqErVNyoiDtfzZqQKbiyzcQ4cKof9sGgLgDsB1BgyVwxKac20Aeutb/bav+D04BKY4S5fMnK7u/dV5m2qpYsSBd4fUERFi5Hv0jhk2h23lwQk3OJsCM2/zfcv6P7X8BI4ekNU3hw2eSXIeUD3m1TzkCAdZQ/+INAHsMVwLfq45yEikN4CW4Y53m/1h62V8HM9vNu2lDdAIlXA1yzUgnfI6yCt6ZdaV/cQc4BAf8lHIS4D/2zrWnaTCK45m71E0YsDFsF7ZsGCYMgTA004gzOMUL3jDiFTUgiIpRRHnnVzDnK9un7Xba0u7CTm2bnF+ihldy+/+fc3ue04S+WJ8y6z+1XQUb9/WxNKl1C4UNgHHkI5yeJQf9WxuAJOBIYHwZuvM+jF1ASenXeVH/pS8FOMHxsGkklQ2A8WAM+LtN/0JxLg1AqlbAhgxdWQ1jF/Brn5VX1P/CupN3VDJ4JUU4AL8OxjiyNfADACNm/dsagPQOcBu6obReAwhTF/BMof/JK/Gdv/CsCo5stB+mYANgOrACp6UyZdU/4QCAezMwE6tCF2aNMYBQdQFvQe/MHxj6L31qyODMoq7+9kIrfh+YcWSiCKdkumf90xYC/yrQmbo+BhCuJkAVemZ2QdP/1Pa0Aq58bL9JxQbAeHEPaNFN/2kcOfHGAR51y0xC2AX8CT1Tv5xTebfe0bkbQv3Gg5Rx3hDCuFKG09Fw0b9TA5C4FSDVoSNXQmgA96FXltRv/MuZAnTm45DxJrXYQc9Lwhk3juF0fCv1rH/6QuCuAp14Eb4xgC3oEflZ6WBptnt7RlO/vo9iKM4rQhg3ZkKj/5YDiELgc+jE6/CNAdzvVf/TDQW6o+TEQhp9HRW+zR78bwPzvzmS6ep/7vqnLwNchw5cCt0YwAbQ0hTqT+q7qHlJKEO9iW4p54P+LWWAtXynrSBhM4Azy0BKcVyoX19HzUsCGXfO1OAUfHHWv+SZ/pF2GeAxuDJpew0g+EffY6DlhbGSXjeAeKheRWOIod8I+swX/dvLAIvgxl7YXgM4mgdSrqYSOknte8A9AIbwLUBlG+f/7fr3fBUtTgQOvyqCC9WwdQHngJaDlEZCf50pXM+iMqTQ9wDz7zrp3/tTBssAm+BCI2QGcAy0NFTxj6t/8JFwDgAYonuAky991j+WATIVcKYSrjfBI1UgJb86rpFK4JYQHgNmHNiHfpnV9n/5qX9MAlzHgZZsBhDwJsBdoGVlXPx0dAPIiiAoxj1AhuQNOqhe9l//piRgBRy5Eqo5IKkIpCyrX73+8+EAgOnILvTJeikI+sckIF4AJz6HagzgCpAiLwj54wOtXAFg3HgLfSF/yQVD/8IB9CRg07kLHiYD2AcycC+ydU8oXwRmCAKA/HbO/Agl6j/z3/WPSUAdHNgO0RxQ5iqQUiuNmF9o5xkAhuACqqDw0q7/c77pH5OADXDgXXjeA4pUgJbXI6Z3wnkGgHFnDfqhvIrhPzaY/NI/JgFzLquBjd//oI8BPAJaKiOC9qJgvQLIAQAzaAAwbSv/JbO+6h+TgK15OMHF0MwBHQIttQsYo/EQIEO2hqaZ66R/HzZOYRLwFU5QOhsSA/hdBFLk97kcBgB8DZDpwFLf5T97+Z/g/i9BEiDVwIY8EhIDiFaBFtGm0fWvT0HwDBBDEADcuORc/tfqy37pH5OAu2BDCcuDYHNAS701pM0tQIauAvAd038H/fu1chqTgMwbsDIfkkngTaBlctWcAGT5GjBD8Ai18sIS/mP7T0jLT/1jEnDLLoSzoZgE3leAlgNrAoDvgIRuWy3jNZEd6I2rC07lPyEs//XfTgLKYKEQCgOQakDLjK5/rgAydGuopi9g+m8r//mv/1YSMPEALMyGwQAmfgAty1OWBIBfAmXcmaj1+AR97mT6j+V/3/XfuhicroOZPfWzDfpVgDS1/vOX7AkAVwCZwebPCi8t4T+W/4Ki/3Yd8NB6FopPN9gGQK5/+NXSPycATDf+5HsK/7W7/9b039L+81//7TrgIpgoWwwgiLvBh1H/tBMA9gSAK4DMKfvPxU94/JvT/2CU/+x1wA0wsaO/hmNcBgygAQzXgZj1HBYAOAFgBr8G/O2iNfwPWvnPXgesAPJt3IiDA3obeHgHiKlOmQsAvAqE6UgDuqFg9c/4pQpe+t9CDwGOAbmuRSyB3QqQqQIxs5etBQBOAJiBdoGUL9nDf3GqBFP/rRDgPrSZTqUCbAASuf7nF3T9my8BcwLAuDB2FTojX5myVv+s6X9Qyn+2OuCuDC0qJgMI3F0gqQzEyK9NBQC8BMwJAOPITejM3kv78a9KyZ7+E+g/QhwCzGBFLKF+1gG9DPi7DNQ8Q/2bCwAT0UDZNBMQXsnQCXmmhMc/Dv+Qh/9bt8aIQ4A1GQ1AkMwG0AA+FoGaGdQ/FwCYbkQ6d6CX35uOf1v4T6j/39eaEeoqQHTOYgDJABpA5CaQc73dADAmALgAwJx2C01+RZO/tfqH4T9V+v+nKT8S/xKHAK8U0KkkkyJvCZwBSItAzreSrQA4GucCAOPKh3lwZ3HV+fgXZwpd+n+0osib+CFhCHAFDUBFVMMDZQD7NUA80T8WADgBYPpdBVI7OHn804f/mZt5yN9r3+QhDQG2FNCYPi/0r2bDgTKAuwqQUzfrHwuAwxOcADD9jQDIc9bin7n6Rxf+px8VASaPhWIRuhDgqWEA2fMq2UAZADYpPNC/rQHABQDGmUwBXKgujGhg8R+Pf6z+D6jX6PNJAJhci9ggCwF+50GweC6r6j9QBrBVBnp2Sg4NAC4AMH2voSy+QPmbj38c/qHQ/5MaqBR3IycgCwGaILh+7lxW1X9wXsWPPJwHeqoX3PTPEwCME3fAEeVa6awhfz2YxOMfq38Dh/9rDRDkjyM6Z1SIHWAsuq8bwOg5wWhQDGANW68e6l/UPLkAyLgjFcABeX1Vlb0mf6fjnyj8l5qgkd/QxI9EdKiuBe+ASmNoVDOAoUAYQHpFBsQr/WPJgwuAjDMVxz7SpXEhfJP8sfeP1b8B9R+5WwQN5dBQP0KbBNzVvqahoVHBUDwABvCkAF5Q1vSPA0DcAGC68Nhx8C+VEgagM67doaE//jfKoCM/0OU/NjYWjUbVv8UHlAYwFssDwI+4cAAtAPDbALYWwRPqrH+mP3ZlsFPbTiRS44YBYPSPxz9J9e/DfTCQn+jqj7bQHIC2FTgn1BGPDwm0L8LPd3GjNxXwhPUpF/2nA3VTmwkO6T2wUXyWSCb0AADlj6N/ePwP9AsVfZSHFptC/lGVCUFUBQ2A6mWQDdEei+kOEPd5M87Hq+ANX3LO+ucGAOPGDFjJN1PZpBoAaBHAuFn+pMf/oUkDT4X8hfrTGsIC0F/IQoBlgOVYLC7w1wD2K+ANyi9n/XMDkHHlIVgoriTUYRktABCg/DH6pzj+h68BshjV5J9OD2uk05QGgCHAc4CaZDhAzD8D+DkNHjFpXNjETc08AMB04VUeTEzezKqNsmxSGEBKqF/TvzY7p8fNVMd/DZC9I3H4C/VnVAwHwP+CLAQ4UqAo6Q4QEwaQ9sMADhvgFXsX3fXPAwCMI9EyILPPVZGPagFAIqWRcIn+DXFSHP8wvxaNptOa+iVJUv+2GADl+6BLIGekmI7ky1zsvR2wQF/+d9Y/NwAYZ5rQ5sZmTIrFjQAgkXCQP47+UR3/ggfRCSF/yUA1ANrXBTEEeABw1HIAKfPfDSDypAze8X3KTf88AMT8Y+9Of5qG4ziOZ0PFaxOmw27ZFgbZOMaRiQsaRYLIQG4X5D4CyCXEC33mv2C+/7L7td0+tLZb59rSku/7gU8JhtfvWrtf/XcA+5dCEdX/UzEAiBT+OPvH6r/p6R8tlPnLc786MeOQIWD3ANAao20x0qg/Juyqi+D8JjmXdBpl/1yj7aVI6dVhSzjUeqs6ANwT+MEfq3+7p396r8z+t9T044y93wwyTEV1qSGGGTdh7H3uIweL72uO/3H+z/4584JfSZRaLra3dCgLAHUAkPVr+dty+Bd+Sdr6b6n8xdEcBgD4t3UAWKFf4ZB61OCijPbZLDla/4B6/Mf+uQaSNY7Oh4PBFiwAygOA3OMr/O2a/otHpC1xT+F/W0k5nLP7fhGMAEWaEhsOUci1o7HicoKcDLc1wL/6wjOf/3E1+kwUn/wkZsbKAkAZAOQe2MYffYyRrpkq/4fqAODEAgBLgKMZceIoF+5w47Px0PQBOVzfrm77f696VSP758ybpfR0SABQFwDKAND2QKnNdv4dOdLXq/B/KKr+OPtlYgRYfis+cqw+beSwjcBUb4ycbq5bf/zH/jkLFQu/8LJ8R7i8AFAGgDahX8M/3PL/Z/9ofYT0JbdV/uLn4awRf7W2DwDfPsqPHIo6HMYROBl/QY6Xuoxqlv/sn7NYUP63ugBQBgBhUdWv8m9u+kdLcfqnt/iJbZUnDZ3YAGAE6JhuxxtHDupoOSwkyYUOeoz9V59zYP9cTRPaAUBZjTvAv32S/m3rlsL/QTk8agj/TvyyJ8Errxw7xKN1/n2c3Eg6u/p17birUf2P5Of/uTphBxCK4DBeSNTxb9L/zwOj1esd7ZHDbedeW8Vv2y5+XdW/IwPN+sobidzpxZrRVe0PK4//8Pv/nPUBAJ/Gi39t4Y+mUmTQxsOHgv9j9Wt6XXhsLVBO/t4R1b/dQNq/vxsjt5LynaZXtbN/rqEBQGwB8Die8phMs/zRvEQGDasfOVaeOLjt9PdWYQQIttv1nWOo5cPCqxi51+iQfvqH/wj75xobAJTn8dUiIRv4o3EyKv6n7YHQ/1S9qMOVi2sCoiCySUgH8LtU33609lXt7J+zkuJB/TKOiJzyjIxt/IM5MuxYfuRQeeHAve+twAhg1wKgY2r8TYzcLX7WZXJVO47/2T9neQBo13wdjw38UXiYDBut8MfK1Y2LKzAC2PH7/Zwd/yqRa+G6Bt30r7+qnf1zDR6L4fEYWX+T/NHvNBkW68Y7h65+cbVdd4/tzYxnE3Qd9a+Bv/6qdt7+c02ci+PTMfBvruIzMq5Q5l/5ygFsAODfuZr3//twIZukayp5DP64rK0y/fP2n/sPD7oLOcC/2aYGybj4I+FfDgsAl76gp4kBIPDz8PMW7LtfrNCJzb/+qnZe/nNN7IkRaDTZjEQmTVa/c+werq536+bK//Ef2Pu28nI0TtealO3Rrf6x+9cs/9k/1yAH6IcM5/wPPpL5V+YvlzYAqKFf8vfUYuHrIF178V7wN7ytRfBn/1wT8yFg2NC3GJl1pvBXHl7FBsBjL660rB9OT75JkSdKnnWDv/6yNl7+c9d/Lm7df+qRuHNA/ROubAA8dHV968nS58KrZ+SdNle7jPlj+g+FefrnnN4UW28qRqad3cedQ+UFgHJTtwfeXA/sfZgfzx94ZM5Ho+eyfvA3uawtyP45j/QhTqZJ3bJ/5dtrPLEBKC/2F5ezYzHyYFJmzYz/A/AX0z8v/zmv9D1O5mWePKk+waacAEbcv6gbi/2Xnlrs1zj5A3/ddQ18+sd5q19xqtHuXREWANewAQitf5t+9957i31dz067NZO/lj9W/zz9c15quyaso7tyWAC4d0tn4PfJ7MryVr/X4csle3ejtfnjqmbe/XPeKbJJtSqpa1ntAsDR+atle2p+4eXwkSc3+YYl8hX9WPtr+fPqn/NmwWGqVbxTswBw9ASwtTgz/S4/miR/lfqyI+vXTf6G/Hn65zxWgWo2pz7JhgWA7SeAwb3vS58nsyNx8mGpuY2Kfkz+zJ/zS4tUu0vlBsv79x1YAISLsyuTwy8k8mvx7HmXTj/W/uCvva6B/XPe6bCOPqlTGQDsXQD8+LW0kPuaIF+XyOx3qfihH5O/lj9P/5wXKw5S7S6wA2hyAYBn9/o98KpOk72YWx0Afp1+de3P/Dmv19pHdSrZswAIbn+bfr014p9jffOkdO/+c4HfRD8mfx1/Xv1zXmuL6tUj/sabWQBEPixOZny8zdc0eDG506nFr9d/ZfJX9/7Mn/NoH6leY9HKEeDTx5pnAKys97dnFrb66KaUzJSGYB/4Vf2Vcz9M/uXRkvlzHm49TvXKRa/sAJTXgK0sAFo+zS+/8f9OXy02lilc9ujsAz/mfqFfv/Zn/pxHC/ZT3S6j2AFYWwD8mFrJjdyQFT8NpudOzweq9GEf+I30M3/OB72j+g2IP3rNEaD5AiCwPjue9dtTfGYlDvKljQnI19rX49fpx9qf+XNe7QPVL67fAZgtAAInK9mbseRPjQz3ru52G9CHfeBX9bdp9GPyZ/6cVws9o/qlrewAAp9Wtnzxvl6tpGQ6kyudD3Xq5YM+7KszP6Z+6JeX/pj8mT/n0XJkoS9ReQdw/58dAPAv+hu/9OxgrrC6M9BlDB/0VfuY+Mv4MfVr9YvJn/lzXu47WalUawcQKPoVv5QYu8j2nh5vDE1EDeFDPujDvpj4BX5M/Tr9vPbnPF6gn6y0a7oDaP343mf448mxi7mcUP8c6sFeAx/yQV+1j4lfM/VDP0/+nPebJkv1VAcAzQ4gNJ/x/gd9UqIvfZH5kjstXW6sDQA91NeGD/mgL+yXg31j/cyf83aRBFmqW/MhoPIUUHhpy1uP9MdSyRcj/Revsl96X56dlo73N3bXBiZwmmdCHuzhHvD19GEf+FuBn/VzfmqSLCVF9UcA4Zl8nK6leCrZt5kuO8/M5XOF09Lq5fnO2lDPc0A3xW6OHuzhHvCFfD191T7wi6mf9XO+qiiRpQZ1RwCHuRQ5mDT4bCx9cDGcncvLc/lqeTIvIx+YeN4pSFtmbk4e6MEe7gEf8kFfax/4y6lXNDN/zh+9IWslNUcAb9MO7dLPSsfnu+VF+92mg3VT8UAP9nr4kA/6Wvti2V/Bz/o5fzVDFjtSBgDxJmDbxxFqvkT6TTb/8nR1f2etp/uRorN55ubUIV6PHurhHvAhH/Rhv4K/vYKf9XN+apQslq48BvR0cZOaaHDzVf70eHdCvmRUXx3a1pnDugl4PXqhHu4BH/J19FX7jJ/zc1NktVH1Q4D9F/8rvz9f2umJCpmw35RwMK9HHeBBHuihvswe7gEf8rX0YT8YYP2cDxsmq6XlHUA0Q40njc2dbjyvim2IOoxbZw7p0A7wevNCPdjDPeBDPujL9hk/5+9OyHJ9YgAY6qPGin2d3O+pyrYk3hpyKIdzE+nwriEP9WAP94AP+ZVZH/SDAcbP+bj3ZLnB8gBQkqiR0oXduwb264m3NJeDublzYDcAD/RgD/eAD/l6+oyf83nr1EBddwtkvaPejWhN+sbi4d3SZG7uHNTNxAM91Av2cC/gQz7os33uZpSjBprYkchasexlN+jXfLoW5o281zQO55akAzyKQL1gD/eAr5XP9rkbVCRGDbSRIEuNlbrM8Bs/ZmcIvr5xMK9HHeAhHuahXu8e8pk+dwObpkbKkIXiX4YU+8jwRVq4NxBvBTmUm0MHdoAHeZiHetU94DN97uY2So0Up7qlV6NG+mH/Cv2r6ut4r4cczvXSoR3g9eaBHu5Z/l/27q2paSAM4/isjtoWtTo09jAtgzJAW1o6KE5lKDKiiOCJMgKeL1A84aigX8N5v7LdJM2bpJseIIFVn98t5fK/m8NuFv59zylUmW8VmXy3L2YOK1bWS116D2ycM2dXAkrn4Dl5RfUIH/4nixSmq9MyftUxGRy/L31V8p2xKxvnyoNL98eujh7hw/9JXKfw5D/EGB+R5Y2f0/eG723el3p/lXPnvXtH9gC8DSAEmeJojHH+sn6O390+l++uXlW8ovGBSkf1ACpTFJZ6RZG/dTZ2Ojb6YGnly+LnqVfz5Rv1+fHVqZvri4+fbC6tvWu+7lxzw80PFjmSBxhMgcKR+xlzsfNPTb5ozNSv53ptEFy9t7l8vlv5woTaAcJ1n8JRqlgf6LLzT1b2WuUXaBC3iisfr/hW36BzgCg9o1DUx2JJu39je+PhboYOp1pbbJ528kfjANGqURgeJi3TW9+Ofg54Yb15GbtsAY7B6SyFYKLVvrH9uZ6lkBTuLl/Gx7UAovaDQlAzKhvzVQpX4csBvqoPEK17dHTViQJFodr4hSP1AKJUp5OVfVlbnVtffLa59mO52Wzu7/9uvnu6+WxxfWq1trObm7qPEQAgMiJHJyRfn7n34sF71W4APmXjyq/9A5yqDeCm8U7A/mTKcyu/Vdv+eRBwH66LEQAgImt0zPKvttbSqg98+ccAHgLkCIABACACj+k45YvTw0M+PAr4D9rFCAAQsVcUOa5/KT7c4vnQb/Chm/4RAAMAQOhKdDxyM4/UZ/GpRgDfXQAuAQCicZGORfVuslW98ujtIYn7xwAA0NXf9xJg5HNSceQP98/5u/vHAAAQtSZFLv/JSDh4AOD8O+vn/jEAAEToKUUs30gm3M4GfyCQ43dO38drAIAoPaFozY95jwZw8uf6Fe3zMdx2/xgAADw02goULLuh+Dq4nT/Xr0qfz+DHWkCATtp9EFTh5bTrC4GcvzX5u+L3l+87i7uVPy4AAKIwTtEpGt7+7fy99Vvpq87i5uO4sSUYIBrfKSr5vaTk9O/Pn9/0X7DDV5/Vh/4BIrNDR5YbIYWF2aTJ07/Mn+vnTb/BpwDgq2AAESrTUYx8vfli1rhKna6Ocf/e/Ll+jl/RPb4EDBC9G3RoOxsVQ3qj+tuYYcj+efrn/Ll+X/v42D/AMVugwynMyfrNyOuK/kfl3+z+7emf87fr5/hx0gfAydilQ8jU9gwpKW1Th1tj3H97+r90qZ0/L+6TUDvAySkdZm3/rFW/lXiR/EYqnv7t6Z/zN+d+nPoBcPJe0oCyc2Ocv1Qin8xbX//29G/mb03+eLgPoIU6DSQzMenJP5WqkF8jKbX75+nfyR+nfQBookaDKLwxJPf6ngb57HT0z9O/zB/LegC0sUoDqDk3/7y8Z4K8cpOd/fP0j109ADqZG2RrnyH5VvctkNdWLBbQP/IH0IxoUL8K04r80/EseZRjkq//c+fM6R/5A+hFPKY+3Zrk/nlt//Aoeb1NKfo3L/8vI38AzYgl6s+NWe7fvbZ/jTxuJ1L240Hu3778x45+AN2Ij9SXsv3yn6d/e2PvEnlUEqlUu/+4u38c7AGgoQv99R+4tv8RuY2fTaQk+RtP/5j+AXQkrlNvhTuBa/tXyO3R2YQcAawHAK7+Mf0DaEmMU0/Zbf/a/iFnbf8KuZTi5gBgPwC03v+hfwB9iXXqacto4f6t6d/e179GLg05AEjWDcCZM+gfQGtik3qZMVrUa/svXNwnljFap/+Z/fMNwMUr6B9AW6JJPVy91tk/b+17TayWlgNA+yGB9QCg9f4f/QPoShxQd5ltRf+8te8isQ88AMhfmTcA8v0/+gfQlBB56uph+wEg929P/9ZnPUbIMTocPyvxDUDrN+gfQF9C3KZuqrPK/u2tfS0L1FYasgeAuP0E0LwBQP8A+hLiJnXTsG4A1Gt7Zdzz1FZsDQBx2b9zAYAbAAC9CfGEuti9Zj8ACFzbP0Ntm+0BIO1cAOAGAEBrovtugD3nBsC/ttfu37Wd8PfQcDoueS4A0D+AvoQ4VaBApfYNQCLh71/YlslWvWQNAM6FAi4AALQnRJECfeILAMXafiH/+0KGLGV7AOALADwBBNCdEE8pSMZ8BeA8AFCt7ReiTJaZ860BIO26AMAAAKA9IQ4yFGDc9QbAyZr7l4SzmWDrvLwEkAeAy5HCfASIJwAAmvvD3r21Og1EYRhm0taqNcFaSVVU9EJRPIEgCJ5AFM+Kgic8IbhRVFBRf8f6y86amexp2sRcD/M+V17Yy/XtbyZplzHmh/R4t10AYq9fe7fXmJvi3fQBsFhwAgCS4S7yu11u3QCGP+trj/aN+SPebQ0Aa8YVIJAM0/8g8EurAHS/22//fVGczzYAZm7+OQEAyTCmOCydzq8VgPjl3tbHz4izmNgEsDgBAAmxAXBGuhzuLgBmPQDuijow0QDw888zACAVpu9B4BUNgOYRQO+X+4ypj4p1dGwDYO+s+bEgTgBAEkzfg8Cr6wWg88t9JrxJdHmsFcDao/+VKwAgDcaY4qR0eBkCoL8AKBPOAMc1APa4+ecKAEiHDYD7suncQAGIAVCfE5FrY00ANRlzBQAkwxgzOiIbrq8UgL1dBSDmh54BtqYhACYEAJAQPQPckA1fYgB0v9sfA0DPAKenWgEmdv65AgASogHwVja8bp8Ampk2PQXiyFQrgBprWyAAgETYAChOyLqzayeAvlKv+fFI5PA+VwH8vqCS3wIBUmE6rwGPDZ4A4qf/HJBzpa0ANgLGWgC4AgCSoSNcH5G2c+E14LUTQE+BuCcHSlsBLAIASIyO8A1p24pXAL0ngJgfP0X+aAVQ0ym/Bw4kpOsa8Lud/5W3gMr/B8D8mvy1FcBGwNQtDeG7wEAy3AifkJYHO5sAWP16f2+BeCh3K5cAujK4ZCMQkBAd4dvScilsAxy6Agj5Mdq6U5XlvjD/NRtBgHS4CnBFVj3bOXAF0P508fxRrQlglQQAkBQXAO0K8NrO/3AAxI/Xj0Y2AZTOP0vBgYTo3/BRqwK89wEQ7wCL/wdA8XZkE6Cy41+5AkAAAMnYrADv9tv5H7oDDIxLgLlLADf/nACAlBhXAS6sB8COHcuhAIgfL0Y2AZTOPwEAJGSjArzebcVvAoUrgIEKEHACANLiAmB0oTMAhu4AYwLM/fjPCwIASIk/A6xUgG86/wMPASKjCo0ApfNPAAAJ8RXgTQyAHWrou8DtCtCgAACJ8RXg1SEJPrr5H/4mQLsDOBQAIDm+AtzYDoBdGgDLgdcAIuP58Wf+gcT4CjA9vR0AKq4EGvyBHxMRAEBy/JO8J+L9Xur8L2ZDrwFEzD+QMF8B6gvivFgsdy2HAqCN+QfSFV7m+XRQ1KXFws7/YAC0Mf5AskIFuCXq5GxhuWW/rPoEMhAqwPSaWMe3l/0TAEAWQgV4qsuCD+uub18Axiz6ATIQKkB1S6zZXodl30AuQgWYHheRX3v26Pyz6g/Ihn8dsPp7UOS+2/VLAAD5CBWg+iry2G37ZtcnkBFfAeryjdxaWfbL7/wDWfAVYFR92DoVl/2y6APIRHMI+Htyddcnv/IJZCE8Cqyrn3bNT7Prk0UfQCbCIaDWRV9KCwDLfoFMmOYaoLKLvtyqP64AgHzELR+6669k1R+QlZgAuuyPTT9AVuKmL131xaYfIC9NArDpB8hRs+ZjxKYfID9GFdZcsegDyEtIABZ9AFkyIQJY9AHkiD0fQNaYfyBnzD+QNeYfAPCPPTgQAAAAAADyf20EVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVduzfOW0YigN4JUMosSA2bmFgoNf0LgtDhp6HTuRv6NCVf8ArSeCAQMnvDu9PrgUGoQe9VFSqzd37LF10ftaT3pfGhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQggh5Diwm/un8eycvSOEpE57Wy5TvRpbwSs/76xsoJXG3m89UHpWD3Tj4wKWpmW28S4XejMvHLzLQKvQZ0vFS77G2cX8ZXIn3/FAF0Xd2lFgC0AGbP9wNG/fWGluCroXx2MZbbbwWme5RgBDnXTwMm3YNmKMFW5QvK+TV/hn/SJu7Xh0AUlKnO9t6TUgSQWtNHQFuscmczqWpUfYGHPTWo4DQHEVAEWbkw/jGGzoc84LtrWj0gZkxldwR8MhIB200gx7AN2co+fZ5bXRLo2KOQwA3EjmIgD4SmHm5NMILBkUbWtH5jMgceCFYbhnNuaAJCW00sgN6B68UOKSi6PsgOY8lAyKuQwAtHMHAaAqFGFMylOwZuB5XoG2dnyeALnzpDDEHeULQCZ4pQH+CLqul1GPsymKUd7UjIq5DQAPNdJ+AKx7W4gx+XoL9gyazWZxtnaETgCJT+r1uuxpiDp6A0gi8Mq/9x100/pSUz3O7kmOAHnJqoXcoJqjAEA7dxAAq+Z6aLu5YB2waVCr1TZbowA4QA+Qn41G2lM1G5uTewVkplYa9t77ArrzhpSdpf2j7AKWROtqnPN8A2BSk1Aj7QZATUKHmpM7sKpTaaxuISXAgUQMyOdKJe3pzmywK0ASX600630fdOOKhOta4w1hx89NtdCgmpMAyHZeq6t3sRsA04q0nJO8x+Qa7OqUSnJr6+ZRAJhibAbIk+zp7lwz1gbkee/KtzVuQXdWktZPs36SE9ijuyyXx8XBAVCS0LvYDQCD5rp1BZZNyuWt5tF/AYwxVkoAuSivWrqe6/XKT4Ak1WwlulamA9krlSV5lPIkVZzY/AKILYRBOZcBMENbdxAABhWcEon1ABAi3VsBtnasGGN9QNpCthTPdfrvCJD7PSvfVkYDGZ+WhZSdpPVfqRHs1dEuTp4BILeu+ugiALbGxLi5xf0AkJoFgRDq3lAAHBAA9SEgP4TQWsrkwtQZIMmpEObN/wa6ZyECSZ6kgzvahf2S9wb1HAbAr2BzidWr2A0AkVZQJ5VbAPhg3cz3g2B5jmnz6CvAQQHA54A8+MHytmz/OLIUHwPyLcAr3+bHoLmtBoEvBUKgKbChOYQ/GAdZAqic+y8Yyj+5dfUqLgJgVUGozeYzJZdg3a9W5PtZ8+pN+hvgoADwFoB89wM8iyzFTwGJ3/sBulfG12CQjn+Uyg5ShYn1L4DYj/XNkQVzDABt76H9AGgbVHBIwH7JcOOLmeGwU21F0foOUgAcFgC8C8hjS+9phoeXgNzJ7hvF7wnohpEfRa1UlF1RlTq2vwBiiyrOOQPWAuA+aqlL7CYA9Aoe57lMyRx2xL3+zVk1dXKoapoAm58r+ghwWAB4bUD6sqlqGDOct2J8gh/TlUa/LE+gu/ajVjXVavl6TQdfALGZyrkwvwD4zd75LKWORGG8kD+aRLhAkCxcaF2pYuPChcXClTwDC3ZTvABbL0ghiAio1K3zyJOTdOjkJIFEuwu89m8xNQtmAibny9df9+nGH+8XgCPhAmDhn9e9Ufhb9yQAY6CMLk1rU/16WjYKYBj2m0MJwBcE4AoIjYJpoKqy0kDcT/4FwtRKZ8DOaN6A9e9gESmRkABSWr/xy+8eBEgXAI2Up2AB0HwaszejfNSnf/0Z3nte+6nxWQAlAF9RgEp2BYQLi5SGKwCVcqQFOE3+55/Qcbhh1793H4mSiE8AKSvy7MRcVLIA4K8PludXr0AFwH1Rsvu0JwE4A8Iz3npS/Z8aAuw/3vjGuC/2GhCGNfZEBi1AJbsGwjRV4bYBaD6laexGEsmRkQD2gTAzff5lPwJw5/x8S6YA4BWYwO6vTGY0gbFI/RfS4wwdVQj4dQHI3gPhzTKjLED2tB+y0RYZu6fZB6TJTCB7Bwp+QGlkMW8CYVnAq+7OAeULgClbALQ9C0APglxj/dMBfVq8dFMJwBfHAKGwvP+LFCQbA2QvgHCPpYt5QYIbMKAW3MD6R6SMAGgCODBugLDmX76yXwEw5AtAOX6iQT5r4jFNUv+soNNg2mzWj6i1wF+xAPVIa88n+PgYIDdMbQHi9wG5NDXPAFjiDcB1SG7Mk9C3v5SRA6YWAP5+liIAyL4F4Abo1EQhUP5uQRspKZdZ/VeLainwVyxAPlwZVpQFyGZ7n7cAHQhyI9UA1B9pXmlf7gEII3P3IECyAGABSBYAff8CsCL3no//nfJ3a7+cklMb1QwkxAL0gPASYwGOH0NSkdACZBuhYYbmCQD5X8hIANcYOOoLIMy49OxLAHTZAqAfgAC8kHkmxwDU3PrHJA9XK2/IJwf7HA+g0/kbE1PXcEuK0ksBOkC4SWgBqMa8STUANAF8tPByenfvOeAPFYBXIgC+97/FRvIeuVTgjiAHsNfJ94VZ+w4QxhqpSjYIqC4/ZwGqfRIDFUxN4hQATQBnhhs7jYHw5ssBlQBI44G8NQq++nfLn1d0KnBnp5LaEuzLFqA4B0IzxgL89zkLQC35g8kNABltSEgAJ+6yM12/DE1kXu3KAZUAiF8HcO4JgLeSh73LU1K0KR3EboffGGYBroEwirEApcVnLEC+RTuOZBqA0mMo7ffmnS5S54BKAMRvBzbcGABvIv+YlXNK6nW1LbgYC1A6B8IgxgJcf8YC3NEuIL8BEP4KpnbjjhkAm9p8Sw6oBEAWVfpwbQyAW//o5LGa01OpqINBvgar60sgnHt1TS3AedgC7GpnMyDIwpRpAGgC2NDcwNF55rpAeCzwbx+lAEoABJCZQID5ic8AsBwfqaTjyEUdDSZiKnAMhFmMBWgD4WWnBXiBIF1uACR0AYyimo5RAJwLxuSAbueDEgA5ZN6pKfMSALaQjw3kP4E6HVSQBdCBsIixAPVRWgtQCGVyAQOQzwutvgG1Mlj/vIHkLGUOqARAABmN/tHfdZ2rfzFF/Wc2HN65x98UVtdTIPwhde1ZgN9pLcAKgjRlGgCaAELbkxu26CxlDqgEQAARB0ucN30rwFiStxNV/RzhOaDRgiBL+nr2LMAq9A7dagGoYIyxF5zVv/hp+GcIcm9wucHrGWZ4G0SeAyoBkEImcwWU1stD9ywgAKr69wSr62cg9GhCzyzASToLcE5HDLwiqccQnwAOdS43jt6UT6+B8Khv+RpKAATAD5Yg9Ic2jZ0sP0bj6XPXPFLlT5DaE9TQmTmmFuAljQVo01ey1EXAIypiGwOgbVadjYHw6ssBlQBIwDlYQgDD1YOlBIAgsSfoIsICoFQUWsktQGZBz+TgFSm+C2gQse0glxu8nE0hPgcMK5ESAEEP2CuIYdWsHCkFYEjuCRrWoi1AdprcAtCSXEs0AOEE8NpLAPmqU5sHIEys2BxQCYCg56s+AkEsZ2r+TzCsrmcRm4MZURbATGwB6D4gQ03mGqBn+rUMYjfyzqLz/LYcUAkAIuH5ys1BFOP8EaIkQPSC4EWyzcGy2TcgxFmADu0CMiR2AWktOtwITjjg5ZyWk+aWHJB8GSUAInCeGq0Bomi0s5WKWgWIyO0JmsZZgIQTAdmG/C6g+ATwwmcANvVftKmGTzr0TXkqAUAkvGDKExDGIJvNqj4A4RZgErPpH7UAPaDcWmaEBaCf6xgSu4Bo3DA36YRj7tjtOCtSrwCt25gcUAmAwMfreA2iaP0uOa2ASgHEwFf5JdkcLN8HyphagKh9QD4MiQagRB3mIJgAuoeB2nqTrZeKiXNAJQAC55mK1cEcBNHQWAuB2gxEZk9QK3JzsFeALRaAV9BTqCQlLgKmCeCKJIAs5HMo5ZZA+MNzwIoSAESCBage52YLEMPC6SJU2wGJtQAFIIzJZB2Cy+1iLECeW4DwPiAjmV1AWujgskACuNk/vmJjK8A1EBrROaASALEW4DiX7676IILZcVVtCCixJyh+c7AxQCILcAdB2jIXAdP44jmoNuxqeDkUunppBYS/Pk1SAoCIf7+UirYAnJaN5vP5EL7KfLOVgFIAiT1B4c3BMChIYgEM+gHDlNcFNAi3MtG80b0ago9iIVkOqARAuAVABcCbc9bs/tnQ2cbDdLXoQ4hZzpnWUQog9BY97doc7OgDomkTC/BCc9vYRcAZ8QngjK4BZAdIIa4FeALCedS3UgIg3AJ4CsC7tB2s7WidORAWuLBLKYDsniC6OdgAIJEF0CHIlJckzxVkJYCjyASQZcb2P3bmgEoAEOHvF64ArgRoac4FfX+EIDo7GUwdDCLSArxv3xysvgRIZAHIILtfk3cacDgBvOTzDc1udzC4vm4227e3t1cu9r+1229JckAlAILI2DjOq+oqAJoAS0tHbQEBOmWuAMoCCOsJWm7ZHKxy1INYxpq1sQCVKxrKyTQANAG84xe7bEFipvhDmTIpAZDwdPkUwDEBaTXgrAF+brzjwUvqeHBJPUF0c7AsrgFKYgGy53TdhkQDMIDIiyHaClLQNmkOqARAkgKgCUAJMC2OtpMeWevpLfAsqUGAxJ6guW/W/hW2sNIs74N0nr0nrwsonAB2uAHoQgrCOaASAHFkNgpQPGYSgBpgmIlgEjEEP26/ujogXLAFaAKh51kAOnlGaXoWoEpEZGlKNADrLRsBLyAxNAdUAoDIUQDXBOBAwMZIiGkzoWtP8GFSFkCsBaiPQqdneH/nMUn2qAXwvMKMvpMlLgLWgHDLL/YA6WjUyLdTAiBBAbK2AqAEOBpgU06GYTMFPwPXTmI+pVIAGT1BdHOwNhGGQYwFyC9pFxAxACIX3E3i5xt/Mcd4KDngDxcArgCOCTh2NQA5TUa53AM/Hf447f23/RuQbT/p5mAfEODdGIUtAH6wJ70LKD4BHOo8AbwHh4PJAX+6ADAF8CTA1QAkn5DTJvjpkSklJQAi9m6J2vZz7fydOyQcNIxmpAUwh7FdQJbJZwrlJIDv/GLs2x1ODvjjBQAVgJkAlIBi1RYBJJeQ/C34ecJ1XsoCSLAAdxDazNcoG4/h5bbjKAvwHDco18R3Aa0hcrSBaOfwCd59OaASAESCAjAJqJdKuEETcpyEXO4P+Hlmk0qH8uP+BdjuTf2IzcGeSKmV7bq+bYUtQI38xy8Su4A0IDT5aKMDn2FIc0AlADIkgGkAigBSTADKxF8yBCho3jK1UlaNAQRagIvw5mAn/agdd17CFmBKO/MldgFNIFZs9Ef4FPckB8woARAL21YGqVSyjPpOHJ0I3u+OL1VSIYBQC5Cj+fmNdQMBJmXnXXsVsgB08e1fiYuAB+GhCm8CeH19e3tbPzPW6zfk1ccdMgVK058DKgGQQMbF6820ySainuuDn4Gv27tYUhOBIi3AH2oBZpHH7uo6LaDVC6lJXd4aoCJNAB/oNiC4UBTJeatPbfjaMg0//AKED+pTlAAIJ+NxlBi0C/ckXGI3WqWA4i1AdUkVAAKM3bBN1y/7sJUn05JmANbbNgI2DV7/UavPNYdC4Xd/Ww6oBEASGUYaIWiSR7KGN/ogf913hi0I7sJWsOHWEQD9FbbRKMjbCbgAW9YbeI0ix5gw+xvQEM0DP3sBhOEJyQG/uwBYB1kimbTkGkB+XaFwoPL2rWE9QR9ACYdtKADbl9v1fO9k0WPrSfymY5rF6x8VIJf3C4DGQRFb7MwB/ykBOJwayaRiQFPdN762TAmAeAvQBgpN9hlPEM9cw8/JMQCDmC/FFxxh/eP0kd8BmOH20+72HPAfEoDDyskyadAnQBn4F5cqAUBk9QRRpmxcv3O+raNpkhYBhxPAJ24AyFFgrAOddJ/yMGC8Mwf8pgLwcXl1dXn5++zXie5Y5dPTfCKqYo1CnaznS8nJ4OHmHEL0C0oACGJ7gn5BHP0TX/1rVg/i+MDPSToK4A2CLC062sAcz1lk4o0BInpPTeSsD4SeLwf8xgLwWe7EnsDfAxlMlQBQZPUEUdaB+jetOcQwwM/JMQAFIMwMMtpw67/uKoDXe1qmGMjuHPCnCkAmc6gC0Los2BxsxPm9cS0AP0OTVkcBYbVmGkYHohlhTGgjYxHwBCI6jojYFEv1Ous68VpPT8OgCsyBcENzwJ8lAEcOGZfDFIAXzG/VLABFRk8Q5cIta5a2G3YBLSCSpu4i4Sygbuh9gAMAehRYPYu4CnAcN/xEVbgGyrU/B/xpAvC3Uqn4NOAgBeBWKxzuKodvj5sDnvYhgseTTVlrlpssDSCKsY6EDICUBPDVsMJHgWH9V7I2Jd59TmGysDsH/EkCMM0ijghkkAMUgLVT/2olIEVCTxClV6vVfHXtBMvnEKZ1W7NhHyTVJDoBbEQdBcbOAkQJcJOAamybaa6wNQf8cQJQKuHoiR+/fXACMML6Z8+gagbiiO4JakCI+UnNLWzfevvcLYS5r7EPil8EXABCJ5wAevXPJaAU12WKGvCwMwf8SQJQrRYxQOUKcGACsDzhAuDcJrUl0P/sXU1P20AQlat8Og4EO+ADB6MWiUsOPSDO/AcOueYPcDW0Ei0NKojQH13P7phn7wY3dmclC/yk3Kzd2cy+59nx7C7gZE8QcDMajXJeo97ePn//+gs/aAQALjKAx1sygPrmaMYB9pzu2aAUQd/KAz6YecAPJADDDOGU79791DoB+Ham+N+lAFwBe4IsWrzsjzIoXqPcJgwPLSc9jwhOAoCllRAyagBxWYS599wGLxDCs+o84IcSgMtehmHp9u02CcDjCfgfR92RYPJAQbCV3luD11xvr8vtHsxV+WfjQThJPAN4b2YAEbgzqjaZ8gF14Z01z8zMxccRgD4FduRZHUe1SwDufOZ/IbjszgUHnO4J+jliXnPw1edyO+vOkGTEkYL8XUDPFQcBx0bqDqhUgUwCpnbZQ4rGHAnAoJ0C8DUIeG2nFKBVAnCakq99AvzdnQgGCBcEH5Zocb0ArwvlNnS0W1Jele8jADB2AYlnADdWBhAv7WpAGEgB3qoHRGvSAkAmt1IAJrNZELC689jbIQCnKb/+CYPuXgBnwJ6gkvfSQgDAl7Jwuc1ReFykznn+IIm0aDbdQwbQvnYEGcDy0vWfGkDBTu9pSx4wQPmCGwGIWQCO2iQAEdV30dCV29oiABfHqT/IYNWXdTcDuUDOiwQOSOb2wl59LKIYOsD2wacFHpTeBbS06g3NU4fRl1fjaKqsXGhLPaAdAsgLwKx1AvAQx9EE3DpogQBcPN6v5wPQH/VlXQDgBPgUOL194bB+6c/n+tOesdjWN74N0+96nXB5yA/6vvwuoMWVxk2GzWa1WlMAMOZoullfHo90b00Npmma5FiKvmE8MltZTb0ktwPxU229Bf4YNYwfQLI7lmMcqSRArjncRWaRYXWwuro93x9o+DlY79nfXQDgBBwCTIcnN7/+bHTxtS4BwMJecY0VIOwtVr+TtT9WzzH/jSha1rBeP5ixAID/9fvyeLkzDXuqRd2g7CsGedWQzGar2WgIgIhm6z8mipUjGCDODhjTakpg6LCK3QV/1YYPoA5d+7t1Zx29E+TTKdREi8tfX6C9BPBnEuFBOysnZhcJDgSAEE8yrWnWl/eGpMSS5oMIMJslRqySjT1WdBj4Xw1wC0N3IADgv98U2kDEKG076uj9AJ7LiV0+co8XABxCY2qbWXnE0C6EKYpjxaTGASGatDTFbFPEbpiNDkAzCQEgJWY/1GaXawHQ8RWhrmH0K5in7FO+6QKACoi/asELaC8ouY0/guW0mFDojaj0v1krz2gzoiEUG5UUgLDHfaADUQGAwzTVwOvdAP5LCgAJH+Kr5hjnal/gfxcA2HBHNZtrHkJozO0MPImQlZO2Cmd98nerxtF6IYjhoRLUQKUEAPRkuwkVqTah5fbYYM9OsH0sF7Fpq5ojzumvy1A7/jsEiK1898q1AMkXFgCTPxPQB5PIgSxpqxT97e/WDRcBPFQCXjNoVWhJpfqYGQIjq9haiesTLIbvMHKZQLKP09lrm0VQ0+q1Tonf/90CwBlKxO6r47NmPGkLCwCE0MwfelCimqyaq2wUdUZdNV0QolHmDg+VEGCoQgIAkSGgffxDYv7iKCOqCaaYoGX8GikpdtQAr6Kce3va8f8vO2ezmzAQA2E53SiHkqrpIe//qMW7C5PGagFrHJDq77yyxz9jcUAJBcZuvwF2SwuvWf8ofUpwD/kq9VxjTWV+EHovAKIiLPMALBCu4GwROmTH8Km8PwQuH0vZZokcoqBKwVTS/9Fgo/rwCnZ2QvP3q4eH5Yd5hK4JH/sci9EEHvo7ECpACYhLUA7hpctGi/jHcTy50MppyuxunNxg2HUq6f9ArNumouyO794/fbvx8DIlsiTdcqPJf2tQAUq1cZnNnC7ha4sQnjuu0UWXRlImOEv98nm5zuQsrWpL/0cjWKm6tfhYDI6v8Q8e4krTJeFjn5rJaOKUqoFRgzCb+WXC86/jVJy04eF4M0RhN4qX7aybtvR/NILptU/ozbOxhPFlf/hhH7KWvEnqqWZKqm2p1aHcGmyG2ejmj2vyQC7cNnZy0QbSlKm09H8kdno6PmV7ff98uK4YE11Rz8RLhQoWxDVfxyUqt9H545p9QBq77tWrStlMpDYt/R8Opoev6u121j607yRAUc+EVNDEKpVfhJgMi+klM8Pqg6rMNnZ1gpal/Y9EroaroP2/GdM+JCMmE1KxApvITOUKP7ot4c3JwjaZKBDlo3VMkbT/kUhlAFK5/VAacYroqcQZ2Z8A0WMy+Amoe2Agaf+jEQBuP8S7WEWAHRjEKo9qzuAjpG6SqrT/U7h7Zc27KOJcFG7Q+B4JiZcUleZ/DncP4LBBhVo0tgoEB692A85B/omqJEmSJEmSJEmSb/bgQAAAAAAAyP+1EVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFfbgQAAAAAAAyP+1EVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVhT04EAAAAAAA8n9tBFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVaQ8OBAAAAAAE+VsPcgUAAAAAAAAAAAAATASoXnyNkfvyiwAAAABJRU5ErkJggg==); - background-size: cover; -} \ No newline at end of file diff --git a/vendor/github.com/wailsapp/wails/runtime/assets/wails.js b/vendor/github.com/wailsapp/wails/runtime/assets/wails.js deleted file mode 100644 index 0971f49..0000000 --- a/vendor/github.com/wailsapp/wails/runtime/assets/wails.js +++ /dev/null @@ -1 +0,0 @@ -!function(n){var e={};function t(r){if(e[r])return e[r].exports;var o=e[r]={i:r,l:!1,exports:{}};return n[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,r){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:r})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var r=Object.create(null);if(t.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(r,o,function(e){return n[e]}.bind(null,o));return r},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){"use strict";t.r(e),t.d(e,"Init",(function(){return L}));var r={};t.r(r),t.d(r,"Debug",(function(){return l})),t.d(r,"Info",(function(){return s})),t.d(r,"Warning",(function(){return d})),t.d(r,"Error",(function(){return f})),t.d(r,"Fatal",(function(){return w}));var o={};t.r(o),t.d(o,"OpenURL",(function(){return h})),t.d(o,"OpenFile",(function(){return y}));var i={};t.r(i),t.d(i,"New",(function(){return N}));var a=[];function c(n,e,t){var r={type:n,callbackID:t,payload:e};!function(n){if(window.wailsbridge?window.wailsbridge.websocket.send(n):window.external.invoke(n),a.length>0)for(var e=0;e0)var a=setTimeout((function(){o(Error("Call to "+n+" timed out. Request ID: "+i))}),t);v[i]={timeoutHandle:a,reject:o,resolve:r};try{c("call",{bindingName:n,data:JSON.stringify(e)},i)}catch(n){console.error(n)}}))}function b(n,e){return g(".wails."+n,e)}function h(n){return b("Browser.OpenURL",n)}function y(n){return b("Browser.OpenFile",n)}p=window.crypto?function(){var n=new Uint32Array(1);return window.crypto.getRandomValues(n)[0]}:function(){return 9007199254740991*Math.random()};var m=function n(e,t){!function(n,e){if(!(n instanceof e))throw new TypeError("Cannot call a class as a function")}(this,n),t=t||-1,this.Callback=function(n){return e.apply(null,n),-1!==t&&0===(t-=1)}},E={};function O(n,e,t){E[n]=E[n]||[];var r=new m(e,t);E[n].push(r)}function S(n){var e=JSON.stringify([].slice.apply(arguments).slice(1)),t={name:n,data:e};c("event",t)}var j={};function k(n){try{return new Function("var "+n),!0}catch(n){return!1}}function N(n,e){var t,r=this;if(!window.wails)throw Error("Wails is not initialised");var o=[];return this.subscribe=function(n){o.push(n)},this.set=function(e){t=e,window.wails.Events.Emit("wails:sync:store:updatedbyfrontend:"+n,JSON.stringify(t)),o.forEach((function(n){n(t)}))},this.update=function(n){var e=n(t);r.set(e)},window.wails.Events.On("wails:sync:store:updatedbybackend:"+n,(function(n){n=JSON.parse(n),t=n,o.forEach((function(n){n(t)}))})),e&&this.set(e),this}function C(){return(C=Object.assign||function(n){for(var e=1;e1)for(var r=0;r 0 { - title = params[0] - } - if len(params) > 1 { - filter = strings.Replace(params[1], " ", "", -1) - } - return r.renderer.SelectFile(title, filter) -} - -// SelectDirectory prompts the user to select a directory -func (r *Dialog) SelectDirectory() string { - return r.renderer.SelectDirectory() -} - -// SelectSaveFile prompts the user to select a file for saving -func (r *Dialog) SelectSaveFile(params ...string) string { - title := "Select Save" - filter := "" - if len(params) > 0 { - title = params[0] - } - if len(params) > 1 { - filter = strings.Replace(params[1], " ", "", -1) - } - return r.renderer.SelectSaveFile(title, filter) -} diff --git a/vendor/github.com/wailsapp/wails/runtime/events.go b/vendor/github.com/wailsapp/wails/runtime/events.go deleted file mode 100644 index ffbeaa5..0000000 --- a/vendor/github.com/wailsapp/wails/runtime/events.go +++ /dev/null @@ -1,35 +0,0 @@ -package runtime - -import "github.com/wailsapp/wails/lib/interfaces" - -// Events exposes the events interface -type Events struct { - eventManager interfaces.EventManager -} - -// NewEvents creates a new Events struct -func NewEvents(eventManager interfaces.EventManager) *Events { - return &Events{ - eventManager: eventManager, - } -} - -// On pass through -func (r *Events) On(eventName string, callback func(optionalData ...interface{})) { - r.eventManager.On(eventName, callback) -} - -// Once pass through -func (r *Events) Once(eventName string, callback func(optionalData ...interface{})) { - r.eventManager.Once(eventName, callback) -} - -// OnMultiple pass through -func (r *Events) OnMultiple(eventName string, callback func(optionalData ...interface{}), counter uint) { - r.eventManager.OnMultiple(eventName, callback, counter) -} - -// Emit pass through -func (r *Events) Emit(eventName string, optionalData ...interface{}) { - r.eventManager.Emit(eventName, optionalData...) -} diff --git a/vendor/github.com/wailsapp/wails/runtime/filesystem.go b/vendor/github.com/wailsapp/wails/runtime/filesystem.go deleted file mode 100644 index ebb4fed..0000000 --- a/vendor/github.com/wailsapp/wails/runtime/filesystem.go +++ /dev/null @@ -1,16 +0,0 @@ -package runtime - -import "os" - -// FileSystem exposes file system utilities to the runtime -type FileSystem struct{} - -// NewFileSystem creates a new FileSystem struct -func NewFileSystem() *FileSystem { - return &FileSystem{} -} - -// HomeDir returns the user's home directory -func (r *FileSystem) HomeDir() (string, error) { - return os.UserHomeDir() -} diff --git a/vendor/github.com/wailsapp/wails/runtime/js/runtime/init.js b/vendor/github.com/wailsapp/wails/runtime/js/runtime/init.js deleted file mode 100644 index 14de186..0000000 --- a/vendor/github.com/wailsapp/wails/runtime/js/runtime/init.js +++ /dev/null @@ -1,21 +0,0 @@ -/* - _ __ _ __ -| | / /___ _(_) /____ -| | /| / / __ `/ / / ___/ -| |/ |/ / /_/ / / (__ ) -|__/|__/\__,_/_/_/____/ -The lightweight framework for web-like apps -(c) Lea Anthony 2019-present -*/ -/* jshint esversion: 6 */ - -/** - * Initialises the Wails runtime - * - * @param {function} callback - */ -function Init(callback) { - window.wails._.Init(callback); -} - -module.exports = Init; diff --git a/vendor/github.com/wailsapp/wails/runtime/log.go b/vendor/github.com/wailsapp/wails/runtime/log.go deleted file mode 100644 index dd609ce..0000000 --- a/vendor/github.com/wailsapp/wails/runtime/log.go +++ /dev/null @@ -1,16 +0,0 @@ -package runtime - -import "github.com/wailsapp/wails/lib/logger" - -// Log exposes the logging interface to the runtime -type Log struct{} - -// NewLog creates a new Log struct -func NewLog() *Log { - return &Log{} -} - -// New creates a new logger -func (r *Log) New(prefix string) *logger.CustomLogger { - return logger.NewCustomLogger(prefix) -} diff --git a/vendor/github.com/wailsapp/wails/runtime/runtime.go b/vendor/github.com/wailsapp/wails/runtime/runtime.go deleted file mode 100644 index 7097de7..0000000 --- a/vendor/github.com/wailsapp/wails/runtime/runtime.go +++ /dev/null @@ -1,29 +0,0 @@ -package runtime - -import "github.com/wailsapp/wails/lib/interfaces" - -// Runtime is the Wails Runtime Interface, given to a user who has defined the WailsInit method -type Runtime struct { - Events *Events - Log *Log - Dialog *Dialog - Window *Window - Browser *Browser - FileSystem *FileSystem - Store *StoreProvider -} - -// NewRuntime creates a new Runtime struct -func NewRuntime(eventManager interfaces.EventManager, renderer interfaces.Renderer) *Runtime { - result := &Runtime{ - Events: NewEvents(eventManager), - Log: NewLog(), - Dialog: NewDialog(renderer), - Window: NewWindow(renderer), - Browser: NewBrowser(), - FileSystem: NewFileSystem(), - } - // We need a reference to itself - result.Store = NewStoreProvider(result) - return result -} diff --git a/vendor/github.com/wailsapp/wails/runtime/window.go b/vendor/github.com/wailsapp/wails/runtime/window.go deleted file mode 100644 index 3665cba..0000000 --- a/vendor/github.com/wailsapp/wails/runtime/window.go +++ /dev/null @@ -1,99 +0,0 @@ -package runtime - -import ( - "bytes" - "runtime" - - "github.com/abadojack/whatlanggo" - "github.com/wailsapp/wails/lib/interfaces" - "golang.org/x/text/encoding" - "golang.org/x/text/encoding/japanese" - "golang.org/x/text/encoding/korean" - "golang.org/x/text/encoding/simplifiedchinese" - "golang.org/x/text/transform" -) - -func detectEncoding(text string) (encoding.Encoding, string) { - // korean - var enc encoding.Encoding - info := whatlanggo.Detect(text) - //fmt.Println("Language:", info.Lang.String(), " Script:", whatlanggo.Scripts[info.Script], " Confidence: ", info.Confidence) - switch info.Lang.String() { - case "Korean": - enc = korean.EUCKR - case "Mandarin": - enc = simplifiedchinese.GBK - case "Japanese": - enc = japanese.EUCJP - } - return enc, info.Lang.String() -} - -// ProcessEncoding attempts to convert CKJ strings to UTF-8 -func ProcessEncoding(text string) string { - if runtime.GOOS != "windows" { - return text - } - - encoding, _ := detectEncoding(text) - if encoding != nil { - var bufs bytes.Buffer - wr := transform.NewWriter(&bufs, encoding.NewEncoder()) - _, err := wr.Write([]byte(text)) - defer wr.Close() - if err != nil { - return "" - } - - return bufs.String() - } - return text -} - -// Window exposes an interface for manipulating the window -type Window struct { - renderer interfaces.Renderer -} - -// NewWindow creates a new Window struct -func NewWindow(renderer interfaces.Renderer) *Window { - return &Window{ - renderer: renderer, - } -} - -// SetColour sets the the window colour -func (r *Window) SetColour(colour string) error { - return r.renderer.SetColour(colour) -} - -// SetMinSize sets the minimum size of a resizable window -func (r *Window) SetMinSize(width, height int) { - r.renderer.SetMinSize(width, height) -} - -// SetMaxSize sets the maximum size of a resizable window -func (r *Window) SetMaxSize(width, height int) { - r.renderer.SetMaxSize(width, height) -} - -// Fullscreen makes the window fullscreen -func (r *Window) Fullscreen() { - r.renderer.Fullscreen() -} - -// UnFullscreen attempts to restore the window to the size/position before fullscreen -func (r *Window) UnFullscreen() { - r.renderer.UnFullscreen() -} - -// SetTitle sets the the window title -func (r *Window) SetTitle(title string) { - title = ProcessEncoding(title) - r.renderer.SetTitle(title) -} - -// Close shuts down the window and therefore the app -func (r *Window) Close() { - r.renderer.Close() -} diff --git a/vendor/github.com/wailsapp/wails/LICENSE b/vendor/github.com/wailsapp/wails/v2/LICENSE similarity index 100% rename from vendor/github.com/wailsapp/wails/LICENSE rename to vendor/github.com/wailsapp/wails/v2/LICENSE diff --git a/vendor/github.com/wailsapp/wails/v2/NOTES.md b/vendor/github.com/wailsapp/wails/v2/NOTES.md new file mode 100644 index 0000000..16bac71 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/NOTES.md @@ -0,0 +1,40 @@ + +# Packing linux + + * create app, app.desktop, app.png (512x512) + * chmod +x app! + * ./linuxdeploy-x86_64.AppImage --appdir AppDir -i react.png -d react.desktop -e react --output appimage + + +# Wails Doctor + +Tested on: + + * Debian 8 + * Ubuntu 20.04 + * Ubuntu 19.10 + * Solus 4.1 + * Centos 8 + * Gentoo + * OpenSUSE/leap + * Fedora 31 + +### Development + +Add a new package manager processor here: `v2/internal/system/packagemanager/`. IsAvailable should work even if the package is installed. +Add your new package manager to the list of package managers in `v2/internal/system/packagemanager/packagemanager.go`: + +``` +var db = map[string]PackageManager{ + "eopkg": NewEopkg(), + "apt": NewApt(), + "yum": NewYum(), + "pacman": NewPacman(), + "emerge": NewEmerge(), + "zypper": NewZypper(), +} +``` + +## Gentoo + + * Setup docker image using: emerge-webrsync -x -v diff --git a/vendor/github.com/wailsapp/wails/v2/README.md b/vendor/github.com/wailsapp/wails/v2/README.md new file mode 100644 index 0000000..211b296 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/README.md @@ -0,0 +1,5 @@ +# Wails v2 ALPHA + +This branch contains WORK IN PROGRESS! There are no guarantees. Use at your peril! + +This document will be updated as progress is made. \ No newline at end of file diff --git a/vendor/github.com/wailsapp/wails/v2/go.mod b/vendor/github.com/wailsapp/wails/v2/go.mod new file mode 100644 index 0000000..094362c --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/go.mod @@ -0,0 +1,45 @@ +module github.com/wailsapp/wails/v2 + +go 1.16 + +require ( + github.com/Masterminds/semver v1.5.0 + github.com/fatih/structtag v1.2.0 + github.com/fsnotify/fsnotify v1.4.9 + github.com/go-git/go-billy/v5 v5.2.0 // indirect + github.com/go-git/go-git/v5 v5.3.0 + github.com/golang/protobuf v1.5.2 // indirect + github.com/google/uuid v1.1.2 // indirect + github.com/gorilla/websocket v1.4.1 + github.com/imdario/mergo v0.3.12 + github.com/jackmordaunt/icns v1.0.0 + github.com/klauspost/compress v1.11.3 // indirect + github.com/leaanthony/clir v1.0.4 + github.com/leaanthony/debme v1.2.1 + github.com/leaanthony/go-ansi-parser v1.0.1 + github.com/leaanthony/go-common-file-dialog v1.0.3 + github.com/leaanthony/gosod v1.0.1 + github.com/leaanthony/idgen v1.0.0 + github.com/leaanthony/slicer v1.5.0 + github.com/leaanthony/webview2runtime v1.1.0 + github.com/leaanthony/winicon v0.0.0-20200606125418-4419cea822a0 + github.com/matryer/is v1.4.0 + github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 // indirect + github.com/olekukonko/tablewriter v0.0.4 + github.com/pkg/errors v0.9.1 + github.com/stretchr/testify v1.7.0 // indirect + github.com/tdewolff/minify v2.3.6+incompatible + github.com/tdewolff/parse v2.3.4+incompatible // indirect + github.com/tdewolff/test v1.0.6 // indirect + github.com/tidwall/sjson v1.1.7 + github.com/wzshiming/ctc v1.2.3 + github.com/xyproto/xpm v1.2.1 + github.com/ztrue/tracerr v0.3.0 + golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b // indirect + golang.org/x/mod v0.4.1 // indirect + golang.org/x/net v0.0.0-20210326060303-6b1517762897 + golang.org/x/sys v0.0.0-20210611083646-a4fc73990273 + golang.org/x/text v0.3.5 // indirect + golang.org/x/tools v0.1.0 + nhooyr.io/websocket v1.8.6 +) diff --git a/vendor/github.com/wailsapp/wails/v2/go.sum b/vendor/github.com/wailsapp/wails/v2/go.sum new file mode 100644 index 0000000..6ab26f0 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/go.sum @@ -0,0 +1,246 @@ +github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= +github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= +github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= +github.com/Microsoft/go-winio v0.4.16 h1:FtSW/jqD+l4ba5iPBj9CODVtgfYAD8w2wS923g/cFDk= +github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= +github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7 h1:uSoVVbwJiQipAclBbw+8quDsfcvFjOpI5iCf4p/cqCs= +github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs= +github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA= +github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg= +github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= +github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4= +github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= +github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= +github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.6.3 h1:ahKqKTFpO5KTPHxWZjEdPScmYaGtLo8Y4DMHoEsnp14= +github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= +github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0= +github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= +github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4= +github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= +github.com/go-git/go-billy/v5 v5.0.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= +github.com/go-git/go-billy/v5 v5.1.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= +github.com/go-git/go-billy/v5 v5.2.0 h1:GcoouCP9J+5slw2uXAocL70z8ml4A8B/H8nEPt6CLPk= +github.com/go-git/go-billy/v5 v5.2.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= +github.com/go-git/go-git-fixtures/v4 v4.0.2-0.20200613231340-f56387b50c12 h1:PbKy9zOy4aAKrJ5pibIRpVO2BXnK1Tlcg+caKI7Ox5M= +github.com/go-git/go-git-fixtures/v4 v4.0.2-0.20200613231340-f56387b50c12/go.mod h1:m+ICp2rF3jDhFgEZ/8yziagdT1C+ZpZcrJjappBCDSw= +github.com/go-git/go-git/v5 v5.3.0 h1:8WKMtJR2j8RntEXR/uvTKagfEt4GYlwQ7mntE4+0GWc= +github.com/go-git/go-git/v5 v5.3.0/go.mod h1:xdX4bWJ48aOrdhnl2XqHYstHbbp6+LFS4r4X+lNVprw= +github.com/go-ole/go-ole v1.2.4 h1:nNBDSCOigTSiarFpYE9J/KtEA1IOW4CNeqT9TQDqCxI= +github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM= +github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= +github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= +github.com/go-playground/validator/v10 v10.2.0 h1:KgJ0snyC2R9VXYN2rneOtQcw5aHQB1Vv0sFl1UcHBOY= +github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee h1:s+21KNqlpePfkah2I+gwHF8xmJWRjooY+5248k6m4A0= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= +github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8= +github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.0.2 h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo= +github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM= +github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= +github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/jackmordaunt/icns v1.0.0 h1:RYSxplerf/l/DUd09AHtITwckkv/mqjVv4DjYdPmAMQ= +github.com/jackmordaunt/icns v1.0.0/go.mod h1:7TTQVEuGzVVfOPPlLNHJIkzA6CoV7aH1Dv9dW351oOo= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= +github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= +github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351 h1:DowS9hvgyYSX4TO5NpyC606/Z4SxnNYbT+WX27or6Ck= +github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= +github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.11.3 h1:dB4Bn0tN3wdCzQxnS8r06kV74qN/TAfaIS0bVE8h3jc= +github.com/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/leaanthony/clir v1.0.4 h1:Dov2y9zWJmZr7CjaCe86lKa4b5CSxskGAt2yBkoDyiU= +github.com/leaanthony/clir v1.0.4/go.mod h1:k/RBkdkFl18xkkACMCLt09bhiZnrGORoxmomeMvDpE0= +github.com/leaanthony/debme v1.1.1/go.mod h1:3V+sCm5tYAgQymvSOfYQ5Xx2JCr+OXiD9Jkw3otUjiA= +github.com/leaanthony/debme v1.2.1 h1:9Tgwf+kjcrbMQ4WnPcEIUcQuIZYqdWftzZkBr+i/oOc= +github.com/leaanthony/debme v1.2.1/go.mod h1:3V+sCm5tYAgQymvSOfYQ5Xx2JCr+OXiD9Jkw3otUjiA= +github.com/leaanthony/go-ansi-parser v1.0.1 h1:97v6c5kYppVsbScf4r/VZdXyQ21KQIfeQOk2DgKxGG4= +github.com/leaanthony/go-ansi-parser v1.0.1/go.mod h1:7arTzgVI47srICYhvgUV4CGd063sGEeoSlych5yeSPM= +github.com/leaanthony/go-common-file-dialog v1.0.3 h1:O0uGjKnWtdEADGrkg+TyAAbZylykMwwx/MNEXn9fp+Y= +github.com/leaanthony/go-common-file-dialog v1.0.3/go.mod h1:TGhEc9eSJgRsupZ+iH1ZgAOnEo9zp05cRH2j08RPrF0= +github.com/leaanthony/gosod v1.0.1 h1:F+4c3DmEBfigi7oAswCV2RpQ+k4DcNbhuCZUGdBHacQ= +github.com/leaanthony/gosod v1.0.1/go.mod h1:W8RyeSFBXu7RpIxPGEJfW4moSyGGEjlJMLV25wEbAdU= +github.com/leaanthony/idgen v1.0.0 h1:IZreR+JGEzFV4yeVuBZA25gM0keUoFy+RDUldncQ+Jw= +github.com/leaanthony/idgen v1.0.0/go.mod h1:4nBZnt8ml/f/ic/EVQuLxuj817RccT2fyrUaZFxrcVA= +github.com/leaanthony/slicer v1.5.0 h1:aHYTN8xbCCLxJmkNKiLB6tgcMARl4eWmH9/F+S/0HtY= +github.com/leaanthony/slicer v1.5.0/go.mod h1:FwrApmf8gOrpzEWM2J/9Lh79tyq8KTX5AzRtwV7m4AY= +github.com/leaanthony/webview2runtime v1.1.0 h1:N0pv55ift8XtqozIp4PNOtRCJ/Qdd/qzx80lUpalS4c= +github.com/leaanthony/webview2runtime v1.1.0/go.mod h1:hH9GnWCve3DYzNaPOcPbhHQ7fodXR1QJNsnwixid4Tk= +github.com/leaanthony/winicon v0.0.0-20200606125418-4419cea822a0 h1:FPGYnfxuuxqCZhrGq8nKjthEcYHgHmFbyY953Xv9cNI= +github.com/leaanthony/winicon v0.0.0-20200606125418-4419cea822a0/go.mod h1:en5xhijl92aphrJdmRPlh4NI1L6wq3gEm0LpXAPghjU= +github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= +github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= +github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e h1:9MlwzLdW7QSDrhDjFlsEYmxpFyIoXmYRon3dt0io31k= +github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= +github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE= +github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= +github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-runewidth v0.0.7 h1:Ei8KR0497xHyKJPAv59M1dkC+rOZCMBJ+t3fZ+twI54= +github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 h1:Esafd1046DLDQ0W1YjYsBW+p8U2u7vzgW2SQVmlNazg= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ= +github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/olekukonko/tablewriter v0.0.4 h1:vHD/YYe1Wolo78koG299f7V/VAS08c6IpCLn+Ejf/w8= +github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= +github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/tdewolff/minify v2.3.6+incompatible h1:2hw5/9ZvxhWLvBUnHE06gElGYz+Jv9R4Eys0XUzItYo= +github.com/tdewolff/minify v2.3.6+incompatible/go.mod h1:9Ov578KJUmAWpS6NeZwRZyT56Uf6o3Mcz9CEsg8USYs= +github.com/tdewolff/parse v2.3.4+incompatible h1:x05/cnGwIMf4ceLuDMBOdQ1qGniMoxpP46ghf0Qzh38= +github.com/tdewolff/parse v2.3.4+incompatible/go.mod h1:8oBwCsVmUkgHO8M5iCzSIDtpzXOT0WXX9cWhz+bIzJQ= +github.com/tdewolff/test v1.0.6 h1:76mzYJQ83Op284kMT+63iCNCI7NEERsIN8dLM+RiKr4= +github.com/tdewolff/test v1.0.6/go.mod h1:6DAvZliBAAnD7rhVgwaM7DE5/d9NMOAJ09SqYqeK4QE= +github.com/tidwall/gjson v1.8.0 h1:Qt+orfosKn0rbNTZqHYDqBrmm3UDA4KRkv70fDzG+PQ= +github.com/tidwall/gjson v1.8.0/go.mod h1:5/xDoumyyDNerp2U36lyolv46b3uF/9Bu6OfyQ9GImk= +github.com/tidwall/match v1.0.3 h1:FQUVvBImDutD8wJLN6c5eMzWtjgONK9MwIBCOrUJKeE= +github.com/tidwall/match v1.0.3/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.1.0 h1:K3hMW5epkdAVwibsQEfR/7Zj0Qgt4DxtNumTq/VloO8= +github.com/tidwall/pretty v1.1.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/tidwall/sjson v1.1.7 h1:sgVPwu/yygHJ2m1pJDLgGM/h+1F5odx5Q9ljG3imRm8= +github.com/tidwall/sjson v1.1.7/go.mod h1:w/yG+ezBeTdUxiKs5NcPicO9diP38nk96QBAbIIGeFs= +github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= +github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= +github.com/wzshiming/ctc v1.2.3 h1:q+hW3IQNsjIlOFBTGZZZeIXTElFM4grF4spW/errh/c= +github.com/wzshiming/ctc v1.2.3/go.mod h1:2tVAtIY7SUyraSk0JxvwmONNPFL4ARavPuEsg5+KA28= +github.com/wzshiming/winseq v0.0.0-20200112104235-db357dc107ae h1:tpXvBXC3hpQBDCc9OojJZCQMVRAbT3TTdUMP8WguXkY= +github.com/wzshiming/winseq v0.0.0-20200112104235-db357dc107ae/go.mod h1:VTAq37rkGeV+WOybvZwjXiJOicICdpLCN8ifpISjK20= +github.com/xanzy/ssh-agent v0.3.0 h1:wUMzuKtKilRgBAD1sUb8gOwwRr2FGoBVumcjoOACClI= +github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0= +github.com/xyproto/xpm v1.2.1 h1:trdvGjjWBsOOKzBBUPT6JvaIQM3acJEEYfbxN7M96wg= +github.com/xyproto/xpm v1.2.1/go.mod h1:cMnesLsD0PBXLgjDfTDEaKr8XyTFsnP1QycSqRw7BiY= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/ztrue/tracerr v0.3.0 h1:lDi6EgEYhPYPnKcjsYzmWw4EkFEoA/gfe+I9Y5f+h6Y= +github.com/ztrue/tracerr v0.3.0/go.mod h1:qEalzze4VN9O8tnhBXScfCrmoJo10o8TN5ciKjm6Mww= +golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b h1:7mWr3k41Qtv8XlltBkDkl8LoP3mpSgBW8BUoxtEdbXg= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/image v0.0.0-20200430140353-33d19683fad8 h1:6WW6V3x1P/jokJBpRQYUJnMHRP6isStQwCozxnU7XQw= +golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1 h1:Kvvh58BN8Y9/lBi7hTekvtMpm07eUZ0ck5pRHpsMWrY= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210326060303-6b1517762897 h1:KrsHThm5nFk34YtATK1LsThyGhGbGe1olrte/HInHvs= +golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200107162124-548cf772de50/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210611083646-a4fc73990273 h1:faDu4veV+8pcThn4fewv6TVlNCezafGoC1gM/mxQLbQ= +golang.org/x/sys v0.0.0-20210611083646-a4fc73990273/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5 h1:i6eZZ+zk0SOf0xgBpEpPD18qWcJda6q1sxt3S0kzyUQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.0 h1:po9/4sTYwZU9lPhi1tOrb4hCv3qrhiQ77LZfGa2OjwY= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= +gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +nhooyr.io/websocket v1.8.6 h1:s+C3xAMLwGmlI31Nyn/eAehUlZPwfYZu2JXM621Q5/k= +nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= diff --git a/vendor/github.com/wailsapp/wails/v2/init.go b/vendor/github.com/wailsapp/wails/v2/init.go new file mode 100644 index 0000000..50dc23f --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/init.go @@ -0,0 +1,7 @@ +// +build !windows + +package wails + +func Init() error { + return nil +} diff --git a/vendor/github.com/wailsapp/wails/v2/init_windows.go b/vendor/github.com/wailsapp/wails/v2/init_windows.go new file mode 100644 index 0000000..173da0a --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/init_windows.go @@ -0,0 +1,15 @@ +package wails + +import ( + "fmt" + "syscall" +) + +// Init is called at the start of the application +func Init() error { + status, r, err := syscall.NewLazyDLL("user32.dll").NewProc("SetProcessDPIAware").Call() + if status == 0 { + return fmt.Errorf("exit status %d: %v %v", status, r, err) + } + return nil +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/app/debug.go b/vendor/github.com/wailsapp/wails/v2/internal/app/debug.go new file mode 100644 index 0000000..42c4758 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/app/debug.go @@ -0,0 +1,41 @@ +// +build debug + +package app + +import ( + "flag" + "strings" + + "github.com/wailsapp/wails/v2/pkg/logger" +) + +// Init initialises the application for a debug environment +func (a *App) Init() error { + // Indicate debug mode + a.debug = true + + if a.appType == "desktop" { + // Enable dev tools + a.options.DevTools = true + } + + // Set log levels + loglevel := flag.String("loglevel", "debug", "Loglevel to use - Trace, Debug, Info, Warning, Error") + flag.Parse() + if len(*loglevel) > 0 { + switch strings.ToLower(*loglevel) { + case "trace": + a.logger.SetLogLevel(logger.TRACE) + case "info": + a.logger.SetLogLevel(logger.INFO) + case "warning": + a.logger.SetLogLevel(logger.WARNING) + case "error": + a.logger.SetLogLevel(logger.ERROR) + default: + a.logger.SetLogLevel(logger.DEBUG) + } + } + + return nil +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/app/default.go b/vendor/github.com/wailsapp/wails/v2/internal/app/default.go new file mode 100644 index 0000000..380c251 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/app/default.go @@ -0,0 +1,41 @@ +// +build !desktop,!hybrid,!server,!dev + +package app + +// This is the default application that will get run if the user compiles using `go build`. +// The reason we want to prevent that is that the `wails build` command does a lot of behind +// the scenes work such as asset compilation. If we allow `go build`, the state of these assets +// will be unknown and the application will not work as expected. + +import ( + "os" + + "github.com/wailsapp/wails/v2/internal/logger" + + "github.com/wailsapp/wails/v2/pkg/options" +) + +// App defines a Wails application structure +type App struct { + Title string + Width int + Height int + Resizable bool + + // Indicates if the app is running in debug mode + debug bool + + logger *logger.Logger +} + +// CreateApp returns a null application +func CreateApp(_ *options.App) (*App, error) { + return &App{}, nil +} + +// Run the application +func (a *App) Run() error { + println(`FATAL: This application was built using "go build". This is unsupported. Please compile using "wails build".`) + os.Exit(1) + return nil +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/app/desktop.go b/vendor/github.com/wailsapp/wails/v2/internal/app/desktop.go new file mode 100644 index 0000000..506a502 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/app/desktop.go @@ -0,0 +1,264 @@ +// +build desktop,!server + +package app + +import ( + "context" + "sync" + + "github.com/wailsapp/wails/v2/internal/binding" + "github.com/wailsapp/wails/v2/internal/ffenestri" + "github.com/wailsapp/wails/v2/internal/logger" + "github.com/wailsapp/wails/v2/internal/menumanager" + "github.com/wailsapp/wails/v2/internal/messagedispatcher" + "github.com/wailsapp/wails/v2/internal/runtime" + "github.com/wailsapp/wails/v2/internal/servicebus" + "github.com/wailsapp/wails/v2/internal/signal" + "github.com/wailsapp/wails/v2/internal/subsystem" + "github.com/wailsapp/wails/v2/pkg/options" +) + +// App defines a Wails application structure +type App struct { + appType string + + window *ffenestri.Application + servicebus *servicebus.ServiceBus + logger *logger.Logger + signal *signal.Manager + options *options.App + + // Subsystems + log *subsystem.Log + runtime *subsystem.Runtime + event *subsystem.Event + //binding *subsystem.Binding + call *subsystem.Call + menu *subsystem.Menu + url *subsystem.URL + dispatcher *messagedispatcher.Dispatcher + + menuManager *menumanager.Manager + + // Indicates if the app is in debug mode + debug bool + + // This is our binding DB + bindings *binding.Bindings + + // Application Stores + loglevelStore *runtime.Store + appconfigStore *runtime.Store + + // Startup/Shutdown + startupCallback func(*runtime.Runtime) + shutdownCallback func() +} + +// Create App +func CreateApp(appoptions *options.App) (*App, error) { + + // Merge default options + options.MergeDefaults(appoptions) + + // Set up logger + myLogger := logger.New(appoptions.Logger) + myLogger.SetLogLevel(appoptions.LogLevel) + + // Create the menu manager + menuManager := menumanager.NewManager() + + // Process the application menu + appMenu := options.GetApplicationMenu(appoptions) + menuManager.SetApplicationMenu(appMenu) + + // Process context menus + contextMenus := options.GetContextMenus(appoptions) + for _, contextMenu := range contextMenus { + menuManager.AddContextMenu(contextMenu) + } + + // Process tray menus + trayMenus := options.GetTrayMenus(appoptions) + for _, trayMenu := range trayMenus { + menuManager.AddTrayMenu(trayMenu) + } + + window := ffenestri.NewApplicationWithConfig(appoptions, myLogger, menuManager) + + // Create binding exemptions - Ugly hack. There must be a better way + bindingExemptions := []interface{}{appoptions.Startup, appoptions.Shutdown} + + result := &App{ + appType: "desktop", + window: window, + servicebus: servicebus.New(myLogger), + logger: myLogger, + bindings: binding.NewBindings(myLogger, appoptions.Bind, bindingExemptions), + menuManager: menuManager, + startupCallback: appoptions.Startup, + shutdownCallback: appoptions.Shutdown, + } + + result.options = appoptions + + // Initialise the app + err := result.Init() + if err != nil { + return nil, err + } + + // Preflight Checks + err = result.PreflightChecks(appoptions) + if err != nil { + return nil, err + } + + return result, nil + +} + +// Run the application +func (a *App) Run() error { + + var err error + + // Setup a context + var subsystemWaitGroup sync.WaitGroup + parentContext := context.WithValue(context.Background(), "waitgroup", &subsystemWaitGroup) + ctx, cancel := context.WithCancel(parentContext) + + // Start the service bus + a.servicebus.Debug() + err = a.servicebus.Start() + if err != nil { + return err + } + + runtimesubsystem, err := subsystem.NewRuntime(ctx, a.servicebus, a.logger, a.startupCallback) + if err != nil { + return err + } + a.runtime = runtimesubsystem + err = a.runtime.Start() + if err != nil { + return err + } + + // Application Stores + a.loglevelStore = a.runtime.GoRuntime().Store.New("wails:loglevel", a.options.LogLevel) + a.appconfigStore = a.runtime.GoRuntime().Store.New("wails:appconfig", a.options) + + // Start the logging subsystem + log, err := subsystem.NewLog(a.servicebus, a.logger, a.loglevelStore) + if err != nil { + return err + } + a.log = log + err = a.log.Start() + if err != nil { + return err + } + + // create the dispatcher + dispatcher, err := messagedispatcher.New(a.servicebus, a.logger) + if err != nil { + return err + } + a.dispatcher = dispatcher + err = dispatcher.Start() + if err != nil { + return err + } + + if a.options.Mac.URLHandlers != nil { + // Start the url handler subsystem + url, err := subsystem.NewURL(a.servicebus, a.logger, a.options.Mac.URLHandlers) + if err != nil { + return err + } + a.url = url + err = a.url.Start() + if err != nil { + return err + } + } + + // Start the eventing subsystem + eventsubsystem, err := subsystem.NewEvent(ctx, a.servicebus, a.logger) + if err != nil { + return err + } + a.event = eventsubsystem + err = a.event.Start() + if err != nil { + return err + } + + // Start the menu subsystem + menusubsystem, err := subsystem.NewMenu(ctx, a.servicebus, a.logger, a.menuManager) + if err != nil { + return err + } + a.menu = menusubsystem + err = a.menu.Start() + if err != nil { + return err + } + + // Start the call subsystem + callSubsystem, err := subsystem.NewCall(ctx, a.servicebus, a.logger, a.bindings.DB(), a.runtime.GoRuntime()) + if err != nil { + return err + } + a.call = callSubsystem + err = a.call.Start() + if err != nil { + return err + } + + // Dump bindings as a debug + bindingDump, err := a.bindings.ToJSON() + if err != nil { + return err + } + + // Setup signal handler + signalsubsystem, err := signal.NewManager(ctx, cancel, a.servicebus, a.logger) + if err != nil { + return err + } + a.signal = signalsubsystem + a.signal.Start() + + err = a.window.Run(dispatcher, bindingDump, a.debug) + a.logger.Trace("Ffenestri.Run() exited") + if err != nil { + return err + } + + // Close down all the subsystems + a.logger.Trace("Cancelling subsystems") + cancel() + subsystemWaitGroup.Wait() + + a.logger.Trace("Cancelling dispatcher") + dispatcher.Close() + + // Close log + a.logger.Trace("Stopping log") + log.Close() + + a.logger.Trace("Stopping Service bus") + err = a.servicebus.Stop() + if err != nil { + return err + } + + // Shutdown callback + if a.shutdownCallback != nil { + a.shutdownCallback() + } + + return nil +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/app/dev.go b/vendor/github.com/wailsapp/wails/v2/internal/app/dev.go new file mode 100644 index 0000000..c3f5b5c --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/app/dev.go @@ -0,0 +1,245 @@ +// +build dev + +package app + +import ( + "context" + "sync" + + "github.com/wailsapp/wails/v2/internal/bridge" + "github.com/wailsapp/wails/v2/internal/menumanager" + + "github.com/wailsapp/wails/v2/pkg/options" + + "github.com/wailsapp/wails/v2/internal/binding" + "github.com/wailsapp/wails/v2/internal/logger" + "github.com/wailsapp/wails/v2/internal/messagedispatcher" + "github.com/wailsapp/wails/v2/internal/runtime" + "github.com/wailsapp/wails/v2/internal/servicebus" + "github.com/wailsapp/wails/v2/internal/signal" + "github.com/wailsapp/wails/v2/internal/subsystem" +) + +// App defines a Wails application structure +type App struct { + appType string + + servicebus *servicebus.ServiceBus + logger *logger.Logger + signal *signal.Manager + options *options.App + + // Subsystems + log *subsystem.Log + runtime *subsystem.Runtime + event *subsystem.Event + //binding *subsystem.Binding + call *subsystem.Call + menu *subsystem.Menu + dispatcher *messagedispatcher.Dispatcher + + menuManager *menumanager.Manager + + // Indicates if the app is in debug mode + debug bool + + // This is our binding DB + bindings *binding.Bindings + + // Application Stores + loglevelStore *runtime.Store + appconfigStore *runtime.Store + + // Startup/Shutdown + startupCallback func(*runtime.Runtime) + shutdownCallback func() + + // Bridge + bridge *bridge.Bridge +} + +// Create App +func CreateApp(appoptions *options.App) (*App, error) { + + // Merge default options + options.MergeDefaults(appoptions) + + // Set up logger + myLogger := logger.New(appoptions.Logger) + + // Create the menu manager + menuManager := menumanager.NewManager() + + // Process the application menu + menuManager.SetApplicationMenu(options.GetApplicationMenu(appoptions)) + + // Process context menus + contextMenus := options.GetContextMenus(appoptions) + for _, contextMenu := range contextMenus { + menuManager.AddContextMenu(contextMenu) + } + + // Process tray menus + trayMenus := options.GetTrayMenus(appoptions) + for _, trayMenu := range trayMenus { + menuManager.AddTrayMenu(trayMenu) + } + + // Create binding exemptions - Ugly hack. There must be a better way + bindingExemptions := []interface{}{appoptions.Startup, appoptions.Shutdown} + + result := &App{ + appType: "dev", + bindings: binding.NewBindings(myLogger, appoptions.Bind, bindingExemptions), + logger: myLogger, + servicebus: servicebus.New(myLogger), + startupCallback: appoptions.Startup, + shutdownCallback: appoptions.Shutdown, + bridge: bridge.NewBridge(myLogger), + menuManager: menuManager, + } + + result.options = appoptions + + // Initialise the app + err := result.Init() + + return result, err + +} + +// Run the application +func (a *App) Run() error { + + var err error + + // Setup a context + var subsystemWaitGroup sync.WaitGroup + parentContext := context.WithValue(context.Background(), "waitgroup", &subsystemWaitGroup) + ctx, cancel := context.WithCancel(parentContext) + defer cancel() + + // Start the service bus + a.servicebus.Debug() + err = a.servicebus.Start() + if err != nil { + return err + } + + runtimesubsystem, err := subsystem.NewRuntime(ctx, a.servicebus, a.logger, a.startupCallback) + if err != nil { + return err + } + a.runtime = runtimesubsystem + err = a.runtime.Start() + if err != nil { + return err + } + + // Application Stores + a.loglevelStore = a.runtime.GoRuntime().Store.New("wails:loglevel", a.options.LogLevel) + a.appconfigStore = a.runtime.GoRuntime().Store.New("wails:appconfig", a.options) + + // Start the logging subsystem + log, err := subsystem.NewLog(a.servicebus, a.logger, a.loglevelStore) + if err != nil { + return err + } + a.log = log + err = a.log.Start() + if err != nil { + return err + } + + // create the dispatcher + dispatcher, err := messagedispatcher.New(a.servicebus, a.logger) + if err != nil { + return err + } + a.dispatcher = dispatcher + err = dispatcher.Start() + if err != nil { + return err + } + + // Start the eventing subsystem + eventsubsystem, err := subsystem.NewEvent(ctx, a.servicebus, a.logger) + if err != nil { + return err + } + a.event = eventsubsystem + err = a.event.Start() + if err != nil { + return err + } + + // Start the menu subsystem + menusubsystem, err := subsystem.NewMenu(ctx, a.servicebus, a.logger, a.menuManager) + if err != nil { + return err + } + a.menu = menusubsystem + err = a.menu.Start() + if err != nil { + return err + } + + // Start the call subsystem + callSubsystem, err := subsystem.NewCall(ctx, a.servicebus, a.logger, a.bindings.DB(), a.runtime.GoRuntime()) + if err != nil { + return err + } + a.call = callSubsystem + err = a.call.Start() + if err != nil { + return err + } + + // Dump bindings as a debug + bindingDump, err := a.bindings.ToJSON() + if err != nil { + return err + } + + // Generate backend.js + a.bindings.GenerateBackendJS() + + // Setup signal handler + signalsubsystem, err := signal.NewManager(ctx, cancel, a.servicebus, a.logger) + if err != nil { + return err + } + a.signal = signalsubsystem + a.signal.Start() + + err = a.bridge.Run(dispatcher, a.menuManager, bindingDump, a.debug) + a.logger.Trace("Bridge.Run() exited") + if err != nil { + return err + } + + // Close down all the subsystems + a.logger.Trace("Cancelling subsystems") + cancel() + subsystemWaitGroup.Wait() + + a.logger.Trace("Cancelling dispatcher") + dispatcher.Close() + + // Close log + a.logger.Trace("Stopping log") + log.Close() + + a.logger.Trace("Stopping Service bus") + err = a.servicebus.Stop() + if err != nil { + return err + } + + // Shutdown callback + if a.shutdownCallback != nil { + a.shutdownCallback() + } + return nil + +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/app/hybrid.go b/vendor/github.com/wailsapp/wails/v2/internal/app/hybrid.go new file mode 100644 index 0000000..8c95c28 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/app/hybrid.go @@ -0,0 +1,194 @@ +// +build !server,!desktop,hybrid + +package app + +import ( + "os" + "path/filepath" + + "github.com/leaanthony/clir" + "github.com/wailsapp/wails/v2/internal/binding" + "github.com/wailsapp/wails/v2/internal/ffenestri" + "github.com/wailsapp/wails/v2/internal/logger" + "github.com/wailsapp/wails/v2/internal/messagedispatcher" + "github.com/wailsapp/wails/v2/internal/servicebus" + "github.com/wailsapp/wails/v2/internal/subsystem" + "github.com/wailsapp/wails/v2/internal/webserver" +) + +// Config defines the Application's configuration +type Config struct { + Title string // Title is the value to be displayed in the title bar + Width int // Width is the desired window width + Height int // Height is the desired window height + DevTools bool // DevTools enables or disables the browser development tools + Resizable bool // Resizable when False prevents window resizing + ServerEnabled bool // ServerEnabled when True allows remote connections +} + +// App defines a Wails application structure +type App struct { + config Config + window *ffenestri.Application + webserver *webserver.WebServer + binding *subsystem.Binding + call *subsystem.Call + event *subsystem.Event + log *subsystem.Log + runtime *subsystem.Runtime + + bindings *binding.Bindings + logger *logger.Logger + dispatcher *messagedispatcher.Dispatcher + servicebus *servicebus.ServiceBus + + debug bool +} + +// Create App +func CreateApp(options *Options) *App { + + // Merge default options + options.mergeDefaults() + + // Set up logger + myLogger := logger.New(os.Stdout) + myLogger.SetLogLevel(logger.INFO) + + window := ffenestri.NewApplicationWithConfig(&ffenestri.Config{ + Title: options.Title, + Width: options.Width, + Height: options.Height, + MinWidth: options.MinWidth, + MinHeight: options.MinHeight, + MaxWidth: options.MaxWidth, + MaxHeight: options.MaxHeight, + StartHidden: options.StartHidden, + DevTools: options.DevTools, + + Resizable: !options.DisableResize, + Fullscreen: options.Fullscreen, + }, myLogger) + + app := &App{ + window: window, + webserver: webserver.NewWebServer(myLogger), + servicebus: servicebus.New(myLogger), + logger: myLogger, + bindings: binding.NewBindings(myLogger, options.Bind), + } + + // Initialise the app + app.Init() + + return app +} + +// Run the application +func (a *App) Run() error { + + // Default app options + var port = 8080 + var ip = "localhost" + var suppressLogging = false + + // Create CLI + cli := clir.NewCli(filepath.Base(os.Args[0]), "Desktop/Server Build", "") + + // Setup flags + cli.IntFlag("p", "Port to serve on", &port) + cli.StringFlag("i", "IP to serve on", &ip) + cli.BoolFlag("q", "Suppress logging", &suppressLogging) + + // Setup main action + cli.Action(func() error { + + // Set IP + Port + a.webserver.SetPort(port) + a.webserver.SetIP(ip) + a.webserver.SetBindings(a.bindings) + // Log information (if we aren't suppressing it) + if !suppressLogging { + cli.PrintBanner() + a.logger.Info("Running server at %s", a.webserver.URL()) + } + + a.servicebus.Start() + log, err := subsystem.NewLog(a.servicebus, a.logger) + if err != nil { + return err + } + a.log = log + a.log.Start() + dispatcher, err := messagedispatcher.New(a.servicebus, a.logger) + if err != nil { + return err + } + a.dispatcher = dispatcher + a.dispatcher.Start() + + // Start the runtime + runtime, err := subsystem.NewRuntime(a.servicebus, a.logger) + if err != nil { + return err + } + a.runtime = runtime + a.runtime.Start() + + // Start the binding subsystem + binding, err := subsystem.NewBinding(a.servicebus, a.logger, a.bindings, runtime.GoRuntime()) + if err != nil { + return err + } + a.binding = binding + a.binding.Start() + + // Start the eventing subsystem + event, err := subsystem.NewEvent(a.servicebus, a.logger) + if err != nil { + return err + } + a.event = event + a.event.Start() + + // Start the call subsystem + call, err := subsystem.NewCall(a.servicebus, a.logger, a.bindings.DB()) + if err != nil { + return err + } + a.call = call + a.call.Start() + + // Required so that the WailsInit functions are fired! + runtime.GoRuntime().Events.Emit("wails:loaded") + + // Set IP + Port + a.webserver.SetPort(port) + a.webserver.SetIP(ip) + + // Log information (if we aren't suppressing it) + if !suppressLogging { + cli.PrintBanner() + println("Running server at " + a.webserver.URL()) + } + + // Dump bindings as a debug + bindingDump, err := a.bindings.ToJSON() + if err != nil { + return err + } + + go func() { + if err := a.webserver.Start(dispatcher, event); err != nil { + a.logger.Error("Webserver failed to start %s", err) + } + }() + + result := a.window.Run(dispatcher, bindingDump) + a.servicebus.Stop() + + return result + }) + + return cli.Run() +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/app/preflight_default.go b/vendor/github.com/wailsapp/wails/v2/internal/app/preflight_default.go new file mode 100644 index 0000000..5508a77 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/app/preflight_default.go @@ -0,0 +1,9 @@ +//+build !windows + +package app + +import "github.com/wailsapp/wails/v2/pkg/options" + +func (a *App) PreflightChecks(options *options.App) error { + return nil +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/app/preflight_windows.go b/vendor/github.com/wailsapp/wails/v2/internal/app/preflight_windows.go new file mode 100644 index 0000000..29bbb7a --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/app/preflight_windows.go @@ -0,0 +1,26 @@ +//+build windows + +package app + +import ( + "github.com/wailsapp/wails/v2/internal/ffenestri/windows/wv2runtime" + "github.com/wailsapp/wails/v2/pkg/options" +) + +func (a *App) PreflightChecks(options *options.App) error { + + _ = options + + // Process the webview2 runtime situation. We can pass a strategy in via the `webview2` flag for `wails build`. + // This will determine how wv2runtime.Process will handle a lack of valid runtime. + installedVersion, err := wv2runtime.Process() + if installedVersion != nil { + a.logger.Debug("WebView2 Runtime installed: Name: '%s' Version:'%s' Location:'%s'. Minimum version required: %s.", + installedVersion.Name, installedVersion.Version, installedVersion.Location, wv2runtime.MinimumRuntimeVersion) + } + if err != nil { + return err + } + + return nil +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/app/production.go b/vendor/github.com/wailsapp/wails/v2/internal/app/production.go new file mode 100644 index 0000000..ce083cb --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/app/production.go @@ -0,0 +1,11 @@ +// +build !debug + +package app + +import "github.com/wailsapp/wails/v2/pkg/logger" + +// Init initialises the application for a production environment +func (a *App) Init() error { + a.logger.SetLogLevel(logger.ERROR) + return nil +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/app/server.go b/vendor/github.com/wailsapp/wails/v2/internal/app/server.go new file mode 100644 index 0000000..620139c --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/app/server.go @@ -0,0 +1,173 @@ +// +build server,!desktop + +package app + +import ( + "os" + "path/filepath" + + "github.com/wailsapp/wails/v2/pkg/options" + + "github.com/leaanthony/clir" + "github.com/wailsapp/wails/v2/internal/binding" + "github.com/wailsapp/wails/v2/internal/logger" + "github.com/wailsapp/wails/v2/internal/messagedispatcher" + "github.com/wailsapp/wails/v2/internal/runtime" + "github.com/wailsapp/wails/v2/internal/servicebus" + "github.com/wailsapp/wails/v2/internal/subsystem" + "github.com/wailsapp/wails/v2/internal/webserver" +) + +// App defines a Wails application structure +type App struct { + appType string + + binding *subsystem.Binding + call *subsystem.Call + event *subsystem.Event + log *subsystem.Log + runtime *subsystem.Runtime + + options *options.App + + bindings *binding.Bindings + logger *logger.Logger + dispatcher *messagedispatcher.Dispatcher + servicebus *servicebus.ServiceBus + webserver *webserver.WebServer + + debug bool + + // Application Stores + loglevelStore *runtime.Store + appconfigStore *runtime.Store + + // Startup/Shutdown + startupCallback func(*runtime.Runtime) + shutdownCallback func() +} + +// Create App +func CreateApp(appoptions *options.App) (*App, error) { + + // Merge default options + options.MergeDefaults(appoptions) + + // Set up logger + myLogger := logger.New(appoptions.Logger) + myLogger.SetLogLevel(appoptions.LogLevel) + + result := &App{ + appType: "server", + bindings: binding.NewBindings(myLogger, options.Bind), + logger: myLogger, + servicebus: servicebus.New(myLogger), + webserver: webserver.NewWebServer(myLogger), + startupCallback: appoptions.Startup, + shutdownCallback: appoptions.Shutdown, + } + + // Initialise app + result.Init() + + return result, nil +} + +// Run the application +func (a *App) Run() error { + + // Default app options + var port = 8080 + var ip = "localhost" + var SuppressLogging = false + var debugMode = false + + // Create CLI + cli := clir.NewCli(filepath.Base(os.Args[0]), "Server Build", "") + + // Setup flags + cli.IntFlag("p", "Port to serve on", &port) + cli.StringFlag("i", "IP to serve on", &ip) + cli.BoolFlag("d", "Debug mode", &debugMode) + cli.BoolFlag("q", "Suppress logging", &SuppressLogging) + + // Setup main action + cli.Action(func() error { + + // Set IP + Port + a.webserver.SetPort(port) + a.webserver.SetIP(ip) + a.webserver.SetBindings(a.bindings) + // Log information (if we aren't Suppressing it) + if !SuppressLogging { + cli.PrintBanner() + a.logger.Info("Running server at %s", a.webserver.URL()) + } + + if debugMode { + a.servicebus.Debug() + } + + // Start the runtime + runtime, err := subsystem.NewRuntime(a.servicebus, a.logger, a.startupCallback, a.shutdownCallback) + if err != nil { + return err + } + a.runtime = runtime + a.runtime.Start() + + // Application Stores + a.loglevelStore = a.runtime.GoRuntime().Store.New("wails:loglevel", a.options.LogLevel) + a.appconfigStore = a.runtime.GoRuntime().Store.New("wails:appconfig", a.options) + + a.servicebus.Start() + log, err := subsystem.NewLog(a.servicebus, a.logger, a.loglevelStore) + if err != nil { + return err + } + a.log = log + a.log.Start() + dispatcher, err := messagedispatcher.New(a.servicebus, a.logger) + if err != nil { + return err + } + a.dispatcher = dispatcher + a.dispatcher.Start() + + // Start the binding subsystem + binding, err := subsystem.NewBinding(a.servicebus, a.logger, a.bindings, runtime.GoRuntime()) + if err != nil { + return err + } + a.binding = binding + a.binding.Start() + + // Start the eventing subsystem + event, err := subsystem.NewEvent(a.servicebus, a.logger) + if err != nil { + return err + } + a.event = event + a.event.Start() + + // Start the call subsystem + call, err := subsystem.NewCall(a.servicebus, a.logger, a.bindings.DB(), a.runtime.GoRuntime()) + if err != nil { + return err + } + a.call = call + a.call.Start() + + // Required so that the WailsInit functions are fired! + runtime.GoRuntime().Events.Emit("wails:loaded") + + if err := a.webserver.Start(dispatcher, event); err != nil { + a.logger.Error("Webserver failed to start %s", err) + return err + } + + return nil + }) + + return cli.Run() +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/assetdb/assetdb.go b/vendor/github.com/wailsapp/wails/v2/internal/assetdb/assetdb.go new file mode 100644 index 0000000..5489295 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/assetdb/assetdb.go @@ -0,0 +1,112 @@ +package assetdb + +import ( + "fmt" + "strings" + "unsafe" +) + +// AssetDB is a database for assets encoded as byte slices +type AssetDB struct { + db map[string][]byte +} + +// NewAssetDB creates a new AssetDB and initialises a blank db +func NewAssetDB() *AssetDB { + return &AssetDB{ + db: make(map[string][]byte), + } +} + +// AddAsset saves the given byte slice under the given name +func (a *AssetDB) AddAsset(name string, data []byte) { + a.db[name] = data +} + +// Remove removes the named asset +func (a *AssetDB) Remove(name string) { + delete(a.db, name) +} + +// Asset retrieves the byte slice for the given name +func (a *AssetDB) Read(name string) ([]byte, error) { + result := a.db[name] + if result == nil { + return nil, fmt.Errorf("asset '%s' not found", name) + } + return result, nil +} + +// AssetAsString returns the asset as a string. +// It also returns a boolean indicating whether the asset existed or not. +func (a *AssetDB) String(name string) (string, error) { + asset, err := a.Read(name) + if err != nil { + return "", err + } + return *(*string)(unsafe.Pointer(&asset)), nil +} + +func (a *AssetDB) Dump() { + fmt.Printf("Assets:\n") + for k, _ := range a.db { + fmt.Println(k) + } +} + +// Serialize converts the entire database to a file that when compiled will +// reconstruct the AssetDB during init() +// name: name of the asset.AssetDB instance +// pkg: package name placed at the top of the file +func (a *AssetDB) Serialize(name, pkg string) string { + var cdata strings.Builder + // Set buffer size to 4k + cdata.Grow(4096) + + // Write header + header := `// DO NOT EDIT - Generated automatically +package %s + +import "github.com/wailsapp/wails/v2/internal/assetdb" + +var ( + %s *assetdb.AssetDB = assetdb.NewAssetDB() +) + +// AssetsDB is a clean interface to the assetdb.AssetDB struct +type AssetsDB interface { + Read(string) ([]byte, error) + String(string) (string, error) +} + +// Assets returns the asset database +func Assets() AssetsDB { + return %s +} + +func init() { +` + cdata.WriteString(fmt.Sprintf(header, pkg, name, name)) + + for aname, bytes := range a.db { + cdata.WriteString(fmt.Sprintf("\t%s.AddAsset(\"%s\", []byte{", + name, + aname)) + + l := len(bytes) + if l == 0 { + cdata.WriteString("0x00})\n") + continue + } + + // Convert each byte to hex + for _, b := range bytes[:l-1] { + cdata.WriteString(fmt.Sprintf("0x%x, ", b)) + } + cdata.WriteString(fmt.Sprintf("0x%x})\n", bytes[l-1])) + } + + cdata.WriteString(`}`) + + return cdata.String() +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/assetdb/filesystem.go b/vendor/github.com/wailsapp/wails/v2/internal/assetdb/filesystem.go new file mode 100644 index 0000000..48acb71 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/assetdb/filesystem.go @@ -0,0 +1,176 @@ +// +build !desktop +package assetdb + +import ( + "errors" + "io" + "net/http" + "os" + "path" + "sort" + "strings" + "time" +) + +var errWhence = errors.New("Seek: invalid whence") +var errOffset = errors.New("Seek: invalid offset") + +// Open implements the http.FileSystem interface for the AssetDB +func (a *AssetDB) Open(name string) (http.File, error) { + if name == "/" || name == "" { + return &Entry{name: "/", dir: true, db: a}, nil + } + + if data, ok := a.db[name]; ok { + return &Entry{name: name, data: data, size: len(data)}, nil + } else { + for n, _ := range a.db { + if strings.HasPrefix(n, name+"/") { + return &Entry{name: name, db: a, dir: true}, nil + } + } + } + return &Entry{}, os.ErrNotExist +} + +// readdir returns the directory entries for the requested directory +func (a *AssetDB) readdir(name string) ([]os.FileInfo, error) { + dir := name + var ents []string + + fim := make(map[string]os.FileInfo) + for fn, data := range a.db { + if strings.HasPrefix(fn, dir) { + pieces := strings.Split(fn[len(dir)+1:], "/") + if len(pieces) == 1 { + fim[pieces[0]] = FI{name: pieces[0], dir: false, size: len(data)} + ents = append(ents, pieces[0]) + } else { + fim[pieces[0]] = FI{name: pieces[0], dir: true, size: -1} + ents = append(ents, pieces[0]) + } + } + } + + if len(ents) == 0 { + return nil, os.ErrNotExist + } + + sort.Strings(ents) + var list []os.FileInfo + for _, dir := range ents { + list = append(list, fim[dir]) + } + return list, nil +} + +// Entry implements the http.File interface to allow for +// use in the http.FileSystem implementation of AssetDB +type Entry struct { + name string + data []byte + dir bool + size int + db *AssetDB + off int +} + +// Close is a noop +func (e Entry) Close() error { + return nil +} + +// Read fills the slice provided returning how many bytes were written +// and any errors encountered +func (e *Entry) Read(p []byte) (n int, err error) { + if e.off >= e.size { + return 0, io.EOF + } + numout := len(p) + if numout > e.size { + numout = e.size + } + for i := 0; i < numout; i++ { + p[i] = e.data[e.off+i] + } + e.off += numout + n = int(numout) + err = nil + return +} + +// Seek seeks to the specified offset from the location specified by whence +func (e *Entry) Seek(offset int64, whence int) (int64, error) { + switch whence { + default: + return 0, errWhence + case io.SeekStart: + offset += 0 + case io.SeekCurrent: + offset += int64(e.off) + case io.SeekEnd: + offset += int64(e.size) + } + + if offset < 0 { + return 0, errOffset + } + e.off = int(offset) + return offset, nil +} + +// Readdir returns the directory entries inside this entry if it is a directory +func (e Entry) Readdir(count int) ([]os.FileInfo, error) { + ents := []os.FileInfo{} + if !e.dir { + return ents, errors.New("Not a directory") + } + return e.db.readdir(e.name) +} + +// Stat returns information about this directory entry +func (e Entry) Stat() (os.FileInfo, error) { + return FI{e.name, e.size, e.dir}, nil +} + +// FI is the AssetDB implementation of os.FileInfo. +type FI struct { + name string + size int + dir bool +} + +// IsDir returns true if this is a directory +func (fi FI) IsDir() bool { + return fi.dir +} + +// ModTime always returns now +func (fi FI) ModTime() time.Time { + return time.Time{} +} + +// Mode returns the file as readonly and directories +// as world writeable and executable +func (fi FI) Mode() os.FileMode { + if fi.IsDir() { + return 0755 | os.ModeDir + } + return 0444 +} + +// Name returns the name of this object without +// any leading slashes +func (fi FI) Name() string { + return path.Base(fi.name) +} + +// Size returns the size of this item +func (fi FI) Size() int64 { + return int64(fi.size) +} + +// Sys returns nil +func (fi FI) Sys() interface{} { + return nil +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/binding/assets/package.json b/vendor/github.com/wailsapp/wails/v2/internal/binding/assets/package.json new file mode 100644 index 0000000..9094981 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/binding/assets/package.json @@ -0,0 +1,11 @@ +{ + "name": "backend", + "version": "1.0.0", + "description": "Package to wrap backend method calls", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC" +} \ No newline at end of file diff --git a/vendor/github.com/wailsapp/wails/v2/internal/binding/binding.go b/vendor/github.com/wailsapp/wails/v2/internal/binding/binding.go new file mode 100644 index 0000000..2713abc --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/binding/binding.go @@ -0,0 +1,74 @@ +package binding + +import ( + "fmt" + "reflect" + "runtime" + "strings" + + "github.com/leaanthony/slicer" + + "github.com/wailsapp/wails/v2/internal/logger" +) + +type Bindings struct { + db *DB + logger logger.CustomLogger + exemptions slicer.StringSlicer +} + +// NewBindings returns a new Bindings object +func NewBindings(logger *logger.Logger, structPointersToBind []interface{}, exemptions []interface{}) *Bindings { + result := &Bindings{ + db: newDB(), + logger: logger.CustomLogger("Bindings"), + } + + for _, exemption := range exemptions { + if exemptions == nil { + continue + } + name := runtime.FuncForPC(reflect.ValueOf(exemption).Pointer()).Name() + // Yuk yuk yuk! Is there a better way? + name = strings.TrimSuffix(name, "-fm") + result.exemptions.Add(name) + } + + // Add the structs to bind + for _, ptr := range structPointersToBind { + err := result.Add(ptr) + if err != nil { + logger.Fatal("Error during binding: " + err.Error()) + } + } + + return result +} + +// Add the given struct methods to the Bindings +func (b *Bindings) Add(structPtr interface{}) error { + + methods, err := b.getMethods(structPtr) + if err != nil { + return fmt.Errorf("cannot bind value to app: %s", err.Error()) + } + + for _, method := range methods { + splitName := strings.Split(method.Name, ".") + packageName := splitName[0] + structName := splitName[1] + methodName := splitName[2] + + // Add it as a regular method + b.db.AddMethod(packageName, structName, methodName, method) + } + return nil +} + +func (b *Bindings) DB() *DB { + return b.db +} + +func (b *Bindings) ToJSON() (string, error) { + return b.db.ToJSON() +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/binding/boundMethod.go b/vendor/github.com/wailsapp/wails/v2/internal/binding/boundMethod.go new file mode 100644 index 0000000..f6ffdb6 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/binding/boundMethod.go @@ -0,0 +1,100 @@ +package binding + +import ( + "encoding/json" + "fmt" + "reflect" +) + +// BoundMethod defines all the data related to a Go method that is +// bound to the Wails application +type BoundMethod struct { + Name string `json:"name"` + Inputs []*Parameter `json:"inputs,omitempty"` + Outputs []*Parameter `json:"outputs,omitempty"` + Comments string `json:"comments,omitempty"` + Method reflect.Value `json:"-"` +} + +// InputCount returns the number of inputs this bound method has +func (b *BoundMethod) InputCount() int { + return len(b.Inputs) +} + +// OutputCount returns the number of outputs this bound method has +func (b *BoundMethod) OutputCount() int { + return len(b.Outputs) +} + +// ParseArgs method converts the input json into the types expected by the method +func (b *BoundMethod) ParseArgs(args []json.RawMessage) ([]interface{}, error) { + + result := make([]interface{}, b.InputCount()) + if len(args) != b.InputCount() { + return nil, fmt.Errorf("received %d arguments to method '%s', expected %d", len(args), b.Name, b.InputCount()) + } + for index, arg := range args { + typ := b.Inputs[index].reflectType + inputValue := reflect.New(typ).Interface() + err := json.Unmarshal(arg, inputValue) + if err != nil { + return nil, err + } + if inputValue == nil { + result[index] = reflect.Zero(typ).Interface() + } else { + result[index] = reflect.ValueOf(inputValue).Elem().Interface() + } + } + return result, nil +} + +// Call will attempt to call this bound method with the given args +func (b *BoundMethod) Call(args []interface{}) (interface{}, error) { + // Check inputs + expectedInputLength := len(b.Inputs) + actualInputLength := len(args) + if expectedInputLength != actualInputLength { + return nil, fmt.Errorf("%s takes %d inputs. Received %d", b.Name, expectedInputLength, actualInputLength) + } + + /** Convert inputs to reflect values **/ + + // Create slice for the input arguments to the method call + callArgs := make([]reflect.Value, expectedInputLength) + + // Iterate over given arguments + for index, arg := range args { + // Save the converted argument + callArgs[index] = reflect.ValueOf(arg) + } + + // Do the call + callResults := b.Method.Call(callArgs) + + //** Check results **// + var returnValue interface{} + var err error + + switch b.OutputCount() { + case 1: + // Loop over results and determine if the result + // is an error or not + for _, result := range callResults { + interfac := result.Interface() + temp, ok := interfac.(error) + if ok { + err = temp + } else { + returnValue = interfac + } + } + case 2: + returnValue = callResults[0].Interface() + if temp, ok := callResults[1].Interface().(error); ok { + err = temp + } + } + + return returnValue, err +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/binding/db.go b/vendor/github.com/wailsapp/wails/v2/internal/binding/db.go new file mode 100644 index 0000000..37c3697 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/binding/db.go @@ -0,0 +1,104 @@ +package binding + +import ( + "encoding/json" + "sync" + "unsafe" +) + +// DB is our database of method bindings +type DB struct { + // map[packagename] -> map[structname] -> map[methodname]*method + store map[string]map[string]map[string]*BoundMethod + + // This uses fully qualified method names as a shortcut for store traversal. + // It used for performance gains at runtime + methodMap map[string]*BoundMethod + + // Lock to ensure sync access to the data + lock sync.RWMutex +} + +func newDB() *DB { + return &DB{ + store: make(map[string]map[string]map[string]*BoundMethod), + methodMap: make(map[string]*BoundMethod), + } +} + +// GetMethodFromStore returns the method for the given package/struct/method names +// nil is returned if any one of those does not exist +func (d *DB) GetMethodFromStore(packageName string, structName string, methodName string) *BoundMethod { + + // Lock the db whilst processing and unlock on return + d.lock.RLock() + defer d.lock.RUnlock() + + structMap, exists := d.store[packageName] + if !exists { + return nil + } + methodMap, exists := structMap[structName] + if !exists { + return nil + } + return methodMap[methodName] +} + +// GetMethod returns the method for the given qualified method name +// qualifiedMethodName is "packagename.structname.methodname" +func (d *DB) GetMethod(qualifiedMethodName string) *BoundMethod { + + // Lock the db whilst processing and unlock on return + d.lock.RLock() + defer d.lock.RUnlock() + + return d.methodMap[qualifiedMethodName] +} + +// AddMethod adds the given method definition to the db using the given qualified path: packageName.structName.methodName +func (d *DB) AddMethod(packageName string, structName string, methodName string, methodDefinition *BoundMethod) { + + // TODO: Validate inputs? + + // Lock the db whilst processing and unlock on return + d.lock.Lock() + defer d.lock.Unlock() + + // Get the map associated with the package name + structMap, exists := d.store[packageName] + if !exists { + // Create a new map for this packagename + d.store[packageName] = make(map[string]map[string]*BoundMethod) + structMap = d.store[packageName] + } + + // Get the map associated with the struct name + methodMap, exists := structMap[structName] + if !exists { + // Create a new map for this packagename + structMap[structName] = make(map[string]*BoundMethod) + methodMap = structMap[structName] + } + + // Store the method definition + methodMap[methodName] = methodDefinition + + // Store in the methodMap + key := packageName + "." + structName + "." + methodName + d.methodMap[key] = methodDefinition + +} + +// ToJSON converts the method map to JSON +func (d *DB) ToJSON() (string, error) { + + // Lock the db whilst processing and unlock on return + d.lock.RLock() + defer d.lock.RUnlock() + + bytes, err := json.Marshal(&d.store) + + // Return zero copy string as this string will be read only + return *(*string)(unsafe.Pointer(&bytes)), err +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/binding/generate.go b/vendor/github.com/wailsapp/wails/v2/internal/binding/generate.go new file mode 100644 index 0000000..b47f501 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/binding/generate.go @@ -0,0 +1,155 @@ +package binding + +import ( + "bytes" + _ "embed" + "fmt" + "log" + "os" + "path/filepath" + "strings" + + "github.com/wailsapp/wails/v2/internal/fs" + + "github.com/leaanthony/slicer" +) + +//go:embed assets/package.json +var packageJSON []byte + +func (b *Bindings) GenerateBackendJS() { + + store := b.db.store + var output bytes.Buffer + + output.WriteString(`// @ts-check +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +const backend = {`) + output.WriteString("\n") + + var sortedPackageNames slicer.StringSlicer + for packageName := range store { + sortedPackageNames.Add(packageName) + } + sortedPackageNames.Sort() + sortedPackageNames.Each(func(packageName string) { + packages := store[packageName] + output.WriteString(fmt.Sprintf(" \"%s\": {", packageName)) + output.WriteString("\n") + var sortedStructNames slicer.StringSlicer + for structName := range packages { + sortedStructNames.Add(structName) + } + sortedStructNames.Sort() + + sortedStructNames.Each(func(structName string) { + structs := packages[structName] + output.WriteString(fmt.Sprintf(" \"%s\": {", structName)) + output.WriteString("\n") + + var sortedMethodNames slicer.StringSlicer + for methodName := range structs { + sortedMethodNames.Add(methodName) + } + sortedMethodNames.Sort() + + sortedMethodNames.Each(func(methodName string) { + methodDetails := structs[methodName] + output.WriteString(" /**\n") + output.WriteString(" * " + methodName + "\n") + var args slicer.StringSlicer + for count, input := range methodDetails.Inputs { + arg := fmt.Sprintf("arg%d", count+1) + args.Add(arg) + output.WriteString(fmt.Sprintf(" * @param {%s} %s - Go Type: %s\n", goTypeToJSDocType(input.TypeName), arg, input.TypeName)) + } + returnType := "Promise" + returnTypeDetails := "" + if methodDetails.OutputCount() > 0 { + firstType := goTypeToJSDocType(methodDetails.Outputs[0].TypeName) + returnType += "<" + firstType + if methodDetails.OutputCount() == 2 { + secondType := goTypeToJSDocType(methodDetails.Outputs[1].TypeName) + returnType += "|" + secondType + } + returnType += ">" + returnTypeDetails = " - Go Type: " + methodDetails.Outputs[0].TypeName + } else { + returnType = "Promise" + } + output.WriteString(" * @returns {" + returnType + "} " + returnTypeDetails + "\n") + output.WriteString(" */\n") + argsString := args.Join(", ") + output.WriteString(fmt.Sprintf(" \"%s\": (%s) => {", methodName, argsString)) + output.WriteString("\n") + output.WriteString(fmt.Sprintf(" return window.backend.%s.%s.%s(%s);", packageName, structName, methodName, argsString)) + output.WriteString("\n") + output.WriteString(fmt.Sprintf(" },")) + output.WriteString("\n") + + }) + + output.WriteString(fmt.Sprintf(" }")) + output.WriteString("\n") + }) + + output.WriteString(fmt.Sprintf(" }\n")) + output.WriteString("\n") + }) + + output.WriteString(`}; +export default backend;`) + output.WriteString("\n") + + // TODO: Make this configurable in wails.json + dirname, err := fs.RelativeToCwd("frontend/src/backend") + if err != nil { + log.Fatal(err) + } + + if !fs.DirExists(dirname) { + err := fs.MkDirs(dirname) + if err != nil { + log.Fatal(err) + } + } + + packageJsonFile := filepath.Join(dirname, "package.json") + if !fs.FileExists(packageJsonFile) { + err := os.WriteFile(packageJsonFile, packageJSON, 0755) + if err != nil { + log.Fatal(err) + } + } + + filename := filepath.Join(dirname, "index.js") + err = os.WriteFile(filename, output.Bytes(), 0755) + if err != nil { + log.Fatal(err) + } +} + +func goTypeToJSDocType(input string) string { + switch true { + case input == "string": + return "string" + case input == "error": + return "Error" + case + strings.HasPrefix(input, "int"), + strings.HasPrefix(input, "uint"), + strings.HasPrefix(input, "float"): + return "number" + case input == "bool": + return "boolean" + case input == "[]byte": + return "string" + case strings.HasPrefix(input, "[]"): + arrayType := goTypeToJSDocType(input[2:]) + return "Array.<" + arrayType + ">" + default: + return "any" + } +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/binding/parameter.go b/vendor/github.com/wailsapp/wails/v2/internal/binding/parameter.go new file mode 100644 index 0000000..ef10a24 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/binding/parameter.go @@ -0,0 +1,28 @@ +package binding + +import "reflect" + +// Parameter defines a Go method parameter +type Parameter struct { + Name string `json:"name,omitempty"` + TypeName string `json:"type"` + reflectType reflect.Type +} + +func newParameter(Name string, Type reflect.Type) *Parameter { + return &Parameter{ + Name: Name, + TypeName: Type.String(), + reflectType: Type, + } +} + +// IsType returns true if the given +func (p *Parameter) IsType(typename string) bool { + return p.TypeName == typename +} + +// IsError returns true if the parameter type is an error +func (p *Parameter) IsError() bool { + return p.IsType("error") +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/binding/reflect.go b/vendor/github.com/wailsapp/wails/v2/internal/binding/reflect.go new file mode 100644 index 0000000..94b694a --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/binding/reflect.go @@ -0,0 +1,102 @@ +package binding + +import ( + "fmt" + "reflect" + "runtime" +) + +// isStructPtr returns true if the value given is a +// pointer to a struct +func isStructPtr(value interface{}) bool { + return reflect.ValueOf(value).Kind() == reflect.Ptr && + reflect.ValueOf(value).Elem().Kind() == reflect.Struct +} + +// isFunction returns true if the given value is a function +func isFunction(value interface{}) bool { + return reflect.ValueOf(value).Kind() == reflect.Func +} + +// isStructPtr returns true if the value given is a struct +func isStruct(value interface{}) bool { + return reflect.ValueOf(value).Kind() == reflect.Struct +} + +func (b *Bindings) getMethods(value interface{}) ([]*BoundMethod, error) { + + // Create result placeholder + var result []*BoundMethod + + // Check type + if !isStructPtr(value) { + + if isStruct(value) { + name := reflect.ValueOf(value).Type().Name() + return nil, fmt.Errorf("%s is a struct, not a pointer to a struct", name) + } + + if isFunction(value) { + name := runtime.FuncForPC(reflect.ValueOf(value).Pointer()).Name() + return nil, fmt.Errorf("%s is a function, not a pointer to a struct. Wails v2 has deprecated the binding of functions. Please wrap your functions up in a struct and bind a pointer to that struct.", name) + } + + return nil, fmt.Errorf("not a pointer to a struct.") + } + + // Process Struct + structType := reflect.TypeOf(value) + structValue := reflect.ValueOf(value) + baseName := structType.String()[1:] + + // Process Methods + for i := 0; i < structType.NumMethod(); i++ { + methodDef := structType.Method(i) + methodName := methodDef.Name + fullMethodName := baseName + "." + methodName + method := structValue.MethodByName(methodName) + + methodReflectName := runtime.FuncForPC(methodDef.Func.Pointer()).Name() + if b.exemptions.Contains(methodReflectName) { + continue + } + + // Create new method + boundMethod := &BoundMethod{ + Name: fullMethodName, + Inputs: nil, + Outputs: nil, + Comments: "", + Method: method, + } + + // Iterate inputs + methodType := method.Type() + inputParamCount := methodType.NumIn() + var inputs []*Parameter + for inputIndex := 0; inputIndex < inputParamCount; inputIndex++ { + input := methodType.In(inputIndex) + thisParam := newParameter("", input) + inputs = append(inputs, thisParam) + } + + boundMethod.Inputs = inputs + + // Iterate outputs + // TODO: Determine what to do about limiting return types + // especially around errors. + outputParamCount := methodType.NumOut() + var outputs []*Parameter + for outputIndex := 0; outputIndex < outputParamCount; outputIndex++ { + output := methodType.Out(outputIndex) + thisParam := newParameter("", output) + outputs = append(outputs, thisParam) + } + boundMethod.Outputs = outputs + + // Save method in result + result = append(result, boundMethod) + + } + return result, nil +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/bridge/bridge.go b/vendor/github.com/wailsapp/wails/v2/internal/bridge/bridge.go new file mode 100644 index 0000000..1ea509d --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/bridge/bridge.go @@ -0,0 +1,113 @@ +package bridge + +import ( + "context" + "log" + "net/http" + "sync" + + "github.com/wailsapp/wails/v2/internal/menumanager" + + "github.com/wailsapp/wails/v2/internal/messagedispatcher" + + "github.com/gorilla/websocket" + "github.com/wailsapp/wails/v2/internal/logger" +) + +type Bridge struct { + upgrader websocket.Upgrader + server *http.Server + myLogger *logger.Logger + + bindings string + dispatcher *messagedispatcher.Dispatcher + + mu sync.Mutex + sessions map[string]*session + + ctx context.Context + cancel context.CancelFunc + + // Dialog client + dialog *messagedispatcher.DispatchClient + + // Menus + menumanager *menumanager.Manager +} + +func NewBridge(myLogger *logger.Logger) *Bridge { + result := &Bridge{ + myLogger: myLogger, + upgrader: websocket.Upgrader{CheckOrigin: func(r *http.Request) bool { return true }}, + sessions: make(map[string]*session), + } + + myLogger.SetLogLevel(1) + + ctx, cancel := context.WithCancel(context.Background()) + result.ctx = ctx + result.cancel = cancel + result.server = &http.Server{Addr: ":34115"} + http.HandleFunc("/bridge", result.wsBridgeHandler) + return result +} + +func (b *Bridge) Run(dispatcher *messagedispatcher.Dispatcher, menumanager *menumanager.Manager, bindings string, debug bool) error { + + // Ensure we cancel the context when we shutdown + defer b.cancel() + + b.bindings = bindings + b.dispatcher = dispatcher + b.menumanager = menumanager + + // Setup dialog handler + dialogClient := NewDialogClient(b.myLogger) + b.dialog = dispatcher.RegisterClient(dialogClient) + dialogClient.dispatcher = b.dialog + + b.myLogger.Info("Bridge mode started.") + + err := b.server.ListenAndServe() + if err != nil && err != http.ErrServerClosed { + return err + } + + return nil +} + +func (b *Bridge) wsBridgeHandler(w http.ResponseWriter, r *http.Request) { + c, err := b.upgrader.Upgrade(w, r, nil) + if err != nil { + log.Print("upgrade:", err) + return + } + + if err != nil { + http.Error(w, "Could not open websocket connection", http.StatusBadRequest) + } + b.myLogger.Info("Connection from frontend accepted [%s].", c.RemoteAddr().String()) + b.startSession(c) + +} + +func (b *Bridge) startSession(conn *websocket.Conn) { + + // Create a new session for this connection + s := newSession(conn, b.menumanager, b.bindings, b.dispatcher, b.myLogger, b.ctx) + + // Setup the close handler + conn.SetCloseHandler(func(int, string) error { + b.myLogger.Info("Connection dropped [%s].", s.Identifier()) + b.dispatcher.RemoveClient(s.client) + b.mu.Lock() + delete(b.sessions, s.Identifier()) + b.mu.Unlock() + return nil + }) + + b.mu.Lock() + go s.start(len(b.sessions) == 0) + b.sessions[s.Identifier()] = s + b.mu.Unlock() +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/bridge/client.go b/vendor/github.com/wailsapp/wails/v2/internal/bridge/client.go new file mode 100644 index 0000000..13f257e --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/bridge/client.go @@ -0,0 +1,141 @@ +package bridge + +import ( + "github.com/wailsapp/wails/v2/pkg/options/dialog" +) + +type BridgeClient struct { + session *session + + // Tray menu cache to send to reconnecting clients + messageCache chan string +} + +func (b BridgeClient) DeleteTrayMenuByID(id string) { + b.session.sendMessage("TD" + id) +} + +func NewBridgeClient() *BridgeClient { + return &BridgeClient{ + messageCache: make(chan string, 100), + } +} + +func (b BridgeClient) Quit() { + b.session.log.Info("Quit unsupported in Bridge mode") +} + +func (b BridgeClient) NotifyEvent(message string) { + b.session.sendMessage("n" + message) + b.session.log.Info("NotifyEvent: %s", message) +} + +func (b BridgeClient) CallResult(message string) { + b.session.sendMessage("c" + message) +} + +func (b BridgeClient) OpenFileDialog(dialogOptions *dialog.OpenDialog, callbackID string) { + // Handled by dialog_client +} + +func (b BridgeClient) OpenMultipleFilesDialog(dialogOptions *dialog.OpenDialog, callbackID string) { + // Handled by dialog_client +} + +func (b BridgeClient) OpenDirectoryDialog(dialogOptions *dialog.OpenDialog, callbackID string) { + // Handled by dialog_client +} + +func (b BridgeClient) SaveDialog(dialogOptions *dialog.SaveDialog, callbackID string) { + // Handled by dialog_client +} + +func (b BridgeClient) MessageDialog(dialogOptions *dialog.MessageDialog, callbackID string) { + // Handled by dialog_client +} + +func (b BridgeClient) WindowSetTitle(title string) { + b.session.log.Info("WindowSetTitle unsupported in Bridge mode") +} + +func (b BridgeClient) WindowShow() { + b.session.log.Info("WindowShow unsupported in Bridge mode") +} + +func (b BridgeClient) WindowHide() { + b.session.log.Info("WindowHide unsupported in Bridge mode") +} + +func (b BridgeClient) WindowCenter() { + b.session.log.Info("WindowCenter unsupported in Bridge mode") +} + +func (b BridgeClient) WindowMaximise() { + b.session.log.Info("WindowMaximise unsupported in Bridge mode") +} + +func (b BridgeClient) WindowUnmaximise() { + b.session.log.Info("WindowUnmaximise unsupported in Bridge mode") +} + +func (b BridgeClient) WindowMinimise() { + b.session.log.Info("WindowMinimise unsupported in Bridge mode") +} + +func (b BridgeClient) WindowUnminimise() { + b.session.log.Info("WindowUnminimise unsupported in Bridge mode") +} + +func (b BridgeClient) WindowPosition(x int, y int) { + b.session.log.Info("WindowPosition unsupported in Bridge mode") +} + +func (b BridgeClient) WindowSize(width int, height int) { + b.session.log.Info("WindowSize unsupported in Bridge mode") +} + +func (b BridgeClient) WindowSetMinSize(width int, height int) { + b.session.log.Info("WindowSetMinSize unsupported in Bridge mode") +} + +func (b BridgeClient) WindowSetMaxSize(width int, height int) { + b.session.log.Info("WindowSetMaxSize unsupported in Bridge mode") +} + +func (b BridgeClient) WindowFullscreen() { + b.session.log.Info("WindowFullscreen unsupported in Bridge mode") +} + +func (b BridgeClient) WindowUnFullscreen() { + b.session.log.Info("WindowUnFullscreen unsupported in Bridge mode") +} + +func (b BridgeClient) WindowSetColour(colour int) { + b.session.log.Info("WindowSetColour unsupported in Bridge mode") +} + +func (b BridgeClient) DarkModeEnabled(callbackID string) { + b.session.log.Info("DarkModeEnabled unsupported in Bridge mode") +} + +func (b BridgeClient) SetApplicationMenu(menuJSON string) { + b.session.log.Info("SetApplicationMenu unsupported in Bridge mode") +} + +func (b BridgeClient) SetTrayMenu(trayMenuJSON string) { + b.session.sendMessage("TS" + trayMenuJSON) +} + +func (b BridgeClient) UpdateTrayMenuLabel(trayMenuJSON string) { + b.session.sendMessage("TU" + trayMenuJSON) +} + +func (b BridgeClient) UpdateContextMenu(contextMenuJSON string) { + b.session.log.Info("UpdateContextMenu unsupported in Bridge mode") +} + +func newBridgeClient(session *session) *BridgeClient { + return &BridgeClient{ + session: session, + } +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/bridge/darwin.js b/vendor/github.com/wailsapp/wails/v2/internal/bridge/darwin.js new file mode 100644 index 0000000..4758b4e --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/bridge/darwin.js @@ -0,0 +1 @@ +var Wails=function(n){var t={};function e(r){if(t[r])return t[r].exports;var i=t[r]={i:r,l:!1,exports:{}};return n[r].call(i.exports,i,i.exports,e),i.l=!0,i.exports}return e.m=n,e.c=t,e.d=function(n,t,r){e.o(n,t)||Object.defineProperty(n,t,{enumerable:!0,get:r})},e.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},e.t=function(n,t){if(1&t&&(n=e(n)),8&t)return n;if(4&t&&"object"==typeof n&&n&&n.__esModule)return n;var r=Object.create(null);if(e.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:n}),2&t&&"string"!=typeof n)for(var i in n)e.d(r,i,function(t){return n[t]}.bind(null,i));return r},e.n=function(n){var t=n&&n.__esModule?function(){return n.default}:function(){return n};return e.d(t,"a",t),t},e.o=function(n,t){return Object.prototype.hasOwnProperty.call(n,t)},e.p="",e(e.s=0)}([function(n,t,e){"use strict";e.r(t);var r={};e.r(r),e.d(r,"Trace",(function(){return v})),e.d(r,"Print",(function(){return p})),e.d(r,"Debug",(function(){return y})),e.d(r,"Info",(function(){return m})),e.d(r,"Warning",(function(){return b})),e.d(r,"Error",(function(){return g})),e.d(r,"Fatal",(function(){return h})),e.d(r,"SetLogLevel",(function(){return S})),e.d(r,"Level",(function(){return E}));var i={};e.r(i),e.d(i,"Open",(function(){return x}));var o={};e.r(o),e.d(o,"Center",(function(){return N})),e.d(o,"SetTitle",(function(){return T})),e.d(o,"Fullscreen",(function(){return j})),e.d(o,"UnFullscreen",(function(){return D})),e.d(o,"SetSize",(function(){return I})),e.d(o,"SetPosition",(function(){return P})),e.d(o,"Hide",(function(){return A})),e.d(o,"Show",(function(){return J})),e.d(o,"Maximise",(function(){return L})),e.d(o,"Unmaximise",(function(){return R})),e.d(o,"Minimise",(function(){return _})),e.d(o,"Unminimise",(function(){return F})),e.d(o,"Close",(function(){return U}));var a={};e.r(a),e.d(a,"Open",(function(){return B})),e.d(a,"Save",(function(){return H})),e.d(a,"Message",(function(){return G}));var u={};e.r(u),e.d(u,"New",(function(){return en}));var c={};e.r(c),e.d(c,"SetIcon",(function(){return rn}));var l={AppType:"desktop",Platform:function(){return"darwin"}};var s=[];function f(n){s.push(n)}function d(n){if(function(n){window.wailsInvoke(n)}(n),s.length>0)for(var t=0;t0)var a=setTimeout((function(){i(Error("Call to "+n+" timed out. Request ID: "+o))}),e);k[o]={timeoutHandle:a,reject:i,resolve:r};try{var u={name:n,args:t,callbackID:o};d("C"+JSON.stringify(u))}catch(n){console.error(n)}}))}function W(n){var t;try{t=JSON.parse(n)}catch(t){var e="Invalid JSON passed to callback: ".concat(t.message,". Message: ").concat(n);throw y(e),new Error(e)}var r=t.callbackid,i=k[r];if(!i){var o="Callback '".concat(r,"' not registered!!!");throw console.error(o),new Error(o)}clearTimeout(i.timeoutHandle),delete k[r],t.error?i.reject(t.error):i.resolve(t.result)}function M(n){var t=[].slice.apply(arguments).slice(1);return C(".wails."+n,t)}function x(n){return d("RBO"+n)}function N(){d("Wc")}function T(n){d("WT"+n)}function j(){d("WF")}function D(){d("Wf")}function I(n,t){d("Ws:"+n+":"+t)}function P(n,t){d("Wp:"+n+":"+t)}function A(){d("WH")}function J(){d("WS")}function L(){d("WM")}function R(){d("WU")}function _(){d("Wm")}function F(){d("Wu")}function U(){d("WC")}function B(n){return M("Dialog.Open",n)}function H(n){return M("Dialog.Save",n)}function G(n){return M("Dialog.Message",n)}O=window.crypto?function(){var n=new Uint32Array(1);return window.crypto.getRandomValues(n)[0]}:function(){return 9007199254740991*Math.random()},window.backend={};var q=function n(t,e){!function(n,t){if(!(n instanceof t))throw new TypeError("Cannot call a class as a function")}(this,n),e=e||-1,this.Callback=function(n){return t.apply(null,n),-1!==e&&0===(e-=1)}},z={};function V(n,t,e){z[n]=z[n]||[];var r=new q(t,e);console.log("Pushing event listener: "+n),z[n].push(r)}function K(n,t){V(n,t)}function Q(n,t){V(n,t,1)}function X(n){var t=n.name;if(z[t]){for(var e=z[t].slice(),r=0;r0)for(var t=0;t0)var a=setTimeout((function(){i(Error("Call to "+n+" timed out. Request ID: "+o))}),e);k[o]={timeoutHandle:a,reject:i,resolve:r};try{var u={name:n,args:t,callbackID:o};d("C"+JSON.stringify(u))}catch(n){console.error(n)}}))}function W(n){var t;try{t=JSON.parse(n)}catch(t){var e="Invalid JSON passed to callback: ".concat(t.message,". Message: ").concat(n);throw y(e),new Error(e)}var r=t.callbackid,i=k[r];if(!i){var o="Callback '".concat(r,"' not registered!!!");throw console.error(o),new Error(o)}clearTimeout(i.timeoutHandle),delete k[r],t.error?i.reject(t.error):i.resolve(t.result)}function x(n){var t=[].slice.apply(arguments).slice(1);return C(".wails."+n,t)}function M(n){return d("RBO"+n)}function N(){d("Wc")}function T(n){d("WT"+n)}function j(){d("WF")}function D(){d("Wf")}function I(n,t){d("Ws:"+n+":"+t)}function P(n,t){d("Wp:"+n+":"+t)}function A(){d("WH")}function J(){d("WS")}function L(){d("WM")}function R(){d("WU")}function _(){d("Wm")}function F(){d("Wu")}function U(){d("WC")}function B(n){return x("Dialog.Open",n)}function H(n){return x("Dialog.Save",n)}function G(n){return x("Dialog.Message",n)}O=window.crypto?function(){var n=new Uint32Array(1);return window.crypto.getRandomValues(n)[0]}:function(){return 9007199254740991*Math.random()},window.backend={};var q=function n(t,e){!function(n,t){if(!(n instanceof t))throw new TypeError("Cannot call a class as a function")}(this,n),e=e||-1,this.Callback=function(n){return t.apply(null,n),-1!==e&&0===(e-=1)}},z={};function V(n,t,e){z[n]=z[n]||[];var r=new q(t,e);console.log("Pushing event listener: "+n),z[n].push(r)}function K(n,t){V(n,t)}function Q(n,t){V(n,t,1)}function X(n){var t=n.name;if(z[t]){for(var e=z[t].slice(),r=0;r:. +func (s *session) Identifier() string { + if s.conn != nil { + return s.conn.RemoteAddr().String() + } + return "" +} + +func (s *session) sendMessage(msg string) error { + if !s.done { + s.writeChan <- []byte(msg) + } + return nil +} + +func (s *session) start(firstSession bool) { + s.log.SetLogLevel(1) + s.log.Info("Connected to frontend.") + go s.writePump() + + var wailsRuntime string + switch runtime.GOOS { + case "darwin": + wailsRuntime = darwinRuntime + case "windows": + wailsRuntime = windowsRuntime + case "linux": + wailsRuntime = linuxRuntime + default: + log.Fatal("platform not supported") + } + + bindingsMessage := "window.wailsbindings = `" + s.bindings + "`;" + s.log.Info(bindingsMessage) + bootstrapMessage := bindingsMessage + wailsRuntime + + err := s.sendMessage("b" + bootstrapMessage) + if err != nil { + s.log.Error(err.Error()) + } + + // Send menus + traymenus, err := s.menumanager.GetTrayMenus() + if err != nil { + s.log.Error(err.Error()) + } + + for _, trayMenu := range traymenus { + err := s.sendMessage("TS" + trayMenu) + if err != nil { + s.log.Error(err.Error()) + } + } + + for { + messageType, buffer, err := s.conn.ReadMessage() + if messageType == -1 { + return + } + if err != nil { + s.log.Error("Error reading message: %v", err) + err = s.conn.Close() + return + } + + message := string(buffer) + + s.log.Debug("Got message: %#v\n", message) + + // Dispatch message as normal + s.client.DispatchMessage(message) + + if s.done { + break + } + } +} + +// Shutdown +func (s *session) Shutdown() { + err := s.conn.Close() + if err != nil { + s.log.Error(err.Error()) + } + s.done = true + s.log.Info("session %v exit", s.Identifier()) +} + +// writePump pulls messages from the writeChan and sends them to the client +// since it uses a channel to read the messages the socket is protected without locks +func (s *session) writePump() { + s.log.Debug("Session %v - writePump start", s.Identifier()) + defer s.log.Debug("Session %v - writePump shutdown", s.Identifier()) + for { + select { + case <-s.ctx.Done(): + s.Shutdown() + return + case msg, ok := <-s.writeChan: + err := s.conn.SetWriteDeadline(time.Now().Add(1 * time.Second)) + if err != nil { + s.log.Error(err.Error()) + } + if !ok { + s.log.Debug("writeChan was closed!") + err := s.conn.WriteMessage(websocket.CloseMessage, []byte{}) + if err != nil { + s.log.Error(err.Error()) + } + return + } + + if err := s.conn.WriteMessage(websocket.TextMessage, msg); err != nil { + s.log.Debug(err.Error()) + return + } + } + } +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/bridge/windows.js b/vendor/github.com/wailsapp/wails/v2/internal/bridge/windows.js new file mode 100644 index 0000000..281f47b --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/bridge/windows.js @@ -0,0 +1 @@ +var Wails=function(n){var t={};function e(r){if(t[r])return t[r].exports;var i=t[r]={i:r,l:!1,exports:{}};return n[r].call(i.exports,i,i.exports,e),i.l=!0,i.exports}return e.m=n,e.c=t,e.d=function(n,t,r){e.o(n,t)||Object.defineProperty(n,t,{enumerable:!0,get:r})},e.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},e.t=function(n,t){if(1&t&&(n=e(n)),8&t)return n;if(4&t&&"object"==typeof n&&n&&n.__esModule)return n;var r=Object.create(null);if(e.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:n}),2&t&&"string"!=typeof n)for(var i in n)e.d(r,i,function(t){return n[t]}.bind(null,i));return r},e.n=function(n){var t=n&&n.__esModule?function(){return n.default}:function(){return n};return e.d(t,"a",t),t},e.o=function(n,t){return Object.prototype.hasOwnProperty.call(n,t)},e.p="",e(e.s=0)}([function(n,t,e){"use strict";e.r(t);var r={};e.r(r),e.d(r,"Trace",(function(){return v})),e.d(r,"Print",(function(){return p})),e.d(r,"Debug",(function(){return y})),e.d(r,"Info",(function(){return m})),e.d(r,"Warning",(function(){return b})),e.d(r,"Error",(function(){return g})),e.d(r,"Fatal",(function(){return h})),e.d(r,"SetLogLevel",(function(){return S})),e.d(r,"Level",(function(){return E}));var i={};e.r(i),e.d(i,"Open",(function(){return T}));var o={};e.r(o),e.d(o,"Center",(function(){return j})),e.d(o,"SetTitle",(function(){return x})),e.d(o,"Fullscreen",(function(){return M})),e.d(o,"UnFullscreen",(function(){return I})),e.d(o,"SetSize",(function(){return D})),e.d(o,"SetPosition",(function(){return P})),e.d(o,"Hide",(function(){return A})),e.d(o,"Show",(function(){return J})),e.d(o,"Maximise",(function(){return L})),e.d(o,"Unmaximise",(function(){return R})),e.d(o,"Minimise",(function(){return _})),e.d(o,"Unminimise",(function(){return F})),e.d(o,"Close",(function(){return U}));var a={};e.r(a),e.d(a,"Open",(function(){return B})),e.d(a,"Save",(function(){return H})),e.d(a,"Message",(function(){return G}));var u={};e.r(u),e.d(u,"New",(function(){return en}));var c={};e.r(c),e.d(c,"SetIcon",(function(){return rn}));var l={AppType:"desktop",Platform:function(){return"windows"}};var s=[];function f(n){s.push(n)}function d(n){if(function(n){window.wailsInvoke(n)}(n),s.length>0)for(var t=0;t0)var a=setTimeout((function(){i(Error("Call to "+n+" timed out. Request ID: "+o))}),e);k[o]={timeoutHandle:a,reject:i,resolve:r};try{var u={name:n,args:t,callbackID:o};d("C"+JSON.stringify(u))}catch(n){console.error(n)}}))}function W(n){var t;try{t=JSON.parse(n)}catch(t){var e="Invalid JSON passed to callback: ".concat(t.message,". Message: ").concat(n);throw y(e),new Error(e)}var r=t.callbackid,i=k[r];if(!i){var o="Callback '".concat(r,"' not registered!!!");throw console.error(o),new Error(o)}clearTimeout(i.timeoutHandle),delete k[r],t.error?i.reject(t.error):i.resolve(t.result)}function N(n){var t=[].slice.apply(arguments).slice(1);return C(".wails."+n,t)}function T(n){return d("RBO"+n)}function j(){d("Wc")}function x(n){d("WT"+n)}function M(){d("WF")}function I(){d("Wf")}function D(n,t){d("Ws:"+n+":"+t)}function P(n,t){d("Wp:"+n+":"+t)}function A(){d("WH")}function J(){d("WS")}function L(){d("WM")}function R(){d("WU")}function _(){d("Wm")}function F(){d("Wu")}function U(){d("WC")}function B(n){return N("Dialog.Open",n)}function H(n){return N("Dialog.Save",n)}function G(n){return N("Dialog.Message",n)}O=window.crypto?function(){var n=new Uint32Array(1);return window.crypto.getRandomValues(n)[0]}:function(){return 9007199254740991*Math.random()},window.backend={};var q=function n(t,e){!function(n,t){if(!(n instanceof t))throw new TypeError("Cannot call a class as a function")}(this,n),e=e||-1,this.Callback=function(n){return t.apply(null,n),-1!==e&&0===(e-=1)}},z={};function V(n,t,e){z[n]=z[n]||[];var r=new q(t,e);console.log("Pushing event listener: "+n),z[n].push(r)}function K(n,t){V(n,t)}function Q(n,t){V(n,t,1)}function X(n){var t=n.name;if(z[t]){for(var e=z[t].slice(),r=0;rdata); + return -1; +} + +const char* getJSONString(JsonNode *item, const char* key) { + // Get key + JsonNode *node = json_find_member(item, key); + const char *result = ""; + if ( node != NULL && node->tag == JSON_STRING) { + result = node->string_; + } + return result; +} + +void ABORT_JSON(JsonNode *node, const char* key) { + ABORT("Unable to read required key '%s' from JSON: %s\n", key, json_encode(node)); +} + +const char* mustJSONString(JsonNode *node, const char* key) { + const char* result = getJSONString(node, key); + if ( result == NULL ) { + ABORT_JSON(node, key); + } + return result; +} +JsonNode* mustJSONObject(JsonNode *node, const char* key) { + struct JsonNode* result = getJSONObject(node, key); + if ( result == NULL ) { + ABORT_JSON(node, key); + } + return result; +} + +JsonNode* getJSONObject(JsonNode* node, const char* key) { + return json_find_member(node, key); +} + +bool getJSONBool(JsonNode *item, const char* key, bool *result) { + JsonNode *node = json_find_member(item, key); + if ( node != NULL && node->tag == JSON_BOOL) { + *result = node->bool_; + return true; + } + return false; +} + +bool getJSONInt(JsonNode *item, const char* key, int *result) { + JsonNode *node = json_find_member(item, key); + if ( node != NULL && node->tag == JSON_NUMBER) { + *result = (int) node->number_; + return true; + } + return false; +} + +JsonNode* mustParseJSON(const char* JSON) { + JsonNode* parsedUpdate = json_decode(JSON); + if ( parsedUpdate == NULL ) { + ABORT("Unable to decode JSON: %s\n", JSON); + } + return parsedUpdate; +} \ No newline at end of file diff --git a/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/common.h b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/common.h new file mode 100644 index 0000000..7f6e3a5 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/common.h @@ -0,0 +1,36 @@ +// +// Created by Lea Anthony on 6/1/21. +// + +#ifndef COMMON_H +#define COMMON_H + +#include +#include +#include "string.h" +#include "hashmap.h" +#include "vec.h" +#include "json.h" + +#define STREQ(a,b) strcmp(a, b) == 0 +#define STREMPTY(string) strlen(string) == 0 +#define STRCOPY(a) concat(a, "") +#define STR_HAS_CHARS(input) input != NULL && strlen(input) > 0 +#define MEMFREE(input) free((void*)input); input = NULL; +#define FREE_AND_SET(variable, value) if( variable != NULL ) { MEMFREE(variable); } variable = value + +// Credit: https://stackoverflow.com/a/8465083 +char* concat(const char *string1, const char *string2); +void ABORT(const char *message, ...); +int freeHashmapItem(void *const context, struct hashmap_element_s *const e); +const char* getJSONString(JsonNode *item, const char* key); +const char* mustJSONString(JsonNode *node, const char* key); +JsonNode* getJSONObject(JsonNode* node, const char* key); +JsonNode* mustJSONObject(JsonNode *node, const char* key); + +bool getJSONBool(JsonNode *item, const char* key, bool *result); +bool getJSONInt(JsonNode *item, const char* key, int *result); + +JsonNode* mustParseJSON(const char* JSON); + +#endif //ASSETS_C_COMMON_H diff --git a/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/contextmenus_darwin.c b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/contextmenus_darwin.c new file mode 100644 index 0000000..fb2eb41 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/contextmenus_darwin.c @@ -0,0 +1,99 @@ +//// +//// Created by Lea Anthony on 6/1/21. +//// +// + +#include "ffenestri_darwin.h" +#include "common.h" +#include "contextmenus_darwin.h" +#include "menu_darwin.h" + +ContextMenu* NewContextMenu(const char* contextMenuJSON) { + ContextMenu* result = malloc(sizeof(ContextMenu)); + + JsonNode* processedJSON = json_decode(contextMenuJSON); + if( processedJSON == NULL ) { + ABORT("[NewTrayMenu] Unable to parse TrayMenu JSON: %s", contextMenuJSON); + } + // Save reference to this json + result->processedJSON = processedJSON; + + result->ID = mustJSONString(processedJSON, "ID"); + JsonNode* processedMenu = mustJSONObject(processedJSON, "ProcessedMenu"); + + result->menu = NewMenu(processedMenu); + result->nsmenu = NULL; + result->menu->menuType = ContextMenuType; + result->menu->parentData = result; + result->contextMenuData = NULL; + return result; +} + +ContextMenu* GetContextMenuByID(ContextMenuStore* store, const char *contextMenuID) { + return (ContextMenu*)hashmap_get(&store->contextMenuMap, (char*)contextMenuID, strlen(contextMenuID)); +} + +void DeleteContextMenu(ContextMenu* contextMenu) { + // Free Menu + DeleteMenu(contextMenu->menu); + + // Delete any context menu data we may have stored + if( contextMenu->contextMenuData != NULL ) { + MEMFREE(contextMenu->contextMenuData); + } + + // Free JSON + if (contextMenu->processedJSON != NULL ) { + json_delete(contextMenu->processedJSON); + contextMenu->processedJSON = NULL; + } + + // Free context menu + free(contextMenu); +} + +int freeContextMenu(void *const context, struct hashmap_element_s *const e) { + DeleteContextMenu(e->data); + return -1; +} + +void ShowContextMenu(ContextMenuStore* store, id mainWindow, const char *contextMenuID, const char *contextMenuData) { + + // If no context menu ID was given, abort + if( contextMenuID == NULL ) { + return; + } + + ContextMenu* contextMenu = GetContextMenuByID(store, contextMenuID); + + // We don't need the ID now + MEMFREE(contextMenuID); + + if( contextMenu == NULL ) { + // Free context menu data + if( contextMenuData != NULL ) { + MEMFREE(contextMenuData); + return; + } + } + + // We need to store the context menu data. Free existing data if we have it + // and set to the new value. + FREE_AND_SET(contextMenu->contextMenuData, contextMenuData); + + // Grab the content view and show the menu + id contentView = msg_reg(mainWindow, s("contentView")); + + // Get the triggering event + id menuEvent = msg_reg(mainWindow, s("currentEvent")); + + if( contextMenu->nsmenu == NULL ) { + // GetMenu creates the NSMenu + contextMenu->nsmenu = GetMenu(contextMenu->menu); + } + + // Show popup + ((id(*)(id, SEL, id, id, id))objc_msgSend)(c("NSMenu"), s("popUpContextMenu:withEvent:forView:"), contextMenu->nsmenu, menuEvent, contentView); + +} + diff --git a/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/contextmenus_darwin.h b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/contextmenus_darwin.h new file mode 100644 index 0000000..a1e7b97 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/contextmenus_darwin.h @@ -0,0 +1,33 @@ +//// +//// Created by Lea Anthony on 6/1/21. +//// +// +#ifndef CONTEXTMENU_DARWIN_H +#define CONTEXTMENU_DARWIN_H + +#include "json.h" +#include "menu_darwin.h" +#include "contextmenustore_darwin.h" + +typedef struct { + const char* ID; + id nsmenu; + Menu* menu; + + JsonNode* processedJSON; + + // Context menu data is given by the frontend when clicking a context menu. + // We send this to the backend when an item is selected + const char* contextMenuData; +} ContextMenu; + + +ContextMenu* NewContextMenu(const char* contextMenuJSON); + +ContextMenu* GetContextMenuByID( ContextMenuStore* store, const char *contextMenuID); +void DeleteContextMenu(ContextMenu* contextMenu); +int freeContextMenu(void *const context, struct hashmap_element_s *const e); + +void ShowContextMenu(ContextMenuStore* store, id mainWindow, const char *contextMenuID, const char *contextMenuData); + +#endif //CONTEXTMENU_DARWIN_H diff --git a/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/contextmenustore_darwin.c b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/contextmenustore_darwin.c new file mode 100644 index 0000000..c777f01 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/contextmenustore_darwin.c @@ -0,0 +1,65 @@ + +#include "contextmenus_darwin.h" +#include "contextmenustore_darwin.h" + +ContextMenuStore* NewContextMenuStore() { + + ContextMenuStore* result = malloc(sizeof(ContextMenuStore)); + + // Allocate Context Menu Store + if( 0 != hashmap_create((const unsigned)4, &result->contextMenuMap)) { + ABORT("[NewContextMenus] Not enough memory to allocate contextMenuStore!"); + } + + return result; +} + +void AddContextMenuToStore(ContextMenuStore* store, const char* contextMenuJSON) { + ContextMenu* newMenu = NewContextMenu(contextMenuJSON); + + //TODO: check if there is already an entry for this menu + hashmap_put(&store->contextMenuMap, newMenu->ID, strlen(newMenu->ID), newMenu); +} + +ContextMenu* GetContextMenuFromStore(ContextMenuStore* store, const char* menuID) { + // Get the current menu + return hashmap_get(&store->contextMenuMap, menuID, strlen(menuID)); +} + +void UpdateContextMenuInStore(ContextMenuStore* store, const char* menuJSON) { + ContextMenu* newContextMenu = NewContextMenu(menuJSON); + + // Get the current menu + ContextMenu *currentMenu = GetContextMenuFromStore(store, newContextMenu->ID); + if ( currentMenu == NULL ) { + ABORT("Attempted to update unknown context menu with ID '%s'.", newContextMenu->ID); + } + + hashmap_remove(&store->contextMenuMap, newContextMenu->ID, strlen(newContextMenu->ID)); + + // Save the status bar reference + DeleteContextMenu(currentMenu); + + hashmap_put(&store->contextMenuMap, newContextMenu->ID, strlen(newContextMenu->ID), newContextMenu); + +} + + +void DeleteContextMenuStore(ContextMenuStore* store) { + + // Guard against NULLs + if( store == NULL ) { + return; + } + + // Delete context menus + if( hashmap_num_entries(&store->contextMenuMap) > 0 ) { + if (0 != hashmap_iterate_pairs(&store->contextMenuMap, freeContextMenu, NULL)) { + ABORT("[DeleteContextMenuStore] Failed to release contextMenuStore entries!"); + } + } + + // Free context menu hashmap + hashmap_destroy(&store->contextMenuMap); + +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/contextmenustore_darwin.h b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/contextmenustore_darwin.h new file mode 100644 index 0000000..793eef6 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/contextmenustore_darwin.h @@ -0,0 +1,27 @@ +// +// Created by Lea Anthony on 7/1/21. +// + +#ifndef CONTEXTMENUSTORE_DARWIN_H +#define CONTEXTMENUSTORE_DARWIN_H + +#include "common.h" + +typedef struct { + + int dummy; + + // This is our context menu store which keeps track + // of all instances of ContextMenus + struct hashmap_s contextMenuMap; + +} ContextMenuStore; + +ContextMenuStore* NewContextMenuStore(); + +void DeleteContextMenuStore(ContextMenuStore* store); +void UpdateContextMenuInStore(ContextMenuStore* store, const char* menuJSON); + +void AddContextMenuToStore(ContextMenuStore* store, const char* contextMenuJSON); + +#endif //CONTEXTMENUSTORE_DARWIN_H diff --git a/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/defaultdialogicons_darwin.c b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/defaultdialogicons_darwin.c new file mode 100644 index 0000000..0c79a6b --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/defaultdialogicons_darwin.c @@ -0,0 +1,41 @@ +// defaultdialogicons_darwin.c +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL. +// This file was auto-generated. DO NOT MODIFY. + +const unsigned char defaultDialogIcon0Name[] = { 0x69, 0x6e, 0x66, 0x6f, 0x2d, 0x64, 0x61, 0x72, 0x6b, 0x00 }; +const unsigned char defaultDialogIcon0Length[] = { 0x37, 0x38, 0x30, 0x00 }; +const unsigned char defaultDialogIcon0Data[] = { 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 0x0, 0x0, 0x0, 0xd, 0x49, 0x48, 0x44, 0x52, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x40, 0x8, 0x3, 0x0, 0x0, 0x0, 0x9d, 0xb7, 0x81, 0xec, 0x0, 0x0, 0x0, 0x84, 0x50, 0x4c, 0x54, 0x45, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0xdb, 0xe6, 0xd1, 0x0, 0x0, 0x0, 0x2b, 0x74, 0x52, 0x4e, 0x53, 0x0, 0xf9, 0x9c, 0xb1, 0xe7, 0x4b, 0x91, 0x3a, 0x1b, 0xe3, 0x1e, 0xa, 0xae, 0x51, 0xe0, 0x98, 0x32, 0x4, 0x66, 0x6d, 0x2b, 0x63, 0x5d, 0x18, 0x11, 0xd6, 0xd0, 0xc8, 0xc2, 0x40, 0x7, 0x76, 0x16, 0x48, 0xa0, 0x2f, 0x57, 0xf1, 0xf0, 0x85, 0x77, 0x2c, 0xf, 0x6d, 0x84, 0xfd, 0x3d, 0x0, 0x0, 0x2, 0xc, 0x49, 0x44, 0x41, 0x54, 0x58, 0xc3, 0xed, 0x57, 0xd9, 0x96, 0x82, 0x30, 0xc, 0x15, 0x2c, 0x4b, 0x91, 0x5d, 0x40, 0x10, 0x5, 0xf7, 0x65, 0xfc, 0xff, 0xff, 0x9b, 0x63, 0xca, 0xa1, 0x40, 0xb, 0x61, 0xa6, 0xc7, 0x37, 0xf3, 0x18, 0x92, 0xdb, 0x66, 0xb9, 0x69, 0x58, 0x7c, 0xe5, 0xb3, 0x62, 0x87, 0x46, 0xfa, 0x78, 0xa4, 0x46, 0x68, 0xff, 0xc3, 0x79, 0xe3, 0x99, 0x25, 0xd5, 0x5e, 0x20, 0x1a, 0x2d, 0x4d, 0x6f, 0xf3, 0x27, 0x77, 0x2b, 0xf0, 0x5f, 0x3, 0xf1, 0x3, 0x6b, 0xb6, 0xfb, 0x7e, 0xa9, 0xbd, 0x24, 0xa2, 0x2d, 0xf7, 0xb3, 0xdc, 0x1d, 0x1d, 0xdc, 0xa5, 0x10, 0xba, 0x83, 0xfb, 0x1b, 0x7e, 0xd7, 0x83, 0x14, 0x5, 0xe9, 0xe2, 0xf9, 0x6, 0xe6, 0xbf, 0x6e, 0xcd, 0xa9, 0x1b, 0x5b, 0x89, 0x93, 0xe7, 0x4e, 0x62, 0xc5, 0x2e, 0x6d, 0x21, 0xd7, 0x93, 0xee, 0x2b, 0xb3, 0x8d, 0xd7, 0xb3, 0x7b, 0x15, 0xf5, 0xda, 0xbc, 0x98, 0xab, 0x9, 0x7f, 0xb7, 0x31, 0xda, 0x1d, 0x25, 0xb1, 0xed, 0x9a, 0x8f, 0xee, 0x38, 0x42, 0x73, 0x3e, 0xc9, 0x2a, 0xd9, 0xd7, 0x2a, 0x23, 0xcd, 0x1d, 0x46, 0xe3, 0x67, 0xdf, 0xb7, 0xe1, 0x98, 0x41, 0xb8, 0x65, 0x16, 0x23, 0x79, 0x30, 0x58, 0x94, 0xcb, 0xcd, 0x44, 0x7f, 0x2e, 0x59, 0x86, 0xc, 0x69, 0xfd, 0x29, 0xf3, 0x5f, 0x4d, 0x66, 0x99, 0x21, 0x50, 0x59, 0x3f, 0xe8, 0xec, 0xfe, 0x83, 0xf3, 0x9f, 0xcf, 0x1, 0xc1, 0x58, 0x14, 0xba, 0xa4, 0x7f, 0x21, 0x0, 0x72, 0xee, 0x1f, 0x78, 0xba, 0x5e, 0x4f, 0xfd, 0x2b, 0x9d, 0x9, 0x4, 0x21, 0x74, 0x75, 0xc4, 0xee, 0x96, 0xf5, 0xb5, 0xf1, 0x5b, 0x17, 0xf7, 0x75, 0x19, 0x8b, 0x34, 0x1a, 0xf2, 0x4f, 0x83, 0xfa, 0x57, 0x42, 0x5d, 0x85, 0xaa, 0x55, 0x3b, 0xb8, 0xc2, 0x90, 0x9b, 0x1, 0x68, 0x8f, 0xb, 0xc9, 0x69, 0x97, 0x81, 0xf2, 0x8, 0x67, 0x5, 0x7d, 0xe5, 0xc1, 0x87, 0x7b, 0x9, 0x81, 0xdd, 0x29, 0xbd, 0x47, 0x43, 0x2d, 0x44, 0xeb, 0x1f, 0x7a, 0x3a, 0xf, 0x2, 0xf3, 0xc4, 0xdc, 0x1e, 0x98, 0x1d, 0x6a, 0xc, 0xc1, 0x12, 0x7b, 0xe6, 0xac, 0x24, 0x42, 0x6a, 0xa2, 0x12, 0x58, 0x22, 0xda, 0x46, 0x96, 0x15, 0x89, 0x5a, 0xe0, 0x5c, 0x19, 0x75, 0x31, 0xa9, 0x50, 0x2f, 0x90, 0xdc, 0xd5, 0x34, 0xf7, 0x47, 0x50, 0x43, 0x75, 0xa9, 0xdd, 0x65, 0x9, 0x24, 0xd6, 0x12, 0xe9, 0x25, 0xa7, 0x8e, 0x5, 0x25, 0xb, 0xbb, 0x3c, 0x2, 0x4d, 0x22, 0x58, 0x6, 0x42, 0xc1, 0x40, 0x12, 0x38, 0xaf, 0xcb, 0xa8, 0x14, 0x72, 0xe8, 0xc8, 0xf9, 0xa1, 0x8b, 0xbc, 0x83, 0x2c, 0xa6, 0x1d, 0x4d, 0xfd, 0x56, 0x14, 0xf9, 0x5c, 0x80, 0xbc, 0x78, 0xeb, 0x6b, 0x65, 0x0, 0xe5, 0x10, 0xb0, 0x24, 0x72, 0x0, 0x3c, 0x89, 0xbc, 0x8c, 0x38, 0x0, 0x2f, 0x23, 0xd6, 0x48, 0x1c, 0x0, 0x6f, 0x24, 0xde, 0xca, 0x38, 0x0, 0x6f, 0x65, 0x84, 0x4c, 0x1c, 0x0, 0x27, 0x13, 0x67, 0x28, 0xe, 0xc0, 0x8d, 0xb1, 0x81, 0xc2, 0x1, 0xf0, 0x81, 0xc2, 0x47, 0x1a, 0xa, 0xc0, 0x47, 0x1a, 0x3a, 0x54, 0x39, 0x99, 0x90, 0xa1, 0x8a, 0x8e, 0xf5, 0x74, 0x62, 0xac, 0xe3, 0xf, 0xcb, 0xed, 0x86, 0x3c, 0x2c, 0xd8, 0xd3, 0x96, 0x24, 0xf8, 0xd3, 0xa6, 0xfe, 0xb8, 0xce, 0x7f, 0xde, 0x6d, 0xfe, 0xbc, 0xab, 0x2d, 0x18, 0xca, 0x2b, 0xe, 0xbe, 0x64, 0x19, 0xd8, 0x92, 0x85, 0xaf, 0x79, 0x17, 0xbb, 0x97, 0xe1, 0xb, 0xb2, 0xe6, 0x61, 0x8b, 0x26, 0x11, 0x17, 0x4d, 0xf5, 0x55, 0x57, 0x7d, 0xd9, 0x56, 0x5f, 0xf7, 0xd5, 0x7f, 0x38, 0xd4, 0x7f, 0x79, 0xf0, 0x9f, 0xae, 0xba, 0x86, 0x9f, 0xae, 0xaf, 0x7c, 0x54, 0x7e, 0x1, 0x7, 0x4e, 0x88, 0x96, 0x1d, 0xbb, 0xbc, 0x56, 0x0, 0x0, 0x0, 0x0, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, 0x00 }; +const unsigned char defaultDialogIcon1Name[] = { 0x69, 0x6e, 0x66, 0x6f, 0x2d, 0x64, 0x61, 0x72, 0x6b, 0x32, 0x78, 0x00 }; +const unsigned char defaultDialogIcon1Length[] = { 0x31, 0x32, 0x39, 0x35, 0x00 }; +const unsigned char defaultDialogIcon1Data[] = { 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 0x0, 0x0, 0x0, 0xd, 0x49, 0x48, 0x44, 0x52, 0x0, 0x0, 0x0, 0x80, 0x0, 0x0, 0x0, 0x80, 0x8, 0x3, 0x0, 0x0, 0x0, 0xf4, 0xe0, 0x91, 0xf9, 0x0, 0x0, 0x0, 0x96, 0x50, 0x4c, 0x54, 0x45, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x25, 0xc5, 0xa8, 0x0, 0x0, 0x0, 0x31, 0x74, 0x52, 0x4e, 0x53, 0x0, 0xfb, 0x55, 0x3, 0x61, 0x95, 0xc, 0xd7, 0xb7, 0x8a, 0x82, 0x39, 0xe5, 0x40, 0x19, 0x44, 0x2b, 0x4e, 0xee, 0xc6, 0xbf, 0x48, 0x25, 0x21, 0xe2, 0xb3, 0x67, 0xe8, 0x33, 0xd0, 0x6c, 0x42, 0x9, 0xcb, 0xf, 0xf6, 0xc2, 0xbc, 0xb0, 0xa8, 0x71, 0x52, 0x14, 0x7, 0x90, 0x7c, 0x8f, 0x11, 0x7b, 0xbe, 0x95, 0xf5, 0x71, 0x0, 0x0, 0x3, 0xf7, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xec, 0x97, 0xd9, 0x72, 0xaa, 0x40, 0x10, 0x86, 0xdb, 0xc, 0xc8, 0xe, 0xa2, 0x2c, 0xee, 0x68, 0xdc, 0xf5, 0x98, 0xd4, 0xbc, 0xff, 0xcb, 0x9d, 0x4a, 0x9d, 0x53, 0xa1, 0x41, 0x98, 0x9e, 0x19, 0x30, 0x95, 0xb, 0xbf, 0xeb, 0x6, 0x7a, 0xf9, 0x7b, 0x1, 0x5e, 0xbc, 0x78, 0xf1, 0xe2, 0x85, 0x3e, 0x9b, 0x30, 0x5b, 0x16, 0x71, 0x5c, 0x2c, 0xb3, 0x70, 0x3, 0x3f, 0xcb, 0x30, 0x5a, 0x9b, 0x7, 0x9f, 0x23, 0xfc, 0x83, 0xb9, 0x8e, 0x86, 0xf0, 0x13, 0xdc, 0x2, 0x77, 0x32, 0xe0, 0x8d, 0xc, 0x26, 0x6e, 0x70, 0x83, 0xa7, 0xc2, 0xd2, 0xd3, 0x8e, 0xb, 0xd9, 0x9d, 0x52, 0x6, 0xcf, 0x62, 0xe4, 0x2c, 0xb8, 0x4, 0xb, 0x67, 0x4, 0xcf, 0xc0, 0xb3, 0xb9, 0x34, 0xb6, 0x7, 0x7d, 0x53, 0x24, 0x5c, 0x89, 0xa4, 0xe8, 0x37, 0xf9, 0x9, 0x57, 0x26, 0xe9, 0xaf, 0x10, 0x43, 0x67, 0xc0, 0x35, 0x18, 0x38, 0x3d, 0xf5, 0x65, 0x3c, 0xe5, 0x9a, 0x4c, 0x63, 0xe8, 0xe, 0x73, 0x78, 0x7, 0x1c, 0xd6, 0x39, 0xfd, 0xb3, 0xd6, 0xc, 0xfb, 0xdb, 0xa3, 0x79, 0x37, 0x8c, 0xbb, 0x79, 0xdc, 0xfa, 0xad, 0x35, 0x9a, 0x75, 0x2c, 0x43, 0x6e, 0xf1, 0x26, 0x56, 0xae, 0x17, 0x32, 0x40, 0xb0, 0xd0, 0x73, 0x57, 0xbc, 0x9, 0x2b, 0x87, 0xe, 0x4, 0xe3, 0x86, 0xc8, 0xf7, 0xe7, 0xbc, 0xc5, 0xdb, 0xf3, 0xbe, 0x21, 0x13, 0xe3, 0x0, 0xb4, 0x99, 0x3f, 0xbe, 0xcf, 0x36, 0xae, 0x20, 0xe0, 0x6a, 0xd8, 0x8f, 0x1e, 0xcf, 0x75, 0xe5, 0x67, 0xf2, 0x3a, 0x13, 0xf, 0x48, 0xbc, 0x9, 0xaf, 0x63, 0x32, 0xad, 0xef, 0x3f, 0xc8, 0xcf, 0xba, 0x80, 0x14, 0x17, 0xeb, 0x41, 0x8a, 0x3a, 0x1e, 0xd4, 0xe3, 0x5f, 0xcc, 0x99, 0xb4, 0xef, 0xf3, 0x45, 0x3d, 0x7, 0x1a, 0xf5, 0xaf, 0x15, 0xd2, 0x1d, 0x2a, 0x75, 0xaf, 0x5b, 0x93, 0x8f, 0xb2, 0xe, 0x82, 0x41, 0x55, 0xca, 0x5, 0x28, 0x12, 0x8d, 0xab, 0x1, 0x4, 0x8a, 0xfd, 0x5f, 0x7d, 0xdc, 0xca, 0x40, 0x99, 0xcc, 0xaa, 0x86, 0x90, 0x2b, 0x65, 0xb0, 0xfa, 0xb0, 0xfd, 0xe, 0x1a, 0xbc, 0xdb, 0xd5, 0x20, 0x86, 0xda, 0xd, 0xf0, 0xc1, 0x40, 0xb, 0xf6, 0xa1, 0xdb, 0xa, 0x4e, 0xa5, 0x7a, 0x6, 0x68, 0x63, 0x54, 0x94, 0xe4, 0x80, 0x24, 0x31, 0xc7, 0x18, 0xd0, 0x1, 0x83, 0x63, 0x62, 0x49, 0x1, 0x4c, 0x2b, 0xf9, 0x87, 0x4e, 0xfc, 0xe1, 0x88, 0xe9, 0x46, 0xbd, 0x0, 0x36, 0x83, 0x4e, 0x30, 0x5b, 0xb9, 0x8, 0x23, 0x5c, 0x37, 0x4b, 0xac, 0xff, 0x4f, 0xc3, 0x34, 0x8d, 0x4f, 0x71, 0x2f, 0x58, 0x58, 0x4f, 0x23, 0xa0, 0x49, 0x70, 0xf3, 0x8a, 0xfb, 0x3f, 0xf5, 0xbf, 0x8c, 0xfc, 0x14, 0x44, 0x64, 0x78, 0xa4, 0x24, 0x40, 0x52, 0x60, 0x87, 0x23, 0x10, 0xb1, 0x1c, 0xfc, 0x37, 0x5b, 0x82, 0x88, 0x8, 0xa7, 0xb4, 0x50, 0x4a, 0x80, 0xb, 0x42, 0x56, 0xdf, 0x7, 0x12, 0x8, 0x71, 0x55, 0x52, 0xe0, 0xe1, 0xfd, 0x27, 0x9e, 0x5d, 0x61, 0x69, 0x19, 0x8a, 0xdb, 0xa, 0xef, 0x46, 0xf, 0xc4, 0xd8, 0xf2, 0x1b, 0x2c, 0x2d, 0x2d, 0x53, 0x10, 0xb2, 0xc6, 0x6d, 0x45, 0xb4, 0x0, 0xee, 0x0, 0x26, 0x6d, 0x4b, 0x88, 0x9b, 0x59, 0x1c, 0xd9, 0x4a, 0xcf, 0x80, 0xb, 0xd5, 0xe2, 0xdf, 0xf2, 0x1e, 0x33, 0xea, 0x46, 0x92, 0x9d, 0x5, 0xc, 0x55, 0x6b, 0x2, 0x14, 0x73, 0xf9, 0x6b, 0x3, 0xdd, 0x89, 0x3e, 0x23, 0xca, 0x8a, 0xd4, 0x42, 0x61, 0x4a, 0xdf, 0x5b, 0x1e, 0x97, 0x13, 0xcc, 0x9, 0x8b, 0x45, 0x82, 0x78, 0xe6, 0xfb, 0xb3, 0x18, 0x30, 0xb4, 0xb8, 0x4f, 0xd0, 0xca, 0x6d, 0x47, 0x2f, 0xc1, 0xee, 0x6b, 0x71, 0x77, 0x83, 0x36, 0x2, 0x34, 0x4, 0xaf, 0xd0, 0x2b, 0x57, 0x34, 0xe, 0x3, 0x99, 0x91, 0xb5, 0x87, 0x9e, 0xd9, 0xa3, 0x1, 0x2b, 0xa3, 0xd5, 0x33, 0xf4, 0xcc, 0x59, 0xa2, 0xbf, 0x86, 0x28, 0x4d, 0x39, 0xf4, 0x4c, 0x8e, 0xca, 0xdb, 0x36, 0xe2, 0x23, 0xf4, 0xff, 0x2d, 0x79, 0xf8, 0x7e, 0xdd, 0x3, 0x92, 0x27, 0x33, 0xfa, 0x7b, 0x8f, 0xe8, 0x91, 0xed, 0x82, 0xc, 0xd1, 0xbf, 0x7b, 0xa0, 0xf6, 0x3e, 0x5a, 0x60, 0x6b, 0x68, 0xc6, 0x24, 0xa6, 0x10, 0x71, 0xf, 0x10, 0x78, 0xf4, 0x9f, 0xe2, 0x1, 0xed, 0x57, 0xa5, 0xa4, 0x6e, 0x1, 0x43, 0x6f, 0xef, 0x3, 0x34, 0xe3, 0x97, 0x32, 0x61, 0x40, 0x13, 0xaa, 0xf9, 0xcb, 0x4a, 0x89, 0x4f, 0xa1, 0x91, 0xd, 0x5a, 0x18, 0x40, 0x40, 0xdc, 0x3, 0x44, 0x7c, 0x7c, 0x43, 0x44, 0x24, 0x97, 0xd3, 0xb7, 0xd2, 0xfe, 0xd, 0x24, 0xd8, 0x52, 0x19, 0xcb, 0x4a, 0x83, 0xe3, 0x33, 0x1c, 0x38, 0x96, 0xf6, 0x59, 0xb3, 0xa8, 0x91, 0x4c, 0x3b, 0x39, 0x40, 0x37, 0xd9, 0x92, 0x5a, 0x45, 0xf7, 0x67, 0x38, 0x70, 0xa7, 0xd6, 0x51, 0x4c, 0xec, 0x62, 0xc2, 0x1, 0x95, 0x8d, 0x1c, 0xff, 0x4e, 0x7, 0xfe, 0xb6, 0x6f, 0x6, 0x29, 0xc, 0x2, 0x41, 0x10, 0x3c, 0xc4, 0x63, 0xc4, 0x78, 0x8a, 0x10, 0x90, 0x24, 0x67, 0x21, 0xfe, 0xff, 0x75, 0x1, 0x73, 0x89, 0x18, 0x28, 0xb1, 0xc, 0xb3, 0x2b, 0x3b, 0x1f, 0xb0, 0x41, 0xdd, 0x9d, 0xe9, 0xae, 0x9, 0x7f, 0x5, 0xe1, 0x1f, 0x61, 0xf8, 0x6f, 0x18, 0x7e, 0x10, 0xc1, 0x51, 0xc, 0x2, 0xc4, 0x51, 0xcc, 0x97, 0x11, 0xb, 0x50, 0x97, 0x11, 0x5f, 0xc7, 0x2c, 0x40, 0x5d, 0xc7, 0xdc, 0x90, 0xb0, 0x0, 0xd5, 0x90, 0x70, 0x4b, 0xc6, 0x2, 0x54, 0x4b, 0xc6, 0x4d, 0x29, 0xb, 0x50, 0x4d, 0x29, 0xb7, 0xe5, 0x2c, 0x40, 0xb5, 0xe5, 0x3c, 0x98, 0xb0, 0x0, 0x35, 0x98, 0xf0, 0x68, 0xc6, 0x2, 0xd4, 0x68, 0xc6, 0xc3, 0x29, 0xb, 0x50, 0xc3, 0x29, 0x8f, 0xe7, 0x2c, 0xc0, 0x8d, 0xe7, 0x6c, 0x50, 0xb0, 0x0, 0x6f, 0x50, 0xb0, 0x45, 0xc3, 0x2, 0xbc, 0x45, 0xc3, 0x26, 0x15, 0xb, 0x60, 0x93, 0xca, 0xd8, 0x74, 0x2c, 0x80, 0x6d, 0x3a, 0x65, 0x54, 0xb2, 0x0, 0x36, 0x2a, 0xd3, 0xb6, 0x6a, 0xe3, 0xcd, 0xea, 0x4d, 0x76, 0xfd, 0xc3, 0xd9, 0xf5, 0x3e, 0xb0, 0xb8, 0x88, 0xc0, 0x42, 0x45, 0x36, 0x4d, 0x37, 0x35, 0x58, 0x8d, 0x88, 0x6c, 0x64, 0x68, 0xf5, 0xac, 0x86, 0xa1, 0x82, 0x5c, 0x6b, 0x1e, 0x5a, 0xe5, 0x10, 0xdb, 0xc5, 0x7, 0x97, 0xe1, 0xd1, 0x6d, 0x7c, 0x78, 0xbd, 0x5b, 0x7c, 0x3f, 0x40, 0x7c, 0xff, 0x67, 0x80, 0xe1, 0xb5, 0x0, 0x18, 0x42, 0x11, 0x8e, 0xdb, 0xd5, 0x41, 0x2c, 0x8d, 0x86, 0x58, 0x72, 0xc3, 0x78, 0x7e, 0x80, 0x4c, 0xfd, 0x7a, 0x90, 0xa9, 0x5f, 0x80, 0x4c, 0x39, 0xa2, 0x5c, 0x3b, 0xc2, 0x6c, 0xc3, 0x29, 0x4f, 0x9c, 0x2f, 0x1, 0xa0, 0x31, 0x1e, 0xe9, 0x44, 0xa8, 0x75, 0xac, 0xaa, 0x11, 0xa0, 0xd6, 0xdc, 0xb1, 0xde, 0x78, 0xb0, 0xd9, 0xa0, 0xdd, 0xf7, 0xa3, 0xc0, 0xed, 0x9, 0xe0, 0xfd, 0x9, 0x2c, 0x38, 0x7c, 0x56, 0x3c, 0xce, 0x6b, 0x9e, 0x7e, 0x5e, 0xae, 0x78, 0x1c, 0x65, 0xc9, 0x25, 0x81, 0x35, 0x9f, 0xef, 0x45, 0xa7, 0x6e, 0xf6, 0xc7, 0x8b, 0x45, 0x27, 0xb5, 0xea, 0x55, 0xb7, 0x6d, 0x3d, 0xad, 0x7a, 0x95, 0x2a, 0x55, 0xaa, 0x54, 0xa9, 0xcd, 0xf5, 0x6, 0xc2, 0x69, 0xab, 0xf3, 0x71, 0x7e, 0x8e, 0x8, 0x0, 0x0, 0x0, 0x0, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, 0x00 }; +const unsigned char defaultDialogIcon2Name[] = { 0x69, 0x6e, 0x66, 0x6f, 0x2d, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x00 }; +const unsigned char defaultDialogIcon2Length[] = { 0x37, 0x36, 0x34, 0x00 }; +const unsigned char defaultDialogIcon2Data[] = { 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 0x0, 0x0, 0x0, 0xd, 0x49, 0x48, 0x44, 0x52, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x40, 0x8, 0x3, 0x0, 0x0, 0x0, 0x9d, 0xb7, 0x81, 0xec, 0x0, 0x0, 0x0, 0x75, 0x50, 0x4c, 0x54, 0x45, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x79, 0x59, 0x7d, 0x58, 0x0, 0x0, 0x0, 0x26, 0x74, 0x52, 0x4e, 0x53, 0x0, 0xfc, 0xa5, 0xc9, 0xd, 0xf4, 0x7c, 0xd5, 0x8e, 0x7f, 0x26, 0x13, 0x78, 0xed, 0x47, 0xe0, 0xa0, 0x43, 0x8, 0xc5, 0xe9, 0xdc, 0xb4, 0xb0, 0x90, 0x88, 0x6b, 0x51, 0x29, 0x1f, 0xbe, 0x19, 0x94, 0x93, 0x37, 0x36, 0x1a, 0x58, 0x7b, 0xc0, 0x9a, 0x4f, 0x0, 0x0, 0x2, 0x10, 0x49, 0x44, 0x41, 0x54, 0x58, 0xc3, 0xed, 0x57, 0xd9, 0xb2, 0x82, 0x30, 0xc, 0x15, 0x91, 0x4d, 0x40, 0x40, 0x94, 0x4d, 0xb9, 0xee, 0xfd, 0xff, 0x4f, 0xbc, 0x93, 0x14, 0xd, 0xd3, 0x2, 0x41, 0x3b, 0xbe, 0x99, 0xd1, 0x7, 0xd2, 0xe4, 0x34, 0x3d, 0x4d, 0xd3, 0x74, 0xf1, 0x93, 0xaf, 0x4a, 0xbb, 0x69, 0xea, 0x73, 0x9a, 0x9e, 0xeb, 0x66, 0xd3, 0xbe, 0xef, 0x9d, 0xf9, 0xb6, 0x23, 0x5e, 0xe2, 0xd8, 0x7e, 0xf6, 0x8e, 0x77, 0x18, 0x79, 0xe8, 0x67, 0x75, 0x82, 0x1f, 0x5e, 0x14, 0xce, 0x74, 0x5f, 0x5, 0x3b, 0x74, 0x7e, 0x21, 0x3c, 0xbf, 0x76, 0xc1, 0x6a, 0x8e, 0xff, 0x61, 0x8f, 0xf6, 0xf8, 0x97, 0x42, 0xdf, 0xfb, 0x3, 0xef, 0xef, 0xb, 0x81, 0x53, 0xe2, 0xd2, 0x13, 0xbb, 0x2c, 0xed, 0x4, 0xc9, 0xe8, 0x94, 0x3e, 0x17, 0x7e, 0x81, 0x33, 0xc1, 0x2f, 0x77, 0x6f, 0xe1, 0x16, 0x74, 0xdb, 0xf0, 0xe6, 0xe6, 0xa8, 0x84, 0xb1, 0x62, 0x72, 0x19, 0x6b, 0x4f, 0x48, 0xcb, 0xd8, 0x5d, 0x2b, 0x23, 0x6e, 0x2c, 0xe4, 0x98, 0xb7, 0x9e, 0xf0, 0x8f, 0xa5, 0x8d, 0x55, 0x9d, 0xf4, 0xc1, 0x53, 0x65, 0xc9, 0xd1, 0x78, 0x14, 0x61, 0xd5, 0xcd, 0x9f, 0x1f, 0x87, 0xc7, 0x8f, 0x76, 0x17, 0xc3, 0xd8, 0x2a, 0xa, 0x49, 0xdd, 0x72, 0x3c, 0xc4, 0xa5, 0xa4, 0xb3, 0x18, 0xe3, 0x1f, 0xfd, 0xdd, 0x29, 0x92, 0x2, 0x89, 0xe0, 0xf, 0xee, 0xbf, 0x8c, 0x2f, 0x58, 0x4c, 0x4a, 0x20, 0xad, 0xe, 0x3, 0x4, 0xec, 0x81, 0x3d, 0x2d, 0xfe, 0xcd, 0x46, 0x5d, 0x5, 0x9a, 0xed, 0x57, 0x3a, 0x34, 0xe, 0xd8, 0xa, 0xea, 0x9f, 0x10, 0x7f, 0x8a, 0x2d, 0x30, 0x39, 0x10, 0x68, 0xb8, 0xc3, 0xd8, 0x14, 0xfe, 0x5d, 0x48, 0x1d, 0x85, 0x94, 0x23, 0xae, 0x61, 0xa7, 0x9e, 0xac, 0x8, 0x71, 0x2b, 0x45, 0x9b, 0xa, 0xc7, 0x11, 0xa9, 0xa2, 0xac, 0xd0, 0x34, 0x52, 0xb4, 0x1e, 0xcc, 0x15, 0xab, 0xf9, 0xf3, 0x0, 0xd2, 0x1f, 0x8a, 0xf2, 0x1e, 0x83, 0xad, 0xa7, 0xd4, 0xf, 0xdc, 0x1d, 0x7d, 0x7, 0xa3, 0x24, 0x89, 0x34, 0xa5, 0x8b, 0xfb, 0x9d, 0xe9, 0x39, 0x60, 0xd, 0xe4, 0xe8, 0x76, 0x3b, 0x90, 0xf1, 0x96, 0x9e, 0xb, 0x36, 0x44, 0x95, 0x2f, 0x66, 0x4a, 0x2e, 0x2c, 0x65, 0xc3, 0x5a, 0x87, 0x56, 0x30, 0x9d, 0x7, 0xb4, 0x6, 0xa7, 0xed, 0x9b, 0x9, 0x90, 0x1b, 0x29, 0x94, 0x3c, 0x50, 0xe4, 0x8a, 0xe6, 0x7d, 0xe8, 0x6, 0x21, 0x43, 0x9d, 0x43, 0x88, 0x55, 0x67, 0x31, 0xc4, 0x80, 0x9b, 0x9e, 0xa6, 0x6, 0xc3, 0x44, 0xe7, 0x6b, 0x9, 0xfa, 0xa5, 0xce, 0x6c, 0x2, 0xfa, 0xba, 0xa7, 0x39, 0x13, 0x2b, 0x1c, 0x0, 0x71, 0x7e, 0xe9, 0x67, 0x1c, 0x28, 0xca, 0xf9, 0x0, 0x25, 0xe8, 0x53, 0x63, 0x0, 0xe3, 0x25, 0x18, 0x93, 0xc8, 0x6d, 0x23, 0x1, 0xf0, 0xdb, 0x48, 0x89, 0xc4, 0x3, 0x50, 0x22, 0x31, 0xa9, 0x4c, 0x0, 0x7c, 0x2a, 0xd3, 0x61, 0xe2, 0x1, 0xe8, 0x30, 0x71, 0xc7, 0x99, 0x0, 0xf8, 0xe3, 0x4c, 0x5, 0x85, 0x7, 0xa0, 0x82, 0xc2, 0x95, 0x34, 0x2, 0xe0, 0x4b, 0x1a, 0x15, 0x55, 0x16, 0x80, 0x8a, 0x2a, 0x5b, 0xd6, 0xe9, 0x38, 0x33, 0x65, 0xdd, 0xe8, 0x62, 0xe1, 0xaf, 0xb6, 0x2c, 0x63, 0xae, 0x36, 0xe3, 0xcb, 0x55, 0xbf, 0xde, 0x83, 0xf, 0xaf, 0x77, 0xf3, 0x6, 0x83, 0x5a, 0x1c, 0x9b, 0x6d, 0x71, 0x3e, 0x6a, 0xb2, 0xee, 0x4c, 0x93, 0xc5, 0xb5, 0x79, 0x81, 0xd6, 0xe6, 0xf1, 0x8d, 0xe6, 0xf5, 0xd9, 0x68, 0x5e, 0x99, 0x46, 0xd3, 0xa0, 0xd5, 0x35, 0x6a, 0xb6, 0xcd, 0xdb, 0x7d, 0xf3, 0x7, 0x87, 0xf9, 0x93, 0x87, 0x7f, 0x74, 0x5d, 0xd2, 0xf4, 0x82, 0x8f, 0xae, 0x9f, 0x7c, 0x53, 0xfe, 0x1, 0x6f, 0xc7, 0x5c, 0x26, 0x6e, 0x29, 0x2b, 0x15, 0x0, 0x0, 0x0, 0x0, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, 0x00 }; +const unsigned char defaultDialogIcon3Name[] = { 0x69, 0x6e, 0x66, 0x6f, 0x2d, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x32, 0x78, 0x00 }; +const unsigned char defaultDialogIcon3Length[] = { 0x31, 0x32, 0x39, 0x33, 0x00 }; +const unsigned char defaultDialogIcon3Data[] = { 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 0x0, 0x0, 0x0, 0xd, 0x49, 0x48, 0x44, 0x52, 0x0, 0x0, 0x0, 0x80, 0x0, 0x0, 0x0, 0x80, 0x8, 0x3, 0x0, 0x0, 0x0, 0xf4, 0xe0, 0x91, 0xf9, 0x0, 0x0, 0x0, 0x93, 0x50, 0x4c, 0x54, 0x45, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7a, 0x79, 0x23, 0x75, 0x0, 0x0, 0x0, 0x30, 0x74, 0x52, 0x4e, 0x53, 0x0, 0xfb, 0x55, 0x5, 0xe4, 0x40, 0xa, 0xb7, 0xd7, 0x62, 0x44, 0xe, 0xc0, 0x94, 0xb2, 0x2b, 0x68, 0x4e, 0xee, 0x39, 0xc6, 0x81, 0x48, 0x21, 0x89, 0x18, 0xe8, 0x33, 0xd0, 0xbd, 0xcb, 0x96, 0x8f, 0x13, 0x8b, 0xf6, 0xe1, 0xa8, 0x83, 0x7c, 0x71, 0x6c, 0x52, 0x26, 0x25, 0x1a, 0x3b, 0x5d, 0x23, 0x0, 0xd6, 0x57, 0x0, 0x0, 0x3, 0xf9, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xec, 0x97, 0xd7, 0x76, 0xab, 0x40, 0xc, 0x45, 0x35, 0xa1, 0x99, 0x6a, 0x63, 0xc, 0xb8, 0x13, 0xdc, 0x4b, 0x7c, 0xa3, 0xff, 0xff, 0xba, 0xbb, 0x6e, 0x59, 0x78, 0x26, 0x60, 0x24, 0x8a, 0xb3, 0xf2, 0xe0, 0xfd, 0x3c, 0x1e, 0xb, 0x95, 0x73, 0x34, 0xf0, 0xe2, 0xc5, 0x8b, 0x17, 0x2f, 0xda, 0x63, 0xde, 0xae, 0xb, 0x23, 0xc, 0x8d, 0xc5, 0xf5, 0x66, 0xc2, 0xf7, 0xe2, 0x3a, 0x67, 0x7f, 0xa5, 0xa3, 0x84, 0xbe, 0xf2, 0xcf, 0x8e, 0xb, 0xdf, 0x81, 0x66, 0x1c, 0x26, 0x2, 0x2b, 0x11, 0x93, 0x83, 0xa1, 0xc1, 0x53, 0xd1, 0x92, 0xfd, 0x16, 0x6b, 0xd9, 0xee, 0x93, 0xe7, 0xc5, 0x30, 0xdc, 0xcc, 0x91, 0xc1, 0x7c, 0x33, 0x84, 0x67, 0xf0, 0xcb, 0x42, 0x36, 0x56, 0x4, 0x7d, 0xe3, 0x78, 0xd8, 0x8, 0xcf, 0xe9, 0x37, 0xf9, 0x1e, 0x36, 0xc6, 0xeb, 0xaf, 0x10, 0xe6, 0x54, 0x60, 0xb, 0xc4, 0xb4, 0x27, 0x79, 0x8, 0x77, 0xd8, 0x92, 0x5d, 0x8, 0x3d, 0xb0, 0xc1, 0xe, 0x4c, 0xbb, 0x8b, 0x5e, 0xf0, 0x30, 0xc3, 0xfa, 0x3a, 0xc8, 0x8e, 0xb6, 0x7d, 0xcc, 0x82, 0xb5, 0xfe, 0xb0, 0x46, 0x41, 0x47, 0x79, 0x4c, 0x7, 0x58, 0xc5, 0x32, 0x8e, 0x66, 0xa0, 0x30, 0x8b, 0xe2, 0x25, 0x56, 0x31, 0x48, 0xa1, 0x3, 0xc6, 0x18, 0x4b, 0x8, 0xef, 0x94, 0x3e, 0x88, 0xf6, 0xe4, 0x9, 0x2c, 0x31, 0x36, 0xa0, 0x35, 0xa3, 0xf2, 0x7d, 0x96, 0x9d, 0x43, 0xd, 0xb9, 0x6d, 0x95, 0x23, 0x1e, 0xb5, 0x15, 0x7e, 0x1f, 0xbf, 0x32, 0x89, 0x18, 0x8a, 0x39, 0xc1, 0xaf, 0xf8, 0x5a, 0xab, 0xff, 0xb7, 0x4a, 0xe5, 0xbc, 0x0, 0x8b, 0xcb, 0xa0, 0x94, 0xb7, 0x36, 0x11, 0xf8, 0xa8, 0x32, 0x1f, 0x69, 0xec, 0xd8, 0x47, 0x73, 0x54, 0xf1, 0x5b, 0xd4, 0x1f, 0x15, 0x44, 0x6c, 0x36, 0x12, 0xcf, 0x58, 0xa0, 0x42, 0xe3, 0x3e, 0x30, 0x84, 0xda, 0xca, 0x4e, 0x63, 0xf7, 0x52, 0x7, 0x48, 0x18, 0xd, 0xe7, 0x7f, 0xac, 0x56, 0xff, 0x3, 0x1a, 0xf3, 0x31, 0x50, 0x3f, 0x21, 0x6d, 0xa4, 0x7f, 0xea, 0x8f, 0x2d, 0xb7, 0x95, 0x88, 0x5a, 0xea, 0x47, 0x34, 0xb9, 0x44, 0xd5, 0xdf, 0x77, 0xad, 0xe5, 0x1c, 0xbf, 0xab, 0xaa, 0xc, 0x6c, 0xa6, 0x4a, 0xf5, 0x6c, 0x68, 0x8d, 0x2d, 0x5a, 0x39, 0x53, 0x88, 0x32, 0x36, 0x74, 0xc0, 0x46, 0x99, 0x90, 0x39, 0x42, 0x3b, 0x25, 0xff, 0xd0, 0x9, 0xa5, 0xa, 0x3b, 0x93, 0x59, 0x0, 0xbe, 0x86, 0xf1, 0xf5, 0x94, 0x5f, 0x84, 0xa1, 0xe0, 0xb7, 0x6e, 0xfe, 0xe9, 0xfb, 0x9f, 0x39, 0x7f, 0xa0, 0xc4, 0x10, 0x68, 0x3c, 0x79, 0x78, 0xeb, 0xe7, 0x3f, 0xd1, 0x11, 0x11, 0xf5, 0xa4, 0x5e, 0xf, 0x64, 0x49, 0xf1, 0x80, 0xc4, 0x91, 0x3, 0xae, 0xd7, 0xbf, 0x85, 0xf8, 0x7f, 0x6c, 0x51, 0x7f, 0xa3, 0x9c, 0x52, 0xa3, 0x51, 0x2, 0x62, 0xa8, 0x65, 0x59, 0x2c, 0x48, 0x50, 0xcb, 0x1, 0xef, 0xac, 0x48, 0x37, 0x97, 0xfd, 0xaf, 0xbe, 0x69, 0x6f, 0x58, 0x30, 0xab, 0x1f, 0x2b, 0xd9, 0x1b, 0xa9, 0x8d, 0xc2, 0xe2, 0x3b, 0x58, 0x82, 0x5, 0x9, 0xdf, 0x59, 0x2d, 0x62, 0x4, 0xe4, 0x9, 0xd0, 0xd8, 0x67, 0x89, 0xe6, 0xd6, 0x6, 0xc8, 0x3d, 0xbb, 0xc1, 0x3b, 0x17, 0x6a, 0xc4, 0xc7, 0xc5, 0xb0, 0x50, 0x62, 0x71, 0xc1, 0x3b, 0x9b, 0xda, 0x3b, 0xa5, 0x6a, 0x4d, 0x80, 0x62, 0xc4, 0xdf, 0x36, 0xa4, 0x3d, 0x51, 0xd7, 0x78, 0x65, 0xc5, 0x8, 0x48, 0x32, 0xfc, 0x4b, 0xc6, 0xd8, 0x54, 0x91, 0xd7, 0x30, 0x7b, 0xa5, 0x59, 0x68, 0xc2, 0x40, 0xd7, 0x3, 0xd5, 0x62, 0xe8, 0xe6, 0xde, 0xd7, 0x54, 0x60, 0x4b, 0x9b, 0x60, 0x77, 0x5b, 0xdc, 0x3e, 0xae, 0x81, 0x21, 0x89, 0x60, 0xe, 0xbd, 0x92, 0xb, 0x8e, 0x1a, 0x1e, 0x68, 0xd1, 0xa6, 0xa1, 0x15, 0x36, 0xe6, 0xf4, 0xea, 0x9, 0x7a, 0xe6, 0xc4, 0x98, 0x2f, 0x57, 0x4a, 0x53, 0xa, 0x3d, 0x93, 0x4a, 0xe5, 0x35, 0x69, 0x23, 0x5c, 0x2, 0xb, 0xf7, 0xcf, 0x3e, 0xe0, 0x2, 0xb, 0xe9, 0xf5, 0xfe, 0xc8, 0x64, 0xcf, 0x6a, 0x99, 0x68, 0x9c, 0x7f, 0xfb, 0x80, 0x3, 0x1c, 0x62, 0x2c, 0x38, 0x43, 0x35, 0x3e, 0xa1, 0x42, 0xc4, 0x3e, 0x40, 0x10, 0xd1, 0x2f, 0xc5, 0x95, 0xea, 0xaf, 0xfc, 0xa4, 0xae, 0x81, 0xc1, 0x8d, 0x5e, 0xa, 0xf4, 0x7b, 0x9b, 0x0, 0x83, 0x59, 0xb3, 0x78, 0x35, 0x71, 0xb7, 0x3, 0xa8, 0xc4, 0x44, 0xe2, 0x4, 0x77, 0x1f, 0x20, 0xbf, 0xf, 0x4d, 0x22, 0x47, 0xbc, 0x9c, 0xbe, 0x61, 0xc1, 0x1b, 0x30, 0x58, 0x53, 0x19, 0xbb, 0x12, 0xcf, 0x38, 0x32, 0x0, 0xfe, 0x83, 0xf3, 0x5a, 0xdd, 0xd4, 0x58, 0x90, 0x3d, 0x23, 0x80, 0xc, 0xb, 0x16, 0x94, 0x15, 0x1d, 0x9f, 0x11, 0xc0, 0x91, 0xb2, 0xa3, 0x90, 0xf0, 0x62, 0x32, 0x0, 0xbe, 0x23, 0x87, 0x3f, 0x33, 0x80, 0xdf, 0xed, 0x5b, 0xcb, 0xe, 0x82, 0x30, 0x10, 0x6c, 0x2, 0xed, 0x85, 0x44, 0xf, 0x84, 0x28, 0x26, 0x18, 0x4e, 0xdc, 0x14, 0xfe, 0xff, 0xeb, 0x8c, 0x21, 0x5e, 0x1c, 0xc9, 0xd2, 0x4e, 0x65, 0x29, 0xe9, 0x7c, 0xc1, 0x24, 0x4a, 0x77, 0xe7, 0xb1, 0xea, 0x3f, 0x81, 0xfa, 0x9f, 0x50, 0xfd, 0x33, 0x54, 0x7f, 0x88, 0xf0, 0x29, 0xe6, 0x9, 0xc8, 0x4f, 0xb1, 0x3c, 0x8c, 0x78, 0x2, 0x38, 0x8c, 0xd8, 0x71, 0x8c, 0x4, 0xd8, 0x71, 0x8c, 0xb, 0x9, 0x43, 0x40, 0x5e, 0x48, 0xd8, 0x95, 0xc, 0x9, 0xb0, 0x2b, 0x19, 0x2e, 0xa5, 0xc, 0x1, 0x79, 0x29, 0x65, 0xd7, 0x72, 0x24, 0x40, 0xaf, 0xe5, 0x28, 0x4c, 0x8, 0x2, 0xa2, 0x30, 0xa1, 0xa5, 0x19, 0x12, 0xe0, 0xa5, 0x19, 0x8a, 0x53, 0x82, 0x80, 0x24, 0x4e, 0x69, 0x79, 0x8e, 0x4, 0x78, 0x79, 0x8e, 0x6, 0x5, 0x41, 0x40, 0x32, 0x28, 0x78, 0x8b, 0x6, 0x9, 0xf0, 0x16, 0xd, 0x9a, 0x54, 0xc, 0x1, 0xd9, 0xa4, 0xe2, 0x6d, 0x3a, 0x24, 0xc0, 0xdb, 0x74, 0x68, 0x54, 0xf2, 0x4, 0xd0, 0xa8, 0xdc, 0xb7, 0x55, 0x6b, 0xea, 0xf5, 0x66, 0x75, 0x4b, 0x98, 0xd5, 0x91, 0xed, 0xfa, 0x3b, 0x67, 0xd7, 0xf3, 0x81, 0xc5, 0x99, 0x8, 0x2c, 0x88, 0xc8, 0x6, 0x2c, 0x1a, 0xef, 0xc8, 0x86, 0xf, 0xad, 0xaa, 0xb1, 0xef, 0xc7, 0xca, 0x27, 0xb4, 0x4a, 0x21, 0xb6, 0xd3, 0xf, 0x2e, 0xd5, 0xa3, 0x5b, 0xfd, 0xf0, 0x5a, 0x3f, 0xbe, 0xd7, 0x2f, 0x30, 0xfc, 0xa1, 0xc2, 0x71, 0xbb, 0xa4, 0x55, 0x62, 0xc1, 0x1a, 0xcf, 0xe0, 0x57, 0xe3, 0x19, 0xbe, 0x6b, 0x3c, 0xe9, 0x15, 0x99, 0xa2, 0x56, 0xb9, 0x4e, 0x45, 0xac, 0x32, 0xdb, 0x33, 0xb0, 0xcc, 0x96, 0x66, 0x9d, 0x6f, 0x7, 0x85, 0x46, 0x8f, 0x4a, 0xe7, 0x63, 0xb9, 0xd2, 0x99, 0x76, 0xa9, 0x75, 0x9e, 0x4c, 0xe1, 0xb8, 0x1e, 0xa1, 0xd8, 0xac, 0x5f, 0xed, 0xd6, 0x2f, 0xb7, 0xbf, 0x61, 0xbb, 0xc9, 0xb, 0x9d, 0x35, 0xb1, 0x51, 0xf3, 0x7, 0xe, 0xfc, 0x89, 0x47, 0x39, 0xad, 0x40, 0x9, 0x27, 0x1e, 0x87, 0x39, 0x72, 0x99, 0x39, 0xd8, 0x66, 0xf9, 0xcc, 0xa7, 0xb1, 0x85, 0xd9, 0x2, 0xee, 0xf7, 0xa1, 0x93, 0x33, 0xdb, 0xc2, 0xb5, 0x9f, 0x53, 0xaf, 0xd6, 0x99, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x60, 0xbc, 0x0, 0xd9, 0xfc, 0x9e, 0xf5, 0xee, 0xae, 0x37, 0x12, 0x0, 0x0, 0x0, 0x0, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, 0x00 }; +const unsigned char defaultDialogIcon4Name[] = { 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x64, 0x61, 0x72, 0x6b, 0x00 }; +const unsigned char defaultDialogIcon4Length[] = { 0x39, 0x34, 0x31, 0x00 }; +const unsigned char defaultDialogIcon4Data[] = { 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 0x0, 0x0, 0x0, 0xd, 0x49, 0x48, 0x44, 0x52, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x40, 0x8, 0x3, 0x0, 0x0, 0x0, 0x9d, 0xb7, 0x81, 0xec, 0x0, 0x0, 0x0, 0x99, 0x50, 0x4c, 0x54, 0x45, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x1d, 0x4, 0x54, 0x0, 0x0, 0x0, 0x32, 0x74, 0x52, 0x4e, 0x53, 0x0, 0xf9, 0x1c, 0xe6, 0xb1, 0x3b, 0x17, 0xc9, 0xad, 0x6, 0x8f, 0x4e, 0x4b, 0x40, 0xf6, 0xe3, 0xe0, 0xc1, 0x20, 0x11, 0x62, 0x54, 0x34, 0x30, 0x2b, 0x5d, 0xd6, 0xd0, 0x98, 0x76, 0x65, 0xb, 0x9b, 0x92, 0x6d, 0x48, 0x2, 0x9, 0x3, 0x9c, 0xb5, 0x9d, 0xed, 0xe8, 0xbb, 0x78, 0xdc, 0x83, 0x71, 0x9f, 0x76, 0x53, 0x1c, 0x31, 0x0, 0x0, 0x2, 0x91, 0x49, 0x44, 0x41, 0x54, 0x58, 0xc3, 0xed, 0x57, 0x6b, 0x7b, 0xaa, 0x30, 0xc, 0x3e, 0xdc, 0x4, 0x41, 0x85, 0x71, 0x13, 0x54, 0x18, 0x53, 0xa7, 0xce, 0xcb, 0xb6, 0xb3, 0xff, 0xff, 0xe3, 0x8e, 0xa4, 0xa5, 0x29, 0x4, 0xe, 0xee, 0xe9, 0xb3, 0x6f, 0xcb, 0x27, 0xdb, 0x92, 0x34, 0x79, 0xf3, 0x26, 0x8d, 0x7f, 0x7e, 0xe5, 0x47, 0x65, 0xaf, 0xa7, 0x5e, 0x5c, 0x14, 0xb1, 0x97, 0xea, 0xfb, 0xef, 0x6b, 0x4f, 0x3c, 0xd7, 0xf6, 0xb5, 0x2f, 0x10, 0xcd, 0xb7, 0x5d, 0x6f, 0xf2, 0x2d, 0x75, 0x6b, 0x13, 0x7c, 0x75, 0x24, 0xd8, 0x58, 0xf, 0xab, 0xcf, 0xcd, 0xfa, 0x6a, 0x22, 0x9a, 0x39, 0x7f, 0x48, 0x3d, 0x3c, 0xa, 0x75, 0x62, 0xe2, 0x18, 0x8e, 0xeb, 0xcf, 0x2, 0x59, 0xc3, 0x58, 0xad, 0xc, 0xd9, 0x5e, 0x30, 0x1b, 0xd3, 0xdf, 0x2e, 0x9a, 0x6f, 0xd, 0xa7, 0xb4, 0x32, 0x3d, 0x8a, 0xf4, 0xcc, 0x2a, 0x1d, 0xa3, 0xd9, 0x5d, 0x6c, 0xff, 0xab, 0xfe, 0xfc, 0x22, 0xe2, 0x4d, 0x74, 0xf9, 0x40, 0x4f, 0x4, 0x2e, 0x2f, 0xcf, 0xc3, 0xfa, 0xaf, 0xe, 0xff, 0xe8, 0x69, 0xd7, 0x13, 0xdb, 0x13, 0x3f, 0x74, 0x5e, 0x7, 0xd, 0xf0, 0xfb, 0x8d, 0x7c, 0xda, 0x77, 0x3a, 0xcd, 0xd, 0xee, 0xc3, 0x60, 0xfc, 0xec, 0x7c, 0xbd, 0x1c, 0xfa, 0x60, 0xb9, 0x66, 0x5f, 0x6c, 0x7, 0xf0, 0x67, 0xf8, 0x99, 0x13, 0x54, 0x28, 0x1c, 0xdb, 0x36, 0x6f, 0x68, 0x70, 0x62, 0x32, 0x24, 0x7b, 0x73, 0x11, 0xfa, 0x4c, 0x5f, 0x60, 0xa4, 0x57, 0xb, 0x8e, 0xfc, 0xdf, 0x50, 0xa0, 0xcc, 0x2c, 0xf8, 0x7d, 0x7c, 0x78, 0x63, 0xfe, 0x8b, 0xfb, 0xd3, 0x15, 0xa6, 0xff, 0xdd, 0x12, 0x56, 0x59, 0x14, 0x6f, 0x3d, 0xfc, 0xd5, 0x0, 0x3f, 0xe1, 0x6e, 0xe6, 0xa3, 0xbe, 0xbc, 0xbf, 0x4, 0x24, 0x35, 0xc2, 0xea, 0x3, 0xf3, 0x2d, 0x17, 0x90, 0x43, 0xd2, 0x50, 0x6c, 0x91, 0xbb, 0x9c, 0x45, 0x7a, 0xe8, 0xd6, 0x9f, 0x6, 0xf9, 0x17, 0xf9, 0x4b, 0x38, 0x21, 0x5c, 0x97, 0x5b, 0x8a, 0x5, 0x59, 0x60, 0x43, 0xeb, 0xd6, 0xe6, 0x6, 0x76, 0x91, 0x3f, 0x27, 0x58, 0x7f, 0xde, 0xd, 0x4e, 0x3f, 0x99, 0x6d, 0xd1, 0x54, 0x76, 0xb0, 0xde, 0x74, 0xfa, 0x47, 0x0, 0x7e, 0x21, 0x75, 0xcf, 0xf5, 0xba, 0x62, 0x8b, 0xaa, 0xfe, 0x7d, 0x16, 0xc0, 0xef, 0x21, 0xda, 0xa0, 0xdd, 0x61, 0x3c, 0x70, 0x33, 0x11, 0xeb, 0x14, 0x32, 0x38, 0x6f, 0xf0, 0x45, 0x9f, 0x31, 0x3c, 0xaf, 0x65, 0xc0, 0x5, 0xa8, 0xf5, 0x76, 0x4e, 0xce, 0xfc, 0x92, 0x10, 0xac, 0x61, 0x78, 0x3a, 0x24, 0xc2, 0x6d, 0xd1, 0xdc, 0x86, 0x2a, 0x91, 0x42, 0x7a, 0xbf, 0xaf, 0x4f, 0x1c, 0xd2, 0x59, 0x17, 0x35, 0x7, 0xf2, 0x22, 0x17, 0x8c, 0xe, 0x49, 0x2f, 0x65, 0x5a, 0xd8, 0xe7, 0x53, 0xc8, 0x33, 0xc, 0x80, 0x5e, 0xa4, 0x98, 0x4b, 0x60, 0xa3, 0x5c, 0xef, 0x29, 0x0, 0x6b, 0xb5, 0x9c, 0x8a, 0xf6, 0xd, 0xa3, 0x59, 0x11, 0xcb, 0x39, 0x7, 0x97, 0xd2, 0x2e, 0x86, 0x5a, 0x46, 0xf9, 0x99, 0x7d, 0x9c, 0x2e, 0xac, 0x1e, 0x52, 0x79, 0x17, 0xee, 0x93, 0x2b, 0x2a, 0x66, 0x18, 0x52, 0x7d, 0x80, 0x8b, 0x90, 0x9f, 0xa1, 0x18, 0x4b, 0x3b, 0x45, 0xbd, 0xb1, 0x8a, 0x88, 0x81, 0x8f, 0x46, 0xff, 0xda, 0xca, 0x7a, 0x4, 0x75, 0x56, 0x3c, 0x60, 0xe0, 0xd8, 0x74, 0x31, 0x38, 0x22, 0x6, 0xc6, 0x43, 0xa8, 0x0, 0x9b, 0x75, 0x89, 0x19, 0x23, 0x21, 0x10, 0x10, 0xa9, 0x1, 0x7, 0xdb, 0x30, 0x1, 0x91, 0xa4, 0x91, 0x18, 0x20, 0x65, 0x43, 0xd2, 0x48, 0x88, 0x44, 0x30, 0x38, 0xe2, 0x9a, 0x12, 0x89, 0x52, 0x99, 0x94, 0x8, 0x92, 0x9e, 0x52, 0x99, 0x16, 0x53, 0x47, 0x76, 0x72, 0x15, 0x91, 0x62, 0x1a, 0x2e, 0x67, 0x94, 0xd8, 0xb6, 0x11, 0x6c, 0x5a, 0xce, 0xb4, 0xa1, 0x10, 0x39, 0xc8, 0xbd, 0x8f, 0x36, 0x14, 0xda, 0xd2, 0xc6, 0x85, 0xb6, 0x34, 0xda, 0x54, 0x51, 0xa2, 0x3c, 0x47, 0x12, 0x92, 0xa6, 0x3a, 0xd8, 0xd6, 0x11, 0x2e, 0xfb, 0x8e, 0x36, 0x42, 0x4b, 0xda, 0xfa, 0xc0, 0xc3, 0x82, 0x72, 0xab, 0xf7, 0x6e, 0xed, 0x7, 0xf6, 0x42, 0x1f, 0x16, 0xfa, 0xb4, 0x51, 0x1e, 0xd0, 0xa7, 0x6d, 0xfc, 0x71, 0x5, 0xb7, 0xf0, 0x32, 0xfa, 0xb8, 0xe, 0x3f, 0xef, 0x28, 0xc9, 0xf5, 0x9a, 0xc8, 0xf7, 0xe3, 0xf3, 0xae, 0x36, 0x60, 0x28, 0x8f, 0x38, 0xe3, 0x43, 0xd6, 0x6c, 0x64, 0xc8, 0x52, 0x1b, 0xf3, 0x14, 0x7, 0x4d, 0xd5, 0x51, 0x57, 0x6d, 0xd8, 0xae, 0x42, 0xc5, 0x71, 0x5f, 0xf1, 0xf, 0x87, 0xe2, 0x5f, 0x1e, 0xc5, 0x3f, 0x5d, 0xbf, 0xf2, 0x93, 0xf2, 0xf, 0x45, 0x13, 0xb6, 0x9d, 0x6, 0x38, 0x84, 0xb9, 0x0, 0x0, 0x0, 0x0, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, 0x00 }; +const unsigned char defaultDialogIcon5Name[] = { 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x64, 0x61, 0x72, 0x6b, 0x32, 0x78, 0x00 }; +const unsigned char defaultDialogIcon5Length[] = { 0x31, 0x35, 0x35, 0x37, 0x00 }; +const unsigned char defaultDialogIcon5Data[] = { 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 0x0, 0x0, 0x0, 0xd, 0x49, 0x48, 0x44, 0x52, 0x0, 0x0, 0x0, 0x80, 0x0, 0x0, 0x0, 0x80, 0x8, 0x3, 0x0, 0x0, 0x0, 0xf4, 0xe0, 0x91, 0xf9, 0x0, 0x0, 0x0, 0x9f, 0x50, 0x4c, 0x54, 0x45, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa, 0x77, 0x79, 0xb8, 0x0, 0x0, 0x0, 0x34, 0x74, 0x52, 0x4e, 0x53, 0x0, 0xfb, 0x2, 0xa, 0x40, 0x62, 0xe5, 0x8a, 0x82, 0xe, 0x6, 0xb8, 0x2b, 0x19, 0x44, 0xed, 0xd9, 0x26, 0xb1, 0x94, 0x4e, 0x39, 0xc6, 0xf6, 0xbf, 0x55, 0x48, 0x21, 0x67, 0x33, 0xe0, 0xa8, 0x6c, 0xe8, 0xc2, 0x97, 0x90, 0x14, 0xd4, 0xb5, 0x3b, 0xd1, 0xcb, 0x7b, 0x52, 0xbc, 0x9e, 0xef, 0x71, 0x72, 0x5c, 0x1d, 0xd8, 0xaf, 0x95, 0x64, 0x0, 0x0, 0x4, 0xf1, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xec, 0x97, 0xdb, 0x96, 0xa2, 0x40, 0xc, 0x45, 0x23, 0x20, 0x20, 0x88, 0x82, 0x22, 0xd8, 0xde, 0xef, 0xed, 0xa5, 0x45, 0xa7, 0x27, 0xff, 0xff, 0x6d, 0xf3, 0x30, 0x6b, 0x69, 0xa, 0x52, 0x1d, 0x40, 0xed, 0x27, 0xf7, 0x6b, 0x61, 0xaa, 0xea, 0x24, 0x27, 0x29, 0xe1, 0xcd, 0x9b, 0x37, 0x6f, 0xde, 0xd4, 0xc7, 0xc, 0xa2, 0xa9, 0x15, 0xc7, 0xd6, 0x34, 0xa, 0x4c, 0xf8, 0x5d, 0x5a, 0x9d, 0x45, 0xff, 0x6c, 0x23, 0xc1, 0x3e, 0xf7, 0x17, 0x9d, 0x16, 0xfc, 0x6, 0x9e, 0xe5, 0x26, 0xd, 0x64, 0x69, 0x24, 0xae, 0xe5, 0xc1, 0x4b, 0x31, 0x46, 0xf3, 0x14, 0x7f, 0x24, 0x9d, 0x8f, 0xc, 0x78, 0x15, 0x6d, 0x67, 0x89, 0x25, 0x58, 0x3a, 0x6d, 0x78, 0x5, 0x7b, 0x1f, 0x4b, 0xe3, 0xf, 0xe0, 0xd9, 0x74, 0x86, 0x58, 0x89, 0x61, 0xe7, 0xb9, 0xe2, 0xf, 0xb1, 0x32, 0xc3, 0xe7, 0x25, 0xc2, 0x74, 0x1a, 0x58, 0x83, 0x86, 0x63, 0xc2, 0x53, 0x88, 0x67, 0x58, 0x93, 0x59, 0xfc, 0xc, 0xe7, 0x39, 0xf8, 0x0, 0xce, 0xc3, 0x9e, 0x6c, 0x7d, 0x6a, 0x15, 0xb6, 0x8f, 0xbd, 0xf5, 0xa9, 0xd9, 0x3c, 0xad, 0x7b, 0x47, 0x5b, 0x9b, 0xa3, 0xde, 0x83, 0xed, 0x71, 0xbc, 0x43, 0x8e, 0x83, 0x3b, 0x8, 0xc, 0x45, 0xa7, 0x60, 0xe0, 0x1e, 0x90, 0x63, 0x37, 0x86, 0x7, 0xb0, 0xba, 0xcc, 0xcd, 0x57, 0x57, 0x4d, 0xcc, 0xf1, 0x75, 0xc5, 0x28, 0xd1, 0xb5, 0xa0, 0x36, 0x93, 0x62, 0x3c, 0xbf, 0xb9, 0x85, 0x1f, 0xd8, 0x36, 0xfd, 0xe2, 0x89, 0x27, 0x75, 0xc7, 0x4e, 0x1f, 0xf3, 0x24, 0x3, 0x10, 0xd9, 0x27, 0x98, 0xa7, 0xef, 0xd5, 0xda, 0xbf, 0x50, 0x7e, 0xe1, 0x17, 0x94, 0xe2, 0x2b, 0xc4, 0x1c, 0x9f, 0x75, 0x4e, 0x90, 0xbf, 0xff, 0x72, 0x52, 0x3a, 0x8a, 0x37, 0x59, 0xe6, 0x35, 0xa8, 0x91, 0xff, 0x5c, 0x22, 0x5d, 0x13, 0x2a, 0x60, 0xba, 0xb9, 0xf2, 0xa9, 0x5c, 0x7, 0x96, 0x1a, 0xa0, 0xdb, 0xa9, 0x3c, 0xbd, 0xba, 0xea, 0x5, 0xac, 0x8a, 0xfe, 0x57, 0x7f, 0x1e, 0x46, 0x50, 0x99, 0x28, 0x54, 0xaf, 0x30, 0xae, 0xd4, 0xff, 0x76, 0xaa, 0xf7, 0x5a, 0xb5, 0x9a, 0xa8, 0xea, 0xc8, 0x5d, 0x85, 0x20, 0x86, 0x6a, 0x80, 0x8d, 0xa1, 0xf1, 0x7c, 0x36, 0xc, 0xd3, 0x74, 0xb6, 0x9a, 0x2f, 0x2, 0x3e, 0xcc, 0x6, 0x29, 0x3d, 0x3, 0xca, 0xe2, 0x28, 0xd9, 0x6b, 0xb2, 0xc1, 0x9b, 0x4a, 0xd7, 0x3b, 0x2e, 0x58, 0x8b, 0x34, 0x95, 0x4a, 0x72, 0xa0, 0x24, 0x31, 0x52, 0xd8, 0xfd, 0x47, 0xbb, 0xc2, 0xe8, 0xfd, 0x60, 0x4f, 0x80, 0x94, 0xb8, 0xa4, 0x85, 0x66, 0x8a, 0xfe, 0x5c, 0x76, 0x7b, 0xc8, 0xb0, 0xe2, 0x12, 0xb1, 0x51, 0xe, 0x69, 0x56, 0x4f, 0x80, 0x6f, 0x8, 0x23, 0x92, 0x30, 0x9b, 0x32, 0xa9, 0xf2, 0x2b, 0x27, 0xa1, 0x4d, 0xf3, 0x16, 0x32, 0xa5, 0x3b, 0xed, 0xa2, 0x86, 0xb4, 0xc3, 0xa8, 0x15, 0xd2, 0x7a, 0x6a, 0x83, 0xcc, 0x90, 0x9a, 0x97, 0xf1, 0x7f, 0x60, 0xa3, 0x96, 0xb, 0xf3, 0x7d, 0x44, 0xcf, 0x3b, 0x4, 0x91, 0xe, 0x3d, 0x30, 0x73, 0x23, 0xf3, 0x88, 0x3f, 0x10, 0x6e, 0x99, 0x88, 0x54, 0x52, 0xab, 0x92, 0x0, 0xae, 0x30, 0xa3, 0x18, 0xe6, 0x50, 0xc4, 0xad, 0x22, 0xc1, 0x9e, 0xce, 0x3f, 0x93, 0x11, 0x54, 0x7a, 0xa1, 0xf, 0x18, 0xd1, 0x96, 0xec, 0x3a, 0x8f, 0x2f, 0x4c, 0xb0, 0x9c, 0x1, 0xd3, 0x24, 0x49, 0x73, 0x66, 0x84, 0x22, 0xb, 0xfa, 0x34, 0x10, 0x2c, 0x40, 0xf3, 0xe9, 0x31, 0xe, 0x40, 0xca, 0xa6, 0x6d, 0x0, 0x18, 0xed, 0xd, 0x52, 0x98, 0xba, 0xf1, 0xa8, 0x13, 0xda, 0xa5, 0x7b, 0xc0, 0x97, 0xb0, 0x3e, 0xbb, 0x15, 0x94, 0x45, 0x5b, 0xd7, 0x9a, 0x7b, 0x23, 0x95, 0xed, 0x5, 0x6, 0xc9, 0x56, 0x2, 0xc, 0x21, 0xb1, 0x68, 0x40, 0xac, 0x49, 0xac, 0xb6, 0xe4, 0x66, 0xe, 0x79, 0x27, 0xda, 0x6, 0xe8, 0x19, 0x9, 0xd5, 0x12, 0x91, 0xf5, 0x6f, 0x20, 0x7c, 0xd3, 0x1f, 0xa, 0xb5, 0x3d, 0x2, 0x3d, 0x73, 0xd2, 0x83, 0x81, 0xe1, 0x43, 0xbb, 0xee, 0xb, 0xaf, 0x2f, 0x9f, 0x3a, 0x55, 0x8b, 0x97, 0xa, 0x43, 0xf0, 0xf, 0xde, 0xb8, 0x6a, 0x57, 0x5c, 0x61, 0x2c, 0xa6, 0x1e, 0xe8, 0xb0, 0x48, 0x13, 0xdc, 0xa, 0x35, 0xba, 0xd7, 0x6a, 0x9c, 0x1, 0xc3, 0xb6, 0x51, 0xa6, 0x1b, 0xba, 0xd4, 0xce, 0x1c, 0xd9, 0xfd, 0x80, 0x26, 0x28, 0xb4, 0x24, 0xa7, 0xaf, 0x58, 0x89, 0xf4, 0xb5, 0x7a, 0x15, 0x4e, 0xb8, 0xd3, 0x37, 0x90, 0x39, 0x8, 0xd9, 0x4b, 0x40, 0x43, 0x8b, 0xc8, 0x34, 0x16, 0x5c, 0x92, 0xe9, 0x73, 0xbc, 0x1, 0x8e, 0x31, 0x12, 0xf5, 0xe4, 0x41, 0x78, 0x10, 0x3a, 0xf5, 0xe5, 0x2f, 0xa8, 0xac, 0xf1, 0xc6, 0x9, 0x58, 0xe, 0xb4, 0x59, 0xf2, 0x2c, 0xe4, 0x34, 0x5, 0x87, 0xff, 0xfb, 0xc7, 0xf9, 0xc, 0xa4, 0x24, 0xbc, 0x58, 0x60, 0xb, 0xf9, 0xdf, 0xe0, 0x40, 0xeb, 0xd4, 0xd3, 0xea, 0xb2, 0xcb, 0xf2, 0xf7, 0x37, 0x8e, 0xb2, 0xc0, 0x3, 0xf9, 0x9f, 0xe2, 0x19, 0x6f, 0x4, 0x50, 0x5, 0x33, 0xc3, 0x3b, 0x67, 0x9d, 0x78, 0xf2, 0x27, 0xf6, 0xfd, 0x16, 0x6, 0x94, 0x80, 0xce, 0x22, 0xd9, 0xe5, 0xc6, 0xbd, 0xc4, 0x6d, 0xcd, 0x3d, 0x90, 0xf9, 0x42, 0xc0, 0xdc, 0x5f, 0xe7, 0x21, 0x52, 0x7c, 0x0, 0xf1, 0x7e, 0x68, 0x4a, 0x1a, 0x1d, 0xa1, 0x14, 0xad, 0xac, 0x81, 0x79, 0xa6, 0xa0, 0xe3, 0x28, 0x64, 0x98, 0x8e, 0xba, 0x5e, 0xb9, 0xfd, 0x67, 0xf2, 0x9b, 0x90, 0x7f, 0x4c, 0x45, 0xc0, 0x31, 0x55, 0x1f, 0x15, 0x32, 0x19, 0x16, 0x68, 0x44, 0xa0, 0x65, 0x2d, 0xc9, 0x64, 0x29, 0xbd, 0x44, 0xc6, 0x2c, 0xea, 0x9f, 0x8e, 0x40, 0xcf, 0x49, 0x2a, 0xd4, 0x58, 0x99, 0xc5, 0x32, 0xfb, 0xe2, 0xfe, 0x4c, 0x60, 0xb6, 0x5b, 0xc7, 0x4f, 0x39, 0xc0, 0x7, 0xe6, 0xb8, 0xfc, 0x6b, 0xdf, 0x8e, 0x5a, 0x12, 0x6, 0xa3, 0x30, 0x8e, 0x4f, 0x93, 0x5, 0x61, 0x8, 0xda, 0x8, 0x86, 0x91, 0xa0, 0x92, 0x17, 0x51, 0x24, 0x7d, 0xff, 0xcf, 0x16, 0xc6, 0x18, 0xc1, 0x5e, 0xfb, 0xb9, 0x8e, 0x31, 0x27, 0xfb, 0x5f, 0x7b, 0x71, 0x64, 0x7b, 0xcf, 0x7b, 0xce, 0xf3, 0x3c, 0xdb, 0x65, 0x81, 0x2, 0xf4, 0x8, 0x5c, 0xc0, 0xec, 0xd8, 0x1, 0xf0, 0x23, 0xf0, 0x4b, 0xe8, 0x2, 0x46, 0x6f, 0x5b, 0xfc, 0x1e, 0x2f, 0x21, 0x8e, 0x21, 0xa, 0x78, 0x7c, 0xc6, 0xdf, 0xc7, 0x31, 0x44, 0x23, 0x62, 0x1, 0x1b, 0x8, 0x50, 0x68, 0x44, 0x6a, 0xc5, 0x2e, 0xa0, 0x21, 0xcf, 0xa8, 0x15, 0xfb, 0x32, 0xa, 0x15, 0xe0, 0xcb, 0xc8, 0xd7, 0x71, 0xa8, 0x0, 0x5f, 0xc7, 0x1e, 0x48, 0x42, 0x5, 0x78, 0x20, 0xf1, 0x48, 0x16, 0x2b, 0xc0, 0x23, 0x99, 0x87, 0x52, 0xf3, 0xfa, 0xcb, 0x22, 0xed, 0xa1, 0xd4, 0x63, 0x39, 0x99, 0x62, 0xe7, 0xc7, 0x58, 0xce, 0xc5, 0x84, 0x8c, 0x67, 0x75, 0x13, 0x6e, 0x1c, 0x1a, 0x2f, 0x26, 0x5e, 0xcd, 0xcc, 0x12, 0x77, 0x17, 0x56, 0x33, 0x2e, 0xa7, 0x66, 0xd, 0x3f, 0x6, 0xcb, 0x29, 0xd7, 0x73, 0x53, 0xce, 0xf3, 0x7c, 0x5e, 0x66, 0x0, 0xeb, 0x39, 0x4, 0x8a, 0x0, 0x10, 0x28, 0x2c, 0xd1, 0x84, 0xb0, 0x44, 0x63, 0x91, 0x2a, 0x86, 0x45, 0x2a, 0xcb, 0x74, 0x31, 0x2c, 0xd3, 0x59, 0xa8, 0xc, 0x61, 0xa1, 0xd2, 0x52, 0xad, 0xd8, 0xee, 0x17, 0x8b, 0xbd, 0xe, 0xac, 0xa5, 0xda, 0x9f, 0x14, 0x69, 0xb1, 0x3a, 0x4d, 0x99, 0x7f, 0x3f, 0x54, 0x9c, 0x43, 0x8b, 0xd5, 0x96, 0xeb, 0xd3, 0x3c, 0x8d, 0xaa, 0xa6, 0x85, 0x79, 0x10, 0x72, 0x3d, 0xc, 0xb, 0xdc, 0x6f, 0xbe, 0x3b, 0x6d, 0x58, 0xd8, 0xb2, 0x49, 0x73, 0xef, 0x1, 0xca, 0x96, 0x8d, 0x4d, 0x2b, 0x74, 0x2d, 0xf4, 0x16, 0x9b, 0x56, 0xb6, 0xed, 0x62, 0xf3, 0x80, 0x6d, 0x3b, 0x1b, 0x97, 0xc7, 0x18, 0xbf, 0xd7, 0x4b, 0x61, 0x5d, 0xa5, 0x8c, 0xcb, 0x88, 0x75, 0xdb, 0x64, 0x89, 0x86, 0x1, 0xeb, 0x36, 0x62, 0x5e, 0x57, 0xac, 0xb1, 0x49, 0xc2, 0xbc, 0x8e, 0xd8, 0xf7, 0x15, 0xf, 0x87, 0x79, 0xa0, 0xfe, 0x5f, 0xb4, 0xef, 0xfb, 0x13, 0x60, 0xe8, 0x3e, 0xc2, 0xd1, 0x7d, 0x88, 0xa5, 0xfb, 0x18, 0x4f, 0x22, 0xc8, 0xb4, 0x3a, 0x3d, 0xc8, 0xb4, 0x6a, 0x4, 0x99, 0xba, 0x8e, 0x72, 0x8d, 0xcf, 0x15, 0x66, 0xdb, 0xfd, 0x29, 0xcc, 0xb6, 0xb9, 0xeb, 0x67, 0x9c, 0xaf, 0x7d, 0xa0, 0xf1, 0x23, 0x1d, 0x68, 0xec, 0x73, 0xa4, 0xb3, 0x4e, 0xec, 0x4, 0x42, 0xad, 0x7d, 0x8f, 0xf5, 0x76, 0x1f, 0x6c, 0xbe, 0x80, 0x68, 0x77, 0xf7, 0xe1, 0xf6, 0x3, 0x93, 0xb6, 0xf1, 0xfe, 0x49, 0x76, 0x6e, 0x8a, 0xba, 0x35, 0x9b, 0x97, 0x22, 0xfb, 0xf, 0xa6, 0xb7, 0xf9, 0xe7, 0x9, 0xe4, 0xc9, 0x4f, 0x3c, 0xae, 0xe2, 0x23, 0x97, 0xb, 0xf8, 0xcc, 0xa7, 0xe2, 0x26, 0xfd, 0xa1, 0x53, 0x9b, 0x53, 0xd7, 0xf3, 0x4f, 0xbd, 0x6, 0x6, 0x6, 0x6, 0xae, 0x8a, 0x2f, 0x2e, 0x60, 0x3a, 0x41, 0x7b, 0x3f, 0x8e, 0x53, 0x0, 0x0, 0x0, 0x0, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, 0x00 }; +const unsigned char defaultDialogIcon6Name[] = { 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x00 }; +const unsigned char defaultDialogIcon6Length[] = { 0x39, 0x33, 0x30, 0x00 }; +const unsigned char defaultDialogIcon6Data[] = { 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 0x0, 0x0, 0x0, 0xd, 0x49, 0x48, 0x44, 0x52, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x40, 0x8, 0x3, 0x0, 0x0, 0x0, 0x9d, 0xb7, 0x81, 0xec, 0x0, 0x0, 0x0, 0x96, 0x50, 0x4c, 0x54, 0x45, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0xb, 0xcd, 0x2a, 0x0, 0x0, 0x0, 0x31, 0x74, 0x52, 0x4e, 0x53, 0x0, 0xf9, 0x1c, 0xe6, 0xb1, 0x4d, 0x3b, 0x17, 0xc9, 0xad, 0x49, 0x6, 0x8f, 0x40, 0xf6, 0xe3, 0xe0, 0xc1, 0x20, 0x11, 0x62, 0x54, 0x34, 0x30, 0x2b, 0x5d, 0xd6, 0xd0, 0x98, 0x76, 0x65, 0xb, 0x9b, 0x92, 0x6d, 0x2, 0x9, 0x3, 0x9c, 0xb5, 0x9d, 0xed, 0xe8, 0xbb, 0x79, 0xdc, 0x83, 0x71, 0x9f, 0x7a, 0xba, 0x9d, 0xd4, 0x0, 0x0, 0x2, 0x8a, 0x49, 0x44, 0x41, 0x54, 0x58, 0xc3, 0xec, 0x53, 0xdb, 0x62, 0x82, 0x30, 0xc, 0x5d, 0xcb, 0x5d, 0x51, 0x10, 0x10, 0x11, 0x1, 0x2f, 0xa8, 0x88, 0x9b, 0x3a, 0xfe, 0xff, 0xe7, 0xa6, 0x69, 0x9, 0x2d, 0x97, 0xa9, 0xf, 0x7b, 0x5b, 0x9e, 0x48, 0xd2, 0x13, 0x92, 0x73, 0x92, 0x8f, 0x7f, 0xfb, 0x53, 0xcb, 0x69, 0xa8, 0x5, 0x69, 0x1a, 0x68, 0x21, 0xcd, 0xdf, 0x47, 0x1b, 0x9a, 0x6d, 0x3a, 0xa4, 0x2, 0x23, 0x8e, 0x69, 0x6b, 0xc6, 0x5b, 0x70, 0x3d, 0x71, 0xab, 0x96, 0xb9, 0x89, 0xfe, 0x32, 0x7c, 0xa2, 0x92, 0xaa, 0xc7, 0x88, 0x3a, 0x79, 0x9, 0xee, 0x1d, 0x11, 0xde, 0x29, 0x71, 0xf4, 0x9e, 0xe3, 0x35, 0x57, 0x44, 0x28, 0x71, 0xac, 0x10, 0x71, 0x10, 0xed, 0x19, 0x7e, 0x37, 0xad, 0xdf, 0x2a, 0x56, 0xa6, 0x47, 0xd4, 0xf7, 0x69, 0xa4, 0x67, 0x96, 0x52, 0x47, 0xa7, 0xbb, 0x5f, 0xe1, 0xeb, 0x2d, 0xce, 0x3b, 0xa7, 0x62, 0x82, 0xce, 0x91, 0x97, 0xed, 0x7a, 0x18, 0xbf, 0xb7, 0xf8, 0xa3, 0xd9, 0xa8, 0x9b, 0x1c, 0xcd, 0x78, 0xd2, 0xda, 0xf, 0x16, 0xd8, 0xf2, 0xe6, 0x97, 0xe3, 0xbe, 0xec, 0x78, 0xa9, 0xf0, 0x1e, 0x6, 0xe7, 0x67, 0xf9, 0xd5, 0x62, 0xe8, 0xc1, 0x62, 0xc5, 0x5e, 0xc, 0xf0, 0x30, 0x62, 0xfc, 0xa9, 0x46, 0x3, 0x48, 0x2d, 0xd3, 0x54, 0xbf, 0x9a, 0x82, 0x86, 0xca, 0x98, 0x1c, 0xf5, 0xea, 0xef, 0x30, 0x3c, 0x72, 0x44, 0x37, 0x53, 0xce, 0xfc, 0xb7, 0x87, 0x2c, 0xb3, 0xa, 0x4e, 0xdf, 0x3e, 0x9c, 0x58, 0xff, 0xf8, 0xff, 0x30, 0xae, 0xd0, 0x2e, 0x3a, 0x56, 0x65, 0x53, 0x9c, 0x7a, 0xf6, 0x97, 0x0, 0x7f, 0xd8, 0x6e, 0xe4, 0x20, 0x5c, 0x8a, 0x2f, 0x80, 0x49, 0xd2, 0xd9, 0xea, 0x3, 0xeb, 0x6d, 0x89, 0x94, 0x33, 0xd1, 0xd0, 0x4c, 0xd4, 0x6e, 0xc9, 0x26, 0x3d, 0xb4, 0xef, 0x8f, 0x80, 0xfe, 0xa8, 0xdf, 0x9c, 0x2f, 0x84, 0x6d, 0xf3, 0x4a, 0x1, 0x2e, 0xb, 0x4, 0x48, 0xfb, 0x36, 0x13, 0x88, 0x36, 0xec, 0x16, 0xe0, 0xdf, 0xee, 0x5, 0xc7, 0x37, 0x56, 0x3b, 0x47, 0xb5, 0xc0, 0x4f, 0x64, 0xbc, 0xe1, 0x42, 0x5f, 0xe8, 0xd3, 0xf2, 0xe1, 0x6f, 0x98, 0xb3, 0x79, 0x7c, 0x97, 0x48, 0x7c, 0xe, 0xd3, 0xba, 0x86, 0x7c, 0x83, 0xd0, 0xe6, 0x1c, 0xfd, 0x10, 0x14, 0x9c, 0x20, 0xbf, 0xd8, 0x73, 0x33, 0x9e, 0x7c, 0x97, 0x36, 0x50, 0x4d, 0x65, 0x4d, 0x4a, 0xfe, 0x13, 0xf, 0xaa, 0x35, 0xe3, 0x51, 0x10, 0xc2, 0x96, 0xd6, 0xdc, 0x84, 0x2b, 0x11, 0x46, 0xba, 0xdc, 0xfd, 0x62, 0xcc, 0x87, 0x6e, 0xb3, 0x66, 0x81, 0x2e, 0xe2, 0xc1, 0x50, 0x10, 0x3d, 0x13, 0xd7, 0xc2, 0x2c, 0xb, 0x8f, 0x2b, 0xc, 0x84, 0x9e, 0x85, 0x99, 0x33, 0xd8, 0x46, 0xf1, 0xde, 0x43, 0x20, 0x56, 0x97, 0x9a, 0xf2, 0xf3, 0x7a, 0xa3, 0xd9, 0x11, 0x8b, 0x9a, 0x43, 0x4b, 0x61, 0x9b, 0x43, 0x12, 0xa1, 0x8f, 0x16, 0x5d, 0x8b, 0x33, 0xbb, 0x87, 0x50, 0x8c, 0x92, 0x36, 0x8b, 0x1, 0x72, 0xd8, 0xc2, 0x3, 0x5d, 0xb8, 0xfc, 0x32, 0x8b, 0x81, 0x10, 0x49, 0x1f, 0x81, 0xd8, 0xef, 0x14, 0xb8, 0xd6, 0xf8, 0x4f, 0x49, 0x75, 0x1f, 0xee, 0x2c, 0x7d, 0xa1, 0xc0, 0x4f, 0xfb, 0x65, 0xaf, 0x2, 0x20, 0xc, 0xc4, 0xe0, 0xb5, 0xae, 0xfe, 0xc, 0x22, 0x88, 0x8b, 0xe, 0xda, 0xf7, 0x7f, 0x3e, 0xb5, 0x20, 0xd1, 0x7e, 0x48, 0x87, 0xe0, 0x66, 0x36, 0x15, 0x5a, 0x9b, 0xde, 0x25, 0xb9, 0xe5, 0x52, 0xb1, 0xf4, 0x9, 0xb, 0x94, 0x8f, 0x30, 0x25, 0x6e, 0x86, 0x51, 0x37, 0x86, 0x23, 0x80, 0x44, 0x2e, 0x50, 0x49, 0x86, 0x41, 0x22, 0xae, 0x11, 0xb, 0xa0, 0x6d, 0x70, 0x8d, 0x28, 0x24, 0x70, 0xb0, 0xe8, 0x99, 0x85, 0xc4, 0x52, 0x46, 0x8b, 0xa8, 0xe8, 0x51, 0xca, 0x6c, 0x26, 0x8, 0xb5, 0xba, 0x48, 0x40, 0x33, 0xb1, 0x9d, 0x85, 0x36, 0x4, 0x91, 0xcd, 0x76, 0xa6, 0xa0, 0x0, 0x73, 0xa6, 0x7d, 0x10, 0x14, 0x48, 0x5a, 0x11, 0x94, 0x34, 0x8a, 0xaa, 0xd0, 0xf4, 0x7d, 0x5e, 0x9f, 0x14, 0x55, 0xca, 0xba, 0xe8, 0xa, 0x7, 0xdb, 0x19, 0xb5, 0x90, 0x75, 0x1a, 0x8b, 0x10, 0xcf, 0x77, 0xf1, 0x69, 0xb0, 0x2b, 0x8d, 0x85, 0xd6, 0xc6, 0x3a, 0x80, 0xb5, 0x15, 0xcc, 0x55, 0xbf, 0xa5, 0xcd, 0x60, 0xae, 0xef, 0xf6, 0x2e, 0x74, 0xdb, 0xd6, 0xdd, 0xf7, 0x97, 0xbd, 0x7b, 0x1, 0xc3, 0x8d, 0x38, 0x76, 0xc8, 0x72, 0x63, 0x9e, 0x19, 0x34, 0xdd, 0xa8, 0xeb, 0x85, 0xed, 0xa9, 0x36, 0xe3, 0xbe, 0x39, 0x70, 0x98, 0x23, 0x8f, 0x39, 0x74, 0xfd, 0xf8, 0x12, 0x3b, 0xca, 0x8, 0xb2, 0x9d, 0xe6, 0x23, 0xa2, 0x27, 0x0, 0x0, 0x0, 0x0, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, 0x00 }; +const unsigned char defaultDialogIcon7Name[] = { 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x32, 0x78, 0x00 }; +const unsigned char defaultDialogIcon7Length[] = { 0x31, 0x35, 0x33, 0x38, 0x00 }; +const unsigned char defaultDialogIcon7Data[] = { 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 0x0, 0x0, 0x0, 0xd, 0x49, 0x48, 0x44, 0x52, 0x0, 0x0, 0x0, 0x80, 0x0, 0x0, 0x0, 0x80, 0x8, 0x3, 0x0, 0x0, 0x0, 0xf4, 0xe0, 0x91, 0xf9, 0x0, 0x0, 0x0, 0x9c, 0x50, 0x4c, 0x54, 0x45, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf8, 0x8d, 0x4c, 0xde, 0x0, 0x0, 0x0, 0x33, 0x74, 0x52, 0x4e, 0x53, 0x0, 0xfb, 0x42, 0x2, 0xa, 0x62, 0xb7, 0x82, 0xe6, 0x95, 0xe, 0x5, 0xb2, 0x19, 0x2b, 0xef, 0xe2, 0x3b, 0xd9, 0x4e, 0xc6, 0xf6, 0xbe, 0x55, 0x48, 0x91, 0x67, 0x33, 0x6c, 0x27, 0x23, 0xc2, 0xba, 0x20, 0x14, 0xd4, 0xa8, 0x89, 0x71, 0x38, 0xea, 0xd1, 0xcb, 0x8c, 0x7b, 0x52, 0x9c, 0xde, 0xa3, 0x88, 0x5c, 0x25, 0x3a, 0xec, 0xc2, 0x0, 0x0, 0x4, 0xe2, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xec, 0x97, 0xdb, 0x76, 0xb2, 0x30, 0x10, 0x85, 0x87, 0x70, 0x52, 0x11, 0x1, 0x1, 0x6b, 0x55, 0xea, 0x59, 0xeb, 0xa1, 0x6a, 0x3b, 0xef, 0xff, 0x6e, 0xff, 0xc5, 0xbf, 0x96, 0x24, 0x30, 0x61, 0x0, 0x6d, 0xaf, 0xfc, 0x6e, 0x61, 0x85, 0x64, 0xcf, 0xec, 0xd9, 0x1, 0x5e, 0xbc, 0x78, 0xf1, 0xe2, 0x45, 0x7b, 0x2c, 0x3f, 0x9b, 0x8a, 0x38, 0x16, 0xd3, 0xcc, 0xb7, 0xe0, 0x6f, 0xe9, 0x89, 0x59, 0x77, 0x11, 0xa2, 0x44, 0xb8, 0xe8, 0xce, 0x44, 0xf, 0xfe, 0x2, 0x4f, 0xb8, 0x89, 0x81, 0x24, 0x46, 0xe2, 0xa, 0xf, 0x7e, 0x15, 0x73, 0xbc, 0x49, 0xb1, 0x92, 0x74, 0x33, 0x36, 0xe1, 0xb7, 0x18, 0x9c, 0x3a, 0x58, 0x83, 0xce, 0x69, 0x0, 0xbf, 0x41, 0xe4, 0x60, 0x6d, 0x9c, 0x8, 0x9e, 0x8d, 0x18, 0x61, 0x23, 0x46, 0xe2, 0xb9, 0xe2, 0x8f, 0xb0, 0x31, 0xa3, 0xe7, 0x15, 0xc2, 0xda, 0x1a, 0xd8, 0x2, 0x63, 0x6b, 0xc1, 0x53, 0x88, 0x43, 0x6c, 0x49, 0x18, 0x3f, 0xc3, 0x79, 0x27, 0x7c, 0x80, 0xed, 0xc3, 0x9e, 0xec, 0xf5, 0xb5, 0xa, 0x87, 0xc7, 0x7e, 0xf7, 0x6c, 0xdb, 0xe7, 0x6e, 0xff, 0x18, 0x6a, 0x6b, 0xd4, 0x7f, 0x70, 0x3c, 0x7e, 0xac, 0x91, 0xe2, 0xe0, 0xee, 0x7d, 0x53, 0xd1, 0xc9, 0xdf, 0xbb, 0x7, 0xa4, 0x58, 0x7f, 0x3c, 0x64, 0xbe, 0x4f, 0xe2, 0xe4, 0xf3, 0xdd, 0x12, 0x48, 0x96, 0xbb, 0x39, 0xa1, 0xc4, 0xa7, 0x80, 0xd6, 0x4c, 0xca, 0xeb, 0x39, 0xf6, 0xa, 0x2a, 0x58, 0xd9, 0x4e, 0x79, 0xc7, 0x93, 0xb6, 0xb1, 0xd3, 0xc5, 0x22, 0x49, 0x4, 0x2c, 0x51, 0x82, 0x45, 0xde, 0xbd, 0x56, 0xdf, 0x2f, 0x9d, 0x65, 0xf8, 0x5, 0xb5, 0xf8, 0x1a, 0x96, 0x74, 0x6b, 0xb3, 0x83, 0xe2, 0xf9, 0x3b, 0x93, 0xda, 0xab, 0x78, 0x93, 0x4e, 0x51, 0x83, 0x16, 0xf5, 0x2f, 0x14, 0xd2, 0xb5, 0xa0, 0x1, 0x96, 0x6b, 0xa0, 0x42, 0xe3, 0x3e, 0x10, 0xea, 0x2, 0x81, 0x68, 0xbc, 0x40, 0xa0, 0x1e, 0x40, 0x34, 0xf4, 0xbf, 0xea, 0xbf, 0x61, 0xb, 0x33, 0x7f, 0xc, 0x55, 0x37, 0x2e, 0x1b, 0xcd, 0xbf, 0xb5, 0xda, 0x43, 0xbd, 0x56, 0x43, 0xd4, 0x51, 0x27, 0x52, 0x83, 0x45, 0x4c, 0x75, 0xfe, 0x9e, 0x4c, 0x8d, 0xe7, 0x6f, 0xa3, 0x61, 0x9a, 0x5e, 0xe7, 0x9b, 0x99, 0x4f, 0x2f, 0xf3, 0xae, 0x4e, 0xe5, 0xfa, 0xb9, 0xb0, 0x55, 0xaa, 0x67, 0x93, 0x8b, 0xdb, 0xca, 0xd4, 0x3b, 0xce, 0x48, 0x8b, 0xd8, 0x86, 0x92, 0x4c, 0xb5, 0xf3, 0x17, 0x65, 0xc8, 0xef, 0x8f, 0x4b, 0x19, 0x71, 0x7d, 0x23, 0x77, 0x80, 0x32, 0x71, 0x4d, 0xb, 0x85, 0x94, 0x83, 0xf9, 0x88, 0x9c, 0x53, 0x85, 0x50, 0xaa, 0x10, 0x5a, 0xcd, 0xb, 0xe0, 0x98, 0xb5, 0x23, 0x12, 0xc3, 0x29, 0x51, 0x2a, 0xa5, 0x13, 0xbf, 0xa1, 0x6, 0x3, 0x43, 0xf6, 0x1f, 0xd1, 0xba, 0xd3, 0x0, 0x35, 0xa4, 0x82, 0x50, 0x4b, 0x76, 0xa3, 0x31, 0x0, 0x9e, 0x11, 0xe6, 0x4, 0x84, 0xff, 0xfd, 0xe, 0x6a, 0x9, 0x32, 0x42, 0x2f, 0x79, 0xbf, 0x23, 0x60, 0x11, 0xcc, 0xf8, 0xb2, 0x8e, 0x58, 0xc1, 0x70, 0xc5, 0xc, 0x55, 0xd1, 0x48, 0x0, 0x97, 0xc9, 0x28, 0x82, 0xd, 0x94, 0x71, 0x9b, 0x48, 0x10, 0xc9, 0xf9, 0x47, 0x34, 0x6d, 0x66, 0x60, 0x35, 0x7b, 0x42, 0x34, 0x79, 0xae, 0x47, 0x50, 0x8d, 0xc3, 0x24, 0x58, 0xc1, 0x80, 0x69, 0x92, 0xa4, 0x5, 0x33, 0x42, 0x99, 0x99, 0x6c, 0x2b, 0xc6, 0x2, 0x72, 0x3d, 0x3d, 0xc2, 0x1, 0x6a, 0xca, 0xf, 0x4c, 0x0, 0x73, 0x20, 0x79, 0x9d, 0xae, 0xb2, 0x27, 0x3b, 0xa1, 0xda, 0x8, 0x27, 0xcc, 0xa1, 0xee, 0x3f, 0xdf, 0xf2, 0xec, 0xbb, 0x7f, 0x4a, 0x5c, 0x31, 0xe7, 0x42, 0xdd, 0x91, 0xe4, 0x64, 0xa9, 0x4c, 0x21, 0xc9, 0x62, 0x9, 0x10, 0x48, 0x47, 0x9, 0x7c, 0xc9, 0x9a, 0x81, 0xd4, 0x39, 0x54, 0xe6, 0x24, 0xc4, 0x73, 0x8a, 0x31, 0xd3, 0x2d, 0x19, 0xe6, 0xfc, 0x80, 0xc4, 0x8f, 0xdc, 0x86, 0x4c, 0x6f, 0x8f, 0x41, 0xcf, 0x86, 0x69, 0x96, 0x37, 0xed, 0xf3, 0x5, 0x73, 0xfb, 0x72, 0x64, 0xa7, 0x6a, 0xf1, 0x52, 0x26, 0x4, 0x77, 0x78, 0x67, 0xa7, 0x7d, 0xe2, 0x32, 0xb1, 0x98, 0x7a, 0x75, 0xa6, 0xa0, 0xb1, 0x62, 0x7a, 0x34, 0xd2, 0x6a, 0x7c, 0x1, 0x82, 0x95, 0x51, 0x67, 0x1a, 0xba, 0xb2, 0x9d, 0x29, 0x6e, 0xf9, 0x6, 0xad, 0x42, 0xe6, 0x48, 0x37, 0x1f, 0xa0, 0x98, 0x93, 0x12, 0xe9, 0x7b, 0x75, 0xc7, 0xec, 0x70, 0xad, 0x1f, 0x20, 0x1b, 0x60, 0xaa, 0x97, 0x80, 0x86, 0x9e, 0x24, 0xd3, 0x92, 0x76, 0x89, 0x56, 0x67, 0x9b, 0xfb, 0x9, 0x59, 0xa2, 0xa4, 0x1e, 0xdf, 0x2, 0x7, 0xc8, 0xa1, 0x9a, 0x3d, 0x58, 0xea, 0x33, 0xea, 0xc, 0x24, 0x7, 0xbe, 0x9, 0x66, 0x7c, 0x99, 0xfc, 0xff, 0xcb, 0x4, 0x31, 0xa8, 0x64, 0xa9, 0xb4, 0x3c, 0xdb, 0x60, 0x33, 0xfe, 0x6f, 0x70, 0xaf, 0x75, 0xea, 0x79, 0x1e, 0xac, 0x2f, 0xc5, 0xf3, 0x9b, 0x47, 0x5e, 0xe0, 0x3d, 0xde, 0xe9, 0x6a, 0xf5, 0xbd, 0xe3, 0x43, 0x13, 0xac, 0x1b, 0xe6, 0x2c, 0x74, 0xe2, 0xf1, 0xaf, 0x84, 0xf9, 0x29, 0x4c, 0x68, 0x40, 0x74, 0x45, 0xe4, 0xb, 0x6c, 0xe6, 0x2d, 0x1e, 0x6a, 0xce, 0x81, 0xc4, 0x1b, 0xc, 0x56, 0xb4, 0xbb, 0xd, 0x51, 0x66, 0x1, 0x3a, 0xa4, 0xa0, 0xb3, 0x38, 0x8d, 0x8e, 0x50, 0x8b, 0xde, 0xc5, 0xc0, 0x22, 0x53, 0xd0, 0x71, 0xe4, 0x2a, 0x9c, 0xa9, 0xc3, 0x8c, 0xa7, 0x77, 0xe5, 0xef, 0x84, 0xf4, 0x65, 0x2a, 0x3, 0x8a, 0xa9, 0xda, 0xa6, 0x3c, 0x17, 0x2c, 0x61, 0x64, 0xa0, 0xa5, 0xcb, 0xc9, 0x24, 0x94, 0x59, 0xc2, 0x63, 0x95, 0xf5, 0x4f, 0xab, 0xb2, 0xfe, 0xcc, 0x35, 0x6a, 0xac, 0x64, 0x31, 0x4f, 0x54, 0xf1, 0x67, 0xc4, 0x24, 0x72, 0xfc, 0x94, 0xd, 0xbc, 0x61, 0x81, 0xe0, 0x5f, 0xfb, 0x76, 0xb3, 0x9a, 0x30, 0x14, 0x44, 0x1, 0xb8, 0x12, 0x17, 0x37, 0x20, 0x95, 0x2e, 0xa, 0xa6, 0x75, 0xd1, 0xa, 0x5, 0x37, 0x95, 0xd6, 0xf7, 0x7f, 0xb8, 0x62, 0x11, 0x5, 0xaf, 0xf1, 0x53, 0xc7, 0x9f, 0x1b, 0xc9, 0x59, 0x67, 0x31, 0x9a, 0xcc, 0xdf, 0x39, 0x67, 0x5e, 0x9e, 0x2, 0x1, 0xe8, 0x15, 0x38, 0x80, 0x71, 0x5b, 0xf9, 0xf4, 0x2b, 0xf0, 0x47, 0xe8, 0x0, 0x6, 0x8b, 0x19, 0x9e, 0xc7, 0x47, 0x88, 0x34, 0x44, 0x0, 0xaf, 0x3f, 0x6d, 0xf9, 0xef, 0x34, 0x74, 0x21, 0x72, 0x0, 0xd, 0x8, 0x28, 0x14, 0x22, 0x95, 0x62, 0x7, 0x90, 0xd1, 0x33, 0x2a, 0xc5, 0x6e, 0x46, 0xa1, 0x0, 0xdc, 0x8c, 0xdc, 0x8e, 0x43, 0x1, 0xb8, 0x1d, 0x7b, 0x20, 0x9, 0x5, 0xe0, 0x81, 0xc4, 0x23, 0x59, 0x2c, 0x0, 0x8f, 0x64, 0x1e, 0x4a, 0x8d, 0xef, 0x3, 0x8b, 0xb4, 0x87, 0x52, 0x8f, 0xe5, 0xc4, 0x33, 0xf2, 0x1a, 0x63, 0x39, 0x17, 0x13, 0xa2, 0x1a, 0x6f, 0x8a, 0x70, 0x96, 0x34, 0x5e, 0x4c, 0xbc, 0x9a, 0x19, 0x6f, 0xe8, 0x5d, 0x58, 0xcd, 0xb8, 0x9c, 0x1a, 0x35, 0x3a, 0x7, 0x96, 0x53, 0xae, 0xe7, 0xc6, 0x64, 0x94, 0xd2, 0x68, 0x82, 0x87, 0xb0, 0x9e, 0x83, 0xa0, 0x8, 0x40, 0x4, 0x85, 0x29, 0x9a, 0x10, 0x4c, 0xd1, 0x98, 0xa4, 0x8a, 0xc1, 0x24, 0x95, 0x69, 0xba, 0x18, 0x4c, 0xd3, 0x99, 0xa8, 0xc, 0xc1, 0x44, 0xa5, 0xa9, 0x5a, 0x61, 0xb6, 0xac, 0xeb, 0x25, 0x12, 0x16, 0x54, 0x2d, 0xc8, 0x6a, 0x64, 0x61, 0xfa, 0x7f, 0x4c, 0x79, 0x38, 0x9c, 0x83, 0x45, 0x4, 0x5d, 0xdf, 0x8a, 0xf7, 0xc1, 0xba, 0x68, 0x61, 0x1e, 0x4, 0x5d, 0xf, 0xc1, 0x2, 0xfd, 0xd, 0xbd, 0x53, 0x82, 0x85, 0x25, 0x1b, 0x8c, 0x38, 0x18, 0xa0, 0x2c, 0xd9, 0x58, 0xb4, 0x42, 0xd5, 0x42, 0x6d, 0xb1, 0x68, 0x65, 0xd9, 0xe, 0x29, 0x8b, 0xd4, 0xa2, 0x6c, 0x67, 0xe1, 0x32, 0x36, 0xf, 0x58, 0xb8, 0xb4, 0x74, 0x8b, 0x79, 0x20, 0x2b, 0x18, 0x90, 0x6e, 0x3, 0xe2, 0x75, 0x86, 0x45, 0xc6, 0x9a, 0x42, 0xbc, 0x3e, 0x53, 0xbe, 0x6f, 0xaa, 0xd6, 0xff, 0x6a, 0x35, 0xf, 0x64, 0xbf, 0xb, 0xf2, 0xfd, 0xed, 0xc, 0xc, 0x1f, 0x3b, 0x6, 0x86, 0x2e, 0x59, 0x38, 0xee, 0x6f, 0x62, 0xb9, 0xbf, 0x8d, 0x67, 0x8f, 0x91, 0x69, 0x7a, 0xbc, 0x91, 0x69, 0x3a, 0x87, 0x91, 0xe9, 0x6, 0x56, 0x2e, 0x27, 0x80, 0x23, 0x68, 0x2e, 0x67, 0x66, 0xeb, 0xa6, 0x9d, 0xaf, 0x0, 0x43, 0xe3, 0x45, 0x2c, 0x9d, 0x9f, 0x57, 0x33, 0xb5, 0xa6, 0xad, 0xa9, 0x35, 0xc1, 0xd4, 0x1a, 0x41, 0xf5, 0x15, 0xb3, 0xf5, 0x76, 0xdf, 0xd8, 0x1c, 0xb0, 0x76, 0xff, 0xae, 0x8a, 0xe7, 0x43, 0x98, 0xdb, 0xb, 0xb0, 0xf7, 0x17, 0x70, 0xe0, 0x50, 0xc0, 0x89, 0x47, 0x1, 0x47, 0x2e, 0x5, 0x9c, 0xf9, 0xac, 0x31, 0xdc, 0x7f, 0xe8, 0x74, 0x42, 0xd6, 0x75, 0xfd, 0xd4, 0xab, 0x47, 0x8f, 0x1e, 0x3d, 0x1e, 0xa, 0x7f, 0x3b, 0x1f, 0x29, 0xf, 0xbf, 0x29, 0x8c, 0x32, 0x0, 0x0, 0x0, 0x0, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, 0x00 }; +const unsigned char defaultDialogIcon8Name[] = { 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x2d, 0x64, 0x61, 0x72, 0x6b, 0x00 }; +const unsigned char defaultDialogIcon8Length[] = { 0x38, 0x33, 0x30, 0x00 }; +const unsigned char defaultDialogIcon8Data[] = { 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 0x0, 0x0, 0x0, 0xd, 0x49, 0x48, 0x44, 0x52, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x40, 0x8, 0x3, 0x0, 0x0, 0x0, 0x9d, 0xb7, 0x81, 0xec, 0x0, 0x0, 0x0, 0x78, 0x50, 0x4c, 0x54, 0x45, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, 0xa8, 0xe4, 0xac, 0x0, 0x0, 0x0, 0x27, 0x74, 0x52, 0x4e, 0x53, 0x0, 0x3, 0xfb, 0xa5, 0x7e, 0xc9, 0x8e, 0xeb, 0xb2, 0x1c, 0x13, 0xc, 0x7b, 0xa4, 0x43, 0x92, 0xf6, 0xe1, 0xa0, 0x77, 0x47, 0x25, 0x8, 0xc5, 0xf2, 0xdc, 0xd6, 0xd4, 0x88, 0x6b, 0x51, 0x29, 0x27, 0xe, 0xbe, 0x37, 0x36, 0xbf, 0x58, 0xbe, 0xe, 0x1c, 0x70, 0x0, 0x0, 0x2, 0x4e, 0x49, 0x44, 0x41, 0x54, 0x58, 0xc3, 0xdc, 0x54, 0x6b, 0x8f, 0x82, 0x40, 0xc, 0x64, 0x91, 0xe5, 0xa5, 0x82, 0xf2, 0x46, 0x5e, 0xea, 0x99, 0xf4, 0xff, 0xff, 0xc3, 0x4b, 0xbb, 0x1e, 0x50, 0xea, 0x5, 0x3c, 0xbf, 0x5d, 0xa3, 0x89, 0x3b, 0x9d, 0x19, 0xda, 0x6e, 0xd1, 0xfa, 0xdf, 0xa1, 0xc6, 0xf8, 0x93, 0x58, 0x9c, 0xdf, 0x9, 0x62, 0x7, 0x59, 0xd7, 0xc6, 0x49, 0x12, 0xb7, 0x5d, 0x16, 0x10, 0xf8, 0x8e, 0x5c, 0x45, 0xae, 0x3e, 0xc1, 0x18, 0x27, 0xed, 0x46, 0x88, 0x6e, 0x95, 0x87, 0x69, 0x43, 0x3a, 0xfb, 0x19, 0x74, 0x68, 0xd2, 0x90, 0x92, 0xeb, 0xfa, 0xbd, 0xe3, 0x91, 0x78, 0x74, 0xf8, 0x39, 0x79, 0xce, 0x7e, 0xcd, 0x1, 0xf3, 0x7d, 0x4d, 0x7c, 0xfa, 0x9a, 0x98, 0xce, 0x75, 0x2f, 0x8a, 0x10, 0x7a, 0x17, 0x0, 0x95, 0xa4, 0xae, 0xce, 0xda, 0xf7, 0xf5, 0xb9, 0x2, 0x18, 0x41, 0x97, 0x3b, 0xc8, 0xf2, 0x7d, 0x7a, 0x12, 0x7e, 0xca, 0xc3, 0x23, 0x2c, 0x70, 0x72, 0x45, 0xf8, 0x38, 0x94, 0x4, 0x62, 0xce, 0x9f, 0xb5, 0x21, 0xf5, 0xd7, 0xb, 0xd1, 0xb0, 0xdd, 0x9c, 0xe7, 0x72, 0x1c, 0xc, 0xe5, 0x2e, 0xd7, 0xc9, 0x41, 0xe8, 0x3d, 0xc3, 0xb1, 0xdd, 0x80, 0xed, 0xe, 0xfd, 0xa, 0x5c, 0xdb, 0x64, 0xbd, 0xd1, 0x41, 0xd4, 0xff, 0x7c, 0x7e, 0x39, 0xbc, 0xde, 0xc4, 0x41, 0x3f, 0x6b, 0xf8, 0xad, 0xb, 0xdf, 0x8c, 0xee, 0xa8, 0x26, 0x39, 0xb7, 0x50, 0x47, 0x33, 0x4e, 0xff, 0x75, 0x1, 0xae, 0xd1, 0x3b, 0x6c, 0xce, 0x93, 0x15, 0xc1, 0x8e, 0x71, 0x70, 0x2d, 0x25, 0xf5, 0xbd, 0xa9, 0xcf, 0x61, 0x1a, 0x51, 0x84, 0x63, 0x58, 0xbd, 0x74, 0xd8, 0xd7, 0x80, 0x43, 0x3a, 0xf2, 0x8c, 0xca, 0x32, 0x7e, 0xb6, 0x8e, 0x44, 0xab, 0xf7, 0xa2, 0x0, 0x87, 0x12, 0x5a, 0x31, 0x83, 0xdb, 0x1d, 0xe0, 0x7e, 0x63, 0x3c, 0xa5, 0x89, 0xe8, 0x2c, 0x4b, 0x8, 0xcd, 0xd, 0xe, 0x88, 0x4f, 0xec, 0x3, 0xae, 0xce, 0x81, 0x63, 0x83, 0xb9, 0xcb, 0x70, 0x51, 0x40, 0xa, 0xb6, 0x18, 0xe, 0xd5, 0x8b, 0x5d, 0x71, 0x30, 0x26, 0x6a, 0xba, 0xe8, 0xb5, 0x41, 0xaa, 0x17, 0x2c, 0xb8, 0x3b, 0x44, 0x77, 0xb, 0x30, 0xf0, 0x10, 0x6d, 0x38, 0x18, 0x1, 0x4c, 0x8d, 0x49, 0x3, 0x39, 0x2e, 0x80, 0x8, 0x61, 0xbe, 0x3, 0x76, 0xbe, 0xcd, 0x20, 0xb7, 0xe5, 0x2e, 0x68, 0x64, 0x96, 0xd3, 0x59, 0x18, 0xb0, 0x28, 0x11, 0xd6, 0x73, 0x24, 0x38, 0x1, 0xf0, 0x71, 0x4b, 0x3, 0x7e, 0x39, 0x0, 0xa7, 0x60, 0x86, 0x64, 0x80, 0xf1, 0xd8, 0x6a, 0xf0, 0x45, 0xf4, 0x8c, 0x70, 0x83, 0x74, 0x68, 0x59, 0x85, 0x5b, 0x5b, 0x8, 0x2b, 0x2c, 0xb8, 0x9b, 0x19, 0xb4, 0x48, 0x3c, 0x17, 0x5b, 0xd, 0x8a, 0x33, 0xe2, 0xed, 0xcc, 0x20, 0xa6, 0xa9, 0xa8, 0xad, 0x6, 0x8a, 0x66, 0x1e, 0xcf, 0xc, 0x12, 0x4, 0x7c, 0x6b, 0xab, 0x81, 0xe5, 0x23, 0x9e, 0x7c, 0x6c, 0xf0, 0x71, 0xb, 0xeb, 0x43, 0x94, 0x2f, 0x93, 0x1c, 0xa2, 0xbc, 0x46, 0xf9, 0x3a, 0xaf, 0x5c, 0xa3, 0x5c, 0x24, 0xf9, 0x87, 0xb2, 0xb2, 0x48, 0x72, 0x95, 0x27, 0x72, 0xf4, 0xdd, 0x7d, 0xb9, 0xa3, 0x0, 0xc, 0xc3, 0x30, 0x74, 0xea, 0x9a, 0xe6, 0x73, 0x84, 0x90, 0xf8, 0xfe, 0x37, 0x6c, 0x31, 0x18, 0xf, 0xa2, 0x8, 0xaa, 0x2d, 0x86, 0x40, 0x8, 0x64, 0x31, 0xb6, 0xf4, 0x54, 0xf2, 0xd, 0x47, 0x19, 0x97, 0x9, 0x55, 0xd4, 0xf, 0x5b, 0x26, 0x5c, 0xe7, 0xec, 0x97, 0x77, 0x96, 0xac, 0x33, 0x8, 0x4a, 0xd6, 0x68, 0x6d, 0xc4, 0x1d, 0x5, 0x85, 0x4b, 0xda, 0xb6, 0xb7, 0xf6, 0xa7, 0xa4, 0x71, 0x51, 0xed, 0x56, 0xab, 0x75, 0x22, 0xaa, 0x8a, 0xac, 0x73, 0x63, 0x59, 0x66, 0x8b, 0x18, 0xb, 0xb1, 0xb6, 0x52, 0x88, 0xb5, 0xc9, 0xe6, 0xaa, 0xdb, 0xbb, 0xe, 0x18, 0x88, 0x38, 0xd7, 0x2f, 0xc4, 0xe1, 0x90, 0x75, 0x7, 0x64, 0xf9, 0xc4, 0xb, 0x98, 0x17, 0xff, 0x39, 0x68, 0xce, 0x0, 0xcd, 0x9, 0xa0, 0xa9, 0xa1, 0xae, 0xa, 0xdb, 0x22, 0xee, 0xab, 0x81, 0x43, 0x8c, 0x3c, 0x62, 0xe8, 0x12, 0x63, 0x9f, 0x16, 0x3c, 0x8f, 0xae, 0x7, 0x37, 0xe7, 0x62, 0x42, 0xa9, 0x5c, 0xc2, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, 0x00 }; +const unsigned char defaultDialogIcon9Name[] = { 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x2d, 0x64, 0x61, 0x72, 0x6b, 0x32, 0x78, 0x00 }; +const unsigned char defaultDialogIcon9Length[] = { 0x31, 0x32, 0x37, 0x34, 0x00 }; +const unsigned char defaultDialogIcon9Data[] = { 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 0x0, 0x0, 0x0, 0xd, 0x49, 0x48, 0x44, 0x52, 0x0, 0x0, 0x0, 0x80, 0x0, 0x0, 0x0, 0x80, 0x8, 0x3, 0x0, 0x0, 0x0, 0xf4, 0xe0, 0x91, 0xf9, 0x0, 0x0, 0x0, 0x96, 0x50, 0x4c, 0x54, 0x45, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x25, 0xc5, 0xa8, 0x0, 0x0, 0x0, 0x31, 0x74, 0x52, 0x4e, 0x53, 0x0, 0x55, 0xfb, 0x3, 0xe3, 0xc, 0x43, 0x92, 0x8a, 0xd7, 0xb7, 0x82, 0x62, 0x40, 0x19, 0x48, 0x4e, 0x2b, 0xee, 0xe7, 0x39, 0xbf, 0x21, 0x97, 0x67, 0xb4, 0x33, 0xd0, 0x6c, 0x9, 0xcb, 0xf, 0xc5, 0xb1, 0xf6, 0xc2, 0xbc, 0xa8, 0x71, 0x26, 0x25, 0x14, 0x7, 0xc6, 0x3b, 0x7c, 0x5d, 0x11, 0x7b, 0x95, 0x98, 0x75, 0x67, 0x0, 0x0, 0x3, 0xe2, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xec, 0x96, 0xd9, 0x8e, 0xb3, 0x30, 0xc, 0x85, 0x5d, 0x2, 0x94, 0xb2, 0xb7, 0x65, 0x69, 0xe9, 0xbe, 0x4f, 0xb7, 0x91, 0xf2, 0xfe, 0x2f, 0xf7, 0x4b, 0xbf, 0x46, 0xc2, 0x50, 0x1a, 0x13, 0x12, 0x46, 0x73, 0xd1, 0xef, 0xda, 0xa2, 0x27, 0x3e, 0x3e, 0x76, 0xe1, 0xc3, 0x87, 0xf, 0x1f, 0x3e, 0x74, 0x67, 0x15, 0x5e, 0xa, 0x3b, 0x8e, 0xed, 0xe2, 0x12, 0xae, 0xe0, 0x77, 0xb1, 0xec, 0x65, 0x7e, 0x34, 0x39, 0xc2, 0x3c, 0xe6, 0x4b, 0xdb, 0x82, 0xdf, 0xe0, 0x16, 0x78, 0x77, 0x83, 0x37, 0x62, 0xdc, 0xbd, 0xe0, 0x6, 0xbd, 0xc2, 0xa2, 0xd3, 0x9e, 0xb, 0xd9, 0x9f, 0x22, 0x6, 0x7d, 0x31, 0x76, 0xa6, 0xbc, 0x5, 0x53, 0x67, 0xc, 0x7d, 0xf0, 0x70, 0x79, 0x6b, 0xdc, 0x4, 0x74, 0x63, 0xa7, 0x5c, 0x8a, 0xd4, 0xd6, 0xdb, 0xfc, 0x94, 0x4b, 0x93, 0xea, 0x33, 0xc2, 0x72, 0xc, 0xde, 0x1, 0xc3, 0xd1, 0x94, 0xcb, 0xd8, 0xe4, 0x1d, 0x31, 0x63, 0x50, 0x87, 0x39, 0x5c, 0x1, 0x87, 0x29, 0xb7, 0x7f, 0xfe, 0xb6, 0xc3, 0xe6, 0x7a, 0x97, 0x3f, 0x7d, 0xff, 0x99, 0xef, 0xd6, 0xe6, 0x5b, 0x8f, 0xe6, 0x8a, 0x36, 0x64, 0x23, 0xde, 0xc4, 0xc2, 0x4b, 0x42, 0x6, 0x8, 0x16, 0x26, 0xde, 0x82, 0x37, 0x31, 0xca, 0x40, 0x81, 0x60, 0xd2, 0xf0, 0xf2, 0xc3, 0x39, 0x7b, 0xa3, 0xf6, 0x7c, 0x68, 0xe8, 0xc4, 0x24, 0x80, 0xce, 0xcc, 0x5e, 0xbf, 0xe7, 0xfa, 0x57, 0x10, 0x70, 0xf5, 0xdd, 0x57, 0xc5, 0x33, 0xe8, 0x6, 0x1b, 0xf2, 0x3a, 0xdb, 0x4, 0x48, 0x1e, 0x5b, 0x5e, 0x67, 0xc8, 0x3a, 0xfd, 0xfe, 0xfc, 0xc5, 0xce, 0x96, 0xa9, 0x1a, 0x8c, 0x5e, 0x46, 0xb1, 0x8b, 0x82, 0xfa, 0xfb, 0xa7, 0x33, 0xd6, 0x5a, 0xfb, 0x6c, 0x5a, 0xef, 0x41, 0x7, 0xff, 0x6b, 0x46, 0x7a, 0x96, 0x54, 0x7a, 0xbd, 0xda, 0xf8, 0x48, 0xcf, 0x41, 0x60, 0x54, 0x47, 0xd9, 0x6, 0x49, 0xec, 0x6a, 0x80, 0x8c, 0x40, 0x32, 0xff, 0x93, 0xaa, 0xfb, 0x5f, 0x20, 0xcd, 0xd7, 0xa8, 0xfa, 0x84, 0x4c, 0xaa, 0x83, 0xa3, 0x6a, 0xf6, 0x36, 0xd0, 0x81, 0x8d, 0x5b, 0x7d, 0x84, 0xd5, 0x39, 0x0, 0xe, 0x53, 0xcb, 0xb1, 0x7c, 0x14, 0x9c, 0x8a, 0x7b, 0x3e, 0x74, 0xc6, 0x37, 0x2a, 0xf, 0x81, 0x96, 0xc4, 0x1c, 0xe3, 0x83, 0x2, 0x3e, 0xc7, 0xc4, 0x2d, 0x7, 0xc0, 0x14, 0x24, 0x58, 0x69, 0x9b, 0x98, 0x2b, 0x79, 0x3, 0x5c, 0x6, 0x4a, 0x30, 0x57, 0xda, 0x84, 0x31, 0xf6, 0x6d, 0xb4, 0x11, 0xf, 0xfa, 0xf7, 0x70, 0xf8, 0x4d, 0x94, 0xe0, 0x40, 0x19, 0x63, 0xa0, 0x49, 0x71, 0x78, 0xc5, 0xf9, 0x8f, 0xfe, 0x9b, 0x65, 0x46, 0xe2, 0x7d, 0x80, 0x57, 0x4a, 0xa, 0x24, 0x36, 0x16, 0x6c, 0x83, 0x88, 0xc2, 0xf8, 0x29, 0x2b, 0xc4, 0x5f, 0xc4, 0x2d, 0xb5, 0xa5, 0x1a, 0xe0, 0x81, 0x90, 0x5, 0xff, 0x61, 0xd, 0x42, 0x3c, 0x99, 0x16, 0x3c, 0xf0, 0xfd, 0xb3, 0x40, 0x44, 0x58, 0x56, 0x86, 0xe2, 0x58, 0xe1, 0xdb, 0x98, 0x80, 0x18, 0xb7, 0xfd, 0x5, 0x8b, 0xca, 0xca, 0x8, 0x84, 0x2c, 0x71, 0xac, 0x88, 0x8, 0xe0, 0x4, 0x10, 0x9, 0x1c, 0x94, 0xa5, 0x3, 0x22, 0x8b, 0x38, 0x9, 0xe3, 0xd6, 0x3b, 0x60, 0x0, 0x84, 0x0, 0xe9, 0x52, 0x7a, 0x17, 0x30, 0xe4, 0xd6, 0x16, 0xf4, 0x9, 0x80, 0x3b, 0x9a, 0x2c, 0xd6, 0xce, 0x56, 0x9e, 0xe8, 0x14, 0xf0, 0xe0, 0xed, 0x6, 0xe6, 0x44, 0xd, 0xb, 0x2d, 0x80, 0x1e, 0xee, 0x13, 0xbc, 0xe5, 0xb6, 0xa7, 0x8e, 0x20, 0x2d, 0x80, 0x3e, 0x8b, 0xfb, 0x1b, 0xbc, 0x23, 0x40, 0x4b, 0xf0, 0xaa, 0x57, 0xc0, 0x15, 0xad, 0xc3, 0xa0, 0xcd, 0xca, 0x3a, 0x80, 0x5e, 0x1, 0x70, 0xa8, 0x2c, 0x58, 0x7a, 0x56, 0xcf, 0xba, 0x5, 0x9c, 0x5b, 0xe4, 0xcb, 0x42, 0x6d, 0xca, 0x74, 0xb, 0xc8, 0x90, 0xbd, 0x16, 0x7d, 0x8, 0x17, 0xa0, 0x5b, 0x0, 0x2c, 0xe8, 0x93, 0xb8, 0x44, 0x36, 0x29, 0x8, 0xa0, 0x7, 0x6c, 0x9, 0xcd, 0xe4, 0x68, 0xb, 0xe9, 0x17, 0x90, 0xd0, 0xff, 0x33, 0x8f, 0xe8, 0xbe, 0x2a, 0x8, 0xa0, 0xaf, 0xf7, 0x11, 0x9a, 0x31, 0xcb, 0x31, 0x61, 0xfa, 0x5, 0xb0, 0x72, 0xc4, 0x4d, 0x68, 0x64, 0xc5, 0x51, 0x85, 0x8a, 0x0, 0xf2, 0x7d, 0x7c, 0x45, 0xf5, 0x68, 0xdd, 0x87, 0x80, 0x35, 0xe5, 0xf0, 0xa5, 0x2c, 0xd8, 0xf5, 0x21, 0x60, 0x57, 0xd6, 0x5f, 0xa0, 0x89, 0xa2, 0x2c, 0xc8, 0x95, 0x4, 0xd0, 0x21, 0x2b, 0xa8, 0x53, 0xf4, 0xec, 0x43, 0xc0, 0x93, 0x3a, 0x47, 0x31, 0xba, 0xc5, 0x4a, 0x2, 0xe8, 0x8b, 0x1c, 0xff, 0x4d, 0x1, 0xff, 0xda, 0x37, 0x83, 0x15, 0x4, 0xa1, 0x28, 0x88, 0x1a, 0x12, 0x6e, 0x14, 0x34, 0x5d, 0x24, 0x19, 0xd8, 0x3a, 0x41, 0xff, 0xff, 0xeb, 0xc2, 0xa0, 0x20, 0x31, 0x4f, 0x3a, 0xd2, 0x7d, 0xca, 0x9b, 0xb5, 0xbb, 0xd2, 0x7b, 0x67, 0xee, 0x19, 0xf3, 0x9f, 0xc0, 0xfc, 0x4f, 0x68, 0xfe, 0x1a, 0x9a, 0x7f, 0x88, 0xe0, 0x53, 0xc, 0xd6, 0x4c, 0xf8, 0x14, 0xf3, 0x30, 0x62, 0x73, 0x2a, 0xd, 0x23, 0x1e, 0xc7, 0x6c, 0xcf, 0x85, 0x71, 0xcc, 0xb, 0x9, 0x7, 0x14, 0x59, 0x20, 0x2c, 0x24, 0xb0, 0x92, 0x9, 0x11, 0xd, 0xac, 0x64, 0xca, 0x52, 0xca, 0x21, 0x15, 0x2f, 0xa5, 0xbc, 0x96, 0x4b, 0xe2, 0xb5, 0x9c, 0x8d, 0x89, 0x24, 0x36, 0x26, 0x6c, 0xcd, 0x34, 0xb1, 0x35, 0x63, 0x73, 0x2a, 0x89, 0xcd, 0x29, 0xdb, 0x73, 0x4d, 0x6c, 0xcf, 0x39, 0xa0, 0x60, 0xa5, 0x65, 0x9e, 0x97, 0x90, 0x81, 0x43, 0x40, 0x1, 0x11, 0xd, 0xc, 0x58, 0x18, 0xde, 0x10, 0xd1, 0x60, 0x48, 0x45, 0x3a, 0x43, 0xa0, 0x8, 0x21, 0x95, 0x1c, 0xd3, 0x85, 0xa7, 0x77, 0xa6, 0x1d, 0x2a, 0x31, 0x1d, 0x7, 0x95, 0xfc, 0x6c, 0x36, 0x27, 0xa8, 0x74, 0x3b, 0xaa, 0xd, 0xa, 0x83, 0xb0, 0x5a, 0x8f, 0xeb, 0x2f, 0x33, 0xe2, 0x7a, 0xf7, 0xf, 0x16, 0xe6, 0x27, 0x9b, 0x59, 0x47, 0xab, 0xb6, 0xdf, 0x7, 0xda, 0xe9, 0x47, 0x3e, 0x8f, 0x56, 0x5b, 0x38, 0xdb, 0xd9, 0x1f, 0x2e, 0xcd, 0x4f, 0xb7, 0xf6, 0xc7, 0xeb, 0xe1, 0xf9, 0x3e, 0x5a, 0xeb, 0x7c, 0xff, 0x67, 0x80, 0xa1, 0x1d, 0x2, 0xc, 0x5b, 0x42, 0x38, 0xec, 0x21, 0x16, 0x7b, 0x8c, 0x67, 0x4, 0x64, 0xaa, 0x7e, 0x7, 0x99, 0x2a, 0x0, 0x99, 0x96, 0xa2, 0x5c, 0x7, 0x15, 0xe5, 0xd2, 0x61, 0xb6, 0x26, 0x40, 0x35, 0xf7, 0x11, 0x98, 0x6d, 0x9b, 0x38, 0x9f, 0x3, 0x40, 0xa3, 0x3d, 0xd2, 0x89, 0x50, 0x6b, 0x17, 0xc7, 0xdd, 0x24, 0xd4, 0x7a, 0x3b, 0x6e, 0x1d, 0xeb, 0xb5, 0x7, 0x9b, 0x15, 0xb4, 0xfb, 0xba, 0x17, 0xb8, 0xdd, 0x1, 0xbc, 0xbf, 0x57, 0xb1, 0xb4, 0xe0, 0xb0, 0x9b, 0x8a, 0x87, 0x3, 0x25, 0x97, 0x57, 0xcd, 0xa7, 0xfe, 0x56, 0xf3, 0xa9, 0xa1, 0xe6, 0xb3, 0x66, 0xd1, 0x29, 0x1a, 0x16, 0x9d, 0x22, 0xa1, 0xe8, 0x24, 0x54, 0xbd, 0x92, 0x34, 0x4d, 0x9e, 0x55, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0xaf, 0xc5, 0x7a, 0x0, 0xb3, 0x43, 0xaa, 0xfb, 0xee, 0x9f, 0xf1, 0x9c, 0x0, 0x0, 0x0, 0x0, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, 0x00 }; +const unsigned char defaultDialogIcon10Name[] = { 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x2d, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x00 }; +const unsigned char defaultDialogIcon10Length[] = { 0x37, 0x32, 0x30, 0x00 }; +const unsigned char defaultDialogIcon10Data[] = { 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 0x0, 0x0, 0x0, 0xd, 0x49, 0x48, 0x44, 0x52, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x40, 0x8, 0x3, 0x0, 0x0, 0x0, 0x9d, 0xb7, 0x81, 0xec, 0x0, 0x0, 0x0, 0x75, 0x50, 0x4c, 0x54, 0x45, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x79, 0x59, 0x7d, 0x58, 0x0, 0x0, 0x0, 0x26, 0x74, 0x52, 0x4e, 0x53, 0x0, 0x7, 0xd2, 0xab, 0x12, 0x22, 0x73, 0x50, 0x7d, 0x25, 0xcb, 0xa7, 0xb8, 0x7c, 0x60, 0x2e, 0xfa, 0x8f, 0xeb, 0xe3, 0xd9, 0xc3, 0x9e, 0x84, 0x69, 0x1d, 0xf1, 0xcd, 0xb2, 0x91, 0xb9, 0xed, 0x49, 0x48, 0x36, 0x35, 0x93, 0xf2, 0x7e, 0x13, 0xd0, 0xd1, 0x0, 0x0, 0x1, 0xe4, 0x49, 0x44, 0x41, 0x54, 0x58, 0xc3, 0xed, 0x57, 0xd9, 0x96, 0xc2, 0x20, 0xc, 0x2d, 0x4c, 0x37, 0xb5, 0x8b, 0xb5, 0xda, 0xd5, 0xba, 0xf, 0xff, 0xff, 0x89, 0x73, 0xa, 0x8c, 0xa9, 0x8, 0xd, 0x1e, 0x4e, 0xdf, 0xcc, 0x63, 0x48, 0xd2, 0xe6, 0xde, 0x24, 0x4, 0xef, 0x2b, 0x8b, 0x8a, 0x7f, 0x8b, 0x9a, 0xba, 0xaa, 0xea, 0x26, 0xba, 0xf9, 0x9f, 0x7b, 0x7, 0xe1, 0x81, 0x4d, 0xe4, 0x10, 0x6, 0x9f, 0x78, 0x93, 0x90, 0xb2, 0x37, 0xa1, 0x21, 0xb1, 0xf5, 0xcf, 0x4a, 0xa6, 0x95, 0x32, 0xb3, 0x72, 0xbf, 0x50, 0x66, 0x14, 0x7a, 0xc1, 0xfd, 0x87, 0xa9, 0xc3, 0x8e, 0x26, 0x9, 0xdd, 0x4d, 0x35, 0x5, 0x86, 0xfc, 0xe9, 0x69, 0xba, 0x4e, 0x73, 0x22, 0x21, 0xc9, 0xd3, 0xf5, 0x53, 0x7d, 0x9a, 0x65, 0x64, 0xb5, 0x97, 0x66, 0x5d, 0xda, 0xbe, 0x9e, 0xb4, 0x71, 0x27, 0x8f, 0xf6, 0xab, 0x19, 0xff, 0xb3, 0xb0, 0xd9, 0xe, 0x9a, 0xcf, 0xf8, 0xc3, 0x56, 0x9c, 0x9e, 0x8d, 0x11, 0x7c, 0xf9, 0xfd, 0x75, 0x60, 0x88, 0x2f, 0x13, 0xd9, 0x9b, 0xb2, 0x90, 0xf9, 0x6f, 0x8c, 0x7c, 0x93, 0x8d, 0xb0, 0x48, 0xf4, 0xc7, 0x85, 0x38, 0x4d, 0xe7, 0x40, 0x4a, 0x67, 0xb8, 0xb8, 0x20, 0xfe, 0x42, 0x62, 0x61, 0x75, 0xd5, 0x1c, 0x51, 0xf1, 0xff, 0x6a, 0x4f, 0xa8, 0x78, 0x88, 0x2c, 0xa8, 0xa6, 0x7e, 0x5, 0x7e, 0x4a, 0xfe, 0x47, 0xc6, 0x8e, 0xa, 0xe, 0x2, 0xc9, 0xec, 0xd, 0x9f, 0x92, 0xf3, 0xa7, 0x7c, 0x2f, 0x1a, 0x95, 0x91, 0xc2, 0x5, 0x67, 0xb3, 0x54, 0x91, 0xe, 0x79, 0xdc, 0x41, 0xfd, 0x5f, 0x5d, 0x56, 0xf, 0x6e, 0x1a, 0xea, 0x10, 0xe8, 0x54, 0x82, 0x7f, 0x46, 0xed, 0x8f, 0x5a, 0x2e, 0x9d, 0x6, 0x85, 0x40, 0x32, 0x80, 0x6, 0x0, 0x26, 0x2, 0x4d, 0x6, 0xad, 0x5d, 0x80, 0x56, 0x93, 0xc3, 0x81, 0x53, 0xe0, 0xd9, 0x5, 0xf0, 0x7a, 0x3e, 0xe5, 0x5e, 0xd2, 0x82, 0xc, 0xb0, 0x0, 0x90, 0xc3, 0x14, 0xb0, 0x1b, 0xd7, 0xe4, 0xb6, 0x1, 0x72, 0x6e, 0x7e, 0x57, 0xf9, 0x66, 0xc4, 0x36, 0x0, 0x61, 0x6a, 0x7d, 0x34, 0x7c, 0x7e, 0x79, 0x48, 0x0, 0x10, 0x3e, 0xe5, 0x9a, 0x89, 0xa2, 0x6, 0x66, 0xb1, 0x0, 0x50, 0x35, 0xf5, 0x44, 0x51, 0x41, 0x97, 0x5b, 0x5, 0x48, 0x46, 0x7d, 0xe5, 0x1c, 0xc0, 0x39, 0x5, 0xc, 0x44, 0x68, 0x26, 0x1c, 0x44, 0xa0, 0x11, 0x6f, 0x67, 0xa0, 0x11, 0x29, 0x24, 0x18, 0x28, 0x48, 0x21, 0x29, 0xa5, 0x8c, 0x8c, 0x34, 0x28, 0xe5, 0xad, 0x8f, 0x34, 0x13, 0x8, 0xde, 0x4c, 0xd0, 0xce, 0x6, 0xc1, 0xdb, 0x39, 0x30, 0xe4, 0x90, 0xf5, 0x7d, 0x66, 0x68, 0xc6, 0x0, 0x19, 0x69, 0x80, 0x56, 0x8e, 0x8f, 0x34, 0x18, 0xaa, 0xba, 0xcb, 0xaa, 0xc0, 0x87, 0x2a, 0x8c, 0xf5, 0x95, 0xfd, 0x58, 0xb7, 0xba, 0x58, 0xc8, 0x58, 0x7, 0x4, 0xb9, 0x58, 0x5c, 0xaf, 0x36, 0xf7, 0xcb, 0x55, 0xbd, 0xde, 0x63, 0xb, 0xff, 0xc2, 0x75, 0xc1, 0x58, 0x64, 0xc5, 0xc1, 0x97, 0xac, 0x7, 0x2c, 0x59, 0x16, 0x6b, 0x5e, 0xfc, 0xb6, 0xe6, 0xfd, 0xc2, 0x9a, 0x67, 0xb7, 0x68, 0xf6, 0x31, 0x2c, 0x9a, 0x71, 0xff, 0x54, 0x27, 0xd8, 0xea, 0x5f, 0x60, 0xab, 0x2e, 0x2a, 0xd7, 0xb9, 0x65, 0xfb, 0xea, 0xbe, 0xee, 0xbb, 0x3f, 0x38, 0x96, 0x7f, 0xf2, 0x0, 0x23, 0xf7, 0xff, 0x47, 0xd7, 0xdd, 0xf7, 0xbe, 0xb2, 0xa4, 0xfc, 0x1, 0xb3, 0x34, 0x7e, 0xa8, 0x9d, 0x48, 0x16, 0xe7, 0x0, 0x0, 0x0, 0x0, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, 0x00 }; +const unsigned char defaultDialogIcon11Name[] = { 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x2d, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x32, 0x78, 0x00 }; +const unsigned char defaultDialogIcon11Length[] = { 0x31, 0x32, 0x36, 0x32, 0x00 }; +const unsigned char defaultDialogIcon11Data[] = { 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 0x0, 0x0, 0x0, 0xd, 0x49, 0x48, 0x44, 0x52, 0x0, 0x0, 0x0, 0x80, 0x0, 0x0, 0x0, 0x80, 0x8, 0x3, 0x0, 0x0, 0x0, 0xf4, 0xe0, 0x91, 0xf9, 0x0, 0x0, 0x0, 0x93, 0x50, 0x4c, 0x54, 0x45, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7a, 0x79, 0x23, 0x75, 0x0, 0x0, 0x0, 0x30, 0x74, 0x52, 0x4e, 0x53, 0x0, 0xfb, 0x55, 0x42, 0xc, 0xd7, 0xb7, 0x8a, 0x82, 0x7, 0x19, 0xe5, 0xc0, 0x48, 0x2b, 0x68, 0x62, 0x4e, 0xee, 0x94, 0x39, 0x6f, 0x21, 0xe8, 0xe2, 0xb4, 0x90, 0x33, 0xd0, 0xbd, 0x9, 0xcb, 0x97, 0x3c, 0xf, 0xc5, 0xb1, 0xf6, 0xa8, 0x7c, 0x52, 0x26, 0x25, 0x14, 0xc6, 0x61, 0x5d, 0x11, 0x8d, 0xf, 0xdf, 0x6c, 0x0, 0x0, 0x3, 0xda, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xec, 0x97, 0xd9, 0x72, 0xb3, 0x30, 0xc, 0x85, 0xe5, 0x42, 0xc0, 0x6c, 0x9, 0x94, 0xa5, 0x49, 0xc9, 0xbe, 0xa7, 0x49, 0x3a, 0x7e, 0xff, 0xa7, 0xfb, 0xff, 0x8b, 0xce, 0xd8, 0x10, 0x62, 0xd9, 0xc6, 0x74, 0x7a, 0x91, 0xef, 0x5a, 0x4c, 0xe, 0xd2, 0x39, 0x52, 0x80, 0x17, 0x2f, 0x5e, 0xbc, 0x78, 0x61, 0xce, 0x32, 0xbc, 0xd4, 0x4e, 0x96, 0x39, 0xf5, 0x25, 0x5c, 0xc2, 0xef, 0xe2, 0x3a, 0x65, 0xbe, 0x88, 0x98, 0x40, 0xb4, 0xc8, 0x4b, 0xc7, 0x85, 0xdf, 0x20, 0x70, 0xe8, 0x8d, 0xb0, 0x4e, 0xc8, 0x8d, 0x3a, 0x1, 0xc, 0x4b, 0x72, 0x3c, 0x30, 0x29, 0x87, 0x63, 0x2, 0x83, 0x31, 0xf6, 0x3f, 0x98, 0x2, 0x1f, 0xfe, 0x18, 0x86, 0x60, 0xe3, 0x31, 0x65, 0xbc, 0x2, 0x6c, 0xe3, 0xc4, 0x4c, 0x8b, 0xd8, 0xb1, 0xdb, 0xfc, 0x98, 0x69, 0x13, 0xdb, 0x1b, 0x84, 0xeb, 0x13, 0x66, 0x0, 0xf1, 0x2d, 0xe5, 0x32, 0x9b, 0x32, 0x43, 0xa6, 0x19, 0x58, 0xc0, 0x67, 0x3d, 0xf0, 0xfb, 0xb7, 0x7f, 0xf6, 0xb4, 0xc3, 0xd1, 0x6a, 0xbf, 0x3e, 0xa5, 0xe9, 0x69, 0xbd, 0x5f, 0x45, 0x4f, 0x67, 0x34, 0xeb, 0x39, 0x86, 0x6a, 0xc4, 0xba, 0x98, 0xd3, 0x22, 0x84, 0x6, 0x61, 0x41, 0xe7, 0xac, 0x8b, 0x51, 0xd5, 0x2b, 0x7c, 0xef, 0x1d, 0x6f, 0x1e, 0x97, 0xd5, 0x13, 0xb5, 0x65, 0xdc, 0xd1, 0x89, 0xf7, 0x1e, 0x81, 0x9c, 0x10, 0xd6, 0xc6, 0xbb, 0x5f, 0x41, 0xc2, 0xf5, 0xee, 0x3d, 0x2a, 0x9e, 0x80, 0x19, 0x41, 0xce, 0xda, 0xec, 0xa, 0x40, 0xd9, 0xec, 0x58, 0x9b, 0x3c, 0x30, 0xfa, 0xfd, 0xd9, 0xc3, 0x38, 0xcf, 0xa0, 0xc4, 0x79, 0xf4, 0x60, 0x45, 0x13, 0x5, 0x79, 0xfb, 0xc6, 0x4c, 0x2, 0x65, 0xed, 0x93, 0x8f, 0x76, 0xf, 0xc, 0xe6, 0xdf, 0x1a, 0x24, 0x75, 0xb5, 0xd2, 0x4b, 0x5b, 0xf6, 0xd1, 0xf6, 0x81, 0x43, 0x10, 0x2b, 0x6b, 0x6, 0x88, 0x6c, 0x34, 0xf3, 0xdf, 0x7c, 0x7c, 0xf4, 0x5, 0xda, 0x7c, 0x8d, 0x9a, 0xaf, 0x50, 0x69, 0x75, 0xb0, 0xf9, 0xb0, 0xb7, 0x5, 0x3, 0xb6, 0x5e, 0xf3, 0x25, 0x74, 0x66, 0xd8, 0xc, 0xc0, 0x27, 0x18, 0xf2, 0xd9, 0x8c, 0x82, 0xe1, 0xfd, 0x21, 0x29, 0x18, 0x93, 0x12, 0xa3, 0xcb, 0x94, 0x31, 0x91, 0x14, 0x7a, 0x90, 0x32, 0x91, 0x4c, 0xd1, 0x0, 0x53, 0xa4, 0xff, 0xc6, 0x53, 0x98, 0x2e, 0xf5, 0x7, 0xe0, 0x41, 0x4f, 0x3c, 0xed, 0x21, 0x8c, 0x89, 0x68, 0xdd, 0xad, 0xdc, 0xe8, 0xdf, 0x79, 0xfe, 0x8d, 0x94, 0x88, 0x81, 0x22, 0x63, 0xc0, 0x89, 0xc5, 0xf0, 0xca, 0xf3, 0x9f, 0x44, 0xec, 0x3f, 0x51, 0x22, 0xdf, 0x7, 0xe2, 0x4a, 0x89, 0x1, 0xc5, 0x11, 0x5, 0x3b, 0x20, 0xa3, 0x26, 0x3f, 0x65, 0xb5, 0xfa, 0x52, 0x75, 0xb4, 0x1a, 0x40, 0x41, 0xca, 0x9c, 0xfd, 0xb0, 0x2, 0x29, 0x94, 0x71, 0x16, 0xe8, 0x35, 0x17, 0xef, 0x9f, 0xb, 0x32, 0x42, 0x5e, 0x19, 0xca, 0x63, 0x25, 0xde, 0xc6, 0x2, 0x33, 0xad, 0xfa, 0x5, 0x4b, 0x78, 0x65, 0xa2, 0x7e, 0x59, 0x3d, 0x24, 0x2, 0x62, 0x2, 0x90, 0xfb, 0xff, 0xc6, 0x4b, 0xdf, 0x40, 0x4a, 0x20, 0x26, 0x61, 0xac, 0xbc, 0x3, 0xce, 0x60, 0x4b, 0x0, 0x9c, 0x95, 0x77, 0x81, 0x30, 0xad, 0x1d, 0xd8, 0x13, 0x0, 0x37, 0x5e, 0x1b, 0x29, 0x8e, 0x95, 0x15, 0x36, 0x5, 0x6c, 0x98, 0x9a, 0x61, 0x8e, 0x98, 0x59, 0x70, 0x1, 0xb8, 0xb9, 0x8f, 0x12, 0xb3, 0x1c, 0x78, 0xd9, 0xdd, 0x50, 0x0, 0x7e, 0x16, 0xf, 0x81, 0xca, 0x16, 0x24, 0x57, 0xbb, 0x2, 0xae, 0x44, 0x65, 0x1b, 0x52, 0x7c, 0x69, 0xe3, 0x2, 0xf0, 0xd, 0x4b, 0x55, 0xbc, 0x5a, 0xda, 0x16, 0x50, 0x2a, 0xe4, 0xcb, 0x15, 0xda, 0x54, 0xd9, 0x16, 0x50, 0x9, 0xe3, 0x75, 0x71, 0xb, 0xcc, 0xc1, 0xb6, 0x0, 0x98, 0xb, 0x26, 0xc0, 0xbb, 0x44, 0xed, 0xb, 0xa0, 0xf8, 0x7c, 0x73, 0x61, 0xb, 0xd9, 0x17, 0x50, 0xe0, 0x5f, 0x8a, 0xb, 0xe1, 0xbe, 0xda, 0x17, 0x10, 0xe2, 0x7f, 0xa, 0x22, 0x6e, 0x13, 0xb0, 0x2f, 0x0, 0xb8, 0xc5, 0xa7, 0xd0, 0xc9, 0x12, 0x39, 0x18, 0x7d, 0x5, 0x44, 0xbc, 0x7e, 0x89, 0xf5, 0x68, 0x35, 0x84, 0x80, 0x15, 0x36, 0xe1, 0xb, 0x2f, 0xd8, 0xf, 0x21, 0x60, 0xcf, 0xeb, 0x2f, 0xd0, 0x45, 0xcd, 0xb, 0xd6, 0x43, 0x8, 0x58, 0xf3, 0xfa, 0x1a, 0xdb, 0x43, 0xa7, 0x21, 0x4, 0x9c, 0xb0, 0x4d, 0x94, 0xf1, 0x82, 0xb4, 0x97, 0x0, 0xfc, 0x22, 0x67, 0x7f, 0x53, 0xc0, 0xbf, 0xf6, 0xcd, 0x6e, 0x5, 0x41, 0x20, 0xa, 0xc2, 0x7, 0xea, 0x26, 0xa2, 0x5f, 0x22, 0x4b, 0x2a, 0x92, 0xba, 0x2c, 0xf4, 0xfd, 0x9f, 0x2e, 0xc, 0xa, 0x44, 0xf2, 0x6b, 0x99, 0x85, 0xe3, 0x8a, 0x73, 0x6d, 0x37, 0x95, 0xbb, 0x67, 0xbe, 0x33, 0xe3, 0xfe, 0x13, 0xb8, 0xff, 0x9, 0xdd, 0x5f, 0x43, 0xf7, 0x83, 0x8, 0x8e, 0x62, 0xb0, 0x66, 0xc2, 0x51, 0xcc, 0x97, 0x11, 0x9b, 0x53, 0xe9, 0x32, 0xe2, 0xeb, 0x98, 0xed, 0xb9, 0x70, 0x1d, 0xf3, 0x40, 0xc2, 0x80, 0x62, 0x69, 0xc2, 0x40, 0xd2, 0x31, 0x92, 0xa1, 0x16, 0x87, 0xf7, 0x17, 0xba, 0x30, 0x13, 0x46, 0x32, 0x1a, 0x4a, 0x1, 0x52, 0xe5, 0x39, 0x40, 0x2a, 0x18, 0x4a, 0x61, 0x2c, 0x17, 0x44, 0x63, 0x39, 0x1b, 0x13, 0x49, 0x6c, 0x4c, 0xd8, 0x9a, 0x69, 0x62, 0x6b, 0xc6, 0xe6, 0x54, 0x12, 0x9b, 0x53, 0xb6, 0xe7, 0x9a, 0xd8, 0x9e, 0x33, 0xa0, 0x60, 0x6d, 0x8e, 0x59, 0x76, 0x4, 0x6, 0xe, 0x80, 0x42, 0x40, 0x34, 0x66, 0x57, 0xb8, 0xbc, 0x1, 0xd1, 0xa8, 0x90, 0xca, 0x56, 0x0, 0x14, 0x1, 0x52, 0xc9, 0x98, 0xce, 0xb6, 0x5f, 0xa6, 0x6d, 0xa, 0xa6, 0x63, 0x50, 0xc9, 0xcf, 0x2e, 0x43, 0x40, 0x65, 0xbf, 0x51, 0xad, 0xed, 0x1c, 0x60, 0xb5, 0x8e, 0xeb, 0x4f, 0x1, 0xb8, 0xbe, 0xff, 0xb, 0xb, 0xf7, 0x95, 0x4d, 0xd0, 0xd2, 0xaa, 0xac, 0xe7, 0x81, 0xb2, 0xfb, 0x91, 0xe6, 0xd2, 0x2a, 0x85, 0xb5, 0x9d, 0xff, 0xe2, 0xd2, 0x7d, 0x75, 0xeb, 0xbf, 0xbc, 0xf6, 0x5f, 0xdf, 0xc7, 0x9, 0x30, 0x94, 0xad, 0x0, 0x83, 0x6b, 0x84, 0x23, 0xdb, 0xa7, 0x15, 0x62, 0xf1, 0x8f, 0xf1, 0xf8, 0x7, 0x99, 0xe2, 0x46, 0xb9, 0xa2, 0x85, 0xd9, 0xa, 0x43, 0x15, 0x8f, 0xd6, 0xc7, 0xf2, 0x59, 0xc4, 0x38, 0xdf, 0xba, 0x3b, 0xce, 0xb7, 0x86, 0x38, 0x9f, 0x47, 0xa0, 0xb1, 0x48, 0x39, 0xd2, 0xc9, 0xa1, 0xd6, 0xe7, 0xb3, 0x3b, 0xd4, 0x7a, 0x9f, 0xa6, 0x1e, 0xeb, 0xed, 0x41, 0xb0, 0x59, 0x88, 0x76, 0x5f, 0x86, 0x12, 0x6e, 0xaf, 0x35, 0x39, 0x57, 0x41, 0x3a, 0x4f, 0x2c, 0xb6, 0x76, 0x7a, 0xc1, 0x41, 0xaf, 0x78, 0xcc, 0xab, 0x3f, 0x34, 0x6f, 0x57, 0x3c, 0x86, 0x52, 0x72, 0xf9, 0xd4, 0x7c, 0x6e, 0xbf, 0x6a, 0x3e, 0x37, 0xa8, 0xf9, 0xc4, 0x2d, 0x3a, 0x1d, 0x1a, 0x6f, 0x7c, 0x50, 0xd1, 0x29, 0xfd, 0xaa, 0xd7, 0xa8, 0x51, 0xa3, 0x46, 0xd, 0x4a, 0x2f, 0xb9, 0x87, 0x9d, 0xa4, 0x64, 0xb5, 0x51, 0x8a, 0x0, 0x0, 0x0, 0x0, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, 0x00 }; +const unsigned char *defaultDialogIcons[] = { defaultDialogIcon0Name, defaultDialogIcon0Length, defaultDialogIcon0Data, defaultDialogIcon1Name, defaultDialogIcon1Length, defaultDialogIcon1Data, defaultDialogIcon2Name, defaultDialogIcon2Length, defaultDialogIcon2Data, defaultDialogIcon3Name, defaultDialogIcon3Length, defaultDialogIcon3Data, defaultDialogIcon4Name, defaultDialogIcon4Length, defaultDialogIcon4Data, defaultDialogIcon5Name, defaultDialogIcon5Length, defaultDialogIcon5Data, defaultDialogIcon6Name, defaultDialogIcon6Length, defaultDialogIcon6Data, defaultDialogIcon7Name, defaultDialogIcon7Length, defaultDialogIcon7Data, defaultDialogIcon8Name, defaultDialogIcon8Length, defaultDialogIcon8Data, defaultDialogIcon9Name, defaultDialogIcon9Length, defaultDialogIcon9Data, defaultDialogIcon10Name, defaultDialogIcon10Length, defaultDialogIcon10Data, defaultDialogIcon11Name, defaultDialogIcon11Length, defaultDialogIcon11Data, 0x00 }; diff --git a/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/effectstructs_windows.h b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/effectstructs_windows.h new file mode 100644 index 0000000..8313c45 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/effectstructs_windows.h @@ -0,0 +1,64 @@ +// Credit: https://gist.github.com/ysc3839/b08d2bff1c7dacde529bed1d37e85ccf +#pragma once + +typedef enum _WINDOWCOMPOSITIONATTRIB +{ + WCA_UNDEFINED = 0, + WCA_NCRENDERING_ENABLED = 1, + WCA_NCRENDERING_POLICY = 2, + WCA_TRANSITIONS_FORCEDISABLED = 3, + WCA_ALLOW_NCPAINT = 4, + WCA_CAPTION_BUTTON_BOUNDS = 5, + WCA_NONCLIENT_RTL_LAYOUT = 6, + WCA_FORCE_ICONIC_REPRESENTATION = 7, + WCA_EXTENDED_FRAME_BOUNDS = 8, + WCA_HAS_ICONIC_BITMAP = 9, + WCA_THEME_ATTRIBUTES = 10, + WCA_NCRENDERING_EXILED = 11, + WCA_NCADORNMENTINFO = 12, + WCA_EXCLUDED_FROM_LIVEPREVIEW = 13, + WCA_VIDEO_OVERLAY_ACTIVE = 14, + WCA_FORCE_ACTIVEWINDOW_APPEARANCE = 15, + WCA_DISALLOW_PEEK = 16, + WCA_CLOAK = 17, + WCA_CLOAKED = 18, + WCA_ACCENT_POLICY = 19, + WCA_FREEZE_REPRESENTATION = 20, + WCA_EVER_UNCLOAKED = 21, + WCA_VISUAL_OWNER = 22, + WCA_HOLOGRAPHIC = 23, + WCA_EXCLUDED_FROM_DDA = 24, + WCA_PASSIVEUPDATEMODE = 25, + WCA_USEDARKMODECOLORS = 26, + WCA_LAST = 27 +} WINDOWCOMPOSITIONATTRIB; + +typedef struct _WINDOWCOMPOSITIONATTRIBDATA +{ + WINDOWCOMPOSITIONATTRIB Attrib; + PVOID pvData; + SIZE_T cbData; +} WINDOWCOMPOSITIONATTRIBDATA; + +typedef enum _ACCENT_STATE +{ + ACCENT_DISABLED = 0, + ACCENT_ENABLE_GRADIENT = 1, + ACCENT_ENABLE_TRANSPARENTGRADIENT = 2, + ACCENT_ENABLE_BLURBEHIND = 3, + ACCENT_ENABLE_ACRYLICBLURBEHIND = 4, // RS4 1803 + ACCENT_ENABLE_HOSTBACKDROP = 5, // RS5 1809 + ACCENT_INVALID_STATE = 6 +} ACCENT_STATE; + +typedef struct _ACCENT_POLICY +{ + ACCENT_STATE AccentState; + DWORD AccentFlags; + DWORD GradientColor; + DWORD AnimationId; +} ACCENT_POLICY; + +typedef BOOL (WINAPI *pfnGetWindowCompositionAttribute)(HWND, WINDOWCOMPOSITIONATTRIBDATA*); + +typedef BOOL (WINAPI *pfnSetWindowCompositionAttribute)(HWND, WINDOWCOMPOSITIONATTRIBDATA*); \ No newline at end of file diff --git a/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/ffenestri.go b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/ffenestri.go new file mode 100644 index 0000000..15205b7 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/ffenestri.go @@ -0,0 +1,178 @@ +package ffenestri + +import ( + "runtime" + "strings" + "unsafe" + + "github.com/wailsapp/wails/v2/internal/menumanager" + + "github.com/wailsapp/wails/v2/internal/logger" + "github.com/wailsapp/wails/v2/internal/messagedispatcher" + "github.com/wailsapp/wails/v2/pkg/options" +) + +/* +#cgo linux CFLAGS: -DFFENESTRI_LINUX=1 +#cgo linux pkg-config: gtk+-3.0 webkit2gtk-4.0 + +#cgo darwin CFLAGS: -DFFENESTRI_DARWIN=1 +#cgo darwin LDFLAGS: -framework WebKit -lobjc + +#cgo windows CXXFLAGS: -std=c++11 +#cgo windows,amd64 LDFLAGS: -L./windows/x64 -lWebView2Loader -lgdi32 -lole32 -lShlwapi -luser32 -loleaut32 -ldwmapi + +#include +#include "ffenestri.h" +*/ +import "C" + +// Application is our main application object +type Application struct { + config *options.App + memory []unsafe.Pointer + + // This is the main app pointer + app *C.struct_Application + + // Manages menus + menuManager *menumanager.Manager + + // Logger + logger logger.CustomLogger +} + +func (a *Application) saveMemoryReference(mem unsafe.Pointer) { + a.memory = append(a.memory, mem) +} + +func (a *Application) string2CString(str string) *C.char { + result := C.CString(str) + a.saveMemoryReference(unsafe.Pointer(result)) + return result +} + +func init() { + runtime.LockOSThread() +} + +// NewApplicationWithConfig creates a new application based on the given config +func NewApplicationWithConfig(config *options.App, logger *logger.Logger, menuManager *menumanager.Manager) *Application { + return &Application{ + config: config, + logger: logger.CustomLogger("Ffenestri"), + menuManager: menuManager, + } +} + +func (a *Application) freeMemory() { + for _, mem := range a.memory { + // fmt.Printf("Freeing memory: %+v\n", mem) + C.free(mem) + } +} + +// bool2Cint converts a Go boolean to a C integer +func (a *Application) bool2Cint(value bool) C.int { + if value { + return C.int(1) + } + return C.int(0) +} + +// dispatcher is the interface to send messages to +var dispatcher *messagedispatcher.DispatchClient + +// Dispatcher is what we register out client with +type Dispatcher interface { + RegisterClient(client messagedispatcher.Client) *messagedispatcher.DispatchClient +} + +// DispatchClient is the means for passing messages to the backend +type DispatchClient interface { + SendMessage(string) +} + +func intToColour(colour int) (C.int, C.int, C.int, C.int) { + var alpha = C.int(colour & 0xFF) + var blue = C.int((colour >> 8) & 0xFF) + var green = C.int((colour >> 16) & 0xFF) + var red = C.int((colour >> 24) & 0xFF) + return red, green, blue, alpha +} + +// Run the application +func (a *Application) Run(incomingDispatcher Dispatcher, bindings string, debug bool) error { + title := a.string2CString(a.config.Title) + width := C.int(a.config.Width) + height := C.int(a.config.Height) + resizable := a.bool2Cint(!a.config.DisableResize) + devtools := a.bool2Cint(a.config.DevTools) + fullscreen := a.bool2Cint(a.config.Fullscreen) + startHidden := a.bool2Cint(a.config.StartHidden) + logLevel := C.int(a.config.LogLevel) + hideWindowOnClose := a.bool2Cint(a.config.HideWindowOnClose) + app := C.NewApplication(title, width, height, resizable, devtools, fullscreen, startHidden, logLevel, hideWindowOnClose) + + // Save app reference + a.app = (*C.struct_Application)(app) + + // Set Min Window Size + minWidth := C.int(a.config.MinWidth) + minHeight := C.int(a.config.MinHeight) + C.SetMinWindowSize(a.app, minWidth, minHeight) + + // Set Max Window Size + maxWidth := C.int(a.config.MaxWidth) + maxHeight := C.int(a.config.MaxHeight) + C.SetMaxWindowSize(a.app, maxWidth, maxHeight) + + // Set debug if needed + C.SetDebug(app, a.bool2Cint(debug)) + + if a.config.Frameless { + C.DisableFrame(a.app) + } + + if a.config.RGBA != 0 { + r, g, b, alpha := intToColour(a.config.RGBA) + C.SetColour(a.app, r, g, b, alpha) + } + + // Escape bindings so C doesn't freak out + bindings = strings.ReplaceAll(bindings, `"`, `\"`) + + // Set bindings + C.SetBindings(app, a.string2CString(bindings)) + + // save the dispatcher in a package variable so that the C callbacks + // can access it + dispatcher = incomingDispatcher.RegisterClient(newClient(a)) + + // Process platform settings + err := a.processPlatformSettings() + if err != nil { + return err + } + + // Check we could initialise the application + if app != nil { + // Yes - Save memory reference and run app, cleaning up afterwards + a.saveMemoryReference(unsafe.Pointer(app)) + C.Run(app, 0, nil) + } else { + // Oh no! We couldn't initialise the application + a.logger.Fatal("Cannot initialise Application.") + } + //println("\n\n\n\n\n\nhererererer\n\n\n\n") + a.freeMemory() + return nil +} + +// messageFromWindowCallback is called by any messages sent in +// webkit to window.external.invoke. It relays the message on to +// the dispatcher. +//export messageFromWindowCallback +func messageFromWindowCallback(data *C.char) { + dispatcher.DispatchMessage(C.GoString(data)) +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/ffenestri.h b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/ffenestri.h new file mode 100644 index 0000000..7c2913a --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/ffenestri.h @@ -0,0 +1,56 @@ +#ifndef __FFENESTRI_H__ +#define __FFENESTRI_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +struct Application; + +extern struct Application *NewApplication(const char *title, int width, int height, int resizable, int devtools, int fullscreen, int startHidden, int logLevel, int hideWindowOnClose); +extern void SetMinWindowSize(struct Application*, int minWidth, int minHeight); +extern void SetMaxWindowSize(struct Application*, int maxWidth, int maxHeight); +extern void Run(struct Application*, int argc, char **argv); +extern void DestroyApplication(struct Application*); +extern void SetDebug(struct Application*, int flag); +extern void SetBindings(struct Application*, const char *bindings); +extern void ExecJS(struct Application*, const char *script); +extern void Hide(struct Application*); +extern void Show(struct Application*); +extern void Center(struct Application*); +extern void Maximise(struct Application*); +extern void Unmaximise(struct Application*); +extern void ToggleMaximise(struct Application*); +extern void Minimise(struct Application*); +extern void Unminimise(struct Application*); +extern void ToggleMinimise(struct Application*); +extern void SetColour(struct Application*, int red, int green, int blue, int alpha); +extern void SetSize(struct Application*, int width, int height); +extern void SetPosition(struct Application*, int x, int y); +extern void Quit(struct Application*); +extern void SetTitle(struct Application*, const char *title); +extern void Fullscreen(struct Application*); +extern void UnFullscreen(struct Application*); +extern void ToggleFullscreen(struct Application*); +extern void DisableFrame(struct Application*); +extern void OpenDialog(struct Application*, char *callbackID, char *title, char *filters, char *defaultFilename, char *defaultDir, int allowFiles, int allowDirs, int allowMultiple, int showHiddenFiles, int canCreateDirectories, int resolvesAliases, int treatPackagesAsDirectories); +extern void SaveDialog(struct Application*, char *callbackID, char *title, char *filters, char *defaultFilename, char *defaultDir, int showHiddenFiles, int canCreateDirectories, int treatPackagesAsDirectories); +extern void MessageDialog(struct Application*, char *callbackID, char *type, char *title, char *message, char *icon, char *button1, char *button2, char *button3, char *button4, char *defaultButton, char *cancelButton); +extern void DarkModeEnabled(struct Application*, char *callbackID); +extern void SetApplicationMenu(struct Application*, const char *); +extern void AddTrayMenu(struct Application*, const char *menuTrayJSON); +extern void SetTrayMenu(struct Application*, const char *menuTrayJSON); +extern void DeleteTrayMenuByID(struct Application*, const char *id); +extern void UpdateTrayMenuLabel(struct Application*, const char* JSON); +extern void AddContextMenu(struct Application*, char *contextMenuJSON); +extern void UpdateContextMenu(struct Application*, char *contextMenuJSON); +extern void WebviewIsTransparent(struct Application*); +extern void WindowBackgroundIsTranslucent(struct Application*); +extern void* GetWindowHandle(struct Application*); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/ffenestri_client.go b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/ffenestri_client.go new file mode 100644 index 0000000..6c279ab --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/ffenestri_client.go @@ -0,0 +1,273 @@ +// +build !windows + +package ffenestri + +/* +#include "ffenestri.h" +*/ +import "C" + +import ( + "runtime" + "strconv" + "strings" + + "github.com/wailsapp/wails/v2/pkg/options/dialog" + + "github.com/wailsapp/wails/v2/internal/logger" +) + +// Client is our implementation of messageDispatcher.Client +type Client struct { + app *Application + logger logger.CustomLogger +} + +func newClient(app *Application) *Client { + return &Client{ + app: app, + logger: app.logger, + } +} + +// Quit the application +func (c *Client) Quit() { + c.app.logger.Trace("Got shutdown message") + C.Quit(c.app.app) +} + +// NotifyEvent will pass on the event message to the frontend +func (c *Client) NotifyEvent(message string) { + eventMessage := `window.wails._.Notify(` + strconv.Quote(message) + `);` + c.app.logger.Trace("eventMessage = %+v", eventMessage) + C.ExecJS(c.app.app, c.app.string2CString(eventMessage)) +} + +// CallResult contains the result of the call from JS +func (c *Client) CallResult(message string) { + callbackMessage := `window.wails._.Callback(` + strconv.Quote(message) + `);` + c.app.logger.Trace("callbackMessage = %+v", callbackMessage) + C.ExecJS(c.app.app, c.app.string2CString(callbackMessage)) +} + +// WindowSetTitle sets the window title to the given string +func (c *Client) WindowSetTitle(title string) { + C.SetTitle(c.app.app, c.app.string2CString(title)) +} + +// WindowFullscreen will set the window to be fullscreen +func (c *Client) WindowFullscreen() { + C.Fullscreen(c.app.app) +} + +// WindowUnFullscreen will unfullscreen the window +func (c *Client) WindowUnFullscreen() { + C.UnFullscreen(c.app.app) +} + +// WindowShow will show the window +func (c *Client) WindowShow() { + C.Show(c.app.app) +} + +// WindowHide will hide the window +func (c *Client) WindowHide() { + C.Hide(c.app.app) +} + +// WindowCenter will hide the window +func (c *Client) WindowCenter() { + C.Center(c.app.app) +} + +// WindowMaximise will maximise the window +func (c *Client) WindowMaximise() { + C.Maximise(c.app.app) +} + +// WindowMinimise will minimise the window +func (c *Client) WindowMinimise() { + C.Minimise(c.app.app) +} + +// WindowUnmaximise will unmaximise the window +func (c *Client) WindowUnmaximise() { + C.Unmaximise(c.app.app) +} + +// WindowUnminimise will unminimise the window +func (c *Client) WindowUnminimise() { + C.Unminimise(c.app.app) +} + +// WindowPosition will position the window to x,y on the +// monitor that the window is mostly on +func (c *Client) WindowPosition(x int, y int) { + C.SetPosition(c.app.app, C.int(x), C.int(y)) +} + +// WindowSize will resize the window to the given +// width and height +func (c *Client) WindowSize(width int, height int) { + C.SetSize(c.app.app, C.int(width), C.int(height)) +} + +func (c *Client) WindowSetMinSize(width int, height int) { + C.SetMinWindowSize(c.app.app, C.int(width), C.int(height)) +} + +func (c *Client) WindowSetMaxSize(width int, height int) { + C.SetMaxWindowSize(c.app.app, C.int(width), C.int(height)) +} + +// WindowSetColour sets the window colour +func (c *Client) WindowSetColour(colour int) { + r, g, b, a := intToColour(colour) + C.SetColour(c.app.app, r, g, b, a) +} + +// OpenFileDialog will open a dialog with the given title and filter +func (c *Client) OpenFileDialog(dialogOptions *dialog.OpenDialog, callbackID string) { + filters := []string{} + if runtime.GOOS == "darwin" { + for _, filter := range dialogOptions.Filters { + filters = append(filters, strings.Split(filter.Pattern, ",")...) + } + } + C.OpenDialog(c.app.app, + c.app.string2CString(callbackID), + c.app.string2CString(dialogOptions.Title), + c.app.string2CString(strings.Join(filters, ";")), + c.app.string2CString(dialogOptions.DefaultFilename), + c.app.string2CString(dialogOptions.DefaultDirectory), + c.app.bool2Cint(dialogOptions.AllowFiles), + c.app.bool2Cint(dialogOptions.AllowDirectories), + c.app.bool2Cint(false), + c.app.bool2Cint(dialogOptions.ShowHiddenFiles), + c.app.bool2Cint(dialogOptions.CanCreateDirectories), + c.app.bool2Cint(dialogOptions.ResolvesAliases), + c.app.bool2Cint(dialogOptions.TreatPackagesAsDirectories), + ) +} + + +// OpenDirectoryDialog will open a dialog with the given title and filter +func (c *Client) OpenDirectoryDialog(dialogOptions *dialog.OpenDialog, callbackID string) { + filters := []string{} + if runtime.GOOS == "darwin" { + for _, filter := range dialogOptions.Filters { + filters = append(filters, strings.Split(filter.Pattern, ",")...) + } + } + C.OpenDialog(c.app.app, + c.app.string2CString(callbackID), + c.app.string2CString(dialogOptions.Title), + c.app.string2CString(strings.Join(filters, ";")), + c.app.string2CString(dialogOptions.DefaultFilename), + c.app.string2CString(dialogOptions.DefaultDirectory), + c.app.bool2Cint(false), // Files + c.app.bool2Cint(true), // Directories + c.app.bool2Cint(false), // Multiple + c.app.bool2Cint(dialogOptions.ShowHiddenFiles), + c.app.bool2Cint(dialogOptions.CanCreateDirectories), + c.app.bool2Cint(dialogOptions.ResolvesAliases), + c.app.bool2Cint(dialogOptions.TreatPackagesAsDirectories), + ) +} + +// OpenMultipleFilesDialog will open a dialog with the given title and filter +func (c *Client) OpenMultipleFilesDialog(dialogOptions *dialog.OpenDialog, callbackID string) { + filters := []string{} + if runtime.GOOS == "darwin" { + for _, filter := range dialogOptions.Filters { + filters = append(filters, strings.Split(filter.Pattern, ",")...) + } + } + C.OpenDialog(c.app.app, + c.app.string2CString(callbackID), + c.app.string2CString(dialogOptions.Title), + c.app.string2CString(strings.Join(filters, ";")), + c.app.string2CString(dialogOptions.DefaultFilename), + c.app.string2CString(dialogOptions.DefaultDirectory), + c.app.bool2Cint(dialogOptions.AllowFiles), + c.app.bool2Cint(dialogOptions.AllowDirectories), + c.app.bool2Cint(true), + c.app.bool2Cint(dialogOptions.ShowHiddenFiles), + c.app.bool2Cint(dialogOptions.CanCreateDirectories), + c.app.bool2Cint(dialogOptions.ResolvesAliases), + c.app.bool2Cint(dialogOptions.TreatPackagesAsDirectories), + ) +} + +// SaveDialog will open a dialog with the given title and filter +func (c *Client) SaveDialog(dialogOptions *dialog.SaveDialog, callbackID string) { + filters := []string{} + if runtime.GOOS == "darwin" { + for _, filter := range dialogOptions.Filters { + filters = append(filters, strings.Split(filter.Pattern, ",")...) + } + } + C.SaveDialog(c.app.app, + c.app.string2CString(callbackID), + c.app.string2CString(dialogOptions.Title), + c.app.string2CString(strings.Join(filters, ";")), + c.app.string2CString(dialogOptions.DefaultFilename), + c.app.string2CString(dialogOptions.DefaultDirectory), + c.app.bool2Cint(dialogOptions.ShowHiddenFiles), + c.app.bool2Cint(dialogOptions.CanCreateDirectories), + c.app.bool2Cint(dialogOptions.TreatPackagesAsDirectories), + ) +} + +// MessageDialog will open a message dialog with the given options +func (c *Client) MessageDialog(dialogOptions *dialog.MessageDialog, callbackID string) { + + // Sanity check button length + if len(dialogOptions.Buttons) > 4 { + c.app.logger.Error("Given %d message dialog buttons. Maximum is 4", len(dialogOptions.Buttons)) + return + } + + // Process buttons + buttons := []string{"", "", "", ""} + for i, button := range dialogOptions.Buttons { + buttons[i] = button + } + + C.MessageDialog(c.app.app, + c.app.string2CString(callbackID), + c.app.string2CString(string(dialogOptions.Type)), + c.app.string2CString(dialogOptions.Title), + c.app.string2CString(dialogOptions.Message), + c.app.string2CString(dialogOptions.Icon), + c.app.string2CString(buttons[0]), + c.app.string2CString(buttons[1]), + c.app.string2CString(buttons[2]), + c.app.string2CString(buttons[3]), + c.app.string2CString(dialogOptions.DefaultButton), + c.app.string2CString(dialogOptions.CancelButton)) +} + +func (c *Client) DarkModeEnabled(callbackID string) { + C.DarkModeEnabled(c.app.app, c.app.string2CString(callbackID)) +} + +func (c *Client) SetApplicationMenu(applicationMenuJSON string) { + C.SetApplicationMenu(c.app.app, c.app.string2CString(applicationMenuJSON)) +} + +func (c *Client) SetTrayMenu(trayMenuJSON string) { + C.SetTrayMenu(c.app.app, c.app.string2CString(trayMenuJSON)) +} + +func (c *Client) UpdateTrayMenuLabel(JSON string) { + C.UpdateTrayMenuLabel(c.app.app, c.app.string2CString(JSON)) +} + +func (c *Client) UpdateContextMenu(contextMenuJSON string) { + C.UpdateContextMenu(c.app.app, c.app.string2CString(contextMenuJSON)) +} + +func (c *Client) DeleteTrayMenuByID(id string) { + C.DeleteTrayMenuByID(c.app.app, c.app.string2CString(id)) +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/ffenestri_client_windows.go b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/ffenestri_client_windows.go new file mode 100644 index 0000000..ff668ad --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/ffenestri_client_windows.go @@ -0,0 +1,309 @@ +// +build windows + +package ffenestri + +/* +#include "ffenestri.h" +*/ +import "C" + +import ( + "encoding/json" + "github.com/leaanthony/go-common-file-dialog/cfd" + "golang.org/x/sys/windows" + "log" + "strconv" + "syscall" + + "github.com/wailsapp/wails/v2/pkg/options/dialog" + + "github.com/wailsapp/wails/v2/internal/logger" +) + +// Client is our implementation of messageDispatcher.Client +type Client struct { + app *Application + logger logger.CustomLogger +} + +func newClient(app *Application) *Client { + return &Client{ + app: app, + logger: app.logger, + } +} + +// Quit the application +func (c *Client) Quit() { + c.app.logger.Trace("Got shutdown message") + C.Quit(c.app.app) +} + +// NotifyEvent will pass on the event message to the frontend +func (c *Client) NotifyEvent(message string) { + eventMessage := `window.wails._.Notify(` + strconv.Quote(message) + `);` + c.app.logger.Trace("eventMessage = %+v", eventMessage) + C.ExecJS(c.app.app, c.app.string2CString(eventMessage)) +} + +// CallResult contains the result of the call from JS +func (c *Client) CallResult(message string) { + callbackMessage := `window.wails._.Callback(` + strconv.Quote(message) + `);` + c.app.logger.Trace("callbackMessage = %+v", callbackMessage) + C.ExecJS(c.app.app, c.app.string2CString(callbackMessage)) +} + +// WindowSetTitle sets the window title to the given string +func (c *Client) WindowSetTitle(title string) { + C.SetTitle(c.app.app, c.app.string2CString(title)) +} + +// WindowFullscreen will set the window to be fullscreen +func (c *Client) WindowFullscreen() { + C.Fullscreen(c.app.app) +} + +// WindowUnFullscreen will unfullscreen the window +func (c *Client) WindowUnFullscreen() { + C.UnFullscreen(c.app.app) +} + +// WindowShow will show the window +func (c *Client) WindowShow() { + C.Show(c.app.app) +} + +// WindowHide will hide the window +func (c *Client) WindowHide() { + C.Hide(c.app.app) +} + +// WindowCenter will hide the window +func (c *Client) WindowCenter() { + C.Center(c.app.app) +} + +// WindowMaximise will maximise the window +func (c *Client) WindowMaximise() { + C.Maximise(c.app.app) +} + +// WindowMinimise will minimise the window +func (c *Client) WindowMinimise() { + C.Minimise(c.app.app) +} + +// WindowUnmaximise will unmaximise the window +func (c *Client) WindowUnmaximise() { + C.Unmaximise(c.app.app) +} + +// WindowUnminimise will unminimise the window +func (c *Client) WindowUnminimise() { + C.Unminimise(c.app.app) +} + +// WindowPosition will position the window to x,y on the +// monitor that the window is mostly on +func (c *Client) WindowPosition(x int, y int) { + C.SetPosition(c.app.app, C.int(x), C.int(y)) +} + +// WindowSize will resize the window to the given +// width and height +func (c *Client) WindowSize(width int, height int) { + C.SetSize(c.app.app, C.int(width), C.int(height)) +} + +// WindowSetMinSize sets the minimum window size +func (c *Client) WindowSetMinSize(width int, height int) { + C.SetMinWindowSize(c.app.app, C.int(width), C.int(height)) +} + +// WindowSetMaxSize sets the maximum window size +func (c *Client) WindowSetMaxSize(width int, height int) { + C.SetMaxWindowSize(c.app.app, C.int(width), C.int(height)) +} + +// WindowSetColour sets the window colour +func (c *Client) WindowSetColour(colour int) { + r, g, b, a := intToColour(colour) + C.SetColour(c.app.app, r, g, b, a) +} + +func convertFilters(filters []dialog.FileFilter) []cfd.FileFilter { + var result []cfd.FileFilter + for _, filter := range filters { + result = append(result, cfd.FileFilter(filter)) + } + return result +} + +// OpenFileDialog will open a dialog with the given title and filter +func (c *Client) OpenFileDialog(options *dialog.OpenDialog, callbackID string) { + config := cfd.DialogConfig{ + Folder: options.DefaultDirectory, + FileFilters: convertFilters(options.Filters), + FileName: options.DefaultFilename, + } + thisdialog, err := cfd.NewOpenFileDialog(config) + if err != nil { + log.Fatal(err) + } + thisdialog.SetParentWindowHandle(uintptr(C.GetWindowHandle(c.app.app))) + defer func(thisdialog cfd.OpenFileDialog) { + err := thisdialog.Release() + if err != nil { + log.Fatal(err) + } + }(thisdialog) + result, err := thisdialog.ShowAndGetResult() + if err != nil && err != cfd.ErrorCancelled { + log.Fatal(err) + } + + dispatcher.DispatchMessage("DO" + callbackID + "|" + result) +} + +// OpenDirectoryDialog will open a dialog with the given title and filter +func (c *Client) OpenDirectoryDialog(dialogOptions *dialog.OpenDialog, callbackID string) { + config := cfd.DialogConfig{ + Title: dialogOptions.Title, + Role: "PickFolder", + Folder: dialogOptions.DefaultDirectory, + } + thisDialog, err := cfd.NewSelectFolderDialog(config) + if err != nil { + log.Fatal() + } + thisDialog.SetParentWindowHandle(uintptr(C.GetWindowHandle(c.app.app))) + defer func(thisDialog cfd.SelectFolderDialog) { + err := thisDialog.Release() + if err != nil { + log.Fatal(err) + } + }(thisDialog) + result, err := thisDialog.ShowAndGetResult() + if err != nil && err != cfd.ErrorCancelled { + log.Fatal(err) + } + dispatcher.DispatchMessage("DD" + callbackID + "|" + result) +} + +// OpenMultipleFilesDialog will open a dialog with the given title and filter +func (c *Client) OpenMultipleFilesDialog(dialogOptions *dialog.OpenDialog, callbackID string) { + config := cfd.DialogConfig{ + Title: dialogOptions.Title, + Role: "OpenMultipleFiles", + FileFilters: convertFilters(dialogOptions.Filters), + FileName: dialogOptions.DefaultFilename, + Folder: dialogOptions.DefaultDirectory, + } + thisdialog, err := cfd.NewOpenMultipleFilesDialog(config) + if err != nil { + log.Fatal(err) + } + thisdialog.SetParentWindowHandle(uintptr(C.GetWindowHandle(c.app.app))) + defer func(thisdialog cfd.OpenMultipleFilesDialog) { + err := thisdialog.Release() + if err != nil { + log.Fatal(err) + } + }(thisdialog) + result, err := thisdialog.ShowAndGetResults() + if err != nil && err != cfd.ErrorCancelled { + log.Fatal(err) + } + resultJSON, err := json.Marshal(result) + if err != nil { + log.Fatal(err) + } + dispatcher.DispatchMessage("D*" + callbackID + "|" + string(resultJSON)) +} + +// SaveDialog will open a dialog with the given title and filter +func (c *Client) SaveDialog(dialogOptions *dialog.SaveDialog, callbackID string) { + saveDialog, err := cfd.NewSaveFileDialog(cfd.DialogConfig{ + Title: dialogOptions.Title, + Role: "SaveFile", + FileFilters: convertFilters(dialogOptions.Filters), + FileName: dialogOptions.DefaultFilename, + Folder: dialogOptions.DefaultDirectory, + }) + if err != nil { + log.Fatal(err) + } + saveDialog.SetParentWindowHandle(uintptr(C.GetWindowHandle(c.app.app))) + err = saveDialog.Show() + if err != nil { + log.Fatal(err) + } + result, err := saveDialog.GetResult() + if err != nil && err != cfd.ErrorCancelled { + log.Fatal(err) + } + dispatcher.DispatchMessage("DS" + callbackID + "|" + result) +} + +// MessageDialog will open a message dialog with the given options +func (c *Client) MessageDialog(options *dialog.MessageDialog, callbackID string) { + + title, err := syscall.UTF16PtrFromString(options.Title) + if err != nil { + log.Fatal(err) + } + message, err := syscall.UTF16PtrFromString(options.Message) + if err != nil { + log.Fatal(err) + } + var flags uint32 + switch options.Type { + case dialog.InfoDialog: + flags = windows.MB_OK | windows.MB_ICONINFORMATION + case dialog.ErrorDialog: + flags = windows.MB_ICONERROR | windows.MB_OK + case dialog.QuestionDialog: + flags = windows.MB_YESNO + case dialog.WarningDialog: + flags = windows.MB_OK | windows.MB_ICONWARNING + } + + button, _ := windows.MessageBox(windows.HWND(C.GetWindowHandle(c.app.app)), message, title, flags|windows.MB_SYSTEMMODAL) + // This maps MessageBox return values to strings + responses := []string{"", "Ok", "Cancel", "Abort", "Retry", "Ignore", "Yes", "No", "", "", "Try Again", "Continue"} + result := "Error" + if int(button) < len(responses) { + result = responses[button] + } + dispatcher.DispatchMessage("DM" + callbackID + "|" + result) +} + +// DarkModeEnabled sets the application to use dark mode +func (c *Client) DarkModeEnabled(callbackID string) { + C.DarkModeEnabled(c.app.app, c.app.string2CString(callbackID)) +} + +// SetApplicationMenu sets the application menu +func (c *Client) SetApplicationMenu(_ string) { + c.updateApplicationMenu() +} + +// SetTrayMenu sets the tray menu +func (c *Client) SetTrayMenu(trayMenuJSON string) { + C.SetTrayMenu(c.app.app, c.app.string2CString(trayMenuJSON)) +} + +// UpdateTrayMenuLabel updates a tray menu label +func (c *Client) UpdateTrayMenuLabel(JSON string) { + C.UpdateTrayMenuLabel(c.app.app, c.app.string2CString(JSON)) +} + +// UpdateContextMenu will update the current context menu +func (c *Client) UpdateContextMenu(contextMenuJSON string) { + C.UpdateContextMenu(c.app.app, c.app.string2CString(contextMenuJSON)) +} + +// DeleteTrayMenuByID will remove a tray menu based on the given id +func (c *Client) DeleteTrayMenuByID(id string) { + C.DeleteTrayMenuByID(c.app.app, c.app.string2CString(id)) +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/ffenestri_darwin.c b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/ffenestri_darwin.c new file mode 100644 index 0000000..d2f733f --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/ffenestri_darwin.c @@ -0,0 +1,1817 @@ + +#ifdef FFENESTRI_DARWIN + +#include "ffenestri_darwin.h" +#include "menu_darwin.h" +#include "contextmenus_darwin.h" +#include "traymenustore_darwin.h" +#include "traymenu_darwin.h" + +// References to assets +#include "assets.h" +extern const unsigned char runtime; + +// Dialog icons +extern const unsigned char *defaultDialogIcons[]; +#include "userdialogicons.h" + +// MAIN DEBUG FLAG +int debug; + +// A cache for all our dialog icons +struct hashmap_s dialogIconCache; + +// Dispatch Method +typedef void (^dispatchMethod)(void); + +// Message Dialog +void MessageDialog(struct Application *app, char *callbackID, char *type, char *title, char *message, char *icon, char *button1, char *button2, char *button3, char *button4, char *defaultButton, char *cancelButton); + +TrayMenuStore *TrayMenuStoreSingleton; + +// dispatch will execute the given `func` pointer +void dispatch(dispatchMethod func) { + dispatch_async(dispatch_get_main_queue(), func); +} +// yes command simply returns YES! +BOOL yes(id self, SEL cmd) +{ + return YES; +} + +// no command simply returns NO! +BOOL no(id self, SEL cmd) +{ + return NO; +} + +// Prints a hashmap entry +int hashmap_log(void *const context, struct hashmap_element_s *const e) { + printf("%s: %p ", (char*)e->key, e->data); + return 0; +} + +void filelog(const char *message) { + FILE *fp = fopen("/tmp/wailslog.txt", "ab"); + if (fp != NULL) + { + fputs(message, fp); + fclose(fp); + } +} + +// The delegate class for tray menus +Class trayMenuDelegateClass; + +// Utility function to visualise a hashmap +void dumpHashmap(const char *name, struct hashmap_s *hashmap) { + printf("%s = { ", name); + if (0!=hashmap_iterate_pairs(hashmap, hashmap_log, NULL)) { + fprintf(stderr, "Failed to dump hashmap entries\n"); + } + printf("}\n"); +} + +extern void messageFromWindowCallback(const char *); +typedef void (*ffenestriCallback)(const char *); + +void HideMouse() { + msg_reg(c("NSCursor"), s("hide")); +} + +void ShowMouse() { + msg_reg(c("NSCursor"), s("unhide")); +} + +OSVersion getOSVersion() { + id processInfo = msg_reg(c("NSProcessInfo"), s("processInfo")); + return GET_OSVERSION(processInfo); +} + +struct Application { + + // Cocoa data + id application; + id delegate; + id windowDelegate; + id mainWindow; + id wkwebview; + id manager; + id config; + id mouseEvent; + id mouseDownMonitor; + id mouseUpMonitor; + int activationPolicy; + id pool; + + // Window Data + const char *title; + int width; + int height; + int minWidth; + int minHeight; + int maxWidth; + int maxHeight; + int resizable; + int devtools; + int fullscreen; + CGFloat red; + CGFloat green; + CGFloat blue; + CGFloat alpha; + int webviewIsTranparent; + const char *appearance; + int decorations; + int logLevel; + int hideWindowOnClose; + + // Features + int frame; + int startHidden; + int maximised; + int titlebarAppearsTransparent; + int hideTitle; + int hideTitleBar; + int fullSizeContent; + int useToolBar; + int hideToolbarSeparator; + int windowBackgroundIsTranslucent; + int hasURLHandlers; + const char *startupURL; + + // Menu + Menu *applicationMenu; + + // Context Menus + ContextMenuStore *contextMenuStore; + + // Callback + ffenestriCallback sendMessageToBackend; + + // Bindings + const char *bindings; + + // shutting down flag + bool shuttingDown; + + // Running flag + bool running; + +}; + +// Debug works like sprintf but mutes if the global debug flag is true +// Credit: https://stackoverflow.com/a/20639708 + +#define MAXMESSAGE 1024*10 +char logbuffer[MAXMESSAGE]; + +void Debug(struct Application *app, const char *message, ... ) { + if ( debug ) { + const char *temp = concat("LTFfenestri (C) | ", message); + va_list args; + va_start(args, message); + vsnprintf(logbuffer, MAXMESSAGE, temp, args); + app->sendMessageToBackend(&logbuffer[0]); + MEMFREE(temp); + va_end(args); + } +} + +void Error(struct Application *app, const char *message, ... ) { + const char *temp = concat("LEFfenestri (C) | ", message); + va_list args; + va_start(args, message); + vsnprintf(logbuffer, MAXMESSAGE, temp, args); + app->sendMessageToBackend(&logbuffer[0]); + MEMFREE(temp); + va_end(args); +} + +void Fatal(struct Application *app, const char *message, ... ) { + const char *temp = concat("LFFfenestri (C) | ", message); + va_list args; + va_start(args, message); + vsnprintf(logbuffer, MAXMESSAGE, temp, args); + app->sendMessageToBackend(&logbuffer[0]); + MEMFREE(temp); + va_end(args); +} + +// Requires NSString input EG lookupStringConstant(str("NSFontAttributeName")) +void* lookupStringConstant(id constantName) { + void ** dataPtr = CFBundleGetDataPointerForName(CFBundleGetBundleWithIdentifier((CFStringRef)str("com.apple.AppKit")), (CFStringRef) constantName); + return (dataPtr ? *dataPtr : nil); +} + +bool isRetina(struct Application *app) { + CGFloat scale = GET_BACKINGSCALEFACTOR(app->mainWindow); + if( (int)scale == 1 ) { + return false; + } + return true; +} + +void TitlebarAppearsTransparent(struct Application* app) { + app->titlebarAppearsTransparent = 1; +} + +void HideTitle(struct Application *app) { + app->hideTitle = 1; +} + +void HideTitleBar(struct Application *app) { + app->hideTitleBar = 1; +} + +void HideToolbarSeparator(struct Application *app) { + app->hideToolbarSeparator = 1; +} + +void UseToolbar(struct Application *app) { + app->useToolBar = 1; +} + +// WebviewIsTransparent will make the webview transparent +// revealing the Cocoa window underneath +void WebviewIsTransparent(struct Application *app) { + app->webviewIsTranparent = 1; +} + +// SetAppearance will set the window's Appearance to the +// given value +void SetAppearance(struct Application *app, const char *appearance) { + app->appearance = appearance; +} + + +void applyWindowColour(struct Application *app) { + // Apply the colour only if the window has been created + if( app->mainWindow != NULL ) { + ON_MAIN_THREAD( + id colour = ((id(*)(id, SEL, CGFloat, CGFloat, CGFloat, CGFloat))objc_msgSend)(c("NSColor"), s("colorWithCalibratedRed:green:blue:alpha:"), + (CGFloat)app->red / (CGFloat)255.0, + (CGFloat)app->green / (CGFloat)255.0, + (CGFloat)app->blue / (CGFloat)255.0, + (CGFloat)app->alpha / (CGFloat)255.0); + msg_id(app->mainWindow, s("setBackgroundColor:"), colour); + ); + } +} + +void SetColour(struct Application *app, int red, int green, int blue, int alpha) { + // Guard against calling during shutdown + if( app->shuttingDown ) return; + + app->red = (CGFloat)red; + app->green = (CGFloat)green; + app->blue = (CGFloat)blue; + app->alpha = (CGFloat)alpha; + + applyWindowColour(app); +} + +void FullSizeContent(struct Application *app) { + app->fullSizeContent = 1; +} + +void Hide(struct Application *app) { + // Guard against calling during shutdown + if( app->shuttingDown ) return; + + ON_MAIN_THREAD( + msg_reg(app->mainWindow, s("orderOut:")); + ); +} + +void Show(struct Application *app) { + // Guard against calling during shutdown + if( app->shuttingDown ) return; + + ON_MAIN_THREAD( + msg_id(app->mainWindow, s("makeKeyAndOrderFront:"), NULL); + msg_bool(app->application, s("activateIgnoringOtherApps:"), YES); + ); +} + +void WindowBackgroundIsTranslucent(struct Application *app) { + app->windowBackgroundIsTranslucent = 1; +} + +// Sends messages to the backend +void messageHandler(id self, SEL cmd, id contentController, id message) { + struct Application *app = (struct Application *)objc_getAssociatedObject( + self, "application"); + const char *name = (const char *)msg_reg(msg_reg(message, s("name")), s("UTF8String")); + if( strcmp(name, "error") == 0 ) { + printf("There was a Javascript error. Please open the devtools for more information.\n"); + // Show app if we are in debug mode + if( debug ) { + Show(app); + MessageDialog(app, "", "error", "Javascript Error", "There was a Javascript error. Please open the devtools for more information.", "", "", "", "","","",""); + } + } else if( strcmp(name, "completed") == 0) { + // Delete handler + msg_id(app->manager, s("removeScriptMessageHandlerForName:"), str("completed")); + + // TODO: Notify backend we're ready and get them to call back for the Show() + if (app->startHidden == 0) { + Show(app); + } + + // TODO: Check this actually does reduce flicker + ((id(*)(id, SEL, id, id))objc_msgSend)(app->config, s("setValue:forKey:"), msg_bool(c("NSNumber"), s("numberWithBool:"), 0), str("suppressesIncrementalRendering")); + + // We are now running! + app->running = true; + + + // Notify backend we are ready (system startup) + const char *readyMessage = "SS"; + if( app->startupURL == NULL ) { + app->sendMessageToBackend("SS"); + return; + } + readyMessage = concat("SS", app->startupURL); + app->sendMessageToBackend(readyMessage); + MEMFREE(readyMessage); + + } else if( strcmp(name, "windowDrag") == 0 ) { + // Guard against null events + if( app->mouseEvent != NULL ) { + HideMouse(); + ON_MAIN_THREAD( + msg_id(app->mainWindow, s("performWindowDragWithEvent:"), app->mouseEvent); + ); + } + } else if( strcmp(name, "contextMenu") == 0 ) { + + // Did we get a context menu selector? + if( message == NULL) { + return; + } + + const char *contextMenuMessage = cstr(msg_reg(message, s("body"))); + + if( contextMenuMessage == NULL ) { + Debug(app, "EMPTY CONTEXT MENU MESSAGE!!\n"); + return; + } + + // Parse the message + JsonNode *contextMenuMessageJSON = json_decode(contextMenuMessage); + if( contextMenuMessageJSON == NULL ) { + Debug(app, "Error decoding context menu message: %s", contextMenuMessage); + return; + } + + // Get menu ID + JsonNode *contextMenuIDNode = json_find_member(contextMenuMessageJSON, "id"); + if( contextMenuIDNode == NULL ) { + Debug(app, "Error decoding context menu ID: %s", contextMenuMessage); + json_delete(contextMenuMessageJSON); + return; + } + if( contextMenuIDNode->tag != JSON_STRING ) { + Debug(app, "Error decoding context menu ID (Not a string): %s", contextMenuMessage); + json_delete(contextMenuMessageJSON); + return; + } + + // Get menu Data + JsonNode *contextMenuDataNode = json_find_member(contextMenuMessageJSON, "data"); + if( contextMenuDataNode == NULL ) { + Debug(app, "Error decoding context menu data: %s", contextMenuMessage); + json_delete(contextMenuMessageJSON); + return; + } + if( contextMenuDataNode->tag != JSON_STRING ) { + Debug(app, "Error decoding context menu data (Not a string): %s", contextMenuMessage); + json_delete(contextMenuMessageJSON); + return; + } + + // We need to copy these as the JSON node will be destroyed on this thread and the + // string data will become corrupt. These need to be freed by the context menu code. + const char* contextMenuID = STRCOPY(contextMenuIDNode->string_); + const char* contextMenuData = STRCOPY(contextMenuDataNode->string_); + + ON_MAIN_THREAD( + ShowContextMenu(app->contextMenuStore, app->mainWindow, contextMenuID, contextMenuData); + ); + + json_delete(contextMenuMessageJSON); + + } else { + // const char *m = (const char *)msg(msg(message, s("body")), s("UTF8String")); + const char *m = cstr(msg_reg(message, s("body"))); + app->sendMessageToBackend(m); + } +} + +// closeWindow is called when the close button is pressed +void closeWindow(id self, SEL cmd, id sender) { + struct Application *app = (struct Application *) objc_getAssociatedObject(self, "application"); + app->sendMessageToBackend("WC"); +} + +bool isDarkMode(struct Application *app) { + id userDefaults = msg_reg(c("NSUserDefaults"), s("standardUserDefaults")); + const char *mode = cstr(msg_id(userDefaults, s("stringForKey:"), str("AppleInterfaceStyle"))); + return ( mode != NULL && strcmp(mode, "Dark") == 0 ); +} + +void ExecJS(struct Application *app, const char *js) { + ON_MAIN_THREAD( + ((id(*)(id, SEL, id, id))objc_msgSend)(app->wkwebview, + s("evaluateJavaScript:completionHandler:"), + str(js), + NULL); + ); +} + +void willFinishLaunching(id self, SEL cmd, id sender) { + struct Application *app = (struct Application *) objc_getAssociatedObject(self, "application"); + // If there are URL Handlers, register a listener for them + if( app->hasURLHandlers ) { + id eventManager = msg_reg(c("NSAppleEventManager"), s("sharedAppleEventManager")); + ((id(*)(id, SEL, id, SEL, int, int))objc_msgSend)(eventManager, s("setEventHandler:andSelector:forEventClass:andEventID:"), self, s("getUrl:withReplyEvent:"), kInternetEventClass, kAEGetURL); + } + messageFromWindowCallback("Ej{\"name\":\"wails:launched\",\"data\":[]}"); +} + +void emitThemeChange(struct Application *app) { + bool currentThemeIsDark = isDarkMode(app); + if (currentThemeIsDark) { + messageFromWindowCallback("Ej{\"name\":\"wails:system:themechange\",\"data\":[true]}"); + } else { + messageFromWindowCallback("Ej{\"name\":\"wails:system:themechange\",\"data\":[false]}"); + } +} + +void themeChanged(id self, SEL cmd, id sender) { + struct Application *app = (struct Application *)objc_getAssociatedObject( + self, "application"); +// emitThemeChange(app); + bool currentThemeIsDark = isDarkMode(app); + if ( currentThemeIsDark ) { + ExecJS(app, "window.wails.Events.Emit( 'wails:system:themechange', true );"); + } else { + ExecJS(app, "window.wails.Events.Emit( 'wails:system:themechange', false );"); + } +} + +int releaseNSObject(void *const context, struct hashmap_element_s *const e) { + msg_reg(e->data, s("release")); + return -1; +} + +void destroyContextMenus(struct Application *app) { + DeleteContextMenuStore(app->contextMenuStore); +} + +void freeDialogIconCache(struct Application *app) { + // Release the dialog cache images + if( hashmap_num_entries(&dialogIconCache) > 0 ) { + if (0!=hashmap_iterate_pairs(&dialogIconCache, releaseNSObject, NULL)) { + Fatal(app, "failed to release hashmap entries!"); + } + } + + //Free radio groups hashmap + hashmap_destroy(&dialogIconCache); +} + +void DestroyApplication(struct Application *app) { + app->shuttingDown = true; + Debug(app, "Destroying Application"); + + // Free the bindings + if (app->bindings != NULL) { + MEMFREE(app->bindings); + } else { + Debug(app, "Almost a double free for app->bindings"); + } + + if( app->startupURL != NULL ) { + MEMFREE(app->startupURL); + } + + // Remove mouse monitors + if( app->mouseDownMonitor != NULL ) { + msg_id( c("NSEvent"), s("removeMonitor:"), app->mouseDownMonitor); + } + if( app->mouseUpMonitor != NULL ) { + msg_id( c("NSEvent"), s("removeMonitor:"), app->mouseUpMonitor); + } + + // Delete the application menu if we have one + if( app->applicationMenu != NULL ) { + DeleteMenu(app->applicationMenu); + } + + // Delete the tray menu store + DeleteTrayMenuStore(TrayMenuStoreSingleton); + + // Delete the context menu store + DeleteContextMenuStore(app->contextMenuStore); + + // Destroy the context menus + destroyContextMenus(app); + + // Free dialog icon cache + freeDialogIconCache(app); + + // Unload the tray Icons + UnloadTrayIcons(); + + // Remove script handlers + msg_id(app->manager, s("removeScriptMessageHandlerForName:"), str("contextMenu")); + msg_id(app->manager, s("removeScriptMessageHandlerForName:"), str("windowDrag")); + msg_id(app->manager, s("removeScriptMessageHandlerForName:"), str("external")); + msg_id(app->manager, s("removeScriptMessageHandlerForName:"), str("error")); + + // Close main window + if( app->windowDelegate != NULL ) { + msg_reg(app->windowDelegate, s("release")); + msg_id(app->mainWindow, s("setDelegate:"), NULL); + } + +// msg(app->mainWindow, s("close")); + + + Debug(app, "Finished Destroying Application"); +} + +// SetTitle sets the main window title to the given string +void SetTitle(struct Application *app, const char *title) { + // Guard against calling during shutdown + if( app->shuttingDown ) return; + + Debug(app, "SetTitle Called"); + ON_MAIN_THREAD( + msg_id(app->mainWindow, s("setTitle:"), str(title)); + ); +} + +void ToggleFullscreen(struct Application *app) { + ON_MAIN_THREAD( + app->fullscreen = !app->fullscreen; + MAIN_WINDOW_CALL("toggleFullScreen:"); + ); +} + +bool isFullScreen(struct Application *app) { + long mask = (long)msg_reg(app->mainWindow, s("styleMask")); + bool result = (mask & NSWindowStyleMaskFullscreen) == NSWindowStyleMaskFullscreen; + return result; +} + +// Fullscreen sets the main window to be fullscreen +void Fullscreen(struct Application *app) { + // Guard against calling during shutdown + if( app->shuttingDown ) return; + + Debug(app, "Fullscreen Called"); + if( ! isFullScreen(app) ) { + ToggleFullscreen(app); + } +} + +// UnFullscreen resets the main window after a fullscreen +void UnFullscreen(struct Application *app) { + // Guard against calling during shutdown + if( app->shuttingDown ) return; + + Debug(app, "UnFullscreen Called"); + if( isFullScreen(app) ) { + ToggleFullscreen(app); + } +} + +void Center(struct Application *app) { + // Guard against calling during shutdown + if( app->shuttingDown ) return; + + Debug(app, "Center Called"); + ON_MAIN_THREAD( + MAIN_WINDOW_CALL("center"); + ); +} + +void ToggleMaximise(struct Application *app) { + ON_MAIN_THREAD( + app->maximised = !app->maximised; + MAIN_WINDOW_CALL("zoom:"); + ); +} + +void Maximise(struct Application *app) { + // Guard against calling during shutdown + if( app->shuttingDown ) return; + + if( app->maximised == 0) { + ToggleMaximise(app); + } +} + +void Unmaximise(struct Application *app) { + // Guard against calling during shutdown + if( app->shuttingDown ) return; + + if( app->maximised == 1) { + ToggleMaximise(app); + } +} + +void Minimise(struct Application *app) { + // Guard against calling during shutdown + if( app->shuttingDown ) return; + + ON_MAIN_THREAD( + MAIN_WINDOW_CALL("miniaturize:"); + ); + } +void Unminimise(struct Application *app) { + // Guard against calling during shutdown + if( app->shuttingDown ) return; + + ON_MAIN_THREAD( + MAIN_WINDOW_CALL("deminiaturize:"); + ); +} + +id getCurrentScreen(struct Application *app) { + id screen = NULL; + screen = msg_reg(app->mainWindow, s("screen")); + if( screen == NULL ) { + screen = msg_reg(c("NSScreen"), u("mainScreen")); + } + return screen; +} + +void dumpFrame(struct Application *app, const char *message, CGRect frame) { + Debug(app, message); + Debug(app, "origin.x %f", frame.origin.x); + Debug(app, "origin.y %f", frame.origin.y); + Debug(app, "size.width %f", frame.size.width); + Debug(app, "size.height %f", frame.size.height); +} + +void SetSize(struct Application *app, int width, int height) { + // Guard against calling during shutdown + if( app->shuttingDown ) return; + + ON_MAIN_THREAD( + id screen = getCurrentScreen(app); + + // Get the rect for the window + CGRect frame = GET_FRAME(app->mainWindow); + + // Credit: https://github.com/patr0nus/DeskGap/blob/73c0ac9f2c73f55b6e81f64f6673a7962b5719cd/lib/src/platform/mac/util/NSScreen%2BGeometry.m + frame.origin.y = (frame.origin.y + frame.size.height) - (float)height; + frame.size.width = (float)width; + frame.size.height = (float)height; + + ((id(*)(id, SEL, CGRect, BOOL, BOOL))objc_msgSend)(app->mainWindow, s("setFrame:display:animate:"), frame, 1, 0); + ); +} + +void SetPosition(struct Application *app, int x, int y) { + // Guard against calling during shutdown + if( app->shuttingDown ) return; + + ON_MAIN_THREAD( + id screen = getCurrentScreen(app); + CGRect screenFrame = GET_FRAME(screen); + CGRect windowFrame = GET_FRAME(app->mainWindow); + + windowFrame.origin.x = screenFrame.origin.x + (float)x; + windowFrame.origin.y = (screenFrame.origin.y + screenFrame.size.height) - windowFrame.size.height - (float)y; + ((id(*)(id, SEL, CGRect, BOOL, BOOL))objc_msgSend)(app->mainWindow, s("setFrame:display:animate:"), windowFrame, 1, 0); + ); +} + +void processDialogButton(id alert, char *buttonTitle, char *cancelButton, char *defaultButton) { + // If this button is set + if( STR_HAS_CHARS(buttonTitle) ) { + id button = msg_id(alert, s("addButtonWithTitle:"), str(buttonTitle)); + if ( STREQ( buttonTitle, defaultButton) ) { + msg_id(button, s("setKeyEquivalent:"), str("\r")); + } + if ( STREQ( buttonTitle, cancelButton) ) { + msg_id(button, s("setKeyEquivalent:"), str("\033")); + } + } +} + +void MessageDialog(struct Application *app, char *callbackID, char *type, char *title, char *message, char *icon, char *button1, char *button2, char *button3, char *button4, char *defaultButton, char *cancelButton) { + // Guard against calling during shutdown + if( app->shuttingDown ) return; + + ON_MAIN_THREAD( + id alert = ALLOC_INIT("NSAlert"); + char *dialogType = type; + char *dialogIcon = type; + + // Default to info type + if( dialogType == NULL ) { + dialogType = "info"; + } + + // Set the dialog style + if( STREQ(dialogType, "info") || STREQ(dialogType, "question") ) { + msg_uint(alert, s("setAlertStyle:"), NSAlertStyleInformational); + } else if( STREQ(dialogType, "warning") ) { + msg_uint(alert, s("setAlertStyle:"), NSAlertStyleWarning); + } else if( STREQ(dialogType, "error") ) { + msg_uint(alert, s("setAlertStyle:"), NSAlertStyleCritical); + } + + // Set title if given + if( strlen(title) > 0 ) { + msg_id(alert, s("setMessageText:"), str(title)); + } + + // Set message if given + if( strlen(message) > 0) { + msg_id(alert, s("setInformativeText:"), str(message)); + } + + // Process buttons + processDialogButton(alert, button1, cancelButton, defaultButton); + processDialogButton(alert, button2, cancelButton, defaultButton); + processDialogButton(alert, button3, cancelButton, defaultButton); + processDialogButton(alert, button4, cancelButton, defaultButton); + + // Check for custom dialog icon + if( strlen(icon) > 0 ) { + dialogIcon = icon; + } + + // TODO: move dialog icons + methods to own file + + // Determine what dialog icon we are looking for + id dialogImage = NULL; + // Look for `name-theme2x` first + char *themeIcon = concat(dialogIcon, (isDarkMode(app) ? "-dark" : "-light") ); + if( isRetina(app) ) { + char *dialogIcon2x = concat(themeIcon, "2x"); + dialogImage = hashmap_get(&dialogIconCache, dialogIcon2x, strlen(dialogIcon2x)); +// if (dialogImage != NULL ) printf("Using %s\n", dialogIcon2x); + MEMFREE(dialogIcon2x); + + // Now look for non-themed icon `name2x` + if ( dialogImage == NULL ) { + dialogIcon2x = concat(dialogIcon, "2x"); + dialogImage = hashmap_get(&dialogIconCache, dialogIcon2x, strlen(dialogIcon2x)); +// if (dialogImage != NULL ) printf("Using %s\n", dialogIcon2x); + MEMFREE(dialogIcon2x); + } + } + + // If we don't have a retina icon, try the 1x name-theme icon + if( dialogImage == NULL ) { + dialogImage = hashmap_get(&dialogIconCache, themeIcon, strlen(themeIcon)); +// if (dialogImage != NULL ) printf("Using %s\n", themeIcon); + } + + // Free the theme icon memory + MEMFREE(themeIcon); + + // Finally try the name itself + if( dialogImage == NULL ) { + dialogImage = hashmap_get(&dialogIconCache, dialogIcon, strlen(dialogIcon)); +// if (dialogImage != NULL ) printf("Using %s\n", dialogIcon); + } + + if (dialogImage != NULL ) { + msg_id(alert, s("setIcon:"), dialogImage); + } + + // Run modal + char *buttonPressed; + long response = (long)msg_reg(alert, s("runModal")); + if( response == NSAlertFirstButtonReturn ) { + buttonPressed = button1; + } + else if( response == NSAlertSecondButtonReturn ) { + buttonPressed = button2; + } + else if( response == NSAlertThirdButtonReturn ) { + buttonPressed = button3; + } + else { + buttonPressed = button4; + } + + if ( STR_HAS_CHARS(callbackID) ) { + // Construct callback message. Format "DM|" + const char *callback = concat("DM", callbackID); + const char *header = concat(callback, "|"); + const char *responseMessage = concat(header, buttonPressed); + + // Send message to backend + app->sendMessageToBackend(responseMessage); + + // Free memory + MEMFREE(header); + MEMFREE(callback); + MEMFREE(responseMessage); + } + ); +} + +// OpenDialog opens a dialog to select files/directories +void OpenDialog(struct Application *app, char *callbackID, char *title, char *filters, char *defaultFilename, char *defaultDir, int allowFiles, int allowDirs, int allowMultiple, int showHiddenFiles, int canCreateDirectories, int resolvesAliases, int treatPackagesAsDirectories) { + // Guard against calling during shutdown + if( app->shuttingDown ) return; + + Debug(app, "OpenDialog Called with callback id: %s", callbackID); + + // Create an open panel + ON_MAIN_THREAD( + + // Create the dialog + id dialog = msg_reg(c("NSOpenPanel"), s("openPanel")); + + // Valid but appears to do nothing.... :/ + msg_id(dialog, s("setTitle:"), str(title)); + + // Filters + if( filters != NULL && strlen(filters) > 0) { + id filterString = msg_id_id(str(filters), s("stringByReplacingOccurrencesOfString:withString:"), str("*."), str("")); + filterString = msg_id_id(filterString, s("stringByReplacingOccurrencesOfString:withString:"), str(" "), str("")); + id filterList = msg_id(filterString, s("componentsSeparatedByString:"), str(",")); + msg_id(dialog, s("setAllowedFileTypes:"), filterList); + } else { + msg_bool(dialog, s("setAllowsOtherFileTypes:"), YES); + } + + // Default Directory + if( defaultDir != NULL && strlen(defaultDir) > 0 ) { + msg_id(dialog, s("setDirectoryURL:"), url(defaultDir)); + } + + // Default Filename + if( defaultFilename != NULL && strlen(defaultFilename) > 0 ) { + msg_id(dialog, s("setNameFieldStringValue:"), str(defaultFilename)); + } + + // Setup Options + msg_bool(dialog, s("setCanChooseFiles:"), allowFiles); + msg_bool(dialog, s("setCanChooseDirectories:"), allowDirs); + msg_bool(dialog, s("setAllowsMultipleSelection:"), allowMultiple); + msg_bool(dialog, s("setShowsHiddenFiles:"), showHiddenFiles); + msg_bool(dialog, s("setCanCreateDirectories:"), canCreateDirectories); + msg_bool(dialog, s("setResolvesAliases:"), resolvesAliases); + msg_bool(dialog, s("setTreatsFilePackagesAsDirectories:"), treatPackagesAsDirectories); + + // Setup callback handler + ((id(*)(id, SEL, id, void (^)(id)))objc_msgSend)(dialog, s("beginSheetModalForWindow:completionHandler:"), app->mainWindow, ^(id result) { + + // Create the response JSON object + JsonNode *response = json_mkarray(); + + // If the user selected some files + if( result == (id)1 ) { + // Grab the URLs returned + id urls = msg_reg(dialog, s("URLs")); + + // Iterate over all the selected files + long noOfResults = (long)msg_reg(urls, s("count")); + for( int index = 0; index < noOfResults; index++ ) { + + // Extract the filename + id url = msg_int(urls, s("objectAtIndex:"), index); + const char *filename = (const char *)msg_reg(msg_reg(url, s("path")), s("UTF8String")); + + // Add the the response array + json_append_element(response, json_mkstring(filename)); + } + } + + // Create JSON string and free json memory + char *encoded = json_stringify(response, ""); + json_delete(response); + + // Construct callback message. Format "D|" + const char *callback = concat("DO", callbackID); + const char *header = concat(callback, "|"); + const char *responseMessage = concat(header, encoded); + + // Send message to backend + app->sendMessageToBackend(responseMessage); + + // Free memory + MEMFREE(header); + MEMFREE(callback); + MEMFREE(responseMessage); + }); + + msg_id( c("NSApp"), s("runModalForWindow:"), app->mainWindow); + ); +} + +// SaveDialog opens a dialog to select files/directories +void SaveDialog(struct Application *app, char *callbackID, char *title, char *filters, char *defaultFilename, char *defaultDir, int showHiddenFiles, int canCreateDirectories, int treatPackagesAsDirectories) { + // Guard against calling during shutdown + if( app->shuttingDown ) return; + + Debug(app, "SaveDialog Called with callback id: %s", callbackID); + + // Create an open panel + ON_MAIN_THREAD( + + // Create the dialog + id dialog = msg_reg(c("NSSavePanel"), s("savePanel")); + + // Valid but appears to do nothing.... :/ + msg_id(dialog, s("setTitle:"), str(title)); + + // Filters + if( filters != NULL && strlen(filters) > 0) { + id filterString = msg_id_id(str(filters), s("stringByReplacingOccurrencesOfString:withString:"), str("*."), str("")); + filterString = msg_id_id(filterString, s("stringByReplacingOccurrencesOfString:withString:"), str(" "), str("")); + id filterList = msg_id(filterString, s("componentsSeparatedByString:"), str(",")); + msg_id(dialog, s("setAllowedFileTypes:"), filterList); + } else { + msg_bool(dialog, s("setAllowsOtherFileTypes:"), YES); + } + + // Default Directory + if( defaultDir != NULL && strlen(defaultDir) > 0 ) { + msg_id(dialog, s("setDirectoryURL:"), url(defaultDir)); + } + + // Default Filename + if( defaultFilename != NULL && strlen(defaultFilename) > 0 ) { + msg_id(dialog, s("setNameFieldStringValue:"), str(defaultFilename)); + } + + // Setup Options + msg_bool(dialog, s("setShowsHiddenFiles:"), showHiddenFiles); + msg_bool(dialog, s("setCanCreateDirectories:"), canCreateDirectories); + msg_bool(dialog, s("setTreatsFilePackagesAsDirectories:"), treatPackagesAsDirectories); + + // Setup callback handler + ((id(*)(id, SEL, id, void (^)(id)))objc_msgSend)(dialog, s("beginSheetModalForWindow:completionHandler:"), app->mainWindow, ^(id result) { + + // Default is blank + const char *filename = ""; + + // If the user selected some files + if( result == (id)1 ) { + // Grab the URL returned + id url = msg_reg(dialog, s("URL")); + filename = (const char *)msg_reg(msg_reg(url, s("path")), s("UTF8String")); + } + + // Construct callback message. Format "DS|" + const char *callback = concat("DS", callbackID); + const char *header = concat(callback, "|"); + const char *responseMessage = concat(header, filename); + + // Send message to backend + app->sendMessageToBackend(responseMessage); + + // Free memory + MEMFREE(header); + MEMFREE(callback); + MEMFREE(responseMessage); + }); + + msg_id( c("NSApp"), s("runModalForWindow:"), app->mainWindow); + ); +} + +const char *invoke = "window.wailsInvoke=function(message){window.webkit.messageHandlers.external.postMessage(message);};window.wailsDrag=function(message){window.webkit.messageHandlers.windowDrag.postMessage(message);};window.wailsContextMenuMessage=function(message){window.webkit.messageHandlers.contextMenu.postMessage(message);};"; + +// DisableFrame disables the window frame +void DisableFrame(struct Application *app) +{ + app->frame = 0; +} + +void setMinMaxSize(struct Application *app) +{ + // Guard against calling during shutdown + if( app->shuttingDown ) return; + + if (app->maxHeight > 0 && app->maxWidth > 0) + { + ((id(*)(id, SEL, CGSize))objc_msgSend)(app->mainWindow, s("setMaxSize:"), CGSizeMake(app->maxWidth, app->maxHeight)); + } + if (app->minHeight > 0 && app->minWidth > 0) + { + ((id(*)(id, SEL, CGSize))objc_msgSend)(app->mainWindow, s("setMinSize:"), CGSizeMake(app->minWidth, app->minHeight)); + } + + // Calculate if window needs resizing + int newWidth = app->width; + int newHeight = app->height; + + if (app->maxWidth > 0 && app->width > app->maxWidth) newWidth = app->maxWidth; + if (app->minWidth > 0 && app->width < app->minWidth) newWidth = app->minWidth; + if (app->maxHeight > 0 && app->height > app->maxHeight ) newHeight = app->maxHeight; + if (app->minHeight > 0 && app->height < app->minHeight ) newHeight = app->minHeight; + + // If we have any change, resize window + if ( newWidth != app->width || newHeight != app->height ) { + SetSize(app, newWidth, newHeight); + } +} + +void SetMinWindowSize(struct Application *app, int minWidth, int minHeight) +{ + // Guard against calling during shutdown + if( app->shuttingDown ) return; + + app->minWidth = minWidth; + app->minHeight = minHeight; + + // Apply if the window is created + if( app->mainWindow != NULL ) { + ON_MAIN_THREAD( + setMinMaxSize(app); + ); + } +} + +void SetMaxWindowSize(struct Application *app, int maxWidth, int maxHeight) +{ + // Guard against calling during shutdown + if( app->shuttingDown ) return; + + app->maxWidth = maxWidth; + app->maxHeight = maxHeight; + + // Apply if the window is created + if( app->mainWindow != NULL ) { + ON_MAIN_THREAD( + setMinMaxSize(app); + ); + } +} + + +void SetDebug(void *applicationPointer, int flag) { + debug = flag; +} + + + +// AddContextMenu sets the context menu map for this application +void AddContextMenu(struct Application *app, const char *contextMenuJSON) { + // Guard against calling during shutdown + if( app->shuttingDown ) return; + ON_MAIN_THREAD ( + AddContextMenuToStore(app->contextMenuStore, contextMenuJSON); + ); +} + +void UpdateContextMenu(struct Application *app, const char* contextMenuJSON) { + // Guard against calling during shutdown + if( app->shuttingDown ) return; + ON_MAIN_THREAD( + UpdateContextMenuInStore(app->contextMenuStore, contextMenuJSON); + ); +} + +void AddTrayMenu(struct Application *app, const char *trayMenuJSON) { + // Guard against calling during shutdown + if( app->shuttingDown ) return; + + ON_MAIN_THREAD( + AddTrayMenuToStore(TrayMenuStoreSingleton, trayMenuJSON); + ); +} + +void SetTrayMenu(struct Application *app, const char* trayMenuJSON) { + + // Guard against calling during shutdown + if( app->shuttingDown ) return; + + ON_MAIN_THREAD( + UpdateTrayMenuInStore(TrayMenuStoreSingleton, trayMenuJSON); + ); +} + +void DeleteTrayMenuByID(struct Application *app, const char *id) { + ON_MAIN_THREAD( + DeleteTrayMenuInStore(TrayMenuStoreSingleton, id); + ); +} + +void UpdateTrayMenuLabel(struct Application* app, const char* JSON) { + // Guard against calling during shutdown + if( app->shuttingDown ) return; + + ON_MAIN_THREAD( + UpdateTrayMenuLabelInStore(TrayMenuStoreSingleton, JSON); + ); +} + + +void SetBindings(struct Application *app, const char *bindings) { + const char* temp = concat("window.wailsbindings = \"", bindings); + const char* jscall = concat(temp, "\";"); + MEMFREE(temp); + app->bindings = jscall; +} + +void makeWindowBackgroundTranslucent(struct Application *app) { + id contentView = msg_reg(app->mainWindow, s("contentView")); + id effectView = msg_reg(c("NSVisualEffectView"), s("alloc")); + CGRect bounds = GET_BOUNDS(contentView); + effectView = ((id(*)(id, SEL, CGRect))objc_msgSend)(effectView, s("initWithFrame:"), bounds); + + msg_int(effectView, s("setAutoresizingMask:"), NSViewWidthSizable | NSViewHeightSizable); + msg_int(effectView, s("setBlendingMode:"), NSVisualEffectBlendingModeBehindWindow); + msg_int(effectView, s("setState:"), NSVisualEffectStateActive); + ((id(*)(id, SEL, id, int, id))objc_msgSend)(contentView, s("addSubview:positioned:relativeTo:"), effectView, NSWindowBelow, NULL); +} + +void enableBoolConfig(id config, const char *setting) { + ((id(*)(id, SEL, id, id))objc_msgSend)(msg_reg(config, s("preferences")), s("setValue:forKey:"), msg_bool(c("NSNumber"), s("numberWithBool:"), 1), str(setting)); +} + +void disableBoolConfig(id config, const char *setting) { + ((id(*)(id, SEL, id, id))objc_msgSend)(msg_reg(config, s("preferences")), s("setValue:forKey:"), msg_bool(c("NSNumber"), s("numberWithBool:"), 0), str(setting)); +} + +void processDecorations(struct Application *app) { + + int decorations = 0; + + if (app->frame == 1 ) { + if( app->hideTitleBar == 0) { + decorations |= NSWindowStyleMaskTitled; + } + decorations |= NSWindowStyleMaskClosable | NSWindowStyleMaskMiniaturizable; + } + + if (app->resizable) { + decorations |= NSWindowStyleMaskResizable; + } + + if (app->fullscreen) { + decorations |= NSWindowStyleMaskFullscreen; + } + + if( app->fullSizeContent || app->frame == 0) { + decorations |= NSWindowStyleMaskFullSizeContentView; + } + + app->decorations = decorations; +} + +void createApplication(struct Application *app) { + id application = msg_reg(c("NSApplication"), s("sharedApplication")); + app->application = application; + msg_int(application, s("setActivationPolicy:"), app->activationPolicy); +} + +void DarkModeEnabled(struct Application *app, const char *callbackID) { + // Guard against calling during shutdown + if( app->shuttingDown ) return; + + ON_MAIN_THREAD( + const char *result = isDarkMode(app) ? "T" : "F"; + + // Construct callback message. Format "SD|" + const char *callback = concat("SD", callbackID); + const char *header = concat(callback, "|"); + const char *responseMessage = concat(header, result); + // Send message to backend + app->sendMessageToBackend(responseMessage); + + // Free memory + MEMFREE(header); + MEMFREE(callback); + MEMFREE(responseMessage); + ); +} + +void getURL(id self, SEL selector, id event, id replyEvent) { + struct Application *app = (struct Application *)objc_getAssociatedObject(self, "application"); + id desc = msg_int(event, s("paramDescriptorForKeyword:"), keyDirectObject); + id url = msg_reg(desc, s("stringValue")); + const char* curl = cstr(url); + if( curl == NULL ) { + return; + } + + // If this was an incoming URL, but we aren't running yet + // save it to return when we complete + if( app->running != true ) { + app->startupURL = STRCOPY(curl); + return; + } + + const char* message = concat("UC", curl); + messageFromWindowCallback(message); + MEMFREE(message); +} + +void openURLs(id self, SEL selector, id event) { + filelog("\n\nI AM HERE!!!!!\n\n"); +} + + +void createDelegate(struct Application *app) { + + // Define delegate + Class appDelegate = objc_allocateClassPair((Class) c("NSResponder"), "AppDelegate", 0); + class_addProtocol(appDelegate, objc_getProtocol("NSTouchBarProvider")); + + class_addMethod(appDelegate, s("applicationShouldTerminateAfterLastWindowClosed:"), (IMP) no, "c@:@"); + class_addMethod(appDelegate, s("applicationWillFinishLaunching:"), (IMP) willFinishLaunching, "v@:@"); + + // All Menu Items use a common callback + class_addMethod(appDelegate, s("menuItemCallback:"), (IMP)menuItemCallback, "v@:@"); + + // If there are URL Handlers, register the callback method + if( app->hasURLHandlers ) { + class_addMethod(appDelegate, s("getUrl:withReplyEvent:"), (IMP) getURL, "i@:@@"); + } + + // Script handler + class_addMethod(appDelegate, s("userContentController:didReceiveScriptMessage:"), (IMP) messageHandler, "v@:@@"); + objc_registerClassPair(appDelegate); + + // Create delegate + id delegate = msg_reg((id)appDelegate, s("new")); + objc_setAssociatedObject(delegate, "application", (id)app, OBJC_ASSOCIATION_ASSIGN); + + // Theme change listener + class_addMethod(appDelegate, s("themeChanged:"), (IMP) themeChanged, "v@:@@"); + + // Get defaultCenter + id defaultCenter = msg_reg(c("NSDistributedNotificationCenter"), s("defaultCenter")); + ((id(*)(id, SEL, id, SEL, id, id))objc_msgSend)(defaultCenter, s("addObserver:selector:name:object:"), delegate, s("themeChanged:"), str("AppleInterfaceThemeChangedNotification"), NULL); + + app->delegate = delegate; + + msg_id(app->application, s("setDelegate:"), delegate); +} + +bool windowShouldClose(id self, SEL cmd, id sender) { + msg_reg(sender, s("orderOut:")); + return false; +} + +bool windowShouldExit(id self, SEL cmd, id sender) { + msg_reg(sender, s("orderOut:")); + messageFromWindowCallback("WC"); + return false; +} + +void createMainWindow(struct Application *app) { + // Create main window + id mainWindow = ALLOC("NSWindow"); + mainWindow = ((id(*)(id, SEL, CGRect, int, int, BOOL))objc_msgSend)(mainWindow, s("initWithContentRect:styleMask:backing:defer:"), + CGRectMake(0, 0, app->width, app->height), app->decorations, NSBackingStoreBuffered, NO); + msg_reg(mainWindow, s("autorelease")); + + // Set Appearance + if( app->appearance != NULL ) { + msg_id(mainWindow, s("setAppearance:"), + msg_id(c("NSAppearance"), s("appearanceNamed:"), str(app->appearance)) + ); + } + + // Set Title appearance + msg_bool(mainWindow, s("setTitlebarAppearsTransparent:"), app->titlebarAppearsTransparent ? YES : NO); + msg_int(mainWindow, s("setTitleVisibility:"), app->hideTitle); + + // Create window delegate to override windowShouldClose + Class delegateClass = objc_allocateClassPair((Class) c("NSObject"), "WindowDelegate", 0); + bool resultAddProtoc = class_addProtocol(delegateClass, objc_getProtocol("NSWindowDelegate")); + if( app->hideWindowOnClose ) { + class_replaceMethod(delegateClass, s("windowShouldClose:"), (IMP) windowShouldClose, "v@:@"); + } else { + class_replaceMethod(delegateClass, s("windowShouldClose:"), (IMP) windowShouldExit, "v@:@"); + } + app->windowDelegate = msg_reg((id)delegateClass, s("new")); + msg_id(mainWindow, s("setDelegate:"), app->windowDelegate); + + app->mainWindow = mainWindow; +} + +const char* getInitialState(struct Application *app) { + const char *result = ""; + if( isDarkMode(app) ) { + result = "window.wails.System.IsDarkMode.set(true);"; + } else { + result = "window.wails.System.IsDarkMode.set(false);"; + } + char buffer[999]; + snprintf(&buffer[0], sizeof(buffer), "window.wails.System.LogLevel.set(%d);", app->logLevel); + result = concat(result, &buffer[0]); + Debug(app, "initialstate = %s", result); + return result; +} + +void parseMenuRole(struct Application *app, id parentMenu, JsonNode *item) { + const char *roleName = item->string_; + + if ( STREQ(roleName, "appMenu") ) { + createDefaultAppMenu(parentMenu); + return; + } + if ( STREQ(roleName, "editMenu")) { + createDefaultEditMenu(parentMenu); + return; + } + if ( STREQ(roleName, "hide")) { + addMenuItem(parentMenu, "Hide Window", "hide:", "h", FALSE); + return; + } + if ( STREQ(roleName, "hideothers")) { + id hideOthers = addMenuItem(parentMenu, "Hide Others", "hideOtherApplications:", "h", FALSE); + msg_int(hideOthers, s("setKeyEquivalentModifierMask:"), (NSEventModifierFlagOption | NSEventModifierFlagCommand)); + return; + } + if ( STREQ(roleName, "unhide")) { + addMenuItem(parentMenu, "Show All", "unhideAllApplications:", "", FALSE); + return; + } + if ( STREQ(roleName, "front")) { + addMenuItem(parentMenu, "Bring All to Front", "arrangeInFront:", "", FALSE); + return; + } + if ( STREQ(roleName, "undo")) { + addMenuItem(parentMenu, "Undo", "undo:", "z", FALSE); + return; + } + if ( STREQ(roleName, "redo")) { + addMenuItem(parentMenu, "Redo", "redo:", "y", FALSE); + return; + } + if ( STREQ(roleName, "cut")) { + addMenuItem(parentMenu, "Cut", "cut:", "x", FALSE); + return; + } + if ( STREQ(roleName, "copy")) { + addMenuItem(parentMenu, "Copy", "copy:", "c", FALSE); + return; + } + if ( STREQ(roleName, "paste")) { + addMenuItem(parentMenu, "Paste", "paste:", "v", FALSE); + return; + } + if ( STREQ(roleName, "delete")) { + addMenuItem(parentMenu, "Delete", "delete:", "", FALSE); + return; + } + if( STREQ(roleName, "pasteandmatchstyle")) { + id pasteandmatchstyle = addMenuItem(parentMenu, "Paste and Match Style", "pasteandmatchstyle:", "v", FALSE); + msg_int(pasteandmatchstyle, s("setKeyEquivalentModifierMask:"), (NSEventModifierFlagOption | NSEventModifierFlagShift | NSEventModifierFlagCommand)); + } + if ( STREQ(roleName, "selectall")) { + addMenuItem(parentMenu, "Select All", "selectAll:", "a", FALSE); + return; + } + if ( STREQ(roleName, "minimize")) { + addMenuItem(parentMenu, "Minimize", "miniaturize:", "m", FALSE); + return; + } + if ( STREQ(roleName, "zoom")) { + addMenuItem(parentMenu, "Zoom", "performZoom:", "", FALSE); + return; + } + if ( STREQ(roleName, "quit")) { + addMenuItem(parentMenu, "Quit", "terminate:", "q", FALSE); + return; + } + if ( STREQ(roleName, "togglefullscreen")) { + addMenuItem(parentMenu, "Toggle Full Screen", "toggleFullScreen:", "f", FALSE); + return; + } + +} + +void dumpMemberList(const char *name, id *memberList) { + void *member = memberList[0]; + int count = 0; + printf("%s = %p -> [ ", name, memberList); + while( member != NULL ) { + printf("%p ", member); + count = count + 1; + member = memberList[count]; + } + printf("]\n"); +} + +// updateMenu replaces the current menu with the given one +void updateMenu(struct Application *app, const char *menuAsJSON) { + Debug(app, "Menu is now: %s", menuAsJSON); + ON_MAIN_THREAD ( + DeleteMenu(app->applicationMenu); + Menu* newMenu = NewApplicationMenu(menuAsJSON); + id menu = GetMenu(newMenu); + app->applicationMenu = newMenu; + msg_id(msg_reg(c("NSApplication"), s("sharedApplication")), s("setMainMenu:"), menu); + ); +} + +// SetApplicationMenu sets the initial menu for the application +void SetApplicationMenu(struct Application *app, const char *menuAsJSON) { + // Guard against calling during shutdown + if( app->shuttingDown ) return; + + if ( app->applicationMenu == NULL ) { + app->applicationMenu = NewApplicationMenu(menuAsJSON); + return; + } + + // Update menu + ON_MAIN_THREAD ( + updateMenu(app, menuAsJSON); + ); +} + +void processDialogIcons(struct hashmap_s *hashmap, const unsigned char *dialogIcons[]) { + + unsigned int count = 0; + while( 1 ) { + const unsigned char *name = dialogIcons[count++]; + if( name == 0x00 ) { + break; + } + const unsigned char *lengthAsString = dialogIcons[count++]; + if( name == 0x00 ) { + break; + } + const unsigned char *data = dialogIcons[count++]; + if( data == 0x00 ) { + break; + } + int length = atoi((const char *)lengthAsString); + + // Create the icon and add to the hashmap + id imageData = ((id(*)(id, SEL, const unsigned char *, int))objc_msgSend)(c("NSData"), s("dataWithBytes:length:"), data, length); + id dialogImage = ALLOC("NSImage"); + msg_reg(dialogImage, s("autorelease")); + msg_id(dialogImage, s("initWithData:"), imageData); + hashmap_put(hashmap, (const char *)name, strlen((const char *)name), dialogImage); + } + +} + +void processUserDialogIcons(struct Application *app) { + + // Allocate the Dialog icon hashmap + if( 0 != hashmap_create((const unsigned)4, &dialogIconCache)) { + // Couldn't allocate map + Fatal(app, "Not enough memory to allocate dialogIconCache!"); + return; + } + + processDialogIcons(&dialogIconCache, defaultDialogIcons); + processDialogIcons(&dialogIconCache, userDialogIcons); + +} + +void TrayMenuWillOpen(id self, SEL selector, id menu) { + // Extract tray menu id from menu + id trayMenuIDStr = objc_getAssociatedObject(menu, "trayMenuID"); + const char* trayMenuID = cstr(trayMenuIDStr); + const char *message = concat("Mo", trayMenuID); + messageFromWindowCallback(message); + MEMFREE(message); +} + +void TrayMenuDidClose(id self, SEL selector, id menu) { + // Extract tray menu id from menu + id trayMenuIDStr = objc_getAssociatedObject(menu, "trayMenuID"); + const char* trayMenuID = cstr(trayMenuIDStr); + const char *message = concat("Mc", trayMenuID); + messageFromWindowCallback(message); + MEMFREE(message); +} + +void createTrayMenuDelegate() { + // Define delegate + trayMenuDelegateClass = objc_allocateClassPair((Class) c("NSObject"), "MenuDelegate", 0); + class_addProtocol(trayMenuDelegateClass, objc_getProtocol("NSMenuDelegate")); + class_addMethod(trayMenuDelegateClass, s("menuWillOpen:"), (IMP) TrayMenuWillOpen, "v@:@"); + class_addMethod(trayMenuDelegateClass, s("menuDidClose:"), (IMP) TrayMenuDidClose, "v@:@"); + + // Script handler + objc_registerClassPair(trayMenuDelegateClass); +} + + +void Run(struct Application *app, int argc, char **argv) { + + // Process window decorations + processDecorations(app); + + // Create the application + createApplication(app); + + // Define delegate + createDelegate(app); + + // Define tray delegate + createTrayMenuDelegate(); + + // Create the main window + createMainWindow(app); + + // Create Content View + id contentView = msg_reg( ALLOC("NSView"), s("init") ); + msg_id(app->mainWindow, s("setContentView:"), contentView); + + // Set the main window title + SetTitle(app, app->title); + + // Center Window + Center(app); + + // Set Colour + applyWindowColour(app); + + // Process translucency + if (app->windowBackgroundIsTranslucent) { + makeWindowBackgroundTranslucent(app); + } + + // We set it to be invisible by default. It will become visible when everything has initialised + msg_bool(app->mainWindow, s("setIsVisible:"), NO); + + // Setup webview + id config = msg_reg(c("WKWebViewConfiguration"), s("new")); + ((id(*)(id, SEL, id, id))objc_msgSend)(config, s("setValue:forKey:"), msg_bool(c("NSNumber"), s("numberWithBool:"), 1), str("suppressesIncrementalRendering")); + if (app->devtools) { + Debug(app, "Enabling devtools"); + enableBoolConfig(config, "developerExtrasEnabled"); + } + app->config = config; + + id manager = msg_reg(config, s("userContentController")); + msg_id_id(manager, s("addScriptMessageHandler:name:"), app->delegate, str("external")); + msg_id_id(manager, s("addScriptMessageHandler:name:"), app->delegate, str("completed")); + msg_id_id(manager, s("addScriptMessageHandler:name:"), app->delegate, str("error")); + app->manager = manager; + + id wkwebview = msg_reg(c("WKWebView"), s("alloc")); + app->wkwebview = wkwebview; + + ((id(*)(id, SEL, CGRect, id))objc_msgSend)(wkwebview, s("initWithFrame:configuration:"), CGRectMake(0, 0, 0, 0), config); + + msg_id(contentView, s("addSubview:"), wkwebview); + msg_int(wkwebview, s("setAutoresizingMask:"), NSViewWidthSizable | NSViewHeightSizable); + CGRect contentViewBounds = GET_BOUNDS(contentView); + ((id(*)(id, SEL, CGRect))objc_msgSend)(wkwebview, s("setFrame:"), contentViewBounds ); + + // Disable damn smart quotes + // Credit: https://stackoverflow.com/a/31640511 + id userDefaults = msg_reg(c("NSUserDefaults"), s("standardUserDefaults")); + ((id(*)(id, SEL, BOOL, id))objc_msgSend)(userDefaults, s("setBool:forKey:"), false, str("NSAutomaticQuoteSubstitutionEnabled")); + + // Setup drag message handler + msg_id_id(manager, s("addScriptMessageHandler:name:"), app->delegate, str("windowDrag")); + // Add mouse event hooks + app->mouseDownMonitor = ((id(*)(id, SEL, int, id (^)(id)))objc_msgSend)(c("NSEvent"), u("addLocalMonitorForEventsMatchingMask:handler:"), NSEventMaskLeftMouseDown, ^(id incomingEvent) { + // Make sure the mouse click was in the window, not the tray + id window = msg_reg(incomingEvent, s("window")); + if (window == app->mainWindow) { + app->mouseEvent = incomingEvent; + } + return incomingEvent; + }); + app->mouseUpMonitor = ((id(*)(id, SEL, int, id (^)(id)))objc_msgSend)(c("NSEvent"), u("addLocalMonitorForEventsMatchingMask:handler:"), NSEventMaskLeftMouseUp, ^(id incomingEvent) { + app->mouseEvent = NULL; + ShowMouse(); + return incomingEvent; + }); + + // Setup context menu message handler + msg_id_id(manager, s("addScriptMessageHandler:name:"), app->delegate, str("contextMenu")); + + // Toolbar + if( app->useToolBar ) { + Debug(app, "Setting Toolbar"); + id toolbar = msg_reg(c("NSToolbar"),s("alloc")); + msg_id(toolbar, s("initWithIdentifier:"), str("wails.toolbar")); + msg_reg(toolbar, s("autorelease")); + + // Separator + if( app->hideToolbarSeparator ) { + msg_bool(toolbar, s("setShowsBaselineSeparator:"), NO); + } + + msg_id(app->mainWindow, s("setToolbar:"), toolbar); + } + + // Fix up resizing + if (app->resizable == 0) { + app->minHeight = app->maxHeight = app->height; + app->minWidth = app->maxWidth = app->width; + } + setMinMaxSize(app); + + // Load HTML + id html = msg_id(c("NSURL"), s("URLWithString:"), str((const char*)assets[0])); + msg_id(wkwebview, s("loadRequest:"), msg_id(c("NSURLRequest"), s("requestWithURL:"), html)); + + Debug(app, "Loading Internal Code"); + // We want to evaluate the internal code plus runtime before the assets + const char *temp = concat(invoke, app->bindings); + const char *internalCode = concat(temp, (const char*)&runtime); + MEMFREE(temp); + + // Add code that sets up the initial state, EG: State Stores. + const char *initialState = getInitialState(app); + temp = concat(internalCode, initialState); + MEMFREE(initialState); + MEMFREE(internalCode); + internalCode = temp; + + // Loop over assets and build up one giant Mother Of All Evals + int index = 1; + while(1) { + // Get next asset pointer + const unsigned char *asset = assets[index]; + + // If we have no more assets, break + if (asset == 0x00) { + break; + } + + temp = concat(internalCode, (const char *)asset); + MEMFREE(internalCode); + internalCode = temp; + index++; + }; + + // Disable context menu if not in debug mode + if( debug != 1 ) { + temp = concat(internalCode, "wails._.DisableDefaultContextMenu();"); + MEMFREE(internalCode); + internalCode = temp; + } + + // class_addMethod(delegateClass, s("applicationWillFinishLaunching:"), (IMP) willFinishLaunching, "@@:@"); + // Include callback after evaluation + temp = concat(internalCode, "webkit.messageHandlers.completed.postMessage(true);"); + MEMFREE(internalCode); + internalCode = temp; + + // const char *viewportScriptString = "var meta = document.createElement('meta'); meta.setAttribute('name', 'viewport'); meta.setAttribute('content', 'width=device-width'); meta.setAttribute('initial-scale', '1.0'); meta.setAttribute('maximum-scale', '1.0'); meta.setAttribute('minimum-scale', '1.0'); meta.setAttribute('user-scalable', 'no'); document.getElementsByTagName('head')[0].appendChild(meta);"; + // ExecJS(app, viewportScriptString); + + + // This evaluates the MOAE once the Dom has finished loading + msg_id(manager, + s("addUserScript:"), + ((id(*)(id, SEL, id, int, int))objc_msgSend)(msg_reg(c("WKUserScript"), s("alloc")), + s("initWithSource:injectionTime:forMainFrameOnly:"), + str(internalCode), + 1, + 1)); + + + // Emit theme change event to notify of current system them + emitThemeChange(app); + + // If we want the webview to be transparent... + if( app->webviewIsTranparent == 1 ) { + ((id(*)(id, SEL, id, id))objc_msgSend)(wkwebview, s("setValue:forKey:"), msg_bool(c("NSNumber"), s("numberWithBool:"), 0), str("drawsBackground")); + } + + // If we have an application menu, process it + if( app->applicationMenu != NULL ) { + id menu = GetMenu(app->applicationMenu); + msg_id(msg_reg(c("NSApplication"), s("sharedApplication")), s("setMainMenu:"), menu); + } + + // Setup initial trays + ShowTrayMenusInStore(TrayMenuStoreSingleton); + + // Process dialog icons + processUserDialogIcons(app); + + // Finally call run + Debug(app, "Run called"); + msg_reg(app->application, s("run")); + + DestroyApplication(app); + + MEMFREE(internalCode); +} + +void SetActivationPolicy(struct Application* app, int policy) { + app->activationPolicy = policy; +} + +void HasURLHandlers(struct Application* app) { + app->hasURLHandlers = 1; +} + +// Quit will stop the cocoa application and free up all the memory +// used by the application +void Quit(struct Application *app) { + Debug(app, "Quit Called"); + msg_id(app->application, s("stop:"), NULL); +} + +id createImageFromBase64Data(const char *data, bool isTemplateImage) { + id nsdata = ALLOC("NSData"); + id imageData = ((id(*)(id, SEL, id, int))objc_msgSend)(nsdata, s("initWithBase64EncodedString:options:"), str(data), 0); + + // If it's not valid base64 data, use the broken image + if ( imageData == NULL ) { + imageData = ((id(*)(id, SEL, id, int))objc_msgSend)(nsdata, s("initWithBase64EncodedString:options:"), str(BrokenImage), 0); + } + id result = ALLOC("NSImage"); + msg_reg(result, s("autorelease")); + msg_id(result, s("initWithData:"), imageData); + msg_reg(nsdata, s("release")); + msg_reg(imageData, s("release")); + + if( isTemplateImage ) { + msg_bool(result, s("setTemplate:"), YES); + } + + return result; +} + +void* NewApplication(const char *title, int width, int height, int resizable, int devtools, int fullscreen, int startHidden, int logLevel, int hideWindowOnClose) { + + // Load the tray icons + LoadTrayIcons(); + + // Setup main application struct + struct Application *result = malloc(sizeof(struct Application)); + result->title = title; + result->width = width; + result->height = height; + result->minWidth = 0; + result->minHeight = 0; + result->maxWidth = 0; + result->maxHeight = 0; + result->resizable = resizable; + result->devtools = devtools; + result->fullscreen = fullscreen; + result->maximised = 0; + result->startHidden = startHidden; + result->decorations = 0; + result->logLevel = logLevel; + result->hideWindowOnClose = hideWindowOnClose; + + result->mainWindow = NULL; + result->mouseEvent = NULL; + result->mouseDownMonitor = NULL; + result->mouseUpMonitor = NULL; + + // Features + result->frame = 1; + result->hideTitle = 0; + result->hideTitleBar = 0; + result->fullSizeContent = 0; + result->useToolBar = 0; + result->hideToolbarSeparator = 0; + result->appearance = NULL; + result->windowBackgroundIsTranslucent = 0; + + // Window data + result->delegate = NULL; + + // Menu + result->applicationMenu = NULL; + + // Tray + TrayMenuStoreSingleton = NewTrayMenuStore(); + + // Context Menus + result->contextMenuStore = NewContextMenuStore(); + + // Window delegate + result->windowDelegate = NULL; + + // Window Appearance + result->titlebarAppearsTransparent = 0; + result->webviewIsTranparent = 0; + + result->sendMessageToBackend = (ffenestriCallback) messageFromWindowCallback; + + result->shuttingDown = false; + + result->activationPolicy = NSApplicationActivationPolicyRegular; + + result->hasURLHandlers = 0; + + result->startupURL = NULL; + + result->running = false; + + result->pool = msg_reg(c("NSAutoreleasePool"), s("new")); + + return (void*) result; +} + + +#endif diff --git a/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/ffenestri_darwin.go b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/ffenestri_darwin.go new file mode 100644 index 0000000..bd6086d --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/ffenestri_darwin.go @@ -0,0 +1,99 @@ +package ffenestri + +/* +#cgo darwin CFLAGS: -DFFENESTRI_DARWIN=1 +#cgo darwin LDFLAGS: -framework WebKit -framework CoreFoundation -lobjc + +#include "ffenestri.h" +#include "ffenestri_darwin.h" + +*/ +import "C" + +func (a *Application) processPlatformSettings() error { + + mac := a.config.Mac + titlebar := mac.TitleBar + + // HideTitle + if titlebar.HideTitle { + C.HideTitle(a.app) + } + + // HideTitleBar + if titlebar.HideTitleBar { + C.HideTitleBar(a.app) + } + + // Full Size Content + if titlebar.FullSizeContent { + C.FullSizeContent(a.app) + } + + // Toolbar + if titlebar.UseToolbar { + C.UseToolbar(a.app) + } + + if titlebar.HideToolbarSeparator { + C.HideToolbarSeparator(a.app) + } + + if titlebar.TitlebarAppearsTransparent { + C.TitlebarAppearsTransparent(a.app) + } + + // Process window Appearance + if mac.Appearance != "" { + C.SetAppearance(a.app, a.string2CString(string(mac.Appearance))) + } + + // Set activation policy + C.SetActivationPolicy(a.app, C.int(mac.ActivationPolicy)) + + // Check if the webview should be transparent + if mac.WebviewIsTransparent { + C.WebviewIsTransparent(a.app) + } + + // Check if window should be translucent + if mac.WindowBackgroundIsTranslucent { + C.WindowBackgroundIsTranslucent(a.app) + } + + // Process menu + //applicationMenu := options.GetApplicationMenu(a.config) + applicationMenu := a.menuManager.GetApplicationMenuJSON() + if applicationMenu != "" { + C.SetApplicationMenu(a.app, a.string2CString(applicationMenu)) + } + + // Process tray + trays, err := a.menuManager.GetTrayMenus() + if err != nil { + return err + } + if trays != nil { + for _, tray := range trays { + C.AddTrayMenu(a.app, a.string2CString(tray)) + } + } + + // Process context menus + contextMenus, err := a.menuManager.GetContextMenus() + if err != nil { + return err + } + if contextMenus != nil { + for _, contextMenu := range contextMenus { + C.AddContextMenu(a.app, a.string2CString(contextMenu)) + } + } + + // Process URL Handlers + if a.config.Mac.URLHandlers != nil { + C.HasURLHandlers(a.app) + } + + return nil +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/ffenestri_darwin.h b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/ffenestri_darwin.h new file mode 100644 index 0000000..26c5c82 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/ffenestri_darwin.h @@ -0,0 +1,154 @@ + +#ifndef FFENESTRI_DARWIN_H +#define FFENESTRI_DARWIN_H + + +#define OBJC_OLD_DISPATCH_PROTOTYPES 1 +#include +#include +#include +#include "json.h" +#include "hashmap.h" +#include "stdlib.h" + +typedef struct { + long maj; + long min; + long patch; +} OSVersion; + +// Macros to make it slightly more sane +#define msg objc_msgSend +#define msg_reg ((id(*)(id, SEL))objc_msgSend) +#define msg_id ((id(*)(id, SEL, id))objc_msgSend) +#define msg_id_id ((id(*)(id, SEL, id, id))objc_msgSend) +#define msg_bool ((id(*)(id, SEL, BOOL))objc_msgSend) +#define msg_int ((id(*)(id, SEL, int))objc_msgSend) +#define msg_uint ((id(*)(id, SEL, unsigned int))objc_msgSend) +#define msg_float ((id(*)(id, SEL, float))objc_msgSend) +#define kInternetEventClass 'GURL' +#define kAEGetURL 'GURL' +#define keyDirectObject '----' + +#define c(str) (id)objc_getClass(str) +#define s(str) sel_registerName(str) +#define u(str) sel_getUid(str) +#define str(input) ((id(*)(id, SEL, const char *))objc_msgSend)(c("NSString"), s("stringWithUTF8String:"), input) +#define strunicode(input) ((id(*)(id, SEL, id, unsigned short))objc_msgSend)(c("NSString"), s("stringWithFormat:"), str("%C"), (unsigned short)input) +#define cstr(input) (const char *)msg_reg(input, s("UTF8String")) +#define url(input) msg_id(c("NSURL"), s("fileURLWithPath:"), str(input)) +#define ALLOC(classname) msg_reg(c(classname), s("alloc")) +#define ALLOC_INIT(classname) msg_reg(msg_reg(c(classname), s("alloc")), s("init")) + +#if defined (__aarch64__) +#define GET_FRAME(receiver) ((CGRect(*)(id, SEL))objc_msgSend)(receiver, s("frame")) +#define GET_BOUNDS(receiver) ((CGRect(*)(id, SEL))objc_msgSend)(receiver, s("bounds")) +#define GET_OSVERSION(receiver) ((OSVersion(*)(id, SEL))objc_msgSend)(processInfo, s("operatingSystemVersion")); +#endif + +#if defined (__x86_64__) +#define GET_FRAME(receiver) ((CGRect(*)(id, SEL))objc_msgSend_stret)(receiver, s("frame")) +#define GET_BOUNDS(receiver) ((CGRect(*)(id, SEL))objc_msgSend_stret)(receiver, s("bounds")) +#define GET_OSVERSION(receiver) ((OSVersion(*)(id, SEL))objc_msgSend_stret)(processInfo, s("operatingSystemVersion")); +#endif + +#define GET_BACKINGSCALEFACTOR(receiver) ((CGFloat(*)(id, SEL))objc_msgSend)(receiver, s("backingScaleFactor")) + +#define ON_MAIN_THREAD(str) dispatch( ^{ str; } ) +#define MAIN_WINDOW_CALL(str) msg_reg(app->mainWindow, s((str))) + +#define NSBackingStoreBuffered 2 + +#define NSWindowStyleMaskBorderless 0 +#define NSWindowStyleMaskTitled 1 +#define NSWindowStyleMaskClosable 2 +#define NSWindowStyleMaskMiniaturizable 4 +#define NSWindowStyleMaskResizable 8 +#define NSWindowStyleMaskFullscreen 1 << 14 + +#define NSVisualEffectMaterialWindowBackground 12 +#define NSVisualEffectBlendingModeBehindWindow 0 +#define NSVisualEffectStateFollowsWindowActiveState 0 +#define NSVisualEffectStateActive 1 +#define NSVisualEffectStateInactive 2 + +#define NSViewWidthSizable 2 +#define NSViewHeightSizable 16 + +#define NSWindowBelow -1 +#define NSWindowAbove 1 + +#define NSSquareStatusItemLength -2.0 +#define NSVariableStatusItemLength -1.0 + +#define NSWindowTitleHidden 1 +#define NSWindowStyleMaskFullSizeContentView 1 << 15 + +#define NSEventModifierFlagCommand 1 << 20 +#define NSEventModifierFlagOption 1 << 19 +#define NSEventModifierFlagControl 1 << 18 +#define NSEventModifierFlagShift 1 << 17 + +#define NSControlStateValueMixed -1 +#define NSControlStateValueOff 0 +#define NSControlStateValueOn 1 + +#define NSApplicationActivationPolicyRegular 0 +#define NSApplicationActivationPolicyAccessory 1 +#define NSApplicationActivationPolicyProhibited 2 + +// Unbelievably, if the user swaps their button preference +// then right buttons are reported as left buttons +#define NSEventMaskLeftMouseDown 1 << 1 +#define NSEventMaskLeftMouseUp 1 << 2 +#define NSEventMaskRightMouseDown 1 << 3 +#define NSEventMaskRightMouseUp 1 << 4 + +#define NSEventTypeLeftMouseDown 1 +#define NSEventTypeLeftMouseUp 2 +#define NSEventTypeRightMouseDown 3 +#define NSEventTypeRightMouseUp 4 + +#define NSNoImage 0 +#define NSImageOnly 1 +#define NSImageLeft 2 +#define NSImageRight 3 +#define NSImageBelow 4 +#define NSImageAbove 5 +#define NSImageOverlaps 6 + +#define NSAlertStyleWarning 0 +#define NSAlertStyleInformational 1 +#define NSAlertStyleCritical 2 + +#define NSAlertFirstButtonReturn 1000 +#define NSAlertSecondButtonReturn 1001 +#define NSAlertThirdButtonReturn 1002 + +#define BrokenImage "iVBORw0KGgoAAAANSUhEUgAAABAAAAASCAMAAABl5a5YAAABj1BMVEWopan///+koqSWk5P9/v3///////////+AgACMiovz8/PB0fG9z+3i4+WysbGBfX1Erh80rACLiYqBxolEsDhHlDEbqQDDx+CNho7W1tj4+/bw+O3P5Mn4/f/W1tbK6sX////b2dn////////////8/Pz6+vro6Ojj4+P////G1PL////EzNydmp2cmZnd3eDF1PHs8v/o8P/Q3vrS3vfE0vCdmpqZkpr19/3N2vXI1vPH1fOgnqDg6frP3PbCytvHx8irqq6HhIZtuGtjnlZetU1Xs0NWskBNsi7w9v/d6P7w9P3S4Pzr8Pvl7PrY5PrU4PjQ3fjD1Ozo6Om30NjGzNi7ubm34K+UxKmbnaWXlJeUjpSPi4tppF1TtjxSsTf2+f7L2PTr7e3H2+3V7+q+0uXg4OPg4eLR1uG7z+Hg4ODGzODV2N7V1trP5dmxzs65vcfFxMWq0cKxxr+/vr+0s7apxbWaxrCv2qao05+dlp2Uuo2Dn4F8vIB6xnyAoHmAym9zqGpctENLryNFsgoblJpnAAAAKnRSTlP+hP7+5ZRmYgL+/f39/f39/f38/Pz8/Pv69+7j083My8GocnBPTTMWEgjxeITOAAABEklEQVQY0y3KZXuCYBiG4ceYuu7u3nyVAaKOMBBQ7O5Yd3f3fvheDnd9u8/jBkGwNxP6sjOWVQvY/ftrzfT6bd3yEhCnYZqiaYoKiwX/gXkFiHySTcUTLJMsZ9v8nQvgssWYOEKedKpcOO6CUXD5IlGEY5hLUbyDAAZ6HRf1bnkoavOsFQibg+Q4nuNYL+ON5PHD5nBaraRVyxnzGf6BJzUi2QQCQgMyk8tleL7dg1owpJ17D5IkvV100EingeOopPyo6vfAuXF+9hbDTknZCIaUoeK4efKwG4iT6xDewd7imGlid7gGwv37b6Oh9jwaTdOf/Tc1qH7UZVmuP6G5qZfBr9cAGNy4KiDd4tXIs7tS+QO9aUKvPAIKuQAAAABJRU5ErkJggg==" + +struct Application; +int releaseNSObject(void *const context, struct hashmap_element_s *const e); +void TitlebarAppearsTransparent(struct Application* app); +void HideTitle(struct Application* app); +void HideTitleBar(struct Application* app); +void FullSizeContent(struct Application* app); +void UseToolbar(struct Application* app); +void HideToolbarSeparator(struct Application* app); +void DisableFrame(struct Application* app); +void SetAppearance(struct Application* app, const char *); +void WebviewIsTransparent(struct Application* app); +void WindowBackgroundIsTranslucent(struct Application* app); +void SetTray(struct Application* app, const char *, const char *, const char *); +//void SetContextMenus(struct Application* app, const char *); +void AddTrayMenu(struct Application* app, const char *); + +void SetActivationPolicy(struct Application* app, int policy); + +void* lookupStringConstant(id constantName); + +void HasURLHandlers(struct Application* app); + +id createImageFromBase64Data(const char *data, bool isTemplateImage); + +#endif \ No newline at end of file diff --git a/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/ffenestri_linux.c b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/ffenestri_linux.c new file mode 100644 index 0000000..7e931d9 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/ffenestri_linux.c @@ -0,0 +1,995 @@ + +#ifndef __FFENESTRI_LINUX_H__ +#define __FFENESTRI_LINUX_H__ + +#include "common.h" +#include "gtk/gtk.h" +#include "webkit2/webkit2.h" +#include +#include +#include +#include +#include + +// References to assets +extern const unsigned char runtime; + +#include "icon.h" +#include "assets.h" + +// Constants +#define PRIMARY_MOUSE_BUTTON 1 +#define MIDDLE_MOUSE_BUTTON 2 +#define SECONDARY_MOUSE_BUTTON 3 + +// MAIN DEBUG FLAG +int debug; + +// Debug works like sprintf but mutes if the global debug flag is true +// Credit: https://stackoverflow.com/a/20639708 +void Debug(char *message, ...) +{ + if (debug) + { + char *temp = concat("TRACE | Ffenestri (C) | ", message); + message = concat(temp, "\n"); + free(temp); + va_list args; + va_start(args, message); + vprintf(message, args); + free(message); + va_end(args); + } +} + +extern void messageFromWindowCallback(const char *); +typedef void (*ffenestriCallback)(const char *); + +struct Application +{ + + // Gtk Data + GtkApplication *application; + GtkWindow *mainWindow; + GtkWidget *webView; + int signalInvoke; + int signalWindowDrag; + int signalButtonPressed; + int signalButtonReleased; + int signalLoadChanged; + + // Saves the events for the drag mouse button + GdkEventButton *dragButtonEvent; + + // The number of the default drag button + int dragButton; + + // Window Data + const char *title; + char *id; + int width; + int height; + int resizable; + int devtools; + int startHidden; + int fullscreen; + int minWidth; + int minHeight; + int maxWidth; + int maxHeight; + int frame; + + // User Data + char *HTML; + + // Callback + ffenestriCallback sendMessageToBackend; + + // Bindings + const char *bindings; + + // Lock - used for sync operations (Should we be using g_mutex?) + int lock; +}; + +void *NewApplication(const char *title, int width, int height, int resizable, int devtools, int fullscreen, int startHidden) +{ + // Setup main application struct + struct Application *result = malloc(sizeof(struct Application)); + result->title = title; + result->width = width; + result->height = height; + result->resizable = resizable; + result->devtools = devtools; + result->fullscreen = fullscreen; + result->minWidth = 0; + result->minHeight = 0; + result->maxWidth = 0; + result->maxHeight = 0; + result->frame = 1; + result->startHidden = startHidden; + + // Default drag button is PRIMARY + result->dragButton = PRIMARY_MOUSE_BUTTON; + + result->sendMessageToBackend = (ffenestriCallback)messageFromWindowCallback; + + // Create a unique ID based on the current unix timestamp + char temp[11]; + sprintf(&temp[0], "%d", (int)time(NULL)); + result->id = concat("wails.app", &temp[0]); + + // Create the main GTK application + GApplicationFlags flags = G_APPLICATION_FLAGS_NONE; + result->application = gtk_application_new(result->id, flags); + + // Return the application struct + return (void *)result; +} + +void DestroyApplication(struct Application *app) +{ + Debug("Destroying Application"); + + g_application_quit(G_APPLICATION(app->application)); + + // Release the GTK ID string + if (app->id != NULL) + { + free(app->id); + app->id = NULL; + } + else + { + Debug("Almost a double free for app->id"); + } + + // Free the bindings + if (app->bindings != NULL) + { + free((void *)app->bindings); + app->bindings = NULL; + } + else + { + Debug("Almost a double free for app->bindings"); + } + + // Disconnect signal handlers + WebKitUserContentManager *manager = webkit_web_view_get_user_content_manager((WebKitWebView *)app->webView); + g_signal_handler_disconnect(manager, app->signalInvoke); + if( app->frame == 0) { + g_signal_handler_disconnect(manager, app->signalWindowDrag); + g_signal_handler_disconnect(app->webView, app->signalButtonPressed); + g_signal_handler_disconnect(app->webView, app->signalButtonReleased); + } + g_signal_handler_disconnect(app->webView, app->signalLoadChanged); + + // Release the main GTK Application + if (app->application != NULL) + { + g_object_unref(app->application); + app->application = NULL; + } + else + { + Debug("Almost a double free for app->application"); + } + Debug("Finished Destroying Application"); +} + +// Quit will stop the gtk application and free up all the memory +// used by the application +void Quit(struct Application *app) +{ + Debug("Quit Called"); + gtk_window_close((GtkWindow *)app->mainWindow); + g_application_quit((GApplication *)app->application); + DestroyApplication(app); +} + +// SetTitle sets the main window title to the given string +void SetTitle(struct Application *app, const char *title) +{ + gtk_window_set_title(app->mainWindow, title); +} + +// Fullscreen sets the main window to be fullscreen +void Fullscreen(struct Application *app) +{ + gtk_window_fullscreen(app->mainWindow); +} + +// UnFullscreen resets the main window after a fullscreen +void UnFullscreen(struct Application *app) +{ + gtk_window_unfullscreen(app->mainWindow); +} + +void setMinMaxSize(struct Application *app) +{ + GdkGeometry size; + size.min_width = size.min_height = size.max_width = size.max_height = 0; + int flags = 0; + if (app->maxHeight > 0 && app->maxWidth > 0) + { + size.max_height = app->maxHeight; + size.max_width = app->maxWidth; + flags |= GDK_HINT_MAX_SIZE; + } + if (app->minHeight > 0 && app->minWidth > 0) + { + size.min_height = app->minHeight; + size.min_width = app->minWidth; + flags |= GDK_HINT_MIN_SIZE; + } + gtk_window_set_geometry_hints(app->mainWindow, NULL, &size, flags); +} + +char *fileDialogInternal(struct Application *app, GtkFileChooserAction chooserAction, char **args) { + GtkFileChooserNative *native; + GtkFileChooserAction action = chooserAction; + gint res; + char *filename; + + char *title = args[0]; + char *filter = args[1]; + + native = gtk_file_chooser_native_new(title, + app->mainWindow, + action, + "_Open", + "_Cancel"); + + GtkFileChooser *chooser = GTK_FILE_CHOOSER(native); + + // If we have filters, process them + if (filter[0] != '\0') { + GtkFileFilter *file_filter = gtk_file_filter_new(); + gchar **filters = g_strsplit(filter, ",", -1); + gint i; + for(i = 0; filters && filters[i]; i++) { + gtk_file_filter_add_pattern(file_filter, filters[i]); + // Debug("Adding filter pattern: %s\n", filters[i]); + } + gtk_file_filter_set_name(file_filter, filter); + gtk_file_chooser_add_filter(chooser, file_filter); + g_strfreev(filters); + } + + res = gtk_native_dialog_run(GTK_NATIVE_DIALOG(native)); + if (res == GTK_RESPONSE_ACCEPT) + { + filename = gtk_file_chooser_get_filename(chooser); + } + + g_object_unref(native); + + return filename; +} + +// openFileDialogInternal opens a dialog to select a file +// NOTE: The result is a string that will need to be freed! +char *openFileDialogInternal(struct Application *app, char **args) +{ + return fileDialogInternal(app, GTK_FILE_CHOOSER_ACTION_OPEN, args); +} + +// saveFileDialogInternal opens a dialog to select a file +// NOTE: The result is a string that will need to be freed! +char *saveFileDialogInternal(struct Application *app, char **args) +{ + return fileDialogInternal(app, GTK_FILE_CHOOSER_ACTION_SAVE, args); +} + + +// openDirectoryDialogInternal opens a dialog to select a directory +// NOTE: The result is a string that will need to be freed! +char *openDirectoryDialogInternal(struct Application *app, char **args) +{ + return fileDialogInternal(app, GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, args); +} + +void SetMinWindowSize(struct Application *app, int minWidth, int minHeight) +{ + app->minWidth = minWidth; + app->minHeight = minHeight; +} + +void SetMaxWindowSize(struct Application *app, int maxWidth, int maxHeight) +{ + app->maxWidth = maxWidth; + app->maxHeight = maxHeight; +} + +// SetColour sets the colour of the webview to the given colour string +void SetColour(struct Application *app, int red, int green, int blue, int alpha) +{ +// GdkRGBA rgba; +// rgba. +// gboolean result = gdk_rgba_parse(&rgba, colourString); +// if (result == FALSE) +// { +// return 0; +// } +// // Debug("Setting webview colour to: %s", colourString); +// webkit_web_view_get_background_color((WebKitWebView *)(app->webView), &rgba); +} + +// DisableFrame disables the window frame +void DisableFrame(struct Application *app) +{ + app->frame = 0; +} + +void syncCallback(GObject *source_object, + GAsyncResult *res, + void *data) +{ + struct Application *app = (struct Application *)data; + app->lock = 0; +} + +void syncEval(struct Application *app, const gchar *script) +{ + + WebKitWebView *webView = (WebKitWebView *)(app->webView); + + // wait for lock to free + while (app->lock == 1) + { + g_main_context_iteration(0, true); + } + // Set lock + app->lock = 1; + + webkit_web_view_run_javascript( + webView, + script, + NULL, syncCallback, (void*)app); + + while (app->lock == 1) + { + g_main_context_iteration(0, true); + } +} + +void asyncEval(WebKitWebView *webView, const gchar *script) +{ + webkit_web_view_run_javascript( + webView, + script, + NULL, NULL, NULL); +} + +typedef void (*dispatchMethod)(struct Application *app, void *); + +struct dispatchData +{ + struct Application *app; + dispatchMethod method; + void *args; +}; + +gboolean executeMethod(gpointer data) +{ + struct dispatchData *d = (struct dispatchData *)data; + (d->method)(d->app, d->args); + g_free(d); + return FALSE; +} + +void ExecJS(struct Application *app, char *js) +{ + struct dispatchData *data = (struct dispatchData *)g_new(struct dispatchData, 1); + data->method = (dispatchMethod)syncEval; + data->args = js; + data->app = app; + + gdk_threads_add_idle(executeMethod, data); +} + +typedef char *(*dialogMethod)(struct Application *app, void *); + +struct dialogCall +{ + struct Application *app; + dialogMethod method; + void *args; + void *filter; + char *result; + int done; +}; + +gboolean executeMethodWithReturn(gpointer data) +{ + struct dialogCall *d = (struct dialogCall *)data; + + d->result = (d->method)(d->app, d->args); + d->done = 1; + return FALSE; +} + +char *OpenFileDialog(struct Application *app, char *title, char *filter) +{ + struct dialogCall *data = (struct dialogCall *)g_new(struct dialogCall, 1); + data->result = NULL; + data->done = 0; + data->method = (dialogMethod)openFileDialogInternal; + const char* dialogArgs[]={ title, filter }; + data->args = dialogArgs; + data->app = app; + + gdk_threads_add_idle(executeMethodWithReturn, data); + + while (data->done == 0) + { + usleep(100000); + } + g_free(data); + return data->result; +} + +char *SaveFileDialog(struct Application *app, char *title, char *filter) +{ + struct dialogCall *data = (struct dialogCall *)g_new(struct dialogCall, 1); + data->result = NULL; + data->done = 0; + data->method = (dialogMethod)saveFileDialogInternal; + const char* dialogArgs[]={ title, filter }; + data->args = dialogArgs; + data->app = app; + + gdk_threads_add_idle(executeMethodWithReturn, data); + + while (data->done == 0) + { + usleep(100000); + } + Debug("Dialog done"); + Debug("Result = %s\n", data->result); + + g_free(data); + // Fingers crossed this wasn't freed by g_free above + return data->result; +} + +char *OpenDirectoryDialog(struct Application *app, char *title, char *filter) +{ + struct dialogCall *data = (struct dialogCall *)g_new(struct dialogCall, 1); + data->result = NULL; + data->done = 0; + data->method = (dialogMethod)openDirectoryDialogInternal; + const char* dialogArgs[]={ title, filter }; + data->args = dialogArgs; + data->app = app; + + gdk_threads_add_idle(executeMethodWithReturn, data); + + while (data->done == 0) + { + usleep(100000); + } + Debug("Directory Dialog done"); + Debug("Result = %s\n", data->result); + g_free(data); + // Fingers crossed this wasn't freed by g_free above + return data->result; +} + +// Sets the icon to the XPM stored in icon +void setIcon(struct Application *app) +{ + GdkPixbuf *appIcon = gdk_pixbuf_new_from_xpm_data((const char **)icon); + gtk_window_set_icon(app->mainWindow, appIcon); +} + +static void load_finished_cb(WebKitWebView *webView, + WebKitLoadEvent load_event, + struct Application *app) +{ + switch (load_event) + { + // case WEBKIT_LOAD_STARTED: + // /* New load, we have now a provisional URI */ + // // printf("Start downloading %s\n", webkit_web_view_get_uri(web_view)); + // /* Here we could start a spinner or update the + // * location bar with the provisional URI */ + // break; + // case WEBKIT_LOAD_REDIRECTED: + // // printf("Redirected to: %s\n", webkit_web_view_get_uri(web_view)); + // break; + // case WEBKIT_LOAD_COMMITTED: + // /* The load is being performed. Current URI is + // * the final one and it won't change unless a new + // * load is requested or a navigation within the + // * same page is performed */ + // // printf("Loading: %s\n", webkit_web_view_get_uri(web_view)); + // break; + case WEBKIT_LOAD_FINISHED: + /* Load finished, we can now stop the spinner */ + // printf("Finished loading: %s\n", webkit_web_view_get_uri(web_view)); + + // Bindings + Debug("Binding Methods"); + syncEval(app, app->bindings); + + // Setup IPC commands + Debug("Setting up IPC methods"); + const char *invoke = "window.wailsInvoke=function(message){window.webkit.messageHandlers.external.postMessage(message);};window.wailsDrag=function(message){window.webkit.messageHandlers.windowDrag.postMessage(message);};window.wailsContextMenuMessage=function(message){window.webkit.messageHandlers.contextMenu.postMessage(message);};"; + syncEval(app, invoke); + + // Runtime + Debug("Setting up Wails runtime"); + syncEval(app, &runtime); + + // Loop over assets + int index = 1; + while (1) + { + // Get next asset pointer + const char *asset = assets[index]; + + // If we have no more assets, break + if (asset == 0x00) + { + break; + } + + // sync eval the asset + syncEval(app, asset); + index++; + }; + + // Set the icon + setIcon(app); + + // Setup fullscreen + if (app->fullscreen) + { + Debug("Going fullscreen"); + Fullscreen(app); + } + + // Setup resize + gtk_window_resize(GTK_WINDOW(app->mainWindow), app->width, app->height); + + if (app->resizable) + { + gtk_window_set_default_size(GTK_WINDOW(app->mainWindow), app->width, app->height); + } + else + { + gtk_widget_set_size_request(GTK_WIDGET(app->mainWindow), app->width, app->height); + gtk_window_resize(GTK_WINDOW(app->mainWindow), app->width, app->height); + // Fix the min/max to the window size for good measure + app->minHeight = app->maxHeight = app->height; + app->minWidth = app->maxWidth = app->width; + } + gtk_window_set_resizable(GTK_WINDOW(app->mainWindow), app->resizable ? TRUE : FALSE); + setMinMaxSize(app); + + // Centre by default + gtk_window_set_position(app->mainWindow, GTK_WIN_POS_CENTER); + + // Show window and focus + if( app->startHidden == 0) { + gtk_widget_show_all(GTK_WIDGET(app->mainWindow)); + gtk_widget_grab_focus(app->webView); + } + break; + } +} + +static gboolean disable_context_menu_cb( + WebKitWebView *web_view, + WebKitContextMenu *context_menu, + GdkEvent *event, + WebKitHitTestResult *hit_test_result, + gpointer user_data) +{ + return TRUE; +} + +static void printEvent(const char *message, GdkEventButton *event) +{ + Debug("%s: [button:%d] [x:%f] [y:%f] [time:%d]", + message, + event->button, + event->x_root, + event->y_root, + event->time); +} + + +static void dragWindow(WebKitUserContentManager *contentManager, + WebKitJavascriptResult *result, + struct Application *app) +{ + // If we get this message erroneously, ignore + if (app->dragButtonEvent == NULL) + { + return; + } + + // Ignore non-toplevel widgets + GtkWidget *window = gtk_widget_get_toplevel(GTK_WIDGET(app->webView)); + if (!GTK_IS_WINDOW(window)) + { + return; + } + + // Initiate the drag + printEvent("Starting drag with event", app->dragButtonEvent); + + gtk_window_begin_move_drag(app->mainWindow, + app->dragButton, + app->dragButtonEvent->x_root, + app->dragButtonEvent->y_root, + app->dragButtonEvent->time); + // Clear the event + app->dragButtonEvent = NULL; + + return; +} + +gboolean buttonPress(GtkWidget *widget, GdkEventButton *event, struct Application *app) +{ + if (event->type == GDK_BUTTON_PRESS && event->button == app->dragButton) + { + app->dragButtonEvent = event; + } + return FALSE; +} + +gboolean buttonRelease(GtkWidget *widget, GdkEventButton *event, struct Application *app) +{ + if (event->type == GDK_BUTTON_RELEASE && event->button == app->dragButton) + { + app->dragButtonEvent = NULL; + } + return FALSE; +} + +static void sendMessageToBackend(WebKitUserContentManager *contentManager, + WebKitJavascriptResult *result, + struct Application *app) +{ +#if WEBKIT_MAJOR_VERSION >= 2 && WEBKIT_MINOR_VERSION >= 22 + JSCValue *value = webkit_javascript_result_get_js_value(result); + char *message = jsc_value_to_string(value); +#else + JSGlobalContextRef context = webkit_javascript_result_get_global_context(result); + JSValueRef value = webkit_javascript_result_get_value(result); + JSStringRef js = JSValueToStringCopy(context, value, NULL); + size_t messageSize = JSStringGetMaximumUTF8CStringSize(js); + char *message = g_new(char, messageSize); + JSStringGetUTF8CString(js, message, messageSize); + JSStringRelease(js); +#endif + app->sendMessageToBackend(message); + g_free(message); +} + +void SetDebug(struct Application *app, int flag) +{ + debug = flag; +} + +// getCurrentMonitorGeometry gets the geometry of the monitor +// that the window is mostly on. +GdkRectangle getCurrentMonitorGeometry(GtkWindow *window) { + // Get the monitor that the window is currently on + GdkDisplay *display = gtk_widget_get_display(GTK_WIDGET(window)); + GdkWindow *gdk_window = gtk_widget_get_window(GTK_WIDGET(window)); + GdkMonitor *monitor = gdk_display_get_monitor_at_window (display, gdk_window); + + // Get the geometry of the monitor + GdkRectangle result; + gdk_monitor_get_geometry (monitor,&result); + + return result; +} + +/******************* + * Window Position * + *******************/ + +// Position holds an x/y corrdinate +struct Position { + int x; + int y; +}; + +// Internal call for setting the position of the window. +void setPositionInternal(struct Application *app, struct Position *pos) { + + // Get the monitor geometry + GdkRectangle m = getCurrentMonitorGeometry(app->mainWindow); + + // Move the window relative to the monitor + gtk_window_move(app->mainWindow, m.x + pos->x, m.y + pos->y); + + // Free memory + free(pos); +} + +// SetPosition sets the position of the window to the given x/y +// coordinates. The x/y values are relative to the monitor +// the window is mostly on. +void SetPosition(struct Application *app, int x, int y) { + struct dispatchData *data = (struct dispatchData *)g_new(struct dispatchData, 1); + data->method = (dispatchMethod)setPositionInternal; + struct Position *pos = malloc(sizeof(struct Position)); + pos->x = x; + pos->y = y; + data->args = pos; + data->app = app; + + gdk_threads_add_idle(executeMethod, data); +} + +/*************** + * Window Size * + ***************/ + +// Size holds a width/height +struct Size { + int width; + int height; +}; + +// Internal call for setting the size of the window. +void setSizeInternal(struct Application *app, struct Size *size) { + gtk_window_resize(app->mainWindow, size->width, size->height); + free(size); +} + +// SetSize sets the size of the window to the given width/height +void SetSize(struct Application *app, int width, int height) { + struct dispatchData *data = (struct dispatchData *)g_new(struct dispatchData, 1); + data->method = (dispatchMethod)setSizeInternal; + struct Size *size = malloc(sizeof(struct Size)); + size->width = width; + size->height = height; + data->args = size; + data->app = app; + + gdk_threads_add_idle(executeMethod, data); +} + + +// centerInternal will center the main window on the monitor it is mostly in +void centerInternal(struct Application *app) +{ + // Get the geometry of the monitor + GdkRectangle m = getCurrentMonitorGeometry(app->mainWindow); + + // Get the window width/height + int windowWidth, windowHeight; + gtk_window_get_size(app->mainWindow, &windowWidth, &windowHeight); + + // Place the window at the center of the monitor + gtk_window_move(app->mainWindow, ((m.width - windowWidth) / 2) + m.x, ((m.height - windowHeight) / 2) + m.y); +} + +// Center the window +void Center(struct Application *app) { + + // Setup a call to centerInternal on the main thread + struct dispatchData *data = (struct dispatchData *)g_new(struct dispatchData, 1); + data->method = (dispatchMethod)centerInternal; + data->app = app; + + // Add call to main thread + gdk_threads_add_idle(executeMethod, data); +} + +// hideInternal hides the main window +void hideInternal(struct Application *app) { + gtk_widget_hide (GTK_WIDGET(app->mainWindow)); +} + +// Hide places the hideInternal method onto the main thread for execution +void Hide(struct Application *app) { + + // Setup a call to hideInternal on the main thread + struct dispatchData *data = (struct dispatchData *)g_new(struct dispatchData, 1); + data->method = (dispatchMethod)hideInternal; + data->app = app; + + // Add call to main thread + gdk_threads_add_idle(executeMethod, data); +} + +// showInternal shows the main window +void showInternal(struct Application *app) { + gtk_widget_show_all(GTK_WIDGET(app->mainWindow)); + gtk_widget_grab_focus(app->webView); +} + +// Show places the showInternal method onto the main thread for execution +void Show(struct Application *app) { + struct dispatchData *data = (struct dispatchData *)g_new(struct dispatchData, 1); + data->method = (dispatchMethod)showInternal; + data->app = app; + + gdk_threads_add_idle(executeMethod, data); +} + + +// maximiseInternal maximises the main window +void maximiseInternal(struct Application *app) { + gtk_window_maximize(GTK_WINDOW(app->mainWindow)); +} + +// Maximise places the maximiseInternal method onto the main thread for execution +void Maximise(struct Application *app) { + + // Setup a call to maximiseInternal on the main thread + struct dispatchData *data = (struct dispatchData *)g_new(struct dispatchData, 1); + data->method = (dispatchMethod)maximiseInternal; + data->app = app; + + // Add call to main thread + gdk_threads_add_idle(executeMethod, data); +} + +// unmaximiseInternal unmaximises the main window +void unmaximiseInternal(struct Application *app) { + gtk_window_unmaximize(GTK_WINDOW(app->mainWindow)); +} + +// Unmaximise places the unmaximiseInternal method onto the main thread for execution +void Unmaximise(struct Application *app) { + + // Setup a call to unmaximiseInternal on the main thread + struct dispatchData *data = (struct dispatchData *)g_new(struct dispatchData, 1); + data->method = (dispatchMethod)unmaximiseInternal; + data->app = app; + + // Add call to main thread + gdk_threads_add_idle(executeMethod, data); +} + + +void DarkModeEnabled(struct Application* app, char *callbackID) {} +void SetApplicationMenu(struct Application* app, const char *menuJSON) {} +void AddTrayMenu(struct Application* app, const char *menuTrayJSON) {} +void SetTrayMenu(struct Application* app, const char *menuTrayJSON) {} +void DeleteTrayMenuByID(struct Application* app, const char *id) {} +void UpdateTrayMenuLabel(struct Application* app, const char* JSON) {} +void AddContextMenu(struct Application* app, char *contextMenuJSON) {} +void UpdateContextMenu(struct Application* app, char *contextMenuJSON) {} +void WebviewIsTransparent(struct Application* app) {} +void WindowBackgroundIsTranslucent(struct Application* app) {} +void OpenDialog(struct Application* app, char *callbackID, char *title, char *filters, char *defaultFilename, char *defaultDir, int allowFiles, int allowDirs, int allowMultiple, int showHiddenFiles, int canCreateDirectories, int resolvesAliases, int treatPackagesAsDirectories) {} +void SaveDialog(struct Application* app, char *callbackID, char *title, char *filters, char *defaultFilename, char *defaultDir, int showHiddenFiles, int canCreateDirectories, int treatPackagesAsDirectories) {} +void MessageDialog(struct Application* app, char *callbackID, char *type, char *title, char *message, char *icon, char *button1, char *button2, char *button3, char *button4, char *defaultButton, char *cancelButton) {} + + +// minimiseInternal minimises the main window +void minimiseInternal(struct Application *app) { + gtk_window_iconify(app->mainWindow); +} + +// Minimise places the minimiseInternal method onto the main thread for execution +void Minimise(struct Application *app) { + + // Setup a call to minimiseInternal on the main thread + struct dispatchData *data = (struct dispatchData *)g_new(struct dispatchData, 1); + data->method = (dispatchMethod)minimiseInternal; + data->app = app; + + // Add call to main thread + gdk_threads_add_idle(executeMethod, data); +} + +// unminimiseInternal unminimises the main window +void unminimiseInternal(struct Application *app) { + gtk_window_present(app->mainWindow); +} + +// Unminimise places the unminimiseInternal method onto the main thread for execution +void Unminimise(struct Application *app) { + + // Setup a call to unminimiseInternal on the main thread + struct dispatchData *data = (struct dispatchData *)g_new(struct dispatchData, 1); + data->method = (dispatchMethod)unminimiseInternal; + data->app = app; + + // Add call to main thread + gdk_threads_add_idle(executeMethod, data); +} + + +void SetBindings(struct Application *app, const char *bindings) +{ + const char *temp = concat("window.wailsbindings = \"", bindings); + const char *jscall = concat(temp, "\";"); + free((void *)temp); + app->bindings = jscall; +} + +// This is called when the close button on the window is pressed +gboolean close_button_pressed(GtkWidget *widget, + GdkEvent *event, + struct Application *app) +{ + app->sendMessageToBackend("WC"); // Window Close + return TRUE; +} + +static void setupWindow(struct Application *app) +{ + + // Create the window + GtkWidget *mainWindow = gtk_application_window_new(app->application); + // Save reference + app->mainWindow = GTK_WINDOW(mainWindow); + + // Setup frame + gtk_window_set_decorated((GtkWindow *)mainWindow, app->frame); + + // Setup title + gtk_window_set_title(GTK_WINDOW(mainWindow), app->title); + + // Setup script handler + WebKitUserContentManager *contentManager = webkit_user_content_manager_new(); + + // Setup the invoke handler + webkit_user_content_manager_register_script_message_handler(contentManager, "external"); + app->signalInvoke = g_signal_connect(contentManager, "script-message-received::external", G_CALLBACK(sendMessageToBackend), app); + + // Setup the window drag handler if this is a frameless app + if ( app->frame == 0 ) { + webkit_user_content_manager_register_script_message_handler(contentManager, "windowDrag"); + app->signalWindowDrag = g_signal_connect(contentManager, "script-message-received::windowDrag", G_CALLBACK(dragWindow), app); + // Setup the mouse handlers + app->signalButtonPressed = g_signal_connect(app->webView, "button-press-event", G_CALLBACK(buttonPress), app); + app->signalButtonReleased = g_signal_connect(app->webView, "button-release-event", G_CALLBACK(buttonRelease), app); + } + GtkWidget *webView = webkit_web_view_new_with_user_content_manager(contentManager); + + // Save reference + app->webView = webView; + + // Add the webview to the window + gtk_container_add(GTK_CONTAINER(mainWindow), webView); + + + // Load default HTML + app->signalLoadChanged = g_signal_connect(G_OBJECT(webView), "load-changed", G_CALLBACK(load_finished_cb), app); + + // Load the user's HTML + // assets[0] is the HTML because the asset array is bundled like that by convention + webkit_web_view_load_uri(WEBKIT_WEB_VIEW(webView), assets[0]); + + // Check if we want to enable the dev tools + if (app->devtools) + { + WebKitSettings *settings = webkit_web_view_get_settings(WEBKIT_WEB_VIEW(webView)); + // webkit_settings_set_enable_write_console_messages_to_stdout(settings, true); + webkit_settings_set_enable_developer_extras(settings, true); + } + else + { + g_signal_connect(G_OBJECT(webView), "context-menu", G_CALLBACK(disable_context_menu_cb), app); + } + + // Listen for close button signal + g_signal_connect(GTK_WIDGET(mainWindow), "delete-event", G_CALLBACK(close_button_pressed), app); +} + +static void activate(GtkApplication* _, struct Application *app) +{ + setupWindow(app); +} + +void Run(struct Application *app, int argc, char **argv) +{ + g_signal_connect(app->application, "activate", G_CALLBACK(activate), app); + g_application_run(G_APPLICATION(app->application), argc, argv); +} + +#endif diff --git a/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/ffenestri_linux.go b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/ffenestri_linux.go new file mode 100644 index 0000000..ca7abe7 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/ffenestri_linux.go @@ -0,0 +1,17 @@ +package ffenestri + +/* +#cgo linux CFLAGS: -DFFENESTRI_LINUX=1 +#cgo linux pkg-config: gtk+-3.0 webkit2gtk-4.0 + + +#include "ffenestri.h" +#include "ffenestri_linux.h" + +*/ +import "C" + +func (a *Application) processPlatformSettings() error { + + return nil +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/ffenestri_linux.h b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/ffenestri_linux.h new file mode 100644 index 0000000..26902d3 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/ffenestri_linux.h @@ -0,0 +1,6 @@ + +#ifndef FFENESTRI_LINUX_H +#define FFENESTRI_LINUX_H + + +#endif \ No newline at end of file diff --git a/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/ffenestri_windows.cpp b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/ffenestri_windows.cpp new file mode 100644 index 0000000..5d15b6e --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/ffenestri_windows.cpp @@ -0,0 +1,881 @@ +// Some code may be inspired by or directly used from Webview (c) zserge. +// License included in README.md + +#include "ffenestri_windows.h" +#include "shellscalingapi.h" +#include "wv2ComHandler_windows.h" +#include +#include +#include +#include +#include +#include "windows/WebView2.h" +#include +#include "effectstructs_windows.h" +#include + +int debug = 0; +DWORD mainThread; + +#define WS_EX_NOREDIRECTIONBITMAP 0x00200000L + +// --- Assets +extern const unsigned char runtime; +extern const unsigned char *defaultDialogIcons[]; + +// dispatch will execute the given `func` pointer +void dispatch(dispatchFunction func) { + PostThreadMessage(mainThread, WM_APP, 0, (LPARAM) new dispatchFunction(func)); +} + +LPWSTR cstrToLPWSTR(const char *cstr) { + int wchars_num = MultiByteToWideChar( CP_UTF8 , 0 , cstr , -1, NULL , 0 ); + wchar_t* wstr = new wchar_t[wchars_num+1]; + MultiByteToWideChar( CP_UTF8 , 0 , cstr , -1, wstr , wchars_num ); + return wstr; +} + +// Credit: https://stackoverflow.com/a/9842450 +char* LPWSTRToCstr(LPWSTR input) { + int length = WideCharToMultiByte(CP_UTF8, 0, input, -1, 0, 0, NULL, NULL); + char* output = new char[length]; + WideCharToMultiByte(CP_UTF8, 0, input, -1, output , length, NULL, NULL); + return output; +} + + +// Credit: https://building.enlyze.com/posts/writing-win32-apps-like-its-2020-part-3/ +typedef int (__cdecl *PGetDpiForMonitor)(HMONITOR, MONITOR_DPI_TYPE,UINT*,UINT*); +void getDPIForWindow(struct Application *app) +{ + HMODULE hShcore = LoadLibraryW(L"shcore"); + if (hShcore) + { + PGetDpiForMonitor pGetDpiForMonitor = reinterpret_cast(GetProcAddress(hShcore, "GetDpiForMonitor")); + if (pGetDpiForMonitor) + { + HMONITOR hMonitor = MonitorFromWindow(app->window, MONITOR_DEFAULTTOPRIMARY); + pGetDpiForMonitor(hMonitor, (MONITOR_DPI_TYPE)0, &app->dpix, &app->dpiy); + } + } else { + // We couldn't get the window's DPI above, so get the DPI of the primary monitor + // using an API that is available in all Windows versions. + HDC hScreenDC = GetDC(0); + app->dpix = GetDeviceCaps(hScreenDC, LOGPIXELSX); + app->dpiy = GetDeviceCaps(hScreenDC, LOGPIXELSY); + ReleaseDC(0, hScreenDC); + } +} + +struct Application *NewApplication(const char *title, int width, int height, int resizable, int devtools, int fullscreen, int startHidden, int logLevel, int hideWindowOnClose) { + + // Create application + struct Application *result = (struct Application*)malloc(sizeof(struct Application)); + + result->window = nullptr; + result->webview = nullptr; + result->webviewController = nullptr; + + result->title = title; + result->width = width; + result->height = height; + result->resizable = resizable; + result->devtools = devtools; + result->fullscreen = fullscreen; + result->startHidden = startHidden; + result->logLevel = logLevel; + result->hideWindowOnClose = hideWindowOnClose; + result->webviewIsTranparent = false; + result->windowBackgroundIsTranslucent = false; + result->disableWindowIcon = false; + + // Min/Max Width/Height + result->minWidth = 0; + result->minHeight = 0; + result->maxWidth = 0; + result->maxHeight = 0; + + // Default colour + result->backgroundColour.R = 255; + result->backgroundColour.G = 255; + result->backgroundColour.B = 255; + result->backgroundColour.A = 255; + + // Have a frame by default + result->frame = 1; + + // Capture Main Thread + mainThread = GetCurrentThreadId(); + + // Startup url + result->startupURL = nullptr; + + // Used to remember the window location when going fullscreen + result->previousPlacement = { sizeof(result->previousPlacement) }; + + // DPI + result->dpix = result->dpiy = 0; + + return result; +} + +void* GetWindowHandle(struct Application *app) { + return (void*)app->window; +} + +void SetMinWindowSize(struct Application* app, int minWidth, int minHeight) { + app->minWidth = (LONG)minWidth; + app->minHeight = (LONG)minHeight; +} + +void SetMaxWindowSize(struct Application* app, int maxWidth, int maxHeight) { + app->maxWidth = (LONG)maxWidth; + app->maxHeight = (LONG)maxHeight; +} + +void SetBindings(struct Application *app, const char *bindings) { + std::string temp = std::string("window.wailsbindings = \"") + std::string(bindings) + std::string("\";"); + app->bindings = new char[temp.length()+1]; + memcpy(app->bindings, temp.c_str(), temp.length()+1); +} + +void performShutdown(struct Application *app) { + if( app->startupURL != nullptr ) { + delete[] app->startupURL; + } + messageFromWindowCallback("WC"); +} + +// Credit: https://gist.github.com/ysc3839/b08d2bff1c7dacde529bed1d37e85ccf +void enableTranslucentBackground(struct Application *app) { + HMODULE hUser = GetModuleHandleA("user32.dll"); + if (hUser) + { + pfnSetWindowCompositionAttribute setWindowCompositionAttribute = (pfnSetWindowCompositionAttribute)GetProcAddress(hUser, "SetWindowCompositionAttribute"); + if (setWindowCompositionAttribute) + { + ACCENT_POLICY accent = { ACCENT_ENABLE_BLURBEHIND, 0, 0, 0 }; + WINDOWCOMPOSITIONATTRIBDATA data; + data.Attrib = WCA_ACCENT_POLICY; + data.pvData = &accent; + data.cbData = sizeof(accent); + setWindowCompositionAttribute(app->window, &data); + } + } +} + +LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { + + struct Application *app = (struct Application *)GetWindowLongPtr(hwnd, GWLP_USERDATA); + + switch(msg) { + + case WM_CREATE: { + createApplicationMenu(hwnd); + break; + } + case WM_COMMAND: + menuClicked(LOWORD(wParam)); + break; + + case WM_CLOSE: { + DestroyWindow( app->window ); + break; + } + case WM_DESTROY: { + if( app->hideWindowOnClose ) { + Hide(app); + } else { + PostQuitMessage(0); + } + break; + } + case WM_SIZE: { + if ( app == NULL ) { + return 0; + } + if( app->webviewController != nullptr) { + RECT bounds; + GetClientRect(app->window, &bounds); + app->webviewController->put_Bounds(bounds); + } + break; + } + case WM_GETMINMAXINFO: { + // Exit early if this is called before the window is created. + if ( app == NULL ) { + return 0; + } + + // update DPI + getDPIForWindow(app); + double DPIScaleX = app->dpix/96.0; + double DPIScaleY = app->dpiy/96.0; + + RECT rcWind; + POINT ptDiff; + GetWindowRect(hwnd, &rcWind); + + int widthExtra = (rcWind.right - rcWind.left); + int heightExtra = (rcWind.bottom - rcWind.top); + + LPMINMAXINFO mmi = (LPMINMAXINFO) lParam; + if (app->minWidth > 0 && app->minHeight > 0) { + mmi->ptMinTrackSize.x = app->minWidth * DPIScaleX; + mmi->ptMinTrackSize.y = app->minHeight * DPIScaleY; + } + if (app->maxWidth > 0 && app->maxHeight > 0) { + mmi->ptMaxSize.x = app->maxWidth * DPIScaleX; + mmi->ptMaxSize.y = app->maxHeight * DPIScaleY; + mmi->ptMaxTrackSize.x = app->maxWidth * DPIScaleX; + mmi->ptMaxTrackSize.y = app->maxHeight * DPIScaleY; + } + return 0; + } + default: + return DefWindowProc(hwnd, msg, wParam, lParam); + } + return 0; +} + +void init(struct Application *app, const char* js) { + LPCWSTR wjs = cstrToLPWSTR(js); + app->webview->AddScriptToExecuteOnDocumentCreated(wjs, nullptr); + delete[] wjs; +} + +void execJS(struct Application* app, const char *script) { + LPWSTR s = cstrToLPWSTR(script); + app->webview->ExecuteScript(s, nullptr); + delete[] s; +} + +void loadAssets(struct Application* app) { + + // setup window.wailsInvoke + std::string initialCode = std::string("window.wailsInvoke=function(m){window.chrome.webview.postMessage(m)};"); + + // Load bindings + initialCode += std::string(app->bindings); + delete[] app->bindings; + + // Load runtime + initialCode += std::string((const char*)&runtime); + + int index = 1; + while(1) { + // Get next asset pointer + const unsigned char *asset = assets[index]; + + // If we have no more assets, break + if (asset == 0x00) { + break; + } + + initialCode += std::string((const char*)asset); + index++; + }; + + // Disable context menu if not in debug mode + if( debug != 1 ) { + initialCode += std::string("wails._.DisableDefaultContextMenu();"); + } + + initialCode += std::string("window.wailsInvoke('completed');"); + + // Keep a copy of the code + app->initialCode = new char[initialCode.length()+1]; + memcpy(app->initialCode, initialCode.c_str(), initialCode.length()+1); + + execJS(app, app->initialCode); + + // Show app if we need to + if( app->startHidden == false ) { + Show(app); + } +} + +// This is called when all our assets are loaded into the DOM +void completed(struct Application* app) { + delete[] app->initialCode; + app->initialCode = nullptr; + + // Process whether window should show by default + int startVisibility = SW_SHOWNORMAL; + if ( app->startHidden == 1 ) { + startVisibility = SW_HIDE; + } + + // Fix for webview2 bug: https://github.com/MicrosoftEdge/WebView2Feedback/issues/1077 + // Will be fixed in next stable release + app->webviewController->put_IsVisible(false); + app->webviewController->put_IsVisible(true); + + // Private setTitle as we're on the main thread + if( app->frame == 1) { + setTitle(app, app->title); + } + + ShowWindow(app->window, startVisibility); + UpdateWindow(app->window); + SetFocus(app->window); + + if( app->startupURL == nullptr ) { + messageFromWindowCallback("SS"); + return; + } + std::string readyMessage = std::string("SS") + std::string(app->startupURL); + messageFromWindowCallback(readyMessage.c_str()); +} + +// +bool initWebView2(struct Application *app, int debugEnabled, messageCallback cb) { + + debug = debugEnabled; + + CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); + + std::atomic_flag flag = ATOMIC_FLAG_INIT; + flag.test_and_set(); + + char currentExePath[MAX_PATH]; + GetModuleFileNameA(NULL, currentExePath, MAX_PATH); + char *currentExeName = PathFindFileNameA(currentExePath); + + std::wstring_convert> wideCharConverter; + std::wstring userDataFolder = + wideCharConverter.from_bytes(std::getenv("APPDATA")); + std::wstring currentExeNameW = wideCharConverter.from_bytes(currentExeName); + + ICoreWebView2Controller *controller; + ICoreWebView2* webview; + + HRESULT res = CreateCoreWebView2EnvironmentWithOptions( + nullptr, (userDataFolder + L"/" + currentExeNameW).c_str(), nullptr, + new wv2ComHandler(app, app->window, cb, + [&](ICoreWebView2Controller *webviewController) { + controller = webviewController; + controller->get_CoreWebView2(&webview); + webview->AddRef(); + ICoreWebView2Settings* settings; + webview->get_Settings(&settings); + if ( debugEnabled == 0 ) { + settings->put_AreDefaultContextMenusEnabled(FALSE); + } + // Fix for invisible webview + if( app->startHidden ) {} + flag.clear(); + })); + if (!SUCCEEDED(res)) + { + switch (res) + { + case HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND): + { + MessageBox( + app->window, + L"Couldn't find Edge installation. " + "Do you have a version installed that's compatible with this " + "WebView2 SDK version?", + nullptr, MB_OK); + } + break; + case HRESULT_FROM_WIN32(ERROR_FILE_EXISTS): + { + MessageBox( + app->window, L"User data folder cannot be created because a file with the same name already exists.", nullptr, MB_OK); + } + break; + case E_ACCESSDENIED: + { + MessageBox( + app->window, L"Unable to create user data folder, Access Denied.", nullptr, MB_OK); + } + break; + case E_FAIL: + { + MessageBox( + app->window, L"Edge runtime unable to start", nullptr, MB_OK); + } + break; + default: + { + MessageBox(app->window, L"Failed to create WebView2 environment", nullptr, MB_OK); + } + } + } + + if (res != S_OK) { + CoUninitialize(); + return false; + } + + MSG msg = {}; + while (flag.test_and_set() && GetMessage(&msg, NULL, 0, 0)) { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + app->webviewController = controller; + app->webview = webview; + + // Resize WebView to fit the bounds of the parent window + RECT bounds; + GetClientRect(app->window, &bounds); + app->webviewController->put_Bounds(bounds); + + // Let the backend know we have initialised + app->webview->AddScriptToExecuteOnDocumentCreated(L"window.chrome.webview.postMessage('initialised');", nullptr); + // Load the HTML + LPCWSTR html = (LPCWSTR) cstrToLPWSTR((char*)assets[0]); + app->webview->Navigate(html); + + if( app->webviewIsTranparent ) { + wchar_t szBuff[64]; + ICoreWebView2Controller2 *wc2; + wc2 = nullptr; + app->webviewController->QueryInterface(IID_ICoreWebView2Controller2, (void**)&wc2); + + COREWEBVIEW2_COLOR wvColor; + wvColor.R = app->backgroundColour.R; + wvColor.G = app->backgroundColour.G; + wvColor.B = app->backgroundColour.B; + wvColor.A = app->backgroundColour.A == 0 ? 0 : 255; + if( app->windowBackgroundIsTranslucent ) { + wvColor.A = 0; + } + HRESULT result = wc2->put_DefaultBackgroundColor(wvColor); + if (!SUCCEEDED(result)) + { + switch (result) + { + case HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND): + { + MessageBox( + app->window, + L"Couldn't find Edge installation. " + "Do you have a version installed that's compatible with this " + "WebView2 SDK version?", + nullptr, MB_OK); + } + break; + case HRESULT_FROM_WIN32(ERROR_FILE_EXISTS): + { + MessageBox( + app->window, L"User data folder cannot be created because a file with the same name already exists.", nullptr, MB_OK); + } + break; + case E_ACCESSDENIED: + { + MessageBox( + app->window, L"Unable to create user data folder, Access Denied.", nullptr, MB_OK); + } + break; + case E_FAIL: + { + MessageBox( + app->window, L"Edge runtime unable to start", nullptr, MB_OK); + } + break; + default: + { + MessageBox(app->window, L"Failed to create WebView2 environment", nullptr, MB_OK); + } + } + } + + } + + messageFromWindowCallback("Ej{\"name\":\"wails:launched\",\"data\":[]}"); + + return true; +} + +void initialCallback(std::string message) { + printf("MESSAGE=%s\n", message); +} + +void Run(struct Application* app, int argc, char **argv) { + + // Register the window class. + const wchar_t CLASS_NAME[] = L"Ffenestri"; + + WNDCLASSEX wc = { }; + + wc.cbSize = sizeof(WNDCLASSEX); + wc.lpfnWndProc = WndProc; + wc.hInstance = GetModuleHandle(NULL); + wc.lpszClassName = CLASS_NAME; + + if( app->disableWindowIcon == false ) { + wc.hIcon = LoadIcon(wc.hInstance, MAKEINTRESOURCE(100)); + wc.hIconSm = LoadIcon(wc.hInstance, MAKEINTRESOURCE(100)); + } + + // Configure translucency + DWORD dwExStyle = 0; + if ( app->windowBackgroundIsTranslucent) { + dwExStyle = WS_EX_NOREDIRECTIONBITMAP; + wc.hbrBackground = CreateSolidBrush(RGB(255,255,255)); + } + + RegisterClassEx(&wc); + + // Process window style + DWORD windowStyle = WS_OVERLAPPEDWINDOW | WS_THICKFRAME | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX; + + if (app->resizable == 0) { + windowStyle &= ~WS_MAXIMIZEBOX; + windowStyle &= ~WS_THICKFRAME; + } + if ( app->frame == 0 ) { + windowStyle &= ~WS_OVERLAPPEDWINDOW; + windowStyle &= ~WS_CAPTION; + windowStyle |= WS_POPUP; + } + + // Create the window. + app->window = CreateWindowEx( + dwExStyle, // Optional window styles. + CLASS_NAME, // Window class + L"", // Window text + windowStyle, // Window style + + // Size and position + CW_USEDEFAULT, CW_USEDEFAULT, app->width, app->height, + + NULL, // Parent window + NULL, // Menu + wc.hInstance, // Instance handle + NULL // Additional application data + ); + + if (app->window == NULL) + { + return; + } + + if ( app->fullscreen ) { + fullscreen(app); + } + + // Credit: https://stackoverflow.com/a/35482689 + if( app->disableWindowIcon && app->frame == 1 ) { + int extendedStyle = GetWindowLong(app->window, GWL_EXSTYLE); + SetWindowLong(app->window, GWL_EXSTYLE, extendedStyle | WS_EX_DLGMODALFRAME); + SetWindowPos(nullptr, nullptr, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER); + } + + if ( app->windowBackgroundIsTranslucent ) { + + // Enable the translucent background effect + enableTranslucentBackground(app); + + // Setup transparency of main window. This allows the blur to show through. + SetLayeredWindowAttributes(app->window,RGB(255,255,255),0,LWA_COLORKEY); + } + + // Store application pointer in window handle + SetWindowLongPtr(app->window, GWLP_USERDATA, (LONG_PTR)app); + + // private center() as we are on main thread + center(app); + + // Add webview2 + initWebView2(app, debug, initialCallback); + + + // Main event loop + MSG msg; + BOOL res; + while ((res = GetMessage(&msg, NULL, 0, 0)) != -1) { + if (msg.hwnd) { + TranslateMessage(&msg); + DispatchMessage(&msg); + continue; + } + if (msg.message == WM_APP) { + dispatchFunction *f = (dispatchFunction*) msg.lParam; + (*f)(); + delete(f); + } else if (msg.message == WM_QUIT) { + performShutdown(app); + return; + } + } +} + +void SetDebug(struct Application* app, int flag) { + debug = flag; +} + +void ExecJS(struct Application* app, const char *script) { + ON_MAIN_THREAD( + execJS(app, script); + ); +} + +void hide(struct Application* app) { + ShowWindow(app->window, SW_HIDE); +} + +void Hide(struct Application* app) { + ON_MAIN_THREAD( + hide(app); + ); +} + +void show(struct Application* app) { + ShowWindow(app->window, SW_SHOW); +} + +void Show(struct Application* app) { + ON_MAIN_THREAD( + show(app); + ); +} + +void DisableWindowIcon(struct Application* app) { + app->disableWindowIcon = true; +} + +void center(struct Application* app) { + + HMONITOR currentMonitor = MonitorFromWindow(app->window, MONITOR_DEFAULTTONEAREST); + MONITORINFO info = {0}; + info.cbSize = sizeof(info); + GetMonitorInfoA(currentMonitor, &info); + RECT workRect = info.rcWork; + LONG screenMiddleW = (workRect.right - workRect.left) / 2; + LONG screenMiddleH = (workRect.bottom - workRect.top) / 2; + RECT winRect; + if (app->frame == 1) { + GetWindowRect(app->window, &winRect); + } else { + GetClientRect(app->window, &winRect); + } + LONG winWidth = winRect.right - winRect.left; + LONG winHeight = winRect.bottom - winRect.top; + + LONG windowX = screenMiddleW - (winWidth / 2); + LONG windowY = screenMiddleH - (winHeight / 2); + + SetWindowPos(app->window, HWND_TOP, windowX, windowY, winWidth, winHeight, SWP_NOSIZE); +} + +void Center(struct Application* app) { + ON_MAIN_THREAD( + center(app); + ); +} + +UINT getWindowPlacement(struct Application* app) { + WINDOWPLACEMENT lpwndpl; + lpwndpl.length = sizeof(WINDOWPLACEMENT); + BOOL result = GetWindowPlacement(app->window, &lpwndpl); + if( result == 0 ) { + // TODO: Work out what this call failing means + return -1; + } + return lpwndpl.showCmd; +} + +int isMaximised(struct Application* app) { + return getWindowPlacement(app) == SW_SHOWMAXIMIZED; +} + +void maximise(struct Application* app) { + ShowWindow(app->window, SW_MAXIMIZE); +} + +void Maximise(struct Application* app) { + ON_MAIN_THREAD( + maximise(app); + ); +} + +void unmaximise(struct Application* app) { + ShowWindow(app->window, SW_RESTORE); +} + +void Unmaximise(struct Application* app) { + ON_MAIN_THREAD( + unmaximise(app); + ); +} + + +void ToggleMaximise(struct Application* app) { + if(isMaximised(app)) { + return Unmaximise(app); + } + return Maximise(app); +} + +int isMinimised(struct Application* app) { + return getWindowPlacement(app) == SW_SHOWMINIMIZED; +} + +void minimise(struct Application* app) { + ShowWindow(app->window, SW_MINIMIZE); +} + +void Minimise(struct Application* app) { + ON_MAIN_THREAD( + minimise(app); + ); +} + +void unminimise(struct Application* app) { + ShowWindow(app->window, SW_RESTORE); +} + +void Unminimise(struct Application* app) { + ON_MAIN_THREAD( + unminimise(app); + ); +} + +void ToggleMinimise(struct Application* app) { + if(isMinimised(app)) { + return Unminimise(app); + } + return Minimise(app); +} + +void SetColour(struct Application* app, int red, int green, int blue, int alpha) { + app->backgroundColour.R = red; + app->backgroundColour.G = green; + app->backgroundColour.B = blue; + app->backgroundColour.A = alpha; +} + +void SetSize(struct Application* app, int width, int height) { + if( app->maxWidth > 0 && width > app->maxWidth ) { + width = app->maxWidth; + } + if ( app->maxHeight > 0 && height > app->maxHeight ) { + height = app->maxHeight; + } + SetWindowPos(app->window, nullptr, 0, 0, width, height, SWP_NOMOVE); +} + +void setPosition(struct Application* app, int x, int y) { + HMONITOR currentMonitor = MonitorFromWindow(app->window, MONITOR_DEFAULTTONEAREST); + MONITORINFO info = {0}; + info.cbSize = sizeof(info); + GetMonitorInfoA(currentMonitor, &info); + RECT workRect = info.rcWork; + LONG newX = workRect.left + x; + LONG newY = workRect.top + y; + + SetWindowPos(app->window, HWND_TOP, newX, newY, 0, 0, SWP_NOSIZE); +} + +void SetPosition(struct Application* app, int x, int y) { + ON_MAIN_THREAD( + setPosition(app, x, y); + ); +} + +void Quit(struct Application* app) { + // Override the hide window on close flag + app->hideWindowOnClose = 0; + ON_MAIN_THREAD( + DestroyWindow(app->window); + ); +} + + +// Credit: https://stackoverflow.com/a/6693107 +void setTitle(struct Application* app, const char *title) { + LPCTSTR text = cstrToLPWSTR(title); + SetWindowText(app->window, text); + delete[] text; +} + +void SetTitle(struct Application* app, const char *title) { + ON_MAIN_THREAD( + setTitle(app, title); + ); +} + +void fullscreen(struct Application* app) { + + // Ensure we aren't in fullscreen + if (app->isFullscreen) return; + + app->isFullscreen = true; + app->previousWindowStyle = GetWindowLong(app->window, GWL_STYLE); + MONITORINFO mi = { sizeof(mi) }; + if (GetWindowPlacement(app->window, &(app->previousPlacement)) && GetMonitorInfo(MonitorFromWindow(app->window, MONITOR_DEFAULTTOPRIMARY), &mi)) { + SetWindowLong(app->window, GWL_STYLE, app->previousWindowStyle & ~WS_OVERLAPPEDWINDOW); + SetWindowPos(app->window, HWND_TOP, + mi.rcMonitor.left, + mi.rcMonitor.top, + mi.rcMonitor.right - mi.rcMonitor.left, + mi.rcMonitor.bottom - mi.rcMonitor.top, + SWP_NOOWNERZORDER | SWP_FRAMECHANGED); + } +} + +void Fullscreen(struct Application* app) { + ON_MAIN_THREAD( + fullscreen(app); + show(app); + ); +} + +void unfullscreen(struct Application* app) { + if (app->isFullscreen) { + SetWindowLong(app->window, GWL_STYLE, app->previousWindowStyle); + SetWindowPlacement(app->window, &(app->previousPlacement)); + SetWindowPos(app->window, NULL, 0, 0, 0, 0, + SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | + SWP_NOOWNERZORDER | SWP_FRAMECHANGED); + app->isFullscreen = false; + } +} + +void UnFullscreen(struct Application* app) { + ON_MAIN_THREAD( + unfullscreen(app); + ); +} + +void DisableFrame(struct Application* app) { + app->frame = 0; +} + +// WebviewIsTransparent will make the webview transparent +// revealing the window underneath +void WebviewIsTransparent(struct Application *app) { + app->webviewIsTranparent = true; +} + +void WindowBackgroundIsTranslucent(struct Application *app) { + app->windowBackgroundIsTranslucent = true; +} + + +void OpenDialog(struct Application* app, char *callbackID, char *title, char *filters, char *defaultFilename, char *defaultDir, int allowFiles, int allowDirs, int allowMultiple, int showHiddenFiles, int canCreateDirectories, int resolvesAliases, int treatPackagesAsDirectories) { +} +void SaveDialog(struct Application* app, char *callbackID, char *title, char *filters, char *defaultFilename, char *defaultDir, int showHiddenFiles, int canCreateDirectories, int treatPackagesAsDirectories) { +} +void MessageDialog(struct Application* app, char *callbackID, char *type, char *title, char *message, char *icon, char *button1, char *button2, char *button3, char *button4, char *defaultButton, char *cancelButton) { +} +void DarkModeEnabled(struct Application* app, char *callbackID) { +} +void SetApplicationMenu(struct Application* app, const char *applicationMenuJSON) { +} +void AddTrayMenu(struct Application* app, const char *menuTrayJSON) { +} +void SetTrayMenu(struct Application* app, const char *menuTrayJSON) { +} +void DeleteTrayMenuByID(struct Application* app, const char *id) { +} +void UpdateTrayMenuLabel(struct Application* app, const char* JSON) { +} +void AddContextMenu(struct Application* app, char *contextMenuJSON) { +} +void UpdateContextMenu(struct Application* app, char *contextMenuJSON) { +} \ No newline at end of file diff --git a/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/ffenestri_windows.go b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/ffenestri_windows.go new file mode 100644 index 0000000..cfce6ec --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/ffenestri_windows.go @@ -0,0 +1,185 @@ +package ffenestri + +import "C" + +/* + +#cgo windows CXXFLAGS: -std=c++11 +#cgo windows,amd64 LDFLAGS: -lgdi32 -lole32 -lShlwapi -luser32 -loleaut32 -ldwmapi + +#include "ffenestri.h" + +extern void DisableWindowIcon(struct Application* app); + +*/ +import "C" +import ( + "github.com/ztrue/tracerr" + "os" + + "github.com/wailsapp/wails/v2/pkg/menu" +) + +// Setup the global caches +var globalCheckboxCache = NewCheckboxCache() +var globalRadioGroupCache = NewRadioGroupCache() +var globalRadioGroupMap = NewRadioGroupMap() +var globalApplicationMenu *Menu + +type menuType string + +const ( + appMenuType menuType = "ApplicationMenu" + contextMenuType + trayMenuType +) + +func (a *Application) processPlatformSettings() error { + + menuManager = a.menuManager + config := a.config.Windows + if config == nil { + return nil + } + + // Check if the webview should be transparent + if config.WebviewIsTransparent { + C.WebviewIsTransparent(a.app) + } + + if config.WindowBackgroundIsTranslucent { + C.WindowBackgroundIsTranslucent(a.app) + } + + if config.DisableWindowIcon { + C.DisableWindowIcon(a.app) + } + + // Unfortunately, we need to store this in the package variable so the C callback can see it + applicationMenu = a.menuManager.GetProcessedApplicationMenu() + + // + //// Process tray + //trays, err := a.menuManager.GetTrayMenus() + //if err != nil { + // return err + //} + //if trays != nil { + // for _, tray := range trays { + // C.AddTrayMenu(a.app, a.string2CString(tray)) + // } + //} + // + //// Process context menus + //contextMenus, err := a.menuManager.GetContextMenus() + //if err != nil { + // return err + //} + //if contextMenus != nil { + // for _, contextMenu := range contextMenus { + // C.AddContextMenu(a.app, a.string2CString(contextMenu)) + // } + //} + // + //// Process URL Handlers + //if a.config.Mac.URLHandlers != nil { + // C.HasURLHandlers(a.app) + //} + + return nil +} + +func (c *Client) updateApplicationMenu() { + applicationMenu = c.app.menuManager.GetProcessedApplicationMenu() + createApplicationMenu(uintptr(C.GetWindowHandle(c.app.app))) +} + +/* --------------------------------------------------------------------------------- + +Application Menu +---------------- +There's only 1 application menu and this is where we create it. This method +is called from C after the window is created and the WM_CREATE message has +been sent. + +*/ + +func checkFatal(err error) { + if err != nil { + tracerr.PrintSourceColor(err) + globalRadioGroupCache.Dump() + globalRadioGroupMap.Dump() + os.Exit(1) + } +} + +//export createApplicationMenu +func createApplicationMenu(hwnd uintptr) { + + if applicationMenu == nil { + return + } + + var err error + window := win32Window(hwnd) + + if globalApplicationMenu != nil { + checkFatal(globalApplicationMenu.Destroy()) + } + + globalApplicationMenu, err = createMenu(applicationMenu, appMenuType) + checkFatal(err) + + err = setWindowMenu(window, globalApplicationMenu.menu) + checkFatal(err) +} + +/* +This method is called by C when a menu item is pressed +*/ + +//export menuClicked +func menuClicked(id uint32) { + win32MenuID := win32MenuItemID(id) + //println("Got click from menu id", win32MenuID) + + // Get the menu from the cache + menuItemDetails := getMenuCacheEntry(win32MenuID) + wailsMenuID := wailsMenuItemID(menuItemDetails.item.ID) + + //println("Got click from menu id", win32MenuID, "- wails menu ID", wailsMenuID) + //spew.Dump(menuItemDetails) + + switch menuItemDetails.item.Type { + case menu.CheckboxType: + + // Determine if the menu is set or not + res, _, err := win32GetMenuState.Call(uintptr(menuItemDetails.parent), uintptr(id), uintptr(MF_BYCOMMAND)) + if int(res) == -1 { + checkFatal(err) + } + + flag := MF_CHECKED + if uint32(res) == MF_CHECKED { + flag = MF_UNCHECKED + } + + for _, menuid := range globalCheckboxCache.win32MenuIDsForWailsMenuID(wailsMenuID) { + //println("setting menuid", menuid, "with flag", flag) + menuItemDetails := getMenuCacheEntry(menuid) + res, _, err = win32CheckMenuItem.Call(uintptr(menuItemDetails.parent), uintptr(menuid), uintptr(flag)) + if int(res) == -1 { + checkFatal(err) + } + } + case menu.RadioType: + err := selectRadioItemFromWailsMenuID(wailsMenuID, win32MenuID) + checkFatal(err) + } + + // Print the click error - it's not fatal + err := menuManager.ProcessClick(menuItemDetails.item.ID, "", string(menuItemDetails.menuType), "") + if err != nil { + println(err.Error()) + } +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/ffenestri_windows.h b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/ffenestri_windows.h new file mode 100644 index 0000000..294f4cb --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/ffenestri_windows.h @@ -0,0 +1,91 @@ + +#ifndef _FFENESTRI_WINDOWS_H +#define _FFENESTRI_WINDOWS_H + +#define WIN32_LEAN_AND_MEAN +#define UNICODE 1 + +#include "ffenestri.h" +#include +#include +#include +#include +#include "windows/WebView2.h" + +#include "assets.h" + +// TODO: +//#include "userdialogicons.h" + + +struct Application{ + // Window specific + HWND window; + ICoreWebView2 *webview; + ICoreWebView2Controller* webviewController; + + // Application + const char *title; + int width; + int height; + int resizable; + int devtools; + int fullscreen; + int startHidden; + int logLevel; + int hideWindowOnClose; + int minSizeSet; + LONG minWidth; + LONG minHeight; + int maxSizeSet; + LONG maxWidth; + LONG maxHeight; + int frame; + char *startupURL; + bool webviewIsTranparent; + bool windowBackgroundIsTranslucent; + COREWEBVIEW2_COLOR backgroundColour; + bool disableWindowIcon; + + // Used by fullscreen/unfullscreen + bool isFullscreen; + WINDOWPLACEMENT previousPlacement; + DWORD previousWindowStyle; + + // placeholders + char* bindings; + char* initialCode; + + // DPI + UINT dpix; + UINT dpiy; +}; + +#define ON_MAIN_THREAD(code) dispatch( [=]{ code; } ) + +typedef std::function dispatchFunction; +typedef std::function messageCallback; +typedef std::function comHandlerCallback; + +void center(struct Application*); +void setTitle(struct Application* app, const char *title); +void fullscreen(struct Application* app); +void unfullscreen(struct Application* app); +char* LPWSTRToCstr(LPWSTR input); + +// called when the DOM is ready +void loadAssets(struct Application* app); + +// called when the application assets have been loaded into the DOM +void completed(struct Application* app); + +// Callback +extern "C" { + void DisableWindowIcon(struct Application* app); + void messageFromWindowCallback(const char *); + void* GetWindowHandle(struct Application*); + void createApplicationMenu(HWND hwnd); + void menuClicked(UINT id); +} + +#endif \ No newline at end of file diff --git a/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/hashmap.h b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/hashmap.h new file mode 100644 index 0000000..0278bc3 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/hashmap.h @@ -0,0 +1,518 @@ +/* + The latest version of this library is available on GitHub; + https://github.com/sheredom/hashmap.h +*/ + +/* + This is free and unencumbered software released into the public domain. + + Anyone is free to copy, modify, publish, use, compile, sell, or + distribute this software, either in source code form or as a compiled + binary, for any purpose, commercial or non-commercial, and by any + means. + + In jurisdictions that recognize copyright laws, the author or authors + of this software dedicate any and all copyright interest in the + software to the public domain. We make this dedication for the benefit + of the public at large and to the detriment of our heirs and + successors. We intend this dedication to be an overt act of + relinquishment in perpetuity of all present and future rights to this + software under copyright law. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + For more information, please refer to +*/ +#ifndef SHEREDOM_HASHMAP_H_INCLUDED +#define SHEREDOM_HASHMAP_H_INCLUDED + +#if defined(_MSC_VER) +// Workaround a bug in the MSVC runtime where it uses __cplusplus when not +// defined. +#pragma warning(push, 0) +#pragma warning(disable : 4668) +#endif +#include +#include + +#if (defined(_MSC_VER) && defined(__AVX__)) || \ + (!defined(_MSC_VER) && defined(__SSE4_2__)) +#define HASHMAP_SSE42 +#endif + +#if defined(HASHMAP_SSE42) +#include +#endif + +#if defined(_MSC_VER) +#pragma warning(pop) +#endif + +#if defined(_MSC_VER) +#pragma warning(push) +// Stop MSVC complaining about not inlining functions. +#pragma warning(disable : 4710) +// Stop MSVC complaining about inlining functions! +#pragma warning(disable : 4711) +#elif defined(__clang__) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunused-function" +#endif + +#if defined(_MSC_VER) +#define HASHMAP_USED +#elif defined(__GNUC__) +#define HASHMAP_USED __attribute__((used)) +#else +#define HASHMAP_USED +#endif + +/* We need to keep keys and values. */ +struct hashmap_element_s { + const char *key; + unsigned key_len; + int in_use; + void *data; +}; + +/* A hashmap has some maximum size and current size, as well as the data to + * hold. */ +struct hashmap_s { + unsigned table_size; + unsigned size; + struct hashmap_element_s *data; +}; + +#define HASHMAP_MAX_CHAIN_LENGTH (8) + +#if defined(__cplusplus) +extern "C" { +#endif + +/// @brief Create a hashmap. +/// @param initial_size The initial size of the hashmap. Must be a power of two. +/// @param out_hashmap The storage for the created hashmap. +/// @return On success 0 is returned. +/// +/// Note that the initial size of the hashmap must be a power of two, and +/// creation of the hashmap will fail if this is not the case. +static int hashmap_create(const unsigned initial_size, + struct hashmap_s *const out_hashmap) HASHMAP_USED; + +/// @brief Put an element into the hashmap. +/// @param hashmap The hashmap to insert into. +/// @param key The string key to use. +/// @param len The length of the string key. +/// @param value The value to insert. +/// @return On success 0 is returned. +/// +/// The key string slice is not copied when creating the hashmap entry, and thus +/// must remain a valid pointer until the hashmap entry is removed or the +/// hashmap is destroyed. +static int hashmap_put(struct hashmap_s *const hashmap, const char *const key, + const unsigned len, void *const value) HASHMAP_USED; + +/// @brief Get an element from the hashmap. +/// @param hashmap The hashmap to get from. +/// @param key The string key to use. +/// @param len The length of the string key. +/// @return The previously set element, or NULL if none exists. +static void *hashmap_get(const struct hashmap_s *const hashmap, + const char *const key, + const unsigned len) HASHMAP_USED; + +/// @brief Remove an element from the hashmap. +/// @param hashmap The hashmap to remove from. +/// @param key The string key to use. +/// @param len The length of the string key. +/// @return On success 0 is returned. +static int hashmap_remove(struct hashmap_s *const hashmap, + const char *const key, + const unsigned len) HASHMAP_USED; + +/// @brief Iterate over all the elements in a hashmap. +/// @param hashmap The hashmap to iterate over. +/// @param f The function pointer to call on each element. +/// @param context The context to pass as the first argument to f. +/// @return If the entire hashmap was iterated then 0 is returned. Otherwise if +/// the callback function f returned non-zero then non-zero is returned. +static int hashmap_iterate(const struct hashmap_s *const hashmap, + int (*f)(void *const context, void *const value), + void *const context) HASHMAP_USED; + +/// @brief Iterate over all the elements in a hashmap. +/// @param hashmap The hashmap to iterate over. +/// @param f The function pointer to call on each element. +/// @param context The context to pass as the first argument to f. +/// @return If the entire hashmap was iterated then 0 is returned. +/// Otherwise if the callback function f returned positive then the positive +/// value is returned. If the callback function returns -1, the current item +/// is removed and iteration continues. +static int hashmap_iterate_pairs(struct hashmap_s *const hashmap, + int (*f)(void *const, struct hashmap_element_s *const), + void *const context) HASHMAP_USED; + +/// @brief Get the size of the hashmap. +/// @param hashmap The hashmap to get the size of. +/// @return The size of the hashmap. +static unsigned +hashmap_num_entries(const struct hashmap_s *const hashmap) HASHMAP_USED; + +/// @brief Destroy the hashmap. +/// @param hashmap The hashmap to destroy. +static void hashmap_destroy(struct hashmap_s *const hashmap) HASHMAP_USED; + +static unsigned hashmap_crc32_helper(const char *const s, + const unsigned len) HASHMAP_USED; +static unsigned +hashmap_hash_helper_int_helper(const struct hashmap_s *const m, + const char *const keystring, + const unsigned len) HASHMAP_USED; +static int hashmap_match_helper(const struct hashmap_element_s *const element, + const char *const key, + const unsigned len) HASHMAP_USED; +static int hashmap_hash_helper(const struct hashmap_s *const m, + const char *const key, const unsigned len, + unsigned *const out_index) HASHMAP_USED; +static int hashmap_rehash_iterator(void *const new_hash, + struct hashmap_element_s *const e) HASHMAP_USED; +static int hashmap_rehash_helper(struct hashmap_s *const m) HASHMAP_USED; + +#if defined(__cplusplus) +} +#endif + +#if defined(__cplusplus) +#define HASHMAP_CAST(type, x) static_cast(x) +#define HASHMAP_PTR_CAST(type, x) reinterpret_cast(x) +#define HASHMAP_NULL NULL +#else +#define HASHMAP_CAST(type, x) ((type)x) +#define HASHMAP_PTR_CAST(type, x) ((type)x) +#define HASHMAP_NULL 0 +#endif + +int hashmap_create(const unsigned initial_size, + struct hashmap_s *const out_hashmap) { + if (0 == initial_size || 0 != (initial_size & (initial_size - 1))) { + return 1; + } + + out_hashmap->data = + HASHMAP_CAST(struct hashmap_element_s *, + calloc(initial_size, sizeof(struct hashmap_element_s))); + if (!out_hashmap->data) { + return 1; + } + + out_hashmap->table_size = initial_size; + out_hashmap->size = 0; + + return 0; +} + +int hashmap_put(struct hashmap_s *const m, const char *const key, + const unsigned len, void *const value) { + unsigned int index; + + /* Find a place to put our value. */ + while (!hashmap_hash_helper(m, key, len, &index)) { + if (hashmap_rehash_helper(m)) { + return 1; + } + } + + /* Set the data. */ + m->data[index].data = value; + m->data[index].key = key; + m->data[index].key_len = len; + m->data[index].in_use = 1; + m->size++; + + return 0; +} + +void *hashmap_get(const struct hashmap_s *const m, const char *const key, + const unsigned len) { + unsigned int curr; + unsigned int i; + + /* Find data location */ + curr = hashmap_hash_helper_int_helper(m, key, len); + + /* Linear probing, if necessary */ + for (i = 0; i < HASHMAP_MAX_CHAIN_LENGTH; i++) { + if (m->data[curr].in_use) { + if (hashmap_match_helper(&m->data[curr], key, len)) { + return m->data[curr].data; + } + } + + curr = (curr + 1) % m->table_size; + } + + /* Not found */ + return HASHMAP_NULL; +} + +int hashmap_remove(struct hashmap_s *const m, const char *const key, + const unsigned len) { + unsigned int i; + unsigned int curr; + + /* Find key */ + curr = hashmap_hash_helper_int_helper(m, key, len); + + /* Linear probing, if necessary */ + for (i = 0; i < HASHMAP_MAX_CHAIN_LENGTH; i++) { + if (m->data[curr].in_use) { + if (hashmap_match_helper(&m->data[curr], key, len)) { + /* Blank out the fields including in_use */ + memset(&m->data[curr], 0, sizeof(struct hashmap_element_s)); + + /* Reduce the size */ + m->size--; + return 0; + } + } + curr = (curr + 1) % m->table_size; + } + + return 1; +} + +int hashmap_iterate(const struct hashmap_s *const m, + int (*f)(void *const, void *const), void *const context) { + unsigned int i; + + /* Linear probing */ + for (i = 0; i < m->table_size; i++) { + if (m->data[i].in_use) { + if (!f(context, m->data[i].data)) { + return 1; + } + } + } + return 0; +} + +int hashmap_iterate_pairs(struct hashmap_s *const hashmap, + int (*f)(void *const, struct hashmap_element_s *const), + void *const context) { + unsigned int i; + struct hashmap_element_s *p; + int r; + + /* Linear probing */ + for (i = 0; i < hashmap->table_size; i++) { + p=&hashmap->data[i]; + if (p->in_use) { + r=f(context, p); + switch (r) + { + case -1: /* remove item */ + memset(p, 0, sizeof(struct hashmap_element_s)); + hashmap->size--; + break; + case 0: /* continue iterating */ + break; + default: /* early exit */ + return 1; + } + } + } + return 0; +} + +void hashmap_destroy(struct hashmap_s *const m) { + free(m->data); + memset(m, 0, sizeof(struct hashmap_s)); +} + +unsigned hashmap_num_entries(const struct hashmap_s *const m) { + return m->size; +} + +unsigned hashmap_crc32_helper(const char *const s, const unsigned len) { + unsigned i; + unsigned crc32val = 0; + +#if defined(HASHMAP_SSE42) + for (i = 0; i < len; i++) { + crc32val = _mm_crc32_u8(crc32val, HASHMAP_CAST(unsigned char, s[i])); + } + + return crc32val; +#else + // Using polynomial 0x11EDC6F41 to match SSE 4.2's crc function. + static const unsigned crc32_tab[] = { + 0x00000000U, 0xF26B8303U, 0xE13B70F7U, 0x1350F3F4U, 0xC79A971FU, + 0x35F1141CU, 0x26A1E7E8U, 0xD4CA64EBU, 0x8AD958CFU, 0x78B2DBCCU, + 0x6BE22838U, 0x9989AB3BU, 0x4D43CFD0U, 0xBF284CD3U, 0xAC78BF27U, + 0x5E133C24U, 0x105EC76FU, 0xE235446CU, 0xF165B798U, 0x030E349BU, + 0xD7C45070U, 0x25AFD373U, 0x36FF2087U, 0xC494A384U, 0x9A879FA0U, + 0x68EC1CA3U, 0x7BBCEF57U, 0x89D76C54U, 0x5D1D08BFU, 0xAF768BBCU, + 0xBC267848U, 0x4E4DFB4BU, 0x20BD8EDEU, 0xD2D60DDDU, 0xC186FE29U, + 0x33ED7D2AU, 0xE72719C1U, 0x154C9AC2U, 0x061C6936U, 0xF477EA35U, + 0xAA64D611U, 0x580F5512U, 0x4B5FA6E6U, 0xB93425E5U, 0x6DFE410EU, + 0x9F95C20DU, 0x8CC531F9U, 0x7EAEB2FAU, 0x30E349B1U, 0xC288CAB2U, + 0xD1D83946U, 0x23B3BA45U, 0xF779DEAEU, 0x05125DADU, 0x1642AE59U, + 0xE4292D5AU, 0xBA3A117EU, 0x4851927DU, 0x5B016189U, 0xA96AE28AU, + 0x7DA08661U, 0x8FCB0562U, 0x9C9BF696U, 0x6EF07595U, 0x417B1DBCU, + 0xB3109EBFU, 0xA0406D4BU, 0x522BEE48U, 0x86E18AA3U, 0x748A09A0U, + 0x67DAFA54U, 0x95B17957U, 0xCBA24573U, 0x39C9C670U, 0x2A993584U, + 0xD8F2B687U, 0x0C38D26CU, 0xFE53516FU, 0xED03A29BU, 0x1F682198U, + 0x5125DAD3U, 0xA34E59D0U, 0xB01EAA24U, 0x42752927U, 0x96BF4DCCU, + 0x64D4CECFU, 0x77843D3BU, 0x85EFBE38U, 0xDBFC821CU, 0x2997011FU, + 0x3AC7F2EBU, 0xC8AC71E8U, 0x1C661503U, 0xEE0D9600U, 0xFD5D65F4U, + 0x0F36E6F7U, 0x61C69362U, 0x93AD1061U, 0x80FDE395U, 0x72966096U, + 0xA65C047DU, 0x5437877EU, 0x4767748AU, 0xB50CF789U, 0xEB1FCBADU, + 0x197448AEU, 0x0A24BB5AU, 0xF84F3859U, 0x2C855CB2U, 0xDEEEDFB1U, + 0xCDBE2C45U, 0x3FD5AF46U, 0x7198540DU, 0x83F3D70EU, 0x90A324FAU, + 0x62C8A7F9U, 0xB602C312U, 0x44694011U, 0x5739B3E5U, 0xA55230E6U, + 0xFB410CC2U, 0x092A8FC1U, 0x1A7A7C35U, 0xE811FF36U, 0x3CDB9BDDU, + 0xCEB018DEU, 0xDDE0EB2AU, 0x2F8B6829U, 0x82F63B78U, 0x709DB87BU, + 0x63CD4B8FU, 0x91A6C88CU, 0x456CAC67U, 0xB7072F64U, 0xA457DC90U, + 0x563C5F93U, 0x082F63B7U, 0xFA44E0B4U, 0xE9141340U, 0x1B7F9043U, + 0xCFB5F4A8U, 0x3DDE77ABU, 0x2E8E845FU, 0xDCE5075CU, 0x92A8FC17U, + 0x60C37F14U, 0x73938CE0U, 0x81F80FE3U, 0x55326B08U, 0xA759E80BU, + 0xB4091BFFU, 0x466298FCU, 0x1871A4D8U, 0xEA1A27DBU, 0xF94AD42FU, + 0x0B21572CU, 0xDFEB33C7U, 0x2D80B0C4U, 0x3ED04330U, 0xCCBBC033U, + 0xA24BB5A6U, 0x502036A5U, 0x4370C551U, 0xB11B4652U, 0x65D122B9U, + 0x97BAA1BAU, 0x84EA524EU, 0x7681D14DU, 0x2892ED69U, 0xDAF96E6AU, + 0xC9A99D9EU, 0x3BC21E9DU, 0xEF087A76U, 0x1D63F975U, 0x0E330A81U, + 0xFC588982U, 0xB21572C9U, 0x407EF1CAU, 0x532E023EU, 0xA145813DU, + 0x758FE5D6U, 0x87E466D5U, 0x94B49521U, 0x66DF1622U, 0x38CC2A06U, + 0xCAA7A905U, 0xD9F75AF1U, 0x2B9CD9F2U, 0xFF56BD19U, 0x0D3D3E1AU, + 0x1E6DCDEEU, 0xEC064EEDU, 0xC38D26C4U, 0x31E6A5C7U, 0x22B65633U, + 0xD0DDD530U, 0x0417B1DBU, 0xF67C32D8U, 0xE52CC12CU, 0x1747422FU, + 0x49547E0BU, 0xBB3FFD08U, 0xA86F0EFCU, 0x5A048DFFU, 0x8ECEE914U, + 0x7CA56A17U, 0x6FF599E3U, 0x9D9E1AE0U, 0xD3D3E1ABU, 0x21B862A8U, + 0x32E8915CU, 0xC083125FU, 0x144976B4U, 0xE622F5B7U, 0xF5720643U, + 0x07198540U, 0x590AB964U, 0xAB613A67U, 0xB831C993U, 0x4A5A4A90U, + 0x9E902E7BU, 0x6CFBAD78U, 0x7FAB5E8CU, 0x8DC0DD8FU, 0xE330A81AU, + 0x115B2B19U, 0x020BD8EDU, 0xF0605BEEU, 0x24AA3F05U, 0xD6C1BC06U, + 0xC5914FF2U, 0x37FACCF1U, 0x69E9F0D5U, 0x9B8273D6U, 0x88D28022U, + 0x7AB90321U, 0xAE7367CAU, 0x5C18E4C9U, 0x4F48173DU, 0xBD23943EU, + 0xF36E6F75U, 0x0105EC76U, 0x12551F82U, 0xE03E9C81U, 0x34F4F86AU, + 0xC69F7B69U, 0xD5CF889DU, 0x27A40B9EU, 0x79B737BAU, 0x8BDCB4B9U, + 0x988C474DU, 0x6AE7C44EU, 0xBE2DA0A5U, 0x4C4623A6U, 0x5F16D052U, + 0xAD7D5351U}; + + for (i = 0; i < len; i++) { + crc32val = crc32_tab[(HASHMAP_CAST(unsigned char, crc32val) ^ + HASHMAP_CAST(unsigned char, s[i]))] ^ + (crc32val >> 8); + } + return crc32val; +#endif +} + +unsigned hashmap_hash_helper_int_helper(const struct hashmap_s *const m, + const char *const keystring, + const unsigned len) { + unsigned key = hashmap_crc32_helper(keystring, len); + + /* Robert Jenkins' 32 bit Mix Function */ + key += (key << 12); + key ^= (key >> 22); + key += (key << 4); + key ^= (key >> 9); + key += (key << 10); + key ^= (key >> 2); + key += (key << 7); + key ^= (key >> 12); + + /* Knuth's Multiplicative Method */ + key = (key >> 3) * 2654435761; + + return key % m->table_size; +} + +int hashmap_match_helper(const struct hashmap_element_s *const element, + const char *const key, const unsigned len) { + return (element->key_len == len) && (0 == memcmp(element->key, key, len)); +} + +int hashmap_hash_helper(const struct hashmap_s *const m, const char *const key, + const unsigned len, unsigned *const out_index) { + unsigned int curr; + unsigned int i; + + /* If full, return immediately */ + if (m->size >= m->table_size) { + return 0; + } + + /* Find the best index */ + curr = hashmap_hash_helper_int_helper(m, key, len); + + /* Linear probing */ + for (i = 0; i < HASHMAP_MAX_CHAIN_LENGTH; i++) { + if (!m->data[curr].in_use) { + *out_index = curr; + return 1; + } + + if (m->data[curr].in_use && + hashmap_match_helper(&m->data[curr], key, len)) { + *out_index = curr; + return 1; + } + + curr = (curr + 1) % m->table_size; + } + + return 0; +} + +int hashmap_rehash_iterator(void *const new_hash, + struct hashmap_element_s *const e) { + int temp=hashmap_put(HASHMAP_PTR_CAST(struct hashmap_s *, new_hash), + e->key, e->key_len, e->data); + if (0table_size; + + struct hashmap_s new_hash; + + int flag = hashmap_create(new_size, &new_hash); + if (0!=flag) { + return flag; + } + + /* copy the old elements to the new table */ + flag = hashmap_iterate_pairs(m, hashmap_rehash_iterator, HASHMAP_PTR_CAST(void *, &new_hash)); + if (0!=flag) { + return flag; + } + + hashmap_destroy(m); + /* put new hash into old hash structure by copying */ + memcpy(m, &new_hash, sizeof(struct hashmap_s)); + + return 0; +} + +#if defined(_MSC_VER) +#pragma warning(pop) +#elif defined(__clang__) +#pragma clang diagnostic pop +#endif + +#endif \ No newline at end of file diff --git a/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/json.c b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/json.c new file mode 100644 index 0000000..d62ff9a --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/json.c @@ -0,0 +1,1403 @@ +// +build !windows + +/* + Copyright (C) 2011 Joseph A. Adams (joeyadams3.14159@gmail.com) + All rights reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + Source: http://git.ozlabs.org/?p=ccan;a=tree;f=ccan/json;hb=HEAD +*/ + +#include "json.h" + +#include +#include +#include +#include +#include + +#define out_of_memory() do { \ + fprintf(stderr, "Out of memory.\n"); \ + exit(EXIT_FAILURE); \ + } while (0) + +/* Sadly, strdup is not portable. */ +static char *json_strdup(const char *str) +{ + char *ret = (char*) malloc(strlen(str) + 1); + if (ret == NULL) + out_of_memory(); + strcpy(ret, str); + return ret; +} + +/* String buffer */ + +typedef struct +{ + char *cur; + char *end; + char *start; +} SB; + +static void sb_init(SB *sb) +{ + sb->start = (char*) malloc(17); + if (sb->start == NULL) + out_of_memory(); + sb->cur = sb->start; + sb->end = sb->start + 16; +} + +/* sb and need may be evaluated multiple times. */ +#define sb_need(sb, need) do { \ + if ((sb)->end - (sb)->cur < (need)) \ + sb_grow(sb, need); \ + } while (0) + +static void sb_grow(SB *sb, int need) +{ + size_t length = sb->cur - sb->start; + size_t alloc = sb->end - sb->start; + + do { + alloc *= 2; + } while (alloc < length + need); + + sb->start = (char*) realloc(sb->start, alloc + 1); + if (sb->start == NULL) + out_of_memory(); + sb->cur = sb->start + length; + sb->end = sb->start + alloc; +} + +static void sb_put(SB *sb, const char *bytes, int count) +{ + sb_need(sb, count); + memcpy(sb->cur, bytes, count); + sb->cur += count; +} + +#define sb_putc(sb, c) do { \ + if ((sb)->cur >= (sb)->end) \ + sb_grow(sb, 1); \ + *(sb)->cur++ = (c); \ + } while (0) + +static void sb_puts(SB *sb, const char *str) +{ + sb_put(sb, str, strlen(str)); +} + +static char *sb_finish(SB *sb) +{ + *sb->cur = 0; + assert(sb->start <= sb->cur && strlen(sb->start) == (size_t)(sb->cur - sb->start)); + return sb->start; +} + +static void sb_free(SB *sb) +{ + free(sb->start); +} + +/* + * Unicode helper functions + * + * These are taken from the ccan/charset module and customized a bit. + * Putting them here means the compiler can (choose to) inline them, + * and it keeps ccan/json from having a dependency. + */ + +/* + * Type for Unicode codepoints. + * We need our own because wchar_t might be 16 bits. + */ +typedef uint32_t uchar_t; + +/* + * Validate a single UTF-8 character starting at @s. + * The string must be null-terminated. + * + * If it's valid, return its length (1 thru 4). + * If it's invalid or clipped, return 0. + * + * This function implements the syntax given in RFC3629, which is + * the same as that given in The Unicode Standard, Version 6.0. + * + * It has the following properties: + * + * * All codepoints U+0000..U+10FFFF may be encoded, + * except for U+D800..U+DFFF, which are reserved + * for UTF-16 surrogate pair encoding. + * * UTF-8 byte sequences longer than 4 bytes are not permitted, + * as they exceed the range of Unicode. + * * The sixty-six Unicode "non-characters" are permitted + * (namely, U+FDD0..U+FDEF, U+xxFFFE, and U+xxFFFF). + */ +static int utf8_validate_cz(const char *s) +{ + unsigned char c = *s++; + + if (c <= 0x7F) { /* 00..7F */ + return 1; + } else if (c <= 0xC1) { /* 80..C1 */ + /* Disallow overlong 2-byte sequence. */ + return 0; + } else if (c <= 0xDF) { /* C2..DF */ + /* Make sure subsequent byte is in the range 0x80..0xBF. */ + if (((unsigned char)*s++ & 0xC0) != 0x80) + return 0; + + return 2; + } else if (c <= 0xEF) { /* E0..EF */ + /* Disallow overlong 3-byte sequence. */ + if (c == 0xE0 && (unsigned char)*s < 0xA0) + return 0; + + /* Disallow U+D800..U+DFFF. */ + if (c == 0xED && (unsigned char)*s > 0x9F) + return 0; + + /* Make sure subsequent bytes are in the range 0x80..0xBF. */ + if (((unsigned char)*s++ & 0xC0) != 0x80) + return 0; + if (((unsigned char)*s++ & 0xC0) != 0x80) + return 0; + + return 3; + } else if (c <= 0xF4) { /* F0..F4 */ + /* Disallow overlong 4-byte sequence. */ + if (c == 0xF0 && (unsigned char)*s < 0x90) + return 0; + + /* Disallow codepoints beyond U+10FFFF. */ + if (c == 0xF4 && (unsigned char)*s > 0x8F) + return 0; + + /* Make sure subsequent bytes are in the range 0x80..0xBF. */ + if (((unsigned char)*s++ & 0xC0) != 0x80) + return 0; + if (((unsigned char)*s++ & 0xC0) != 0x80) + return 0; + if (((unsigned char)*s++ & 0xC0) != 0x80) + return 0; + + return 4; + } else { /* F5..FF */ + return 0; + } +} + +/* Validate a null-terminated UTF-8 string. */ +static bool utf8_validate(const char *s) +{ + int len; + + for (; *s != 0; s += len) { + len = utf8_validate_cz(s); + if (len == 0) + return false; + } + + return true; +} + +/* + * Read a single UTF-8 character starting at @s, + * returning the length, in bytes, of the character read. + * + * This function assumes input is valid UTF-8, + * and that there are enough characters in front of @s. + */ +static int utf8_read_char(const char *s, uchar_t *out) +{ + const unsigned char *c = (const unsigned char*) s; + + assert(utf8_validate_cz(s)); + + if (c[0] <= 0x7F) { + /* 00..7F */ + *out = c[0]; + return 1; + } else if (c[0] <= 0xDF) { + /* C2..DF (unless input is invalid) */ + *out = ((uchar_t)c[0] & 0x1F) << 6 | + ((uchar_t)c[1] & 0x3F); + return 2; + } else if (c[0] <= 0xEF) { + /* E0..EF */ + *out = ((uchar_t)c[0] & 0xF) << 12 | + ((uchar_t)c[1] & 0x3F) << 6 | + ((uchar_t)c[2] & 0x3F); + return 3; + } else { + /* F0..F4 (unless input is invalid) */ + *out = ((uchar_t)c[0] & 0x7) << 18 | + ((uchar_t)c[1] & 0x3F) << 12 | + ((uchar_t)c[2] & 0x3F) << 6 | + ((uchar_t)c[3] & 0x3F); + return 4; + } +} + +/* + * Write a single UTF-8 character to @s, + * returning the length, in bytes, of the character written. + * + * @unicode must be U+0000..U+10FFFF, but not U+D800..U+DFFF. + * + * This function will write up to 4 bytes to @out. + */ +static int utf8_write_char(uchar_t unicode, char *out) +{ + unsigned char *o = (unsigned char*) out; + + assert(unicode <= 0x10FFFF && !(unicode >= 0xD800 && unicode <= 0xDFFF)); + + if (unicode <= 0x7F) { + /* U+0000..U+007F */ + *o++ = unicode; + return 1; + } else if (unicode <= 0x7FF) { + /* U+0080..U+07FF */ + *o++ = 0xC0 | unicode >> 6; + *o++ = 0x80 | (unicode & 0x3F); + return 2; + } else if (unicode <= 0xFFFF) { + /* U+0800..U+FFFF */ + *o++ = 0xE0 | unicode >> 12; + *o++ = 0x80 | (unicode >> 6 & 0x3F); + *o++ = 0x80 | (unicode & 0x3F); + return 3; + } else { + /* U+10000..U+10FFFF */ + *o++ = 0xF0 | unicode >> 18; + *o++ = 0x80 | (unicode >> 12 & 0x3F); + *o++ = 0x80 | (unicode >> 6 & 0x3F); + *o++ = 0x80 | (unicode & 0x3F); + return 4; + } +} + +/* + * Compute the Unicode codepoint of a UTF-16 surrogate pair. + * + * @uc should be 0xD800..0xDBFF, and @lc should be 0xDC00..0xDFFF. + * If they aren't, this function returns false. + */ +static bool from_surrogate_pair(uint16_t uc, uint16_t lc, uchar_t *unicode) +{ + if (uc >= 0xD800 && uc <= 0xDBFF && lc >= 0xDC00 && lc <= 0xDFFF) { + *unicode = 0x10000 + ((((uchar_t)uc & 0x3FF) << 10) | (lc & 0x3FF)); + return true; + } else { + return false; + } +} + +/* + * Construct a UTF-16 surrogate pair given a Unicode codepoint. + * + * @unicode must be U+10000..U+10FFFF. + */ +static void to_surrogate_pair(uchar_t unicode, uint16_t *uc, uint16_t *lc) +{ + uchar_t n; + + assert(unicode >= 0x10000 && unicode <= 0x10FFFF); + + n = unicode - 0x10000; + *uc = ((n >> 10) & 0x3FF) | 0xD800; + *lc = (n & 0x3FF) | 0xDC00; +} + +#define is_space(c) ((c) == '\t' || (c) == '\n' || (c) == '\r' || (c) == ' ') +#define is_digit(c) ((c) >= '0' && (c) <= '9') + +static bool parse_value (const char **sp, JsonNode **out); +static bool parse_string (const char **sp, char **out); +static bool parse_number (const char **sp, double *out); +static bool parse_array (const char **sp, JsonNode **out); +static bool parse_object (const char **sp, JsonNode **out); +static bool parse_hex16 (const char **sp, uint16_t *out); + +static bool expect_literal (const char **sp, const char *str); +static void skip_space (const char **sp); + +static void emit_value (SB *out, const JsonNode *node); +static void emit_value_indented (SB *out, const JsonNode *node, const char *space, int indent_level); +static void emit_string (SB *out, const char *str); +static void emit_number (SB *out, double num); +static void emit_array (SB *out, const JsonNode *array); +static void emit_array_indented (SB *out, const JsonNode *array, const char *space, int indent_level); +static void emit_object (SB *out, const JsonNode *object); +static void emit_object_indented (SB *out, const JsonNode *object, const char *space, int indent_level); + +static int write_hex16(char *out, uint16_t val); + +static JsonNode *mknode(JsonTag tag); +static void append_node(JsonNode *parent, JsonNode *child); +static void prepend_node(JsonNode *parent, JsonNode *child); +static void append_member(JsonNode *object, char *key, JsonNode *value); + +/* Assertion-friendly validity checks */ +static bool tag_is_valid(unsigned int tag); +static bool number_is_valid(const char *num); + +JsonNode *json_decode(const char *json) +{ + const char *s = json; + JsonNode *ret; + + skip_space(&s); + if (!parse_value(&s, &ret)) + return NULL; + + skip_space(&s); + if (*s != 0) { + json_delete(ret); + return NULL; + } + + return ret; +} + +char *json_encode(const JsonNode *node) +{ + return json_stringify(node, NULL); +} + +char *json_encode_string(const char *str) +{ + SB sb; + sb_init(&sb); + + emit_string(&sb, str); + + return sb_finish(&sb); +} + +char *json_stringify(const JsonNode *node, const char *space) +{ + SB sb; + sb_init(&sb); + + if (space != NULL) + emit_value_indented(&sb, node, space, 0); + else + emit_value(&sb, node); + + return sb_finish(&sb); +} + +void json_delete(JsonNode *node) +{ + if (node != NULL) { + json_remove_from_parent(node); + + switch (node->tag) { + case JSON_STRING: + free(node->string_); + break; + case JSON_ARRAY: + case JSON_OBJECT: + { + JsonNode *child, *next; + for (child = node->children.head; child != NULL; child = next) { + next = child->next; + json_delete(child); + } + break; + } + default:; + } + + free(node); + } +} + +bool json_validate(const char *json) +{ + const char *s = json; + + skip_space(&s); + if (!parse_value(&s, NULL)) + return false; + + skip_space(&s); + if (*s != 0) + return false; + + return true; +} + +// We return the number of elements or -1 if there was a problem +int json_array_length(JsonNode *array) { + + int result = 0; + + // The node should not be null and it should be an array + if (array == NULL || array->tag != JSON_ARRAY) + return -1; + + // Loop and count! + JsonNode *element; + json_foreach(element, array) { + result++; + } + + return result; +} + +JsonNode *json_find_element(JsonNode *array, int index) +{ + JsonNode *element; + int i = 0; + + if (array == NULL || array->tag != JSON_ARRAY) + return NULL; + + json_foreach(element, array) { + if (i == index) + return element; + i++; + } + + return NULL; +} + +JsonNode *json_find_member(JsonNode *object, const char *name) +{ + JsonNode *member; + + if (object == NULL || object->tag != JSON_OBJECT) + return NULL; + + json_foreach(member, object) + if (strcmp(member->key, name) == 0) + return member; + + return NULL; +} + +JsonNode *json_first_child(const JsonNode *node) +{ + if (node != NULL && (node->tag == JSON_ARRAY || node->tag == JSON_OBJECT)) + return node->children.head; + return NULL; +} + +static JsonNode *mknode(JsonTag tag) +{ + JsonNode *ret = (JsonNode*) calloc(1, sizeof(JsonNode)); + if (ret == NULL) + out_of_memory(); + ret->tag = tag; + return ret; +} + +JsonNode *json_mknull(void) +{ + return mknode(JSON_NULL); +} + +JsonNode *json_mkbool(bool b) +{ + JsonNode *ret = mknode(JSON_BOOL); + ret->bool_ = b; + return ret; +} + +static JsonNode *mkstring(char *s) +{ + JsonNode *ret = mknode(JSON_STRING); + ret->string_ = s; + return ret; +} + +JsonNode *json_mkstring(const char *s) +{ + return mkstring(json_strdup(s)); +} + +JsonNode *json_mknumber(double n) +{ + JsonNode *node = mknode(JSON_NUMBER); + node->number_ = n; + return node; +} + +JsonNode *json_mkarray(void) +{ + return mknode(JSON_ARRAY); +} + +JsonNode *json_mkobject(void) +{ + return mknode(JSON_OBJECT); +} + +static void append_node(JsonNode *parent, JsonNode *child) +{ + child->parent = parent; + child->prev = parent->children.tail; + child->next = NULL; + + if (parent->children.tail != NULL) + parent->children.tail->next = child; + else + parent->children.head = child; + parent->children.tail = child; +} + +static void prepend_node(JsonNode *parent, JsonNode *child) +{ + child->parent = parent; + child->prev = NULL; + child->next = parent->children.head; + + if (parent->children.head != NULL) + parent->children.head->prev = child; + else + parent->children.tail = child; + parent->children.head = child; +} + +static void append_member(JsonNode *object, char *key, JsonNode *value) +{ + value->key = key; + append_node(object, value); +} + +void json_append_element(JsonNode *array, JsonNode *element) +{ + assert(array->tag == JSON_ARRAY); + assert(element->parent == NULL); + + append_node(array, element); +} + +void json_prepend_element(JsonNode *array, JsonNode *element) +{ + assert(array->tag == JSON_ARRAY); + assert(element->parent == NULL); + + prepend_node(array, element); +} + +void json_append_member(JsonNode *object, const char *key, JsonNode *value) +{ + assert(object->tag == JSON_OBJECT); + assert(value->parent == NULL); + + append_member(object, json_strdup(key), value); +} + +void json_prepend_member(JsonNode *object, const char *key, JsonNode *value) +{ + assert(object->tag == JSON_OBJECT); + assert(value->parent == NULL); + + value->key = json_strdup(key); + prepend_node(object, value); +} + +void json_remove_from_parent(JsonNode *node) +{ + JsonNode *parent = node->parent; + + if (parent != NULL) { + if (node->prev != NULL) + node->prev->next = node->next; + else + parent->children.head = node->next; + if (node->next != NULL) + node->next->prev = node->prev; + else + parent->children.tail = node->prev; + + free(node->key); + + node->parent = NULL; + node->prev = node->next = NULL; + node->key = NULL; + } +} + +static bool parse_value(const char **sp, JsonNode **out) +{ + const char *s = *sp; + + switch (*s) { + case 'n': + if (expect_literal(&s, "null")) { + if (out) + *out = json_mknull(); + *sp = s; + return true; + } + return false; + + case 'f': + if (expect_literal(&s, "false")) { + if (out) + *out = json_mkbool(false); + *sp = s; + return true; + } + return false; + + case 't': + if (expect_literal(&s, "true")) { + if (out) + *out = json_mkbool(true); + *sp = s; + return true; + } + return false; + + case '"': { + char *str; + if (parse_string(&s, out ? &str : NULL)) { + if (out) + *out = mkstring(str); + *sp = s; + return true; + } + return false; + } + + case '[': + if (parse_array(&s, out)) { + *sp = s; + return true; + } + return false; + + case '{': + if (parse_object(&s, out)) { + *sp = s; + return true; + } + return false; + + default: { + double num; + if (parse_number(&s, out ? &num : NULL)) { + if (out) + *out = json_mknumber(num); + *sp = s; + return true; + } + return false; + } + } +} + +static bool parse_array(const char **sp, JsonNode **out) +{ + const char *s = *sp; + JsonNode *ret = out ? json_mkarray() : NULL; + JsonNode *element; + + if (*s++ != '[') + goto failure; + skip_space(&s); + + if (*s == ']') { + s++; + goto success; + } + + for (;;) { + if (!parse_value(&s, out ? &element : NULL)) + goto failure; + skip_space(&s); + + if (out) + json_append_element(ret, element); + + if (*s == ']') { + s++; + goto success; + } + + if (*s++ != ',') + goto failure; + skip_space(&s); + } + +success: + *sp = s; + if (out) + *out = ret; + return true; + +failure: + json_delete(ret); + return false; +} + +static bool parse_object(const char **sp, JsonNode **out) +{ + const char *s = *sp; + JsonNode *ret = out ? json_mkobject() : NULL; + char *key; + JsonNode *value; + + if (*s++ != '{') + goto failure; + skip_space(&s); + + if (*s == '}') { + s++; + goto success; + } + + for (;;) { + if (!parse_string(&s, out ? &key : NULL)) + goto failure; + skip_space(&s); + + if (*s++ != ':') + goto failure_free_key; + skip_space(&s); + + if (!parse_value(&s, out ? &value : NULL)) + goto failure_free_key; + skip_space(&s); + + if (out) + append_member(ret, key, value); + + if (*s == '}') { + s++; + goto success; + } + + if (*s++ != ',') + goto failure; + skip_space(&s); + } + +success: + *sp = s; + if (out) + *out = ret; + return true; + +failure_free_key: + if (out) + free(key); +failure: + json_delete(ret); + return false; +} + +bool parse_string(const char **sp, char **out) +{ + const char *s = *sp; + SB sb; + char throwaway_buffer[4]; + /* enough space for a UTF-8 character */ + char *b; + + if (*s++ != '"') + return false; + + if (out) { + sb_init(&sb); + sb_need(&sb, 4); + b = sb.cur; + } else { + b = throwaway_buffer; + } + + while (*s != '"') { + unsigned char c = *s++; + + /* Parse next character, and write it to b. */ + if (c == '\\') { + c = *s++; + switch (c) { + case '"': + case '\\': + case '/': + *b++ = c; + break; + case 'b': + *b++ = '\b'; + break; + case 'f': + *b++ = '\f'; + break; + case 'n': + *b++ = '\n'; + break; + case 'r': + *b++ = '\r'; + break; + case 't': + *b++ = '\t'; + break; + case 'u': + { + uint16_t uc, lc; + uchar_t unicode; + + if (!parse_hex16(&s, &uc)) + goto failed; + + if (uc >= 0xD800 && uc <= 0xDFFF) { + /* Handle UTF-16 surrogate pair. */ + if (*s++ != '\\' || *s++ != 'u' || !parse_hex16(&s, &lc)) + goto failed; /* Incomplete surrogate pair. */ + if (!from_surrogate_pair(uc, lc, &unicode)) + goto failed; /* Invalid surrogate pair. */ + } else if (uc == 0) { + /* Disallow "\u0000". */ + goto failed; + } else { + unicode = uc; + } + + b += utf8_write_char(unicode, b); + break; + } + default: + /* Invalid escape */ + goto failed; + } + } else if (c <= 0x1F) { + /* Control characters are not allowed in string literals. */ + goto failed; + } else { + /* Validate and echo a UTF-8 character. */ + int len; + + s--; + len = utf8_validate_cz(s); + if (len == 0) + goto failed; /* Invalid UTF-8 character. */ + + while (len--) + *b++ = *s++; + } + + /* + * Update sb to know about the new bytes, + * and set up b to write another character. + */ + if (out) { + sb.cur = b; + sb_need(&sb, 4); + b = sb.cur; + } else { + b = throwaway_buffer; + } + } + s++; + + if (out) + *out = sb_finish(&sb); + *sp = s; + return true; + +failed: + if (out) + sb_free(&sb); + return false; +} + +/* + * The JSON spec says that a number shall follow this precise pattern + * (spaces and quotes added for readability): + * '-'? (0 | [1-9][0-9]*) ('.' [0-9]+)? ([Ee] [+-]? [0-9]+)? + * + * However, some JSON parsers are more liberal. For instance, PHP accepts + * '.5' and '1.'. JSON.parse accepts '+3'. + * + * This function takes the strict approach. + */ +bool parse_number(const char **sp, double *out) +{ + const char *s = *sp; + + /* '-'? */ + if (*s == '-') + s++; + + /* (0 | [1-9][0-9]*) */ + if (*s == '0') { + s++; + } else { + if (!is_digit(*s)) + return false; + do { + s++; + } while (is_digit(*s)); + } + + /* ('.' [0-9]+)? */ + if (*s == '.') { + s++; + if (!is_digit(*s)) + return false; + do { + s++; + } while (is_digit(*s)); + } + + /* ([Ee] [+-]? [0-9]+)? */ + if (*s == 'E' || *s == 'e') { + s++; + if (*s == '+' || *s == '-') + s++; + if (!is_digit(*s)) + return false; + do { + s++; + } while (is_digit(*s)); + } + + if (out) + *out = strtod(*sp, NULL); + + *sp = s; + return true; +} + +static void skip_space(const char **sp) +{ + const char *s = *sp; + while (is_space(*s)) + s++; + *sp = s; +} + +static void emit_value(SB *out, const JsonNode *node) +{ + assert(tag_is_valid(node->tag)); + switch (node->tag) { + case JSON_NULL: + sb_puts(out, "null"); + break; + case JSON_BOOL: + sb_puts(out, node->bool_ ? "true" : "false"); + break; + case JSON_STRING: + emit_string(out, node->string_); + break; + case JSON_NUMBER: + emit_number(out, node->number_); + break; + case JSON_ARRAY: + emit_array(out, node); + break; + case JSON_OBJECT: + emit_object(out, node); + break; + default: + assert(false); + } +} + +void emit_value_indented(SB *out, const JsonNode *node, const char *space, int indent_level) +{ + assert(tag_is_valid(node->tag)); + switch (node->tag) { + case JSON_NULL: + sb_puts(out, "null"); + break; + case JSON_BOOL: + sb_puts(out, node->bool_ ? "true" : "false"); + break; + case JSON_STRING: + emit_string(out, node->string_); + break; + case JSON_NUMBER: + emit_number(out, node->number_); + break; + case JSON_ARRAY: + emit_array_indented(out, node, space, indent_level); + break; + case JSON_OBJECT: + emit_object_indented(out, node, space, indent_level); + break; + default: + assert(false); + } +} + +static void emit_array(SB *out, const JsonNode *array) +{ + const JsonNode *element; + + sb_putc(out, '['); + json_foreach(element, array) { + emit_value(out, element); + if (element->next != NULL) + sb_putc(out, ','); + } + sb_putc(out, ']'); +} + +static void emit_array_indented(SB *out, const JsonNode *array, const char *space, int indent_level) +{ + const JsonNode *element = array->children.head; + int i; + + if (element == NULL) { + sb_puts(out, "[]"); + return; + } + + sb_puts(out, "[\n"); + while (element != NULL) { + for (i = 0; i < indent_level + 1; i++) + sb_puts(out, space); + emit_value_indented(out, element, space, indent_level + 1); + + element = element->next; + sb_puts(out, element != NULL ? ",\n" : "\n"); + } + for (i = 0; i < indent_level; i++) + sb_puts(out, space); + sb_putc(out, ']'); +} + +static void emit_object(SB *out, const JsonNode *object) +{ + const JsonNode *member; + + sb_putc(out, '{'); + json_foreach(member, object) { + emit_string(out, member->key); + sb_putc(out, ':'); + emit_value(out, member); + if (member->next != NULL) + sb_putc(out, ','); + } + sb_putc(out, '}'); +} + +static void emit_object_indented(SB *out, const JsonNode *object, const char *space, int indent_level) +{ + const JsonNode *member = object->children.head; + int i; + + if (member == NULL) { + sb_puts(out, "{}"); + return; + } + + sb_puts(out, "{\n"); + while (member != NULL) { + for (i = 0; i < indent_level + 1; i++) + sb_puts(out, space); + emit_string(out, member->key); + sb_puts(out, ": "); + emit_value_indented(out, member, space, indent_level + 1); + + member = member->next; + sb_puts(out, member != NULL ? ",\n" : "\n"); + } + for (i = 0; i < indent_level; i++) + sb_puts(out, space); + sb_putc(out, '}'); +} + +void emit_string(SB *out, const char *str) +{ + bool escape_unicode = false; + const char *s = str; + char *b; + + assert(utf8_validate(str)); + + /* + * 14 bytes is enough space to write up to two + * \uXXXX escapes and two quotation marks. + */ + sb_need(out, 14); + b = out->cur; + + *b++ = '"'; + while (*s != 0) { + unsigned char c = *s++; + + /* Encode the next character, and write it to b. */ + switch (c) { + case '"': + *b++ = '\\'; + *b++ = '"'; + break; + case '\\': + *b++ = '\\'; + *b++ = '\\'; + break; + case '\b': + *b++ = '\\'; + *b++ = 'b'; + break; + case '\f': + *b++ = '\\'; + *b++ = 'f'; + break; + case '\n': + *b++ = '\\'; + *b++ = 'n'; + break; + case '\r': + *b++ = '\\'; + *b++ = 'r'; + break; + case '\t': + *b++ = '\\'; + *b++ = 't'; + break; + default: { + int len; + + s--; + len = utf8_validate_cz(s); + + if (len == 0) { + /* + * Handle invalid UTF-8 character gracefully in production + * by writing a replacement character (U+FFFD) + * and skipping a single byte. + * + * This should never happen when assertions are enabled + * due to the assertion at the beginning of this function. + */ + assert(false); + if (escape_unicode) { + strcpy(b, "\\uFFFD"); + b += 6; + } else { + *b++ = 0xEF; + *b++ = 0xBF; + *b++ = 0xBD; + } + s++; + } else if (c < 0x1F || (c >= 0x80 && escape_unicode)) { + /* Encode using \u.... */ + uint32_t unicode; + + s += utf8_read_char(s, &unicode); + + if (unicode <= 0xFFFF) { + *b++ = '\\'; + *b++ = 'u'; + b += write_hex16(b, unicode); + } else { + /* Produce a surrogate pair. */ + uint16_t uc, lc; + assert(unicode <= 0x10FFFF); + to_surrogate_pair(unicode, &uc, &lc); + *b++ = '\\'; + *b++ = 'u'; + b += write_hex16(b, uc); + *b++ = '\\'; + *b++ = 'u'; + b += write_hex16(b, lc); + } + } else { + /* Write the character directly. */ + while (len--) + *b++ = *s++; + } + + break; + } + } + + /* + * Update *out to know about the new bytes, + * and set up b to write another encoded character. + */ + out->cur = b; + sb_need(out, 14); + b = out->cur; + } + *b++ = '"'; + + out->cur = b; +} + +static void emit_number(SB *out, double num) +{ + /* + * This isn't exactly how JavaScript renders numbers, + * but it should produce valid JSON for reasonable numbers + * preserve precision well enough, and avoid some oddities + * like 0.3 -> 0.299999999999999988898 . + */ + char buf[64]; + sprintf(buf, "%.16g", num); + + if (number_is_valid(buf)) + sb_puts(out, buf); + else + sb_puts(out, "null"); +} + +static bool tag_is_valid(unsigned int tag) +{ + return (/* tag >= JSON_NULL && */ tag <= JSON_OBJECT); +} + +static bool number_is_valid(const char *num) +{ + return (parse_number(&num, NULL) && *num == '\0'); +} + +static bool expect_literal(const char **sp, const char *str) +{ + const char *s = *sp; + + while (*str != '\0') + if (*s++ != *str++) + return false; + + *sp = s; + return true; +} + +/* + * Parses exactly 4 hex characters (capital or lowercase). + * Fails if any input chars are not [0-9A-Fa-f]. + */ +static bool parse_hex16(const char **sp, uint16_t *out) +{ + const char *s = *sp; + uint16_t ret = 0; + uint16_t i; + uint16_t tmp; + char c; + + for (i = 0; i < 4; i++) { + c = *s++; + if (c >= '0' && c <= '9') + tmp = c - '0'; + else if (c >= 'A' && c <= 'F') + tmp = c - 'A' + 10; + else if (c >= 'a' && c <= 'f') + tmp = c - 'a' + 10; + else + return false; + + ret <<= 4; + ret += tmp; + } + + if (out) + *out = ret; + *sp = s; + return true; +} + +/* + * Encodes a 16-bit number into hexadecimal, + * writing exactly 4 hex chars. + */ +static int write_hex16(char *out, uint16_t val) +{ + const char *hex = "0123456789ABCDEF"; + + *out++ = hex[(val >> 12) & 0xF]; + *out++ = hex[(val >> 8) & 0xF]; + *out++ = hex[(val >> 4) & 0xF]; + *out++ = hex[ val & 0xF]; + + return 4; +} + +bool json_check(const JsonNode *node, char errmsg[256]) +{ + #define problem(...) do { \ + if (errmsg != NULL) \ + snprintf(errmsg, 256, __VA_ARGS__); \ + return false; \ + } while (0) + + if (node->key != NULL && !utf8_validate(node->key)) + problem("key contains invalid UTF-8"); + + if (!tag_is_valid(node->tag)) + problem("tag is invalid (%u)", node->tag); + + if (node->tag == JSON_BOOL) { + if (node->bool_ != false && node->bool_ != true) + problem("bool_ is neither false (%d) nor true (%d)", (int)false, (int)true); + } else if (node->tag == JSON_STRING) { + if (node->string_ == NULL) + problem("string_ is NULL"); + if (!utf8_validate(node->string_)) + problem("string_ contains invalid UTF-8"); + } else if (node->tag == JSON_ARRAY || node->tag == JSON_OBJECT) { + JsonNode *head = node->children.head; + JsonNode *tail = node->children.tail; + + if (head == NULL || tail == NULL) { + if (head != NULL) + problem("tail is NULL, but head is not"); + if (tail != NULL) + problem("head is NULL, but tail is not"); + } else { + JsonNode *child; + JsonNode *last = NULL; + + if (head->prev != NULL) + problem("First child's prev pointer is not NULL"); + + for (child = head; child != NULL; last = child, child = child->next) { + if (child == node) + problem("node is its own child"); + if (child->next == child) + problem("child->next == child (cycle)"); + if (child->next == head) + problem("child->next == head (cycle)"); + + if (child->parent != node) + problem("child does not point back to parent"); + if (child->next != NULL && child->next->prev != child) + problem("child->next does not point back to child"); + + if (node->tag == JSON_ARRAY && child->key != NULL) + problem("Array element's key is not NULL"); + if (node->tag == JSON_OBJECT && child->key == NULL) + problem("Object member's key is NULL"); + + if (!json_check(child, errmsg)) + return false; + } + + if (last != tail) + problem("tail does not match pointer found by starting at head and following next links"); + } + } + + return true; + + #undef problem +} \ No newline at end of file diff --git a/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/json.h b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/json.h new file mode 100644 index 0000000..aaf711f --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/json.h @@ -0,0 +1,122 @@ +/* + Copyright (C) 2011 Joseph A. Adams (joeyadams3.14159@gmail.com) + All rights reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + Source: http://git.ozlabs.org/?p=ccan;a=tree;f=ccan/json;hb=HEAD +*/ + +#ifndef CCAN_JSON_H +#define CCAN_JSON_H + +#include +#include + +typedef enum { + JSON_NULL, + JSON_BOOL, + JSON_STRING, + JSON_NUMBER, + JSON_ARRAY, + JSON_OBJECT, +} JsonTag; + +typedef struct JsonNode JsonNode; + +struct JsonNode +{ + /* only if parent is an object or array (NULL otherwise) */ + JsonNode *parent; + JsonNode *prev, *next; + + /* only if parent is an object (NULL otherwise) */ + char *key; /* Must be valid UTF-8. */ + + JsonTag tag; + union { + /* JSON_BOOL */ + bool bool_; + + /* JSON_STRING */ + char *string_; /* Must be valid UTF-8. */ + + /* JSON_NUMBER */ + double number_; + + /* JSON_ARRAY */ + /* JSON_OBJECT */ + struct { + JsonNode *head, *tail; + } children; + }; +}; + +/*** Encoding, decoding, and validation ***/ + +JsonNode *json_decode (const char *json); +char *json_encode (const JsonNode *node); +char *json_encode_string (const char *str); +char *json_stringify (const JsonNode *node, const char *space); +void json_delete (JsonNode *node); + +bool json_validate (const char *json); + +/*** Lookup and traversal ***/ + +JsonNode *json_find_element (JsonNode *array, int index); +JsonNode *json_find_member (JsonNode *object, const char *key); + +JsonNode *json_first_child (const JsonNode *node); + +#define json_foreach(i, object_or_array) \ + for ((i) = json_first_child(object_or_array); \ + (i) != NULL; \ + (i) = (i)->next) + +/*** Construction and manipulation ***/ + +JsonNode *json_mknull(void); +JsonNode *json_mkbool(bool b); +JsonNode *json_mkstring(const char *s); +JsonNode *json_mknumber(double n); +JsonNode *json_mkarray(void); +JsonNode *json_mkobject(void); + +void json_append_element(JsonNode *array, JsonNode *element); +void json_prepend_element(JsonNode *array, JsonNode *element); +void json_append_member(JsonNode *object, const char *key, JsonNode *value); +void json_prepend_member(JsonNode *object, const char *key, JsonNode *value); + +void json_remove_from_parent(JsonNode *node); + +/*** Debugging ***/ + +/* + * Look for structure and encoding problems in a JsonNode or its descendents. + * + * If a problem is detected, return false, writing a description of the problem + * to errmsg (unless errmsg is NULL). + */ +bool json_check(const JsonNode *node, char errmsg[256]); + +// Added by Lea Anthony 28/11/2020 +int json_array_length(JsonNode *array); + +#endif \ No newline at end of file diff --git a/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/menu_darwin.c b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/menu_darwin.c new file mode 100644 index 0000000..282d333 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/menu_darwin.c @@ -0,0 +1,1001 @@ +// +// Created by Lea Anthony on 6/1/21. +// + +#include "ffenestri_darwin.h" +#include "menu_darwin.h" +#include "contextmenus_darwin.h" +#include "common.h" + +// NewMenu creates a new Menu struct, saving the given menu structure as JSON +Menu* NewMenu(JsonNode *menuData) { + + Menu *result = malloc(sizeof(Menu)); + + result->processedMenu = menuData; + + // No title by default + result->title = ""; + + // Initialise menuCallbackDataCache + vec_init(&result->callbackDataCache); + + // Allocate MenuItem Map + if( 0 != hashmap_create((const unsigned)16, &result->menuItemMap)) { + ABORT("[NewMenu] Not enough memory to allocate menuItemMap!"); + } + // Allocate the Radio Group Map + if( 0 != hashmap_create((const unsigned)4, &result->radioGroupMap)) { + ABORT("[NewMenu] Not enough memory to allocate radioGroupMap!"); + } + + // Init other members + result->menu = NULL; + result->parentData = NULL; + + return result; +} + +Menu* NewApplicationMenu(const char *menuAsJSON) { + + // Parse the menu json + JsonNode *processedMenu = json_decode(menuAsJSON); + if( processedMenu == NULL ) { + // Parse error! + ABORT("Unable to parse Menu JSON: %s", menuAsJSON); + } + + Menu *result = NewMenu(processedMenu); + result->menuType = ApplicationMenuType; + return result; +} + +MenuItemCallbackData* CreateMenuItemCallbackData(Menu *menu, id menuItem, const char *menuID, enum MenuItemType menuItemType) { + MenuItemCallbackData* result = malloc(sizeof(MenuItemCallbackData)); + + result->menu = menu; + result->menuID = menuID; + result->menuItem = menuItem; + result->menuItemType = menuItemType; + + // Store reference to this so we can destroy later + vec_push(&menu->callbackDataCache, result); + + return result; +} + +void DeleteMenu(Menu *menu) { + + // Free menu item hashmap + hashmap_destroy(&menu->menuItemMap); + + // Free radio group members + if( hashmap_num_entries(&menu->radioGroupMap) > 0 ) { + if (0 != hashmap_iterate_pairs(&menu->radioGroupMap, freeHashmapItem, NULL)) { + ABORT("[DeleteMenu] Failed to release radioGroupMap entries!"); + } + } + + // Free radio groups hashmap + hashmap_destroy(&menu->radioGroupMap); + + // Free up the processed menu memory + if (menu->processedMenu != NULL) { + json_delete(menu->processedMenu); + menu->processedMenu = NULL; + } + + // Release the callback data memory + vector + int i; MenuItemCallbackData* callbackData; + vec_foreach(&menu->callbackDataCache, callbackData, i) { + free(callbackData); + } + vec_deinit(&menu->callbackDataCache); + + free(menu); +} + +// Creates a JSON message for the given menuItemID and data +const char* createMenuClickedMessage(const char *menuItemID, const char *data, enum MenuType menuType, const char *parentID) { + + JsonNode *jsonObject = json_mkobject(); + if (menuItemID == NULL ) { + ABORT("Item ID NULL for menu!!\n"); + } + json_append_member(jsonObject, "menuItemID", json_mkstring(menuItemID)); + json_append_member(jsonObject, "menuType", json_mkstring(MenuTypeAsString[(int)menuType])); + if (data != NULL) { + json_append_member(jsonObject, "data", json_mkstring(data)); + } + if (parentID != NULL) { + json_append_member(jsonObject, "parentID", json_mkstring(parentID)); + } + const char *payload = json_encode(jsonObject); + json_delete(jsonObject); + const char *result = concat("MC", payload); + MEMFREE(payload); + return result; +} + +// Callback for text menu items +void menuItemCallback(id self, SEL cmd, id sender) { + MenuItemCallbackData *callbackData = (MenuItemCallbackData *)msg_reg(msg_reg(sender, s("representedObject")), s("pointerValue")); + const char *message; + + // Update checkbox / radio item + if( callbackData->menuItemType == Checkbox) { + // Toggle state + bool state = msg_reg(callbackData->menuItem, s("state")); + msg_int(callbackData->menuItem, s("setState:"), (state? NSControlStateValueOff : NSControlStateValueOn)); + } else if( callbackData->menuItemType == Radio ) { + // Check the menu items' current state + bool selected = (bool)msg_reg(callbackData->menuItem, s("state")); + + // If it's already selected, exit early + if (selected) return; + + // Get this item's radio group members and turn them off + id *members = (id*)hashmap_get(&(callbackData->menu->radioGroupMap), (char*)callbackData->menuID, strlen(callbackData->menuID)); + + // Uncheck all members of the group + id thisMember = members[0]; + int count = 0; + while(thisMember != NULL) { + msg_int(thisMember, s("setState:"), NSControlStateValueOff); + count = count + 1; + thisMember = members[count]; + } + + // check the selected menu item + msg_int(callbackData->menuItem, s("setState:"), NSControlStateValueOn); + } + + const char *menuID = callbackData->menuID; + const char *data = NULL; + enum MenuType menuType = callbackData->menu->menuType; + const char *parentID = NULL; + + // Generate message to send to backend + if( menuType == ContextMenuType ) { + // Get the context menu data from the menu + ContextMenu* contextMenu = (ContextMenu*) callbackData->menu->parentData; + data = contextMenu->contextMenuData; + parentID = contextMenu->ID; + } else if ( menuType == TrayMenuType ) { + parentID = (const char*) callbackData->menu->parentData; + } + + message = createMenuClickedMessage(menuID, data, menuType, parentID); + + // Notify the backend + messageFromWindowCallback(message); + MEMFREE(message); +} + +id processAcceleratorKey(const char *key) { + + // Guard against no accelerator key + if( key == NULL ) { + return str(""); + } + + if( STREQ(key, "backspace") ) { + return strunicode(0x0008); + } + if( STREQ(key, "tab") ) { + return strunicode(0x0009); + } + if( STREQ(key, "return") ) { + return strunicode(0x000d); + } + if( STREQ(key, "enter") ) { + return strunicode(0x000d); + } + if( STREQ(key, "escape") ) { + return strunicode(0x001b); + } + if( STREQ(key, "left") ) { + return strunicode(0x001c); + } + if( STREQ(key, "right") ) { + return strunicode(0x001d); + } + if( STREQ(key, "up") ) { + return strunicode(0x001e); + } + if( STREQ(key, "down") ) { + return strunicode(0x001f); + } + if( STREQ(key, "space") ) { + return strunicode(0x0020); + } + if( STREQ(key, "delete") ) { + return strunicode(0x007f); + } + if( STREQ(key, "home") ) { + return strunicode(0x2196); + } + if( STREQ(key, "end") ) { + return strunicode(0x2198); + } + if( STREQ(key, "page up") ) { + return strunicode(0x21de); + } + if( STREQ(key, "page down") ) { + return strunicode(0x21df); + } + if( STREQ(key, "f1") ) { + return strunicode(0xf704); + } + if( STREQ(key, "f2") ) { + return strunicode(0xf705); + } + if( STREQ(key, "f3") ) { + return strunicode(0xf706); + } + if( STREQ(key, "f4") ) { + return strunicode(0xf707); + } + if( STREQ(key, "f5") ) { + return strunicode(0xf708); + } + if( STREQ(key, "f6") ) { + return strunicode(0xf709); + } + if( STREQ(key, "f7") ) { + return strunicode(0xf70a); + } + if( STREQ(key, "f8") ) { + return strunicode(0xf70b); + } + if( STREQ(key, "f9") ) { + return strunicode(0xf70c); + } + if( STREQ(key, "f10") ) { + return strunicode(0xf70d); + } + if( STREQ(key, "f11") ) { + return strunicode(0xf70e); + } + if( STREQ(key, "f12") ) { + return strunicode(0xf70f); + } + if( STREQ(key, "f13") ) { + return strunicode(0xf710); + } + if( STREQ(key, "f14") ) { + return strunicode(0xf711); + } + if( STREQ(key, "f15") ) { + return strunicode(0xf712); + } + if( STREQ(key, "f16") ) { + return strunicode(0xf713); + } + if( STREQ(key, "f17") ) { + return strunicode(0xf714); + } + if( STREQ(key, "f18") ) { + return strunicode(0xf715); + } + if( STREQ(key, "f19") ) { + return strunicode(0xf716); + } + if( STREQ(key, "f20") ) { + return strunicode(0xf717); + } + if( STREQ(key, "f21") ) { + return strunicode(0xf718); + } + if( STREQ(key, "f22") ) { + return strunicode(0xf719); + } + if( STREQ(key, "f23") ) { + return strunicode(0xf71a); + } + if( STREQ(key, "f24") ) { + return strunicode(0xf71b); + } + if( STREQ(key, "f25") ) { + return strunicode(0xf71c); + } + if( STREQ(key, "f26") ) { + return strunicode(0xf71d); + } + if( STREQ(key, "f27") ) { + return strunicode(0xf71e); + } + if( STREQ(key, "f28") ) { + return strunicode(0xf71f); + } + if( STREQ(key, "f29") ) { + return strunicode(0xf720); + } + if( STREQ(key, "f30") ) { + return strunicode(0xf721); + } + if( STREQ(key, "f31") ) { + return strunicode(0xf722); + } + if( STREQ(key, "f32") ) { + return strunicode(0xf723); + } + if( STREQ(key, "f33") ) { + return strunicode(0xf724); + } + if( STREQ(key, "f34") ) { + return strunicode(0xf725); + } + if( STREQ(key, "f35") ) { + return strunicode(0xf726); + } +// if( STREQ(key, "Insert") ) { +// return strunicode(0xf727); +// } +// if( STREQ(key, "PrintScreen") ) { +// return strunicode(0xf72e); +// } +// if( STREQ(key, "ScrollLock") ) { +// return strunicode(0xf72f); +// } + if( STREQ(key, "numLock") ) { + return strunicode(0xf739); + } + + return str(key); +} + + +void addSeparator(id menu) { + id item = msg_reg(c("NSMenuItem"), s("separatorItem")); + msg_id(menu, s("addItem:"), item); +} + +id createMenuItemNoAutorelease( id title, const char *action, const char *key) { + id item = ALLOC("NSMenuItem"); + ((id(*)(id, SEL, id, SEL, id))objc_msgSend)(item, s("initWithTitle:action:keyEquivalent:"), title, s(action), str(key)); + return item; +} + +id createMenuItem(id title, const char *action, const char *key) { + id item = ALLOC("NSMenuItem"); + ((id(*)(id, SEL, id, SEL, id))objc_msgSend)(item, s("initWithTitle:action:keyEquivalent:"), title, s(action), str(key)); + msg_reg(item, s("autorelease")); + return item; +} + +id addMenuItem(id menu, const char *title, const char *action, const char *key, bool disabled) { + id item = createMenuItem(str(title), action, key); + msg_bool(item, s("setEnabled:"), !disabled); + msg_id(menu, s("addItem:"), item); + return item; +} + +id createMenu(id title) { + id menu = ALLOC("NSMenu"); + msg_id(menu, s("initWithTitle:"), title); + msg_bool(menu, s("setAutoenablesItems:"), NO); + msg_reg(menu, s("autorelease")); + return menu; +} + +void createDefaultAppMenu(id parentMenu) { +// App Menu + id appName = msg_reg(msg_reg(c("NSProcessInfo"), s("processInfo")), s("processName")); + id appMenuItem = createMenuItemNoAutorelease(appName, NULL, ""); + id appMenu = createMenu(appName); + + msg_id(appMenuItem, s("setSubmenu:"), appMenu); + msg_id(parentMenu, s("addItem:"), appMenuItem); + + id title = msg_id(str("Hide "), s("stringByAppendingString:"), appName); + id item = createMenuItem(title, "hide:", "h"); + msg_id(appMenu, s("addItem:"), item); + + id hideOthers = addMenuItem(appMenu, "Hide Others", "hideOtherApplications:", "h", FALSE); + msg_int(hideOthers, s("setKeyEquivalentModifierMask:"), (NSEventModifierFlagOption | NSEventModifierFlagCommand)); + + addMenuItem(appMenu, "Show All", "unhideAllApplications:", "", FALSE); + + addSeparator(appMenu); + + title = msg_id(str("Quit "), s("stringByAppendingString:"), appName); + item = createMenuItem(title, "terminate:", "q"); + msg_id(appMenu, s("addItem:"), item); +} + +void createDefaultEditMenu(id parentMenu) { + // Edit Menu + id editMenuItem = createMenuItemNoAutorelease(str("Edit"), NULL, ""); + id editMenu = createMenu(str("Edit")); + + msg_id(editMenuItem, s("setSubmenu:"), editMenu); + msg_id(parentMenu, s("addItem:"), editMenuItem); + + addMenuItem(editMenu, "Undo", "undo:", "z", FALSE); + addMenuItem(editMenu, "Redo", "redo:", "y", FALSE); + addSeparator(editMenu); + addMenuItem(editMenu, "Cut", "cut:", "x", FALSE); + addMenuItem(editMenu, "Copy", "copy:", "c", FALSE); + addMenuItem(editMenu, "Paste", "paste:", "v", FALSE); + addMenuItem(editMenu, "Select All", "selectAll:", "a", FALSE); +} + +void processMenuRole(Menu *menu, id parentMenu, JsonNode *item) { + const char *roleName = item->string_; + + if ( STREQ(roleName, "appMenu") ) { + createDefaultAppMenu(parentMenu); + return; + } + if ( STREQ(roleName, "editMenu")) { + createDefaultEditMenu(parentMenu); + return; + } + if ( STREQ(roleName, "hide")) { + addMenuItem(parentMenu, "Hide Window", "hide:", "h", FALSE); + return; + } + if ( STREQ(roleName, "hideothers")) { + id hideOthers = addMenuItem(parentMenu, "Hide Others", "hideOtherApplications:", "h", FALSE); + msg_int(hideOthers, s("setKeyEquivalentModifierMask:"), (NSEventModifierFlagOption | NSEventModifierFlagCommand)); + return; + } + if ( STREQ(roleName, "unhide")) { + addMenuItem(parentMenu, "Show All", "unhideAllApplications:", "", FALSE); + return; + } + if ( STREQ(roleName, "front")) { + addMenuItem(parentMenu, "Bring All to Front", "arrangeInFront:", "", FALSE); + return; + } + if ( STREQ(roleName, "undo")) { + addMenuItem(parentMenu, "Undo", "undo:", "z", FALSE); + return; + } + if ( STREQ(roleName, "redo")) { + addMenuItem(parentMenu, "Redo", "redo:", "y", FALSE); + return; + } + if ( STREQ(roleName, "cut")) { + addMenuItem(parentMenu, "Cut", "cut:", "x", FALSE); + return; + } + if ( STREQ(roleName, "copy")) { + addMenuItem(parentMenu, "Copy", "copy:", "c", FALSE); + return; + } + if ( STREQ(roleName, "paste")) { + addMenuItem(parentMenu, "Paste", "paste:", "v", FALSE); + return; + } + if ( STREQ(roleName, "delete")) { + addMenuItem(parentMenu, "Delete", "delete:", "", FALSE); + return; + } + if( STREQ(roleName, "pasteandmatchstyle")) { + id pasteandmatchstyle = addMenuItem(parentMenu, "Paste and Match Style", "pasteandmatchstyle:", "v", FALSE); + msg_int(pasteandmatchstyle, s("setKeyEquivalentModifierMask:"), (NSEventModifierFlagOption | NSEventModifierFlagShift | NSEventModifierFlagCommand)); + } + if ( STREQ(roleName, "selectall")) { + addMenuItem(parentMenu, "Select All", "selectAll:", "a", FALSE); + return; + } + if ( STREQ(roleName, "minimize")) { + addMenuItem(parentMenu, "Minimize", "miniaturize:", "m", FALSE); + return; + } + if ( STREQ(roleName, "zoom")) { + addMenuItem(parentMenu, "Zoom", "performZoom:", "", FALSE); + return; + } + if ( STREQ(roleName, "quit")) { + addMenuItem(parentMenu, "Quit (More work TBD)", "terminate:", "q", FALSE); + return; + } + if ( STREQ(roleName, "togglefullscreen")) { + addMenuItem(parentMenu, "Toggle Full Screen", "toggleFullScreen:", "f", FALSE); + return; + } + +} + +// This converts a string array of modifiers into the +// equivalent MacOS Modifier Flags +unsigned long parseModifiers(const char **modifiers) { + + // Our result is a modifier flag list + unsigned long result = 0; + + const char *thisModifier = modifiers[0]; + int count = 0; + while( thisModifier != NULL ) { + + // Determine flags + if( STREQ(thisModifier, "cmdorctrl") ) { + result |= NSEventModifierFlagCommand; + } + if( STREQ(thisModifier, "optionoralt") ) { + result |= NSEventModifierFlagOption; + } + if( STREQ(thisModifier, "shift") ) { + result |= NSEventModifierFlagShift; + } + if( STREQ(thisModifier, "super") ) { + result |= NSEventModifierFlagCommand; + } + if( STREQ(thisModifier, "ctrl") ) { + result |= NSEventModifierFlagControl; + } + count++; + thisModifier = modifiers[count]; + } + return result; +} + +id processRadioMenuItem(Menu *menu, id parentmenu, const char *title, const char *menuid, bool disabled, bool checked, const char *acceleratorkey) { + id item = ALLOC("NSMenuItem"); + + // Store the item in the menu item map + hashmap_put(&menu->menuItemMap, (char*)menuid, strlen(menuid), item); + + // Create a MenuItemCallbackData + MenuItemCallbackData *callback = CreateMenuItemCallbackData(menu, item, menuid, Radio); + + id wrappedId = msg_id(c("NSValue"), s("valueWithPointer:"), (id)callback); + msg_id(item, s("setRepresentedObject:"), wrappedId); + + id key = processAcceleratorKey(acceleratorkey); + + ((id(*)(id, SEL, id, SEL, id))objc_msgSend)(item, s("initWithTitle:action:keyEquivalent:"), str(title), s("menuItemCallback:"), key); + + msg_bool(item, s("setEnabled:"), !disabled); + msg_reg(item, s("autorelease")); + msg_int(item, s("setState:"), (checked ? NSControlStateValueOn : NSControlStateValueOff)); + + msg_id(parentmenu, s("addItem:"), item); + return item; + +} + +id processCheckboxMenuItem(Menu *menu, id parentmenu, const char *title, const char *menuid, bool disabled, bool checked, const char *key) { + + id item = ALLOC("NSMenuItem"); + msg_reg(item, s("autorelease")); + + // Store the item in the menu item map + hashmap_put(&menu->menuItemMap, (char*)menuid, strlen(menuid), item); + + // Create a MenuItemCallbackData + MenuItemCallbackData *callback = CreateMenuItemCallbackData(menu, item, menuid, Checkbox); + + id wrappedId = msg_id(c("NSValue"), s("valueWithPointer:"), (id)callback); + msg_id(item, s("setRepresentedObject:"), wrappedId); + ((id(*)(id, SEL, id, SEL, id))objc_msgSend)(item, s("initWithTitle:action:keyEquivalent:"), str(title), s("menuItemCallback:"), str(key)); + msg_bool(item, s("setEnabled:"), !disabled); + msg_int(item, s("setState:"), (checked ? NSControlStateValueOn : NSControlStateValueOff)); + msg_id(parentmenu, s("addItem:"), item); + return item; +} + +// getColour returns the colour from a styledLabel based on the key +const char* getColour(JsonNode *styledLabelEntry, const char* key) { + JsonNode* colEntry = getJSONObject(styledLabelEntry, key); + if( colEntry == NULL ) { + return NULL; + } + return getJSONString(colEntry, "hex"); +} + +id createAttributedStringFromStyledLabel(JsonNode *styledLabel, const char* fontName, int fontSize) { + + // Create result + id attributedString = ALLOC_INIT("NSMutableAttributedString"); + msg_reg(attributedString, s("autorelease")); + + // Create new Dictionary + id dictionary = ALLOC_INIT("NSMutableDictionary"); + msg_reg(dictionary, s("autorelease")); + + // Use default font + CGFloat fontSizeFloat = (CGFloat)fontSize; + id font = ((id(*)(id, SEL, CGFloat))objc_msgSend)(c("NSFont"), s("menuBarFontOfSize:"), fontSizeFloat); + + // Check user supplied font + if( STR_HAS_CHARS(fontName) ) { + id fontNameAsNSString = str(fontName); + id userFont = ((id(*)(id, SEL, id, CGFloat))objc_msgSend)(c("NSFont"), s("fontWithName:size:"), fontNameAsNSString, fontSizeFloat); + if( userFont != NULL ) { + font = userFont; + } + } + + id fan = lookupStringConstant(str("NSFontAttributeName")); + id NSForegroundColorAttributeName = lookupStringConstant(str("NSForegroundColorAttributeName")); + id NSBackgroundColorAttributeName = lookupStringConstant(str("NSBackgroundColorAttributeName")); + + // Loop over styled text creating NSAttributedText and appending to result + JsonNode *styledLabelEntry; + json_foreach(styledLabelEntry, styledLabel) { + + // Clear dictionary + msg_reg(dictionary, s("removeAllObjects")); + + // Add font to dictionary + msg_id_id(dictionary, s("setObject:forKey:"), font, fan); + + // Get Text + const char* thisLabel = mustJSONString(styledLabelEntry, "Label"); + + // Get foreground colour + const char *hexColour = getColour(styledLabelEntry, "FgCol"); + if( hexColour != NULL) { + unsigned short r, g, b, a; + + // white by default + r = g = b = a = 255; + int count = sscanf(hexColour, "#%02hx%02hx%02hx%02hx", &r, &g, &b, &a); + if (count > 0) { + id colour = ((id(*)(id, SEL, CGFloat, CGFloat, CGFloat, CGFloat))objc_msgSend)(c("NSColor"), s("colorWithCalibratedRed:green:blue:alpha:"), + (CGFloat)r / (CGFloat)255.0, + (CGFloat)g / (CGFloat)255.0, + (CGFloat)b / (CGFloat)255.0, + (CGFloat)a / (CGFloat)255.0); + msg_id_id(dictionary, s("setObject:forKey:"), colour, NSForegroundColorAttributeName); + } + } + + // Get background colour + hexColour = getColour(styledLabelEntry, "BgCol"); + if( hexColour != NULL) { + unsigned short r, g, b, a; + + // white by default + r = g = b = a = 255; + int count = sscanf(hexColour, "#%02hx%02hx%02hx%02hx", &r, &g, &b, &a); + if (count > 0) { + id colour = ((id(*)(id, SEL, CGFloat, CGFloat, CGFloat, CGFloat))objc_msgSend)(c("NSColor"), s("colorWithCalibratedRed:green:blue:alpha:"), + (CGFloat)r / (CGFloat)255.0, + (CGFloat)g / (CGFloat)255.0, + (CGFloat)b / (CGFloat)255.0, + (CGFloat)a / (CGFloat)255.0); + msg_id_id(dictionary, s("setObject:forKey:"), colour, NSForegroundColorAttributeName); + } + } + + // Create AttributedText + id thisString = ALLOC("NSMutableAttributedString"); + msg_reg(thisString, s("autorelease")); + msg_id_id(thisString, s("initWithString:attributes:"), str(thisLabel), dictionary); + + // Append text to result + msg_id(attributedString, s("appendAttributedString:"), thisString); + } + + return attributedString; + +} + + +id createAttributedString(const char* title, const char* fontName, int fontSize, const char* RGBA) { + + // Create new Dictionary + id dictionary = ALLOC_INIT("NSMutableDictionary"); + CGFloat fontSizeFloat = (CGFloat)fontSize; + + // Use default font + id font = ((id(*)(id, SEL, CGFloat))objc_msgSend)(c("NSFont"), s("menuBarFontOfSize:"), fontSizeFloat); + + // Check user supplied font + if( STR_HAS_CHARS(fontName) ) { + id fontNameAsNSString = str(fontName); + id userFont = ((id(*)(id, SEL, id, CGFloat))objc_msgSend)(c("NSFont"), s("fontWithName:size:"), fontNameAsNSString, fontSizeFloat); + if( userFont != NULL ) { + font = userFont; + } + } + + // Add font to dictionary + id fan = lookupStringConstant(str("NSFontAttributeName")); + msg_id_id(dictionary, s("setObject:forKey:"), font, fan); + + // RGBA + if( RGBA != NULL && strlen(RGBA) > 0) { + unsigned short r, g, b, a; + + // white by default + r = g = b = a = 255; + int count = sscanf(RGBA, "#%02hx%02hx%02hx%02hx", &r, &g, &b, &a); + if (count > 0) { + id colour = ((id(*)(id, SEL, CGFloat, CGFloat, CGFloat, CGFloat))objc_msgSend)(c("NSColor"), s("colorWithCalibratedRed:green:blue:alpha:"), + (CGFloat)r / (CGFloat)255.0, + (CGFloat)g / (CGFloat)255.0, + (CGFloat)b / (CGFloat)255.0, + (CGFloat)a / (CGFloat)255.0); + id NSForegroundColorAttributeName = lookupStringConstant(str("NSForegroundColorAttributeName")); + msg_id_id(dictionary, s("setObject:forKey:"), colour, NSForegroundColorAttributeName); + } + } + + id attributedString = ALLOC("NSMutableAttributedString"); + msg_id_id(attributedString, s("initWithString:attributes:"), str(title), dictionary); + msg_reg(attributedString, s("autorelease")); + msg_reg(dictionary, s("autorelease")); + return attributedString; +} + +id processTextMenuItem(Menu *menu, id parentMenu, const char *title, const char *menuid, bool disabled, const char *acceleratorkey, const char **modifiers, const char* tooltip, const char* image, const char* fontName, int fontSize, const char* RGBA, bool templateImage, bool alternate, JsonNode* styledLabel) { + id item = ALLOC("NSMenuItem"); + msg_reg(item, s("autorelease")); + + // Create a MenuItemCallbackData + MenuItemCallbackData *callback = CreateMenuItemCallbackData(menu, item, menuid, Text); + + id wrappedId = msg_id(c("NSValue"), s("valueWithPointer:"), (id)callback); + msg_id(item, s("setRepresentedObject:"), wrappedId); + + if( !alternate ) { + id key = processAcceleratorKey(acceleratorkey); + ((id(*)(id, SEL, id, SEL, id))objc_msgSend)(item, s("initWithTitle:action:keyEquivalent:"), str(title), + s("menuItemCallback:"), key); + } else { + ((id(*)(id, SEL, id, SEL, id))objc_msgSend)(item, s("initWithTitle:action:keyEquivalent:"), str(title), s("menuItemCallback:"), str("")); + } + + if( tooltip != NULL ) { + msg_id(item, s("setToolTip:"), str(tooltip)); + } + + // Process image + if( image != NULL && strlen(image) > 0) { + id nsimage = createImageFromBase64Data(image, templateImage); + msg_id(item, s("setImage:"), nsimage); + } + + id attributedString = NULL; + if( styledLabel != NULL) { + attributedString = createAttributedStringFromStyledLabel(styledLabel, fontName, fontSize); + } else { + attributedString = createAttributedString(title, fontName, fontSize, RGBA); + } + msg_id(item, s("setAttributedTitle:"), attributedString); + +//msg_id(item, s("setTitle:"), str(title)); + + msg_bool(item, s("setEnabled:"), !disabled); + + // Process modifiers + if( modifiers != NULL && !alternate) { + unsigned long modifierFlags = parseModifiers(modifiers); + ((id(*)(id, SEL, unsigned long))objc_msgSend)(item, s("setKeyEquivalentModifierMask:"), modifierFlags); + } + + // alternate + if( alternate ) { + msg_bool(item, s("setAlternate:"), true); + msg_int(item, s("setKeyEquivalentModifierMask:"), NSEventModifierFlagOption); + } + msg_id(parentMenu, s("addItem:"), item); + + return item; +} + +void processMenuItem(Menu *menu, id parentMenu, JsonNode *item) { + + // Check if this item is hidden and if so, exit early! + bool hidden = false; + getJSONBool(item, "Hidden", &hidden); + if( hidden ) { + return; + } + + // Get the role + JsonNode *role = json_find_member(item, "Role"); + if( role != NULL ) { + processMenuRole(menu, parentMenu, role); + return; + } + + // This is a user menu. Get the common data + // Get the label + const char *label = getJSONString(item, "Label"); + if ( label == NULL) { + label = "(empty)"; + } + + // Check for a styled label + JsonNode *styledLabel = getJSONObject(item, "StyledLabel"); + + // Is this an alternate menu item? + bool alternate = false; + getJSONBool(item, "MacAlternate", &alternate); + + const char *menuid = getJSONString(item, "ID"); + if ( menuid == NULL) { + menuid = ""; + } + + bool disabled = false; + getJSONBool(item, "Disabled", &disabled); + + // Get the Accelerator + JsonNode *accelerator = json_find_member(item, "Accelerator"); + const char *acceleratorkey = NULL; + const char **modifiers = NULL; + + const char *tooltip = getJSONString(item, "Tooltip"); + const char *image = getJSONString(item, "Image"); + const char *fontName = getJSONString(item, "FontName"); + const char *RGBA = getJSONString(item, "RGBA"); + bool templateImage = false; + getJSONBool(item, "MacTemplateImage", &templateImage); + + int fontSize = 0; + getJSONInt(item, "FontSize", &fontSize); + + // If we have an accelerator + if( accelerator != NULL ) { + // Get the key + acceleratorkey = getJSONString(accelerator, "Key"); + // Check if there are modifiers + JsonNode *modifiersList = json_find_member(accelerator, "Modifiers"); + if ( modifiersList != NULL ) { + // Allocate an array of strings + int noOfModifiers = json_array_length(modifiersList); + + // Do we have any? + if (noOfModifiers > 0) { + modifiers = malloc(sizeof(const char *) * (noOfModifiers + 1)); + JsonNode *modifier; + int count = 0; + // Iterate the modifiers and save a reference to them in our new array + json_foreach(modifier, modifiersList) { + // Get modifier name + modifiers[count] = modifier->string_; + count++; + } + // Null terminate the modifier list + modifiers[count] = NULL; + } + } + } + + // Get the Type + JsonNode *type = json_find_member(item, "Type"); + if( type != NULL ) { + if( STREQ(type->string_, "Text") || STREQ(type->string_, "Submenu")) { + id thisMenuItem = processTextMenuItem(menu, parentMenu, label, menuid, disabled, acceleratorkey, modifiers, tooltip, image, fontName, fontSize, RGBA, templateImage, alternate, styledLabel); + + // Check if this node has a submenu + JsonNode *submenu = json_find_member(item, "SubMenu"); + if( submenu != NULL ) { + // Get the label + JsonNode *menuNameNode = json_find_member(item, "Label"); + const char *name = ""; + if ( menuNameNode != NULL) { + name = menuNameNode->string_; + } + + id thisMenu = createMenu(str(name)); + + msg_id(thisMenuItem, s("setSubmenu:"), thisMenu); + + JsonNode *submenuItems = json_find_member(submenu, "Items"); + // If we have no items, just return + if ( submenuItems == NULL ) { + return; + } + + // Loop over submenu items + JsonNode *item; + json_foreach(item, submenuItems) { + // Get item label + processMenuItem(menu, thisMenu, item); + } + } + } + else if ( STREQ(type->string_, "Separator")) { + addSeparator(parentMenu); + } + else if ( STREQ(type->string_, "Checkbox")) { + // Get checked state + bool checked = false; + getJSONBool(item, "Checked", &checked); + + processCheckboxMenuItem(menu, parentMenu, label, menuid, disabled, checked, ""); + } + else if ( STREQ(type->string_, "Radio")) { + // Get checked state + bool checked = false; + getJSONBool(item, "Checked", &checked); + + processRadioMenuItem(menu, parentMenu, label, menuid, disabled, checked, ""); + } + } + + if ( modifiers != NULL ) { + free(modifiers); + } + + return; +} + +void processMenuData(Menu *menu, JsonNode *menuData) { + JsonNode *items = json_find_member(menuData, "Items"); + if( items == NULL ) { + // Parse error! + ABORT("Unable to find 'Items' in menu JSON!"); + } + + // Iterate items + JsonNode *item; + json_foreach(item, items) { + // Process each menu item + processMenuItem(menu, menu->menu, item); + } +} + +void processRadioGroupJSON(Menu *menu, JsonNode *radioGroup) { + + int groupLength; + getJSONInt(radioGroup, "Length", &groupLength); + JsonNode *members = json_find_member(radioGroup, "Members"); + JsonNode *member; + + // Allocate array + size_t arrayLength = sizeof(id)*(groupLength+1); + id memberList[arrayLength]; + + // Build the radio group items + int count=0; + json_foreach(member, members) { + // Get menu by id + id menuItem = (id)hashmap_get(&menu->menuItemMap, (char*)member->string_, strlen(member->string_)); + // Save Member + memberList[count] = menuItem; + count = count + 1; + } + // Null terminate array + memberList[groupLength] = 0; + + // Store the members + json_foreach(member, members) { + // Copy the memberList + char *newMemberList = (char *)malloc(arrayLength); + memcpy(newMemberList, memberList, arrayLength); + // add group to each member of group + hashmap_put(&menu->radioGroupMap, member->string_, strlen(member->string_), newMemberList); + } + +} + +id GetMenu(Menu *menu) { + + // Pull out the menu data + JsonNode *menuData = json_find_member(menu->processedMenu, "Menu"); + if( menuData == NULL ) { + ABORT("Unable to find Menu data: %s", menu->processedMenu); + } + + menu->menu = createMenu(str("")); + + // Process the menu data + processMenuData(menu, menuData); + + // Create the radiogroup cache + JsonNode *radioGroups = json_find_member(menu->processedMenu, "RadioGroups"); + if( radioGroups == NULL ) { + // Parse error! + ABORT("Unable to find RadioGroups data: %s", menu->processedMenu); + } + + // Iterate radio groups + JsonNode *radioGroup; + json_foreach(radioGroup, radioGroups) { + // Get item label + processRadioGroupJSON(menu, radioGroup); + } + + return menu->menu; +} + diff --git a/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/menu_darwin.h b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/menu_darwin.h new file mode 100644 index 0000000..a68c483 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/menu_darwin.h @@ -0,0 +1,117 @@ +// +// Created by Lea Anthony on 6/1/21. +// + +#ifndef MENU_DARWIN_H +#define MENU_DARWIN_H + +#include "common.h" +#include "ffenestri_darwin.h" + +enum MenuItemType {Text = 0, Checkbox = 1, Radio = 2}; +enum MenuType {ApplicationMenuType = 0, ContextMenuType = 1, TrayMenuType = 2}; +static const char *MenuTypeAsString[] = { + "ApplicationMenu", "ContextMenu", "TrayMenu", +}; + +typedef struct _NSRange { + unsigned long location; + unsigned long length; +} NSRange; + +#define NSFontWeightUltraLight -0.8 +#define NSFontWeightThin -0.6 +#define NSFontWeightLight -0.4 +#define NSFontWeightRegular 0.0 +#define NSFontWeightMedium 0.23 +#define NSFontWeightSemibold 0.3 +#define NSFontWeightBold 0.4 +#define NSFontWeightHeavy 0.56 +#define NSFontWeightBlack 0.62 + +extern void messageFromWindowCallback(const char *); + +typedef struct { + + const char *title; + + /*** Internal ***/ + + // The decoded version of the Menu JSON + JsonNode *processedMenu; + + struct hashmap_s menuItemMap; + struct hashmap_s radioGroupMap; + + // Vector to keep track of callback data memory + vec_void_t callbackDataCache; + + // The NSMenu for this menu + id menu; + + // The parent data, eg ContextMenuStore or Tray + void *parentData; + + // The commands for the menu callbacks + const char *callbackCommand; + + // This indicates if we are an Application Menu, tray menu or context menu + enum MenuType menuType; + + +} Menu; + + +typedef struct { + id menuItem; + Menu *menu; + const char *menuID; + enum MenuItemType menuItemType; +} MenuItemCallbackData; + + + +// NewMenu creates a new Menu struct, saving the given menu structure as JSON +Menu* NewMenu(JsonNode *menuData); + +Menu* NewApplicationMenu(const char *menuAsJSON); +MenuItemCallbackData* CreateMenuItemCallbackData(Menu *menu, id menuItem, const char *menuID, enum MenuItemType menuItemType); + +void DeleteMenu(Menu *menu); + +// Creates a JSON message for the given menuItemID and data +const char* createMenuClickedMessage(const char *menuItemID, const char *data, enum MenuType menuType, const char *parentID); +// Callback for text menu items +void menuItemCallback(id self, SEL cmd, id sender); +id processAcceleratorKey(const char *key); + + +void addSeparator(id menu); +id createMenuItemNoAutorelease( id title, const char *action, const char *key); + +id createMenuItem(id title, const char *action, const char *key); + +id addMenuItem(id menu, const char *title, const char *action, const char *key, bool disabled); + +id createMenu(id title); +void createDefaultAppMenu(id parentMenu); +void createDefaultEditMenu(id parentMenu); + +void processMenuRole(Menu *menu, id parentMenu, JsonNode *item); +// This converts a string array of modifiers into the +// equivalent MacOS Modifier Flags +unsigned long parseModifiers(const char **modifiers); +id processRadioMenuItem(Menu *menu, id parentmenu, const char *title, const char *menuid, bool disabled, bool checked, const char *acceleratorkey); + +id processCheckboxMenuItem(Menu *menu, id parentmenu, const char *title, const char *menuid, bool disabled, bool checked, const char *key); + +id processTextMenuItem(Menu *menu, id parentMenu, const char *title, const char *menuid, bool disabled, const char *acceleratorkey, const char **modifiers, const char* tooltip, const char* image, const char* fontName, int fontSize, const char* RGBA, bool templateImage, bool alternate, JsonNode* styledLabel); +void processMenuItem(Menu *menu, id parentMenu, JsonNode *item); +void processMenuData(Menu *menu, JsonNode *menuData); + +void processRadioGroupJSON(Menu *menu, JsonNode *radioGroup); +id GetMenu(Menu *menu); +id createAttributedString(const char* title, const char* fontName, int fontSize, const char* RGBA); +id createAttributedStringFromStyledLabel(JsonNode *styledLabel, const char* fontName, int fontSize); + +#endif //ASSETS_C_MENU_DARWIN_H diff --git a/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/runtime_darwin.c b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/runtime_darwin.c new file mode 100644 index 0000000..0d733f8 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/runtime_darwin.c @@ -0,0 +1,5 @@ + +// runtime.c (c) 2019-Present Lea Anthony. +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file was auto-generated. DO NOT MODIFY. +const unsigned char runtime[]={0x76, 0x61, 0x72, 0x20, 0x57, 0x61, 0x69, 0x6c, 0x73, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x7b, 0x7d, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x28, 0x72, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x74, 0x5b, 0x72, 0x5d, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x5b, 0x72, 0x5d, 0x2e, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x69, 0x3d, 0x74, 0x5b, 0x72, 0x5d, 0x3d, 0x7b, 0x69, 0x3a, 0x72, 0x2c, 0x6c, 0x3a, 0x21, 0x31, 0x2c, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x3a, 0x7b, 0x7d, 0x7d, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x5b, 0x72, 0x5d, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x69, 0x2e, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x2c, 0x69, 0x2c, 0x69, 0x2e, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x2c, 0x65, 0x29, 0x2c, 0x69, 0x2e, 0x6c, 0x3d, 0x21, 0x30, 0x2c, 0x69, 0x2e, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x2e, 0x6d, 0x3d, 0x6e, 0x2c, 0x65, 0x2e, 0x63, 0x3d, 0x74, 0x2c, 0x65, 0x2e, 0x64, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x72, 0x29, 0x7b, 0x65, 0x2e, 0x6f, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7c, 0x7c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x7b, 0x65, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x3a, 0x21, 0x30, 0x2c, 0x67, 0x65, 0x74, 0x3a, 0x72, 0x7d, 0x29, 0x7d, 0x2c, 0x65, 0x2e, 0x72, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x22, 0x75, 0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x22, 0x21, 0x3d, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x26, 0x26, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x2e, 0x74, 0x6f, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x26, 0x26, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x6e, 0x2c, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x2e, 0x74, 0x6f, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x2c, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x22, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x7d, 0x29, 0x2c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x6e, 0x2c, 0x22, 0x5f, 0x5f, 0x65, 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x2c, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x21, 0x30, 0x7d, 0x29, 0x7d, 0x2c, 0x65, 0x2e, 0x74, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x31, 0x26, 0x74, 0x26, 0x26, 0x28, 0x6e, 0x3d, 0x65, 0x28, 0x6e, 0x29, 0x29, 0x2c, 0x38, 0x26, 0x74, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x3b, 0x69, 0x66, 0x28, 0x34, 0x26, 0x74, 0x26, 0x26, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x3d, 0x3d, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x6e, 0x26, 0x26, 0x6e, 0x26, 0x26, 0x6e, 0x2e, 0x5f, 0x5f, 0x65, 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x3d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x65, 0x2e, 0x72, 0x28, 0x72, 0x29, 0x2c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x72, 0x2c, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x2c, 0x7b, 0x65, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x3a, 0x21, 0x30, 0x2c, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x6e, 0x7d, 0x29, 0x2c, 0x32, 0x26, 0x74, 0x26, 0x26, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x21, 0x3d, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x6e, 0x29, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x69, 0x20, 0x69, 0x6e, 0x20, 0x6e, 0x29, 0x65, 0x2e, 0x64, 0x28, 0x72, 0x2c, 0x69, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x5b, 0x74, 0x5d, 0x7d, 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0x69, 0x29, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x7d, 0x2c, 0x65, 0x2e, 0x6e, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x6e, 0x26, 0x26, 0x6e, 0x2e, 0x5f, 0x5f, 0x65, 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x3f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x7d, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x7d, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x2e, 0x64, 0x28, 0x74, 0x2c, 0x22, 0x61, 0x22, 0x2c, 0x74, 0x29, 0x2c, 0x74, 0x7d, 0x2c, 0x65, 0x2e, 0x6f, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x68, 0x61, 0x73, 0x4f, 0x77, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7d, 0x2c, 0x65, 0x2e, 0x70, 0x3d, 0x22, 0x22, 0x2c, 0x65, 0x28, 0x65, 0x2e, 0x73, 0x3d, 0x30, 0x29, 0x7d, 0x28, 0x5b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x22, 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x22, 0x3b, 0x65, 0x2e, 0x72, 0x28, 0x74, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x3d, 0x7b, 0x7d, 0x3b, 0x65, 0x2e, 0x72, 0x28, 0x72, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x72, 0x2c, 0x22, 0x54, 0x72, 0x61, 0x63, 0x65, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x72, 0x2c, 0x22, 0x50, 0x72, 0x69, 0x6e, 0x74, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x72, 0x2c, 0x22, 0x44, 0x65, 0x62, 0x75, 0x67, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x79, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x72, 0x2c, 0x22, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x72, 0x2c, 0x22, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x72, 0x2c, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x67, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x72, 0x2c, 0x22, 0x46, 0x61, 0x74, 0x61, 0x6c, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x68, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x72, 0x2c, 0x22, 0x53, 0x65, 0x74, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x53, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x72, 0x2c, 0x22, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x45, 0x7d, 0x29, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x69, 0x3d, 0x7b, 0x7d, 0x3b, 0x65, 0x2e, 0x72, 0x28, 0x69, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x69, 0x2c, 0x22, 0x4f, 0x70, 0x65, 0x6e, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x78, 0x7d, 0x29, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x6f, 0x3d, 0x7b, 0x7d, 0x3b, 0x65, 0x2e, 0x72, 0x28, 0x6f, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x6f, 0x2c, 0x22, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4e, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x6f, 0x2c, 0x22, 0x53, 0x65, 0x74, 0x54, 0x69, 0x74, 0x6c, 0x65, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x54, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x6f, 0x2c, 0x22, 0x46, 0x75, 0x6c, 0x6c, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6a, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x6f, 0x2c, 0x22, 0x55, 0x6e, 0x46, 0x75, 0x6c, 0x6c, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x44, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x6f, 0x2c, 0x22, 0x53, 0x65, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x49, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x6f, 0x2c, 0x22, 0x53, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x50, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x6f, 0x2c, 0x22, 0x48, 0x69, 0x64, 0x65, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x41, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x6f, 0x2c, 0x22, 0x53, 0x68, 0x6f, 0x77, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4a, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x6f, 0x2c, 0x22, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x69, 0x73, 0x65, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4c, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x6f, 0x2c, 0x22, 0x55, 0x6e, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x69, 0x73, 0x65, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x52, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x6f, 0x2c, 0x22, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x69, 0x73, 0x65, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x6f, 0x2c, 0x22, 0x55, 0x6e, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x69, 0x73, 0x65, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x46, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x6f, 0x2c, 0x22, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x55, 0x7d, 0x29, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x61, 0x3d, 0x7b, 0x7d, 0x3b, 0x65, 0x2e, 0x72, 0x28, 0x61, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x61, 0x2c, 0x22, 0x4f, 0x70, 0x65, 0x6e, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x42, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x61, 0x2c, 0x22, 0x53, 0x61, 0x76, 0x65, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x48, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x61, 0x2c, 0x22, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x47, 0x7d, 0x29, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x75, 0x3d, 0x7b, 0x7d, 0x3b, 0x65, 0x2e, 0x72, 0x28, 0x75, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x75, 0x2c, 0x22, 0x4e, 0x65, 0x77, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x6e, 0x7d, 0x29, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x63, 0x3d, 0x7b, 0x7d, 0x3b, 0x65, 0x2e, 0x72, 0x28, 0x63, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x63, 0x2c, 0x22, 0x53, 0x65, 0x74, 0x49, 0x63, 0x6f, 0x6e, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x6e, 0x7d, 0x29, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x6c, 0x3d, 0x7b, 0x41, 0x70, 0x70, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x64, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x22, 0x2c, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x22, 0x64, 0x61, 0x72, 0x77, 0x69, 0x6e, 0x22, 0x7d, 0x7d, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x73, 0x3d, 0x5b, 0x5d, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x28, 0x6e, 0x29, 0x7b, 0x73, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x6e, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x28, 0x6e, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x28, 0x6e, 0x29, 0x7d, 0x28, 0x6e, 0x29, 0x2c, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3e, 0x30, 0x29, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x30, 0x3b, 0x74, 0x3c, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x74, 0x2b, 0x2b, 0x29, 0x73, 0x5b, 0x74, 0x5d, 0x28, 0x6e, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x64, 0x28, 0x22, 0x4c, 0x22, 0x2b, 0x6e, 0x2b, 0x74, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x76, 0x28, 0x6e, 0x29, 0x7b, 0x77, 0x28, 0x22, 0x54, 0x22, 0x2c, 0x6e, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x28, 0x6e, 0x29, 0x7b, 0x77, 0x28, 0x22, 0x50, 0x22, 0x2c, 0x6e, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x79, 0x28, 0x6e, 0x29, 0x7b, 0x77, 0x28, 0x22, 0x44, 0x22, 0x2c, 0x6e, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x28, 0x6e, 0x29, 0x7b, 0x77, 0x28, 0x22, 0x49, 0x22, 0x2c, 0x6e, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x28, 0x6e, 0x29, 0x7b, 0x77, 0x28, 0x22, 0x57, 0x22, 0x2c, 0x6e, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x28, 0x6e, 0x29, 0x7b, 0x77, 0x28, 0x22, 0x45, 0x22, 0x2c, 0x6e, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x28, 0x6e, 0x29, 0x7b, 0x77, 0x28, 0x22, 0x46, 0x22, 0x2c, 0x6e, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x53, 0x28, 0x6e, 0x29, 0x7b, 0x77, 0x28, 0x22, 0x53, 0x22, 0x2c, 0x6e, 0x29, 0x7d, 0x76, 0x61, 0x72, 0x20, 0x4f, 0x2c, 0x45, 0x3d, 0x7b, 0x54, 0x52, 0x41, 0x43, 0x45, 0x3a, 0x31, 0x2c, 0x44, 0x45, 0x42, 0x55, 0x47, 0x3a, 0x32, 0x2c, 0x49, 0x4e, 0x46, 0x4f, 0x3a, 0x33, 0x2c, 0x57, 0x41, 0x52, 0x4e, 0x49, 0x4e, 0x47, 0x3a, 0x34, 0x2c, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x3a, 0x35, 0x7d, 0x2c, 0x6b, 0x3d, 0x7b, 0x7d, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x43, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x21, 0x3d, 0x65, 0x26, 0x26, 0x6e, 0x75, 0x6c, 0x6c, 0x21, 0x3d, 0x65, 0x7c, 0x7c, 0x28, 0x65, 0x3d, 0x30, 0x29, 0x2c, 0x6e, 0x65, 0x77, 0x20, 0x50, 0x72, 0x6f, 0x6d, 0x69, 0x73, 0x65, 0x28, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x72, 0x2c, 0x69, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x6f, 0x3b, 0x64, 0x6f, 0x7b, 0x6f, 0x3d, 0x6e, 0x2b, 0x22, 0x2d, 0x22, 0x2b, 0x4f, 0x28, 0x29, 0x7d, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x28, 0x6b, 0x5b, 0x6f, 0x5d, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x65, 0x3e, 0x30, 0x29, 0x76, 0x61, 0x72, 0x20, 0x61, 0x3d, 0x73, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x69, 0x28, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x43, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x22, 0x2b, 0x6e, 0x2b, 0x22, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x64, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x20, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x49, 0x44, 0x3a, 0x20, 0x22, 0x2b, 0x6f, 0x29, 0x29, 0x7d, 0x29, 0x2c, 0x65, 0x29, 0x3b, 0x6b, 0x5b, 0x6f, 0x5d, 0x3d, 0x7b, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x3a, 0x61, 0x2c, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x3a, 0x69, 0x2c, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x3a, 0x72, 0x7d, 0x3b, 0x74, 0x72, 0x79, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x75, 0x3d, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x6e, 0x2c, 0x61, 0x72, 0x67, 0x73, 0x3a, 0x74, 0x2c, 0x63, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x49, 0x44, 0x3a, 0x6f, 0x7d, 0x3b, 0x64, 0x28, 0x22, 0x43, 0x22, 0x2b, 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, 0x28, 0x75, 0x29, 0x29, 0x7d, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x6e, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x6e, 0x29, 0x7d, 0x7d, 0x29, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x57, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3b, 0x74, 0x72, 0x79, 0x7b, 0x74, 0x3d, 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x28, 0x6e, 0x29, 0x7d, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x74, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x4a, 0x53, 0x4f, 0x4e, 0x20, 0x70, 0x61, 0x73, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x3a, 0x20, 0x22, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x74, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2c, 0x22, 0x2e, 0x20, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x20, 0x22, 0x29, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x6e, 0x29, 0x3b, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x79, 0x28, 0x65, 0x29, 0x2c, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x65, 0x29, 0x7d, 0x76, 0x61, 0x72, 0x20, 0x72, 0x3d, 0x74, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x69, 0x64, 0x2c, 0x69, 0x3d, 0x6b, 0x5b, 0x72, 0x5d, 0x3b, 0x69, 0x66, 0x28, 0x21, 0x69, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x6f, 0x3d, 0x22, 0x43, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x20, 0x27, 0x22, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x72, 0x2c, 0x22, 0x27, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x21, 0x21, 0x21, 0x22, 0x29, 0x3b, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x6f, 0x29, 0x2c, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x6f, 0x29, 0x7d, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, 0x69, 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x29, 0x2c, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6b, 0x5b, 0x72, 0x5d, 0x2c, 0x74, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3f, 0x69, 0x2e, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x28, 0x74, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x3a, 0x69, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x28, 0x74, 0x2e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4d, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x5b, 0x5d, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x28, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x29, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x31, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x43, 0x28, 0x22, 0x2e, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x22, 0x2b, 0x6e, 0x2c, 0x74, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x78, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x28, 0x22, 0x52, 0x42, 0x4f, 0x22, 0x2b, 0x6e, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4e, 0x28, 0x29, 0x7b, 0x64, 0x28, 0x22, 0x57, 0x63, 0x22, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x54, 0x28, 0x6e, 0x29, 0x7b, 0x64, 0x28, 0x22, 0x57, 0x54, 0x22, 0x2b, 0x6e, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6a, 0x28, 0x29, 0x7b, 0x64, 0x28, 0x22, 0x57, 0x46, 0x22, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x44, 0x28, 0x29, 0x7b, 0x64, 0x28, 0x22, 0x57, 0x66, 0x22, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x64, 0x28, 0x22, 0x57, 0x73, 0x3a, 0x22, 0x2b, 0x6e, 0x2b, 0x22, 0x3a, 0x22, 0x2b, 0x74, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x50, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x64, 0x28, 0x22, 0x57, 0x70, 0x3a, 0x22, 0x2b, 0x6e, 0x2b, 0x22, 0x3a, 0x22, 0x2b, 0x74, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x28, 0x29, 0x7b, 0x64, 0x28, 0x22, 0x57, 0x48, 0x22, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4a, 0x28, 0x29, 0x7b, 0x64, 0x28, 0x22, 0x57, 0x53, 0x22, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4c, 0x28, 0x29, 0x7b, 0x64, 0x28, 0x22, 0x57, 0x4d, 0x22, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x52, 0x28, 0x29, 0x7b, 0x64, 0x28, 0x22, 0x57, 0x55, 0x22, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x28, 0x29, 0x7b, 0x64, 0x28, 0x22, 0x57, 0x6d, 0x22, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x46, 0x28, 0x29, 0x7b, 0x64, 0x28, 0x22, 0x57, 0x75, 0x22, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x55, 0x28, 0x29, 0x7b, 0x64, 0x28, 0x22, 0x57, 0x43, 0x22, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x42, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4d, 0x28, 0x22, 0x44, 0x69, 0x61, 0x6c, 0x6f, 0x67, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x22, 0x2c, 0x6e, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x48, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4d, 0x28, 0x22, 0x44, 0x69, 0x61, 0x6c, 0x6f, 0x67, 0x2e, 0x53, 0x61, 0x76, 0x65, 0x22, 0x2c, 0x6e, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x47, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4d, 0x28, 0x22, 0x44, 0x69, 0x61, 0x6c, 0x6f, 0x67, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x2c, 0x6e, 0x29, 0x7d, 0x4f, 0x3d, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x3f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x6e, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x31, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x67, 0x65, 0x74, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x28, 0x6e, 0x29, 0x5b, 0x30, 0x5d, 0x7d, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x39, 0x30, 0x30, 0x37, 0x31, 0x39, 0x39, 0x32, 0x35, 0x34, 0x37, 0x34, 0x30, 0x39, 0x39, 0x31, 0x2a, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x28, 0x29, 0x7d, 0x2c, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x3d, 0x7b, 0x7d, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x71, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x21, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x21, 0x28, 0x6e, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x6f, 0x66, 0x20, 0x74, 0x29, 0x29, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x54, 0x79, 0x70, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x43, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x61, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x61, 0x73, 0x20, 0x61, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x7d, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x6e, 0x29, 0x2c, 0x65, 0x3d, 0x65, 0x7c, 0x7c, 0x2d, 0x31, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0x6e, 0x29, 0x2c, 0x2d, 0x31, 0x21, 0x3d, 0x3d, 0x65, 0x26, 0x26, 0x30, 0x3d, 0x3d, 0x3d, 0x28, 0x65, 0x2d, 0x3d, 0x31, 0x29, 0x7d, 0x7d, 0x2c, 0x7a, 0x3d, 0x7b, 0x7d, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x56, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x7a, 0x5b, 0x6e, 0x5d, 0x3d, 0x7a, 0x5b, 0x6e, 0x5d, 0x7c, 0x7c, 0x5b, 0x5d, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x71, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x22, 0x50, 0x75, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x3a, 0x20, 0x22, 0x2b, 0x6e, 0x29, 0x2c, 0x7a, 0x5b, 0x6e, 0x5d, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x72, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4b, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x56, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x51, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x56, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x31, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x58, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x6e, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x3b, 0x69, 0x66, 0x28, 0x7a, 0x5b, 0x74, 0x5d, 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, 0x7a, 0x5b, 0x74, 0x5d, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x29, 0x2c, 0x72, 0x3d, 0x30, 0x3b, 0x72, 0x3c, 0x7a, 0x5b, 0x74, 0x5d, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x72, 0x2b, 0x3d, 0x31, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x69, 0x3d, 0x7a, 0x5b, 0x74, 0x5d, 0x5b, 0x72, 0x5d, 0x2c, 0x6f, 0x3d, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x3b, 0x69, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x28, 0x6f, 0x29, 0x26, 0x26, 0x65, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x72, 0x2c, 0x31, 0x29, 0x7d, 0x7a, 0x5b, 0x74, 0x5d, 0x3d, 0x65, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x59, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3b, 0x74, 0x72, 0x79, 0x7b, 0x74, 0x3d, 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x28, 0x6e, 0x29, 0x7d, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x74, 0x29, 0x7b, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x67, 0x28, 0x22, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x4a, 0x53, 0x4f, 0x4e, 0x20, 0x70, 0x61, 0x73, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x3a, 0x20, 0x22, 0x2b, 0x6e, 0x29, 0x7d, 0x58, 0x28, 0x74, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5a, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x6e, 0x2c, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x5b, 0x5d, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x28, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x29, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x31, 0x29, 0x7d, 0x3b, 0x58, 0x28, 0x74, 0x29, 0x2c, 0x64, 0x28, 0x22, 0x45, 0x6a, 0x22, 0x2b, 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, 0x28, 0x74, 0x29, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x24, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x22, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x22, 0x29, 0x3b, 0x65, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x3d, 0x6e, 0x2c, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x62, 0x6f, 0x64, 0x79, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x28, 0x65, 0x29, 0x2c, 0x74, 0x26, 0x26, 0x5a, 0x28, 0x74, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x74, 0x72, 0x79, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x22, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x22, 0x29, 0x3b, 0x74, 0x2e, 0x73, 0x65, 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x2c, 0x22, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x63, 0x73, 0x73, 0x22, 0x29, 0x2c, 0x74, 0x2e, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x53, 0x68, 0x65, 0x65, 0x74, 0x3f, 0x74, 0x2e, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x53, 0x68, 0x65, 0x65, 0x74, 0x2e, 0x63, 0x73, 0x73, 0x54, 0x65, 0x78, 0x74, 0x3d, 0x6e, 0x3a, 0x74, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x28, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x78, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x28, 0x6e, 0x29, 0x29, 0x2c, 0x28, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x7c, 0x7c, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x42, 0x79, 0x54, 0x61, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x28, 0x22, 0x68, 0x65, 0x61, 0x64, 0x22, 0x29, 0x5b, 0x30, 0x5d, 0x29, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x28, 0x74, 0x29, 0x7d, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x6e, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x6e, 0x29, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6e, 0x28, 0x29, 0x7b, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x57, 0x61, 0x69, 0x6c, 0x73, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x4d, 0x65, 0x6e, 0x75, 0x3d, 0x21, 0x30, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3b, 0x69, 0x66, 0x28, 0x21, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x29, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x57, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x73, 0x65, 0x64, 0x22, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x3d, 0x5b, 0x5d, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x4f, 0x6e, 0x28, 0x22, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x3a, 0x73, 0x79, 0x6e, 0x63, 0x3a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x3a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x62, 0x79, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x3a, 0x22, 0x2b, 0x6e, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x28, 0x6e, 0x29, 0x3b, 0x65, 0x3d, 0x74, 0x2c, 0x72, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x6e, 0x28, 0x65, 0x29, 0x7d, 0x29, 0x29, 0x7d, 0x29, 0x29, 0x2c, 0x74, 0x26, 0x26, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x74, 0x29, 0x2c, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x6d, 0x69, 0x74, 0x28, 0x22, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x3a, 0x73, 0x79, 0x6e, 0x63, 0x3a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x3a, 0x72, 0x65, 0x73, 0x79, 0x6e, 0x63, 0x3a, 0x22, 0x2b, 0x6e, 0x29, 0x2c, 0x7b, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x6e, 0x29, 0x7d, 0x2c, 0x67, 0x65, 0x74, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x7d, 0x2c, 0x73, 0x65, 0x74, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x65, 0x3d, 0x74, 0x2c, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x6d, 0x69, 0x74, 0x28, 0x22, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x3a, 0x73, 0x79, 0x6e, 0x63, 0x3a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x3a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x62, 0x79, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x3a, 0x22, 0x2b, 0x6e, 0x2c, 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, 0x28, 0x65, 0x29, 0x29, 0x2c, 0x72, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x6e, 0x28, 0x65, 0x29, 0x7d, 0x29, 0x29, 0x7d, 0x2c, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x6e, 0x28, 0x65, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x74, 0x29, 0x7d, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x64, 0x28, 0x22, 0x54, 0x49, 0x22, 0x2b, 0x6e, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x28, 0x6f, 0x6e, 0x3d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x7c, 0x7c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x31, 0x3b, 0x74, 0x3c, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x74, 0x2b, 0x2b, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5b, 0x74, 0x5d, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x72, 0x20, 0x69, 0x6e, 0x20, 0x65, 0x29, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x68, 0x61, 0x73, 0x4f, 0x77, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x65, 0x2c, 0x72, 0x29, 0x26, 0x26, 0x28, 0x6e, 0x5b, 0x72, 0x5d, 0x3d, 0x65, 0x5b, 0x72, 0x5d, 0x29, 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x7d, 0x29, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x29, 0x7d, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x3d, 0x7b, 0x7d, 0x2c, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x3d, 0x7b, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x3a, 0x6c, 0x2c, 0x4c, 0x6f, 0x67, 0x3a, 0x72, 0x2c, 0x42, 0x72, 0x6f, 0x77, 0x73, 0x65, 0x72, 0x3a, 0x69, 0x2c, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x3a, 0x6f, 0x2c, 0x54, 0x72, 0x61, 0x79, 0x3a, 0x63, 0x2c, 0x44, 0x69, 0x61, 0x6c, 0x6f, 0x67, 0x3a, 0x61, 0x2c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x3a, 0x7b, 0x4f, 0x6e, 0x3a, 0x4b, 0x2c, 0x4f, 0x6e, 0x63, 0x65, 0x3a, 0x51, 0x2c, 0x4f, 0x6e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x3a, 0x56, 0x2c, 0x45, 0x6d, 0x69, 0x74, 0x3a, 0x5a, 0x7d, 0x2c, 0x5f, 0x3a, 0x7b, 0x43, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x3a, 0x57, 0x2c, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x3a, 0x59, 0x2c, 0x41, 0x64, 0x64, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3a, 0x24, 0x2c, 0x49, 0x6e, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x53, 0x53, 0x3a, 0x6e, 0x6e, 0x2c, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x4d, 0x65, 0x6e, 0x75, 0x3a, 0x74, 0x6e, 0x2c, 0x41, 0x64, 0x64, 0x49, 0x50, 0x43, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x3a, 0x66, 0x2c, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x43, 0x61, 0x6c, 0x6c, 0x3a, 0x4d, 0x2c, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x64, 0x7d, 0x2c, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x3a, 0x75, 0x7d, 0x2c, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x3d, 0x7b, 0x49, 0x73, 0x44, 0x61, 0x72, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x3a, 0x65, 0x6e, 0x28, 0x22, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x3a, 0x69, 0x73, 0x64, 0x61, 0x72, 0x6b, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0x29, 0x2c, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x3a, 0x65, 0x6e, 0x28, 0x22, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x3a, 0x6c, 0x6f, 0x67, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x22, 0x29, 0x2c, 0x41, 0x70, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x3a, 0x65, 0x6e, 0x28, 0x22, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x3a, 0x61, 0x70, 0x70, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x29, 0x7d, 0x2c, 0x6f, 0x6e, 0x28, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2c, 0x6c, 0x29, 0x2c, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x61, 0x64, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x28, 0x22, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x64, 0x6f, 0x77, 0x6e, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x6e, 0x2e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3b, 0x6e, 0x75, 0x6c, 0x6c, 0x21, 0x3d, 0x74, 0x26, 0x26, 0x21, 0x74, 0x2e, 0x68, 0x61, 0x73, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x22, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x2d, 0x6e, 0x6f, 0x2d, 0x64, 0x72, 0x61, 0x67, 0x22, 0x29, 0x3b, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x74, 0x2e, 0x68, 0x61, 0x73, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x22, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x2d, 0x64, 0x72, 0x61, 0x67, 0x22, 0x29, 0x29, 0x7b, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x44, 0x72, 0x61, 0x67, 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x3b, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x7d, 0x74, 0x3d, 0x74, 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x7d, 0x7d, 0x29, 0x29, 0x2c, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x61, 0x64, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x28, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x6d, 0x65, 0x6e, 0x75, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x74, 0x2c, 0x65, 0x3d, 0x6e, 0x2e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3b, 0x6e, 0x75, 0x6c, 0x6c, 0x21, 0x3d, 0x65, 0x26, 0x26, 0x6e, 0x75, 0x6c, 0x6c, 0x3d, 0x3d, 0x28, 0x74, 0x3d, 0x65, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x73, 0x65, 0x74, 0x5b, 0x22, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x6d, 0x65, 0x6e, 0x75, 0x2d, 0x69, 0x64, 0x22, 0x5d, 0x29, 0x3b, 0x29, 0x65, 0x3d, 0x65, 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x3b, 0x69, 0x66, 0x28, 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x21, 0x3d, 0x74, 0x7c, 0x7c, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x57, 0x61, 0x69, 0x6c, 0x73, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x4d, 0x65, 0x6e, 0x75, 0x29, 0x26, 0x26, 0x6e, 0x2e, 0x70, 0x72, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x28, 0x29, 0x2c, 0x6e, 0x75, 0x6c, 0x6c, 0x21, 0x3d, 0x74, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x3d, 0x7b, 0x69, 0x64, 0x3a, 0x74, 0x2c, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x65, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x73, 0x65, 0x74, 0x5b, 0x22, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x6d, 0x65, 0x6e, 0x75, 0x2d, 0x64, 0x61, 0x74, 0x61, 0x22, 0x5d, 0x7c, 0x7c, 0x22, 0x22, 0x7d, 0x3b, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x4d, 0x65, 0x6e, 0x75, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x28, 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, 0x28, 0x72, 0x29, 0x29, 0x7d, 0x7d, 0x29, 0x29, 0x2c, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x26, 0x26, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x74, 0x72, 0x79, 0x7b, 0x6e, 0x3d, 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x28, 0x6e, 0x29, 0x7d, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x6e, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x6e, 0x29, 0x7d, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x3d, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x7c, 0x7c, 0x7b, 0x7d, 0x2c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x28, 0x6e, 0x29, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x5b, 0x74, 0x5d, 0x3d, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x5b, 0x74, 0x5d, 0x7c, 0x7c, 0x7b, 0x7d, 0x2c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x28, 0x6e, 0x5b, 0x74, 0x5d, 0x29, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x65, 0x29, 0x7b, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x5b, 0x74, 0x5d, 0x5b, 0x65, 0x5d, 0x3d, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x5b, 0x74, 0x5d, 0x5b, 0x65, 0x5d, 0x7c, 0x7c, 0x7b, 0x7d, 0x2c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x28, 0x6e, 0x5b, 0x74, 0x5d, 0x5b, 0x65, 0x5d, 0x29, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x5b, 0x74, 0x5d, 0x5b, 0x65, 0x5d, 0x5b, 0x6e, 0x5d, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x3d, 0x30, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x28, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x69, 0x3d, 0x5b, 0x5d, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x43, 0x28, 0x5b, 0x74, 0x2c, 0x65, 0x2c, 0x6e, 0x5d, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x22, 0x2e, 0x22, 0x29, 0x2c, 0x69, 0x2c, 0x72, 0x29, 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x2e, 0x73, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x3d, 0x6e, 0x7d, 0x2c, 0x69, 0x2e, 0x67, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x7d, 0x2c, 0x69, 0x7d, 0x28, 0x29, 0x7d, 0x29, 0x29, 0x7d, 0x29, 0x29, 0x7d, 0x29, 0x29, 0x7d, 0x28, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x2c, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x6d, 0x69, 0x74, 0x28, 0x22, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x3a, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x22, 0x29, 0x7d, 0x5d, 0x29, 0x3b, 0x00}; \ No newline at end of file diff --git a/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/runtime_linux.c b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/runtime_linux.c new file mode 100644 index 0000000..a8eb668 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/runtime_linux.c @@ -0,0 +1,5 @@ + +// runtime.c (c) 2019-Present Lea Anthony. +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file was auto-generated. DO NOT MODIFY. +const unsigned char runtime[]={0x76, 0x61, 0x72, 0x20, 0x57, 0x61, 0x69, 0x6c, 0x73, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x7b, 0x7d, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x28, 0x72, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x74, 0x5b, 0x72, 0x5d, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x5b, 0x72, 0x5d, 0x2e, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x69, 0x3d, 0x74, 0x5b, 0x72, 0x5d, 0x3d, 0x7b, 0x69, 0x3a, 0x72, 0x2c, 0x6c, 0x3a, 0x21, 0x31, 0x2c, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x3a, 0x7b, 0x7d, 0x7d, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x5b, 0x72, 0x5d, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x69, 0x2e, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x2c, 0x69, 0x2c, 0x69, 0x2e, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x2c, 0x65, 0x29, 0x2c, 0x69, 0x2e, 0x6c, 0x3d, 0x21, 0x30, 0x2c, 0x69, 0x2e, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x2e, 0x6d, 0x3d, 0x6e, 0x2c, 0x65, 0x2e, 0x63, 0x3d, 0x74, 0x2c, 0x65, 0x2e, 0x64, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x72, 0x29, 0x7b, 0x65, 0x2e, 0x6f, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7c, 0x7c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x7b, 0x65, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x3a, 0x21, 0x30, 0x2c, 0x67, 0x65, 0x74, 0x3a, 0x72, 0x7d, 0x29, 0x7d, 0x2c, 0x65, 0x2e, 0x72, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x22, 0x75, 0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x22, 0x21, 0x3d, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x26, 0x26, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x2e, 0x74, 0x6f, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x26, 0x26, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x6e, 0x2c, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x2e, 0x74, 0x6f, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x2c, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x22, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x7d, 0x29, 0x2c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x6e, 0x2c, 0x22, 0x5f, 0x5f, 0x65, 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x2c, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x21, 0x30, 0x7d, 0x29, 0x7d, 0x2c, 0x65, 0x2e, 0x74, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x31, 0x26, 0x74, 0x26, 0x26, 0x28, 0x6e, 0x3d, 0x65, 0x28, 0x6e, 0x29, 0x29, 0x2c, 0x38, 0x26, 0x74, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x3b, 0x69, 0x66, 0x28, 0x34, 0x26, 0x74, 0x26, 0x26, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x3d, 0x3d, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x6e, 0x26, 0x26, 0x6e, 0x26, 0x26, 0x6e, 0x2e, 0x5f, 0x5f, 0x65, 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x3d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x65, 0x2e, 0x72, 0x28, 0x72, 0x29, 0x2c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x72, 0x2c, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x2c, 0x7b, 0x65, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x3a, 0x21, 0x30, 0x2c, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x6e, 0x7d, 0x29, 0x2c, 0x32, 0x26, 0x74, 0x26, 0x26, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x21, 0x3d, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x6e, 0x29, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x69, 0x20, 0x69, 0x6e, 0x20, 0x6e, 0x29, 0x65, 0x2e, 0x64, 0x28, 0x72, 0x2c, 0x69, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x5b, 0x74, 0x5d, 0x7d, 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0x69, 0x29, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x7d, 0x2c, 0x65, 0x2e, 0x6e, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x6e, 0x26, 0x26, 0x6e, 0x2e, 0x5f, 0x5f, 0x65, 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x3f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x7d, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x7d, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x2e, 0x64, 0x28, 0x74, 0x2c, 0x22, 0x61, 0x22, 0x2c, 0x74, 0x29, 0x2c, 0x74, 0x7d, 0x2c, 0x65, 0x2e, 0x6f, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x68, 0x61, 0x73, 0x4f, 0x77, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7d, 0x2c, 0x65, 0x2e, 0x70, 0x3d, 0x22, 0x22, 0x2c, 0x65, 0x28, 0x65, 0x2e, 0x73, 0x3d, 0x30, 0x29, 0x7d, 0x28, 0x5b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x22, 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x22, 0x3b, 0x65, 0x2e, 0x72, 0x28, 0x74, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x3d, 0x7b, 0x7d, 0x3b, 0x65, 0x2e, 0x72, 0x28, 0x72, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x72, 0x2c, 0x22, 0x54, 0x72, 0x61, 0x63, 0x65, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x72, 0x2c, 0x22, 0x50, 0x72, 0x69, 0x6e, 0x74, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x72, 0x2c, 0x22, 0x44, 0x65, 0x62, 0x75, 0x67, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x79, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x72, 0x2c, 0x22, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x72, 0x2c, 0x22, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x72, 0x2c, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x67, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x72, 0x2c, 0x22, 0x46, 0x61, 0x74, 0x61, 0x6c, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x68, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x72, 0x2c, 0x22, 0x53, 0x65, 0x74, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x53, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x72, 0x2c, 0x22, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x45, 0x7d, 0x29, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x69, 0x3d, 0x7b, 0x7d, 0x3b, 0x65, 0x2e, 0x72, 0x28, 0x69, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x69, 0x2c, 0x22, 0x4f, 0x70, 0x65, 0x6e, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4d, 0x7d, 0x29, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x6f, 0x3d, 0x7b, 0x7d, 0x3b, 0x65, 0x2e, 0x72, 0x28, 0x6f, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x6f, 0x2c, 0x22, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4e, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x6f, 0x2c, 0x22, 0x53, 0x65, 0x74, 0x54, 0x69, 0x74, 0x6c, 0x65, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x54, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x6f, 0x2c, 0x22, 0x46, 0x75, 0x6c, 0x6c, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6a, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x6f, 0x2c, 0x22, 0x55, 0x6e, 0x46, 0x75, 0x6c, 0x6c, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x44, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x6f, 0x2c, 0x22, 0x53, 0x65, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x49, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x6f, 0x2c, 0x22, 0x53, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x50, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x6f, 0x2c, 0x22, 0x48, 0x69, 0x64, 0x65, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x41, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x6f, 0x2c, 0x22, 0x53, 0x68, 0x6f, 0x77, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4a, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x6f, 0x2c, 0x22, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x69, 0x73, 0x65, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4c, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x6f, 0x2c, 0x22, 0x55, 0x6e, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x69, 0x73, 0x65, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x52, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x6f, 0x2c, 0x22, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x69, 0x73, 0x65, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x6f, 0x2c, 0x22, 0x55, 0x6e, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x69, 0x73, 0x65, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x46, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x6f, 0x2c, 0x22, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x55, 0x7d, 0x29, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x61, 0x3d, 0x7b, 0x7d, 0x3b, 0x65, 0x2e, 0x72, 0x28, 0x61, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x61, 0x2c, 0x22, 0x4f, 0x70, 0x65, 0x6e, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x42, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x61, 0x2c, 0x22, 0x53, 0x61, 0x76, 0x65, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x48, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x61, 0x2c, 0x22, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x47, 0x7d, 0x29, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x75, 0x3d, 0x7b, 0x7d, 0x3b, 0x65, 0x2e, 0x72, 0x28, 0x75, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x75, 0x2c, 0x22, 0x4e, 0x65, 0x77, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x6e, 0x7d, 0x29, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x63, 0x3d, 0x7b, 0x7d, 0x3b, 0x65, 0x2e, 0x72, 0x28, 0x63, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x63, 0x2c, 0x22, 0x53, 0x65, 0x74, 0x49, 0x63, 0x6f, 0x6e, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x6e, 0x7d, 0x29, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x6c, 0x3d, 0x7b, 0x41, 0x70, 0x70, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x64, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x22, 0x2c, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x22, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x22, 0x7d, 0x7d, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x73, 0x3d, 0x5b, 0x5d, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x28, 0x6e, 0x29, 0x7b, 0x73, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x6e, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x28, 0x6e, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x28, 0x6e, 0x29, 0x7d, 0x28, 0x6e, 0x29, 0x2c, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3e, 0x30, 0x29, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x30, 0x3b, 0x74, 0x3c, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x74, 0x2b, 0x2b, 0x29, 0x73, 0x5b, 0x74, 0x5d, 0x28, 0x6e, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x64, 0x28, 0x22, 0x4c, 0x22, 0x2b, 0x6e, 0x2b, 0x74, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x76, 0x28, 0x6e, 0x29, 0x7b, 0x77, 0x28, 0x22, 0x54, 0x22, 0x2c, 0x6e, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x28, 0x6e, 0x29, 0x7b, 0x77, 0x28, 0x22, 0x50, 0x22, 0x2c, 0x6e, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x79, 0x28, 0x6e, 0x29, 0x7b, 0x77, 0x28, 0x22, 0x44, 0x22, 0x2c, 0x6e, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x28, 0x6e, 0x29, 0x7b, 0x77, 0x28, 0x22, 0x49, 0x22, 0x2c, 0x6e, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x28, 0x6e, 0x29, 0x7b, 0x77, 0x28, 0x22, 0x57, 0x22, 0x2c, 0x6e, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x28, 0x6e, 0x29, 0x7b, 0x77, 0x28, 0x22, 0x45, 0x22, 0x2c, 0x6e, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x28, 0x6e, 0x29, 0x7b, 0x77, 0x28, 0x22, 0x46, 0x22, 0x2c, 0x6e, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x53, 0x28, 0x6e, 0x29, 0x7b, 0x77, 0x28, 0x22, 0x53, 0x22, 0x2c, 0x6e, 0x29, 0x7d, 0x76, 0x61, 0x72, 0x20, 0x4f, 0x2c, 0x45, 0x3d, 0x7b, 0x54, 0x52, 0x41, 0x43, 0x45, 0x3a, 0x31, 0x2c, 0x44, 0x45, 0x42, 0x55, 0x47, 0x3a, 0x32, 0x2c, 0x49, 0x4e, 0x46, 0x4f, 0x3a, 0x33, 0x2c, 0x57, 0x41, 0x52, 0x4e, 0x49, 0x4e, 0x47, 0x3a, 0x34, 0x2c, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x3a, 0x35, 0x7d, 0x2c, 0x6b, 0x3d, 0x7b, 0x7d, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x43, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x21, 0x3d, 0x65, 0x26, 0x26, 0x6e, 0x75, 0x6c, 0x6c, 0x21, 0x3d, 0x65, 0x7c, 0x7c, 0x28, 0x65, 0x3d, 0x30, 0x29, 0x2c, 0x6e, 0x65, 0x77, 0x20, 0x50, 0x72, 0x6f, 0x6d, 0x69, 0x73, 0x65, 0x28, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x72, 0x2c, 0x69, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x6f, 0x3b, 0x64, 0x6f, 0x7b, 0x6f, 0x3d, 0x6e, 0x2b, 0x22, 0x2d, 0x22, 0x2b, 0x4f, 0x28, 0x29, 0x7d, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x28, 0x6b, 0x5b, 0x6f, 0x5d, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x65, 0x3e, 0x30, 0x29, 0x76, 0x61, 0x72, 0x20, 0x61, 0x3d, 0x73, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x69, 0x28, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x43, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x22, 0x2b, 0x6e, 0x2b, 0x22, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x64, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x20, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x49, 0x44, 0x3a, 0x20, 0x22, 0x2b, 0x6f, 0x29, 0x29, 0x7d, 0x29, 0x2c, 0x65, 0x29, 0x3b, 0x6b, 0x5b, 0x6f, 0x5d, 0x3d, 0x7b, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x3a, 0x61, 0x2c, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x3a, 0x69, 0x2c, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x3a, 0x72, 0x7d, 0x3b, 0x74, 0x72, 0x79, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x75, 0x3d, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x6e, 0x2c, 0x61, 0x72, 0x67, 0x73, 0x3a, 0x74, 0x2c, 0x63, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x49, 0x44, 0x3a, 0x6f, 0x7d, 0x3b, 0x64, 0x28, 0x22, 0x43, 0x22, 0x2b, 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, 0x28, 0x75, 0x29, 0x29, 0x7d, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x6e, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x6e, 0x29, 0x7d, 0x7d, 0x29, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x57, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3b, 0x74, 0x72, 0x79, 0x7b, 0x74, 0x3d, 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x28, 0x6e, 0x29, 0x7d, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x74, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x4a, 0x53, 0x4f, 0x4e, 0x20, 0x70, 0x61, 0x73, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x3a, 0x20, 0x22, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x74, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2c, 0x22, 0x2e, 0x20, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x20, 0x22, 0x29, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x6e, 0x29, 0x3b, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x79, 0x28, 0x65, 0x29, 0x2c, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x65, 0x29, 0x7d, 0x76, 0x61, 0x72, 0x20, 0x72, 0x3d, 0x74, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x69, 0x64, 0x2c, 0x69, 0x3d, 0x6b, 0x5b, 0x72, 0x5d, 0x3b, 0x69, 0x66, 0x28, 0x21, 0x69, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x6f, 0x3d, 0x22, 0x43, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x20, 0x27, 0x22, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x72, 0x2c, 0x22, 0x27, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x21, 0x21, 0x21, 0x22, 0x29, 0x3b, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x6f, 0x29, 0x2c, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x6f, 0x29, 0x7d, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, 0x69, 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x29, 0x2c, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6b, 0x5b, 0x72, 0x5d, 0x2c, 0x74, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3f, 0x69, 0x2e, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x28, 0x74, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x3a, 0x69, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x28, 0x74, 0x2e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x78, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x5b, 0x5d, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x28, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x29, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x31, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x43, 0x28, 0x22, 0x2e, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x22, 0x2b, 0x6e, 0x2c, 0x74, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4d, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x28, 0x22, 0x52, 0x42, 0x4f, 0x22, 0x2b, 0x6e, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4e, 0x28, 0x29, 0x7b, 0x64, 0x28, 0x22, 0x57, 0x63, 0x22, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x54, 0x28, 0x6e, 0x29, 0x7b, 0x64, 0x28, 0x22, 0x57, 0x54, 0x22, 0x2b, 0x6e, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6a, 0x28, 0x29, 0x7b, 0x64, 0x28, 0x22, 0x57, 0x46, 0x22, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x44, 0x28, 0x29, 0x7b, 0x64, 0x28, 0x22, 0x57, 0x66, 0x22, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x64, 0x28, 0x22, 0x57, 0x73, 0x3a, 0x22, 0x2b, 0x6e, 0x2b, 0x22, 0x3a, 0x22, 0x2b, 0x74, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x50, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x64, 0x28, 0x22, 0x57, 0x70, 0x3a, 0x22, 0x2b, 0x6e, 0x2b, 0x22, 0x3a, 0x22, 0x2b, 0x74, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x28, 0x29, 0x7b, 0x64, 0x28, 0x22, 0x57, 0x48, 0x22, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4a, 0x28, 0x29, 0x7b, 0x64, 0x28, 0x22, 0x57, 0x53, 0x22, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4c, 0x28, 0x29, 0x7b, 0x64, 0x28, 0x22, 0x57, 0x4d, 0x22, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x52, 0x28, 0x29, 0x7b, 0x64, 0x28, 0x22, 0x57, 0x55, 0x22, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x28, 0x29, 0x7b, 0x64, 0x28, 0x22, 0x57, 0x6d, 0x22, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x46, 0x28, 0x29, 0x7b, 0x64, 0x28, 0x22, 0x57, 0x75, 0x22, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x55, 0x28, 0x29, 0x7b, 0x64, 0x28, 0x22, 0x57, 0x43, 0x22, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x42, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x78, 0x28, 0x22, 0x44, 0x69, 0x61, 0x6c, 0x6f, 0x67, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x22, 0x2c, 0x6e, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x48, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x78, 0x28, 0x22, 0x44, 0x69, 0x61, 0x6c, 0x6f, 0x67, 0x2e, 0x53, 0x61, 0x76, 0x65, 0x22, 0x2c, 0x6e, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x47, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x78, 0x28, 0x22, 0x44, 0x69, 0x61, 0x6c, 0x6f, 0x67, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x2c, 0x6e, 0x29, 0x7d, 0x4f, 0x3d, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x3f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x6e, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x31, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x67, 0x65, 0x74, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x28, 0x6e, 0x29, 0x5b, 0x30, 0x5d, 0x7d, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x39, 0x30, 0x30, 0x37, 0x31, 0x39, 0x39, 0x32, 0x35, 0x34, 0x37, 0x34, 0x30, 0x39, 0x39, 0x31, 0x2a, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x28, 0x29, 0x7d, 0x2c, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x3d, 0x7b, 0x7d, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x71, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x21, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x21, 0x28, 0x6e, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x6f, 0x66, 0x20, 0x74, 0x29, 0x29, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x54, 0x79, 0x70, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x43, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x61, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x61, 0x73, 0x20, 0x61, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x7d, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x6e, 0x29, 0x2c, 0x65, 0x3d, 0x65, 0x7c, 0x7c, 0x2d, 0x31, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0x6e, 0x29, 0x2c, 0x2d, 0x31, 0x21, 0x3d, 0x3d, 0x65, 0x26, 0x26, 0x30, 0x3d, 0x3d, 0x3d, 0x28, 0x65, 0x2d, 0x3d, 0x31, 0x29, 0x7d, 0x7d, 0x2c, 0x7a, 0x3d, 0x7b, 0x7d, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x56, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x7a, 0x5b, 0x6e, 0x5d, 0x3d, 0x7a, 0x5b, 0x6e, 0x5d, 0x7c, 0x7c, 0x5b, 0x5d, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x71, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x22, 0x50, 0x75, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x3a, 0x20, 0x22, 0x2b, 0x6e, 0x29, 0x2c, 0x7a, 0x5b, 0x6e, 0x5d, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x72, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4b, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x56, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x51, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x56, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x31, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x58, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x6e, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x3b, 0x69, 0x66, 0x28, 0x7a, 0x5b, 0x74, 0x5d, 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, 0x7a, 0x5b, 0x74, 0x5d, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x29, 0x2c, 0x72, 0x3d, 0x30, 0x3b, 0x72, 0x3c, 0x7a, 0x5b, 0x74, 0x5d, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x72, 0x2b, 0x3d, 0x31, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x69, 0x3d, 0x7a, 0x5b, 0x74, 0x5d, 0x5b, 0x72, 0x5d, 0x2c, 0x6f, 0x3d, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x3b, 0x69, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x28, 0x6f, 0x29, 0x26, 0x26, 0x65, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x72, 0x2c, 0x31, 0x29, 0x7d, 0x7a, 0x5b, 0x74, 0x5d, 0x3d, 0x65, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x59, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3b, 0x74, 0x72, 0x79, 0x7b, 0x74, 0x3d, 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x28, 0x6e, 0x29, 0x7d, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x74, 0x29, 0x7b, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x67, 0x28, 0x22, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x4a, 0x53, 0x4f, 0x4e, 0x20, 0x70, 0x61, 0x73, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x3a, 0x20, 0x22, 0x2b, 0x6e, 0x29, 0x7d, 0x58, 0x28, 0x74, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5a, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x6e, 0x2c, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x5b, 0x5d, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x28, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x29, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x31, 0x29, 0x7d, 0x3b, 0x58, 0x28, 0x74, 0x29, 0x2c, 0x64, 0x28, 0x22, 0x45, 0x6a, 0x22, 0x2b, 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, 0x28, 0x74, 0x29, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x24, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x22, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x22, 0x29, 0x3b, 0x65, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x3d, 0x6e, 0x2c, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x62, 0x6f, 0x64, 0x79, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x28, 0x65, 0x29, 0x2c, 0x74, 0x26, 0x26, 0x5a, 0x28, 0x74, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x74, 0x72, 0x79, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x22, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x22, 0x29, 0x3b, 0x74, 0x2e, 0x73, 0x65, 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x2c, 0x22, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x63, 0x73, 0x73, 0x22, 0x29, 0x2c, 0x74, 0x2e, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x53, 0x68, 0x65, 0x65, 0x74, 0x3f, 0x74, 0x2e, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x53, 0x68, 0x65, 0x65, 0x74, 0x2e, 0x63, 0x73, 0x73, 0x54, 0x65, 0x78, 0x74, 0x3d, 0x6e, 0x3a, 0x74, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x28, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x78, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x28, 0x6e, 0x29, 0x29, 0x2c, 0x28, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x7c, 0x7c, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x42, 0x79, 0x54, 0x61, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x28, 0x22, 0x68, 0x65, 0x61, 0x64, 0x22, 0x29, 0x5b, 0x30, 0x5d, 0x29, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x28, 0x74, 0x29, 0x7d, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x6e, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x6e, 0x29, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6e, 0x28, 0x29, 0x7b, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x57, 0x61, 0x69, 0x6c, 0x73, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x4d, 0x65, 0x6e, 0x75, 0x3d, 0x21, 0x30, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3b, 0x69, 0x66, 0x28, 0x21, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x29, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x57, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x73, 0x65, 0x64, 0x22, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x3d, 0x5b, 0x5d, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x4f, 0x6e, 0x28, 0x22, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x3a, 0x73, 0x79, 0x6e, 0x63, 0x3a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x3a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x62, 0x79, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x3a, 0x22, 0x2b, 0x6e, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x28, 0x6e, 0x29, 0x3b, 0x65, 0x3d, 0x74, 0x2c, 0x72, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x6e, 0x28, 0x65, 0x29, 0x7d, 0x29, 0x29, 0x7d, 0x29, 0x29, 0x2c, 0x74, 0x26, 0x26, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x74, 0x29, 0x2c, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x6d, 0x69, 0x74, 0x28, 0x22, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x3a, 0x73, 0x79, 0x6e, 0x63, 0x3a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x3a, 0x72, 0x65, 0x73, 0x79, 0x6e, 0x63, 0x3a, 0x22, 0x2b, 0x6e, 0x29, 0x2c, 0x7b, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x6e, 0x29, 0x7d, 0x2c, 0x67, 0x65, 0x74, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x7d, 0x2c, 0x73, 0x65, 0x74, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x65, 0x3d, 0x74, 0x2c, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x6d, 0x69, 0x74, 0x28, 0x22, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x3a, 0x73, 0x79, 0x6e, 0x63, 0x3a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x3a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x62, 0x79, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x3a, 0x22, 0x2b, 0x6e, 0x2c, 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, 0x28, 0x65, 0x29, 0x29, 0x2c, 0x72, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x6e, 0x28, 0x65, 0x29, 0x7d, 0x29, 0x29, 0x7d, 0x2c, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x6e, 0x28, 0x65, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x74, 0x29, 0x7d, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x64, 0x28, 0x22, 0x54, 0x49, 0x22, 0x2b, 0x6e, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x28, 0x6f, 0x6e, 0x3d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x7c, 0x7c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x31, 0x3b, 0x74, 0x3c, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x74, 0x2b, 0x2b, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5b, 0x74, 0x5d, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x72, 0x20, 0x69, 0x6e, 0x20, 0x65, 0x29, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x68, 0x61, 0x73, 0x4f, 0x77, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x65, 0x2c, 0x72, 0x29, 0x26, 0x26, 0x28, 0x6e, 0x5b, 0x72, 0x5d, 0x3d, 0x65, 0x5b, 0x72, 0x5d, 0x29, 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x7d, 0x29, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x29, 0x7d, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x3d, 0x7b, 0x7d, 0x2c, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x3d, 0x7b, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x3a, 0x6c, 0x2c, 0x4c, 0x6f, 0x67, 0x3a, 0x72, 0x2c, 0x42, 0x72, 0x6f, 0x77, 0x73, 0x65, 0x72, 0x3a, 0x69, 0x2c, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x3a, 0x6f, 0x2c, 0x54, 0x72, 0x61, 0x79, 0x3a, 0x63, 0x2c, 0x44, 0x69, 0x61, 0x6c, 0x6f, 0x67, 0x3a, 0x61, 0x2c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x3a, 0x7b, 0x4f, 0x6e, 0x3a, 0x4b, 0x2c, 0x4f, 0x6e, 0x63, 0x65, 0x3a, 0x51, 0x2c, 0x4f, 0x6e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x3a, 0x56, 0x2c, 0x45, 0x6d, 0x69, 0x74, 0x3a, 0x5a, 0x7d, 0x2c, 0x5f, 0x3a, 0x7b, 0x43, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x3a, 0x57, 0x2c, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x3a, 0x59, 0x2c, 0x41, 0x64, 0x64, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3a, 0x24, 0x2c, 0x49, 0x6e, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x53, 0x53, 0x3a, 0x6e, 0x6e, 0x2c, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x4d, 0x65, 0x6e, 0x75, 0x3a, 0x74, 0x6e, 0x2c, 0x41, 0x64, 0x64, 0x49, 0x50, 0x43, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x3a, 0x66, 0x2c, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x43, 0x61, 0x6c, 0x6c, 0x3a, 0x78, 0x2c, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x64, 0x7d, 0x2c, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x3a, 0x75, 0x7d, 0x2c, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x3d, 0x7b, 0x49, 0x73, 0x44, 0x61, 0x72, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x3a, 0x65, 0x6e, 0x28, 0x22, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x3a, 0x69, 0x73, 0x64, 0x61, 0x72, 0x6b, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0x29, 0x2c, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x3a, 0x65, 0x6e, 0x28, 0x22, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x3a, 0x6c, 0x6f, 0x67, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x22, 0x29, 0x2c, 0x41, 0x70, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x3a, 0x65, 0x6e, 0x28, 0x22, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x3a, 0x61, 0x70, 0x70, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x29, 0x7d, 0x2c, 0x6f, 0x6e, 0x28, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2c, 0x6c, 0x29, 0x2c, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x61, 0x64, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x28, 0x22, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x64, 0x6f, 0x77, 0x6e, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x6e, 0x2e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3b, 0x6e, 0x75, 0x6c, 0x6c, 0x21, 0x3d, 0x74, 0x26, 0x26, 0x21, 0x74, 0x2e, 0x68, 0x61, 0x73, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x22, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x2d, 0x6e, 0x6f, 0x2d, 0x64, 0x72, 0x61, 0x67, 0x22, 0x29, 0x3b, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x74, 0x2e, 0x68, 0x61, 0x73, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x22, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x2d, 0x64, 0x72, 0x61, 0x67, 0x22, 0x29, 0x29, 0x7b, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x44, 0x72, 0x61, 0x67, 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x3b, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x7d, 0x74, 0x3d, 0x74, 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x7d, 0x7d, 0x29, 0x29, 0x2c, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x61, 0x64, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x28, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x6d, 0x65, 0x6e, 0x75, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x74, 0x2c, 0x65, 0x3d, 0x6e, 0x2e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3b, 0x6e, 0x75, 0x6c, 0x6c, 0x21, 0x3d, 0x65, 0x26, 0x26, 0x6e, 0x75, 0x6c, 0x6c, 0x3d, 0x3d, 0x28, 0x74, 0x3d, 0x65, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x73, 0x65, 0x74, 0x5b, 0x22, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x6d, 0x65, 0x6e, 0x75, 0x2d, 0x69, 0x64, 0x22, 0x5d, 0x29, 0x3b, 0x29, 0x65, 0x3d, 0x65, 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x3b, 0x69, 0x66, 0x28, 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x21, 0x3d, 0x74, 0x7c, 0x7c, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x57, 0x61, 0x69, 0x6c, 0x73, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x4d, 0x65, 0x6e, 0x75, 0x29, 0x26, 0x26, 0x6e, 0x2e, 0x70, 0x72, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x28, 0x29, 0x2c, 0x6e, 0x75, 0x6c, 0x6c, 0x21, 0x3d, 0x74, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x3d, 0x7b, 0x69, 0x64, 0x3a, 0x74, 0x2c, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x65, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x73, 0x65, 0x74, 0x5b, 0x22, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x6d, 0x65, 0x6e, 0x75, 0x2d, 0x64, 0x61, 0x74, 0x61, 0x22, 0x5d, 0x7c, 0x7c, 0x22, 0x22, 0x7d, 0x3b, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x4d, 0x65, 0x6e, 0x75, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x28, 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, 0x28, 0x72, 0x29, 0x29, 0x7d, 0x7d, 0x29, 0x29, 0x2c, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x26, 0x26, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x74, 0x72, 0x79, 0x7b, 0x6e, 0x3d, 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x28, 0x6e, 0x29, 0x7d, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x6e, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x6e, 0x29, 0x7d, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x3d, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x7c, 0x7c, 0x7b, 0x7d, 0x2c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x28, 0x6e, 0x29, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x5b, 0x74, 0x5d, 0x3d, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x5b, 0x74, 0x5d, 0x7c, 0x7c, 0x7b, 0x7d, 0x2c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x28, 0x6e, 0x5b, 0x74, 0x5d, 0x29, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x65, 0x29, 0x7b, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x5b, 0x74, 0x5d, 0x5b, 0x65, 0x5d, 0x3d, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x5b, 0x74, 0x5d, 0x5b, 0x65, 0x5d, 0x7c, 0x7c, 0x7b, 0x7d, 0x2c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x28, 0x6e, 0x5b, 0x74, 0x5d, 0x5b, 0x65, 0x5d, 0x29, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x5b, 0x74, 0x5d, 0x5b, 0x65, 0x5d, 0x5b, 0x6e, 0x5d, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x3d, 0x30, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x28, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x69, 0x3d, 0x5b, 0x5d, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x43, 0x28, 0x5b, 0x74, 0x2c, 0x65, 0x2c, 0x6e, 0x5d, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x22, 0x2e, 0x22, 0x29, 0x2c, 0x69, 0x2c, 0x72, 0x29, 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x2e, 0x73, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x3d, 0x6e, 0x7d, 0x2c, 0x69, 0x2e, 0x67, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x7d, 0x2c, 0x69, 0x7d, 0x28, 0x29, 0x7d, 0x29, 0x29, 0x7d, 0x29, 0x29, 0x7d, 0x29, 0x29, 0x7d, 0x28, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x2c, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x6d, 0x69, 0x74, 0x28, 0x22, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x3a, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x22, 0x29, 0x7d, 0x5d, 0x29, 0x3b, 0x00}; \ No newline at end of file diff --git a/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/runtime_windows.c b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/runtime_windows.c new file mode 100644 index 0000000..e9a3ff7 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/runtime_windows.c @@ -0,0 +1,5 @@ + +// runtime.c (c) 2019-Present Lea Anthony. +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file was auto-generated. DO NOT MODIFY. +const unsigned char runtime[]={0x76, 0x61, 0x72, 0x20, 0x57, 0x61, 0x69, 0x6c, 0x73, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x7b, 0x7d, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x28, 0x72, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x74, 0x5b, 0x72, 0x5d, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x5b, 0x72, 0x5d, 0x2e, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x69, 0x3d, 0x74, 0x5b, 0x72, 0x5d, 0x3d, 0x7b, 0x69, 0x3a, 0x72, 0x2c, 0x6c, 0x3a, 0x21, 0x31, 0x2c, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x3a, 0x7b, 0x7d, 0x7d, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x5b, 0x72, 0x5d, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x69, 0x2e, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x2c, 0x69, 0x2c, 0x69, 0x2e, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x2c, 0x65, 0x29, 0x2c, 0x69, 0x2e, 0x6c, 0x3d, 0x21, 0x30, 0x2c, 0x69, 0x2e, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x2e, 0x6d, 0x3d, 0x6e, 0x2c, 0x65, 0x2e, 0x63, 0x3d, 0x74, 0x2c, 0x65, 0x2e, 0x64, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x72, 0x29, 0x7b, 0x65, 0x2e, 0x6f, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7c, 0x7c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x7b, 0x65, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x3a, 0x21, 0x30, 0x2c, 0x67, 0x65, 0x74, 0x3a, 0x72, 0x7d, 0x29, 0x7d, 0x2c, 0x65, 0x2e, 0x72, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x22, 0x75, 0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x22, 0x21, 0x3d, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x26, 0x26, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x2e, 0x74, 0x6f, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x26, 0x26, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x6e, 0x2c, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x2e, 0x74, 0x6f, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x2c, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x22, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x7d, 0x29, 0x2c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x6e, 0x2c, 0x22, 0x5f, 0x5f, 0x65, 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x2c, 0x7b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x21, 0x30, 0x7d, 0x29, 0x7d, 0x2c, 0x65, 0x2e, 0x74, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x31, 0x26, 0x74, 0x26, 0x26, 0x28, 0x6e, 0x3d, 0x65, 0x28, 0x6e, 0x29, 0x29, 0x2c, 0x38, 0x26, 0x74, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x3b, 0x69, 0x66, 0x28, 0x34, 0x26, 0x74, 0x26, 0x26, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x3d, 0x3d, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x6e, 0x26, 0x26, 0x6e, 0x26, 0x26, 0x6e, 0x2e, 0x5f, 0x5f, 0x65, 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x29, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x3d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x65, 0x2e, 0x72, 0x28, 0x72, 0x29, 0x2c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x72, 0x2c, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x2c, 0x7b, 0x65, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x3a, 0x21, 0x30, 0x2c, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x6e, 0x7d, 0x29, 0x2c, 0x32, 0x26, 0x74, 0x26, 0x26, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x21, 0x3d, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x6e, 0x29, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x69, 0x20, 0x69, 0x6e, 0x20, 0x6e, 0x29, 0x65, 0x2e, 0x64, 0x28, 0x72, 0x2c, 0x69, 0x2c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x5b, 0x74, 0x5d, 0x7d, 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0x69, 0x29, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x7d, 0x2c, 0x65, 0x2e, 0x6e, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x6e, 0x26, 0x26, 0x6e, 0x2e, 0x5f, 0x5f, 0x65, 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x3f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x7d, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x7d, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x2e, 0x64, 0x28, 0x74, 0x2c, 0x22, 0x61, 0x22, 0x2c, 0x74, 0x29, 0x2c, 0x74, 0x7d, 0x2c, 0x65, 0x2e, 0x6f, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x68, 0x61, 0x73, 0x4f, 0x77, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7d, 0x2c, 0x65, 0x2e, 0x70, 0x3d, 0x22, 0x22, 0x2c, 0x65, 0x28, 0x65, 0x2e, 0x73, 0x3d, 0x30, 0x29, 0x7d, 0x28, 0x5b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x22, 0x75, 0x73, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x22, 0x3b, 0x65, 0x2e, 0x72, 0x28, 0x74, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x3d, 0x7b, 0x7d, 0x3b, 0x65, 0x2e, 0x72, 0x28, 0x72, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x72, 0x2c, 0x22, 0x54, 0x72, 0x61, 0x63, 0x65, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x72, 0x2c, 0x22, 0x50, 0x72, 0x69, 0x6e, 0x74, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x72, 0x2c, 0x22, 0x44, 0x65, 0x62, 0x75, 0x67, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x79, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x72, 0x2c, 0x22, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x72, 0x2c, 0x22, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x72, 0x2c, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x67, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x72, 0x2c, 0x22, 0x46, 0x61, 0x74, 0x61, 0x6c, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x68, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x72, 0x2c, 0x22, 0x53, 0x65, 0x74, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x53, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x72, 0x2c, 0x22, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x45, 0x7d, 0x29, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x69, 0x3d, 0x7b, 0x7d, 0x3b, 0x65, 0x2e, 0x72, 0x28, 0x69, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x69, 0x2c, 0x22, 0x4f, 0x70, 0x65, 0x6e, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x54, 0x7d, 0x29, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x6f, 0x3d, 0x7b, 0x7d, 0x3b, 0x65, 0x2e, 0x72, 0x28, 0x6f, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x6f, 0x2c, 0x22, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6a, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x6f, 0x2c, 0x22, 0x53, 0x65, 0x74, 0x54, 0x69, 0x74, 0x6c, 0x65, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x78, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x6f, 0x2c, 0x22, 0x46, 0x75, 0x6c, 0x6c, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4d, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x6f, 0x2c, 0x22, 0x55, 0x6e, 0x46, 0x75, 0x6c, 0x6c, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x49, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x6f, 0x2c, 0x22, 0x53, 0x65, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x44, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x6f, 0x2c, 0x22, 0x53, 0x65, 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x50, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x6f, 0x2c, 0x22, 0x48, 0x69, 0x64, 0x65, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x41, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x6f, 0x2c, 0x22, 0x53, 0x68, 0x6f, 0x77, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4a, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x6f, 0x2c, 0x22, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x69, 0x73, 0x65, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4c, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x6f, 0x2c, 0x22, 0x55, 0x6e, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x69, 0x73, 0x65, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x52, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x6f, 0x2c, 0x22, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x69, 0x73, 0x65, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x6f, 0x2c, 0x22, 0x55, 0x6e, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x69, 0x73, 0x65, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x46, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x6f, 0x2c, 0x22, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x55, 0x7d, 0x29, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x61, 0x3d, 0x7b, 0x7d, 0x3b, 0x65, 0x2e, 0x72, 0x28, 0x61, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x61, 0x2c, 0x22, 0x4f, 0x70, 0x65, 0x6e, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x42, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x61, 0x2c, 0x22, 0x53, 0x61, 0x76, 0x65, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x48, 0x7d, 0x29, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x61, 0x2c, 0x22, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x47, 0x7d, 0x29, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x75, 0x3d, 0x7b, 0x7d, 0x3b, 0x65, 0x2e, 0x72, 0x28, 0x75, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x75, 0x2c, 0x22, 0x4e, 0x65, 0x77, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x6e, 0x7d, 0x29, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x63, 0x3d, 0x7b, 0x7d, 0x3b, 0x65, 0x2e, 0x72, 0x28, 0x63, 0x29, 0x2c, 0x65, 0x2e, 0x64, 0x28, 0x63, 0x2c, 0x22, 0x53, 0x65, 0x74, 0x49, 0x63, 0x6f, 0x6e, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x6e, 0x7d, 0x29, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x6c, 0x3d, 0x7b, 0x41, 0x70, 0x70, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x22, 0x64, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x22, 0x2c, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x22, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x22, 0x7d, 0x7d, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x73, 0x3d, 0x5b, 0x5d, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x28, 0x6e, 0x29, 0x7b, 0x73, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x6e, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x28, 0x6e, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x28, 0x6e, 0x29, 0x7d, 0x28, 0x6e, 0x29, 0x2c, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3e, 0x30, 0x29, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x30, 0x3b, 0x74, 0x3c, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x74, 0x2b, 0x2b, 0x29, 0x73, 0x5b, 0x74, 0x5d, 0x28, 0x6e, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x64, 0x28, 0x22, 0x4c, 0x22, 0x2b, 0x6e, 0x2b, 0x74, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x76, 0x28, 0x6e, 0x29, 0x7b, 0x77, 0x28, 0x22, 0x54, 0x22, 0x2c, 0x6e, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x28, 0x6e, 0x29, 0x7b, 0x77, 0x28, 0x22, 0x50, 0x22, 0x2c, 0x6e, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x79, 0x28, 0x6e, 0x29, 0x7b, 0x77, 0x28, 0x22, 0x44, 0x22, 0x2c, 0x6e, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x28, 0x6e, 0x29, 0x7b, 0x77, 0x28, 0x22, 0x49, 0x22, 0x2c, 0x6e, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x28, 0x6e, 0x29, 0x7b, 0x77, 0x28, 0x22, 0x57, 0x22, 0x2c, 0x6e, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x28, 0x6e, 0x29, 0x7b, 0x77, 0x28, 0x22, 0x45, 0x22, 0x2c, 0x6e, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x28, 0x6e, 0x29, 0x7b, 0x77, 0x28, 0x22, 0x46, 0x22, 0x2c, 0x6e, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x53, 0x28, 0x6e, 0x29, 0x7b, 0x77, 0x28, 0x22, 0x53, 0x22, 0x2c, 0x6e, 0x29, 0x7d, 0x76, 0x61, 0x72, 0x20, 0x4f, 0x2c, 0x45, 0x3d, 0x7b, 0x54, 0x52, 0x41, 0x43, 0x45, 0x3a, 0x31, 0x2c, 0x44, 0x45, 0x42, 0x55, 0x47, 0x3a, 0x32, 0x2c, 0x49, 0x4e, 0x46, 0x4f, 0x3a, 0x33, 0x2c, 0x57, 0x41, 0x52, 0x4e, 0x49, 0x4e, 0x47, 0x3a, 0x34, 0x2c, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x3a, 0x35, 0x7d, 0x2c, 0x6b, 0x3d, 0x7b, 0x7d, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x43, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x21, 0x3d, 0x65, 0x26, 0x26, 0x6e, 0x75, 0x6c, 0x6c, 0x21, 0x3d, 0x65, 0x7c, 0x7c, 0x28, 0x65, 0x3d, 0x30, 0x29, 0x2c, 0x6e, 0x65, 0x77, 0x20, 0x50, 0x72, 0x6f, 0x6d, 0x69, 0x73, 0x65, 0x28, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x72, 0x2c, 0x69, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x6f, 0x3b, 0x64, 0x6f, 0x7b, 0x6f, 0x3d, 0x6e, 0x2b, 0x22, 0x2d, 0x22, 0x2b, 0x4f, 0x28, 0x29, 0x7d, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x28, 0x6b, 0x5b, 0x6f, 0x5d, 0x29, 0x3b, 0x69, 0x66, 0x28, 0x65, 0x3e, 0x30, 0x29, 0x76, 0x61, 0x72, 0x20, 0x61, 0x3d, 0x73, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x69, 0x28, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x43, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x22, 0x2b, 0x6e, 0x2b, 0x22, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x64, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x20, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x49, 0x44, 0x3a, 0x20, 0x22, 0x2b, 0x6f, 0x29, 0x29, 0x7d, 0x29, 0x2c, 0x65, 0x29, 0x3b, 0x6b, 0x5b, 0x6f, 0x5d, 0x3d, 0x7b, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x3a, 0x61, 0x2c, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x3a, 0x69, 0x2c, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x3a, 0x72, 0x7d, 0x3b, 0x74, 0x72, 0x79, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x75, 0x3d, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x6e, 0x2c, 0x61, 0x72, 0x67, 0x73, 0x3a, 0x74, 0x2c, 0x63, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x49, 0x44, 0x3a, 0x6f, 0x7d, 0x3b, 0x64, 0x28, 0x22, 0x43, 0x22, 0x2b, 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, 0x28, 0x75, 0x29, 0x29, 0x7d, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x6e, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x6e, 0x29, 0x7d, 0x7d, 0x29, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x57, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3b, 0x74, 0x72, 0x79, 0x7b, 0x74, 0x3d, 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x28, 0x6e, 0x29, 0x7d, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x74, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, 0x22, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x4a, 0x53, 0x4f, 0x4e, 0x20, 0x70, 0x61, 0x73, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x3a, 0x20, 0x22, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x74, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2c, 0x22, 0x2e, 0x20, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x20, 0x22, 0x29, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x6e, 0x29, 0x3b, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x79, 0x28, 0x65, 0x29, 0x2c, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x65, 0x29, 0x7d, 0x76, 0x61, 0x72, 0x20, 0x72, 0x3d, 0x74, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x69, 0x64, 0x2c, 0x69, 0x3d, 0x6b, 0x5b, 0x72, 0x5d, 0x3b, 0x69, 0x66, 0x28, 0x21, 0x69, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x6f, 0x3d, 0x22, 0x43, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x20, 0x27, 0x22, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x72, 0x2c, 0x22, 0x27, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x21, 0x21, 0x21, 0x22, 0x29, 0x3b, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x6f, 0x29, 0x2c, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x6f, 0x29, 0x7d, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, 0x69, 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x29, 0x2c, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6b, 0x5b, 0x72, 0x5d, 0x2c, 0x74, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3f, 0x69, 0x2e, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x28, 0x74, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x3a, 0x69, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x28, 0x74, 0x2e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4e, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x5b, 0x5d, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x28, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x29, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x31, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x43, 0x28, 0x22, 0x2e, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x22, 0x2b, 0x6e, 0x2c, 0x74, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x54, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x28, 0x22, 0x52, 0x42, 0x4f, 0x22, 0x2b, 0x6e, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6a, 0x28, 0x29, 0x7b, 0x64, 0x28, 0x22, 0x57, 0x63, 0x22, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x78, 0x28, 0x6e, 0x29, 0x7b, 0x64, 0x28, 0x22, 0x57, 0x54, 0x22, 0x2b, 0x6e, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4d, 0x28, 0x29, 0x7b, 0x64, 0x28, 0x22, 0x57, 0x46, 0x22, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x28, 0x29, 0x7b, 0x64, 0x28, 0x22, 0x57, 0x66, 0x22, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x44, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x64, 0x28, 0x22, 0x57, 0x73, 0x3a, 0x22, 0x2b, 0x6e, 0x2b, 0x22, 0x3a, 0x22, 0x2b, 0x74, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x50, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x64, 0x28, 0x22, 0x57, 0x70, 0x3a, 0x22, 0x2b, 0x6e, 0x2b, 0x22, 0x3a, 0x22, 0x2b, 0x74, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x28, 0x29, 0x7b, 0x64, 0x28, 0x22, 0x57, 0x48, 0x22, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4a, 0x28, 0x29, 0x7b, 0x64, 0x28, 0x22, 0x57, 0x53, 0x22, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4c, 0x28, 0x29, 0x7b, 0x64, 0x28, 0x22, 0x57, 0x4d, 0x22, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x52, 0x28, 0x29, 0x7b, 0x64, 0x28, 0x22, 0x57, 0x55, 0x22, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5f, 0x28, 0x29, 0x7b, 0x64, 0x28, 0x22, 0x57, 0x6d, 0x22, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x46, 0x28, 0x29, 0x7b, 0x64, 0x28, 0x22, 0x57, 0x75, 0x22, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x55, 0x28, 0x29, 0x7b, 0x64, 0x28, 0x22, 0x57, 0x43, 0x22, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x42, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4e, 0x28, 0x22, 0x44, 0x69, 0x61, 0x6c, 0x6f, 0x67, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x22, 0x2c, 0x6e, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x48, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4e, 0x28, 0x22, 0x44, 0x69, 0x61, 0x6c, 0x6f, 0x67, 0x2e, 0x53, 0x61, 0x76, 0x65, 0x22, 0x2c, 0x6e, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x47, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4e, 0x28, 0x22, 0x44, 0x69, 0x61, 0x6c, 0x6f, 0x67, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x2c, 0x6e, 0x29, 0x7d, 0x4f, 0x3d, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x3f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x6e, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x31, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x67, 0x65, 0x74, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x28, 0x6e, 0x29, 0x5b, 0x30, 0x5d, 0x7d, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x39, 0x30, 0x30, 0x37, 0x31, 0x39, 0x39, 0x32, 0x35, 0x34, 0x37, 0x34, 0x30, 0x39, 0x39, 0x31, 0x2a, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x28, 0x29, 0x7d, 0x2c, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x3d, 0x7b, 0x7d, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x71, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x21, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x21, 0x28, 0x6e, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x6f, 0x66, 0x20, 0x74, 0x29, 0x29, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x54, 0x79, 0x70, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x43, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x61, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x61, 0x73, 0x20, 0x61, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x7d, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x6e, 0x29, 0x2c, 0x65, 0x3d, 0x65, 0x7c, 0x7c, 0x2d, 0x31, 0x2c, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0x6e, 0x29, 0x2c, 0x2d, 0x31, 0x21, 0x3d, 0x3d, 0x65, 0x26, 0x26, 0x30, 0x3d, 0x3d, 0x3d, 0x28, 0x65, 0x2d, 0x3d, 0x31, 0x29, 0x7d, 0x7d, 0x2c, 0x7a, 0x3d, 0x7b, 0x7d, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x56, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x65, 0x29, 0x7b, 0x7a, 0x5b, 0x6e, 0x5d, 0x3d, 0x7a, 0x5b, 0x6e, 0x5d, 0x7c, 0x7c, 0x5b, 0x5d, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x3d, 0x6e, 0x65, 0x77, 0x20, 0x71, 0x28, 0x74, 0x2c, 0x65, 0x29, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x22, 0x50, 0x75, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x3a, 0x20, 0x22, 0x2b, 0x6e, 0x29, 0x2c, 0x7a, 0x5b, 0x6e, 0x5d, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x72, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4b, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x56, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x51, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x56, 0x28, 0x6e, 0x2c, 0x74, 0x2c, 0x31, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x58, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x6e, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x3b, 0x69, 0x66, 0x28, 0x7a, 0x5b, 0x74, 0x5d, 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, 0x7a, 0x5b, 0x74, 0x5d, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x29, 0x2c, 0x72, 0x3d, 0x30, 0x3b, 0x72, 0x3c, 0x7a, 0x5b, 0x74, 0x5d, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x72, 0x2b, 0x3d, 0x31, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x69, 0x3d, 0x7a, 0x5b, 0x74, 0x5d, 0x5b, 0x72, 0x5d, 0x2c, 0x6f, 0x3d, 0x6e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x3b, 0x69, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x28, 0x6f, 0x29, 0x26, 0x26, 0x65, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x72, 0x2c, 0x31, 0x29, 0x7d, 0x7a, 0x5b, 0x74, 0x5d, 0x3d, 0x65, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x59, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3b, 0x74, 0x72, 0x79, 0x7b, 0x74, 0x3d, 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x28, 0x6e, 0x29, 0x7d, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x74, 0x29, 0x7b, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x67, 0x28, 0x22, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x4a, 0x53, 0x4f, 0x4e, 0x20, 0x70, 0x61, 0x73, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x3a, 0x20, 0x22, 0x2b, 0x6e, 0x29, 0x7d, 0x58, 0x28, 0x74, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5a, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x6e, 0x2c, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x5b, 0x5d, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x28, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x29, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x31, 0x29, 0x7d, 0x3b, 0x58, 0x28, 0x74, 0x29, 0x2c, 0x64, 0x28, 0x22, 0x45, 0x6a, 0x22, 0x2b, 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, 0x28, 0x74, 0x29, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x24, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x22, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x22, 0x29, 0x3b, 0x65, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x3d, 0x6e, 0x2c, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x62, 0x6f, 0x64, 0x79, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x28, 0x65, 0x29, 0x2c, 0x74, 0x26, 0x26, 0x5a, 0x28, 0x74, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x74, 0x72, 0x79, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x22, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x22, 0x29, 0x3b, 0x74, 0x2e, 0x73, 0x65, 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x2c, 0x22, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x63, 0x73, 0x73, 0x22, 0x29, 0x2c, 0x74, 0x2e, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x53, 0x68, 0x65, 0x65, 0x74, 0x3f, 0x74, 0x2e, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x53, 0x68, 0x65, 0x65, 0x74, 0x2e, 0x63, 0x73, 0x73, 0x54, 0x65, 0x78, 0x74, 0x3d, 0x6e, 0x3a, 0x74, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x28, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x78, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x28, 0x6e, 0x29, 0x29, 0x2c, 0x28, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x7c, 0x7c, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x42, 0x79, 0x54, 0x61, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x28, 0x22, 0x68, 0x65, 0x61, 0x64, 0x22, 0x29, 0x5b, 0x30, 0x5d, 0x29, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x28, 0x74, 0x29, 0x7d, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x6e, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x6e, 0x29, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6e, 0x28, 0x29, 0x7b, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x57, 0x61, 0x69, 0x6c, 0x73, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x4d, 0x65, 0x6e, 0x75, 0x3d, 0x21, 0x30, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x6e, 0x28, 0x6e, 0x2c, 0x74, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3b, 0x69, 0x66, 0x28, 0x21, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x29, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x57, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x73, 0x65, 0x64, 0x22, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x3d, 0x5b, 0x5d, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x4f, 0x6e, 0x28, 0x22, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x3a, 0x73, 0x79, 0x6e, 0x63, 0x3a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x3a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x62, 0x79, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x3a, 0x22, 0x2b, 0x6e, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x28, 0x6e, 0x29, 0x3b, 0x65, 0x3d, 0x74, 0x2c, 0x72, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x6e, 0x28, 0x65, 0x29, 0x7d, 0x29, 0x29, 0x7d, 0x29, 0x29, 0x2c, 0x74, 0x26, 0x26, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x74, 0x29, 0x2c, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x6d, 0x69, 0x74, 0x28, 0x22, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x3a, 0x73, 0x79, 0x6e, 0x63, 0x3a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x3a, 0x72, 0x65, 0x73, 0x79, 0x6e, 0x63, 0x3a, 0x22, 0x2b, 0x6e, 0x29, 0x2c, 0x7b, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x6e, 0x29, 0x7d, 0x2c, 0x67, 0x65, 0x74, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x7d, 0x2c, 0x73, 0x65, 0x74, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x65, 0x3d, 0x74, 0x2c, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x6d, 0x69, 0x74, 0x28, 0x22, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x3a, 0x73, 0x79, 0x6e, 0x63, 0x3a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x3a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x62, 0x79, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x3a, 0x22, 0x2b, 0x6e, 0x2c, 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, 0x28, 0x65, 0x29, 0x29, 0x2c, 0x72, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x6e, 0x28, 0x65, 0x29, 0x7d, 0x29, 0x29, 0x7d, 0x2c, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x6e, 0x28, 0x65, 0x29, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x74, 0x29, 0x7d, 0x7d, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x64, 0x28, 0x22, 0x54, 0x49, 0x22, 0x2b, 0x6e, 0x29, 0x7d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x28, 0x6f, 0x6e, 0x3d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x7c, 0x7c, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x31, 0x3b, 0x74, 0x3c, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x74, 0x2b, 0x2b, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x65, 0x3d, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5b, 0x74, 0x5d, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x72, 0x20, 0x69, 0x6e, 0x20, 0x65, 0x29, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x68, 0x61, 0x73, 0x4f, 0x77, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x65, 0x2c, 0x72, 0x29, 0x26, 0x26, 0x28, 0x6e, 0x5b, 0x72, 0x5d, 0x3d, 0x65, 0x5b, 0x72, 0x5d, 0x29, 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x7d, 0x29, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x29, 0x7d, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x3d, 0x7b, 0x7d, 0x2c, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x3d, 0x7b, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x3a, 0x6c, 0x2c, 0x4c, 0x6f, 0x67, 0x3a, 0x72, 0x2c, 0x42, 0x72, 0x6f, 0x77, 0x73, 0x65, 0x72, 0x3a, 0x69, 0x2c, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x3a, 0x6f, 0x2c, 0x54, 0x72, 0x61, 0x79, 0x3a, 0x63, 0x2c, 0x44, 0x69, 0x61, 0x6c, 0x6f, 0x67, 0x3a, 0x61, 0x2c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x3a, 0x7b, 0x4f, 0x6e, 0x3a, 0x4b, 0x2c, 0x4f, 0x6e, 0x63, 0x65, 0x3a, 0x51, 0x2c, 0x4f, 0x6e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x3a, 0x56, 0x2c, 0x45, 0x6d, 0x69, 0x74, 0x3a, 0x5a, 0x7d, 0x2c, 0x5f, 0x3a, 0x7b, 0x43, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x3a, 0x57, 0x2c, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x3a, 0x59, 0x2c, 0x41, 0x64, 0x64, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3a, 0x24, 0x2c, 0x49, 0x6e, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x53, 0x53, 0x3a, 0x6e, 0x6e, 0x2c, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x4d, 0x65, 0x6e, 0x75, 0x3a, 0x74, 0x6e, 0x2c, 0x41, 0x64, 0x64, 0x49, 0x50, 0x43, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x3a, 0x66, 0x2c, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x43, 0x61, 0x6c, 0x6c, 0x3a, 0x4e, 0x2c, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x64, 0x7d, 0x2c, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x3a, 0x75, 0x7d, 0x2c, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x3d, 0x7b, 0x49, 0x73, 0x44, 0x61, 0x72, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x3a, 0x65, 0x6e, 0x28, 0x22, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x3a, 0x69, 0x73, 0x64, 0x61, 0x72, 0x6b, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0x29, 0x2c, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x3a, 0x65, 0x6e, 0x28, 0x22, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x3a, 0x6c, 0x6f, 0x67, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x22, 0x29, 0x2c, 0x41, 0x70, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x3a, 0x65, 0x6e, 0x28, 0x22, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x3a, 0x61, 0x70, 0x70, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x29, 0x7d, 0x2c, 0x6f, 0x6e, 0x28, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2c, 0x6c, 0x29, 0x2c, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x61, 0x64, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x28, 0x22, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x64, 0x6f, 0x77, 0x6e, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x74, 0x3d, 0x6e, 0x2e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3b, 0x6e, 0x75, 0x6c, 0x6c, 0x21, 0x3d, 0x74, 0x26, 0x26, 0x21, 0x74, 0x2e, 0x68, 0x61, 0x73, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x22, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x2d, 0x6e, 0x6f, 0x2d, 0x64, 0x72, 0x61, 0x67, 0x22, 0x29, 0x3b, 0x29, 0x7b, 0x69, 0x66, 0x28, 0x74, 0x2e, 0x68, 0x61, 0x73, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x28, 0x22, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x2d, 0x64, 0x72, 0x61, 0x67, 0x22, 0x29, 0x29, 0x7b, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x28, 0x22, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x2d, 0x64, 0x72, 0x61, 0x67, 0x22, 0x29, 0x3b, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x7d, 0x74, 0x3d, 0x74, 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x7d, 0x7d, 0x29, 0x29, 0x2c, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x61, 0x64, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x28, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x6d, 0x65, 0x6e, 0x75, 0x22, 0x2c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x74, 0x2c, 0x65, 0x3d, 0x6e, 0x2e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3b, 0x6e, 0x75, 0x6c, 0x6c, 0x21, 0x3d, 0x65, 0x26, 0x26, 0x6e, 0x75, 0x6c, 0x6c, 0x3d, 0x3d, 0x28, 0x74, 0x3d, 0x65, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x73, 0x65, 0x74, 0x5b, 0x22, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x6d, 0x65, 0x6e, 0x75, 0x2d, 0x69, 0x64, 0x22, 0x5d, 0x29, 0x3b, 0x29, 0x65, 0x3d, 0x65, 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x3b, 0x69, 0x66, 0x28, 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x21, 0x3d, 0x74, 0x7c, 0x7c, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x57, 0x61, 0x69, 0x6c, 0x73, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x4d, 0x65, 0x6e, 0x75, 0x29, 0x26, 0x26, 0x6e, 0x2e, 0x70, 0x72, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x28, 0x29, 0x2c, 0x6e, 0x75, 0x6c, 0x6c, 0x21, 0x3d, 0x74, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x3d, 0x7b, 0x69, 0x64, 0x3a, 0x74, 0x2c, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x65, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x73, 0x65, 0x74, 0x5b, 0x22, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x6d, 0x65, 0x6e, 0x75, 0x2d, 0x64, 0x61, 0x74, 0x61, 0x22, 0x5d, 0x7c, 0x7c, 0x22, 0x22, 0x7d, 0x3b, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x28, 0x22, 0x43, 0x22, 0x2b, 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, 0x28, 0x72, 0x29, 0x29, 0x7d, 0x7d, 0x29, 0x29, 0x2c, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x26, 0x26, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x74, 0x72, 0x79, 0x7b, 0x6e, 0x3d, 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x28, 0x6e, 0x29, 0x7d, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x6e, 0x29, 0x7b, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x6e, 0x29, 0x7d, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x3d, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x7c, 0x7c, 0x7b, 0x7d, 0x2c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x28, 0x6e, 0x29, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x29, 0x7b, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x5b, 0x74, 0x5d, 0x3d, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x5b, 0x74, 0x5d, 0x7c, 0x7c, 0x7b, 0x7d, 0x2c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x28, 0x6e, 0x5b, 0x74, 0x5d, 0x29, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x65, 0x29, 0x7b, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x5b, 0x74, 0x5d, 0x5b, 0x65, 0x5d, 0x3d, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x5b, 0x74, 0x5d, 0x5b, 0x65, 0x5d, 0x7c, 0x7c, 0x7b, 0x7d, 0x2c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x28, 0x6e, 0x5b, 0x74, 0x5d, 0x5b, 0x65, 0x5d, 0x29, 0x2e, 0x66, 0x6f, 0x72, 0x45, 0x61, 0x63, 0x68, 0x28, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x5b, 0x74, 0x5d, 0x5b, 0x65, 0x5d, 0x5b, 0x6e, 0x5d, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x3d, 0x30, 0x3b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x28, 0x29, 0x7b, 0x76, 0x61, 0x72, 0x20, 0x69, 0x3d, 0x5b, 0x5d, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x43, 0x28, 0x5b, 0x74, 0x2c, 0x65, 0x2c, 0x6e, 0x5d, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x22, 0x2e, 0x22, 0x29, 0x2c, 0x69, 0x2c, 0x72, 0x29, 0x7d, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x2e, 0x73, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x7b, 0x72, 0x3d, 0x6e, 0x7d, 0x2c, 0x69, 0x2e, 0x67, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x3d, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x7d, 0x2c, 0x69, 0x7d, 0x28, 0x29, 0x7d, 0x29, 0x29, 0x7d, 0x29, 0x29, 0x7d, 0x29, 0x29, 0x7d, 0x28, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x29, 0x2c, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x6d, 0x69, 0x74, 0x28, 0x22, 0x77, 0x61, 0x69, 0x6c, 0x73, 0x3a, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x22, 0x29, 0x7d, 0x5d, 0x29, 0x3b, 0x00}; \ No newline at end of file diff --git a/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/traymenu_darwin.c b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/traymenu_darwin.c new file mode 100644 index 0000000..1854d83 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/traymenu_darwin.c @@ -0,0 +1,266 @@ +// +// Created by Lea Anthony on 12/1/21. +// + +#include "common.h" +#include "traymenu_darwin.h" +#include "trayicons.h" + +extern Class trayMenuDelegateClass; + +// A cache for all our tray menu icons +// Global because it's a singleton +struct hashmap_s trayIconCache; + +TrayMenu* NewTrayMenu(const char* menuJSON) { + TrayMenu* result = malloc(sizeof(TrayMenu)); + +/* + {"ID":"0","Label":"Test Tray Label","Icon":"","ProcessedMenu":{"Menu":{"Items":[{"ID":"0","Label":"Show Window","Type":"Text","Disabled":false,"Hidden":false,"Checked":false,"Foreground":0,"Background":0},{"ID":"1","Label":"Hide Window","Type":"Text","Disabled":false,"Hidden":false,"Checked":false,"Foreground":0,"Background":0},{"ID":"2","Label":"Minimise Window","Type":"Text","Disabled":false,"Hidden":false,"Checked":false,"Foreground":0,"Background":0},{"ID":"3","Label":"Unminimise Window","Type":"Text","Disabled":false,"Hidden":false,"Checked":false,"Foreground":0,"Background":0}]},"RadioGroups":null}} +*/ + JsonNode* processedJSON = json_decode(menuJSON); + if( processedJSON == NULL ) { + ABORT("[NewTrayMenu] Unable to parse TrayMenu JSON: %s", menuJSON); + } + + // Save reference to this json + result->processedJSON = processedJSON; + + // TODO: Make this configurable + result->trayIconPosition = NSImageLeft; + + result->ID = mustJSONString(processedJSON, "ID"); + result->label = mustJSONString(processedJSON, "Label"); + result->icon = mustJSONString(processedJSON, "Image"); + result->fontName = getJSONString(processedJSON, "FontName"); + result->RGBA = getJSONString(processedJSON, "RGBA"); + getJSONBool(processedJSON, "MacTemplateImage", &result->templateImage); + result->fontSize = 0; + getJSONInt(processedJSON, "FontSize", &result->fontSize); + result->tooltip = NULL; + result->tooltip = getJSONString(processedJSON, "Tooltip"); + result->disabled = false; + getJSONBool(processedJSON, "Disabled", &result->disabled); + + result->styledLabel = getJSONObject(processedJSON, "StyledLabel"); + + // Create the menu + JsonNode* processedMenu = mustJSONObject(processedJSON, "ProcessedMenu"); + result->menu = NewMenu(processedMenu); + + result->delegate = NULL; + + // Init tray status bar item + result->statusbaritem = NULL; + + // Set the menu type and store the tray ID in the parent data + result->menu->menuType = TrayMenuType; + result->menu->parentData = (void*) result->ID; + + return result; +} + +void DumpTrayMenu(TrayMenu* trayMenu) { + printf(" ['%s':%p] = { label: '%s', icon: '%s', menu: %p, statusbar: %p }\n", trayMenu->ID, trayMenu, trayMenu->label, trayMenu->icon, trayMenu->menu, trayMenu->statusbaritem ); +} + + +void UpdateTrayLabel(TrayMenu *trayMenu, const char *label, const char *fontName, int fontSize, const char *RGBA, const char *tooltip, bool disabled, JsonNode *styledLabel) { + + // Exit early if NULL + if( trayMenu->label == NULL ) { + return; + } + // Update button label + id statusBarButton = msg_reg(trayMenu->statusbaritem, s("button")); + id attributedString = NULL; + if( styledLabel != NULL) { + attributedString = createAttributedStringFromStyledLabel(styledLabel, fontName, fontSize); + } else { + attributedString = createAttributedString(label, fontName, fontSize, RGBA); + } + + if( tooltip != NULL ) { + msg_id(statusBarButton, s("setToolTip:"), str(tooltip)); + } + + msg_bool(statusBarButton, s("setEnabled:"), !disabled); + + msg_id(statusBarButton, s("setAttributedTitle:"), attributedString); +} + +void UpdateTrayIcon(TrayMenu *trayMenu) { + + // Exit early if NULL + if( trayMenu->icon == NULL ) { + return; + } + + id statusBarButton = msg_reg(trayMenu->statusbaritem, s("button")); + + // Empty icon means remove it + if( STREMPTY(trayMenu->icon) ) { + // Remove image + msg_id(statusBarButton, s("setImage:"), NULL); + return; + } + + id trayImage = hashmap_get(&trayIconCache, trayMenu->icon, strlen(trayMenu->icon)); + + // If we don't have the image in the icon cache then assume it's base64 encoded image data + if (trayImage == NULL) { + trayImage = createImageFromBase64Data(trayMenu->icon, trayMenu->templateImage); + } + + msg_int(statusBarButton, s("setImagePosition:"), trayMenu->trayIconPosition); + msg_id(statusBarButton, s("setImage:"), trayImage); + +} + +void ShowTrayMenu(TrayMenu* trayMenu) { + + // Create a status bar item if we don't have one + if( trayMenu->statusbaritem == NULL ) { + id statusBar = msg_reg( c("NSStatusBar"), s("systemStatusBar") ); + trayMenu->statusbaritem = ((id(*)(id, SEL, CGFloat))objc_msgSend)(statusBar, s("statusItemWithLength:"), NSVariableStatusItemLength); + msg_reg(trayMenu->statusbaritem, s("retain")); + } + + id statusBarButton = msg_reg(trayMenu->statusbaritem, s("button")); + msg_uint(statusBarButton, s("setImagePosition:"), trayMenu->trayIconPosition); + // Update the icon if needed + UpdateTrayIcon(trayMenu); + + // Update the label if needed + UpdateTrayLabel(trayMenu, trayMenu->label, trayMenu->fontName, trayMenu->fontSize, trayMenu->RGBA, trayMenu->tooltip, trayMenu->disabled, trayMenu->styledLabel); + + // Update the menu + id menu = GetMenu(trayMenu->menu); + objc_setAssociatedObject(menu, "trayMenuID", str(trayMenu->ID), OBJC_ASSOCIATION_ASSIGN); + + // Create delegate + id trayMenuDelegate = msg_reg((id)trayMenuDelegateClass, s("new")); + msg_id(menu, s("setDelegate:"), trayMenuDelegate); + objc_setAssociatedObject(trayMenuDelegate, "menu", menu, OBJC_ASSOCIATION_ASSIGN); + + // Create menu delegate + trayMenu->delegate = trayMenuDelegate; + + msg_id(trayMenu->statusbaritem, s("setMenu:"), menu); +} + +// UpdateTrayMenuInPlace receives 2 menus. The current menu gets +// updated with the data from the new menu. +void UpdateTrayMenuInPlace(TrayMenu* currentMenu, TrayMenu* newMenu) { + + // Delete the old menu + DeleteMenu(currentMenu->menu); + if( currentMenu->delegate != NULL ) { + msg_reg(currentMenu->delegate, s("release")); + currentMenu->delegate = NULL; + } + + // Set the new one + currentMenu->menu = newMenu->menu; + + // Delete the old JSON + json_delete(currentMenu->processedJSON); + + // Set the new JSON + currentMenu->processedJSON = newMenu->processedJSON; + + // Copy the other data + currentMenu->ID = newMenu->ID; + currentMenu->label = newMenu->label; + currentMenu->styledLabel = newMenu->styledLabel; + currentMenu->trayIconPosition = newMenu->trayIconPosition; + currentMenu->icon = newMenu->icon; + +} + +void DeleteTrayMenu(TrayMenu* trayMenu) { + + // Delete the menu + DeleteMenu(trayMenu->menu); + if( trayMenu->delegate != NULL ) { + msg_reg(trayMenu->delegate, s("release")); + trayMenu->delegate = NULL; + } + + // Free JSON + if (trayMenu->processedJSON != NULL ) { + json_delete(trayMenu->processedJSON); + } + + // Free the status item + if ( trayMenu->statusbaritem != NULL ) { + id statusBar = msg_reg( c("NSStatusBar"), s("systemStatusBar") ); + msg_id(statusBar, s("removeStatusItem:"), trayMenu->statusbaritem); + msg_reg(trayMenu->statusbaritem, s("release")); + trayMenu->statusbaritem = NULL; + } + + // Free the tray menu memory + MEMFREE(trayMenu); +} +void DeleteTrayMenuKeepStatusBarItem(TrayMenu* trayMenu) { + + // Delete the menu + DeleteMenu(trayMenu->menu); + if( trayMenu->delegate != NULL ) { + msg_reg(trayMenu->delegate, s("release")); + trayMenu->delegate = NULL; + } + + // Free JSON + if (trayMenu->processedJSON != NULL ) { + json_delete(trayMenu->processedJSON); + } + + // Free the tray menu memory + MEMFREE(trayMenu); +} + +void LoadTrayIcons() { + + // Allocate the Tray Icons + if( 0 != hashmap_create((const unsigned)4, &trayIconCache)) { + // Couldn't allocate map + ABORT("Not enough memory to allocate trayIconCache!"); + } + + unsigned int count = 0; + while( 1 ) { + const unsigned char *name = trayIcons[count++]; + if( name == 0x00 ) { + break; + } + const unsigned char *lengthAsString = trayIcons[count++]; + if( name == 0x00 ) { + break; + } + const unsigned char *data = trayIcons[count++]; + if( data == 0x00 ) { + break; + } + int length = atoi((const char *)lengthAsString); + + // Create the icon and add to the hashmap + id imageData = ((id(*)(id, SEL, id, int))objc_msgSend)(c("NSData"), s("dataWithBytes:length:"), (id)data, length); + id trayImage = ALLOC("NSImage"); + msg_id(trayImage, s("initWithData:"), imageData); + hashmap_put(&trayIconCache, (const char *)name, strlen((const char *)name), trayImage); + } +} + +void UnloadTrayIcons() { + // Release the tray cache images + if( hashmap_num_entries(&trayIconCache) > 0 ) { + if (0!=hashmap_iterate_pairs(&trayIconCache, releaseNSObject, NULL)) { + ABORT("failed to release hashmap entries!"); + } + } + + //Free radio groups hashmap + hashmap_destroy(&trayIconCache); +} \ No newline at end of file diff --git a/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/traymenu_darwin.h b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/traymenu_darwin.h new file mode 100644 index 0000000..763b4d6 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/traymenu_darwin.h @@ -0,0 +1,51 @@ +// +// Created by Lea Anthony on 12/1/21. +// + +#ifndef TRAYMENU_DARWIN_H +#define TRAYMENU_DARWIN_H + +#include "common.h" +#include "menu_darwin.h" + +typedef struct { + + const char *label; + const char *icon; + const char *ID; + const char *tooltip; + + bool templateImage; + const char *fontName; + int fontSize; + const char *RGBA; + + bool disabled; + + Menu* menu; + + id statusbaritem; + unsigned int trayIconPosition; + + JsonNode* processedJSON; + + JsonNode* styledLabel; + + id delegate; + +} TrayMenu; + +TrayMenu* NewTrayMenu(const char *trayJSON); +void DumpTrayMenu(TrayMenu* trayMenu); +void ShowTrayMenu(TrayMenu* trayMenu); +void UpdateTrayMenuInPlace(TrayMenu* currentMenu, TrayMenu* newMenu); +void UpdateTrayIcon(TrayMenu *trayMenu); +void UpdateTrayLabel(TrayMenu *trayMenu, const char *label, const char *fontName, int fontSize, const char *RGBA, const char *tooltip, bool disabled, JsonNode *styledLabel); + +void LoadTrayIcons(); +void UnloadTrayIcons(); + +void DeleteTrayMenu(TrayMenu* trayMenu); +void DeleteTrayMenuKeepStatusBarItem(TrayMenu* trayMenu); + +#endif //TRAYMENU_DARWIN_H diff --git a/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/traymenustore_darwin.c b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/traymenustore_darwin.c new file mode 100644 index 0000000..362c07b --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/traymenustore_darwin.c @@ -0,0 +1,173 @@ +// +// Created by Lea Anthony on 12/1/21. +// + +#include "common.h" +#include "traymenustore_darwin.h" +#include "traymenu_darwin.h" +#include + +TrayMenuStore* NewTrayMenuStore() { + + TrayMenuStore* result = malloc(sizeof(TrayMenuStore)); + + // Allocate Tray Menu Store + if( 0 != hashmap_create((const unsigned)4, &result->trayMenuMap)) { + ABORT("[NewTrayMenuStore] Not enough memory to allocate trayMenuMap!"); + } + + if (pthread_mutex_init(&result->lock, NULL) != 0) { + printf("\n mutex init has failed\n"); + exit(1); + } + + return result; +} + +int dumpTrayMenu(void *const context, struct hashmap_element_s *const e) { + DumpTrayMenu(e->data); + return 0; +} + +void DumpTrayMenuStore(TrayMenuStore* store) { + pthread_mutex_lock(&store->lock); + hashmap_iterate_pairs(&store->trayMenuMap, dumpTrayMenu, NULL); + pthread_mutex_unlock(&store->lock); +} + +void AddTrayMenuToStore(TrayMenuStore* store, const char* menuJSON) { + + TrayMenu* newMenu = NewTrayMenu(menuJSON); + + pthread_mutex_lock(&store->lock); + //TODO: check if there is already an entry for this menu + hashmap_put(&store->trayMenuMap, newMenu->ID, strlen(newMenu->ID), newMenu); + pthread_mutex_unlock(&store->lock); +} + +int showTrayMenu(void *const context, struct hashmap_element_s *const e) { + ShowTrayMenu(e->data); + // 0 to retain element, -1 to delete. + return 0; +} + +void ShowTrayMenusInStore(TrayMenuStore* store) { + pthread_mutex_lock(&store->lock); + if( hashmap_num_entries(&store->trayMenuMap) > 0 ) { + hashmap_iterate_pairs(&store->trayMenuMap, showTrayMenu, NULL); + } + pthread_mutex_unlock(&store->lock); +} + +int freeTrayMenu(void *const context, struct hashmap_element_s *const e) { + DeleteTrayMenu(e->data); + return -1; +} + +void DeleteTrayMenuStore(TrayMenuStore *store) { + + // Delete context menus + if (hashmap_num_entries(&store->trayMenuMap) > 0) { + if (0 != hashmap_iterate_pairs(&store->trayMenuMap, freeTrayMenu, NULL)) { + ABORT("[DeleteContextMenuStore] Failed to release contextMenuStore entries!"); + } + } + + // Destroy tray menu map + hashmap_destroy(&store->trayMenuMap); + + pthread_mutex_destroy(&store->lock); +} + +TrayMenu* GetTrayMenuFromStore(TrayMenuStore* store, const char* menuID) { + // Get the current menu + pthread_mutex_lock(&store->lock); + TrayMenu* result = hashmap_get(&store->trayMenuMap, menuID, strlen(menuID)); + pthread_mutex_unlock(&store->lock); + return result; +} + +TrayMenu* MustGetTrayMenuFromStore(TrayMenuStore* store, const char* menuID) { + // Get the current menu + pthread_mutex_lock(&store->lock); + TrayMenu* result = hashmap_get(&store->trayMenuMap, menuID, strlen(menuID)); + pthread_mutex_unlock(&store->lock); + + if (result == NULL ) { + ABORT("Unable to find TrayMenu with ID '%s' in the TrayMenuStore!", menuID); + } + return result; +} + +void DeleteTrayMenuInStore(TrayMenuStore* store, const char* ID) { + + TrayMenu *menu = MustGetTrayMenuFromStore(store, ID); + pthread_mutex_lock(&store->lock); + hashmap_remove(&store->trayMenuMap, ID, strlen(ID)); + pthread_mutex_unlock(&store->lock); + DeleteTrayMenu(menu); +} + +void UpdateTrayMenuLabelInStore(TrayMenuStore* store, const char* JSON) { + // Parse the JSON + JsonNode *parsedUpdate = mustParseJSON(JSON); + + // Get the data out + const char* ID = mustJSONString(parsedUpdate, "ID"); + const char* Label = mustJSONString(parsedUpdate, "Label"); + + // Check we have this menu + TrayMenu *menu = MustGetTrayMenuFromStore(store, ID); + + const char *fontName = getJSONString(parsedUpdate, "FontName"); + const char *RGBA = getJSONString(parsedUpdate, "RGBA"); + int fontSize = 0; + getJSONInt(parsedUpdate, "FontSize", &fontSize); + const char *tooltip = getJSONString(parsedUpdate, "Tooltip"); + bool disabled = false; + getJSONBool(parsedUpdate, "Disabled", &disabled); + + JsonNode *styledLabel = getJSONObject(parsedUpdate, "StyledLabel"); + + UpdateTrayLabel(menu, Label, fontName, fontSize, RGBA, tooltip, disabled, styledLabel); + + json_delete(parsedUpdate); +} + +void UpdateTrayMenuInStore(TrayMenuStore* store, const char* menuJSON) { + TrayMenu* newMenu = NewTrayMenu(menuJSON); +// DumpTrayMenu(newMenu); + + // Get the current menu + TrayMenu *currentMenu = GetTrayMenuFromStore(store, newMenu->ID); + + // If we don't have a menu, we create one + if ( currentMenu == NULL ) { + // Store the new menu + pthread_mutex_lock(&store->lock); + hashmap_put(&store->trayMenuMap, newMenu->ID, strlen(newMenu->ID), newMenu); + pthread_mutex_unlock(&store->lock); + + // Show it + ShowTrayMenu(newMenu); + return; + } +// DumpTrayMenu(currentMenu); + + // Save the status bar reference + newMenu->statusbaritem = currentMenu->statusbaritem; + + pthread_mutex_lock(&store->lock); + hashmap_remove(&store->trayMenuMap, newMenu->ID, strlen(newMenu->ID)); + pthread_mutex_unlock(&store->lock); + + // Delete the current menu + DeleteTrayMenuKeepStatusBarItem(currentMenu); + + pthread_mutex_lock(&store->lock); + hashmap_put(&store->trayMenuMap, newMenu->ID, strlen(newMenu->ID), newMenu); + pthread_mutex_unlock(&store->lock); + + // Show the updated menu + ShowTrayMenu(newMenu); +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/traymenustore_darwin.h b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/traymenustore_darwin.h new file mode 100644 index 0000000..a09a9e0 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/traymenustore_darwin.h @@ -0,0 +1,36 @@ +// +// Created by Lea Anthony on 7/1/21. +// + +#ifndef TRAYMENUSTORE_DARWIN_H +#define TRAYMENUSTORE_DARWIN_H + +#include "traymenu_darwin.h" + +#include + +typedef struct { + + int dummy; + + // This is our tray menu map + // It maps tray IDs to TrayMenu* + struct hashmap_s trayMenuMap; + + pthread_mutex_t lock; + +} TrayMenuStore; + +TrayMenuStore* NewTrayMenuStore(); + +void AddTrayMenuToStore(TrayMenuStore* store, const char* menuJSON); +void UpdateTrayMenuInStore(TrayMenuStore* store, const char* menuJSON); +void ShowTrayMenusInStore(TrayMenuStore* store); +void DeleteTrayMenuStore(TrayMenuStore* store); + +TrayMenu* GetTrayMenuByID(TrayMenuStore* store, const char* menuID); + +void UpdateTrayMenuLabelInStore(TrayMenuStore* store, const char* JSON); +void DeleteTrayMenuInStore(TrayMenuStore* store, const char* id); + +#endif //TRAYMENUSTORE_DARWIN_H diff --git a/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/vec.c b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/vec.c new file mode 100644 index 0000000..6ab8bfa --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/vec.c @@ -0,0 +1,115 @@ +// +build !windows + +/** + * Copyright (c) 2014 rxi + * + * This library is free software; you can redistribute it and/or modify it + * under the terms of the MIT license. See LICENSE for details. + */ + +#include "vec.h" + + +int vec_expand_(char **data, int *length, int *capacity, int memsz) { + if (*length + 1 > *capacity) { + void *ptr; + int n = (*capacity == 0) ? 1 : *capacity << 1; + ptr = realloc(*data, n * memsz); + if (ptr == NULL) return -1; + *data = ptr; + *capacity = n; + } + return 0; +} + + +int vec_reserve_(char **data, int *length, int *capacity, int memsz, int n) { + (void) length; + if (n > *capacity) { + void *ptr = realloc(*data, n * memsz); + if (ptr == NULL) return -1; + *data = ptr; + *capacity = n; + } + return 0; +} + + +int vec_reserve_po2_( + char **data, int *length, int *capacity, int memsz, int n +) { + int n2 = 1; + if (n == 0) return 0; + while (n2 < n) n2 <<= 1; + return vec_reserve_(data, length, capacity, memsz, n2); +} + + +int vec_compact_(char **data, int *length, int *capacity, int memsz) { + if (*length == 0) { + free(*data); + *data = NULL; + *capacity = 0; + return 0; + } else { + void *ptr; + int n = *length; + ptr = realloc(*data, n * memsz); + if (ptr == NULL) return -1; + *capacity = n; + *data = ptr; + } + return 0; +} + + +int vec_insert_(char **data, int *length, int *capacity, int memsz, + int idx +) { + int err = vec_expand_(data, length, capacity, memsz); + if (err) return err; + memmove(*data + (idx + 1) * memsz, + *data + idx * memsz, + (*length - idx) * memsz); + return 0; +} + + +void vec_splice_(char **data, int *length, int *capacity, int memsz, + int start, int count +) { + (void) capacity; + memmove(*data + start * memsz, + *data + (start + count) * memsz, + (*length - start - count) * memsz); +} + + +void vec_swapsplice_(char **data, int *length, int *capacity, int memsz, + int start, int count +) { + (void) capacity; + memmove(*data + start * memsz, + *data + (*length - count) * memsz, + count * memsz); +} + + +void vec_swap_(char **data, int *length, int *capacity, int memsz, + int idx1, int idx2 +) { + unsigned char *a, *b, tmp; + int count; + (void) length; + (void) capacity; + if (idx1 == idx2) return; + a = (unsigned char*) *data + idx1 * memsz; + b = (unsigned char*) *data + idx2 * memsz; + count = memsz; + while (count--) { + tmp = *a; + *a = *b; + *b = tmp; + a++, b++; + } +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/vec.h b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/vec.h new file mode 100644 index 0000000..19362c9 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/vec.h @@ -0,0 +1,181 @@ +/** + * Copyright (c) 2014 rxi + * + * This library is free software; you can redistribute it and/or modify it + * under the terms of the MIT license. See LICENSE for details. + */ + +#ifndef VEC_H +#define VEC_H + +#include +#include + +#define VEC_VERSION "0.2.1" + + +#define vec_unpack_(v)\ + (char**)&(v)->data, &(v)->length, &(v)->capacity, sizeof(*(v)->data) + + +#define vec_t(T)\ + struct { T *data; int length, capacity; } + + +#define vec_init(v)\ + memset((v), 0, sizeof(*(v))) + + +#define vec_deinit(v)\ + ( free((v)->data),\ + vec_init(v) ) + + +#define vec_push(v, val)\ + ( vec_expand_(vec_unpack_(v)) ? -1 :\ + ((v)->data[(v)->length++] = (val), 0), 0 ) + + +#define vec_pop(v)\ + (v)->data[--(v)->length] + + +#define vec_splice(v, start, count)\ + ( vec_splice_(vec_unpack_(v), start, count),\ + (v)->length -= (count) ) + + +#define vec_swapsplice(v, start, count)\ + ( vec_swapsplice_(vec_unpack_(v), start, count),\ + (v)->length -= (count) ) + + +#define vec_insert(v, idx, val)\ + ( vec_insert_(vec_unpack_(v), idx) ? -1 :\ + ((v)->data[idx] = (val), 0), (v)->length++, 0 ) + + +#define vec_sort(v, fn)\ + qsort((v)->data, (v)->length, sizeof(*(v)->data), fn) + + +#define vec_swap(v, idx1, idx2)\ + vec_swap_(vec_unpack_(v), idx1, idx2) + + +#define vec_truncate(v, len)\ + ((v)->length = (len) < (v)->length ? (len) : (v)->length) + + +#define vec_clear(v)\ + ((v)->length = 0) + + +#define vec_first(v)\ + (v)->data[0] + + +#define vec_last(v)\ + (v)->data[(v)->length - 1] + + +#define vec_reserve(v, n)\ + vec_reserve_(vec_unpack_(v), n) + + +#define vec_compact(v)\ + vec_compact_(vec_unpack_(v)) + + +#define vec_pusharr(v, arr, count)\ + do {\ + int i__, n__ = (count);\ + if (vec_reserve_po2_(vec_unpack_(v), (v)->length + n__) != 0) break;\ + for (i__ = 0; i__ < n__; i__++) {\ + (v)->data[(v)->length++] = (arr)[i__];\ + }\ + } while (0) + + +#define vec_extend(v, v2)\ + vec_pusharr((v), (v2)->data, (v2)->length) + + +#define vec_find(v, val, idx)\ + do {\ + for ((idx) = 0; (idx) < (v)->length; (idx)++) {\ + if ((v)->data[(idx)] == (val)) break;\ + }\ + if ((idx) == (v)->length) (idx) = -1;\ + } while (0) + + +#define vec_remove(v, val)\ + do {\ + int idx__;\ + vec_find(v, val, idx__);\ + if (idx__ != -1) vec_splice(v, idx__, 1);\ + } while (0) + + +#define vec_reverse(v)\ + do {\ + int i__ = (v)->length / 2;\ + while (i__--) {\ + vec_swap((v), i__, (v)->length - (i__ + 1));\ + }\ + } while (0) + + +#define vec_foreach(v, var, iter)\ + if ( (v)->length > 0 )\ + for ( (iter) = 0;\ + (iter) < (v)->length && (((var) = (v)->data[(iter)]), 1);\ + ++(iter)) + + +#define vec_foreach_rev(v, var, iter)\ + if ( (v)->length > 0 )\ + for ( (iter) = (v)->length - 1;\ + (iter) >= 0 && (((var) = (v)->data[(iter)]), 1);\ + --(iter)) + + +#define vec_foreach_ptr(v, var, iter)\ + if ( (v)->length > 0 )\ + for ( (iter) = 0;\ + (iter) < (v)->length && (((var) = &(v)->data[(iter)]), 1);\ + ++(iter)) + + +#define vec_foreach_ptr_rev(v, var, iter)\ + if ( (v)->length > 0 )\ + for ( (iter) = (v)->length - 1;\ + (iter) >= 0 && (((var) = &(v)->data[(iter)]), 1);\ + --(iter)) + + + +int vec_expand_(char **data, int *length, int *capacity, int memsz); +int vec_reserve_(char **data, int *length, int *capacity, int memsz, int n); +int vec_reserve_po2_(char **data, int *length, int *capacity, int memsz, + int n); +int vec_compact_(char **data, int *length, int *capacity, int memsz); +int vec_insert_(char **data, int *length, int *capacity, int memsz, + int idx); +void vec_splice_(char **data, int *length, int *capacity, int memsz, + int start, int count); +void vec_swapsplice_(char **data, int *length, int *capacity, int memsz, + int start, int count); +void vec_swap_(char **data, int *length, int *capacity, int memsz, + int idx1, int idx2); + + +typedef vec_t(void*) vec_void_t; +typedef vec_t(char*) vec_str_t; +typedef vec_t(int) vec_int_t; +typedef vec_t(char) vec_char_t; +typedef vec_t(float) vec_float_t; +typedef vec_t(double) vec_double_t; + +#endif \ No newline at end of file diff --git a/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/windows/wv2runtime/browser.go b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/windows/wv2runtime/browser.go new file mode 100644 index 0000000..6166645 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/windows/wv2runtime/browser.go @@ -0,0 +1,23 @@ +// +build wv2runtime.browser + +package wv2runtime + +import ( + "fmt" + "github.com/leaanthony/webview2runtime" +) + +func doInstallationStrategy(installStatus installationStatus) error { + confirmed, err := webview2runtime.Confirm("This application requires the WebView2 runtime. Press OK to open the download page. Minimum version required: "+minimumRuntimeVersion, "Missing Requirements") + if err != nil { + return err + } + if confirmed { + err = webview2runtime.OpenInstallerDownloadWebpage() + if err != nil { + return err + } + } + + return fmt.Errorf("webview2 runtime not installed") +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/windows/wv2runtime/download.go b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/windows/wv2runtime/download.go new file mode 100644 index 0000000..cfb2aa1 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/windows/wv2runtime/download.go @@ -0,0 +1,35 @@ +// +build !wv2runtime.error +// +build !wv2runtime.browser +// +build !wv2runtime.embed + +package wv2runtime + +import ( + "fmt" + "github.com/leaanthony/webview2runtime" +) + +func doInstallationStrategy(installStatus installationStatus) error { + message := "The WebView2 runtime is required. " + if installStatus == needsUpdating { + message = "The Webview2 runtime needs updating. " + } + message += "Press Ok to download and install. Note: The installer will download silently so please wait." + confirmed, err := webview2runtime.Confirm(message, "Missing Requirements") + if err != nil { + return err + } + if !confirmed { + return fmt.Errorf("webview2 runtime not installed") + } + installedCorrectly, err := webview2runtime.InstallUsingBootstrapper() + if err != nil { + _ = webview2runtime.Error(err.Error(), "Error") + return err + } + if !installedCorrectly { + err = webview2runtime.Error("The runtime failed to install correctly. Please try again.", "Error") + return err + } + return nil +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/windows/wv2runtime/embed.go b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/windows/wv2runtime/embed.go new file mode 100644 index 0000000..99a472d --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/windows/wv2runtime/embed.go @@ -0,0 +1,33 @@ +// +build wv2runtime.embed + +package wv2runtime + +import ( + "fmt" + "github.com/leaanthony/webview2runtime" +) + +func doInstallationStrategy(installStatus installationStatus) error { + message := "The WebView2 runtime is required. " + if installStatus == needsUpdating { + message = "The Webview2 runtime needs updating. " + } + message += "Press Ok to install." + confirmed, err := webview2runtime.Confirm(message, "Missing Requirements") + if err != nil { + return err + } + if !confirmed { + return fmt.Errorf("webview2 runtime not installed") + } + installedCorrectly, err := webview2runtime.InstallUsingEmbeddedBootstrapper() + if err != nil { + _ = webview2runtime.Error(err.Error(), "Error") + return err + } + if !installedCorrectly { + err = webview2runtime.Error("The runtime failed to install correctly. Please try again.", "Error") + return err + } + return nil +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/windows/wv2runtime/error.go b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/windows/wv2runtime/error.go new file mode 100644 index 0000000..f03d8c8 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/windows/wv2runtime/error.go @@ -0,0 +1,13 @@ +// +build wv2runtime.error + +package wv2runtime + +import ( + "fmt" + "github.com/leaanthony/webview2runtime" +) + +func doInstallationStrategy(installStatus installationStatus) error { + _ = webview2runtime.Error("The WebView2 runtime is required to run this application. Please contact your system administrator.", "Error") + return fmt.Errorf("webview2 runtime not installed") +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/windows/wv2runtime/wv2runtime.go b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/windows/wv2runtime/wv2runtime.go new file mode 100644 index 0000000..992993a --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/windows/wv2runtime/wv2runtime.go @@ -0,0 +1,34 @@ +package wv2runtime + +import ( + "github.com/leaanthony/webview2runtime" +) + +const MinimumRuntimeVersion string = "91.0.864.48" + +type installationStatus int + +const ( + needsInstalling installationStatus = iota + needsUpdating + installed +) + +func Process() (*webview2runtime.Info, error) { + installStatus := needsInstalling + installedVersion := webview2runtime.GetInstalledVersion() + if installedVersion != nil { + installStatus = installed + updateRequired, err := installedVersion.IsOlderThan(MinimumRuntimeVersion) + if err != nil { + _ = webview2runtime.Error(err.Error(), "Error") + return installedVersion, err + } + // Installed and does not require updating + if !updateRequired { + return installedVersion, nil + } + + } + return installedVersion, doInstallationStrategy(installStatus) +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/windows_checkboxes.go b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/windows_checkboxes.go new file mode 100644 index 0000000..e76dfa8 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/windows_checkboxes.go @@ -0,0 +1,93 @@ +//+build windows + +package ffenestri + +import ( + "fmt" + "github.com/leaanthony/slicer" + "github.com/wailsapp/wails/v2/internal/menumanager" + "os" + "sync" + "text/tabwriter" +) + +/* --------------------------------------------------------------------------------- + +Checkbox Cache +-------------- +The checkbox cache keeps a list of IDs that are associated with the same checkbox menu item. +This can happen when a checkbox is used in an application menu and a tray menu, eg "start at login". +The cache is used to bulk toggle the menu items when one is clicked. + +*/ + +type CheckboxCache struct { + cache map[*menumanager.ProcessedMenu]map[wailsMenuItemID][]win32MenuItemID + mutex sync.RWMutex +} + +func NewCheckboxCache() *CheckboxCache { + return &CheckboxCache{ + cache: make(map[*menumanager.ProcessedMenu]map[wailsMenuItemID][]win32MenuItemID), + } +} + +func (c *CheckboxCache) Dump() { + // Start a new tabwriter + w := new(tabwriter.Writer) + w.Init(os.Stdout, 8, 8, 0, '\t', 0) + + println("---------------- Checkbox", c, "Dump ----------------") + for _, processedMenu := range c.cache { + println("Menu", processedMenu) + for wailsMenuItemID, win32menus := range processedMenu { + println(" WailsMenu: ", wailsMenuItemID) + menus := slicer.String() + for _, win32menu := range win32menus { + menus.Add(fmt.Sprintf("%v", win32menu)) + } + _, _ = fmt.Fprintf(w, "%s\t%s\n", wailsMenuItemID, menus.Join(", ")) + _ = w.Flush() + } + } +} + +func (c *CheckboxCache) addToCheckboxCache(menu *menumanager.ProcessedMenu, item wailsMenuItemID, menuID win32MenuItemID) { + + // Get map for menu + if c.cache[menu] == nil { + c.cache[menu] = make(map[wailsMenuItemID][]win32MenuItemID) + } + menuMap := c.cache[menu] + + // Ensure we have a slice + if menuMap[item] == nil { + menuMap[item] = []win32MenuItemID{} + } + + c.mutex.Lock() + menuMap[item] = append(menuMap[item], menuID) + c.mutex.Unlock() + +} + +func (c *CheckboxCache) removeMenuFromCheckboxCache(menu *menumanager.ProcessedMenu) { + c.mutex.Lock() + delete(c.cache, menu) + c.mutex.Unlock() +} + +// win32MenuIDsForWailsMenuID returns all win32menuids that are used for a wails menu item id across +// all menus +func (c *CheckboxCache) win32MenuIDsForWailsMenuID(item wailsMenuItemID) []win32MenuItemID { + c.mutex.Lock() + result := []win32MenuItemID{} + for _, menu := range c.cache { + ids := menu[item] + if ids != nil { + result = append(result, ids...) + } + } + c.mutex.Unlock() + return result +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/windows_errorhandler_debug.go b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/windows_errorhandler_debug.go new file mode 100644 index 0000000..5de8758 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/windows_errorhandler_debug.go @@ -0,0 +1,28 @@ +//+build windows,debug + +package ffenestri + +import ( + "fmt" + "github.com/ztrue/tracerr" + "runtime" + "strings" +) + +func wall(err error, inputs ...interface{}) error { + if err == nil { + return nil + } + pc, _, _, _ := runtime.Caller(1) + funcName := runtime.FuncForPC(pc).Name() + splitName := strings.Split(funcName, ".") + message := "[" + splitName[len(splitName)-1] + "]" + if len(inputs) > 0 { + params := []string{} + for _, param := range inputs { + params = append(params, fmt.Sprintf("%v", param)) + } + message += "(" + strings.Join(params, " ") + ")" + } + return tracerr.Errorf(message) +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/windows_errorhandler_production.go b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/windows_errorhandler_production.go new file mode 100644 index 0000000..20c9dc9 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/windows_errorhandler_production.go @@ -0,0 +1,47 @@ +// +build windows,!debug + +package ffenestri + +import "C" +import ( + "fmt" + "golang.org/x/sys/windows" + "log" + "os" + "runtime" + "strings" + "syscall" +) + +func wall(err error, inputs ...interface{}) error { + if err == nil { + return nil + } + pc, _, _, _ := runtime.Caller(1) + funcName := runtime.FuncForPC(pc).Name() + splitName := strings.Split(funcName, ".") + message := "[" + splitName[len(splitName)-1] + "]" + if len(inputs) > 0 { + params := []string{} + for _, param := range inputs { + params = append(params, fmt.Sprintf("%v", param)) + } + message += "(" + strings.Join(params, " ") + ")" + } + + title, err := syscall.UTF16PtrFromString("Fatal Error") + if err != nil { + log.Fatal(err) + } + + text, err := syscall.UTF16PtrFromString("There has been a fatal error. Details:\n" + message) + if err != nil { + log.Fatal(err) + } + + var flags uint32 = windows.MB_ICONERROR | windows.MB_OK + + _, err = windows.MessageBox(0, text, title, flags|windows.MB_SYSTEMMODAL) + os.Exit(1) + return err +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/windows_menu.go b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/windows_menu.go new file mode 100644 index 0000000..418e792 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/windows_menu.go @@ -0,0 +1,191 @@ +//+build windows + +package ffenestri + +import ( + "github.com/wailsapp/wails/v2/internal/menumanager" + "github.com/wailsapp/wails/v2/pkg/menu" +) + +//-------------------- Types ------------------------ + +type win32MenuItemID uint32 +type win32Menu uintptr +type win32Window uintptr +type wailsMenuItemID string // The internal menu ID + +type Menu struct { + wailsMenu *menumanager.WailsMenu + menu win32Menu + menuType menuType + + // A list of all checkbox and radio menuitems we + // create for this menu + checkboxes []win32MenuItemID + radioboxes []win32MenuItemID + initiallySelectedRadioItems []win32MenuItemID +} + +func createMenu(wailsMenu *menumanager.WailsMenu, menuType menuType) (*Menu, error) { + + mainMenu, err := createWin32Menu() + if err != nil { + return nil, err + } + + result := &Menu{ + wailsMenu: wailsMenu, + menu: mainMenu, + menuType: menuType, + } + + // Process top level menus + for _, toplevelmenu := range applicationMenu.Menu.Items { + err := result.processMenuItem(result.menu, toplevelmenu) + if err != nil { + return nil, err + } + } + + err = result.processRadioGroups() + if err != nil { + return nil, err + } + + return result, nil +} + +func (m *Menu) processMenuItem(parent win32Menu, menuItem *menumanager.ProcessedMenuItem) error { + + // Ignore hidden items + if menuItem.Hidden { + return nil + } + + // Calculate the flags for this menu item + flags := uintptr(calculateFlags(menuItem)) + + switch menuItem.Type { + case menu.SubmenuType: + submenu, err := createWin32PopupMenu() + if err != nil { + return err + } + for _, submenuItem := range menuItem.SubMenu.Items { + err = m.processMenuItem(submenu, submenuItem) + if err != nil { + return err + } + } + err = appendWin32MenuItem(parent, flags, uintptr(submenu), menuItem.Label) + if err != nil { + return err + } + case menu.TextType, menu.CheckboxType, menu.RadioType: + win32ID := addMenuCacheEntry(parent, m.menuType, menuItem, m.wailsMenu.Menu) + //label := fmt.Sprintf("%s (%d)", menuItem.Label, win32ID) + label := menuItem.Label + err := appendWin32MenuItem(parent, flags, uintptr(win32ID), label) + if err != nil { + return err + } + if menuItem.Type == menu.CheckboxType { + // We need to maintain a list of this menu's checkboxes + m.checkboxes = append(m.checkboxes, win32ID) + globalCheckboxCache.addToCheckboxCache(m.wailsMenu.Menu, wailsMenuItemID(menuItem.ID), win32ID) + } + if menuItem.Type == menu.RadioType { + // We need to maintain a list of this menu's radioitems + m.radioboxes = append(m.radioboxes, win32ID) + globalRadioGroupMap.addRadioGroupMapping(m.wailsMenu.Menu, wailsMenuItemID(menuItem.ID), win32ID) + if menuItem.Checked { + m.initiallySelectedRadioItems = append(m.initiallySelectedRadioItems, win32ID) + } + } + case menu.SeparatorType: + err := appendWin32MenuItem(parent, flags, 0, "") + if err != nil { + return err + } + } + return nil +} + +func (m *Menu) processRadioGroups() error { + + for _, rg := range applicationMenu.RadioGroups { + startWailsMenuID := wailsMenuItemID(rg.Members[0]) + endWailsMenuID := wailsMenuItemID(rg.Members[len(rg.Members)-1]) + + startIDs := globalRadioGroupMap.getRadioGroupMapping(startWailsMenuID) + endIDs := globalRadioGroupMap.getRadioGroupMapping(endWailsMenuID) + + var radioGroupMaps = []*radioGroupStartEnd{} + for index := range startIDs { + startID := startIDs[index] + endID := endIDs[index] + thisRadioGroup := &radioGroupStartEnd{ + startID: startID, + endID: endID, + } + radioGroupMaps = append(radioGroupMaps, thisRadioGroup) + } + + // Set this for each member + for _, member := range rg.Members { + id := wailsMenuItemID(member) + globalRadioGroupCache.addToRadioGroupCache(m.wailsMenu.Menu, id, radioGroupMaps) + } + } + + // Enable all initially checked radio items + for _, win32MenuID := range m.initiallySelectedRadioItems { + menuItemDetails := getMenuCacheEntry(win32MenuID) + wailsMenuID := wailsMenuItemID(menuItemDetails.item.ID) + err := selectRadioItemFromWailsMenuID(wailsMenuID, win32MenuID) + if err != nil { + return err + } + } + + return nil +} + +func (m *Menu) Destroy() error { + + // Release the MenuIDs + releaseMenuIDsForProcessedMenu(m.wailsMenu.Menu) + + // Unload this menu's checkboxes from the cache + globalCheckboxCache.removeMenuFromCheckboxCache(m.wailsMenu.Menu) + + // Unload this menu's radio groups from the cache + globalRadioGroupCache.removeMenuFromRadioBoxCache(m.wailsMenu.Menu) + + globalRadioGroupMap.removeMenuFromRadioGroupMapping(m.wailsMenu.Menu) + + // Delete menu + return destroyWin32Menu(m.menu) +} + +var flagMap = map[menu.Type]uint32{ + menu.TextType: MF_STRING, + menu.SeparatorType: MF_SEPARATOR, + menu.SubmenuType: MF_STRING | MF_POPUP, + menu.CheckboxType: MF_STRING, + menu.RadioType: MF_STRING, +} + +func calculateFlags(menuItem *menumanager.ProcessedMenuItem) uint32 { + result := flagMap[menuItem.Type] + + if menuItem.Disabled { + result |= MF_DISABLED + } + + if menuItem.Type == menu.CheckboxType && menuItem.Checked { + result |= MF_CHECKED + } + + return result +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/windows_menu_cache.go b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/windows_menu_cache.go new file mode 100644 index 0000000..5b6762d --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/windows_menu_cache.go @@ -0,0 +1,74 @@ +//+build windows + +package ffenestri + +import ( + "github.com/leaanthony/idgen" + "github.com/wailsapp/wails/v2/internal/menumanager" + "sync" +) + +/** + +MenuCache +--------- +When windows calls back to Go (when an item is clicked), we need to +be able to retrieve information about the menu item: + - The menu that the menuitem is part of (parent) + - The original processed menu item + - The type of the menu (application, context or tray) + +This cache is built up when a menu is created. + +*/ + +// TODO: Make this like the other caches + +type menuCacheEntry struct { + parent win32Menu + menuType menuType + item *menumanager.ProcessedMenuItem + processedMenu *menumanager.ProcessedMenu +} + +var idGenerator = idgen.New() + +var menuCache = map[win32MenuItemID]*menuCacheEntry{} +var menuCacheLock sync.RWMutex +var wailsMenuIDtoWin32IDMap = map[wailsMenuItemID]win32MenuItemID{} + +// This releases the menuIDs back to the id generator +var winIDsOwnedByProcessedMenu = map[*menumanager.ProcessedMenu][]win32MenuItemID{} + +func releaseMenuIDsForProcessedMenu(processedMenu *menumanager.ProcessedMenu) { + for _, menuID := range winIDsOwnedByProcessedMenu[processedMenu] { + idGenerator.ReleaseID(uint(menuID)) + } + delete(winIDsOwnedByProcessedMenu, processedMenu) +} + +func addMenuCacheEntry(parent win32Menu, typ menuType, wailsMenuItem *menumanager.ProcessedMenuItem, processedMenu *menumanager.ProcessedMenu) win32MenuItemID { + menuCacheLock.Lock() + defer menuCacheLock.Unlock() + id, err := idGenerator.NewID() + checkFatal(err) + menuID := win32MenuItemID(id) + menuCache[menuID] = &menuCacheEntry{ + parent: parent, + menuType: typ, + item: wailsMenuItem, + processedMenu: processedMenu, + } + // save the mapping + wailsMenuIDtoWin32IDMap[wailsMenuItemID(wailsMenuItem.ID)] = menuID + // keep track of menuids owned by this menu (so we can release the ids) + winIDsOwnedByProcessedMenu[processedMenu] = append(winIDsOwnedByProcessedMenu[processedMenu], menuID) + return menuID + +} + +func getMenuCacheEntry(id win32MenuItemID) *menuCacheEntry { + menuCacheLock.Lock() + defer menuCacheLock.Unlock() + return menuCache[id] +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/windows_radiogroup.go b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/windows_radiogroup.go new file mode 100644 index 0000000..3f3d349 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/windows_radiogroup.go @@ -0,0 +1,194 @@ +//+build windows + +package ffenestri + +import ( + "fmt" + "github.com/leaanthony/slicer" + "os" + "sync" + "text/tabwriter" + + "github.com/wailsapp/wails/v2/internal/menumanager" +) + +/* --------------------------------------------------------------------------------- + +Radio Groups +------------ +Radio groups are stored by the ProcessedMenu as a list of menu ids. +Windows only cares about the start and end ids of the group so we +preprocess the radio groups and store this data in a radioGroupMap. +When a radio button is clicked, we use the menu id to read in the +radio group data and call CheckMenuRadioItem to update the group. + +*/ + +type radioGroupStartEnd struct { + startID win32MenuItemID + endID win32MenuItemID +} + +type RadioGroupCache struct { + cache map[*menumanager.ProcessedMenu]map[wailsMenuItemID][]*radioGroupStartEnd + mutex sync.RWMutex +} + +func NewRadioGroupCache() *RadioGroupCache { + return &RadioGroupCache{ + cache: make(map[*menumanager.ProcessedMenu]map[wailsMenuItemID][]*radioGroupStartEnd), + } +} + +func (c *RadioGroupCache) Dump() { + // Start a new tabwriter + w := new(tabwriter.Writer) + w.Init(os.Stdout, 8, 8, 0, '\t', 0) + + println("---------------- RadioGroupCache", c, "Dump ----------------") + for menu, processedMenu := range c.cache { + println("Menu", menu) + _, _ = fmt.Fprintf(w, "Wails ID \tWindows ID Pairs\n") + for wailsMenuItemID, radioGroupStartEnd := range processedMenu { + menus := slicer.String() + for _, se := range radioGroupStartEnd { + menus.Add(fmt.Sprintf("[%d -> %d]", se.startID, se.endID)) + } + _, _ = fmt.Fprintf(w, "%s\t%s\n", wailsMenuItemID, menus.Join(", ")) + _ = w.Flush() + } + } +} + +func (c *RadioGroupCache) addToRadioGroupCache(menu *menumanager.ProcessedMenu, item wailsMenuItemID, radioGroupMaps []*radioGroupStartEnd) { + + c.mutex.Lock() + + // Get map for menu + if c.cache[menu] == nil { + c.cache[menu] = make(map[wailsMenuItemID][]*radioGroupStartEnd) + } + menuMap := c.cache[menu] + + // Ensure we have a slice + if menuMap[item] == nil { + menuMap[item] = []*radioGroupStartEnd{} + } + + menuMap[item] = radioGroupMaps + + c.mutex.Unlock() + +} + +func (c *RadioGroupCache) removeMenuFromRadioBoxCache(menu *menumanager.ProcessedMenu) { + c.mutex.Lock() + delete(c.cache, menu) + c.mutex.Unlock() +} + +func (c *RadioGroupCache) getRadioGroupMappings(wailsMenuID wailsMenuItemID) []*radioGroupStartEnd { + c.mutex.Lock() + result := []*radioGroupStartEnd{} + for _, menugroups := range c.cache { + groups := menugroups[wailsMenuID] + if groups != nil { + result = append(result, groups...) + } + } + c.mutex.Unlock() + return result +} + +type RadioGroupMap struct { + cache map[*menumanager.ProcessedMenu]map[wailsMenuItemID][]win32MenuItemID + mutex sync.RWMutex +} + +func NewRadioGroupMap() *RadioGroupMap { + return &RadioGroupMap{ + cache: make(map[*menumanager.ProcessedMenu]map[wailsMenuItemID][]win32MenuItemID), + } +} + +func (c *RadioGroupMap) Dump() { + // Start a new tabwriter + w := new(tabwriter.Writer) + w.Init(os.Stdout, 8, 8, 0, '\t', 0) + + println("---------------- RadioGroupMap", c, "Dump ----------------") + for _, processedMenu := range c.cache { + _, _ = fmt.Fprintf(w, "Menu\tWails ID \tWindows IDs\n") + for wailsMenuItemID, win32menus := range processedMenu { + menus := slicer.String() + for _, win32menu := range win32menus { + menus.Add(fmt.Sprintf("%v", win32menu)) + } + _, _ = fmt.Fprintf(w, "%p\t%s\t%s\n", processedMenu, wailsMenuItemID, menus.Join(", ")) + _ = w.Flush() + } + } +} + +func (m *RadioGroupMap) addRadioGroupMapping(menu *menumanager.ProcessedMenu, item wailsMenuItemID, win32ID win32MenuItemID) { + m.mutex.Lock() + + // Get map for menu + if m.cache[menu] == nil { + m.cache[menu] = make(map[wailsMenuItemID][]win32MenuItemID) + } + menuMap := m.cache[menu] + + // Ensure we have a slice + if menuMap[item] == nil { + menuMap[item] = []win32MenuItemID{} + } + + menuMap[item] = append(menuMap[item], win32ID) + + m.mutex.Unlock() +} + +func (m *RadioGroupMap) removeMenuFromRadioGroupMapping(menu *menumanager.ProcessedMenu) { + m.mutex.Lock() + delete(m.cache, menu) + m.mutex.Unlock() +} + +func (m *RadioGroupMap) getRadioGroupMapping(wailsMenuID wailsMenuItemID) []win32MenuItemID { + m.mutex.Lock() + result := []win32MenuItemID{} + for _, menuids := range m.cache { + ids := menuids[wailsMenuID] + if ids != nil { + result = append(result, ids...) + } + } + m.mutex.Unlock() + return result +} + +func selectRadioItemFromWailsMenuID(wailsMenuID wailsMenuItemID, win32MenuID win32MenuItemID) error { + radioItemGroups := globalRadioGroupCache.getRadioGroupMappings(wailsMenuID) + // Figure out offset into group + var offset win32MenuItemID = 0 + for _, radioItemGroup := range radioItemGroups { + if win32MenuID >= radioItemGroup.startID && win32MenuID <= radioItemGroup.endID { + offset = win32MenuID - radioItemGroup.startID + break + } + } + for _, radioItemGroup := range radioItemGroups { + selectedMenuID := radioItemGroup.startID + offset + menuItemDetails := getMenuCacheEntry(selectedMenuID) + if menuItemDetails != nil { + if menuItemDetails.parent != 0 { + err := selectRadioItem(selectedMenuID, radioItemGroup.startID, radioItemGroup.endID, menuItemDetails.parent) + if err != nil { + return err + } + } + } + } + return nil +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/windows_win32.go b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/windows_win32.go new file mode 100644 index 0000000..99f5995 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/windows_win32.go @@ -0,0 +1,129 @@ +//+build windows + +package ffenestri + +import ( + "unsafe" + + "github.com/wailsapp/wails/v2/internal/menumanager" + "golang.org/x/sys/windows" +) + +var ( + // DLL stuff + user32 = windows.NewLazySystemDLL("User32.dll") + win32CreateMenu = user32.NewProc("CreateMenu") + win32DestroyMenu = user32.NewProc("DestroyMenu") + win32CreatePopupMenu = user32.NewProc("CreatePopupMenu") + win32AppendMenuW = user32.NewProc("AppendMenuW") + win32SetMenu = user32.NewProc("SetMenu") + win32CheckMenuItem = user32.NewProc("CheckMenuItem") + win32GetMenuState = user32.NewProc("GetMenuState") + win32CheckMenuRadioItem = user32.NewProc("CheckMenuRadioItem") + applicationMenu *menumanager.WailsMenu + menuManager *menumanager.Manager +) + +const MF_BITMAP uint32 = 0x00000004 +const MF_CHECKED uint32 = 0x00000008 +const MF_DISABLED uint32 = 0x00000002 +const MF_ENABLED uint32 = 0x00000000 +const MF_GRAYED uint32 = 0x00000001 +const MF_MENUBARBREAK uint32 = 0x00000020 +const MF_MENUBREAK uint32 = 0x00000040 +const MF_OWNERDRAW uint32 = 0x00000100 +const MF_POPUP uint32 = 0x00000010 +const MF_SEPARATOR uint32 = 0x00000800 +const MF_STRING uint32 = 0x00000000 +const MF_UNCHECKED uint32 = 0x00000000 +const MF_BYCOMMAND uint32 = 0x00000000 +const MF_BYPOSITION uint32 = 0x00000400 + +const WM_SIZE = 5 +const WM_GETMINMAXINFO = 36 + +type Win32Rect struct { + Left int32 + Top int32 + Right int32 + Bottom int32 +} + +// ------------------- win32 calls ----------------------- + +func createWin32Menu() (win32Menu, error) { + res, _, err := win32CreateMenu.Call() + if res == 0 { + return 0, wall(err) + } + return win32Menu(res), nil +} + +func destroyWin32Menu(menu win32Menu) error { + res, _, err := win32DestroyMenu.Call(uintptr(menu)) + if res == 0 { + return wall(err, "Menu:", menu) + } + return nil +} + +func createWin32PopupMenu() (win32Menu, error) { + res, _, err := win32CreatePopupMenu.Call() + if res == 0 { + return 0, wall(err) + } + return win32Menu(res), nil +} + +func appendWin32MenuItem(menu win32Menu, flags uintptr, submenuOrID uintptr, label string) error { + menuText, err := windows.UTF16PtrFromString(label) + if err != nil { + return err + } + res, _, err := win32AppendMenuW.Call( + uintptr(menu), + flags, + submenuOrID, + uintptr(unsafe.Pointer(menuText)), + ) + if res == 0 { + return wall(err, "Menu", menu, "Flags", flags, "submenuOrID", submenuOrID, "label", label) + } + return nil +} + +func setWindowMenu(window win32Window, menu win32Menu) error { + res, _, err := win32SetMenu.Call(uintptr(window), uintptr(menu)) + if res == 0 { + return wall(err, "window", window, "menu", menu) + } + return nil +} + +func selectRadioItem(selectedMenuID, startMenuItemID, endMenuItemID win32MenuItemID, parent win32Menu) error { + res, _, err := win32CheckMenuRadioItem.Call(uintptr(parent), uintptr(startMenuItemID), uintptr(endMenuItemID), uintptr(selectedMenuID), uintptr(MF_BYCOMMAND)) + if int(res) == 0 { + return wall(err, selectedMenuID, startMenuItemID, endMenuItemID, parent) + } + return nil +} + +// +//func getWindowRect(window win32Window) (*Win32Rect, error) { +// var windowRect Win32Rect +// res, _, err := win32GetWindowRect.Call(uintptr(window), uintptr(unsafe.Pointer(&windowRect))) +// if res == 0 { +// return nil, err +// } +// return &windowRect, nil +//} +// +//func getClientRect(window win32Window) (*Win32Rect, error) { +// var clientRect Win32Rect +// res, _, err := win32GetClientRect.Call(uintptr(window), uintptr(unsafe.Pointer(&clientRect))) +// if res == 0 { +// return nil, err +// } +// return &clientRect, nil +//} +// diff --git a/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/wv2ComHandler_windows.h b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/wv2ComHandler_windows.h new file mode 100644 index 0000000..e270d55 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/ffenestri/wv2ComHandler_windows.h @@ -0,0 +1,137 @@ + +#ifndef WV2COMHANDLER_H +#define WV2COMHANDLER_H + +#include "ffenestri_windows.h" +#include "windows/WebView2.h" + +#include +#include + +class wv2ComHandler + : public ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandler, + public ICoreWebView2CreateCoreWebView2ControllerCompletedHandler, + public ICoreWebView2WebMessageReceivedEventHandler, + public ICoreWebView2PermissionRequestedEventHandler, + public ICoreWebView2AcceleratorKeyPressedEventHandler +{ + + struct Application *app; + HWND window; + messageCallback mcb; + comHandlerCallback cb; + + public: + wv2ComHandler(struct Application *app, HWND window, messageCallback mcb, comHandlerCallback cb) { + this->app = app; + this->window = window; + this->mcb = mcb; + this->cb = cb; + } + ULONG STDMETHODCALLTYPE AddRef() { return 1; } + ULONG STDMETHODCALLTYPE Release() { return 1; } + HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, LPVOID *ppv) { + return S_OK; + } + HRESULT STDMETHODCALLTYPE Invoke(HRESULT res, + ICoreWebView2Environment *env) { + env->CreateCoreWebView2Controller(window, this); + return S_OK; + } + HRESULT STDMETHODCALLTYPE Invoke(HRESULT res, + ICoreWebView2Controller *controller) { + controller->AddRef(); + + ICoreWebView2 *webview; + ::EventRegistrationToken token; + controller->get_CoreWebView2(&webview); + controller->add_AcceleratorKeyPressed(this, &token); + webview->add_WebMessageReceived(this, &token); + webview->add_PermissionRequested(this, &token); + + cb(controller); + return S_OK; + } + + // This is our keyboard callback method + HRESULT STDMETHODCALLTYPE Invoke(ICoreWebView2Controller *controller, ICoreWebView2AcceleratorKeyPressedEventArgs * args) { + COREWEBVIEW2_KEY_EVENT_KIND kind; + args->get_KeyEventKind(&kind); + if (kind == COREWEBVIEW2_KEY_EVENT_KIND_KEY_DOWN || + kind == COREWEBVIEW2_KEY_EVENT_KIND_SYSTEM_KEY_DOWN) + { +// UINT key; +// args->get_VirtualKey(&key); +// printf("Got key: %d\n", key); + args->put_Handled(TRUE); + // Check if the key is one we want to handle. +// if (std::function action = +// m_appWindow->GetAcceleratorKeyFunction(key)) +// { +// // Keep the browser from handling this key, whether it's autorepeated or +// // not. +// CHECK_FAILURE(args->put_Handled(TRUE)); +// +// // Filter out autorepeated keys. +// COREWEBVIEW2_PHYSICAL_KEY_STATUS status; +// CHECK_FAILURE(args->get_PhysicalKeyStatus(&status)); +// if (!status.WasKeyDown) +// { +// // Perform the action asynchronously to avoid blocking the +// // browser process's event queue. +// m_appWindow->RunAsync(action); +// } +// } + } + return S_OK; + } + + // This is called when JS posts a message back to webkit + HRESULT STDMETHODCALLTYPE Invoke( + ICoreWebView2 *sender, ICoreWebView2WebMessageReceivedEventArgs *args) { + LPWSTR message; + args->TryGetWebMessageAsString(&message); + if ( message == nullptr ) { + return S_OK; + } + const char *m = LPWSTRToCstr(message); + + // check for internal messages + if (strcmp(m, "completed") == 0) { + completed(app); + return S_OK; + } + else if (strcmp(m, "initialised") == 0) { + loadAssets(app); + return S_OK; + } + else if (strcmp(m, "wails-drag") == 0) { + // We don't drag in fullscreen mode + if (!app->isFullscreen) { + ReleaseCapture(); + SendMessage(this->window, WM_NCLBUTTONDOWN, HTCAPTION, 0); + } + return S_OK; + } + else { + messageFromWindowCallback(m); + } + delete[] m; + return S_OK; + } + HRESULT STDMETHODCALLTYPE + Invoke(ICoreWebView2 *sender, + ICoreWebView2PermissionRequestedEventArgs *args) { + printf("DDDDDDDDDDDD\n"); + + COREWEBVIEW2_PERMISSION_KIND kind; + args->get_PermissionKind(&kind); + if (kind == COREWEBVIEW2_PERMISSION_KIND_CLIPBOARD_READ) { + args->put_State(COREWEBVIEW2_PERMISSION_STATE_ALLOW); + } + return S_OK; + } + +}; + +#endif \ No newline at end of file diff --git a/vendor/github.com/wailsapp/wails/v2/internal/fs/fs.go b/vendor/github.com/wailsapp/wails/v2/internal/fs/fs.go new file mode 100644 index 0000000..9bb1922 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/fs/fs.go @@ -0,0 +1,397 @@ +package fs + +import ( + "crypto/md5" + "fmt" + "io" + "io/ioutil" + "os" + "path/filepath" + "runtime" + "unsafe" + + "github.com/leaanthony/slicer" +) + +// LocalDirectory gets the caller's file directory +// Equivalent to node's __DIRNAME +func LocalDirectory() string { + _, thisFile, _, _ := runtime.Caller(1) + return filepath.Dir(thisFile) +} + +// RelativeToCwd returns an absolute path based on the cwd +// and the given relative path +func RelativeToCwd(relativePath string) (string, error) { + cwd, err := os.Getwd() + if err != nil { + return "", err + } + + return filepath.Join(cwd, relativePath), nil +} + +// Mkdir will create the given directory +func Mkdir(dirname string) error { + return os.Mkdir(dirname, 0755) +} + +// MkDirs creates the given nested directories. +// Returns error on failure +func MkDirs(fullPath string, mode ...os.FileMode) error { + var perms os.FileMode + perms = 0755 + if len(mode) == 1 { + perms = mode[0] + } + return os.MkdirAll(fullPath, perms) +} + +// MoveFile attempts to move the source file to the target +// Target is a fully qualified path to a file *name*, not a +// directory +func MoveFile(source string, target string) error { + return os.Rename(source, target) +} + +// DeleteFile will delete the given file +func DeleteFile(filename string) error { + return os.Remove(filename) +} + +// CopyFile from source to target +func CopyFile(source string, target string) error { + s, err := os.Open(source) + if err != nil { + return err + } + defer s.Close() + d, err := os.Create(target) + if err != nil { + return err + } + if _, err := io.Copy(d, s); err != nil { + d.Close() + return err + } + return d.Close() +} + +// DirExists - Returns true if the given path resolves to a directory on the filesystem +func DirExists(path string) bool { + fi, err := os.Lstat(path) + if err != nil { + return false + } + + return fi.Mode().IsDir() +} + +// FileExists returns a boolean value indicating whether +// the given file exists +func FileExists(path string) bool { + fi, err := os.Lstat(path) + if err != nil { + return false + } + + return fi.Mode().IsRegular() +} + +// RelativePath returns a qualified path created by joining the +// directory of the calling file and the given relative path. +// +// Example: RelativePath("..") in *this* file would give you '/path/to/wails2/v2/internal` +func RelativePath(relativepath string, optionalpaths ...string) string { + _, thisFile, _, _ := runtime.Caller(1) + localDir := filepath.Dir(thisFile) + + // If we have optional paths, join them to the relativepath + if len(optionalpaths) > 0 { + paths := []string{relativepath} + paths = append(paths, optionalpaths...) + relativepath = filepath.Join(paths...) + } + result, err := filepath.Abs(filepath.Join(localDir, relativepath)) + if err != nil { + // I'm allowing this for 1 reason only: It's fatal if the path + // supplied is wrong as it's only used internally in Wails. If we get + // that path wrong, we should know about it immediately. The other reason is + // that it cuts down a ton of unnecassary error handling. + panic(err) + } + return result +} + +// MustLoadString attempts to load a string and will abort with a fatal message if +// something goes wrong +func MustLoadString(filename string) string { + data, err := ioutil.ReadFile(filename) + if err != nil { + fmt.Printf("FATAL: Unable to load file '%s': %s\n", filename, err.Error()) + os.Exit(1) + } + return *(*string)(unsafe.Pointer(&data)) +} + +// MD5File returns the md5sum of the given file +func MD5File(filename string) (string, error) { + f, err := os.Open(filename) + if err != nil { + return "", err + } + defer f.Close() + + h := md5.New() + if _, err := io.Copy(h, f); err != nil { + return "", err + } + + return fmt.Sprintf("%x", h.Sum(nil)), nil +} + +// MustMD5File will call MD5File and abort the program on error +func MustMD5File(filename string) string { + result, err := MD5File(filename) + if err != nil { + println("FATAL: Unable to MD5Sum file:", err.Error()) + os.Exit(1) + } + return result +} + +// MustWriteString will attempt to write the given data to the given filename +// It will abort the program in the event of a failure +func MustWriteString(filename string, data string) { + err := ioutil.WriteFile(filename, []byte(data), 0755) + if err != nil { + fatal("Unable to write file", filename, ":", err.Error()) + os.Exit(1) + } +} + +// fatal will print the optional messages and die +func fatal(message ...string) { + if len(message) > 0 { + print("FATAL:") + for text := range message { + print(text) + } + } + os.Exit(1) +} + +// GetSubdirectories returns a list of subdirectories for the given root directory +func GetSubdirectories(rootDir string) (*slicer.StringSlicer, error) { + var result slicer.StringSlicer + + // Iterate root dir + err := filepath.Walk(rootDir, func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + // If we have a directory, save it + if info.IsDir() { + result.Add(path) + } + return nil + }) + return &result, err +} + +func DirIsEmpty(dir string) (bool, error) { + + // CREDIT: https://stackoverflow.com/a/30708914/8325411 + f, err := os.Open(dir) + if err != nil { + return false, err + } + defer f.Close() + + _, err = f.Readdirnames(1) // Or f.Readdir(1) + if err == io.EOF { + return true, nil + } + return false, err // Either not empty or error, suits both cases +} + +// CopyDir recursively copies a directory tree, attempting to preserve permissions. +// Source directory must exist, destination directory must *not* exist. +// Symlinks are ignored and skipped. +// Credit: https://gist.github.com/r0l1/92462b38df26839a3ca324697c8cba04 +func CopyDir(src string, dst string) (err error) { + src = filepath.Clean(src) + dst = filepath.Clean(dst) + + si, err := os.Stat(src) + if err != nil { + return err + } + if !si.IsDir() { + return fmt.Errorf("source is not a directory") + } + + _, err = os.Stat(dst) + if err != nil && !os.IsNotExist(err) { + return + } + if err == nil { + return fmt.Errorf("destination already exists") + } + + err = MkDirs(dst) + if err != nil { + return + } + + entries, err := ioutil.ReadDir(src) + if err != nil { + return + } + + for _, entry := range entries { + srcPath := filepath.Join(src, entry.Name()) + dstPath := filepath.Join(dst, entry.Name()) + + if entry.IsDir() { + err = CopyDir(srcPath, dstPath) + if err != nil { + return + } + } else { + // Skip symlinks. + if entry.Mode()&os.ModeSymlink != 0 { + continue + } + + err = CopyFile(srcPath, dstPath) + if err != nil { + return + } + } + } + + return +} + +// CopyDirExtended recursively copies a directory tree, attempting to preserve permissions. +// Source directory must exist, destination directory must *not* exist. It ignores any files or +// directories that are given through the ignore parameter. +// Symlinks are ignored and skipped. +// Credit: https://gist.github.com/r0l1/92462b38df26839a3ca324697c8cba04 +func CopyDirExtended(src string, dst string, ignore []string) (err error) { + + ignoreList := slicer.String(ignore) + src = filepath.Clean(src) + dst = filepath.Clean(dst) + + si, err := os.Stat(src) + if err != nil { + return err + } + if !si.IsDir() { + return fmt.Errorf("source is not a directory") + } + + _, err = os.Stat(dst) + if err != nil && !os.IsNotExist(err) { + return + } + if err == nil { + return fmt.Errorf("destination already exists") + } + + err = MkDirs(dst) + if err != nil { + return + } + + entries, err := ioutil.ReadDir(src) + if err != nil { + return + } + + for _, entry := range entries { + if ignoreList.Contains(entry.Name()) { + continue + } + srcPath := filepath.Join(src, entry.Name()) + dstPath := filepath.Join(dst, entry.Name()) + + if entry.IsDir() { + err = CopyDir(srcPath, dstPath) + if err != nil { + return + } + } else { + // Skip symlinks. + if entry.Mode()&os.ModeSymlink != 0 { + continue + } + + err = CopyFile(srcPath, dstPath) + if err != nil { + return + } + } + } + + return +} + +// MoveDirExtended recursively moves a directory tree, attempting to preserve permissions. +// Source directory must exist, destination directory must *not* exist. It ignores any files or +// directories that are given through the ignore parameter. +// Symlinks are ignored and skipped. +func MoveDirExtended(src string, dst string, ignore []string) (err error) { + + ignoreList := slicer.String(ignore) + src = filepath.Clean(src) + dst = filepath.Clean(dst) + + si, err := os.Stat(src) + if err != nil { + return err + } + if !si.IsDir() { + return fmt.Errorf("source is not a directory") + } + + _, err = os.Stat(dst) + if err != nil && !os.IsNotExist(err) { + return + } + if err == nil { + return fmt.Errorf("destination already exists") + } + + err = MkDirs(dst) + if err != nil { + return + } + + entries, err := ioutil.ReadDir(src) + if err != nil { + return + } + + for _, entry := range entries { + if ignoreList.Contains(entry.Name()) { + continue + } + srcPath := filepath.Join(src, entry.Name()) + dstPath := filepath.Join(dst, entry.Name()) + + // Skip symlinks. + if entry.Mode()&os.ModeSymlink != 0 { + continue + } + + err := os.Rename(srcPath, dstPath) + if err != nil { + return err + } + } + + return +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/logger/custom_logger.go b/vendor/github.com/wailsapp/wails/v2/internal/logger/custom_logger.go new file mode 100644 index 0000000..5e24aa0 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/logger/custom_logger.go @@ -0,0 +1,96 @@ +package logger + +import ( + "fmt" +) + +// CustomLogger defines what a user can do with a logger +type CustomLogger interface { + // Writeln writes directly to the output with no log level plus line ending + Writeln(message string) + + // Write writes directly to the output with no log level + Write(message string) + + // Trace level logging. Works like Sprintf. + Trace(format string, args ...interface{}) + + // Debug level logging. Works like Sprintf. + Debug(format string, args ...interface{}) + + // Info level logging. Works like Sprintf. + Info(format string, args ...interface{}) + + // Warning level logging. Works like Sprintf. + Warning(format string, args ...interface{}) + + // Error level logging. Works like Sprintf. + Error(format string, args ...interface{}) + + // Fatal level logging. Works like Sprintf. + Fatal(format string, args ...interface{}) +} + +// customLogger is a utlility to log messages to a number of destinations +type customLogger struct { + logger *Logger + name string +} + +// New creates a new customLogger. You may pass in a number of `io.Writer`s that +// are the targets for the logs +func newcustomLogger(logger *Logger, name string) *customLogger { + result := &customLogger{ + name: name, + logger: logger, + } + return result +} + +// Writeln writes directly to the output with no log level +// Appends a carriage return to the message +func (l *customLogger) Writeln(message string) { + l.logger.Writeln(message) +} + +// Write writes directly to the output with no log level +func (l *customLogger) Write(message string) { + l.logger.Write(message) +} + +// Trace level logging. Works like Sprintf. +func (l *customLogger) Trace(format string, args ...interface{}) { + format = fmt.Sprintf("%s | %s", l.name, format) + l.logger.Trace(format, args...) +} + +// Debug level logging. Works like Sprintf. +func (l *customLogger) Debug(format string, args ...interface{}) { + format = fmt.Sprintf("%s | %s", l.name, format) + l.logger.Debug(format, args...) +} + +// Info level logging. Works like Sprintf. +func (l *customLogger) Info(format string, args ...interface{}) { + format = fmt.Sprintf("%s | %s", l.name, format) + l.logger.Info(format, args...) +} + +// Warning level logging. Works like Sprintf. +func (l *customLogger) Warning(format string, args ...interface{}) { + format = fmt.Sprintf("%s | %s", l.name, format) + l.logger.Warning(format, args...) +} + +// Error level logging. Works like Sprintf. +func (l *customLogger) Error(format string, args ...interface{}) { + format = fmt.Sprintf("%s | %s", l.name, format) + l.logger.Error(format, args...) + +} + +// Fatal level logging. Works like Sprintf. +func (l *customLogger) Fatal(format string, args ...interface{}) { + format = fmt.Sprintf("%s | %s", l.name, format) + l.logger.Fatal(format, args...) +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/logger/default_logger.go b/vendor/github.com/wailsapp/wails/v2/internal/logger/default_logger.go new file mode 100644 index 0000000..d5e25f9 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/logger/default_logger.go @@ -0,0 +1,105 @@ +package logger + +import ( + "fmt" + "os" + + "github.com/wailsapp/wails/v2/pkg/logger" +) + +// LogLevel is an alias for the public LogLevel +type LogLevel = logger.LogLevel + +// Logger is a utlility to log messages to a number of destinations +type Logger struct { + output logger.Logger + logLevel LogLevel + showLevelInLog bool +} + +// New creates a new Logger. You may pass in a number of `io.Writer`s that +// are the targets for the logs +func New(output logger.Logger) *Logger { + result := &Logger{ + logLevel: logger.INFO, + showLevelInLog: true, + output: output, + } + return result +} + +// CustomLogger creates a new custom logger that prints out a name/id +// before the messages +func (l *Logger) CustomLogger(name string) CustomLogger { + return newcustomLogger(l, name) +} + +// HideLogLevel removes the loglevel text from the start of each logged line +func (l *Logger) HideLogLevel() { + l.showLevelInLog = true +} + +// SetLogLevel sets the minimum level of logs that will be output +func (l *Logger) SetLogLevel(level LogLevel) { + l.logLevel = level +} + +// Writeln writes directly to the output with no log level +// Appends a carriage return to the message +func (l *Logger) Writeln(message string) { + l.output.Print(message) +} + +// Write writes directly to the output with no log level +func (l *Logger) Write(message string) { + l.output.Print(message) +} + +// Print writes directly to the output with no log level +// Appends a carriage return to the message +func (l *Logger) Print(message string) { + l.Write(message) +} + +// Trace level logging. Works like Sprintf. +func (l *Logger) Trace(format string, args ...interface{}) { + if l.logLevel <= logger.TRACE { + l.output.Trace(fmt.Sprintf(format, args...)) + } +} + +// Debug level logging. Works like Sprintf. +func (l *Logger) Debug(format string, args ...interface{}) { + if l.logLevel <= logger.DEBUG { + l.output.Debug(fmt.Sprintf(format, args...)) + } +} + +// Info level logging. Works like Sprintf. +func (l *Logger) Info(format string, args ...interface{}) { + if l.logLevel <= logger.INFO { + l.output.Info(fmt.Sprintf(format, args...)) + } + +} + +// Warning level logging. Works like Sprintf. +func (l *Logger) Warning(format string, args ...interface{}) { + if l.logLevel <= logger.WARNING { + l.output.Warning(fmt.Sprintf(format, args...)) + } +} + +// Error level logging. Works like Sprintf. +func (l *Logger) Error(format string, args ...interface{}) { + if l.logLevel <= logger.ERROR { + l.output.Error(fmt.Sprintf(format, args...)) + } + +} + +// Fatal level logging. Works like Sprintf. +func (l *Logger) Fatal(format string, args ...interface{}) { + l.output.Fatal(fmt.Sprintf(format, args...)) + os.Exit(1) +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/menumanager/applicationmenu.go b/vendor/github.com/wailsapp/wails/v2/internal/menumanager/applicationmenu.go new file mode 100644 index 0000000..424834e --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/menumanager/applicationmenu.go @@ -0,0 +1,51 @@ +package menumanager + +import "github.com/wailsapp/wails/v2/pkg/menu" + +func (m *Manager) SetApplicationMenu(applicationMenu *menu.Menu) error { + + if applicationMenu == nil { + return nil + } + + m.applicationMenu = applicationMenu + + // Reset the menu map + m.applicationMenuItemMap = NewMenuItemMap() + + // Add the menu to the menu map + m.applicationMenuItemMap.AddMenu(applicationMenu) + + return m.processApplicationMenu() +} + +func (m *Manager) GetApplicationMenuJSON() string { + return m.applicationMenuJSON +} + +func (m *Manager) GetProcessedApplicationMenu() *WailsMenu { + return m.processedApplicationMenu +} + +// UpdateApplicationMenu reprocesses the application menu to pick up structure +// changes etc +// Returns the JSON representation of the updated menu +func (m *Manager) UpdateApplicationMenu() (string, error) { + m.applicationMenuItemMap = NewMenuItemMap() + m.applicationMenuItemMap.AddMenu(m.applicationMenu) + err := m.processApplicationMenu() + return m.applicationMenuJSON, err +} + +func (m *Manager) processApplicationMenu() error { + + // Process the menu + m.processedApplicationMenu = NewWailsMenu(m.applicationMenuItemMap, m.applicationMenu) + m.processRadioGroups(m.processedApplicationMenu, m.applicationMenuItemMap) + applicationMenuJSON, err := m.processedApplicationMenu.AsJSON() + if err != nil { + return err + } + m.applicationMenuJSON = applicationMenuJSON + return nil +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/menumanager/contextmenu.go b/vendor/github.com/wailsapp/wails/v2/internal/menumanager/contextmenu.go new file mode 100644 index 0000000..e07cc22 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/menumanager/contextmenu.go @@ -0,0 +1,60 @@ +package menumanager + +import ( + "encoding/json" + "fmt" + "github.com/wailsapp/wails/v2/pkg/menu" +) + +type ContextMenu struct { + ID string + ProcessedMenu *WailsMenu + menuItemMap *MenuItemMap + menu *menu.Menu +} + +func (t *ContextMenu) AsJSON() (string, error) { + data, err := json.Marshal(t) + if err != nil { + return "", err + } + return string(data), nil +} + +func NewContextMenu(contextMenu *menu.ContextMenu) *ContextMenu { + + result := &ContextMenu{ + ID: contextMenu.ID, + menu: contextMenu.Menu, + menuItemMap: NewMenuItemMap(), + } + + result.menuItemMap.AddMenu(contextMenu.Menu) + result.ProcessedMenu = NewWailsMenu(result.menuItemMap, result.menu) + + return result +} + +func (m *Manager) AddContextMenu(contextMenu *menu.ContextMenu) { + + newContextMenu := NewContextMenu(contextMenu) + + // Save the references + m.contextMenus[contextMenu.ID] = newContextMenu + m.contextMenuPointers[contextMenu] = contextMenu.ID +} + +func (m *Manager) UpdateContextMenu(contextMenu *menu.ContextMenu) (string, error) { + contextMenuID, contextMenuKnown := m.contextMenuPointers[contextMenu] + if !contextMenuKnown { + return "", fmt.Errorf("unknown Context Menu '%s'. Please add the context menu using AddContextMenu()", contextMenu.ID) + } + + // Create the updated context menu + updatedContextMenu := NewContextMenu(contextMenu) + + // Save the reference + m.contextMenus[contextMenuID] = updatedContextMenu + + return updatedContextMenu.AsJSON() +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/menumanager/menuitemmap.go b/vendor/github.com/wailsapp/wails/v2/internal/menumanager/menuitemmap.go new file mode 100644 index 0000000..790d5d0 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/menumanager/menuitemmap.go @@ -0,0 +1,75 @@ +package menumanager + +import ( + "fmt" + "github.com/wailsapp/wails/v2/pkg/menu" + "sync" +) + +// MenuItemMap holds a mapping between menuIDs and menu items +type MenuItemMap struct { + idToMenuItemMap map[string]*menu.MenuItem + menuItemToIDMap map[*menu.MenuItem]string + + // We use a simple counter to keep track of unique menu IDs + menuIDCounter int64 + menuIDCounterMutex sync.Mutex +} + +func NewMenuItemMap() *MenuItemMap { + result := &MenuItemMap{ + idToMenuItemMap: make(map[string]*menu.MenuItem), + menuItemToIDMap: make(map[*menu.MenuItem]string), + } + + return result +} + +func (m *MenuItemMap) AddMenu(menu *menu.Menu) { + if menu == nil { + return + } + for _, item := range menu.Items { + m.processMenuItem(item) + } +} + +func (m *MenuItemMap) Dump() { + println("idToMenuItemMap:") + for key, value := range m.idToMenuItemMap { + fmt.Printf(" %s\t%p\n", key, value) + } + println("\nmenuItemToIDMap") + for key, value := range m.menuItemToIDMap { + fmt.Printf(" %p\t%s\n", key, value) + } +} + +// GenerateMenuID returns a unique string ID for a menu item +func (m *MenuItemMap) generateMenuID() string { + m.menuIDCounterMutex.Lock() + result := fmt.Sprintf("%d", m.menuIDCounter) + m.menuIDCounter++ + m.menuIDCounterMutex.Unlock() + return result +} + +func (m *MenuItemMap) processMenuItem(item *menu.MenuItem) { + + if item.SubMenu != nil { + for _, submenuitem := range item.SubMenu.Items { + m.processMenuItem(submenuitem) + } + } + + // Create a unique ID for this menu item + menuID := m.generateMenuID() + + // Store references + m.idToMenuItemMap[menuID] = item + m.menuItemToIDMap[item] = menuID +} + +func (m *MenuItemMap) getMenuItemByID(menuId string) *menu.MenuItem { + return m.idToMenuItemMap[menuId] +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/menumanager/menumanager.go b/vendor/github.com/wailsapp/wails/v2/internal/menumanager/menumanager.go new file mode 100644 index 0000000..6119532 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/menumanager/menumanager.go @@ -0,0 +1,116 @@ +package menumanager + +import ( + "fmt" + "github.com/wailsapp/wails/v2/pkg/menu" +) + +type Manager struct { + + // The application menu. + applicationMenu *menu.Menu + applicationMenuJSON string + processedApplicationMenu *WailsMenu + + // Our application menu mappings + applicationMenuItemMap *MenuItemMap + + // Context menus + contextMenus map[string]*ContextMenu + contextMenuPointers map[*menu.ContextMenu]string + + // Tray menu stores + trayMenus map[string]*TrayMenu + trayMenuPointers map[*menu.TrayMenu]string + + // Radio groups + radioGroups map[*menu.MenuItem][]*menu.MenuItem +} + +func NewManager() *Manager { + return &Manager{ + applicationMenuItemMap: NewMenuItemMap(), + contextMenus: make(map[string]*ContextMenu), + contextMenuPointers: make(map[*menu.ContextMenu]string), + trayMenus: make(map[string]*TrayMenu), + trayMenuPointers: make(map[*menu.TrayMenu]string), + radioGroups: make(map[*menu.MenuItem][]*menu.MenuItem), + } +} + +func (m *Manager) getMenuItemByID(menuMap *MenuItemMap, menuId string) *menu.MenuItem { + return menuMap.idToMenuItemMap[menuId] +} + +func (m *Manager) ProcessClick(menuID string, data string, menuType string, parentID string) error { + + var menuItemMap *MenuItemMap + + switch menuType { + case "ApplicationMenu": + menuItemMap = m.applicationMenuItemMap + case "ContextMenu": + contextMenu := m.contextMenus[parentID] + if contextMenu == nil { + return fmt.Errorf("unknown context menu: %s", parentID) + } + menuItemMap = contextMenu.menuItemMap + case "TrayMenu": + trayMenu := m.trayMenus[parentID] + if trayMenu == nil { + return fmt.Errorf("unknown tray menu: %s", parentID) + } + menuItemMap = trayMenu.menuItemMap + default: + return fmt.Errorf("unknown menutype: %s", menuType) + } + + // Get the menu item + menuItem := menuItemMap.getMenuItemByID(menuID) + if menuItem == nil { + return fmt.Errorf("Cannot process menuid %s - unknown", menuID) + } + + // Is the menu item a checkbox? + if menuItem.Type == menu.CheckboxType { + // Toggle state + menuItem.Checked = !menuItem.Checked + } + + if menuItem.Type == menu.RadioType { + println("Toggle radio") + // Get my radio group + for _, radioMenuItem := range m.radioGroups[menuItem] { + radioMenuItem.Checked = (radioMenuItem == menuItem) + } + } + + if menuItem.Click == nil { + // No callback + return fmt.Errorf("No callback for menu '%s'", menuItem.Label) + } + + // Create new Callback struct + callbackData := &menu.CallbackData{ + MenuItem: menuItem, + ContextData: data, + } + + // Call back! + go menuItem.Click(callbackData) + + return nil +} + +func (m *Manager) processRadioGroups(processedMenu *WailsMenu, itemMap *MenuItemMap) { + for _, group := range processedMenu.RadioGroups { + radioGroupMenuItems := []*menu.MenuItem{} + for _, member := range group.Members { + item := m.getMenuItemByID(itemMap, member) + radioGroupMenuItems = append(radioGroupMenuItems, item) + } + for _, radioGroupMenuItem := range radioGroupMenuItems { + m.radioGroups[radioGroupMenuItem] = radioGroupMenuItems + } + } +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/menumanager/processedMenu.go b/vendor/github.com/wailsapp/wails/v2/internal/menumanager/processedMenu.go new file mode 100644 index 0000000..f8204d5 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/menumanager/processedMenu.go @@ -0,0 +1,192 @@ +package menumanager + +import ( + "encoding/json" + "strings" + + "github.com/leaanthony/go-ansi-parser" + + "github.com/wailsapp/wails/v2/pkg/menu" + "github.com/wailsapp/wails/v2/pkg/menu/keys" +) + +type ProcessedMenuItem struct { + ID string + // Label is what appears as the menu text + Label string `json:",omitempty"` + // Role is a predefined menu type + Role menu.Role `json:",omitempty"` + // Accelerator holds a representation of a key binding + Accelerator *keys.Accelerator `json:",omitempty"` + // Type of MenuItem, EG: Checkbox, Text, Separator, Radio, Submenu + Type menu.Type + // Disabled makes the item unselectable + Disabled bool `json:",omitempty"` + // Hidden ensures that the item is not shown in the menu + Hidden bool `json:",omitempty"` + // Checked indicates if the item is selected (used by Checkbox and Radio types only) + Checked bool `json:",omitempty"` + // Submenu contains a list of menu items that will be shown as a submenu + //SubMenu []*MenuItem `json:"SubMenu,omitempty"` + SubMenu *ProcessedMenu `json:",omitempty"` + + // Colour + RGBA string `json:",omitempty"` + + // Font + FontSize int `json:",omitempty"` + FontName string `json:",omitempty"` + + // Image - base64 image data + Image string `json:",omitempty"` + MacTemplateImage bool `json:", omitempty"` + MacAlternate bool `json:", omitempty"` + + // Tooltip + Tooltip string `json:",omitempty"` + + // Styled label + StyledLabel []*ansi.StyledText `json:",omitempty"` +} + +func NewProcessedMenuItem(menuItemMap *MenuItemMap, menuItem *menu.MenuItem) *ProcessedMenuItem { + + ID := menuItemMap.menuItemToIDMap[menuItem] + + // Parse ANSI text + var styledLabel []*ansi.StyledText + tempLabel := menuItem.Label + if strings.Contains(tempLabel, "\033[") { + parsedLabel, err := ansi.Parse(menuItem.Label) + if err == nil { + styledLabel = parsedLabel + } + } + + result := &ProcessedMenuItem{ + ID: ID, + Label: menuItem.Label, + Role: menuItem.Role, + Accelerator: menuItem.Accelerator, + Type: menuItem.Type, + Disabled: menuItem.Disabled, + Hidden: menuItem.Hidden, + Checked: menuItem.Checked, + SubMenu: nil, + RGBA: menuItem.RGBA, + FontSize: menuItem.FontSize, + FontName: menuItem.FontName, + Image: menuItem.Image, + MacTemplateImage: menuItem.MacTemplateImage, + MacAlternate: menuItem.MacAlternate, + Tooltip: menuItem.Tooltip, + StyledLabel: styledLabel, + } + + if menuItem.SubMenu != nil { + result.SubMenu = NewProcessedMenu(menuItemMap, menuItem.SubMenu) + } + + return result +} + +type ProcessedMenu struct { + Items []*ProcessedMenuItem +} + +func NewProcessedMenu(menuItemMap *MenuItemMap, menu *menu.Menu) *ProcessedMenu { + + result := &ProcessedMenu{} + if menu != nil { + for _, item := range menu.Items { + processedMenuItem := NewProcessedMenuItem(menuItemMap, item) + result.Items = append(result.Items, processedMenuItem) + } + } + + return result +} + +// WailsMenu is the original menu with the addition +// of radio groups extracted from the menu data +type WailsMenu struct { + Menu *ProcessedMenu + RadioGroups []*RadioGroup + currentRadioGroup []string +} + +// RadioGroup holds all the members of the same radio group +type RadioGroup struct { + Members []string + Length int +} + +func NewWailsMenu(menuItemMap *MenuItemMap, menu *menu.Menu) *WailsMenu { + result := &WailsMenu{} + + // Process the menus + result.Menu = NewProcessedMenu(menuItemMap, menu) + + // Process the radio groups + result.processRadioGroups() + + return result +} + +func (w *WailsMenu) AsJSON() (string, error) { + + menuAsJSON, err := json.Marshal(w) + if err != nil { + return "", err + } + return string(menuAsJSON), nil +} + +func (w *WailsMenu) processRadioGroups() { + // Loop over top level menus + for _, item := range w.Menu.Items { + // Process MenuItem + w.processMenuItem(item) + } + + w.finaliseRadioGroup() +} + +func (w *WailsMenu) processMenuItem(item *ProcessedMenuItem) { + + switch item.Type { + + // We need to recurse submenus + case menu.SubmenuType: + + // Finalise any current radio groups as they don't trickle down to submenus + w.finaliseRadioGroup() + + // Process each submenu item + for _, subitem := range item.SubMenu.Items { + w.processMenuItem(subitem) + } + case menu.RadioType: + // Add the item to the radio group + w.currentRadioGroup = append(w.currentRadioGroup, item.ID) + default: + w.finaliseRadioGroup() + } +} + +func (w *WailsMenu) finaliseRadioGroup() { + + // If we were processing a radio group, fix up the references + if len(w.currentRadioGroup) > 0 { + + // Create new radiogroup + group := &RadioGroup{ + Members: w.currentRadioGroup, + Length: len(w.currentRadioGroup), + } + w.RadioGroups = append(w.RadioGroups, group) + + // Empty the radio group + w.currentRadioGroup = []string{} + } +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/menumanager/traymenu.go b/vendor/github.com/wailsapp/wails/v2/internal/menumanager/traymenu.go new file mode 100644 index 0000000..aed5b05 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/menumanager/traymenu.go @@ -0,0 +1,222 @@ +package menumanager + +import ( + "encoding/json" + "fmt" + "strconv" + "strings" + "sync" + + "github.com/leaanthony/go-ansi-parser" + + "github.com/pkg/errors" + "github.com/wailsapp/wails/v2/pkg/menu" +) + +var trayMenuID int +var trayMenuIDMutex sync.Mutex + +func generateTrayID() string { + var idStr string + trayMenuIDMutex.Lock() + idStr = strconv.Itoa(trayMenuID) + trayMenuID++ + trayMenuIDMutex.Unlock() + return idStr +} + +type TrayMenu struct { + ID string + Label string + FontSize int + FontName string + Disabled bool + Tooltip string `json:",omitempty"` + Image string + MacTemplateImage bool + RGBA string + menuItemMap *MenuItemMap + menu *menu.Menu + ProcessedMenu *WailsMenu + trayMenu *menu.TrayMenu + StyledLabel []*ansi.StyledText `json:",omitempty"` +} + +func (t *TrayMenu) AsJSON() (string, error) { + data, err := json.Marshal(t) + if err != nil { + return "", err + } + return string(data), nil +} + +func NewTrayMenu(trayMenu *menu.TrayMenu) *TrayMenu { + + // Parse ANSI text + var styledLabel []*ansi.StyledText + tempLabel := trayMenu.Label + if strings.Contains(tempLabel, "\033[") { + parsedLabel, err := ansi.Parse(tempLabel) + if err == nil { + styledLabel = parsedLabel + } + } + + result := &TrayMenu{ + Label: trayMenu.Label, + FontName: trayMenu.FontName, + FontSize: trayMenu.FontSize, + Disabled: trayMenu.Disabled, + Tooltip: trayMenu.Tooltip, + Image: trayMenu.Image, + MacTemplateImage: trayMenu.MacTemplateImage, + menu: trayMenu.Menu, + RGBA: trayMenu.RGBA, + menuItemMap: NewMenuItemMap(), + trayMenu: trayMenu, + StyledLabel: styledLabel, + } + + result.menuItemMap.AddMenu(trayMenu.Menu) + result.ProcessedMenu = NewWailsMenu(result.menuItemMap, result.menu) + + return result +} + +func (m *Manager) OnTrayMenuOpen(id string) { + trayMenu, ok := m.trayMenus[id] + if !ok { + return + } + if trayMenu.trayMenu.OnOpen == nil { + return + } + go trayMenu.trayMenu.OnOpen() +} + +func (m *Manager) OnTrayMenuClose(id string) { + trayMenu, ok := m.trayMenus[id] + if !ok { + return + } + if trayMenu.trayMenu.OnClose == nil { + return + } + go trayMenu.trayMenu.OnClose() +} + +func (m *Manager) AddTrayMenu(trayMenu *menu.TrayMenu) (string, error) { + newTrayMenu := NewTrayMenu(trayMenu) + + // Hook up a new ID + trayID := generateTrayID() + newTrayMenu.ID = trayID + + // Save the references + m.trayMenus[trayID] = newTrayMenu + m.trayMenuPointers[trayMenu] = trayID + + return newTrayMenu.AsJSON() +} + +func (m *Manager) GetTrayID(trayMenu *menu.TrayMenu) (string, error) { + trayID, exists := m.trayMenuPointers[trayMenu] + if !exists { + return "", fmt.Errorf("Unable to find menu ID for tray menu!") + } + return trayID, nil +} + +// SetTrayMenu updates or creates a menu +func (m *Manager) SetTrayMenu(trayMenu *menu.TrayMenu) (string, error) { + trayID, trayMenuKnown := m.trayMenuPointers[trayMenu] + if !trayMenuKnown { + return m.AddTrayMenu(trayMenu) + } + + // Create the updated tray menu + updatedTrayMenu := NewTrayMenu(trayMenu) + updatedTrayMenu.ID = trayID + + // Save the reference + m.trayMenus[trayID] = updatedTrayMenu + + return updatedTrayMenu.AsJSON() +} + +func (m *Manager) GetTrayMenus() ([]string, error) { + result := []string{} + for _, trayMenu := range m.trayMenus { + JSON, err := trayMenu.AsJSON() + if err != nil { + return nil, err + } + result = append(result, JSON) + } + + return result, nil +} + +func (m *Manager) UpdateTrayMenuLabel(trayMenu *menu.TrayMenu) (string, error) { + trayID, trayMenuKnown := m.trayMenuPointers[trayMenu] + if !trayMenuKnown { + return "", fmt.Errorf("[UpdateTrayMenuLabel] unknown tray id for tray %s", trayMenu.Label) + } + + type LabelUpdate struct { + ID string + Label string `json:",omitempty"` + FontName string `json:",omitempty"` + FontSize int + RGBA string `json:",omitempty"` + Disabled bool + Tooltip string `json:",omitempty"` + Image string `json:",omitempty"` + MacTemplateImage bool + StyledLabel []*ansi.StyledText `json:",omitempty"` + } + + // Parse ANSI text + var styledLabel []*ansi.StyledText + tempLabel := trayMenu.Label + if strings.Contains(tempLabel, "\033[") { + parsedLabel, err := ansi.Parse(tempLabel) + if err == nil { + styledLabel = parsedLabel + } + } + + update := &LabelUpdate{ + ID: trayID, + Label: trayMenu.Label, + FontName: trayMenu.FontName, + FontSize: trayMenu.FontSize, + Disabled: trayMenu.Disabled, + Tooltip: trayMenu.Tooltip, + Image: trayMenu.Image, + MacTemplateImage: trayMenu.MacTemplateImage, + RGBA: trayMenu.RGBA, + StyledLabel: styledLabel, + } + + data, err := json.Marshal(update) + if err != nil { + return "", errors.Wrap(err, "[UpdateTrayMenuLabel] ") + } + + return string(data), nil + +} + +func (m *Manager) GetContextMenus() ([]string, error) { + result := []string{} + for _, contextMenu := range m.contextMenus { + JSON, err := contextMenu.AsJSON() + if err != nil { + return nil, err + } + result = append(result, JSON) + } + + return result, nil +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/messagedispatcher/dispatchclient.go b/vendor/github.com/wailsapp/wails/v2/internal/messagedispatcher/dispatchclient.go new file mode 100644 index 0000000..edf559c --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/messagedispatcher/dispatchclient.go @@ -0,0 +1,89 @@ +package messagedispatcher + +import ( + "fmt" + + "github.com/wailsapp/wails/v2/internal/logger" + "github.com/wailsapp/wails/v2/internal/messagedispatcher/message" + "github.com/wailsapp/wails/v2/internal/servicebus" + "github.com/wailsapp/wails/v2/pkg/options/dialog" +) + +// Client defines what a frontend client can do +type Client interface { + Quit() + NotifyEvent(message string) + CallResult(message string) + OpenFileDialog(dialogOptions *dialog.OpenDialog, callbackID string) + OpenMultipleFilesDialog(dialogOptions *dialog.OpenDialog, callbackID string) + OpenDirectoryDialog(dialogOptions *dialog.OpenDialog, callbackID string) + SaveDialog(dialogOptions *dialog.SaveDialog, callbackID string) + MessageDialog(dialogOptions *dialog.MessageDialog, callbackID string) + WindowSetTitle(title string) + WindowShow() + WindowHide() + WindowCenter() + WindowMaximise() + WindowUnmaximise() + WindowMinimise() + WindowUnminimise() + WindowPosition(x int, y int) + WindowSize(width int, height int) + WindowSetMinSize(width int, height int) + WindowSetMaxSize(width int, height int) + WindowFullscreen() + WindowUnFullscreen() + WindowSetColour(colour int) + DarkModeEnabled(callbackID string) + SetApplicationMenu(menuJSON string) + SetTrayMenu(trayMenuJSON string) + UpdateTrayMenuLabel(JSON string) + UpdateContextMenu(contextMenuJSON string) + DeleteTrayMenuByID(id string) +} + +// DispatchClient is what the frontends use to interface with the +// dispatcher +type DispatchClient struct { + id string + logger logger.CustomLogger + + bus *servicebus.ServiceBus + + // Client + frontend Client +} + +func newDispatchClient(id string, frontend Client, logger logger.CustomLogger, bus *servicebus.ServiceBus) *DispatchClient { + + return &DispatchClient{ + id: id, + frontend: frontend, + logger: logger, + bus: bus, + } + +} + +// DispatchMessage is called by the front ends. It is passed +// an IPC message, translates it to a more concrete message +// type then publishes it on the service bus. +func (d *DispatchClient) DispatchMessage(incomingMessage string) { + + // Parse the message + d.logger.Trace(fmt.Sprintf("Received message: %+v", incomingMessage)) + parsedMessage, err := message.Parse(incomingMessage) + if err != nil { + d.logger.Error(err.Error()) + return + } + + // Save this client id + parsedMessage.ClientID = d.id + + d.logger.Trace("I got a parsedMessage: %+v", parsedMessage) + + // Publish the parsed message + d.bus.PublishForTarget(parsedMessage.Topic, parsedMessage.Data, d.id) + +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/messagedispatcher/message/call.go b/vendor/github.com/wailsapp/wails/v2/internal/messagedispatcher/message/call.go new file mode 100644 index 0000000..946e00a --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/messagedispatcher/message/call.go @@ -0,0 +1,38 @@ +package message + +import ( + "encoding/json" + "fmt" +) + +type CallMessage struct { + Name string `json:"name"` + Args []json.RawMessage `json:"args"` + CallbackID string `json:"callbackID,omitempty"` +} + +// callMessageParser does what it says on the tin! +func callMessageParser(message string) (*parsedMessage, error) { + + // Sanity check: Call messages must be at least 3 bytes `C{}`` + if len(message) < 3 { + return nil, fmt.Errorf("call message was an invalid length") + } + + callMessage := new(CallMessage) + + m := message[1:] + + err := json.Unmarshal([]byte(m), callMessage) + if err != nil { + println(err.Error()) + return nil, err + } + + topic := "call:invoke" + + // Create a new parsed message struct + parsedMessage := &parsedMessage{Topic: topic, Data: callMessage} + + return parsedMessage, nil +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/messagedispatcher/message/contextmenus.go b/vendor/github.com/wailsapp/wails/v2/internal/messagedispatcher/message/contextmenus.go new file mode 100644 index 0000000..53acebd --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/messagedispatcher/message/contextmenus.go @@ -0,0 +1,43 @@ +package message + +import ( + "fmt" + + "github.com/wailsapp/wails/v2/pkg/menu" +) + +// ContextMenusOnMessage is used to emit listener registration requests +// on the service bus +type ContextMenusOnMessage struct { + // MenuID is the id of the menu item we are interested in + MenuID string + // Callback is called when the menu is clicked + Callback func(*menu.MenuItem, string) +} + +// contextMenusMessageParser does what it says on the tin! +func contextMenusMessageParser(message string) (*parsedMessage, error) { + + // Sanity check: Menu messages must be at least 2 bytes + if len(message) < 3 { + return nil, fmt.Errorf("context menus message was an invalid length") + } + + var topic string + var data interface{} + + // Switch the message type + switch message[1] { + case 'C': + contextMenuData := message[2:] + topic = "contextmenus:clicked" + data = contextMenuData + default: + return nil, fmt.Errorf("invalid menu message: %s", message) + } + + // Create a new parsed message struct + parsedMessage := &parsedMessage{Topic: topic, Data: data} + + return parsedMessage, nil +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/messagedispatcher/message/dialog.go b/vendor/github.com/wailsapp/wails/v2/internal/messagedispatcher/message/dialog.go new file mode 100644 index 0000000..5fcc63d --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/messagedispatcher/message/dialog.go @@ -0,0 +1,61 @@ +package message + +import ( + "encoding/json" + "fmt" + "strings" +) + +// dialogMessageParser does what it says on the tin! +func dialogMessageParser(message string) (*parsedMessage, error) { + + // Sanity check: Dialog messages must be at least 4 bytes + if len(message) < 4 { + return nil, fmt.Errorf("dialog message was an invalid length") + } + + var topic = "bad topic from dialogMessageParser" + var responseMessage *parsedMessage + + // Switch the event type (with or without data) + switch message[0] { + // Format of Dialog response messages: D|<[]string as json encoded string> + case 'D': + dialogType := message[1] + message = message[2:] + idx := strings.IndexByte(message, '|') + if idx < 0 { + return nil, fmt.Errorf("Invalid dialog response message format: %+v", message) + } + callbackID := message[:idx] + payloadData := message[idx+1:] + + switch dialogType { + case 'O': + topic = "dialog:openselected:" + callbackID + responseMessage = &parsedMessage{Topic: topic, Data: payloadData} + case 'D': + topic = "dialog:opendirectoryselected:" + callbackID + responseMessage = &parsedMessage{Topic: topic, Data: payloadData} + case '*': + var data []string + topic = "dialog:openmultipleselected:" + callbackID + err := json.Unmarshal([]byte(payloadData), &data) + if err != nil { + return nil, err + } + responseMessage = &parsedMessage{Topic: topic, Data: data} + case 'S': + topic = "dialog:saveselected:" + callbackID + responseMessage = &parsedMessage{Topic: topic, Data: payloadData} + case 'M': + topic = "dialog:messageselected:" + callbackID + responseMessage = &parsedMessage{Topic: topic, Data: payloadData} + } + + default: + return nil, fmt.Errorf("Invalid message to dialogMessageParser()") + } + + return responseMessage, nil +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/messagedispatcher/message/event.go b/vendor/github.com/wailsapp/wails/v2/internal/messagedispatcher/message/event.go new file mode 100644 index 0000000..dcb133e --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/messagedispatcher/message/event.go @@ -0,0 +1,47 @@ +package message + +import ( + "encoding/json" + "fmt" +) + +type EventMessage struct { + Name string `json:"name"` + Data []interface{} `json:"data"` +} + +type OnEventMessage struct { + Name string + Callback func(optionalData ...interface{}) + Counter int +} + +// eventMessageParser does what it says on the tin! +func eventMessageParser(message string) (*parsedMessage, error) { + + // Sanity check: Event messages must be at least 2 bytes + if len(message) < 3 { + return nil, fmt.Errorf("event message was an invalid length") + } + + eventMessage := new(EventMessage) + direction := message[1] + + // Switch the event type (with or without data) + switch message[0] { + case 'E': + m := message[2:] + err := json.Unmarshal([]byte(m), eventMessage) + if err != nil { + println(err.Error()) + return nil, err + } + } + + topic := "event:emit:from:" + string(direction) + + // Create a new parsed message struct + parsedMessage := &parsedMessage{Topic: topic, Data: eventMessage} + + return parsedMessage, nil +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/messagedispatcher/message/log.go b/vendor/github.com/wailsapp/wails/v2/internal/messagedispatcher/message/log.go new file mode 100644 index 0000000..9b24fc5 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/messagedispatcher/message/log.go @@ -0,0 +1,36 @@ +package message + +import "fmt" + +var logMessageMap = map[byte]string{ + 'P': "log:print", + 'T': "log:trace", + 'D': "log:debug", + 'I': "log:info", + 'W': "log:warning", + 'E': "log:error", + 'F': "log:fatal", + 'S': "log:setlevel", +} + +// logMessageParser does what it says on the tin! +func logMessageParser(message string) (*parsedMessage, error) { + + // Sanity check: Log messages must be at least 2 bytes + if len(message) < 2 { + return nil, fmt.Errorf("log message was an invalid length") + } + + // Switch on the log type + messageTopic := logMessageMap[message[1]] + + // If the type is invalid, raise error + if messageTopic == "" { + return nil, fmt.Errorf("log message type '%c' invalid", message[1]) + } + + // Create a new parsed message struct + parsedMessage := &parsedMessage{Topic: messageTopic, Data: message[2:]} + + return parsedMessage, nil +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/messagedispatcher/message/menu.go b/vendor/github.com/wailsapp/wails/v2/internal/messagedispatcher/message/menu.go new file mode 100644 index 0000000..483865f --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/messagedispatcher/message/menu.go @@ -0,0 +1,51 @@ +package message + +import ( + "fmt" + + "github.com/wailsapp/wails/v2/pkg/menu" +) + +// MenuOnMessage is used to emit listener registration requests +// on the service bus +type MenuOnMessage struct { + // MenuID is the id of the menu item we are interested in + MenuID string + // Callback is called when the menu is clicked + Callback func(*menu.MenuItem) +} + +// menuMessageParser does what it says on the tin! +func menuMessageParser(message string) (*parsedMessage, error) { + + // Sanity check: Menu messages must be at least 2 bytes + if len(message) < 3 { + return nil, fmt.Errorf("event message was an invalid length") + } + + var topic string + var data interface{} + + // Switch the message type + switch message[1] { + case 'C': + callbackid := message[2:] + topic = "menu:clicked" + data = callbackid + case 'o': + callbackid := message[2:] + topic = "menu:ontrayopen" + data = callbackid + case 'c': + callbackid := message[2:] + topic = "menu:ontrayclose" + data = callbackid + default: + return nil, fmt.Errorf("invalid menu message: %s", message) + } + + // Create a new parsed message struct + parsedMessage := &parsedMessage{Topic: topic, Data: data} + + return parsedMessage, nil +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/messagedispatcher/message/messageparser.go b/vendor/github.com/wailsapp/wails/v2/internal/messagedispatcher/message/messageparser.go new file mode 100644 index 0000000..362070b --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/messagedispatcher/message/messageparser.go @@ -0,0 +1,40 @@ +package message + +import "fmt" + +// Parse +type parsedMessage struct { + Topic string + ClientID string + Data interface{} +} + +// Map of different message parsers based on the header byte of the message +var messageParsers = map[byte]func(string) (*parsedMessage, error){ + 'L': logMessageParser, + 'R': runtimeMessageParser, + 'E': eventMessageParser, + 'C': callMessageParser, + 'W': windowMessageParser, + 'D': dialogMessageParser, + 'S': systemMessageParser, + 'M': menuMessageParser, + 'T': trayMessageParser, + 'X': contextMenusMessageParser, + 'U': urlMessageParser, +} + +// Parse will attempt to parse the given message +func Parse(message string) (*parsedMessage, error) { + + if len(message) == 0 { + return nil, fmt.Errorf("MessageParser received blank message") + } + + parseMethod := messageParsers[message[0]] + if parseMethod == nil { + return nil, fmt.Errorf("message type '%c' invalid", message[0]) + } + + return parseMethod(message) +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/messagedispatcher/message/runtime.go b/vendor/github.com/wailsapp/wails/v2/internal/messagedispatcher/message/runtime.go new file mode 100644 index 0000000..fc3a442 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/messagedispatcher/message/runtime.go @@ -0,0 +1,37 @@ +package message + +import "fmt" + +// runtimeMessageParser does what it says on the tin! +func runtimeMessageParser(message string) (*parsedMessage, error) { + + // Sanity check: Log messages must be at least 2 bytes + if len(message) < 3 { + return nil, fmt.Errorf("runtime message was an invalid length") + } + + // Switch on the runtime module type + module := message[1] + switch module { + case 'B': + return processBrowserMessage(message) + } + + return nil, fmt.Errorf("unknown message: %s", message) +} + +// processBrowserMessage expects messages of the following format: +// RB +// O = Open +func processBrowserMessage(message string) (*parsedMessage, error) { + method := message[2] + switch method { + case 'O': + // Open URL + target := message[3:] + return &parsedMessage{Topic: "runtime:browser:open", Data: target}, nil + } + + return nil, fmt.Errorf("unknown browser message: %s", message) + +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/messagedispatcher/message/system.go b/vendor/github.com/wailsapp/wails/v2/internal/messagedispatcher/message/system.go new file mode 100644 index 0000000..1bda751 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/messagedispatcher/message/system.go @@ -0,0 +1,50 @@ +package message + +import ( + "fmt" + "strings" +) + +// systemMessageParser does what it says on the tin! +func systemMessageParser(message string) (*parsedMessage, error) { + + // Sanity check: system messages must be at least 2 bytes + if len(message) < 2 { + return nil, fmt.Errorf("system message was an invalid length") + } + + var responseMessage *parsedMessage + + // Remove 'S' + message = message[1:] + + // Switch the event type (with or without data) + switch message[0] { + // Format of system response messages: S| + // DarkModeEnabled + case 'D': + if len(message) < 4 { + return nil, fmt.Errorf("system message was an invalid length") + } + message = message[1:] + idx := strings.IndexByte(message, '|') + if idx < 0 { + return nil, fmt.Errorf("Invalid system response message format") + } + callbackID := message[:idx] + payloadData := message[idx+1:] + + topic := "systemresponse:" + callbackID + responseMessage = &parsedMessage{Topic: topic, Data: payloadData == "T"} + + // This is our startup hook - the frontend is now ready + case 'S': + topic := "hooks:startup" + startupURL := message[1:] + responseMessage = &parsedMessage{Topic: topic, Data: startupURL} + default: + return nil, fmt.Errorf("Invalid message to systemMessageParser()") + } + + return responseMessage, nil +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/messagedispatcher/message/tray.go b/vendor/github.com/wailsapp/wails/v2/internal/messagedispatcher/message/tray.go new file mode 100644 index 0000000..ac1cde8 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/messagedispatcher/message/tray.go @@ -0,0 +1,46 @@ +package message + +import ( + "fmt" + + "github.com/wailsapp/wails/v2/pkg/menu" +) + +// TrayOnMessage is used to emit listener registration requests +// on the service bus +type TrayOnMessage struct { + // MenuID is the id of the menu item we are interested in + MenuID string + // Callback is called when the menu is clicked + Callback func(*menu.MenuItem) +} + +// trayMessageParser does what it says on the tin! +func trayMessageParser(message string) (*parsedMessage, error) { + + // Sanity check: Menu messages must be at least 2 bytes + if len(message) < 3 { + return nil, fmt.Errorf("tray message was an invalid length") + } + + var topic string + var data interface{} + + // Switch the message type + switch message[1] { + case 'C': + callbackid := message[2:] + topic = "tray:clicked" + data = callbackid + case 'I': + topic = "trayfrontend:seticon" + data = message[2:] + default: + return nil, fmt.Errorf("invalid tray message: %s", message) + } + + // Create a new parsed message struct + parsedMessage := &parsedMessage{Topic: topic, Data: data} + + return parsedMessage, nil +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/messagedispatcher/message/url.go b/vendor/github.com/wailsapp/wails/v2/internal/messagedispatcher/message/url.go new file mode 100644 index 0000000..1bdc2f9 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/messagedispatcher/message/url.go @@ -0,0 +1,20 @@ +package message + +import "fmt" + +// urlMessageParser does what it says on the tin! +func urlMessageParser(message string) (*parsedMessage, error) { + + // Sanity check: URL messages must be at least 2 bytes + if len(message) < 2 { + return nil, fmt.Errorf("log message was an invalid length") + } + + // Switch on the log type + switch message[1] { + case 'C': + return &parsedMessage{Topic: "url:handler", Data: message[2:]}, nil + default: + return nil, fmt.Errorf("url message type '%c' invalid", message[1]) + } +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/messagedispatcher/message/window.go b/vendor/github.com/wailsapp/wails/v2/internal/messagedispatcher/message/window.go new file mode 100644 index 0000000..e31353f --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/messagedispatcher/message/window.go @@ -0,0 +1,91 @@ +package message + +import "fmt" + +// windowMessageParser does what it says on the tin! +func windowMessageParser(message string) (*parsedMessage, error) { + + // Sanity check: Window messages must be at least 2 bytes + if len(message) < 2 { + return nil, fmt.Errorf("window message was an invalid length") + } + + // Extract event type + windowEvent := message[1] + parsedMessage := &parsedMessage{} + + // Switch the windowEvent type + switch windowEvent { + + // Closed window + case 'C': + parsedMessage.Topic = "quit" + parsedMessage.Data = "Window Closed" + + // Center window + case 'c': + parsedMessage.Topic = "window:center" + parsedMessage.Data = "" + + // Hide window + case 'H': + parsedMessage.Topic = "window:hide" + parsedMessage.Data = "" + + // Show window + case 'S': + parsedMessage.Topic = "window:show" + parsedMessage.Data = "" + + // Position window + case 'p': + parsedMessage.Topic = "window:position:" + message[3:] + parsedMessage.Data = "" + + // Set window size + case 's': + parsedMessage.Topic = "window:size:" + message[3:] + parsedMessage.Data = "" + + // Maximise window + case 'M': + parsedMessage.Topic = "window:maximise" + parsedMessage.Data = "" + + // Unmaximise window + case 'U': + parsedMessage.Topic = "window:unmaximise" + parsedMessage.Data = "" + + // Minimise window + case 'm': + parsedMessage.Topic = "window:minimise" + parsedMessage.Data = "" + + // Unminimise window + case 'u': + parsedMessage.Topic = "window:unminimise" + parsedMessage.Data = "" + + // Fullscreen window + case 'F': + parsedMessage.Topic = "window:fullscreen" + parsedMessage.Data = "" + + // UnFullscreen window + case 'f': + parsedMessage.Topic = "window:unfullscreen" + parsedMessage.Data = "" + + // Set Title + case 'T': + parsedMessage.Topic = "window:settitle" + parsedMessage.Data = message[2:] + + // Unknown event type + default: + return nil, fmt.Errorf("unknown message: %s", message) + } + + return parsedMessage, nil +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/messagedispatcher/messagedispatcher.go b/vendor/github.com/wailsapp/wails/v2/internal/messagedispatcher/messagedispatcher.go new file mode 100644 index 0000000..095fd38 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/messagedispatcher/messagedispatcher.go @@ -0,0 +1,578 @@ +package messagedispatcher + +import ( + "context" + "encoding/json" + "strconv" + "strings" + "sync" + + "github.com/wailsapp/wails/v2/pkg/options/dialog" + + "github.com/wailsapp/wails/v2/internal/crypto" + "github.com/wailsapp/wails/v2/internal/logger" + "github.com/wailsapp/wails/v2/internal/messagedispatcher/message" + "github.com/wailsapp/wails/v2/internal/servicebus" +) + +// Dispatcher translates messages received from the frontend +// and publishes them onto the service bus +type Dispatcher struct { + quitChannel <-chan *servicebus.Message + resultChannel <-chan *servicebus.Message + eventChannel <-chan *servicebus.Message + windowChannel <-chan *servicebus.Message + dialogChannel <-chan *servicebus.Message + systemChannel <-chan *servicebus.Message + menuChannel <-chan *servicebus.Message + + servicebus *servicebus.ServiceBus + logger logger.CustomLogger + + // Clients + clients map[string]*DispatchClient + lock sync.RWMutex + + // Context for cancellation + ctx context.Context + cancel context.CancelFunc + + // internal wait group + wg sync.WaitGroup +} + +// New dispatcher. Needs a service bus to send to. +func New(servicebus *servicebus.ServiceBus, logger *logger.Logger) (*Dispatcher, error) { + // Subscribe to call result messages + resultChannel, err := servicebus.Subscribe("call:result") + if err != nil { + return nil, err + } + + // Subscribe to event messages + eventChannel, err := servicebus.Subscribe("event:emit") + if err != nil { + return nil, err + } + + // Subscribe to quit messages + quitChannel, err := servicebus.Subscribe("quit") + if err != nil { + return nil, err + } + + // Subscribe to window messages + windowChannel, err := servicebus.Subscribe("window") + if err != nil { + return nil, err + } + + // Subscribe to dialog events + dialogChannel, err := servicebus.Subscribe("dialog:select") + if err != nil { + return nil, err + } + + systemChannel, err := servicebus.Subscribe("system:") + if err != nil { + return nil, err + } + + menuChannel, err := servicebus.Subscribe("menufrontend:") + if err != nil { + return nil, err + } + + // Create context + ctx, cancel := context.WithCancel(context.Background()) + + result := &Dispatcher{ + servicebus: servicebus, + eventChannel: eventChannel, + logger: logger.CustomLogger("Message Dispatcher"), + clients: make(map[string]*DispatchClient), + resultChannel: resultChannel, + quitChannel: quitChannel, + windowChannel: windowChannel, + dialogChannel: dialogChannel, + systemChannel: systemChannel, + menuChannel: menuChannel, + ctx: ctx, + cancel: cancel, + } + + return result, nil +} + +// Start the subsystem +func (d *Dispatcher) Start() error { + + d.logger.Trace("Starting") + + d.wg.Add(1) + + // Spin off a go routine + go func() { + defer d.logger.Trace("Shutdown") + for { + select { + case <-d.ctx.Done(): + d.wg.Done() + return + case <-d.quitChannel: + d.processQuit() + case resultMessage := <-d.resultChannel: + d.processCallResult(resultMessage) + case eventMessage := <-d.eventChannel: + d.processEvent(eventMessage) + case windowMessage := <-d.windowChannel: + d.processWindowMessage(windowMessage) + case dialogMessage := <-d.dialogChannel: + d.processDialogMessage(dialogMessage) + case systemMessage := <-d.systemChannel: + d.processSystemMessage(systemMessage) + case menuMessage := <-d.menuChannel: + d.processMenuMessage(menuMessage) + } + } + }() + + return nil +} + +func (d *Dispatcher) processQuit() { + d.lock.RLock() + defer d.lock.RUnlock() + for _, client := range d.clients { + client.frontend.Quit() + } +} + +// RegisterClient will register the given callback with the dispatcher +// and return a DispatchClient that the caller can use to send messages +func (d *Dispatcher) RegisterClient(client Client) *DispatchClient { + d.lock.Lock() + defer d.lock.Unlock() + + // Create ID + id := d.getUniqueID() + d.clients[id] = newDispatchClient(id, client, d.logger, d.servicebus) + + return d.clients[id] +} + +// RemoveClient will remove the registered client +func (d *Dispatcher) RemoveClient(dc *DispatchClient) { + d.lock.Lock() + defer d.lock.Unlock() + delete(d.clients, dc.id) +} + +func (d *Dispatcher) getUniqueID() string { + var uid string + for { + uid = crypto.RandomID() + + if d.clients[uid] == nil { + break + } + } + + return uid +} + +func (d *Dispatcher) processCallResult(result *servicebus.Message) { + target := result.Target() + + if target == "" { + // This is an error. Calls are 1:1! + d.logger.Fatal("No target for call result: %+v", result) + } + + d.lock.RLock() + client := d.clients[target] + d.lock.RUnlock() + if client == nil { + // This is fatal - unknown target! + d.logger.Fatal("Unknown target for call result: %+v", result) + return + } + + d.logger.Trace("Sending message to client %s: R%s", target, result.Data().(string)) + client.frontend.CallResult(result.Data().(string)) +} + +// processSystem +func (d *Dispatcher) processSystemMessage(result *servicebus.Message) { + + d.logger.Trace("Got system in message dispatcher: %+v", result) + + splitTopic := strings.Split(result.Topic(), ":") + command := splitTopic[1] + callbackID := splitTopic[2] + switch command { + case "isdarkmode": + d.lock.RLock() + for _, client := range d.clients { + client.frontend.DarkModeEnabled(callbackID) + break + } + d.lock.RUnlock() + + default: + d.logger.Error("Unknown system command: %s", command) + } +} + +// processEvent will +func (d *Dispatcher) processEvent(result *servicebus.Message) { + + d.logger.Trace("Got event in message dispatcher: %+v", result) + + splitTopic := strings.Split(result.Topic(), ":") + eventType := splitTopic[1] + switch eventType { + case "emit": + eventFrom := splitTopic[3] + if eventFrom == "g" { + // This was sent from Go - notify frontend + eventData := result.Data().(*message.EventMessage) + // Unpack event + payload, err := json.Marshal(eventData) + if err != nil { + d.logger.Error("Unable to marshal eventData: %s", err.Error()) + return + } + d.lock.RLock() + for _, client := range d.clients { + client.frontend.NotifyEvent(string(payload)) + } + d.lock.RUnlock() + } + default: + d.logger.Error("Unknown event type: %s", eventType) + } +} + +// processWindowMessage processes messages intended for the window +func (d *Dispatcher) processWindowMessage(result *servicebus.Message) { + d.lock.RLock() + defer d.lock.RUnlock() + splitTopic := strings.Split(result.Topic(), ":") + command := splitTopic[1] + switch command { + case "settitle": + title, ok := result.Data().(string) + if !ok { + d.logger.Error("Invalid title for 'window:settitle' : %#v", result.Data()) + return + } + // Notify clients + for _, client := range d.clients { + client.frontend.WindowSetTitle(title) + } + case "fullscreen": + // Notify clients + for _, client := range d.clients { + client.frontend.WindowFullscreen() + } + case "unfullscreen": + // Notify clients + for _, client := range d.clients { + client.frontend.WindowUnFullscreen() + } + case "setcolour": + colour, ok := result.Data().(int) + if !ok { + d.logger.Error("Invalid colour for 'window:setcolour' : %#v", result.Data()) + return + } + // Notify clients + for _, client := range d.clients { + client.frontend.WindowSetColour(colour) + } + case "show": + // Notify clients + for _, client := range d.clients { + client.frontend.WindowShow() + } + case "hide": + // Notify clients + for _, client := range d.clients { + client.frontend.WindowHide() + } + case "center": + // Notify clients + for _, client := range d.clients { + client.frontend.WindowCenter() + } + case "maximise": + // Notify clients + for _, client := range d.clients { + client.frontend.WindowMaximise() + } + case "unmaximise": + // Notify clients + for _, client := range d.clients { + client.frontend.WindowUnmaximise() + } + case "minimise": + // Notify clients + for _, client := range d.clients { + client.frontend.WindowMinimise() + } + case "unminimise": + // Notify clients + for _, client := range d.clients { + client.frontend.WindowUnminimise() + } + case "position": + // We need 2 arguments + if len(splitTopic) != 4 { + d.logger.Error("Invalid number of parameters for 'window:position' : %#v", result.Data()) + return + } + x, err1 := strconv.Atoi(splitTopic[2]) + y, err2 := strconv.Atoi(splitTopic[3]) + if err1 != nil || err2 != nil { + d.logger.Error("Invalid integer parameters for 'window:position' : %#v", result.Data()) + return + } + // Notify clients + for _, client := range d.clients { + client.frontend.WindowPosition(x, y) + } + case "size": + // We need 2 arguments + if len(splitTopic) != 4 { + d.logger.Error("Invalid number of parameters for 'window:size' : %#v", result.Data()) + return + } + w, err1 := strconv.Atoi(splitTopic[2]) + h, err2 := strconv.Atoi(splitTopic[3]) + if err1 != nil || err2 != nil { + d.logger.Error("Invalid integer parameters for 'window:size' : %#v", result.Data()) + return + } + // Notifh clients + for _, client := range d.clients { + client.frontend.WindowSize(w, h) + } + case "minsize": + // We need 2 arguments + if len(splitTopic) != 4 { + d.logger.Error("Invalid number of parameters for 'window:minsize' : %#v", result.Data()) + return + } + w, err1 := strconv.Atoi(splitTopic[2]) + h, err2 := strconv.Atoi(splitTopic[3]) + if err1 != nil || err2 != nil { + d.logger.Error("Invalid integer parameters for 'window:minsize' : %#v", result.Data()) + return + } + // Notifh clients + for _, client := range d.clients { + client.frontend.WindowSetMinSize(w, h) + } + case "maxsize": + // We need 2 arguments + if len(splitTopic) != 4 { + d.logger.Error("Invalid number of parameters for 'window:maxsize' : %#v", result.Data()) + return + } + w, err1 := strconv.Atoi(splitTopic[2]) + h, err2 := strconv.Atoi(splitTopic[3]) + if err1 != nil || err2 != nil { + d.logger.Error("Invalid integer parameters for 'window:maxsize' : %#v", result.Data()) + return + } + // Notifh clients + for _, client := range d.clients { + client.frontend.WindowSetMaxSize(w, h) + } + default: + d.logger.Error("Unknown window command: %s", command) + } + d.logger.Trace("Got window in message dispatcher: %+v", result) + +} + +// processDialogMessage processes dialog messages +func (d *Dispatcher) processDialogMessage(result *servicebus.Message) { + splitTopic := strings.Split(result.Topic(), ":") + if len(splitTopic) < 4 { + d.logger.Error("Invalid dialog message : %#v", result.Data()) + return + } + + command := splitTopic[1] + switch command { + case "select": + dialogType := splitTopic[2] + switch dialogType { + case "open": + dialogOptions, ok := result.Data().(*dialog.OpenDialog) + if !ok { + d.logger.Error("Invalid data for 'dialog:select:open' : %#v", result.Data()) + return + } + // This is hardcoded in the sender too + callbackID := splitTopic[3] + + // TODO: Work out what we mean in a multi window environment... + // For now we will just pick the first one + for _, client := range d.clients { + client.frontend.OpenFileDialog(dialogOptions, callbackID) + } + case "openmultiple": + dialogOptions, ok := result.Data().(*dialog.OpenDialog) + if !ok { + d.logger.Error("Invalid data for 'dialog:select:openmultiple' : %#v", result.Data()) + return + } + // This is hardcoded in the sender too + callbackID := splitTopic[3] + + // TODO: Work out what we mean in a multi window environment... + // For now we will just pick the first one + for _, client := range d.clients { + client.frontend.OpenMultipleFilesDialog(dialogOptions, callbackID) + } + case "directory": + dialogOptions, ok := result.Data().(*dialog.OpenDialog) + if !ok { + d.logger.Error("Invalid data for 'dialog:select:directory' : %#v", result.Data()) + return + } + // This is hardcoded in the sender too + callbackID := splitTopic[3] + + // TODO: Work out what we mean in a multi window environment... + // For now we will just pick the first one + for _, client := range d.clients { + client.frontend.OpenDirectoryDialog(dialogOptions, callbackID) + } + case "save": + dialogOptions, ok := result.Data().(*dialog.SaveDialog) + if !ok { + d.logger.Error("Invalid data for 'dialog:select:save' : %#v", result.Data()) + return + } + // This is hardcoded in the sender too + callbackID := splitTopic[3] + + // TODO: Work out what we mean in a multi window environment... + // For now we will just pick the first one + for _, client := range d.clients { + client.frontend.SaveDialog(dialogOptions, callbackID) + } + case "message": + dialogOptions, ok := result.Data().(*dialog.MessageDialog) + if !ok { + d.logger.Error("Invalid data for 'dialog:select:message' : %#v", result.Data()) + return + } + // This is hardcoded in the sender too + callbackID := splitTopic[3] + + // TODO: Work out what we mean in a multi window environment... + // For now we will just pick the first one + for _, client := range d.clients { + client.frontend.MessageDialog(dialogOptions, callbackID) + } + default: + d.logger.Error("Unknown dialog type: %s", dialogType) + } + + default: + d.logger.Error("Unknown dialog command: %s", command) + } + +} + +func (d *Dispatcher) processMenuMessage(result *servicebus.Message) { + splitTopic := strings.Split(result.Topic(), ":") + if len(splitTopic) < 2 { + d.logger.Error("Invalid menu message : %#v", result.Data()) + return + } + + command := splitTopic[1] + switch command { + case "updateappmenu": + + updatedMenu, ok := result.Data().(string) + if !ok { + d.logger.Error("Invalid data for 'menufrontend:updateappmenu' : %#v", + result.Data()) + return + } + + // TODO: Work out what we mean in a multi window environment... + // For now we will just pick the first one + for _, client := range d.clients { + client.frontend.SetApplicationMenu(updatedMenu) + } + + case "settraymenu": + trayMenuJSON, ok := result.Data().(string) + if !ok { + d.logger.Error("Invalid data for 'menufrontend:settraymenu' : %#v", + result.Data()) + return + } + + // TODO: Work out what we mean in a multi window environment... + // For now we will just pick the first one + for _, client := range d.clients { + client.frontend.SetTrayMenu(trayMenuJSON) + } + + case "updatecontextmenu": + updatedContextMenu, ok := result.Data().(string) + if !ok { + d.logger.Error("Invalid data for 'menufrontend:updatecontextmenu' : %#v", + result.Data()) + return + } + + // TODO: Work out what we mean in a multi window environment... + // For now we will just pick the first one + for _, client := range d.clients { + client.frontend.UpdateContextMenu(updatedContextMenu) + } + + case "updatetraymenulabel": + updatedTrayMenuLabel, ok := result.Data().(string) + if !ok { + d.logger.Error("Invalid data for 'menufrontend:updatetraymenulabel' : %#v", + result.Data()) + return + } + + // TODO: Work out what we mean in a multi window environment... + // For now we will just pick the first one + for _, client := range d.clients { + client.frontend.UpdateTrayMenuLabel(updatedTrayMenuLabel) + } + case "deletetraymenu": + traymenuid, ok := result.Data().(string) + if !ok { + d.logger.Error("Invalid data for 'menufrontend:updatetraymenulabel' : %#v", + result.Data()) + return + } + + for _, client := range d.clients { + client.frontend.DeleteTrayMenuByID(traymenuid) + } + + default: + d.logger.Error("Unknown menufrontend command: %s", command) + } +} + +func (d *Dispatcher) Close() { + d.cancel() + d.wg.Wait() +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/runtime/browser.go b/vendor/github.com/wailsapp/wails/v2/internal/runtime/browser.go new file mode 100644 index 0000000..0b1941b --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/runtime/browser.go @@ -0,0 +1,36 @@ +package runtime + +import ( + "fmt" + "os/exec" + "runtime" +) + +// Browser defines all browser related operations +type Browser interface { + Open(target string) error +} + +type browser struct{} + +// Open a url / file using the system default application +// Credit: https://gist.github.com/hyg/9c4afcd91fe24316cbf0 +func (b *browser) Open(target string) error { + var err error + + switch runtime.GOOS { + case "linux": + err = exec.Command("xdg-open", target).Start() + case "windows": + err = exec.Command("rundll32", "url.dll,FileProtocolHandler", target).Start() + case "darwin": + err = exec.Command("open", target).Start() + default: + err = fmt.Errorf("unsupported platform") + } + return err +} + +func newBrowser() *browser { + return &browser{} +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/runtime/dialog.go b/vendor/github.com/wailsapp/wails/v2/internal/runtime/dialog.go new file mode 100644 index 0000000..9141dd6 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/runtime/dialog.go @@ -0,0 +1,172 @@ +package runtime + +import ( + "fmt" + + "github.com/wailsapp/wails/v2/internal/crypto" + "github.com/wailsapp/wails/v2/internal/servicebus" + dialogoptions "github.com/wailsapp/wails/v2/pkg/options/dialog" +) + +// Dialog defines all Dialog related operations +type Dialog interface { + OpenFile(dialogOptions *dialogoptions.OpenDialog) (string, error) + OpenMultipleFiles(dialogOptions *dialogoptions.OpenDialog) ([]string, error) + OpenDirectory(dialogOptions *dialogoptions.OpenDialog) (string, error) + SaveFile(dialogOptions *dialogoptions.SaveDialog) (string, error) + Message(dialogOptions *dialogoptions.MessageDialog) (string, error) +} + +// dialog exposes the Dialog interface +type dialog struct { + bus *servicebus.ServiceBus +} + +// newDialogs creates a new Dialogs struct +func newDialog(bus *servicebus.ServiceBus) Dialog { + return &dialog{ + bus: bus, + } +} + +// processTitleAndFilter return the title and filter from the given params. +// title is the first string, filter is the second +func (r *dialog) processTitleAndFilter(params ...string) (string, string) { + + var title, filter string + + if len(params) > 0 { + title = params[0] + } + + if len(params) > 1 { + filter = params[1] + } + + return title, filter +} + +// OpenDirectory prompts the user to select a directory +func (r *dialog) OpenDirectory(dialogOptions *dialogoptions.OpenDialog) (string, error) { + + // Create unique dialog callback + uniqueCallback := crypto.RandomID() + + // Subscribe to the respose channel + responseTopic := "dialog:opendirectoryselected:" + uniqueCallback + dialogResponseChannel, err := r.bus.Subscribe(responseTopic) + if err != nil { + return "", fmt.Errorf("ERROR: Cannot subscribe to bus topic: %+v\n", err.Error()) + } + + message := "dialog:select:directory:" + uniqueCallback + r.bus.Publish(message, dialogOptions) + + // Wait for result + var result = <-dialogResponseChannel + + // Delete subscription to response topic + r.bus.UnSubscribe(responseTopic) + + return result.Data().(string), nil +} + +// OpenFile prompts the user to select a file +func (r *dialog) OpenFile(dialogOptions *dialogoptions.OpenDialog) (string, error) { + + // Create unique dialog callback + uniqueCallback := crypto.RandomID() + + // Subscribe to the respose channel + responseTopic := "dialog:openselected:" + uniqueCallback + dialogResponseChannel, err := r.bus.Subscribe(responseTopic) + if err != nil { + return "", fmt.Errorf("ERROR: Cannot subscribe to bus topic: %+v\n", err.Error()) + } + + message := "dialog:select:open:" + uniqueCallback + r.bus.Publish(message, dialogOptions) + + // Wait for result + var result = <-dialogResponseChannel + + // Delete subscription to response topic + r.bus.UnSubscribe(responseTopic) + + return result.Data().(string), nil +} + +// OpenMultipleFiles prompts the user to select a file +func (r *dialog) OpenMultipleFiles(dialogOptions *dialogoptions.OpenDialog) ([]string, error) { + + // Create unique dialog callback + uniqueCallback := crypto.RandomID() + + // Subscribe to the respose channel + responseTopic := "dialog:openmultipleselected:" + uniqueCallback + dialogResponseChannel, err := r.bus.Subscribe(responseTopic) + if err != nil { + return nil, fmt.Errorf("ERROR: Cannot subscribe to bus topic: %+v\n", err.Error()) + } + + message := "dialog:select:openmultiple:" + uniqueCallback + r.bus.Publish(message, dialogOptions) + + // Wait for result + var result = <-dialogResponseChannel + + // Delete subscription to response topic + r.bus.UnSubscribe(responseTopic) + + return result.Data().([]string), nil +} + +// SaveFile prompts the user to select a file +func (r *dialog) SaveFile(dialogOptions *dialogoptions.SaveDialog) (string, error) { + + // Create unique dialog callback + uniqueCallback := crypto.RandomID() + + // Subscribe to the respose channel + responseTopic := "dialog:saveselected:" + uniqueCallback + dialogResponseChannel, err := r.bus.Subscribe(responseTopic) + if err != nil { + return "", fmt.Errorf("ERROR: Cannot subscribe to bus topic: %+v\n", err.Error()) + } + + message := "dialog:select:save:" + uniqueCallback + r.bus.Publish(message, dialogOptions) + + // Wait for result + var result = <-dialogResponseChannel + + // Delete subscription to response topic + r.bus.UnSubscribe(responseTopic) + + return result.Data().(string), nil +} + +// Message show a message to the user +func (r *dialog) Message(dialogOptions *dialogoptions.MessageDialog) (string, error) { + + // Create unique dialog callback + uniqueCallback := crypto.RandomID() + + // Subscribe to the respose channel + responseTopic := "dialog:messageselected:" + uniqueCallback + dialogResponseChannel, err := r.bus.Subscribe(responseTopic) + if err != nil { + return "", fmt.Errorf("ERROR: Cannot subscribe to bus topic: %+v\n", err.Error()) + } + + message := "dialog:select:message:" + uniqueCallback + r.bus.Publish(message, dialogOptions) + + // Wait for result + var result = <-dialogResponseChannel + + // Delete subscription to response topic + r.bus.UnSubscribe(responseTopic) + + return result.Data().(string), nil +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/runtime/events.go b/vendor/github.com/wailsapp/wails/v2/internal/runtime/events.go new file mode 100644 index 0000000..b360859 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/runtime/events.go @@ -0,0 +1,86 @@ +package runtime + +import ( + "github.com/wailsapp/wails/v2/internal/messagedispatcher/message" + "github.com/wailsapp/wails/v2/internal/servicebus" +) + +// Events defines all events related operations +type Events interface { + On(eventName string, callback func(optionalData ...interface{})) + Once(eventName string, callback func(optionalData ...interface{})) + OnMultiple(eventName string, callback func(optionalData ...interface{}), maxCallbacks int) + Emit(eventName string, optionalData ...interface{}) + OnThemeChange(callback func(darkMode bool)) +} + +// event exposes the events interface +type event struct { + bus *servicebus.ServiceBus +} + +// newEvents creates a new Events struct +func newEvents(bus *servicebus.ServiceBus) Events { + return &event{ + bus: bus, + } +} + +// On registers a listener for a particular event +func (r *event) On(eventName string, callback func(optionalData ...interface{})) { + eventMessage := &message.OnEventMessage{ + Name: eventName, + Callback: callback, + Counter: -1, + } + r.bus.Publish("event:on", eventMessage) +} + +// Once registers a listener for a particular event. After the first callback, the +// listener is deleted. +func (r *event) Once(eventName string, callback func(optionalData ...interface{})) { + eventMessage := &message.OnEventMessage{ + Name: eventName, + Callback: callback, + Counter: 1, + } + r.bus.Publish("event:on", eventMessage) +} + +// OnMultiple registers a listener for a particular event, for a given maximum amount of callbacks. +// Once the callback has been run `maxCallbacks` times, the listener is deleted. +func (r *event) OnMultiple(eventName string, callback func(optionalData ...interface{}), maxCallbacks int) { + eventMessage := &message.OnEventMessage{ + Name: eventName, + Callback: callback, + Counter: maxCallbacks, + } + r.bus.Publish("event:on", eventMessage) +} + +// Emit pass through +func (r *event) Emit(eventName string, optionalData ...interface{}) { + eventMessage := &message.EventMessage{ + Name: eventName, + Data: optionalData, + } + + r.bus.Publish("event:emit:from:g", eventMessage) +} + +// OnThemeChange allows you to register callbacks when the system theme changes +// from light or dark. +func (r *event) OnThemeChange(callback func(darkMode bool)) { + r.On("wails:system:themechange", func(data ...interface{}) { + if len(data) != 1 { + // TODO: Log error + return + } + darkMode, ok := data[0].(bool) + if !ok { + // TODO: Log error + return + } + callback(darkMode) + }) +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/runtime/log.go b/vendor/github.com/wailsapp/wails/v2/internal/runtime/log.go new file mode 100644 index 0000000..16f258e --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/runtime/log.go @@ -0,0 +1,69 @@ +package runtime + +import ( + "github.com/wailsapp/wails/v2/internal/servicebus" + "github.com/wailsapp/wails/v2/pkg/logger" +) + +// Log defines all Log related operations +type Log interface { + Print(message string) + Trace(message string) + Debug(message string) + Info(message string) + Warning(message string) + Error(message string) + Fatal(message string) + SetLogLevel(level logger.LogLevel) +} + +type log struct { + bus *servicebus.ServiceBus +} + +// newLog creates a new Log struct +func newLog(bus *servicebus.ServiceBus) Log { + return &log{ + bus: bus, + } +} + +// Print prints a Print level message +func (r *log) Print(message string) { + r.bus.Publish("log:print", message) +} + +// Trace prints a Trace level message +func (r *log) Trace(message string) { + r.bus.Publish("log:trace", message) +} + +// Debug prints a Debug level message +func (r *log) Debug(message string) { + r.bus.Publish("log:debug", message) +} + +// Info prints a Info level message +func (r *log) Info(message string) { + r.bus.Publish("log:info", message) +} + +// Warning prints a Warning level message +func (r *log) Warning(message string) { + r.bus.Publish("log:warning", message) +} + +// Error prints a Error level message +func (r *log) Error(message string) { + r.bus.Publish("log:error", message) +} + +// Fatal prints a Fatal level message +func (r *log) Fatal(message string) { + r.bus.Publish("log:fatal", message) +} + +// Sets the log level +func (r *log) SetLogLevel(level logger.LogLevel) { + r.bus.Publish("log:setlevel", level) +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/runtime/menu.go b/vendor/github.com/wailsapp/wails/v2/internal/runtime/menu.go new file mode 100644 index 0000000..f4aa804 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/runtime/menu.go @@ -0,0 +1,46 @@ +package runtime + +import ( + "github.com/wailsapp/wails/v2/internal/servicebus" + "github.com/wailsapp/wails/v2/pkg/menu" +) + +// Menu defines all Menu related operations +type Menu interface { + UpdateApplicationMenu() + UpdateContextMenu(contextMenu *menu.ContextMenu) + SetTrayMenu(trayMenu *menu.TrayMenu) + DeleteTrayMenu(trayMenu *menu.TrayMenu) + UpdateTrayMenuLabel(trayMenu *menu.TrayMenu) +} + +type menuRuntime struct { + bus *servicebus.ServiceBus +} + +// newMenu creates a new Menu struct +func newMenu(bus *servicebus.ServiceBus) Menu { + return &menuRuntime{ + bus: bus, + } +} + +func (m *menuRuntime) UpdateApplicationMenu() { + m.bus.Publish("menu:updateappmenu", nil) +} + +func (m *menuRuntime) UpdateContextMenu(contextMenu *menu.ContextMenu) { + m.bus.Publish("menu:updatecontextmenu", contextMenu) +} + +func (m *menuRuntime) SetTrayMenu(trayMenu *menu.TrayMenu) { + m.bus.Publish("menu:settraymenu", trayMenu) +} + +func (m *menuRuntime) UpdateTrayMenuLabel(trayMenu *menu.TrayMenu) { + m.bus.Publish("menu:updatetraymenulabel", trayMenu) +} + +func (m *menuRuntime) DeleteTrayMenu(trayMenu *menu.TrayMenu) { + m.bus.Publish("menu:deletetraymenu", trayMenu) +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/runtime/runtime.go b/vendor/github.com/wailsapp/wails/v2/internal/runtime/runtime.go new file mode 100644 index 0000000..3330366 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/runtime/runtime.go @@ -0,0 +1,40 @@ +package runtime + +import ( + "github.com/wailsapp/wails/v2/internal/servicebus" +) + +// Runtime is a means for the user to interact with the application at runtime +type Runtime struct { + Browser Browser + Events Events + Window Window + Dialog Dialog + System System + Menu Menu + Store *StoreProvider + Log Log + bus *servicebus.ServiceBus +} + +// New creates a new runtime +func New(serviceBus *servicebus.ServiceBus) *Runtime { + result := &Runtime{ + Browser: newBrowser(), + Events: newEvents(serviceBus), + Window: newWindow(serviceBus), + Dialog: newDialog(serviceBus), + System: newSystem(serviceBus), + Menu: newMenu(serviceBus), + Log: newLog(serviceBus), + bus: serviceBus, + } + result.Store = newStore(result) + return result +} + +// Quit the application +func (r *Runtime) Quit() { + // Start shutdown of Wails + r.bus.Publish("quit", "runtime.Quit()") +} diff --git a/vendor/github.com/wailsapp/wails/runtime/store.go b/vendor/github.com/wailsapp/wails/v2/internal/runtime/store.go similarity index 78% rename from vendor/github.com/wailsapp/wails/runtime/store.go rename to vendor/github.com/wailsapp/wails/v2/internal/runtime/store.go index 4468296..4199154 100644 --- a/vendor/github.com/wailsapp/wails/runtime/store.go +++ b/vendor/github.com/wailsapp/wails/v2/internal/runtime/store.go @@ -1,4 +1,4 @@ -// Package runtime contains all the methods and data structures related to the +// package runtime contains all the methods and data structures related to the // runtime library of Wails. This includes both Go and JS runtimes. package runtime @@ -6,9 +6,12 @@ import ( "bytes" "encoding/json" "fmt" - "log" + golog "log" + "os" "reflect" "sync" + + "github.com/wailsapp/wails/v2/internal/deepcopy" ) // Options defines the optional data that may be used @@ -32,8 +35,8 @@ type StoreProvider struct { runtime *Runtime } -// NewStoreProvider creates new stores using the provided Runtime reference. -func NewStoreProvider(runtime *Runtime) *StoreProvider { +// newStore creates new stores using the provided Runtime reference. +func newStore(runtime *Runtime) *StoreProvider { return &StoreProvider{ runtime: runtime, } @@ -56,24 +59,39 @@ type Store struct { errorHandler func(error) } +func fatal(err error) { + println(err.Error()) + os.Exit(1) +} + // New creates a new store func (p *StoreProvider) New(name string, defaultValue interface{}) *Store { - dataType := reflect.TypeOf(defaultValue) + if defaultValue == nil { + golog.Fatal("Cannot initialise a store with nil") + } result := Store{ - name: name, - runtime: p.runtime, - data: reflect.ValueOf(defaultValue), - dataType: dataType, + name: name, + runtime: p.runtime, } // Setup the sync listener result.setupListener() + result.Set(defaultValue) + return &result } +func (s *Store) lock() { + s.mux.Lock() +} + +func (s *Store) unlock() { + s.mux.Unlock() +} + // OnError takes a function that will be called // whenever an error occurs func (s *Store) OnError(callback func(error)) { @@ -100,7 +118,7 @@ func (s *Store) processUpdatedData(data string) error { } // Lock mutex for writing - s.mux.Lock() + s.lock() // Handle nulls if newData == nil { @@ -111,7 +129,7 @@ func (s *Store) processUpdatedData(data string) error { } // Unlock mutex - s.mux.Unlock() + s.unlock() return nil } @@ -135,6 +153,43 @@ func (s *Store) setupListener() { // Notify listeners s.notify() }) + + // Listen for resync events + s.runtime.Events.On("wails:sync:store:resync:"+s.name, func(data ...interface{}) { + // Resetting the curent data will resync + s.resync() + }) + + // Do initial resync + s.resync() +} + +func (s *Store) resync() { + + // Lock + s.lock() + defer s.unlock() + + var result string + + if s.data.IsValid() { + rawdata, err := json.Marshal(s.data.Interface()) + if err != nil { + if s.errorHandler != nil { + s.errorHandler(err) + return + } + } + result = string(rawdata) + } else { + result = "{}" + } + + // Emit event to front end + s.runtime.Events.Emit("wails:sync:store:updatedbybackend:"+s.name, result) + + // Notify subscribers + s.notify() } // notify the listeners of the current data state @@ -144,7 +199,9 @@ func (s *Store) notify() { for _, callback := range s.callbacks { // Build args + s.lock() args := []reflect.Value{s.data} + s.unlock() if s.notifySynchronously { callback.Call(args) @@ -159,30 +216,34 @@ func (s *Store) notify() { // and notify listeners of the change func (s *Store) Set(data interface{}) error { - inType := reflect.TypeOf(data) - - if inType != s.dataType { - return fmt.Errorf("invalid data given in Store.Set(). Expected %s, got %s", s.dataType.String(), inType.String()) + if data == nil { + return fmt.Errorf("cannot set store to nil") } - // Save data - s.mux.Lock() - s.data = reflect.ValueOf(data) - s.mux.Unlock() + s.lock() - // Stringify data - newdata, err := json.Marshal(data) - if err != nil { - if s.errorHandler != nil { - return err + dataCopy := deepcopy.Copy(data) + + if dataCopy != nil { + inType := reflect.TypeOf(dataCopy) + + if inType != s.dataType && s.data.IsValid() { + s.unlock() + return fmt.Errorf("invalid data given in Store.Set(). Expected %s, got %s", s.dataType.String(), inType.String()) } } - // Emit event to front end - s.runtime.Events.Emit("wails:sync:store:updatedbybackend:"+s.name, string(newdata)) + if s.dataType == nil { + s.dataType = reflect.TypeOf(dataCopy) + } - // Notify subscribers - s.notify() + // Save data + s.data = reflect.ValueOf(dataCopy) + + s.unlock() + + // Resync with subscribers + s.resync() return nil } @@ -225,12 +286,14 @@ func (s *Store) Subscribe(callback interface{}) { err := s.callbackCheck(callback) if err != nil { - log.Fatal(err) + fatal(err) } callbackFunc := reflect.ValueOf(callback) + s.lock() s.callbacks = append(s.callbacks, callbackFunc) + s.unlock() } // updaterCheck ensures the given function to Update() is @@ -276,23 +339,29 @@ func (s *Store) Update(updater interface{}) { err := s.updaterCheck(updater) if err != nil { - log.Fatal(err) + fatal(err) } // Build args + s.lock() args := []reflect.Value{s.data} + s.unlock() // Make call results := reflect.ValueOf(updater).Call(args) // We will only have 1 result. Set the store to it - err = s.Set(results[0].Interface()) - if err != nil && s.errorHandler != nil { - s.errorHandler(err) - } + s.Set(results[0].Interface()) } // Get returns the value of the data that's kept in the current state / Store func (s *Store) Get() interface{} { + s.lock() + defer s.unlock() + + if !s.data.IsValid() { + return nil + } + return s.data.Interface() } diff --git a/vendor/github.com/wailsapp/wails/v2/internal/runtime/system.go b/vendor/github.com/wailsapp/wails/v2/internal/runtime/system.go new file mode 100644 index 0000000..681e047 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/runtime/system.go @@ -0,0 +1,60 @@ +package runtime + +import ( + "fmt" + "runtime" + + "github.com/wailsapp/wails/v2/internal/crypto" + "github.com/wailsapp/wails/v2/internal/servicebus" +) + +// System defines all System related operations +type System interface { + IsDarkMode() bool + Platform() string + AppType() string +} + +// system exposes the System interface +type system struct { + bus *servicebus.ServiceBus +} + +// newSystem creates a new System struct +func newSystem(bus *servicebus.ServiceBus) System { + return &system{ + bus: bus, + } +} + +// Platform returns the platform name the application +// is running on +func (r *system) Platform() string { + return runtime.GOOS +} + +// On pass through +func (r *system) IsDarkMode() bool { + + // Create unique system callback + uniqueCallback := crypto.RandomID() + + // Subscribe to the respose channel + responseTopic := "systemresponse:" + uniqueCallback + systemResponseChannel, err := r.bus.Subscribe(responseTopic) + if err != nil { + fmt.Printf("ERROR: Cannot subscribe to bus topic: %+v\n", err.Error()) + return false + } + + message := "system:isdarkmode:" + uniqueCallback + r.bus.Publish(message, nil) + + // Wait for result + var result *servicebus.Message = <-systemResponseChannel + + // Delete subscription to response topic + r.bus.UnSubscribe(responseTopic) + + return result.Data().(bool) +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/runtime/system_default.go b/vendor/github.com/wailsapp/wails/v2/internal/runtime/system_default.go new file mode 100644 index 0000000..025baf3 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/runtime/system_default.go @@ -0,0 +1,8 @@ +// +build !desktop,!server + +package runtime + +// AppType returns the application type, EG: desktop +func (r *system) AppType() string { + return "default" +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/runtime/system_desktop.go b/vendor/github.com/wailsapp/wails/v2/internal/runtime/system_desktop.go new file mode 100644 index 0000000..e569a85 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/runtime/system_desktop.go @@ -0,0 +1,8 @@ +// +build desktop,!server + +package runtime + +// AppType returns the application type, EG: desktop +func (r *system) AppType() string { + return "desktop" +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/runtime/system_server.go b/vendor/github.com/wailsapp/wails/v2/internal/runtime/system_server.go new file mode 100644 index 0000000..fb17eb0 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/runtime/system_server.go @@ -0,0 +1,8 @@ +// +build server + +package runtime + +// AppType returns the application type, EG: desktop +func (r *system) AppType() string { + return "server" +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/runtime/window.go b/vendor/github.com/wailsapp/wails/v2/internal/runtime/window.go new file mode 100644 index 0000000..ce6efae --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/runtime/window.go @@ -0,0 +1,120 @@ +package runtime + +import ( + "fmt" + + "github.com/wailsapp/wails/v2/internal/servicebus" +) + +// Window defines all Window related operations +type Window interface { + Close() + Center() + Show() + Hide() + Maximise() + Unmaximise() + Minimise() + Unminimise() + SetTitle(title string) + SetSize(width int, height int) + SetMinSize(width int, height int) + SetMaxSize(width int, height int) + SetPosition(x int, y int) + Fullscreen() + UnFullscreen() +} + +// Window exposes the Windows interface +type window struct { + bus *servicebus.ServiceBus +} + +// newWindow creates a new window struct +func newWindow(bus *servicebus.ServiceBus) Window { + return &window{ + bus: bus, + } +} + +// Close the Window +// DISCUSSION: +// Should we even be doing this now we have a server build? +// Runtime.Quit() makes more sense than closing a window... +func (w *window) Close() { + w.bus.Publish("quit", "runtime.Close()") +} + +// SetTitle sets the title of the window +func (w *window) SetTitle(title string) { + w.bus.Publish("window:settitle", title) +} + +// Fullscreen makes the window fullscreen +func (w *window) Fullscreen() { + w.bus.Publish("window:fullscreen", "") +} + +// UnFullscreen makes the window UnFullscreen +func (w *window) UnFullscreen() { + w.bus.Publish("window:unfullscreen", "") +} + +// Center the window on the current screen +func (w *window) Center() { + w.bus.Publish("window:center", "") +} + +// Show shows the window if hidden +func (w *window) Show() { + w.bus.Publish("window:show", "") +} + +// Hide the window +func (w *window) Hide() { + w.bus.Publish("window:hide", "") +} + +// SetSize sets the size of the window +func (w *window) SetSize(width int, height int) { + message := fmt.Sprintf("window:size:%d:%d", width, height) + w.bus.Publish(message, "") +} + +// SetSize sets the size of the window +func (w *window) SetMinSize(width int, height int) { + message := fmt.Sprintf("window:minsize:%d:%d", width, height) + w.bus.Publish(message, "") +} + +// SetSize sets the size of the window +func (w *window) SetMaxSize(width int, height int) { + message := fmt.Sprintf("window:maxsize:%d:%d", width, height) + w.bus.Publish(message, "") +} + +// SetPosition sets the position of the window +func (w *window) SetPosition(x int, y int) { + message := fmt.Sprintf("window:position:%d:%d", x, y) + w.bus.Publish(message, "") +} + +// Maximise the window +func (w *window) Maximise() { + w.bus.Publish("window:maximise", "") +} + +// Unmaximise the window +func (w *window) Unmaximise() { + w.bus.Publish("window:unmaximise", "") +} + +// Minimise the window +func (w *window) Minimise() { + w.bus.Publish("window:minimise", "") +} + +// Unminimise the window +func (w *window) Unminimise() { + w.bus.Publish("window:unminimise", "") +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/servicebus/message.go b/vendor/github.com/wailsapp/wails/v2/internal/servicebus/message.go new file mode 100644 index 0000000..aea95f5 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/servicebus/message.go @@ -0,0 +1,43 @@ +package servicebus + +// Message is a service bus message that contains a +// topic and data +type Message struct { + topic string + data interface{} + target string +} + +// NewMessage creates a new message with the given +// topic and data +func NewMessage(topic string, data interface{}) *Message { + return &Message{ + topic: topic, + data: data, + } +} + +// NewMessageForTarget creates a new message with the given +// topic and data +func NewMessageForTarget(topic string, data interface{}, target string) *Message { + return &Message{ + topic: topic, + data: data, + target: target, + } +} + +// Topic returns the message topic +func (m *Message) Topic() string { + return m.topic +} + +// Data returns the message data +func (m *Message) Data() interface{} { + return m.data +} + +// Target returns the message Target +func (m *Message) Target() string { + return m.target +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/servicebus/servicebus.go b/vendor/github.com/wailsapp/wails/v2/internal/servicebus/servicebus.go new file mode 100644 index 0000000..86faa9a --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/servicebus/servicebus.go @@ -0,0 +1,181 @@ +package servicebus + +import ( + "context" + "fmt" + "strings" + "sync" + + "github.com/wailsapp/wails/v2/internal/logger" +) + +// ServiceBus is a messaging bus for Wails applications +type ServiceBus struct { + listeners map[string][]chan *Message + messageQueue chan *Message + lock sync.RWMutex + closed bool + debug bool + logger logger.CustomLogger + ctx context.Context + cancel context.CancelFunc +} + +// New creates a new ServiceBus +// The internal message queue is set to 100 messages +// Listener queues are set to 10 +func New(logger *logger.Logger) *ServiceBus { + + ctx, cancel := context.WithCancel(context.Background()) + return &ServiceBus{ + listeners: make(map[string][]chan *Message), + messageQueue: make(chan *Message, 100), + logger: logger.CustomLogger("Service Bus"), + ctx: ctx, + cancel: cancel, + } +} + +// dispatch the given message to the listeners +func (s *ServiceBus) dispatchMessage(message *Message) { + + // Lock to prevent additions to the listeners + s.lock.RLock() + defer s.lock.RUnlock() + + // Iterate over listener's topics + for topic := range s.listeners { + + // If the topic matches + if strings.HasPrefix(message.Topic(), topic) { + + // Iterate over the listeners + for _, callback := range s.listeners[topic] { + + // Process the message + callback <- message + } + } + } +} + +// Debug puts the service bus into debug mode. +func (s *ServiceBus) Debug() { + s.debug = true +} + +// Start the service bus +func (s *ServiceBus) Start() error { + + // Prevent starting when closed + if s.closed { + return fmt.Errorf("cannot call start on closed servicebus") + } + + s.logger.Trace("Starting") + + go func() { + defer s.logger.Trace("Stopped") + + // Loop until we get a quit message + for { + + select { + case <-s.ctx.Done(): + return + + // Listen for messages + case message := <-s.messageQueue: + + // Log message if in debug mode + if s.debug { + s.logger.Trace("Got message: { Topic: %s, Interface: %#v }", message.Topic(), message.Data()) + } + // Dispatch message + s.dispatchMessage(message) + } + } + + }() + + return nil +} + +// Stop the service bus +func (s *ServiceBus) Stop() error { + + // Prevent subscribing when closed + if s.closed { + return fmt.Errorf("cannot call stop on closed servicebus") + } + + s.closed = true + + // Send quit message + s.cancel() + + // Close down subscriber channels + s.lock.Lock() + defer s.lock.Unlock() + + for _, subscribers := range s.listeners { + for _, channel := range subscribers { + close(channel) + } + } + + // Close message queue + close(s.messageQueue) + + return nil +} + +// UnSubscribe removes the listeners for the given topic (Use with caution!) +func (s *ServiceBus) UnSubscribe(topic string) { + // Prevent any reads or writes to the listeners whilst + // we create a new one + s.lock.Lock() + defer s.lock.Unlock() + s.listeners[topic] = nil +} + +// Subscribe is used to register a listener's interest in a topic +func (s *ServiceBus) Subscribe(topic string) (<-chan *Message, error) { + + // Prevent subscribing when closed + if s.closed { + return nil, fmt.Errorf("cannot call subscribe on closed servicebus") + } + + // Prevent any reads or writes to the listeners whilst + // we create a new one + s.lock.Lock() + defer s.lock.Unlock() + + // Append the new listener + listener := make(chan *Message, 10) + s.listeners[topic] = append(s.listeners[topic], listener) + return (<-chan *Message)(listener), nil + +} + +// Publish sends the given message on the service bus +func (s *ServiceBus) Publish(topic string, data interface{}) { + // Prevent publish when closed + if s.closed { + return + } + + message := NewMessage(topic, data) + s.messageQueue <- message +} + +// PublishForTarget sends the given message on the service bus for the given target +func (s *ServiceBus) PublishForTarget(topic string, data interface{}, target string) { + // Prevent publish when closed + if s.closed { + return + } + message := NewMessageForTarget(topic, data, target) + s.messageQueue <- message +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/signal/signal.go b/vendor/github.com/wailsapp/wails/v2/internal/signal/signal.go new file mode 100644 index 0000000..6d38d89 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/signal/signal.go @@ -0,0 +1,73 @@ +package signal + +import ( + "context" + "os" + gosignal "os/signal" + "sync" + "syscall" + + "github.com/wailsapp/wails/v2/internal/logger" + "github.com/wailsapp/wails/v2/internal/servicebus" +) + +// Manager manages signals such as CTRL-C +type Manager struct { + // Service Bus + bus *servicebus.ServiceBus + + // logger + logger logger.CustomLogger + + // signalChannel + signalchannel chan os.Signal + + // ctx + ctx context.Context + cancel context.CancelFunc + + // Parent waitgroup + wg *sync.WaitGroup +} + +// NewManager creates a new signal manager +func NewManager(ctx context.Context, cancel context.CancelFunc, bus *servicebus.ServiceBus, logger *logger.Logger) (*Manager, error) { + + result := &Manager{ + bus: bus, + logger: logger.CustomLogger("Event Manager"), + signalchannel: make(chan os.Signal, 2), + ctx: ctx, + cancel: cancel, + wg: ctx.Value("waitgroup").(*sync.WaitGroup), + } + + return result, nil +} + +// Start the Signal Manager +func (m *Manager) Start() { + + // Hook into interrupts + gosignal.Notify(m.signalchannel, os.Interrupt, syscall.SIGTERM) + + m.wg.Add(1) + + // Spin off signal listener and wait for either a cancellation + // or signal + go func() { + select { + case <-m.signalchannel: + println() + m.logger.Trace("Ctrl+C detected. Shutting down...") + m.bus.Publish("quit", "ctrl-c pressed") + + // Start shutdown of Wails + m.cancel() + + case <-m.ctx.Done(): + } + m.logger.Trace("Shutdown") + m.wg.Done() + }() +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/subsystem/binding.go b/vendor/github.com/wailsapp/wails/v2/internal/subsystem/binding.go new file mode 100644 index 0000000..a51c95b --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/subsystem/binding.go @@ -0,0 +1,69 @@ +package subsystem + +import ( + "github.com/wailsapp/wails/v2/internal/binding" + "github.com/wailsapp/wails/v2/internal/logger" + "github.com/wailsapp/wails/v2/internal/runtime" + "github.com/wailsapp/wails/v2/internal/servicebus" +) + +// Binding is the Binding subsystem. It manages all service bus messages +// starting with "binding". +type Binding struct { + bindingChannel <-chan *servicebus.Message + + running bool + + // Binding db + bindings *binding.Bindings + + // logger + logger logger.CustomLogger + + // runtime + runtime *runtime.Runtime +} + +// NewBinding creates a new binding subsystem. Uses the given bindings db for reference. +func NewBinding(bus *servicebus.ServiceBus, logger *logger.Logger, bindings *binding.Bindings, runtime *runtime.Runtime) (*Binding, error) { + + // Subscribe to event messages + bindingChannel, err := bus.Subscribe("binding") + if err != nil { + return nil, err + } + + result := &Binding{ + bindingChannel: bindingChannel, + logger: logger.CustomLogger("Binding Subsystem"), + bindings: bindings, + runtime: runtime, + } + + return result, nil +} + +// Start the subsystem +func (b *Binding) Start() error { + + b.running = true + + b.logger.Trace("Starting") + + // Spin off a go routine + go func() { + for b.running { + select { + case bindingMessage := <-b.bindingChannel: + b.logger.Trace("Got binding message: %+v", bindingMessage) + } + } + b.logger.Trace("Shutdown") + }() + + return nil +} + +func (b *Binding) Close() { + b.running = false +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/subsystem/call.go b/vendor/github.com/wailsapp/wails/v2/internal/subsystem/call.go new file mode 100644 index 0000000..3937739 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/subsystem/call.go @@ -0,0 +1,211 @@ +package subsystem + +import ( + "context" + "encoding/json" + "fmt" + "strings" + "sync" + + "github.com/wailsapp/wails/v2/pkg/options/dialog" + + "github.com/wailsapp/wails/v2/internal/binding" + "github.com/wailsapp/wails/v2/internal/logger" + "github.com/wailsapp/wails/v2/internal/messagedispatcher/message" + "github.com/wailsapp/wails/v2/internal/runtime" + "github.com/wailsapp/wails/v2/internal/servicebus" +) + +// Call is the Call subsystem. It manages all service bus messages +// starting with "call". +type Call struct { + callChannel <-chan *servicebus.Message + + // quit flag + shouldQuit bool + + // bindings DB + DB *binding.DB + + // ServiceBus + bus *servicebus.ServiceBus + + // logger + logger logger.CustomLogger + + // runtime + runtime *runtime.Runtime + + // context + ctx context.Context + + // parent waitgroup + wg *sync.WaitGroup +} + +// NewCall creates a new call subsystem +func NewCall(ctx context.Context, bus *servicebus.ServiceBus, logger *logger.Logger, DB *binding.DB, runtime *runtime.Runtime) (*Call, error) { + + // Subscribe to event messages + callChannel, err := bus.Subscribe("call:invoke") + if err != nil { + return nil, err + } + + result := &Call{ + callChannel: callChannel, + logger: logger.CustomLogger("Call Subsystem"), + DB: DB, + bus: bus, + runtime: runtime, + ctx: ctx, + wg: ctx.Value("waitgroup").(*sync.WaitGroup), + } + + return result, nil +} + +// Start the subsystem +func (c *Call) Start() error { + + c.wg.Add(1) + + // Spin off a go routine + go func() { + defer c.logger.Trace("Shutdown") + for { + select { + case <-c.ctx.Done(): + c.wg.Done() + return + case callMessage := <-c.callChannel: + c.processCall(callMessage) + } + } + + }() + + return nil +} + +func (c *Call) processCall(callMessage *servicebus.Message) { + + c.logger.Trace("Got message: %+v", callMessage) + + // Extract payload + payload := callMessage.Data().(*message.CallMessage) + + // Lookup method + registeredMethod := c.DB.GetMethod(payload.Name) + + // Check if it's a system call + if strings.HasPrefix(payload.Name, ".wails.") { + c.processSystemCall(payload, callMessage.Target()) + return + } + + // Check we have it + if registeredMethod == nil { + c.sendError(fmt.Errorf("Method not registered"), payload, callMessage.Target()) + return + } + c.logger.Trace("Got registered method: %+v", registeredMethod) + + args, err := registeredMethod.ParseArgs(payload.Args) + if err != nil { + c.sendError(fmt.Errorf("Error parsing arguments: %s", err.Error()), payload, callMessage.Target()) + } + + result, err := registeredMethod.Call(args) + if err != nil { + c.sendError(err, payload, callMessage.Target()) + return + } + c.logger.Trace("registeredMethod.Call: %+v, %+v", result, err) + // process result + c.sendResult(result, payload, callMessage.Target()) + +} + +func (c *Call) processSystemCall(payload *message.CallMessage, clientID string) { + c.logger.Trace("Got internal System call: %+v", payload) + callName := strings.TrimPrefix(payload.Name, ".wails.") + switch callName { + case "IsDarkMode": + darkModeEnabled := c.runtime.System.IsDarkMode() + c.sendResult(darkModeEnabled, payload, clientID) + case "Dialog.Open": + dialogOptions := new(dialog.OpenDialog) + err := json.Unmarshal(payload.Args[0], dialogOptions) + if err != nil { + c.logger.Error("Error decoding: %s", err) + } + result, err := c.runtime.Dialog.OpenFile(dialogOptions) + if err != nil { + c.logger.Error("Error: %s", err) + } + c.sendResult(result, payload, clientID) + case "Dialog.Save": + dialogOptions := new(dialog.SaveDialog) + err := json.Unmarshal(payload.Args[0], dialogOptions) + if err != nil { + c.logger.Error("Error decoding: %s", err) + } + result, err := c.runtime.Dialog.SaveFile(dialogOptions) + if err != nil { + c.logger.Error("Error: %s", err) + } + c.sendResult(result, payload, clientID) + case "Dialog.Message": + dialogOptions := new(dialog.MessageDialog) + err := json.Unmarshal(payload.Args[0], dialogOptions) + if err != nil { + c.logger.Error("Error decoding: %s", err) + } + result, err := c.runtime.Dialog.Message(dialogOptions) + if err != nil { + c.logger.Error("Error: %s", err) + } + c.sendResult(result, payload, clientID) + default: + c.logger.Error("Unknown system call: %+v", callName) + } +} + +func (c *Call) sendResult(result interface{}, payload *message.CallMessage, clientID string) { + c.logger.Trace("Sending success result with CallbackID '%s' : %+v\n", payload.CallbackID, result) + incomingMessage := &CallbackMessage{ + Result: result, + CallbackID: payload.CallbackID, + } + messageData, err := json.Marshal(incomingMessage) + c.logger.Trace("json incomingMessage data: %+v\n", string(messageData)) + if err != nil { + // what now? + c.logger.Fatal(err.Error()) + } + c.bus.PublishForTarget("call:result", string(messageData), clientID) +} + +func (c *Call) sendError(err error, payload *message.CallMessage, clientID string) { + c.logger.Trace("Sending error result with CallbackID '%s' : %+v\n", payload.CallbackID, err.Error()) + incomingMessage := &CallbackMessage{ + Err: err.Error(), + CallbackID: payload.CallbackID, + } + + messageData, err := json.Marshal(incomingMessage) + c.logger.Trace("json incomingMessage data: %+v\n", string(messageData)) + if err != nil { + // what now? + c.logger.Fatal(err.Error()) + } + c.bus.PublishForTarget("call:result", string(messageData), clientID) +} + +// CallbackMessage defines a message that contains the result of a call +type CallbackMessage struct { + Result interface{} `json:"result"` + Err string `json:"error"` + CallbackID string `json:"callbackid"` +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/subsystem/event.go b/vendor/github.com/wailsapp/wails/v2/internal/subsystem/event.go new file mode 100644 index 0000000..d1c3180 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/subsystem/event.go @@ -0,0 +1,191 @@ +package subsystem + +import ( + "context" + "strings" + "sync" + + "github.com/wailsapp/wails/v2/internal/logger" + "github.com/wailsapp/wails/v2/internal/messagedispatcher/message" + "github.com/wailsapp/wails/v2/internal/servicebus" +) + +// eventListener holds a callback function which is invoked when +// the event listened for is emitted. It has a counter which indicates +// how the total number of events it is interested in. A value of zero +// means it does not expire (default). +type eventListener struct { + callback func(...interface{}) // Function to call with emitted event data + counter int // The number of times this callback may be called. -1 = infinite + delete bool // Flag to indicate that this listener should be deleted +} + +// Event is the Eventing subsystem. It manages all service bus messages +// starting with "event". +type Event struct { + eventChannel <-chan *servicebus.Message + + // Event listeners + listeners map[string][]*eventListener + notifyLock sync.RWMutex + + // logger + logger logger.CustomLogger + + // ctx + ctx context.Context + + // parent waitgroup + wg *sync.WaitGroup +} + +// NewEvent creates a new log subsystem +func NewEvent(ctx context.Context, bus *servicebus.ServiceBus, logger *logger.Logger) (*Event, error) { + + // Subscribe to event messages + eventChannel, err := bus.Subscribe("event") + if err != nil { + return nil, err + } + + result := &Event{ + eventChannel: eventChannel, + logger: logger.CustomLogger("Event Subsystem"), + listeners: make(map[string][]*eventListener), + ctx: ctx, + wg: ctx.Value("waitgroup").(*sync.WaitGroup), + } + + return result, nil +} + +// RegisterListener provides a means of subscribing to events of type "eventName" +func (e *Event) RegisterListener(eventName string, callback func(...interface{}), counter int) { + + // Create new eventListener + thisListener := &eventListener{ + callback: callback, + counter: counter, + delete: false, + } + + e.notifyLock.Lock() + // Append the new listener to the listeners slice + e.listeners[eventName] = append(e.listeners[eventName], thisListener) + e.notifyLock.Unlock() +} + +// Start the subsystem +func (e *Event) Start() error { + + e.logger.Trace("Starting") + + e.wg.Add(1) + + // Spin off a go routine + go func() { + defer e.logger.Trace("Shutdown") + for { + select { + case <-e.ctx.Done(): + e.wg.Done() + return + case eventMessage := <-e.eventChannel: + splitTopic := strings.Split(eventMessage.Topic(), ":") + eventType := splitTopic[1] + switch eventType { + case "emit": + if len(splitTopic) != 4 { + e.logger.Error("Received emit message with invalid topic format. Expected 4 sections in topic, got %s", splitTopic) + continue + } + eventSource := splitTopic[3] + e.logger.Trace("Got Event Message: %s %+v", eventMessage.Topic(), eventMessage.Data()) + event := eventMessage.Data().(*message.EventMessage) + eventName := event.Name + switch eventSource { + + case "j": + // Notify Go Subscribers + e.logger.Trace("Notify Go subscribers to event '%s'", eventName) + go e.notifyListeners(eventName, event) + case "g": + // Notify Go listeners + e.logger.Trace("Got Go Event: %s", eventName) + go e.notifyListeners(eventName, event) + default: + e.logger.Error("unknown emit event message: %+v", eventMessage) + } + case "on": + // We wish to subscribe to an event channel + var message *message.OnEventMessage = eventMessage.Data().(*message.OnEventMessage) + eventName := message.Name + callback := message.Callback + e.RegisterListener(eventName, callback, message.Counter) + e.logger.Trace("Registered listener for event '%s' with callback %p", eventName, callback) + default: + e.logger.Error("unknown event message: %+v", eventMessage) + } + } + } + + }() + + return nil +} + +// Notifies listeners for the given event name +func (e *Event) notifyListeners(eventName string, message *message.EventMessage) { + + // Get list of event listeners + listeners := e.listeners[eventName] + if listeners == nil { + e.logger.Trace("No listeners for event '%s'", eventName) + return + } + + // Lock the listeners + e.notifyLock.Lock() + + // We have a dirty flag to indicate that there are items to delete + itemsToDelete := false + + // Callback in goroutine + for _, listener := range listeners { + if listener.counter > 0 { + listener.counter-- + } + + go listener.callback(message.Data...) + + if listener.counter == 0 { + listener.delete = true + itemsToDelete = true + } + } + + // Do we have items to delete? + if itemsToDelete == true { + + // Create a new Listeners slice + var newListeners = []*eventListener{} + + // Iterate over current listeners + for _, listener := range listeners { + // If we aren't deleting the listener, add it to the new list + if !listener.delete { + newListeners = append(newListeners, listener) + } + } + + // Save new listeners or remove entry + if len(newListeners) > 0 { + e.listeners[eventName] = newListeners + } else { + delete(e.listeners, eventName) + } + } + + // Unlock + e.notifyLock.Unlock() +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/subsystem/log.go b/vendor/github.com/wailsapp/wails/v2/internal/subsystem/log.go new file mode 100644 index 0000000..023d2d1 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/subsystem/log.go @@ -0,0 +1,118 @@ +package subsystem + +import ( + "context" + "strconv" + "strings" + "sync" + + "github.com/wailsapp/wails/v2/internal/logger" + "github.com/wailsapp/wails/v2/internal/runtime" + "github.com/wailsapp/wails/v2/internal/servicebus" +) + +// Log is the Logging subsystem. It handles messages with topics starting +// with "log:" +type Log struct { + logChannel <-chan *servicebus.Message + + // quit flag + shouldQuit bool + + // Logger! + logger *logger.Logger + + // Loglevel store + logLevelStore *runtime.Store + + // Context for shutdown + ctx context.Context + cancel context.CancelFunc + + // internal waitgroup + wg sync.WaitGroup +} + +// NewLog creates a new log subsystem +func NewLog(bus *servicebus.ServiceBus, logger *logger.Logger, logLevelStore *runtime.Store) (*Log, error) { + + // Subscribe to log messages + logChannel, err := bus.Subscribe("log") + if err != nil { + return nil, err + } + + ctx, cancel := context.WithCancel(context.Background()) + + result := &Log{ + logChannel: logChannel, + logger: logger, + logLevelStore: logLevelStore, + ctx: ctx, + cancel: cancel, + } + + return result, nil +} + +// Start the subsystem +func (l *Log) Start() error { + + l.wg.Add(1) + + // Spin off a go routine + go func() { + defer l.logger.Trace("Logger Shutdown") + + for l.shouldQuit == false { + select { + case <-l.ctx.Done(): + l.wg.Done() + return + case logMessage := <-l.logChannel: + logType := strings.TrimPrefix(logMessage.Topic(), "log:") + switch logType { + case "print": + l.logger.Print(logMessage.Data().(string)) + case "trace": + l.logger.Trace(logMessage.Data().(string)) + case "debug": + l.logger.Debug(logMessage.Data().(string)) + case "info": + l.logger.Info(logMessage.Data().(string)) + case "warning": + l.logger.Warning(logMessage.Data().(string)) + case "error": + l.logger.Error(logMessage.Data().(string)) + case "fatal": + l.logger.Fatal(logMessage.Data().(string)) + case "setlevel": + switch inLevel := logMessage.Data().(type) { + case logger.LogLevel: + l.logger.SetLogLevel(inLevel) + l.logLevelStore.Set(inLevel) + case string: + uint64level, err := strconv.ParseUint(inLevel, 10, 8) + if err != nil { + l.logger.Error("Error parsing log level: %+v", inLevel) + continue + } + level := logger.LogLevel(uint64level) + l.logLevelStore.Set(level) + l.logger.SetLogLevel(level) + } + + default: + l.logger.Error("unknown log message: %+v", logMessage) + } + } + } + }() + + return nil +} + +func (l *Log) Close() { + l.cancel() + l.wg.Wait() +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/subsystem/menu.go b/vendor/github.com/wailsapp/wails/v2/internal/subsystem/menu.go new file mode 100644 index 0000000..2a65527 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/subsystem/menu.go @@ -0,0 +1,176 @@ +package subsystem + +import ( + "context" + "encoding/json" + "strings" + "sync" + + "github.com/wailsapp/wails/v2/pkg/menu" + + "github.com/wailsapp/wails/v2/internal/logger" + "github.com/wailsapp/wails/v2/internal/menumanager" + "github.com/wailsapp/wails/v2/internal/servicebus" +) + +// Menu is the subsystem that handles the operation of menus. It manages all service bus messages +// starting with "menu". +type Menu struct { + menuChannel <-chan *servicebus.Message + + // shutdown flag + shouldQuit bool + + // logger + logger logger.CustomLogger + + // Service Bus + bus *servicebus.ServiceBus + + // Menu Manager + menuManager *menumanager.Manager + + // ctx + ctx context.Context + + // parent waitgroup + wg *sync.WaitGroup +} + +// NewMenu creates a new menu subsystem +func NewMenu(ctx context.Context, bus *servicebus.ServiceBus, logger *logger.Logger, menuManager *menumanager.Manager) (*Menu, error) { + + // Subscribe to menu messages + menuChannel, err := bus.Subscribe("menu:") + if err != nil { + return nil, err + } + + result := &Menu{ + menuChannel: menuChannel, + logger: logger.CustomLogger("Menu Subsystem"), + bus: bus, + menuManager: menuManager, + ctx: ctx, + wg: ctx.Value("waitgroup").(*sync.WaitGroup), + } + + return result, nil +} + +// Start the subsystem +func (m *Menu) Start() error { + + m.logger.Trace("Starting") + + m.wg.Add(1) + + // Spin off a go routine + go func() { + defer m.logger.Trace("Shutdown") + for { + select { + case <-m.ctx.Done(): + m.wg.Done() + return + case menuMessage := <-m.menuChannel: + splitTopic := strings.Split(menuMessage.Topic(), ":") + menuMessageType := splitTopic[1] + switch menuMessageType { + case "ontrayopen": + trayID := menuMessage.Data().(string) + m.menuManager.OnTrayMenuOpen(trayID) + case "ontrayclose": + trayID := menuMessage.Data().(string) + m.menuManager.OnTrayMenuClose(trayID) + case "clicked": + if len(splitTopic) != 2 { + m.logger.Error("Received clicked message with invalid topic format. Expected 2 sections in topic, got %s", splitTopic) + continue + } + m.logger.Trace("Got Menu clicked Message: %s %+v", menuMessage.Topic(), menuMessage.Data()) + + type ClickCallbackMessage struct { + MenuItemID string `json:"menuItemID"` + MenuType string `json:"menuType"` + Data string `json:"data"` + ParentID string `json:"parentID"` + } + + var callbackData ClickCallbackMessage + payload := []byte(menuMessage.Data().(string)) + err := json.Unmarshal(payload, &callbackData) + if err != nil { + m.logger.Error("%s", err.Error()) + return + } + + err = m.menuManager.ProcessClick(callbackData.MenuItemID, callbackData.Data, callbackData.MenuType, callbackData.ParentID) + if err != nil { + m.logger.Trace("%s", err.Error()) + } + + // Make sure we catch any menu updates + case "updateappmenu": + updatedMenu, err := m.menuManager.UpdateApplicationMenu() + if err != nil { + m.logger.Trace("%s", err.Error()) + return + } + + // Notify frontend of menu change + m.bus.Publish("menufrontend:updateappmenu", updatedMenu) + + case "updatecontextmenu": + contextMenu := menuMessage.Data().(*menu.ContextMenu) + updatedMenu, err := m.menuManager.UpdateContextMenu(contextMenu) + if err != nil { + m.logger.Trace("%s", err.Error()) + return + } + + // Notify frontend of menu change + m.bus.Publish("menufrontend:updatecontextmenu", updatedMenu) + + case "settraymenu": + trayMenu := menuMessage.Data().(*menu.TrayMenu) + updatedMenu, err := m.menuManager.SetTrayMenu(trayMenu) + if err != nil { + m.logger.Trace("%s", err.Error()) + return + } + + // Notify frontend of menu change + m.bus.Publish("menufrontend:settraymenu", updatedMenu) + + case "deletetraymenu": + trayMenu := menuMessage.Data().(*menu.TrayMenu) + trayID, err := m.menuManager.GetTrayID(trayMenu) + if err != nil { + m.logger.Trace("%s", err.Error()) + return + } + + // Notify frontend of menu change + m.bus.Publish("menufrontend:deletetraymenu", trayID) + + case "updatetraymenulabel": + trayMenu := menuMessage.Data().(*menu.TrayMenu) + updatedLabel, err := m.menuManager.UpdateTrayMenuLabel(trayMenu) + if err != nil { + m.logger.Trace("%s", err.Error()) + return + } + + // Notify frontend of menu change + m.bus.Publish("menufrontend:updatetraymenulabel", updatedLabel) + + default: + m.logger.Error("unknown menu message: %+v", menuMessage) + } + } + } + }() + + return nil +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/subsystem/runtime.go b/vendor/github.com/wailsapp/wails/v2/internal/subsystem/runtime.go new file mode 100644 index 0000000..2c67a29 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/subsystem/runtime.go @@ -0,0 +1,157 @@ +package subsystem + +import ( + "context" + "fmt" + "github.com/wailsapp/wails/v2/internal/logger" + "github.com/wailsapp/wails/v2/internal/runtime" + "github.com/wailsapp/wails/v2/internal/servicebus" + "strings" + "sync" +) + +// Runtime is the Runtime subsystem. It handles messages with topics starting +// with "runtime:" +type Runtime struct { + runtimeChannel <-chan *servicebus.Message + + // The hooks channel allows us to hook into frontend startup + hooksChannel <-chan *servicebus.Message + startupCallback func(*runtime.Runtime) + shutdownCallback func() + + // quit flag + shouldQuit bool + + logger logger.CustomLogger + + // Runtime library + runtime *runtime.Runtime + + //ctx + ctx context.Context + + // Startup Hook + startupOnce sync.Once + + // Service bus + bus *servicebus.ServiceBus +} + +// NewRuntime creates a new runtime subsystem +func NewRuntime(ctx context.Context, bus *servicebus.ServiceBus, logger *logger.Logger, startupCallback func(*runtime.Runtime)) (*Runtime, error) { + + // Subscribe to log messages + runtimeChannel, err := bus.Subscribe("runtime:") + if err != nil { + return nil, err + } + + // Subscribe to log messages + hooksChannel, err := bus.Subscribe("hooks:") + if err != nil { + return nil, err + } + + result := &Runtime{ + runtimeChannel: runtimeChannel, + hooksChannel: hooksChannel, + logger: logger.CustomLogger("Runtime Subsystem"), + runtime: runtime.New(bus), + startupCallback: startupCallback, + ctx: ctx, + bus: bus, + } + + return result, nil +} + +// Start the subsystem +func (r *Runtime) Start() error { + + // Spin off a go routine + go func() { + defer r.logger.Trace("Shutdown") + for { + select { + case hooksMessage := <-r.hooksChannel: + r.logger.Trace(fmt.Sprintf("Received hooksmessage: %+v", hooksMessage)) + messageSlice := strings.Split(hooksMessage.Topic(), ":") + hook := messageSlice[1] + switch hook { + case "startup": + if r.startupCallback != nil { + r.startupOnce.Do(func() { + go func() { + r.startupCallback(r.runtime) + + // If we got a url, publish it now startup completed + url, ok := hooksMessage.Data().(string) + if ok && len(url) > 0 { + r.bus.Publish("url:handler", url) + } + }() + }) + } else { + r.logger.Warning("no startup callback registered!") + } + default: + r.logger.Error("unknown hook message: %+v", hooksMessage) + continue + } + case runtimeMessage := <-r.runtimeChannel: + r.logger.Trace(fmt.Sprintf("Received message: %+v", runtimeMessage)) + // Topics have the format: "runtime:category:call" + messageSlice := strings.Split(runtimeMessage.Topic(), ":") + if len(messageSlice) != 3 { + r.logger.Error("Invalid runtime message: %#v\n", runtimeMessage) + continue + } + + category := messageSlice[1] + method := messageSlice[2] + var err error + switch category { + case "browser": + err = r.processBrowserMessage(method, runtimeMessage.Data()) + default: + err = fmt.Errorf("unknown runtime message: %+v", + runtimeMessage) + } + + // If we had an error, log it + if err != nil { + r.logger.Error(err.Error()) + } + case <-r.ctx.Done(): + return + } + } + }() + + return nil +} + +// GoRuntime returns the Go Runtime object +func (r *Runtime) GoRuntime() *runtime.Runtime { + return r.runtime +} + +func (r *Runtime) processBrowserMessage(method string, data interface{}) error { + switch method { + case "open": + target, ok := data.(string) + if !ok { + return fmt.Errorf("expected 1 string parameter for runtime:browser:open") + } + go func() { + err := r.runtime.Browser.Open(target) + if err != nil { + r.logger.Error(err.Error()) + } + }() + default: + return fmt.Errorf("unknown method runtime:browser:%s", method) + } + return nil +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/subsystem/url.go b/vendor/github.com/wailsapp/wails/v2/internal/subsystem/url.go new file mode 100644 index 0000000..83cde87 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/subsystem/url.go @@ -0,0 +1,98 @@ +package subsystem + +import ( + "context" + "strings" + "sync" + + "github.com/wailsapp/wails/v2/internal/logger" + "github.com/wailsapp/wails/v2/internal/servicebus" +) + +// URL is the URL Handler subsystem. It handles messages with topics starting +// with "url:" +type URL struct { + urlChannel <-chan *servicebus.Message + + // quit flag + shouldQuit bool + + // Logger! + logger *logger.Logger + + // Context for shutdown + ctx context.Context + cancel context.CancelFunc + + // internal waitgroup + wg sync.WaitGroup + + // Handlers + handlers map[string]func(string) +} + +// NewURL creates a new log subsystem +func NewURL(bus *servicebus.ServiceBus, logger *logger.Logger, handlers map[string]func(string)) (*URL, error) { + + // Subscribe to log messages + urlChannel, err := bus.Subscribe("url") + if err != nil { + return nil, err + } + + ctx, cancel := context.WithCancel(context.Background()) + + result := &URL{ + urlChannel: urlChannel, + logger: logger, + ctx: ctx, + cancel: cancel, + handlers: handlers, + } + + return result, nil +} + +// Start the subsystem +func (u *URL) Start() error { + + u.wg.Add(1) + + // Spin off a go routine + go func() { + defer u.logger.Trace("URL Shutdown") + + for u.shouldQuit == false { + select { + case <-u.ctx.Done(): + u.wg.Done() + return + case urlMessage := <-u.urlChannel: + // Guard against nil messages + if urlMessage == nil { + continue + } + messageType := strings.TrimPrefix(urlMessage.Topic(), "url:") + switch messageType { + case "handler": + url := urlMessage.Data().(string) + splitURL := strings.Split(url, ":") + protocol := splitURL[0] + callback, ok := u.handlers[protocol] + if ok { + go callback(url) + } + default: + u.logger.Error("unknown url message: %+v", urlMessage) + } + } + } + }() + + return nil +} + +func (u *URL) Close() { + u.cancel() + u.wg.Wait() +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/webserver/routes.go b/vendor/github.com/wailsapp/wails/v2/internal/webserver/routes.go new file mode 100644 index 0000000..3b65b2e --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/webserver/routes.go @@ -0,0 +1,49 @@ +package webserver + +import ( + "encoding/json" + "fmt" + "net/http" + "strings" +) + +func (w *WebServer) setUpRoutes() error { + // Handle Index + assets + http.HandleFunc("/", w.serveAssets) + + // Handle Bindings + http.HandleFunc("/bindings.js", w.serveBindings) + + // Handle Wails + http.HandleFunc("/wails.js", w.serveWails) + + // Handle websocket connection + http.HandleFunc("/ws", w.websocketConnection) + + return nil +} + +func (w *WebServer) serveAssets(resp http.ResponseWriter, req *http.Request) { + fileserver := http.FileServer(w.assets) + fileserver.ServeHTTP(resp, req) +} + +func (w *WebServer) serveBindings(resp http.ResponseWriter, req *http.Request) { + resp.Header().Add("content-type", "application/javascript") + bindings, err := w.bindings.ToJSON() + if err != nil { + w.logger.Error("Failed to convert bindings to JSON: %v", err) + fmt.Fprintf(resp, "") + return + } + w.logger.Debug("Sending bindings to webclient: %v", bindings) + b, _ := json.Marshal(bindings) + fmt.Fprintf(resp, fmt.Sprintf("window.wailsbindings=%s; window.SetBindings(window.wailsbindings);", b)) +} + +func (w *WebServer) serveWails(resp http.ResponseWriter, req *http.Request) { + resp.Header().Add("content-type", "application/javascript") + if data, err := w.assets.String("/wails.js"); err == nil { + fmt.Fprintf(resp, strings.Replace(data, ":8080", fmt.Sprintf(":%d", w.port), 1)) + } +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/webserver/webassets.go b/vendor/github.com/wailsapp/wails/v2/internal/webserver/webassets.go new file mode 100644 index 0000000..9f73c8f --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/webserver/webassets.go @@ -0,0 +1,9 @@ +package webserver + +import "github.com/wailsapp/wails/v2/internal/assetdb" + +var ( + // WebAssets is our single asset db instance. + // It will be constructed by a dynamically generated method in this directory. + WebAssets *assetdb.AssetDB = assetdb.NewAssetDB() +) diff --git a/vendor/github.com/wailsapp/wails/v2/internal/webserver/webserver.go b/vendor/github.com/wailsapp/wails/v2/internal/webserver/webserver.go new file mode 100644 index 0000000..4b143d2 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/webserver/webserver.go @@ -0,0 +1,87 @@ +package webserver + +import ( + "fmt" + "net/http" + "sync" + + "github.com/wailsapp/wails/v2/internal/assetdb" + "github.com/wailsapp/wails/v2/internal/binding" + "github.com/wailsapp/wails/v2/internal/logger" + "github.com/wailsapp/wails/v2/internal/messagedispatcher" + "github.com/wailsapp/wails/v2/internal/subsystem" +) + +// WebServer serves the application over http +type WebServer struct { + port int + ip string + assets *assetdb.AssetDB + logger *logger.Logger + dispatcher *messagedispatcher.Dispatcher + event *subsystem.Event + server *http.Server + bindings *binding.Bindings + + lock sync.Mutex + connections map[string]*WebClient +} + +// NewWebServer creates a new WebServer +func NewWebServer(logger *logger.Logger) *WebServer { + + // Return a WebServer with default values + return &WebServer{ + assets: db, + connections: make(map[string]*WebClient), + logger: logger, + } +} + +// URL returns the URL that the server is serving from +func (w *WebServer) URL() string { + return fmt.Sprintf("http://%s:%d", w.ip, w.port) +} + +// SetPort sets the server port to listen on +func (w *WebServer) SetPort(port int) { + w.port = port +} + +// SetIP sets the server ip to listen on +func (w *WebServer) SetIP(ip string) { + w.ip = ip +} + +// SetBindings provides the webserver with the mapping of bindings to provide to a client +func (w *WebServer) SetBindings(bindings *binding.Bindings) { + w.bindings = bindings +} + +// Start the webserver +func (w *WebServer) Start(dispatcher *messagedispatcher.Dispatcher, event *subsystem.Event) error { + var err error + + // Create the server + w.server = &http.Server{Addr: fmt.Sprintf("%s:%d", w.ip, w.port)} + w.event = event + + // Set up the Web Server's routes + err = w.setUpRoutes() + if err != nil { + return err + } + + // Save the dispatcher + w.dispatcher = dispatcher + + // Start the WebServer + err = w.server.ListenAndServe() + + // Return any error except http.ErrServerClosed + if err != nil && err != http.ErrServerClosed { + return err + } + + return nil +} diff --git a/vendor/github.com/wailsapp/wails/v2/internal/webserver/websockets.go b/vendor/github.com/wailsapp/wails/v2/internal/webserver/websockets.go new file mode 100644 index 0000000..98a209b --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/internal/webserver/websockets.go @@ -0,0 +1,218 @@ +package webserver + +import ( + "context" + "github.com/wailsapp/wails/v2/pkg/menu" + "github.com/wailsapp/wails/v2/pkg/options/dialog" + "net/http" + "strings" + + "github.com/wailsapp/wails/v2/internal/logger" + ws "nhooyr.io/websocket" + "nhooyr.io/websocket/wsjson" +) + +// WebClient represents an individual web session +type WebClient struct { + conn *ws.Conn + identifier string + logger *logger.Logger + running bool +} + +func (wc *WebClient) SetTrayMenu(trayMenuJSON string) { + wc.logger.Info("Not implemented in server build") +} + +func (wc *WebClient) UpdateTrayMenuLabel(trayMenuJSON string) { + wc.logger.Info("Not implemented in server build") +} + +func (wc *WebClient) MessageDialog(dialogOptions *dialog.MessageDialog, callbackID string) { + wc.logger.Info("Not implemented in server build") +} + +func (wc *WebClient) SetApplicationMenu(menuJSON string) { + wc.logger.Info("Not implemented in server build") +} + +func (wc *WebClient) UpdateTrayMenu(trayMenuJSON string) { + wc.logger.Info("Not implemented in server build") +} + +func (wc *WebClient) UpdateContextMenu(contextMenuJSON string) { + wc.logger.Info("Not implemented in server build") +} + +func (wc *WebClient) OpenDialog(dialogOptions *dialog.OpenDialog, callbackID string) { + wc.logger.Info("Not implemented in server build") +} + +func (wc *WebClient) SaveDialog(dialogOptions *dialog.SaveDialog, callbackID string) { + wc.logger.Info("Not implemented in server build") +} + +func (wc *WebClient) WindowShow() { + wc.logger.Info("Not implemented in server build") +} + +func (wc *WebClient) WindowHide() { + wc.logger.Info("Not implemented in server build") +} + +func (wc *WebClient) WindowCenter() { + wc.logger.Info("Not implemented in server build") +} + +func (wc *WebClient) WindowMaximise() { + wc.logger.Info("Not implemented in server build") +} + +func (wc *WebClient) WindowUnmaximise() { + wc.logger.Info("Not implemented in server build") +} + +func (wc *WebClient) WindowMinimise() { + wc.logger.Info("Not implemented in server build") +} + +func (wc *WebClient) WindowUnminimise() { + wc.logger.Info("Not implemented in server build") +} + +func (wc *WebClient) WindowPosition(x int, y int) { + wc.logger.Info("Not implemented in server build") +} + +func (wc *WebClient) WindowSize(width int, height int) { + wc.logger.Info("Not implemented in server build") +} + +func (wc *WebClient) DarkModeEnabled(callbackID string) { + wc.logger.Info("Not implemented in server build") +} + +func (wc *WebClient) UpdateMenu(menu *menu.Menu) { + wc.logger.Info("Not implemented in server build") +} + +func (wc *WebClient) UpdateTray(menu *menu.Menu) { + wc.logger.Info("Not implemented in server build") +} + +func (wc *WebClient) UpdateTrayLabel(label string) { + wc.logger.Info("Not implemented in server build") +} + +func (wc *WebClient) UpdateTrayIcon(name string) { + wc.logger.Info("Not implemented in server build") +} + +// Quit terminates the webclient session +func (wc *WebClient) Quit() { + wc.running = false +} + +// NotifyEvent sends the event +func (wc *WebClient) NotifyEvent(message string) { + wc.SendMessage("E" + message) +} + +// CallResult sends the result of the Go function call back to the +// originator in the frontend +func (wc *WebClient) CallResult(message string) { + wc.SendMessage("R" + message) +} + +// WindowSetTitle is a noop in the webclient +func (wc *WebClient) WindowSetTitle(title string) {} + +// WindowFullscreen is a noop in the webclient +func (wc *WebClient) WindowFullscreen() {} + +// WindowUnFullscreen is a noop in the webclient +func (wc *WebClient) WindowUnFullscreen() {} + +// WindowSetColour is a noop in the webclient +func (wc *WebClient) WindowSetColour(colour int) { +} + +// Run processes messages from the remote webclient +func (wc *WebClient) Run(w *WebServer) { + dispatcher := w.dispatcher.RegisterClient(wc) + defer w.dispatcher.RemoveClient(dispatcher) + defer w.unregisterClient(wc.identifier) + + for wc.running { + var v interface{} + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + if err := wsjson.Read(ctx, wc.conn, &v); err != nil { + if ws.CloseStatus(err) == ws.StatusNormalClosure || ws.CloseStatus(err) == ws.StatusGoingAway { + break + } + if ws.CloseStatus(err) != -1 { + w.logger.Debug("Connection error: %s - %s", wc.identifier, err) + break + } + + if !strings.Contains(err.Error(), "status = Status") { + w.logger.Debug("Error encountered on socket: %v", err) + break + } + } + dispatcher.DispatchMessage(v.(string)) + } + + err := wc.conn.Close(ws.StatusNormalClosure, "Goodbye") + if err != nil { + w.logger.Error("Error encountered on socket: %v", err) + return + } + w.logger.Debug("Connection closed: %v", wc.identifier) +} + +// SendMessage converts the string to a []byte and passes it to +// the connection's Writer to send to the remote client +// The Writer itself prevents multiple users at the same time. +func (wc *WebClient) SendMessage(message string) { + wc.logger.Debug("WebClient.SendMessage() - %s", message) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + err := wc.conn.Write(ctx, ws.MessageText, []byte(message)) + if err != nil { + wc.logger.Error("Error encountered writing to webclient: %v", err) + } +} + +// unregisterClient is called automatically by a WebClient session during termination +// so that it's registration can be removed +func (w *WebServer) unregisterClient(identifier string) { + w.logger.Debug("Removing WebClient : %v", identifier) + w.lock.Lock() + delete(w.connections, identifier) + w.lock.Unlock() +} + +func (w *WebServer) websocketConnection(resp http.ResponseWriter, req *http.Request) { + conn, err := ws.Accept(resp, req, nil) + if err != nil { + w.logger.Debug("Failed to upgrade websocket connection") + return + } + wc := &WebClient{ + conn: conn, + identifier: req.RemoteAddr, + logger: w.logger, + running: true, + } + w.lock.Lock() + w.connections[wc.identifier] = wc + w.lock.Unlock() + + w.logger.Debug("Connection from: %v", wc.identifier) + + go wc.Run(w) + +} diff --git a/vendor/github.com/wailsapp/wails/v2/pkg/logger/default.go b/vendor/github.com/wailsapp/wails/v2/pkg/logger/default.go new file mode 100644 index 0000000..a7c43d8 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/pkg/logger/default.go @@ -0,0 +1,49 @@ +package logger + +import ( + "os" +) + +// DefaultLogger is a utility to log messages to a number of destinations +type DefaultLogger struct{} + +// NewDefaultLogger creates a new Logger. +func NewDefaultLogger() Logger { + return &DefaultLogger{} +} + +// Print works like Sprintf. +func (l *DefaultLogger) Print(message string) { + println(message) +} + +// Trace level logging. Works like Sprintf. +func (l *DefaultLogger) Trace(message string) { + println("TRACE | " + message) +} + +// Debug level logging. Works like Sprintf. +func (l *DefaultLogger) Debug(message string) { + println("DEBUG | " + message) +} + +// Info level logging. Works like Sprintf. +func (l *DefaultLogger) Info(message string) { + println("INFO | " + message) +} + +// Warning level logging. Works like Sprintf. +func (l *DefaultLogger) Warning(message string) { + println("WARN | " + message) +} + +// Error level logging. Works like Sprintf. +func (l *DefaultLogger) Error(message string) { + println("ERROR | " + message) +} + +// Fatal level logging. Works like Sprintf. +func (l *DefaultLogger) Fatal(message string) { + println("FATAL | " + message) + os.Exit(1) +} diff --git a/vendor/github.com/wailsapp/wails/v2/pkg/logger/filelogger.go b/vendor/github.com/wailsapp/wails/v2/pkg/logger/filelogger.go new file mode 100644 index 0000000..5cf68fc --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/pkg/logger/filelogger.go @@ -0,0 +1,66 @@ +package logger + +import ( + "log" + "os" +) + +// FileLogger is a utility to log messages to a number of destinations +type FileLogger struct { + filename string +} + +// NewFileLogger creates a new Logger. +func NewFileLogger(filename string) Logger { + return &FileLogger{ + filename: filename, + } +} + +// Print works like Sprintf. +func (l *FileLogger) Print(message string) { + f, err := os.OpenFile(l.filename, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) + if err != nil { + log.Fatal(err) + } + if _, err := f.WriteString(message); err != nil { + f.Close() + log.Fatal(err) + } + f.Close() +} + +func (l *FileLogger) Println(message string) { + l.Print(message + "\n") +} + +// Trace level logging. Works like Sprintf. +func (l *FileLogger) Trace(message string) { + l.Println("TRACE | " + message) +} + +// Debug level logging. Works like Sprintf. +func (l *FileLogger) Debug(message string) { + l.Println("DEBUG | " + message) +} + +// Info level logging. Works like Sprintf. +func (l *FileLogger) Info(message string) { + l.Println("INFO | " + message) +} + +// Warning level logging. Works like Sprintf. +func (l *FileLogger) Warning(message string) { + l.Println("WARN | " + message) +} + +// Error level logging. Works like Sprintf. +func (l *FileLogger) Error(message string) { + l.Println("ERROR | " + message) +} + +// Fatal level logging. Works like Sprintf. +func (l *FileLogger) Fatal(message string) { + l.Println("FATAL | " + message) + os.Exit(1) +} diff --git a/vendor/github.com/wailsapp/wails/v2/pkg/logger/logger.go b/vendor/github.com/wailsapp/wails/v2/pkg/logger/logger.go new file mode 100644 index 0000000..362f32a --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/pkg/logger/logger.go @@ -0,0 +1,33 @@ +package logger + +// LogLevel is an unsigned 8bit int +type LogLevel uint8 + +const ( + // TRACE level + TRACE LogLevel = 1 + + // DEBUG level logging + DEBUG LogLevel = 2 + + // INFO level logging + INFO LogLevel = 3 + + // WARNING level logging + WARNING LogLevel = 4 + + // ERROR level logging + ERROR LogLevel = 5 +) + +// Logger specifies the methods required to attach +// a logger to a Wails application +type Logger interface { + Print(message string) + Trace(message string) + Debug(message string) + Info(message string) + Warning(message string) + Error(message string) + Fatal(message string) +} diff --git a/vendor/github.com/wailsapp/wails/v2/pkg/menu/README.md b/vendor/github.com/wailsapp/wails/v2/pkg/menu/README.md new file mode 100644 index 0000000..7c66a10 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/pkg/menu/README.md @@ -0,0 +1,10 @@ +# Menus + +Menu support is heavily inspired by Electron's approach. + +## Features + + * Supports Text, Checkbox, Radio, Submenu and Separator + * Radio groups are defined as any number of adjacent radio items + * UTF-8 menu labels + * UTF-8 menu IDs \ No newline at end of file diff --git a/vendor/github.com/wailsapp/wails/v2/pkg/menu/callback.go b/vendor/github.com/wailsapp/wails/v2/pkg/menu/callback.go new file mode 100644 index 0000000..9ca19f3 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/pkg/menu/callback.go @@ -0,0 +1,8 @@ +package menu + +type CallbackData struct { + MenuItem *MenuItem + ContextData string +} + +type Callback func(*CallbackData) diff --git a/vendor/github.com/wailsapp/wails/v2/pkg/menu/contextmenu.go b/vendor/github.com/wailsapp/wails/v2/pkg/menu/contextmenu.go new file mode 100644 index 0000000..e24b040 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/pkg/menu/contextmenu.go @@ -0,0 +1,13 @@ +package menu + +type ContextMenu struct { + ID string + Menu *Menu +} + +func NewContextMenu(ID string, menu *Menu) *ContextMenu { + return &ContextMenu{ + ID: ID, + Menu: menu, + } +} diff --git a/vendor/github.com/wailsapp/wails/v2/pkg/menu/keys/keys.go b/vendor/github.com/wailsapp/wails/v2/pkg/menu/keys/keys.go new file mode 100644 index 0000000..91edb97 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/pkg/menu/keys/keys.go @@ -0,0 +1,105 @@ +package keys + +import ( + "fmt" + "strings" +) + +// Modifier is actually a string +type Modifier string + +const ( + // CmdOrCtrlKey represents Command on Mac and Control on other platforms + CmdOrCtrlKey Modifier = "cmdorctrl" + // OptionOrAltKey represents Option on Mac and Alt on other platforms + OptionOrAltKey Modifier = "optionoralt" + // ShiftKey represents the shift key on all systems + ShiftKey Modifier = "shift" + // SuperKey represents Command on Mac and the Windows key on the other platforms + SuperKey Modifier = "super" + // ControlKey represents the control key on all systems + ControlKey Modifier = "ctrl" +) + +var modifierMap = map[string]Modifier{ + "cmdorctrl": CmdOrCtrlKey, + "optionoralt": OptionOrAltKey, + "shift": ShiftKey, + "super": SuperKey, + "ctrl": ControlKey, +} + +func parseModifier(text string) (*Modifier, error) { + lowertext := strings.ToLower(text) + result, valid := modifierMap[lowertext] + if !valid { + return nil, fmt.Errorf("'%s' is not a valid modifier", text) + } + + return &result, nil +} + +// Accelerator holds the keyboard shortcut for a menu item +type Accelerator struct { + Key string + Modifiers []Modifier +} + +// Key creates a standard key Accelerator +func Key(key string) *Accelerator { + return &Accelerator{ + Key: strings.ToLower(key), + } +} + +// CmdOrCtrl creates a 'CmdOrCtrl' Accelerator +func CmdOrCtrl(key string) *Accelerator { + return &Accelerator{ + Key: strings.ToLower(key), + Modifiers: []Modifier{CmdOrCtrlKey}, + } +} + +// OptionOrAlt creates a 'OptionOrAlt' Accelerator +func OptionOrAlt(key string) *Accelerator { + return &Accelerator{ + Key: strings.ToLower(key), + Modifiers: []Modifier{OptionOrAltKey}, + } +} + +// Shift creates a 'Shift' Accelerator +func Shift(key string) *Accelerator { + return &Accelerator{ + Key: strings.ToLower(key), + Modifiers: []Modifier{ShiftKey}, + } +} + +// Control creates a 'Control' Accelerator +func Control(key string) *Accelerator { + return &Accelerator{ + Key: strings.ToLower(key), + Modifiers: []Modifier{ControlKey}, + } +} + +// Super creates a 'Super' Accelerator +func Super(key string) *Accelerator { + return &Accelerator{ + Key: strings.ToLower(key), + Modifiers: []Modifier{SuperKey}, + } +} + +// Combo creates an Accelerator with multiple Modifiers +func Combo(key string, modifier1 Modifier, modifier2 Modifier, rest ...Modifier) *Accelerator { + result := &Accelerator{ + Key: key, + Modifiers: []Modifier{modifier1, modifier2}, + } + for _, extra := range rest { + result.Modifiers = append(result.Modifiers, extra) + } + return result +} diff --git a/vendor/github.com/wailsapp/wails/v2/pkg/menu/keys/parser.go b/vendor/github.com/wailsapp/wails/v2/pkg/menu/keys/parser.go new file mode 100644 index 0000000..91a0578 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/pkg/menu/keys/parser.go @@ -0,0 +1,90 @@ +package keys + +import ( + "fmt" + "strconv" + "strings" + + "github.com/leaanthony/slicer" +) + +var namedKeys = slicer.String([]string{"backspace", "tab", "return", "enter", "escape", "left", "right", "up", "down", "space", "delete", "home", "end", "page up", "page down", "f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15", "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23", "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31", "f32", "f33", "f34", "f35", "numlock"}) + +func parseKey(key string) (string, bool) { + + // Lowercase! + key = strings.ToLower(key) + + // Check special case + if key == "plus" { + return "+", true + } + + // Handle named keys + if namedKeys.Contains(key) { + return key, true + } + + // Check we only have a single character + if len(key) != 1 { + return "", false + } + + runeKey := rune(key[0]) + + // This may be too inclusive + if strconv.IsPrint(runeKey) { + return key, true + } + + return "", false + +} + +func Parse(shortcut string) (*Accelerator, error) { + + var result Accelerator + + // Split the shortcut by + + components := strings.Split(shortcut, "+") + + // If we only have one it should be a key + // We require components + if len(components) == 0 { + return nil, fmt.Errorf("no components given to validateComponents") + } + + // Keep track of modifiers we have processed + var modifiersProcessed slicer.StringSlicer + + // Check components + for index, component := range components { + + // If last component + if index == len(components)-1 { + processedkey, validKey := parseKey(component) + if !validKey { + return nil, fmt.Errorf("'%s' is not a valid key", component) + } + result.Key = processedkey + continue + } + + // Not last component - needs to be modifier + lowercaseComponent := strings.ToLower(component) + thisModifier, valid := modifierMap[lowercaseComponent] + if !valid { + return nil, fmt.Errorf("'%s' is not a valid modifier", component) + } + // Needs to be unique + if modifiersProcessed.Contains(lowercaseComponent) { + return nil, fmt.Errorf("Modifier '%s' is defined twice for shortcut: %s", component, shortcut) + } + + // Save this data + result.Modifiers = append(result.Modifiers, thisModifier) + modifiersProcessed.Add(lowercaseComponent) + } + + return &result, nil +} diff --git a/vendor/github.com/wailsapp/wails/v2/pkg/menu/mac.go b/vendor/github.com/wailsapp/wails/v2/pkg/menu/mac.go new file mode 100644 index 0000000..a91ce00 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/pkg/menu/mac.go @@ -0,0 +1,10 @@ +package menu + +// DefaultMacMenu returns a default menu including the default +// Application and Edit menus. Use `.Append()` to add to it. +func DefaultMacMenu() *Menu { + return NewMenuFromItems( + AppMenu(), + EditMenu(), + ) +} diff --git a/vendor/github.com/wailsapp/wails/v2/pkg/menu/menu.go b/vendor/github.com/wailsapp/wails/v2/pkg/menu/menu.go new file mode 100644 index 0000000..be04820 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/pkg/menu/menu.go @@ -0,0 +1,42 @@ +package menu + +type Menu struct { + Items []*MenuItem +} + +func NewMenu() *Menu { + return &Menu{} +} + +func (m *Menu) Append(item *MenuItem) { + m.Items = append(m.Items, item) +} + +// Merge will append the items in the given menu +// into this menu +func (m *Menu) Merge(menu *Menu) { + for _, item := range menu.Items { + m.Items = append(m.Items, item) + } +} + +func (m *Menu) Prepend(item *MenuItem) { + m.Items = append([]*MenuItem{item}, m.Items...) +} + +func NewMenuFromItems(first *MenuItem, rest ...*MenuItem) *Menu { + + var result = NewMenu() + result.Append(first) + for _, item := range rest { + result.Append(item) + } + + return result +} + +func (m *Menu) setParent(menuItem *MenuItem) { + for _, item := range m.Items { + item.parent = menuItem + } +} diff --git a/vendor/github.com/wailsapp/wails/v2/pkg/menu/menuitem.go b/vendor/github.com/wailsapp/wails/v2/pkg/menu/menuitem.go new file mode 100644 index 0000000..e18b9ea --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/pkg/menu/menuitem.go @@ -0,0 +1,282 @@ +package menu + +import ( + "sync" + + "github.com/wailsapp/wails/v2/pkg/menu/keys" +) + +// MenuItem represents a menuitem contained in a menu +type MenuItem struct { + // Label is what appears as the menu text + Label string + // Role is a predefined menu type + Role Role `json:"Role,omitempty"` + // Accelerator holds a representation of a key binding + Accelerator *keys.Accelerator `json:"Accelerator,omitempty"` + // Type of MenuItem, EG: Checkbox, Text, Separator, Radio, Submenu + Type Type + // Disabled makes the item unselectable + Disabled bool + // Hidden ensures that the item is not shown in the menu + Hidden bool + // Checked indicates if the item is selected (used by Checkbox and Radio types only) + Checked bool + // Submenu contains a list of menu items that will be shown as a submenu + //SubMenu []*MenuItem `json:"SubMenu,omitempty"` + SubMenu *Menu `json:"SubMenu,omitempty"` + + // Callback function when menu clicked + Click Callback `json:"-"` + + // Text Colour + RGBA string + + // Font + FontSize int + FontName string + + // Image - base64 image data + Image string + + // MacTemplateImage indicates that on a Mac, this image is a template image + MacTemplateImage bool + + // MacAlternate indicates that this item is an alternative to the previous menu item + MacAlternate bool + + // Tooltip + Tooltip string + + // This holds the menu item's parent. + parent *MenuItem + + // Used for locking when removing elements + removeLock sync.Mutex +} + +// Parent returns the parent of the menu item. +// If it is a top level menu then it returns nil. +func (m *MenuItem) Parent() *MenuItem { + return m.parent +} + +// Append will attempt to append the given menu item to +// this item's submenu items. If this menu item is not a +// submenu, then this method will not add the item and +// simply return false. +func (m *MenuItem) Append(item *MenuItem) bool { + if !m.isSubMenu() { + return false + } + item.parent = m + m.SubMenu.Append(item) + return true +} + +// Prepend will attempt to prepend the given menu item to +// this item's submenu items. If this menu item is not a +// submenu, then this method will not add the item and +// simply return false. +func (m *MenuItem) Prepend(item *MenuItem) bool { + if !m.isSubMenu() { + return false + } + item.parent = m + m.SubMenu.Prepend(item) + return true +} + +func (m *MenuItem) Remove() { + // Iterate my parent's children + m.Parent().removeChild(m) +} + +func (m *MenuItem) removeChild(item *MenuItem) { + m.removeLock.Lock() + for index, child := range m.SubMenu.Items { + if item == child { + m.SubMenu.Items = append(m.SubMenu.Items[:index], m.SubMenu.Items[index+1:]...) + } + } + m.removeLock.Unlock() +} + +// InsertAfter attempts to add the given item after this item in the parent +// menu. If there is no parent menu (we are a top level menu) then false is +// returned +func (m *MenuItem) InsertAfter(item *MenuItem) bool { + + // We need to find my parent + if m.parent == nil { + return false + } + + // Get my parent to insert the item + return m.parent.insertNewItemAfterGivenItem(m, item) +} + +// InsertBefore attempts to add the given item before this item in the parent +// menu. If there is no parent menu (we are a top level menu) then false is +// returned +func (m *MenuItem) InsertBefore(item *MenuItem) bool { + + // We need to find my parent + if m.parent == nil { + return false + } + + // Get my parent to insert the item + return m.parent.insertNewItemBeforeGivenItem(m, item) +} + +// insertNewItemAfterGivenItem will insert the given item after the given target +// in this item's submenu. If we are not a submenu, +// then something bad has happened :/ +func (m *MenuItem) insertNewItemAfterGivenItem(target *MenuItem, + newItem *MenuItem) bool { + + if !m.isSubMenu() { + return false + } + + // Find the index of the target + targetIndex := m.getItemIndex(target) + if targetIndex == -1 { + return false + } + + // Insert element into slice + return m.insertItemAtIndex(targetIndex+1, newItem) +} + +// insertNewItemBeforeGivenItem will insert the given item before the given +// target in this item's submenu. If we are not a submenu, then something bad +// has happened :/ +func (m *MenuItem) insertNewItemBeforeGivenItem(target *MenuItem, + newItem *MenuItem) bool { + + if !m.isSubMenu() { + return false + } + + // Find the index of the target + targetIndex := m.getItemIndex(target) + if targetIndex == -1 { + return false + } + + // Insert element into slice + return m.insertItemAtIndex(targetIndex, newItem) +} + +func (m *MenuItem) isSubMenu() bool { + return m.Type == SubmenuType +} + +// getItemIndex returns the index of the given target relative to this menu +func (m *MenuItem) getItemIndex(target *MenuItem) int { + + // This should only be called on submenus + if !m.isSubMenu() { + return -1 + } + + // hunt down that bad boy + for index, item := range m.SubMenu.Items { + if item == target { + return index + } + } + + return -1 +} + +// insertItemAtIndex attempts to insert the given item into the submenu at +// the given index +// Credit: https://stackoverflow.com/a/61822301 +func (m *MenuItem) insertItemAtIndex(index int, target *MenuItem) bool { + + // If index is OOB, return false + if index > len(m.SubMenu.Items) { + return false + } + + // Save parent reference + target.parent = m + + // If index is last item, then just regular append + if index == len(m.SubMenu.Items) { + m.SubMenu.Items = append(m.SubMenu.Items, target) + return true + } + + m.SubMenu.Items = append(m.SubMenu.Items[:index+1], m.SubMenu.Items[index:]...) + m.SubMenu.Items[index] = target + return true +} + +// Text is a helper to create basic Text menu items +func Text(label string, accelerator *keys.Accelerator, click Callback) *MenuItem { + return &MenuItem{ + Label: label, + Type: TextType, + Accelerator: accelerator, + Click: click, + } +} + +// Separator provides a menu separator +func Separator() *MenuItem { + return &MenuItem{ + Type: SeparatorType, + } +} + +// Radio is a helper to create basic Radio menu items with an accelerator +func Radio(label string, selected bool, accelerator *keys.Accelerator, click Callback) *MenuItem { + return &MenuItem{ + Label: label, + Type: RadioType, + Checked: selected, + Accelerator: accelerator, + Click: click, + } +} + +// Checkbox is a helper to create basic Checkbox menu items +func Checkbox(label string, checked bool, accelerator *keys.Accelerator, click Callback) *MenuItem { + return &MenuItem{ + Label: label, + Type: CheckboxType, + Checked: checked, + Accelerator: accelerator, + Click: click, + } +} + +// SubMenu is a helper to create Submenus +func SubMenu(label string, menu *Menu) *MenuItem { + result := &MenuItem{ + Label: label, + SubMenu: menu, + Type: SubmenuType, + } + + menu.setParent(result) + + return result +} + +// SubMenuWithID is a helper to create Submenus with an ID +func SubMenuWithID(label string, menu *Menu) *MenuItem { + result := &MenuItem{ + Label: label, + SubMenu: menu, + Type: SubmenuType, + } + + menu.setParent(result) + + return result +} diff --git a/vendor/github.com/wailsapp/wails/v2/pkg/menu/menuroles.go b/vendor/github.com/wailsapp/wails/v2/pkg/menu/menuroles.go new file mode 100644 index 0000000..1ee62f2 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/pkg/menu/menuroles.go @@ -0,0 +1,204 @@ +// Package menu provides all the functions and structs related to menus in a Wails application. +// Heavily inspired by Electron (c) 2013-2020 Github Inc. +// Electron License: https://github.com/electron/electron/blob/master/LICENSE +package menu + +type Role string + +const ( + AboutRole Role = "about" + UndoRole Role = "undo" + RedoRole Role = "redo" + CutRole Role = "cut" + CopyRole Role = "copy" + PasteRole Role = "paste" + PasteAndMatchStyleRole Role = "pasteAndMatchStyle" + SelectAllRole Role = "selectAll" + DeleteRole Role = "delete" + MinimizeRole Role = "minimize" + QuitRole Role = "quit" + TogglefullscreenRole Role = "togglefullscreen" + FileMenuRole Role = "fileMenu" + EditMenuRole Role = "editMenu" + ViewMenuRole Role = "viewMenu" + WindowMenuRole Role = "windowMenu" + AppMenuRole Role = "appMenu" + HideRole Role = "hide" + HideOthersRole Role = "hideOthers" + UnhideRole Role = "unhide" + FrontRole Role = "front" + ZoomRole Role = "zoom" + WindowSubMenuRole Role = "windowSubMenu" + HelpSubMenuRole Role = "helpSubMenu" + SeparatorItemRole Role = "separatorItem" +) + +// About provides a MenuItem with the About role +func About() *MenuItem { + return &MenuItem{ + Role: AboutRole, + } +} + +// Undo provides a MenuItem with the Undo role +func Undo() *MenuItem { + return &MenuItem{ + Role: UndoRole, + } +} + +// Redo provides a MenuItem with the Redo role +func Redo() *MenuItem { + return &MenuItem{ + Role: RedoRole, + } +} + +// Cut provides a MenuItem with the Cut role +func Cut() *MenuItem { + return &MenuItem{ + Role: CutRole, + } +} + +// Copy provides a MenuItem with the Copy role +func Copy() *MenuItem { + return &MenuItem{ + Role: CopyRole, + } +} + +// Paste provides a MenuItem with the Paste role +func Paste() *MenuItem { + return &MenuItem{ + Role: PasteRole, + } +} + +// PasteAndMatchStyle provides a MenuItem with the PasteAndMatchStyle role +func PasteAndMatchStyle() *MenuItem { + return &MenuItem{ + Role: PasteAndMatchStyleRole, + } +} + +// SelectAll provides a MenuItem with the SelectAll role +func SelectAll() *MenuItem { + return &MenuItem{ + Role: SelectAllRole, + } +} + +// Delete provides a MenuItem with the Delete role +func Delete() *MenuItem { + return &MenuItem{ + Role: DeleteRole, + } +} + +// Minimize provides a MenuItem with the Minimize role +func Minimize() *MenuItem { + return &MenuItem{ + Role: MinimizeRole, + } +} + +// Quit provides a MenuItem with the Quit role +func Quit() *MenuItem { + return &MenuItem{ + Role: QuitRole, + } +} + +// Togglefullscreen provides a MenuItem with the Togglefullscreen role +func Togglefullscreen() *MenuItem { + return &MenuItem{ + Role: TogglefullscreenRole, + } +} + +// FileMenu provides a MenuItem with the whole default "File" menu (Close / Quit) +func FileMenu() *MenuItem { + return &MenuItem{ + Role: FileMenuRole, + } +} + +// EditMenu provides a MenuItem with the whole default "Edit" menu (Undo, Copy, etc.). +func EditMenu() *MenuItem { + return &MenuItem{ + Role: EditMenuRole, + } +} + +// ViewMenu provides a MenuItem with the whole default "View" menu (Reload, Toggle Developer Tools, etc.) +func ViewMenu() *MenuItem { + return &MenuItem{ + Role: ViewMenuRole, + } +} + +// WindowMenu provides a MenuItem with the whole default "Window" menu (Minimize, Zoom, etc.). +func WindowMenu() *MenuItem { + return &MenuItem{ + Role: WindowMenuRole, + } +} + +// These roles are Mac only + +// AppMenu provides a MenuItem with the whole default "App" menu (About, Services, etc.) +func AppMenu() *MenuItem { + return &MenuItem{ + Role: AppMenuRole, + } +} + +// Hide provides a MenuItem that maps to the hide action. +func Hide() *MenuItem { + return &MenuItem{ + Role: HideRole, + } +} + +// HideOthers provides a MenuItem that maps to the hideOtherApplications action. +func HideOthers() *MenuItem { + return &MenuItem{ + Role: HideOthersRole, + } +} + +// Unhide provides a MenuItem that maps to the unhideAllApplications action. +func Unhide() *MenuItem { + return &MenuItem{ + Role: UnhideRole, + } +} + +// Front provides a MenuItem that maps to the arrangeInFront action. +func Front() *MenuItem { + return &MenuItem{ + Role: FrontRole, + } +} + +// Zoom provides a MenuItem that maps to the performZoom action. +func Zoom() *MenuItem { + return &MenuItem{ + Role: ZoomRole, + } +} + +// WindowSubMenu provides a MenuItem with the "Window" submenu. +func WindowSubMenu() *MenuItem { + return &MenuItem{ + Role: WindowSubMenuRole, + } +} + +// HelpSubMenu provides a MenuItem with the "Help" submenu. +func HelpSubMenu() *MenuItem { + return &MenuItem{ + Role: HelpSubMenuRole, + } +} diff --git a/vendor/github.com/wailsapp/wails/v2/pkg/menu/tray.go b/vendor/github.com/wailsapp/wails/v2/pkg/menu/tray.go new file mode 100644 index 0000000..7554795 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/pkg/menu/tray.go @@ -0,0 +1,43 @@ +package menu + +// TrayMenu are the options +type TrayMenu struct { + + // Label is the text we wish to display in the tray + Label string + + // Image is the name of the tray icon we wish to display. + // These are read up during build from /trayicons and + // the filenames are used as IDs, minus the extension + // EG: /trayicons/main.png can be referenced here with "main" + // If the image is not a filename, it will be treated as base64 image data + Image string + + // MacTemplateImage indicates that on a Mac, this image is a template image + MacTemplateImage bool + + // Text Colour + RGBA string + + // Font + FontSize int + FontName string + + // Tooltip + Tooltip string + + // Callback function when menu clicked + //Click Callback `json:"-"` + + // Disabled makes the item unselectable + Disabled bool + + // Menu is the initial menu we wish to use for the tray + Menu *Menu + + // OnOpen is called when the Menu is opened + OnOpen func() + + // OnClose is called when the Menu is closed + OnClose func() +} diff --git a/vendor/github.com/wailsapp/wails/v2/pkg/menu/type.go b/vendor/github.com/wailsapp/wails/v2/pkg/menu/type.go new file mode 100644 index 0000000..829ea05 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/pkg/menu/type.go @@ -0,0 +1,17 @@ +package menu + +// Type of the menu item +type Type string + +const ( + // TextType is the text menuitem type + TextType Type = "Text" + // SeparatorType is the Separator menuitem type + SeparatorType Type = "Separator" + // SubmenuType is the Submenu menuitem type + SubmenuType Type = "Submenu" + // CheckboxType is the Checkbox menuitem type + CheckboxType Type = "Checkbox" + // RadioType is the Radio menuitem type + RadioType Type = "Radio" +) diff --git a/vendor/github.com/wailsapp/wails/v2/pkg/menu/windows.go b/vendor/github.com/wailsapp/wails/v2/pkg/menu/windows.go new file mode 100644 index 0000000..8f2be52 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/pkg/menu/windows.go @@ -0,0 +1,11 @@ +package menu + +// DefaultWindowsMenu returns a default menu including the default +// Application and Edit menus. Use `.Append()` to add to it. +func DefaultWindowsMenu() *Menu { + return NewMenuFromItems( + FileMenu(), + EditMenu(), + WindowMenu(), + ) +} diff --git a/vendor/github.com/wailsapp/wails/v2/pkg/options/default.go b/vendor/github.com/wailsapp/wails/v2/pkg/options/default.go new file mode 100644 index 0000000..3bfeb8b --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/pkg/options/default.go @@ -0,0 +1,22 @@ +package options + +import ( + "github.com/wailsapp/wails/v2/pkg/logger" + "github.com/wailsapp/wails/v2/pkg/options/mac" +) + +// Default options for creating the App +var Default = &App{ + Width: 1024, + Height: 768, + DevTools: false, + RGBA: 0xFFFFFFFF, + Mac: &mac.Options{ + TitleBar: mac.TitleBarDefault(), + Appearance: mac.DefaultAppearance, + WebviewIsTransparent: false, + WindowBackgroundIsTranslucent: false, + }, + Logger: logger.NewDefaultLogger(), + LogLevel: logger.INFO, +} diff --git a/vendor/github.com/wailsapp/wails/v2/pkg/options/dialog/dialog.go b/vendor/github.com/wailsapp/wails/v2/pkg/options/dialog/dialog.go new file mode 100644 index 0000000..dfaf440 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/pkg/options/dialog/dialog.go @@ -0,0 +1,52 @@ +package dialog + +// FileFilter defines a filter for dialog boxes +type FileFilter struct { + DisplayName string // Filter information EG: "Image Files (*.jpg, *.png)" + Pattern string // semi-colon separated list of extensions, EG: "*.jpg;*.png" +} + +// OpenDialog contains the options for the OpenDialog runtime method +type OpenDialog struct { + DefaultDirectory string + DefaultFilename string + Title string + Filters []FileFilter + AllowFiles bool + AllowDirectories bool + ShowHiddenFiles bool + CanCreateDirectories bool + ResolvesAliases bool + TreatPackagesAsDirectories bool +} + +// SaveDialog contains the options for the SaveDialog runtime method +type SaveDialog struct { + DefaultDirectory string + DefaultFilename string + Title string + Filters []FileFilter + ShowHiddenFiles bool + CanCreateDirectories bool + TreatPackagesAsDirectories bool +} + +type DialogType string + +const ( + InfoDialog DialogType = "info" + WarningDialog DialogType = "warning" + ErrorDialog DialogType = "error" + QuestionDialog DialogType = "question" +) + +// MessageDialog contains the options for the Message dialogs, EG Info, Warning, etc runtime methods +type MessageDialog struct { + Type DialogType + Title string + Message string + Buttons []string + DefaultButton string + CancelButton string + Icon string +} diff --git a/vendor/github.com/wailsapp/wails/v2/pkg/options/mac/appearance.go b/vendor/github.com/wailsapp/wails/v2/pkg/options/mac/appearance.go new file mode 100644 index 0000000..934bb20 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/pkg/options/mac/appearance.go @@ -0,0 +1,23 @@ +package mac + +// AppearanceType is a type of Appearance for Cocoa windows +type AppearanceType string + +const ( + // DefaultAppearance uses the default system value + DefaultAppearance AppearanceType = "" + // NSAppearanceNameAqua - The standard light system appearance. + NSAppearanceNameAqua AppearanceType = "NSAppearanceNameAqua" + // NSAppearanceNameDarkAqua - The standard dark system appearance. + NSAppearanceNameDarkAqua AppearanceType = "NSAppearanceNameDarkAqua" + // NSAppearanceNameVibrantLight - The light vibrant appearance + NSAppearanceNameVibrantLight AppearanceType = "NSAppearanceNameVibrantLight" + // NSAppearanceNameAccessibilityHighContrastAqua - A high-contrast version of the standard light system appearance. + NSAppearanceNameAccessibilityHighContrastAqua AppearanceType = "NSAppearanceNameAccessibilityHighContrastAqua" + // NSAppearanceNameAccessibilityHighContrastDarkAqua - A high-contrast version of the standard dark system appearance. + NSAppearanceNameAccessibilityHighContrastDarkAqua AppearanceType = "NSAppearanceNameAccessibilityHighContrastDarkAqua" + // NSAppearanceNameAccessibilityHighContrastVibrantLight - A high-contrast version of the light vibrant appearance. + NSAppearanceNameAccessibilityHighContrastVibrantLight AppearanceType = "NSAppearanceNameAccessibilityHighContrastVibrantLight" + // NSAppearanceNameAccessibilityHighContrastVibrantDark - A high-contrast version of the dark vibrant appearance. + NSAppearanceNameAccessibilityHighContrastVibrantDark AppearanceType = "NSAppearanceNameAccessibilityHighContrastVibrantDark" +) diff --git a/vendor/github.com/wailsapp/wails/v2/pkg/options/mac/mac.go b/vendor/github.com/wailsapp/wails/v2/pkg/options/mac/mac.go new file mode 100644 index 0000000..6e568d5 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/pkg/options/mac/mac.go @@ -0,0 +1,24 @@ +package mac + +import "github.com/wailsapp/wails/v2/pkg/menu" + +type ActivationPolicy int + +const ( + NSApplicationActivationPolicyRegular ActivationPolicy = 0 + NSApplicationActivationPolicyAccessory ActivationPolicy = 1 + NSApplicationActivationPolicyProhibited ActivationPolicy = 2 +) + +// Options are options specific to Mac +type Options struct { + TitleBar *TitleBar + Appearance AppearanceType + WebviewIsTransparent bool + WindowBackgroundIsTranslucent bool + Menu *menu.Menu + TrayMenus []*menu.TrayMenu + ContextMenus []*menu.ContextMenu + ActivationPolicy ActivationPolicy + URLHandlers map[string]func(string) +} diff --git a/vendor/github.com/wailsapp/wails/v2/pkg/options/mac/titlebar.go b/vendor/github.com/wailsapp/wails/v2/pkg/options/mac/titlebar.go new file mode 100644 index 0000000..c18c4ee --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/pkg/options/mac/titlebar.go @@ -0,0 +1,54 @@ +package mac + +// TitleBar contains options for the Mac titlebar +type TitleBar struct { + TitlebarAppearsTransparent bool + HideTitle bool + HideTitleBar bool + FullSizeContent bool + UseToolbar bool + HideToolbarSeparator bool +} + +// TitleBarDefault results in the default Mac Titlebar +func TitleBarDefault() *TitleBar { + return &TitleBar{ + TitlebarAppearsTransparent: false, + HideTitle: false, + HideTitleBar: false, + FullSizeContent: false, + UseToolbar: false, + HideToolbarSeparator: false, + } +} + +// Credit: Comments from Electron site + +// TitleBarHidden results in a hidden title bar and a full size content window, +// yet the title bar still has the standard window controls (“traffic lights”) +// in the top left. +func TitleBarHidden() *TitleBar { + return &TitleBar{ + TitlebarAppearsTransparent: true, + HideTitle: true, + HideTitleBar: false, + FullSizeContent: true, + UseToolbar: false, + HideToolbarSeparator: false, + } +} + +// TitleBarHiddenInset results in a hidden title bar with an alternative look where +// the traffic light buttons are slightly more inset from the window edge. +func TitleBarHiddenInset() *TitleBar { + + return &TitleBar{ + TitlebarAppearsTransparent: true, + HideTitle: true, + HideTitleBar: false, + FullSizeContent: true, + UseToolbar: true, + HideToolbarSeparator: true, + } + +} diff --git a/vendor/github.com/wailsapp/wails/v2/pkg/options/options.go b/vendor/github.com/wailsapp/wails/v2/pkg/options/options.go new file mode 100644 index 0000000..90fa24a --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/pkg/options/options.go @@ -0,0 +1,150 @@ +package options + +import ( + "log" + "runtime" + + "github.com/wailsapp/wails/v2/pkg/options/windows" + + wailsruntime "github.com/wailsapp/wails/v2/internal/runtime" + "github.com/wailsapp/wails/v2/pkg/menu" + + "github.com/imdario/mergo" + "github.com/wailsapp/wails/v2/pkg/logger" + "github.com/wailsapp/wails/v2/pkg/options/mac" +) + +// App contains options for creating the App +type App struct { + Title string + Width int + Height int + DisableResize bool + Fullscreen bool + Frameless bool + MinWidth int + MinHeight int + MaxWidth int + MaxHeight int + StartHidden bool + HideWindowOnClose bool + DevTools bool + RGBA int + ContextMenus []*menu.ContextMenu + TrayMenus []*menu.TrayMenu + Menu *menu.Menu + Windows *windows.Options + Mac *mac.Options + Logger logger.Logger `json:"-"` + LogLevel logger.LogLevel + Startup func(*wailsruntime.Runtime) `json:"-"` + Shutdown func() `json:"-"` + Bind []interface{} +} + +// MergeDefaults will set the minimum default values for an application +func MergeDefaults(appoptions *App) { + err := mergo.Merge(appoptions, Default) + if err != nil { + log.Fatal(err) + } + + // Ensure max and min are valid + if appoptions.MinWidth > 0 && appoptions.MaxWidth > 0 { + if appoptions.MinWidth > appoptions.MaxWidth { + appoptions.MinWidth = appoptions.MaxWidth + } + } + if appoptions.MinHeight > 0 && appoptions.MaxHeight > 0 { + if appoptions.MinHeight > appoptions.MaxHeight { + appoptions.MinHeight = appoptions.MaxHeight + } + } + // Ensure width and height are limited if max/min is set + if appoptions.Width < appoptions.MinWidth { + appoptions.Width = appoptions.MinWidth + } + if appoptions.MaxWidth > 0 && appoptions.Width > appoptions.MaxWidth { + appoptions.Width = appoptions.MaxWidth + } + if appoptions.Height < appoptions.MinHeight { + appoptions.Height = appoptions.MinHeight + } + if appoptions.MaxHeight > 0 && appoptions.Height > appoptions.MaxHeight { + appoptions.Height = appoptions.MaxHeight + } + +} + +func GetTrayMenus(appoptions *App) []*menu.TrayMenu { + var result []*menu.TrayMenu + switch runtime.GOOS { + case "darwin": + if appoptions.Mac != nil { + result = appoptions.Mac.TrayMenus + } + //case "linux": + // if appoptions.Linux != nil { + // result = appoptions.Linux.TrayMenu + // } + //case "windows": + // if appoptions.Windows != nil { + // result = appoptions.Windows.TrayMenu + // } + } + + if result == nil { + result = appoptions.TrayMenus + } + + return result +} + +func GetApplicationMenu(appoptions *App) *menu.Menu { + var result *menu.Menu + switch runtime.GOOS { + case "darwin": + if appoptions.Mac != nil { + result = appoptions.Mac.Menu + } + //case "linux": + // if appoptions.Linux != nil { + // result = appoptions.Linux.TrayMenu + // } + case "windows": + if appoptions.Windows != nil { + result = appoptions.Windows.Menu + } + } + + if result == nil { + result = appoptions.Menu + } + + return result +} + +func GetContextMenus(appoptions *App) []*menu.ContextMenu { + var result []*menu.ContextMenu + + switch runtime.GOOS { + case "darwin": + if appoptions.Mac != nil { + result = appoptions.Mac.ContextMenus + } + //case "linux": + // if appoptions.Linux != nil { + // result = appoptions.Linux.TrayMenu + // } + //case "windows": + // if appoptions.Windows != nil { + // result = appoptions.Windows.TrayMenu + // } + } + + if result == nil { + result = appoptions.ContextMenus + } + + return result +} diff --git a/vendor/github.com/wailsapp/wails/v2/pkg/options/windows/windows.go b/vendor/github.com/wailsapp/wails/v2/pkg/options/windows/windows.go new file mode 100644 index 0000000..22b6817 --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/pkg/options/windows/windows.go @@ -0,0 +1,11 @@ +package windows + +import "github.com/wailsapp/wails/v2/pkg/menu" + +// Options are options specific to Windows +type Options struct { + WebviewIsTransparent bool + WindowBackgroundIsTranslucent bool + DisableWindowIcon bool + Menu *menu.Menu +} diff --git a/vendor/github.com/wailsapp/wails/v2/wails.go b/vendor/github.com/wailsapp/wails/v2/wails.go new file mode 100644 index 0000000..d7c680b --- /dev/null +++ b/vendor/github.com/wailsapp/wails/v2/wails.go @@ -0,0 +1,32 @@ +// Package wails is the main package of the Wails project. +// It is used by client applications. +package wails + +import ( + "github.com/wailsapp/wails/v2/internal/app" + "github.com/wailsapp/wails/v2/internal/runtime" + "github.com/wailsapp/wails/v2/pkg/options" +) + +// Runtime is an alias for the runtime.Runtime struct +type Runtime = runtime.Runtime + +// Store is an alias for the Store object +type Store = runtime.Store + +// Run creates an application based on the given config and executes it +func Run(options *options.App) error { + + // Call an Init method manually + err := Init() + if err != nil { + return err + } + + mainapp, err := app.CreateApp(options) + if err != nil { + return err + } + + return mainapp.Run() +} diff --git a/vendor/github.com/ztrue/tracerr/.gitignore b/vendor/github.com/ztrue/tracerr/.gitignore new file mode 100644 index 0000000..46620af --- /dev/null +++ b/vendor/github.com/ztrue/tracerr/.gitignore @@ -0,0 +1 @@ +/coverage.out diff --git a/vendor/github.com/ztrue/tracerr/.travis.yml b/vendor/github.com/ztrue/tracerr/.travis.yml new file mode 100644 index 0000000..6fa4d85 --- /dev/null +++ b/vendor/github.com/ztrue/tracerr/.travis.yml @@ -0,0 +1,13 @@ +language: go + +before_install: + - go get github.com/logrusorgru/aurora + - go get github.com/mattn/goveralls + +go: + - "1.11.x" + - "1.10.x" + +script: + - go test -cover -v -covermode=count -coverprofile=coverage.out + - $GOPATH/bin/goveralls -coverprofile=coverage.out -service=travis-ci diff --git a/vendor/github.com/ztrue/tracerr/CHANGELOG.md b/vendor/github.com/ztrue/tracerr/CHANGELOG.md new file mode 100644 index 0000000..b8560c9 --- /dev/null +++ b/vendor/github.com/ztrue/tracerr/CHANGELOG.md @@ -0,0 +1,56 @@ +# Changelog + +## [0.3.0] - 2019-03-15 + +### Added + +- `tracerr.CustomError()` that allows to create error with custom stack trace. + +### Changed + +- `*tracerr.Error` struct replaced with `tracerr.Error` interface. + +## [0.2.1] - 2019-02-16 + +### Added + +- Benchmarks. +- `DefaultCap` variable for performance tuning purposes. + +### Changed + +- Stack trace performance optimisation. + +## [0.2.0] - 2019-02-15 + +### Added + +- `tracerr.Unwrap()` and `Error.Unwrap()` that returns the original error. + +## [0.1.2] - 2019-02-12 + +### Changed + +- RWMutex added for files caching, which fixing concurrent cache writing or writing-reading if any. + +## [0.1.1] - 2019-02-09 + +### Added + +- Changelog. +- `go.mod` file. +- License. +- Tests with 100% coverage. +- Travis CI. + +### Changed + +- `Error.Err` and `Error.Frames` properties are now exported. +- `Error.Error()` called on `nil` now returns empty string instead of panics. +- All print and sprint functions called with `nil` error now returns or prints empty string instead of panics. + +## [0.1.0] - 2019-02-06 + +### Added + +- Initial version. diff --git a/vendor/github.com/mattn/go-colorable/LICENSE b/vendor/github.com/ztrue/tracerr/LICENSE similarity index 95% rename from vendor/github.com/mattn/go-colorable/LICENSE rename to vendor/github.com/ztrue/tracerr/LICENSE index 91b5cef..9e6b1da 100644 --- a/vendor/github.com/mattn/go-colorable/LICENSE +++ b/vendor/github.com/ztrue/tracerr/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2016 Yasuhiro Matsumoto +Copyright (c) 2019 ztrue Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/vendor/github.com/ztrue/tracerr/Makefile b/vendor/github.com/ztrue/tracerr/Makefile new file mode 100644 index 0000000..723093f --- /dev/null +++ b/vendor/github.com/ztrue/tracerr/Makefile @@ -0,0 +1,27 @@ +default: test + +.PHONY: lint +lint: + go fmt . && \ + go fmt ./examples && \ + go vet && \ + golint $$(go list ./...) + +.PHONY: doc +doc: + @echo GoDoc link: http://localhost:6060/pkg/github.com/ztrue/tracerr + godoc -http=:6060 + +.PHONY: test +test: + go test -cover -v + +.PHONY: coverage +coverage: + go test -coverprofile=coverage.out && \ + go tool cover -func=coverage.out && \ + go tool cover -html=coverage.out + +.PHONY: bench +bench: + GOMAXPROCS=1 go test -bench=. -benchmem diff --git a/vendor/github.com/ztrue/tracerr/README.md b/vendor/github.com/ztrue/tracerr/README.md new file mode 100644 index 0000000..3fb28ee --- /dev/null +++ b/vendor/github.com/ztrue/tracerr/README.md @@ -0,0 +1,173 @@ +# Golang Errors with Stack Trace and Source Fragments + +[![GoDoc](https://godoc.org/github.com/ztrue/tracerr?status.svg)](https://godoc.org/github.com/ztrue/tracerr) +[![Report](https://goreportcard.com/badge/github.com/ztrue/tracerr)](https://goreportcard.com/report/github.com/ztrue/tracerr) +[![Coverage Status](https://coveralls.io/repos/github/ztrue/tracerr/badge.svg?branch=master)](https://coveralls.io/github/ztrue/tracerr?branch=master) +[![Build Status](https://travis-ci.com/ztrue/tracerr.svg?branch=master)](https://travis-ci.com/ztrue/tracerr) + +Tired of uninformative error output? Probably this will be more convenient: + +![Output](output.png) + +## Example + +```go +package main + +import ( + "io/ioutil" + + "github.com/ztrue/tracerr" +) + +func main() { + if err := read(); err != nil { + tracerr.PrintSourceColor(err) + } +} + +func read() error { + return readNonExistent() +} + +func readNonExistent() error { + _, err := ioutil.ReadFile("/tmp/non_existent_file") + // Add stack trace to existing error, no matter if it's nil. + return tracerr.Wrap(err) +} +``` + +Find more executable examples in [examples](examples) dir. + +## How to Use + +### Import + +```go +import "github.com/ztrue/tracerr" +``` + +### Create New Error + +```go +err := tracerr.New("some error") +``` + +Or: + +```go +err := tracerr.Errorf("some error %d", num) +``` + +### Add Stack Trace to Existing Error + +> If `err` is `nil` then it still be `nil` with no stack trace added. + +```go +err = tracerr.Wrap(err) +``` + +### Print Error and Stack Trace + +> Stack trace will be printed only if `err` is of type `tracerr.Error`, otherwise just error text will be shown. + +This will print error message and stack trace if any: + +```go +tracerr.Print(err) +``` + +This will add source code: + +```go +tracerr.PrintSource(err) +``` + +It's able to set up number of lines of code to display for each frame, which is `6` by default: + +```go +tracerr.PrintSource(err, 9) +``` + +Or to set up number of lines before and after traced line: + +```go +tracerr.PrintSource(err, 5, 2) +``` + +The same, but with color, which is much more useful: + +```go +tracerr.PrintSourceColor(err) +``` + +```go +tracerr.PrintSourceColor(err, 9) +``` + +```go +tracerr.PrintSourceColor(err, 5, 2) +``` + +### Save Output to Variable + +It's also able to save output to variable instead of printing it, which works the same way: + +```go +text := tracerr.Sprint(err) +``` + +```go +text := tracerr.SprintSource(err) +``` + +```go +text := tracerr.SprintSource(err, 9) +``` + +```go +text := tracerr.SprintSource(err, 5, 2) +``` + +### Get Stack Trace + +> Stack trace will be empty if `err` is not an instance of `tracerr.Error`. + +```go +frames := tracerr.StackTrace(err) +``` + +Or if `err` is of type `tracerr.Error`: + +```go +frames := err.StackTrace() +``` + +### Get Original Error + +> Unwrapped error will be `nil` if `err` is `nil` and will be the same error if `err` is not an instance of `tracerr.Error`. + +```go +err = tracerr.Unwrap(err) +``` + +Or if `err` is of type `tracerr.Error`: + +```go +err = err.Unwrap() +``` + +## Performance + +Stack trace causes a performance overhead, depending on a stack trace depth. This can be insignificant in a number of situations (such as HTTP request handling), however, avoid of adding a stack trace for really hot spots where a high number of errors created frequently, this can be inefficient. + +> Benchmarks done on a MacBook Pro 2015 with go 1.11. + +Benchmarks for creating a new error with a stack trace of different depth: + +``` +BenchmarkNew/5 200000 5646 ns/op 976 B/op 4 allocs/op +BenchmarkNew/10 200000 11565 ns/op 976 B/op 4 allocs/op +BenchmarkNew/20 50000 25629 ns/op 976 B/op 4 allocs/op +BenchmarkNew/40 20000 65833 ns/op 2768 B/op 5 allocs/op +``` diff --git a/vendor/github.com/ztrue/tracerr/error.go b/vendor/github.com/ztrue/tracerr/error.go new file mode 100644 index 0000000..c56913d --- /dev/null +++ b/vendor/github.com/ztrue/tracerr/error.go @@ -0,0 +1,134 @@ +// Package tracerr makes error output more informative. +// It adds stack trace to error and can display error with source fragments. +// +// Check example of output here https://github.com/ztrue/tracerr +package tracerr + +import ( + "fmt" + "runtime" +) + +// DefaultCap is a default cap for frames array. +// It can be changed to number of expected frames +// for purpose of performance optimisation. +var DefaultCap = 20 + +// Error is an error with stack trace. +type Error interface { + Error() string + StackTrace() []Frame + Unwrap() error +} + +type errorData struct { + // err contains original error. + err error + // frames contains stack trace of an error. + frames []Frame +} + +// CustomError creates an error with provided frames. +func CustomError(err error, frames []Frame) Error { + return &errorData{ + err: err, + frames: frames, + } +} + +// Errorf creates new error with stacktrace and formatted message. +// Formatting works the same way as in fmt.Errorf. +func Errorf(message string, args ...interface{}) Error { + return trace(fmt.Errorf(message, args...), 2) +} + +// New creates new error with stacktrace. +func New(message string) Error { + return trace(fmt.Errorf(message), 2) +} + +// Wrap adds stacktrace to existing error. +func Wrap(err error) Error { + if err == nil { + return nil + } + e, ok := err.(Error) + if ok { + return e + } + return trace(err, 2) +} + +// Unwrap returns the original error. +func Unwrap(err error) error { + if err == nil { + return nil + } + e, ok := err.(Error) + if !ok { + return err + } + return e.Unwrap() +} + +// Error returns error message. +func (e *errorData) Error() string { + return e.err.Error() +} + +// StackTrace returns stack trace of an error. +func (e *errorData) StackTrace() []Frame { + return e.frames +} + +// Unwrap returns the original error. +func (e *errorData) Unwrap() error { + return e.err +} + +// Frame is a single step in stack trace. +type Frame struct { + // Func contains a function name. + Func string + // Line contains a line number. + Line int + // Path contains a file path. + Path string +} + +// StackTrace returns stack trace of an error. +// It will be empty if err is not of type Error. +func StackTrace(err error) []Frame { + e, ok := err.(Error) + if !ok { + return nil + } + return e.StackTrace() +} + +// String formats Frame to string. +func (f Frame) String() string { + return fmt.Sprintf("%s:%d %s()", f.Path, f.Line, f.Func) +} + +func trace(err error, skip int) Error { + frames := make([]Frame, 0, DefaultCap) + for { + pc, path, line, ok := runtime.Caller(skip) + if !ok { + break + } + fn := runtime.FuncForPC(pc) + frame := Frame{ + Func: fn.Name(), + Line: line, + Path: path, + } + frames = append(frames, frame) + skip++ + } + return &errorData{ + err: err, + frames: frames, + } +} diff --git a/vendor/github.com/ztrue/tracerr/go.mod b/vendor/github.com/ztrue/tracerr/go.mod new file mode 100644 index 0000000..68f8afd --- /dev/null +++ b/vendor/github.com/ztrue/tracerr/go.mod @@ -0,0 +1,3 @@ +module github.com/ztrue/tracerr + +require github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e diff --git a/vendor/github.com/ztrue/tracerr/go.sum b/vendor/github.com/ztrue/tracerr/go.sum new file mode 100644 index 0000000..d502efb --- /dev/null +++ b/vendor/github.com/ztrue/tracerr/go.sum @@ -0,0 +1,2 @@ +github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e h1:9MlwzLdW7QSDrhDjFlsEYmxpFyIoXmYRon3dt0io31k= +github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= diff --git a/vendor/github.com/ztrue/tracerr/output.png b/vendor/github.com/ztrue/tracerr/output.png new file mode 100644 index 0000000..37aeb16 Binary files /dev/null and b/vendor/github.com/ztrue/tracerr/output.png differ diff --git a/vendor/github.com/ztrue/tracerr/print.go b/vendor/github.com/ztrue/tracerr/print.go new file mode 100644 index 0000000..2249ace --- /dev/null +++ b/vendor/github.com/ztrue/tracerr/print.go @@ -0,0 +1,183 @@ +package tracerr + +import ( + "fmt" + "io/ioutil" + "strings" + "sync" + + "github.com/logrusorgru/aurora" +) + +// DefaultLinesAfter is number of source lines after traced line to display. +var DefaultLinesAfter = 2 + +// DefaultLinesBefore is number of source lines before traced line to display. +var DefaultLinesBefore = 3 + +var cache = map[string][]string{} + +var mutex sync.RWMutex + +// Print prints error message with stack trace. +func Print(err error) { + fmt.Println(Sprint(err)) +} + +// PrintSource prints error message with stack trace and source fragments. +// +// By default 6 lines of source code will be printed, +// see DefaultLinesAfter and DefaultLinesBefore. +// +// Pass a single number to specify a total number of source lines. +// +// Pass two numbers to specify exactly how many lines should be shown +// before and after traced line. +func PrintSource(err error, nums ...int) { + fmt.Println(SprintSource(err, nums...)) +} + +// PrintSourceColor prints error message with stack trace and source fragments, +// which are in color. +// Output rules are the same as in PrintSource. +func PrintSourceColor(err error, nums ...int) { + fmt.Println(SprintSourceColor(err, nums...)) +} + +// Sprint returns error output by the same rules as Print. +func Sprint(err error) string { + return sprint(err, []int{0}, false) +} + +// SprintSource returns error output by the same rules as PrintSource. +func SprintSource(err error, nums ...int) string { + return sprint(err, nums, false) +} + +// SprintSourceColor returns error output by the same rules as PrintSourceColor. +func SprintSourceColor(err error, nums ...int) string { + return sprint(err, nums, true) +} + +func calcRows(nums []int) (before, after int, withSource bool) { + before = DefaultLinesBefore + after = DefaultLinesAfter + withSource = true + if len(nums) > 1 { + before = nums[0] + after = nums[1] + withSource = true + } else if len(nums) == 1 { + if nums[0] > 0 { + // Extra line goes to "before" rather than "after". + after = (nums[0] - 1) / 2 + before = nums[0] - after - 1 + } else { + after = 0 + before = 0 + withSource = false + } + } + if before < 0 { + before = 0 + } + if after < 0 { + after = 0 + } + return before, after, withSource +} + +func readLines(path string) ([]string, error) { + mutex.RLock() + lines, ok := cache[path] + mutex.RUnlock() + if ok { + return lines, nil + } + + b, err := ioutil.ReadFile(path) + if err != nil { + return nil, fmt.Errorf("tracerr: file %s not found", path) + } + lines = strings.Split(string(b), "\n") + mutex.Lock() + defer mutex.Unlock() + cache[path] = lines + return lines, nil +} + +func sourceRows(rows []string, frame Frame, before, after int, colorized bool) []string { + lines, err := readLines(frame.Path) + if err != nil { + message := err.Error() + if colorized { + message = aurora.Brown(message).String() + } + return append(rows, message, "") + } + if len(lines) < frame.Line { + message := fmt.Sprintf( + "tracerr: too few lines, got %d, want %d", + len(lines), frame.Line, + ) + if colorized { + message = aurora.Brown(message).String() + } + return append(rows, message, "") + } + current := frame.Line - 1 + start := current - before + end := current + after + for i := start; i <= end; i++ { + if i < 0 || i >= len(lines) { + continue + } + line := lines[i] + var message string + // TODO Pad to the same length. + if i == frame.Line-1 { + message = fmt.Sprintf("%d\t%s", i+1, string(line)) + if colorized { + message = aurora.Red(message).String() + } + } else if colorized { + message = aurora.Sprintf("%d\t%s", aurora.Black(i+1), string(line)) + } else { + message = fmt.Sprintf("%d\t%s", i+1, string(line)) + } + rows = append(rows, message) + } + return append(rows, "") +} + +func sprint(err error, nums []int, colorized bool) string { + if err == nil { + return "" + } + e, ok := err.(Error) + if !ok { + return err.Error() + } + before, after, withSource := calcRows(nums) + frames := e.StackTrace() + expectedRows := len(frames) + 1 + if withSource { + expectedRows = (before+after+3)*len(frames) + 2 + } + rows := make([]string, 0, expectedRows) + rows = append(rows, e.Error()) + if withSource { + rows = append(rows, "") + } + for _, frame := range frames { + message := frame.String() + if colorized { + message = aurora.Bold(message).String() + } + rows = append(rows, message) + if withSource { + rows = sourceRows(rows, frame, before, after, colorized) + } + } + return strings.Join(rows, "\n") +} diff --git a/vendor/golang.org/x/image/AUTHORS b/vendor/golang.org/x/image/AUTHORS deleted file mode 100644 index 15167cd..0000000 --- a/vendor/golang.org/x/image/AUTHORS +++ /dev/null @@ -1,3 +0,0 @@ -# This source code refers to The Go Authors for copyright purposes. -# The master list of authors is in the main Go distribution, -# visible at http://tip.golang.org/AUTHORS. diff --git a/vendor/golang.org/x/image/CONTRIBUTORS b/vendor/golang.org/x/image/CONTRIBUTORS deleted file mode 100644 index 1c4577e..0000000 --- a/vendor/golang.org/x/image/CONTRIBUTORS +++ /dev/null @@ -1,3 +0,0 @@ -# This source code was written by the Go contributors. -# The master list of contributors is in the main Go distribution, -# visible at http://tip.golang.org/CONTRIBUTORS. diff --git a/vendor/golang.org/x/image/PATENTS b/vendor/golang.org/x/image/PATENTS deleted file mode 100644 index 7330990..0000000 --- a/vendor/golang.org/x/image/PATENTS +++ /dev/null @@ -1,22 +0,0 @@ -Additional IP Rights Grant (Patents) - -"This implementation" means the copyrightable works distributed by -Google as part of the Go project. - -Google hereby grants to You a perpetual, worldwide, non-exclusive, -no-charge, royalty-free, irrevocable (except as stated in this section) -patent license to make, have made, use, offer to sell, sell, import, -transfer and otherwise run, modify and propagate the contents of this -implementation of Go, where such license applies only to those patent -claims, both currently owned or controlled by Google and acquired in -the future, licensable by Google that are necessarily infringed by this -implementation of Go. This grant does not include claims that would be -infringed only as a consequence of further modification of this -implementation. If you or your agent or exclusive licensee institute or -order or agree to the institution of patent litigation against any -entity (including a cross-claim or counterclaim in a lawsuit) alleging -that this implementation of Go or any code incorporated within this -implementation of Go constitutes direct or contributory patent -infringement, or inducement of patent infringement, then any patent -rights granted to you under this License for this implementation of Go -shall terminate as of the date such litigation is filed. diff --git a/vendor/golang.org/x/image/draw/draw.go b/vendor/golang.org/x/image/draw/draw.go deleted file mode 100644 index cd5aaba..0000000 --- a/vendor/golang.org/x/image/draw/draw.go +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package draw provides image composition functions. -// -// See "The Go image/draw package" for an introduction to this package: -// http://golang.org/doc/articles/image_draw.html -// -// This package is a superset of and a drop-in replacement for the image/draw -// package in the standard library. -package draw - -// This file just contains the API exported by the image/draw package in the -// standard library. Other files in this package provide additional features. - -import ( - "image" - "image/draw" -) - -// Draw calls DrawMask with a nil mask. -func Draw(dst Image, r image.Rectangle, src image.Image, sp image.Point, op Op) { - draw.Draw(dst, r, src, sp, draw.Op(op)) -} - -// DrawMask aligns r.Min in dst with sp in src and mp in mask and then -// replaces the rectangle r in dst with the result of a Porter-Duff -// composition. A nil mask is treated as opaque. -func DrawMask(dst Image, r image.Rectangle, src image.Image, sp image.Point, mask image.Image, mp image.Point, op Op) { - draw.DrawMask(dst, r, src, sp, mask, mp, draw.Op(op)) -} - -// Drawer contains the Draw method. -type Drawer = draw.Drawer - -// FloydSteinberg is a Drawer that is the Src Op with Floyd-Steinberg error -// diffusion. -var FloydSteinberg Drawer = floydSteinberg{} - -type floydSteinberg struct{} - -func (floydSteinberg) Draw(dst Image, r image.Rectangle, src image.Image, sp image.Point) { - draw.FloydSteinberg.Draw(dst, r, src, sp) -} - -// Image is an image.Image with a Set method to change a single pixel. -type Image = draw.Image - -// Op is a Porter-Duff compositing operator. -type Op = draw.Op - -const ( - // Over specifies ``(src in mask) over dst''. - Over Op = draw.Over - // Src specifies ``src in mask''. - Src Op = draw.Src -) - -// Quantizer produces a palette for an image. -type Quantizer = draw.Quantizer diff --git a/vendor/golang.org/x/image/draw/draw_go117.go b/vendor/golang.org/x/image/draw/draw_go117.go deleted file mode 100644 index fa83648..0000000 --- a/vendor/golang.org/x/image/draw/draw_go117.go +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2021 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:build go1.17 -// +build go1.17 - -package draw - -import ( - "image/draw" -) - -// The package documentation, in draw.go, gives the intent of this package: -// -// This package is a superset of and a drop-in replacement for the -// image/draw package in the standard library. -// -// "Drop-in replacement" means that we use type aliases in this file. -// -// TODO: move the type aliases to draw.go once Go 1.16 is no longer supported. - -// RGBA64Image extends both the Image and image.RGBA64Image interfaces with a -// SetRGBA64 method to change a single pixel. SetRGBA64 is equivalent to -// calling Set, but it can avoid allocations from converting concrete color -// types to the color.Color interface type. -type RGBA64Image = draw.RGBA64Image diff --git a/vendor/golang.org/x/image/draw/impl.go b/vendor/golang.org/x/image/draw/impl.go deleted file mode 100644 index 75498ad..0000000 --- a/vendor/golang.org/x/image/draw/impl.go +++ /dev/null @@ -1,6670 +0,0 @@ -// generated by "go run gen.go". DO NOT EDIT. - -package draw - -import ( - "image" - "image/color" - "math" - - "golang.org/x/image/math/f64" -) - -func (z nnInterpolator) Scale(dst Image, dr image.Rectangle, src image.Image, sr image.Rectangle, op Op, opts *Options) { - // Try to simplify a Scale to a Copy when DstMask is not specified. - // If DstMask is not nil, Copy will call Scale back with same dr and sr, and cause stack overflow. - if dr.Size() == sr.Size() && (opts == nil || opts.DstMask == nil) { - Copy(dst, dr.Min, src, sr, op, opts) - return - } - - var o Options - if opts != nil { - o = *opts - } - - // adr is the affected destination pixels. - adr := dst.Bounds().Intersect(dr) - adr, o.DstMask = clipAffectedDestRect(adr, o.DstMask, o.DstMaskP) - if adr.Empty() || sr.Empty() { - return - } - // Make adr relative to dr.Min. - adr = adr.Sub(dr.Min) - if op == Over && o.SrcMask == nil && opaque(src) { - op = Src - } - - // sr is the source pixels. If it extends beyond the src bounds, - // we cannot use the type-specific fast paths, as they access - // the Pix fields directly without bounds checking. - // - // Similarly, the fast paths assume that the masks are nil. - if o.DstMask != nil || o.SrcMask != nil || !sr.In(src.Bounds()) { - switch op { - case Over: - z.scale_Image_Image_Over(dst, dr, adr, src, sr, &o) - case Src: - z.scale_Image_Image_Src(dst, dr, adr, src, sr, &o) - } - } else if _, ok := src.(*image.Uniform); ok { - Draw(dst, dr, src, src.Bounds().Min, op) - } else { - switch op { - case Over: - switch dst := dst.(type) { - case *image.RGBA: - switch src := src.(type) { - case *image.NRGBA: - z.scale_RGBA_NRGBA_Over(dst, dr, adr, src, sr, &o) - case *image.RGBA: - z.scale_RGBA_RGBA_Over(dst, dr, adr, src, sr, &o) - default: - z.scale_RGBA_Image_Over(dst, dr, adr, src, sr, &o) - } - default: - switch src := src.(type) { - default: - z.scale_Image_Image_Over(dst, dr, adr, src, sr, &o) - } - } - case Src: - switch dst := dst.(type) { - case *image.RGBA: - switch src := src.(type) { - case *image.Gray: - z.scale_RGBA_Gray_Src(dst, dr, adr, src, sr, &o) - case *image.NRGBA: - z.scale_RGBA_NRGBA_Src(dst, dr, adr, src, sr, &o) - case *image.RGBA: - z.scale_RGBA_RGBA_Src(dst, dr, adr, src, sr, &o) - case *image.YCbCr: - switch src.SubsampleRatio { - default: - z.scale_RGBA_Image_Src(dst, dr, adr, src, sr, &o) - case image.YCbCrSubsampleRatio444: - z.scale_RGBA_YCbCr444_Src(dst, dr, adr, src, sr, &o) - case image.YCbCrSubsampleRatio422: - z.scale_RGBA_YCbCr422_Src(dst, dr, adr, src, sr, &o) - case image.YCbCrSubsampleRatio420: - z.scale_RGBA_YCbCr420_Src(dst, dr, adr, src, sr, &o) - case image.YCbCrSubsampleRatio440: - z.scale_RGBA_YCbCr440_Src(dst, dr, adr, src, sr, &o) - } - default: - z.scale_RGBA_Image_Src(dst, dr, adr, src, sr, &o) - } - default: - switch src := src.(type) { - default: - z.scale_Image_Image_Src(dst, dr, adr, src, sr, &o) - } - } - } - } -} - -func (z nnInterpolator) Transform(dst Image, s2d f64.Aff3, src image.Image, sr image.Rectangle, op Op, opts *Options) { - // Try to simplify a Transform to a Copy. - if s2d[0] == 1 && s2d[1] == 0 && s2d[3] == 0 && s2d[4] == 1 { - dx := int(s2d[2]) - dy := int(s2d[5]) - if float64(dx) == s2d[2] && float64(dy) == s2d[5] { - Copy(dst, image.Point{X: sr.Min.X + dx, Y: sr.Min.X + dy}, src, sr, op, opts) - return - } - } - - var o Options - if opts != nil { - o = *opts - } - - dr := transformRect(&s2d, &sr) - // adr is the affected destination pixels. - adr := dst.Bounds().Intersect(dr) - adr, o.DstMask = clipAffectedDestRect(adr, o.DstMask, o.DstMaskP) - if adr.Empty() || sr.Empty() { - return - } - if op == Over && o.SrcMask == nil && opaque(src) { - op = Src - } - - d2s := invert(&s2d) - // bias is a translation of the mapping from dst coordinates to src - // coordinates such that the latter temporarily have non-negative X - // and Y coordinates. This allows us to write int(f) instead of - // int(math.Floor(f)), since "round to zero" and "round down" are - // equivalent when f >= 0, but the former is much cheaper. The X-- - // and Y-- are because the TransformLeaf methods have a "sx -= 0.5" - // adjustment. - bias := transformRect(&d2s, &adr).Min - bias.X-- - bias.Y-- - d2s[2] -= float64(bias.X) - d2s[5] -= float64(bias.Y) - // Make adr relative to dr.Min. - adr = adr.Sub(dr.Min) - // sr is the source pixels. If it extends beyond the src bounds, - // we cannot use the type-specific fast paths, as they access - // the Pix fields directly without bounds checking. - // - // Similarly, the fast paths assume that the masks are nil. - if o.DstMask != nil || o.SrcMask != nil || !sr.In(src.Bounds()) { - switch op { - case Over: - z.transform_Image_Image_Over(dst, dr, adr, &d2s, src, sr, bias, &o) - case Src: - z.transform_Image_Image_Src(dst, dr, adr, &d2s, src, sr, bias, &o) - } - } else if u, ok := src.(*image.Uniform); ok { - transform_Uniform(dst, dr, adr, &d2s, u, sr, bias, op) - } else { - switch op { - case Over: - switch dst := dst.(type) { - case *image.RGBA: - switch src := src.(type) { - case *image.NRGBA: - z.transform_RGBA_NRGBA_Over(dst, dr, adr, &d2s, src, sr, bias, &o) - case *image.RGBA: - z.transform_RGBA_RGBA_Over(dst, dr, adr, &d2s, src, sr, bias, &o) - default: - z.transform_RGBA_Image_Over(dst, dr, adr, &d2s, src, sr, bias, &o) - } - default: - switch src := src.(type) { - default: - z.transform_Image_Image_Over(dst, dr, adr, &d2s, src, sr, bias, &o) - } - } - case Src: - switch dst := dst.(type) { - case *image.RGBA: - switch src := src.(type) { - case *image.Gray: - z.transform_RGBA_Gray_Src(dst, dr, adr, &d2s, src, sr, bias, &o) - case *image.NRGBA: - z.transform_RGBA_NRGBA_Src(dst, dr, adr, &d2s, src, sr, bias, &o) - case *image.RGBA: - z.transform_RGBA_RGBA_Src(dst, dr, adr, &d2s, src, sr, bias, &o) - case *image.YCbCr: - switch src.SubsampleRatio { - default: - z.transform_RGBA_Image_Src(dst, dr, adr, &d2s, src, sr, bias, &o) - case image.YCbCrSubsampleRatio444: - z.transform_RGBA_YCbCr444_Src(dst, dr, adr, &d2s, src, sr, bias, &o) - case image.YCbCrSubsampleRatio422: - z.transform_RGBA_YCbCr422_Src(dst, dr, adr, &d2s, src, sr, bias, &o) - case image.YCbCrSubsampleRatio420: - z.transform_RGBA_YCbCr420_Src(dst, dr, adr, &d2s, src, sr, bias, &o) - case image.YCbCrSubsampleRatio440: - z.transform_RGBA_YCbCr440_Src(dst, dr, adr, &d2s, src, sr, bias, &o) - } - default: - z.transform_RGBA_Image_Src(dst, dr, adr, &d2s, src, sr, bias, &o) - } - default: - switch src := src.(type) { - default: - z.transform_Image_Image_Src(dst, dr, adr, &d2s, src, sr, bias, &o) - } - } - } - } -} - -func (nnInterpolator) scale_RGBA_Gray_Src(dst *image.RGBA, dr, adr image.Rectangle, src *image.Gray, sr image.Rectangle, opts *Options) { - dw2 := uint64(dr.Dx()) * 2 - dh2 := uint64(dr.Dy()) * 2 - sw := uint64(sr.Dx()) - sh := uint64(sr.Dy()) - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - sy := (2*uint64(dy) + 1) * sh / dh2 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - sx := (2*uint64(dx) + 1) * sw / dw2 - pi := (sr.Min.Y+int(sy)-src.Rect.Min.Y)*src.Stride + (sr.Min.X + int(sx) - src.Rect.Min.X) - pr := uint32(src.Pix[pi]) * 0x101 - out := uint8(pr >> 8) - dst.Pix[d+0] = out - dst.Pix[d+1] = out - dst.Pix[d+2] = out - dst.Pix[d+3] = 0xff - } - } -} - -func (nnInterpolator) scale_RGBA_NRGBA_Over(dst *image.RGBA, dr, adr image.Rectangle, src *image.NRGBA, sr image.Rectangle, opts *Options) { - dw2 := uint64(dr.Dx()) * 2 - dh2 := uint64(dr.Dy()) * 2 - sw := uint64(sr.Dx()) - sh := uint64(sr.Dy()) - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - sy := (2*uint64(dy) + 1) * sh / dh2 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - sx := (2*uint64(dx) + 1) * sw / dw2 - pi := (sr.Min.Y+int(sy)-src.Rect.Min.Y)*src.Stride + (sr.Min.X+int(sx)-src.Rect.Min.X)*4 - pa := uint32(src.Pix[pi+3]) * 0x101 - pr := uint32(src.Pix[pi+0]) * pa / 0xff - pg := uint32(src.Pix[pi+1]) * pa / 0xff - pb := uint32(src.Pix[pi+2]) * pa / 0xff - pa1 := (0xffff - pa) * 0x101 - dst.Pix[d+0] = uint8((uint32(dst.Pix[d+0])*pa1/0xffff + pr) >> 8) - dst.Pix[d+1] = uint8((uint32(dst.Pix[d+1])*pa1/0xffff + pg) >> 8) - dst.Pix[d+2] = uint8((uint32(dst.Pix[d+2])*pa1/0xffff + pb) >> 8) - dst.Pix[d+3] = uint8((uint32(dst.Pix[d+3])*pa1/0xffff + pa) >> 8) - } - } -} - -func (nnInterpolator) scale_RGBA_NRGBA_Src(dst *image.RGBA, dr, adr image.Rectangle, src *image.NRGBA, sr image.Rectangle, opts *Options) { - dw2 := uint64(dr.Dx()) * 2 - dh2 := uint64(dr.Dy()) * 2 - sw := uint64(sr.Dx()) - sh := uint64(sr.Dy()) - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - sy := (2*uint64(dy) + 1) * sh / dh2 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - sx := (2*uint64(dx) + 1) * sw / dw2 - pi := (sr.Min.Y+int(sy)-src.Rect.Min.Y)*src.Stride + (sr.Min.X+int(sx)-src.Rect.Min.X)*4 - pa := uint32(src.Pix[pi+3]) * 0x101 - pr := uint32(src.Pix[pi+0]) * pa / 0xff - pg := uint32(src.Pix[pi+1]) * pa / 0xff - pb := uint32(src.Pix[pi+2]) * pa / 0xff - dst.Pix[d+0] = uint8(pr >> 8) - dst.Pix[d+1] = uint8(pg >> 8) - dst.Pix[d+2] = uint8(pb >> 8) - dst.Pix[d+3] = uint8(pa >> 8) - } - } -} - -func (nnInterpolator) scale_RGBA_RGBA_Over(dst *image.RGBA, dr, adr image.Rectangle, src *image.RGBA, sr image.Rectangle, opts *Options) { - dw2 := uint64(dr.Dx()) * 2 - dh2 := uint64(dr.Dy()) * 2 - sw := uint64(sr.Dx()) - sh := uint64(sr.Dy()) - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - sy := (2*uint64(dy) + 1) * sh / dh2 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - sx := (2*uint64(dx) + 1) * sw / dw2 - pi := (sr.Min.Y+int(sy)-src.Rect.Min.Y)*src.Stride + (sr.Min.X+int(sx)-src.Rect.Min.X)*4 - pr := uint32(src.Pix[pi+0]) * 0x101 - pg := uint32(src.Pix[pi+1]) * 0x101 - pb := uint32(src.Pix[pi+2]) * 0x101 - pa := uint32(src.Pix[pi+3]) * 0x101 - pa1 := (0xffff - pa) * 0x101 - dst.Pix[d+0] = uint8((uint32(dst.Pix[d+0])*pa1/0xffff + pr) >> 8) - dst.Pix[d+1] = uint8((uint32(dst.Pix[d+1])*pa1/0xffff + pg) >> 8) - dst.Pix[d+2] = uint8((uint32(dst.Pix[d+2])*pa1/0xffff + pb) >> 8) - dst.Pix[d+3] = uint8((uint32(dst.Pix[d+3])*pa1/0xffff + pa) >> 8) - } - } -} - -func (nnInterpolator) scale_RGBA_RGBA_Src(dst *image.RGBA, dr, adr image.Rectangle, src *image.RGBA, sr image.Rectangle, opts *Options) { - dw2 := uint64(dr.Dx()) * 2 - dh2 := uint64(dr.Dy()) * 2 - sw := uint64(sr.Dx()) - sh := uint64(sr.Dy()) - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - sy := (2*uint64(dy) + 1) * sh / dh2 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - sx := (2*uint64(dx) + 1) * sw / dw2 - pi := (sr.Min.Y+int(sy)-src.Rect.Min.Y)*src.Stride + (sr.Min.X+int(sx)-src.Rect.Min.X)*4 - pr := uint32(src.Pix[pi+0]) * 0x101 - pg := uint32(src.Pix[pi+1]) * 0x101 - pb := uint32(src.Pix[pi+2]) * 0x101 - pa := uint32(src.Pix[pi+3]) * 0x101 - dst.Pix[d+0] = uint8(pr >> 8) - dst.Pix[d+1] = uint8(pg >> 8) - dst.Pix[d+2] = uint8(pb >> 8) - dst.Pix[d+3] = uint8(pa >> 8) - } - } -} - -func (nnInterpolator) scale_RGBA_YCbCr444_Src(dst *image.RGBA, dr, adr image.Rectangle, src *image.YCbCr, sr image.Rectangle, opts *Options) { - dw2 := uint64(dr.Dx()) * 2 - dh2 := uint64(dr.Dy()) * 2 - sw := uint64(sr.Dx()) - sh := uint64(sr.Dy()) - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - sy := (2*uint64(dy) + 1) * sh / dh2 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - sx := (2*uint64(dx) + 1) * sw / dw2 - pi := (sr.Min.Y+int(sy)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(sx) - src.Rect.Min.X) - pj := (sr.Min.Y+int(sy)-src.Rect.Min.Y)*src.CStride + (sr.Min.X + int(sx) - src.Rect.Min.X) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - pyy1 := int(src.Y[pi]) * 0x10101 - pcb1 := int(src.Cb[pj]) - 128 - pcr1 := int(src.Cr[pj]) - 128 - pr := (pyy1 + 91881*pcr1) >> 8 - pg := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 8 - pb := (pyy1 + 116130*pcb1) >> 8 - if pr < 0 { - pr = 0 - } else if pr > 0xffff { - pr = 0xffff - } - if pg < 0 { - pg = 0 - } else if pg > 0xffff { - pg = 0xffff - } - if pb < 0 { - pb = 0 - } else if pb > 0xffff { - pb = 0xffff - } - dst.Pix[d+0] = uint8(pr >> 8) - dst.Pix[d+1] = uint8(pg >> 8) - dst.Pix[d+2] = uint8(pb >> 8) - dst.Pix[d+3] = 0xff - } - } -} - -func (nnInterpolator) scale_RGBA_YCbCr422_Src(dst *image.RGBA, dr, adr image.Rectangle, src *image.YCbCr, sr image.Rectangle, opts *Options) { - dw2 := uint64(dr.Dx()) * 2 - dh2 := uint64(dr.Dy()) * 2 - sw := uint64(sr.Dx()) - sh := uint64(sr.Dy()) - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - sy := (2*uint64(dy) + 1) * sh / dh2 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - sx := (2*uint64(dx) + 1) * sw / dw2 - pi := (sr.Min.Y+int(sy)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(sx) - src.Rect.Min.X) - pj := (sr.Min.Y+int(sy)-src.Rect.Min.Y)*src.CStride + ((sr.Min.X+int(sx))/2 - src.Rect.Min.X/2) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - pyy1 := int(src.Y[pi]) * 0x10101 - pcb1 := int(src.Cb[pj]) - 128 - pcr1 := int(src.Cr[pj]) - 128 - pr := (pyy1 + 91881*pcr1) >> 8 - pg := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 8 - pb := (pyy1 + 116130*pcb1) >> 8 - if pr < 0 { - pr = 0 - } else if pr > 0xffff { - pr = 0xffff - } - if pg < 0 { - pg = 0 - } else if pg > 0xffff { - pg = 0xffff - } - if pb < 0 { - pb = 0 - } else if pb > 0xffff { - pb = 0xffff - } - dst.Pix[d+0] = uint8(pr >> 8) - dst.Pix[d+1] = uint8(pg >> 8) - dst.Pix[d+2] = uint8(pb >> 8) - dst.Pix[d+3] = 0xff - } - } -} - -func (nnInterpolator) scale_RGBA_YCbCr420_Src(dst *image.RGBA, dr, adr image.Rectangle, src *image.YCbCr, sr image.Rectangle, opts *Options) { - dw2 := uint64(dr.Dx()) * 2 - dh2 := uint64(dr.Dy()) * 2 - sw := uint64(sr.Dx()) - sh := uint64(sr.Dy()) - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - sy := (2*uint64(dy) + 1) * sh / dh2 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - sx := (2*uint64(dx) + 1) * sw / dw2 - pi := (sr.Min.Y+int(sy)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(sx) - src.Rect.Min.X) - pj := ((sr.Min.Y+int(sy))/2-src.Rect.Min.Y/2)*src.CStride + ((sr.Min.X+int(sx))/2 - src.Rect.Min.X/2) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - pyy1 := int(src.Y[pi]) * 0x10101 - pcb1 := int(src.Cb[pj]) - 128 - pcr1 := int(src.Cr[pj]) - 128 - pr := (pyy1 + 91881*pcr1) >> 8 - pg := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 8 - pb := (pyy1 + 116130*pcb1) >> 8 - if pr < 0 { - pr = 0 - } else if pr > 0xffff { - pr = 0xffff - } - if pg < 0 { - pg = 0 - } else if pg > 0xffff { - pg = 0xffff - } - if pb < 0 { - pb = 0 - } else if pb > 0xffff { - pb = 0xffff - } - dst.Pix[d+0] = uint8(pr >> 8) - dst.Pix[d+1] = uint8(pg >> 8) - dst.Pix[d+2] = uint8(pb >> 8) - dst.Pix[d+3] = 0xff - } - } -} - -func (nnInterpolator) scale_RGBA_YCbCr440_Src(dst *image.RGBA, dr, adr image.Rectangle, src *image.YCbCr, sr image.Rectangle, opts *Options) { - dw2 := uint64(dr.Dx()) * 2 - dh2 := uint64(dr.Dy()) * 2 - sw := uint64(sr.Dx()) - sh := uint64(sr.Dy()) - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - sy := (2*uint64(dy) + 1) * sh / dh2 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - sx := (2*uint64(dx) + 1) * sw / dw2 - pi := (sr.Min.Y+int(sy)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(sx) - src.Rect.Min.X) - pj := ((sr.Min.Y+int(sy))/2-src.Rect.Min.Y/2)*src.CStride + (sr.Min.X + int(sx) - src.Rect.Min.X) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - pyy1 := int(src.Y[pi]) * 0x10101 - pcb1 := int(src.Cb[pj]) - 128 - pcr1 := int(src.Cr[pj]) - 128 - pr := (pyy1 + 91881*pcr1) >> 8 - pg := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 8 - pb := (pyy1 + 116130*pcb1) >> 8 - if pr < 0 { - pr = 0 - } else if pr > 0xffff { - pr = 0xffff - } - if pg < 0 { - pg = 0 - } else if pg > 0xffff { - pg = 0xffff - } - if pb < 0 { - pb = 0 - } else if pb > 0xffff { - pb = 0xffff - } - dst.Pix[d+0] = uint8(pr >> 8) - dst.Pix[d+1] = uint8(pg >> 8) - dst.Pix[d+2] = uint8(pb >> 8) - dst.Pix[d+3] = 0xff - } - } -} - -func (nnInterpolator) scale_RGBA_Image_Over(dst *image.RGBA, dr, adr image.Rectangle, src image.Image, sr image.Rectangle, opts *Options) { - dw2 := uint64(dr.Dx()) * 2 - dh2 := uint64(dr.Dy()) * 2 - sw := uint64(sr.Dx()) - sh := uint64(sr.Dy()) - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - sy := (2*uint64(dy) + 1) * sh / dh2 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - sx := (2*uint64(dx) + 1) * sw / dw2 - pr, pg, pb, pa := src.At(sr.Min.X+int(sx), sr.Min.Y+int(sy)).RGBA() - pa1 := (0xffff - pa) * 0x101 - dst.Pix[d+0] = uint8((uint32(dst.Pix[d+0])*pa1/0xffff + pr) >> 8) - dst.Pix[d+1] = uint8((uint32(dst.Pix[d+1])*pa1/0xffff + pg) >> 8) - dst.Pix[d+2] = uint8((uint32(dst.Pix[d+2])*pa1/0xffff + pb) >> 8) - dst.Pix[d+3] = uint8((uint32(dst.Pix[d+3])*pa1/0xffff + pa) >> 8) - } - } -} - -func (nnInterpolator) scale_RGBA_Image_Src(dst *image.RGBA, dr, adr image.Rectangle, src image.Image, sr image.Rectangle, opts *Options) { - dw2 := uint64(dr.Dx()) * 2 - dh2 := uint64(dr.Dy()) * 2 - sw := uint64(sr.Dx()) - sh := uint64(sr.Dy()) - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - sy := (2*uint64(dy) + 1) * sh / dh2 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - sx := (2*uint64(dx) + 1) * sw / dw2 - pr, pg, pb, pa := src.At(sr.Min.X+int(sx), sr.Min.Y+int(sy)).RGBA() - dst.Pix[d+0] = uint8(pr >> 8) - dst.Pix[d+1] = uint8(pg >> 8) - dst.Pix[d+2] = uint8(pb >> 8) - dst.Pix[d+3] = uint8(pa >> 8) - } - } -} - -func (nnInterpolator) scale_Image_Image_Over(dst Image, dr, adr image.Rectangle, src image.Image, sr image.Rectangle, opts *Options) { - dw2 := uint64(dr.Dx()) * 2 - dh2 := uint64(dr.Dy()) * 2 - sw := uint64(sr.Dx()) - sh := uint64(sr.Dy()) - srcMask, smp := opts.SrcMask, opts.SrcMaskP - dstMask, dmp := opts.DstMask, opts.DstMaskP - dstColorRGBA64 := &color.RGBA64{} - dstColor := color.Color(dstColorRGBA64) - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - sy := (2*uint64(dy) + 1) * sh / dh2 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx++ { - sx := (2*uint64(dx) + 1) * sw / dw2 - pr, pg, pb, pa := src.At(sr.Min.X+int(sx), sr.Min.Y+int(sy)).RGBA() - if srcMask != nil { - _, _, _, ma := srcMask.At(smp.X+sr.Min.X+int(sx), smp.Y+sr.Min.Y+int(sy)).RGBA() - pr = pr * ma / 0xffff - pg = pg * ma / 0xffff - pb = pb * ma / 0xffff - pa = pa * ma / 0xffff - } - qr, qg, qb, qa := dst.At(dr.Min.X+int(dx), dr.Min.Y+int(dy)).RGBA() - if dstMask != nil { - _, _, _, ma := dstMask.At(dmp.X+dr.Min.X+int(dx), dmp.Y+dr.Min.Y+int(dy)).RGBA() - pr = pr * ma / 0xffff - pg = pg * ma / 0xffff - pb = pb * ma / 0xffff - pa = pa * ma / 0xffff - } - pa1 := 0xffff - pa - dstColorRGBA64.R = uint16(qr*pa1/0xffff + pr) - dstColorRGBA64.G = uint16(qg*pa1/0xffff + pg) - dstColorRGBA64.B = uint16(qb*pa1/0xffff + pb) - dstColorRGBA64.A = uint16(qa*pa1/0xffff + pa) - dst.Set(dr.Min.X+int(dx), dr.Min.Y+int(dy), dstColor) - } - } -} - -func (nnInterpolator) scale_Image_Image_Src(dst Image, dr, adr image.Rectangle, src image.Image, sr image.Rectangle, opts *Options) { - dw2 := uint64(dr.Dx()) * 2 - dh2 := uint64(dr.Dy()) * 2 - sw := uint64(sr.Dx()) - sh := uint64(sr.Dy()) - srcMask, smp := opts.SrcMask, opts.SrcMaskP - dstMask, dmp := opts.DstMask, opts.DstMaskP - dstColorRGBA64 := &color.RGBA64{} - dstColor := color.Color(dstColorRGBA64) - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - sy := (2*uint64(dy) + 1) * sh / dh2 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx++ { - sx := (2*uint64(dx) + 1) * sw / dw2 - pr, pg, pb, pa := src.At(sr.Min.X+int(sx), sr.Min.Y+int(sy)).RGBA() - if srcMask != nil { - _, _, _, ma := srcMask.At(smp.X+sr.Min.X+int(sx), smp.Y+sr.Min.Y+int(sy)).RGBA() - pr = pr * ma / 0xffff - pg = pg * ma / 0xffff - pb = pb * ma / 0xffff - pa = pa * ma / 0xffff - } - if dstMask != nil { - qr, qg, qb, qa := dst.At(dr.Min.X+int(dx), dr.Min.Y+int(dy)).RGBA() - _, _, _, ma := dstMask.At(dmp.X+dr.Min.X+int(dx), dmp.Y+dr.Min.Y+int(dy)).RGBA() - pr = pr * ma / 0xffff - pg = pg * ma / 0xffff - pb = pb * ma / 0xffff - pa = pa * ma / 0xffff - pa1 := 0xffff - ma - dstColorRGBA64.R = uint16(qr*pa1/0xffff + pr) - dstColorRGBA64.G = uint16(qg*pa1/0xffff + pg) - dstColorRGBA64.B = uint16(qb*pa1/0xffff + pb) - dstColorRGBA64.A = uint16(qa*pa1/0xffff + pa) - dst.Set(dr.Min.X+int(dx), dr.Min.Y+int(dy), dstColor) - } else { - dstColorRGBA64.R = uint16(pr) - dstColorRGBA64.G = uint16(pg) - dstColorRGBA64.B = uint16(pb) - dstColorRGBA64.A = uint16(pa) - dst.Set(dr.Min.X+int(dx), dr.Min.Y+int(dy), dstColor) - } - } - } -} - -func (nnInterpolator) transform_RGBA_Gray_Src(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src *image.Gray, sr image.Rectangle, bias image.Point, opts *Options) { - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx0 := int(d2s[0]*dxf+d2s[1]*dyf+d2s[2]) + bias.X - sy0 := int(d2s[3]*dxf+d2s[4]*dyf+d2s[5]) + bias.Y - if !(image.Point{sx0, sy0}).In(sr) { - continue - } - pi := (sy0-src.Rect.Min.Y)*src.Stride + (sx0 - src.Rect.Min.X) - pr := uint32(src.Pix[pi]) * 0x101 - out := uint8(pr >> 8) - dst.Pix[d+0] = out - dst.Pix[d+1] = out - dst.Pix[d+2] = out - dst.Pix[d+3] = 0xff - } - } -} - -func (nnInterpolator) transform_RGBA_NRGBA_Over(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src *image.NRGBA, sr image.Rectangle, bias image.Point, opts *Options) { - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx0 := int(d2s[0]*dxf+d2s[1]*dyf+d2s[2]) + bias.X - sy0 := int(d2s[3]*dxf+d2s[4]*dyf+d2s[5]) + bias.Y - if !(image.Point{sx0, sy0}).In(sr) { - continue - } - pi := (sy0-src.Rect.Min.Y)*src.Stride + (sx0-src.Rect.Min.X)*4 - pa := uint32(src.Pix[pi+3]) * 0x101 - pr := uint32(src.Pix[pi+0]) * pa / 0xff - pg := uint32(src.Pix[pi+1]) * pa / 0xff - pb := uint32(src.Pix[pi+2]) * pa / 0xff - pa1 := (0xffff - pa) * 0x101 - dst.Pix[d+0] = uint8((uint32(dst.Pix[d+0])*pa1/0xffff + pr) >> 8) - dst.Pix[d+1] = uint8((uint32(dst.Pix[d+1])*pa1/0xffff + pg) >> 8) - dst.Pix[d+2] = uint8((uint32(dst.Pix[d+2])*pa1/0xffff + pb) >> 8) - dst.Pix[d+3] = uint8((uint32(dst.Pix[d+3])*pa1/0xffff + pa) >> 8) - } - } -} - -func (nnInterpolator) transform_RGBA_NRGBA_Src(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src *image.NRGBA, sr image.Rectangle, bias image.Point, opts *Options) { - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx0 := int(d2s[0]*dxf+d2s[1]*dyf+d2s[2]) + bias.X - sy0 := int(d2s[3]*dxf+d2s[4]*dyf+d2s[5]) + bias.Y - if !(image.Point{sx0, sy0}).In(sr) { - continue - } - pi := (sy0-src.Rect.Min.Y)*src.Stride + (sx0-src.Rect.Min.X)*4 - pa := uint32(src.Pix[pi+3]) * 0x101 - pr := uint32(src.Pix[pi+0]) * pa / 0xff - pg := uint32(src.Pix[pi+1]) * pa / 0xff - pb := uint32(src.Pix[pi+2]) * pa / 0xff - dst.Pix[d+0] = uint8(pr >> 8) - dst.Pix[d+1] = uint8(pg >> 8) - dst.Pix[d+2] = uint8(pb >> 8) - dst.Pix[d+3] = uint8(pa >> 8) - } - } -} - -func (nnInterpolator) transform_RGBA_RGBA_Over(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src *image.RGBA, sr image.Rectangle, bias image.Point, opts *Options) { - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx0 := int(d2s[0]*dxf+d2s[1]*dyf+d2s[2]) + bias.X - sy0 := int(d2s[3]*dxf+d2s[4]*dyf+d2s[5]) + bias.Y - if !(image.Point{sx0, sy0}).In(sr) { - continue - } - pi := (sy0-src.Rect.Min.Y)*src.Stride + (sx0-src.Rect.Min.X)*4 - pr := uint32(src.Pix[pi+0]) * 0x101 - pg := uint32(src.Pix[pi+1]) * 0x101 - pb := uint32(src.Pix[pi+2]) * 0x101 - pa := uint32(src.Pix[pi+3]) * 0x101 - pa1 := (0xffff - pa) * 0x101 - dst.Pix[d+0] = uint8((uint32(dst.Pix[d+0])*pa1/0xffff + pr) >> 8) - dst.Pix[d+1] = uint8((uint32(dst.Pix[d+1])*pa1/0xffff + pg) >> 8) - dst.Pix[d+2] = uint8((uint32(dst.Pix[d+2])*pa1/0xffff + pb) >> 8) - dst.Pix[d+3] = uint8((uint32(dst.Pix[d+3])*pa1/0xffff + pa) >> 8) - } - } -} - -func (nnInterpolator) transform_RGBA_RGBA_Src(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src *image.RGBA, sr image.Rectangle, bias image.Point, opts *Options) { - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx0 := int(d2s[0]*dxf+d2s[1]*dyf+d2s[2]) + bias.X - sy0 := int(d2s[3]*dxf+d2s[4]*dyf+d2s[5]) + bias.Y - if !(image.Point{sx0, sy0}).In(sr) { - continue - } - pi := (sy0-src.Rect.Min.Y)*src.Stride + (sx0-src.Rect.Min.X)*4 - pr := uint32(src.Pix[pi+0]) * 0x101 - pg := uint32(src.Pix[pi+1]) * 0x101 - pb := uint32(src.Pix[pi+2]) * 0x101 - pa := uint32(src.Pix[pi+3]) * 0x101 - dst.Pix[d+0] = uint8(pr >> 8) - dst.Pix[d+1] = uint8(pg >> 8) - dst.Pix[d+2] = uint8(pb >> 8) - dst.Pix[d+3] = uint8(pa >> 8) - } - } -} - -func (nnInterpolator) transform_RGBA_YCbCr444_Src(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src *image.YCbCr, sr image.Rectangle, bias image.Point, opts *Options) { - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx0 := int(d2s[0]*dxf+d2s[1]*dyf+d2s[2]) + bias.X - sy0 := int(d2s[3]*dxf+d2s[4]*dyf+d2s[5]) + bias.Y - if !(image.Point{sx0, sy0}).In(sr) { - continue - } - pi := (sy0-src.Rect.Min.Y)*src.YStride + (sx0 - src.Rect.Min.X) - pj := (sy0-src.Rect.Min.Y)*src.CStride + (sx0 - src.Rect.Min.X) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - pyy1 := int(src.Y[pi]) * 0x10101 - pcb1 := int(src.Cb[pj]) - 128 - pcr1 := int(src.Cr[pj]) - 128 - pr := (pyy1 + 91881*pcr1) >> 8 - pg := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 8 - pb := (pyy1 + 116130*pcb1) >> 8 - if pr < 0 { - pr = 0 - } else if pr > 0xffff { - pr = 0xffff - } - if pg < 0 { - pg = 0 - } else if pg > 0xffff { - pg = 0xffff - } - if pb < 0 { - pb = 0 - } else if pb > 0xffff { - pb = 0xffff - } - dst.Pix[d+0] = uint8(pr >> 8) - dst.Pix[d+1] = uint8(pg >> 8) - dst.Pix[d+2] = uint8(pb >> 8) - dst.Pix[d+3] = 0xff - } - } -} - -func (nnInterpolator) transform_RGBA_YCbCr422_Src(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src *image.YCbCr, sr image.Rectangle, bias image.Point, opts *Options) { - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx0 := int(d2s[0]*dxf+d2s[1]*dyf+d2s[2]) + bias.X - sy0 := int(d2s[3]*dxf+d2s[4]*dyf+d2s[5]) + bias.Y - if !(image.Point{sx0, sy0}).In(sr) { - continue - } - pi := (sy0-src.Rect.Min.Y)*src.YStride + (sx0 - src.Rect.Min.X) - pj := (sy0-src.Rect.Min.Y)*src.CStride + ((sx0)/2 - src.Rect.Min.X/2) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - pyy1 := int(src.Y[pi]) * 0x10101 - pcb1 := int(src.Cb[pj]) - 128 - pcr1 := int(src.Cr[pj]) - 128 - pr := (pyy1 + 91881*pcr1) >> 8 - pg := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 8 - pb := (pyy1 + 116130*pcb1) >> 8 - if pr < 0 { - pr = 0 - } else if pr > 0xffff { - pr = 0xffff - } - if pg < 0 { - pg = 0 - } else if pg > 0xffff { - pg = 0xffff - } - if pb < 0 { - pb = 0 - } else if pb > 0xffff { - pb = 0xffff - } - dst.Pix[d+0] = uint8(pr >> 8) - dst.Pix[d+1] = uint8(pg >> 8) - dst.Pix[d+2] = uint8(pb >> 8) - dst.Pix[d+3] = 0xff - } - } -} - -func (nnInterpolator) transform_RGBA_YCbCr420_Src(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src *image.YCbCr, sr image.Rectangle, bias image.Point, opts *Options) { - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx0 := int(d2s[0]*dxf+d2s[1]*dyf+d2s[2]) + bias.X - sy0 := int(d2s[3]*dxf+d2s[4]*dyf+d2s[5]) + bias.Y - if !(image.Point{sx0, sy0}).In(sr) { - continue - } - pi := (sy0-src.Rect.Min.Y)*src.YStride + (sx0 - src.Rect.Min.X) - pj := ((sy0)/2-src.Rect.Min.Y/2)*src.CStride + ((sx0)/2 - src.Rect.Min.X/2) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - pyy1 := int(src.Y[pi]) * 0x10101 - pcb1 := int(src.Cb[pj]) - 128 - pcr1 := int(src.Cr[pj]) - 128 - pr := (pyy1 + 91881*pcr1) >> 8 - pg := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 8 - pb := (pyy1 + 116130*pcb1) >> 8 - if pr < 0 { - pr = 0 - } else if pr > 0xffff { - pr = 0xffff - } - if pg < 0 { - pg = 0 - } else if pg > 0xffff { - pg = 0xffff - } - if pb < 0 { - pb = 0 - } else if pb > 0xffff { - pb = 0xffff - } - dst.Pix[d+0] = uint8(pr >> 8) - dst.Pix[d+1] = uint8(pg >> 8) - dst.Pix[d+2] = uint8(pb >> 8) - dst.Pix[d+3] = 0xff - } - } -} - -func (nnInterpolator) transform_RGBA_YCbCr440_Src(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src *image.YCbCr, sr image.Rectangle, bias image.Point, opts *Options) { - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx0 := int(d2s[0]*dxf+d2s[1]*dyf+d2s[2]) + bias.X - sy0 := int(d2s[3]*dxf+d2s[4]*dyf+d2s[5]) + bias.Y - if !(image.Point{sx0, sy0}).In(sr) { - continue - } - pi := (sy0-src.Rect.Min.Y)*src.YStride + (sx0 - src.Rect.Min.X) - pj := ((sy0)/2-src.Rect.Min.Y/2)*src.CStride + (sx0 - src.Rect.Min.X) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - pyy1 := int(src.Y[pi]) * 0x10101 - pcb1 := int(src.Cb[pj]) - 128 - pcr1 := int(src.Cr[pj]) - 128 - pr := (pyy1 + 91881*pcr1) >> 8 - pg := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 8 - pb := (pyy1 + 116130*pcb1) >> 8 - if pr < 0 { - pr = 0 - } else if pr > 0xffff { - pr = 0xffff - } - if pg < 0 { - pg = 0 - } else if pg > 0xffff { - pg = 0xffff - } - if pb < 0 { - pb = 0 - } else if pb > 0xffff { - pb = 0xffff - } - dst.Pix[d+0] = uint8(pr >> 8) - dst.Pix[d+1] = uint8(pg >> 8) - dst.Pix[d+2] = uint8(pb >> 8) - dst.Pix[d+3] = 0xff - } - } -} - -func (nnInterpolator) transform_RGBA_Image_Over(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src image.Image, sr image.Rectangle, bias image.Point, opts *Options) { - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx0 := int(d2s[0]*dxf+d2s[1]*dyf+d2s[2]) + bias.X - sy0 := int(d2s[3]*dxf+d2s[4]*dyf+d2s[5]) + bias.Y - if !(image.Point{sx0, sy0}).In(sr) { - continue - } - pr, pg, pb, pa := src.At(sx0, sy0).RGBA() - pa1 := (0xffff - pa) * 0x101 - dst.Pix[d+0] = uint8((uint32(dst.Pix[d+0])*pa1/0xffff + pr) >> 8) - dst.Pix[d+1] = uint8((uint32(dst.Pix[d+1])*pa1/0xffff + pg) >> 8) - dst.Pix[d+2] = uint8((uint32(dst.Pix[d+2])*pa1/0xffff + pb) >> 8) - dst.Pix[d+3] = uint8((uint32(dst.Pix[d+3])*pa1/0xffff + pa) >> 8) - } - } -} - -func (nnInterpolator) transform_RGBA_Image_Src(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src image.Image, sr image.Rectangle, bias image.Point, opts *Options) { - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx0 := int(d2s[0]*dxf+d2s[1]*dyf+d2s[2]) + bias.X - sy0 := int(d2s[3]*dxf+d2s[4]*dyf+d2s[5]) + bias.Y - if !(image.Point{sx0, sy0}).In(sr) { - continue - } - pr, pg, pb, pa := src.At(sx0, sy0).RGBA() - dst.Pix[d+0] = uint8(pr >> 8) - dst.Pix[d+1] = uint8(pg >> 8) - dst.Pix[d+2] = uint8(pb >> 8) - dst.Pix[d+3] = uint8(pa >> 8) - } - } -} - -func (nnInterpolator) transform_Image_Image_Over(dst Image, dr, adr image.Rectangle, d2s *f64.Aff3, src image.Image, sr image.Rectangle, bias image.Point, opts *Options) { - srcMask, smp := opts.SrcMask, opts.SrcMaskP - dstMask, dmp := opts.DstMask, opts.DstMaskP - dstColorRGBA64 := &color.RGBA64{} - dstColor := color.Color(dstColorRGBA64) - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx++ { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx0 := int(d2s[0]*dxf+d2s[1]*dyf+d2s[2]) + bias.X - sy0 := int(d2s[3]*dxf+d2s[4]*dyf+d2s[5]) + bias.Y - if !(image.Point{sx0, sy0}).In(sr) { - continue - } - pr, pg, pb, pa := src.At(sx0, sy0).RGBA() - if srcMask != nil { - _, _, _, ma := srcMask.At(smp.X+sx0, smp.Y+sy0).RGBA() - pr = pr * ma / 0xffff - pg = pg * ma / 0xffff - pb = pb * ma / 0xffff - pa = pa * ma / 0xffff - } - qr, qg, qb, qa := dst.At(dr.Min.X+int(dx), dr.Min.Y+int(dy)).RGBA() - if dstMask != nil { - _, _, _, ma := dstMask.At(dmp.X+dr.Min.X+int(dx), dmp.Y+dr.Min.Y+int(dy)).RGBA() - pr = pr * ma / 0xffff - pg = pg * ma / 0xffff - pb = pb * ma / 0xffff - pa = pa * ma / 0xffff - } - pa1 := 0xffff - pa - dstColorRGBA64.R = uint16(qr*pa1/0xffff + pr) - dstColorRGBA64.G = uint16(qg*pa1/0xffff + pg) - dstColorRGBA64.B = uint16(qb*pa1/0xffff + pb) - dstColorRGBA64.A = uint16(qa*pa1/0xffff + pa) - dst.Set(dr.Min.X+int(dx), dr.Min.Y+int(dy), dstColor) - } - } -} - -func (nnInterpolator) transform_Image_Image_Src(dst Image, dr, adr image.Rectangle, d2s *f64.Aff3, src image.Image, sr image.Rectangle, bias image.Point, opts *Options) { - srcMask, smp := opts.SrcMask, opts.SrcMaskP - dstMask, dmp := opts.DstMask, opts.DstMaskP - dstColorRGBA64 := &color.RGBA64{} - dstColor := color.Color(dstColorRGBA64) - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx++ { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx0 := int(d2s[0]*dxf+d2s[1]*dyf+d2s[2]) + bias.X - sy0 := int(d2s[3]*dxf+d2s[4]*dyf+d2s[5]) + bias.Y - if !(image.Point{sx0, sy0}).In(sr) { - continue - } - pr, pg, pb, pa := src.At(sx0, sy0).RGBA() - if srcMask != nil { - _, _, _, ma := srcMask.At(smp.X+sx0, smp.Y+sy0).RGBA() - pr = pr * ma / 0xffff - pg = pg * ma / 0xffff - pb = pb * ma / 0xffff - pa = pa * ma / 0xffff - } - if dstMask != nil { - qr, qg, qb, qa := dst.At(dr.Min.X+int(dx), dr.Min.Y+int(dy)).RGBA() - _, _, _, ma := dstMask.At(dmp.X+dr.Min.X+int(dx), dmp.Y+dr.Min.Y+int(dy)).RGBA() - pr = pr * ma / 0xffff - pg = pg * ma / 0xffff - pb = pb * ma / 0xffff - pa = pa * ma / 0xffff - pa1 := 0xffff - ma - dstColorRGBA64.R = uint16(qr*pa1/0xffff + pr) - dstColorRGBA64.G = uint16(qg*pa1/0xffff + pg) - dstColorRGBA64.B = uint16(qb*pa1/0xffff + pb) - dstColorRGBA64.A = uint16(qa*pa1/0xffff + pa) - dst.Set(dr.Min.X+int(dx), dr.Min.Y+int(dy), dstColor) - } else { - dstColorRGBA64.R = uint16(pr) - dstColorRGBA64.G = uint16(pg) - dstColorRGBA64.B = uint16(pb) - dstColorRGBA64.A = uint16(pa) - dst.Set(dr.Min.X+int(dx), dr.Min.Y+int(dy), dstColor) - } - } - } -} - -func (z ablInterpolator) Scale(dst Image, dr image.Rectangle, src image.Image, sr image.Rectangle, op Op, opts *Options) { - // Try to simplify a Scale to a Copy when DstMask is not specified. - // If DstMask is not nil, Copy will call Scale back with same dr and sr, and cause stack overflow. - if dr.Size() == sr.Size() && (opts == nil || opts.DstMask == nil) { - Copy(dst, dr.Min, src, sr, op, opts) - return - } - - var o Options - if opts != nil { - o = *opts - } - - // adr is the affected destination pixels. - adr := dst.Bounds().Intersect(dr) - adr, o.DstMask = clipAffectedDestRect(adr, o.DstMask, o.DstMaskP) - if adr.Empty() || sr.Empty() { - return - } - // Make adr relative to dr.Min. - adr = adr.Sub(dr.Min) - if op == Over && o.SrcMask == nil && opaque(src) { - op = Src - } - - // sr is the source pixels. If it extends beyond the src bounds, - // we cannot use the type-specific fast paths, as they access - // the Pix fields directly without bounds checking. - // - // Similarly, the fast paths assume that the masks are nil. - if o.DstMask != nil || o.SrcMask != nil || !sr.In(src.Bounds()) { - switch op { - case Over: - z.scale_Image_Image_Over(dst, dr, adr, src, sr, &o) - case Src: - z.scale_Image_Image_Src(dst, dr, adr, src, sr, &o) - } - } else if _, ok := src.(*image.Uniform); ok { - Draw(dst, dr, src, src.Bounds().Min, op) - } else { - switch op { - case Over: - switch dst := dst.(type) { - case *image.RGBA: - switch src := src.(type) { - case *image.NRGBA: - z.scale_RGBA_NRGBA_Over(dst, dr, adr, src, sr, &o) - case *image.RGBA: - z.scale_RGBA_RGBA_Over(dst, dr, adr, src, sr, &o) - default: - z.scale_RGBA_Image_Over(dst, dr, adr, src, sr, &o) - } - default: - switch src := src.(type) { - default: - z.scale_Image_Image_Over(dst, dr, adr, src, sr, &o) - } - } - case Src: - switch dst := dst.(type) { - case *image.RGBA: - switch src := src.(type) { - case *image.Gray: - z.scale_RGBA_Gray_Src(dst, dr, adr, src, sr, &o) - case *image.NRGBA: - z.scale_RGBA_NRGBA_Src(dst, dr, adr, src, sr, &o) - case *image.RGBA: - z.scale_RGBA_RGBA_Src(dst, dr, adr, src, sr, &o) - case *image.YCbCr: - switch src.SubsampleRatio { - default: - z.scale_RGBA_Image_Src(dst, dr, adr, src, sr, &o) - case image.YCbCrSubsampleRatio444: - z.scale_RGBA_YCbCr444_Src(dst, dr, adr, src, sr, &o) - case image.YCbCrSubsampleRatio422: - z.scale_RGBA_YCbCr422_Src(dst, dr, adr, src, sr, &o) - case image.YCbCrSubsampleRatio420: - z.scale_RGBA_YCbCr420_Src(dst, dr, adr, src, sr, &o) - case image.YCbCrSubsampleRatio440: - z.scale_RGBA_YCbCr440_Src(dst, dr, adr, src, sr, &o) - } - default: - z.scale_RGBA_Image_Src(dst, dr, adr, src, sr, &o) - } - default: - switch src := src.(type) { - default: - z.scale_Image_Image_Src(dst, dr, adr, src, sr, &o) - } - } - } - } -} - -func (z ablInterpolator) Transform(dst Image, s2d f64.Aff3, src image.Image, sr image.Rectangle, op Op, opts *Options) { - // Try to simplify a Transform to a Copy. - if s2d[0] == 1 && s2d[1] == 0 && s2d[3] == 0 && s2d[4] == 1 { - dx := int(s2d[2]) - dy := int(s2d[5]) - if float64(dx) == s2d[2] && float64(dy) == s2d[5] { - Copy(dst, image.Point{X: sr.Min.X + dx, Y: sr.Min.X + dy}, src, sr, op, opts) - return - } - } - - var o Options - if opts != nil { - o = *opts - } - - dr := transformRect(&s2d, &sr) - // adr is the affected destination pixels. - adr := dst.Bounds().Intersect(dr) - adr, o.DstMask = clipAffectedDestRect(adr, o.DstMask, o.DstMaskP) - if adr.Empty() || sr.Empty() { - return - } - if op == Over && o.SrcMask == nil && opaque(src) { - op = Src - } - - d2s := invert(&s2d) - // bias is a translation of the mapping from dst coordinates to src - // coordinates such that the latter temporarily have non-negative X - // and Y coordinates. This allows us to write int(f) instead of - // int(math.Floor(f)), since "round to zero" and "round down" are - // equivalent when f >= 0, but the former is much cheaper. The X-- - // and Y-- are because the TransformLeaf methods have a "sx -= 0.5" - // adjustment. - bias := transformRect(&d2s, &adr).Min - bias.X-- - bias.Y-- - d2s[2] -= float64(bias.X) - d2s[5] -= float64(bias.Y) - // Make adr relative to dr.Min. - adr = adr.Sub(dr.Min) - // sr is the source pixels. If it extends beyond the src bounds, - // we cannot use the type-specific fast paths, as they access - // the Pix fields directly without bounds checking. - // - // Similarly, the fast paths assume that the masks are nil. - if o.DstMask != nil || o.SrcMask != nil || !sr.In(src.Bounds()) { - switch op { - case Over: - z.transform_Image_Image_Over(dst, dr, adr, &d2s, src, sr, bias, &o) - case Src: - z.transform_Image_Image_Src(dst, dr, adr, &d2s, src, sr, bias, &o) - } - } else if u, ok := src.(*image.Uniform); ok { - transform_Uniform(dst, dr, adr, &d2s, u, sr, bias, op) - } else { - switch op { - case Over: - switch dst := dst.(type) { - case *image.RGBA: - switch src := src.(type) { - case *image.NRGBA: - z.transform_RGBA_NRGBA_Over(dst, dr, adr, &d2s, src, sr, bias, &o) - case *image.RGBA: - z.transform_RGBA_RGBA_Over(dst, dr, adr, &d2s, src, sr, bias, &o) - default: - z.transform_RGBA_Image_Over(dst, dr, adr, &d2s, src, sr, bias, &o) - } - default: - switch src := src.(type) { - default: - z.transform_Image_Image_Over(dst, dr, adr, &d2s, src, sr, bias, &o) - } - } - case Src: - switch dst := dst.(type) { - case *image.RGBA: - switch src := src.(type) { - case *image.Gray: - z.transform_RGBA_Gray_Src(dst, dr, adr, &d2s, src, sr, bias, &o) - case *image.NRGBA: - z.transform_RGBA_NRGBA_Src(dst, dr, adr, &d2s, src, sr, bias, &o) - case *image.RGBA: - z.transform_RGBA_RGBA_Src(dst, dr, adr, &d2s, src, sr, bias, &o) - case *image.YCbCr: - switch src.SubsampleRatio { - default: - z.transform_RGBA_Image_Src(dst, dr, adr, &d2s, src, sr, bias, &o) - case image.YCbCrSubsampleRatio444: - z.transform_RGBA_YCbCr444_Src(dst, dr, adr, &d2s, src, sr, bias, &o) - case image.YCbCrSubsampleRatio422: - z.transform_RGBA_YCbCr422_Src(dst, dr, adr, &d2s, src, sr, bias, &o) - case image.YCbCrSubsampleRatio420: - z.transform_RGBA_YCbCr420_Src(dst, dr, adr, &d2s, src, sr, bias, &o) - case image.YCbCrSubsampleRatio440: - z.transform_RGBA_YCbCr440_Src(dst, dr, adr, &d2s, src, sr, bias, &o) - } - default: - z.transform_RGBA_Image_Src(dst, dr, adr, &d2s, src, sr, bias, &o) - } - default: - switch src := src.(type) { - default: - z.transform_Image_Image_Src(dst, dr, adr, &d2s, src, sr, bias, &o) - } - } - } - } -} - -func (ablInterpolator) scale_RGBA_Gray_Src(dst *image.RGBA, dr, adr image.Rectangle, src *image.Gray, sr image.Rectangle, opts *Options) { - sw := int32(sr.Dx()) - sh := int32(sr.Dy()) - yscale := float64(sh) / float64(dr.Dy()) - xscale := float64(sw) / float64(dr.Dx()) - swMinus1, shMinus1 := sw-1, sh-1 - - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - sy := (float64(dy)+0.5)*yscale - 0.5 - // If sy < 0, we will clamp sy0 to 0 anyway, so it doesn't matter if - // we say int32(sy) instead of int32(math.Floor(sy)). Similarly for - // sx, below. - sy0 := int32(sy) - yFrac0 := sy - float64(sy0) - yFrac1 := 1 - yFrac0 - sy1 := sy0 + 1 - if sy < 0 { - sy0, sy1 = 0, 0 - yFrac0, yFrac1 = 0, 1 - } else if sy1 > shMinus1 { - sy0, sy1 = shMinus1, shMinus1 - yFrac0, yFrac1 = 1, 0 - } - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - sx := (float64(dx)+0.5)*xscale - 0.5 - sx0 := int32(sx) - xFrac0 := sx - float64(sx0) - xFrac1 := 1 - xFrac0 - sx1 := sx0 + 1 - if sx < 0 { - sx0, sx1 = 0, 0 - xFrac0, xFrac1 = 0, 1 - } else if sx1 > swMinus1 { - sx0, sx1 = swMinus1, swMinus1 - xFrac0, xFrac1 = 1, 0 - } - - s00i := (sr.Min.Y+int(sy0)-src.Rect.Min.Y)*src.Stride + (sr.Min.X + int(sx0) - src.Rect.Min.X) - s00ru := uint32(src.Pix[s00i]) * 0x101 - s00r := float64(s00ru) - s10i := (sr.Min.Y+int(sy0)-src.Rect.Min.Y)*src.Stride + (sr.Min.X + int(sx1) - src.Rect.Min.X) - s10ru := uint32(src.Pix[s10i]) * 0x101 - s10r := float64(s10ru) - s10r = xFrac1*s00r + xFrac0*s10r - s01i := (sr.Min.Y+int(sy1)-src.Rect.Min.Y)*src.Stride + (sr.Min.X + int(sx0) - src.Rect.Min.X) - s01ru := uint32(src.Pix[s01i]) * 0x101 - s01r := float64(s01ru) - s11i := (sr.Min.Y+int(sy1)-src.Rect.Min.Y)*src.Stride + (sr.Min.X + int(sx1) - src.Rect.Min.X) - s11ru := uint32(src.Pix[s11i]) * 0x101 - s11r := float64(s11ru) - s11r = xFrac1*s01r + xFrac0*s11r - s11r = yFrac1*s10r + yFrac0*s11r - pr := uint32(s11r) - out := uint8(pr >> 8) - dst.Pix[d+0] = out - dst.Pix[d+1] = out - dst.Pix[d+2] = out - dst.Pix[d+3] = 0xff - } - } -} - -func (ablInterpolator) scale_RGBA_NRGBA_Over(dst *image.RGBA, dr, adr image.Rectangle, src *image.NRGBA, sr image.Rectangle, opts *Options) { - sw := int32(sr.Dx()) - sh := int32(sr.Dy()) - yscale := float64(sh) / float64(dr.Dy()) - xscale := float64(sw) / float64(dr.Dx()) - swMinus1, shMinus1 := sw-1, sh-1 - - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - sy := (float64(dy)+0.5)*yscale - 0.5 - // If sy < 0, we will clamp sy0 to 0 anyway, so it doesn't matter if - // we say int32(sy) instead of int32(math.Floor(sy)). Similarly for - // sx, below. - sy0 := int32(sy) - yFrac0 := sy - float64(sy0) - yFrac1 := 1 - yFrac0 - sy1 := sy0 + 1 - if sy < 0 { - sy0, sy1 = 0, 0 - yFrac0, yFrac1 = 0, 1 - } else if sy1 > shMinus1 { - sy0, sy1 = shMinus1, shMinus1 - yFrac0, yFrac1 = 1, 0 - } - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - sx := (float64(dx)+0.5)*xscale - 0.5 - sx0 := int32(sx) - xFrac0 := sx - float64(sx0) - xFrac1 := 1 - xFrac0 - sx1 := sx0 + 1 - if sx < 0 { - sx0, sx1 = 0, 0 - xFrac0, xFrac1 = 0, 1 - } else if sx1 > swMinus1 { - sx0, sx1 = swMinus1, swMinus1 - xFrac0, xFrac1 = 1, 0 - } - - s00i := (sr.Min.Y+int(sy0)-src.Rect.Min.Y)*src.Stride + (sr.Min.X+int(sx0)-src.Rect.Min.X)*4 - s00au := uint32(src.Pix[s00i+3]) * 0x101 - s00ru := uint32(src.Pix[s00i+0]) * s00au / 0xff - s00gu := uint32(src.Pix[s00i+1]) * s00au / 0xff - s00bu := uint32(src.Pix[s00i+2]) * s00au / 0xff - s00r := float64(s00ru) - s00g := float64(s00gu) - s00b := float64(s00bu) - s00a := float64(s00au) - s10i := (sr.Min.Y+int(sy0)-src.Rect.Min.Y)*src.Stride + (sr.Min.X+int(sx1)-src.Rect.Min.X)*4 - s10au := uint32(src.Pix[s10i+3]) * 0x101 - s10ru := uint32(src.Pix[s10i+0]) * s10au / 0xff - s10gu := uint32(src.Pix[s10i+1]) * s10au / 0xff - s10bu := uint32(src.Pix[s10i+2]) * s10au / 0xff - s10r := float64(s10ru) - s10g := float64(s10gu) - s10b := float64(s10bu) - s10a := float64(s10au) - s10r = xFrac1*s00r + xFrac0*s10r - s10g = xFrac1*s00g + xFrac0*s10g - s10b = xFrac1*s00b + xFrac0*s10b - s10a = xFrac1*s00a + xFrac0*s10a - s01i := (sr.Min.Y+int(sy1)-src.Rect.Min.Y)*src.Stride + (sr.Min.X+int(sx0)-src.Rect.Min.X)*4 - s01au := uint32(src.Pix[s01i+3]) * 0x101 - s01ru := uint32(src.Pix[s01i+0]) * s01au / 0xff - s01gu := uint32(src.Pix[s01i+1]) * s01au / 0xff - s01bu := uint32(src.Pix[s01i+2]) * s01au / 0xff - s01r := float64(s01ru) - s01g := float64(s01gu) - s01b := float64(s01bu) - s01a := float64(s01au) - s11i := (sr.Min.Y+int(sy1)-src.Rect.Min.Y)*src.Stride + (sr.Min.X+int(sx1)-src.Rect.Min.X)*4 - s11au := uint32(src.Pix[s11i+3]) * 0x101 - s11ru := uint32(src.Pix[s11i+0]) * s11au / 0xff - s11gu := uint32(src.Pix[s11i+1]) * s11au / 0xff - s11bu := uint32(src.Pix[s11i+2]) * s11au / 0xff - s11r := float64(s11ru) - s11g := float64(s11gu) - s11b := float64(s11bu) - s11a := float64(s11au) - s11r = xFrac1*s01r + xFrac0*s11r - s11g = xFrac1*s01g + xFrac0*s11g - s11b = xFrac1*s01b + xFrac0*s11b - s11a = xFrac1*s01a + xFrac0*s11a - s11r = yFrac1*s10r + yFrac0*s11r - s11g = yFrac1*s10g + yFrac0*s11g - s11b = yFrac1*s10b + yFrac0*s11b - s11a = yFrac1*s10a + yFrac0*s11a - pr := uint32(s11r) - pg := uint32(s11g) - pb := uint32(s11b) - pa := uint32(s11a) - pa1 := (0xffff - pa) * 0x101 - dst.Pix[d+0] = uint8((uint32(dst.Pix[d+0])*pa1/0xffff + pr) >> 8) - dst.Pix[d+1] = uint8((uint32(dst.Pix[d+1])*pa1/0xffff + pg) >> 8) - dst.Pix[d+2] = uint8((uint32(dst.Pix[d+2])*pa1/0xffff + pb) >> 8) - dst.Pix[d+3] = uint8((uint32(dst.Pix[d+3])*pa1/0xffff + pa) >> 8) - } - } -} - -func (ablInterpolator) scale_RGBA_NRGBA_Src(dst *image.RGBA, dr, adr image.Rectangle, src *image.NRGBA, sr image.Rectangle, opts *Options) { - sw := int32(sr.Dx()) - sh := int32(sr.Dy()) - yscale := float64(sh) / float64(dr.Dy()) - xscale := float64(sw) / float64(dr.Dx()) - swMinus1, shMinus1 := sw-1, sh-1 - - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - sy := (float64(dy)+0.5)*yscale - 0.5 - // If sy < 0, we will clamp sy0 to 0 anyway, so it doesn't matter if - // we say int32(sy) instead of int32(math.Floor(sy)). Similarly for - // sx, below. - sy0 := int32(sy) - yFrac0 := sy - float64(sy0) - yFrac1 := 1 - yFrac0 - sy1 := sy0 + 1 - if sy < 0 { - sy0, sy1 = 0, 0 - yFrac0, yFrac1 = 0, 1 - } else if sy1 > shMinus1 { - sy0, sy1 = shMinus1, shMinus1 - yFrac0, yFrac1 = 1, 0 - } - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - sx := (float64(dx)+0.5)*xscale - 0.5 - sx0 := int32(sx) - xFrac0 := sx - float64(sx0) - xFrac1 := 1 - xFrac0 - sx1 := sx0 + 1 - if sx < 0 { - sx0, sx1 = 0, 0 - xFrac0, xFrac1 = 0, 1 - } else if sx1 > swMinus1 { - sx0, sx1 = swMinus1, swMinus1 - xFrac0, xFrac1 = 1, 0 - } - - s00i := (sr.Min.Y+int(sy0)-src.Rect.Min.Y)*src.Stride + (sr.Min.X+int(sx0)-src.Rect.Min.X)*4 - s00au := uint32(src.Pix[s00i+3]) * 0x101 - s00ru := uint32(src.Pix[s00i+0]) * s00au / 0xff - s00gu := uint32(src.Pix[s00i+1]) * s00au / 0xff - s00bu := uint32(src.Pix[s00i+2]) * s00au / 0xff - s00r := float64(s00ru) - s00g := float64(s00gu) - s00b := float64(s00bu) - s00a := float64(s00au) - s10i := (sr.Min.Y+int(sy0)-src.Rect.Min.Y)*src.Stride + (sr.Min.X+int(sx1)-src.Rect.Min.X)*4 - s10au := uint32(src.Pix[s10i+3]) * 0x101 - s10ru := uint32(src.Pix[s10i+0]) * s10au / 0xff - s10gu := uint32(src.Pix[s10i+1]) * s10au / 0xff - s10bu := uint32(src.Pix[s10i+2]) * s10au / 0xff - s10r := float64(s10ru) - s10g := float64(s10gu) - s10b := float64(s10bu) - s10a := float64(s10au) - s10r = xFrac1*s00r + xFrac0*s10r - s10g = xFrac1*s00g + xFrac0*s10g - s10b = xFrac1*s00b + xFrac0*s10b - s10a = xFrac1*s00a + xFrac0*s10a - s01i := (sr.Min.Y+int(sy1)-src.Rect.Min.Y)*src.Stride + (sr.Min.X+int(sx0)-src.Rect.Min.X)*4 - s01au := uint32(src.Pix[s01i+3]) * 0x101 - s01ru := uint32(src.Pix[s01i+0]) * s01au / 0xff - s01gu := uint32(src.Pix[s01i+1]) * s01au / 0xff - s01bu := uint32(src.Pix[s01i+2]) * s01au / 0xff - s01r := float64(s01ru) - s01g := float64(s01gu) - s01b := float64(s01bu) - s01a := float64(s01au) - s11i := (sr.Min.Y+int(sy1)-src.Rect.Min.Y)*src.Stride + (sr.Min.X+int(sx1)-src.Rect.Min.X)*4 - s11au := uint32(src.Pix[s11i+3]) * 0x101 - s11ru := uint32(src.Pix[s11i+0]) * s11au / 0xff - s11gu := uint32(src.Pix[s11i+1]) * s11au / 0xff - s11bu := uint32(src.Pix[s11i+2]) * s11au / 0xff - s11r := float64(s11ru) - s11g := float64(s11gu) - s11b := float64(s11bu) - s11a := float64(s11au) - s11r = xFrac1*s01r + xFrac0*s11r - s11g = xFrac1*s01g + xFrac0*s11g - s11b = xFrac1*s01b + xFrac0*s11b - s11a = xFrac1*s01a + xFrac0*s11a - s11r = yFrac1*s10r + yFrac0*s11r - s11g = yFrac1*s10g + yFrac0*s11g - s11b = yFrac1*s10b + yFrac0*s11b - s11a = yFrac1*s10a + yFrac0*s11a - pr := uint32(s11r) - pg := uint32(s11g) - pb := uint32(s11b) - pa := uint32(s11a) - dst.Pix[d+0] = uint8(pr >> 8) - dst.Pix[d+1] = uint8(pg >> 8) - dst.Pix[d+2] = uint8(pb >> 8) - dst.Pix[d+3] = uint8(pa >> 8) - } - } -} - -func (ablInterpolator) scale_RGBA_RGBA_Over(dst *image.RGBA, dr, adr image.Rectangle, src *image.RGBA, sr image.Rectangle, opts *Options) { - sw := int32(sr.Dx()) - sh := int32(sr.Dy()) - yscale := float64(sh) / float64(dr.Dy()) - xscale := float64(sw) / float64(dr.Dx()) - swMinus1, shMinus1 := sw-1, sh-1 - - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - sy := (float64(dy)+0.5)*yscale - 0.5 - // If sy < 0, we will clamp sy0 to 0 anyway, so it doesn't matter if - // we say int32(sy) instead of int32(math.Floor(sy)). Similarly for - // sx, below. - sy0 := int32(sy) - yFrac0 := sy - float64(sy0) - yFrac1 := 1 - yFrac0 - sy1 := sy0 + 1 - if sy < 0 { - sy0, sy1 = 0, 0 - yFrac0, yFrac1 = 0, 1 - } else if sy1 > shMinus1 { - sy0, sy1 = shMinus1, shMinus1 - yFrac0, yFrac1 = 1, 0 - } - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - sx := (float64(dx)+0.5)*xscale - 0.5 - sx0 := int32(sx) - xFrac0 := sx - float64(sx0) - xFrac1 := 1 - xFrac0 - sx1 := sx0 + 1 - if sx < 0 { - sx0, sx1 = 0, 0 - xFrac0, xFrac1 = 0, 1 - } else if sx1 > swMinus1 { - sx0, sx1 = swMinus1, swMinus1 - xFrac0, xFrac1 = 1, 0 - } - - s00i := (sr.Min.Y+int(sy0)-src.Rect.Min.Y)*src.Stride + (sr.Min.X+int(sx0)-src.Rect.Min.X)*4 - s00ru := uint32(src.Pix[s00i+0]) * 0x101 - s00gu := uint32(src.Pix[s00i+1]) * 0x101 - s00bu := uint32(src.Pix[s00i+2]) * 0x101 - s00au := uint32(src.Pix[s00i+3]) * 0x101 - s00r := float64(s00ru) - s00g := float64(s00gu) - s00b := float64(s00bu) - s00a := float64(s00au) - s10i := (sr.Min.Y+int(sy0)-src.Rect.Min.Y)*src.Stride + (sr.Min.X+int(sx1)-src.Rect.Min.X)*4 - s10ru := uint32(src.Pix[s10i+0]) * 0x101 - s10gu := uint32(src.Pix[s10i+1]) * 0x101 - s10bu := uint32(src.Pix[s10i+2]) * 0x101 - s10au := uint32(src.Pix[s10i+3]) * 0x101 - s10r := float64(s10ru) - s10g := float64(s10gu) - s10b := float64(s10bu) - s10a := float64(s10au) - s10r = xFrac1*s00r + xFrac0*s10r - s10g = xFrac1*s00g + xFrac0*s10g - s10b = xFrac1*s00b + xFrac0*s10b - s10a = xFrac1*s00a + xFrac0*s10a - s01i := (sr.Min.Y+int(sy1)-src.Rect.Min.Y)*src.Stride + (sr.Min.X+int(sx0)-src.Rect.Min.X)*4 - s01ru := uint32(src.Pix[s01i+0]) * 0x101 - s01gu := uint32(src.Pix[s01i+1]) * 0x101 - s01bu := uint32(src.Pix[s01i+2]) * 0x101 - s01au := uint32(src.Pix[s01i+3]) * 0x101 - s01r := float64(s01ru) - s01g := float64(s01gu) - s01b := float64(s01bu) - s01a := float64(s01au) - s11i := (sr.Min.Y+int(sy1)-src.Rect.Min.Y)*src.Stride + (sr.Min.X+int(sx1)-src.Rect.Min.X)*4 - s11ru := uint32(src.Pix[s11i+0]) * 0x101 - s11gu := uint32(src.Pix[s11i+1]) * 0x101 - s11bu := uint32(src.Pix[s11i+2]) * 0x101 - s11au := uint32(src.Pix[s11i+3]) * 0x101 - s11r := float64(s11ru) - s11g := float64(s11gu) - s11b := float64(s11bu) - s11a := float64(s11au) - s11r = xFrac1*s01r + xFrac0*s11r - s11g = xFrac1*s01g + xFrac0*s11g - s11b = xFrac1*s01b + xFrac0*s11b - s11a = xFrac1*s01a + xFrac0*s11a - s11r = yFrac1*s10r + yFrac0*s11r - s11g = yFrac1*s10g + yFrac0*s11g - s11b = yFrac1*s10b + yFrac0*s11b - s11a = yFrac1*s10a + yFrac0*s11a - pr := uint32(s11r) - pg := uint32(s11g) - pb := uint32(s11b) - pa := uint32(s11a) - pa1 := (0xffff - pa) * 0x101 - dst.Pix[d+0] = uint8((uint32(dst.Pix[d+0])*pa1/0xffff + pr) >> 8) - dst.Pix[d+1] = uint8((uint32(dst.Pix[d+1])*pa1/0xffff + pg) >> 8) - dst.Pix[d+2] = uint8((uint32(dst.Pix[d+2])*pa1/0xffff + pb) >> 8) - dst.Pix[d+3] = uint8((uint32(dst.Pix[d+3])*pa1/0xffff + pa) >> 8) - } - } -} - -func (ablInterpolator) scale_RGBA_RGBA_Src(dst *image.RGBA, dr, adr image.Rectangle, src *image.RGBA, sr image.Rectangle, opts *Options) { - sw := int32(sr.Dx()) - sh := int32(sr.Dy()) - yscale := float64(sh) / float64(dr.Dy()) - xscale := float64(sw) / float64(dr.Dx()) - swMinus1, shMinus1 := sw-1, sh-1 - - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - sy := (float64(dy)+0.5)*yscale - 0.5 - // If sy < 0, we will clamp sy0 to 0 anyway, so it doesn't matter if - // we say int32(sy) instead of int32(math.Floor(sy)). Similarly for - // sx, below. - sy0 := int32(sy) - yFrac0 := sy - float64(sy0) - yFrac1 := 1 - yFrac0 - sy1 := sy0 + 1 - if sy < 0 { - sy0, sy1 = 0, 0 - yFrac0, yFrac1 = 0, 1 - } else if sy1 > shMinus1 { - sy0, sy1 = shMinus1, shMinus1 - yFrac0, yFrac1 = 1, 0 - } - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - sx := (float64(dx)+0.5)*xscale - 0.5 - sx0 := int32(sx) - xFrac0 := sx - float64(sx0) - xFrac1 := 1 - xFrac0 - sx1 := sx0 + 1 - if sx < 0 { - sx0, sx1 = 0, 0 - xFrac0, xFrac1 = 0, 1 - } else if sx1 > swMinus1 { - sx0, sx1 = swMinus1, swMinus1 - xFrac0, xFrac1 = 1, 0 - } - - s00i := (sr.Min.Y+int(sy0)-src.Rect.Min.Y)*src.Stride + (sr.Min.X+int(sx0)-src.Rect.Min.X)*4 - s00ru := uint32(src.Pix[s00i+0]) * 0x101 - s00gu := uint32(src.Pix[s00i+1]) * 0x101 - s00bu := uint32(src.Pix[s00i+2]) * 0x101 - s00au := uint32(src.Pix[s00i+3]) * 0x101 - s00r := float64(s00ru) - s00g := float64(s00gu) - s00b := float64(s00bu) - s00a := float64(s00au) - s10i := (sr.Min.Y+int(sy0)-src.Rect.Min.Y)*src.Stride + (sr.Min.X+int(sx1)-src.Rect.Min.X)*4 - s10ru := uint32(src.Pix[s10i+0]) * 0x101 - s10gu := uint32(src.Pix[s10i+1]) * 0x101 - s10bu := uint32(src.Pix[s10i+2]) * 0x101 - s10au := uint32(src.Pix[s10i+3]) * 0x101 - s10r := float64(s10ru) - s10g := float64(s10gu) - s10b := float64(s10bu) - s10a := float64(s10au) - s10r = xFrac1*s00r + xFrac0*s10r - s10g = xFrac1*s00g + xFrac0*s10g - s10b = xFrac1*s00b + xFrac0*s10b - s10a = xFrac1*s00a + xFrac0*s10a - s01i := (sr.Min.Y+int(sy1)-src.Rect.Min.Y)*src.Stride + (sr.Min.X+int(sx0)-src.Rect.Min.X)*4 - s01ru := uint32(src.Pix[s01i+0]) * 0x101 - s01gu := uint32(src.Pix[s01i+1]) * 0x101 - s01bu := uint32(src.Pix[s01i+2]) * 0x101 - s01au := uint32(src.Pix[s01i+3]) * 0x101 - s01r := float64(s01ru) - s01g := float64(s01gu) - s01b := float64(s01bu) - s01a := float64(s01au) - s11i := (sr.Min.Y+int(sy1)-src.Rect.Min.Y)*src.Stride + (sr.Min.X+int(sx1)-src.Rect.Min.X)*4 - s11ru := uint32(src.Pix[s11i+0]) * 0x101 - s11gu := uint32(src.Pix[s11i+1]) * 0x101 - s11bu := uint32(src.Pix[s11i+2]) * 0x101 - s11au := uint32(src.Pix[s11i+3]) * 0x101 - s11r := float64(s11ru) - s11g := float64(s11gu) - s11b := float64(s11bu) - s11a := float64(s11au) - s11r = xFrac1*s01r + xFrac0*s11r - s11g = xFrac1*s01g + xFrac0*s11g - s11b = xFrac1*s01b + xFrac0*s11b - s11a = xFrac1*s01a + xFrac0*s11a - s11r = yFrac1*s10r + yFrac0*s11r - s11g = yFrac1*s10g + yFrac0*s11g - s11b = yFrac1*s10b + yFrac0*s11b - s11a = yFrac1*s10a + yFrac0*s11a - pr := uint32(s11r) - pg := uint32(s11g) - pb := uint32(s11b) - pa := uint32(s11a) - dst.Pix[d+0] = uint8(pr >> 8) - dst.Pix[d+1] = uint8(pg >> 8) - dst.Pix[d+2] = uint8(pb >> 8) - dst.Pix[d+3] = uint8(pa >> 8) - } - } -} - -func (ablInterpolator) scale_RGBA_YCbCr444_Src(dst *image.RGBA, dr, adr image.Rectangle, src *image.YCbCr, sr image.Rectangle, opts *Options) { - sw := int32(sr.Dx()) - sh := int32(sr.Dy()) - yscale := float64(sh) / float64(dr.Dy()) - xscale := float64(sw) / float64(dr.Dx()) - swMinus1, shMinus1 := sw-1, sh-1 - - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - sy := (float64(dy)+0.5)*yscale - 0.5 - // If sy < 0, we will clamp sy0 to 0 anyway, so it doesn't matter if - // we say int32(sy) instead of int32(math.Floor(sy)). Similarly for - // sx, below. - sy0 := int32(sy) - yFrac0 := sy - float64(sy0) - yFrac1 := 1 - yFrac0 - sy1 := sy0 + 1 - if sy < 0 { - sy0, sy1 = 0, 0 - yFrac0, yFrac1 = 0, 1 - } else if sy1 > shMinus1 { - sy0, sy1 = shMinus1, shMinus1 - yFrac0, yFrac1 = 1, 0 - } - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - sx := (float64(dx)+0.5)*xscale - 0.5 - sx0 := int32(sx) - xFrac0 := sx - float64(sx0) - xFrac1 := 1 - xFrac0 - sx1 := sx0 + 1 - if sx < 0 { - sx0, sx1 = 0, 0 - xFrac0, xFrac1 = 0, 1 - } else if sx1 > swMinus1 { - sx0, sx1 = swMinus1, swMinus1 - xFrac0, xFrac1 = 1, 0 - } - - s00i := (sr.Min.Y+int(sy0)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(sx0) - src.Rect.Min.X) - s00j := (sr.Min.Y+int(sy0)-src.Rect.Min.Y)*src.CStride + (sr.Min.X + int(sx0) - src.Rect.Min.X) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s00yy1 := int(src.Y[s00i]) * 0x10101 - s00cb1 := int(src.Cb[s00j]) - 128 - s00cr1 := int(src.Cr[s00j]) - 128 - s00ru := (s00yy1 + 91881*s00cr1) >> 8 - s00gu := (s00yy1 - 22554*s00cb1 - 46802*s00cr1) >> 8 - s00bu := (s00yy1 + 116130*s00cb1) >> 8 - if s00ru < 0 { - s00ru = 0 - } else if s00ru > 0xffff { - s00ru = 0xffff - } - if s00gu < 0 { - s00gu = 0 - } else if s00gu > 0xffff { - s00gu = 0xffff - } - if s00bu < 0 { - s00bu = 0 - } else if s00bu > 0xffff { - s00bu = 0xffff - } - - s00r := float64(s00ru) - s00g := float64(s00gu) - s00b := float64(s00bu) - s10i := (sr.Min.Y+int(sy0)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(sx1) - src.Rect.Min.X) - s10j := (sr.Min.Y+int(sy0)-src.Rect.Min.Y)*src.CStride + (sr.Min.X + int(sx1) - src.Rect.Min.X) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s10yy1 := int(src.Y[s10i]) * 0x10101 - s10cb1 := int(src.Cb[s10j]) - 128 - s10cr1 := int(src.Cr[s10j]) - 128 - s10ru := (s10yy1 + 91881*s10cr1) >> 8 - s10gu := (s10yy1 - 22554*s10cb1 - 46802*s10cr1) >> 8 - s10bu := (s10yy1 + 116130*s10cb1) >> 8 - if s10ru < 0 { - s10ru = 0 - } else if s10ru > 0xffff { - s10ru = 0xffff - } - if s10gu < 0 { - s10gu = 0 - } else if s10gu > 0xffff { - s10gu = 0xffff - } - if s10bu < 0 { - s10bu = 0 - } else if s10bu > 0xffff { - s10bu = 0xffff - } - - s10r := float64(s10ru) - s10g := float64(s10gu) - s10b := float64(s10bu) - s10r = xFrac1*s00r + xFrac0*s10r - s10g = xFrac1*s00g + xFrac0*s10g - s10b = xFrac1*s00b + xFrac0*s10b - s01i := (sr.Min.Y+int(sy1)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(sx0) - src.Rect.Min.X) - s01j := (sr.Min.Y+int(sy1)-src.Rect.Min.Y)*src.CStride + (sr.Min.X + int(sx0) - src.Rect.Min.X) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s01yy1 := int(src.Y[s01i]) * 0x10101 - s01cb1 := int(src.Cb[s01j]) - 128 - s01cr1 := int(src.Cr[s01j]) - 128 - s01ru := (s01yy1 + 91881*s01cr1) >> 8 - s01gu := (s01yy1 - 22554*s01cb1 - 46802*s01cr1) >> 8 - s01bu := (s01yy1 + 116130*s01cb1) >> 8 - if s01ru < 0 { - s01ru = 0 - } else if s01ru > 0xffff { - s01ru = 0xffff - } - if s01gu < 0 { - s01gu = 0 - } else if s01gu > 0xffff { - s01gu = 0xffff - } - if s01bu < 0 { - s01bu = 0 - } else if s01bu > 0xffff { - s01bu = 0xffff - } - - s01r := float64(s01ru) - s01g := float64(s01gu) - s01b := float64(s01bu) - s11i := (sr.Min.Y+int(sy1)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(sx1) - src.Rect.Min.X) - s11j := (sr.Min.Y+int(sy1)-src.Rect.Min.Y)*src.CStride + (sr.Min.X + int(sx1) - src.Rect.Min.X) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s11yy1 := int(src.Y[s11i]) * 0x10101 - s11cb1 := int(src.Cb[s11j]) - 128 - s11cr1 := int(src.Cr[s11j]) - 128 - s11ru := (s11yy1 + 91881*s11cr1) >> 8 - s11gu := (s11yy1 - 22554*s11cb1 - 46802*s11cr1) >> 8 - s11bu := (s11yy1 + 116130*s11cb1) >> 8 - if s11ru < 0 { - s11ru = 0 - } else if s11ru > 0xffff { - s11ru = 0xffff - } - if s11gu < 0 { - s11gu = 0 - } else if s11gu > 0xffff { - s11gu = 0xffff - } - if s11bu < 0 { - s11bu = 0 - } else if s11bu > 0xffff { - s11bu = 0xffff - } - - s11r := float64(s11ru) - s11g := float64(s11gu) - s11b := float64(s11bu) - s11r = xFrac1*s01r + xFrac0*s11r - s11g = xFrac1*s01g + xFrac0*s11g - s11b = xFrac1*s01b + xFrac0*s11b - s11r = yFrac1*s10r + yFrac0*s11r - s11g = yFrac1*s10g + yFrac0*s11g - s11b = yFrac1*s10b + yFrac0*s11b - pr := uint32(s11r) - pg := uint32(s11g) - pb := uint32(s11b) - dst.Pix[d+0] = uint8(pr >> 8) - dst.Pix[d+1] = uint8(pg >> 8) - dst.Pix[d+2] = uint8(pb >> 8) - dst.Pix[d+3] = 0xff - } - } -} - -func (ablInterpolator) scale_RGBA_YCbCr422_Src(dst *image.RGBA, dr, adr image.Rectangle, src *image.YCbCr, sr image.Rectangle, opts *Options) { - sw := int32(sr.Dx()) - sh := int32(sr.Dy()) - yscale := float64(sh) / float64(dr.Dy()) - xscale := float64(sw) / float64(dr.Dx()) - swMinus1, shMinus1 := sw-1, sh-1 - - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - sy := (float64(dy)+0.5)*yscale - 0.5 - // If sy < 0, we will clamp sy0 to 0 anyway, so it doesn't matter if - // we say int32(sy) instead of int32(math.Floor(sy)). Similarly for - // sx, below. - sy0 := int32(sy) - yFrac0 := sy - float64(sy0) - yFrac1 := 1 - yFrac0 - sy1 := sy0 + 1 - if sy < 0 { - sy0, sy1 = 0, 0 - yFrac0, yFrac1 = 0, 1 - } else if sy1 > shMinus1 { - sy0, sy1 = shMinus1, shMinus1 - yFrac0, yFrac1 = 1, 0 - } - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - sx := (float64(dx)+0.5)*xscale - 0.5 - sx0 := int32(sx) - xFrac0 := sx - float64(sx0) - xFrac1 := 1 - xFrac0 - sx1 := sx0 + 1 - if sx < 0 { - sx0, sx1 = 0, 0 - xFrac0, xFrac1 = 0, 1 - } else if sx1 > swMinus1 { - sx0, sx1 = swMinus1, swMinus1 - xFrac0, xFrac1 = 1, 0 - } - - s00i := (sr.Min.Y+int(sy0)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(sx0) - src.Rect.Min.X) - s00j := (sr.Min.Y+int(sy0)-src.Rect.Min.Y)*src.CStride + ((sr.Min.X+int(sx0))/2 - src.Rect.Min.X/2) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s00yy1 := int(src.Y[s00i]) * 0x10101 - s00cb1 := int(src.Cb[s00j]) - 128 - s00cr1 := int(src.Cr[s00j]) - 128 - s00ru := (s00yy1 + 91881*s00cr1) >> 8 - s00gu := (s00yy1 - 22554*s00cb1 - 46802*s00cr1) >> 8 - s00bu := (s00yy1 + 116130*s00cb1) >> 8 - if s00ru < 0 { - s00ru = 0 - } else if s00ru > 0xffff { - s00ru = 0xffff - } - if s00gu < 0 { - s00gu = 0 - } else if s00gu > 0xffff { - s00gu = 0xffff - } - if s00bu < 0 { - s00bu = 0 - } else if s00bu > 0xffff { - s00bu = 0xffff - } - - s00r := float64(s00ru) - s00g := float64(s00gu) - s00b := float64(s00bu) - s10i := (sr.Min.Y+int(sy0)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(sx1) - src.Rect.Min.X) - s10j := (sr.Min.Y+int(sy0)-src.Rect.Min.Y)*src.CStride + ((sr.Min.X+int(sx1))/2 - src.Rect.Min.X/2) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s10yy1 := int(src.Y[s10i]) * 0x10101 - s10cb1 := int(src.Cb[s10j]) - 128 - s10cr1 := int(src.Cr[s10j]) - 128 - s10ru := (s10yy1 + 91881*s10cr1) >> 8 - s10gu := (s10yy1 - 22554*s10cb1 - 46802*s10cr1) >> 8 - s10bu := (s10yy1 + 116130*s10cb1) >> 8 - if s10ru < 0 { - s10ru = 0 - } else if s10ru > 0xffff { - s10ru = 0xffff - } - if s10gu < 0 { - s10gu = 0 - } else if s10gu > 0xffff { - s10gu = 0xffff - } - if s10bu < 0 { - s10bu = 0 - } else if s10bu > 0xffff { - s10bu = 0xffff - } - - s10r := float64(s10ru) - s10g := float64(s10gu) - s10b := float64(s10bu) - s10r = xFrac1*s00r + xFrac0*s10r - s10g = xFrac1*s00g + xFrac0*s10g - s10b = xFrac1*s00b + xFrac0*s10b - s01i := (sr.Min.Y+int(sy1)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(sx0) - src.Rect.Min.X) - s01j := (sr.Min.Y+int(sy1)-src.Rect.Min.Y)*src.CStride + ((sr.Min.X+int(sx0))/2 - src.Rect.Min.X/2) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s01yy1 := int(src.Y[s01i]) * 0x10101 - s01cb1 := int(src.Cb[s01j]) - 128 - s01cr1 := int(src.Cr[s01j]) - 128 - s01ru := (s01yy1 + 91881*s01cr1) >> 8 - s01gu := (s01yy1 - 22554*s01cb1 - 46802*s01cr1) >> 8 - s01bu := (s01yy1 + 116130*s01cb1) >> 8 - if s01ru < 0 { - s01ru = 0 - } else if s01ru > 0xffff { - s01ru = 0xffff - } - if s01gu < 0 { - s01gu = 0 - } else if s01gu > 0xffff { - s01gu = 0xffff - } - if s01bu < 0 { - s01bu = 0 - } else if s01bu > 0xffff { - s01bu = 0xffff - } - - s01r := float64(s01ru) - s01g := float64(s01gu) - s01b := float64(s01bu) - s11i := (sr.Min.Y+int(sy1)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(sx1) - src.Rect.Min.X) - s11j := (sr.Min.Y+int(sy1)-src.Rect.Min.Y)*src.CStride + ((sr.Min.X+int(sx1))/2 - src.Rect.Min.X/2) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s11yy1 := int(src.Y[s11i]) * 0x10101 - s11cb1 := int(src.Cb[s11j]) - 128 - s11cr1 := int(src.Cr[s11j]) - 128 - s11ru := (s11yy1 + 91881*s11cr1) >> 8 - s11gu := (s11yy1 - 22554*s11cb1 - 46802*s11cr1) >> 8 - s11bu := (s11yy1 + 116130*s11cb1) >> 8 - if s11ru < 0 { - s11ru = 0 - } else if s11ru > 0xffff { - s11ru = 0xffff - } - if s11gu < 0 { - s11gu = 0 - } else if s11gu > 0xffff { - s11gu = 0xffff - } - if s11bu < 0 { - s11bu = 0 - } else if s11bu > 0xffff { - s11bu = 0xffff - } - - s11r := float64(s11ru) - s11g := float64(s11gu) - s11b := float64(s11bu) - s11r = xFrac1*s01r + xFrac0*s11r - s11g = xFrac1*s01g + xFrac0*s11g - s11b = xFrac1*s01b + xFrac0*s11b - s11r = yFrac1*s10r + yFrac0*s11r - s11g = yFrac1*s10g + yFrac0*s11g - s11b = yFrac1*s10b + yFrac0*s11b - pr := uint32(s11r) - pg := uint32(s11g) - pb := uint32(s11b) - dst.Pix[d+0] = uint8(pr >> 8) - dst.Pix[d+1] = uint8(pg >> 8) - dst.Pix[d+2] = uint8(pb >> 8) - dst.Pix[d+3] = 0xff - } - } -} - -func (ablInterpolator) scale_RGBA_YCbCr420_Src(dst *image.RGBA, dr, adr image.Rectangle, src *image.YCbCr, sr image.Rectangle, opts *Options) { - sw := int32(sr.Dx()) - sh := int32(sr.Dy()) - yscale := float64(sh) / float64(dr.Dy()) - xscale := float64(sw) / float64(dr.Dx()) - swMinus1, shMinus1 := sw-1, sh-1 - - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - sy := (float64(dy)+0.5)*yscale - 0.5 - // If sy < 0, we will clamp sy0 to 0 anyway, so it doesn't matter if - // we say int32(sy) instead of int32(math.Floor(sy)). Similarly for - // sx, below. - sy0 := int32(sy) - yFrac0 := sy - float64(sy0) - yFrac1 := 1 - yFrac0 - sy1 := sy0 + 1 - if sy < 0 { - sy0, sy1 = 0, 0 - yFrac0, yFrac1 = 0, 1 - } else if sy1 > shMinus1 { - sy0, sy1 = shMinus1, shMinus1 - yFrac0, yFrac1 = 1, 0 - } - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - sx := (float64(dx)+0.5)*xscale - 0.5 - sx0 := int32(sx) - xFrac0 := sx - float64(sx0) - xFrac1 := 1 - xFrac0 - sx1 := sx0 + 1 - if sx < 0 { - sx0, sx1 = 0, 0 - xFrac0, xFrac1 = 0, 1 - } else if sx1 > swMinus1 { - sx0, sx1 = swMinus1, swMinus1 - xFrac0, xFrac1 = 1, 0 - } - - s00i := (sr.Min.Y+int(sy0)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(sx0) - src.Rect.Min.X) - s00j := ((sr.Min.Y+int(sy0))/2-src.Rect.Min.Y/2)*src.CStride + ((sr.Min.X+int(sx0))/2 - src.Rect.Min.X/2) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s00yy1 := int(src.Y[s00i]) * 0x10101 - s00cb1 := int(src.Cb[s00j]) - 128 - s00cr1 := int(src.Cr[s00j]) - 128 - s00ru := (s00yy1 + 91881*s00cr1) >> 8 - s00gu := (s00yy1 - 22554*s00cb1 - 46802*s00cr1) >> 8 - s00bu := (s00yy1 + 116130*s00cb1) >> 8 - if s00ru < 0 { - s00ru = 0 - } else if s00ru > 0xffff { - s00ru = 0xffff - } - if s00gu < 0 { - s00gu = 0 - } else if s00gu > 0xffff { - s00gu = 0xffff - } - if s00bu < 0 { - s00bu = 0 - } else if s00bu > 0xffff { - s00bu = 0xffff - } - - s00r := float64(s00ru) - s00g := float64(s00gu) - s00b := float64(s00bu) - s10i := (sr.Min.Y+int(sy0)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(sx1) - src.Rect.Min.X) - s10j := ((sr.Min.Y+int(sy0))/2-src.Rect.Min.Y/2)*src.CStride + ((sr.Min.X+int(sx1))/2 - src.Rect.Min.X/2) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s10yy1 := int(src.Y[s10i]) * 0x10101 - s10cb1 := int(src.Cb[s10j]) - 128 - s10cr1 := int(src.Cr[s10j]) - 128 - s10ru := (s10yy1 + 91881*s10cr1) >> 8 - s10gu := (s10yy1 - 22554*s10cb1 - 46802*s10cr1) >> 8 - s10bu := (s10yy1 + 116130*s10cb1) >> 8 - if s10ru < 0 { - s10ru = 0 - } else if s10ru > 0xffff { - s10ru = 0xffff - } - if s10gu < 0 { - s10gu = 0 - } else if s10gu > 0xffff { - s10gu = 0xffff - } - if s10bu < 0 { - s10bu = 0 - } else if s10bu > 0xffff { - s10bu = 0xffff - } - - s10r := float64(s10ru) - s10g := float64(s10gu) - s10b := float64(s10bu) - s10r = xFrac1*s00r + xFrac0*s10r - s10g = xFrac1*s00g + xFrac0*s10g - s10b = xFrac1*s00b + xFrac0*s10b - s01i := (sr.Min.Y+int(sy1)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(sx0) - src.Rect.Min.X) - s01j := ((sr.Min.Y+int(sy1))/2-src.Rect.Min.Y/2)*src.CStride + ((sr.Min.X+int(sx0))/2 - src.Rect.Min.X/2) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s01yy1 := int(src.Y[s01i]) * 0x10101 - s01cb1 := int(src.Cb[s01j]) - 128 - s01cr1 := int(src.Cr[s01j]) - 128 - s01ru := (s01yy1 + 91881*s01cr1) >> 8 - s01gu := (s01yy1 - 22554*s01cb1 - 46802*s01cr1) >> 8 - s01bu := (s01yy1 + 116130*s01cb1) >> 8 - if s01ru < 0 { - s01ru = 0 - } else if s01ru > 0xffff { - s01ru = 0xffff - } - if s01gu < 0 { - s01gu = 0 - } else if s01gu > 0xffff { - s01gu = 0xffff - } - if s01bu < 0 { - s01bu = 0 - } else if s01bu > 0xffff { - s01bu = 0xffff - } - - s01r := float64(s01ru) - s01g := float64(s01gu) - s01b := float64(s01bu) - s11i := (sr.Min.Y+int(sy1)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(sx1) - src.Rect.Min.X) - s11j := ((sr.Min.Y+int(sy1))/2-src.Rect.Min.Y/2)*src.CStride + ((sr.Min.X+int(sx1))/2 - src.Rect.Min.X/2) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s11yy1 := int(src.Y[s11i]) * 0x10101 - s11cb1 := int(src.Cb[s11j]) - 128 - s11cr1 := int(src.Cr[s11j]) - 128 - s11ru := (s11yy1 + 91881*s11cr1) >> 8 - s11gu := (s11yy1 - 22554*s11cb1 - 46802*s11cr1) >> 8 - s11bu := (s11yy1 + 116130*s11cb1) >> 8 - if s11ru < 0 { - s11ru = 0 - } else if s11ru > 0xffff { - s11ru = 0xffff - } - if s11gu < 0 { - s11gu = 0 - } else if s11gu > 0xffff { - s11gu = 0xffff - } - if s11bu < 0 { - s11bu = 0 - } else if s11bu > 0xffff { - s11bu = 0xffff - } - - s11r := float64(s11ru) - s11g := float64(s11gu) - s11b := float64(s11bu) - s11r = xFrac1*s01r + xFrac0*s11r - s11g = xFrac1*s01g + xFrac0*s11g - s11b = xFrac1*s01b + xFrac0*s11b - s11r = yFrac1*s10r + yFrac0*s11r - s11g = yFrac1*s10g + yFrac0*s11g - s11b = yFrac1*s10b + yFrac0*s11b - pr := uint32(s11r) - pg := uint32(s11g) - pb := uint32(s11b) - dst.Pix[d+0] = uint8(pr >> 8) - dst.Pix[d+1] = uint8(pg >> 8) - dst.Pix[d+2] = uint8(pb >> 8) - dst.Pix[d+3] = 0xff - } - } -} - -func (ablInterpolator) scale_RGBA_YCbCr440_Src(dst *image.RGBA, dr, adr image.Rectangle, src *image.YCbCr, sr image.Rectangle, opts *Options) { - sw := int32(sr.Dx()) - sh := int32(sr.Dy()) - yscale := float64(sh) / float64(dr.Dy()) - xscale := float64(sw) / float64(dr.Dx()) - swMinus1, shMinus1 := sw-1, sh-1 - - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - sy := (float64(dy)+0.5)*yscale - 0.5 - // If sy < 0, we will clamp sy0 to 0 anyway, so it doesn't matter if - // we say int32(sy) instead of int32(math.Floor(sy)). Similarly for - // sx, below. - sy0 := int32(sy) - yFrac0 := sy - float64(sy0) - yFrac1 := 1 - yFrac0 - sy1 := sy0 + 1 - if sy < 0 { - sy0, sy1 = 0, 0 - yFrac0, yFrac1 = 0, 1 - } else if sy1 > shMinus1 { - sy0, sy1 = shMinus1, shMinus1 - yFrac0, yFrac1 = 1, 0 - } - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - sx := (float64(dx)+0.5)*xscale - 0.5 - sx0 := int32(sx) - xFrac0 := sx - float64(sx0) - xFrac1 := 1 - xFrac0 - sx1 := sx0 + 1 - if sx < 0 { - sx0, sx1 = 0, 0 - xFrac0, xFrac1 = 0, 1 - } else if sx1 > swMinus1 { - sx0, sx1 = swMinus1, swMinus1 - xFrac0, xFrac1 = 1, 0 - } - - s00i := (sr.Min.Y+int(sy0)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(sx0) - src.Rect.Min.X) - s00j := ((sr.Min.Y+int(sy0))/2-src.Rect.Min.Y/2)*src.CStride + (sr.Min.X + int(sx0) - src.Rect.Min.X) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s00yy1 := int(src.Y[s00i]) * 0x10101 - s00cb1 := int(src.Cb[s00j]) - 128 - s00cr1 := int(src.Cr[s00j]) - 128 - s00ru := (s00yy1 + 91881*s00cr1) >> 8 - s00gu := (s00yy1 - 22554*s00cb1 - 46802*s00cr1) >> 8 - s00bu := (s00yy1 + 116130*s00cb1) >> 8 - if s00ru < 0 { - s00ru = 0 - } else if s00ru > 0xffff { - s00ru = 0xffff - } - if s00gu < 0 { - s00gu = 0 - } else if s00gu > 0xffff { - s00gu = 0xffff - } - if s00bu < 0 { - s00bu = 0 - } else if s00bu > 0xffff { - s00bu = 0xffff - } - - s00r := float64(s00ru) - s00g := float64(s00gu) - s00b := float64(s00bu) - s10i := (sr.Min.Y+int(sy0)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(sx1) - src.Rect.Min.X) - s10j := ((sr.Min.Y+int(sy0))/2-src.Rect.Min.Y/2)*src.CStride + (sr.Min.X + int(sx1) - src.Rect.Min.X) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s10yy1 := int(src.Y[s10i]) * 0x10101 - s10cb1 := int(src.Cb[s10j]) - 128 - s10cr1 := int(src.Cr[s10j]) - 128 - s10ru := (s10yy1 + 91881*s10cr1) >> 8 - s10gu := (s10yy1 - 22554*s10cb1 - 46802*s10cr1) >> 8 - s10bu := (s10yy1 + 116130*s10cb1) >> 8 - if s10ru < 0 { - s10ru = 0 - } else if s10ru > 0xffff { - s10ru = 0xffff - } - if s10gu < 0 { - s10gu = 0 - } else if s10gu > 0xffff { - s10gu = 0xffff - } - if s10bu < 0 { - s10bu = 0 - } else if s10bu > 0xffff { - s10bu = 0xffff - } - - s10r := float64(s10ru) - s10g := float64(s10gu) - s10b := float64(s10bu) - s10r = xFrac1*s00r + xFrac0*s10r - s10g = xFrac1*s00g + xFrac0*s10g - s10b = xFrac1*s00b + xFrac0*s10b - s01i := (sr.Min.Y+int(sy1)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(sx0) - src.Rect.Min.X) - s01j := ((sr.Min.Y+int(sy1))/2-src.Rect.Min.Y/2)*src.CStride + (sr.Min.X + int(sx0) - src.Rect.Min.X) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s01yy1 := int(src.Y[s01i]) * 0x10101 - s01cb1 := int(src.Cb[s01j]) - 128 - s01cr1 := int(src.Cr[s01j]) - 128 - s01ru := (s01yy1 + 91881*s01cr1) >> 8 - s01gu := (s01yy1 - 22554*s01cb1 - 46802*s01cr1) >> 8 - s01bu := (s01yy1 + 116130*s01cb1) >> 8 - if s01ru < 0 { - s01ru = 0 - } else if s01ru > 0xffff { - s01ru = 0xffff - } - if s01gu < 0 { - s01gu = 0 - } else if s01gu > 0xffff { - s01gu = 0xffff - } - if s01bu < 0 { - s01bu = 0 - } else if s01bu > 0xffff { - s01bu = 0xffff - } - - s01r := float64(s01ru) - s01g := float64(s01gu) - s01b := float64(s01bu) - s11i := (sr.Min.Y+int(sy1)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(sx1) - src.Rect.Min.X) - s11j := ((sr.Min.Y+int(sy1))/2-src.Rect.Min.Y/2)*src.CStride + (sr.Min.X + int(sx1) - src.Rect.Min.X) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s11yy1 := int(src.Y[s11i]) * 0x10101 - s11cb1 := int(src.Cb[s11j]) - 128 - s11cr1 := int(src.Cr[s11j]) - 128 - s11ru := (s11yy1 + 91881*s11cr1) >> 8 - s11gu := (s11yy1 - 22554*s11cb1 - 46802*s11cr1) >> 8 - s11bu := (s11yy1 + 116130*s11cb1) >> 8 - if s11ru < 0 { - s11ru = 0 - } else if s11ru > 0xffff { - s11ru = 0xffff - } - if s11gu < 0 { - s11gu = 0 - } else if s11gu > 0xffff { - s11gu = 0xffff - } - if s11bu < 0 { - s11bu = 0 - } else if s11bu > 0xffff { - s11bu = 0xffff - } - - s11r := float64(s11ru) - s11g := float64(s11gu) - s11b := float64(s11bu) - s11r = xFrac1*s01r + xFrac0*s11r - s11g = xFrac1*s01g + xFrac0*s11g - s11b = xFrac1*s01b + xFrac0*s11b - s11r = yFrac1*s10r + yFrac0*s11r - s11g = yFrac1*s10g + yFrac0*s11g - s11b = yFrac1*s10b + yFrac0*s11b - pr := uint32(s11r) - pg := uint32(s11g) - pb := uint32(s11b) - dst.Pix[d+0] = uint8(pr >> 8) - dst.Pix[d+1] = uint8(pg >> 8) - dst.Pix[d+2] = uint8(pb >> 8) - dst.Pix[d+3] = 0xff - } - } -} - -func (ablInterpolator) scale_RGBA_Image_Over(dst *image.RGBA, dr, adr image.Rectangle, src image.Image, sr image.Rectangle, opts *Options) { - sw := int32(sr.Dx()) - sh := int32(sr.Dy()) - yscale := float64(sh) / float64(dr.Dy()) - xscale := float64(sw) / float64(dr.Dx()) - swMinus1, shMinus1 := sw-1, sh-1 - - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - sy := (float64(dy)+0.5)*yscale - 0.5 - // If sy < 0, we will clamp sy0 to 0 anyway, so it doesn't matter if - // we say int32(sy) instead of int32(math.Floor(sy)). Similarly for - // sx, below. - sy0 := int32(sy) - yFrac0 := sy - float64(sy0) - yFrac1 := 1 - yFrac0 - sy1 := sy0 + 1 - if sy < 0 { - sy0, sy1 = 0, 0 - yFrac0, yFrac1 = 0, 1 - } else if sy1 > shMinus1 { - sy0, sy1 = shMinus1, shMinus1 - yFrac0, yFrac1 = 1, 0 - } - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - sx := (float64(dx)+0.5)*xscale - 0.5 - sx0 := int32(sx) - xFrac0 := sx - float64(sx0) - xFrac1 := 1 - xFrac0 - sx1 := sx0 + 1 - if sx < 0 { - sx0, sx1 = 0, 0 - xFrac0, xFrac1 = 0, 1 - } else if sx1 > swMinus1 { - sx0, sx1 = swMinus1, swMinus1 - xFrac0, xFrac1 = 1, 0 - } - - s00ru, s00gu, s00bu, s00au := src.At(sr.Min.X+int(sx0), sr.Min.Y+int(sy0)).RGBA() - s00r := float64(s00ru) - s00g := float64(s00gu) - s00b := float64(s00bu) - s00a := float64(s00au) - s10ru, s10gu, s10bu, s10au := src.At(sr.Min.X+int(sx1), sr.Min.Y+int(sy0)).RGBA() - s10r := float64(s10ru) - s10g := float64(s10gu) - s10b := float64(s10bu) - s10a := float64(s10au) - s10r = xFrac1*s00r + xFrac0*s10r - s10g = xFrac1*s00g + xFrac0*s10g - s10b = xFrac1*s00b + xFrac0*s10b - s10a = xFrac1*s00a + xFrac0*s10a - s01ru, s01gu, s01bu, s01au := src.At(sr.Min.X+int(sx0), sr.Min.Y+int(sy1)).RGBA() - s01r := float64(s01ru) - s01g := float64(s01gu) - s01b := float64(s01bu) - s01a := float64(s01au) - s11ru, s11gu, s11bu, s11au := src.At(sr.Min.X+int(sx1), sr.Min.Y+int(sy1)).RGBA() - s11r := float64(s11ru) - s11g := float64(s11gu) - s11b := float64(s11bu) - s11a := float64(s11au) - s11r = xFrac1*s01r + xFrac0*s11r - s11g = xFrac1*s01g + xFrac0*s11g - s11b = xFrac1*s01b + xFrac0*s11b - s11a = xFrac1*s01a + xFrac0*s11a - s11r = yFrac1*s10r + yFrac0*s11r - s11g = yFrac1*s10g + yFrac0*s11g - s11b = yFrac1*s10b + yFrac0*s11b - s11a = yFrac1*s10a + yFrac0*s11a - pr := uint32(s11r) - pg := uint32(s11g) - pb := uint32(s11b) - pa := uint32(s11a) - pa1 := (0xffff - pa) * 0x101 - dst.Pix[d+0] = uint8((uint32(dst.Pix[d+0])*pa1/0xffff + pr) >> 8) - dst.Pix[d+1] = uint8((uint32(dst.Pix[d+1])*pa1/0xffff + pg) >> 8) - dst.Pix[d+2] = uint8((uint32(dst.Pix[d+2])*pa1/0xffff + pb) >> 8) - dst.Pix[d+3] = uint8((uint32(dst.Pix[d+3])*pa1/0xffff + pa) >> 8) - } - } -} - -func (ablInterpolator) scale_RGBA_Image_Src(dst *image.RGBA, dr, adr image.Rectangle, src image.Image, sr image.Rectangle, opts *Options) { - sw := int32(sr.Dx()) - sh := int32(sr.Dy()) - yscale := float64(sh) / float64(dr.Dy()) - xscale := float64(sw) / float64(dr.Dx()) - swMinus1, shMinus1 := sw-1, sh-1 - - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - sy := (float64(dy)+0.5)*yscale - 0.5 - // If sy < 0, we will clamp sy0 to 0 anyway, so it doesn't matter if - // we say int32(sy) instead of int32(math.Floor(sy)). Similarly for - // sx, below. - sy0 := int32(sy) - yFrac0 := sy - float64(sy0) - yFrac1 := 1 - yFrac0 - sy1 := sy0 + 1 - if sy < 0 { - sy0, sy1 = 0, 0 - yFrac0, yFrac1 = 0, 1 - } else if sy1 > shMinus1 { - sy0, sy1 = shMinus1, shMinus1 - yFrac0, yFrac1 = 1, 0 - } - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - sx := (float64(dx)+0.5)*xscale - 0.5 - sx0 := int32(sx) - xFrac0 := sx - float64(sx0) - xFrac1 := 1 - xFrac0 - sx1 := sx0 + 1 - if sx < 0 { - sx0, sx1 = 0, 0 - xFrac0, xFrac1 = 0, 1 - } else if sx1 > swMinus1 { - sx0, sx1 = swMinus1, swMinus1 - xFrac0, xFrac1 = 1, 0 - } - - s00ru, s00gu, s00bu, s00au := src.At(sr.Min.X+int(sx0), sr.Min.Y+int(sy0)).RGBA() - s00r := float64(s00ru) - s00g := float64(s00gu) - s00b := float64(s00bu) - s00a := float64(s00au) - s10ru, s10gu, s10bu, s10au := src.At(sr.Min.X+int(sx1), sr.Min.Y+int(sy0)).RGBA() - s10r := float64(s10ru) - s10g := float64(s10gu) - s10b := float64(s10bu) - s10a := float64(s10au) - s10r = xFrac1*s00r + xFrac0*s10r - s10g = xFrac1*s00g + xFrac0*s10g - s10b = xFrac1*s00b + xFrac0*s10b - s10a = xFrac1*s00a + xFrac0*s10a - s01ru, s01gu, s01bu, s01au := src.At(sr.Min.X+int(sx0), sr.Min.Y+int(sy1)).RGBA() - s01r := float64(s01ru) - s01g := float64(s01gu) - s01b := float64(s01bu) - s01a := float64(s01au) - s11ru, s11gu, s11bu, s11au := src.At(sr.Min.X+int(sx1), sr.Min.Y+int(sy1)).RGBA() - s11r := float64(s11ru) - s11g := float64(s11gu) - s11b := float64(s11bu) - s11a := float64(s11au) - s11r = xFrac1*s01r + xFrac0*s11r - s11g = xFrac1*s01g + xFrac0*s11g - s11b = xFrac1*s01b + xFrac0*s11b - s11a = xFrac1*s01a + xFrac0*s11a - s11r = yFrac1*s10r + yFrac0*s11r - s11g = yFrac1*s10g + yFrac0*s11g - s11b = yFrac1*s10b + yFrac0*s11b - s11a = yFrac1*s10a + yFrac0*s11a - pr := uint32(s11r) - pg := uint32(s11g) - pb := uint32(s11b) - pa := uint32(s11a) - dst.Pix[d+0] = uint8(pr >> 8) - dst.Pix[d+1] = uint8(pg >> 8) - dst.Pix[d+2] = uint8(pb >> 8) - dst.Pix[d+3] = uint8(pa >> 8) - } - } -} - -func (ablInterpolator) scale_Image_Image_Over(dst Image, dr, adr image.Rectangle, src image.Image, sr image.Rectangle, opts *Options) { - sw := int32(sr.Dx()) - sh := int32(sr.Dy()) - yscale := float64(sh) / float64(dr.Dy()) - xscale := float64(sw) / float64(dr.Dx()) - swMinus1, shMinus1 := sw-1, sh-1 - srcMask, smp := opts.SrcMask, opts.SrcMaskP - dstMask, dmp := opts.DstMask, opts.DstMaskP - dstColorRGBA64 := &color.RGBA64{} - dstColor := color.Color(dstColorRGBA64) - - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - sy := (float64(dy)+0.5)*yscale - 0.5 - // If sy < 0, we will clamp sy0 to 0 anyway, so it doesn't matter if - // we say int32(sy) instead of int32(math.Floor(sy)). Similarly for - // sx, below. - sy0 := int32(sy) - yFrac0 := sy - float64(sy0) - yFrac1 := 1 - yFrac0 - sy1 := sy0 + 1 - if sy < 0 { - sy0, sy1 = 0, 0 - yFrac0, yFrac1 = 0, 1 - } else if sy1 > shMinus1 { - sy0, sy1 = shMinus1, shMinus1 - yFrac0, yFrac1 = 1, 0 - } - - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx++ { - sx := (float64(dx)+0.5)*xscale - 0.5 - sx0 := int32(sx) - xFrac0 := sx - float64(sx0) - xFrac1 := 1 - xFrac0 - sx1 := sx0 + 1 - if sx < 0 { - sx0, sx1 = 0, 0 - xFrac0, xFrac1 = 0, 1 - } else if sx1 > swMinus1 { - sx0, sx1 = swMinus1, swMinus1 - xFrac0, xFrac1 = 1, 0 - } - - s00ru, s00gu, s00bu, s00au := src.At(sr.Min.X+int(sx0), sr.Min.Y+int(sy0)).RGBA() - if srcMask != nil { - _, _, _, ma := srcMask.At(smp.X+sr.Min.X+int(sx0), smp.Y+sr.Min.Y+int(sy0)).RGBA() - s00ru = s00ru * ma / 0xffff - s00gu = s00gu * ma / 0xffff - s00bu = s00bu * ma / 0xffff - s00au = s00au * ma / 0xffff - } - s00r := float64(s00ru) - s00g := float64(s00gu) - s00b := float64(s00bu) - s00a := float64(s00au) - s10ru, s10gu, s10bu, s10au := src.At(sr.Min.X+int(sx1), sr.Min.Y+int(sy0)).RGBA() - if srcMask != nil { - _, _, _, ma := srcMask.At(smp.X+sr.Min.X+int(sx1), smp.Y+sr.Min.Y+int(sy0)).RGBA() - s10ru = s10ru * ma / 0xffff - s10gu = s10gu * ma / 0xffff - s10bu = s10bu * ma / 0xffff - s10au = s10au * ma / 0xffff - } - s10r := float64(s10ru) - s10g := float64(s10gu) - s10b := float64(s10bu) - s10a := float64(s10au) - s10r = xFrac1*s00r + xFrac0*s10r - s10g = xFrac1*s00g + xFrac0*s10g - s10b = xFrac1*s00b + xFrac0*s10b - s10a = xFrac1*s00a + xFrac0*s10a - s01ru, s01gu, s01bu, s01au := src.At(sr.Min.X+int(sx0), sr.Min.Y+int(sy1)).RGBA() - if srcMask != nil { - _, _, _, ma := srcMask.At(smp.X+sr.Min.X+int(sx0), smp.Y+sr.Min.Y+int(sy1)).RGBA() - s01ru = s01ru * ma / 0xffff - s01gu = s01gu * ma / 0xffff - s01bu = s01bu * ma / 0xffff - s01au = s01au * ma / 0xffff - } - s01r := float64(s01ru) - s01g := float64(s01gu) - s01b := float64(s01bu) - s01a := float64(s01au) - s11ru, s11gu, s11bu, s11au := src.At(sr.Min.X+int(sx1), sr.Min.Y+int(sy1)).RGBA() - if srcMask != nil { - _, _, _, ma := srcMask.At(smp.X+sr.Min.X+int(sx1), smp.Y+sr.Min.Y+int(sy1)).RGBA() - s11ru = s11ru * ma / 0xffff - s11gu = s11gu * ma / 0xffff - s11bu = s11bu * ma / 0xffff - s11au = s11au * ma / 0xffff - } - s11r := float64(s11ru) - s11g := float64(s11gu) - s11b := float64(s11bu) - s11a := float64(s11au) - s11r = xFrac1*s01r + xFrac0*s11r - s11g = xFrac1*s01g + xFrac0*s11g - s11b = xFrac1*s01b + xFrac0*s11b - s11a = xFrac1*s01a + xFrac0*s11a - s11r = yFrac1*s10r + yFrac0*s11r - s11g = yFrac1*s10g + yFrac0*s11g - s11b = yFrac1*s10b + yFrac0*s11b - s11a = yFrac1*s10a + yFrac0*s11a - pr := uint32(s11r) - pg := uint32(s11g) - pb := uint32(s11b) - pa := uint32(s11a) - qr, qg, qb, qa := dst.At(dr.Min.X+int(dx), dr.Min.Y+int(dy)).RGBA() - if dstMask != nil { - _, _, _, ma := dstMask.At(dmp.X+dr.Min.X+int(dx), dmp.Y+dr.Min.Y+int(dy)).RGBA() - pr = pr * ma / 0xffff - pg = pg * ma / 0xffff - pb = pb * ma / 0xffff - pa = pa * ma / 0xffff - } - pa1 := 0xffff - pa - dstColorRGBA64.R = uint16(qr*pa1/0xffff + pr) - dstColorRGBA64.G = uint16(qg*pa1/0xffff + pg) - dstColorRGBA64.B = uint16(qb*pa1/0xffff + pb) - dstColorRGBA64.A = uint16(qa*pa1/0xffff + pa) - dst.Set(dr.Min.X+int(dx), dr.Min.Y+int(dy), dstColor) - } - } -} - -func (ablInterpolator) scale_Image_Image_Src(dst Image, dr, adr image.Rectangle, src image.Image, sr image.Rectangle, opts *Options) { - sw := int32(sr.Dx()) - sh := int32(sr.Dy()) - yscale := float64(sh) / float64(dr.Dy()) - xscale := float64(sw) / float64(dr.Dx()) - swMinus1, shMinus1 := sw-1, sh-1 - srcMask, smp := opts.SrcMask, opts.SrcMaskP - dstMask, dmp := opts.DstMask, opts.DstMaskP - dstColorRGBA64 := &color.RGBA64{} - dstColor := color.Color(dstColorRGBA64) - - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - sy := (float64(dy)+0.5)*yscale - 0.5 - // If sy < 0, we will clamp sy0 to 0 anyway, so it doesn't matter if - // we say int32(sy) instead of int32(math.Floor(sy)). Similarly for - // sx, below. - sy0 := int32(sy) - yFrac0 := sy - float64(sy0) - yFrac1 := 1 - yFrac0 - sy1 := sy0 + 1 - if sy < 0 { - sy0, sy1 = 0, 0 - yFrac0, yFrac1 = 0, 1 - } else if sy1 > shMinus1 { - sy0, sy1 = shMinus1, shMinus1 - yFrac0, yFrac1 = 1, 0 - } - - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx++ { - sx := (float64(dx)+0.5)*xscale - 0.5 - sx0 := int32(sx) - xFrac0 := sx - float64(sx0) - xFrac1 := 1 - xFrac0 - sx1 := sx0 + 1 - if sx < 0 { - sx0, sx1 = 0, 0 - xFrac0, xFrac1 = 0, 1 - } else if sx1 > swMinus1 { - sx0, sx1 = swMinus1, swMinus1 - xFrac0, xFrac1 = 1, 0 - } - - s00ru, s00gu, s00bu, s00au := src.At(sr.Min.X+int(sx0), sr.Min.Y+int(sy0)).RGBA() - if srcMask != nil { - _, _, _, ma := srcMask.At(smp.X+sr.Min.X+int(sx0), smp.Y+sr.Min.Y+int(sy0)).RGBA() - s00ru = s00ru * ma / 0xffff - s00gu = s00gu * ma / 0xffff - s00bu = s00bu * ma / 0xffff - s00au = s00au * ma / 0xffff - } - s00r := float64(s00ru) - s00g := float64(s00gu) - s00b := float64(s00bu) - s00a := float64(s00au) - s10ru, s10gu, s10bu, s10au := src.At(sr.Min.X+int(sx1), sr.Min.Y+int(sy0)).RGBA() - if srcMask != nil { - _, _, _, ma := srcMask.At(smp.X+sr.Min.X+int(sx1), smp.Y+sr.Min.Y+int(sy0)).RGBA() - s10ru = s10ru * ma / 0xffff - s10gu = s10gu * ma / 0xffff - s10bu = s10bu * ma / 0xffff - s10au = s10au * ma / 0xffff - } - s10r := float64(s10ru) - s10g := float64(s10gu) - s10b := float64(s10bu) - s10a := float64(s10au) - s10r = xFrac1*s00r + xFrac0*s10r - s10g = xFrac1*s00g + xFrac0*s10g - s10b = xFrac1*s00b + xFrac0*s10b - s10a = xFrac1*s00a + xFrac0*s10a - s01ru, s01gu, s01bu, s01au := src.At(sr.Min.X+int(sx0), sr.Min.Y+int(sy1)).RGBA() - if srcMask != nil { - _, _, _, ma := srcMask.At(smp.X+sr.Min.X+int(sx0), smp.Y+sr.Min.Y+int(sy1)).RGBA() - s01ru = s01ru * ma / 0xffff - s01gu = s01gu * ma / 0xffff - s01bu = s01bu * ma / 0xffff - s01au = s01au * ma / 0xffff - } - s01r := float64(s01ru) - s01g := float64(s01gu) - s01b := float64(s01bu) - s01a := float64(s01au) - s11ru, s11gu, s11bu, s11au := src.At(sr.Min.X+int(sx1), sr.Min.Y+int(sy1)).RGBA() - if srcMask != nil { - _, _, _, ma := srcMask.At(smp.X+sr.Min.X+int(sx1), smp.Y+sr.Min.Y+int(sy1)).RGBA() - s11ru = s11ru * ma / 0xffff - s11gu = s11gu * ma / 0xffff - s11bu = s11bu * ma / 0xffff - s11au = s11au * ma / 0xffff - } - s11r := float64(s11ru) - s11g := float64(s11gu) - s11b := float64(s11bu) - s11a := float64(s11au) - s11r = xFrac1*s01r + xFrac0*s11r - s11g = xFrac1*s01g + xFrac0*s11g - s11b = xFrac1*s01b + xFrac0*s11b - s11a = xFrac1*s01a + xFrac0*s11a - s11r = yFrac1*s10r + yFrac0*s11r - s11g = yFrac1*s10g + yFrac0*s11g - s11b = yFrac1*s10b + yFrac0*s11b - s11a = yFrac1*s10a + yFrac0*s11a - pr := uint32(s11r) - pg := uint32(s11g) - pb := uint32(s11b) - pa := uint32(s11a) - if dstMask != nil { - qr, qg, qb, qa := dst.At(dr.Min.X+int(dx), dr.Min.Y+int(dy)).RGBA() - _, _, _, ma := dstMask.At(dmp.X+dr.Min.X+int(dx), dmp.Y+dr.Min.Y+int(dy)).RGBA() - pr = pr * ma / 0xffff - pg = pg * ma / 0xffff - pb = pb * ma / 0xffff - pa = pa * ma / 0xffff - pa1 := 0xffff - ma - dstColorRGBA64.R = uint16(qr*pa1/0xffff + pr) - dstColorRGBA64.G = uint16(qg*pa1/0xffff + pg) - dstColorRGBA64.B = uint16(qb*pa1/0xffff + pb) - dstColorRGBA64.A = uint16(qa*pa1/0xffff + pa) - dst.Set(dr.Min.X+int(dx), dr.Min.Y+int(dy), dstColor) - } else { - dstColorRGBA64.R = uint16(pr) - dstColorRGBA64.G = uint16(pg) - dstColorRGBA64.B = uint16(pb) - dstColorRGBA64.A = uint16(pa) - dst.Set(dr.Min.X+int(dx), dr.Min.Y+int(dy), dstColor) - } - } - } -} - -func (ablInterpolator) transform_RGBA_Gray_Src(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src *image.Gray, sr image.Rectangle, bias image.Point, opts *Options) { - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx := d2s[0]*dxf + d2s[1]*dyf + d2s[2] - sy := d2s[3]*dxf + d2s[4]*dyf + d2s[5] - if !(image.Point{int(sx) + bias.X, int(sy) + bias.Y}).In(sr) { - continue - } - - sx -= 0.5 - sx0 := int(sx) - xFrac0 := sx - float64(sx0) - xFrac1 := 1 - xFrac0 - sx0 += bias.X - sx1 := sx0 + 1 - if sx0 < sr.Min.X { - sx0, sx1 = sr.Min.X, sr.Min.X - xFrac0, xFrac1 = 0, 1 - } else if sx1 >= sr.Max.X { - sx0, sx1 = sr.Max.X-1, sr.Max.X-1 - xFrac0, xFrac1 = 1, 0 - } - - sy -= 0.5 - sy0 := int(sy) - yFrac0 := sy - float64(sy0) - yFrac1 := 1 - yFrac0 - sy0 += bias.Y - sy1 := sy0 + 1 - if sy0 < sr.Min.Y { - sy0, sy1 = sr.Min.Y, sr.Min.Y - yFrac0, yFrac1 = 0, 1 - } else if sy1 >= sr.Max.Y { - sy0, sy1 = sr.Max.Y-1, sr.Max.Y-1 - yFrac0, yFrac1 = 1, 0 - } - - s00i := (sy0-src.Rect.Min.Y)*src.Stride + (sx0 - src.Rect.Min.X) - s00ru := uint32(src.Pix[s00i]) * 0x101 - s00r := float64(s00ru) - s10i := (sy0-src.Rect.Min.Y)*src.Stride + (sx1 - src.Rect.Min.X) - s10ru := uint32(src.Pix[s10i]) * 0x101 - s10r := float64(s10ru) - s10r = xFrac1*s00r + xFrac0*s10r - s01i := (sy1-src.Rect.Min.Y)*src.Stride + (sx0 - src.Rect.Min.X) - s01ru := uint32(src.Pix[s01i]) * 0x101 - s01r := float64(s01ru) - s11i := (sy1-src.Rect.Min.Y)*src.Stride + (sx1 - src.Rect.Min.X) - s11ru := uint32(src.Pix[s11i]) * 0x101 - s11r := float64(s11ru) - s11r = xFrac1*s01r + xFrac0*s11r - s11r = yFrac1*s10r + yFrac0*s11r - pr := uint32(s11r) - out := uint8(pr >> 8) - dst.Pix[d+0] = out - dst.Pix[d+1] = out - dst.Pix[d+2] = out - dst.Pix[d+3] = 0xff - } - } -} - -func (ablInterpolator) transform_RGBA_NRGBA_Over(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src *image.NRGBA, sr image.Rectangle, bias image.Point, opts *Options) { - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx := d2s[0]*dxf + d2s[1]*dyf + d2s[2] - sy := d2s[3]*dxf + d2s[4]*dyf + d2s[5] - if !(image.Point{int(sx) + bias.X, int(sy) + bias.Y}).In(sr) { - continue - } - - sx -= 0.5 - sx0 := int(sx) - xFrac0 := sx - float64(sx0) - xFrac1 := 1 - xFrac0 - sx0 += bias.X - sx1 := sx0 + 1 - if sx0 < sr.Min.X { - sx0, sx1 = sr.Min.X, sr.Min.X - xFrac0, xFrac1 = 0, 1 - } else if sx1 >= sr.Max.X { - sx0, sx1 = sr.Max.X-1, sr.Max.X-1 - xFrac0, xFrac1 = 1, 0 - } - - sy -= 0.5 - sy0 := int(sy) - yFrac0 := sy - float64(sy0) - yFrac1 := 1 - yFrac0 - sy0 += bias.Y - sy1 := sy0 + 1 - if sy0 < sr.Min.Y { - sy0, sy1 = sr.Min.Y, sr.Min.Y - yFrac0, yFrac1 = 0, 1 - } else if sy1 >= sr.Max.Y { - sy0, sy1 = sr.Max.Y-1, sr.Max.Y-1 - yFrac0, yFrac1 = 1, 0 - } - - s00i := (sy0-src.Rect.Min.Y)*src.Stride + (sx0-src.Rect.Min.X)*4 - s00au := uint32(src.Pix[s00i+3]) * 0x101 - s00ru := uint32(src.Pix[s00i+0]) * s00au / 0xff - s00gu := uint32(src.Pix[s00i+1]) * s00au / 0xff - s00bu := uint32(src.Pix[s00i+2]) * s00au / 0xff - s00r := float64(s00ru) - s00g := float64(s00gu) - s00b := float64(s00bu) - s00a := float64(s00au) - s10i := (sy0-src.Rect.Min.Y)*src.Stride + (sx1-src.Rect.Min.X)*4 - s10au := uint32(src.Pix[s10i+3]) * 0x101 - s10ru := uint32(src.Pix[s10i+0]) * s10au / 0xff - s10gu := uint32(src.Pix[s10i+1]) * s10au / 0xff - s10bu := uint32(src.Pix[s10i+2]) * s10au / 0xff - s10r := float64(s10ru) - s10g := float64(s10gu) - s10b := float64(s10bu) - s10a := float64(s10au) - s10r = xFrac1*s00r + xFrac0*s10r - s10g = xFrac1*s00g + xFrac0*s10g - s10b = xFrac1*s00b + xFrac0*s10b - s10a = xFrac1*s00a + xFrac0*s10a - s01i := (sy1-src.Rect.Min.Y)*src.Stride + (sx0-src.Rect.Min.X)*4 - s01au := uint32(src.Pix[s01i+3]) * 0x101 - s01ru := uint32(src.Pix[s01i+0]) * s01au / 0xff - s01gu := uint32(src.Pix[s01i+1]) * s01au / 0xff - s01bu := uint32(src.Pix[s01i+2]) * s01au / 0xff - s01r := float64(s01ru) - s01g := float64(s01gu) - s01b := float64(s01bu) - s01a := float64(s01au) - s11i := (sy1-src.Rect.Min.Y)*src.Stride + (sx1-src.Rect.Min.X)*4 - s11au := uint32(src.Pix[s11i+3]) * 0x101 - s11ru := uint32(src.Pix[s11i+0]) * s11au / 0xff - s11gu := uint32(src.Pix[s11i+1]) * s11au / 0xff - s11bu := uint32(src.Pix[s11i+2]) * s11au / 0xff - s11r := float64(s11ru) - s11g := float64(s11gu) - s11b := float64(s11bu) - s11a := float64(s11au) - s11r = xFrac1*s01r + xFrac0*s11r - s11g = xFrac1*s01g + xFrac0*s11g - s11b = xFrac1*s01b + xFrac0*s11b - s11a = xFrac1*s01a + xFrac0*s11a - s11r = yFrac1*s10r + yFrac0*s11r - s11g = yFrac1*s10g + yFrac0*s11g - s11b = yFrac1*s10b + yFrac0*s11b - s11a = yFrac1*s10a + yFrac0*s11a - pr := uint32(s11r) - pg := uint32(s11g) - pb := uint32(s11b) - pa := uint32(s11a) - pa1 := (0xffff - pa) * 0x101 - dst.Pix[d+0] = uint8((uint32(dst.Pix[d+0])*pa1/0xffff + pr) >> 8) - dst.Pix[d+1] = uint8((uint32(dst.Pix[d+1])*pa1/0xffff + pg) >> 8) - dst.Pix[d+2] = uint8((uint32(dst.Pix[d+2])*pa1/0xffff + pb) >> 8) - dst.Pix[d+3] = uint8((uint32(dst.Pix[d+3])*pa1/0xffff + pa) >> 8) - } - } -} - -func (ablInterpolator) transform_RGBA_NRGBA_Src(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src *image.NRGBA, sr image.Rectangle, bias image.Point, opts *Options) { - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx := d2s[0]*dxf + d2s[1]*dyf + d2s[2] - sy := d2s[3]*dxf + d2s[4]*dyf + d2s[5] - if !(image.Point{int(sx) + bias.X, int(sy) + bias.Y}).In(sr) { - continue - } - - sx -= 0.5 - sx0 := int(sx) - xFrac0 := sx - float64(sx0) - xFrac1 := 1 - xFrac0 - sx0 += bias.X - sx1 := sx0 + 1 - if sx0 < sr.Min.X { - sx0, sx1 = sr.Min.X, sr.Min.X - xFrac0, xFrac1 = 0, 1 - } else if sx1 >= sr.Max.X { - sx0, sx1 = sr.Max.X-1, sr.Max.X-1 - xFrac0, xFrac1 = 1, 0 - } - - sy -= 0.5 - sy0 := int(sy) - yFrac0 := sy - float64(sy0) - yFrac1 := 1 - yFrac0 - sy0 += bias.Y - sy1 := sy0 + 1 - if sy0 < sr.Min.Y { - sy0, sy1 = sr.Min.Y, sr.Min.Y - yFrac0, yFrac1 = 0, 1 - } else if sy1 >= sr.Max.Y { - sy0, sy1 = sr.Max.Y-1, sr.Max.Y-1 - yFrac0, yFrac1 = 1, 0 - } - - s00i := (sy0-src.Rect.Min.Y)*src.Stride + (sx0-src.Rect.Min.X)*4 - s00au := uint32(src.Pix[s00i+3]) * 0x101 - s00ru := uint32(src.Pix[s00i+0]) * s00au / 0xff - s00gu := uint32(src.Pix[s00i+1]) * s00au / 0xff - s00bu := uint32(src.Pix[s00i+2]) * s00au / 0xff - s00r := float64(s00ru) - s00g := float64(s00gu) - s00b := float64(s00bu) - s00a := float64(s00au) - s10i := (sy0-src.Rect.Min.Y)*src.Stride + (sx1-src.Rect.Min.X)*4 - s10au := uint32(src.Pix[s10i+3]) * 0x101 - s10ru := uint32(src.Pix[s10i+0]) * s10au / 0xff - s10gu := uint32(src.Pix[s10i+1]) * s10au / 0xff - s10bu := uint32(src.Pix[s10i+2]) * s10au / 0xff - s10r := float64(s10ru) - s10g := float64(s10gu) - s10b := float64(s10bu) - s10a := float64(s10au) - s10r = xFrac1*s00r + xFrac0*s10r - s10g = xFrac1*s00g + xFrac0*s10g - s10b = xFrac1*s00b + xFrac0*s10b - s10a = xFrac1*s00a + xFrac0*s10a - s01i := (sy1-src.Rect.Min.Y)*src.Stride + (sx0-src.Rect.Min.X)*4 - s01au := uint32(src.Pix[s01i+3]) * 0x101 - s01ru := uint32(src.Pix[s01i+0]) * s01au / 0xff - s01gu := uint32(src.Pix[s01i+1]) * s01au / 0xff - s01bu := uint32(src.Pix[s01i+2]) * s01au / 0xff - s01r := float64(s01ru) - s01g := float64(s01gu) - s01b := float64(s01bu) - s01a := float64(s01au) - s11i := (sy1-src.Rect.Min.Y)*src.Stride + (sx1-src.Rect.Min.X)*4 - s11au := uint32(src.Pix[s11i+3]) * 0x101 - s11ru := uint32(src.Pix[s11i+0]) * s11au / 0xff - s11gu := uint32(src.Pix[s11i+1]) * s11au / 0xff - s11bu := uint32(src.Pix[s11i+2]) * s11au / 0xff - s11r := float64(s11ru) - s11g := float64(s11gu) - s11b := float64(s11bu) - s11a := float64(s11au) - s11r = xFrac1*s01r + xFrac0*s11r - s11g = xFrac1*s01g + xFrac0*s11g - s11b = xFrac1*s01b + xFrac0*s11b - s11a = xFrac1*s01a + xFrac0*s11a - s11r = yFrac1*s10r + yFrac0*s11r - s11g = yFrac1*s10g + yFrac0*s11g - s11b = yFrac1*s10b + yFrac0*s11b - s11a = yFrac1*s10a + yFrac0*s11a - pr := uint32(s11r) - pg := uint32(s11g) - pb := uint32(s11b) - pa := uint32(s11a) - dst.Pix[d+0] = uint8(pr >> 8) - dst.Pix[d+1] = uint8(pg >> 8) - dst.Pix[d+2] = uint8(pb >> 8) - dst.Pix[d+3] = uint8(pa >> 8) - } - } -} - -func (ablInterpolator) transform_RGBA_RGBA_Over(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src *image.RGBA, sr image.Rectangle, bias image.Point, opts *Options) { - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx := d2s[0]*dxf + d2s[1]*dyf + d2s[2] - sy := d2s[3]*dxf + d2s[4]*dyf + d2s[5] - if !(image.Point{int(sx) + bias.X, int(sy) + bias.Y}).In(sr) { - continue - } - - sx -= 0.5 - sx0 := int(sx) - xFrac0 := sx - float64(sx0) - xFrac1 := 1 - xFrac0 - sx0 += bias.X - sx1 := sx0 + 1 - if sx0 < sr.Min.X { - sx0, sx1 = sr.Min.X, sr.Min.X - xFrac0, xFrac1 = 0, 1 - } else if sx1 >= sr.Max.X { - sx0, sx1 = sr.Max.X-1, sr.Max.X-1 - xFrac0, xFrac1 = 1, 0 - } - - sy -= 0.5 - sy0 := int(sy) - yFrac0 := sy - float64(sy0) - yFrac1 := 1 - yFrac0 - sy0 += bias.Y - sy1 := sy0 + 1 - if sy0 < sr.Min.Y { - sy0, sy1 = sr.Min.Y, sr.Min.Y - yFrac0, yFrac1 = 0, 1 - } else if sy1 >= sr.Max.Y { - sy0, sy1 = sr.Max.Y-1, sr.Max.Y-1 - yFrac0, yFrac1 = 1, 0 - } - - s00i := (sy0-src.Rect.Min.Y)*src.Stride + (sx0-src.Rect.Min.X)*4 - s00ru := uint32(src.Pix[s00i+0]) * 0x101 - s00gu := uint32(src.Pix[s00i+1]) * 0x101 - s00bu := uint32(src.Pix[s00i+2]) * 0x101 - s00au := uint32(src.Pix[s00i+3]) * 0x101 - s00r := float64(s00ru) - s00g := float64(s00gu) - s00b := float64(s00bu) - s00a := float64(s00au) - s10i := (sy0-src.Rect.Min.Y)*src.Stride + (sx1-src.Rect.Min.X)*4 - s10ru := uint32(src.Pix[s10i+0]) * 0x101 - s10gu := uint32(src.Pix[s10i+1]) * 0x101 - s10bu := uint32(src.Pix[s10i+2]) * 0x101 - s10au := uint32(src.Pix[s10i+3]) * 0x101 - s10r := float64(s10ru) - s10g := float64(s10gu) - s10b := float64(s10bu) - s10a := float64(s10au) - s10r = xFrac1*s00r + xFrac0*s10r - s10g = xFrac1*s00g + xFrac0*s10g - s10b = xFrac1*s00b + xFrac0*s10b - s10a = xFrac1*s00a + xFrac0*s10a - s01i := (sy1-src.Rect.Min.Y)*src.Stride + (sx0-src.Rect.Min.X)*4 - s01ru := uint32(src.Pix[s01i+0]) * 0x101 - s01gu := uint32(src.Pix[s01i+1]) * 0x101 - s01bu := uint32(src.Pix[s01i+2]) * 0x101 - s01au := uint32(src.Pix[s01i+3]) * 0x101 - s01r := float64(s01ru) - s01g := float64(s01gu) - s01b := float64(s01bu) - s01a := float64(s01au) - s11i := (sy1-src.Rect.Min.Y)*src.Stride + (sx1-src.Rect.Min.X)*4 - s11ru := uint32(src.Pix[s11i+0]) * 0x101 - s11gu := uint32(src.Pix[s11i+1]) * 0x101 - s11bu := uint32(src.Pix[s11i+2]) * 0x101 - s11au := uint32(src.Pix[s11i+3]) * 0x101 - s11r := float64(s11ru) - s11g := float64(s11gu) - s11b := float64(s11bu) - s11a := float64(s11au) - s11r = xFrac1*s01r + xFrac0*s11r - s11g = xFrac1*s01g + xFrac0*s11g - s11b = xFrac1*s01b + xFrac0*s11b - s11a = xFrac1*s01a + xFrac0*s11a - s11r = yFrac1*s10r + yFrac0*s11r - s11g = yFrac1*s10g + yFrac0*s11g - s11b = yFrac1*s10b + yFrac0*s11b - s11a = yFrac1*s10a + yFrac0*s11a - pr := uint32(s11r) - pg := uint32(s11g) - pb := uint32(s11b) - pa := uint32(s11a) - pa1 := (0xffff - pa) * 0x101 - dst.Pix[d+0] = uint8((uint32(dst.Pix[d+0])*pa1/0xffff + pr) >> 8) - dst.Pix[d+1] = uint8((uint32(dst.Pix[d+1])*pa1/0xffff + pg) >> 8) - dst.Pix[d+2] = uint8((uint32(dst.Pix[d+2])*pa1/0xffff + pb) >> 8) - dst.Pix[d+3] = uint8((uint32(dst.Pix[d+3])*pa1/0xffff + pa) >> 8) - } - } -} - -func (ablInterpolator) transform_RGBA_RGBA_Src(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src *image.RGBA, sr image.Rectangle, bias image.Point, opts *Options) { - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx := d2s[0]*dxf + d2s[1]*dyf + d2s[2] - sy := d2s[3]*dxf + d2s[4]*dyf + d2s[5] - if !(image.Point{int(sx) + bias.X, int(sy) + bias.Y}).In(sr) { - continue - } - - sx -= 0.5 - sx0 := int(sx) - xFrac0 := sx - float64(sx0) - xFrac1 := 1 - xFrac0 - sx0 += bias.X - sx1 := sx0 + 1 - if sx0 < sr.Min.X { - sx0, sx1 = sr.Min.X, sr.Min.X - xFrac0, xFrac1 = 0, 1 - } else if sx1 >= sr.Max.X { - sx0, sx1 = sr.Max.X-1, sr.Max.X-1 - xFrac0, xFrac1 = 1, 0 - } - - sy -= 0.5 - sy0 := int(sy) - yFrac0 := sy - float64(sy0) - yFrac1 := 1 - yFrac0 - sy0 += bias.Y - sy1 := sy0 + 1 - if sy0 < sr.Min.Y { - sy0, sy1 = sr.Min.Y, sr.Min.Y - yFrac0, yFrac1 = 0, 1 - } else if sy1 >= sr.Max.Y { - sy0, sy1 = sr.Max.Y-1, sr.Max.Y-1 - yFrac0, yFrac1 = 1, 0 - } - - s00i := (sy0-src.Rect.Min.Y)*src.Stride + (sx0-src.Rect.Min.X)*4 - s00ru := uint32(src.Pix[s00i+0]) * 0x101 - s00gu := uint32(src.Pix[s00i+1]) * 0x101 - s00bu := uint32(src.Pix[s00i+2]) * 0x101 - s00au := uint32(src.Pix[s00i+3]) * 0x101 - s00r := float64(s00ru) - s00g := float64(s00gu) - s00b := float64(s00bu) - s00a := float64(s00au) - s10i := (sy0-src.Rect.Min.Y)*src.Stride + (sx1-src.Rect.Min.X)*4 - s10ru := uint32(src.Pix[s10i+0]) * 0x101 - s10gu := uint32(src.Pix[s10i+1]) * 0x101 - s10bu := uint32(src.Pix[s10i+2]) * 0x101 - s10au := uint32(src.Pix[s10i+3]) * 0x101 - s10r := float64(s10ru) - s10g := float64(s10gu) - s10b := float64(s10bu) - s10a := float64(s10au) - s10r = xFrac1*s00r + xFrac0*s10r - s10g = xFrac1*s00g + xFrac0*s10g - s10b = xFrac1*s00b + xFrac0*s10b - s10a = xFrac1*s00a + xFrac0*s10a - s01i := (sy1-src.Rect.Min.Y)*src.Stride + (sx0-src.Rect.Min.X)*4 - s01ru := uint32(src.Pix[s01i+0]) * 0x101 - s01gu := uint32(src.Pix[s01i+1]) * 0x101 - s01bu := uint32(src.Pix[s01i+2]) * 0x101 - s01au := uint32(src.Pix[s01i+3]) * 0x101 - s01r := float64(s01ru) - s01g := float64(s01gu) - s01b := float64(s01bu) - s01a := float64(s01au) - s11i := (sy1-src.Rect.Min.Y)*src.Stride + (sx1-src.Rect.Min.X)*4 - s11ru := uint32(src.Pix[s11i+0]) * 0x101 - s11gu := uint32(src.Pix[s11i+1]) * 0x101 - s11bu := uint32(src.Pix[s11i+2]) * 0x101 - s11au := uint32(src.Pix[s11i+3]) * 0x101 - s11r := float64(s11ru) - s11g := float64(s11gu) - s11b := float64(s11bu) - s11a := float64(s11au) - s11r = xFrac1*s01r + xFrac0*s11r - s11g = xFrac1*s01g + xFrac0*s11g - s11b = xFrac1*s01b + xFrac0*s11b - s11a = xFrac1*s01a + xFrac0*s11a - s11r = yFrac1*s10r + yFrac0*s11r - s11g = yFrac1*s10g + yFrac0*s11g - s11b = yFrac1*s10b + yFrac0*s11b - s11a = yFrac1*s10a + yFrac0*s11a - pr := uint32(s11r) - pg := uint32(s11g) - pb := uint32(s11b) - pa := uint32(s11a) - dst.Pix[d+0] = uint8(pr >> 8) - dst.Pix[d+1] = uint8(pg >> 8) - dst.Pix[d+2] = uint8(pb >> 8) - dst.Pix[d+3] = uint8(pa >> 8) - } - } -} - -func (ablInterpolator) transform_RGBA_YCbCr444_Src(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src *image.YCbCr, sr image.Rectangle, bias image.Point, opts *Options) { - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx := d2s[0]*dxf + d2s[1]*dyf + d2s[2] - sy := d2s[3]*dxf + d2s[4]*dyf + d2s[5] - if !(image.Point{int(sx) + bias.X, int(sy) + bias.Y}).In(sr) { - continue - } - - sx -= 0.5 - sx0 := int(sx) - xFrac0 := sx - float64(sx0) - xFrac1 := 1 - xFrac0 - sx0 += bias.X - sx1 := sx0 + 1 - if sx0 < sr.Min.X { - sx0, sx1 = sr.Min.X, sr.Min.X - xFrac0, xFrac1 = 0, 1 - } else if sx1 >= sr.Max.X { - sx0, sx1 = sr.Max.X-1, sr.Max.X-1 - xFrac0, xFrac1 = 1, 0 - } - - sy -= 0.5 - sy0 := int(sy) - yFrac0 := sy - float64(sy0) - yFrac1 := 1 - yFrac0 - sy0 += bias.Y - sy1 := sy0 + 1 - if sy0 < sr.Min.Y { - sy0, sy1 = sr.Min.Y, sr.Min.Y - yFrac0, yFrac1 = 0, 1 - } else if sy1 >= sr.Max.Y { - sy0, sy1 = sr.Max.Y-1, sr.Max.Y-1 - yFrac0, yFrac1 = 1, 0 - } - - s00i := (sy0-src.Rect.Min.Y)*src.YStride + (sx0 - src.Rect.Min.X) - s00j := (sy0-src.Rect.Min.Y)*src.CStride + (sx0 - src.Rect.Min.X) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s00yy1 := int(src.Y[s00i]) * 0x10101 - s00cb1 := int(src.Cb[s00j]) - 128 - s00cr1 := int(src.Cr[s00j]) - 128 - s00ru := (s00yy1 + 91881*s00cr1) >> 8 - s00gu := (s00yy1 - 22554*s00cb1 - 46802*s00cr1) >> 8 - s00bu := (s00yy1 + 116130*s00cb1) >> 8 - if s00ru < 0 { - s00ru = 0 - } else if s00ru > 0xffff { - s00ru = 0xffff - } - if s00gu < 0 { - s00gu = 0 - } else if s00gu > 0xffff { - s00gu = 0xffff - } - if s00bu < 0 { - s00bu = 0 - } else if s00bu > 0xffff { - s00bu = 0xffff - } - - s00r := float64(s00ru) - s00g := float64(s00gu) - s00b := float64(s00bu) - s10i := (sy0-src.Rect.Min.Y)*src.YStride + (sx1 - src.Rect.Min.X) - s10j := (sy0-src.Rect.Min.Y)*src.CStride + (sx1 - src.Rect.Min.X) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s10yy1 := int(src.Y[s10i]) * 0x10101 - s10cb1 := int(src.Cb[s10j]) - 128 - s10cr1 := int(src.Cr[s10j]) - 128 - s10ru := (s10yy1 + 91881*s10cr1) >> 8 - s10gu := (s10yy1 - 22554*s10cb1 - 46802*s10cr1) >> 8 - s10bu := (s10yy1 + 116130*s10cb1) >> 8 - if s10ru < 0 { - s10ru = 0 - } else if s10ru > 0xffff { - s10ru = 0xffff - } - if s10gu < 0 { - s10gu = 0 - } else if s10gu > 0xffff { - s10gu = 0xffff - } - if s10bu < 0 { - s10bu = 0 - } else if s10bu > 0xffff { - s10bu = 0xffff - } - - s10r := float64(s10ru) - s10g := float64(s10gu) - s10b := float64(s10bu) - s10r = xFrac1*s00r + xFrac0*s10r - s10g = xFrac1*s00g + xFrac0*s10g - s10b = xFrac1*s00b + xFrac0*s10b - s01i := (sy1-src.Rect.Min.Y)*src.YStride + (sx0 - src.Rect.Min.X) - s01j := (sy1-src.Rect.Min.Y)*src.CStride + (sx0 - src.Rect.Min.X) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s01yy1 := int(src.Y[s01i]) * 0x10101 - s01cb1 := int(src.Cb[s01j]) - 128 - s01cr1 := int(src.Cr[s01j]) - 128 - s01ru := (s01yy1 + 91881*s01cr1) >> 8 - s01gu := (s01yy1 - 22554*s01cb1 - 46802*s01cr1) >> 8 - s01bu := (s01yy1 + 116130*s01cb1) >> 8 - if s01ru < 0 { - s01ru = 0 - } else if s01ru > 0xffff { - s01ru = 0xffff - } - if s01gu < 0 { - s01gu = 0 - } else if s01gu > 0xffff { - s01gu = 0xffff - } - if s01bu < 0 { - s01bu = 0 - } else if s01bu > 0xffff { - s01bu = 0xffff - } - - s01r := float64(s01ru) - s01g := float64(s01gu) - s01b := float64(s01bu) - s11i := (sy1-src.Rect.Min.Y)*src.YStride + (sx1 - src.Rect.Min.X) - s11j := (sy1-src.Rect.Min.Y)*src.CStride + (sx1 - src.Rect.Min.X) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s11yy1 := int(src.Y[s11i]) * 0x10101 - s11cb1 := int(src.Cb[s11j]) - 128 - s11cr1 := int(src.Cr[s11j]) - 128 - s11ru := (s11yy1 + 91881*s11cr1) >> 8 - s11gu := (s11yy1 - 22554*s11cb1 - 46802*s11cr1) >> 8 - s11bu := (s11yy1 + 116130*s11cb1) >> 8 - if s11ru < 0 { - s11ru = 0 - } else if s11ru > 0xffff { - s11ru = 0xffff - } - if s11gu < 0 { - s11gu = 0 - } else if s11gu > 0xffff { - s11gu = 0xffff - } - if s11bu < 0 { - s11bu = 0 - } else if s11bu > 0xffff { - s11bu = 0xffff - } - - s11r := float64(s11ru) - s11g := float64(s11gu) - s11b := float64(s11bu) - s11r = xFrac1*s01r + xFrac0*s11r - s11g = xFrac1*s01g + xFrac0*s11g - s11b = xFrac1*s01b + xFrac0*s11b - s11r = yFrac1*s10r + yFrac0*s11r - s11g = yFrac1*s10g + yFrac0*s11g - s11b = yFrac1*s10b + yFrac0*s11b - pr := uint32(s11r) - pg := uint32(s11g) - pb := uint32(s11b) - dst.Pix[d+0] = uint8(pr >> 8) - dst.Pix[d+1] = uint8(pg >> 8) - dst.Pix[d+2] = uint8(pb >> 8) - dst.Pix[d+3] = 0xff - } - } -} - -func (ablInterpolator) transform_RGBA_YCbCr422_Src(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src *image.YCbCr, sr image.Rectangle, bias image.Point, opts *Options) { - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx := d2s[0]*dxf + d2s[1]*dyf + d2s[2] - sy := d2s[3]*dxf + d2s[4]*dyf + d2s[5] - if !(image.Point{int(sx) + bias.X, int(sy) + bias.Y}).In(sr) { - continue - } - - sx -= 0.5 - sx0 := int(sx) - xFrac0 := sx - float64(sx0) - xFrac1 := 1 - xFrac0 - sx0 += bias.X - sx1 := sx0 + 1 - if sx0 < sr.Min.X { - sx0, sx1 = sr.Min.X, sr.Min.X - xFrac0, xFrac1 = 0, 1 - } else if sx1 >= sr.Max.X { - sx0, sx1 = sr.Max.X-1, sr.Max.X-1 - xFrac0, xFrac1 = 1, 0 - } - - sy -= 0.5 - sy0 := int(sy) - yFrac0 := sy - float64(sy0) - yFrac1 := 1 - yFrac0 - sy0 += bias.Y - sy1 := sy0 + 1 - if sy0 < sr.Min.Y { - sy0, sy1 = sr.Min.Y, sr.Min.Y - yFrac0, yFrac1 = 0, 1 - } else if sy1 >= sr.Max.Y { - sy0, sy1 = sr.Max.Y-1, sr.Max.Y-1 - yFrac0, yFrac1 = 1, 0 - } - - s00i := (sy0-src.Rect.Min.Y)*src.YStride + (sx0 - src.Rect.Min.X) - s00j := (sy0-src.Rect.Min.Y)*src.CStride + ((sx0)/2 - src.Rect.Min.X/2) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s00yy1 := int(src.Y[s00i]) * 0x10101 - s00cb1 := int(src.Cb[s00j]) - 128 - s00cr1 := int(src.Cr[s00j]) - 128 - s00ru := (s00yy1 + 91881*s00cr1) >> 8 - s00gu := (s00yy1 - 22554*s00cb1 - 46802*s00cr1) >> 8 - s00bu := (s00yy1 + 116130*s00cb1) >> 8 - if s00ru < 0 { - s00ru = 0 - } else if s00ru > 0xffff { - s00ru = 0xffff - } - if s00gu < 0 { - s00gu = 0 - } else if s00gu > 0xffff { - s00gu = 0xffff - } - if s00bu < 0 { - s00bu = 0 - } else if s00bu > 0xffff { - s00bu = 0xffff - } - - s00r := float64(s00ru) - s00g := float64(s00gu) - s00b := float64(s00bu) - s10i := (sy0-src.Rect.Min.Y)*src.YStride + (sx1 - src.Rect.Min.X) - s10j := (sy0-src.Rect.Min.Y)*src.CStride + ((sx1)/2 - src.Rect.Min.X/2) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s10yy1 := int(src.Y[s10i]) * 0x10101 - s10cb1 := int(src.Cb[s10j]) - 128 - s10cr1 := int(src.Cr[s10j]) - 128 - s10ru := (s10yy1 + 91881*s10cr1) >> 8 - s10gu := (s10yy1 - 22554*s10cb1 - 46802*s10cr1) >> 8 - s10bu := (s10yy1 + 116130*s10cb1) >> 8 - if s10ru < 0 { - s10ru = 0 - } else if s10ru > 0xffff { - s10ru = 0xffff - } - if s10gu < 0 { - s10gu = 0 - } else if s10gu > 0xffff { - s10gu = 0xffff - } - if s10bu < 0 { - s10bu = 0 - } else if s10bu > 0xffff { - s10bu = 0xffff - } - - s10r := float64(s10ru) - s10g := float64(s10gu) - s10b := float64(s10bu) - s10r = xFrac1*s00r + xFrac0*s10r - s10g = xFrac1*s00g + xFrac0*s10g - s10b = xFrac1*s00b + xFrac0*s10b - s01i := (sy1-src.Rect.Min.Y)*src.YStride + (sx0 - src.Rect.Min.X) - s01j := (sy1-src.Rect.Min.Y)*src.CStride + ((sx0)/2 - src.Rect.Min.X/2) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s01yy1 := int(src.Y[s01i]) * 0x10101 - s01cb1 := int(src.Cb[s01j]) - 128 - s01cr1 := int(src.Cr[s01j]) - 128 - s01ru := (s01yy1 + 91881*s01cr1) >> 8 - s01gu := (s01yy1 - 22554*s01cb1 - 46802*s01cr1) >> 8 - s01bu := (s01yy1 + 116130*s01cb1) >> 8 - if s01ru < 0 { - s01ru = 0 - } else if s01ru > 0xffff { - s01ru = 0xffff - } - if s01gu < 0 { - s01gu = 0 - } else if s01gu > 0xffff { - s01gu = 0xffff - } - if s01bu < 0 { - s01bu = 0 - } else if s01bu > 0xffff { - s01bu = 0xffff - } - - s01r := float64(s01ru) - s01g := float64(s01gu) - s01b := float64(s01bu) - s11i := (sy1-src.Rect.Min.Y)*src.YStride + (sx1 - src.Rect.Min.X) - s11j := (sy1-src.Rect.Min.Y)*src.CStride + ((sx1)/2 - src.Rect.Min.X/2) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s11yy1 := int(src.Y[s11i]) * 0x10101 - s11cb1 := int(src.Cb[s11j]) - 128 - s11cr1 := int(src.Cr[s11j]) - 128 - s11ru := (s11yy1 + 91881*s11cr1) >> 8 - s11gu := (s11yy1 - 22554*s11cb1 - 46802*s11cr1) >> 8 - s11bu := (s11yy1 + 116130*s11cb1) >> 8 - if s11ru < 0 { - s11ru = 0 - } else if s11ru > 0xffff { - s11ru = 0xffff - } - if s11gu < 0 { - s11gu = 0 - } else if s11gu > 0xffff { - s11gu = 0xffff - } - if s11bu < 0 { - s11bu = 0 - } else if s11bu > 0xffff { - s11bu = 0xffff - } - - s11r := float64(s11ru) - s11g := float64(s11gu) - s11b := float64(s11bu) - s11r = xFrac1*s01r + xFrac0*s11r - s11g = xFrac1*s01g + xFrac0*s11g - s11b = xFrac1*s01b + xFrac0*s11b - s11r = yFrac1*s10r + yFrac0*s11r - s11g = yFrac1*s10g + yFrac0*s11g - s11b = yFrac1*s10b + yFrac0*s11b - pr := uint32(s11r) - pg := uint32(s11g) - pb := uint32(s11b) - dst.Pix[d+0] = uint8(pr >> 8) - dst.Pix[d+1] = uint8(pg >> 8) - dst.Pix[d+2] = uint8(pb >> 8) - dst.Pix[d+3] = 0xff - } - } -} - -func (ablInterpolator) transform_RGBA_YCbCr420_Src(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src *image.YCbCr, sr image.Rectangle, bias image.Point, opts *Options) { - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx := d2s[0]*dxf + d2s[1]*dyf + d2s[2] - sy := d2s[3]*dxf + d2s[4]*dyf + d2s[5] - if !(image.Point{int(sx) + bias.X, int(sy) + bias.Y}).In(sr) { - continue - } - - sx -= 0.5 - sx0 := int(sx) - xFrac0 := sx - float64(sx0) - xFrac1 := 1 - xFrac0 - sx0 += bias.X - sx1 := sx0 + 1 - if sx0 < sr.Min.X { - sx0, sx1 = sr.Min.X, sr.Min.X - xFrac0, xFrac1 = 0, 1 - } else if sx1 >= sr.Max.X { - sx0, sx1 = sr.Max.X-1, sr.Max.X-1 - xFrac0, xFrac1 = 1, 0 - } - - sy -= 0.5 - sy0 := int(sy) - yFrac0 := sy - float64(sy0) - yFrac1 := 1 - yFrac0 - sy0 += bias.Y - sy1 := sy0 + 1 - if sy0 < sr.Min.Y { - sy0, sy1 = sr.Min.Y, sr.Min.Y - yFrac0, yFrac1 = 0, 1 - } else if sy1 >= sr.Max.Y { - sy0, sy1 = sr.Max.Y-1, sr.Max.Y-1 - yFrac0, yFrac1 = 1, 0 - } - - s00i := (sy0-src.Rect.Min.Y)*src.YStride + (sx0 - src.Rect.Min.X) - s00j := ((sy0)/2-src.Rect.Min.Y/2)*src.CStride + ((sx0)/2 - src.Rect.Min.X/2) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s00yy1 := int(src.Y[s00i]) * 0x10101 - s00cb1 := int(src.Cb[s00j]) - 128 - s00cr1 := int(src.Cr[s00j]) - 128 - s00ru := (s00yy1 + 91881*s00cr1) >> 8 - s00gu := (s00yy1 - 22554*s00cb1 - 46802*s00cr1) >> 8 - s00bu := (s00yy1 + 116130*s00cb1) >> 8 - if s00ru < 0 { - s00ru = 0 - } else if s00ru > 0xffff { - s00ru = 0xffff - } - if s00gu < 0 { - s00gu = 0 - } else if s00gu > 0xffff { - s00gu = 0xffff - } - if s00bu < 0 { - s00bu = 0 - } else if s00bu > 0xffff { - s00bu = 0xffff - } - - s00r := float64(s00ru) - s00g := float64(s00gu) - s00b := float64(s00bu) - s10i := (sy0-src.Rect.Min.Y)*src.YStride + (sx1 - src.Rect.Min.X) - s10j := ((sy0)/2-src.Rect.Min.Y/2)*src.CStride + ((sx1)/2 - src.Rect.Min.X/2) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s10yy1 := int(src.Y[s10i]) * 0x10101 - s10cb1 := int(src.Cb[s10j]) - 128 - s10cr1 := int(src.Cr[s10j]) - 128 - s10ru := (s10yy1 + 91881*s10cr1) >> 8 - s10gu := (s10yy1 - 22554*s10cb1 - 46802*s10cr1) >> 8 - s10bu := (s10yy1 + 116130*s10cb1) >> 8 - if s10ru < 0 { - s10ru = 0 - } else if s10ru > 0xffff { - s10ru = 0xffff - } - if s10gu < 0 { - s10gu = 0 - } else if s10gu > 0xffff { - s10gu = 0xffff - } - if s10bu < 0 { - s10bu = 0 - } else if s10bu > 0xffff { - s10bu = 0xffff - } - - s10r := float64(s10ru) - s10g := float64(s10gu) - s10b := float64(s10bu) - s10r = xFrac1*s00r + xFrac0*s10r - s10g = xFrac1*s00g + xFrac0*s10g - s10b = xFrac1*s00b + xFrac0*s10b - s01i := (sy1-src.Rect.Min.Y)*src.YStride + (sx0 - src.Rect.Min.X) - s01j := ((sy1)/2-src.Rect.Min.Y/2)*src.CStride + ((sx0)/2 - src.Rect.Min.X/2) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s01yy1 := int(src.Y[s01i]) * 0x10101 - s01cb1 := int(src.Cb[s01j]) - 128 - s01cr1 := int(src.Cr[s01j]) - 128 - s01ru := (s01yy1 + 91881*s01cr1) >> 8 - s01gu := (s01yy1 - 22554*s01cb1 - 46802*s01cr1) >> 8 - s01bu := (s01yy1 + 116130*s01cb1) >> 8 - if s01ru < 0 { - s01ru = 0 - } else if s01ru > 0xffff { - s01ru = 0xffff - } - if s01gu < 0 { - s01gu = 0 - } else if s01gu > 0xffff { - s01gu = 0xffff - } - if s01bu < 0 { - s01bu = 0 - } else if s01bu > 0xffff { - s01bu = 0xffff - } - - s01r := float64(s01ru) - s01g := float64(s01gu) - s01b := float64(s01bu) - s11i := (sy1-src.Rect.Min.Y)*src.YStride + (sx1 - src.Rect.Min.X) - s11j := ((sy1)/2-src.Rect.Min.Y/2)*src.CStride + ((sx1)/2 - src.Rect.Min.X/2) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s11yy1 := int(src.Y[s11i]) * 0x10101 - s11cb1 := int(src.Cb[s11j]) - 128 - s11cr1 := int(src.Cr[s11j]) - 128 - s11ru := (s11yy1 + 91881*s11cr1) >> 8 - s11gu := (s11yy1 - 22554*s11cb1 - 46802*s11cr1) >> 8 - s11bu := (s11yy1 + 116130*s11cb1) >> 8 - if s11ru < 0 { - s11ru = 0 - } else if s11ru > 0xffff { - s11ru = 0xffff - } - if s11gu < 0 { - s11gu = 0 - } else if s11gu > 0xffff { - s11gu = 0xffff - } - if s11bu < 0 { - s11bu = 0 - } else if s11bu > 0xffff { - s11bu = 0xffff - } - - s11r := float64(s11ru) - s11g := float64(s11gu) - s11b := float64(s11bu) - s11r = xFrac1*s01r + xFrac0*s11r - s11g = xFrac1*s01g + xFrac0*s11g - s11b = xFrac1*s01b + xFrac0*s11b - s11r = yFrac1*s10r + yFrac0*s11r - s11g = yFrac1*s10g + yFrac0*s11g - s11b = yFrac1*s10b + yFrac0*s11b - pr := uint32(s11r) - pg := uint32(s11g) - pb := uint32(s11b) - dst.Pix[d+0] = uint8(pr >> 8) - dst.Pix[d+1] = uint8(pg >> 8) - dst.Pix[d+2] = uint8(pb >> 8) - dst.Pix[d+3] = 0xff - } - } -} - -func (ablInterpolator) transform_RGBA_YCbCr440_Src(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src *image.YCbCr, sr image.Rectangle, bias image.Point, opts *Options) { - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx := d2s[0]*dxf + d2s[1]*dyf + d2s[2] - sy := d2s[3]*dxf + d2s[4]*dyf + d2s[5] - if !(image.Point{int(sx) + bias.X, int(sy) + bias.Y}).In(sr) { - continue - } - - sx -= 0.5 - sx0 := int(sx) - xFrac0 := sx - float64(sx0) - xFrac1 := 1 - xFrac0 - sx0 += bias.X - sx1 := sx0 + 1 - if sx0 < sr.Min.X { - sx0, sx1 = sr.Min.X, sr.Min.X - xFrac0, xFrac1 = 0, 1 - } else if sx1 >= sr.Max.X { - sx0, sx1 = sr.Max.X-1, sr.Max.X-1 - xFrac0, xFrac1 = 1, 0 - } - - sy -= 0.5 - sy0 := int(sy) - yFrac0 := sy - float64(sy0) - yFrac1 := 1 - yFrac0 - sy0 += bias.Y - sy1 := sy0 + 1 - if sy0 < sr.Min.Y { - sy0, sy1 = sr.Min.Y, sr.Min.Y - yFrac0, yFrac1 = 0, 1 - } else if sy1 >= sr.Max.Y { - sy0, sy1 = sr.Max.Y-1, sr.Max.Y-1 - yFrac0, yFrac1 = 1, 0 - } - - s00i := (sy0-src.Rect.Min.Y)*src.YStride + (sx0 - src.Rect.Min.X) - s00j := ((sy0)/2-src.Rect.Min.Y/2)*src.CStride + (sx0 - src.Rect.Min.X) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s00yy1 := int(src.Y[s00i]) * 0x10101 - s00cb1 := int(src.Cb[s00j]) - 128 - s00cr1 := int(src.Cr[s00j]) - 128 - s00ru := (s00yy1 + 91881*s00cr1) >> 8 - s00gu := (s00yy1 - 22554*s00cb1 - 46802*s00cr1) >> 8 - s00bu := (s00yy1 + 116130*s00cb1) >> 8 - if s00ru < 0 { - s00ru = 0 - } else if s00ru > 0xffff { - s00ru = 0xffff - } - if s00gu < 0 { - s00gu = 0 - } else if s00gu > 0xffff { - s00gu = 0xffff - } - if s00bu < 0 { - s00bu = 0 - } else if s00bu > 0xffff { - s00bu = 0xffff - } - - s00r := float64(s00ru) - s00g := float64(s00gu) - s00b := float64(s00bu) - s10i := (sy0-src.Rect.Min.Y)*src.YStride + (sx1 - src.Rect.Min.X) - s10j := ((sy0)/2-src.Rect.Min.Y/2)*src.CStride + (sx1 - src.Rect.Min.X) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s10yy1 := int(src.Y[s10i]) * 0x10101 - s10cb1 := int(src.Cb[s10j]) - 128 - s10cr1 := int(src.Cr[s10j]) - 128 - s10ru := (s10yy1 + 91881*s10cr1) >> 8 - s10gu := (s10yy1 - 22554*s10cb1 - 46802*s10cr1) >> 8 - s10bu := (s10yy1 + 116130*s10cb1) >> 8 - if s10ru < 0 { - s10ru = 0 - } else if s10ru > 0xffff { - s10ru = 0xffff - } - if s10gu < 0 { - s10gu = 0 - } else if s10gu > 0xffff { - s10gu = 0xffff - } - if s10bu < 0 { - s10bu = 0 - } else if s10bu > 0xffff { - s10bu = 0xffff - } - - s10r := float64(s10ru) - s10g := float64(s10gu) - s10b := float64(s10bu) - s10r = xFrac1*s00r + xFrac0*s10r - s10g = xFrac1*s00g + xFrac0*s10g - s10b = xFrac1*s00b + xFrac0*s10b - s01i := (sy1-src.Rect.Min.Y)*src.YStride + (sx0 - src.Rect.Min.X) - s01j := ((sy1)/2-src.Rect.Min.Y/2)*src.CStride + (sx0 - src.Rect.Min.X) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s01yy1 := int(src.Y[s01i]) * 0x10101 - s01cb1 := int(src.Cb[s01j]) - 128 - s01cr1 := int(src.Cr[s01j]) - 128 - s01ru := (s01yy1 + 91881*s01cr1) >> 8 - s01gu := (s01yy1 - 22554*s01cb1 - 46802*s01cr1) >> 8 - s01bu := (s01yy1 + 116130*s01cb1) >> 8 - if s01ru < 0 { - s01ru = 0 - } else if s01ru > 0xffff { - s01ru = 0xffff - } - if s01gu < 0 { - s01gu = 0 - } else if s01gu > 0xffff { - s01gu = 0xffff - } - if s01bu < 0 { - s01bu = 0 - } else if s01bu > 0xffff { - s01bu = 0xffff - } - - s01r := float64(s01ru) - s01g := float64(s01gu) - s01b := float64(s01bu) - s11i := (sy1-src.Rect.Min.Y)*src.YStride + (sx1 - src.Rect.Min.X) - s11j := ((sy1)/2-src.Rect.Min.Y/2)*src.CStride + (sx1 - src.Rect.Min.X) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s11yy1 := int(src.Y[s11i]) * 0x10101 - s11cb1 := int(src.Cb[s11j]) - 128 - s11cr1 := int(src.Cr[s11j]) - 128 - s11ru := (s11yy1 + 91881*s11cr1) >> 8 - s11gu := (s11yy1 - 22554*s11cb1 - 46802*s11cr1) >> 8 - s11bu := (s11yy1 + 116130*s11cb1) >> 8 - if s11ru < 0 { - s11ru = 0 - } else if s11ru > 0xffff { - s11ru = 0xffff - } - if s11gu < 0 { - s11gu = 0 - } else if s11gu > 0xffff { - s11gu = 0xffff - } - if s11bu < 0 { - s11bu = 0 - } else if s11bu > 0xffff { - s11bu = 0xffff - } - - s11r := float64(s11ru) - s11g := float64(s11gu) - s11b := float64(s11bu) - s11r = xFrac1*s01r + xFrac0*s11r - s11g = xFrac1*s01g + xFrac0*s11g - s11b = xFrac1*s01b + xFrac0*s11b - s11r = yFrac1*s10r + yFrac0*s11r - s11g = yFrac1*s10g + yFrac0*s11g - s11b = yFrac1*s10b + yFrac0*s11b - pr := uint32(s11r) - pg := uint32(s11g) - pb := uint32(s11b) - dst.Pix[d+0] = uint8(pr >> 8) - dst.Pix[d+1] = uint8(pg >> 8) - dst.Pix[d+2] = uint8(pb >> 8) - dst.Pix[d+3] = 0xff - } - } -} - -func (ablInterpolator) transform_RGBA_Image_Over(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src image.Image, sr image.Rectangle, bias image.Point, opts *Options) { - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx := d2s[0]*dxf + d2s[1]*dyf + d2s[2] - sy := d2s[3]*dxf + d2s[4]*dyf + d2s[5] - if !(image.Point{int(sx) + bias.X, int(sy) + bias.Y}).In(sr) { - continue - } - - sx -= 0.5 - sx0 := int(sx) - xFrac0 := sx - float64(sx0) - xFrac1 := 1 - xFrac0 - sx0 += bias.X - sx1 := sx0 + 1 - if sx0 < sr.Min.X { - sx0, sx1 = sr.Min.X, sr.Min.X - xFrac0, xFrac1 = 0, 1 - } else if sx1 >= sr.Max.X { - sx0, sx1 = sr.Max.X-1, sr.Max.X-1 - xFrac0, xFrac1 = 1, 0 - } - - sy -= 0.5 - sy0 := int(sy) - yFrac0 := sy - float64(sy0) - yFrac1 := 1 - yFrac0 - sy0 += bias.Y - sy1 := sy0 + 1 - if sy0 < sr.Min.Y { - sy0, sy1 = sr.Min.Y, sr.Min.Y - yFrac0, yFrac1 = 0, 1 - } else if sy1 >= sr.Max.Y { - sy0, sy1 = sr.Max.Y-1, sr.Max.Y-1 - yFrac0, yFrac1 = 1, 0 - } - - s00ru, s00gu, s00bu, s00au := src.At(sx0, sy0).RGBA() - s00r := float64(s00ru) - s00g := float64(s00gu) - s00b := float64(s00bu) - s00a := float64(s00au) - s10ru, s10gu, s10bu, s10au := src.At(sx1, sy0).RGBA() - s10r := float64(s10ru) - s10g := float64(s10gu) - s10b := float64(s10bu) - s10a := float64(s10au) - s10r = xFrac1*s00r + xFrac0*s10r - s10g = xFrac1*s00g + xFrac0*s10g - s10b = xFrac1*s00b + xFrac0*s10b - s10a = xFrac1*s00a + xFrac0*s10a - s01ru, s01gu, s01bu, s01au := src.At(sx0, sy1).RGBA() - s01r := float64(s01ru) - s01g := float64(s01gu) - s01b := float64(s01bu) - s01a := float64(s01au) - s11ru, s11gu, s11bu, s11au := src.At(sx1, sy1).RGBA() - s11r := float64(s11ru) - s11g := float64(s11gu) - s11b := float64(s11bu) - s11a := float64(s11au) - s11r = xFrac1*s01r + xFrac0*s11r - s11g = xFrac1*s01g + xFrac0*s11g - s11b = xFrac1*s01b + xFrac0*s11b - s11a = xFrac1*s01a + xFrac0*s11a - s11r = yFrac1*s10r + yFrac0*s11r - s11g = yFrac1*s10g + yFrac0*s11g - s11b = yFrac1*s10b + yFrac0*s11b - s11a = yFrac1*s10a + yFrac0*s11a - pr := uint32(s11r) - pg := uint32(s11g) - pb := uint32(s11b) - pa := uint32(s11a) - pa1 := (0xffff - pa) * 0x101 - dst.Pix[d+0] = uint8((uint32(dst.Pix[d+0])*pa1/0xffff + pr) >> 8) - dst.Pix[d+1] = uint8((uint32(dst.Pix[d+1])*pa1/0xffff + pg) >> 8) - dst.Pix[d+2] = uint8((uint32(dst.Pix[d+2])*pa1/0xffff + pb) >> 8) - dst.Pix[d+3] = uint8((uint32(dst.Pix[d+3])*pa1/0xffff + pa) >> 8) - } - } -} - -func (ablInterpolator) transform_RGBA_Image_Src(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src image.Image, sr image.Rectangle, bias image.Point, opts *Options) { - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx := d2s[0]*dxf + d2s[1]*dyf + d2s[2] - sy := d2s[3]*dxf + d2s[4]*dyf + d2s[5] - if !(image.Point{int(sx) + bias.X, int(sy) + bias.Y}).In(sr) { - continue - } - - sx -= 0.5 - sx0 := int(sx) - xFrac0 := sx - float64(sx0) - xFrac1 := 1 - xFrac0 - sx0 += bias.X - sx1 := sx0 + 1 - if sx0 < sr.Min.X { - sx0, sx1 = sr.Min.X, sr.Min.X - xFrac0, xFrac1 = 0, 1 - } else if sx1 >= sr.Max.X { - sx0, sx1 = sr.Max.X-1, sr.Max.X-1 - xFrac0, xFrac1 = 1, 0 - } - - sy -= 0.5 - sy0 := int(sy) - yFrac0 := sy - float64(sy0) - yFrac1 := 1 - yFrac0 - sy0 += bias.Y - sy1 := sy0 + 1 - if sy0 < sr.Min.Y { - sy0, sy1 = sr.Min.Y, sr.Min.Y - yFrac0, yFrac1 = 0, 1 - } else if sy1 >= sr.Max.Y { - sy0, sy1 = sr.Max.Y-1, sr.Max.Y-1 - yFrac0, yFrac1 = 1, 0 - } - - s00ru, s00gu, s00bu, s00au := src.At(sx0, sy0).RGBA() - s00r := float64(s00ru) - s00g := float64(s00gu) - s00b := float64(s00bu) - s00a := float64(s00au) - s10ru, s10gu, s10bu, s10au := src.At(sx1, sy0).RGBA() - s10r := float64(s10ru) - s10g := float64(s10gu) - s10b := float64(s10bu) - s10a := float64(s10au) - s10r = xFrac1*s00r + xFrac0*s10r - s10g = xFrac1*s00g + xFrac0*s10g - s10b = xFrac1*s00b + xFrac0*s10b - s10a = xFrac1*s00a + xFrac0*s10a - s01ru, s01gu, s01bu, s01au := src.At(sx0, sy1).RGBA() - s01r := float64(s01ru) - s01g := float64(s01gu) - s01b := float64(s01bu) - s01a := float64(s01au) - s11ru, s11gu, s11bu, s11au := src.At(sx1, sy1).RGBA() - s11r := float64(s11ru) - s11g := float64(s11gu) - s11b := float64(s11bu) - s11a := float64(s11au) - s11r = xFrac1*s01r + xFrac0*s11r - s11g = xFrac1*s01g + xFrac0*s11g - s11b = xFrac1*s01b + xFrac0*s11b - s11a = xFrac1*s01a + xFrac0*s11a - s11r = yFrac1*s10r + yFrac0*s11r - s11g = yFrac1*s10g + yFrac0*s11g - s11b = yFrac1*s10b + yFrac0*s11b - s11a = yFrac1*s10a + yFrac0*s11a - pr := uint32(s11r) - pg := uint32(s11g) - pb := uint32(s11b) - pa := uint32(s11a) - dst.Pix[d+0] = uint8(pr >> 8) - dst.Pix[d+1] = uint8(pg >> 8) - dst.Pix[d+2] = uint8(pb >> 8) - dst.Pix[d+3] = uint8(pa >> 8) - } - } -} - -func (ablInterpolator) transform_Image_Image_Over(dst Image, dr, adr image.Rectangle, d2s *f64.Aff3, src image.Image, sr image.Rectangle, bias image.Point, opts *Options) { - srcMask, smp := opts.SrcMask, opts.SrcMaskP - dstMask, dmp := opts.DstMask, opts.DstMaskP - dstColorRGBA64 := &color.RGBA64{} - dstColor := color.Color(dstColorRGBA64) - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx++ { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx := d2s[0]*dxf + d2s[1]*dyf + d2s[2] - sy := d2s[3]*dxf + d2s[4]*dyf + d2s[5] - if !(image.Point{int(sx) + bias.X, int(sy) + bias.Y}).In(sr) { - continue - } - - sx -= 0.5 - sx0 := int(sx) - xFrac0 := sx - float64(sx0) - xFrac1 := 1 - xFrac0 - sx0 += bias.X - sx1 := sx0 + 1 - if sx0 < sr.Min.X { - sx0, sx1 = sr.Min.X, sr.Min.X - xFrac0, xFrac1 = 0, 1 - } else if sx1 >= sr.Max.X { - sx0, sx1 = sr.Max.X-1, sr.Max.X-1 - xFrac0, xFrac1 = 1, 0 - } - - sy -= 0.5 - sy0 := int(sy) - yFrac0 := sy - float64(sy0) - yFrac1 := 1 - yFrac0 - sy0 += bias.Y - sy1 := sy0 + 1 - if sy0 < sr.Min.Y { - sy0, sy1 = sr.Min.Y, sr.Min.Y - yFrac0, yFrac1 = 0, 1 - } else if sy1 >= sr.Max.Y { - sy0, sy1 = sr.Max.Y-1, sr.Max.Y-1 - yFrac0, yFrac1 = 1, 0 - } - - s00ru, s00gu, s00bu, s00au := src.At(sx0, sy0).RGBA() - if srcMask != nil { - _, _, _, ma := srcMask.At(smp.X+sx0, smp.Y+sy0).RGBA() - s00ru = s00ru * ma / 0xffff - s00gu = s00gu * ma / 0xffff - s00bu = s00bu * ma / 0xffff - s00au = s00au * ma / 0xffff - } - s00r := float64(s00ru) - s00g := float64(s00gu) - s00b := float64(s00bu) - s00a := float64(s00au) - s10ru, s10gu, s10bu, s10au := src.At(sx1, sy0).RGBA() - if srcMask != nil { - _, _, _, ma := srcMask.At(smp.X+sx1, smp.Y+sy0).RGBA() - s10ru = s10ru * ma / 0xffff - s10gu = s10gu * ma / 0xffff - s10bu = s10bu * ma / 0xffff - s10au = s10au * ma / 0xffff - } - s10r := float64(s10ru) - s10g := float64(s10gu) - s10b := float64(s10bu) - s10a := float64(s10au) - s10r = xFrac1*s00r + xFrac0*s10r - s10g = xFrac1*s00g + xFrac0*s10g - s10b = xFrac1*s00b + xFrac0*s10b - s10a = xFrac1*s00a + xFrac0*s10a - s01ru, s01gu, s01bu, s01au := src.At(sx0, sy1).RGBA() - if srcMask != nil { - _, _, _, ma := srcMask.At(smp.X+sx0, smp.Y+sy1).RGBA() - s01ru = s01ru * ma / 0xffff - s01gu = s01gu * ma / 0xffff - s01bu = s01bu * ma / 0xffff - s01au = s01au * ma / 0xffff - } - s01r := float64(s01ru) - s01g := float64(s01gu) - s01b := float64(s01bu) - s01a := float64(s01au) - s11ru, s11gu, s11bu, s11au := src.At(sx1, sy1).RGBA() - if srcMask != nil { - _, _, _, ma := srcMask.At(smp.X+sx1, smp.Y+sy1).RGBA() - s11ru = s11ru * ma / 0xffff - s11gu = s11gu * ma / 0xffff - s11bu = s11bu * ma / 0xffff - s11au = s11au * ma / 0xffff - } - s11r := float64(s11ru) - s11g := float64(s11gu) - s11b := float64(s11bu) - s11a := float64(s11au) - s11r = xFrac1*s01r + xFrac0*s11r - s11g = xFrac1*s01g + xFrac0*s11g - s11b = xFrac1*s01b + xFrac0*s11b - s11a = xFrac1*s01a + xFrac0*s11a - s11r = yFrac1*s10r + yFrac0*s11r - s11g = yFrac1*s10g + yFrac0*s11g - s11b = yFrac1*s10b + yFrac0*s11b - s11a = yFrac1*s10a + yFrac0*s11a - pr := uint32(s11r) - pg := uint32(s11g) - pb := uint32(s11b) - pa := uint32(s11a) - qr, qg, qb, qa := dst.At(dr.Min.X+int(dx), dr.Min.Y+int(dy)).RGBA() - if dstMask != nil { - _, _, _, ma := dstMask.At(dmp.X+dr.Min.X+int(dx), dmp.Y+dr.Min.Y+int(dy)).RGBA() - pr = pr * ma / 0xffff - pg = pg * ma / 0xffff - pb = pb * ma / 0xffff - pa = pa * ma / 0xffff - } - pa1 := 0xffff - pa - dstColorRGBA64.R = uint16(qr*pa1/0xffff + pr) - dstColorRGBA64.G = uint16(qg*pa1/0xffff + pg) - dstColorRGBA64.B = uint16(qb*pa1/0xffff + pb) - dstColorRGBA64.A = uint16(qa*pa1/0xffff + pa) - dst.Set(dr.Min.X+int(dx), dr.Min.Y+int(dy), dstColor) - } - } -} - -func (ablInterpolator) transform_Image_Image_Src(dst Image, dr, adr image.Rectangle, d2s *f64.Aff3, src image.Image, sr image.Rectangle, bias image.Point, opts *Options) { - srcMask, smp := opts.SrcMask, opts.SrcMaskP - dstMask, dmp := opts.DstMask, opts.DstMaskP - dstColorRGBA64 := &color.RGBA64{} - dstColor := color.Color(dstColorRGBA64) - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx++ { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx := d2s[0]*dxf + d2s[1]*dyf + d2s[2] - sy := d2s[3]*dxf + d2s[4]*dyf + d2s[5] - if !(image.Point{int(sx) + bias.X, int(sy) + bias.Y}).In(sr) { - continue - } - - sx -= 0.5 - sx0 := int(sx) - xFrac0 := sx - float64(sx0) - xFrac1 := 1 - xFrac0 - sx0 += bias.X - sx1 := sx0 + 1 - if sx0 < sr.Min.X { - sx0, sx1 = sr.Min.X, sr.Min.X - xFrac0, xFrac1 = 0, 1 - } else if sx1 >= sr.Max.X { - sx0, sx1 = sr.Max.X-1, sr.Max.X-1 - xFrac0, xFrac1 = 1, 0 - } - - sy -= 0.5 - sy0 := int(sy) - yFrac0 := sy - float64(sy0) - yFrac1 := 1 - yFrac0 - sy0 += bias.Y - sy1 := sy0 + 1 - if sy0 < sr.Min.Y { - sy0, sy1 = sr.Min.Y, sr.Min.Y - yFrac0, yFrac1 = 0, 1 - } else if sy1 >= sr.Max.Y { - sy0, sy1 = sr.Max.Y-1, sr.Max.Y-1 - yFrac0, yFrac1 = 1, 0 - } - - s00ru, s00gu, s00bu, s00au := src.At(sx0, sy0).RGBA() - if srcMask != nil { - _, _, _, ma := srcMask.At(smp.X+sx0, smp.Y+sy0).RGBA() - s00ru = s00ru * ma / 0xffff - s00gu = s00gu * ma / 0xffff - s00bu = s00bu * ma / 0xffff - s00au = s00au * ma / 0xffff - } - s00r := float64(s00ru) - s00g := float64(s00gu) - s00b := float64(s00bu) - s00a := float64(s00au) - s10ru, s10gu, s10bu, s10au := src.At(sx1, sy0).RGBA() - if srcMask != nil { - _, _, _, ma := srcMask.At(smp.X+sx1, smp.Y+sy0).RGBA() - s10ru = s10ru * ma / 0xffff - s10gu = s10gu * ma / 0xffff - s10bu = s10bu * ma / 0xffff - s10au = s10au * ma / 0xffff - } - s10r := float64(s10ru) - s10g := float64(s10gu) - s10b := float64(s10bu) - s10a := float64(s10au) - s10r = xFrac1*s00r + xFrac0*s10r - s10g = xFrac1*s00g + xFrac0*s10g - s10b = xFrac1*s00b + xFrac0*s10b - s10a = xFrac1*s00a + xFrac0*s10a - s01ru, s01gu, s01bu, s01au := src.At(sx0, sy1).RGBA() - if srcMask != nil { - _, _, _, ma := srcMask.At(smp.X+sx0, smp.Y+sy1).RGBA() - s01ru = s01ru * ma / 0xffff - s01gu = s01gu * ma / 0xffff - s01bu = s01bu * ma / 0xffff - s01au = s01au * ma / 0xffff - } - s01r := float64(s01ru) - s01g := float64(s01gu) - s01b := float64(s01bu) - s01a := float64(s01au) - s11ru, s11gu, s11bu, s11au := src.At(sx1, sy1).RGBA() - if srcMask != nil { - _, _, _, ma := srcMask.At(smp.X+sx1, smp.Y+sy1).RGBA() - s11ru = s11ru * ma / 0xffff - s11gu = s11gu * ma / 0xffff - s11bu = s11bu * ma / 0xffff - s11au = s11au * ma / 0xffff - } - s11r := float64(s11ru) - s11g := float64(s11gu) - s11b := float64(s11bu) - s11a := float64(s11au) - s11r = xFrac1*s01r + xFrac0*s11r - s11g = xFrac1*s01g + xFrac0*s11g - s11b = xFrac1*s01b + xFrac0*s11b - s11a = xFrac1*s01a + xFrac0*s11a - s11r = yFrac1*s10r + yFrac0*s11r - s11g = yFrac1*s10g + yFrac0*s11g - s11b = yFrac1*s10b + yFrac0*s11b - s11a = yFrac1*s10a + yFrac0*s11a - pr := uint32(s11r) - pg := uint32(s11g) - pb := uint32(s11b) - pa := uint32(s11a) - if dstMask != nil { - qr, qg, qb, qa := dst.At(dr.Min.X+int(dx), dr.Min.Y+int(dy)).RGBA() - _, _, _, ma := dstMask.At(dmp.X+dr.Min.X+int(dx), dmp.Y+dr.Min.Y+int(dy)).RGBA() - pr = pr * ma / 0xffff - pg = pg * ma / 0xffff - pb = pb * ma / 0xffff - pa = pa * ma / 0xffff - pa1 := 0xffff - ma - dstColorRGBA64.R = uint16(qr*pa1/0xffff + pr) - dstColorRGBA64.G = uint16(qg*pa1/0xffff + pg) - dstColorRGBA64.B = uint16(qb*pa1/0xffff + pb) - dstColorRGBA64.A = uint16(qa*pa1/0xffff + pa) - dst.Set(dr.Min.X+int(dx), dr.Min.Y+int(dy), dstColor) - } else { - dstColorRGBA64.R = uint16(pr) - dstColorRGBA64.G = uint16(pg) - dstColorRGBA64.B = uint16(pb) - dstColorRGBA64.A = uint16(pa) - dst.Set(dr.Min.X+int(dx), dr.Min.Y+int(dy), dstColor) - } - } - } -} - -func (z *kernelScaler) Scale(dst Image, dr image.Rectangle, src image.Image, sr image.Rectangle, op Op, opts *Options) { - if z.dw != int32(dr.Dx()) || z.dh != int32(dr.Dy()) || z.sw != int32(sr.Dx()) || z.sh != int32(sr.Dy()) { - z.kernel.Scale(dst, dr, src, sr, op, opts) - return - } - - var o Options - if opts != nil { - o = *opts - } - - // adr is the affected destination pixels. - adr := dst.Bounds().Intersect(dr) - adr, o.DstMask = clipAffectedDestRect(adr, o.DstMask, o.DstMaskP) - if adr.Empty() || sr.Empty() { - return - } - // Make adr relative to dr.Min. - adr = adr.Sub(dr.Min) - if op == Over && o.SrcMask == nil && opaque(src) { - op = Src - } - - if _, ok := src.(*image.Uniform); ok && o.DstMask == nil && o.SrcMask == nil && sr.In(src.Bounds()) { - Draw(dst, dr, src, src.Bounds().Min, op) - return - } - - // Create a temporary buffer: - // scaleX distributes the source image's columns over the temporary image. - // scaleY distributes the temporary image's rows over the destination image. - var tmp [][4]float64 - if z.pool.New != nil { - tmpp := z.pool.Get().(*[][4]float64) - defer z.pool.Put(tmpp) - tmp = *tmpp - } else { - tmp = z.makeTmpBuf() - } - - // sr is the source pixels. If it extends beyond the src bounds, - // we cannot use the type-specific fast paths, as they access - // the Pix fields directly without bounds checking. - // - // Similarly, the fast paths assume that the masks are nil. - if o.SrcMask != nil || !sr.In(src.Bounds()) { - z.scaleX_Image(tmp, src, sr, &o) - } else { - switch src := src.(type) { - case *image.Gray: - z.scaleX_Gray(tmp, src, sr, &o) - case *image.NRGBA: - z.scaleX_NRGBA(tmp, src, sr, &o) - case *image.RGBA: - z.scaleX_RGBA(tmp, src, sr, &o) - case *image.YCbCr: - switch src.SubsampleRatio { - default: - z.scaleX_Image(tmp, src, sr, &o) - case image.YCbCrSubsampleRatio444: - z.scaleX_YCbCr444(tmp, src, sr, &o) - case image.YCbCrSubsampleRatio422: - z.scaleX_YCbCr422(tmp, src, sr, &o) - case image.YCbCrSubsampleRatio420: - z.scaleX_YCbCr420(tmp, src, sr, &o) - case image.YCbCrSubsampleRatio440: - z.scaleX_YCbCr440(tmp, src, sr, &o) - } - default: - z.scaleX_Image(tmp, src, sr, &o) - } - } - - if o.DstMask != nil { - switch op { - case Over: - z.scaleY_Image_Over(dst, dr, adr, tmp, &o) - case Src: - z.scaleY_Image_Src(dst, dr, adr, tmp, &o) - } - } else { - switch op { - case Over: - switch dst := dst.(type) { - case *image.RGBA: - z.scaleY_RGBA_Over(dst, dr, adr, tmp, &o) - default: - z.scaleY_Image_Over(dst, dr, adr, tmp, &o) - } - case Src: - switch dst := dst.(type) { - case *image.RGBA: - z.scaleY_RGBA_Src(dst, dr, adr, tmp, &o) - default: - z.scaleY_Image_Src(dst, dr, adr, tmp, &o) - } - } - } -} - -func (q *Kernel) Transform(dst Image, s2d f64.Aff3, src image.Image, sr image.Rectangle, op Op, opts *Options) { - var o Options - if opts != nil { - o = *opts - } - - dr := transformRect(&s2d, &sr) - // adr is the affected destination pixels. - adr := dst.Bounds().Intersect(dr) - adr, o.DstMask = clipAffectedDestRect(adr, o.DstMask, o.DstMaskP) - if adr.Empty() || sr.Empty() { - return - } - if op == Over && o.SrcMask == nil && opaque(src) { - op = Src - } - d2s := invert(&s2d) - // bias is a translation of the mapping from dst coordinates to src - // coordinates such that the latter temporarily have non-negative X - // and Y coordinates. This allows us to write int(f) instead of - // int(math.Floor(f)), since "round to zero" and "round down" are - // equivalent when f >= 0, but the former is much cheaper. The X-- - // and Y-- are because the TransformLeaf methods have a "sx -= 0.5" - // adjustment. - bias := transformRect(&d2s, &adr).Min - bias.X-- - bias.Y-- - d2s[2] -= float64(bias.X) - d2s[5] -= float64(bias.Y) - // Make adr relative to dr.Min. - adr = adr.Sub(dr.Min) - - if u, ok := src.(*image.Uniform); ok && o.DstMask != nil && o.SrcMask != nil && sr.In(src.Bounds()) { - transform_Uniform(dst, dr, adr, &d2s, u, sr, bias, op) - return - } - - xscale := abs(d2s[0]) - if s := abs(d2s[1]); xscale < s { - xscale = s - } - yscale := abs(d2s[3]) - if s := abs(d2s[4]); yscale < s { - yscale = s - } - - // sr is the source pixels. If it extends beyond the src bounds, - // we cannot use the type-specific fast paths, as they access - // the Pix fields directly without bounds checking. - // - // Similarly, the fast paths assume that the masks are nil. - if o.DstMask != nil || o.SrcMask != nil || !sr.In(src.Bounds()) { - switch op { - case Over: - q.transform_Image_Image_Over(dst, dr, adr, &d2s, src, sr, bias, xscale, yscale, &o) - case Src: - q.transform_Image_Image_Src(dst, dr, adr, &d2s, src, sr, bias, xscale, yscale, &o) - } - } else { - switch op { - case Over: - switch dst := dst.(type) { - case *image.RGBA: - switch src := src.(type) { - case *image.NRGBA: - q.transform_RGBA_NRGBA_Over(dst, dr, adr, &d2s, src, sr, bias, xscale, yscale, &o) - case *image.RGBA: - q.transform_RGBA_RGBA_Over(dst, dr, adr, &d2s, src, sr, bias, xscale, yscale, &o) - default: - q.transform_RGBA_Image_Over(dst, dr, adr, &d2s, src, sr, bias, xscale, yscale, &o) - } - default: - switch src := src.(type) { - default: - q.transform_Image_Image_Over(dst, dr, adr, &d2s, src, sr, bias, xscale, yscale, &o) - } - } - case Src: - switch dst := dst.(type) { - case *image.RGBA: - switch src := src.(type) { - case *image.Gray: - q.transform_RGBA_Gray_Src(dst, dr, adr, &d2s, src, sr, bias, xscale, yscale, &o) - case *image.NRGBA: - q.transform_RGBA_NRGBA_Src(dst, dr, adr, &d2s, src, sr, bias, xscale, yscale, &o) - case *image.RGBA: - q.transform_RGBA_RGBA_Src(dst, dr, adr, &d2s, src, sr, bias, xscale, yscale, &o) - case *image.YCbCr: - switch src.SubsampleRatio { - default: - q.transform_RGBA_Image_Src(dst, dr, adr, &d2s, src, sr, bias, xscale, yscale, &o) - case image.YCbCrSubsampleRatio444: - q.transform_RGBA_YCbCr444_Src(dst, dr, adr, &d2s, src, sr, bias, xscale, yscale, &o) - case image.YCbCrSubsampleRatio422: - q.transform_RGBA_YCbCr422_Src(dst, dr, adr, &d2s, src, sr, bias, xscale, yscale, &o) - case image.YCbCrSubsampleRatio420: - q.transform_RGBA_YCbCr420_Src(dst, dr, adr, &d2s, src, sr, bias, xscale, yscale, &o) - case image.YCbCrSubsampleRatio440: - q.transform_RGBA_YCbCr440_Src(dst, dr, adr, &d2s, src, sr, bias, xscale, yscale, &o) - } - default: - q.transform_RGBA_Image_Src(dst, dr, adr, &d2s, src, sr, bias, xscale, yscale, &o) - } - default: - switch src := src.(type) { - default: - q.transform_Image_Image_Src(dst, dr, adr, &d2s, src, sr, bias, xscale, yscale, &o) - } - } - } - } -} - -func (z *kernelScaler) scaleX_Gray(tmp [][4]float64, src *image.Gray, sr image.Rectangle, opts *Options) { - t := 0 - for y := int32(0); y < z.sh; y++ { - for _, s := range z.horizontal.sources { - var pr float64 - for _, c := range z.horizontal.contribs[s.i:s.j] { - pi := (sr.Min.Y+int(y)-src.Rect.Min.Y)*src.Stride + (sr.Min.X + int(c.coord) - src.Rect.Min.X) - pru := uint32(src.Pix[pi]) * 0x101 - pr += float64(pru) * c.weight - } - pr *= s.invTotalWeightFFFF - tmp[t] = [4]float64{ - pr, - pr, - pr, - 1, - } - t++ - } - } -} - -func (z *kernelScaler) scaleX_NRGBA(tmp [][4]float64, src *image.NRGBA, sr image.Rectangle, opts *Options) { - t := 0 - for y := int32(0); y < z.sh; y++ { - for _, s := range z.horizontal.sources { - var pr, pg, pb, pa float64 - for _, c := range z.horizontal.contribs[s.i:s.j] { - pi := (sr.Min.Y+int(y)-src.Rect.Min.Y)*src.Stride + (sr.Min.X+int(c.coord)-src.Rect.Min.X)*4 - pau := uint32(src.Pix[pi+3]) * 0x101 - pru := uint32(src.Pix[pi+0]) * pau / 0xff - pgu := uint32(src.Pix[pi+1]) * pau / 0xff - pbu := uint32(src.Pix[pi+2]) * pau / 0xff - pr += float64(pru) * c.weight - pg += float64(pgu) * c.weight - pb += float64(pbu) * c.weight - pa += float64(pau) * c.weight - } - tmp[t] = [4]float64{ - pr * s.invTotalWeightFFFF, - pg * s.invTotalWeightFFFF, - pb * s.invTotalWeightFFFF, - pa * s.invTotalWeightFFFF, - } - t++ - } - } -} - -func (z *kernelScaler) scaleX_RGBA(tmp [][4]float64, src *image.RGBA, sr image.Rectangle, opts *Options) { - t := 0 - for y := int32(0); y < z.sh; y++ { - for _, s := range z.horizontal.sources { - var pr, pg, pb, pa float64 - for _, c := range z.horizontal.contribs[s.i:s.j] { - pi := (sr.Min.Y+int(y)-src.Rect.Min.Y)*src.Stride + (sr.Min.X+int(c.coord)-src.Rect.Min.X)*4 - pru := uint32(src.Pix[pi+0]) * 0x101 - pgu := uint32(src.Pix[pi+1]) * 0x101 - pbu := uint32(src.Pix[pi+2]) * 0x101 - pau := uint32(src.Pix[pi+3]) * 0x101 - pr += float64(pru) * c.weight - pg += float64(pgu) * c.weight - pb += float64(pbu) * c.weight - pa += float64(pau) * c.weight - } - tmp[t] = [4]float64{ - pr * s.invTotalWeightFFFF, - pg * s.invTotalWeightFFFF, - pb * s.invTotalWeightFFFF, - pa * s.invTotalWeightFFFF, - } - t++ - } - } -} - -func (z *kernelScaler) scaleX_YCbCr444(tmp [][4]float64, src *image.YCbCr, sr image.Rectangle, opts *Options) { - t := 0 - for y := int32(0); y < z.sh; y++ { - for _, s := range z.horizontal.sources { - var pr, pg, pb float64 - for _, c := range z.horizontal.contribs[s.i:s.j] { - pi := (sr.Min.Y+int(y)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(c.coord) - src.Rect.Min.X) - pj := (sr.Min.Y+int(y)-src.Rect.Min.Y)*src.CStride + (sr.Min.X + int(c.coord) - src.Rect.Min.X) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - pyy1 := int(src.Y[pi]) * 0x10101 - pcb1 := int(src.Cb[pj]) - 128 - pcr1 := int(src.Cr[pj]) - 128 - pru := (pyy1 + 91881*pcr1) >> 8 - pgu := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 8 - pbu := (pyy1 + 116130*pcb1) >> 8 - if pru < 0 { - pru = 0 - } else if pru > 0xffff { - pru = 0xffff - } - if pgu < 0 { - pgu = 0 - } else if pgu > 0xffff { - pgu = 0xffff - } - if pbu < 0 { - pbu = 0 - } else if pbu > 0xffff { - pbu = 0xffff - } - - pr += float64(pru) * c.weight - pg += float64(pgu) * c.weight - pb += float64(pbu) * c.weight - } - tmp[t] = [4]float64{ - pr * s.invTotalWeightFFFF, - pg * s.invTotalWeightFFFF, - pb * s.invTotalWeightFFFF, - 1, - } - t++ - } - } -} - -func (z *kernelScaler) scaleX_YCbCr422(tmp [][4]float64, src *image.YCbCr, sr image.Rectangle, opts *Options) { - t := 0 - for y := int32(0); y < z.sh; y++ { - for _, s := range z.horizontal.sources { - var pr, pg, pb float64 - for _, c := range z.horizontal.contribs[s.i:s.j] { - pi := (sr.Min.Y+int(y)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(c.coord) - src.Rect.Min.X) - pj := (sr.Min.Y+int(y)-src.Rect.Min.Y)*src.CStride + ((sr.Min.X+int(c.coord))/2 - src.Rect.Min.X/2) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - pyy1 := int(src.Y[pi]) * 0x10101 - pcb1 := int(src.Cb[pj]) - 128 - pcr1 := int(src.Cr[pj]) - 128 - pru := (pyy1 + 91881*pcr1) >> 8 - pgu := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 8 - pbu := (pyy1 + 116130*pcb1) >> 8 - if pru < 0 { - pru = 0 - } else if pru > 0xffff { - pru = 0xffff - } - if pgu < 0 { - pgu = 0 - } else if pgu > 0xffff { - pgu = 0xffff - } - if pbu < 0 { - pbu = 0 - } else if pbu > 0xffff { - pbu = 0xffff - } - - pr += float64(pru) * c.weight - pg += float64(pgu) * c.weight - pb += float64(pbu) * c.weight - } - tmp[t] = [4]float64{ - pr * s.invTotalWeightFFFF, - pg * s.invTotalWeightFFFF, - pb * s.invTotalWeightFFFF, - 1, - } - t++ - } - } -} - -func (z *kernelScaler) scaleX_YCbCr420(tmp [][4]float64, src *image.YCbCr, sr image.Rectangle, opts *Options) { - t := 0 - for y := int32(0); y < z.sh; y++ { - for _, s := range z.horizontal.sources { - var pr, pg, pb float64 - for _, c := range z.horizontal.contribs[s.i:s.j] { - pi := (sr.Min.Y+int(y)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(c.coord) - src.Rect.Min.X) - pj := ((sr.Min.Y+int(y))/2-src.Rect.Min.Y/2)*src.CStride + ((sr.Min.X+int(c.coord))/2 - src.Rect.Min.X/2) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - pyy1 := int(src.Y[pi]) * 0x10101 - pcb1 := int(src.Cb[pj]) - 128 - pcr1 := int(src.Cr[pj]) - 128 - pru := (pyy1 + 91881*pcr1) >> 8 - pgu := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 8 - pbu := (pyy1 + 116130*pcb1) >> 8 - if pru < 0 { - pru = 0 - } else if pru > 0xffff { - pru = 0xffff - } - if pgu < 0 { - pgu = 0 - } else if pgu > 0xffff { - pgu = 0xffff - } - if pbu < 0 { - pbu = 0 - } else if pbu > 0xffff { - pbu = 0xffff - } - - pr += float64(pru) * c.weight - pg += float64(pgu) * c.weight - pb += float64(pbu) * c.weight - } - tmp[t] = [4]float64{ - pr * s.invTotalWeightFFFF, - pg * s.invTotalWeightFFFF, - pb * s.invTotalWeightFFFF, - 1, - } - t++ - } - } -} - -func (z *kernelScaler) scaleX_YCbCr440(tmp [][4]float64, src *image.YCbCr, sr image.Rectangle, opts *Options) { - t := 0 - for y := int32(0); y < z.sh; y++ { - for _, s := range z.horizontal.sources { - var pr, pg, pb float64 - for _, c := range z.horizontal.contribs[s.i:s.j] { - pi := (sr.Min.Y+int(y)-src.Rect.Min.Y)*src.YStride + (sr.Min.X + int(c.coord) - src.Rect.Min.X) - pj := ((sr.Min.Y+int(y))/2-src.Rect.Min.Y/2)*src.CStride + (sr.Min.X + int(c.coord) - src.Rect.Min.X) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - pyy1 := int(src.Y[pi]) * 0x10101 - pcb1 := int(src.Cb[pj]) - 128 - pcr1 := int(src.Cr[pj]) - 128 - pru := (pyy1 + 91881*pcr1) >> 8 - pgu := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 8 - pbu := (pyy1 + 116130*pcb1) >> 8 - if pru < 0 { - pru = 0 - } else if pru > 0xffff { - pru = 0xffff - } - if pgu < 0 { - pgu = 0 - } else if pgu > 0xffff { - pgu = 0xffff - } - if pbu < 0 { - pbu = 0 - } else if pbu > 0xffff { - pbu = 0xffff - } - - pr += float64(pru) * c.weight - pg += float64(pgu) * c.weight - pb += float64(pbu) * c.weight - } - tmp[t] = [4]float64{ - pr * s.invTotalWeightFFFF, - pg * s.invTotalWeightFFFF, - pb * s.invTotalWeightFFFF, - 1, - } - t++ - } - } -} - -func (z *kernelScaler) scaleX_Image(tmp [][4]float64, src image.Image, sr image.Rectangle, opts *Options) { - t := 0 - srcMask, smp := opts.SrcMask, opts.SrcMaskP - for y := int32(0); y < z.sh; y++ { - for _, s := range z.horizontal.sources { - var pr, pg, pb, pa float64 - for _, c := range z.horizontal.contribs[s.i:s.j] { - pru, pgu, pbu, pau := src.At(sr.Min.X+int(c.coord), sr.Min.Y+int(y)).RGBA() - if srcMask != nil { - _, _, _, ma := srcMask.At(smp.X+sr.Min.X+int(c.coord), smp.Y+sr.Min.Y+int(y)).RGBA() - pru = pru * ma / 0xffff - pgu = pgu * ma / 0xffff - pbu = pbu * ma / 0xffff - pau = pau * ma / 0xffff - } - pr += float64(pru) * c.weight - pg += float64(pgu) * c.weight - pb += float64(pbu) * c.weight - pa += float64(pau) * c.weight - } - tmp[t] = [4]float64{ - pr * s.invTotalWeightFFFF, - pg * s.invTotalWeightFFFF, - pb * s.invTotalWeightFFFF, - pa * s.invTotalWeightFFFF, - } - t++ - } - } -} - -func (z *kernelScaler) scaleY_RGBA_Over(dst *image.RGBA, dr, adr image.Rectangle, tmp [][4]float64, opts *Options) { - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx++ { - d := (dr.Min.Y+adr.Min.Y-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+int(dx)-dst.Rect.Min.X)*4 - for _, s := range z.vertical.sources[adr.Min.Y:adr.Max.Y] { - var pr, pg, pb, pa float64 - for _, c := range z.vertical.contribs[s.i:s.j] { - p := &tmp[c.coord*z.dw+dx] - pr += p[0] * c.weight - pg += p[1] * c.weight - pb += p[2] * c.weight - pa += p[3] * c.weight - } - - if pr > pa { - pr = pa - } - if pg > pa { - pg = pa - } - if pb > pa { - pb = pa - } - - pr0 := uint32(ftou(pr * s.invTotalWeight)) - pg0 := uint32(ftou(pg * s.invTotalWeight)) - pb0 := uint32(ftou(pb * s.invTotalWeight)) - pa0 := uint32(ftou(pa * s.invTotalWeight)) - pa1 := (0xffff - uint32(pa0)) * 0x101 - dst.Pix[d+0] = uint8((uint32(dst.Pix[d+0])*pa1/0xffff + pr0) >> 8) - dst.Pix[d+1] = uint8((uint32(dst.Pix[d+1])*pa1/0xffff + pg0) >> 8) - dst.Pix[d+2] = uint8((uint32(dst.Pix[d+2])*pa1/0xffff + pb0) >> 8) - dst.Pix[d+3] = uint8((uint32(dst.Pix[d+3])*pa1/0xffff + pa0) >> 8) - d += dst.Stride - } - } -} - -func (z *kernelScaler) scaleY_RGBA_Src(dst *image.RGBA, dr, adr image.Rectangle, tmp [][4]float64, opts *Options) { - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx++ { - d := (dr.Min.Y+adr.Min.Y-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+int(dx)-dst.Rect.Min.X)*4 - for _, s := range z.vertical.sources[adr.Min.Y:adr.Max.Y] { - var pr, pg, pb, pa float64 - for _, c := range z.vertical.contribs[s.i:s.j] { - p := &tmp[c.coord*z.dw+dx] - pr += p[0] * c.weight - pg += p[1] * c.weight - pb += p[2] * c.weight - pa += p[3] * c.weight - } - - if pr > pa { - pr = pa - } - if pg > pa { - pg = pa - } - if pb > pa { - pb = pa - } - - dst.Pix[d+0] = uint8(ftou(pr*s.invTotalWeight) >> 8) - dst.Pix[d+1] = uint8(ftou(pg*s.invTotalWeight) >> 8) - dst.Pix[d+2] = uint8(ftou(pb*s.invTotalWeight) >> 8) - dst.Pix[d+3] = uint8(ftou(pa*s.invTotalWeight) >> 8) - d += dst.Stride - } - } -} - -func (z *kernelScaler) scaleY_Image_Over(dst Image, dr, adr image.Rectangle, tmp [][4]float64, opts *Options) { - dstMask, dmp := opts.DstMask, opts.DstMaskP - dstColorRGBA64 := &color.RGBA64{} - dstColor := color.Color(dstColorRGBA64) - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx++ { - for dy, s := range z.vertical.sources[adr.Min.Y:adr.Max.Y] { - var pr, pg, pb, pa float64 - for _, c := range z.vertical.contribs[s.i:s.j] { - p := &tmp[c.coord*z.dw+dx] - pr += p[0] * c.weight - pg += p[1] * c.weight - pb += p[2] * c.weight - pa += p[3] * c.weight - } - - if pr > pa { - pr = pa - } - if pg > pa { - pg = pa - } - if pb > pa { - pb = pa - } - - qr, qg, qb, qa := dst.At(dr.Min.X+int(dx), dr.Min.Y+int(adr.Min.Y+dy)).RGBA() - pr0 := uint32(ftou(pr * s.invTotalWeight)) - pg0 := uint32(ftou(pg * s.invTotalWeight)) - pb0 := uint32(ftou(pb * s.invTotalWeight)) - pa0 := uint32(ftou(pa * s.invTotalWeight)) - if dstMask != nil { - _, _, _, ma := dstMask.At(dmp.X+dr.Min.X+int(dx), dmp.Y+dr.Min.Y+int(adr.Min.Y+dy)).RGBA() - pr0 = pr0 * ma / 0xffff - pg0 = pg0 * ma / 0xffff - pb0 = pb0 * ma / 0xffff - pa0 = pa0 * ma / 0xffff - } - pa1 := 0xffff - pa0 - dstColorRGBA64.R = uint16(qr*pa1/0xffff + pr0) - dstColorRGBA64.G = uint16(qg*pa1/0xffff + pg0) - dstColorRGBA64.B = uint16(qb*pa1/0xffff + pb0) - dstColorRGBA64.A = uint16(qa*pa1/0xffff + pa0) - dst.Set(dr.Min.X+int(dx), dr.Min.Y+int(adr.Min.Y+dy), dstColor) - } - } -} - -func (z *kernelScaler) scaleY_Image_Src(dst Image, dr, adr image.Rectangle, tmp [][4]float64, opts *Options) { - dstMask, dmp := opts.DstMask, opts.DstMaskP - dstColorRGBA64 := &color.RGBA64{} - dstColor := color.Color(dstColorRGBA64) - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx++ { - for dy, s := range z.vertical.sources[adr.Min.Y:adr.Max.Y] { - var pr, pg, pb, pa float64 - for _, c := range z.vertical.contribs[s.i:s.j] { - p := &tmp[c.coord*z.dw+dx] - pr += p[0] * c.weight - pg += p[1] * c.weight - pb += p[2] * c.weight - pa += p[3] * c.weight - } - - if pr > pa { - pr = pa - } - if pg > pa { - pg = pa - } - if pb > pa { - pb = pa - } - - if dstMask != nil { - qr, qg, qb, qa := dst.At(dr.Min.X+int(dx), dr.Min.Y+int(adr.Min.Y+dy)).RGBA() - _, _, _, ma := dstMask.At(dmp.X+dr.Min.X+int(dx), dmp.Y+dr.Min.Y+int(adr.Min.Y+dy)).RGBA() - pr := uint32(ftou(pr*s.invTotalWeight)) * ma / 0xffff - pg := uint32(ftou(pg*s.invTotalWeight)) * ma / 0xffff - pb := uint32(ftou(pb*s.invTotalWeight)) * ma / 0xffff - pa := uint32(ftou(pa*s.invTotalWeight)) * ma / 0xffff - pa1 := 0xffff - ma - dstColorRGBA64.R = uint16(qr*pa1/0xffff + pr) - dstColorRGBA64.G = uint16(qg*pa1/0xffff + pg) - dstColorRGBA64.B = uint16(qb*pa1/0xffff + pb) - dstColorRGBA64.A = uint16(qa*pa1/0xffff + pa) - dst.Set(dr.Min.X+int(dx), dr.Min.Y+int(adr.Min.Y+dy), dstColor) - } else { - dstColorRGBA64.R = ftou(pr * s.invTotalWeight) - dstColorRGBA64.G = ftou(pg * s.invTotalWeight) - dstColorRGBA64.B = ftou(pb * s.invTotalWeight) - dstColorRGBA64.A = ftou(pa * s.invTotalWeight) - dst.Set(dr.Min.X+int(dx), dr.Min.Y+int(adr.Min.Y+dy), dstColor) - } - } - } -} - -func (q *Kernel) transform_RGBA_Gray_Src(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src *image.Gray, sr image.Rectangle, bias image.Point, xscale, yscale float64, opts *Options) { - // When shrinking, broaden the effective kernel support so that we still - // visit every source pixel. - xHalfWidth, xKernelArgScale := q.Support, 1.0 - if xscale > 1 { - xHalfWidth *= xscale - xKernelArgScale = 1 / xscale - } - yHalfWidth, yKernelArgScale := q.Support, 1.0 - if yscale > 1 { - yHalfWidth *= yscale - yKernelArgScale = 1 / yscale - } - - xWeights := make([]float64, 1+2*int(math.Ceil(xHalfWidth))) - yWeights := make([]float64, 1+2*int(math.Ceil(yHalfWidth))) - - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx := d2s[0]*dxf + d2s[1]*dyf + d2s[2] - sy := d2s[3]*dxf + d2s[4]*dyf + d2s[5] - if !(image.Point{int(sx) + bias.X, int(sy) + bias.Y}).In(sr) { - continue - } - - // TODO: adjust the bias so that we can use int(f) instead - // of math.Floor(f) and math.Ceil(f). - sx += float64(bias.X) - sx -= 0.5 - ix := int(math.Floor(sx - xHalfWidth)) - if ix < sr.Min.X { - ix = sr.Min.X - } - jx := int(math.Ceil(sx + xHalfWidth)) - if jx > sr.Max.X { - jx = sr.Max.X - } - - totalXWeight := 0.0 - for kx := ix; kx < jx; kx++ { - xWeight := 0.0 - if t := abs((sx - float64(kx)) * xKernelArgScale); t < q.Support { - xWeight = q.At(t) - } - xWeights[kx-ix] = xWeight - totalXWeight += xWeight - } - for x := range xWeights[:jx-ix] { - xWeights[x] /= totalXWeight - } - - sy += float64(bias.Y) - sy -= 0.5 - iy := int(math.Floor(sy - yHalfWidth)) - if iy < sr.Min.Y { - iy = sr.Min.Y - } - jy := int(math.Ceil(sy + yHalfWidth)) - if jy > sr.Max.Y { - jy = sr.Max.Y - } - - totalYWeight := 0.0 - for ky := iy; ky < jy; ky++ { - yWeight := 0.0 - if t := abs((sy - float64(ky)) * yKernelArgScale); t < q.Support { - yWeight = q.At(t) - } - yWeights[ky-iy] = yWeight - totalYWeight += yWeight - } - for y := range yWeights[:jy-iy] { - yWeights[y] /= totalYWeight - } - - var pr float64 - for ky := iy; ky < jy; ky++ { - if yWeight := yWeights[ky-iy]; yWeight != 0 { - for kx := ix; kx < jx; kx++ { - if w := xWeights[kx-ix] * yWeight; w != 0 { - pi := (ky-src.Rect.Min.Y)*src.Stride + (kx - src.Rect.Min.X) - pru := uint32(src.Pix[pi]) * 0x101 - pr += float64(pru) * w - } - } - } - } - out := uint8(fffftou(pr) >> 8) - dst.Pix[d+0] = out - dst.Pix[d+1] = out - dst.Pix[d+2] = out - dst.Pix[d+3] = 0xff - } - } -} - -func (q *Kernel) transform_RGBA_NRGBA_Over(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src *image.NRGBA, sr image.Rectangle, bias image.Point, xscale, yscale float64, opts *Options) { - // When shrinking, broaden the effective kernel support so that we still - // visit every source pixel. - xHalfWidth, xKernelArgScale := q.Support, 1.0 - if xscale > 1 { - xHalfWidth *= xscale - xKernelArgScale = 1 / xscale - } - yHalfWidth, yKernelArgScale := q.Support, 1.0 - if yscale > 1 { - yHalfWidth *= yscale - yKernelArgScale = 1 / yscale - } - - xWeights := make([]float64, 1+2*int(math.Ceil(xHalfWidth))) - yWeights := make([]float64, 1+2*int(math.Ceil(yHalfWidth))) - - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx := d2s[0]*dxf + d2s[1]*dyf + d2s[2] - sy := d2s[3]*dxf + d2s[4]*dyf + d2s[5] - if !(image.Point{int(sx) + bias.X, int(sy) + bias.Y}).In(sr) { - continue - } - - // TODO: adjust the bias so that we can use int(f) instead - // of math.Floor(f) and math.Ceil(f). - sx += float64(bias.X) - sx -= 0.5 - ix := int(math.Floor(sx - xHalfWidth)) - if ix < sr.Min.X { - ix = sr.Min.X - } - jx := int(math.Ceil(sx + xHalfWidth)) - if jx > sr.Max.X { - jx = sr.Max.X - } - - totalXWeight := 0.0 - for kx := ix; kx < jx; kx++ { - xWeight := 0.0 - if t := abs((sx - float64(kx)) * xKernelArgScale); t < q.Support { - xWeight = q.At(t) - } - xWeights[kx-ix] = xWeight - totalXWeight += xWeight - } - for x := range xWeights[:jx-ix] { - xWeights[x] /= totalXWeight - } - - sy += float64(bias.Y) - sy -= 0.5 - iy := int(math.Floor(sy - yHalfWidth)) - if iy < sr.Min.Y { - iy = sr.Min.Y - } - jy := int(math.Ceil(sy + yHalfWidth)) - if jy > sr.Max.Y { - jy = sr.Max.Y - } - - totalYWeight := 0.0 - for ky := iy; ky < jy; ky++ { - yWeight := 0.0 - if t := abs((sy - float64(ky)) * yKernelArgScale); t < q.Support { - yWeight = q.At(t) - } - yWeights[ky-iy] = yWeight - totalYWeight += yWeight - } - for y := range yWeights[:jy-iy] { - yWeights[y] /= totalYWeight - } - - var pr, pg, pb, pa float64 - for ky := iy; ky < jy; ky++ { - if yWeight := yWeights[ky-iy]; yWeight != 0 { - for kx := ix; kx < jx; kx++ { - if w := xWeights[kx-ix] * yWeight; w != 0 { - pi := (ky-src.Rect.Min.Y)*src.Stride + (kx-src.Rect.Min.X)*4 - pau := uint32(src.Pix[pi+3]) * 0x101 - pru := uint32(src.Pix[pi+0]) * pau / 0xff - pgu := uint32(src.Pix[pi+1]) * pau / 0xff - pbu := uint32(src.Pix[pi+2]) * pau / 0xff - pr += float64(pru) * w - pg += float64(pgu) * w - pb += float64(pbu) * w - pa += float64(pau) * w - } - } - } - } - - if pr > pa { - pr = pa - } - if pg > pa { - pg = pa - } - if pb > pa { - pb = pa - } - - pr0 := uint32(fffftou(pr)) - pg0 := uint32(fffftou(pg)) - pb0 := uint32(fffftou(pb)) - pa0 := uint32(fffftou(pa)) - pa1 := (0xffff - uint32(pa0)) * 0x101 - dst.Pix[d+0] = uint8((uint32(dst.Pix[d+0])*pa1/0xffff + pr0) >> 8) - dst.Pix[d+1] = uint8((uint32(dst.Pix[d+1])*pa1/0xffff + pg0) >> 8) - dst.Pix[d+2] = uint8((uint32(dst.Pix[d+2])*pa1/0xffff + pb0) >> 8) - dst.Pix[d+3] = uint8((uint32(dst.Pix[d+3])*pa1/0xffff + pa0) >> 8) - } - } -} - -func (q *Kernel) transform_RGBA_NRGBA_Src(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src *image.NRGBA, sr image.Rectangle, bias image.Point, xscale, yscale float64, opts *Options) { - // When shrinking, broaden the effective kernel support so that we still - // visit every source pixel. - xHalfWidth, xKernelArgScale := q.Support, 1.0 - if xscale > 1 { - xHalfWidth *= xscale - xKernelArgScale = 1 / xscale - } - yHalfWidth, yKernelArgScale := q.Support, 1.0 - if yscale > 1 { - yHalfWidth *= yscale - yKernelArgScale = 1 / yscale - } - - xWeights := make([]float64, 1+2*int(math.Ceil(xHalfWidth))) - yWeights := make([]float64, 1+2*int(math.Ceil(yHalfWidth))) - - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx := d2s[0]*dxf + d2s[1]*dyf + d2s[2] - sy := d2s[3]*dxf + d2s[4]*dyf + d2s[5] - if !(image.Point{int(sx) + bias.X, int(sy) + bias.Y}).In(sr) { - continue - } - - // TODO: adjust the bias so that we can use int(f) instead - // of math.Floor(f) and math.Ceil(f). - sx += float64(bias.X) - sx -= 0.5 - ix := int(math.Floor(sx - xHalfWidth)) - if ix < sr.Min.X { - ix = sr.Min.X - } - jx := int(math.Ceil(sx + xHalfWidth)) - if jx > sr.Max.X { - jx = sr.Max.X - } - - totalXWeight := 0.0 - for kx := ix; kx < jx; kx++ { - xWeight := 0.0 - if t := abs((sx - float64(kx)) * xKernelArgScale); t < q.Support { - xWeight = q.At(t) - } - xWeights[kx-ix] = xWeight - totalXWeight += xWeight - } - for x := range xWeights[:jx-ix] { - xWeights[x] /= totalXWeight - } - - sy += float64(bias.Y) - sy -= 0.5 - iy := int(math.Floor(sy - yHalfWidth)) - if iy < sr.Min.Y { - iy = sr.Min.Y - } - jy := int(math.Ceil(sy + yHalfWidth)) - if jy > sr.Max.Y { - jy = sr.Max.Y - } - - totalYWeight := 0.0 - for ky := iy; ky < jy; ky++ { - yWeight := 0.0 - if t := abs((sy - float64(ky)) * yKernelArgScale); t < q.Support { - yWeight = q.At(t) - } - yWeights[ky-iy] = yWeight - totalYWeight += yWeight - } - for y := range yWeights[:jy-iy] { - yWeights[y] /= totalYWeight - } - - var pr, pg, pb, pa float64 - for ky := iy; ky < jy; ky++ { - if yWeight := yWeights[ky-iy]; yWeight != 0 { - for kx := ix; kx < jx; kx++ { - if w := xWeights[kx-ix] * yWeight; w != 0 { - pi := (ky-src.Rect.Min.Y)*src.Stride + (kx-src.Rect.Min.X)*4 - pau := uint32(src.Pix[pi+3]) * 0x101 - pru := uint32(src.Pix[pi+0]) * pau / 0xff - pgu := uint32(src.Pix[pi+1]) * pau / 0xff - pbu := uint32(src.Pix[pi+2]) * pau / 0xff - pr += float64(pru) * w - pg += float64(pgu) * w - pb += float64(pbu) * w - pa += float64(pau) * w - } - } - } - } - - if pr > pa { - pr = pa - } - if pg > pa { - pg = pa - } - if pb > pa { - pb = pa - } - - dst.Pix[d+0] = uint8(fffftou(pr) >> 8) - dst.Pix[d+1] = uint8(fffftou(pg) >> 8) - dst.Pix[d+2] = uint8(fffftou(pb) >> 8) - dst.Pix[d+3] = uint8(fffftou(pa) >> 8) - } - } -} - -func (q *Kernel) transform_RGBA_RGBA_Over(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src *image.RGBA, sr image.Rectangle, bias image.Point, xscale, yscale float64, opts *Options) { - // When shrinking, broaden the effective kernel support so that we still - // visit every source pixel. - xHalfWidth, xKernelArgScale := q.Support, 1.0 - if xscale > 1 { - xHalfWidth *= xscale - xKernelArgScale = 1 / xscale - } - yHalfWidth, yKernelArgScale := q.Support, 1.0 - if yscale > 1 { - yHalfWidth *= yscale - yKernelArgScale = 1 / yscale - } - - xWeights := make([]float64, 1+2*int(math.Ceil(xHalfWidth))) - yWeights := make([]float64, 1+2*int(math.Ceil(yHalfWidth))) - - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx := d2s[0]*dxf + d2s[1]*dyf + d2s[2] - sy := d2s[3]*dxf + d2s[4]*dyf + d2s[5] - if !(image.Point{int(sx) + bias.X, int(sy) + bias.Y}).In(sr) { - continue - } - - // TODO: adjust the bias so that we can use int(f) instead - // of math.Floor(f) and math.Ceil(f). - sx += float64(bias.X) - sx -= 0.5 - ix := int(math.Floor(sx - xHalfWidth)) - if ix < sr.Min.X { - ix = sr.Min.X - } - jx := int(math.Ceil(sx + xHalfWidth)) - if jx > sr.Max.X { - jx = sr.Max.X - } - - totalXWeight := 0.0 - for kx := ix; kx < jx; kx++ { - xWeight := 0.0 - if t := abs((sx - float64(kx)) * xKernelArgScale); t < q.Support { - xWeight = q.At(t) - } - xWeights[kx-ix] = xWeight - totalXWeight += xWeight - } - for x := range xWeights[:jx-ix] { - xWeights[x] /= totalXWeight - } - - sy += float64(bias.Y) - sy -= 0.5 - iy := int(math.Floor(sy - yHalfWidth)) - if iy < sr.Min.Y { - iy = sr.Min.Y - } - jy := int(math.Ceil(sy + yHalfWidth)) - if jy > sr.Max.Y { - jy = sr.Max.Y - } - - totalYWeight := 0.0 - for ky := iy; ky < jy; ky++ { - yWeight := 0.0 - if t := abs((sy - float64(ky)) * yKernelArgScale); t < q.Support { - yWeight = q.At(t) - } - yWeights[ky-iy] = yWeight - totalYWeight += yWeight - } - for y := range yWeights[:jy-iy] { - yWeights[y] /= totalYWeight - } - - var pr, pg, pb, pa float64 - for ky := iy; ky < jy; ky++ { - if yWeight := yWeights[ky-iy]; yWeight != 0 { - for kx := ix; kx < jx; kx++ { - if w := xWeights[kx-ix] * yWeight; w != 0 { - pi := (ky-src.Rect.Min.Y)*src.Stride + (kx-src.Rect.Min.X)*4 - pru := uint32(src.Pix[pi+0]) * 0x101 - pgu := uint32(src.Pix[pi+1]) * 0x101 - pbu := uint32(src.Pix[pi+2]) * 0x101 - pau := uint32(src.Pix[pi+3]) * 0x101 - pr += float64(pru) * w - pg += float64(pgu) * w - pb += float64(pbu) * w - pa += float64(pau) * w - } - } - } - } - - if pr > pa { - pr = pa - } - if pg > pa { - pg = pa - } - if pb > pa { - pb = pa - } - - pr0 := uint32(fffftou(pr)) - pg0 := uint32(fffftou(pg)) - pb0 := uint32(fffftou(pb)) - pa0 := uint32(fffftou(pa)) - pa1 := (0xffff - uint32(pa0)) * 0x101 - dst.Pix[d+0] = uint8((uint32(dst.Pix[d+0])*pa1/0xffff + pr0) >> 8) - dst.Pix[d+1] = uint8((uint32(dst.Pix[d+1])*pa1/0xffff + pg0) >> 8) - dst.Pix[d+2] = uint8((uint32(dst.Pix[d+2])*pa1/0xffff + pb0) >> 8) - dst.Pix[d+3] = uint8((uint32(dst.Pix[d+3])*pa1/0xffff + pa0) >> 8) - } - } -} - -func (q *Kernel) transform_RGBA_RGBA_Src(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src *image.RGBA, sr image.Rectangle, bias image.Point, xscale, yscale float64, opts *Options) { - // When shrinking, broaden the effective kernel support so that we still - // visit every source pixel. - xHalfWidth, xKernelArgScale := q.Support, 1.0 - if xscale > 1 { - xHalfWidth *= xscale - xKernelArgScale = 1 / xscale - } - yHalfWidth, yKernelArgScale := q.Support, 1.0 - if yscale > 1 { - yHalfWidth *= yscale - yKernelArgScale = 1 / yscale - } - - xWeights := make([]float64, 1+2*int(math.Ceil(xHalfWidth))) - yWeights := make([]float64, 1+2*int(math.Ceil(yHalfWidth))) - - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx := d2s[0]*dxf + d2s[1]*dyf + d2s[2] - sy := d2s[3]*dxf + d2s[4]*dyf + d2s[5] - if !(image.Point{int(sx) + bias.X, int(sy) + bias.Y}).In(sr) { - continue - } - - // TODO: adjust the bias so that we can use int(f) instead - // of math.Floor(f) and math.Ceil(f). - sx += float64(bias.X) - sx -= 0.5 - ix := int(math.Floor(sx - xHalfWidth)) - if ix < sr.Min.X { - ix = sr.Min.X - } - jx := int(math.Ceil(sx + xHalfWidth)) - if jx > sr.Max.X { - jx = sr.Max.X - } - - totalXWeight := 0.0 - for kx := ix; kx < jx; kx++ { - xWeight := 0.0 - if t := abs((sx - float64(kx)) * xKernelArgScale); t < q.Support { - xWeight = q.At(t) - } - xWeights[kx-ix] = xWeight - totalXWeight += xWeight - } - for x := range xWeights[:jx-ix] { - xWeights[x] /= totalXWeight - } - - sy += float64(bias.Y) - sy -= 0.5 - iy := int(math.Floor(sy - yHalfWidth)) - if iy < sr.Min.Y { - iy = sr.Min.Y - } - jy := int(math.Ceil(sy + yHalfWidth)) - if jy > sr.Max.Y { - jy = sr.Max.Y - } - - totalYWeight := 0.0 - for ky := iy; ky < jy; ky++ { - yWeight := 0.0 - if t := abs((sy - float64(ky)) * yKernelArgScale); t < q.Support { - yWeight = q.At(t) - } - yWeights[ky-iy] = yWeight - totalYWeight += yWeight - } - for y := range yWeights[:jy-iy] { - yWeights[y] /= totalYWeight - } - - var pr, pg, pb, pa float64 - for ky := iy; ky < jy; ky++ { - if yWeight := yWeights[ky-iy]; yWeight != 0 { - for kx := ix; kx < jx; kx++ { - if w := xWeights[kx-ix] * yWeight; w != 0 { - pi := (ky-src.Rect.Min.Y)*src.Stride + (kx-src.Rect.Min.X)*4 - pru := uint32(src.Pix[pi+0]) * 0x101 - pgu := uint32(src.Pix[pi+1]) * 0x101 - pbu := uint32(src.Pix[pi+2]) * 0x101 - pau := uint32(src.Pix[pi+3]) * 0x101 - pr += float64(pru) * w - pg += float64(pgu) * w - pb += float64(pbu) * w - pa += float64(pau) * w - } - } - } - } - - if pr > pa { - pr = pa - } - if pg > pa { - pg = pa - } - if pb > pa { - pb = pa - } - - dst.Pix[d+0] = uint8(fffftou(pr) >> 8) - dst.Pix[d+1] = uint8(fffftou(pg) >> 8) - dst.Pix[d+2] = uint8(fffftou(pb) >> 8) - dst.Pix[d+3] = uint8(fffftou(pa) >> 8) - } - } -} - -func (q *Kernel) transform_RGBA_YCbCr444_Src(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src *image.YCbCr, sr image.Rectangle, bias image.Point, xscale, yscale float64, opts *Options) { - // When shrinking, broaden the effective kernel support so that we still - // visit every source pixel. - xHalfWidth, xKernelArgScale := q.Support, 1.0 - if xscale > 1 { - xHalfWidth *= xscale - xKernelArgScale = 1 / xscale - } - yHalfWidth, yKernelArgScale := q.Support, 1.0 - if yscale > 1 { - yHalfWidth *= yscale - yKernelArgScale = 1 / yscale - } - - xWeights := make([]float64, 1+2*int(math.Ceil(xHalfWidth))) - yWeights := make([]float64, 1+2*int(math.Ceil(yHalfWidth))) - - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx := d2s[0]*dxf + d2s[1]*dyf + d2s[2] - sy := d2s[3]*dxf + d2s[4]*dyf + d2s[5] - if !(image.Point{int(sx) + bias.X, int(sy) + bias.Y}).In(sr) { - continue - } - - // TODO: adjust the bias so that we can use int(f) instead - // of math.Floor(f) and math.Ceil(f). - sx += float64(bias.X) - sx -= 0.5 - ix := int(math.Floor(sx - xHalfWidth)) - if ix < sr.Min.X { - ix = sr.Min.X - } - jx := int(math.Ceil(sx + xHalfWidth)) - if jx > sr.Max.X { - jx = sr.Max.X - } - - totalXWeight := 0.0 - for kx := ix; kx < jx; kx++ { - xWeight := 0.0 - if t := abs((sx - float64(kx)) * xKernelArgScale); t < q.Support { - xWeight = q.At(t) - } - xWeights[kx-ix] = xWeight - totalXWeight += xWeight - } - for x := range xWeights[:jx-ix] { - xWeights[x] /= totalXWeight - } - - sy += float64(bias.Y) - sy -= 0.5 - iy := int(math.Floor(sy - yHalfWidth)) - if iy < sr.Min.Y { - iy = sr.Min.Y - } - jy := int(math.Ceil(sy + yHalfWidth)) - if jy > sr.Max.Y { - jy = sr.Max.Y - } - - totalYWeight := 0.0 - for ky := iy; ky < jy; ky++ { - yWeight := 0.0 - if t := abs((sy - float64(ky)) * yKernelArgScale); t < q.Support { - yWeight = q.At(t) - } - yWeights[ky-iy] = yWeight - totalYWeight += yWeight - } - for y := range yWeights[:jy-iy] { - yWeights[y] /= totalYWeight - } - - var pr, pg, pb float64 - for ky := iy; ky < jy; ky++ { - if yWeight := yWeights[ky-iy]; yWeight != 0 { - for kx := ix; kx < jx; kx++ { - if w := xWeights[kx-ix] * yWeight; w != 0 { - pi := (ky-src.Rect.Min.Y)*src.YStride + (kx - src.Rect.Min.X) - pj := (ky-src.Rect.Min.Y)*src.CStride + (kx - src.Rect.Min.X) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - pyy1 := int(src.Y[pi]) * 0x10101 - pcb1 := int(src.Cb[pj]) - 128 - pcr1 := int(src.Cr[pj]) - 128 - pru := (pyy1 + 91881*pcr1) >> 8 - pgu := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 8 - pbu := (pyy1 + 116130*pcb1) >> 8 - if pru < 0 { - pru = 0 - } else if pru > 0xffff { - pru = 0xffff - } - if pgu < 0 { - pgu = 0 - } else if pgu > 0xffff { - pgu = 0xffff - } - if pbu < 0 { - pbu = 0 - } else if pbu > 0xffff { - pbu = 0xffff - } - - pr += float64(pru) * w - pg += float64(pgu) * w - pb += float64(pbu) * w - } - } - } - } - dst.Pix[d+0] = uint8(fffftou(pr) >> 8) - dst.Pix[d+1] = uint8(fffftou(pg) >> 8) - dst.Pix[d+2] = uint8(fffftou(pb) >> 8) - dst.Pix[d+3] = 0xff - } - } -} - -func (q *Kernel) transform_RGBA_YCbCr422_Src(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src *image.YCbCr, sr image.Rectangle, bias image.Point, xscale, yscale float64, opts *Options) { - // When shrinking, broaden the effective kernel support so that we still - // visit every source pixel. - xHalfWidth, xKernelArgScale := q.Support, 1.0 - if xscale > 1 { - xHalfWidth *= xscale - xKernelArgScale = 1 / xscale - } - yHalfWidth, yKernelArgScale := q.Support, 1.0 - if yscale > 1 { - yHalfWidth *= yscale - yKernelArgScale = 1 / yscale - } - - xWeights := make([]float64, 1+2*int(math.Ceil(xHalfWidth))) - yWeights := make([]float64, 1+2*int(math.Ceil(yHalfWidth))) - - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx := d2s[0]*dxf + d2s[1]*dyf + d2s[2] - sy := d2s[3]*dxf + d2s[4]*dyf + d2s[5] - if !(image.Point{int(sx) + bias.X, int(sy) + bias.Y}).In(sr) { - continue - } - - // TODO: adjust the bias so that we can use int(f) instead - // of math.Floor(f) and math.Ceil(f). - sx += float64(bias.X) - sx -= 0.5 - ix := int(math.Floor(sx - xHalfWidth)) - if ix < sr.Min.X { - ix = sr.Min.X - } - jx := int(math.Ceil(sx + xHalfWidth)) - if jx > sr.Max.X { - jx = sr.Max.X - } - - totalXWeight := 0.0 - for kx := ix; kx < jx; kx++ { - xWeight := 0.0 - if t := abs((sx - float64(kx)) * xKernelArgScale); t < q.Support { - xWeight = q.At(t) - } - xWeights[kx-ix] = xWeight - totalXWeight += xWeight - } - for x := range xWeights[:jx-ix] { - xWeights[x] /= totalXWeight - } - - sy += float64(bias.Y) - sy -= 0.5 - iy := int(math.Floor(sy - yHalfWidth)) - if iy < sr.Min.Y { - iy = sr.Min.Y - } - jy := int(math.Ceil(sy + yHalfWidth)) - if jy > sr.Max.Y { - jy = sr.Max.Y - } - - totalYWeight := 0.0 - for ky := iy; ky < jy; ky++ { - yWeight := 0.0 - if t := abs((sy - float64(ky)) * yKernelArgScale); t < q.Support { - yWeight = q.At(t) - } - yWeights[ky-iy] = yWeight - totalYWeight += yWeight - } - for y := range yWeights[:jy-iy] { - yWeights[y] /= totalYWeight - } - - var pr, pg, pb float64 - for ky := iy; ky < jy; ky++ { - if yWeight := yWeights[ky-iy]; yWeight != 0 { - for kx := ix; kx < jx; kx++ { - if w := xWeights[kx-ix] * yWeight; w != 0 { - pi := (ky-src.Rect.Min.Y)*src.YStride + (kx - src.Rect.Min.X) - pj := (ky-src.Rect.Min.Y)*src.CStride + ((kx)/2 - src.Rect.Min.X/2) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - pyy1 := int(src.Y[pi]) * 0x10101 - pcb1 := int(src.Cb[pj]) - 128 - pcr1 := int(src.Cr[pj]) - 128 - pru := (pyy1 + 91881*pcr1) >> 8 - pgu := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 8 - pbu := (pyy1 + 116130*pcb1) >> 8 - if pru < 0 { - pru = 0 - } else if pru > 0xffff { - pru = 0xffff - } - if pgu < 0 { - pgu = 0 - } else if pgu > 0xffff { - pgu = 0xffff - } - if pbu < 0 { - pbu = 0 - } else if pbu > 0xffff { - pbu = 0xffff - } - - pr += float64(pru) * w - pg += float64(pgu) * w - pb += float64(pbu) * w - } - } - } - } - dst.Pix[d+0] = uint8(fffftou(pr) >> 8) - dst.Pix[d+1] = uint8(fffftou(pg) >> 8) - dst.Pix[d+2] = uint8(fffftou(pb) >> 8) - dst.Pix[d+3] = 0xff - } - } -} - -func (q *Kernel) transform_RGBA_YCbCr420_Src(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src *image.YCbCr, sr image.Rectangle, bias image.Point, xscale, yscale float64, opts *Options) { - // When shrinking, broaden the effective kernel support so that we still - // visit every source pixel. - xHalfWidth, xKernelArgScale := q.Support, 1.0 - if xscale > 1 { - xHalfWidth *= xscale - xKernelArgScale = 1 / xscale - } - yHalfWidth, yKernelArgScale := q.Support, 1.0 - if yscale > 1 { - yHalfWidth *= yscale - yKernelArgScale = 1 / yscale - } - - xWeights := make([]float64, 1+2*int(math.Ceil(xHalfWidth))) - yWeights := make([]float64, 1+2*int(math.Ceil(yHalfWidth))) - - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx := d2s[0]*dxf + d2s[1]*dyf + d2s[2] - sy := d2s[3]*dxf + d2s[4]*dyf + d2s[5] - if !(image.Point{int(sx) + bias.X, int(sy) + bias.Y}).In(sr) { - continue - } - - // TODO: adjust the bias so that we can use int(f) instead - // of math.Floor(f) and math.Ceil(f). - sx += float64(bias.X) - sx -= 0.5 - ix := int(math.Floor(sx - xHalfWidth)) - if ix < sr.Min.X { - ix = sr.Min.X - } - jx := int(math.Ceil(sx + xHalfWidth)) - if jx > sr.Max.X { - jx = sr.Max.X - } - - totalXWeight := 0.0 - for kx := ix; kx < jx; kx++ { - xWeight := 0.0 - if t := abs((sx - float64(kx)) * xKernelArgScale); t < q.Support { - xWeight = q.At(t) - } - xWeights[kx-ix] = xWeight - totalXWeight += xWeight - } - for x := range xWeights[:jx-ix] { - xWeights[x] /= totalXWeight - } - - sy += float64(bias.Y) - sy -= 0.5 - iy := int(math.Floor(sy - yHalfWidth)) - if iy < sr.Min.Y { - iy = sr.Min.Y - } - jy := int(math.Ceil(sy + yHalfWidth)) - if jy > sr.Max.Y { - jy = sr.Max.Y - } - - totalYWeight := 0.0 - for ky := iy; ky < jy; ky++ { - yWeight := 0.0 - if t := abs((sy - float64(ky)) * yKernelArgScale); t < q.Support { - yWeight = q.At(t) - } - yWeights[ky-iy] = yWeight - totalYWeight += yWeight - } - for y := range yWeights[:jy-iy] { - yWeights[y] /= totalYWeight - } - - var pr, pg, pb float64 - for ky := iy; ky < jy; ky++ { - if yWeight := yWeights[ky-iy]; yWeight != 0 { - for kx := ix; kx < jx; kx++ { - if w := xWeights[kx-ix] * yWeight; w != 0 { - pi := (ky-src.Rect.Min.Y)*src.YStride + (kx - src.Rect.Min.X) - pj := ((ky)/2-src.Rect.Min.Y/2)*src.CStride + ((kx)/2 - src.Rect.Min.X/2) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - pyy1 := int(src.Y[pi]) * 0x10101 - pcb1 := int(src.Cb[pj]) - 128 - pcr1 := int(src.Cr[pj]) - 128 - pru := (pyy1 + 91881*pcr1) >> 8 - pgu := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 8 - pbu := (pyy1 + 116130*pcb1) >> 8 - if pru < 0 { - pru = 0 - } else if pru > 0xffff { - pru = 0xffff - } - if pgu < 0 { - pgu = 0 - } else if pgu > 0xffff { - pgu = 0xffff - } - if pbu < 0 { - pbu = 0 - } else if pbu > 0xffff { - pbu = 0xffff - } - - pr += float64(pru) * w - pg += float64(pgu) * w - pb += float64(pbu) * w - } - } - } - } - dst.Pix[d+0] = uint8(fffftou(pr) >> 8) - dst.Pix[d+1] = uint8(fffftou(pg) >> 8) - dst.Pix[d+2] = uint8(fffftou(pb) >> 8) - dst.Pix[d+3] = 0xff - } - } -} - -func (q *Kernel) transform_RGBA_YCbCr440_Src(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src *image.YCbCr, sr image.Rectangle, bias image.Point, xscale, yscale float64, opts *Options) { - // When shrinking, broaden the effective kernel support so that we still - // visit every source pixel. - xHalfWidth, xKernelArgScale := q.Support, 1.0 - if xscale > 1 { - xHalfWidth *= xscale - xKernelArgScale = 1 / xscale - } - yHalfWidth, yKernelArgScale := q.Support, 1.0 - if yscale > 1 { - yHalfWidth *= yscale - yKernelArgScale = 1 / yscale - } - - xWeights := make([]float64, 1+2*int(math.Ceil(xHalfWidth))) - yWeights := make([]float64, 1+2*int(math.Ceil(yHalfWidth))) - - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx := d2s[0]*dxf + d2s[1]*dyf + d2s[2] - sy := d2s[3]*dxf + d2s[4]*dyf + d2s[5] - if !(image.Point{int(sx) + bias.X, int(sy) + bias.Y}).In(sr) { - continue - } - - // TODO: adjust the bias so that we can use int(f) instead - // of math.Floor(f) and math.Ceil(f). - sx += float64(bias.X) - sx -= 0.5 - ix := int(math.Floor(sx - xHalfWidth)) - if ix < sr.Min.X { - ix = sr.Min.X - } - jx := int(math.Ceil(sx + xHalfWidth)) - if jx > sr.Max.X { - jx = sr.Max.X - } - - totalXWeight := 0.0 - for kx := ix; kx < jx; kx++ { - xWeight := 0.0 - if t := abs((sx - float64(kx)) * xKernelArgScale); t < q.Support { - xWeight = q.At(t) - } - xWeights[kx-ix] = xWeight - totalXWeight += xWeight - } - for x := range xWeights[:jx-ix] { - xWeights[x] /= totalXWeight - } - - sy += float64(bias.Y) - sy -= 0.5 - iy := int(math.Floor(sy - yHalfWidth)) - if iy < sr.Min.Y { - iy = sr.Min.Y - } - jy := int(math.Ceil(sy + yHalfWidth)) - if jy > sr.Max.Y { - jy = sr.Max.Y - } - - totalYWeight := 0.0 - for ky := iy; ky < jy; ky++ { - yWeight := 0.0 - if t := abs((sy - float64(ky)) * yKernelArgScale); t < q.Support { - yWeight = q.At(t) - } - yWeights[ky-iy] = yWeight - totalYWeight += yWeight - } - for y := range yWeights[:jy-iy] { - yWeights[y] /= totalYWeight - } - - var pr, pg, pb float64 - for ky := iy; ky < jy; ky++ { - if yWeight := yWeights[ky-iy]; yWeight != 0 { - for kx := ix; kx < jx; kx++ { - if w := xWeights[kx-ix] * yWeight; w != 0 { - pi := (ky-src.Rect.Min.Y)*src.YStride + (kx - src.Rect.Min.X) - pj := ((ky)/2-src.Rect.Min.Y/2)*src.CStride + (kx - src.Rect.Min.X) - - // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - pyy1 := int(src.Y[pi]) * 0x10101 - pcb1 := int(src.Cb[pj]) - 128 - pcr1 := int(src.Cr[pj]) - 128 - pru := (pyy1 + 91881*pcr1) >> 8 - pgu := (pyy1 - 22554*pcb1 - 46802*pcr1) >> 8 - pbu := (pyy1 + 116130*pcb1) >> 8 - if pru < 0 { - pru = 0 - } else if pru > 0xffff { - pru = 0xffff - } - if pgu < 0 { - pgu = 0 - } else if pgu > 0xffff { - pgu = 0xffff - } - if pbu < 0 { - pbu = 0 - } else if pbu > 0xffff { - pbu = 0xffff - } - - pr += float64(pru) * w - pg += float64(pgu) * w - pb += float64(pbu) * w - } - } - } - } - dst.Pix[d+0] = uint8(fffftou(pr) >> 8) - dst.Pix[d+1] = uint8(fffftou(pg) >> 8) - dst.Pix[d+2] = uint8(fffftou(pb) >> 8) - dst.Pix[d+3] = 0xff - } - } -} - -func (q *Kernel) transform_RGBA_Image_Over(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src image.Image, sr image.Rectangle, bias image.Point, xscale, yscale float64, opts *Options) { - // When shrinking, broaden the effective kernel support so that we still - // visit every source pixel. - xHalfWidth, xKernelArgScale := q.Support, 1.0 - if xscale > 1 { - xHalfWidth *= xscale - xKernelArgScale = 1 / xscale - } - yHalfWidth, yKernelArgScale := q.Support, 1.0 - if yscale > 1 { - yHalfWidth *= yscale - yKernelArgScale = 1 / yscale - } - - xWeights := make([]float64, 1+2*int(math.Ceil(xHalfWidth))) - yWeights := make([]float64, 1+2*int(math.Ceil(yHalfWidth))) - - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx := d2s[0]*dxf + d2s[1]*dyf + d2s[2] - sy := d2s[3]*dxf + d2s[4]*dyf + d2s[5] - if !(image.Point{int(sx) + bias.X, int(sy) + bias.Y}).In(sr) { - continue - } - - // TODO: adjust the bias so that we can use int(f) instead - // of math.Floor(f) and math.Ceil(f). - sx += float64(bias.X) - sx -= 0.5 - ix := int(math.Floor(sx - xHalfWidth)) - if ix < sr.Min.X { - ix = sr.Min.X - } - jx := int(math.Ceil(sx + xHalfWidth)) - if jx > sr.Max.X { - jx = sr.Max.X - } - - totalXWeight := 0.0 - for kx := ix; kx < jx; kx++ { - xWeight := 0.0 - if t := abs((sx - float64(kx)) * xKernelArgScale); t < q.Support { - xWeight = q.At(t) - } - xWeights[kx-ix] = xWeight - totalXWeight += xWeight - } - for x := range xWeights[:jx-ix] { - xWeights[x] /= totalXWeight - } - - sy += float64(bias.Y) - sy -= 0.5 - iy := int(math.Floor(sy - yHalfWidth)) - if iy < sr.Min.Y { - iy = sr.Min.Y - } - jy := int(math.Ceil(sy + yHalfWidth)) - if jy > sr.Max.Y { - jy = sr.Max.Y - } - - totalYWeight := 0.0 - for ky := iy; ky < jy; ky++ { - yWeight := 0.0 - if t := abs((sy - float64(ky)) * yKernelArgScale); t < q.Support { - yWeight = q.At(t) - } - yWeights[ky-iy] = yWeight - totalYWeight += yWeight - } - for y := range yWeights[:jy-iy] { - yWeights[y] /= totalYWeight - } - - var pr, pg, pb, pa float64 - for ky := iy; ky < jy; ky++ { - if yWeight := yWeights[ky-iy]; yWeight != 0 { - for kx := ix; kx < jx; kx++ { - if w := xWeights[kx-ix] * yWeight; w != 0 { - pru, pgu, pbu, pau := src.At(kx, ky).RGBA() - pr += float64(pru) * w - pg += float64(pgu) * w - pb += float64(pbu) * w - pa += float64(pau) * w - } - } - } - } - - if pr > pa { - pr = pa - } - if pg > pa { - pg = pa - } - if pb > pa { - pb = pa - } - - pr0 := uint32(fffftou(pr)) - pg0 := uint32(fffftou(pg)) - pb0 := uint32(fffftou(pb)) - pa0 := uint32(fffftou(pa)) - pa1 := (0xffff - uint32(pa0)) * 0x101 - dst.Pix[d+0] = uint8((uint32(dst.Pix[d+0])*pa1/0xffff + pr0) >> 8) - dst.Pix[d+1] = uint8((uint32(dst.Pix[d+1])*pa1/0xffff + pg0) >> 8) - dst.Pix[d+2] = uint8((uint32(dst.Pix[d+2])*pa1/0xffff + pb0) >> 8) - dst.Pix[d+3] = uint8((uint32(dst.Pix[d+3])*pa1/0xffff + pa0) >> 8) - } - } -} - -func (q *Kernel) transform_RGBA_Image_Src(dst *image.RGBA, dr, adr image.Rectangle, d2s *f64.Aff3, src image.Image, sr image.Rectangle, bias image.Point, xscale, yscale float64, opts *Options) { - // When shrinking, broaden the effective kernel support so that we still - // visit every source pixel. - xHalfWidth, xKernelArgScale := q.Support, 1.0 - if xscale > 1 { - xHalfWidth *= xscale - xKernelArgScale = 1 / xscale - } - yHalfWidth, yKernelArgScale := q.Support, 1.0 - if yscale > 1 { - yHalfWidth *= yscale - yKernelArgScale = 1 / yscale - } - - xWeights := make([]float64, 1+2*int(math.Ceil(xHalfWidth))) - yWeights := make([]float64, 1+2*int(math.Ceil(yHalfWidth))) - - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := (dr.Min.Y+int(dy)-dst.Rect.Min.Y)*dst.Stride + (dr.Min.X+adr.Min.X-dst.Rect.Min.X)*4 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx := d2s[0]*dxf + d2s[1]*dyf + d2s[2] - sy := d2s[3]*dxf + d2s[4]*dyf + d2s[5] - if !(image.Point{int(sx) + bias.X, int(sy) + bias.Y}).In(sr) { - continue - } - - // TODO: adjust the bias so that we can use int(f) instead - // of math.Floor(f) and math.Ceil(f). - sx += float64(bias.X) - sx -= 0.5 - ix := int(math.Floor(sx - xHalfWidth)) - if ix < sr.Min.X { - ix = sr.Min.X - } - jx := int(math.Ceil(sx + xHalfWidth)) - if jx > sr.Max.X { - jx = sr.Max.X - } - - totalXWeight := 0.0 - for kx := ix; kx < jx; kx++ { - xWeight := 0.0 - if t := abs((sx - float64(kx)) * xKernelArgScale); t < q.Support { - xWeight = q.At(t) - } - xWeights[kx-ix] = xWeight - totalXWeight += xWeight - } - for x := range xWeights[:jx-ix] { - xWeights[x] /= totalXWeight - } - - sy += float64(bias.Y) - sy -= 0.5 - iy := int(math.Floor(sy - yHalfWidth)) - if iy < sr.Min.Y { - iy = sr.Min.Y - } - jy := int(math.Ceil(sy + yHalfWidth)) - if jy > sr.Max.Y { - jy = sr.Max.Y - } - - totalYWeight := 0.0 - for ky := iy; ky < jy; ky++ { - yWeight := 0.0 - if t := abs((sy - float64(ky)) * yKernelArgScale); t < q.Support { - yWeight = q.At(t) - } - yWeights[ky-iy] = yWeight - totalYWeight += yWeight - } - for y := range yWeights[:jy-iy] { - yWeights[y] /= totalYWeight - } - - var pr, pg, pb, pa float64 - for ky := iy; ky < jy; ky++ { - if yWeight := yWeights[ky-iy]; yWeight != 0 { - for kx := ix; kx < jx; kx++ { - if w := xWeights[kx-ix] * yWeight; w != 0 { - pru, pgu, pbu, pau := src.At(kx, ky).RGBA() - pr += float64(pru) * w - pg += float64(pgu) * w - pb += float64(pbu) * w - pa += float64(pau) * w - } - } - } - } - - if pr > pa { - pr = pa - } - if pg > pa { - pg = pa - } - if pb > pa { - pb = pa - } - - dst.Pix[d+0] = uint8(fffftou(pr) >> 8) - dst.Pix[d+1] = uint8(fffftou(pg) >> 8) - dst.Pix[d+2] = uint8(fffftou(pb) >> 8) - dst.Pix[d+3] = uint8(fffftou(pa) >> 8) - } - } -} - -func (q *Kernel) transform_Image_Image_Over(dst Image, dr, adr image.Rectangle, d2s *f64.Aff3, src image.Image, sr image.Rectangle, bias image.Point, xscale, yscale float64, opts *Options) { - // When shrinking, broaden the effective kernel support so that we still - // visit every source pixel. - xHalfWidth, xKernelArgScale := q.Support, 1.0 - if xscale > 1 { - xHalfWidth *= xscale - xKernelArgScale = 1 / xscale - } - yHalfWidth, yKernelArgScale := q.Support, 1.0 - if yscale > 1 { - yHalfWidth *= yscale - yKernelArgScale = 1 / yscale - } - - xWeights := make([]float64, 1+2*int(math.Ceil(xHalfWidth))) - yWeights := make([]float64, 1+2*int(math.Ceil(yHalfWidth))) - - srcMask, smp := opts.SrcMask, opts.SrcMaskP - dstMask, dmp := opts.DstMask, opts.DstMaskP - dstColorRGBA64 := &color.RGBA64{} - dstColor := color.Color(dstColorRGBA64) - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx++ { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx := d2s[0]*dxf + d2s[1]*dyf + d2s[2] - sy := d2s[3]*dxf + d2s[4]*dyf + d2s[5] - if !(image.Point{int(sx) + bias.X, int(sy) + bias.Y}).In(sr) { - continue - } - - // TODO: adjust the bias so that we can use int(f) instead - // of math.Floor(f) and math.Ceil(f). - sx += float64(bias.X) - sx -= 0.5 - ix := int(math.Floor(sx - xHalfWidth)) - if ix < sr.Min.X { - ix = sr.Min.X - } - jx := int(math.Ceil(sx + xHalfWidth)) - if jx > sr.Max.X { - jx = sr.Max.X - } - - totalXWeight := 0.0 - for kx := ix; kx < jx; kx++ { - xWeight := 0.0 - if t := abs((sx - float64(kx)) * xKernelArgScale); t < q.Support { - xWeight = q.At(t) - } - xWeights[kx-ix] = xWeight - totalXWeight += xWeight - } - for x := range xWeights[:jx-ix] { - xWeights[x] /= totalXWeight - } - - sy += float64(bias.Y) - sy -= 0.5 - iy := int(math.Floor(sy - yHalfWidth)) - if iy < sr.Min.Y { - iy = sr.Min.Y - } - jy := int(math.Ceil(sy + yHalfWidth)) - if jy > sr.Max.Y { - jy = sr.Max.Y - } - - totalYWeight := 0.0 - for ky := iy; ky < jy; ky++ { - yWeight := 0.0 - if t := abs((sy - float64(ky)) * yKernelArgScale); t < q.Support { - yWeight = q.At(t) - } - yWeights[ky-iy] = yWeight - totalYWeight += yWeight - } - for y := range yWeights[:jy-iy] { - yWeights[y] /= totalYWeight - } - - var pr, pg, pb, pa float64 - for ky := iy; ky < jy; ky++ { - if yWeight := yWeights[ky-iy]; yWeight != 0 { - for kx := ix; kx < jx; kx++ { - if w := xWeights[kx-ix] * yWeight; w != 0 { - pru, pgu, pbu, pau := src.At(kx, ky).RGBA() - if srcMask != nil { - _, _, _, ma := srcMask.At(smp.X+kx, smp.Y+ky).RGBA() - pru = pru * ma / 0xffff - pgu = pgu * ma / 0xffff - pbu = pbu * ma / 0xffff - pau = pau * ma / 0xffff - } - pr += float64(pru) * w - pg += float64(pgu) * w - pb += float64(pbu) * w - pa += float64(pau) * w - } - } - } - } - - if pr > pa { - pr = pa - } - if pg > pa { - pg = pa - } - if pb > pa { - pb = pa - } - - qr, qg, qb, qa := dst.At(dr.Min.X+int(dx), dr.Min.Y+int(dy)).RGBA() - pr0 := uint32(fffftou(pr)) - pg0 := uint32(fffftou(pg)) - pb0 := uint32(fffftou(pb)) - pa0 := uint32(fffftou(pa)) - if dstMask != nil { - _, _, _, ma := dstMask.At(dmp.X+dr.Min.X+int(dx), dmp.Y+dr.Min.Y+int(dy)).RGBA() - pr0 = pr0 * ma / 0xffff - pg0 = pg0 * ma / 0xffff - pb0 = pb0 * ma / 0xffff - pa0 = pa0 * ma / 0xffff - } - pa1 := 0xffff - pa0 - dstColorRGBA64.R = uint16(qr*pa1/0xffff + pr0) - dstColorRGBA64.G = uint16(qg*pa1/0xffff + pg0) - dstColorRGBA64.B = uint16(qb*pa1/0xffff + pb0) - dstColorRGBA64.A = uint16(qa*pa1/0xffff + pa0) - dst.Set(dr.Min.X+int(dx), dr.Min.Y+int(dy), dstColor) - } - } -} - -func (q *Kernel) transform_Image_Image_Src(dst Image, dr, adr image.Rectangle, d2s *f64.Aff3, src image.Image, sr image.Rectangle, bias image.Point, xscale, yscale float64, opts *Options) { - // When shrinking, broaden the effective kernel support so that we still - // visit every source pixel. - xHalfWidth, xKernelArgScale := q.Support, 1.0 - if xscale > 1 { - xHalfWidth *= xscale - xKernelArgScale = 1 / xscale - } - yHalfWidth, yKernelArgScale := q.Support, 1.0 - if yscale > 1 { - yHalfWidth *= yscale - yKernelArgScale = 1 / yscale - } - - xWeights := make([]float64, 1+2*int(math.Ceil(xHalfWidth))) - yWeights := make([]float64, 1+2*int(math.Ceil(yHalfWidth))) - - srcMask, smp := opts.SrcMask, opts.SrcMaskP - dstMask, dmp := opts.DstMask, opts.DstMaskP - dstColorRGBA64 := &color.RGBA64{} - dstColor := color.Color(dstColorRGBA64) - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx++ { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx := d2s[0]*dxf + d2s[1]*dyf + d2s[2] - sy := d2s[3]*dxf + d2s[4]*dyf + d2s[5] - if !(image.Point{int(sx) + bias.X, int(sy) + bias.Y}).In(sr) { - continue - } - - // TODO: adjust the bias so that we can use int(f) instead - // of math.Floor(f) and math.Ceil(f). - sx += float64(bias.X) - sx -= 0.5 - ix := int(math.Floor(sx - xHalfWidth)) - if ix < sr.Min.X { - ix = sr.Min.X - } - jx := int(math.Ceil(sx + xHalfWidth)) - if jx > sr.Max.X { - jx = sr.Max.X - } - - totalXWeight := 0.0 - for kx := ix; kx < jx; kx++ { - xWeight := 0.0 - if t := abs((sx - float64(kx)) * xKernelArgScale); t < q.Support { - xWeight = q.At(t) - } - xWeights[kx-ix] = xWeight - totalXWeight += xWeight - } - for x := range xWeights[:jx-ix] { - xWeights[x] /= totalXWeight - } - - sy += float64(bias.Y) - sy -= 0.5 - iy := int(math.Floor(sy - yHalfWidth)) - if iy < sr.Min.Y { - iy = sr.Min.Y - } - jy := int(math.Ceil(sy + yHalfWidth)) - if jy > sr.Max.Y { - jy = sr.Max.Y - } - - totalYWeight := 0.0 - for ky := iy; ky < jy; ky++ { - yWeight := 0.0 - if t := abs((sy - float64(ky)) * yKernelArgScale); t < q.Support { - yWeight = q.At(t) - } - yWeights[ky-iy] = yWeight - totalYWeight += yWeight - } - for y := range yWeights[:jy-iy] { - yWeights[y] /= totalYWeight - } - - var pr, pg, pb, pa float64 - for ky := iy; ky < jy; ky++ { - if yWeight := yWeights[ky-iy]; yWeight != 0 { - for kx := ix; kx < jx; kx++ { - if w := xWeights[kx-ix] * yWeight; w != 0 { - pru, pgu, pbu, pau := src.At(kx, ky).RGBA() - if srcMask != nil { - _, _, _, ma := srcMask.At(smp.X+kx, smp.Y+ky).RGBA() - pru = pru * ma / 0xffff - pgu = pgu * ma / 0xffff - pbu = pbu * ma / 0xffff - pau = pau * ma / 0xffff - } - pr += float64(pru) * w - pg += float64(pgu) * w - pb += float64(pbu) * w - pa += float64(pau) * w - } - } - } - } - - if pr > pa { - pr = pa - } - if pg > pa { - pg = pa - } - if pb > pa { - pb = pa - } - - if dstMask != nil { - qr, qg, qb, qa := dst.At(dr.Min.X+int(dx), dr.Min.Y+int(dy)).RGBA() - _, _, _, ma := dstMask.At(dmp.X+dr.Min.X+int(dx), dmp.Y+dr.Min.Y+int(dy)).RGBA() - pr := uint32(fffftou(pr)) * ma / 0xffff - pg := uint32(fffftou(pg)) * ma / 0xffff - pb := uint32(fffftou(pb)) * ma / 0xffff - pa := uint32(fffftou(pa)) * ma / 0xffff - pa1 := 0xffff - ma - dstColorRGBA64.R = uint16(qr*pa1/0xffff + pr) - dstColorRGBA64.G = uint16(qg*pa1/0xffff + pg) - dstColorRGBA64.B = uint16(qb*pa1/0xffff + pb) - dstColorRGBA64.A = uint16(qa*pa1/0xffff + pa) - dst.Set(dr.Min.X+int(dx), dr.Min.Y+int(dy), dstColor) - } else { - dstColorRGBA64.R = fffftou(pr) - dstColorRGBA64.G = fffftou(pg) - dstColorRGBA64.B = fffftou(pb) - dstColorRGBA64.A = fffftou(pa) - dst.Set(dr.Min.X+int(dx), dr.Min.Y+int(dy), dstColor) - } - } - } -} diff --git a/vendor/golang.org/x/image/draw/scale.go b/vendor/golang.org/x/image/draw/scale.go deleted file mode 100644 index 00121a1..0000000 --- a/vendor/golang.org/x/image/draw/scale.go +++ /dev/null @@ -1,525 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:generate go run gen.go - -package draw - -import ( - "image" - "image/color" - "math" - "sync" - - "golang.org/x/image/math/f64" -) - -// Copy copies the part of the source image defined by src and sr and writes -// the result of a Porter-Duff composition to the part of the destination image -// defined by dst and the translation of sr so that sr.Min translates to dp. -func Copy(dst Image, dp image.Point, src image.Image, sr image.Rectangle, op Op, opts *Options) { - var o Options - if opts != nil { - o = *opts - } - dr := sr.Add(dp.Sub(sr.Min)) - if o.DstMask == nil { - DrawMask(dst, dr, src, sr.Min, o.SrcMask, o.SrcMaskP.Add(sr.Min), op) - } else { - NearestNeighbor.Scale(dst, dr, src, sr, op, opts) - } -} - -// Scaler scales the part of the source image defined by src and sr and writes -// the result of a Porter-Duff composition to the part of the destination image -// defined by dst and dr. -// -// A Scaler is safe to use concurrently. -type Scaler interface { - Scale(dst Image, dr image.Rectangle, src image.Image, sr image.Rectangle, op Op, opts *Options) -} - -// Transformer transforms the part of the source image defined by src and sr -// and writes the result of a Porter-Duff composition to the part of the -// destination image defined by dst and the affine transform m applied to sr. -// -// For example, if m is the matrix -// -// m00 m01 m02 -// m10 m11 m12 -// -// then the src-space point (sx, sy) maps to the dst-space point -// (m00*sx + m01*sy + m02, m10*sx + m11*sy + m12). -// -// A Transformer is safe to use concurrently. -type Transformer interface { - Transform(dst Image, m f64.Aff3, src image.Image, sr image.Rectangle, op Op, opts *Options) -} - -// Options are optional parameters to Copy, Scale and Transform. -// -// A nil *Options means to use the default (zero) values of each field. -type Options struct { - // Masks limit what parts of the dst image are drawn to and what parts of - // the src image are drawn from. - // - // A dst or src mask image having a zero alpha (transparent) pixel value in - // the respective coordinate space means that dst pixel is entirely - // unaffected or that src pixel is considered transparent black. A full - // alpha (opaque) value means that the dst pixel is maximally affected or - // the src pixel contributes maximally. The default values, nil, are - // equivalent to fully opaque, infinitely large mask images. - // - // The DstMask is otherwise known as a clip mask, and its pixels map 1:1 to - // the dst image's pixels. DstMaskP in DstMask space corresponds to - // image.Point{X:0, Y:0} in dst space. For example, when limiting - // repainting to a 'dirty rectangle', use that image.Rectangle and a zero - // image.Point as the DstMask and DstMaskP. - // - // The SrcMask's pixels map 1:1 to the src image's pixels. SrcMaskP in - // SrcMask space corresponds to image.Point{X:0, Y:0} in src space. For - // example, when drawing font glyphs in a uniform color, use an - // *image.Uniform as the src, and use the glyph atlas image and the - // per-glyph offset as SrcMask and SrcMaskP: - // Copy(dst, dp, image.NewUniform(color), image.Rect(0, 0, glyphWidth, glyphHeight), &Options{ - // SrcMask: glyphAtlas, - // SrcMaskP: glyphOffset, - // }) - DstMask image.Image - DstMaskP image.Point - SrcMask image.Image - SrcMaskP image.Point - - // TODO: a smooth vs sharp edges option, for arbitrary rotations? -} - -// Interpolator is an interpolation algorithm, when dst and src pixels don't -// have a 1:1 correspondence. -// -// Of the interpolators provided by this package: -// - NearestNeighbor is fast but usually looks worst. -// - CatmullRom is slow but usually looks best. -// - ApproxBiLinear has reasonable speed and quality. -// -// The time taken depends on the size of dr. For kernel interpolators, the -// speed also depends on the size of sr, and so are often slower than -// non-kernel interpolators, especially when scaling down. -type Interpolator interface { - Scaler - Transformer -} - -// Kernel is an interpolator that blends source pixels weighted by a symmetric -// kernel function. -type Kernel struct { - // Support is the kernel support and must be >= 0. At(t) is assumed to be - // zero when t >= Support. - Support float64 - // At is the kernel function. It will only be called with t in the - // range [0, Support). - At func(t float64) float64 -} - -// Scale implements the Scaler interface. -func (q *Kernel) Scale(dst Image, dr image.Rectangle, src image.Image, sr image.Rectangle, op Op, opts *Options) { - q.newScaler(dr.Dx(), dr.Dy(), sr.Dx(), sr.Dy(), false).Scale(dst, dr, src, sr, op, opts) -} - -// NewScaler returns a Scaler that is optimized for scaling multiple times with -// the same fixed destination and source width and height. -func (q *Kernel) NewScaler(dw, dh, sw, sh int) Scaler { - return q.newScaler(dw, dh, sw, sh, true) -} - -func (q *Kernel) newScaler(dw, dh, sw, sh int, usePool bool) Scaler { - z := &kernelScaler{ - kernel: q, - dw: int32(dw), - dh: int32(dh), - sw: int32(sw), - sh: int32(sh), - horizontal: newDistrib(q, int32(dw), int32(sw)), - vertical: newDistrib(q, int32(dh), int32(sh)), - } - if usePool { - z.pool.New = func() interface{} { - tmp := z.makeTmpBuf() - return &tmp - } - } - return z -} - -var ( - // NearestNeighbor is the nearest neighbor interpolator. It is very fast, - // but usually gives very low quality results. When scaling up, the result - // will look 'blocky'. - NearestNeighbor = Interpolator(nnInterpolator{}) - - // ApproxBiLinear is a mixture of the nearest neighbor and bi-linear - // interpolators. It is fast, but usually gives medium quality results. - // - // It implements bi-linear interpolation when upscaling and a bi-linear - // blend of the 4 nearest neighbor pixels when downscaling. This yields - // nicer quality than nearest neighbor interpolation when upscaling, but - // the time taken is independent of the number of source pixels, unlike the - // bi-linear interpolator. When downscaling a large image, the performance - // difference can be significant. - ApproxBiLinear = Interpolator(ablInterpolator{}) - - // BiLinear is the tent kernel. It is slow, but usually gives high quality - // results. - BiLinear = &Kernel{1, func(t float64) float64 { - return 1 - t - }} - - // CatmullRom is the Catmull-Rom kernel. It is very slow, but usually gives - // very high quality results. - // - // It is an instance of the more general cubic BC-spline kernel with parameters - // B=0 and C=0.5. See Mitchell and Netravali, "Reconstruction Filters in - // Computer Graphics", Computer Graphics, Vol. 22, No. 4, pp. 221-228. - CatmullRom = &Kernel{2, func(t float64) float64 { - if t < 1 { - return (1.5*t-2.5)*t*t + 1 - } - return ((-0.5*t+2.5)*t-4)*t + 2 - }} - - // TODO: a Kaiser-Bessel kernel? -) - -type nnInterpolator struct{} - -type ablInterpolator struct{} - -type kernelScaler struct { - kernel *Kernel - dw, dh, sw, sh int32 - horizontal, vertical distrib - pool sync.Pool -} - -func (z *kernelScaler) makeTmpBuf() [][4]float64 { - return make([][4]float64, z.dw*z.sh) -} - -// source is a range of contribs, their inverse total weight, and that ITW -// divided by 0xffff. -type source struct { - i, j int32 - invTotalWeight float64 - invTotalWeightFFFF float64 -} - -// contrib is the weight of a column or row. -type contrib struct { - coord int32 - weight float64 -} - -// distrib measures how source pixels are distributed over destination pixels. -type distrib struct { - // sources are what contribs each column or row in the source image owns, - // and the total weight of those contribs. - sources []source - // contribs are the contributions indexed by sources[s].i and sources[s].j. - contribs []contrib -} - -// newDistrib returns a distrib that distributes sw source columns (or rows) -// over dw destination columns (or rows). -func newDistrib(q *Kernel, dw, sw int32) distrib { - scale := float64(sw) / float64(dw) - halfWidth, kernelArgScale := q.Support, 1.0 - // When shrinking, broaden the effective kernel support so that we still - // visit every source pixel. - if scale > 1 { - halfWidth *= scale - kernelArgScale = 1 / scale - } - - // Make the sources slice, one source for each column or row, and temporarily - // appropriate its elements' fields so that invTotalWeight is the scaled - // coordinate of the source column or row, and i and j are the lower and - // upper bounds of the range of destination columns or rows affected by the - // source column or row. - n, sources := int32(0), make([]source, dw) - for x := range sources { - center := (float64(x)+0.5)*scale - 0.5 - i := int32(math.Floor(center - halfWidth)) - if i < 0 { - i = 0 - } - j := int32(math.Ceil(center + halfWidth)) - if j > sw { - j = sw - if j < i { - j = i - } - } - sources[x] = source{i: i, j: j, invTotalWeight: center} - n += j - i - } - - contribs := make([]contrib, 0, n) - for k, b := range sources { - totalWeight := 0.0 - l := int32(len(contribs)) - for coord := b.i; coord < b.j; coord++ { - t := abs((b.invTotalWeight - float64(coord)) * kernelArgScale) - if t >= q.Support { - continue - } - weight := q.At(t) - if weight == 0 { - continue - } - totalWeight += weight - contribs = append(contribs, contrib{coord, weight}) - } - totalWeight = 1 / totalWeight - sources[k] = source{ - i: l, - j: int32(len(contribs)), - invTotalWeight: totalWeight, - invTotalWeightFFFF: totalWeight / 0xffff, - } - } - - return distrib{sources, contribs} -} - -// abs is like math.Abs, but it doesn't care about negative zero, infinities or -// NaNs. -func abs(f float64) float64 { - if f < 0 { - f = -f - } - return f -} - -// ftou converts the range [0.0, 1.0] to [0, 0xffff]. -func ftou(f float64) uint16 { - i := int32(0xffff*f + 0.5) - if i > 0xffff { - return 0xffff - } - if i > 0 { - return uint16(i) - } - return 0 -} - -// fffftou converts the range [0.0, 65535.0] to [0, 0xffff]. -func fffftou(f float64) uint16 { - i := int32(f + 0.5) - if i > 0xffff { - return 0xffff - } - if i > 0 { - return uint16(i) - } - return 0 -} - -// invert returns the inverse of m. -// -// TODO: move this into the f64 package, once we work out the convention for -// matrix methods in that package: do they modify the receiver, take a dst -// pointer argument, or return a new value? -func invert(m *f64.Aff3) f64.Aff3 { - m00 := +m[3*1+1] - m01 := -m[3*0+1] - m02 := +m[3*1+2]*m[3*0+1] - m[3*1+1]*m[3*0+2] - m10 := -m[3*1+0] - m11 := +m[3*0+0] - m12 := +m[3*1+0]*m[3*0+2] - m[3*1+2]*m[3*0+0] - - det := m00*m11 - m10*m01 - - return f64.Aff3{ - m00 / det, - m01 / det, - m02 / det, - m10 / det, - m11 / det, - m12 / det, - } -} - -func matMul(p, q *f64.Aff3) f64.Aff3 { - return f64.Aff3{ - p[3*0+0]*q[3*0+0] + p[3*0+1]*q[3*1+0], - p[3*0+0]*q[3*0+1] + p[3*0+1]*q[3*1+1], - p[3*0+0]*q[3*0+2] + p[3*0+1]*q[3*1+2] + p[3*0+2], - p[3*1+0]*q[3*0+0] + p[3*1+1]*q[3*1+0], - p[3*1+0]*q[3*0+1] + p[3*1+1]*q[3*1+1], - p[3*1+0]*q[3*0+2] + p[3*1+1]*q[3*1+2] + p[3*1+2], - } -} - -// transformRect returns a rectangle dr that contains sr transformed by s2d. -func transformRect(s2d *f64.Aff3, sr *image.Rectangle) (dr image.Rectangle) { - ps := [...]image.Point{ - {sr.Min.X, sr.Min.Y}, - {sr.Max.X, sr.Min.Y}, - {sr.Min.X, sr.Max.Y}, - {sr.Max.X, sr.Max.Y}, - } - for i, p := range ps { - sxf := float64(p.X) - syf := float64(p.Y) - dx := int(math.Floor(s2d[0]*sxf + s2d[1]*syf + s2d[2])) - dy := int(math.Floor(s2d[3]*sxf + s2d[4]*syf + s2d[5])) - - // The +1 adjustments below are because an image.Rectangle is inclusive - // on the low end but exclusive on the high end. - - if i == 0 { - dr = image.Rectangle{ - Min: image.Point{dx + 0, dy + 0}, - Max: image.Point{dx + 1, dy + 1}, - } - continue - } - - if dr.Min.X > dx { - dr.Min.X = dx - } - dx++ - if dr.Max.X < dx { - dr.Max.X = dx - } - - if dr.Min.Y > dy { - dr.Min.Y = dy - } - dy++ - if dr.Max.Y < dy { - dr.Max.Y = dy - } - } - return dr -} - -func clipAffectedDestRect(adr image.Rectangle, dstMask image.Image, dstMaskP image.Point) (image.Rectangle, image.Image) { - if dstMask == nil { - return adr, nil - } - if r, ok := dstMask.(image.Rectangle); ok { - return adr.Intersect(r.Sub(dstMaskP)), nil - } - // TODO: clip to dstMask.Bounds() if the color model implies that out-of-bounds means 0 alpha? - return adr, dstMask -} - -func transform_Uniform(dst Image, dr, adr image.Rectangle, d2s *f64.Aff3, src *image.Uniform, sr image.Rectangle, bias image.Point, op Op) { - switch op { - case Over: - switch dst := dst.(type) { - case *image.RGBA: - pr, pg, pb, pa := src.C.RGBA() - pa1 := (0xffff - pa) * 0x101 - - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := dst.PixOffset(dr.Min.X+adr.Min.X, dr.Min.Y+int(dy)) - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx0 := int(d2s[0]*dxf+d2s[1]*dyf+d2s[2]) + bias.X - sy0 := int(d2s[3]*dxf+d2s[4]*dyf+d2s[5]) + bias.Y - if !(image.Point{sx0, sy0}).In(sr) { - continue - } - dst.Pix[d+0] = uint8((uint32(dst.Pix[d+0])*pa1/0xffff + pr) >> 8) - dst.Pix[d+1] = uint8((uint32(dst.Pix[d+1])*pa1/0xffff + pg) >> 8) - dst.Pix[d+2] = uint8((uint32(dst.Pix[d+2])*pa1/0xffff + pb) >> 8) - dst.Pix[d+3] = uint8((uint32(dst.Pix[d+3])*pa1/0xffff + pa) >> 8) - } - } - - default: - pr, pg, pb, pa := src.C.RGBA() - pa1 := 0xffff - pa - dstColorRGBA64 := &color.RGBA64{} - dstColor := color.Color(dstColorRGBA64) - - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx++ { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx0 := int(d2s[0]*dxf+d2s[1]*dyf+d2s[2]) + bias.X - sy0 := int(d2s[3]*dxf+d2s[4]*dyf+d2s[5]) + bias.Y - if !(image.Point{sx0, sy0}).In(sr) { - continue - } - qr, qg, qb, qa := dst.At(dr.Min.X+int(dx), dr.Min.Y+int(dy)).RGBA() - dstColorRGBA64.R = uint16(qr*pa1/0xffff + pr) - dstColorRGBA64.G = uint16(qg*pa1/0xffff + pg) - dstColorRGBA64.B = uint16(qb*pa1/0xffff + pb) - dstColorRGBA64.A = uint16(qa*pa1/0xffff + pa) - dst.Set(dr.Min.X+int(dx), dr.Min.Y+int(dy), dstColor) - } - } - } - - case Src: - switch dst := dst.(type) { - case *image.RGBA: - pr, pg, pb, pa := src.C.RGBA() - pr8 := uint8(pr >> 8) - pg8 := uint8(pg >> 8) - pb8 := uint8(pb >> 8) - pa8 := uint8(pa >> 8) - - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - d := dst.PixOffset(dr.Min.X+adr.Min.X, dr.Min.Y+int(dy)) - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx, d = dx+1, d+4 { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx0 := int(d2s[0]*dxf+d2s[1]*dyf+d2s[2]) + bias.X - sy0 := int(d2s[3]*dxf+d2s[4]*dyf+d2s[5]) + bias.Y - if !(image.Point{sx0, sy0}).In(sr) { - continue - } - dst.Pix[d+0] = pr8 - dst.Pix[d+1] = pg8 - dst.Pix[d+2] = pb8 - dst.Pix[d+3] = pa8 - } - } - - default: - pr, pg, pb, pa := src.C.RGBA() - dstColorRGBA64 := &color.RGBA64{ - uint16(pr), - uint16(pg), - uint16(pb), - uint16(pa), - } - dstColor := color.Color(dstColorRGBA64) - - for dy := int32(adr.Min.Y); dy < int32(adr.Max.Y); dy++ { - dyf := float64(dr.Min.Y+int(dy)) + 0.5 - for dx := int32(adr.Min.X); dx < int32(adr.Max.X); dx++ { - dxf := float64(dr.Min.X+int(dx)) + 0.5 - sx0 := int(d2s[0]*dxf+d2s[1]*dyf+d2s[2]) + bias.X - sy0 := int(d2s[3]*dxf+d2s[4]*dyf+d2s[5]) + bias.Y - if !(image.Point{sx0, sy0}).In(sr) { - continue - } - dst.Set(dr.Min.X+int(dx), dr.Min.Y+int(dy), dstColor) - } - } - } - } -} - -func opaque(m image.Image) bool { - o, ok := m.(interface { - Opaque() bool - }) - return ok && o.Opaque() -} diff --git a/vendor/golang.org/x/image/math/f64/f64.go b/vendor/golang.org/x/image/math/f64/f64.go deleted file mode 100644 index a1f7fc0..0000000 --- a/vendor/golang.org/x/image/math/f64/f64.go +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package f64 implements float64 vector and matrix types. -package f64 // import "golang.org/x/image/math/f64" - -// Vec2 is a 2-element vector. -type Vec2 [2]float64 - -// Vec3 is a 3-element vector. -type Vec3 [3]float64 - -// Vec4 is a 4-element vector. -type Vec4 [4]float64 - -// Mat3 is a 3x3 matrix in row major order. -// -// m[3*r + c] is the element in the r'th row and c'th column. -type Mat3 [9]float64 - -// Mat4 is a 4x4 matrix in row major order. -// -// m[4*r + c] is the element in the r'th row and c'th column. -type Mat4 [16]float64 - -// Aff3 is a 3x3 affine transformation matrix in row major order, where the -// bottom row is implicitly [0 0 1]. -// -// m[3*r + c] is the element in the r'th row and c'th column. -type Aff3 [6]float64 - -// Aff4 is a 4x4 affine transformation matrix in row major order, where the -// bottom row is implicitly [0 0 0 1]. -// -// m[4*r + c] is the element in the r'th row and c'th column. -type Aff4 [12]float64 diff --git a/vendor/golang.org/x/sys/windows/registry/key.go b/vendor/golang.org/x/sys/windows/registry/key.go new file mode 100644 index 0000000..c256483 --- /dev/null +++ b/vendor/golang.org/x/sys/windows/registry/key.go @@ -0,0 +1,198 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build windows + +// Package registry provides access to the Windows registry. +// +// Here is a simple example, opening a registry key and reading a string value from it. +// +// k, err := registry.OpenKey(registry.LOCAL_MACHINE, `SOFTWARE\Microsoft\Windows NT\CurrentVersion`, registry.QUERY_VALUE) +// if err != nil { +// log.Fatal(err) +// } +// defer k.Close() +// +// s, _, err := k.GetStringValue("SystemRoot") +// if err != nil { +// log.Fatal(err) +// } +// fmt.Printf("Windows system root is %q\n", s) +// +package registry + +import ( + "io" + "syscall" + "time" +) + +const ( + // Registry key security and access rights. + // See https://msdn.microsoft.com/en-us/library/windows/desktop/ms724878.aspx + // for details. + ALL_ACCESS = 0xf003f + CREATE_LINK = 0x00020 + CREATE_SUB_KEY = 0x00004 + ENUMERATE_SUB_KEYS = 0x00008 + EXECUTE = 0x20019 + NOTIFY = 0x00010 + QUERY_VALUE = 0x00001 + READ = 0x20019 + SET_VALUE = 0x00002 + WOW64_32KEY = 0x00200 + WOW64_64KEY = 0x00100 + WRITE = 0x20006 +) + +// Key is a handle to an open Windows registry key. +// Keys can be obtained by calling OpenKey; there are +// also some predefined root keys such as CURRENT_USER. +// Keys can be used directly in the Windows API. +type Key syscall.Handle + +const ( + // Windows defines some predefined root keys that are always open. + // An application can use these keys as entry points to the registry. + // Normally these keys are used in OpenKey to open new keys, + // but they can also be used anywhere a Key is required. + CLASSES_ROOT = Key(syscall.HKEY_CLASSES_ROOT) + CURRENT_USER = Key(syscall.HKEY_CURRENT_USER) + LOCAL_MACHINE = Key(syscall.HKEY_LOCAL_MACHINE) + USERS = Key(syscall.HKEY_USERS) + CURRENT_CONFIG = Key(syscall.HKEY_CURRENT_CONFIG) + PERFORMANCE_DATA = Key(syscall.HKEY_PERFORMANCE_DATA) +) + +// Close closes open key k. +func (k Key) Close() error { + return syscall.RegCloseKey(syscall.Handle(k)) +} + +// OpenKey opens a new key with path name relative to key k. +// It accepts any open key, including CURRENT_USER and others, +// and returns the new key and an error. +// The access parameter specifies desired access rights to the +// key to be opened. +func OpenKey(k Key, path string, access uint32) (Key, error) { + p, err := syscall.UTF16PtrFromString(path) + if err != nil { + return 0, err + } + var subkey syscall.Handle + err = syscall.RegOpenKeyEx(syscall.Handle(k), p, 0, access, &subkey) + if err != nil { + return 0, err + } + return Key(subkey), nil +} + +// OpenRemoteKey opens a predefined registry key on another +// computer pcname. The key to be opened is specified by k, but +// can only be one of LOCAL_MACHINE, PERFORMANCE_DATA or USERS. +// If pcname is "", OpenRemoteKey returns local computer key. +func OpenRemoteKey(pcname string, k Key) (Key, error) { + var err error + var p *uint16 + if pcname != "" { + p, err = syscall.UTF16PtrFromString(`\\` + pcname) + if err != nil { + return 0, err + } + } + var remoteKey syscall.Handle + err = regConnectRegistry(p, syscall.Handle(k), &remoteKey) + if err != nil { + return 0, err + } + return Key(remoteKey), nil +} + +// ReadSubKeyNames returns the names of subkeys of key k. +// The parameter n controls the number of returned names, +// analogous to the way os.File.Readdirnames works. +func (k Key) ReadSubKeyNames(n int) ([]string, error) { + names := make([]string, 0) + // Registry key size limit is 255 bytes and described there: + // https://msdn.microsoft.com/library/windows/desktop/ms724872.aspx + buf := make([]uint16, 256) //plus extra room for terminating zero byte +loopItems: + for i := uint32(0); ; i++ { + if n > 0 { + if len(names) == n { + return names, nil + } + } + l := uint32(len(buf)) + for { + err := syscall.RegEnumKeyEx(syscall.Handle(k), i, &buf[0], &l, nil, nil, nil, nil) + if err == nil { + break + } + if err == syscall.ERROR_MORE_DATA { + // Double buffer size and try again. + l = uint32(2 * len(buf)) + buf = make([]uint16, l) + continue + } + if err == _ERROR_NO_MORE_ITEMS { + break loopItems + } + return names, err + } + names = append(names, syscall.UTF16ToString(buf[:l])) + } + if n > len(names) { + return names, io.EOF + } + return names, nil +} + +// CreateKey creates a key named path under open key k. +// CreateKey returns the new key and a boolean flag that reports +// whether the key already existed. +// The access parameter specifies the access rights for the key +// to be created. +func CreateKey(k Key, path string, access uint32) (newk Key, openedExisting bool, err error) { + var h syscall.Handle + var d uint32 + err = regCreateKeyEx(syscall.Handle(k), syscall.StringToUTF16Ptr(path), + 0, nil, _REG_OPTION_NON_VOLATILE, access, nil, &h, &d) + if err != nil { + return 0, false, err + } + return Key(h), d == _REG_OPENED_EXISTING_KEY, nil +} + +// DeleteKey deletes the subkey path of key k and its values. +func DeleteKey(k Key, path string) error { + return regDeleteKey(syscall.Handle(k), syscall.StringToUTF16Ptr(path)) +} + +// A KeyInfo describes the statistics of a key. It is returned by Stat. +type KeyInfo struct { + SubKeyCount uint32 + MaxSubKeyLen uint32 // size of the key's subkey with the longest name, in Unicode characters, not including the terminating zero byte + ValueCount uint32 + MaxValueNameLen uint32 // size of the key's longest value name, in Unicode characters, not including the terminating zero byte + MaxValueLen uint32 // longest data component among the key's values, in bytes + lastWriteTime syscall.Filetime +} + +// ModTime returns the key's last write time. +func (ki *KeyInfo) ModTime() time.Time { + return time.Unix(0, ki.lastWriteTime.Nanoseconds()) +} + +// Stat retrieves information about the open key k. +func (k Key) Stat() (*KeyInfo, error) { + var ki KeyInfo + err := syscall.RegQueryInfoKey(syscall.Handle(k), nil, nil, nil, + &ki.SubKeyCount, &ki.MaxSubKeyLen, nil, &ki.ValueCount, + &ki.MaxValueNameLen, &ki.MaxValueLen, nil, &ki.lastWriteTime) + if err != nil { + return nil, err + } + return &ki, nil +} diff --git a/vendor/golang.org/x/sys/windows/registry/mksyscall.go b/vendor/golang.org/x/sys/windows/registry/mksyscall.go new file mode 100644 index 0000000..50c32a3 --- /dev/null +++ b/vendor/golang.org/x/sys/windows/registry/mksyscall.go @@ -0,0 +1,9 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build generate + +package registry + +//go:generate go run golang.org/x/sys/windows/mkwinsyscall -output zsyscall_windows.go syscall.go diff --git a/vendor/golang.org/x/sys/windows/registry/syscall.go b/vendor/golang.org/x/sys/windows/registry/syscall.go new file mode 100644 index 0000000..e66643c --- /dev/null +++ b/vendor/golang.org/x/sys/windows/registry/syscall.go @@ -0,0 +1,32 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build windows + +package registry + +import "syscall" + +const ( + _REG_OPTION_NON_VOLATILE = 0 + + _REG_CREATED_NEW_KEY = 1 + _REG_OPENED_EXISTING_KEY = 2 + + _ERROR_NO_MORE_ITEMS syscall.Errno = 259 +) + +func LoadRegLoadMUIString() error { + return procRegLoadMUIStringW.Find() +} + +//sys regCreateKeyEx(key syscall.Handle, subkey *uint16, reserved uint32, class *uint16, options uint32, desired uint32, sa *syscall.SecurityAttributes, result *syscall.Handle, disposition *uint32) (regerrno error) = advapi32.RegCreateKeyExW +//sys regDeleteKey(key syscall.Handle, subkey *uint16) (regerrno error) = advapi32.RegDeleteKeyW +//sys regSetValueEx(key syscall.Handle, valueName *uint16, reserved uint32, vtype uint32, buf *byte, bufsize uint32) (regerrno error) = advapi32.RegSetValueExW +//sys regEnumValue(key syscall.Handle, index uint32, name *uint16, nameLen *uint32, reserved *uint32, valtype *uint32, buf *byte, buflen *uint32) (regerrno error) = advapi32.RegEnumValueW +//sys regDeleteValue(key syscall.Handle, name *uint16) (regerrno error) = advapi32.RegDeleteValueW +//sys regLoadMUIString(key syscall.Handle, name *uint16, buf *uint16, buflen uint32, buflenCopied *uint32, flags uint32, dir *uint16) (regerrno error) = advapi32.RegLoadMUIStringW +//sys regConnectRegistry(machinename *uint16, key syscall.Handle, result *syscall.Handle) (regerrno error) = advapi32.RegConnectRegistryW + +//sys expandEnvironmentStrings(src *uint16, dst *uint16, size uint32) (n uint32, err error) = kernel32.ExpandEnvironmentStringsW diff --git a/vendor/golang.org/x/sys/windows/registry/value.go b/vendor/golang.org/x/sys/windows/registry/value.go new file mode 100644 index 0000000..f25e7e9 --- /dev/null +++ b/vendor/golang.org/x/sys/windows/registry/value.go @@ -0,0 +1,386 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build windows + +package registry + +import ( + "errors" + "io" + "syscall" + "unicode/utf16" + "unsafe" +) + +const ( + // Registry value types. + NONE = 0 + SZ = 1 + EXPAND_SZ = 2 + BINARY = 3 + DWORD = 4 + DWORD_BIG_ENDIAN = 5 + LINK = 6 + MULTI_SZ = 7 + RESOURCE_LIST = 8 + FULL_RESOURCE_DESCRIPTOR = 9 + RESOURCE_REQUIREMENTS_LIST = 10 + QWORD = 11 +) + +var ( + // ErrShortBuffer is returned when the buffer was too short for the operation. + ErrShortBuffer = syscall.ERROR_MORE_DATA + + // ErrNotExist is returned when a registry key or value does not exist. + ErrNotExist = syscall.ERROR_FILE_NOT_FOUND + + // ErrUnexpectedType is returned by Get*Value when the value's type was unexpected. + ErrUnexpectedType = errors.New("unexpected key value type") +) + +// GetValue retrieves the type and data for the specified value associated +// with an open key k. It fills up buffer buf and returns the retrieved +// byte count n. If buf is too small to fit the stored value it returns +// ErrShortBuffer error along with the required buffer size n. +// If no buffer is provided, it returns true and actual buffer size n. +// If no buffer is provided, GetValue returns the value's type only. +// If the value does not exist, the error returned is ErrNotExist. +// +// GetValue is a low level function. If value's type is known, use the appropriate +// Get*Value function instead. +func (k Key) GetValue(name string, buf []byte) (n int, valtype uint32, err error) { + pname, err := syscall.UTF16PtrFromString(name) + if err != nil { + return 0, 0, err + } + var pbuf *byte + if len(buf) > 0 { + pbuf = (*byte)(unsafe.Pointer(&buf[0])) + } + l := uint32(len(buf)) + err = syscall.RegQueryValueEx(syscall.Handle(k), pname, nil, &valtype, pbuf, &l) + if err != nil { + return int(l), valtype, err + } + return int(l), valtype, nil +} + +func (k Key) getValue(name string, buf []byte) (data []byte, valtype uint32, err error) { + p, err := syscall.UTF16PtrFromString(name) + if err != nil { + return nil, 0, err + } + var t uint32 + n := uint32(len(buf)) + for { + err = syscall.RegQueryValueEx(syscall.Handle(k), p, nil, &t, (*byte)(unsafe.Pointer(&buf[0])), &n) + if err == nil { + return buf[:n], t, nil + } + if err != syscall.ERROR_MORE_DATA { + return nil, 0, err + } + if n <= uint32(len(buf)) { + return nil, 0, err + } + buf = make([]byte, n) + } +} + +// GetStringValue retrieves the string value for the specified +// value name associated with an open key k. It also returns the value's type. +// If value does not exist, GetStringValue returns ErrNotExist. +// If value is not SZ or EXPAND_SZ, it will return the correct value +// type and ErrUnexpectedType. +func (k Key) GetStringValue(name string) (val string, valtype uint32, err error) { + data, typ, err2 := k.getValue(name, make([]byte, 64)) + if err2 != nil { + return "", typ, err2 + } + switch typ { + case SZ, EXPAND_SZ: + default: + return "", typ, ErrUnexpectedType + } + if len(data) == 0 { + return "", typ, nil + } + u := (*[1 << 29]uint16)(unsafe.Pointer(&data[0]))[: len(data)/2 : len(data)/2] + return syscall.UTF16ToString(u), typ, nil +} + +// GetMUIStringValue retrieves the localized string value for +// the specified value name associated with an open key k. +// If the value name doesn't exist or the localized string value +// can't be resolved, GetMUIStringValue returns ErrNotExist. +// GetMUIStringValue panics if the system doesn't support +// regLoadMUIString; use LoadRegLoadMUIString to check if +// regLoadMUIString is supported before calling this function. +func (k Key) GetMUIStringValue(name string) (string, error) { + pname, err := syscall.UTF16PtrFromString(name) + if err != nil { + return "", err + } + + buf := make([]uint16, 1024) + var buflen uint32 + var pdir *uint16 + + err = regLoadMUIString(syscall.Handle(k), pname, &buf[0], uint32(len(buf)), &buflen, 0, pdir) + if err == syscall.ERROR_FILE_NOT_FOUND { // Try fallback path + + // Try to resolve the string value using the system directory as + // a DLL search path; this assumes the string value is of the form + // @[path]\dllname,-strID but with no path given, e.g. @tzres.dll,-320. + + // This approach works with tzres.dll but may have to be revised + // in the future to allow callers to provide custom search paths. + + var s string + s, err = ExpandString("%SystemRoot%\\system32\\") + if err != nil { + return "", err + } + pdir, err = syscall.UTF16PtrFromString(s) + if err != nil { + return "", err + } + + err = regLoadMUIString(syscall.Handle(k), pname, &buf[0], uint32(len(buf)), &buflen, 0, pdir) + } + + for err == syscall.ERROR_MORE_DATA { // Grow buffer if needed + if buflen <= uint32(len(buf)) { + break // Buffer not growing, assume race; break + } + buf = make([]uint16, buflen) + err = regLoadMUIString(syscall.Handle(k), pname, &buf[0], uint32(len(buf)), &buflen, 0, pdir) + } + + if err != nil { + return "", err + } + + return syscall.UTF16ToString(buf), nil +} + +// ExpandString expands environment-variable strings and replaces +// them with the values defined for the current user. +// Use ExpandString to expand EXPAND_SZ strings. +func ExpandString(value string) (string, error) { + if value == "" { + return "", nil + } + p, err := syscall.UTF16PtrFromString(value) + if err != nil { + return "", err + } + r := make([]uint16, 100) + for { + n, err := expandEnvironmentStrings(p, &r[0], uint32(len(r))) + if err != nil { + return "", err + } + if n <= uint32(len(r)) { + return syscall.UTF16ToString(r[:n]), nil + } + r = make([]uint16, n) + } +} + +// GetStringsValue retrieves the []string value for the specified +// value name associated with an open key k. It also returns the value's type. +// If value does not exist, GetStringsValue returns ErrNotExist. +// If value is not MULTI_SZ, it will return the correct value +// type and ErrUnexpectedType. +func (k Key) GetStringsValue(name string) (val []string, valtype uint32, err error) { + data, typ, err2 := k.getValue(name, make([]byte, 64)) + if err2 != nil { + return nil, typ, err2 + } + if typ != MULTI_SZ { + return nil, typ, ErrUnexpectedType + } + if len(data) == 0 { + return nil, typ, nil + } + p := (*[1 << 29]uint16)(unsafe.Pointer(&data[0]))[: len(data)/2 : len(data)/2] + if len(p) == 0 { + return nil, typ, nil + } + if p[len(p)-1] == 0 { + p = p[:len(p)-1] // remove terminating null + } + val = make([]string, 0, 5) + from := 0 + for i, c := range p { + if c == 0 { + val = append(val, string(utf16.Decode(p[from:i]))) + from = i + 1 + } + } + return val, typ, nil +} + +// GetIntegerValue retrieves the integer value for the specified +// value name associated with an open key k. It also returns the value's type. +// If value does not exist, GetIntegerValue returns ErrNotExist. +// If value is not DWORD or QWORD, it will return the correct value +// type and ErrUnexpectedType. +func (k Key) GetIntegerValue(name string) (val uint64, valtype uint32, err error) { + data, typ, err2 := k.getValue(name, make([]byte, 8)) + if err2 != nil { + return 0, typ, err2 + } + switch typ { + case DWORD: + if len(data) != 4 { + return 0, typ, errors.New("DWORD value is not 4 bytes long") + } + var val32 uint32 + copy((*[4]byte)(unsafe.Pointer(&val32))[:], data) + return uint64(val32), DWORD, nil + case QWORD: + if len(data) != 8 { + return 0, typ, errors.New("QWORD value is not 8 bytes long") + } + copy((*[8]byte)(unsafe.Pointer(&val))[:], data) + return val, QWORD, nil + default: + return 0, typ, ErrUnexpectedType + } +} + +// GetBinaryValue retrieves the binary value for the specified +// value name associated with an open key k. It also returns the value's type. +// If value does not exist, GetBinaryValue returns ErrNotExist. +// If value is not BINARY, it will return the correct value +// type and ErrUnexpectedType. +func (k Key) GetBinaryValue(name string) (val []byte, valtype uint32, err error) { + data, typ, err2 := k.getValue(name, make([]byte, 64)) + if err2 != nil { + return nil, typ, err2 + } + if typ != BINARY { + return nil, typ, ErrUnexpectedType + } + return data, typ, nil +} + +func (k Key) setValue(name string, valtype uint32, data []byte) error { + p, err := syscall.UTF16PtrFromString(name) + if err != nil { + return err + } + if len(data) == 0 { + return regSetValueEx(syscall.Handle(k), p, 0, valtype, nil, 0) + } + return regSetValueEx(syscall.Handle(k), p, 0, valtype, &data[0], uint32(len(data))) +} + +// SetDWordValue sets the data and type of a name value +// under key k to value and DWORD. +func (k Key) SetDWordValue(name string, value uint32) error { + return k.setValue(name, DWORD, (*[4]byte)(unsafe.Pointer(&value))[:]) +} + +// SetQWordValue sets the data and type of a name value +// under key k to value and QWORD. +func (k Key) SetQWordValue(name string, value uint64) error { + return k.setValue(name, QWORD, (*[8]byte)(unsafe.Pointer(&value))[:]) +} + +func (k Key) setStringValue(name string, valtype uint32, value string) error { + v, err := syscall.UTF16FromString(value) + if err != nil { + return err + } + buf := (*[1 << 29]byte)(unsafe.Pointer(&v[0]))[: len(v)*2 : len(v)*2] + return k.setValue(name, valtype, buf) +} + +// SetStringValue sets the data and type of a name value +// under key k to value and SZ. The value must not contain a zero byte. +func (k Key) SetStringValue(name, value string) error { + return k.setStringValue(name, SZ, value) +} + +// SetExpandStringValue sets the data and type of a name value +// under key k to value and EXPAND_SZ. The value must not contain a zero byte. +func (k Key) SetExpandStringValue(name, value string) error { + return k.setStringValue(name, EXPAND_SZ, value) +} + +// SetStringsValue sets the data and type of a name value +// under key k to value and MULTI_SZ. The value strings +// must not contain a zero byte. +func (k Key) SetStringsValue(name string, value []string) error { + ss := "" + for _, s := range value { + for i := 0; i < len(s); i++ { + if s[i] == 0 { + return errors.New("string cannot have 0 inside") + } + } + ss += s + "\x00" + } + v := utf16.Encode([]rune(ss + "\x00")) + buf := (*[1 << 29]byte)(unsafe.Pointer(&v[0]))[: len(v)*2 : len(v)*2] + return k.setValue(name, MULTI_SZ, buf) +} + +// SetBinaryValue sets the data and type of a name value +// under key k to value and BINARY. +func (k Key) SetBinaryValue(name string, value []byte) error { + return k.setValue(name, BINARY, value) +} + +// DeleteValue removes a named value from the key k. +func (k Key) DeleteValue(name string) error { + return regDeleteValue(syscall.Handle(k), syscall.StringToUTF16Ptr(name)) +} + +// ReadValueNames returns the value names of key k. +// The parameter n controls the number of returned names, +// analogous to the way os.File.Readdirnames works. +func (k Key) ReadValueNames(n int) ([]string, error) { + ki, err := k.Stat() + if err != nil { + return nil, err + } + names := make([]string, 0, ki.ValueCount) + buf := make([]uint16, ki.MaxValueNameLen+1) // extra room for terminating null character +loopItems: + for i := uint32(0); ; i++ { + if n > 0 { + if len(names) == n { + return names, nil + } + } + l := uint32(len(buf)) + for { + err := regEnumValue(syscall.Handle(k), i, &buf[0], &l, nil, nil, nil, nil) + if err == nil { + break + } + if err == syscall.ERROR_MORE_DATA { + // Double buffer size and try again. + l = uint32(2 * len(buf)) + buf = make([]uint16, l) + continue + } + if err == _ERROR_NO_MORE_ITEMS { + break loopItems + } + return names, err + } + names = append(names, syscall.UTF16ToString(buf[:l])) + } + if n > len(names) { + return names, io.EOF + } + return names, nil +} diff --git a/vendor/golang.org/x/sys/windows/registry/zsyscall_windows.go b/vendor/golang.org/x/sys/windows/registry/zsyscall_windows.go new file mode 100644 index 0000000..fc1835d --- /dev/null +++ b/vendor/golang.org/x/sys/windows/registry/zsyscall_windows.go @@ -0,0 +1,117 @@ +// Code generated by 'go generate'; DO NOT EDIT. + +package registry + +import ( + "syscall" + "unsafe" + + "golang.org/x/sys/windows" +) + +var _ unsafe.Pointer + +// Do the interface allocations only once for common +// Errno values. +const ( + errnoERROR_IO_PENDING = 997 +) + +var ( + errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING) + errERROR_EINVAL error = syscall.EINVAL +) + +// errnoErr returns common boxed Errno values, to prevent +// allocations at runtime. +func errnoErr(e syscall.Errno) error { + switch e { + case 0: + return errERROR_EINVAL + case errnoERROR_IO_PENDING: + return errERROR_IO_PENDING + } + // TODO: add more here, after collecting data on the common + // error values see on Windows. (perhaps when running + // all.bat?) + return e +} + +var ( + modadvapi32 = windows.NewLazySystemDLL("advapi32.dll") + modkernel32 = windows.NewLazySystemDLL("kernel32.dll") + + procRegConnectRegistryW = modadvapi32.NewProc("RegConnectRegistryW") + procRegCreateKeyExW = modadvapi32.NewProc("RegCreateKeyExW") + procRegDeleteKeyW = modadvapi32.NewProc("RegDeleteKeyW") + procRegDeleteValueW = modadvapi32.NewProc("RegDeleteValueW") + procRegEnumValueW = modadvapi32.NewProc("RegEnumValueW") + procRegLoadMUIStringW = modadvapi32.NewProc("RegLoadMUIStringW") + procRegSetValueExW = modadvapi32.NewProc("RegSetValueExW") + procExpandEnvironmentStringsW = modkernel32.NewProc("ExpandEnvironmentStringsW") +) + +func regConnectRegistry(machinename *uint16, key syscall.Handle, result *syscall.Handle) (regerrno error) { + r0, _, _ := syscall.Syscall(procRegConnectRegistryW.Addr(), 3, uintptr(unsafe.Pointer(machinename)), uintptr(key), uintptr(unsafe.Pointer(result))) + if r0 != 0 { + regerrno = syscall.Errno(r0) + } + return +} + +func regCreateKeyEx(key syscall.Handle, subkey *uint16, reserved uint32, class *uint16, options uint32, desired uint32, sa *syscall.SecurityAttributes, result *syscall.Handle, disposition *uint32) (regerrno error) { + r0, _, _ := syscall.Syscall9(procRegCreateKeyExW.Addr(), 9, uintptr(key), uintptr(unsafe.Pointer(subkey)), uintptr(reserved), uintptr(unsafe.Pointer(class)), uintptr(options), uintptr(desired), uintptr(unsafe.Pointer(sa)), uintptr(unsafe.Pointer(result)), uintptr(unsafe.Pointer(disposition))) + if r0 != 0 { + regerrno = syscall.Errno(r0) + } + return +} + +func regDeleteKey(key syscall.Handle, subkey *uint16) (regerrno error) { + r0, _, _ := syscall.Syscall(procRegDeleteKeyW.Addr(), 2, uintptr(key), uintptr(unsafe.Pointer(subkey)), 0) + if r0 != 0 { + regerrno = syscall.Errno(r0) + } + return +} + +func regDeleteValue(key syscall.Handle, name *uint16) (regerrno error) { + r0, _, _ := syscall.Syscall(procRegDeleteValueW.Addr(), 2, uintptr(key), uintptr(unsafe.Pointer(name)), 0) + if r0 != 0 { + regerrno = syscall.Errno(r0) + } + return +} + +func regEnumValue(key syscall.Handle, index uint32, name *uint16, nameLen *uint32, reserved *uint32, valtype *uint32, buf *byte, buflen *uint32) (regerrno error) { + r0, _, _ := syscall.Syscall9(procRegEnumValueW.Addr(), 8, uintptr(key), uintptr(index), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(nameLen)), uintptr(unsafe.Pointer(reserved)), uintptr(unsafe.Pointer(valtype)), uintptr(unsafe.Pointer(buf)), uintptr(unsafe.Pointer(buflen)), 0) + if r0 != 0 { + regerrno = syscall.Errno(r0) + } + return +} + +func regLoadMUIString(key syscall.Handle, name *uint16, buf *uint16, buflen uint32, buflenCopied *uint32, flags uint32, dir *uint16) (regerrno error) { + r0, _, _ := syscall.Syscall9(procRegLoadMUIStringW.Addr(), 7, uintptr(key), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(buf)), uintptr(buflen), uintptr(unsafe.Pointer(buflenCopied)), uintptr(flags), uintptr(unsafe.Pointer(dir)), 0, 0) + if r0 != 0 { + regerrno = syscall.Errno(r0) + } + return +} + +func regSetValueEx(key syscall.Handle, valueName *uint16, reserved uint32, vtype uint32, buf *byte, bufsize uint32) (regerrno error) { + r0, _, _ := syscall.Syscall6(procRegSetValueExW.Addr(), 6, uintptr(key), uintptr(unsafe.Pointer(valueName)), uintptr(reserved), uintptr(vtype), uintptr(unsafe.Pointer(buf)), uintptr(bufsize)) + if r0 != 0 { + regerrno = syscall.Errno(r0) + } + return +} + +func expandEnvironmentStrings(src *uint16, dst *uint16, size uint32) (n uint32, err error) { + r0, _, e1 := syscall.Syscall(procExpandEnvironmentStringsW.Addr(), 3, uintptr(unsafe.Pointer(src)), uintptr(unsafe.Pointer(dst)), uintptr(size)) + n = uint32(r0) + if n == 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/golang.org/x/text/AUTHORS b/vendor/golang.org/x/text/AUTHORS deleted file mode 100644 index 15167cd..0000000 --- a/vendor/golang.org/x/text/AUTHORS +++ /dev/null @@ -1,3 +0,0 @@ -# This source code refers to The Go Authors for copyright purposes. -# The master list of authors is in the main Go distribution, -# visible at http://tip.golang.org/AUTHORS. diff --git a/vendor/golang.org/x/text/CONTRIBUTORS b/vendor/golang.org/x/text/CONTRIBUTORS deleted file mode 100644 index 1c4577e..0000000 --- a/vendor/golang.org/x/text/CONTRIBUTORS +++ /dev/null @@ -1,3 +0,0 @@ -# This source code was written by the Go contributors. -# The master list of contributors is in the main Go distribution, -# visible at http://tip.golang.org/CONTRIBUTORS. diff --git a/vendor/golang.org/x/text/PATENTS b/vendor/golang.org/x/text/PATENTS deleted file mode 100644 index 7330990..0000000 --- a/vendor/golang.org/x/text/PATENTS +++ /dev/null @@ -1,22 +0,0 @@ -Additional IP Rights Grant (Patents) - -"This implementation" means the copyrightable works distributed by -Google as part of the Go project. - -Google hereby grants to You a perpetual, worldwide, non-exclusive, -no-charge, royalty-free, irrevocable (except as stated in this section) -patent license to make, have made, use, offer to sell, sell, import, -transfer and otherwise run, modify and propagate the contents of this -implementation of Go, where such license applies only to those patent -claims, both currently owned or controlled by Google and acquired in -the future, licensable by Google that are necessarily infringed by this -implementation of Go. This grant does not include claims that would be -infringed only as a consequence of further modification of this -implementation. If you or your agent or exclusive licensee institute or -order or agree to the institution of patent litigation against any -entity (including a cross-claim or counterclaim in a lawsuit) alleging -that this implementation of Go or any code incorporated within this -implementation of Go constitutes direct or contributory patent -infringement, or inducement of patent infringement, then any patent -rights granted to you under this License for this implementation of Go -shall terminate as of the date such litigation is filed. diff --git a/vendor/golang.org/x/text/encoding/encoding.go b/vendor/golang.org/x/text/encoding/encoding.go deleted file mode 100644 index a0bd7cd..0000000 --- a/vendor/golang.org/x/text/encoding/encoding.go +++ /dev/null @@ -1,335 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package encoding defines an interface for character encodings, such as Shift -// JIS and Windows 1252, that can convert to and from UTF-8. -// -// Encoding implementations are provided in other packages, such as -// golang.org/x/text/encoding/charmap and -// golang.org/x/text/encoding/japanese. -package encoding // import "golang.org/x/text/encoding" - -import ( - "errors" - "io" - "strconv" - "unicode/utf8" - - "golang.org/x/text/encoding/internal/identifier" - "golang.org/x/text/transform" -) - -// TODO: -// - There seems to be some inconsistency in when decoders return errors -// and when not. Also documentation seems to suggest they shouldn't return -// errors at all (except for UTF-16). -// - Encoders seem to rely on or at least benefit from the input being in NFC -// normal form. Perhaps add an example how users could prepare their output. - -// Encoding is a character set encoding that can be transformed to and from -// UTF-8. -type Encoding interface { - // NewDecoder returns a Decoder. - NewDecoder() *Decoder - - // NewEncoder returns an Encoder. - NewEncoder() *Encoder -} - -// A Decoder converts bytes to UTF-8. It implements transform.Transformer. -// -// Transforming source bytes that are not of that encoding will not result in an -// error per se. Each byte that cannot be transcoded will be represented in the -// output by the UTF-8 encoding of '\uFFFD', the replacement rune. -type Decoder struct { - transform.Transformer - - // This forces external creators of Decoders to use names in struct - // initializers, allowing for future extendibility without having to break - // code. - _ struct{} -} - -// Bytes converts the given encoded bytes to UTF-8. It returns the converted -// bytes or nil, err if any error occurred. -func (d *Decoder) Bytes(b []byte) ([]byte, error) { - b, _, err := transform.Bytes(d, b) - if err != nil { - return nil, err - } - return b, nil -} - -// String converts the given encoded string to UTF-8. It returns the converted -// string or "", err if any error occurred. -func (d *Decoder) String(s string) (string, error) { - s, _, err := transform.String(d, s) - if err != nil { - return "", err - } - return s, nil -} - -// Reader wraps another Reader to decode its bytes. -// -// The Decoder may not be used for any other operation as long as the returned -// Reader is in use. -func (d *Decoder) Reader(r io.Reader) io.Reader { - return transform.NewReader(r, d) -} - -// An Encoder converts bytes from UTF-8. It implements transform.Transformer. -// -// Each rune that cannot be transcoded will result in an error. In this case, -// the transform will consume all source byte up to, not including the offending -// rune. Transforming source bytes that are not valid UTF-8 will be replaced by -// `\uFFFD`. To return early with an error instead, use transform.Chain to -// preprocess the data with a UTF8Validator. -type Encoder struct { - transform.Transformer - - // This forces external creators of Encoders to use names in struct - // initializers, allowing for future extendibility without having to break - // code. - _ struct{} -} - -// Bytes converts bytes from UTF-8. It returns the converted bytes or nil, err if -// any error occurred. -func (e *Encoder) Bytes(b []byte) ([]byte, error) { - b, _, err := transform.Bytes(e, b) - if err != nil { - return nil, err - } - return b, nil -} - -// String converts a string from UTF-8. It returns the converted string or -// "", err if any error occurred. -func (e *Encoder) String(s string) (string, error) { - s, _, err := transform.String(e, s) - if err != nil { - return "", err - } - return s, nil -} - -// Writer wraps another Writer to encode its UTF-8 output. -// -// The Encoder may not be used for any other operation as long as the returned -// Writer is in use. -func (e *Encoder) Writer(w io.Writer) io.Writer { - return transform.NewWriter(w, e) -} - -// ASCIISub is the ASCII substitute character, as recommended by -// https://unicode.org/reports/tr36/#Text_Comparison -const ASCIISub = '\x1a' - -// Nop is the nop encoding. Its transformed bytes are the same as the source -// bytes; it does not replace invalid UTF-8 sequences. -var Nop Encoding = nop{} - -type nop struct{} - -func (nop) NewDecoder() *Decoder { - return &Decoder{Transformer: transform.Nop} -} -func (nop) NewEncoder() *Encoder { - return &Encoder{Transformer: transform.Nop} -} - -// Replacement is the replacement encoding. Decoding from the replacement -// encoding yields a single '\uFFFD' replacement rune. Encoding from UTF-8 to -// the replacement encoding yields the same as the source bytes except that -// invalid UTF-8 is converted to '\uFFFD'. -// -// It is defined at http://encoding.spec.whatwg.org/#replacement -var Replacement Encoding = replacement{} - -type replacement struct{} - -func (replacement) NewDecoder() *Decoder { - return &Decoder{Transformer: replacementDecoder{}} -} - -func (replacement) NewEncoder() *Encoder { - return &Encoder{Transformer: replacementEncoder{}} -} - -func (replacement) ID() (mib identifier.MIB, other string) { - return identifier.Replacement, "" -} - -type replacementDecoder struct{ transform.NopResetter } - -func (replacementDecoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { - if len(dst) < 3 { - return 0, 0, transform.ErrShortDst - } - if atEOF { - const fffd = "\ufffd" - dst[0] = fffd[0] - dst[1] = fffd[1] - dst[2] = fffd[2] - nDst = 3 - } - return nDst, len(src), nil -} - -type replacementEncoder struct{ transform.NopResetter } - -func (replacementEncoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { - r, size := rune(0), 0 - - for ; nSrc < len(src); nSrc += size { - r = rune(src[nSrc]) - - // Decode a 1-byte rune. - if r < utf8.RuneSelf { - size = 1 - - } else { - // Decode a multi-byte rune. - r, size = utf8.DecodeRune(src[nSrc:]) - if size == 1 { - // All valid runes of size 1 (those below utf8.RuneSelf) were - // handled above. We have invalid UTF-8 or we haven't seen the - // full character yet. - if !atEOF && !utf8.FullRune(src[nSrc:]) { - err = transform.ErrShortSrc - break - } - r = '\ufffd' - } - } - - if nDst+utf8.RuneLen(r) > len(dst) { - err = transform.ErrShortDst - break - } - nDst += utf8.EncodeRune(dst[nDst:], r) - } - return nDst, nSrc, err -} - -// HTMLEscapeUnsupported wraps encoders to replace source runes outside the -// repertoire of the destination encoding with HTML escape sequences. -// -// This wrapper exists to comply to URL and HTML forms requiring a -// non-terminating legacy encoder. The produced sequences may lead to data -// loss as they are indistinguishable from legitimate input. To avoid this -// issue, use UTF-8 encodings whenever possible. -func HTMLEscapeUnsupported(e *Encoder) *Encoder { - return &Encoder{Transformer: &errorHandler{e, errorToHTML}} -} - -// ReplaceUnsupported wraps encoders to replace source runes outside the -// repertoire of the destination encoding with an encoding-specific -// replacement. -// -// This wrapper is only provided for backwards compatibility and legacy -// handling. Its use is strongly discouraged. Use UTF-8 whenever possible. -func ReplaceUnsupported(e *Encoder) *Encoder { - return &Encoder{Transformer: &errorHandler{e, errorToReplacement}} -} - -type errorHandler struct { - *Encoder - handler func(dst []byte, r rune, err repertoireError) (n int, ok bool) -} - -// TODO: consider making this error public in some form. -type repertoireError interface { - Replacement() byte -} - -func (h errorHandler) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { - nDst, nSrc, err = h.Transformer.Transform(dst, src, atEOF) - for err != nil { - rerr, ok := err.(repertoireError) - if !ok { - return nDst, nSrc, err - } - r, sz := utf8.DecodeRune(src[nSrc:]) - n, ok := h.handler(dst[nDst:], r, rerr) - if !ok { - return nDst, nSrc, transform.ErrShortDst - } - err = nil - nDst += n - if nSrc += sz; nSrc < len(src) { - var dn, sn int - dn, sn, err = h.Transformer.Transform(dst[nDst:], src[nSrc:], atEOF) - nDst += dn - nSrc += sn - } - } - return nDst, nSrc, err -} - -func errorToHTML(dst []byte, r rune, err repertoireError) (n int, ok bool) { - buf := [8]byte{} - b := strconv.AppendUint(buf[:0], uint64(r), 10) - if n = len(b) + len("&#;"); n >= len(dst) { - return 0, false - } - dst[0] = '&' - dst[1] = '#' - dst[copy(dst[2:], b)+2] = ';' - return n, true -} - -func errorToReplacement(dst []byte, r rune, err repertoireError) (n int, ok bool) { - if len(dst) == 0 { - return 0, false - } - dst[0] = err.Replacement() - return 1, true -} - -// ErrInvalidUTF8 means that a transformer encountered invalid UTF-8. -var ErrInvalidUTF8 = errors.New("encoding: invalid UTF-8") - -// UTF8Validator is a transformer that returns ErrInvalidUTF8 on the first -// input byte that is not valid UTF-8. -var UTF8Validator transform.Transformer = utf8Validator{} - -type utf8Validator struct{ transform.NopResetter } - -func (utf8Validator) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { - n := len(src) - if n > len(dst) { - n = len(dst) - } - for i := 0; i < n; { - if c := src[i]; c < utf8.RuneSelf { - dst[i] = c - i++ - continue - } - _, size := utf8.DecodeRune(src[i:]) - if size == 1 { - // All valid runes of size 1 (those below utf8.RuneSelf) were - // handled above. We have invalid UTF-8 or we haven't seen the - // full character yet. - err = ErrInvalidUTF8 - if !atEOF && !utf8.FullRune(src[i:]) { - err = transform.ErrShortSrc - } - return i, i, err - } - if i+size > len(dst) { - return i, i, transform.ErrShortDst - } - for ; size > 0; size-- { - dst[i] = src[i] - i++ - } - } - if len(src) > len(dst) { - err = transform.ErrShortDst - } - return n, n, err -} diff --git a/vendor/golang.org/x/text/encoding/internal/identifier/identifier.go b/vendor/golang.org/x/text/encoding/internal/identifier/identifier.go deleted file mode 100644 index 5c9b85c..0000000 --- a/vendor/golang.org/x/text/encoding/internal/identifier/identifier.go +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:generate go run gen.go - -// Package identifier defines the contract between implementations of Encoding -// and Index by defining identifiers that uniquely identify standardized coded -// character sets (CCS) and character encoding schemes (CES), which we will -// together refer to as encodings, for which Encoding implementations provide -// converters to and from UTF-8. This package is typically only of concern to -// implementers of Indexes and Encodings. -// -// One part of the identifier is the MIB code, which is defined by IANA and -// uniquely identifies a CCS or CES. Each code is associated with data that -// references authorities, official documentation as well as aliases and MIME -// names. -// -// Not all CESs are covered by the IANA registry. The "other" string that is -// returned by ID can be used to identify other character sets or versions of -// existing ones. -// -// It is recommended that each package that provides a set of Encodings provide -// the All and Common variables to reference all supported encodings and -// commonly used subset. This allows Index implementations to include all -// available encodings without explicitly referencing or knowing about them. -package identifier - -// Note: this package is internal, but could be made public if there is a need -// for writing third-party Indexes and Encodings. - -// References: -// - http://source.icu-project.org/repos/icu/icu/trunk/source/data/mappings/convrtrs.txt -// - http://www.iana.org/assignments/character-sets/character-sets.xhtml -// - http://www.iana.org/assignments/ianacharset-mib/ianacharset-mib -// - http://www.ietf.org/rfc/rfc2978.txt -// - https://www.unicode.org/reports/tr22/ -// - http://www.w3.org/TR/encoding/ -// - https://encoding.spec.whatwg.org/ -// - https://encoding.spec.whatwg.org/encodings.json -// - https://tools.ietf.org/html/rfc6657#section-5 - -// Interface can be implemented by Encodings to define the CCS or CES for which -// it implements conversions. -type Interface interface { - // ID returns an encoding identifier. Exactly one of the mib and other - // values should be non-zero. - // - // In the usual case it is only necessary to indicate the MIB code. The - // other string can be used to specify encodings for which there is no MIB, - // such as "x-mac-dingbat". - // - // The other string may only contain the characters a-z, A-Z, 0-9, - and _. - ID() (mib MIB, other string) - - // NOTE: the restrictions on the encoding are to allow extending the syntax - // with additional information such as versions, vendors and other variants. -} - -// A MIB identifies an encoding. It is derived from the IANA MIB codes and adds -// some identifiers for some encodings that are not covered by the IANA -// standard. -// -// See http://www.iana.org/assignments/ianacharset-mib. -type MIB uint16 - -// These additional MIB types are not defined in IANA. They are added because -// they are common and defined within the text repo. -const ( - // Unofficial marks the start of encodings not registered by IANA. - Unofficial MIB = 10000 + iota - - // Replacement is the WhatWG replacement encoding. - Replacement - - // XUserDefined is the code for x-user-defined. - XUserDefined - - // MacintoshCyrillic is the code for x-mac-cyrillic. - MacintoshCyrillic -) diff --git a/vendor/golang.org/x/text/encoding/internal/identifier/mib.go b/vendor/golang.org/x/text/encoding/internal/identifier/mib.go deleted file mode 100644 index fc7df1b..0000000 --- a/vendor/golang.org/x/text/encoding/internal/identifier/mib.go +++ /dev/null @@ -1,1619 +0,0 @@ -// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - -package identifier - -const ( - // ASCII is the MIB identifier with IANA name US-ASCII (MIME: US-ASCII). - // - // ANSI X3.4-1986 - // Reference: RFC2046 - ASCII MIB = 3 - - // ISOLatin1 is the MIB identifier with IANA name ISO_8859-1:1987 (MIME: ISO-8859-1). - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISOLatin1 MIB = 4 - - // ISOLatin2 is the MIB identifier with IANA name ISO_8859-2:1987 (MIME: ISO-8859-2). - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISOLatin2 MIB = 5 - - // ISOLatin3 is the MIB identifier with IANA name ISO_8859-3:1988 (MIME: ISO-8859-3). - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISOLatin3 MIB = 6 - - // ISOLatin4 is the MIB identifier with IANA name ISO_8859-4:1988 (MIME: ISO-8859-4). - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISOLatin4 MIB = 7 - - // ISOLatinCyrillic is the MIB identifier with IANA name ISO_8859-5:1988 (MIME: ISO-8859-5). - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISOLatinCyrillic MIB = 8 - - // ISOLatinArabic is the MIB identifier with IANA name ISO_8859-6:1987 (MIME: ISO-8859-6). - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISOLatinArabic MIB = 9 - - // ISOLatinGreek is the MIB identifier with IANA name ISO_8859-7:1987 (MIME: ISO-8859-7). - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1947 - // Reference: RFC1345 - ISOLatinGreek MIB = 10 - - // ISOLatinHebrew is the MIB identifier with IANA name ISO_8859-8:1988 (MIME: ISO-8859-8). - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISOLatinHebrew MIB = 11 - - // ISOLatin5 is the MIB identifier with IANA name ISO_8859-9:1989 (MIME: ISO-8859-9). - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISOLatin5 MIB = 12 - - // ISOLatin6 is the MIB identifier with IANA name ISO-8859-10 (MIME: ISO-8859-10). - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISOLatin6 MIB = 13 - - // ISOTextComm is the MIB identifier with IANA name ISO_6937-2-add. - // - // ISO-IR: International Register of Escape Sequences and ISO 6937-2:1983 - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISOTextComm MIB = 14 - - // HalfWidthKatakana is the MIB identifier with IANA name JIS_X0201. - // - // JIS X 0201-1976. One byte only, this is equivalent to - // JIS/Roman (similar to ASCII) plus eight-bit half-width - // Katakana - // Reference: RFC1345 - HalfWidthKatakana MIB = 15 - - // JISEncoding is the MIB identifier with IANA name JIS_Encoding. - // - // JIS X 0202-1991. Uses ISO 2022 escape sequences to - // shift code sets as documented in JIS X 0202-1991. - JISEncoding MIB = 16 - - // ShiftJIS is the MIB identifier with IANA name Shift_JIS (MIME: Shift_JIS). - // - // This charset is an extension of csHalfWidthKatakana by - // adding graphic characters in JIS X 0208. The CCS's are - // JIS X0201:1997 and JIS X0208:1997. The - // complete definition is shown in Appendix 1 of JIS - // X0208:1997. - // This charset can be used for the top-level media type "text". - ShiftJIS MIB = 17 - - // EUCPkdFmtJapanese is the MIB identifier with IANA name Extended_UNIX_Code_Packed_Format_for_Japanese (MIME: EUC-JP). - // - // Standardized by OSF, UNIX International, and UNIX Systems - // Laboratories Pacific. Uses ISO 2022 rules to select - // code set 0: US-ASCII (a single 7-bit byte set) - // code set 1: JIS X0208-1990 (a double 8-bit byte set) - // restricted to A0-FF in both bytes - // code set 2: Half Width Katakana (a single 7-bit byte set) - // requiring SS2 as the character prefix - // code set 3: JIS X0212-1990 (a double 7-bit byte set) - // restricted to A0-FF in both bytes - // requiring SS3 as the character prefix - EUCPkdFmtJapanese MIB = 18 - - // EUCFixWidJapanese is the MIB identifier with IANA name Extended_UNIX_Code_Fixed_Width_for_Japanese. - // - // Used in Japan. Each character is 2 octets. - // code set 0: US-ASCII (a single 7-bit byte set) - // 1st byte = 00 - // 2nd byte = 20-7E - // code set 1: JIS X0208-1990 (a double 7-bit byte set) - // restricted to A0-FF in both bytes - // code set 2: Half Width Katakana (a single 7-bit byte set) - // 1st byte = 00 - // 2nd byte = A0-FF - // code set 3: JIS X0212-1990 (a double 7-bit byte set) - // restricted to A0-FF in - // the first byte - // and 21-7E in the second byte - EUCFixWidJapanese MIB = 19 - - // ISO4UnitedKingdom is the MIB identifier with IANA name BS_4730. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO4UnitedKingdom MIB = 20 - - // ISO11SwedishForNames is the MIB identifier with IANA name SEN_850200_C. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO11SwedishForNames MIB = 21 - - // ISO15Italian is the MIB identifier with IANA name IT. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO15Italian MIB = 22 - - // ISO17Spanish is the MIB identifier with IANA name ES. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO17Spanish MIB = 23 - - // ISO21German is the MIB identifier with IANA name DIN_66003. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO21German MIB = 24 - - // ISO60Norwegian1 is the MIB identifier with IANA name NS_4551-1. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO60Norwegian1 MIB = 25 - - // ISO69French is the MIB identifier with IANA name NF_Z_62-010. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO69French MIB = 26 - - // ISO10646UTF1 is the MIB identifier with IANA name ISO-10646-UTF-1. - // - // Universal Transfer Format (1), this is the multibyte - // encoding, that subsets ASCII-7. It does not have byte - // ordering issues. - ISO10646UTF1 MIB = 27 - - // ISO646basic1983 is the MIB identifier with IANA name ISO_646.basic:1983. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO646basic1983 MIB = 28 - - // INVARIANT is the MIB identifier with IANA name INVARIANT. - // - // Reference: RFC1345 - INVARIANT MIB = 29 - - // ISO2IntlRefVersion is the MIB identifier with IANA name ISO_646.irv:1983. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO2IntlRefVersion MIB = 30 - - // NATSSEFI is the MIB identifier with IANA name NATS-SEFI. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - NATSSEFI MIB = 31 - - // NATSSEFIADD is the MIB identifier with IANA name NATS-SEFI-ADD. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - NATSSEFIADD MIB = 32 - - // NATSDANO is the MIB identifier with IANA name NATS-DANO. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - NATSDANO MIB = 33 - - // NATSDANOADD is the MIB identifier with IANA name NATS-DANO-ADD. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - NATSDANOADD MIB = 34 - - // ISO10Swedish is the MIB identifier with IANA name SEN_850200_B. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO10Swedish MIB = 35 - - // KSC56011987 is the MIB identifier with IANA name KS_C_5601-1987. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - KSC56011987 MIB = 36 - - // ISO2022KR is the MIB identifier with IANA name ISO-2022-KR (MIME: ISO-2022-KR). - // - // rfc1557 (see also KS_C_5601-1987) - // Reference: RFC1557 - ISO2022KR MIB = 37 - - // EUCKR is the MIB identifier with IANA name EUC-KR (MIME: EUC-KR). - // - // rfc1557 (see also KS_C_5861-1992) - // Reference: RFC1557 - EUCKR MIB = 38 - - // ISO2022JP is the MIB identifier with IANA name ISO-2022-JP (MIME: ISO-2022-JP). - // - // rfc1468 (see also rfc2237 ) - // Reference: RFC1468 - ISO2022JP MIB = 39 - - // ISO2022JP2 is the MIB identifier with IANA name ISO-2022-JP-2 (MIME: ISO-2022-JP-2). - // - // rfc1554 - // Reference: RFC1554 - ISO2022JP2 MIB = 40 - - // ISO13JISC6220jp is the MIB identifier with IANA name JIS_C6220-1969-jp. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO13JISC6220jp MIB = 41 - - // ISO14JISC6220ro is the MIB identifier with IANA name JIS_C6220-1969-ro. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO14JISC6220ro MIB = 42 - - // ISO16Portuguese is the MIB identifier with IANA name PT. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO16Portuguese MIB = 43 - - // ISO18Greek7Old is the MIB identifier with IANA name greek7-old. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO18Greek7Old MIB = 44 - - // ISO19LatinGreek is the MIB identifier with IANA name latin-greek. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO19LatinGreek MIB = 45 - - // ISO25French is the MIB identifier with IANA name NF_Z_62-010_(1973). - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO25French MIB = 46 - - // ISO27LatinGreek1 is the MIB identifier with IANA name Latin-greek-1. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO27LatinGreek1 MIB = 47 - - // ISO5427Cyrillic is the MIB identifier with IANA name ISO_5427. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO5427Cyrillic MIB = 48 - - // ISO42JISC62261978 is the MIB identifier with IANA name JIS_C6226-1978. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO42JISC62261978 MIB = 49 - - // ISO47BSViewdata is the MIB identifier with IANA name BS_viewdata. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO47BSViewdata MIB = 50 - - // ISO49INIS is the MIB identifier with IANA name INIS. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO49INIS MIB = 51 - - // ISO50INIS8 is the MIB identifier with IANA name INIS-8. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO50INIS8 MIB = 52 - - // ISO51INISCyrillic is the MIB identifier with IANA name INIS-cyrillic. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO51INISCyrillic MIB = 53 - - // ISO54271981 is the MIB identifier with IANA name ISO_5427:1981. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO54271981 MIB = 54 - - // ISO5428Greek is the MIB identifier with IANA name ISO_5428:1980. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO5428Greek MIB = 55 - - // ISO57GB1988 is the MIB identifier with IANA name GB_1988-80. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO57GB1988 MIB = 56 - - // ISO58GB231280 is the MIB identifier with IANA name GB_2312-80. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO58GB231280 MIB = 57 - - // ISO61Norwegian2 is the MIB identifier with IANA name NS_4551-2. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO61Norwegian2 MIB = 58 - - // ISO70VideotexSupp1 is the MIB identifier with IANA name videotex-suppl. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO70VideotexSupp1 MIB = 59 - - // ISO84Portuguese2 is the MIB identifier with IANA name PT2. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO84Portuguese2 MIB = 60 - - // ISO85Spanish2 is the MIB identifier with IANA name ES2. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO85Spanish2 MIB = 61 - - // ISO86Hungarian is the MIB identifier with IANA name MSZ_7795.3. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO86Hungarian MIB = 62 - - // ISO87JISX0208 is the MIB identifier with IANA name JIS_C6226-1983. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO87JISX0208 MIB = 63 - - // ISO88Greek7 is the MIB identifier with IANA name greek7. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO88Greek7 MIB = 64 - - // ISO89ASMO449 is the MIB identifier with IANA name ASMO_449. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO89ASMO449 MIB = 65 - - // ISO90 is the MIB identifier with IANA name iso-ir-90. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO90 MIB = 66 - - // ISO91JISC62291984a is the MIB identifier with IANA name JIS_C6229-1984-a. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO91JISC62291984a MIB = 67 - - // ISO92JISC62991984b is the MIB identifier with IANA name JIS_C6229-1984-b. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO92JISC62991984b MIB = 68 - - // ISO93JIS62291984badd is the MIB identifier with IANA name JIS_C6229-1984-b-add. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO93JIS62291984badd MIB = 69 - - // ISO94JIS62291984hand is the MIB identifier with IANA name JIS_C6229-1984-hand. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO94JIS62291984hand MIB = 70 - - // ISO95JIS62291984handadd is the MIB identifier with IANA name JIS_C6229-1984-hand-add. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO95JIS62291984handadd MIB = 71 - - // ISO96JISC62291984kana is the MIB identifier with IANA name JIS_C6229-1984-kana. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO96JISC62291984kana MIB = 72 - - // ISO2033 is the MIB identifier with IANA name ISO_2033-1983. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO2033 MIB = 73 - - // ISO99NAPLPS is the MIB identifier with IANA name ANSI_X3.110-1983. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO99NAPLPS MIB = 74 - - // ISO102T617bit is the MIB identifier with IANA name T.61-7bit. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO102T617bit MIB = 75 - - // ISO103T618bit is the MIB identifier with IANA name T.61-8bit. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO103T618bit MIB = 76 - - // ISO111ECMACyrillic is the MIB identifier with IANA name ECMA-cyrillic. - // - // ISO registry - ISO111ECMACyrillic MIB = 77 - - // ISO121Canadian1 is the MIB identifier with IANA name CSA_Z243.4-1985-1. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO121Canadian1 MIB = 78 - - // ISO122Canadian2 is the MIB identifier with IANA name CSA_Z243.4-1985-2. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO122Canadian2 MIB = 79 - - // ISO123CSAZ24341985gr is the MIB identifier with IANA name CSA_Z243.4-1985-gr. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO123CSAZ24341985gr MIB = 80 - - // ISO88596E is the MIB identifier with IANA name ISO_8859-6-E (MIME: ISO-8859-6-E). - // - // rfc1556 - // Reference: RFC1556 - ISO88596E MIB = 81 - - // ISO88596I is the MIB identifier with IANA name ISO_8859-6-I (MIME: ISO-8859-6-I). - // - // rfc1556 - // Reference: RFC1556 - ISO88596I MIB = 82 - - // ISO128T101G2 is the MIB identifier with IANA name T.101-G2. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO128T101G2 MIB = 83 - - // ISO88598E is the MIB identifier with IANA name ISO_8859-8-E (MIME: ISO-8859-8-E). - // - // rfc1556 - // Reference: RFC1556 - ISO88598E MIB = 84 - - // ISO88598I is the MIB identifier with IANA name ISO_8859-8-I (MIME: ISO-8859-8-I). - // - // rfc1556 - // Reference: RFC1556 - ISO88598I MIB = 85 - - // ISO139CSN369103 is the MIB identifier with IANA name CSN_369103. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO139CSN369103 MIB = 86 - - // ISO141JUSIB1002 is the MIB identifier with IANA name JUS_I.B1.002. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO141JUSIB1002 MIB = 87 - - // ISO143IECP271 is the MIB identifier with IANA name IEC_P27-1. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO143IECP271 MIB = 88 - - // ISO146Serbian is the MIB identifier with IANA name JUS_I.B1.003-serb. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO146Serbian MIB = 89 - - // ISO147Macedonian is the MIB identifier with IANA name JUS_I.B1.003-mac. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO147Macedonian MIB = 90 - - // ISO150GreekCCITT is the MIB identifier with IANA name greek-ccitt. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO150GreekCCITT MIB = 91 - - // ISO151Cuba is the MIB identifier with IANA name NC_NC00-10:81. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO151Cuba MIB = 92 - - // ISO6937Add is the MIB identifier with IANA name ISO_6937-2-25. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO6937Add MIB = 93 - - // ISO153GOST1976874 is the MIB identifier with IANA name GOST_19768-74. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO153GOST1976874 MIB = 94 - - // ISO8859Supp is the MIB identifier with IANA name ISO_8859-supp. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO8859Supp MIB = 95 - - // ISO10367Box is the MIB identifier with IANA name ISO_10367-box. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO10367Box MIB = 96 - - // ISO158Lap is the MIB identifier with IANA name latin-lap. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO158Lap MIB = 97 - - // ISO159JISX02121990 is the MIB identifier with IANA name JIS_X0212-1990. - // - // ISO-IR: International Register of Escape Sequences - // Note: The current registration authority is IPSJ/ITSCJ, Japan. - // Reference: RFC1345 - ISO159JISX02121990 MIB = 98 - - // ISO646Danish is the MIB identifier with IANA name DS_2089. - // - // Danish Standard, DS 2089, February 1974 - // Reference: RFC1345 - ISO646Danish MIB = 99 - - // USDK is the MIB identifier with IANA name us-dk. - // - // Reference: RFC1345 - USDK MIB = 100 - - // DKUS is the MIB identifier with IANA name dk-us. - // - // Reference: RFC1345 - DKUS MIB = 101 - - // KSC5636 is the MIB identifier with IANA name KSC5636. - // - // Reference: RFC1345 - KSC5636 MIB = 102 - - // Unicode11UTF7 is the MIB identifier with IANA name UNICODE-1-1-UTF-7. - // - // rfc1642 - // Reference: RFC1642 - Unicode11UTF7 MIB = 103 - - // ISO2022CN is the MIB identifier with IANA name ISO-2022-CN. - // - // rfc1922 - // Reference: RFC1922 - ISO2022CN MIB = 104 - - // ISO2022CNEXT is the MIB identifier with IANA name ISO-2022-CN-EXT. - // - // rfc1922 - // Reference: RFC1922 - ISO2022CNEXT MIB = 105 - - // UTF8 is the MIB identifier with IANA name UTF-8. - // - // rfc3629 - // Reference: RFC3629 - UTF8 MIB = 106 - - // ISO885913 is the MIB identifier with IANA name ISO-8859-13. - // - // ISO See https://www.iana.org/assignments/charset-reg/ISO-8859-13 https://www.iana.org/assignments/charset-reg/ISO-8859-13 - ISO885913 MIB = 109 - - // ISO885914 is the MIB identifier with IANA name ISO-8859-14. - // - // ISO See https://www.iana.org/assignments/charset-reg/ISO-8859-14 - ISO885914 MIB = 110 - - // ISO885915 is the MIB identifier with IANA name ISO-8859-15. - // - // ISO - // Please see: https://www.iana.org/assignments/charset-reg/ISO-8859-15 - ISO885915 MIB = 111 - - // ISO885916 is the MIB identifier with IANA name ISO-8859-16. - // - // ISO - ISO885916 MIB = 112 - - // GBK is the MIB identifier with IANA name GBK. - // - // Chinese IT Standardization Technical Committee - // Please see: https://www.iana.org/assignments/charset-reg/GBK - GBK MIB = 113 - - // GB18030 is the MIB identifier with IANA name GB18030. - // - // Chinese IT Standardization Technical Committee - // Please see: https://www.iana.org/assignments/charset-reg/GB18030 - GB18030 MIB = 114 - - // OSDEBCDICDF0415 is the MIB identifier with IANA name OSD_EBCDIC_DF04_15. - // - // Fujitsu-Siemens standard mainframe EBCDIC encoding - // Please see: https://www.iana.org/assignments/charset-reg/OSD-EBCDIC-DF04-15 - OSDEBCDICDF0415 MIB = 115 - - // OSDEBCDICDF03IRV is the MIB identifier with IANA name OSD_EBCDIC_DF03_IRV. - // - // Fujitsu-Siemens standard mainframe EBCDIC encoding - // Please see: https://www.iana.org/assignments/charset-reg/OSD-EBCDIC-DF03-IRV - OSDEBCDICDF03IRV MIB = 116 - - // OSDEBCDICDF041 is the MIB identifier with IANA name OSD_EBCDIC_DF04_1. - // - // Fujitsu-Siemens standard mainframe EBCDIC encoding - // Please see: https://www.iana.org/assignments/charset-reg/OSD-EBCDIC-DF04-1 - OSDEBCDICDF041 MIB = 117 - - // ISO115481 is the MIB identifier with IANA name ISO-11548-1. - // - // See https://www.iana.org/assignments/charset-reg/ISO-11548-1 - ISO115481 MIB = 118 - - // KZ1048 is the MIB identifier with IANA name KZ-1048. - // - // See https://www.iana.org/assignments/charset-reg/KZ-1048 - KZ1048 MIB = 119 - - // Unicode is the MIB identifier with IANA name ISO-10646-UCS-2. - // - // the 2-octet Basic Multilingual Plane, aka Unicode - // this needs to specify network byte order: the standard - // does not specify (it is a 16-bit integer space) - Unicode MIB = 1000 - - // UCS4 is the MIB identifier with IANA name ISO-10646-UCS-4. - // - // the full code space. (same comment about byte order, - // these are 31-bit numbers. - UCS4 MIB = 1001 - - // UnicodeASCII is the MIB identifier with IANA name ISO-10646-UCS-Basic. - // - // ASCII subset of Unicode. Basic Latin = collection 1 - // See ISO 10646, Appendix A - UnicodeASCII MIB = 1002 - - // UnicodeLatin1 is the MIB identifier with IANA name ISO-10646-Unicode-Latin1. - // - // ISO Latin-1 subset of Unicode. Basic Latin and Latin-1 - // Supplement = collections 1 and 2. See ISO 10646, - // Appendix A. See rfc1815 . - UnicodeLatin1 MIB = 1003 - - // UnicodeJapanese is the MIB identifier with IANA name ISO-10646-J-1. - // - // ISO 10646 Japanese, see rfc1815 . - UnicodeJapanese MIB = 1004 - - // UnicodeIBM1261 is the MIB identifier with IANA name ISO-Unicode-IBM-1261. - // - // IBM Latin-2, -3, -5, Extended Presentation Set, GCSGID: 1261 - UnicodeIBM1261 MIB = 1005 - - // UnicodeIBM1268 is the MIB identifier with IANA name ISO-Unicode-IBM-1268. - // - // IBM Latin-4 Extended Presentation Set, GCSGID: 1268 - UnicodeIBM1268 MIB = 1006 - - // UnicodeIBM1276 is the MIB identifier with IANA name ISO-Unicode-IBM-1276. - // - // IBM Cyrillic Greek Extended Presentation Set, GCSGID: 1276 - UnicodeIBM1276 MIB = 1007 - - // UnicodeIBM1264 is the MIB identifier with IANA name ISO-Unicode-IBM-1264. - // - // IBM Arabic Presentation Set, GCSGID: 1264 - UnicodeIBM1264 MIB = 1008 - - // UnicodeIBM1265 is the MIB identifier with IANA name ISO-Unicode-IBM-1265. - // - // IBM Hebrew Presentation Set, GCSGID: 1265 - UnicodeIBM1265 MIB = 1009 - - // Unicode11 is the MIB identifier with IANA name UNICODE-1-1. - // - // rfc1641 - // Reference: RFC1641 - Unicode11 MIB = 1010 - - // SCSU is the MIB identifier with IANA name SCSU. - // - // SCSU See https://www.iana.org/assignments/charset-reg/SCSU - SCSU MIB = 1011 - - // UTF7 is the MIB identifier with IANA name UTF-7. - // - // rfc2152 - // Reference: RFC2152 - UTF7 MIB = 1012 - - // UTF16BE is the MIB identifier with IANA name UTF-16BE. - // - // rfc2781 - // Reference: RFC2781 - UTF16BE MIB = 1013 - - // UTF16LE is the MIB identifier with IANA name UTF-16LE. - // - // rfc2781 - // Reference: RFC2781 - UTF16LE MIB = 1014 - - // UTF16 is the MIB identifier with IANA name UTF-16. - // - // rfc2781 - // Reference: RFC2781 - UTF16 MIB = 1015 - - // CESU8 is the MIB identifier with IANA name CESU-8. - // - // https://www.unicode.org/reports/tr26 - CESU8 MIB = 1016 - - // UTF32 is the MIB identifier with IANA name UTF-32. - // - // https://www.unicode.org/reports/tr19/ - UTF32 MIB = 1017 - - // UTF32BE is the MIB identifier with IANA name UTF-32BE. - // - // https://www.unicode.org/reports/tr19/ - UTF32BE MIB = 1018 - - // UTF32LE is the MIB identifier with IANA name UTF-32LE. - // - // https://www.unicode.org/reports/tr19/ - UTF32LE MIB = 1019 - - // BOCU1 is the MIB identifier with IANA name BOCU-1. - // - // https://www.unicode.org/notes/tn6/ - BOCU1 MIB = 1020 - - // Windows30Latin1 is the MIB identifier with IANA name ISO-8859-1-Windows-3.0-Latin-1. - // - // Extended ISO 8859-1 Latin-1 for Windows 3.0. - // PCL Symbol Set id: 9U - Windows30Latin1 MIB = 2000 - - // Windows31Latin1 is the MIB identifier with IANA name ISO-8859-1-Windows-3.1-Latin-1. - // - // Extended ISO 8859-1 Latin-1 for Windows 3.1. - // PCL Symbol Set id: 19U - Windows31Latin1 MIB = 2001 - - // Windows31Latin2 is the MIB identifier with IANA name ISO-8859-2-Windows-Latin-2. - // - // Extended ISO 8859-2. Latin-2 for Windows 3.1. - // PCL Symbol Set id: 9E - Windows31Latin2 MIB = 2002 - - // Windows31Latin5 is the MIB identifier with IANA name ISO-8859-9-Windows-Latin-5. - // - // Extended ISO 8859-9. Latin-5 for Windows 3.1 - // PCL Symbol Set id: 5T - Windows31Latin5 MIB = 2003 - - // HPRoman8 is the MIB identifier with IANA name hp-roman8. - // - // LaserJet IIP Printer User's Manual, - // HP part no 33471-90901, Hewlet-Packard, June 1989. - // Reference: RFC1345 - HPRoman8 MIB = 2004 - - // AdobeStandardEncoding is the MIB identifier with IANA name Adobe-Standard-Encoding. - // - // PostScript Language Reference Manual - // PCL Symbol Set id: 10J - AdobeStandardEncoding MIB = 2005 - - // VenturaUS is the MIB identifier with IANA name Ventura-US. - // - // Ventura US. ASCII plus characters typically used in - // publishing, like pilcrow, copyright, registered, trade mark, - // section, dagger, and double dagger in the range A0 (hex) - // to FF (hex). - // PCL Symbol Set id: 14J - VenturaUS MIB = 2006 - - // VenturaInternational is the MIB identifier with IANA name Ventura-International. - // - // Ventura International. ASCII plus coded characters similar - // to Roman8. - // PCL Symbol Set id: 13J - VenturaInternational MIB = 2007 - - // DECMCS is the MIB identifier with IANA name DEC-MCS. - // - // VAX/VMS User's Manual, - // Order Number: AI-Y517A-TE, April 1986. - // Reference: RFC1345 - DECMCS MIB = 2008 - - // PC850Multilingual is the MIB identifier with IANA name IBM850. - // - // IBM NLS RM Vol2 SE09-8002-01, March 1990 - // Reference: RFC1345 - PC850Multilingual MIB = 2009 - - // PC8DanishNorwegian is the MIB identifier with IANA name PC8-Danish-Norwegian. - // - // PC Danish Norwegian - // 8-bit PC set for Danish Norwegian - // PCL Symbol Set id: 11U - PC8DanishNorwegian MIB = 2012 - - // PC862LatinHebrew is the MIB identifier with IANA name IBM862. - // - // IBM NLS RM Vol2 SE09-8002-01, March 1990 - // Reference: RFC1345 - PC862LatinHebrew MIB = 2013 - - // PC8Turkish is the MIB identifier with IANA name PC8-Turkish. - // - // PC Latin Turkish. PCL Symbol Set id: 9T - PC8Turkish MIB = 2014 - - // IBMSymbols is the MIB identifier with IANA name IBM-Symbols. - // - // Presentation Set, CPGID: 259 - IBMSymbols MIB = 2015 - - // IBMThai is the MIB identifier with IANA name IBM-Thai. - // - // Presentation Set, CPGID: 838 - IBMThai MIB = 2016 - - // HPLegal is the MIB identifier with IANA name HP-Legal. - // - // PCL 5 Comparison Guide, Hewlett-Packard, - // HP part number 5961-0510, October 1992 - // PCL Symbol Set id: 1U - HPLegal MIB = 2017 - - // HPPiFont is the MIB identifier with IANA name HP-Pi-font. - // - // PCL 5 Comparison Guide, Hewlett-Packard, - // HP part number 5961-0510, October 1992 - // PCL Symbol Set id: 15U - HPPiFont MIB = 2018 - - // HPMath8 is the MIB identifier with IANA name HP-Math8. - // - // PCL 5 Comparison Guide, Hewlett-Packard, - // HP part number 5961-0510, October 1992 - // PCL Symbol Set id: 8M - HPMath8 MIB = 2019 - - // HPPSMath is the MIB identifier with IANA name Adobe-Symbol-Encoding. - // - // PostScript Language Reference Manual - // PCL Symbol Set id: 5M - HPPSMath MIB = 2020 - - // HPDesktop is the MIB identifier with IANA name HP-DeskTop. - // - // PCL 5 Comparison Guide, Hewlett-Packard, - // HP part number 5961-0510, October 1992 - // PCL Symbol Set id: 7J - HPDesktop MIB = 2021 - - // VenturaMath is the MIB identifier with IANA name Ventura-Math. - // - // PCL 5 Comparison Guide, Hewlett-Packard, - // HP part number 5961-0510, October 1992 - // PCL Symbol Set id: 6M - VenturaMath MIB = 2022 - - // MicrosoftPublishing is the MIB identifier with IANA name Microsoft-Publishing. - // - // PCL 5 Comparison Guide, Hewlett-Packard, - // HP part number 5961-0510, October 1992 - // PCL Symbol Set id: 6J - MicrosoftPublishing MIB = 2023 - - // Windows31J is the MIB identifier with IANA name Windows-31J. - // - // Windows Japanese. A further extension of Shift_JIS - // to include NEC special characters (Row 13), NEC - // selection of IBM extensions (Rows 89 to 92), and IBM - // extensions (Rows 115 to 119). The CCS's are - // JIS X0201:1997, JIS X0208:1997, and these extensions. - // This charset can be used for the top-level media type "text", - // but it is of limited or specialized use (see rfc2278 ). - // PCL Symbol Set id: 19K - Windows31J MIB = 2024 - - // GB2312 is the MIB identifier with IANA name GB2312 (MIME: GB2312). - // - // Chinese for People's Republic of China (PRC) mixed one byte, - // two byte set: - // 20-7E = one byte ASCII - // A1-FE = two byte PRC Kanji - // See GB 2312-80 - // PCL Symbol Set Id: 18C - GB2312 MIB = 2025 - - // Big5 is the MIB identifier with IANA name Big5 (MIME: Big5). - // - // Chinese for Taiwan Multi-byte set. - // PCL Symbol Set Id: 18T - Big5 MIB = 2026 - - // Macintosh is the MIB identifier with IANA name macintosh. - // - // The Unicode Standard ver1.0, ISBN 0-201-56788-1, Oct 1991 - // Reference: RFC1345 - Macintosh MIB = 2027 - - // IBM037 is the MIB identifier with IANA name IBM037. - // - // IBM NLS RM Vol2 SE09-8002-01, March 1990 - // Reference: RFC1345 - IBM037 MIB = 2028 - - // IBM038 is the MIB identifier with IANA name IBM038. - // - // IBM 3174 Character Set Ref, GA27-3831-02, March 1990 - // Reference: RFC1345 - IBM038 MIB = 2029 - - // IBM273 is the MIB identifier with IANA name IBM273. - // - // IBM NLS RM Vol2 SE09-8002-01, March 1990 - // Reference: RFC1345 - IBM273 MIB = 2030 - - // IBM274 is the MIB identifier with IANA name IBM274. - // - // IBM 3174 Character Set Ref, GA27-3831-02, March 1990 - // Reference: RFC1345 - IBM274 MIB = 2031 - - // IBM275 is the MIB identifier with IANA name IBM275. - // - // IBM NLS RM Vol2 SE09-8002-01, March 1990 - // Reference: RFC1345 - IBM275 MIB = 2032 - - // IBM277 is the MIB identifier with IANA name IBM277. - // - // IBM NLS RM Vol2 SE09-8002-01, March 1990 - // Reference: RFC1345 - IBM277 MIB = 2033 - - // IBM278 is the MIB identifier with IANA name IBM278. - // - // IBM NLS RM Vol2 SE09-8002-01, March 1990 - // Reference: RFC1345 - IBM278 MIB = 2034 - - // IBM280 is the MIB identifier with IANA name IBM280. - // - // IBM NLS RM Vol2 SE09-8002-01, March 1990 - // Reference: RFC1345 - IBM280 MIB = 2035 - - // IBM281 is the MIB identifier with IANA name IBM281. - // - // IBM 3174 Character Set Ref, GA27-3831-02, March 1990 - // Reference: RFC1345 - IBM281 MIB = 2036 - - // IBM284 is the MIB identifier with IANA name IBM284. - // - // IBM NLS RM Vol2 SE09-8002-01, March 1990 - // Reference: RFC1345 - IBM284 MIB = 2037 - - // IBM285 is the MIB identifier with IANA name IBM285. - // - // IBM NLS RM Vol2 SE09-8002-01, March 1990 - // Reference: RFC1345 - IBM285 MIB = 2038 - - // IBM290 is the MIB identifier with IANA name IBM290. - // - // IBM 3174 Character Set Ref, GA27-3831-02, March 1990 - // Reference: RFC1345 - IBM290 MIB = 2039 - - // IBM297 is the MIB identifier with IANA name IBM297. - // - // IBM NLS RM Vol2 SE09-8002-01, March 1990 - // Reference: RFC1345 - IBM297 MIB = 2040 - - // IBM420 is the MIB identifier with IANA name IBM420. - // - // IBM NLS RM Vol2 SE09-8002-01, March 1990, - // IBM NLS RM p 11-11 - // Reference: RFC1345 - IBM420 MIB = 2041 - - // IBM423 is the MIB identifier with IANA name IBM423. - // - // IBM NLS RM Vol2 SE09-8002-01, March 1990 - // Reference: RFC1345 - IBM423 MIB = 2042 - - // IBM424 is the MIB identifier with IANA name IBM424. - // - // IBM NLS RM Vol2 SE09-8002-01, March 1990 - // Reference: RFC1345 - IBM424 MIB = 2043 - - // PC8CodePage437 is the MIB identifier with IANA name IBM437. - // - // IBM NLS RM Vol2 SE09-8002-01, March 1990 - // Reference: RFC1345 - PC8CodePage437 MIB = 2011 - - // IBM500 is the MIB identifier with IANA name IBM500. - // - // IBM NLS RM Vol2 SE09-8002-01, March 1990 - // Reference: RFC1345 - IBM500 MIB = 2044 - - // IBM851 is the MIB identifier with IANA name IBM851. - // - // IBM NLS RM Vol2 SE09-8002-01, March 1990 - // Reference: RFC1345 - IBM851 MIB = 2045 - - // PCp852 is the MIB identifier with IANA name IBM852. - // - // IBM NLS RM Vol2 SE09-8002-01, March 1990 - // Reference: RFC1345 - PCp852 MIB = 2010 - - // IBM855 is the MIB identifier with IANA name IBM855. - // - // IBM NLS RM Vol2 SE09-8002-01, March 1990 - // Reference: RFC1345 - IBM855 MIB = 2046 - - // IBM857 is the MIB identifier with IANA name IBM857. - // - // IBM NLS RM Vol2 SE09-8002-01, March 1990 - // Reference: RFC1345 - IBM857 MIB = 2047 - - // IBM860 is the MIB identifier with IANA name IBM860. - // - // IBM NLS RM Vol2 SE09-8002-01, March 1990 - // Reference: RFC1345 - IBM860 MIB = 2048 - - // IBM861 is the MIB identifier with IANA name IBM861. - // - // IBM NLS RM Vol2 SE09-8002-01, March 1990 - // Reference: RFC1345 - IBM861 MIB = 2049 - - // IBM863 is the MIB identifier with IANA name IBM863. - // - // IBM Keyboard layouts and code pages, PN 07G4586 June 1991 - // Reference: RFC1345 - IBM863 MIB = 2050 - - // IBM864 is the MIB identifier with IANA name IBM864. - // - // IBM Keyboard layouts and code pages, PN 07G4586 June 1991 - // Reference: RFC1345 - IBM864 MIB = 2051 - - // IBM865 is the MIB identifier with IANA name IBM865. - // - // IBM DOS 3.3 Ref (Abridged), 94X9575 (Feb 1987) - // Reference: RFC1345 - IBM865 MIB = 2052 - - // IBM868 is the MIB identifier with IANA name IBM868. - // - // IBM NLS RM Vol2 SE09-8002-01, March 1990 - // Reference: RFC1345 - IBM868 MIB = 2053 - - // IBM869 is the MIB identifier with IANA name IBM869. - // - // IBM Keyboard layouts and code pages, PN 07G4586 June 1991 - // Reference: RFC1345 - IBM869 MIB = 2054 - - // IBM870 is the MIB identifier with IANA name IBM870. - // - // IBM NLS RM Vol2 SE09-8002-01, March 1990 - // Reference: RFC1345 - IBM870 MIB = 2055 - - // IBM871 is the MIB identifier with IANA name IBM871. - // - // IBM NLS RM Vol2 SE09-8002-01, March 1990 - // Reference: RFC1345 - IBM871 MIB = 2056 - - // IBM880 is the MIB identifier with IANA name IBM880. - // - // IBM NLS RM Vol2 SE09-8002-01, March 1990 - // Reference: RFC1345 - IBM880 MIB = 2057 - - // IBM891 is the MIB identifier with IANA name IBM891. - // - // IBM NLS RM Vol2 SE09-8002-01, March 1990 - // Reference: RFC1345 - IBM891 MIB = 2058 - - // IBM903 is the MIB identifier with IANA name IBM903. - // - // IBM NLS RM Vol2 SE09-8002-01, March 1990 - // Reference: RFC1345 - IBM903 MIB = 2059 - - // IBBM904 is the MIB identifier with IANA name IBM904. - // - // IBM NLS RM Vol2 SE09-8002-01, March 1990 - // Reference: RFC1345 - IBBM904 MIB = 2060 - - // IBM905 is the MIB identifier with IANA name IBM905. - // - // IBM 3174 Character Set Ref, GA27-3831-02, March 1990 - // Reference: RFC1345 - IBM905 MIB = 2061 - - // IBM918 is the MIB identifier with IANA name IBM918. - // - // IBM NLS RM Vol2 SE09-8002-01, March 1990 - // Reference: RFC1345 - IBM918 MIB = 2062 - - // IBM1026 is the MIB identifier with IANA name IBM1026. - // - // IBM NLS RM Vol2 SE09-8002-01, March 1990 - // Reference: RFC1345 - IBM1026 MIB = 2063 - - // IBMEBCDICATDE is the MIB identifier with IANA name EBCDIC-AT-DE. - // - // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 - // Reference: RFC1345 - IBMEBCDICATDE MIB = 2064 - - // EBCDICATDEA is the MIB identifier with IANA name EBCDIC-AT-DE-A. - // - // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 - // Reference: RFC1345 - EBCDICATDEA MIB = 2065 - - // EBCDICCAFR is the MIB identifier with IANA name EBCDIC-CA-FR. - // - // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 - // Reference: RFC1345 - EBCDICCAFR MIB = 2066 - - // EBCDICDKNO is the MIB identifier with IANA name EBCDIC-DK-NO. - // - // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 - // Reference: RFC1345 - EBCDICDKNO MIB = 2067 - - // EBCDICDKNOA is the MIB identifier with IANA name EBCDIC-DK-NO-A. - // - // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 - // Reference: RFC1345 - EBCDICDKNOA MIB = 2068 - - // EBCDICFISE is the MIB identifier with IANA name EBCDIC-FI-SE. - // - // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 - // Reference: RFC1345 - EBCDICFISE MIB = 2069 - - // EBCDICFISEA is the MIB identifier with IANA name EBCDIC-FI-SE-A. - // - // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 - // Reference: RFC1345 - EBCDICFISEA MIB = 2070 - - // EBCDICFR is the MIB identifier with IANA name EBCDIC-FR. - // - // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 - // Reference: RFC1345 - EBCDICFR MIB = 2071 - - // EBCDICIT is the MIB identifier with IANA name EBCDIC-IT. - // - // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 - // Reference: RFC1345 - EBCDICIT MIB = 2072 - - // EBCDICPT is the MIB identifier with IANA name EBCDIC-PT. - // - // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 - // Reference: RFC1345 - EBCDICPT MIB = 2073 - - // EBCDICES is the MIB identifier with IANA name EBCDIC-ES. - // - // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 - // Reference: RFC1345 - EBCDICES MIB = 2074 - - // EBCDICESA is the MIB identifier with IANA name EBCDIC-ES-A. - // - // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 - // Reference: RFC1345 - EBCDICESA MIB = 2075 - - // EBCDICESS is the MIB identifier with IANA name EBCDIC-ES-S. - // - // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 - // Reference: RFC1345 - EBCDICESS MIB = 2076 - - // EBCDICUK is the MIB identifier with IANA name EBCDIC-UK. - // - // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 - // Reference: RFC1345 - EBCDICUK MIB = 2077 - - // EBCDICUS is the MIB identifier with IANA name EBCDIC-US. - // - // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 - // Reference: RFC1345 - EBCDICUS MIB = 2078 - - // Unknown8BiT is the MIB identifier with IANA name UNKNOWN-8BIT. - // - // Reference: RFC1428 - Unknown8BiT MIB = 2079 - - // Mnemonic is the MIB identifier with IANA name MNEMONIC. - // - // rfc1345 , also known as "mnemonic+ascii+38" - // Reference: RFC1345 - Mnemonic MIB = 2080 - - // Mnem is the MIB identifier with IANA name MNEM. - // - // rfc1345 , also known as "mnemonic+ascii+8200" - // Reference: RFC1345 - Mnem MIB = 2081 - - // VISCII is the MIB identifier with IANA name VISCII. - // - // rfc1456 - // Reference: RFC1456 - VISCII MIB = 2082 - - // VIQR is the MIB identifier with IANA name VIQR. - // - // rfc1456 - // Reference: RFC1456 - VIQR MIB = 2083 - - // KOI8R is the MIB identifier with IANA name KOI8-R (MIME: KOI8-R). - // - // rfc1489 , based on GOST-19768-74, ISO-6937/8, - // INIS-Cyrillic, ISO-5427. - // Reference: RFC1489 - KOI8R MIB = 2084 - - // HZGB2312 is the MIB identifier with IANA name HZ-GB-2312. - // - // rfc1842 , rfc1843 rfc1843 rfc1842 - HZGB2312 MIB = 2085 - - // IBM866 is the MIB identifier with IANA name IBM866. - // - // IBM NLDG Volume 2 (SE09-8002-03) August 1994 - IBM866 MIB = 2086 - - // PC775Baltic is the MIB identifier with IANA name IBM775. - // - // HP PCL 5 Comparison Guide (P/N 5021-0329) pp B-13, 1996 - PC775Baltic MIB = 2087 - - // KOI8U is the MIB identifier with IANA name KOI8-U. - // - // rfc2319 - // Reference: RFC2319 - KOI8U MIB = 2088 - - // IBM00858 is the MIB identifier with IANA name IBM00858. - // - // IBM See https://www.iana.org/assignments/charset-reg/IBM00858 - IBM00858 MIB = 2089 - - // IBM00924 is the MIB identifier with IANA name IBM00924. - // - // IBM See https://www.iana.org/assignments/charset-reg/IBM00924 - IBM00924 MIB = 2090 - - // IBM01140 is the MIB identifier with IANA name IBM01140. - // - // IBM See https://www.iana.org/assignments/charset-reg/IBM01140 - IBM01140 MIB = 2091 - - // IBM01141 is the MIB identifier with IANA name IBM01141. - // - // IBM See https://www.iana.org/assignments/charset-reg/IBM01141 - IBM01141 MIB = 2092 - - // IBM01142 is the MIB identifier with IANA name IBM01142. - // - // IBM See https://www.iana.org/assignments/charset-reg/IBM01142 - IBM01142 MIB = 2093 - - // IBM01143 is the MIB identifier with IANA name IBM01143. - // - // IBM See https://www.iana.org/assignments/charset-reg/IBM01143 - IBM01143 MIB = 2094 - - // IBM01144 is the MIB identifier with IANA name IBM01144. - // - // IBM See https://www.iana.org/assignments/charset-reg/IBM01144 - IBM01144 MIB = 2095 - - // IBM01145 is the MIB identifier with IANA name IBM01145. - // - // IBM See https://www.iana.org/assignments/charset-reg/IBM01145 - IBM01145 MIB = 2096 - - // IBM01146 is the MIB identifier with IANA name IBM01146. - // - // IBM See https://www.iana.org/assignments/charset-reg/IBM01146 - IBM01146 MIB = 2097 - - // IBM01147 is the MIB identifier with IANA name IBM01147. - // - // IBM See https://www.iana.org/assignments/charset-reg/IBM01147 - IBM01147 MIB = 2098 - - // IBM01148 is the MIB identifier with IANA name IBM01148. - // - // IBM See https://www.iana.org/assignments/charset-reg/IBM01148 - IBM01148 MIB = 2099 - - // IBM01149 is the MIB identifier with IANA name IBM01149. - // - // IBM See https://www.iana.org/assignments/charset-reg/IBM01149 - IBM01149 MIB = 2100 - - // Big5HKSCS is the MIB identifier with IANA name Big5-HKSCS. - // - // See https://www.iana.org/assignments/charset-reg/Big5-HKSCS - Big5HKSCS MIB = 2101 - - // IBM1047 is the MIB identifier with IANA name IBM1047. - // - // IBM1047 (EBCDIC Latin 1/Open Systems) https://www-1.ibm.com/servers/eserver/iseries/software/globalization/pdf/cp01047z.pdf - IBM1047 MIB = 2102 - - // PTCP154 is the MIB identifier with IANA name PTCP154. - // - // See https://www.iana.org/assignments/charset-reg/PTCP154 - PTCP154 MIB = 2103 - - // Amiga1251 is the MIB identifier with IANA name Amiga-1251. - // - // See https://www.amiga.ultranet.ru/Amiga-1251.html - Amiga1251 MIB = 2104 - - // KOI7switched is the MIB identifier with IANA name KOI7-switched. - // - // See https://www.iana.org/assignments/charset-reg/KOI7-switched - KOI7switched MIB = 2105 - - // BRF is the MIB identifier with IANA name BRF. - // - // See https://www.iana.org/assignments/charset-reg/BRF - BRF MIB = 2106 - - // TSCII is the MIB identifier with IANA name TSCII. - // - // See https://www.iana.org/assignments/charset-reg/TSCII - TSCII MIB = 2107 - - // CP51932 is the MIB identifier with IANA name CP51932. - // - // See https://www.iana.org/assignments/charset-reg/CP51932 - CP51932 MIB = 2108 - - // Windows874 is the MIB identifier with IANA name windows-874. - // - // See https://www.iana.org/assignments/charset-reg/windows-874 - Windows874 MIB = 2109 - - // Windows1250 is the MIB identifier with IANA name windows-1250. - // - // Microsoft https://www.iana.org/assignments/charset-reg/windows-1250 - Windows1250 MIB = 2250 - - // Windows1251 is the MIB identifier with IANA name windows-1251. - // - // Microsoft https://www.iana.org/assignments/charset-reg/windows-1251 - Windows1251 MIB = 2251 - - // Windows1252 is the MIB identifier with IANA name windows-1252. - // - // Microsoft https://www.iana.org/assignments/charset-reg/windows-1252 - Windows1252 MIB = 2252 - - // Windows1253 is the MIB identifier with IANA name windows-1253. - // - // Microsoft https://www.iana.org/assignments/charset-reg/windows-1253 - Windows1253 MIB = 2253 - - // Windows1254 is the MIB identifier with IANA name windows-1254. - // - // Microsoft https://www.iana.org/assignments/charset-reg/windows-1254 - Windows1254 MIB = 2254 - - // Windows1255 is the MIB identifier with IANA name windows-1255. - // - // Microsoft https://www.iana.org/assignments/charset-reg/windows-1255 - Windows1255 MIB = 2255 - - // Windows1256 is the MIB identifier with IANA name windows-1256. - // - // Microsoft https://www.iana.org/assignments/charset-reg/windows-1256 - Windows1256 MIB = 2256 - - // Windows1257 is the MIB identifier with IANA name windows-1257. - // - // Microsoft https://www.iana.org/assignments/charset-reg/windows-1257 - Windows1257 MIB = 2257 - - // Windows1258 is the MIB identifier with IANA name windows-1258. - // - // Microsoft https://www.iana.org/assignments/charset-reg/windows-1258 - Windows1258 MIB = 2258 - - // TIS620 is the MIB identifier with IANA name TIS-620. - // - // Thai Industrial Standards Institute (TISI) - TIS620 MIB = 2259 - - // CP50220 is the MIB identifier with IANA name CP50220. - // - // See https://www.iana.org/assignments/charset-reg/CP50220 - CP50220 MIB = 2260 -) diff --git a/vendor/golang.org/x/text/encoding/internal/internal.go b/vendor/golang.org/x/text/encoding/internal/internal.go deleted file mode 100644 index 75a5fd1..0000000 --- a/vendor/golang.org/x/text/encoding/internal/internal.go +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package internal contains code that is shared among encoding implementations. -package internal - -import ( - "golang.org/x/text/encoding" - "golang.org/x/text/encoding/internal/identifier" - "golang.org/x/text/transform" -) - -// Encoding is an implementation of the Encoding interface that adds the String -// and ID methods to an existing encoding. -type Encoding struct { - encoding.Encoding - Name string - MIB identifier.MIB -} - -// _ verifies that Encoding implements identifier.Interface. -var _ identifier.Interface = (*Encoding)(nil) - -func (e *Encoding) String() string { - return e.Name -} - -func (e *Encoding) ID() (mib identifier.MIB, other string) { - return e.MIB, "" -} - -// SimpleEncoding is an Encoding that combines two Transformers. -type SimpleEncoding struct { - Decoder transform.Transformer - Encoder transform.Transformer -} - -func (e *SimpleEncoding) NewDecoder() *encoding.Decoder { - return &encoding.Decoder{Transformer: e.Decoder} -} - -func (e *SimpleEncoding) NewEncoder() *encoding.Encoder { - return &encoding.Encoder{Transformer: e.Encoder} -} - -// FuncEncoding is an Encoding that combines two functions returning a new -// Transformer. -type FuncEncoding struct { - Decoder func() transform.Transformer - Encoder func() transform.Transformer -} - -func (e FuncEncoding) NewDecoder() *encoding.Decoder { - return &encoding.Decoder{Transformer: e.Decoder()} -} - -func (e FuncEncoding) NewEncoder() *encoding.Encoder { - return &encoding.Encoder{Transformer: e.Encoder()} -} - -// A RepertoireError indicates a rune is not in the repertoire of a destination -// encoding. It is associated with an encoding-specific suggested replacement -// byte. -type RepertoireError byte - -// Error implements the error interrface. -func (r RepertoireError) Error() string { - return "encoding: rune not supported by encoding." -} - -// Replacement returns the replacement string associated with this error. -func (r RepertoireError) Replacement() byte { return byte(r) } - -var ErrASCIIReplacement = RepertoireError(encoding.ASCIISub) diff --git a/vendor/golang.org/x/text/encoding/japanese/all.go b/vendor/golang.org/x/text/encoding/japanese/all.go deleted file mode 100644 index 6cfa8de..0000000 --- a/vendor/golang.org/x/text/encoding/japanese/all.go +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package japanese - -import ( - "golang.org/x/text/encoding" -) - -// All is a list of all defined encodings in this package. -var All = []encoding.Encoding{EUCJP, ISO2022JP, ShiftJIS} diff --git a/vendor/golang.org/x/text/encoding/japanese/eucjp.go b/vendor/golang.org/x/text/encoding/japanese/eucjp.go deleted file mode 100644 index 79313fa..0000000 --- a/vendor/golang.org/x/text/encoding/japanese/eucjp.go +++ /dev/null @@ -1,225 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package japanese - -import ( - "unicode/utf8" - - "golang.org/x/text/encoding" - "golang.org/x/text/encoding/internal" - "golang.org/x/text/encoding/internal/identifier" - "golang.org/x/text/transform" -) - -// EUCJP is the EUC-JP encoding. -var EUCJP encoding.Encoding = &eucJP - -var eucJP = internal.Encoding{ - &internal.SimpleEncoding{eucJPDecoder{}, eucJPEncoder{}}, - "EUC-JP", - identifier.EUCPkdFmtJapanese, -} - -type eucJPDecoder struct{ transform.NopResetter } - -// See https://encoding.spec.whatwg.org/#euc-jp-decoder. -func (eucJPDecoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { - r, size := rune(0), 0 -loop: - for ; nSrc < len(src); nSrc += size { - switch c0 := src[nSrc]; { - case c0 < utf8.RuneSelf: - r, size = rune(c0), 1 - - case c0 == 0x8e: - if nSrc+1 >= len(src) { - if !atEOF { - err = transform.ErrShortSrc - break loop - } - r, size = utf8.RuneError, 1 - break - } - c1 := src[nSrc+1] - switch { - case c1 < 0xa1: - r, size = utf8.RuneError, 1 - case c1 > 0xdf: - r, size = utf8.RuneError, 2 - if c1 == 0xff { - size = 1 - } - default: - r, size = rune(c1)+(0xff61-0xa1), 2 - } - case c0 == 0x8f: - if nSrc+2 >= len(src) { - if !atEOF { - err = transform.ErrShortSrc - break loop - } - r, size = utf8.RuneError, 1 - if p := nSrc + 1; p < len(src) && 0xa1 <= src[p] && src[p] < 0xfe { - size = 2 - } - break - } - c1 := src[nSrc+1] - if c1 < 0xa1 || 0xfe < c1 { - r, size = utf8.RuneError, 1 - break - } - c2 := src[nSrc+2] - if c2 < 0xa1 || 0xfe < c2 { - r, size = utf8.RuneError, 2 - break - } - r, size = utf8.RuneError, 3 - if i := int(c1-0xa1)*94 + int(c2-0xa1); i < len(jis0212Decode) { - r = rune(jis0212Decode[i]) - if r == 0 { - r = utf8.RuneError - } - } - - case 0xa1 <= c0 && c0 <= 0xfe: - if nSrc+1 >= len(src) { - if !atEOF { - err = transform.ErrShortSrc - break loop - } - r, size = utf8.RuneError, 1 - break - } - c1 := src[nSrc+1] - if c1 < 0xa1 || 0xfe < c1 { - r, size = utf8.RuneError, 1 - break - } - r, size = utf8.RuneError, 2 - if i := int(c0-0xa1)*94 + int(c1-0xa1); i < len(jis0208Decode) { - r = rune(jis0208Decode[i]) - if r == 0 { - r = utf8.RuneError - } - } - - default: - r, size = utf8.RuneError, 1 - } - - if nDst+utf8.RuneLen(r) > len(dst) { - err = transform.ErrShortDst - break loop - } - nDst += utf8.EncodeRune(dst[nDst:], r) - } - return nDst, nSrc, err -} - -type eucJPEncoder struct{ transform.NopResetter } - -func (eucJPEncoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { - r, size := rune(0), 0 - for ; nSrc < len(src); nSrc += size { - r = rune(src[nSrc]) - - // Decode a 1-byte rune. - if r < utf8.RuneSelf { - size = 1 - - } else { - // Decode a multi-byte rune. - r, size = utf8.DecodeRune(src[nSrc:]) - if size == 1 { - // All valid runes of size 1 (those below utf8.RuneSelf) were - // handled above. We have invalid UTF-8 or we haven't seen the - // full character yet. - if !atEOF && !utf8.FullRune(src[nSrc:]) { - err = transform.ErrShortSrc - break - } - } - - // func init checks that the switch covers all tables. - switch { - case encode0Low <= r && r < encode0High: - if r = rune(encode0[r-encode0Low]); r != 0 { - goto write2or3 - } - case encode1Low <= r && r < encode1High: - if r = rune(encode1[r-encode1Low]); r != 0 { - goto write2or3 - } - case encode2Low <= r && r < encode2High: - if r = rune(encode2[r-encode2Low]); r != 0 { - goto write2or3 - } - case encode3Low <= r && r < encode3High: - if r = rune(encode3[r-encode3Low]); r != 0 { - goto write2or3 - } - case encode4Low <= r && r < encode4High: - if r = rune(encode4[r-encode4Low]); r != 0 { - goto write2or3 - } - case encode5Low <= r && r < encode5High: - if 0xff61 <= r && r < 0xffa0 { - goto write2 - } - if r = rune(encode5[r-encode5Low]); r != 0 { - goto write2or3 - } - } - err = internal.ErrASCIIReplacement - break - } - - if nDst >= len(dst) { - err = transform.ErrShortDst - break - } - dst[nDst] = uint8(r) - nDst++ - continue - - write2or3: - if r>>tableShift == jis0208 { - if nDst+2 > len(dst) { - err = transform.ErrShortDst - break - } - } else { - if nDst+3 > len(dst) { - err = transform.ErrShortDst - break - } - dst[nDst] = 0x8f - nDst++ - } - dst[nDst+0] = 0xa1 + uint8(r>>codeShift)&codeMask - dst[nDst+1] = 0xa1 + uint8(r)&codeMask - nDst += 2 - continue - - write2: - if nDst+2 > len(dst) { - err = transform.ErrShortDst - break - } - dst[nDst+0] = 0x8e - dst[nDst+1] = uint8(r - (0xff61 - 0xa1)) - nDst += 2 - continue - } - return nDst, nSrc, err -} - -func init() { - // Check that the hard-coded encode switch covers all tables. - if numEncodeTables != 6 { - panic("bad numEncodeTables") - } -} diff --git a/vendor/golang.org/x/text/encoding/japanese/iso2022jp.go b/vendor/golang.org/x/text/encoding/japanese/iso2022jp.go deleted file mode 100644 index 613226d..0000000 --- a/vendor/golang.org/x/text/encoding/japanese/iso2022jp.go +++ /dev/null @@ -1,299 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package japanese - -import ( - "unicode/utf8" - - "golang.org/x/text/encoding" - "golang.org/x/text/encoding/internal" - "golang.org/x/text/encoding/internal/identifier" - "golang.org/x/text/transform" -) - -// ISO2022JP is the ISO-2022-JP encoding. -var ISO2022JP encoding.Encoding = &iso2022JP - -var iso2022JP = internal.Encoding{ - internal.FuncEncoding{iso2022JPNewDecoder, iso2022JPNewEncoder}, - "ISO-2022-JP", - identifier.ISO2022JP, -} - -func iso2022JPNewDecoder() transform.Transformer { - return new(iso2022JPDecoder) -} - -func iso2022JPNewEncoder() transform.Transformer { - return new(iso2022JPEncoder) -} - -const ( - asciiState = iota - katakanaState - jis0208State - jis0212State -) - -const asciiEsc = 0x1b - -type iso2022JPDecoder int - -func (d *iso2022JPDecoder) Reset() { - *d = asciiState -} - -func (d *iso2022JPDecoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { - r, size := rune(0), 0 - for ; nSrc < len(src); nSrc += size { - c0 := src[nSrc] - if c0 >= utf8.RuneSelf { - r, size = '\ufffd', 1 - goto write - } - - if c0 == asciiEsc { - if nSrc+2 >= len(src) { - if !atEOF { - return nDst, nSrc, transform.ErrShortSrc - } - // TODO: is it correct to only skip 1?? - r, size = '\ufffd', 1 - goto write - } - size = 3 - c1 := src[nSrc+1] - c2 := src[nSrc+2] - switch { - case c1 == '$' && (c2 == '@' || c2 == 'B'): // 0x24 {0x40, 0x42} - *d = jis0208State - continue - case c1 == '$' && c2 == '(': // 0x24 0x28 - if nSrc+3 >= len(src) { - if !atEOF { - return nDst, nSrc, transform.ErrShortSrc - } - r, size = '\ufffd', 1 - goto write - } - size = 4 - if src[nSrc+3] == 'D' { - *d = jis0212State - continue - } - case c1 == '(' && (c2 == 'B' || c2 == 'J'): // 0x28 {0x42, 0x4A} - *d = asciiState - continue - case c1 == '(' && c2 == 'I': // 0x28 0x49 - *d = katakanaState - continue - } - r, size = '\ufffd', 1 - goto write - } - - switch *d { - case asciiState: - r, size = rune(c0), 1 - - case katakanaState: - if c0 < 0x21 || 0x60 <= c0 { - r, size = '\ufffd', 1 - goto write - } - r, size = rune(c0)+(0xff61-0x21), 1 - - default: - if c0 == 0x0a { - *d = asciiState - r, size = rune(c0), 1 - goto write - } - if nSrc+1 >= len(src) { - if !atEOF { - return nDst, nSrc, transform.ErrShortSrc - } - r, size = '\ufffd', 1 - goto write - } - size = 2 - c1 := src[nSrc+1] - i := int(c0-0x21)*94 + int(c1-0x21) - if *d == jis0208State && i < len(jis0208Decode) { - r = rune(jis0208Decode[i]) - } else if *d == jis0212State && i < len(jis0212Decode) { - r = rune(jis0212Decode[i]) - } else { - r = '\ufffd' - goto write - } - if r == 0 { - r = '\ufffd' - } - } - - write: - if nDst+utf8.RuneLen(r) > len(dst) { - return nDst, nSrc, transform.ErrShortDst - } - nDst += utf8.EncodeRune(dst[nDst:], r) - } - return nDst, nSrc, err -} - -type iso2022JPEncoder int - -func (e *iso2022JPEncoder) Reset() { - *e = asciiState -} - -func (e *iso2022JPEncoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { - r, size := rune(0), 0 - for ; nSrc < len(src); nSrc += size { - r = rune(src[nSrc]) - - // Decode a 1-byte rune. - if r < utf8.RuneSelf { - size = 1 - - } else { - // Decode a multi-byte rune. - r, size = utf8.DecodeRune(src[nSrc:]) - if size == 1 { - // All valid runes of size 1 (those below utf8.RuneSelf) were - // handled above. We have invalid UTF-8 or we haven't seen the - // full character yet. - if !atEOF && !utf8.FullRune(src[nSrc:]) { - err = transform.ErrShortSrc - break - } - } - - // func init checks that the switch covers all tables. - // - // http://encoding.spec.whatwg.org/#iso-2022-jp says that "the index jis0212 - // is not used by the iso-2022-jp encoder due to lack of widespread support". - // - // TODO: do we have to special-case U+00A5 and U+203E, as per - // http://encoding.spec.whatwg.org/#iso-2022-jp - // Doing so would mean that "\u00a5" would not be preserved - // after an encode-decode round trip. - switch { - case encode0Low <= r && r < encode0High: - if r = rune(encode0[r-encode0Low]); r>>tableShift == jis0208 { - goto writeJIS - } - case encode1Low <= r && r < encode1High: - if r = rune(encode1[r-encode1Low]); r>>tableShift == jis0208 { - goto writeJIS - } - case encode2Low <= r && r < encode2High: - if r = rune(encode2[r-encode2Low]); r>>tableShift == jis0208 { - goto writeJIS - } - case encode3Low <= r && r < encode3High: - if r = rune(encode3[r-encode3Low]); r>>tableShift == jis0208 { - goto writeJIS - } - case encode4Low <= r && r < encode4High: - if r = rune(encode4[r-encode4Low]); r>>tableShift == jis0208 { - goto writeJIS - } - case encode5Low <= r && r < encode5High: - if 0xff61 <= r && r < 0xffa0 { - goto writeKatakana - } - if r = rune(encode5[r-encode5Low]); r>>tableShift == jis0208 { - goto writeJIS - } - } - - // Switch back to ASCII state in case of error so that an ASCII - // replacement character can be written in the correct state. - if *e != asciiState { - if nDst+3 > len(dst) { - err = transform.ErrShortDst - break - } - *e = asciiState - dst[nDst+0] = asciiEsc - dst[nDst+1] = '(' - dst[nDst+2] = 'B' - nDst += 3 - } - err = internal.ErrASCIIReplacement - break - } - - if *e != asciiState { - if nDst+4 > len(dst) { - err = transform.ErrShortDst - break - } - *e = asciiState - dst[nDst+0] = asciiEsc - dst[nDst+1] = '(' - dst[nDst+2] = 'B' - nDst += 3 - } else if nDst >= len(dst) { - err = transform.ErrShortDst - break - } - dst[nDst] = uint8(r) - nDst++ - continue - - writeJIS: - if *e != jis0208State { - if nDst+5 > len(dst) { - err = transform.ErrShortDst - break - } - *e = jis0208State - dst[nDst+0] = asciiEsc - dst[nDst+1] = '$' - dst[nDst+2] = 'B' - nDst += 3 - } else if nDst+2 > len(dst) { - err = transform.ErrShortDst - break - } - dst[nDst+0] = 0x21 + uint8(r>>codeShift)&codeMask - dst[nDst+1] = 0x21 + uint8(r)&codeMask - nDst += 2 - continue - - writeKatakana: - if *e != katakanaState { - if nDst+4 > len(dst) { - err = transform.ErrShortDst - break - } - *e = katakanaState - dst[nDst+0] = asciiEsc - dst[nDst+1] = '(' - dst[nDst+2] = 'I' - nDst += 3 - } else if nDst >= len(dst) { - err = transform.ErrShortDst - break - } - dst[nDst] = uint8(r - (0xff61 - 0x21)) - nDst++ - continue - } - if atEOF && err == nil && *e != asciiState { - if nDst+3 > len(dst) { - err = transform.ErrShortDst - } else { - *e = asciiState - dst[nDst+0] = asciiEsc - dst[nDst+1] = '(' - dst[nDst+2] = 'B' - nDst += 3 - } - } - return nDst, nSrc, err -} diff --git a/vendor/golang.org/x/text/encoding/japanese/shiftjis.go b/vendor/golang.org/x/text/encoding/japanese/shiftjis.go deleted file mode 100644 index 16fd8a6..0000000 --- a/vendor/golang.org/x/text/encoding/japanese/shiftjis.go +++ /dev/null @@ -1,189 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package japanese - -import ( - "unicode/utf8" - - "golang.org/x/text/encoding" - "golang.org/x/text/encoding/internal" - "golang.org/x/text/encoding/internal/identifier" - "golang.org/x/text/transform" -) - -// ShiftJIS is the Shift JIS encoding, also known as Code Page 932 and -// Windows-31J. -var ShiftJIS encoding.Encoding = &shiftJIS - -var shiftJIS = internal.Encoding{ - &internal.SimpleEncoding{shiftJISDecoder{}, shiftJISEncoder{}}, - "Shift JIS", - identifier.ShiftJIS, -} - -type shiftJISDecoder struct{ transform.NopResetter } - -func (shiftJISDecoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { - r, size := rune(0), 0 -loop: - for ; nSrc < len(src); nSrc += size { - switch c0 := src[nSrc]; { - case c0 < utf8.RuneSelf: - r, size = rune(c0), 1 - - case 0xa1 <= c0 && c0 < 0xe0: - r, size = rune(c0)+(0xff61-0xa1), 1 - - case (0x81 <= c0 && c0 < 0xa0) || (0xe0 <= c0 && c0 < 0xfd): - if c0 <= 0x9f { - c0 -= 0x70 - } else { - c0 -= 0xb0 - } - c0 = 2*c0 - 0x21 - - if nSrc+1 >= len(src) { - if !atEOF { - err = transform.ErrShortSrc - break loop - } - r, size = '\ufffd', 1 - goto write - } - c1 := src[nSrc+1] - switch { - case c1 < 0x40: - r, size = '\ufffd', 1 // c1 is ASCII so output on next round - goto write - case c1 < 0x7f: - c0-- - c1 -= 0x40 - case c1 == 0x7f: - r, size = '\ufffd', 1 // c1 is ASCII so output on next round - goto write - case c1 < 0x9f: - c0-- - c1 -= 0x41 - case c1 < 0xfd: - c1 -= 0x9f - default: - r, size = '\ufffd', 2 - goto write - } - r, size = '\ufffd', 2 - if i := int(c0)*94 + int(c1); i < len(jis0208Decode) { - r = rune(jis0208Decode[i]) - if r == 0 { - r = '\ufffd' - } - } - - case c0 == 0x80: - r, size = 0x80, 1 - - default: - r, size = '\ufffd', 1 - } - write: - if nDst+utf8.RuneLen(r) > len(dst) { - err = transform.ErrShortDst - break loop - } - nDst += utf8.EncodeRune(dst[nDst:], r) - } - return nDst, nSrc, err -} - -type shiftJISEncoder struct{ transform.NopResetter } - -func (shiftJISEncoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { - r, size := rune(0), 0 -loop: - for ; nSrc < len(src); nSrc += size { - r = rune(src[nSrc]) - - // Decode a 1-byte rune. - if r < utf8.RuneSelf { - size = 1 - - } else { - // Decode a multi-byte rune. - r, size = utf8.DecodeRune(src[nSrc:]) - if size == 1 { - // All valid runes of size 1 (those below utf8.RuneSelf) were - // handled above. We have invalid UTF-8 or we haven't seen the - // full character yet. - if !atEOF && !utf8.FullRune(src[nSrc:]) { - err = transform.ErrShortSrc - break loop - } - } - - // func init checks that the switch covers all tables. - switch { - case encode0Low <= r && r < encode0High: - if r = rune(encode0[r-encode0Low]); r>>tableShift == jis0208 { - goto write2 - } - case encode1Low <= r && r < encode1High: - if r = rune(encode1[r-encode1Low]); r>>tableShift == jis0208 { - goto write2 - } - case encode2Low <= r && r < encode2High: - if r = rune(encode2[r-encode2Low]); r>>tableShift == jis0208 { - goto write2 - } - case encode3Low <= r && r < encode3High: - if r = rune(encode3[r-encode3Low]); r>>tableShift == jis0208 { - goto write2 - } - case encode4Low <= r && r < encode4High: - if r = rune(encode4[r-encode4Low]); r>>tableShift == jis0208 { - goto write2 - } - case encode5Low <= r && r < encode5High: - if 0xff61 <= r && r < 0xffa0 { - r -= 0xff61 - 0xa1 - goto write1 - } - if r = rune(encode5[r-encode5Low]); r>>tableShift == jis0208 { - goto write2 - } - } - err = internal.ErrASCIIReplacement - break - } - - write1: - if nDst >= len(dst) { - err = transform.ErrShortDst - break - } - dst[nDst] = uint8(r) - nDst++ - continue - - write2: - j1 := uint8(r>>codeShift) & codeMask - j2 := uint8(r) & codeMask - if nDst+2 > len(dst) { - err = transform.ErrShortDst - break loop - } - if j1 <= 61 { - dst[nDst+0] = 129 + j1/2 - } else { - dst[nDst+0] = 193 + j1/2 - } - if j1&1 == 0 { - dst[nDst+1] = j2 + j2/63 + 64 - } else { - dst[nDst+1] = j2 + 159 - } - nDst += 2 - continue - } - return nDst, nSrc, err -} diff --git a/vendor/golang.org/x/text/encoding/japanese/tables.go b/vendor/golang.org/x/text/encoding/japanese/tables.go deleted file mode 100644 index 8717b79..0000000 --- a/vendor/golang.org/x/text/encoding/japanese/tables.go +++ /dev/null @@ -1,26971 +0,0 @@ -// generated by go run maketables.go; DO NOT EDIT - -// Package japanese provides Japanese encodings such as EUC-JP and Shift JIS. -package japanese // import "golang.org/x/text/encoding/japanese" - -// jis0208Decode is the decoding table from JIS 0208 code to Unicode. -// It is defined at http://encoding.spec.whatwg.org/index-jis0208.txt -var jis0208Decode = [...]uint16{ - 0: 0x3000, - 1: 0x3001, - 2: 0x3002, - 3: 0xFF0C, - 4: 0xFF0E, - 5: 0x30FB, - 6: 0xFF1A, - 7: 0xFF1B, - 8: 0xFF1F, - 9: 0xFF01, - 10: 0x309B, - 11: 0x309C, - 12: 0x00B4, - 13: 0xFF40, - 14: 0x00A8, - 15: 0xFF3E, - 16: 0xFFE3, - 17: 0xFF3F, - 18: 0x30FD, - 19: 0x30FE, - 20: 0x309D, - 21: 0x309E, - 22: 0x3003, - 23: 0x4EDD, - 24: 0x3005, - 25: 0x3006, - 26: 0x3007, - 27: 0x30FC, - 28: 0x2015, - 29: 0x2010, - 30: 0xFF0F, - 31: 0xFF3C, - 32: 0xFF5E, - 33: 0x2225, - 34: 0xFF5C, - 35: 0x2026, - 36: 0x2025, - 37: 0x2018, - 38: 0x2019, - 39: 0x201C, - 40: 0x201D, - 41: 0xFF08, - 42: 0xFF09, - 43: 0x3014, - 44: 0x3015, - 45: 0xFF3B, - 46: 0xFF3D, - 47: 0xFF5B, - 48: 0xFF5D, - 49: 0x3008, - 50: 0x3009, - 51: 0x300A, - 52: 0x300B, - 53: 0x300C, - 54: 0x300D, - 55: 0x300E, - 56: 0x300F, - 57: 0x3010, - 58: 0x3011, - 59: 0xFF0B, - 60: 0xFF0D, - 61: 0x00B1, - 62: 0x00D7, - 63: 0x00F7, - 64: 0xFF1D, - 65: 0x2260, - 66: 0xFF1C, - 67: 0xFF1E, - 68: 0x2266, - 69: 0x2267, - 70: 0x221E, - 71: 0x2234, - 72: 0x2642, - 73: 0x2640, - 74: 0x00B0, - 75: 0x2032, - 76: 0x2033, - 77: 0x2103, - 78: 0xFFE5, - 79: 0xFF04, - 80: 0xFFE0, - 81: 0xFFE1, - 82: 0xFF05, - 83: 0xFF03, - 84: 0xFF06, - 85: 0xFF0A, - 86: 0xFF20, - 87: 0x00A7, - 88: 0x2606, - 89: 0x2605, - 90: 0x25CB, - 91: 0x25CF, - 92: 0x25CE, - 93: 0x25C7, - 94: 0x25C6, - 95: 0x25A1, - 96: 0x25A0, - 97: 0x25B3, - 98: 0x25B2, - 99: 0x25BD, - 100: 0x25BC, - 101: 0x203B, - 102: 0x3012, - 103: 0x2192, - 104: 0x2190, - 105: 0x2191, - 106: 0x2193, - 107: 0x3013, - 119: 0x2208, - 120: 0x220B, - 121: 0x2286, - 122: 0x2287, - 123: 0x2282, - 124: 0x2283, - 125: 0x222A, - 126: 0x2229, - 135: 0x2227, - 136: 0x2228, - 137: 0xFFE2, - 138: 0x21D2, - 139: 0x21D4, - 140: 0x2200, - 141: 0x2203, - 153: 0x2220, - 154: 0x22A5, - 155: 0x2312, - 156: 0x2202, - 157: 0x2207, - 158: 0x2261, - 159: 0x2252, - 160: 0x226A, - 161: 0x226B, - 162: 0x221A, - 163: 0x223D, - 164: 0x221D, - 165: 0x2235, - 166: 0x222B, - 167: 0x222C, - 175: 0x212B, - 176: 0x2030, - 177: 0x266F, - 178: 0x266D, - 179: 0x266A, - 180: 0x2020, - 181: 0x2021, - 182: 0x00B6, - 187: 0x25EF, - 203: 0xFF10, - 204: 0xFF11, - 205: 0xFF12, - 206: 0xFF13, - 207: 0xFF14, - 208: 0xFF15, - 209: 0xFF16, - 210: 0xFF17, - 211: 0xFF18, - 212: 0xFF19, - 220: 0xFF21, - 221: 0xFF22, - 222: 0xFF23, - 223: 0xFF24, - 224: 0xFF25, - 225: 0xFF26, - 226: 0xFF27, - 227: 0xFF28, - 228: 0xFF29, - 229: 0xFF2A, - 230: 0xFF2B, - 231: 0xFF2C, - 232: 0xFF2D, - 233: 0xFF2E, - 234: 0xFF2F, - 235: 0xFF30, - 236: 0xFF31, - 237: 0xFF32, - 238: 0xFF33, - 239: 0xFF34, - 240: 0xFF35, - 241: 0xFF36, - 242: 0xFF37, - 243: 0xFF38, - 244: 0xFF39, - 245: 0xFF3A, - 252: 0xFF41, - 253: 0xFF42, - 254: 0xFF43, - 255: 0xFF44, - 256: 0xFF45, - 257: 0xFF46, - 258: 0xFF47, - 259: 0xFF48, - 260: 0xFF49, - 261: 0xFF4A, - 262: 0xFF4B, - 263: 0xFF4C, - 264: 0xFF4D, - 265: 0xFF4E, - 266: 0xFF4F, - 267: 0xFF50, - 268: 0xFF51, - 269: 0xFF52, - 270: 0xFF53, - 271: 0xFF54, - 272: 0xFF55, - 273: 0xFF56, - 274: 0xFF57, - 275: 0xFF58, - 276: 0xFF59, - 277: 0xFF5A, - 282: 0x3041, - 283: 0x3042, - 284: 0x3043, - 285: 0x3044, - 286: 0x3045, - 287: 0x3046, - 288: 0x3047, - 289: 0x3048, - 290: 0x3049, - 291: 0x304A, - 292: 0x304B, - 293: 0x304C, - 294: 0x304D, - 295: 0x304E, - 296: 0x304F, - 297: 0x3050, - 298: 0x3051, - 299: 0x3052, - 300: 0x3053, - 301: 0x3054, - 302: 0x3055, - 303: 0x3056, - 304: 0x3057, - 305: 0x3058, - 306: 0x3059, - 307: 0x305A, - 308: 0x305B, - 309: 0x305C, - 310: 0x305D, - 311: 0x305E, - 312: 0x305F, - 313: 0x3060, - 314: 0x3061, - 315: 0x3062, - 316: 0x3063, - 317: 0x3064, - 318: 0x3065, - 319: 0x3066, - 320: 0x3067, - 321: 0x3068, - 322: 0x3069, - 323: 0x306A, - 324: 0x306B, - 325: 0x306C, - 326: 0x306D, - 327: 0x306E, - 328: 0x306F, - 329: 0x3070, - 330: 0x3071, - 331: 0x3072, - 332: 0x3073, - 333: 0x3074, - 334: 0x3075, - 335: 0x3076, - 336: 0x3077, - 337: 0x3078, - 338: 0x3079, - 339: 0x307A, - 340: 0x307B, - 341: 0x307C, - 342: 0x307D, - 343: 0x307E, - 344: 0x307F, - 345: 0x3080, - 346: 0x3081, - 347: 0x3082, - 348: 0x3083, - 349: 0x3084, - 350: 0x3085, - 351: 0x3086, - 352: 0x3087, - 353: 0x3088, - 354: 0x3089, - 355: 0x308A, - 356: 0x308B, - 357: 0x308C, - 358: 0x308D, - 359: 0x308E, - 360: 0x308F, - 361: 0x3090, - 362: 0x3091, - 363: 0x3092, - 364: 0x3093, - 376: 0x30A1, - 377: 0x30A2, - 378: 0x30A3, - 379: 0x30A4, - 380: 0x30A5, - 381: 0x30A6, - 382: 0x30A7, - 383: 0x30A8, - 384: 0x30A9, - 385: 0x30AA, - 386: 0x30AB, - 387: 0x30AC, - 388: 0x30AD, - 389: 0x30AE, - 390: 0x30AF, - 391: 0x30B0, - 392: 0x30B1, - 393: 0x30B2, - 394: 0x30B3, - 395: 0x30B4, - 396: 0x30B5, - 397: 0x30B6, - 398: 0x30B7, - 399: 0x30B8, - 400: 0x30B9, - 401: 0x30BA, - 402: 0x30BB, - 403: 0x30BC, - 404: 0x30BD, - 405: 0x30BE, - 406: 0x30BF, - 407: 0x30C0, - 408: 0x30C1, - 409: 0x30C2, - 410: 0x30C3, - 411: 0x30C4, - 412: 0x30C5, - 413: 0x30C6, - 414: 0x30C7, - 415: 0x30C8, - 416: 0x30C9, - 417: 0x30CA, - 418: 0x30CB, - 419: 0x30CC, - 420: 0x30CD, - 421: 0x30CE, - 422: 0x30CF, - 423: 0x30D0, - 424: 0x30D1, - 425: 0x30D2, - 426: 0x30D3, - 427: 0x30D4, - 428: 0x30D5, - 429: 0x30D6, - 430: 0x30D7, - 431: 0x30D8, - 432: 0x30D9, - 433: 0x30DA, - 434: 0x30DB, - 435: 0x30DC, - 436: 0x30DD, - 437: 0x30DE, - 438: 0x30DF, - 439: 0x30E0, - 440: 0x30E1, - 441: 0x30E2, - 442: 0x30E3, - 443: 0x30E4, - 444: 0x30E5, - 445: 0x30E6, - 446: 0x30E7, - 447: 0x30E8, - 448: 0x30E9, - 449: 0x30EA, - 450: 0x30EB, - 451: 0x30EC, - 452: 0x30ED, - 453: 0x30EE, - 454: 0x30EF, - 455: 0x30F0, - 456: 0x30F1, - 457: 0x30F2, - 458: 0x30F3, - 459: 0x30F4, - 460: 0x30F5, - 461: 0x30F6, - 470: 0x0391, - 471: 0x0392, - 472: 0x0393, - 473: 0x0394, - 474: 0x0395, - 475: 0x0396, - 476: 0x0397, - 477: 0x0398, - 478: 0x0399, - 479: 0x039A, - 480: 0x039B, - 481: 0x039C, - 482: 0x039D, - 483: 0x039E, - 484: 0x039F, - 485: 0x03A0, - 486: 0x03A1, - 487: 0x03A3, - 488: 0x03A4, - 489: 0x03A5, - 490: 0x03A6, - 491: 0x03A7, - 492: 0x03A8, - 493: 0x03A9, - 502: 0x03B1, - 503: 0x03B2, - 504: 0x03B3, - 505: 0x03B4, - 506: 0x03B5, - 507: 0x03B6, - 508: 0x03B7, - 509: 0x03B8, - 510: 0x03B9, - 511: 0x03BA, - 512: 0x03BB, - 513: 0x03BC, - 514: 0x03BD, - 515: 0x03BE, - 516: 0x03BF, - 517: 0x03C0, - 518: 0x03C1, - 519: 0x03C3, - 520: 0x03C4, - 521: 0x03C5, - 522: 0x03C6, - 523: 0x03C7, - 524: 0x03C8, - 525: 0x03C9, - 564: 0x0410, - 565: 0x0411, - 566: 0x0412, - 567: 0x0413, - 568: 0x0414, - 569: 0x0415, - 570: 0x0401, - 571: 0x0416, - 572: 0x0417, - 573: 0x0418, - 574: 0x0419, - 575: 0x041A, - 576: 0x041B, - 577: 0x041C, - 578: 0x041D, - 579: 0x041E, - 580: 0x041F, - 581: 0x0420, - 582: 0x0421, - 583: 0x0422, - 584: 0x0423, - 585: 0x0424, - 586: 0x0425, - 587: 0x0426, - 588: 0x0427, - 589: 0x0428, - 590: 0x0429, - 591: 0x042A, - 592: 0x042B, - 593: 0x042C, - 594: 0x042D, - 595: 0x042E, - 596: 0x042F, - 612: 0x0430, - 613: 0x0431, - 614: 0x0432, - 615: 0x0433, - 616: 0x0434, - 617: 0x0435, - 618: 0x0451, - 619: 0x0436, - 620: 0x0437, - 621: 0x0438, - 622: 0x0439, - 623: 0x043A, - 624: 0x043B, - 625: 0x043C, - 626: 0x043D, - 627: 0x043E, - 628: 0x043F, - 629: 0x0440, - 630: 0x0441, - 631: 0x0442, - 632: 0x0443, - 633: 0x0444, - 634: 0x0445, - 635: 0x0446, - 636: 0x0447, - 637: 0x0448, - 638: 0x0449, - 639: 0x044A, - 640: 0x044B, - 641: 0x044C, - 642: 0x044D, - 643: 0x044E, - 644: 0x044F, - 658: 0x2500, - 659: 0x2502, - 660: 0x250C, - 661: 0x2510, - 662: 0x2518, - 663: 0x2514, - 664: 0x251C, - 665: 0x252C, - 666: 0x2524, - 667: 0x2534, - 668: 0x253C, - 669: 0x2501, - 670: 0x2503, - 671: 0x250F, - 672: 0x2513, - 673: 0x251B, - 674: 0x2517, - 675: 0x2523, - 676: 0x2533, - 677: 0x252B, - 678: 0x253B, - 679: 0x254B, - 680: 0x2520, - 681: 0x252F, - 682: 0x2528, - 683: 0x2537, - 684: 0x253F, - 685: 0x251D, - 686: 0x2530, - 687: 0x2525, - 688: 0x2538, - 689: 0x2542, - 1128: 0x2460, - 1129: 0x2461, - 1130: 0x2462, - 1131: 0x2463, - 1132: 0x2464, - 1133: 0x2465, - 1134: 0x2466, - 1135: 0x2467, - 1136: 0x2468, - 1137: 0x2469, - 1138: 0x246A, - 1139: 0x246B, - 1140: 0x246C, - 1141: 0x246D, - 1142: 0x246E, - 1143: 0x246F, - 1144: 0x2470, - 1145: 0x2471, - 1146: 0x2472, - 1147: 0x2473, - 1148: 0x2160, - 1149: 0x2161, - 1150: 0x2162, - 1151: 0x2163, - 1152: 0x2164, - 1153: 0x2165, - 1154: 0x2166, - 1155: 0x2167, - 1156: 0x2168, - 1157: 0x2169, - 1159: 0x3349, - 1160: 0x3314, - 1161: 0x3322, - 1162: 0x334D, - 1163: 0x3318, - 1164: 0x3327, - 1165: 0x3303, - 1166: 0x3336, - 1167: 0x3351, - 1168: 0x3357, - 1169: 0x330D, - 1170: 0x3326, - 1171: 0x3323, - 1172: 0x332B, - 1173: 0x334A, - 1174: 0x333B, - 1175: 0x339C, - 1176: 0x339D, - 1177: 0x339E, - 1178: 0x338E, - 1179: 0x338F, - 1180: 0x33C4, - 1181: 0x33A1, - 1190: 0x337B, - 1191: 0x301D, - 1192: 0x301F, - 1193: 0x2116, - 1194: 0x33CD, - 1195: 0x2121, - 1196: 0x32A4, - 1197: 0x32A5, - 1198: 0x32A6, - 1199: 0x32A7, - 1200: 0x32A8, - 1201: 0x3231, - 1202: 0x3232, - 1203: 0x3239, - 1204: 0x337E, - 1205: 0x337D, - 1206: 0x337C, - 1207: 0x2252, - 1208: 0x2261, - 1209: 0x222B, - 1210: 0x222E, - 1211: 0x2211, - 1212: 0x221A, - 1213: 0x22A5, - 1214: 0x2220, - 1215: 0x221F, - 1216: 0x22BF, - 1217: 0x2235, - 1218: 0x2229, - 1219: 0x222A, - 1410: 0x4E9C, - 1411: 0x5516, - 1412: 0x5A03, - 1413: 0x963F, - 1414: 0x54C0, - 1415: 0x611B, - 1416: 0x6328, - 1417: 0x59F6, - 1418: 0x9022, - 1419: 0x8475, - 1420: 0x831C, - 1421: 0x7A50, - 1422: 0x60AA, - 1423: 0x63E1, - 1424: 0x6E25, - 1425: 0x65ED, - 1426: 0x8466, - 1427: 0x82A6, - 1428: 0x9BF5, - 1429: 0x6893, - 1430: 0x5727, - 1431: 0x65A1, - 1432: 0x6271, - 1433: 0x5B9B, - 1434: 0x59D0, - 1435: 0x867B, - 1436: 0x98F4, - 1437: 0x7D62, - 1438: 0x7DBE, - 1439: 0x9B8E, - 1440: 0x6216, - 1441: 0x7C9F, - 1442: 0x88B7, - 1443: 0x5B89, - 1444: 0x5EB5, - 1445: 0x6309, - 1446: 0x6697, - 1447: 0x6848, - 1448: 0x95C7, - 1449: 0x978D, - 1450: 0x674F, - 1451: 0x4EE5, - 1452: 0x4F0A, - 1453: 0x4F4D, - 1454: 0x4F9D, - 1455: 0x5049, - 1456: 0x56F2, - 1457: 0x5937, - 1458: 0x59D4, - 1459: 0x5A01, - 1460: 0x5C09, - 1461: 0x60DF, - 1462: 0x610F, - 1463: 0x6170, - 1464: 0x6613, - 1465: 0x6905, - 1466: 0x70BA, - 1467: 0x754F, - 1468: 0x7570, - 1469: 0x79FB, - 1470: 0x7DAD, - 1471: 0x7DEF, - 1472: 0x80C3, - 1473: 0x840E, - 1474: 0x8863, - 1475: 0x8B02, - 1476: 0x9055, - 1477: 0x907A, - 1478: 0x533B, - 1479: 0x4E95, - 1480: 0x4EA5, - 1481: 0x57DF, - 1482: 0x80B2, - 1483: 0x90C1, - 1484: 0x78EF, - 1485: 0x4E00, - 1486: 0x58F1, - 1487: 0x6EA2, - 1488: 0x9038, - 1489: 0x7A32, - 1490: 0x8328, - 1491: 0x828B, - 1492: 0x9C2F, - 1493: 0x5141, - 1494: 0x5370, - 1495: 0x54BD, - 1496: 0x54E1, - 1497: 0x56E0, - 1498: 0x59FB, - 1499: 0x5F15, - 1500: 0x98F2, - 1501: 0x6DEB, - 1502: 0x80E4, - 1503: 0x852D, - 1504: 0x9662, - 1505: 0x9670, - 1506: 0x96A0, - 1507: 0x97FB, - 1508: 0x540B, - 1509: 0x53F3, - 1510: 0x5B87, - 1511: 0x70CF, - 1512: 0x7FBD, - 1513: 0x8FC2, - 1514: 0x96E8, - 1515: 0x536F, - 1516: 0x9D5C, - 1517: 0x7ABA, - 1518: 0x4E11, - 1519: 0x7893, - 1520: 0x81FC, - 1521: 0x6E26, - 1522: 0x5618, - 1523: 0x5504, - 1524: 0x6B1D, - 1525: 0x851A, - 1526: 0x9C3B, - 1527: 0x59E5, - 1528: 0x53A9, - 1529: 0x6D66, - 1530: 0x74DC, - 1531: 0x958F, - 1532: 0x5642, - 1533: 0x4E91, - 1534: 0x904B, - 1535: 0x96F2, - 1536: 0x834F, - 1537: 0x990C, - 1538: 0x53E1, - 1539: 0x55B6, - 1540: 0x5B30, - 1541: 0x5F71, - 1542: 0x6620, - 1543: 0x66F3, - 1544: 0x6804, - 1545: 0x6C38, - 1546: 0x6CF3, - 1547: 0x6D29, - 1548: 0x745B, - 1549: 0x76C8, - 1550: 0x7A4E, - 1551: 0x9834, - 1552: 0x82F1, - 1553: 0x885B, - 1554: 0x8A60, - 1555: 0x92ED, - 1556: 0x6DB2, - 1557: 0x75AB, - 1558: 0x76CA, - 1559: 0x99C5, - 1560: 0x60A6, - 1561: 0x8B01, - 1562: 0x8D8A, - 1563: 0x95B2, - 1564: 0x698E, - 1565: 0x53AD, - 1566: 0x5186, - 1567: 0x5712, - 1568: 0x5830, - 1569: 0x5944, - 1570: 0x5BB4, - 1571: 0x5EF6, - 1572: 0x6028, - 1573: 0x63A9, - 1574: 0x63F4, - 1575: 0x6CBF, - 1576: 0x6F14, - 1577: 0x708E, - 1578: 0x7114, - 1579: 0x7159, - 1580: 0x71D5, - 1581: 0x733F, - 1582: 0x7E01, - 1583: 0x8276, - 1584: 0x82D1, - 1585: 0x8597, - 1586: 0x9060, - 1587: 0x925B, - 1588: 0x9D1B, - 1589: 0x5869, - 1590: 0x65BC, - 1591: 0x6C5A, - 1592: 0x7525, - 1593: 0x51F9, - 1594: 0x592E, - 1595: 0x5965, - 1596: 0x5F80, - 1597: 0x5FDC, - 1598: 0x62BC, - 1599: 0x65FA, - 1600: 0x6A2A, - 1601: 0x6B27, - 1602: 0x6BB4, - 1603: 0x738B, - 1604: 0x7FC1, - 1605: 0x8956, - 1606: 0x9D2C, - 1607: 0x9D0E, - 1608: 0x9EC4, - 1609: 0x5CA1, - 1610: 0x6C96, - 1611: 0x837B, - 1612: 0x5104, - 1613: 0x5C4B, - 1614: 0x61B6, - 1615: 0x81C6, - 1616: 0x6876, - 1617: 0x7261, - 1618: 0x4E59, - 1619: 0x4FFA, - 1620: 0x5378, - 1621: 0x6069, - 1622: 0x6E29, - 1623: 0x7A4F, - 1624: 0x97F3, - 1625: 0x4E0B, - 1626: 0x5316, - 1627: 0x4EEE, - 1628: 0x4F55, - 1629: 0x4F3D, - 1630: 0x4FA1, - 1631: 0x4F73, - 1632: 0x52A0, - 1633: 0x53EF, - 1634: 0x5609, - 1635: 0x590F, - 1636: 0x5AC1, - 1637: 0x5BB6, - 1638: 0x5BE1, - 1639: 0x79D1, - 1640: 0x6687, - 1641: 0x679C, - 1642: 0x67B6, - 1643: 0x6B4C, - 1644: 0x6CB3, - 1645: 0x706B, - 1646: 0x73C2, - 1647: 0x798D, - 1648: 0x79BE, - 1649: 0x7A3C, - 1650: 0x7B87, - 1651: 0x82B1, - 1652: 0x82DB, - 1653: 0x8304, - 1654: 0x8377, - 1655: 0x83EF, - 1656: 0x83D3, - 1657: 0x8766, - 1658: 0x8AB2, - 1659: 0x5629, - 1660: 0x8CA8, - 1661: 0x8FE6, - 1662: 0x904E, - 1663: 0x971E, - 1664: 0x868A, - 1665: 0x4FC4, - 1666: 0x5CE8, - 1667: 0x6211, - 1668: 0x7259, - 1669: 0x753B, - 1670: 0x81E5, - 1671: 0x82BD, - 1672: 0x86FE, - 1673: 0x8CC0, - 1674: 0x96C5, - 1675: 0x9913, - 1676: 0x99D5, - 1677: 0x4ECB, - 1678: 0x4F1A, - 1679: 0x89E3, - 1680: 0x56DE, - 1681: 0x584A, - 1682: 0x58CA, - 1683: 0x5EFB, - 1684: 0x5FEB, - 1685: 0x602A, - 1686: 0x6094, - 1687: 0x6062, - 1688: 0x61D0, - 1689: 0x6212, - 1690: 0x62D0, - 1691: 0x6539, - 1692: 0x9B41, - 1693: 0x6666, - 1694: 0x68B0, - 1695: 0x6D77, - 1696: 0x7070, - 1697: 0x754C, - 1698: 0x7686, - 1699: 0x7D75, - 1700: 0x82A5, - 1701: 0x87F9, - 1702: 0x958B, - 1703: 0x968E, - 1704: 0x8C9D, - 1705: 0x51F1, - 1706: 0x52BE, - 1707: 0x5916, - 1708: 0x54B3, - 1709: 0x5BB3, - 1710: 0x5D16, - 1711: 0x6168, - 1712: 0x6982, - 1713: 0x6DAF, - 1714: 0x788D, - 1715: 0x84CB, - 1716: 0x8857, - 1717: 0x8A72, - 1718: 0x93A7, - 1719: 0x9AB8, - 1720: 0x6D6C, - 1721: 0x99A8, - 1722: 0x86D9, - 1723: 0x57A3, - 1724: 0x67FF, - 1725: 0x86CE, - 1726: 0x920E, - 1727: 0x5283, - 1728: 0x5687, - 1729: 0x5404, - 1730: 0x5ED3, - 1731: 0x62E1, - 1732: 0x64B9, - 1733: 0x683C, - 1734: 0x6838, - 1735: 0x6BBB, - 1736: 0x7372, - 1737: 0x78BA, - 1738: 0x7A6B, - 1739: 0x899A, - 1740: 0x89D2, - 1741: 0x8D6B, - 1742: 0x8F03, - 1743: 0x90ED, - 1744: 0x95A3, - 1745: 0x9694, - 1746: 0x9769, - 1747: 0x5B66, - 1748: 0x5CB3, - 1749: 0x697D, - 1750: 0x984D, - 1751: 0x984E, - 1752: 0x639B, - 1753: 0x7B20, - 1754: 0x6A2B, - 1755: 0x6A7F, - 1756: 0x68B6, - 1757: 0x9C0D, - 1758: 0x6F5F, - 1759: 0x5272, - 1760: 0x559D, - 1761: 0x6070, - 1762: 0x62EC, - 1763: 0x6D3B, - 1764: 0x6E07, - 1765: 0x6ED1, - 1766: 0x845B, - 1767: 0x8910, - 1768: 0x8F44, - 1769: 0x4E14, - 1770: 0x9C39, - 1771: 0x53F6, - 1772: 0x691B, - 1773: 0x6A3A, - 1774: 0x9784, - 1775: 0x682A, - 1776: 0x515C, - 1777: 0x7AC3, - 1778: 0x84B2, - 1779: 0x91DC, - 1780: 0x938C, - 1781: 0x565B, - 1782: 0x9D28, - 1783: 0x6822, - 1784: 0x8305, - 1785: 0x8431, - 1786: 0x7CA5, - 1787: 0x5208, - 1788: 0x82C5, - 1789: 0x74E6, - 1790: 0x4E7E, - 1791: 0x4F83, - 1792: 0x51A0, - 1793: 0x5BD2, - 1794: 0x520A, - 1795: 0x52D8, - 1796: 0x52E7, - 1797: 0x5DFB, - 1798: 0x559A, - 1799: 0x582A, - 1800: 0x59E6, - 1801: 0x5B8C, - 1802: 0x5B98, - 1803: 0x5BDB, - 1804: 0x5E72, - 1805: 0x5E79, - 1806: 0x60A3, - 1807: 0x611F, - 1808: 0x6163, - 1809: 0x61BE, - 1810: 0x63DB, - 1811: 0x6562, - 1812: 0x67D1, - 1813: 0x6853, - 1814: 0x68FA, - 1815: 0x6B3E, - 1816: 0x6B53, - 1817: 0x6C57, - 1818: 0x6F22, - 1819: 0x6F97, - 1820: 0x6F45, - 1821: 0x74B0, - 1822: 0x7518, - 1823: 0x76E3, - 1824: 0x770B, - 1825: 0x7AFF, - 1826: 0x7BA1, - 1827: 0x7C21, - 1828: 0x7DE9, - 1829: 0x7F36, - 1830: 0x7FF0, - 1831: 0x809D, - 1832: 0x8266, - 1833: 0x839E, - 1834: 0x89B3, - 1835: 0x8ACC, - 1836: 0x8CAB, - 1837: 0x9084, - 1838: 0x9451, - 1839: 0x9593, - 1840: 0x9591, - 1841: 0x95A2, - 1842: 0x9665, - 1843: 0x97D3, - 1844: 0x9928, - 1845: 0x8218, - 1846: 0x4E38, - 1847: 0x542B, - 1848: 0x5CB8, - 1849: 0x5DCC, - 1850: 0x73A9, - 1851: 0x764C, - 1852: 0x773C, - 1853: 0x5CA9, - 1854: 0x7FEB, - 1855: 0x8D0B, - 1856: 0x96C1, - 1857: 0x9811, - 1858: 0x9854, - 1859: 0x9858, - 1860: 0x4F01, - 1861: 0x4F0E, - 1862: 0x5371, - 1863: 0x559C, - 1864: 0x5668, - 1865: 0x57FA, - 1866: 0x5947, - 1867: 0x5B09, - 1868: 0x5BC4, - 1869: 0x5C90, - 1870: 0x5E0C, - 1871: 0x5E7E, - 1872: 0x5FCC, - 1873: 0x63EE, - 1874: 0x673A, - 1875: 0x65D7, - 1876: 0x65E2, - 1877: 0x671F, - 1878: 0x68CB, - 1879: 0x68C4, - 1880: 0x6A5F, - 1881: 0x5E30, - 1882: 0x6BC5, - 1883: 0x6C17, - 1884: 0x6C7D, - 1885: 0x757F, - 1886: 0x7948, - 1887: 0x5B63, - 1888: 0x7A00, - 1889: 0x7D00, - 1890: 0x5FBD, - 1891: 0x898F, - 1892: 0x8A18, - 1893: 0x8CB4, - 1894: 0x8D77, - 1895: 0x8ECC, - 1896: 0x8F1D, - 1897: 0x98E2, - 1898: 0x9A0E, - 1899: 0x9B3C, - 1900: 0x4E80, - 1901: 0x507D, - 1902: 0x5100, - 1903: 0x5993, - 1904: 0x5B9C, - 1905: 0x622F, - 1906: 0x6280, - 1907: 0x64EC, - 1908: 0x6B3A, - 1909: 0x72A0, - 1910: 0x7591, - 1911: 0x7947, - 1912: 0x7FA9, - 1913: 0x87FB, - 1914: 0x8ABC, - 1915: 0x8B70, - 1916: 0x63AC, - 1917: 0x83CA, - 1918: 0x97A0, - 1919: 0x5409, - 1920: 0x5403, - 1921: 0x55AB, - 1922: 0x6854, - 1923: 0x6A58, - 1924: 0x8A70, - 1925: 0x7827, - 1926: 0x6775, - 1927: 0x9ECD, - 1928: 0x5374, - 1929: 0x5BA2, - 1930: 0x811A, - 1931: 0x8650, - 1932: 0x9006, - 1933: 0x4E18, - 1934: 0x4E45, - 1935: 0x4EC7, - 1936: 0x4F11, - 1937: 0x53CA, - 1938: 0x5438, - 1939: 0x5BAE, - 1940: 0x5F13, - 1941: 0x6025, - 1942: 0x6551, - 1943: 0x673D, - 1944: 0x6C42, - 1945: 0x6C72, - 1946: 0x6CE3, - 1947: 0x7078, - 1948: 0x7403, - 1949: 0x7A76, - 1950: 0x7AAE, - 1951: 0x7B08, - 1952: 0x7D1A, - 1953: 0x7CFE, - 1954: 0x7D66, - 1955: 0x65E7, - 1956: 0x725B, - 1957: 0x53BB, - 1958: 0x5C45, - 1959: 0x5DE8, - 1960: 0x62D2, - 1961: 0x62E0, - 1962: 0x6319, - 1963: 0x6E20, - 1964: 0x865A, - 1965: 0x8A31, - 1966: 0x8DDD, - 1967: 0x92F8, - 1968: 0x6F01, - 1969: 0x79A6, - 1970: 0x9B5A, - 1971: 0x4EA8, - 1972: 0x4EAB, - 1973: 0x4EAC, - 1974: 0x4F9B, - 1975: 0x4FA0, - 1976: 0x50D1, - 1977: 0x5147, - 1978: 0x7AF6, - 1979: 0x5171, - 1980: 0x51F6, - 1981: 0x5354, - 1982: 0x5321, - 1983: 0x537F, - 1984: 0x53EB, - 1985: 0x55AC, - 1986: 0x5883, - 1987: 0x5CE1, - 1988: 0x5F37, - 1989: 0x5F4A, - 1990: 0x602F, - 1991: 0x6050, - 1992: 0x606D, - 1993: 0x631F, - 1994: 0x6559, - 1995: 0x6A4B, - 1996: 0x6CC1, - 1997: 0x72C2, - 1998: 0x72ED, - 1999: 0x77EF, - 2000: 0x80F8, - 2001: 0x8105, - 2002: 0x8208, - 2003: 0x854E, - 2004: 0x90F7, - 2005: 0x93E1, - 2006: 0x97FF, - 2007: 0x9957, - 2008: 0x9A5A, - 2009: 0x4EF0, - 2010: 0x51DD, - 2011: 0x5C2D, - 2012: 0x6681, - 2013: 0x696D, - 2014: 0x5C40, - 2015: 0x66F2, - 2016: 0x6975, - 2017: 0x7389, - 2018: 0x6850, - 2019: 0x7C81, - 2020: 0x50C5, - 2021: 0x52E4, - 2022: 0x5747, - 2023: 0x5DFE, - 2024: 0x9326, - 2025: 0x65A4, - 2026: 0x6B23, - 2027: 0x6B3D, - 2028: 0x7434, - 2029: 0x7981, - 2030: 0x79BD, - 2031: 0x7B4B, - 2032: 0x7DCA, - 2033: 0x82B9, - 2034: 0x83CC, - 2035: 0x887F, - 2036: 0x895F, - 2037: 0x8B39, - 2038: 0x8FD1, - 2039: 0x91D1, - 2040: 0x541F, - 2041: 0x9280, - 2042: 0x4E5D, - 2043: 0x5036, - 2044: 0x53E5, - 2045: 0x533A, - 2046: 0x72D7, - 2047: 0x7396, - 2048: 0x77E9, - 2049: 0x82E6, - 2050: 0x8EAF, - 2051: 0x99C6, - 2052: 0x99C8, - 2053: 0x99D2, - 2054: 0x5177, - 2055: 0x611A, - 2056: 0x865E, - 2057: 0x55B0, - 2058: 0x7A7A, - 2059: 0x5076, - 2060: 0x5BD3, - 2061: 0x9047, - 2062: 0x9685, - 2063: 0x4E32, - 2064: 0x6ADB, - 2065: 0x91E7, - 2066: 0x5C51, - 2067: 0x5C48, - 2068: 0x6398, - 2069: 0x7A9F, - 2070: 0x6C93, - 2071: 0x9774, - 2072: 0x8F61, - 2073: 0x7AAA, - 2074: 0x718A, - 2075: 0x9688, - 2076: 0x7C82, - 2077: 0x6817, - 2078: 0x7E70, - 2079: 0x6851, - 2080: 0x936C, - 2081: 0x52F2, - 2082: 0x541B, - 2083: 0x85AB, - 2084: 0x8A13, - 2085: 0x7FA4, - 2086: 0x8ECD, - 2087: 0x90E1, - 2088: 0x5366, - 2089: 0x8888, - 2090: 0x7941, - 2091: 0x4FC2, - 2092: 0x50BE, - 2093: 0x5211, - 2094: 0x5144, - 2095: 0x5553, - 2096: 0x572D, - 2097: 0x73EA, - 2098: 0x578B, - 2099: 0x5951, - 2100: 0x5F62, - 2101: 0x5F84, - 2102: 0x6075, - 2103: 0x6176, - 2104: 0x6167, - 2105: 0x61A9, - 2106: 0x63B2, - 2107: 0x643A, - 2108: 0x656C, - 2109: 0x666F, - 2110: 0x6842, - 2111: 0x6E13, - 2112: 0x7566, - 2113: 0x7A3D, - 2114: 0x7CFB, - 2115: 0x7D4C, - 2116: 0x7D99, - 2117: 0x7E4B, - 2118: 0x7F6B, - 2119: 0x830E, - 2120: 0x834A, - 2121: 0x86CD, - 2122: 0x8A08, - 2123: 0x8A63, - 2124: 0x8B66, - 2125: 0x8EFD, - 2126: 0x981A, - 2127: 0x9D8F, - 2128: 0x82B8, - 2129: 0x8FCE, - 2130: 0x9BE8, - 2131: 0x5287, - 2132: 0x621F, - 2133: 0x6483, - 2134: 0x6FC0, - 2135: 0x9699, - 2136: 0x6841, - 2137: 0x5091, - 2138: 0x6B20, - 2139: 0x6C7A, - 2140: 0x6F54, - 2141: 0x7A74, - 2142: 0x7D50, - 2143: 0x8840, - 2144: 0x8A23, - 2145: 0x6708, - 2146: 0x4EF6, - 2147: 0x5039, - 2148: 0x5026, - 2149: 0x5065, - 2150: 0x517C, - 2151: 0x5238, - 2152: 0x5263, - 2153: 0x55A7, - 2154: 0x570F, - 2155: 0x5805, - 2156: 0x5ACC, - 2157: 0x5EFA, - 2158: 0x61B2, - 2159: 0x61F8, - 2160: 0x62F3, - 2161: 0x6372, - 2162: 0x691C, - 2163: 0x6A29, - 2164: 0x727D, - 2165: 0x72AC, - 2166: 0x732E, - 2167: 0x7814, - 2168: 0x786F, - 2169: 0x7D79, - 2170: 0x770C, - 2171: 0x80A9, - 2172: 0x898B, - 2173: 0x8B19, - 2174: 0x8CE2, - 2175: 0x8ED2, - 2176: 0x9063, - 2177: 0x9375, - 2178: 0x967A, - 2179: 0x9855, - 2180: 0x9A13, - 2181: 0x9E78, - 2182: 0x5143, - 2183: 0x539F, - 2184: 0x53B3, - 2185: 0x5E7B, - 2186: 0x5F26, - 2187: 0x6E1B, - 2188: 0x6E90, - 2189: 0x7384, - 2190: 0x73FE, - 2191: 0x7D43, - 2192: 0x8237, - 2193: 0x8A00, - 2194: 0x8AFA, - 2195: 0x9650, - 2196: 0x4E4E, - 2197: 0x500B, - 2198: 0x53E4, - 2199: 0x547C, - 2200: 0x56FA, - 2201: 0x59D1, - 2202: 0x5B64, - 2203: 0x5DF1, - 2204: 0x5EAB, - 2205: 0x5F27, - 2206: 0x6238, - 2207: 0x6545, - 2208: 0x67AF, - 2209: 0x6E56, - 2210: 0x72D0, - 2211: 0x7CCA, - 2212: 0x88B4, - 2213: 0x80A1, - 2214: 0x80E1, - 2215: 0x83F0, - 2216: 0x864E, - 2217: 0x8A87, - 2218: 0x8DE8, - 2219: 0x9237, - 2220: 0x96C7, - 2221: 0x9867, - 2222: 0x9F13, - 2223: 0x4E94, - 2224: 0x4E92, - 2225: 0x4F0D, - 2226: 0x5348, - 2227: 0x5449, - 2228: 0x543E, - 2229: 0x5A2F, - 2230: 0x5F8C, - 2231: 0x5FA1, - 2232: 0x609F, - 2233: 0x68A7, - 2234: 0x6A8E, - 2235: 0x745A, - 2236: 0x7881, - 2237: 0x8A9E, - 2238: 0x8AA4, - 2239: 0x8B77, - 2240: 0x9190, - 2241: 0x4E5E, - 2242: 0x9BC9, - 2243: 0x4EA4, - 2244: 0x4F7C, - 2245: 0x4FAF, - 2246: 0x5019, - 2247: 0x5016, - 2248: 0x5149, - 2249: 0x516C, - 2250: 0x529F, - 2251: 0x52B9, - 2252: 0x52FE, - 2253: 0x539A, - 2254: 0x53E3, - 2255: 0x5411, - 2256: 0x540E, - 2257: 0x5589, - 2258: 0x5751, - 2259: 0x57A2, - 2260: 0x597D, - 2261: 0x5B54, - 2262: 0x5B5D, - 2263: 0x5B8F, - 2264: 0x5DE5, - 2265: 0x5DE7, - 2266: 0x5DF7, - 2267: 0x5E78, - 2268: 0x5E83, - 2269: 0x5E9A, - 2270: 0x5EB7, - 2271: 0x5F18, - 2272: 0x6052, - 2273: 0x614C, - 2274: 0x6297, - 2275: 0x62D8, - 2276: 0x63A7, - 2277: 0x653B, - 2278: 0x6602, - 2279: 0x6643, - 2280: 0x66F4, - 2281: 0x676D, - 2282: 0x6821, - 2283: 0x6897, - 2284: 0x69CB, - 2285: 0x6C5F, - 2286: 0x6D2A, - 2287: 0x6D69, - 2288: 0x6E2F, - 2289: 0x6E9D, - 2290: 0x7532, - 2291: 0x7687, - 2292: 0x786C, - 2293: 0x7A3F, - 2294: 0x7CE0, - 2295: 0x7D05, - 2296: 0x7D18, - 2297: 0x7D5E, - 2298: 0x7DB1, - 2299: 0x8015, - 2300: 0x8003, - 2301: 0x80AF, - 2302: 0x80B1, - 2303: 0x8154, - 2304: 0x818F, - 2305: 0x822A, - 2306: 0x8352, - 2307: 0x884C, - 2308: 0x8861, - 2309: 0x8B1B, - 2310: 0x8CA2, - 2311: 0x8CFC, - 2312: 0x90CA, - 2313: 0x9175, - 2314: 0x9271, - 2315: 0x783F, - 2316: 0x92FC, - 2317: 0x95A4, - 2318: 0x964D, - 2319: 0x9805, - 2320: 0x9999, - 2321: 0x9AD8, - 2322: 0x9D3B, - 2323: 0x525B, - 2324: 0x52AB, - 2325: 0x53F7, - 2326: 0x5408, - 2327: 0x58D5, - 2328: 0x62F7, - 2329: 0x6FE0, - 2330: 0x8C6A, - 2331: 0x8F5F, - 2332: 0x9EB9, - 2333: 0x514B, - 2334: 0x523B, - 2335: 0x544A, - 2336: 0x56FD, - 2337: 0x7A40, - 2338: 0x9177, - 2339: 0x9D60, - 2340: 0x9ED2, - 2341: 0x7344, - 2342: 0x6F09, - 2343: 0x8170, - 2344: 0x7511, - 2345: 0x5FFD, - 2346: 0x60DA, - 2347: 0x9AA8, - 2348: 0x72DB, - 2349: 0x8FBC, - 2350: 0x6B64, - 2351: 0x9803, - 2352: 0x4ECA, - 2353: 0x56F0, - 2354: 0x5764, - 2355: 0x58BE, - 2356: 0x5A5A, - 2357: 0x6068, - 2358: 0x61C7, - 2359: 0x660F, - 2360: 0x6606, - 2361: 0x6839, - 2362: 0x68B1, - 2363: 0x6DF7, - 2364: 0x75D5, - 2365: 0x7D3A, - 2366: 0x826E, - 2367: 0x9B42, - 2368: 0x4E9B, - 2369: 0x4F50, - 2370: 0x53C9, - 2371: 0x5506, - 2372: 0x5D6F, - 2373: 0x5DE6, - 2374: 0x5DEE, - 2375: 0x67FB, - 2376: 0x6C99, - 2377: 0x7473, - 2378: 0x7802, - 2379: 0x8A50, - 2380: 0x9396, - 2381: 0x88DF, - 2382: 0x5750, - 2383: 0x5EA7, - 2384: 0x632B, - 2385: 0x50B5, - 2386: 0x50AC, - 2387: 0x518D, - 2388: 0x6700, - 2389: 0x54C9, - 2390: 0x585E, - 2391: 0x59BB, - 2392: 0x5BB0, - 2393: 0x5F69, - 2394: 0x624D, - 2395: 0x63A1, - 2396: 0x683D, - 2397: 0x6B73, - 2398: 0x6E08, - 2399: 0x707D, - 2400: 0x91C7, - 2401: 0x7280, - 2402: 0x7815, - 2403: 0x7826, - 2404: 0x796D, - 2405: 0x658E, - 2406: 0x7D30, - 2407: 0x83DC, - 2408: 0x88C1, - 2409: 0x8F09, - 2410: 0x969B, - 2411: 0x5264, - 2412: 0x5728, - 2413: 0x6750, - 2414: 0x7F6A, - 2415: 0x8CA1, - 2416: 0x51B4, - 2417: 0x5742, - 2418: 0x962A, - 2419: 0x583A, - 2420: 0x698A, - 2421: 0x80B4, - 2422: 0x54B2, - 2423: 0x5D0E, - 2424: 0x57FC, - 2425: 0x7895, - 2426: 0x9DFA, - 2427: 0x4F5C, - 2428: 0x524A, - 2429: 0x548B, - 2430: 0x643E, - 2431: 0x6628, - 2432: 0x6714, - 2433: 0x67F5, - 2434: 0x7A84, - 2435: 0x7B56, - 2436: 0x7D22, - 2437: 0x932F, - 2438: 0x685C, - 2439: 0x9BAD, - 2440: 0x7B39, - 2441: 0x5319, - 2442: 0x518A, - 2443: 0x5237, - 2444: 0x5BDF, - 2445: 0x62F6, - 2446: 0x64AE, - 2447: 0x64E6, - 2448: 0x672D, - 2449: 0x6BBA, - 2450: 0x85A9, - 2451: 0x96D1, - 2452: 0x7690, - 2453: 0x9BD6, - 2454: 0x634C, - 2455: 0x9306, - 2456: 0x9BAB, - 2457: 0x76BF, - 2458: 0x6652, - 2459: 0x4E09, - 2460: 0x5098, - 2461: 0x53C2, - 2462: 0x5C71, - 2463: 0x60E8, - 2464: 0x6492, - 2465: 0x6563, - 2466: 0x685F, - 2467: 0x71E6, - 2468: 0x73CA, - 2469: 0x7523, - 2470: 0x7B97, - 2471: 0x7E82, - 2472: 0x8695, - 2473: 0x8B83, - 2474: 0x8CDB, - 2475: 0x9178, - 2476: 0x9910, - 2477: 0x65AC, - 2478: 0x66AB, - 2479: 0x6B8B, - 2480: 0x4ED5, - 2481: 0x4ED4, - 2482: 0x4F3A, - 2483: 0x4F7F, - 2484: 0x523A, - 2485: 0x53F8, - 2486: 0x53F2, - 2487: 0x55E3, - 2488: 0x56DB, - 2489: 0x58EB, - 2490: 0x59CB, - 2491: 0x59C9, - 2492: 0x59FF, - 2493: 0x5B50, - 2494: 0x5C4D, - 2495: 0x5E02, - 2496: 0x5E2B, - 2497: 0x5FD7, - 2498: 0x601D, - 2499: 0x6307, - 2500: 0x652F, - 2501: 0x5B5C, - 2502: 0x65AF, - 2503: 0x65BD, - 2504: 0x65E8, - 2505: 0x679D, - 2506: 0x6B62, - 2507: 0x6B7B, - 2508: 0x6C0F, - 2509: 0x7345, - 2510: 0x7949, - 2511: 0x79C1, - 2512: 0x7CF8, - 2513: 0x7D19, - 2514: 0x7D2B, - 2515: 0x80A2, - 2516: 0x8102, - 2517: 0x81F3, - 2518: 0x8996, - 2519: 0x8A5E, - 2520: 0x8A69, - 2521: 0x8A66, - 2522: 0x8A8C, - 2523: 0x8AEE, - 2524: 0x8CC7, - 2525: 0x8CDC, - 2526: 0x96CC, - 2527: 0x98FC, - 2528: 0x6B6F, - 2529: 0x4E8B, - 2530: 0x4F3C, - 2531: 0x4F8D, - 2532: 0x5150, - 2533: 0x5B57, - 2534: 0x5BFA, - 2535: 0x6148, - 2536: 0x6301, - 2537: 0x6642, - 2538: 0x6B21, - 2539: 0x6ECB, - 2540: 0x6CBB, - 2541: 0x723E, - 2542: 0x74BD, - 2543: 0x75D4, - 2544: 0x78C1, - 2545: 0x793A, - 2546: 0x800C, - 2547: 0x8033, - 2548: 0x81EA, - 2549: 0x8494, - 2550: 0x8F9E, - 2551: 0x6C50, - 2552: 0x9E7F, - 2553: 0x5F0F, - 2554: 0x8B58, - 2555: 0x9D2B, - 2556: 0x7AFA, - 2557: 0x8EF8, - 2558: 0x5B8D, - 2559: 0x96EB, - 2560: 0x4E03, - 2561: 0x53F1, - 2562: 0x57F7, - 2563: 0x5931, - 2564: 0x5AC9, - 2565: 0x5BA4, - 2566: 0x6089, - 2567: 0x6E7F, - 2568: 0x6F06, - 2569: 0x75BE, - 2570: 0x8CEA, - 2571: 0x5B9F, - 2572: 0x8500, - 2573: 0x7BE0, - 2574: 0x5072, - 2575: 0x67F4, - 2576: 0x829D, - 2577: 0x5C61, - 2578: 0x854A, - 2579: 0x7E1E, - 2580: 0x820E, - 2581: 0x5199, - 2582: 0x5C04, - 2583: 0x6368, - 2584: 0x8D66, - 2585: 0x659C, - 2586: 0x716E, - 2587: 0x793E, - 2588: 0x7D17, - 2589: 0x8005, - 2590: 0x8B1D, - 2591: 0x8ECA, - 2592: 0x906E, - 2593: 0x86C7, - 2594: 0x90AA, - 2595: 0x501F, - 2596: 0x52FA, - 2597: 0x5C3A, - 2598: 0x6753, - 2599: 0x707C, - 2600: 0x7235, - 2601: 0x914C, - 2602: 0x91C8, - 2603: 0x932B, - 2604: 0x82E5, - 2605: 0x5BC2, - 2606: 0x5F31, - 2607: 0x60F9, - 2608: 0x4E3B, - 2609: 0x53D6, - 2610: 0x5B88, - 2611: 0x624B, - 2612: 0x6731, - 2613: 0x6B8A, - 2614: 0x72E9, - 2615: 0x73E0, - 2616: 0x7A2E, - 2617: 0x816B, - 2618: 0x8DA3, - 2619: 0x9152, - 2620: 0x9996, - 2621: 0x5112, - 2622: 0x53D7, - 2623: 0x546A, - 2624: 0x5BFF, - 2625: 0x6388, - 2626: 0x6A39, - 2627: 0x7DAC, - 2628: 0x9700, - 2629: 0x56DA, - 2630: 0x53CE, - 2631: 0x5468, - 2632: 0x5B97, - 2633: 0x5C31, - 2634: 0x5DDE, - 2635: 0x4FEE, - 2636: 0x6101, - 2637: 0x62FE, - 2638: 0x6D32, - 2639: 0x79C0, - 2640: 0x79CB, - 2641: 0x7D42, - 2642: 0x7E4D, - 2643: 0x7FD2, - 2644: 0x81ED, - 2645: 0x821F, - 2646: 0x8490, - 2647: 0x8846, - 2648: 0x8972, - 2649: 0x8B90, - 2650: 0x8E74, - 2651: 0x8F2F, - 2652: 0x9031, - 2653: 0x914B, - 2654: 0x916C, - 2655: 0x96C6, - 2656: 0x919C, - 2657: 0x4EC0, - 2658: 0x4F4F, - 2659: 0x5145, - 2660: 0x5341, - 2661: 0x5F93, - 2662: 0x620E, - 2663: 0x67D4, - 2664: 0x6C41, - 2665: 0x6E0B, - 2666: 0x7363, - 2667: 0x7E26, - 2668: 0x91CD, - 2669: 0x9283, - 2670: 0x53D4, - 2671: 0x5919, - 2672: 0x5BBF, - 2673: 0x6DD1, - 2674: 0x795D, - 2675: 0x7E2E, - 2676: 0x7C9B, - 2677: 0x587E, - 2678: 0x719F, - 2679: 0x51FA, - 2680: 0x8853, - 2681: 0x8FF0, - 2682: 0x4FCA, - 2683: 0x5CFB, - 2684: 0x6625, - 2685: 0x77AC, - 2686: 0x7AE3, - 2687: 0x821C, - 2688: 0x99FF, - 2689: 0x51C6, - 2690: 0x5FAA, - 2691: 0x65EC, - 2692: 0x696F, - 2693: 0x6B89, - 2694: 0x6DF3, - 2695: 0x6E96, - 2696: 0x6F64, - 2697: 0x76FE, - 2698: 0x7D14, - 2699: 0x5DE1, - 2700: 0x9075, - 2701: 0x9187, - 2702: 0x9806, - 2703: 0x51E6, - 2704: 0x521D, - 2705: 0x6240, - 2706: 0x6691, - 2707: 0x66D9, - 2708: 0x6E1A, - 2709: 0x5EB6, - 2710: 0x7DD2, - 2711: 0x7F72, - 2712: 0x66F8, - 2713: 0x85AF, - 2714: 0x85F7, - 2715: 0x8AF8, - 2716: 0x52A9, - 2717: 0x53D9, - 2718: 0x5973, - 2719: 0x5E8F, - 2720: 0x5F90, - 2721: 0x6055, - 2722: 0x92E4, - 2723: 0x9664, - 2724: 0x50B7, - 2725: 0x511F, - 2726: 0x52DD, - 2727: 0x5320, - 2728: 0x5347, - 2729: 0x53EC, - 2730: 0x54E8, - 2731: 0x5546, - 2732: 0x5531, - 2733: 0x5617, - 2734: 0x5968, - 2735: 0x59BE, - 2736: 0x5A3C, - 2737: 0x5BB5, - 2738: 0x5C06, - 2739: 0x5C0F, - 2740: 0x5C11, - 2741: 0x5C1A, - 2742: 0x5E84, - 2743: 0x5E8A, - 2744: 0x5EE0, - 2745: 0x5F70, - 2746: 0x627F, - 2747: 0x6284, - 2748: 0x62DB, - 2749: 0x638C, - 2750: 0x6377, - 2751: 0x6607, - 2752: 0x660C, - 2753: 0x662D, - 2754: 0x6676, - 2755: 0x677E, - 2756: 0x68A2, - 2757: 0x6A1F, - 2758: 0x6A35, - 2759: 0x6CBC, - 2760: 0x6D88, - 2761: 0x6E09, - 2762: 0x6E58, - 2763: 0x713C, - 2764: 0x7126, - 2765: 0x7167, - 2766: 0x75C7, - 2767: 0x7701, - 2768: 0x785D, - 2769: 0x7901, - 2770: 0x7965, - 2771: 0x79F0, - 2772: 0x7AE0, - 2773: 0x7B11, - 2774: 0x7CA7, - 2775: 0x7D39, - 2776: 0x8096, - 2777: 0x83D6, - 2778: 0x848B, - 2779: 0x8549, - 2780: 0x885D, - 2781: 0x88F3, - 2782: 0x8A1F, - 2783: 0x8A3C, - 2784: 0x8A54, - 2785: 0x8A73, - 2786: 0x8C61, - 2787: 0x8CDE, - 2788: 0x91A4, - 2789: 0x9266, - 2790: 0x937E, - 2791: 0x9418, - 2792: 0x969C, - 2793: 0x9798, - 2794: 0x4E0A, - 2795: 0x4E08, - 2796: 0x4E1E, - 2797: 0x4E57, - 2798: 0x5197, - 2799: 0x5270, - 2800: 0x57CE, - 2801: 0x5834, - 2802: 0x58CC, - 2803: 0x5B22, - 2804: 0x5E38, - 2805: 0x60C5, - 2806: 0x64FE, - 2807: 0x6761, - 2808: 0x6756, - 2809: 0x6D44, - 2810: 0x72B6, - 2811: 0x7573, - 2812: 0x7A63, - 2813: 0x84B8, - 2814: 0x8B72, - 2815: 0x91B8, - 2816: 0x9320, - 2817: 0x5631, - 2818: 0x57F4, - 2819: 0x98FE, - 2820: 0x62ED, - 2821: 0x690D, - 2822: 0x6B96, - 2823: 0x71ED, - 2824: 0x7E54, - 2825: 0x8077, - 2826: 0x8272, - 2827: 0x89E6, - 2828: 0x98DF, - 2829: 0x8755, - 2830: 0x8FB1, - 2831: 0x5C3B, - 2832: 0x4F38, - 2833: 0x4FE1, - 2834: 0x4FB5, - 2835: 0x5507, - 2836: 0x5A20, - 2837: 0x5BDD, - 2838: 0x5BE9, - 2839: 0x5FC3, - 2840: 0x614E, - 2841: 0x632F, - 2842: 0x65B0, - 2843: 0x664B, - 2844: 0x68EE, - 2845: 0x699B, - 2846: 0x6D78, - 2847: 0x6DF1, - 2848: 0x7533, - 2849: 0x75B9, - 2850: 0x771F, - 2851: 0x795E, - 2852: 0x79E6, - 2853: 0x7D33, - 2854: 0x81E3, - 2855: 0x82AF, - 2856: 0x85AA, - 2857: 0x89AA, - 2858: 0x8A3A, - 2859: 0x8EAB, - 2860: 0x8F9B, - 2861: 0x9032, - 2862: 0x91DD, - 2863: 0x9707, - 2864: 0x4EBA, - 2865: 0x4EC1, - 2866: 0x5203, - 2867: 0x5875, - 2868: 0x58EC, - 2869: 0x5C0B, - 2870: 0x751A, - 2871: 0x5C3D, - 2872: 0x814E, - 2873: 0x8A0A, - 2874: 0x8FC5, - 2875: 0x9663, - 2876: 0x976D, - 2877: 0x7B25, - 2878: 0x8ACF, - 2879: 0x9808, - 2880: 0x9162, - 2881: 0x56F3, - 2882: 0x53A8, - 2883: 0x9017, - 2884: 0x5439, - 2885: 0x5782, - 2886: 0x5E25, - 2887: 0x63A8, - 2888: 0x6C34, - 2889: 0x708A, - 2890: 0x7761, - 2891: 0x7C8B, - 2892: 0x7FE0, - 2893: 0x8870, - 2894: 0x9042, - 2895: 0x9154, - 2896: 0x9310, - 2897: 0x9318, - 2898: 0x968F, - 2899: 0x745E, - 2900: 0x9AC4, - 2901: 0x5D07, - 2902: 0x5D69, - 2903: 0x6570, - 2904: 0x67A2, - 2905: 0x8DA8, - 2906: 0x96DB, - 2907: 0x636E, - 2908: 0x6749, - 2909: 0x6919, - 2910: 0x83C5, - 2911: 0x9817, - 2912: 0x96C0, - 2913: 0x88FE, - 2914: 0x6F84, - 2915: 0x647A, - 2916: 0x5BF8, - 2917: 0x4E16, - 2918: 0x702C, - 2919: 0x755D, - 2920: 0x662F, - 2921: 0x51C4, - 2922: 0x5236, - 2923: 0x52E2, - 2924: 0x59D3, - 2925: 0x5F81, - 2926: 0x6027, - 2927: 0x6210, - 2928: 0x653F, - 2929: 0x6574, - 2930: 0x661F, - 2931: 0x6674, - 2932: 0x68F2, - 2933: 0x6816, - 2934: 0x6B63, - 2935: 0x6E05, - 2936: 0x7272, - 2937: 0x751F, - 2938: 0x76DB, - 2939: 0x7CBE, - 2940: 0x8056, - 2941: 0x58F0, - 2942: 0x88FD, - 2943: 0x897F, - 2944: 0x8AA0, - 2945: 0x8A93, - 2946: 0x8ACB, - 2947: 0x901D, - 2948: 0x9192, - 2949: 0x9752, - 2950: 0x9759, - 2951: 0x6589, - 2952: 0x7A0E, - 2953: 0x8106, - 2954: 0x96BB, - 2955: 0x5E2D, - 2956: 0x60DC, - 2957: 0x621A, - 2958: 0x65A5, - 2959: 0x6614, - 2960: 0x6790, - 2961: 0x77F3, - 2962: 0x7A4D, - 2963: 0x7C4D, - 2964: 0x7E3E, - 2965: 0x810A, - 2966: 0x8CAC, - 2967: 0x8D64, - 2968: 0x8DE1, - 2969: 0x8E5F, - 2970: 0x78A9, - 2971: 0x5207, - 2972: 0x62D9, - 2973: 0x63A5, - 2974: 0x6442, - 2975: 0x6298, - 2976: 0x8A2D, - 2977: 0x7A83, - 2978: 0x7BC0, - 2979: 0x8AAC, - 2980: 0x96EA, - 2981: 0x7D76, - 2982: 0x820C, - 2983: 0x8749, - 2984: 0x4ED9, - 2985: 0x5148, - 2986: 0x5343, - 2987: 0x5360, - 2988: 0x5BA3, - 2989: 0x5C02, - 2990: 0x5C16, - 2991: 0x5DDD, - 2992: 0x6226, - 2993: 0x6247, - 2994: 0x64B0, - 2995: 0x6813, - 2996: 0x6834, - 2997: 0x6CC9, - 2998: 0x6D45, - 2999: 0x6D17, - 3000: 0x67D3, - 3001: 0x6F5C, - 3002: 0x714E, - 3003: 0x717D, - 3004: 0x65CB, - 3005: 0x7A7F, - 3006: 0x7BAD, - 3007: 0x7DDA, - 3008: 0x7E4A, - 3009: 0x7FA8, - 3010: 0x817A, - 3011: 0x821B, - 3012: 0x8239, - 3013: 0x85A6, - 3014: 0x8A6E, - 3015: 0x8CCE, - 3016: 0x8DF5, - 3017: 0x9078, - 3018: 0x9077, - 3019: 0x92AD, - 3020: 0x9291, - 3021: 0x9583, - 3022: 0x9BAE, - 3023: 0x524D, - 3024: 0x5584, - 3025: 0x6F38, - 3026: 0x7136, - 3027: 0x5168, - 3028: 0x7985, - 3029: 0x7E55, - 3030: 0x81B3, - 3031: 0x7CCE, - 3032: 0x564C, - 3033: 0x5851, - 3034: 0x5CA8, - 3035: 0x63AA, - 3036: 0x66FE, - 3037: 0x66FD, - 3038: 0x695A, - 3039: 0x72D9, - 3040: 0x758F, - 3041: 0x758E, - 3042: 0x790E, - 3043: 0x7956, - 3044: 0x79DF, - 3045: 0x7C97, - 3046: 0x7D20, - 3047: 0x7D44, - 3048: 0x8607, - 3049: 0x8A34, - 3050: 0x963B, - 3051: 0x9061, - 3052: 0x9F20, - 3053: 0x50E7, - 3054: 0x5275, - 3055: 0x53CC, - 3056: 0x53E2, - 3057: 0x5009, - 3058: 0x55AA, - 3059: 0x58EE, - 3060: 0x594F, - 3061: 0x723D, - 3062: 0x5B8B, - 3063: 0x5C64, - 3064: 0x531D, - 3065: 0x60E3, - 3066: 0x60F3, - 3067: 0x635C, - 3068: 0x6383, - 3069: 0x633F, - 3070: 0x63BB, - 3071: 0x64CD, - 3072: 0x65E9, - 3073: 0x66F9, - 3074: 0x5DE3, - 3075: 0x69CD, - 3076: 0x69FD, - 3077: 0x6F15, - 3078: 0x71E5, - 3079: 0x4E89, - 3080: 0x75E9, - 3081: 0x76F8, - 3082: 0x7A93, - 3083: 0x7CDF, - 3084: 0x7DCF, - 3085: 0x7D9C, - 3086: 0x8061, - 3087: 0x8349, - 3088: 0x8358, - 3089: 0x846C, - 3090: 0x84BC, - 3091: 0x85FB, - 3092: 0x88C5, - 3093: 0x8D70, - 3094: 0x9001, - 3095: 0x906D, - 3096: 0x9397, - 3097: 0x971C, - 3098: 0x9A12, - 3099: 0x50CF, - 3100: 0x5897, - 3101: 0x618E, - 3102: 0x81D3, - 3103: 0x8535, - 3104: 0x8D08, - 3105: 0x9020, - 3106: 0x4FC3, - 3107: 0x5074, - 3108: 0x5247, - 3109: 0x5373, - 3110: 0x606F, - 3111: 0x6349, - 3112: 0x675F, - 3113: 0x6E2C, - 3114: 0x8DB3, - 3115: 0x901F, - 3116: 0x4FD7, - 3117: 0x5C5E, - 3118: 0x8CCA, - 3119: 0x65CF, - 3120: 0x7D9A, - 3121: 0x5352, - 3122: 0x8896, - 3123: 0x5176, - 3124: 0x63C3, - 3125: 0x5B58, - 3126: 0x5B6B, - 3127: 0x5C0A, - 3128: 0x640D, - 3129: 0x6751, - 3130: 0x905C, - 3131: 0x4ED6, - 3132: 0x591A, - 3133: 0x592A, - 3134: 0x6C70, - 3135: 0x8A51, - 3136: 0x553E, - 3137: 0x5815, - 3138: 0x59A5, - 3139: 0x60F0, - 3140: 0x6253, - 3141: 0x67C1, - 3142: 0x8235, - 3143: 0x6955, - 3144: 0x9640, - 3145: 0x99C4, - 3146: 0x9A28, - 3147: 0x4F53, - 3148: 0x5806, - 3149: 0x5BFE, - 3150: 0x8010, - 3151: 0x5CB1, - 3152: 0x5E2F, - 3153: 0x5F85, - 3154: 0x6020, - 3155: 0x614B, - 3156: 0x6234, - 3157: 0x66FF, - 3158: 0x6CF0, - 3159: 0x6EDE, - 3160: 0x80CE, - 3161: 0x817F, - 3162: 0x82D4, - 3163: 0x888B, - 3164: 0x8CB8, - 3165: 0x9000, - 3166: 0x902E, - 3167: 0x968A, - 3168: 0x9EDB, - 3169: 0x9BDB, - 3170: 0x4EE3, - 3171: 0x53F0, - 3172: 0x5927, - 3173: 0x7B2C, - 3174: 0x918D, - 3175: 0x984C, - 3176: 0x9DF9, - 3177: 0x6EDD, - 3178: 0x7027, - 3179: 0x5353, - 3180: 0x5544, - 3181: 0x5B85, - 3182: 0x6258, - 3183: 0x629E, - 3184: 0x62D3, - 3185: 0x6CA2, - 3186: 0x6FEF, - 3187: 0x7422, - 3188: 0x8A17, - 3189: 0x9438, - 3190: 0x6FC1, - 3191: 0x8AFE, - 3192: 0x8338, - 3193: 0x51E7, - 3194: 0x86F8, - 3195: 0x53EA, - 3196: 0x53E9, - 3197: 0x4F46, - 3198: 0x9054, - 3199: 0x8FB0, - 3200: 0x596A, - 3201: 0x8131, - 3202: 0x5DFD, - 3203: 0x7AEA, - 3204: 0x8FBF, - 3205: 0x68DA, - 3206: 0x8C37, - 3207: 0x72F8, - 3208: 0x9C48, - 3209: 0x6A3D, - 3210: 0x8AB0, - 3211: 0x4E39, - 3212: 0x5358, - 3213: 0x5606, - 3214: 0x5766, - 3215: 0x62C5, - 3216: 0x63A2, - 3217: 0x65E6, - 3218: 0x6B4E, - 3219: 0x6DE1, - 3220: 0x6E5B, - 3221: 0x70AD, - 3222: 0x77ED, - 3223: 0x7AEF, - 3224: 0x7BAA, - 3225: 0x7DBB, - 3226: 0x803D, - 3227: 0x80C6, - 3228: 0x86CB, - 3229: 0x8A95, - 3230: 0x935B, - 3231: 0x56E3, - 3232: 0x58C7, - 3233: 0x5F3E, - 3234: 0x65AD, - 3235: 0x6696, - 3236: 0x6A80, - 3237: 0x6BB5, - 3238: 0x7537, - 3239: 0x8AC7, - 3240: 0x5024, - 3241: 0x77E5, - 3242: 0x5730, - 3243: 0x5F1B, - 3244: 0x6065, - 3245: 0x667A, - 3246: 0x6C60, - 3247: 0x75F4, - 3248: 0x7A1A, - 3249: 0x7F6E, - 3250: 0x81F4, - 3251: 0x8718, - 3252: 0x9045, - 3253: 0x99B3, - 3254: 0x7BC9, - 3255: 0x755C, - 3256: 0x7AF9, - 3257: 0x7B51, - 3258: 0x84C4, - 3259: 0x9010, - 3260: 0x79E9, - 3261: 0x7A92, - 3262: 0x8336, - 3263: 0x5AE1, - 3264: 0x7740, - 3265: 0x4E2D, - 3266: 0x4EF2, - 3267: 0x5B99, - 3268: 0x5FE0, - 3269: 0x62BD, - 3270: 0x663C, - 3271: 0x67F1, - 3272: 0x6CE8, - 3273: 0x866B, - 3274: 0x8877, - 3275: 0x8A3B, - 3276: 0x914E, - 3277: 0x92F3, - 3278: 0x99D0, - 3279: 0x6A17, - 3280: 0x7026, - 3281: 0x732A, - 3282: 0x82E7, - 3283: 0x8457, - 3284: 0x8CAF, - 3285: 0x4E01, - 3286: 0x5146, - 3287: 0x51CB, - 3288: 0x558B, - 3289: 0x5BF5, - 3290: 0x5E16, - 3291: 0x5E33, - 3292: 0x5E81, - 3293: 0x5F14, - 3294: 0x5F35, - 3295: 0x5F6B, - 3296: 0x5FB4, - 3297: 0x61F2, - 3298: 0x6311, - 3299: 0x66A2, - 3300: 0x671D, - 3301: 0x6F6E, - 3302: 0x7252, - 3303: 0x753A, - 3304: 0x773A, - 3305: 0x8074, - 3306: 0x8139, - 3307: 0x8178, - 3308: 0x8776, - 3309: 0x8ABF, - 3310: 0x8ADC, - 3311: 0x8D85, - 3312: 0x8DF3, - 3313: 0x929A, - 3314: 0x9577, - 3315: 0x9802, - 3316: 0x9CE5, - 3317: 0x52C5, - 3318: 0x6357, - 3319: 0x76F4, - 3320: 0x6715, - 3321: 0x6C88, - 3322: 0x73CD, - 3323: 0x8CC3, - 3324: 0x93AE, - 3325: 0x9673, - 3326: 0x6D25, - 3327: 0x589C, - 3328: 0x690E, - 3329: 0x69CC, - 3330: 0x8FFD, - 3331: 0x939A, - 3332: 0x75DB, - 3333: 0x901A, - 3334: 0x585A, - 3335: 0x6802, - 3336: 0x63B4, - 3337: 0x69FB, - 3338: 0x4F43, - 3339: 0x6F2C, - 3340: 0x67D8, - 3341: 0x8FBB, - 3342: 0x8526, - 3343: 0x7DB4, - 3344: 0x9354, - 3345: 0x693F, - 3346: 0x6F70, - 3347: 0x576A, - 3348: 0x58F7, - 3349: 0x5B2C, - 3350: 0x7D2C, - 3351: 0x722A, - 3352: 0x540A, - 3353: 0x91E3, - 3354: 0x9DB4, - 3355: 0x4EAD, - 3356: 0x4F4E, - 3357: 0x505C, - 3358: 0x5075, - 3359: 0x5243, - 3360: 0x8C9E, - 3361: 0x5448, - 3362: 0x5824, - 3363: 0x5B9A, - 3364: 0x5E1D, - 3365: 0x5E95, - 3366: 0x5EAD, - 3367: 0x5EF7, - 3368: 0x5F1F, - 3369: 0x608C, - 3370: 0x62B5, - 3371: 0x633A, - 3372: 0x63D0, - 3373: 0x68AF, - 3374: 0x6C40, - 3375: 0x7887, - 3376: 0x798E, - 3377: 0x7A0B, - 3378: 0x7DE0, - 3379: 0x8247, - 3380: 0x8A02, - 3381: 0x8AE6, - 3382: 0x8E44, - 3383: 0x9013, - 3384: 0x90B8, - 3385: 0x912D, - 3386: 0x91D8, - 3387: 0x9F0E, - 3388: 0x6CE5, - 3389: 0x6458, - 3390: 0x64E2, - 3391: 0x6575, - 3392: 0x6EF4, - 3393: 0x7684, - 3394: 0x7B1B, - 3395: 0x9069, - 3396: 0x93D1, - 3397: 0x6EBA, - 3398: 0x54F2, - 3399: 0x5FB9, - 3400: 0x64A4, - 3401: 0x8F4D, - 3402: 0x8FED, - 3403: 0x9244, - 3404: 0x5178, - 3405: 0x586B, - 3406: 0x5929, - 3407: 0x5C55, - 3408: 0x5E97, - 3409: 0x6DFB, - 3410: 0x7E8F, - 3411: 0x751C, - 3412: 0x8CBC, - 3413: 0x8EE2, - 3414: 0x985B, - 3415: 0x70B9, - 3416: 0x4F1D, - 3417: 0x6BBF, - 3418: 0x6FB1, - 3419: 0x7530, - 3420: 0x96FB, - 3421: 0x514E, - 3422: 0x5410, - 3423: 0x5835, - 3424: 0x5857, - 3425: 0x59AC, - 3426: 0x5C60, - 3427: 0x5F92, - 3428: 0x6597, - 3429: 0x675C, - 3430: 0x6E21, - 3431: 0x767B, - 3432: 0x83DF, - 3433: 0x8CED, - 3434: 0x9014, - 3435: 0x90FD, - 3436: 0x934D, - 3437: 0x7825, - 3438: 0x783A, - 3439: 0x52AA, - 3440: 0x5EA6, - 3441: 0x571F, - 3442: 0x5974, - 3443: 0x6012, - 3444: 0x5012, - 3445: 0x515A, - 3446: 0x51AC, - 3447: 0x51CD, - 3448: 0x5200, - 3449: 0x5510, - 3450: 0x5854, - 3451: 0x5858, - 3452: 0x5957, - 3453: 0x5B95, - 3454: 0x5CF6, - 3455: 0x5D8B, - 3456: 0x60BC, - 3457: 0x6295, - 3458: 0x642D, - 3459: 0x6771, - 3460: 0x6843, - 3461: 0x68BC, - 3462: 0x68DF, - 3463: 0x76D7, - 3464: 0x6DD8, - 3465: 0x6E6F, - 3466: 0x6D9B, - 3467: 0x706F, - 3468: 0x71C8, - 3469: 0x5F53, - 3470: 0x75D8, - 3471: 0x7977, - 3472: 0x7B49, - 3473: 0x7B54, - 3474: 0x7B52, - 3475: 0x7CD6, - 3476: 0x7D71, - 3477: 0x5230, - 3478: 0x8463, - 3479: 0x8569, - 3480: 0x85E4, - 3481: 0x8A0E, - 3482: 0x8B04, - 3483: 0x8C46, - 3484: 0x8E0F, - 3485: 0x9003, - 3486: 0x900F, - 3487: 0x9419, - 3488: 0x9676, - 3489: 0x982D, - 3490: 0x9A30, - 3491: 0x95D8, - 3492: 0x50CD, - 3493: 0x52D5, - 3494: 0x540C, - 3495: 0x5802, - 3496: 0x5C0E, - 3497: 0x61A7, - 3498: 0x649E, - 3499: 0x6D1E, - 3500: 0x77B3, - 3501: 0x7AE5, - 3502: 0x80F4, - 3503: 0x8404, - 3504: 0x9053, - 3505: 0x9285, - 3506: 0x5CE0, - 3507: 0x9D07, - 3508: 0x533F, - 3509: 0x5F97, - 3510: 0x5FB3, - 3511: 0x6D9C, - 3512: 0x7279, - 3513: 0x7763, - 3514: 0x79BF, - 3515: 0x7BE4, - 3516: 0x6BD2, - 3517: 0x72EC, - 3518: 0x8AAD, - 3519: 0x6803, - 3520: 0x6A61, - 3521: 0x51F8, - 3522: 0x7A81, - 3523: 0x6934, - 3524: 0x5C4A, - 3525: 0x9CF6, - 3526: 0x82EB, - 3527: 0x5BC5, - 3528: 0x9149, - 3529: 0x701E, - 3530: 0x5678, - 3531: 0x5C6F, - 3532: 0x60C7, - 3533: 0x6566, - 3534: 0x6C8C, - 3535: 0x8C5A, - 3536: 0x9041, - 3537: 0x9813, - 3538: 0x5451, - 3539: 0x66C7, - 3540: 0x920D, - 3541: 0x5948, - 3542: 0x90A3, - 3543: 0x5185, - 3544: 0x4E4D, - 3545: 0x51EA, - 3546: 0x8599, - 3547: 0x8B0E, - 3548: 0x7058, - 3549: 0x637A, - 3550: 0x934B, - 3551: 0x6962, - 3552: 0x99B4, - 3553: 0x7E04, - 3554: 0x7577, - 3555: 0x5357, - 3556: 0x6960, - 3557: 0x8EDF, - 3558: 0x96E3, - 3559: 0x6C5D, - 3560: 0x4E8C, - 3561: 0x5C3C, - 3562: 0x5F10, - 3563: 0x8FE9, - 3564: 0x5302, - 3565: 0x8CD1, - 3566: 0x8089, - 3567: 0x8679, - 3568: 0x5EFF, - 3569: 0x65E5, - 3570: 0x4E73, - 3571: 0x5165, - 3572: 0x5982, - 3573: 0x5C3F, - 3574: 0x97EE, - 3575: 0x4EFB, - 3576: 0x598A, - 3577: 0x5FCD, - 3578: 0x8A8D, - 3579: 0x6FE1, - 3580: 0x79B0, - 3581: 0x7962, - 3582: 0x5BE7, - 3583: 0x8471, - 3584: 0x732B, - 3585: 0x71B1, - 3586: 0x5E74, - 3587: 0x5FF5, - 3588: 0x637B, - 3589: 0x649A, - 3590: 0x71C3, - 3591: 0x7C98, - 3592: 0x4E43, - 3593: 0x5EFC, - 3594: 0x4E4B, - 3595: 0x57DC, - 3596: 0x56A2, - 3597: 0x60A9, - 3598: 0x6FC3, - 3599: 0x7D0D, - 3600: 0x80FD, - 3601: 0x8133, - 3602: 0x81BF, - 3603: 0x8FB2, - 3604: 0x8997, - 3605: 0x86A4, - 3606: 0x5DF4, - 3607: 0x628A, - 3608: 0x64AD, - 3609: 0x8987, - 3610: 0x6777, - 3611: 0x6CE2, - 3612: 0x6D3E, - 3613: 0x7436, - 3614: 0x7834, - 3615: 0x5A46, - 3616: 0x7F75, - 3617: 0x82AD, - 3618: 0x99AC, - 3619: 0x4FF3, - 3620: 0x5EC3, - 3621: 0x62DD, - 3622: 0x6392, - 3623: 0x6557, - 3624: 0x676F, - 3625: 0x76C3, - 3626: 0x724C, - 3627: 0x80CC, - 3628: 0x80BA, - 3629: 0x8F29, - 3630: 0x914D, - 3631: 0x500D, - 3632: 0x57F9, - 3633: 0x5A92, - 3634: 0x6885, - 3635: 0x6973, - 3636: 0x7164, - 3637: 0x72FD, - 3638: 0x8CB7, - 3639: 0x58F2, - 3640: 0x8CE0, - 3641: 0x966A, - 3642: 0x9019, - 3643: 0x877F, - 3644: 0x79E4, - 3645: 0x77E7, - 3646: 0x8429, - 3647: 0x4F2F, - 3648: 0x5265, - 3649: 0x535A, - 3650: 0x62CD, - 3651: 0x67CF, - 3652: 0x6CCA, - 3653: 0x767D, - 3654: 0x7B94, - 3655: 0x7C95, - 3656: 0x8236, - 3657: 0x8584, - 3658: 0x8FEB, - 3659: 0x66DD, - 3660: 0x6F20, - 3661: 0x7206, - 3662: 0x7E1B, - 3663: 0x83AB, - 3664: 0x99C1, - 3665: 0x9EA6, - 3666: 0x51FD, - 3667: 0x7BB1, - 3668: 0x7872, - 3669: 0x7BB8, - 3670: 0x8087, - 3671: 0x7B48, - 3672: 0x6AE8, - 3673: 0x5E61, - 3674: 0x808C, - 3675: 0x7551, - 3676: 0x7560, - 3677: 0x516B, - 3678: 0x9262, - 3679: 0x6E8C, - 3680: 0x767A, - 3681: 0x9197, - 3682: 0x9AEA, - 3683: 0x4F10, - 3684: 0x7F70, - 3685: 0x629C, - 3686: 0x7B4F, - 3687: 0x95A5, - 3688: 0x9CE9, - 3689: 0x567A, - 3690: 0x5859, - 3691: 0x86E4, - 3692: 0x96BC, - 3693: 0x4F34, - 3694: 0x5224, - 3695: 0x534A, - 3696: 0x53CD, - 3697: 0x53DB, - 3698: 0x5E06, - 3699: 0x642C, - 3700: 0x6591, - 3701: 0x677F, - 3702: 0x6C3E, - 3703: 0x6C4E, - 3704: 0x7248, - 3705: 0x72AF, - 3706: 0x73ED, - 3707: 0x7554, - 3708: 0x7E41, - 3709: 0x822C, - 3710: 0x85E9, - 3711: 0x8CA9, - 3712: 0x7BC4, - 3713: 0x91C6, - 3714: 0x7169, - 3715: 0x9812, - 3716: 0x98EF, - 3717: 0x633D, - 3718: 0x6669, - 3719: 0x756A, - 3720: 0x76E4, - 3721: 0x78D0, - 3722: 0x8543, - 3723: 0x86EE, - 3724: 0x532A, - 3725: 0x5351, - 3726: 0x5426, - 3727: 0x5983, - 3728: 0x5E87, - 3729: 0x5F7C, - 3730: 0x60B2, - 3731: 0x6249, - 3732: 0x6279, - 3733: 0x62AB, - 3734: 0x6590, - 3735: 0x6BD4, - 3736: 0x6CCC, - 3737: 0x75B2, - 3738: 0x76AE, - 3739: 0x7891, - 3740: 0x79D8, - 3741: 0x7DCB, - 3742: 0x7F77, - 3743: 0x80A5, - 3744: 0x88AB, - 3745: 0x8AB9, - 3746: 0x8CBB, - 3747: 0x907F, - 3748: 0x975E, - 3749: 0x98DB, - 3750: 0x6A0B, - 3751: 0x7C38, - 3752: 0x5099, - 3753: 0x5C3E, - 3754: 0x5FAE, - 3755: 0x6787, - 3756: 0x6BD8, - 3757: 0x7435, - 3758: 0x7709, - 3759: 0x7F8E, - 3760: 0x9F3B, - 3761: 0x67CA, - 3762: 0x7A17, - 3763: 0x5339, - 3764: 0x758B, - 3765: 0x9AED, - 3766: 0x5F66, - 3767: 0x819D, - 3768: 0x83F1, - 3769: 0x8098, - 3770: 0x5F3C, - 3771: 0x5FC5, - 3772: 0x7562, - 3773: 0x7B46, - 3774: 0x903C, - 3775: 0x6867, - 3776: 0x59EB, - 3777: 0x5A9B, - 3778: 0x7D10, - 3779: 0x767E, - 3780: 0x8B2C, - 3781: 0x4FF5, - 3782: 0x5F6A, - 3783: 0x6A19, - 3784: 0x6C37, - 3785: 0x6F02, - 3786: 0x74E2, - 3787: 0x7968, - 3788: 0x8868, - 3789: 0x8A55, - 3790: 0x8C79, - 3791: 0x5EDF, - 3792: 0x63CF, - 3793: 0x75C5, - 3794: 0x79D2, - 3795: 0x82D7, - 3796: 0x9328, - 3797: 0x92F2, - 3798: 0x849C, - 3799: 0x86ED, - 3800: 0x9C2D, - 3801: 0x54C1, - 3802: 0x5F6C, - 3803: 0x658C, - 3804: 0x6D5C, - 3805: 0x7015, - 3806: 0x8CA7, - 3807: 0x8CD3, - 3808: 0x983B, - 3809: 0x654F, - 3810: 0x74F6, - 3811: 0x4E0D, - 3812: 0x4ED8, - 3813: 0x57E0, - 3814: 0x592B, - 3815: 0x5A66, - 3816: 0x5BCC, - 3817: 0x51A8, - 3818: 0x5E03, - 3819: 0x5E9C, - 3820: 0x6016, - 3821: 0x6276, - 3822: 0x6577, - 3823: 0x65A7, - 3824: 0x666E, - 3825: 0x6D6E, - 3826: 0x7236, - 3827: 0x7B26, - 3828: 0x8150, - 3829: 0x819A, - 3830: 0x8299, - 3831: 0x8B5C, - 3832: 0x8CA0, - 3833: 0x8CE6, - 3834: 0x8D74, - 3835: 0x961C, - 3836: 0x9644, - 3837: 0x4FAE, - 3838: 0x64AB, - 3839: 0x6B66, - 3840: 0x821E, - 3841: 0x8461, - 3842: 0x856A, - 3843: 0x90E8, - 3844: 0x5C01, - 3845: 0x6953, - 3846: 0x98A8, - 3847: 0x847A, - 3848: 0x8557, - 3849: 0x4F0F, - 3850: 0x526F, - 3851: 0x5FA9, - 3852: 0x5E45, - 3853: 0x670D, - 3854: 0x798F, - 3855: 0x8179, - 3856: 0x8907, - 3857: 0x8986, - 3858: 0x6DF5, - 3859: 0x5F17, - 3860: 0x6255, - 3861: 0x6CB8, - 3862: 0x4ECF, - 3863: 0x7269, - 3864: 0x9B92, - 3865: 0x5206, - 3866: 0x543B, - 3867: 0x5674, - 3868: 0x58B3, - 3869: 0x61A4, - 3870: 0x626E, - 3871: 0x711A, - 3872: 0x596E, - 3873: 0x7C89, - 3874: 0x7CDE, - 3875: 0x7D1B, - 3876: 0x96F0, - 3877: 0x6587, - 3878: 0x805E, - 3879: 0x4E19, - 3880: 0x4F75, - 3881: 0x5175, - 3882: 0x5840, - 3883: 0x5E63, - 3884: 0x5E73, - 3885: 0x5F0A, - 3886: 0x67C4, - 3887: 0x4E26, - 3888: 0x853D, - 3889: 0x9589, - 3890: 0x965B, - 3891: 0x7C73, - 3892: 0x9801, - 3893: 0x50FB, - 3894: 0x58C1, - 3895: 0x7656, - 3896: 0x78A7, - 3897: 0x5225, - 3898: 0x77A5, - 3899: 0x8511, - 3900: 0x7B86, - 3901: 0x504F, - 3902: 0x5909, - 3903: 0x7247, - 3904: 0x7BC7, - 3905: 0x7DE8, - 3906: 0x8FBA, - 3907: 0x8FD4, - 3908: 0x904D, - 3909: 0x4FBF, - 3910: 0x52C9, - 3911: 0x5A29, - 3912: 0x5F01, - 3913: 0x97AD, - 3914: 0x4FDD, - 3915: 0x8217, - 3916: 0x92EA, - 3917: 0x5703, - 3918: 0x6355, - 3919: 0x6B69, - 3920: 0x752B, - 3921: 0x88DC, - 3922: 0x8F14, - 3923: 0x7A42, - 3924: 0x52DF, - 3925: 0x5893, - 3926: 0x6155, - 3927: 0x620A, - 3928: 0x66AE, - 3929: 0x6BCD, - 3930: 0x7C3F, - 3931: 0x83E9, - 3932: 0x5023, - 3933: 0x4FF8, - 3934: 0x5305, - 3935: 0x5446, - 3936: 0x5831, - 3937: 0x5949, - 3938: 0x5B9D, - 3939: 0x5CF0, - 3940: 0x5CEF, - 3941: 0x5D29, - 3942: 0x5E96, - 3943: 0x62B1, - 3944: 0x6367, - 3945: 0x653E, - 3946: 0x65B9, - 3947: 0x670B, - 3948: 0x6CD5, - 3949: 0x6CE1, - 3950: 0x70F9, - 3951: 0x7832, - 3952: 0x7E2B, - 3953: 0x80DE, - 3954: 0x82B3, - 3955: 0x840C, - 3956: 0x84EC, - 3957: 0x8702, - 3958: 0x8912, - 3959: 0x8A2A, - 3960: 0x8C4A, - 3961: 0x90A6, - 3962: 0x92D2, - 3963: 0x98FD, - 3964: 0x9CF3, - 3965: 0x9D6C, - 3966: 0x4E4F, - 3967: 0x4EA1, - 3968: 0x508D, - 3969: 0x5256, - 3970: 0x574A, - 3971: 0x59A8, - 3972: 0x5E3D, - 3973: 0x5FD8, - 3974: 0x5FD9, - 3975: 0x623F, - 3976: 0x66B4, - 3977: 0x671B, - 3978: 0x67D0, - 3979: 0x68D2, - 3980: 0x5192, - 3981: 0x7D21, - 3982: 0x80AA, - 3983: 0x81A8, - 3984: 0x8B00, - 3985: 0x8C8C, - 3986: 0x8CBF, - 3987: 0x927E, - 3988: 0x9632, - 3989: 0x5420, - 3990: 0x982C, - 3991: 0x5317, - 3992: 0x50D5, - 3993: 0x535C, - 3994: 0x58A8, - 3995: 0x64B2, - 3996: 0x6734, - 3997: 0x7267, - 3998: 0x7766, - 3999: 0x7A46, - 4000: 0x91E6, - 4001: 0x52C3, - 4002: 0x6CA1, - 4003: 0x6B86, - 4004: 0x5800, - 4005: 0x5E4C, - 4006: 0x5954, - 4007: 0x672C, - 4008: 0x7FFB, - 4009: 0x51E1, - 4010: 0x76C6, - 4011: 0x6469, - 4012: 0x78E8, - 4013: 0x9B54, - 4014: 0x9EBB, - 4015: 0x57CB, - 4016: 0x59B9, - 4017: 0x6627, - 4018: 0x679A, - 4019: 0x6BCE, - 4020: 0x54E9, - 4021: 0x69D9, - 4022: 0x5E55, - 4023: 0x819C, - 4024: 0x6795, - 4025: 0x9BAA, - 4026: 0x67FE, - 4027: 0x9C52, - 4028: 0x685D, - 4029: 0x4EA6, - 4030: 0x4FE3, - 4031: 0x53C8, - 4032: 0x62B9, - 4033: 0x672B, - 4034: 0x6CAB, - 4035: 0x8FC4, - 4036: 0x4FAD, - 4037: 0x7E6D, - 4038: 0x9EBF, - 4039: 0x4E07, - 4040: 0x6162, - 4041: 0x6E80, - 4042: 0x6F2B, - 4043: 0x8513, - 4044: 0x5473, - 4045: 0x672A, - 4046: 0x9B45, - 4047: 0x5DF3, - 4048: 0x7B95, - 4049: 0x5CAC, - 4050: 0x5BC6, - 4051: 0x871C, - 4052: 0x6E4A, - 4053: 0x84D1, - 4054: 0x7A14, - 4055: 0x8108, - 4056: 0x5999, - 4057: 0x7C8D, - 4058: 0x6C11, - 4059: 0x7720, - 4060: 0x52D9, - 4061: 0x5922, - 4062: 0x7121, - 4063: 0x725F, - 4064: 0x77DB, - 4065: 0x9727, - 4066: 0x9D61, - 4067: 0x690B, - 4068: 0x5A7F, - 4069: 0x5A18, - 4070: 0x51A5, - 4071: 0x540D, - 4072: 0x547D, - 4073: 0x660E, - 4074: 0x76DF, - 4075: 0x8FF7, - 4076: 0x9298, - 4077: 0x9CF4, - 4078: 0x59EA, - 4079: 0x725D, - 4080: 0x6EC5, - 4081: 0x514D, - 4082: 0x68C9, - 4083: 0x7DBF, - 4084: 0x7DEC, - 4085: 0x9762, - 4086: 0x9EBA, - 4087: 0x6478, - 4088: 0x6A21, - 4089: 0x8302, - 4090: 0x5984, - 4091: 0x5B5F, - 4092: 0x6BDB, - 4093: 0x731B, - 4094: 0x76F2, - 4095: 0x7DB2, - 4096: 0x8017, - 4097: 0x8499, - 4098: 0x5132, - 4099: 0x6728, - 4100: 0x9ED9, - 4101: 0x76EE, - 4102: 0x6762, - 4103: 0x52FF, - 4104: 0x9905, - 4105: 0x5C24, - 4106: 0x623B, - 4107: 0x7C7E, - 4108: 0x8CB0, - 4109: 0x554F, - 4110: 0x60B6, - 4111: 0x7D0B, - 4112: 0x9580, - 4113: 0x5301, - 4114: 0x4E5F, - 4115: 0x51B6, - 4116: 0x591C, - 4117: 0x723A, - 4118: 0x8036, - 4119: 0x91CE, - 4120: 0x5F25, - 4121: 0x77E2, - 4122: 0x5384, - 4123: 0x5F79, - 4124: 0x7D04, - 4125: 0x85AC, - 4126: 0x8A33, - 4127: 0x8E8D, - 4128: 0x9756, - 4129: 0x67F3, - 4130: 0x85AE, - 4131: 0x9453, - 4132: 0x6109, - 4133: 0x6108, - 4134: 0x6CB9, - 4135: 0x7652, - 4136: 0x8AED, - 4137: 0x8F38, - 4138: 0x552F, - 4139: 0x4F51, - 4140: 0x512A, - 4141: 0x52C7, - 4142: 0x53CB, - 4143: 0x5BA5, - 4144: 0x5E7D, - 4145: 0x60A0, - 4146: 0x6182, - 4147: 0x63D6, - 4148: 0x6709, - 4149: 0x67DA, - 4150: 0x6E67, - 4151: 0x6D8C, - 4152: 0x7336, - 4153: 0x7337, - 4154: 0x7531, - 4155: 0x7950, - 4156: 0x88D5, - 4157: 0x8A98, - 4158: 0x904A, - 4159: 0x9091, - 4160: 0x90F5, - 4161: 0x96C4, - 4162: 0x878D, - 4163: 0x5915, - 4164: 0x4E88, - 4165: 0x4F59, - 4166: 0x4E0E, - 4167: 0x8A89, - 4168: 0x8F3F, - 4169: 0x9810, - 4170: 0x50AD, - 4171: 0x5E7C, - 4172: 0x5996, - 4173: 0x5BB9, - 4174: 0x5EB8, - 4175: 0x63DA, - 4176: 0x63FA, - 4177: 0x64C1, - 4178: 0x66DC, - 4179: 0x694A, - 4180: 0x69D8, - 4181: 0x6D0B, - 4182: 0x6EB6, - 4183: 0x7194, - 4184: 0x7528, - 4185: 0x7AAF, - 4186: 0x7F8A, - 4187: 0x8000, - 4188: 0x8449, - 4189: 0x84C9, - 4190: 0x8981, - 4191: 0x8B21, - 4192: 0x8E0A, - 4193: 0x9065, - 4194: 0x967D, - 4195: 0x990A, - 4196: 0x617E, - 4197: 0x6291, - 4198: 0x6B32, - 4199: 0x6C83, - 4200: 0x6D74, - 4201: 0x7FCC, - 4202: 0x7FFC, - 4203: 0x6DC0, - 4204: 0x7F85, - 4205: 0x87BA, - 4206: 0x88F8, - 4207: 0x6765, - 4208: 0x83B1, - 4209: 0x983C, - 4210: 0x96F7, - 4211: 0x6D1B, - 4212: 0x7D61, - 4213: 0x843D, - 4214: 0x916A, - 4215: 0x4E71, - 4216: 0x5375, - 4217: 0x5D50, - 4218: 0x6B04, - 4219: 0x6FEB, - 4220: 0x85CD, - 4221: 0x862D, - 4222: 0x89A7, - 4223: 0x5229, - 4224: 0x540F, - 4225: 0x5C65, - 4226: 0x674E, - 4227: 0x68A8, - 4228: 0x7406, - 4229: 0x7483, - 4230: 0x75E2, - 4231: 0x88CF, - 4232: 0x88E1, - 4233: 0x91CC, - 4234: 0x96E2, - 4235: 0x9678, - 4236: 0x5F8B, - 4237: 0x7387, - 4238: 0x7ACB, - 4239: 0x844E, - 4240: 0x63A0, - 4241: 0x7565, - 4242: 0x5289, - 4243: 0x6D41, - 4244: 0x6E9C, - 4245: 0x7409, - 4246: 0x7559, - 4247: 0x786B, - 4248: 0x7C92, - 4249: 0x9686, - 4250: 0x7ADC, - 4251: 0x9F8D, - 4252: 0x4FB6, - 4253: 0x616E, - 4254: 0x65C5, - 4255: 0x865C, - 4256: 0x4E86, - 4257: 0x4EAE, - 4258: 0x50DA, - 4259: 0x4E21, - 4260: 0x51CC, - 4261: 0x5BEE, - 4262: 0x6599, - 4263: 0x6881, - 4264: 0x6DBC, - 4265: 0x731F, - 4266: 0x7642, - 4267: 0x77AD, - 4268: 0x7A1C, - 4269: 0x7CE7, - 4270: 0x826F, - 4271: 0x8AD2, - 4272: 0x907C, - 4273: 0x91CF, - 4274: 0x9675, - 4275: 0x9818, - 4276: 0x529B, - 4277: 0x7DD1, - 4278: 0x502B, - 4279: 0x5398, - 4280: 0x6797, - 4281: 0x6DCB, - 4282: 0x71D0, - 4283: 0x7433, - 4284: 0x81E8, - 4285: 0x8F2A, - 4286: 0x96A3, - 4287: 0x9C57, - 4288: 0x9E9F, - 4289: 0x7460, - 4290: 0x5841, - 4291: 0x6D99, - 4292: 0x7D2F, - 4293: 0x985E, - 4294: 0x4EE4, - 4295: 0x4F36, - 4296: 0x4F8B, - 4297: 0x51B7, - 4298: 0x52B1, - 4299: 0x5DBA, - 4300: 0x601C, - 4301: 0x73B2, - 4302: 0x793C, - 4303: 0x82D3, - 4304: 0x9234, - 4305: 0x96B7, - 4306: 0x96F6, - 4307: 0x970A, - 4308: 0x9E97, - 4309: 0x9F62, - 4310: 0x66A6, - 4311: 0x6B74, - 4312: 0x5217, - 4313: 0x52A3, - 4314: 0x70C8, - 4315: 0x88C2, - 4316: 0x5EC9, - 4317: 0x604B, - 4318: 0x6190, - 4319: 0x6F23, - 4320: 0x7149, - 4321: 0x7C3E, - 4322: 0x7DF4, - 4323: 0x806F, - 4324: 0x84EE, - 4325: 0x9023, - 4326: 0x932C, - 4327: 0x5442, - 4328: 0x9B6F, - 4329: 0x6AD3, - 4330: 0x7089, - 4331: 0x8CC2, - 4332: 0x8DEF, - 4333: 0x9732, - 4334: 0x52B4, - 4335: 0x5A41, - 4336: 0x5ECA, - 4337: 0x5F04, - 4338: 0x6717, - 4339: 0x697C, - 4340: 0x6994, - 4341: 0x6D6A, - 4342: 0x6F0F, - 4343: 0x7262, - 4344: 0x72FC, - 4345: 0x7BED, - 4346: 0x8001, - 4347: 0x807E, - 4348: 0x874B, - 4349: 0x90CE, - 4350: 0x516D, - 4351: 0x9E93, - 4352: 0x7984, - 4353: 0x808B, - 4354: 0x9332, - 4355: 0x8AD6, - 4356: 0x502D, - 4357: 0x548C, - 4358: 0x8A71, - 4359: 0x6B6A, - 4360: 0x8CC4, - 4361: 0x8107, - 4362: 0x60D1, - 4363: 0x67A0, - 4364: 0x9DF2, - 4365: 0x4E99, - 4366: 0x4E98, - 4367: 0x9C10, - 4368: 0x8A6B, - 4369: 0x85C1, - 4370: 0x8568, - 4371: 0x6900, - 4372: 0x6E7E, - 4373: 0x7897, - 4374: 0x8155, - 4418: 0x5F0C, - 4419: 0x4E10, - 4420: 0x4E15, - 4421: 0x4E2A, - 4422: 0x4E31, - 4423: 0x4E36, - 4424: 0x4E3C, - 4425: 0x4E3F, - 4426: 0x4E42, - 4427: 0x4E56, - 4428: 0x4E58, - 4429: 0x4E82, - 4430: 0x4E85, - 4431: 0x8C6B, - 4432: 0x4E8A, - 4433: 0x8212, - 4434: 0x5F0D, - 4435: 0x4E8E, - 4436: 0x4E9E, - 4437: 0x4E9F, - 4438: 0x4EA0, - 4439: 0x4EA2, - 4440: 0x4EB0, - 4441: 0x4EB3, - 4442: 0x4EB6, - 4443: 0x4ECE, - 4444: 0x4ECD, - 4445: 0x4EC4, - 4446: 0x4EC6, - 4447: 0x4EC2, - 4448: 0x4ED7, - 4449: 0x4EDE, - 4450: 0x4EED, - 4451: 0x4EDF, - 4452: 0x4EF7, - 4453: 0x4F09, - 4454: 0x4F5A, - 4455: 0x4F30, - 4456: 0x4F5B, - 4457: 0x4F5D, - 4458: 0x4F57, - 4459: 0x4F47, - 4460: 0x4F76, - 4461: 0x4F88, - 4462: 0x4F8F, - 4463: 0x4F98, - 4464: 0x4F7B, - 4465: 0x4F69, - 4466: 0x4F70, - 4467: 0x4F91, - 4468: 0x4F6F, - 4469: 0x4F86, - 4470: 0x4F96, - 4471: 0x5118, - 4472: 0x4FD4, - 4473: 0x4FDF, - 4474: 0x4FCE, - 4475: 0x4FD8, - 4476: 0x4FDB, - 4477: 0x4FD1, - 4478: 0x4FDA, - 4479: 0x4FD0, - 4480: 0x4FE4, - 4481: 0x4FE5, - 4482: 0x501A, - 4483: 0x5028, - 4484: 0x5014, - 4485: 0x502A, - 4486: 0x5025, - 4487: 0x5005, - 4488: 0x4F1C, - 4489: 0x4FF6, - 4490: 0x5021, - 4491: 0x5029, - 4492: 0x502C, - 4493: 0x4FFE, - 4494: 0x4FEF, - 4495: 0x5011, - 4496: 0x5006, - 4497: 0x5043, - 4498: 0x5047, - 4499: 0x6703, - 4500: 0x5055, - 4501: 0x5050, - 4502: 0x5048, - 4503: 0x505A, - 4504: 0x5056, - 4505: 0x506C, - 4506: 0x5078, - 4507: 0x5080, - 4508: 0x509A, - 4509: 0x5085, - 4510: 0x50B4, - 4511: 0x50B2, - 4512: 0x50C9, - 4513: 0x50CA, - 4514: 0x50B3, - 4515: 0x50C2, - 4516: 0x50D6, - 4517: 0x50DE, - 4518: 0x50E5, - 4519: 0x50ED, - 4520: 0x50E3, - 4521: 0x50EE, - 4522: 0x50F9, - 4523: 0x50F5, - 4524: 0x5109, - 4525: 0x5101, - 4526: 0x5102, - 4527: 0x5116, - 4528: 0x5115, - 4529: 0x5114, - 4530: 0x511A, - 4531: 0x5121, - 4532: 0x513A, - 4533: 0x5137, - 4534: 0x513C, - 4535: 0x513B, - 4536: 0x513F, - 4537: 0x5140, - 4538: 0x5152, - 4539: 0x514C, - 4540: 0x5154, - 4541: 0x5162, - 4542: 0x7AF8, - 4543: 0x5169, - 4544: 0x516A, - 4545: 0x516E, - 4546: 0x5180, - 4547: 0x5182, - 4548: 0x56D8, - 4549: 0x518C, - 4550: 0x5189, - 4551: 0x518F, - 4552: 0x5191, - 4553: 0x5193, - 4554: 0x5195, - 4555: 0x5196, - 4556: 0x51A4, - 4557: 0x51A6, - 4558: 0x51A2, - 4559: 0x51A9, - 4560: 0x51AA, - 4561: 0x51AB, - 4562: 0x51B3, - 4563: 0x51B1, - 4564: 0x51B2, - 4565: 0x51B0, - 4566: 0x51B5, - 4567: 0x51BD, - 4568: 0x51C5, - 4569: 0x51C9, - 4570: 0x51DB, - 4571: 0x51E0, - 4572: 0x8655, - 4573: 0x51E9, - 4574: 0x51ED, - 4575: 0x51F0, - 4576: 0x51F5, - 4577: 0x51FE, - 4578: 0x5204, - 4579: 0x520B, - 4580: 0x5214, - 4581: 0x520E, - 4582: 0x5227, - 4583: 0x522A, - 4584: 0x522E, - 4585: 0x5233, - 4586: 0x5239, - 4587: 0x524F, - 4588: 0x5244, - 4589: 0x524B, - 4590: 0x524C, - 4591: 0x525E, - 4592: 0x5254, - 4593: 0x526A, - 4594: 0x5274, - 4595: 0x5269, - 4596: 0x5273, - 4597: 0x527F, - 4598: 0x527D, - 4599: 0x528D, - 4600: 0x5294, - 4601: 0x5292, - 4602: 0x5271, - 4603: 0x5288, - 4604: 0x5291, - 4605: 0x8FA8, - 4606: 0x8FA7, - 4607: 0x52AC, - 4608: 0x52AD, - 4609: 0x52BC, - 4610: 0x52B5, - 4611: 0x52C1, - 4612: 0x52CD, - 4613: 0x52D7, - 4614: 0x52DE, - 4615: 0x52E3, - 4616: 0x52E6, - 4617: 0x98ED, - 4618: 0x52E0, - 4619: 0x52F3, - 4620: 0x52F5, - 4621: 0x52F8, - 4622: 0x52F9, - 4623: 0x5306, - 4624: 0x5308, - 4625: 0x7538, - 4626: 0x530D, - 4627: 0x5310, - 4628: 0x530F, - 4629: 0x5315, - 4630: 0x531A, - 4631: 0x5323, - 4632: 0x532F, - 4633: 0x5331, - 4634: 0x5333, - 4635: 0x5338, - 4636: 0x5340, - 4637: 0x5346, - 4638: 0x5345, - 4639: 0x4E17, - 4640: 0x5349, - 4641: 0x534D, - 4642: 0x51D6, - 4643: 0x535E, - 4644: 0x5369, - 4645: 0x536E, - 4646: 0x5918, - 4647: 0x537B, - 4648: 0x5377, - 4649: 0x5382, - 4650: 0x5396, - 4651: 0x53A0, - 4652: 0x53A6, - 4653: 0x53A5, - 4654: 0x53AE, - 4655: 0x53B0, - 4656: 0x53B6, - 4657: 0x53C3, - 4658: 0x7C12, - 4659: 0x96D9, - 4660: 0x53DF, - 4661: 0x66FC, - 4662: 0x71EE, - 4663: 0x53EE, - 4664: 0x53E8, - 4665: 0x53ED, - 4666: 0x53FA, - 4667: 0x5401, - 4668: 0x543D, - 4669: 0x5440, - 4670: 0x542C, - 4671: 0x542D, - 4672: 0x543C, - 4673: 0x542E, - 4674: 0x5436, - 4675: 0x5429, - 4676: 0x541D, - 4677: 0x544E, - 4678: 0x548F, - 4679: 0x5475, - 4680: 0x548E, - 4681: 0x545F, - 4682: 0x5471, - 4683: 0x5477, - 4684: 0x5470, - 4685: 0x5492, - 4686: 0x547B, - 4687: 0x5480, - 4688: 0x5476, - 4689: 0x5484, - 4690: 0x5490, - 4691: 0x5486, - 4692: 0x54C7, - 4693: 0x54A2, - 4694: 0x54B8, - 4695: 0x54A5, - 4696: 0x54AC, - 4697: 0x54C4, - 4698: 0x54C8, - 4699: 0x54A8, - 4700: 0x54AB, - 4701: 0x54C2, - 4702: 0x54A4, - 4703: 0x54BE, - 4704: 0x54BC, - 4705: 0x54D8, - 4706: 0x54E5, - 4707: 0x54E6, - 4708: 0x550F, - 4709: 0x5514, - 4710: 0x54FD, - 4711: 0x54EE, - 4712: 0x54ED, - 4713: 0x54FA, - 4714: 0x54E2, - 4715: 0x5539, - 4716: 0x5540, - 4717: 0x5563, - 4718: 0x554C, - 4719: 0x552E, - 4720: 0x555C, - 4721: 0x5545, - 4722: 0x5556, - 4723: 0x5557, - 4724: 0x5538, - 4725: 0x5533, - 4726: 0x555D, - 4727: 0x5599, - 4728: 0x5580, - 4729: 0x54AF, - 4730: 0x558A, - 4731: 0x559F, - 4732: 0x557B, - 4733: 0x557E, - 4734: 0x5598, - 4735: 0x559E, - 4736: 0x55AE, - 4737: 0x557C, - 4738: 0x5583, - 4739: 0x55A9, - 4740: 0x5587, - 4741: 0x55A8, - 4742: 0x55DA, - 4743: 0x55C5, - 4744: 0x55DF, - 4745: 0x55C4, - 4746: 0x55DC, - 4747: 0x55E4, - 4748: 0x55D4, - 4749: 0x5614, - 4750: 0x55F7, - 4751: 0x5616, - 4752: 0x55FE, - 4753: 0x55FD, - 4754: 0x561B, - 4755: 0x55F9, - 4756: 0x564E, - 4757: 0x5650, - 4758: 0x71DF, - 4759: 0x5634, - 4760: 0x5636, - 4761: 0x5632, - 4762: 0x5638, - 4763: 0x566B, - 4764: 0x5664, - 4765: 0x562F, - 4766: 0x566C, - 4767: 0x566A, - 4768: 0x5686, - 4769: 0x5680, - 4770: 0x568A, - 4771: 0x56A0, - 4772: 0x5694, - 4773: 0x568F, - 4774: 0x56A5, - 4775: 0x56AE, - 4776: 0x56B6, - 4777: 0x56B4, - 4778: 0x56C2, - 4779: 0x56BC, - 4780: 0x56C1, - 4781: 0x56C3, - 4782: 0x56C0, - 4783: 0x56C8, - 4784: 0x56CE, - 4785: 0x56D1, - 4786: 0x56D3, - 4787: 0x56D7, - 4788: 0x56EE, - 4789: 0x56F9, - 4790: 0x5700, - 4791: 0x56FF, - 4792: 0x5704, - 4793: 0x5709, - 4794: 0x5708, - 4795: 0x570B, - 4796: 0x570D, - 4797: 0x5713, - 4798: 0x5718, - 4799: 0x5716, - 4800: 0x55C7, - 4801: 0x571C, - 4802: 0x5726, - 4803: 0x5737, - 4804: 0x5738, - 4805: 0x574E, - 4806: 0x573B, - 4807: 0x5740, - 4808: 0x574F, - 4809: 0x5769, - 4810: 0x57C0, - 4811: 0x5788, - 4812: 0x5761, - 4813: 0x577F, - 4814: 0x5789, - 4815: 0x5793, - 4816: 0x57A0, - 4817: 0x57B3, - 4818: 0x57A4, - 4819: 0x57AA, - 4820: 0x57B0, - 4821: 0x57C3, - 4822: 0x57C6, - 4823: 0x57D4, - 4824: 0x57D2, - 4825: 0x57D3, - 4826: 0x580A, - 4827: 0x57D6, - 4828: 0x57E3, - 4829: 0x580B, - 4830: 0x5819, - 4831: 0x581D, - 4832: 0x5872, - 4833: 0x5821, - 4834: 0x5862, - 4835: 0x584B, - 4836: 0x5870, - 4837: 0x6BC0, - 4838: 0x5852, - 4839: 0x583D, - 4840: 0x5879, - 4841: 0x5885, - 4842: 0x58B9, - 4843: 0x589F, - 4844: 0x58AB, - 4845: 0x58BA, - 4846: 0x58DE, - 4847: 0x58BB, - 4848: 0x58B8, - 4849: 0x58AE, - 4850: 0x58C5, - 4851: 0x58D3, - 4852: 0x58D1, - 4853: 0x58D7, - 4854: 0x58D9, - 4855: 0x58D8, - 4856: 0x58E5, - 4857: 0x58DC, - 4858: 0x58E4, - 4859: 0x58DF, - 4860: 0x58EF, - 4861: 0x58FA, - 4862: 0x58F9, - 4863: 0x58FB, - 4864: 0x58FC, - 4865: 0x58FD, - 4866: 0x5902, - 4867: 0x590A, - 4868: 0x5910, - 4869: 0x591B, - 4870: 0x68A6, - 4871: 0x5925, - 4872: 0x592C, - 4873: 0x592D, - 4874: 0x5932, - 4875: 0x5938, - 4876: 0x593E, - 4877: 0x7AD2, - 4878: 0x5955, - 4879: 0x5950, - 4880: 0x594E, - 4881: 0x595A, - 4882: 0x5958, - 4883: 0x5962, - 4884: 0x5960, - 4885: 0x5967, - 4886: 0x596C, - 4887: 0x5969, - 4888: 0x5978, - 4889: 0x5981, - 4890: 0x599D, - 4891: 0x4F5E, - 4892: 0x4FAB, - 4893: 0x59A3, - 4894: 0x59B2, - 4895: 0x59C6, - 4896: 0x59E8, - 4897: 0x59DC, - 4898: 0x598D, - 4899: 0x59D9, - 4900: 0x59DA, - 4901: 0x5A25, - 4902: 0x5A1F, - 4903: 0x5A11, - 4904: 0x5A1C, - 4905: 0x5A09, - 4906: 0x5A1A, - 4907: 0x5A40, - 4908: 0x5A6C, - 4909: 0x5A49, - 4910: 0x5A35, - 4911: 0x5A36, - 4912: 0x5A62, - 4913: 0x5A6A, - 4914: 0x5A9A, - 4915: 0x5ABC, - 4916: 0x5ABE, - 4917: 0x5ACB, - 4918: 0x5AC2, - 4919: 0x5ABD, - 4920: 0x5AE3, - 4921: 0x5AD7, - 4922: 0x5AE6, - 4923: 0x5AE9, - 4924: 0x5AD6, - 4925: 0x5AFA, - 4926: 0x5AFB, - 4927: 0x5B0C, - 4928: 0x5B0B, - 4929: 0x5B16, - 4930: 0x5B32, - 4931: 0x5AD0, - 4932: 0x5B2A, - 4933: 0x5B36, - 4934: 0x5B3E, - 4935: 0x5B43, - 4936: 0x5B45, - 4937: 0x5B40, - 4938: 0x5B51, - 4939: 0x5B55, - 4940: 0x5B5A, - 4941: 0x5B5B, - 4942: 0x5B65, - 4943: 0x5B69, - 4944: 0x5B70, - 4945: 0x5B73, - 4946: 0x5B75, - 4947: 0x5B78, - 4948: 0x6588, - 4949: 0x5B7A, - 4950: 0x5B80, - 4951: 0x5B83, - 4952: 0x5BA6, - 4953: 0x5BB8, - 4954: 0x5BC3, - 4955: 0x5BC7, - 4956: 0x5BC9, - 4957: 0x5BD4, - 4958: 0x5BD0, - 4959: 0x5BE4, - 4960: 0x5BE6, - 4961: 0x5BE2, - 4962: 0x5BDE, - 4963: 0x5BE5, - 4964: 0x5BEB, - 4965: 0x5BF0, - 4966: 0x5BF6, - 4967: 0x5BF3, - 4968: 0x5C05, - 4969: 0x5C07, - 4970: 0x5C08, - 4971: 0x5C0D, - 4972: 0x5C13, - 4973: 0x5C20, - 4974: 0x5C22, - 4975: 0x5C28, - 4976: 0x5C38, - 4977: 0x5C39, - 4978: 0x5C41, - 4979: 0x5C46, - 4980: 0x5C4E, - 4981: 0x5C53, - 4982: 0x5C50, - 4983: 0x5C4F, - 4984: 0x5B71, - 4985: 0x5C6C, - 4986: 0x5C6E, - 4987: 0x4E62, - 4988: 0x5C76, - 4989: 0x5C79, - 4990: 0x5C8C, - 4991: 0x5C91, - 4992: 0x5C94, - 4993: 0x599B, - 4994: 0x5CAB, - 4995: 0x5CBB, - 4996: 0x5CB6, - 4997: 0x5CBC, - 4998: 0x5CB7, - 4999: 0x5CC5, - 5000: 0x5CBE, - 5001: 0x5CC7, - 5002: 0x5CD9, - 5003: 0x5CE9, - 5004: 0x5CFD, - 5005: 0x5CFA, - 5006: 0x5CED, - 5007: 0x5D8C, - 5008: 0x5CEA, - 5009: 0x5D0B, - 5010: 0x5D15, - 5011: 0x5D17, - 5012: 0x5D5C, - 5013: 0x5D1F, - 5014: 0x5D1B, - 5015: 0x5D11, - 5016: 0x5D14, - 5017: 0x5D22, - 5018: 0x5D1A, - 5019: 0x5D19, - 5020: 0x5D18, - 5021: 0x5D4C, - 5022: 0x5D52, - 5023: 0x5D4E, - 5024: 0x5D4B, - 5025: 0x5D6C, - 5026: 0x5D73, - 5027: 0x5D76, - 5028: 0x5D87, - 5029: 0x5D84, - 5030: 0x5D82, - 5031: 0x5DA2, - 5032: 0x5D9D, - 5033: 0x5DAC, - 5034: 0x5DAE, - 5035: 0x5DBD, - 5036: 0x5D90, - 5037: 0x5DB7, - 5038: 0x5DBC, - 5039: 0x5DC9, - 5040: 0x5DCD, - 5041: 0x5DD3, - 5042: 0x5DD2, - 5043: 0x5DD6, - 5044: 0x5DDB, - 5045: 0x5DEB, - 5046: 0x5DF2, - 5047: 0x5DF5, - 5048: 0x5E0B, - 5049: 0x5E1A, - 5050: 0x5E19, - 5051: 0x5E11, - 5052: 0x5E1B, - 5053: 0x5E36, - 5054: 0x5E37, - 5055: 0x5E44, - 5056: 0x5E43, - 5057: 0x5E40, - 5058: 0x5E4E, - 5059: 0x5E57, - 5060: 0x5E54, - 5061: 0x5E5F, - 5062: 0x5E62, - 5063: 0x5E64, - 5064: 0x5E47, - 5065: 0x5E75, - 5066: 0x5E76, - 5067: 0x5E7A, - 5068: 0x9EBC, - 5069: 0x5E7F, - 5070: 0x5EA0, - 5071: 0x5EC1, - 5072: 0x5EC2, - 5073: 0x5EC8, - 5074: 0x5ED0, - 5075: 0x5ECF, - 5076: 0x5ED6, - 5077: 0x5EE3, - 5078: 0x5EDD, - 5079: 0x5EDA, - 5080: 0x5EDB, - 5081: 0x5EE2, - 5082: 0x5EE1, - 5083: 0x5EE8, - 5084: 0x5EE9, - 5085: 0x5EEC, - 5086: 0x5EF1, - 5087: 0x5EF3, - 5088: 0x5EF0, - 5089: 0x5EF4, - 5090: 0x5EF8, - 5091: 0x5EFE, - 5092: 0x5F03, - 5093: 0x5F09, - 5094: 0x5F5D, - 5095: 0x5F5C, - 5096: 0x5F0B, - 5097: 0x5F11, - 5098: 0x5F16, - 5099: 0x5F29, - 5100: 0x5F2D, - 5101: 0x5F38, - 5102: 0x5F41, - 5103: 0x5F48, - 5104: 0x5F4C, - 5105: 0x5F4E, - 5106: 0x5F2F, - 5107: 0x5F51, - 5108: 0x5F56, - 5109: 0x5F57, - 5110: 0x5F59, - 5111: 0x5F61, - 5112: 0x5F6D, - 5113: 0x5F73, - 5114: 0x5F77, - 5115: 0x5F83, - 5116: 0x5F82, - 5117: 0x5F7F, - 5118: 0x5F8A, - 5119: 0x5F88, - 5120: 0x5F91, - 5121: 0x5F87, - 5122: 0x5F9E, - 5123: 0x5F99, - 5124: 0x5F98, - 5125: 0x5FA0, - 5126: 0x5FA8, - 5127: 0x5FAD, - 5128: 0x5FBC, - 5129: 0x5FD6, - 5130: 0x5FFB, - 5131: 0x5FE4, - 5132: 0x5FF8, - 5133: 0x5FF1, - 5134: 0x5FDD, - 5135: 0x60B3, - 5136: 0x5FFF, - 5137: 0x6021, - 5138: 0x6060, - 5139: 0x6019, - 5140: 0x6010, - 5141: 0x6029, - 5142: 0x600E, - 5143: 0x6031, - 5144: 0x601B, - 5145: 0x6015, - 5146: 0x602B, - 5147: 0x6026, - 5148: 0x600F, - 5149: 0x603A, - 5150: 0x605A, - 5151: 0x6041, - 5152: 0x606A, - 5153: 0x6077, - 5154: 0x605F, - 5155: 0x604A, - 5156: 0x6046, - 5157: 0x604D, - 5158: 0x6063, - 5159: 0x6043, - 5160: 0x6064, - 5161: 0x6042, - 5162: 0x606C, - 5163: 0x606B, - 5164: 0x6059, - 5165: 0x6081, - 5166: 0x608D, - 5167: 0x60E7, - 5168: 0x6083, - 5169: 0x609A, - 5170: 0x6084, - 5171: 0x609B, - 5172: 0x6096, - 5173: 0x6097, - 5174: 0x6092, - 5175: 0x60A7, - 5176: 0x608B, - 5177: 0x60E1, - 5178: 0x60B8, - 5179: 0x60E0, - 5180: 0x60D3, - 5181: 0x60B4, - 5182: 0x5FF0, - 5183: 0x60BD, - 5184: 0x60C6, - 5185: 0x60B5, - 5186: 0x60D8, - 5187: 0x614D, - 5188: 0x6115, - 5189: 0x6106, - 5190: 0x60F6, - 5191: 0x60F7, - 5192: 0x6100, - 5193: 0x60F4, - 5194: 0x60FA, - 5195: 0x6103, - 5196: 0x6121, - 5197: 0x60FB, - 5198: 0x60F1, - 5199: 0x610D, - 5200: 0x610E, - 5201: 0x6147, - 5202: 0x613E, - 5203: 0x6128, - 5204: 0x6127, - 5205: 0x614A, - 5206: 0x613F, - 5207: 0x613C, - 5208: 0x612C, - 5209: 0x6134, - 5210: 0x613D, - 5211: 0x6142, - 5212: 0x6144, - 5213: 0x6173, - 5214: 0x6177, - 5215: 0x6158, - 5216: 0x6159, - 5217: 0x615A, - 5218: 0x616B, - 5219: 0x6174, - 5220: 0x616F, - 5221: 0x6165, - 5222: 0x6171, - 5223: 0x615F, - 5224: 0x615D, - 5225: 0x6153, - 5226: 0x6175, - 5227: 0x6199, - 5228: 0x6196, - 5229: 0x6187, - 5230: 0x61AC, - 5231: 0x6194, - 5232: 0x619A, - 5233: 0x618A, - 5234: 0x6191, - 5235: 0x61AB, - 5236: 0x61AE, - 5237: 0x61CC, - 5238: 0x61CA, - 5239: 0x61C9, - 5240: 0x61F7, - 5241: 0x61C8, - 5242: 0x61C3, - 5243: 0x61C6, - 5244: 0x61BA, - 5245: 0x61CB, - 5246: 0x7F79, - 5247: 0x61CD, - 5248: 0x61E6, - 5249: 0x61E3, - 5250: 0x61F6, - 5251: 0x61FA, - 5252: 0x61F4, - 5253: 0x61FF, - 5254: 0x61FD, - 5255: 0x61FC, - 5256: 0x61FE, - 5257: 0x6200, - 5258: 0x6208, - 5259: 0x6209, - 5260: 0x620D, - 5261: 0x620C, - 5262: 0x6214, - 5263: 0x621B, - 5264: 0x621E, - 5265: 0x6221, - 5266: 0x622A, - 5267: 0x622E, - 5268: 0x6230, - 5269: 0x6232, - 5270: 0x6233, - 5271: 0x6241, - 5272: 0x624E, - 5273: 0x625E, - 5274: 0x6263, - 5275: 0x625B, - 5276: 0x6260, - 5277: 0x6268, - 5278: 0x627C, - 5279: 0x6282, - 5280: 0x6289, - 5281: 0x627E, - 5282: 0x6292, - 5283: 0x6293, - 5284: 0x6296, - 5285: 0x62D4, - 5286: 0x6283, - 5287: 0x6294, - 5288: 0x62D7, - 5289: 0x62D1, - 5290: 0x62BB, - 5291: 0x62CF, - 5292: 0x62FF, - 5293: 0x62C6, - 5294: 0x64D4, - 5295: 0x62C8, - 5296: 0x62DC, - 5297: 0x62CC, - 5298: 0x62CA, - 5299: 0x62C2, - 5300: 0x62C7, - 5301: 0x629B, - 5302: 0x62C9, - 5303: 0x630C, - 5304: 0x62EE, - 5305: 0x62F1, - 5306: 0x6327, - 5307: 0x6302, - 5308: 0x6308, - 5309: 0x62EF, - 5310: 0x62F5, - 5311: 0x6350, - 5312: 0x633E, - 5313: 0x634D, - 5314: 0x641C, - 5315: 0x634F, - 5316: 0x6396, - 5317: 0x638E, - 5318: 0x6380, - 5319: 0x63AB, - 5320: 0x6376, - 5321: 0x63A3, - 5322: 0x638F, - 5323: 0x6389, - 5324: 0x639F, - 5325: 0x63B5, - 5326: 0x636B, - 5327: 0x6369, - 5328: 0x63BE, - 5329: 0x63E9, - 5330: 0x63C0, - 5331: 0x63C6, - 5332: 0x63E3, - 5333: 0x63C9, - 5334: 0x63D2, - 5335: 0x63F6, - 5336: 0x63C4, - 5337: 0x6416, - 5338: 0x6434, - 5339: 0x6406, - 5340: 0x6413, - 5341: 0x6426, - 5342: 0x6436, - 5343: 0x651D, - 5344: 0x6417, - 5345: 0x6428, - 5346: 0x640F, - 5347: 0x6467, - 5348: 0x646F, - 5349: 0x6476, - 5350: 0x644E, - 5351: 0x652A, - 5352: 0x6495, - 5353: 0x6493, - 5354: 0x64A5, - 5355: 0x64A9, - 5356: 0x6488, - 5357: 0x64BC, - 5358: 0x64DA, - 5359: 0x64D2, - 5360: 0x64C5, - 5361: 0x64C7, - 5362: 0x64BB, - 5363: 0x64D8, - 5364: 0x64C2, - 5365: 0x64F1, - 5366: 0x64E7, - 5367: 0x8209, - 5368: 0x64E0, - 5369: 0x64E1, - 5370: 0x62AC, - 5371: 0x64E3, - 5372: 0x64EF, - 5373: 0x652C, - 5374: 0x64F6, - 5375: 0x64F4, - 5376: 0x64F2, - 5377: 0x64FA, - 5378: 0x6500, - 5379: 0x64FD, - 5380: 0x6518, - 5381: 0x651C, - 5382: 0x6505, - 5383: 0x6524, - 5384: 0x6523, - 5385: 0x652B, - 5386: 0x6534, - 5387: 0x6535, - 5388: 0x6537, - 5389: 0x6536, - 5390: 0x6538, - 5391: 0x754B, - 5392: 0x6548, - 5393: 0x6556, - 5394: 0x6555, - 5395: 0x654D, - 5396: 0x6558, - 5397: 0x655E, - 5398: 0x655D, - 5399: 0x6572, - 5400: 0x6578, - 5401: 0x6582, - 5402: 0x6583, - 5403: 0x8B8A, - 5404: 0x659B, - 5405: 0x659F, - 5406: 0x65AB, - 5407: 0x65B7, - 5408: 0x65C3, - 5409: 0x65C6, - 5410: 0x65C1, - 5411: 0x65C4, - 5412: 0x65CC, - 5413: 0x65D2, - 5414: 0x65DB, - 5415: 0x65D9, - 5416: 0x65E0, - 5417: 0x65E1, - 5418: 0x65F1, - 5419: 0x6772, - 5420: 0x660A, - 5421: 0x6603, - 5422: 0x65FB, - 5423: 0x6773, - 5424: 0x6635, - 5425: 0x6636, - 5426: 0x6634, - 5427: 0x661C, - 5428: 0x664F, - 5429: 0x6644, - 5430: 0x6649, - 5431: 0x6641, - 5432: 0x665E, - 5433: 0x665D, - 5434: 0x6664, - 5435: 0x6667, - 5436: 0x6668, - 5437: 0x665F, - 5438: 0x6662, - 5439: 0x6670, - 5440: 0x6683, - 5441: 0x6688, - 5442: 0x668E, - 5443: 0x6689, - 5444: 0x6684, - 5445: 0x6698, - 5446: 0x669D, - 5447: 0x66C1, - 5448: 0x66B9, - 5449: 0x66C9, - 5450: 0x66BE, - 5451: 0x66BC, - 5452: 0x66C4, - 5453: 0x66B8, - 5454: 0x66D6, - 5455: 0x66DA, - 5456: 0x66E0, - 5457: 0x663F, - 5458: 0x66E6, - 5459: 0x66E9, - 5460: 0x66F0, - 5461: 0x66F5, - 5462: 0x66F7, - 5463: 0x670F, - 5464: 0x6716, - 5465: 0x671E, - 5466: 0x6726, - 5467: 0x6727, - 5468: 0x9738, - 5469: 0x672E, - 5470: 0x673F, - 5471: 0x6736, - 5472: 0x6741, - 5473: 0x6738, - 5474: 0x6737, - 5475: 0x6746, - 5476: 0x675E, - 5477: 0x6760, - 5478: 0x6759, - 5479: 0x6763, - 5480: 0x6764, - 5481: 0x6789, - 5482: 0x6770, - 5483: 0x67A9, - 5484: 0x677C, - 5485: 0x676A, - 5486: 0x678C, - 5487: 0x678B, - 5488: 0x67A6, - 5489: 0x67A1, - 5490: 0x6785, - 5491: 0x67B7, - 5492: 0x67EF, - 5493: 0x67B4, - 5494: 0x67EC, - 5495: 0x67B3, - 5496: 0x67E9, - 5497: 0x67B8, - 5498: 0x67E4, - 5499: 0x67DE, - 5500: 0x67DD, - 5501: 0x67E2, - 5502: 0x67EE, - 5503: 0x67B9, - 5504: 0x67CE, - 5505: 0x67C6, - 5506: 0x67E7, - 5507: 0x6A9C, - 5508: 0x681E, - 5509: 0x6846, - 5510: 0x6829, - 5511: 0x6840, - 5512: 0x684D, - 5513: 0x6832, - 5514: 0x684E, - 5515: 0x68B3, - 5516: 0x682B, - 5517: 0x6859, - 5518: 0x6863, - 5519: 0x6877, - 5520: 0x687F, - 5521: 0x689F, - 5522: 0x688F, - 5523: 0x68AD, - 5524: 0x6894, - 5525: 0x689D, - 5526: 0x689B, - 5527: 0x6883, - 5528: 0x6AAE, - 5529: 0x68B9, - 5530: 0x6874, - 5531: 0x68B5, - 5532: 0x68A0, - 5533: 0x68BA, - 5534: 0x690F, - 5535: 0x688D, - 5536: 0x687E, - 5537: 0x6901, - 5538: 0x68CA, - 5539: 0x6908, - 5540: 0x68D8, - 5541: 0x6922, - 5542: 0x6926, - 5543: 0x68E1, - 5544: 0x690C, - 5545: 0x68CD, - 5546: 0x68D4, - 5547: 0x68E7, - 5548: 0x68D5, - 5549: 0x6936, - 5550: 0x6912, - 5551: 0x6904, - 5552: 0x68D7, - 5553: 0x68E3, - 5554: 0x6925, - 5555: 0x68F9, - 5556: 0x68E0, - 5557: 0x68EF, - 5558: 0x6928, - 5559: 0x692A, - 5560: 0x691A, - 5561: 0x6923, - 5562: 0x6921, - 5563: 0x68C6, - 5564: 0x6979, - 5565: 0x6977, - 5566: 0x695C, - 5567: 0x6978, - 5568: 0x696B, - 5569: 0x6954, - 5570: 0x697E, - 5571: 0x696E, - 5572: 0x6939, - 5573: 0x6974, - 5574: 0x693D, - 5575: 0x6959, - 5576: 0x6930, - 5577: 0x6961, - 5578: 0x695E, - 5579: 0x695D, - 5580: 0x6981, - 5581: 0x696A, - 5582: 0x69B2, - 5583: 0x69AE, - 5584: 0x69D0, - 5585: 0x69BF, - 5586: 0x69C1, - 5587: 0x69D3, - 5588: 0x69BE, - 5589: 0x69CE, - 5590: 0x5BE8, - 5591: 0x69CA, - 5592: 0x69DD, - 5593: 0x69BB, - 5594: 0x69C3, - 5595: 0x69A7, - 5596: 0x6A2E, - 5597: 0x6991, - 5598: 0x69A0, - 5599: 0x699C, - 5600: 0x6995, - 5601: 0x69B4, - 5602: 0x69DE, - 5603: 0x69E8, - 5604: 0x6A02, - 5605: 0x6A1B, - 5606: 0x69FF, - 5607: 0x6B0A, - 5608: 0x69F9, - 5609: 0x69F2, - 5610: 0x69E7, - 5611: 0x6A05, - 5612: 0x69B1, - 5613: 0x6A1E, - 5614: 0x69ED, - 5615: 0x6A14, - 5616: 0x69EB, - 5617: 0x6A0A, - 5618: 0x6A12, - 5619: 0x6AC1, - 5620: 0x6A23, - 5621: 0x6A13, - 5622: 0x6A44, - 5623: 0x6A0C, - 5624: 0x6A72, - 5625: 0x6A36, - 5626: 0x6A78, - 5627: 0x6A47, - 5628: 0x6A62, - 5629: 0x6A59, - 5630: 0x6A66, - 5631: 0x6A48, - 5632: 0x6A38, - 5633: 0x6A22, - 5634: 0x6A90, - 5635: 0x6A8D, - 5636: 0x6AA0, - 5637: 0x6A84, - 5638: 0x6AA2, - 5639: 0x6AA3, - 5640: 0x6A97, - 5641: 0x8617, - 5642: 0x6ABB, - 5643: 0x6AC3, - 5644: 0x6AC2, - 5645: 0x6AB8, - 5646: 0x6AB3, - 5647: 0x6AAC, - 5648: 0x6ADE, - 5649: 0x6AD1, - 5650: 0x6ADF, - 5651: 0x6AAA, - 5652: 0x6ADA, - 5653: 0x6AEA, - 5654: 0x6AFB, - 5655: 0x6B05, - 5656: 0x8616, - 5657: 0x6AFA, - 5658: 0x6B12, - 5659: 0x6B16, - 5660: 0x9B31, - 5661: 0x6B1F, - 5662: 0x6B38, - 5663: 0x6B37, - 5664: 0x76DC, - 5665: 0x6B39, - 5666: 0x98EE, - 5667: 0x6B47, - 5668: 0x6B43, - 5669: 0x6B49, - 5670: 0x6B50, - 5671: 0x6B59, - 5672: 0x6B54, - 5673: 0x6B5B, - 5674: 0x6B5F, - 5675: 0x6B61, - 5676: 0x6B78, - 5677: 0x6B79, - 5678: 0x6B7F, - 5679: 0x6B80, - 5680: 0x6B84, - 5681: 0x6B83, - 5682: 0x6B8D, - 5683: 0x6B98, - 5684: 0x6B95, - 5685: 0x6B9E, - 5686: 0x6BA4, - 5687: 0x6BAA, - 5688: 0x6BAB, - 5689: 0x6BAF, - 5690: 0x6BB2, - 5691: 0x6BB1, - 5692: 0x6BB3, - 5693: 0x6BB7, - 5694: 0x6BBC, - 5695: 0x6BC6, - 5696: 0x6BCB, - 5697: 0x6BD3, - 5698: 0x6BDF, - 5699: 0x6BEC, - 5700: 0x6BEB, - 5701: 0x6BF3, - 5702: 0x6BEF, - 5703: 0x9EBE, - 5704: 0x6C08, - 5705: 0x6C13, - 5706: 0x6C14, - 5707: 0x6C1B, - 5708: 0x6C24, - 5709: 0x6C23, - 5710: 0x6C5E, - 5711: 0x6C55, - 5712: 0x6C62, - 5713: 0x6C6A, - 5714: 0x6C82, - 5715: 0x6C8D, - 5716: 0x6C9A, - 5717: 0x6C81, - 5718: 0x6C9B, - 5719: 0x6C7E, - 5720: 0x6C68, - 5721: 0x6C73, - 5722: 0x6C92, - 5723: 0x6C90, - 5724: 0x6CC4, - 5725: 0x6CF1, - 5726: 0x6CD3, - 5727: 0x6CBD, - 5728: 0x6CD7, - 5729: 0x6CC5, - 5730: 0x6CDD, - 5731: 0x6CAE, - 5732: 0x6CB1, - 5733: 0x6CBE, - 5734: 0x6CBA, - 5735: 0x6CDB, - 5736: 0x6CEF, - 5737: 0x6CD9, - 5738: 0x6CEA, - 5739: 0x6D1F, - 5740: 0x884D, - 5741: 0x6D36, - 5742: 0x6D2B, - 5743: 0x6D3D, - 5744: 0x6D38, - 5745: 0x6D19, - 5746: 0x6D35, - 5747: 0x6D33, - 5748: 0x6D12, - 5749: 0x6D0C, - 5750: 0x6D63, - 5751: 0x6D93, - 5752: 0x6D64, - 5753: 0x6D5A, - 5754: 0x6D79, - 5755: 0x6D59, - 5756: 0x6D8E, - 5757: 0x6D95, - 5758: 0x6FE4, - 5759: 0x6D85, - 5760: 0x6DF9, - 5761: 0x6E15, - 5762: 0x6E0A, - 5763: 0x6DB5, - 5764: 0x6DC7, - 5765: 0x6DE6, - 5766: 0x6DB8, - 5767: 0x6DC6, - 5768: 0x6DEC, - 5769: 0x6DDE, - 5770: 0x6DCC, - 5771: 0x6DE8, - 5772: 0x6DD2, - 5773: 0x6DC5, - 5774: 0x6DFA, - 5775: 0x6DD9, - 5776: 0x6DE4, - 5777: 0x6DD5, - 5778: 0x6DEA, - 5779: 0x6DEE, - 5780: 0x6E2D, - 5781: 0x6E6E, - 5782: 0x6E2E, - 5783: 0x6E19, - 5784: 0x6E72, - 5785: 0x6E5F, - 5786: 0x6E3E, - 5787: 0x6E23, - 5788: 0x6E6B, - 5789: 0x6E2B, - 5790: 0x6E76, - 5791: 0x6E4D, - 5792: 0x6E1F, - 5793: 0x6E43, - 5794: 0x6E3A, - 5795: 0x6E4E, - 5796: 0x6E24, - 5797: 0x6EFF, - 5798: 0x6E1D, - 5799: 0x6E38, - 5800: 0x6E82, - 5801: 0x6EAA, - 5802: 0x6E98, - 5803: 0x6EC9, - 5804: 0x6EB7, - 5805: 0x6ED3, - 5806: 0x6EBD, - 5807: 0x6EAF, - 5808: 0x6EC4, - 5809: 0x6EB2, - 5810: 0x6ED4, - 5811: 0x6ED5, - 5812: 0x6E8F, - 5813: 0x6EA5, - 5814: 0x6EC2, - 5815: 0x6E9F, - 5816: 0x6F41, - 5817: 0x6F11, - 5818: 0x704C, - 5819: 0x6EEC, - 5820: 0x6EF8, - 5821: 0x6EFE, - 5822: 0x6F3F, - 5823: 0x6EF2, - 5824: 0x6F31, - 5825: 0x6EEF, - 5826: 0x6F32, - 5827: 0x6ECC, - 5828: 0x6F3E, - 5829: 0x6F13, - 5830: 0x6EF7, - 5831: 0x6F86, - 5832: 0x6F7A, - 5833: 0x6F78, - 5834: 0x6F81, - 5835: 0x6F80, - 5836: 0x6F6F, - 5837: 0x6F5B, - 5838: 0x6FF3, - 5839: 0x6F6D, - 5840: 0x6F82, - 5841: 0x6F7C, - 5842: 0x6F58, - 5843: 0x6F8E, - 5844: 0x6F91, - 5845: 0x6FC2, - 5846: 0x6F66, - 5847: 0x6FB3, - 5848: 0x6FA3, - 5849: 0x6FA1, - 5850: 0x6FA4, - 5851: 0x6FB9, - 5852: 0x6FC6, - 5853: 0x6FAA, - 5854: 0x6FDF, - 5855: 0x6FD5, - 5856: 0x6FEC, - 5857: 0x6FD4, - 5858: 0x6FD8, - 5859: 0x6FF1, - 5860: 0x6FEE, - 5861: 0x6FDB, - 5862: 0x7009, - 5863: 0x700B, - 5864: 0x6FFA, - 5865: 0x7011, - 5866: 0x7001, - 5867: 0x700F, - 5868: 0x6FFE, - 5869: 0x701B, - 5870: 0x701A, - 5871: 0x6F74, - 5872: 0x701D, - 5873: 0x7018, - 5874: 0x701F, - 5875: 0x7030, - 5876: 0x703E, - 5877: 0x7032, - 5878: 0x7051, - 5879: 0x7063, - 5880: 0x7099, - 5881: 0x7092, - 5882: 0x70AF, - 5883: 0x70F1, - 5884: 0x70AC, - 5885: 0x70B8, - 5886: 0x70B3, - 5887: 0x70AE, - 5888: 0x70DF, - 5889: 0x70CB, - 5890: 0x70DD, - 5891: 0x70D9, - 5892: 0x7109, - 5893: 0x70FD, - 5894: 0x711C, - 5895: 0x7119, - 5896: 0x7165, - 5897: 0x7155, - 5898: 0x7188, - 5899: 0x7166, - 5900: 0x7162, - 5901: 0x714C, - 5902: 0x7156, - 5903: 0x716C, - 5904: 0x718F, - 5905: 0x71FB, - 5906: 0x7184, - 5907: 0x7195, - 5908: 0x71A8, - 5909: 0x71AC, - 5910: 0x71D7, - 5911: 0x71B9, - 5912: 0x71BE, - 5913: 0x71D2, - 5914: 0x71C9, - 5915: 0x71D4, - 5916: 0x71CE, - 5917: 0x71E0, - 5918: 0x71EC, - 5919: 0x71E7, - 5920: 0x71F5, - 5921: 0x71FC, - 5922: 0x71F9, - 5923: 0x71FF, - 5924: 0x720D, - 5925: 0x7210, - 5926: 0x721B, - 5927: 0x7228, - 5928: 0x722D, - 5929: 0x722C, - 5930: 0x7230, - 5931: 0x7232, - 5932: 0x723B, - 5933: 0x723C, - 5934: 0x723F, - 5935: 0x7240, - 5936: 0x7246, - 5937: 0x724B, - 5938: 0x7258, - 5939: 0x7274, - 5940: 0x727E, - 5941: 0x7282, - 5942: 0x7281, - 5943: 0x7287, - 5944: 0x7292, - 5945: 0x7296, - 5946: 0x72A2, - 5947: 0x72A7, - 5948: 0x72B9, - 5949: 0x72B2, - 5950: 0x72C3, - 5951: 0x72C6, - 5952: 0x72C4, - 5953: 0x72CE, - 5954: 0x72D2, - 5955: 0x72E2, - 5956: 0x72E0, - 5957: 0x72E1, - 5958: 0x72F9, - 5959: 0x72F7, - 5960: 0x500F, - 5961: 0x7317, - 5962: 0x730A, - 5963: 0x731C, - 5964: 0x7316, - 5965: 0x731D, - 5966: 0x7334, - 5967: 0x732F, - 5968: 0x7329, - 5969: 0x7325, - 5970: 0x733E, - 5971: 0x734E, - 5972: 0x734F, - 5973: 0x9ED8, - 5974: 0x7357, - 5975: 0x736A, - 5976: 0x7368, - 5977: 0x7370, - 5978: 0x7378, - 5979: 0x7375, - 5980: 0x737B, - 5981: 0x737A, - 5982: 0x73C8, - 5983: 0x73B3, - 5984: 0x73CE, - 5985: 0x73BB, - 5986: 0x73C0, - 5987: 0x73E5, - 5988: 0x73EE, - 5989: 0x73DE, - 5990: 0x74A2, - 5991: 0x7405, - 5992: 0x746F, - 5993: 0x7425, - 5994: 0x73F8, - 5995: 0x7432, - 5996: 0x743A, - 5997: 0x7455, - 5998: 0x743F, - 5999: 0x745F, - 6000: 0x7459, - 6001: 0x7441, - 6002: 0x745C, - 6003: 0x7469, - 6004: 0x7470, - 6005: 0x7463, - 6006: 0x746A, - 6007: 0x7476, - 6008: 0x747E, - 6009: 0x748B, - 6010: 0x749E, - 6011: 0x74A7, - 6012: 0x74CA, - 6013: 0x74CF, - 6014: 0x74D4, - 6015: 0x73F1, - 6016: 0x74E0, - 6017: 0x74E3, - 6018: 0x74E7, - 6019: 0x74E9, - 6020: 0x74EE, - 6021: 0x74F2, - 6022: 0x74F0, - 6023: 0x74F1, - 6024: 0x74F8, - 6025: 0x74F7, - 6026: 0x7504, - 6027: 0x7503, - 6028: 0x7505, - 6029: 0x750C, - 6030: 0x750E, - 6031: 0x750D, - 6032: 0x7515, - 6033: 0x7513, - 6034: 0x751E, - 6035: 0x7526, - 6036: 0x752C, - 6037: 0x753C, - 6038: 0x7544, - 6039: 0x754D, - 6040: 0x754A, - 6041: 0x7549, - 6042: 0x755B, - 6043: 0x7546, - 6044: 0x755A, - 6045: 0x7569, - 6046: 0x7564, - 6047: 0x7567, - 6048: 0x756B, - 6049: 0x756D, - 6050: 0x7578, - 6051: 0x7576, - 6052: 0x7586, - 6053: 0x7587, - 6054: 0x7574, - 6055: 0x758A, - 6056: 0x7589, - 6057: 0x7582, - 6058: 0x7594, - 6059: 0x759A, - 6060: 0x759D, - 6061: 0x75A5, - 6062: 0x75A3, - 6063: 0x75C2, - 6064: 0x75B3, - 6065: 0x75C3, - 6066: 0x75B5, - 6067: 0x75BD, - 6068: 0x75B8, - 6069: 0x75BC, - 6070: 0x75B1, - 6071: 0x75CD, - 6072: 0x75CA, - 6073: 0x75D2, - 6074: 0x75D9, - 6075: 0x75E3, - 6076: 0x75DE, - 6077: 0x75FE, - 6078: 0x75FF, - 6079: 0x75FC, - 6080: 0x7601, - 6081: 0x75F0, - 6082: 0x75FA, - 6083: 0x75F2, - 6084: 0x75F3, - 6085: 0x760B, - 6086: 0x760D, - 6087: 0x7609, - 6088: 0x761F, - 6089: 0x7627, - 6090: 0x7620, - 6091: 0x7621, - 6092: 0x7622, - 6093: 0x7624, - 6094: 0x7634, - 6095: 0x7630, - 6096: 0x763B, - 6097: 0x7647, - 6098: 0x7648, - 6099: 0x7646, - 6100: 0x765C, - 6101: 0x7658, - 6102: 0x7661, - 6103: 0x7662, - 6104: 0x7668, - 6105: 0x7669, - 6106: 0x766A, - 6107: 0x7667, - 6108: 0x766C, - 6109: 0x7670, - 6110: 0x7672, - 6111: 0x7676, - 6112: 0x7678, - 6113: 0x767C, - 6114: 0x7680, - 6115: 0x7683, - 6116: 0x7688, - 6117: 0x768B, - 6118: 0x768E, - 6119: 0x7696, - 6120: 0x7693, - 6121: 0x7699, - 6122: 0x769A, - 6123: 0x76B0, - 6124: 0x76B4, - 6125: 0x76B8, - 6126: 0x76B9, - 6127: 0x76BA, - 6128: 0x76C2, - 6129: 0x76CD, - 6130: 0x76D6, - 6131: 0x76D2, - 6132: 0x76DE, - 6133: 0x76E1, - 6134: 0x76E5, - 6135: 0x76E7, - 6136: 0x76EA, - 6137: 0x862F, - 6138: 0x76FB, - 6139: 0x7708, - 6140: 0x7707, - 6141: 0x7704, - 6142: 0x7729, - 6143: 0x7724, - 6144: 0x771E, - 6145: 0x7725, - 6146: 0x7726, - 6147: 0x771B, - 6148: 0x7737, - 6149: 0x7738, - 6150: 0x7747, - 6151: 0x775A, - 6152: 0x7768, - 6153: 0x776B, - 6154: 0x775B, - 6155: 0x7765, - 6156: 0x777F, - 6157: 0x777E, - 6158: 0x7779, - 6159: 0x778E, - 6160: 0x778B, - 6161: 0x7791, - 6162: 0x77A0, - 6163: 0x779E, - 6164: 0x77B0, - 6165: 0x77B6, - 6166: 0x77B9, - 6167: 0x77BF, - 6168: 0x77BC, - 6169: 0x77BD, - 6170: 0x77BB, - 6171: 0x77C7, - 6172: 0x77CD, - 6173: 0x77D7, - 6174: 0x77DA, - 6175: 0x77DC, - 6176: 0x77E3, - 6177: 0x77EE, - 6178: 0x77FC, - 6179: 0x780C, - 6180: 0x7812, - 6181: 0x7926, - 6182: 0x7820, - 6183: 0x792A, - 6184: 0x7845, - 6185: 0x788E, - 6186: 0x7874, - 6187: 0x7886, - 6188: 0x787C, - 6189: 0x789A, - 6190: 0x788C, - 6191: 0x78A3, - 6192: 0x78B5, - 6193: 0x78AA, - 6194: 0x78AF, - 6195: 0x78D1, - 6196: 0x78C6, - 6197: 0x78CB, - 6198: 0x78D4, - 6199: 0x78BE, - 6200: 0x78BC, - 6201: 0x78C5, - 6202: 0x78CA, - 6203: 0x78EC, - 6204: 0x78E7, - 6205: 0x78DA, - 6206: 0x78FD, - 6207: 0x78F4, - 6208: 0x7907, - 6209: 0x7912, - 6210: 0x7911, - 6211: 0x7919, - 6212: 0x792C, - 6213: 0x792B, - 6214: 0x7940, - 6215: 0x7960, - 6216: 0x7957, - 6217: 0x795F, - 6218: 0x795A, - 6219: 0x7955, - 6220: 0x7953, - 6221: 0x797A, - 6222: 0x797F, - 6223: 0x798A, - 6224: 0x799D, - 6225: 0x79A7, - 6226: 0x9F4B, - 6227: 0x79AA, - 6228: 0x79AE, - 6229: 0x79B3, - 6230: 0x79B9, - 6231: 0x79BA, - 6232: 0x79C9, - 6233: 0x79D5, - 6234: 0x79E7, - 6235: 0x79EC, - 6236: 0x79E1, - 6237: 0x79E3, - 6238: 0x7A08, - 6239: 0x7A0D, - 6240: 0x7A18, - 6241: 0x7A19, - 6242: 0x7A20, - 6243: 0x7A1F, - 6244: 0x7980, - 6245: 0x7A31, - 6246: 0x7A3B, - 6247: 0x7A3E, - 6248: 0x7A37, - 6249: 0x7A43, - 6250: 0x7A57, - 6251: 0x7A49, - 6252: 0x7A61, - 6253: 0x7A62, - 6254: 0x7A69, - 6255: 0x9F9D, - 6256: 0x7A70, - 6257: 0x7A79, - 6258: 0x7A7D, - 6259: 0x7A88, - 6260: 0x7A97, - 6261: 0x7A95, - 6262: 0x7A98, - 6263: 0x7A96, - 6264: 0x7AA9, - 6265: 0x7AC8, - 6266: 0x7AB0, - 6267: 0x7AB6, - 6268: 0x7AC5, - 6269: 0x7AC4, - 6270: 0x7ABF, - 6271: 0x9083, - 6272: 0x7AC7, - 6273: 0x7ACA, - 6274: 0x7ACD, - 6275: 0x7ACF, - 6276: 0x7AD5, - 6277: 0x7AD3, - 6278: 0x7AD9, - 6279: 0x7ADA, - 6280: 0x7ADD, - 6281: 0x7AE1, - 6282: 0x7AE2, - 6283: 0x7AE6, - 6284: 0x7AED, - 6285: 0x7AF0, - 6286: 0x7B02, - 6287: 0x7B0F, - 6288: 0x7B0A, - 6289: 0x7B06, - 6290: 0x7B33, - 6291: 0x7B18, - 6292: 0x7B19, - 6293: 0x7B1E, - 6294: 0x7B35, - 6295: 0x7B28, - 6296: 0x7B36, - 6297: 0x7B50, - 6298: 0x7B7A, - 6299: 0x7B04, - 6300: 0x7B4D, - 6301: 0x7B0B, - 6302: 0x7B4C, - 6303: 0x7B45, - 6304: 0x7B75, - 6305: 0x7B65, - 6306: 0x7B74, - 6307: 0x7B67, - 6308: 0x7B70, - 6309: 0x7B71, - 6310: 0x7B6C, - 6311: 0x7B6E, - 6312: 0x7B9D, - 6313: 0x7B98, - 6314: 0x7B9F, - 6315: 0x7B8D, - 6316: 0x7B9C, - 6317: 0x7B9A, - 6318: 0x7B8B, - 6319: 0x7B92, - 6320: 0x7B8F, - 6321: 0x7B5D, - 6322: 0x7B99, - 6323: 0x7BCB, - 6324: 0x7BC1, - 6325: 0x7BCC, - 6326: 0x7BCF, - 6327: 0x7BB4, - 6328: 0x7BC6, - 6329: 0x7BDD, - 6330: 0x7BE9, - 6331: 0x7C11, - 6332: 0x7C14, - 6333: 0x7BE6, - 6334: 0x7BE5, - 6335: 0x7C60, - 6336: 0x7C00, - 6337: 0x7C07, - 6338: 0x7C13, - 6339: 0x7BF3, - 6340: 0x7BF7, - 6341: 0x7C17, - 6342: 0x7C0D, - 6343: 0x7BF6, - 6344: 0x7C23, - 6345: 0x7C27, - 6346: 0x7C2A, - 6347: 0x7C1F, - 6348: 0x7C37, - 6349: 0x7C2B, - 6350: 0x7C3D, - 6351: 0x7C4C, - 6352: 0x7C43, - 6353: 0x7C54, - 6354: 0x7C4F, - 6355: 0x7C40, - 6356: 0x7C50, - 6357: 0x7C58, - 6358: 0x7C5F, - 6359: 0x7C64, - 6360: 0x7C56, - 6361: 0x7C65, - 6362: 0x7C6C, - 6363: 0x7C75, - 6364: 0x7C83, - 6365: 0x7C90, - 6366: 0x7CA4, - 6367: 0x7CAD, - 6368: 0x7CA2, - 6369: 0x7CAB, - 6370: 0x7CA1, - 6371: 0x7CA8, - 6372: 0x7CB3, - 6373: 0x7CB2, - 6374: 0x7CB1, - 6375: 0x7CAE, - 6376: 0x7CB9, - 6377: 0x7CBD, - 6378: 0x7CC0, - 6379: 0x7CC5, - 6380: 0x7CC2, - 6381: 0x7CD8, - 6382: 0x7CD2, - 6383: 0x7CDC, - 6384: 0x7CE2, - 6385: 0x9B3B, - 6386: 0x7CEF, - 6387: 0x7CF2, - 6388: 0x7CF4, - 6389: 0x7CF6, - 6390: 0x7CFA, - 6391: 0x7D06, - 6392: 0x7D02, - 6393: 0x7D1C, - 6394: 0x7D15, - 6395: 0x7D0A, - 6396: 0x7D45, - 6397: 0x7D4B, - 6398: 0x7D2E, - 6399: 0x7D32, - 6400: 0x7D3F, - 6401: 0x7D35, - 6402: 0x7D46, - 6403: 0x7D73, - 6404: 0x7D56, - 6405: 0x7D4E, - 6406: 0x7D72, - 6407: 0x7D68, - 6408: 0x7D6E, - 6409: 0x7D4F, - 6410: 0x7D63, - 6411: 0x7D93, - 6412: 0x7D89, - 6413: 0x7D5B, - 6414: 0x7D8F, - 6415: 0x7D7D, - 6416: 0x7D9B, - 6417: 0x7DBA, - 6418: 0x7DAE, - 6419: 0x7DA3, - 6420: 0x7DB5, - 6421: 0x7DC7, - 6422: 0x7DBD, - 6423: 0x7DAB, - 6424: 0x7E3D, - 6425: 0x7DA2, - 6426: 0x7DAF, - 6427: 0x7DDC, - 6428: 0x7DB8, - 6429: 0x7D9F, - 6430: 0x7DB0, - 6431: 0x7DD8, - 6432: 0x7DDD, - 6433: 0x7DE4, - 6434: 0x7DDE, - 6435: 0x7DFB, - 6436: 0x7DF2, - 6437: 0x7DE1, - 6438: 0x7E05, - 6439: 0x7E0A, - 6440: 0x7E23, - 6441: 0x7E21, - 6442: 0x7E12, - 6443: 0x7E31, - 6444: 0x7E1F, - 6445: 0x7E09, - 6446: 0x7E0B, - 6447: 0x7E22, - 6448: 0x7E46, - 6449: 0x7E66, - 6450: 0x7E3B, - 6451: 0x7E35, - 6452: 0x7E39, - 6453: 0x7E43, - 6454: 0x7E37, - 6455: 0x7E32, - 6456: 0x7E3A, - 6457: 0x7E67, - 6458: 0x7E5D, - 6459: 0x7E56, - 6460: 0x7E5E, - 6461: 0x7E59, - 6462: 0x7E5A, - 6463: 0x7E79, - 6464: 0x7E6A, - 6465: 0x7E69, - 6466: 0x7E7C, - 6467: 0x7E7B, - 6468: 0x7E83, - 6469: 0x7DD5, - 6470: 0x7E7D, - 6471: 0x8FAE, - 6472: 0x7E7F, - 6473: 0x7E88, - 6474: 0x7E89, - 6475: 0x7E8C, - 6476: 0x7E92, - 6477: 0x7E90, - 6478: 0x7E93, - 6479: 0x7E94, - 6480: 0x7E96, - 6481: 0x7E8E, - 6482: 0x7E9B, - 6483: 0x7E9C, - 6484: 0x7F38, - 6485: 0x7F3A, - 6486: 0x7F45, - 6487: 0x7F4C, - 6488: 0x7F4D, - 6489: 0x7F4E, - 6490: 0x7F50, - 6491: 0x7F51, - 6492: 0x7F55, - 6493: 0x7F54, - 6494: 0x7F58, - 6495: 0x7F5F, - 6496: 0x7F60, - 6497: 0x7F68, - 6498: 0x7F69, - 6499: 0x7F67, - 6500: 0x7F78, - 6501: 0x7F82, - 6502: 0x7F86, - 6503: 0x7F83, - 6504: 0x7F88, - 6505: 0x7F87, - 6506: 0x7F8C, - 6507: 0x7F94, - 6508: 0x7F9E, - 6509: 0x7F9D, - 6510: 0x7F9A, - 6511: 0x7FA3, - 6512: 0x7FAF, - 6513: 0x7FB2, - 6514: 0x7FB9, - 6515: 0x7FAE, - 6516: 0x7FB6, - 6517: 0x7FB8, - 6518: 0x8B71, - 6519: 0x7FC5, - 6520: 0x7FC6, - 6521: 0x7FCA, - 6522: 0x7FD5, - 6523: 0x7FD4, - 6524: 0x7FE1, - 6525: 0x7FE6, - 6526: 0x7FE9, - 6527: 0x7FF3, - 6528: 0x7FF9, - 6529: 0x98DC, - 6530: 0x8006, - 6531: 0x8004, - 6532: 0x800B, - 6533: 0x8012, - 6534: 0x8018, - 6535: 0x8019, - 6536: 0x801C, - 6537: 0x8021, - 6538: 0x8028, - 6539: 0x803F, - 6540: 0x803B, - 6541: 0x804A, - 6542: 0x8046, - 6543: 0x8052, - 6544: 0x8058, - 6545: 0x805A, - 6546: 0x805F, - 6547: 0x8062, - 6548: 0x8068, - 6549: 0x8073, - 6550: 0x8072, - 6551: 0x8070, - 6552: 0x8076, - 6553: 0x8079, - 6554: 0x807D, - 6555: 0x807F, - 6556: 0x8084, - 6557: 0x8086, - 6558: 0x8085, - 6559: 0x809B, - 6560: 0x8093, - 6561: 0x809A, - 6562: 0x80AD, - 6563: 0x5190, - 6564: 0x80AC, - 6565: 0x80DB, - 6566: 0x80E5, - 6567: 0x80D9, - 6568: 0x80DD, - 6569: 0x80C4, - 6570: 0x80DA, - 6571: 0x80D6, - 6572: 0x8109, - 6573: 0x80EF, - 6574: 0x80F1, - 6575: 0x811B, - 6576: 0x8129, - 6577: 0x8123, - 6578: 0x812F, - 6579: 0x814B, - 6580: 0x968B, - 6581: 0x8146, - 6582: 0x813E, - 6583: 0x8153, - 6584: 0x8151, - 6585: 0x80FC, - 6586: 0x8171, - 6587: 0x816E, - 6588: 0x8165, - 6589: 0x8166, - 6590: 0x8174, - 6591: 0x8183, - 6592: 0x8188, - 6593: 0x818A, - 6594: 0x8180, - 6595: 0x8182, - 6596: 0x81A0, - 6597: 0x8195, - 6598: 0x81A4, - 6599: 0x81A3, - 6600: 0x815F, - 6601: 0x8193, - 6602: 0x81A9, - 6603: 0x81B0, - 6604: 0x81B5, - 6605: 0x81BE, - 6606: 0x81B8, - 6607: 0x81BD, - 6608: 0x81C0, - 6609: 0x81C2, - 6610: 0x81BA, - 6611: 0x81C9, - 6612: 0x81CD, - 6613: 0x81D1, - 6614: 0x81D9, - 6615: 0x81D8, - 6616: 0x81C8, - 6617: 0x81DA, - 6618: 0x81DF, - 6619: 0x81E0, - 6620: 0x81E7, - 6621: 0x81FA, - 6622: 0x81FB, - 6623: 0x81FE, - 6624: 0x8201, - 6625: 0x8202, - 6626: 0x8205, - 6627: 0x8207, - 6628: 0x820A, - 6629: 0x820D, - 6630: 0x8210, - 6631: 0x8216, - 6632: 0x8229, - 6633: 0x822B, - 6634: 0x8238, - 6635: 0x8233, - 6636: 0x8240, - 6637: 0x8259, - 6638: 0x8258, - 6639: 0x825D, - 6640: 0x825A, - 6641: 0x825F, - 6642: 0x8264, - 6643: 0x8262, - 6644: 0x8268, - 6645: 0x826A, - 6646: 0x826B, - 6647: 0x822E, - 6648: 0x8271, - 6649: 0x8277, - 6650: 0x8278, - 6651: 0x827E, - 6652: 0x828D, - 6653: 0x8292, - 6654: 0x82AB, - 6655: 0x829F, - 6656: 0x82BB, - 6657: 0x82AC, - 6658: 0x82E1, - 6659: 0x82E3, - 6660: 0x82DF, - 6661: 0x82D2, - 6662: 0x82F4, - 6663: 0x82F3, - 6664: 0x82FA, - 6665: 0x8393, - 6666: 0x8303, - 6667: 0x82FB, - 6668: 0x82F9, - 6669: 0x82DE, - 6670: 0x8306, - 6671: 0x82DC, - 6672: 0x8309, - 6673: 0x82D9, - 6674: 0x8335, - 6675: 0x8334, - 6676: 0x8316, - 6677: 0x8332, - 6678: 0x8331, - 6679: 0x8340, - 6680: 0x8339, - 6681: 0x8350, - 6682: 0x8345, - 6683: 0x832F, - 6684: 0x832B, - 6685: 0x8317, - 6686: 0x8318, - 6687: 0x8385, - 6688: 0x839A, - 6689: 0x83AA, - 6690: 0x839F, - 6691: 0x83A2, - 6692: 0x8396, - 6693: 0x8323, - 6694: 0x838E, - 6695: 0x8387, - 6696: 0x838A, - 6697: 0x837C, - 6698: 0x83B5, - 6699: 0x8373, - 6700: 0x8375, - 6701: 0x83A0, - 6702: 0x8389, - 6703: 0x83A8, - 6704: 0x83F4, - 6705: 0x8413, - 6706: 0x83EB, - 6707: 0x83CE, - 6708: 0x83FD, - 6709: 0x8403, - 6710: 0x83D8, - 6711: 0x840B, - 6712: 0x83C1, - 6713: 0x83F7, - 6714: 0x8407, - 6715: 0x83E0, - 6716: 0x83F2, - 6717: 0x840D, - 6718: 0x8422, - 6719: 0x8420, - 6720: 0x83BD, - 6721: 0x8438, - 6722: 0x8506, - 6723: 0x83FB, - 6724: 0x846D, - 6725: 0x842A, - 6726: 0x843C, - 6727: 0x855A, - 6728: 0x8484, - 6729: 0x8477, - 6730: 0x846B, - 6731: 0x84AD, - 6732: 0x846E, - 6733: 0x8482, - 6734: 0x8469, - 6735: 0x8446, - 6736: 0x842C, - 6737: 0x846F, - 6738: 0x8479, - 6739: 0x8435, - 6740: 0x84CA, - 6741: 0x8462, - 6742: 0x84B9, - 6743: 0x84BF, - 6744: 0x849F, - 6745: 0x84D9, - 6746: 0x84CD, - 6747: 0x84BB, - 6748: 0x84DA, - 6749: 0x84D0, - 6750: 0x84C1, - 6751: 0x84C6, - 6752: 0x84D6, - 6753: 0x84A1, - 6754: 0x8521, - 6755: 0x84FF, - 6756: 0x84F4, - 6757: 0x8517, - 6758: 0x8518, - 6759: 0x852C, - 6760: 0x851F, - 6761: 0x8515, - 6762: 0x8514, - 6763: 0x84FC, - 6764: 0x8540, - 6765: 0x8563, - 6766: 0x8558, - 6767: 0x8548, - 6768: 0x8541, - 6769: 0x8602, - 6770: 0x854B, - 6771: 0x8555, - 6772: 0x8580, - 6773: 0x85A4, - 6774: 0x8588, - 6775: 0x8591, - 6776: 0x858A, - 6777: 0x85A8, - 6778: 0x856D, - 6779: 0x8594, - 6780: 0x859B, - 6781: 0x85EA, - 6782: 0x8587, - 6783: 0x859C, - 6784: 0x8577, - 6785: 0x857E, - 6786: 0x8590, - 6787: 0x85C9, - 6788: 0x85BA, - 6789: 0x85CF, - 6790: 0x85B9, - 6791: 0x85D0, - 6792: 0x85D5, - 6793: 0x85DD, - 6794: 0x85E5, - 6795: 0x85DC, - 6796: 0x85F9, - 6797: 0x860A, - 6798: 0x8613, - 6799: 0x860B, - 6800: 0x85FE, - 6801: 0x85FA, - 6802: 0x8606, - 6803: 0x8622, - 6804: 0x861A, - 6805: 0x8630, - 6806: 0x863F, - 6807: 0x864D, - 6808: 0x4E55, - 6809: 0x8654, - 6810: 0x865F, - 6811: 0x8667, - 6812: 0x8671, - 6813: 0x8693, - 6814: 0x86A3, - 6815: 0x86A9, - 6816: 0x86AA, - 6817: 0x868B, - 6818: 0x868C, - 6819: 0x86B6, - 6820: 0x86AF, - 6821: 0x86C4, - 6822: 0x86C6, - 6823: 0x86B0, - 6824: 0x86C9, - 6825: 0x8823, - 6826: 0x86AB, - 6827: 0x86D4, - 6828: 0x86DE, - 6829: 0x86E9, - 6830: 0x86EC, - 6831: 0x86DF, - 6832: 0x86DB, - 6833: 0x86EF, - 6834: 0x8712, - 6835: 0x8706, - 6836: 0x8708, - 6837: 0x8700, - 6838: 0x8703, - 6839: 0x86FB, - 6840: 0x8711, - 6841: 0x8709, - 6842: 0x870D, - 6843: 0x86F9, - 6844: 0x870A, - 6845: 0x8734, - 6846: 0x873F, - 6847: 0x8737, - 6848: 0x873B, - 6849: 0x8725, - 6850: 0x8729, - 6851: 0x871A, - 6852: 0x8760, - 6853: 0x875F, - 6854: 0x8778, - 6855: 0x874C, - 6856: 0x874E, - 6857: 0x8774, - 6858: 0x8757, - 6859: 0x8768, - 6860: 0x876E, - 6861: 0x8759, - 6862: 0x8753, - 6863: 0x8763, - 6864: 0x876A, - 6865: 0x8805, - 6866: 0x87A2, - 6867: 0x879F, - 6868: 0x8782, - 6869: 0x87AF, - 6870: 0x87CB, - 6871: 0x87BD, - 6872: 0x87C0, - 6873: 0x87D0, - 6874: 0x96D6, - 6875: 0x87AB, - 6876: 0x87C4, - 6877: 0x87B3, - 6878: 0x87C7, - 6879: 0x87C6, - 6880: 0x87BB, - 6881: 0x87EF, - 6882: 0x87F2, - 6883: 0x87E0, - 6884: 0x880F, - 6885: 0x880D, - 6886: 0x87FE, - 6887: 0x87F6, - 6888: 0x87F7, - 6889: 0x880E, - 6890: 0x87D2, - 6891: 0x8811, - 6892: 0x8816, - 6893: 0x8815, - 6894: 0x8822, - 6895: 0x8821, - 6896: 0x8831, - 6897: 0x8836, - 6898: 0x8839, - 6899: 0x8827, - 6900: 0x883B, - 6901: 0x8844, - 6902: 0x8842, - 6903: 0x8852, - 6904: 0x8859, - 6905: 0x885E, - 6906: 0x8862, - 6907: 0x886B, - 6908: 0x8881, - 6909: 0x887E, - 6910: 0x889E, - 6911: 0x8875, - 6912: 0x887D, - 6913: 0x88B5, - 6914: 0x8872, - 6915: 0x8882, - 6916: 0x8897, - 6917: 0x8892, - 6918: 0x88AE, - 6919: 0x8899, - 6920: 0x88A2, - 6921: 0x888D, - 6922: 0x88A4, - 6923: 0x88B0, - 6924: 0x88BF, - 6925: 0x88B1, - 6926: 0x88C3, - 6927: 0x88C4, - 6928: 0x88D4, - 6929: 0x88D8, - 6930: 0x88D9, - 6931: 0x88DD, - 6932: 0x88F9, - 6933: 0x8902, - 6934: 0x88FC, - 6935: 0x88F4, - 6936: 0x88E8, - 6937: 0x88F2, - 6938: 0x8904, - 6939: 0x890C, - 6940: 0x890A, - 6941: 0x8913, - 6942: 0x8943, - 6943: 0x891E, - 6944: 0x8925, - 6945: 0x892A, - 6946: 0x892B, - 6947: 0x8941, - 6948: 0x8944, - 6949: 0x893B, - 6950: 0x8936, - 6951: 0x8938, - 6952: 0x894C, - 6953: 0x891D, - 6954: 0x8960, - 6955: 0x895E, - 6956: 0x8966, - 6957: 0x8964, - 6958: 0x896D, - 6959: 0x896A, - 6960: 0x896F, - 6961: 0x8974, - 6962: 0x8977, - 6963: 0x897E, - 6964: 0x8983, - 6965: 0x8988, - 6966: 0x898A, - 6967: 0x8993, - 6968: 0x8998, - 6969: 0x89A1, - 6970: 0x89A9, - 6971: 0x89A6, - 6972: 0x89AC, - 6973: 0x89AF, - 6974: 0x89B2, - 6975: 0x89BA, - 6976: 0x89BD, - 6977: 0x89BF, - 6978: 0x89C0, - 6979: 0x89DA, - 6980: 0x89DC, - 6981: 0x89DD, - 6982: 0x89E7, - 6983: 0x89F4, - 6984: 0x89F8, - 6985: 0x8A03, - 6986: 0x8A16, - 6987: 0x8A10, - 6988: 0x8A0C, - 6989: 0x8A1B, - 6990: 0x8A1D, - 6991: 0x8A25, - 6992: 0x8A36, - 6993: 0x8A41, - 6994: 0x8A5B, - 6995: 0x8A52, - 6996: 0x8A46, - 6997: 0x8A48, - 6998: 0x8A7C, - 6999: 0x8A6D, - 7000: 0x8A6C, - 7001: 0x8A62, - 7002: 0x8A85, - 7003: 0x8A82, - 7004: 0x8A84, - 7005: 0x8AA8, - 7006: 0x8AA1, - 7007: 0x8A91, - 7008: 0x8AA5, - 7009: 0x8AA6, - 7010: 0x8A9A, - 7011: 0x8AA3, - 7012: 0x8AC4, - 7013: 0x8ACD, - 7014: 0x8AC2, - 7015: 0x8ADA, - 7016: 0x8AEB, - 7017: 0x8AF3, - 7018: 0x8AE7, - 7019: 0x8AE4, - 7020: 0x8AF1, - 7021: 0x8B14, - 7022: 0x8AE0, - 7023: 0x8AE2, - 7024: 0x8AF7, - 7025: 0x8ADE, - 7026: 0x8ADB, - 7027: 0x8B0C, - 7028: 0x8B07, - 7029: 0x8B1A, - 7030: 0x8AE1, - 7031: 0x8B16, - 7032: 0x8B10, - 7033: 0x8B17, - 7034: 0x8B20, - 7035: 0x8B33, - 7036: 0x97AB, - 7037: 0x8B26, - 7038: 0x8B2B, - 7039: 0x8B3E, - 7040: 0x8B28, - 7041: 0x8B41, - 7042: 0x8B4C, - 7043: 0x8B4F, - 7044: 0x8B4E, - 7045: 0x8B49, - 7046: 0x8B56, - 7047: 0x8B5B, - 7048: 0x8B5A, - 7049: 0x8B6B, - 7050: 0x8B5F, - 7051: 0x8B6C, - 7052: 0x8B6F, - 7053: 0x8B74, - 7054: 0x8B7D, - 7055: 0x8B80, - 7056: 0x8B8C, - 7057: 0x8B8E, - 7058: 0x8B92, - 7059: 0x8B93, - 7060: 0x8B96, - 7061: 0x8B99, - 7062: 0x8B9A, - 7063: 0x8C3A, - 7064: 0x8C41, - 7065: 0x8C3F, - 7066: 0x8C48, - 7067: 0x8C4C, - 7068: 0x8C4E, - 7069: 0x8C50, - 7070: 0x8C55, - 7071: 0x8C62, - 7072: 0x8C6C, - 7073: 0x8C78, - 7074: 0x8C7A, - 7075: 0x8C82, - 7076: 0x8C89, - 7077: 0x8C85, - 7078: 0x8C8A, - 7079: 0x8C8D, - 7080: 0x8C8E, - 7081: 0x8C94, - 7082: 0x8C7C, - 7083: 0x8C98, - 7084: 0x621D, - 7085: 0x8CAD, - 7086: 0x8CAA, - 7087: 0x8CBD, - 7088: 0x8CB2, - 7089: 0x8CB3, - 7090: 0x8CAE, - 7091: 0x8CB6, - 7092: 0x8CC8, - 7093: 0x8CC1, - 7094: 0x8CE4, - 7095: 0x8CE3, - 7096: 0x8CDA, - 7097: 0x8CFD, - 7098: 0x8CFA, - 7099: 0x8CFB, - 7100: 0x8D04, - 7101: 0x8D05, - 7102: 0x8D0A, - 7103: 0x8D07, - 7104: 0x8D0F, - 7105: 0x8D0D, - 7106: 0x8D10, - 7107: 0x9F4E, - 7108: 0x8D13, - 7109: 0x8CCD, - 7110: 0x8D14, - 7111: 0x8D16, - 7112: 0x8D67, - 7113: 0x8D6D, - 7114: 0x8D71, - 7115: 0x8D73, - 7116: 0x8D81, - 7117: 0x8D99, - 7118: 0x8DC2, - 7119: 0x8DBE, - 7120: 0x8DBA, - 7121: 0x8DCF, - 7122: 0x8DDA, - 7123: 0x8DD6, - 7124: 0x8DCC, - 7125: 0x8DDB, - 7126: 0x8DCB, - 7127: 0x8DEA, - 7128: 0x8DEB, - 7129: 0x8DDF, - 7130: 0x8DE3, - 7131: 0x8DFC, - 7132: 0x8E08, - 7133: 0x8E09, - 7134: 0x8DFF, - 7135: 0x8E1D, - 7136: 0x8E1E, - 7137: 0x8E10, - 7138: 0x8E1F, - 7139: 0x8E42, - 7140: 0x8E35, - 7141: 0x8E30, - 7142: 0x8E34, - 7143: 0x8E4A, - 7144: 0x8E47, - 7145: 0x8E49, - 7146: 0x8E4C, - 7147: 0x8E50, - 7148: 0x8E48, - 7149: 0x8E59, - 7150: 0x8E64, - 7151: 0x8E60, - 7152: 0x8E2A, - 7153: 0x8E63, - 7154: 0x8E55, - 7155: 0x8E76, - 7156: 0x8E72, - 7157: 0x8E7C, - 7158: 0x8E81, - 7159: 0x8E87, - 7160: 0x8E85, - 7161: 0x8E84, - 7162: 0x8E8B, - 7163: 0x8E8A, - 7164: 0x8E93, - 7165: 0x8E91, - 7166: 0x8E94, - 7167: 0x8E99, - 7168: 0x8EAA, - 7169: 0x8EA1, - 7170: 0x8EAC, - 7171: 0x8EB0, - 7172: 0x8EC6, - 7173: 0x8EB1, - 7174: 0x8EBE, - 7175: 0x8EC5, - 7176: 0x8EC8, - 7177: 0x8ECB, - 7178: 0x8EDB, - 7179: 0x8EE3, - 7180: 0x8EFC, - 7181: 0x8EFB, - 7182: 0x8EEB, - 7183: 0x8EFE, - 7184: 0x8F0A, - 7185: 0x8F05, - 7186: 0x8F15, - 7187: 0x8F12, - 7188: 0x8F19, - 7189: 0x8F13, - 7190: 0x8F1C, - 7191: 0x8F1F, - 7192: 0x8F1B, - 7193: 0x8F0C, - 7194: 0x8F26, - 7195: 0x8F33, - 7196: 0x8F3B, - 7197: 0x8F39, - 7198: 0x8F45, - 7199: 0x8F42, - 7200: 0x8F3E, - 7201: 0x8F4C, - 7202: 0x8F49, - 7203: 0x8F46, - 7204: 0x8F4E, - 7205: 0x8F57, - 7206: 0x8F5C, - 7207: 0x8F62, - 7208: 0x8F63, - 7209: 0x8F64, - 7210: 0x8F9C, - 7211: 0x8F9F, - 7212: 0x8FA3, - 7213: 0x8FAD, - 7214: 0x8FAF, - 7215: 0x8FB7, - 7216: 0x8FDA, - 7217: 0x8FE5, - 7218: 0x8FE2, - 7219: 0x8FEA, - 7220: 0x8FEF, - 7221: 0x9087, - 7222: 0x8FF4, - 7223: 0x9005, - 7224: 0x8FF9, - 7225: 0x8FFA, - 7226: 0x9011, - 7227: 0x9015, - 7228: 0x9021, - 7229: 0x900D, - 7230: 0x901E, - 7231: 0x9016, - 7232: 0x900B, - 7233: 0x9027, - 7234: 0x9036, - 7235: 0x9035, - 7236: 0x9039, - 7237: 0x8FF8, - 7238: 0x904F, - 7239: 0x9050, - 7240: 0x9051, - 7241: 0x9052, - 7242: 0x900E, - 7243: 0x9049, - 7244: 0x903E, - 7245: 0x9056, - 7246: 0x9058, - 7247: 0x905E, - 7248: 0x9068, - 7249: 0x906F, - 7250: 0x9076, - 7251: 0x96A8, - 7252: 0x9072, - 7253: 0x9082, - 7254: 0x907D, - 7255: 0x9081, - 7256: 0x9080, - 7257: 0x908A, - 7258: 0x9089, - 7259: 0x908F, - 7260: 0x90A8, - 7261: 0x90AF, - 7262: 0x90B1, - 7263: 0x90B5, - 7264: 0x90E2, - 7265: 0x90E4, - 7266: 0x6248, - 7267: 0x90DB, - 7268: 0x9102, - 7269: 0x9112, - 7270: 0x9119, - 7271: 0x9132, - 7272: 0x9130, - 7273: 0x914A, - 7274: 0x9156, - 7275: 0x9158, - 7276: 0x9163, - 7277: 0x9165, - 7278: 0x9169, - 7279: 0x9173, - 7280: 0x9172, - 7281: 0x918B, - 7282: 0x9189, - 7283: 0x9182, - 7284: 0x91A2, - 7285: 0x91AB, - 7286: 0x91AF, - 7287: 0x91AA, - 7288: 0x91B5, - 7289: 0x91B4, - 7290: 0x91BA, - 7291: 0x91C0, - 7292: 0x91C1, - 7293: 0x91C9, - 7294: 0x91CB, - 7295: 0x91D0, - 7296: 0x91D6, - 7297: 0x91DF, - 7298: 0x91E1, - 7299: 0x91DB, - 7300: 0x91FC, - 7301: 0x91F5, - 7302: 0x91F6, - 7303: 0x921E, - 7304: 0x91FF, - 7305: 0x9214, - 7306: 0x922C, - 7307: 0x9215, - 7308: 0x9211, - 7309: 0x925E, - 7310: 0x9257, - 7311: 0x9245, - 7312: 0x9249, - 7313: 0x9264, - 7314: 0x9248, - 7315: 0x9295, - 7316: 0x923F, - 7317: 0x924B, - 7318: 0x9250, - 7319: 0x929C, - 7320: 0x9296, - 7321: 0x9293, - 7322: 0x929B, - 7323: 0x925A, - 7324: 0x92CF, - 7325: 0x92B9, - 7326: 0x92B7, - 7327: 0x92E9, - 7328: 0x930F, - 7329: 0x92FA, - 7330: 0x9344, - 7331: 0x932E, - 7332: 0x9319, - 7333: 0x9322, - 7334: 0x931A, - 7335: 0x9323, - 7336: 0x933A, - 7337: 0x9335, - 7338: 0x933B, - 7339: 0x935C, - 7340: 0x9360, - 7341: 0x937C, - 7342: 0x936E, - 7343: 0x9356, - 7344: 0x93B0, - 7345: 0x93AC, - 7346: 0x93AD, - 7347: 0x9394, - 7348: 0x93B9, - 7349: 0x93D6, - 7350: 0x93D7, - 7351: 0x93E8, - 7352: 0x93E5, - 7353: 0x93D8, - 7354: 0x93C3, - 7355: 0x93DD, - 7356: 0x93D0, - 7357: 0x93C8, - 7358: 0x93E4, - 7359: 0x941A, - 7360: 0x9414, - 7361: 0x9413, - 7362: 0x9403, - 7363: 0x9407, - 7364: 0x9410, - 7365: 0x9436, - 7366: 0x942B, - 7367: 0x9435, - 7368: 0x9421, - 7369: 0x943A, - 7370: 0x9441, - 7371: 0x9452, - 7372: 0x9444, - 7373: 0x945B, - 7374: 0x9460, - 7375: 0x9462, - 7376: 0x945E, - 7377: 0x946A, - 7378: 0x9229, - 7379: 0x9470, - 7380: 0x9475, - 7381: 0x9477, - 7382: 0x947D, - 7383: 0x945A, - 7384: 0x947C, - 7385: 0x947E, - 7386: 0x9481, - 7387: 0x947F, - 7388: 0x9582, - 7389: 0x9587, - 7390: 0x958A, - 7391: 0x9594, - 7392: 0x9596, - 7393: 0x9598, - 7394: 0x9599, - 7395: 0x95A0, - 7396: 0x95A8, - 7397: 0x95A7, - 7398: 0x95AD, - 7399: 0x95BC, - 7400: 0x95BB, - 7401: 0x95B9, - 7402: 0x95BE, - 7403: 0x95CA, - 7404: 0x6FF6, - 7405: 0x95C3, - 7406: 0x95CD, - 7407: 0x95CC, - 7408: 0x95D5, - 7409: 0x95D4, - 7410: 0x95D6, - 7411: 0x95DC, - 7412: 0x95E1, - 7413: 0x95E5, - 7414: 0x95E2, - 7415: 0x9621, - 7416: 0x9628, - 7417: 0x962E, - 7418: 0x962F, - 7419: 0x9642, - 7420: 0x964C, - 7421: 0x964F, - 7422: 0x964B, - 7423: 0x9677, - 7424: 0x965C, - 7425: 0x965E, - 7426: 0x965D, - 7427: 0x965F, - 7428: 0x9666, - 7429: 0x9672, - 7430: 0x966C, - 7431: 0x968D, - 7432: 0x9698, - 7433: 0x9695, - 7434: 0x9697, - 7435: 0x96AA, - 7436: 0x96A7, - 7437: 0x96B1, - 7438: 0x96B2, - 7439: 0x96B0, - 7440: 0x96B4, - 7441: 0x96B6, - 7442: 0x96B8, - 7443: 0x96B9, - 7444: 0x96CE, - 7445: 0x96CB, - 7446: 0x96C9, - 7447: 0x96CD, - 7448: 0x894D, - 7449: 0x96DC, - 7450: 0x970D, - 7451: 0x96D5, - 7452: 0x96F9, - 7453: 0x9704, - 7454: 0x9706, - 7455: 0x9708, - 7456: 0x9713, - 7457: 0x970E, - 7458: 0x9711, - 7459: 0x970F, - 7460: 0x9716, - 7461: 0x9719, - 7462: 0x9724, - 7463: 0x972A, - 7464: 0x9730, - 7465: 0x9739, - 7466: 0x973D, - 7467: 0x973E, - 7468: 0x9744, - 7469: 0x9746, - 7470: 0x9748, - 7471: 0x9742, - 7472: 0x9749, - 7473: 0x975C, - 7474: 0x9760, - 7475: 0x9764, - 7476: 0x9766, - 7477: 0x9768, - 7478: 0x52D2, - 7479: 0x976B, - 7480: 0x9771, - 7481: 0x9779, - 7482: 0x9785, - 7483: 0x977C, - 7484: 0x9781, - 7485: 0x977A, - 7486: 0x9786, - 7487: 0x978B, - 7488: 0x978F, - 7489: 0x9790, - 7490: 0x979C, - 7491: 0x97A8, - 7492: 0x97A6, - 7493: 0x97A3, - 7494: 0x97B3, - 7495: 0x97B4, - 7496: 0x97C3, - 7497: 0x97C6, - 7498: 0x97C8, - 7499: 0x97CB, - 7500: 0x97DC, - 7501: 0x97ED, - 7502: 0x9F4F, - 7503: 0x97F2, - 7504: 0x7ADF, - 7505: 0x97F6, - 7506: 0x97F5, - 7507: 0x980F, - 7508: 0x980C, - 7509: 0x9838, - 7510: 0x9824, - 7511: 0x9821, - 7512: 0x9837, - 7513: 0x983D, - 7514: 0x9846, - 7515: 0x984F, - 7516: 0x984B, - 7517: 0x986B, - 7518: 0x986F, - 7519: 0x9870, - 7520: 0x9871, - 7521: 0x9874, - 7522: 0x9873, - 7523: 0x98AA, - 7524: 0x98AF, - 7525: 0x98B1, - 7526: 0x98B6, - 7527: 0x98C4, - 7528: 0x98C3, - 7529: 0x98C6, - 7530: 0x98E9, - 7531: 0x98EB, - 7532: 0x9903, - 7533: 0x9909, - 7534: 0x9912, - 7535: 0x9914, - 7536: 0x9918, - 7537: 0x9921, - 7538: 0x991D, - 7539: 0x991E, - 7540: 0x9924, - 7541: 0x9920, - 7542: 0x992C, - 7543: 0x992E, - 7544: 0x993D, - 7545: 0x993E, - 7546: 0x9942, - 7547: 0x9949, - 7548: 0x9945, - 7549: 0x9950, - 7550: 0x994B, - 7551: 0x9951, - 7552: 0x9952, - 7553: 0x994C, - 7554: 0x9955, - 7555: 0x9997, - 7556: 0x9998, - 7557: 0x99A5, - 7558: 0x99AD, - 7559: 0x99AE, - 7560: 0x99BC, - 7561: 0x99DF, - 7562: 0x99DB, - 7563: 0x99DD, - 7564: 0x99D8, - 7565: 0x99D1, - 7566: 0x99ED, - 7567: 0x99EE, - 7568: 0x99F1, - 7569: 0x99F2, - 7570: 0x99FB, - 7571: 0x99F8, - 7572: 0x9A01, - 7573: 0x9A0F, - 7574: 0x9A05, - 7575: 0x99E2, - 7576: 0x9A19, - 7577: 0x9A2B, - 7578: 0x9A37, - 7579: 0x9A45, - 7580: 0x9A42, - 7581: 0x9A40, - 7582: 0x9A43, - 7583: 0x9A3E, - 7584: 0x9A55, - 7585: 0x9A4D, - 7586: 0x9A5B, - 7587: 0x9A57, - 7588: 0x9A5F, - 7589: 0x9A62, - 7590: 0x9A65, - 7591: 0x9A64, - 7592: 0x9A69, - 7593: 0x9A6B, - 7594: 0x9A6A, - 7595: 0x9AAD, - 7596: 0x9AB0, - 7597: 0x9ABC, - 7598: 0x9AC0, - 7599: 0x9ACF, - 7600: 0x9AD1, - 7601: 0x9AD3, - 7602: 0x9AD4, - 7603: 0x9ADE, - 7604: 0x9ADF, - 7605: 0x9AE2, - 7606: 0x9AE3, - 7607: 0x9AE6, - 7608: 0x9AEF, - 7609: 0x9AEB, - 7610: 0x9AEE, - 7611: 0x9AF4, - 7612: 0x9AF1, - 7613: 0x9AF7, - 7614: 0x9AFB, - 7615: 0x9B06, - 7616: 0x9B18, - 7617: 0x9B1A, - 7618: 0x9B1F, - 7619: 0x9B22, - 7620: 0x9B23, - 7621: 0x9B25, - 7622: 0x9B27, - 7623: 0x9B28, - 7624: 0x9B29, - 7625: 0x9B2A, - 7626: 0x9B2E, - 7627: 0x9B2F, - 7628: 0x9B32, - 7629: 0x9B44, - 7630: 0x9B43, - 7631: 0x9B4F, - 7632: 0x9B4D, - 7633: 0x9B4E, - 7634: 0x9B51, - 7635: 0x9B58, - 7636: 0x9B74, - 7637: 0x9B93, - 7638: 0x9B83, - 7639: 0x9B91, - 7640: 0x9B96, - 7641: 0x9B97, - 7642: 0x9B9F, - 7643: 0x9BA0, - 7644: 0x9BA8, - 7645: 0x9BB4, - 7646: 0x9BC0, - 7647: 0x9BCA, - 7648: 0x9BB9, - 7649: 0x9BC6, - 7650: 0x9BCF, - 7651: 0x9BD1, - 7652: 0x9BD2, - 7653: 0x9BE3, - 7654: 0x9BE2, - 7655: 0x9BE4, - 7656: 0x9BD4, - 7657: 0x9BE1, - 7658: 0x9C3A, - 7659: 0x9BF2, - 7660: 0x9BF1, - 7661: 0x9BF0, - 7662: 0x9C15, - 7663: 0x9C14, - 7664: 0x9C09, - 7665: 0x9C13, - 7666: 0x9C0C, - 7667: 0x9C06, - 7668: 0x9C08, - 7669: 0x9C12, - 7670: 0x9C0A, - 7671: 0x9C04, - 7672: 0x9C2E, - 7673: 0x9C1B, - 7674: 0x9C25, - 7675: 0x9C24, - 7676: 0x9C21, - 7677: 0x9C30, - 7678: 0x9C47, - 7679: 0x9C32, - 7680: 0x9C46, - 7681: 0x9C3E, - 7682: 0x9C5A, - 7683: 0x9C60, - 7684: 0x9C67, - 7685: 0x9C76, - 7686: 0x9C78, - 7687: 0x9CE7, - 7688: 0x9CEC, - 7689: 0x9CF0, - 7690: 0x9D09, - 7691: 0x9D08, - 7692: 0x9CEB, - 7693: 0x9D03, - 7694: 0x9D06, - 7695: 0x9D2A, - 7696: 0x9D26, - 7697: 0x9DAF, - 7698: 0x9D23, - 7699: 0x9D1F, - 7700: 0x9D44, - 7701: 0x9D15, - 7702: 0x9D12, - 7703: 0x9D41, - 7704: 0x9D3F, - 7705: 0x9D3E, - 7706: 0x9D46, - 7707: 0x9D48, - 7708: 0x9D5D, - 7709: 0x9D5E, - 7710: 0x9D64, - 7711: 0x9D51, - 7712: 0x9D50, - 7713: 0x9D59, - 7714: 0x9D72, - 7715: 0x9D89, - 7716: 0x9D87, - 7717: 0x9DAB, - 7718: 0x9D6F, - 7719: 0x9D7A, - 7720: 0x9D9A, - 7721: 0x9DA4, - 7722: 0x9DA9, - 7723: 0x9DB2, - 7724: 0x9DC4, - 7725: 0x9DC1, - 7726: 0x9DBB, - 7727: 0x9DB8, - 7728: 0x9DBA, - 7729: 0x9DC6, - 7730: 0x9DCF, - 7731: 0x9DC2, - 7732: 0x9DD9, - 7733: 0x9DD3, - 7734: 0x9DF8, - 7735: 0x9DE6, - 7736: 0x9DED, - 7737: 0x9DEF, - 7738: 0x9DFD, - 7739: 0x9E1A, - 7740: 0x9E1B, - 7741: 0x9E1E, - 7742: 0x9E75, - 7743: 0x9E79, - 7744: 0x9E7D, - 7745: 0x9E81, - 7746: 0x9E88, - 7747: 0x9E8B, - 7748: 0x9E8C, - 7749: 0x9E92, - 7750: 0x9E95, - 7751: 0x9E91, - 7752: 0x9E9D, - 7753: 0x9EA5, - 7754: 0x9EA9, - 7755: 0x9EB8, - 7756: 0x9EAA, - 7757: 0x9EAD, - 7758: 0x9761, - 7759: 0x9ECC, - 7760: 0x9ECE, - 7761: 0x9ECF, - 7762: 0x9ED0, - 7763: 0x9ED4, - 7764: 0x9EDC, - 7765: 0x9EDE, - 7766: 0x9EDD, - 7767: 0x9EE0, - 7768: 0x9EE5, - 7769: 0x9EE8, - 7770: 0x9EEF, - 7771: 0x9EF4, - 7772: 0x9EF6, - 7773: 0x9EF7, - 7774: 0x9EF9, - 7775: 0x9EFB, - 7776: 0x9EFC, - 7777: 0x9EFD, - 7778: 0x9F07, - 7779: 0x9F08, - 7780: 0x76B7, - 7781: 0x9F15, - 7782: 0x9F21, - 7783: 0x9F2C, - 7784: 0x9F3E, - 7785: 0x9F4A, - 7786: 0x9F52, - 7787: 0x9F54, - 7788: 0x9F63, - 7789: 0x9F5F, - 7790: 0x9F60, - 7791: 0x9F61, - 7792: 0x9F66, - 7793: 0x9F67, - 7794: 0x9F6C, - 7795: 0x9F6A, - 7796: 0x9F77, - 7797: 0x9F72, - 7798: 0x9F76, - 7799: 0x9F95, - 7800: 0x9F9C, - 7801: 0x9FA0, - 7802: 0x582F, - 7803: 0x69C7, - 7804: 0x9059, - 7805: 0x7464, - 7806: 0x51DC, - 7807: 0x7199, - 8272: 0x7E8A, - 8273: 0x891C, - 8274: 0x9348, - 8275: 0x9288, - 8276: 0x84DC, - 8277: 0x4FC9, - 8278: 0x70BB, - 8279: 0x6631, - 8280: 0x68C8, - 8281: 0x92F9, - 8282: 0x66FB, - 8283: 0x5F45, - 8284: 0x4E28, - 8285: 0x4EE1, - 8286: 0x4EFC, - 8287: 0x4F00, - 8288: 0x4F03, - 8289: 0x4F39, - 8290: 0x4F56, - 8291: 0x4F92, - 8292: 0x4F8A, - 8293: 0x4F9A, - 8294: 0x4F94, - 8295: 0x4FCD, - 8296: 0x5040, - 8297: 0x5022, - 8298: 0x4FFF, - 8299: 0x501E, - 8300: 0x5046, - 8301: 0x5070, - 8302: 0x5042, - 8303: 0x5094, - 8304: 0x50F4, - 8305: 0x50D8, - 8306: 0x514A, - 8307: 0x5164, - 8308: 0x519D, - 8309: 0x51BE, - 8310: 0x51EC, - 8311: 0x5215, - 8312: 0x529C, - 8313: 0x52A6, - 8314: 0x52C0, - 8315: 0x52DB, - 8316: 0x5300, - 8317: 0x5307, - 8318: 0x5324, - 8319: 0x5372, - 8320: 0x5393, - 8321: 0x53B2, - 8322: 0x53DD, - 8323: 0xFA0E, - 8324: 0x549C, - 8325: 0x548A, - 8326: 0x54A9, - 8327: 0x54FF, - 8328: 0x5586, - 8329: 0x5759, - 8330: 0x5765, - 8331: 0x57AC, - 8332: 0x57C8, - 8333: 0x57C7, - 8334: 0xFA0F, - 8335: 0xFA10, - 8336: 0x589E, - 8337: 0x58B2, - 8338: 0x590B, - 8339: 0x5953, - 8340: 0x595B, - 8341: 0x595D, - 8342: 0x5963, - 8343: 0x59A4, - 8344: 0x59BA, - 8345: 0x5B56, - 8346: 0x5BC0, - 8347: 0x752F, - 8348: 0x5BD8, - 8349: 0x5BEC, - 8350: 0x5C1E, - 8351: 0x5CA6, - 8352: 0x5CBA, - 8353: 0x5CF5, - 8354: 0x5D27, - 8355: 0x5D53, - 8356: 0xFA11, - 8357: 0x5D42, - 8358: 0x5D6D, - 8359: 0x5DB8, - 8360: 0x5DB9, - 8361: 0x5DD0, - 8362: 0x5F21, - 8363: 0x5F34, - 8364: 0x5F67, - 8365: 0x5FB7, - 8366: 0x5FDE, - 8367: 0x605D, - 8368: 0x6085, - 8369: 0x608A, - 8370: 0x60DE, - 8371: 0x60D5, - 8372: 0x6120, - 8373: 0x60F2, - 8374: 0x6111, - 8375: 0x6137, - 8376: 0x6130, - 8377: 0x6198, - 8378: 0x6213, - 8379: 0x62A6, - 8380: 0x63F5, - 8381: 0x6460, - 8382: 0x649D, - 8383: 0x64CE, - 8384: 0x654E, - 8385: 0x6600, - 8386: 0x6615, - 8387: 0x663B, - 8388: 0x6609, - 8389: 0x662E, - 8390: 0x661E, - 8391: 0x6624, - 8392: 0x6665, - 8393: 0x6657, - 8394: 0x6659, - 8395: 0xFA12, - 8396: 0x6673, - 8397: 0x6699, - 8398: 0x66A0, - 8399: 0x66B2, - 8400: 0x66BF, - 8401: 0x66FA, - 8402: 0x670E, - 8403: 0xF929, - 8404: 0x6766, - 8405: 0x67BB, - 8406: 0x6852, - 8407: 0x67C0, - 8408: 0x6801, - 8409: 0x6844, - 8410: 0x68CF, - 8411: 0xFA13, - 8412: 0x6968, - 8413: 0xFA14, - 8414: 0x6998, - 8415: 0x69E2, - 8416: 0x6A30, - 8417: 0x6A6B, - 8418: 0x6A46, - 8419: 0x6A73, - 8420: 0x6A7E, - 8421: 0x6AE2, - 8422: 0x6AE4, - 8423: 0x6BD6, - 8424: 0x6C3F, - 8425: 0x6C5C, - 8426: 0x6C86, - 8427: 0x6C6F, - 8428: 0x6CDA, - 8429: 0x6D04, - 8430: 0x6D87, - 8431: 0x6D6F, - 8432: 0x6D96, - 8433: 0x6DAC, - 8434: 0x6DCF, - 8435: 0x6DF8, - 8436: 0x6DF2, - 8437: 0x6DFC, - 8438: 0x6E39, - 8439: 0x6E5C, - 8440: 0x6E27, - 8441: 0x6E3C, - 8442: 0x6EBF, - 8443: 0x6F88, - 8444: 0x6FB5, - 8445: 0x6FF5, - 8446: 0x7005, - 8447: 0x7007, - 8448: 0x7028, - 8449: 0x7085, - 8450: 0x70AB, - 8451: 0x710F, - 8452: 0x7104, - 8453: 0x715C, - 8454: 0x7146, - 8455: 0x7147, - 8456: 0xFA15, - 8457: 0x71C1, - 8458: 0x71FE, - 8459: 0x72B1, - 8460: 0x72BE, - 8461: 0x7324, - 8462: 0xFA16, - 8463: 0x7377, - 8464: 0x73BD, - 8465: 0x73C9, - 8466: 0x73D6, - 8467: 0x73E3, - 8468: 0x73D2, - 8469: 0x7407, - 8470: 0x73F5, - 8471: 0x7426, - 8472: 0x742A, - 8473: 0x7429, - 8474: 0x742E, - 8475: 0x7462, - 8476: 0x7489, - 8477: 0x749F, - 8478: 0x7501, - 8479: 0x756F, - 8480: 0x7682, - 8481: 0x769C, - 8482: 0x769E, - 8483: 0x769B, - 8484: 0x76A6, - 8485: 0xFA17, - 8486: 0x7746, - 8487: 0x52AF, - 8488: 0x7821, - 8489: 0x784E, - 8490: 0x7864, - 8491: 0x787A, - 8492: 0x7930, - 8493: 0xFA18, - 8494: 0xFA19, - 8495: 0xFA1A, - 8496: 0x7994, - 8497: 0xFA1B, - 8498: 0x799B, - 8499: 0x7AD1, - 8500: 0x7AE7, - 8501: 0xFA1C, - 8502: 0x7AEB, - 8503: 0x7B9E, - 8504: 0xFA1D, - 8505: 0x7D48, - 8506: 0x7D5C, - 8507: 0x7DB7, - 8508: 0x7DA0, - 8509: 0x7DD6, - 8510: 0x7E52, - 8511: 0x7F47, - 8512: 0x7FA1, - 8513: 0xFA1E, - 8514: 0x8301, - 8515: 0x8362, - 8516: 0x837F, - 8517: 0x83C7, - 8518: 0x83F6, - 8519: 0x8448, - 8520: 0x84B4, - 8521: 0x8553, - 8522: 0x8559, - 8523: 0x856B, - 8524: 0xFA1F, - 8525: 0x85B0, - 8526: 0xFA20, - 8527: 0xFA21, - 8528: 0x8807, - 8529: 0x88F5, - 8530: 0x8A12, - 8531: 0x8A37, - 8532: 0x8A79, - 8533: 0x8AA7, - 8534: 0x8ABE, - 8535: 0x8ADF, - 8536: 0xFA22, - 8537: 0x8AF6, - 8538: 0x8B53, - 8539: 0x8B7F, - 8540: 0x8CF0, - 8541: 0x8CF4, - 8542: 0x8D12, - 8543: 0x8D76, - 8544: 0xFA23, - 8545: 0x8ECF, - 8546: 0xFA24, - 8547: 0xFA25, - 8548: 0x9067, - 8549: 0x90DE, - 8550: 0xFA26, - 8551: 0x9115, - 8552: 0x9127, - 8553: 0x91DA, - 8554: 0x91D7, - 8555: 0x91DE, - 8556: 0x91ED, - 8557: 0x91EE, - 8558: 0x91E4, - 8559: 0x91E5, - 8560: 0x9206, - 8561: 0x9210, - 8562: 0x920A, - 8563: 0x923A, - 8564: 0x9240, - 8565: 0x923C, - 8566: 0x924E, - 8567: 0x9259, - 8568: 0x9251, - 8569: 0x9239, - 8570: 0x9267, - 8571: 0x92A7, - 8572: 0x9277, - 8573: 0x9278, - 8574: 0x92E7, - 8575: 0x92D7, - 8576: 0x92D9, - 8577: 0x92D0, - 8578: 0xFA27, - 8579: 0x92D5, - 8580: 0x92E0, - 8581: 0x92D3, - 8582: 0x9325, - 8583: 0x9321, - 8584: 0x92FB, - 8585: 0xFA28, - 8586: 0x931E, - 8587: 0x92FF, - 8588: 0x931D, - 8589: 0x9302, - 8590: 0x9370, - 8591: 0x9357, - 8592: 0x93A4, - 8593: 0x93C6, - 8594: 0x93DE, - 8595: 0x93F8, - 8596: 0x9431, - 8597: 0x9445, - 8598: 0x9448, - 8599: 0x9592, - 8600: 0xF9DC, - 8601: 0xFA29, - 8602: 0x969D, - 8603: 0x96AF, - 8604: 0x9733, - 8605: 0x973B, - 8606: 0x9743, - 8607: 0x974D, - 8608: 0x974F, - 8609: 0x9751, - 8610: 0x9755, - 8611: 0x9857, - 8612: 0x9865, - 8613: 0xFA2A, - 8614: 0xFA2B, - 8615: 0x9927, - 8616: 0xFA2C, - 8617: 0x999E, - 8618: 0x9A4E, - 8619: 0x9AD9, - 8620: 0x9ADC, - 8621: 0x9B75, - 8622: 0x9B72, - 8623: 0x9B8F, - 8624: 0x9BB1, - 8625: 0x9BBB, - 8626: 0x9C00, - 8627: 0x9D70, - 8628: 0x9D6B, - 8629: 0xFA2D, - 8630: 0x9E19, - 8631: 0x9ED1, - 8634: 0x2170, - 8635: 0x2171, - 8636: 0x2172, - 8637: 0x2173, - 8638: 0x2174, - 8639: 0x2175, - 8640: 0x2176, - 8641: 0x2177, - 8642: 0x2178, - 8643: 0x2179, - 8644: 0xFFE2, - 8645: 0xFFE4, - 8646: 0xFF07, - 8647: 0xFF02, - 10716: 0x2170, - 10717: 0x2171, - 10718: 0x2172, - 10719: 0x2173, - 10720: 0x2174, - 10721: 0x2175, - 10722: 0x2176, - 10723: 0x2177, - 10724: 0x2178, - 10725: 0x2179, - 10726: 0x2160, - 10727: 0x2161, - 10728: 0x2162, - 10729: 0x2163, - 10730: 0x2164, - 10731: 0x2165, - 10732: 0x2166, - 10733: 0x2167, - 10734: 0x2168, - 10735: 0x2169, - 10736: 0xFFE2, - 10737: 0xFFE4, - 10738: 0xFF07, - 10739: 0xFF02, - 10740: 0x3231, - 10741: 0x2116, - 10742: 0x2121, - 10743: 0x2235, - 10744: 0x7E8A, - 10745: 0x891C, - 10746: 0x9348, - 10747: 0x9288, - 10748: 0x84DC, - 10749: 0x4FC9, - 10750: 0x70BB, - 10751: 0x6631, - 10752: 0x68C8, - 10753: 0x92F9, - 10754: 0x66FB, - 10755: 0x5F45, - 10756: 0x4E28, - 10757: 0x4EE1, - 10758: 0x4EFC, - 10759: 0x4F00, - 10760: 0x4F03, - 10761: 0x4F39, - 10762: 0x4F56, - 10763: 0x4F92, - 10764: 0x4F8A, - 10765: 0x4F9A, - 10766: 0x4F94, - 10767: 0x4FCD, - 10768: 0x5040, - 10769: 0x5022, - 10770: 0x4FFF, - 10771: 0x501E, - 10772: 0x5046, - 10773: 0x5070, - 10774: 0x5042, - 10775: 0x5094, - 10776: 0x50F4, - 10777: 0x50D8, - 10778: 0x514A, - 10779: 0x5164, - 10780: 0x519D, - 10781: 0x51BE, - 10782: 0x51EC, - 10783: 0x5215, - 10784: 0x529C, - 10785: 0x52A6, - 10786: 0x52C0, - 10787: 0x52DB, - 10788: 0x5300, - 10789: 0x5307, - 10790: 0x5324, - 10791: 0x5372, - 10792: 0x5393, - 10793: 0x53B2, - 10794: 0x53DD, - 10795: 0xFA0E, - 10796: 0x549C, - 10797: 0x548A, - 10798: 0x54A9, - 10799: 0x54FF, - 10800: 0x5586, - 10801: 0x5759, - 10802: 0x5765, - 10803: 0x57AC, - 10804: 0x57C8, - 10805: 0x57C7, - 10806: 0xFA0F, - 10807: 0xFA10, - 10808: 0x589E, - 10809: 0x58B2, - 10810: 0x590B, - 10811: 0x5953, - 10812: 0x595B, - 10813: 0x595D, - 10814: 0x5963, - 10815: 0x59A4, - 10816: 0x59BA, - 10817: 0x5B56, - 10818: 0x5BC0, - 10819: 0x752F, - 10820: 0x5BD8, - 10821: 0x5BEC, - 10822: 0x5C1E, - 10823: 0x5CA6, - 10824: 0x5CBA, - 10825: 0x5CF5, - 10826: 0x5D27, - 10827: 0x5D53, - 10828: 0xFA11, - 10829: 0x5D42, - 10830: 0x5D6D, - 10831: 0x5DB8, - 10832: 0x5DB9, - 10833: 0x5DD0, - 10834: 0x5F21, - 10835: 0x5F34, - 10836: 0x5F67, - 10837: 0x5FB7, - 10838: 0x5FDE, - 10839: 0x605D, - 10840: 0x6085, - 10841: 0x608A, - 10842: 0x60DE, - 10843: 0x60D5, - 10844: 0x6120, - 10845: 0x60F2, - 10846: 0x6111, - 10847: 0x6137, - 10848: 0x6130, - 10849: 0x6198, - 10850: 0x6213, - 10851: 0x62A6, - 10852: 0x63F5, - 10853: 0x6460, - 10854: 0x649D, - 10855: 0x64CE, - 10856: 0x654E, - 10857: 0x6600, - 10858: 0x6615, - 10859: 0x663B, - 10860: 0x6609, - 10861: 0x662E, - 10862: 0x661E, - 10863: 0x6624, - 10864: 0x6665, - 10865: 0x6657, - 10866: 0x6659, - 10867: 0xFA12, - 10868: 0x6673, - 10869: 0x6699, - 10870: 0x66A0, - 10871: 0x66B2, - 10872: 0x66BF, - 10873: 0x66FA, - 10874: 0x670E, - 10875: 0xF929, - 10876: 0x6766, - 10877: 0x67BB, - 10878: 0x6852, - 10879: 0x67C0, - 10880: 0x6801, - 10881: 0x6844, - 10882: 0x68CF, - 10883: 0xFA13, - 10884: 0x6968, - 10885: 0xFA14, - 10886: 0x6998, - 10887: 0x69E2, - 10888: 0x6A30, - 10889: 0x6A6B, - 10890: 0x6A46, - 10891: 0x6A73, - 10892: 0x6A7E, - 10893: 0x6AE2, - 10894: 0x6AE4, - 10895: 0x6BD6, - 10896: 0x6C3F, - 10897: 0x6C5C, - 10898: 0x6C86, - 10899: 0x6C6F, - 10900: 0x6CDA, - 10901: 0x6D04, - 10902: 0x6D87, - 10903: 0x6D6F, - 10904: 0x6D96, - 10905: 0x6DAC, - 10906: 0x6DCF, - 10907: 0x6DF8, - 10908: 0x6DF2, - 10909: 0x6DFC, - 10910: 0x6E39, - 10911: 0x6E5C, - 10912: 0x6E27, - 10913: 0x6E3C, - 10914: 0x6EBF, - 10915: 0x6F88, - 10916: 0x6FB5, - 10917: 0x6FF5, - 10918: 0x7005, - 10919: 0x7007, - 10920: 0x7028, - 10921: 0x7085, - 10922: 0x70AB, - 10923: 0x710F, - 10924: 0x7104, - 10925: 0x715C, - 10926: 0x7146, - 10927: 0x7147, - 10928: 0xFA15, - 10929: 0x71C1, - 10930: 0x71FE, - 10931: 0x72B1, - 10932: 0x72BE, - 10933: 0x7324, - 10934: 0xFA16, - 10935: 0x7377, - 10936: 0x73BD, - 10937: 0x73C9, - 10938: 0x73D6, - 10939: 0x73E3, - 10940: 0x73D2, - 10941: 0x7407, - 10942: 0x73F5, - 10943: 0x7426, - 10944: 0x742A, - 10945: 0x7429, - 10946: 0x742E, - 10947: 0x7462, - 10948: 0x7489, - 10949: 0x749F, - 10950: 0x7501, - 10951: 0x756F, - 10952: 0x7682, - 10953: 0x769C, - 10954: 0x769E, - 10955: 0x769B, - 10956: 0x76A6, - 10957: 0xFA17, - 10958: 0x7746, - 10959: 0x52AF, - 10960: 0x7821, - 10961: 0x784E, - 10962: 0x7864, - 10963: 0x787A, - 10964: 0x7930, - 10965: 0xFA18, - 10966: 0xFA19, - 10967: 0xFA1A, - 10968: 0x7994, - 10969: 0xFA1B, - 10970: 0x799B, - 10971: 0x7AD1, - 10972: 0x7AE7, - 10973: 0xFA1C, - 10974: 0x7AEB, - 10975: 0x7B9E, - 10976: 0xFA1D, - 10977: 0x7D48, - 10978: 0x7D5C, - 10979: 0x7DB7, - 10980: 0x7DA0, - 10981: 0x7DD6, - 10982: 0x7E52, - 10983: 0x7F47, - 10984: 0x7FA1, - 10985: 0xFA1E, - 10986: 0x8301, - 10987: 0x8362, - 10988: 0x837F, - 10989: 0x83C7, - 10990: 0x83F6, - 10991: 0x8448, - 10992: 0x84B4, - 10993: 0x8553, - 10994: 0x8559, - 10995: 0x856B, - 10996: 0xFA1F, - 10997: 0x85B0, - 10998: 0xFA20, - 10999: 0xFA21, - 11000: 0x8807, - 11001: 0x88F5, - 11002: 0x8A12, - 11003: 0x8A37, - 11004: 0x8A79, - 11005: 0x8AA7, - 11006: 0x8ABE, - 11007: 0x8ADF, - 11008: 0xFA22, - 11009: 0x8AF6, - 11010: 0x8B53, - 11011: 0x8B7F, - 11012: 0x8CF0, - 11013: 0x8CF4, - 11014: 0x8D12, - 11015: 0x8D76, - 11016: 0xFA23, - 11017: 0x8ECF, - 11018: 0xFA24, - 11019: 0xFA25, - 11020: 0x9067, - 11021: 0x90DE, - 11022: 0xFA26, - 11023: 0x9115, - 11024: 0x9127, - 11025: 0x91DA, - 11026: 0x91D7, - 11027: 0x91DE, - 11028: 0x91ED, - 11029: 0x91EE, - 11030: 0x91E4, - 11031: 0x91E5, - 11032: 0x9206, - 11033: 0x9210, - 11034: 0x920A, - 11035: 0x923A, - 11036: 0x9240, - 11037: 0x923C, - 11038: 0x924E, - 11039: 0x9259, - 11040: 0x9251, - 11041: 0x9239, - 11042: 0x9267, - 11043: 0x92A7, - 11044: 0x9277, - 11045: 0x9278, - 11046: 0x92E7, - 11047: 0x92D7, - 11048: 0x92D9, - 11049: 0x92D0, - 11050: 0xFA27, - 11051: 0x92D5, - 11052: 0x92E0, - 11053: 0x92D3, - 11054: 0x9325, - 11055: 0x9321, - 11056: 0x92FB, - 11057: 0xFA28, - 11058: 0x931E, - 11059: 0x92FF, - 11060: 0x931D, - 11061: 0x9302, - 11062: 0x9370, - 11063: 0x9357, - 11064: 0x93A4, - 11065: 0x93C6, - 11066: 0x93DE, - 11067: 0x93F8, - 11068: 0x9431, - 11069: 0x9445, - 11070: 0x9448, - 11071: 0x9592, - 11072: 0xF9DC, - 11073: 0xFA29, - 11074: 0x969D, - 11075: 0x96AF, - 11076: 0x9733, - 11077: 0x973B, - 11078: 0x9743, - 11079: 0x974D, - 11080: 0x974F, - 11081: 0x9751, - 11082: 0x9755, - 11083: 0x9857, - 11084: 0x9865, - 11085: 0xFA2A, - 11086: 0xFA2B, - 11087: 0x9927, - 11088: 0xFA2C, - 11089: 0x999E, - 11090: 0x9A4E, - 11091: 0x9AD9, - 11092: 0x9ADC, - 11093: 0x9B75, - 11094: 0x9B72, - 11095: 0x9B8F, - 11096: 0x9BB1, - 11097: 0x9BBB, - 11098: 0x9C00, - 11099: 0x9D70, - 11100: 0x9D6B, - 11101: 0xFA2D, - 11102: 0x9E19, - 11103: 0x9ED1, -} - -// jis0212Decode is the decoding table from JIS 0212 code to Unicode. -// It is defined at http://encoding.spec.whatwg.org/index-jis0212.txt -var jis0212Decode = [...]uint16{ - 108: 0x02D8, - 109: 0x02C7, - 110: 0x00B8, - 111: 0x02D9, - 112: 0x02DD, - 113: 0x00AF, - 114: 0x02DB, - 115: 0x02DA, - 116: 0xFF5E, - 117: 0x0384, - 118: 0x0385, - 127: 0x00A1, - 128: 0x00A6, - 129: 0x00BF, - 168: 0x00BA, - 169: 0x00AA, - 170: 0x00A9, - 171: 0x00AE, - 172: 0x2122, - 173: 0x00A4, - 174: 0x2116, - 534: 0x0386, - 535: 0x0388, - 536: 0x0389, - 537: 0x038A, - 538: 0x03AA, - 540: 0x038C, - 542: 0x038E, - 543: 0x03AB, - 545: 0x038F, - 550: 0x03AC, - 551: 0x03AD, - 552: 0x03AE, - 553: 0x03AF, - 554: 0x03CA, - 555: 0x0390, - 556: 0x03CC, - 557: 0x03C2, - 558: 0x03CD, - 559: 0x03CB, - 560: 0x03B0, - 561: 0x03CE, - 597: 0x0402, - 598: 0x0403, - 599: 0x0404, - 600: 0x0405, - 601: 0x0406, - 602: 0x0407, - 603: 0x0408, - 604: 0x0409, - 605: 0x040A, - 606: 0x040B, - 607: 0x040C, - 608: 0x040E, - 609: 0x040F, - 645: 0x0452, - 646: 0x0453, - 647: 0x0454, - 648: 0x0455, - 649: 0x0456, - 650: 0x0457, - 651: 0x0458, - 652: 0x0459, - 653: 0x045A, - 654: 0x045B, - 655: 0x045C, - 656: 0x045E, - 657: 0x045F, - 752: 0x00C6, - 753: 0x0110, - 755: 0x0126, - 757: 0x0132, - 759: 0x0141, - 760: 0x013F, - 762: 0x014A, - 763: 0x00D8, - 764: 0x0152, - 766: 0x0166, - 767: 0x00DE, - 784: 0x00E6, - 785: 0x0111, - 786: 0x00F0, - 787: 0x0127, - 788: 0x0131, - 789: 0x0133, - 790: 0x0138, - 791: 0x0142, - 792: 0x0140, - 793: 0x0149, - 794: 0x014B, - 795: 0x00F8, - 796: 0x0153, - 797: 0x00DF, - 798: 0x0167, - 799: 0x00FE, - 846: 0x00C1, - 847: 0x00C0, - 848: 0x00C4, - 849: 0x00C2, - 850: 0x0102, - 851: 0x01CD, - 852: 0x0100, - 853: 0x0104, - 854: 0x00C5, - 855: 0x00C3, - 856: 0x0106, - 857: 0x0108, - 858: 0x010C, - 859: 0x00C7, - 860: 0x010A, - 861: 0x010E, - 862: 0x00C9, - 863: 0x00C8, - 864: 0x00CB, - 865: 0x00CA, - 866: 0x011A, - 867: 0x0116, - 868: 0x0112, - 869: 0x0118, - 871: 0x011C, - 872: 0x011E, - 873: 0x0122, - 874: 0x0120, - 875: 0x0124, - 876: 0x00CD, - 877: 0x00CC, - 878: 0x00CF, - 879: 0x00CE, - 880: 0x01CF, - 881: 0x0130, - 882: 0x012A, - 883: 0x012E, - 884: 0x0128, - 885: 0x0134, - 886: 0x0136, - 887: 0x0139, - 888: 0x013D, - 889: 0x013B, - 890: 0x0143, - 891: 0x0147, - 892: 0x0145, - 893: 0x00D1, - 894: 0x00D3, - 895: 0x00D2, - 896: 0x00D6, - 897: 0x00D4, - 898: 0x01D1, - 899: 0x0150, - 900: 0x014C, - 901: 0x00D5, - 902: 0x0154, - 903: 0x0158, - 904: 0x0156, - 905: 0x015A, - 906: 0x015C, - 907: 0x0160, - 908: 0x015E, - 909: 0x0164, - 910: 0x0162, - 911: 0x00DA, - 912: 0x00D9, - 913: 0x00DC, - 914: 0x00DB, - 915: 0x016C, - 916: 0x01D3, - 917: 0x0170, - 918: 0x016A, - 919: 0x0172, - 920: 0x016E, - 921: 0x0168, - 922: 0x01D7, - 923: 0x01DB, - 924: 0x01D9, - 925: 0x01D5, - 926: 0x0174, - 927: 0x00DD, - 928: 0x0178, - 929: 0x0176, - 930: 0x0179, - 931: 0x017D, - 932: 0x017B, - 940: 0x00E1, - 941: 0x00E0, - 942: 0x00E4, - 943: 0x00E2, - 944: 0x0103, - 945: 0x01CE, - 946: 0x0101, - 947: 0x0105, - 948: 0x00E5, - 949: 0x00E3, - 950: 0x0107, - 951: 0x0109, - 952: 0x010D, - 953: 0x00E7, - 954: 0x010B, - 955: 0x010F, - 956: 0x00E9, - 957: 0x00E8, - 958: 0x00EB, - 959: 0x00EA, - 960: 0x011B, - 961: 0x0117, - 962: 0x0113, - 963: 0x0119, - 964: 0x01F5, - 965: 0x011D, - 966: 0x011F, - 968: 0x0121, - 969: 0x0125, - 970: 0x00ED, - 971: 0x00EC, - 972: 0x00EF, - 973: 0x00EE, - 974: 0x01D0, - 976: 0x012B, - 977: 0x012F, - 978: 0x0129, - 979: 0x0135, - 980: 0x0137, - 981: 0x013A, - 982: 0x013E, - 983: 0x013C, - 984: 0x0144, - 985: 0x0148, - 986: 0x0146, - 987: 0x00F1, - 988: 0x00F3, - 989: 0x00F2, - 990: 0x00F6, - 991: 0x00F4, - 992: 0x01D2, - 993: 0x0151, - 994: 0x014D, - 995: 0x00F5, - 996: 0x0155, - 997: 0x0159, - 998: 0x0157, - 999: 0x015B, - 1000: 0x015D, - 1001: 0x0161, - 1002: 0x015F, - 1003: 0x0165, - 1004: 0x0163, - 1005: 0x00FA, - 1006: 0x00F9, - 1007: 0x00FC, - 1008: 0x00FB, - 1009: 0x016D, - 1010: 0x01D4, - 1011: 0x0171, - 1012: 0x016B, - 1013: 0x0173, - 1014: 0x016F, - 1015: 0x0169, - 1016: 0x01D8, - 1017: 0x01DC, - 1018: 0x01DA, - 1019: 0x01D6, - 1020: 0x0175, - 1021: 0x00FD, - 1022: 0x00FF, - 1023: 0x0177, - 1024: 0x017A, - 1025: 0x017E, - 1026: 0x017C, - 1410: 0x4E02, - 1411: 0x4E04, - 1412: 0x4E05, - 1413: 0x4E0C, - 1414: 0x4E12, - 1415: 0x4E1F, - 1416: 0x4E23, - 1417: 0x4E24, - 1418: 0x4E28, - 1419: 0x4E2B, - 1420: 0x4E2E, - 1421: 0x4E2F, - 1422: 0x4E30, - 1423: 0x4E35, - 1424: 0x4E40, - 1425: 0x4E41, - 1426: 0x4E44, - 1427: 0x4E47, - 1428: 0x4E51, - 1429: 0x4E5A, - 1430: 0x4E5C, - 1431: 0x4E63, - 1432: 0x4E68, - 1433: 0x4E69, - 1434: 0x4E74, - 1435: 0x4E75, - 1436: 0x4E79, - 1437: 0x4E7F, - 1438: 0x4E8D, - 1439: 0x4E96, - 1440: 0x4E97, - 1441: 0x4E9D, - 1442: 0x4EAF, - 1443: 0x4EB9, - 1444: 0x4EC3, - 1445: 0x4ED0, - 1446: 0x4EDA, - 1447: 0x4EDB, - 1448: 0x4EE0, - 1449: 0x4EE1, - 1450: 0x4EE2, - 1451: 0x4EE8, - 1452: 0x4EEF, - 1453: 0x4EF1, - 1454: 0x4EF3, - 1455: 0x4EF5, - 1456: 0x4EFD, - 1457: 0x4EFE, - 1458: 0x4EFF, - 1459: 0x4F00, - 1460: 0x4F02, - 1461: 0x4F03, - 1462: 0x4F08, - 1463: 0x4F0B, - 1464: 0x4F0C, - 1465: 0x4F12, - 1466: 0x4F15, - 1467: 0x4F16, - 1468: 0x4F17, - 1469: 0x4F19, - 1470: 0x4F2E, - 1471: 0x4F31, - 1472: 0x4F60, - 1473: 0x4F33, - 1474: 0x4F35, - 1475: 0x4F37, - 1476: 0x4F39, - 1477: 0x4F3B, - 1478: 0x4F3E, - 1479: 0x4F40, - 1480: 0x4F42, - 1481: 0x4F48, - 1482: 0x4F49, - 1483: 0x4F4B, - 1484: 0x4F4C, - 1485: 0x4F52, - 1486: 0x4F54, - 1487: 0x4F56, - 1488: 0x4F58, - 1489: 0x4F5F, - 1490: 0x4F63, - 1491: 0x4F6A, - 1492: 0x4F6C, - 1493: 0x4F6E, - 1494: 0x4F71, - 1495: 0x4F77, - 1496: 0x4F78, - 1497: 0x4F79, - 1498: 0x4F7A, - 1499: 0x4F7D, - 1500: 0x4F7E, - 1501: 0x4F81, - 1502: 0x4F82, - 1503: 0x4F84, - 1504: 0x4F85, - 1505: 0x4F89, - 1506: 0x4F8A, - 1507: 0x4F8C, - 1508: 0x4F8E, - 1509: 0x4F90, - 1510: 0x4F92, - 1511: 0x4F93, - 1512: 0x4F94, - 1513: 0x4F97, - 1514: 0x4F99, - 1515: 0x4F9A, - 1516: 0x4F9E, - 1517: 0x4F9F, - 1518: 0x4FB2, - 1519: 0x4FB7, - 1520: 0x4FB9, - 1521: 0x4FBB, - 1522: 0x4FBC, - 1523: 0x4FBD, - 1524: 0x4FBE, - 1525: 0x4FC0, - 1526: 0x4FC1, - 1527: 0x4FC5, - 1528: 0x4FC6, - 1529: 0x4FC8, - 1530: 0x4FC9, - 1531: 0x4FCB, - 1532: 0x4FCC, - 1533: 0x4FCD, - 1534: 0x4FCF, - 1535: 0x4FD2, - 1536: 0x4FDC, - 1537: 0x4FE0, - 1538: 0x4FE2, - 1539: 0x4FF0, - 1540: 0x4FF2, - 1541: 0x4FFC, - 1542: 0x4FFD, - 1543: 0x4FFF, - 1544: 0x5000, - 1545: 0x5001, - 1546: 0x5004, - 1547: 0x5007, - 1548: 0x500A, - 1549: 0x500C, - 1550: 0x500E, - 1551: 0x5010, - 1552: 0x5013, - 1553: 0x5017, - 1554: 0x5018, - 1555: 0x501B, - 1556: 0x501C, - 1557: 0x501D, - 1558: 0x501E, - 1559: 0x5022, - 1560: 0x5027, - 1561: 0x502E, - 1562: 0x5030, - 1563: 0x5032, - 1564: 0x5033, - 1565: 0x5035, - 1566: 0x5040, - 1567: 0x5041, - 1568: 0x5042, - 1569: 0x5045, - 1570: 0x5046, - 1571: 0x504A, - 1572: 0x504C, - 1573: 0x504E, - 1574: 0x5051, - 1575: 0x5052, - 1576: 0x5053, - 1577: 0x5057, - 1578: 0x5059, - 1579: 0x505F, - 1580: 0x5060, - 1581: 0x5062, - 1582: 0x5063, - 1583: 0x5066, - 1584: 0x5067, - 1585: 0x506A, - 1586: 0x506D, - 1587: 0x5070, - 1588: 0x5071, - 1589: 0x503B, - 1590: 0x5081, - 1591: 0x5083, - 1592: 0x5084, - 1593: 0x5086, - 1594: 0x508A, - 1595: 0x508E, - 1596: 0x508F, - 1597: 0x5090, - 1598: 0x5092, - 1599: 0x5093, - 1600: 0x5094, - 1601: 0x5096, - 1602: 0x509B, - 1603: 0x509C, - 1604: 0x509E, - 1605: 0x509F, - 1606: 0x50A0, - 1607: 0x50A1, - 1608: 0x50A2, - 1609: 0x50AA, - 1610: 0x50AF, - 1611: 0x50B0, - 1612: 0x50B9, - 1613: 0x50BA, - 1614: 0x50BD, - 1615: 0x50C0, - 1616: 0x50C3, - 1617: 0x50C4, - 1618: 0x50C7, - 1619: 0x50CC, - 1620: 0x50CE, - 1621: 0x50D0, - 1622: 0x50D3, - 1623: 0x50D4, - 1624: 0x50D8, - 1625: 0x50DC, - 1626: 0x50DD, - 1627: 0x50DF, - 1628: 0x50E2, - 1629: 0x50E4, - 1630: 0x50E6, - 1631: 0x50E8, - 1632: 0x50E9, - 1633: 0x50EF, - 1634: 0x50F1, - 1635: 0x50F6, - 1636: 0x50FA, - 1637: 0x50FE, - 1638: 0x5103, - 1639: 0x5106, - 1640: 0x5107, - 1641: 0x5108, - 1642: 0x510B, - 1643: 0x510C, - 1644: 0x510D, - 1645: 0x510E, - 1646: 0x50F2, - 1647: 0x5110, - 1648: 0x5117, - 1649: 0x5119, - 1650: 0x511B, - 1651: 0x511C, - 1652: 0x511D, - 1653: 0x511E, - 1654: 0x5123, - 1655: 0x5127, - 1656: 0x5128, - 1657: 0x512C, - 1658: 0x512D, - 1659: 0x512F, - 1660: 0x5131, - 1661: 0x5133, - 1662: 0x5134, - 1663: 0x5135, - 1664: 0x5138, - 1665: 0x5139, - 1666: 0x5142, - 1667: 0x514A, - 1668: 0x514F, - 1669: 0x5153, - 1670: 0x5155, - 1671: 0x5157, - 1672: 0x5158, - 1673: 0x515F, - 1674: 0x5164, - 1675: 0x5166, - 1676: 0x517E, - 1677: 0x5183, - 1678: 0x5184, - 1679: 0x518B, - 1680: 0x518E, - 1681: 0x5198, - 1682: 0x519D, - 1683: 0x51A1, - 1684: 0x51A3, - 1685: 0x51AD, - 1686: 0x51B8, - 1687: 0x51BA, - 1688: 0x51BC, - 1689: 0x51BE, - 1690: 0x51BF, - 1691: 0x51C2, - 1692: 0x51C8, - 1693: 0x51CF, - 1694: 0x51D1, - 1695: 0x51D2, - 1696: 0x51D3, - 1697: 0x51D5, - 1698: 0x51D8, - 1699: 0x51DE, - 1700: 0x51E2, - 1701: 0x51E5, - 1702: 0x51EE, - 1703: 0x51F2, - 1704: 0x51F3, - 1705: 0x51F4, - 1706: 0x51F7, - 1707: 0x5201, - 1708: 0x5202, - 1709: 0x5205, - 1710: 0x5212, - 1711: 0x5213, - 1712: 0x5215, - 1713: 0x5216, - 1714: 0x5218, - 1715: 0x5222, - 1716: 0x5228, - 1717: 0x5231, - 1718: 0x5232, - 1719: 0x5235, - 1720: 0x523C, - 1721: 0x5245, - 1722: 0x5249, - 1723: 0x5255, - 1724: 0x5257, - 1725: 0x5258, - 1726: 0x525A, - 1727: 0x525C, - 1728: 0x525F, - 1729: 0x5260, - 1730: 0x5261, - 1731: 0x5266, - 1732: 0x526E, - 1733: 0x5277, - 1734: 0x5278, - 1735: 0x5279, - 1736: 0x5280, - 1737: 0x5282, - 1738: 0x5285, - 1739: 0x528A, - 1740: 0x528C, - 1741: 0x5293, - 1742: 0x5295, - 1743: 0x5296, - 1744: 0x5297, - 1745: 0x5298, - 1746: 0x529A, - 1747: 0x529C, - 1748: 0x52A4, - 1749: 0x52A5, - 1750: 0x52A6, - 1751: 0x52A7, - 1752: 0x52AF, - 1753: 0x52B0, - 1754: 0x52B6, - 1755: 0x52B7, - 1756: 0x52B8, - 1757: 0x52BA, - 1758: 0x52BB, - 1759: 0x52BD, - 1760: 0x52C0, - 1761: 0x52C4, - 1762: 0x52C6, - 1763: 0x52C8, - 1764: 0x52CC, - 1765: 0x52CF, - 1766: 0x52D1, - 1767: 0x52D4, - 1768: 0x52D6, - 1769: 0x52DB, - 1770: 0x52DC, - 1771: 0x52E1, - 1772: 0x52E5, - 1773: 0x52E8, - 1774: 0x52E9, - 1775: 0x52EA, - 1776: 0x52EC, - 1777: 0x52F0, - 1778: 0x52F1, - 1779: 0x52F4, - 1780: 0x52F6, - 1781: 0x52F7, - 1782: 0x5300, - 1783: 0x5303, - 1784: 0x530A, - 1785: 0x530B, - 1786: 0x530C, - 1787: 0x5311, - 1788: 0x5313, - 1789: 0x5318, - 1790: 0x531B, - 1791: 0x531C, - 1792: 0x531E, - 1793: 0x531F, - 1794: 0x5325, - 1795: 0x5327, - 1796: 0x5328, - 1797: 0x5329, - 1798: 0x532B, - 1799: 0x532C, - 1800: 0x532D, - 1801: 0x5330, - 1802: 0x5332, - 1803: 0x5335, - 1804: 0x533C, - 1805: 0x533D, - 1806: 0x533E, - 1807: 0x5342, - 1808: 0x534C, - 1809: 0x534B, - 1810: 0x5359, - 1811: 0x535B, - 1812: 0x5361, - 1813: 0x5363, - 1814: 0x5365, - 1815: 0x536C, - 1816: 0x536D, - 1817: 0x5372, - 1818: 0x5379, - 1819: 0x537E, - 1820: 0x5383, - 1821: 0x5387, - 1822: 0x5388, - 1823: 0x538E, - 1824: 0x5393, - 1825: 0x5394, - 1826: 0x5399, - 1827: 0x539D, - 1828: 0x53A1, - 1829: 0x53A4, - 1830: 0x53AA, - 1831: 0x53AB, - 1832: 0x53AF, - 1833: 0x53B2, - 1834: 0x53B4, - 1835: 0x53B5, - 1836: 0x53B7, - 1837: 0x53B8, - 1838: 0x53BA, - 1839: 0x53BD, - 1840: 0x53C0, - 1841: 0x53C5, - 1842: 0x53CF, - 1843: 0x53D2, - 1844: 0x53D3, - 1845: 0x53D5, - 1846: 0x53DA, - 1847: 0x53DD, - 1848: 0x53DE, - 1849: 0x53E0, - 1850: 0x53E6, - 1851: 0x53E7, - 1852: 0x53F5, - 1853: 0x5402, - 1854: 0x5413, - 1855: 0x541A, - 1856: 0x5421, - 1857: 0x5427, - 1858: 0x5428, - 1859: 0x542A, - 1860: 0x542F, - 1861: 0x5431, - 1862: 0x5434, - 1863: 0x5435, - 1864: 0x5443, - 1865: 0x5444, - 1866: 0x5447, - 1867: 0x544D, - 1868: 0x544F, - 1869: 0x545E, - 1870: 0x5462, - 1871: 0x5464, - 1872: 0x5466, - 1873: 0x5467, - 1874: 0x5469, - 1875: 0x546B, - 1876: 0x546D, - 1877: 0x546E, - 1878: 0x5474, - 1879: 0x547F, - 1880: 0x5481, - 1881: 0x5483, - 1882: 0x5485, - 1883: 0x5488, - 1884: 0x5489, - 1885: 0x548D, - 1886: 0x5491, - 1887: 0x5495, - 1888: 0x5496, - 1889: 0x549C, - 1890: 0x549F, - 1891: 0x54A1, - 1892: 0x54A6, - 1893: 0x54A7, - 1894: 0x54A9, - 1895: 0x54AA, - 1896: 0x54AD, - 1897: 0x54AE, - 1898: 0x54B1, - 1899: 0x54B7, - 1900: 0x54B9, - 1901: 0x54BA, - 1902: 0x54BB, - 1903: 0x54BF, - 1904: 0x54C6, - 1905: 0x54CA, - 1906: 0x54CD, - 1907: 0x54CE, - 1908: 0x54E0, - 1909: 0x54EA, - 1910: 0x54EC, - 1911: 0x54EF, - 1912: 0x54F6, - 1913: 0x54FC, - 1914: 0x54FE, - 1915: 0x54FF, - 1916: 0x5500, - 1917: 0x5501, - 1918: 0x5505, - 1919: 0x5508, - 1920: 0x5509, - 1921: 0x550C, - 1922: 0x550D, - 1923: 0x550E, - 1924: 0x5515, - 1925: 0x552A, - 1926: 0x552B, - 1927: 0x5532, - 1928: 0x5535, - 1929: 0x5536, - 1930: 0x553B, - 1931: 0x553C, - 1932: 0x553D, - 1933: 0x5541, - 1934: 0x5547, - 1935: 0x5549, - 1936: 0x554A, - 1937: 0x554D, - 1938: 0x5550, - 1939: 0x5551, - 1940: 0x5558, - 1941: 0x555A, - 1942: 0x555B, - 1943: 0x555E, - 1944: 0x5560, - 1945: 0x5561, - 1946: 0x5564, - 1947: 0x5566, - 1948: 0x557F, - 1949: 0x5581, - 1950: 0x5582, - 1951: 0x5586, - 1952: 0x5588, - 1953: 0x558E, - 1954: 0x558F, - 1955: 0x5591, - 1956: 0x5592, - 1957: 0x5593, - 1958: 0x5594, - 1959: 0x5597, - 1960: 0x55A3, - 1961: 0x55A4, - 1962: 0x55AD, - 1963: 0x55B2, - 1964: 0x55BF, - 1965: 0x55C1, - 1966: 0x55C3, - 1967: 0x55C6, - 1968: 0x55C9, - 1969: 0x55CB, - 1970: 0x55CC, - 1971: 0x55CE, - 1972: 0x55D1, - 1973: 0x55D2, - 1974: 0x55D3, - 1975: 0x55D7, - 1976: 0x55D8, - 1977: 0x55DB, - 1978: 0x55DE, - 1979: 0x55E2, - 1980: 0x55E9, - 1981: 0x55F6, - 1982: 0x55FF, - 1983: 0x5605, - 1984: 0x5608, - 1985: 0x560A, - 1986: 0x560D, - 1987: 0x560E, - 1988: 0x560F, - 1989: 0x5610, - 1990: 0x5611, - 1991: 0x5612, - 1992: 0x5619, - 1993: 0x562C, - 1994: 0x5630, - 1995: 0x5633, - 1996: 0x5635, - 1997: 0x5637, - 1998: 0x5639, - 1999: 0x563B, - 2000: 0x563C, - 2001: 0x563D, - 2002: 0x563F, - 2003: 0x5640, - 2004: 0x5641, - 2005: 0x5643, - 2006: 0x5644, - 2007: 0x5646, - 2008: 0x5649, - 2009: 0x564B, - 2010: 0x564D, - 2011: 0x564F, - 2012: 0x5654, - 2013: 0x565E, - 2014: 0x5660, - 2015: 0x5661, - 2016: 0x5662, - 2017: 0x5663, - 2018: 0x5666, - 2019: 0x5669, - 2020: 0x566D, - 2021: 0x566F, - 2022: 0x5671, - 2023: 0x5672, - 2024: 0x5675, - 2025: 0x5684, - 2026: 0x5685, - 2027: 0x5688, - 2028: 0x568B, - 2029: 0x568C, - 2030: 0x5695, - 2031: 0x5699, - 2032: 0x569A, - 2033: 0x569D, - 2034: 0x569E, - 2035: 0x569F, - 2036: 0x56A6, - 2037: 0x56A7, - 2038: 0x56A8, - 2039: 0x56A9, - 2040: 0x56AB, - 2041: 0x56AC, - 2042: 0x56AD, - 2043: 0x56B1, - 2044: 0x56B3, - 2045: 0x56B7, - 2046: 0x56BE, - 2047: 0x56C5, - 2048: 0x56C9, - 2049: 0x56CA, - 2050: 0x56CB, - 2051: 0x56CF, - 2052: 0x56D0, - 2053: 0x56CC, - 2054: 0x56CD, - 2055: 0x56D9, - 2056: 0x56DC, - 2057: 0x56DD, - 2058: 0x56DF, - 2059: 0x56E1, - 2060: 0x56E4, - 2061: 0x56E5, - 2062: 0x56E6, - 2063: 0x56E7, - 2064: 0x56E8, - 2065: 0x56F1, - 2066: 0x56EB, - 2067: 0x56ED, - 2068: 0x56F6, - 2069: 0x56F7, - 2070: 0x5701, - 2071: 0x5702, - 2072: 0x5707, - 2073: 0x570A, - 2074: 0x570C, - 2075: 0x5711, - 2076: 0x5715, - 2077: 0x571A, - 2078: 0x571B, - 2079: 0x571D, - 2080: 0x5720, - 2081: 0x5722, - 2082: 0x5723, - 2083: 0x5724, - 2084: 0x5725, - 2085: 0x5729, - 2086: 0x572A, - 2087: 0x572C, - 2088: 0x572E, - 2089: 0x572F, - 2090: 0x5733, - 2091: 0x5734, - 2092: 0x573D, - 2093: 0x573E, - 2094: 0x573F, - 2095: 0x5745, - 2096: 0x5746, - 2097: 0x574C, - 2098: 0x574D, - 2099: 0x5752, - 2100: 0x5762, - 2101: 0x5765, - 2102: 0x5767, - 2103: 0x5768, - 2104: 0x576B, - 2105: 0x576D, - 2106: 0x576E, - 2107: 0x576F, - 2108: 0x5770, - 2109: 0x5771, - 2110: 0x5773, - 2111: 0x5774, - 2112: 0x5775, - 2113: 0x5777, - 2114: 0x5779, - 2115: 0x577A, - 2116: 0x577B, - 2117: 0x577C, - 2118: 0x577E, - 2119: 0x5781, - 2120: 0x5783, - 2121: 0x578C, - 2122: 0x5794, - 2123: 0x5797, - 2124: 0x5799, - 2125: 0x579A, - 2126: 0x579C, - 2127: 0x579D, - 2128: 0x579E, - 2129: 0x579F, - 2130: 0x57A1, - 2131: 0x5795, - 2132: 0x57A7, - 2133: 0x57A8, - 2134: 0x57A9, - 2135: 0x57AC, - 2136: 0x57B8, - 2137: 0x57BD, - 2138: 0x57C7, - 2139: 0x57C8, - 2140: 0x57CC, - 2141: 0x57CF, - 2142: 0x57D5, - 2143: 0x57DD, - 2144: 0x57DE, - 2145: 0x57E4, - 2146: 0x57E6, - 2147: 0x57E7, - 2148: 0x57E9, - 2149: 0x57ED, - 2150: 0x57F0, - 2151: 0x57F5, - 2152: 0x57F6, - 2153: 0x57F8, - 2154: 0x57FD, - 2155: 0x57FE, - 2156: 0x57FF, - 2157: 0x5803, - 2158: 0x5804, - 2159: 0x5808, - 2160: 0x5809, - 2161: 0x57E1, - 2162: 0x580C, - 2163: 0x580D, - 2164: 0x581B, - 2165: 0x581E, - 2166: 0x581F, - 2167: 0x5820, - 2168: 0x5826, - 2169: 0x5827, - 2170: 0x582D, - 2171: 0x5832, - 2172: 0x5839, - 2173: 0x583F, - 2174: 0x5849, - 2175: 0x584C, - 2176: 0x584D, - 2177: 0x584F, - 2178: 0x5850, - 2179: 0x5855, - 2180: 0x585F, - 2181: 0x5861, - 2182: 0x5864, - 2183: 0x5867, - 2184: 0x5868, - 2185: 0x5878, - 2186: 0x587C, - 2187: 0x587F, - 2188: 0x5880, - 2189: 0x5881, - 2190: 0x5887, - 2191: 0x5888, - 2192: 0x5889, - 2193: 0x588A, - 2194: 0x588C, - 2195: 0x588D, - 2196: 0x588F, - 2197: 0x5890, - 2198: 0x5894, - 2199: 0x5896, - 2200: 0x589D, - 2201: 0x58A0, - 2202: 0x58A1, - 2203: 0x58A2, - 2204: 0x58A6, - 2205: 0x58A9, - 2206: 0x58B1, - 2207: 0x58B2, - 2208: 0x58C4, - 2209: 0x58BC, - 2210: 0x58C2, - 2211: 0x58C8, - 2212: 0x58CD, - 2213: 0x58CE, - 2214: 0x58D0, - 2215: 0x58D2, - 2216: 0x58D4, - 2217: 0x58D6, - 2218: 0x58DA, - 2219: 0x58DD, - 2220: 0x58E1, - 2221: 0x58E2, - 2222: 0x58E9, - 2223: 0x58F3, - 2224: 0x5905, - 2225: 0x5906, - 2226: 0x590B, - 2227: 0x590C, - 2228: 0x5912, - 2229: 0x5913, - 2230: 0x5914, - 2231: 0x8641, - 2232: 0x591D, - 2233: 0x5921, - 2234: 0x5923, - 2235: 0x5924, - 2236: 0x5928, - 2237: 0x592F, - 2238: 0x5930, - 2239: 0x5933, - 2240: 0x5935, - 2241: 0x5936, - 2242: 0x593F, - 2243: 0x5943, - 2244: 0x5946, - 2245: 0x5952, - 2246: 0x5953, - 2247: 0x5959, - 2248: 0x595B, - 2249: 0x595D, - 2250: 0x595E, - 2251: 0x595F, - 2252: 0x5961, - 2253: 0x5963, - 2254: 0x596B, - 2255: 0x596D, - 2256: 0x596F, - 2257: 0x5972, - 2258: 0x5975, - 2259: 0x5976, - 2260: 0x5979, - 2261: 0x597B, - 2262: 0x597C, - 2263: 0x598B, - 2264: 0x598C, - 2265: 0x598E, - 2266: 0x5992, - 2267: 0x5995, - 2268: 0x5997, - 2269: 0x599F, - 2270: 0x59A4, - 2271: 0x59A7, - 2272: 0x59AD, - 2273: 0x59AE, - 2274: 0x59AF, - 2275: 0x59B0, - 2276: 0x59B3, - 2277: 0x59B7, - 2278: 0x59BA, - 2279: 0x59BC, - 2280: 0x59C1, - 2281: 0x59C3, - 2282: 0x59C4, - 2283: 0x59C8, - 2284: 0x59CA, - 2285: 0x59CD, - 2286: 0x59D2, - 2287: 0x59DD, - 2288: 0x59DE, - 2289: 0x59DF, - 2290: 0x59E3, - 2291: 0x59E4, - 2292: 0x59E7, - 2293: 0x59EE, - 2294: 0x59EF, - 2295: 0x59F1, - 2296: 0x59F2, - 2297: 0x59F4, - 2298: 0x59F7, - 2299: 0x5A00, - 2300: 0x5A04, - 2301: 0x5A0C, - 2302: 0x5A0D, - 2303: 0x5A0E, - 2304: 0x5A12, - 2305: 0x5A13, - 2306: 0x5A1E, - 2307: 0x5A23, - 2308: 0x5A24, - 2309: 0x5A27, - 2310: 0x5A28, - 2311: 0x5A2A, - 2312: 0x5A2D, - 2313: 0x5A30, - 2314: 0x5A44, - 2315: 0x5A45, - 2316: 0x5A47, - 2317: 0x5A48, - 2318: 0x5A4C, - 2319: 0x5A50, - 2320: 0x5A55, - 2321: 0x5A5E, - 2322: 0x5A63, - 2323: 0x5A65, - 2324: 0x5A67, - 2325: 0x5A6D, - 2326: 0x5A77, - 2327: 0x5A7A, - 2328: 0x5A7B, - 2329: 0x5A7E, - 2330: 0x5A8B, - 2331: 0x5A90, - 2332: 0x5A93, - 2333: 0x5A96, - 2334: 0x5A99, - 2335: 0x5A9C, - 2336: 0x5A9E, - 2337: 0x5A9F, - 2338: 0x5AA0, - 2339: 0x5AA2, - 2340: 0x5AA7, - 2341: 0x5AAC, - 2342: 0x5AB1, - 2343: 0x5AB2, - 2344: 0x5AB3, - 2345: 0x5AB5, - 2346: 0x5AB8, - 2347: 0x5ABA, - 2348: 0x5ABB, - 2349: 0x5ABF, - 2350: 0x5AC4, - 2351: 0x5AC6, - 2352: 0x5AC8, - 2353: 0x5ACF, - 2354: 0x5ADA, - 2355: 0x5ADC, - 2356: 0x5AE0, - 2357: 0x5AE5, - 2358: 0x5AEA, - 2359: 0x5AEE, - 2360: 0x5AF5, - 2361: 0x5AF6, - 2362: 0x5AFD, - 2363: 0x5B00, - 2364: 0x5B01, - 2365: 0x5B08, - 2366: 0x5B17, - 2367: 0x5B34, - 2368: 0x5B19, - 2369: 0x5B1B, - 2370: 0x5B1D, - 2371: 0x5B21, - 2372: 0x5B25, - 2373: 0x5B2D, - 2374: 0x5B38, - 2375: 0x5B41, - 2376: 0x5B4B, - 2377: 0x5B4C, - 2378: 0x5B52, - 2379: 0x5B56, - 2380: 0x5B5E, - 2381: 0x5B68, - 2382: 0x5B6E, - 2383: 0x5B6F, - 2384: 0x5B7C, - 2385: 0x5B7D, - 2386: 0x5B7E, - 2387: 0x5B7F, - 2388: 0x5B81, - 2389: 0x5B84, - 2390: 0x5B86, - 2391: 0x5B8A, - 2392: 0x5B8E, - 2393: 0x5B90, - 2394: 0x5B91, - 2395: 0x5B93, - 2396: 0x5B94, - 2397: 0x5B96, - 2398: 0x5BA8, - 2399: 0x5BA9, - 2400: 0x5BAC, - 2401: 0x5BAD, - 2402: 0x5BAF, - 2403: 0x5BB1, - 2404: 0x5BB2, - 2405: 0x5BB7, - 2406: 0x5BBA, - 2407: 0x5BBC, - 2408: 0x5BC0, - 2409: 0x5BC1, - 2410: 0x5BCD, - 2411: 0x5BCF, - 2412: 0x5BD6, - 2413: 0x5BD7, - 2414: 0x5BD8, - 2415: 0x5BD9, - 2416: 0x5BDA, - 2417: 0x5BE0, - 2418: 0x5BEF, - 2419: 0x5BF1, - 2420: 0x5BF4, - 2421: 0x5BFD, - 2422: 0x5C0C, - 2423: 0x5C17, - 2424: 0x5C1E, - 2425: 0x5C1F, - 2426: 0x5C23, - 2427: 0x5C26, - 2428: 0x5C29, - 2429: 0x5C2B, - 2430: 0x5C2C, - 2431: 0x5C2E, - 2432: 0x5C30, - 2433: 0x5C32, - 2434: 0x5C35, - 2435: 0x5C36, - 2436: 0x5C59, - 2437: 0x5C5A, - 2438: 0x5C5C, - 2439: 0x5C62, - 2440: 0x5C63, - 2441: 0x5C67, - 2442: 0x5C68, - 2443: 0x5C69, - 2444: 0x5C6D, - 2445: 0x5C70, - 2446: 0x5C74, - 2447: 0x5C75, - 2448: 0x5C7A, - 2449: 0x5C7B, - 2450: 0x5C7C, - 2451: 0x5C7D, - 2452: 0x5C87, - 2453: 0x5C88, - 2454: 0x5C8A, - 2455: 0x5C8F, - 2456: 0x5C92, - 2457: 0x5C9D, - 2458: 0x5C9F, - 2459: 0x5CA0, - 2460: 0x5CA2, - 2461: 0x5CA3, - 2462: 0x5CA6, - 2463: 0x5CAA, - 2464: 0x5CB2, - 2465: 0x5CB4, - 2466: 0x5CB5, - 2467: 0x5CBA, - 2468: 0x5CC9, - 2469: 0x5CCB, - 2470: 0x5CD2, - 2471: 0x5CDD, - 2472: 0x5CD7, - 2473: 0x5CEE, - 2474: 0x5CF1, - 2475: 0x5CF2, - 2476: 0x5CF4, - 2477: 0x5D01, - 2478: 0x5D06, - 2479: 0x5D0D, - 2480: 0x5D12, - 2481: 0x5D2B, - 2482: 0x5D23, - 2483: 0x5D24, - 2484: 0x5D26, - 2485: 0x5D27, - 2486: 0x5D31, - 2487: 0x5D34, - 2488: 0x5D39, - 2489: 0x5D3D, - 2490: 0x5D3F, - 2491: 0x5D42, - 2492: 0x5D43, - 2493: 0x5D46, - 2494: 0x5D48, - 2495: 0x5D55, - 2496: 0x5D51, - 2497: 0x5D59, - 2498: 0x5D4A, - 2499: 0x5D5F, - 2500: 0x5D60, - 2501: 0x5D61, - 2502: 0x5D62, - 2503: 0x5D64, - 2504: 0x5D6A, - 2505: 0x5D6D, - 2506: 0x5D70, - 2507: 0x5D79, - 2508: 0x5D7A, - 2509: 0x5D7E, - 2510: 0x5D7F, - 2511: 0x5D81, - 2512: 0x5D83, - 2513: 0x5D88, - 2514: 0x5D8A, - 2515: 0x5D92, - 2516: 0x5D93, - 2517: 0x5D94, - 2518: 0x5D95, - 2519: 0x5D99, - 2520: 0x5D9B, - 2521: 0x5D9F, - 2522: 0x5DA0, - 2523: 0x5DA7, - 2524: 0x5DAB, - 2525: 0x5DB0, - 2526: 0x5DB4, - 2527: 0x5DB8, - 2528: 0x5DB9, - 2529: 0x5DC3, - 2530: 0x5DC7, - 2531: 0x5DCB, - 2532: 0x5DD0, - 2533: 0x5DCE, - 2534: 0x5DD8, - 2535: 0x5DD9, - 2536: 0x5DE0, - 2537: 0x5DE4, - 2538: 0x5DE9, - 2539: 0x5DF8, - 2540: 0x5DF9, - 2541: 0x5E00, - 2542: 0x5E07, - 2543: 0x5E0D, - 2544: 0x5E12, - 2545: 0x5E14, - 2546: 0x5E15, - 2547: 0x5E18, - 2548: 0x5E1F, - 2549: 0x5E20, - 2550: 0x5E2E, - 2551: 0x5E28, - 2552: 0x5E32, - 2553: 0x5E35, - 2554: 0x5E3E, - 2555: 0x5E4B, - 2556: 0x5E50, - 2557: 0x5E49, - 2558: 0x5E51, - 2559: 0x5E56, - 2560: 0x5E58, - 2561: 0x5E5B, - 2562: 0x5E5C, - 2563: 0x5E5E, - 2564: 0x5E68, - 2565: 0x5E6A, - 2566: 0x5E6B, - 2567: 0x5E6C, - 2568: 0x5E6D, - 2569: 0x5E6E, - 2570: 0x5E70, - 2571: 0x5E80, - 2572: 0x5E8B, - 2573: 0x5E8E, - 2574: 0x5EA2, - 2575: 0x5EA4, - 2576: 0x5EA5, - 2577: 0x5EA8, - 2578: 0x5EAA, - 2579: 0x5EAC, - 2580: 0x5EB1, - 2581: 0x5EB3, - 2582: 0x5EBD, - 2583: 0x5EBE, - 2584: 0x5EBF, - 2585: 0x5EC6, - 2586: 0x5ECC, - 2587: 0x5ECB, - 2588: 0x5ECE, - 2589: 0x5ED1, - 2590: 0x5ED2, - 2591: 0x5ED4, - 2592: 0x5ED5, - 2593: 0x5EDC, - 2594: 0x5EDE, - 2595: 0x5EE5, - 2596: 0x5EEB, - 2597: 0x5F02, - 2598: 0x5F06, - 2599: 0x5F07, - 2600: 0x5F08, - 2601: 0x5F0E, - 2602: 0x5F19, - 2603: 0x5F1C, - 2604: 0x5F1D, - 2605: 0x5F21, - 2606: 0x5F22, - 2607: 0x5F23, - 2608: 0x5F24, - 2609: 0x5F28, - 2610: 0x5F2B, - 2611: 0x5F2C, - 2612: 0x5F2E, - 2613: 0x5F30, - 2614: 0x5F34, - 2615: 0x5F36, - 2616: 0x5F3B, - 2617: 0x5F3D, - 2618: 0x5F3F, - 2619: 0x5F40, - 2620: 0x5F44, - 2621: 0x5F45, - 2622: 0x5F47, - 2623: 0x5F4D, - 2624: 0x5F50, - 2625: 0x5F54, - 2626: 0x5F58, - 2627: 0x5F5B, - 2628: 0x5F60, - 2629: 0x5F63, - 2630: 0x5F64, - 2631: 0x5F67, - 2632: 0x5F6F, - 2633: 0x5F72, - 2634: 0x5F74, - 2635: 0x5F75, - 2636: 0x5F78, - 2637: 0x5F7A, - 2638: 0x5F7D, - 2639: 0x5F7E, - 2640: 0x5F89, - 2641: 0x5F8D, - 2642: 0x5F8F, - 2643: 0x5F96, - 2644: 0x5F9C, - 2645: 0x5F9D, - 2646: 0x5FA2, - 2647: 0x5FA7, - 2648: 0x5FAB, - 2649: 0x5FA4, - 2650: 0x5FAC, - 2651: 0x5FAF, - 2652: 0x5FB0, - 2653: 0x5FB1, - 2654: 0x5FB8, - 2655: 0x5FC4, - 2656: 0x5FC7, - 2657: 0x5FC8, - 2658: 0x5FC9, - 2659: 0x5FCB, - 2660: 0x5FD0, - 2661: 0x5FD1, - 2662: 0x5FD2, - 2663: 0x5FD3, - 2664: 0x5FD4, - 2665: 0x5FDE, - 2666: 0x5FE1, - 2667: 0x5FE2, - 2668: 0x5FE8, - 2669: 0x5FE9, - 2670: 0x5FEA, - 2671: 0x5FEC, - 2672: 0x5FED, - 2673: 0x5FEE, - 2674: 0x5FEF, - 2675: 0x5FF2, - 2676: 0x5FF3, - 2677: 0x5FF6, - 2678: 0x5FFA, - 2679: 0x5FFC, - 2680: 0x6007, - 2681: 0x600A, - 2682: 0x600D, - 2683: 0x6013, - 2684: 0x6014, - 2685: 0x6017, - 2686: 0x6018, - 2687: 0x601A, - 2688: 0x601F, - 2689: 0x6024, - 2690: 0x602D, - 2691: 0x6033, - 2692: 0x6035, - 2693: 0x6040, - 2694: 0x6047, - 2695: 0x6048, - 2696: 0x6049, - 2697: 0x604C, - 2698: 0x6051, - 2699: 0x6054, - 2700: 0x6056, - 2701: 0x6057, - 2702: 0x605D, - 2703: 0x6061, - 2704: 0x6067, - 2705: 0x6071, - 2706: 0x607E, - 2707: 0x607F, - 2708: 0x6082, - 2709: 0x6086, - 2710: 0x6088, - 2711: 0x608A, - 2712: 0x608E, - 2713: 0x6091, - 2714: 0x6093, - 2715: 0x6095, - 2716: 0x6098, - 2717: 0x609D, - 2718: 0x609E, - 2719: 0x60A2, - 2720: 0x60A4, - 2721: 0x60A5, - 2722: 0x60A8, - 2723: 0x60B0, - 2724: 0x60B1, - 2725: 0x60B7, - 2726: 0x60BB, - 2727: 0x60BE, - 2728: 0x60C2, - 2729: 0x60C4, - 2730: 0x60C8, - 2731: 0x60C9, - 2732: 0x60CA, - 2733: 0x60CB, - 2734: 0x60CE, - 2735: 0x60CF, - 2736: 0x60D4, - 2737: 0x60D5, - 2738: 0x60D9, - 2739: 0x60DB, - 2740: 0x60DD, - 2741: 0x60DE, - 2742: 0x60E2, - 2743: 0x60E5, - 2744: 0x60F2, - 2745: 0x60F5, - 2746: 0x60F8, - 2747: 0x60FC, - 2748: 0x60FD, - 2749: 0x6102, - 2750: 0x6107, - 2751: 0x610A, - 2752: 0x610C, - 2753: 0x6110, - 2754: 0x6111, - 2755: 0x6112, - 2756: 0x6113, - 2757: 0x6114, - 2758: 0x6116, - 2759: 0x6117, - 2760: 0x6119, - 2761: 0x611C, - 2762: 0x611E, - 2763: 0x6122, - 2764: 0x612A, - 2765: 0x612B, - 2766: 0x6130, - 2767: 0x6131, - 2768: 0x6135, - 2769: 0x6136, - 2770: 0x6137, - 2771: 0x6139, - 2772: 0x6141, - 2773: 0x6145, - 2774: 0x6146, - 2775: 0x6149, - 2776: 0x615E, - 2777: 0x6160, - 2778: 0x616C, - 2779: 0x6172, - 2780: 0x6178, - 2781: 0x617B, - 2782: 0x617C, - 2783: 0x617F, - 2784: 0x6180, - 2785: 0x6181, - 2786: 0x6183, - 2787: 0x6184, - 2788: 0x618B, - 2789: 0x618D, - 2790: 0x6192, - 2791: 0x6193, - 2792: 0x6197, - 2793: 0x6198, - 2794: 0x619C, - 2795: 0x619D, - 2796: 0x619F, - 2797: 0x61A0, - 2798: 0x61A5, - 2799: 0x61A8, - 2800: 0x61AA, - 2801: 0x61AD, - 2802: 0x61B8, - 2803: 0x61B9, - 2804: 0x61BC, - 2805: 0x61C0, - 2806: 0x61C1, - 2807: 0x61C2, - 2808: 0x61CE, - 2809: 0x61CF, - 2810: 0x61D5, - 2811: 0x61DC, - 2812: 0x61DD, - 2813: 0x61DE, - 2814: 0x61DF, - 2815: 0x61E1, - 2816: 0x61E2, - 2817: 0x61E7, - 2818: 0x61E9, - 2819: 0x61E5, - 2820: 0x61EC, - 2821: 0x61ED, - 2822: 0x61EF, - 2823: 0x6201, - 2824: 0x6203, - 2825: 0x6204, - 2826: 0x6207, - 2827: 0x6213, - 2828: 0x6215, - 2829: 0x621C, - 2830: 0x6220, - 2831: 0x6222, - 2832: 0x6223, - 2833: 0x6227, - 2834: 0x6229, - 2835: 0x622B, - 2836: 0x6239, - 2837: 0x623D, - 2838: 0x6242, - 2839: 0x6243, - 2840: 0x6244, - 2841: 0x6246, - 2842: 0x624C, - 2843: 0x6250, - 2844: 0x6251, - 2845: 0x6252, - 2846: 0x6254, - 2847: 0x6256, - 2848: 0x625A, - 2849: 0x625C, - 2850: 0x6264, - 2851: 0x626D, - 2852: 0x626F, - 2853: 0x6273, - 2854: 0x627A, - 2855: 0x627D, - 2856: 0x628D, - 2857: 0x628E, - 2858: 0x628F, - 2859: 0x6290, - 2860: 0x62A6, - 2861: 0x62A8, - 2862: 0x62B3, - 2863: 0x62B6, - 2864: 0x62B7, - 2865: 0x62BA, - 2866: 0x62BE, - 2867: 0x62BF, - 2868: 0x62C4, - 2869: 0x62CE, - 2870: 0x62D5, - 2871: 0x62D6, - 2872: 0x62DA, - 2873: 0x62EA, - 2874: 0x62F2, - 2875: 0x62F4, - 2876: 0x62FC, - 2877: 0x62FD, - 2878: 0x6303, - 2879: 0x6304, - 2880: 0x630A, - 2881: 0x630B, - 2882: 0x630D, - 2883: 0x6310, - 2884: 0x6313, - 2885: 0x6316, - 2886: 0x6318, - 2887: 0x6329, - 2888: 0x632A, - 2889: 0x632D, - 2890: 0x6335, - 2891: 0x6336, - 2892: 0x6339, - 2893: 0x633C, - 2894: 0x6341, - 2895: 0x6342, - 2896: 0x6343, - 2897: 0x6344, - 2898: 0x6346, - 2899: 0x634A, - 2900: 0x634B, - 2901: 0x634E, - 2902: 0x6352, - 2903: 0x6353, - 2904: 0x6354, - 2905: 0x6358, - 2906: 0x635B, - 2907: 0x6365, - 2908: 0x6366, - 2909: 0x636C, - 2910: 0x636D, - 2911: 0x6371, - 2912: 0x6374, - 2913: 0x6375, - 2914: 0x6378, - 2915: 0x637C, - 2916: 0x637D, - 2917: 0x637F, - 2918: 0x6382, - 2919: 0x6384, - 2920: 0x6387, - 2921: 0x638A, - 2922: 0x6390, - 2923: 0x6394, - 2924: 0x6395, - 2925: 0x6399, - 2926: 0x639A, - 2927: 0x639E, - 2928: 0x63A4, - 2929: 0x63A6, - 2930: 0x63AD, - 2931: 0x63AE, - 2932: 0x63AF, - 2933: 0x63BD, - 2934: 0x63C1, - 2935: 0x63C5, - 2936: 0x63C8, - 2937: 0x63CE, - 2938: 0x63D1, - 2939: 0x63D3, - 2940: 0x63D4, - 2941: 0x63D5, - 2942: 0x63DC, - 2943: 0x63E0, - 2944: 0x63E5, - 2945: 0x63EA, - 2946: 0x63EC, - 2947: 0x63F2, - 2948: 0x63F3, - 2949: 0x63F5, - 2950: 0x63F8, - 2951: 0x63F9, - 2952: 0x6409, - 2953: 0x640A, - 2954: 0x6410, - 2955: 0x6412, - 2956: 0x6414, - 2957: 0x6418, - 2958: 0x641E, - 2959: 0x6420, - 2960: 0x6422, - 2961: 0x6424, - 2962: 0x6425, - 2963: 0x6429, - 2964: 0x642A, - 2965: 0x642F, - 2966: 0x6430, - 2967: 0x6435, - 2968: 0x643D, - 2969: 0x643F, - 2970: 0x644B, - 2971: 0x644F, - 2972: 0x6451, - 2973: 0x6452, - 2974: 0x6453, - 2975: 0x6454, - 2976: 0x645A, - 2977: 0x645B, - 2978: 0x645C, - 2979: 0x645D, - 2980: 0x645F, - 2981: 0x6460, - 2982: 0x6461, - 2983: 0x6463, - 2984: 0x646D, - 2985: 0x6473, - 2986: 0x6474, - 2987: 0x647B, - 2988: 0x647D, - 2989: 0x6485, - 2990: 0x6487, - 2991: 0x648F, - 2992: 0x6490, - 2993: 0x6491, - 2994: 0x6498, - 2995: 0x6499, - 2996: 0x649B, - 2997: 0x649D, - 2998: 0x649F, - 2999: 0x64A1, - 3000: 0x64A3, - 3001: 0x64A6, - 3002: 0x64A8, - 3003: 0x64AC, - 3004: 0x64B3, - 3005: 0x64BD, - 3006: 0x64BE, - 3007: 0x64BF, - 3008: 0x64C4, - 3009: 0x64C9, - 3010: 0x64CA, - 3011: 0x64CB, - 3012: 0x64CC, - 3013: 0x64CE, - 3014: 0x64D0, - 3015: 0x64D1, - 3016: 0x64D5, - 3017: 0x64D7, - 3018: 0x64E4, - 3019: 0x64E5, - 3020: 0x64E9, - 3021: 0x64EA, - 3022: 0x64ED, - 3023: 0x64F0, - 3024: 0x64F5, - 3025: 0x64F7, - 3026: 0x64FB, - 3027: 0x64FF, - 3028: 0x6501, - 3029: 0x6504, - 3030: 0x6508, - 3031: 0x6509, - 3032: 0x650A, - 3033: 0x650F, - 3034: 0x6513, - 3035: 0x6514, - 3036: 0x6516, - 3037: 0x6519, - 3038: 0x651B, - 3039: 0x651E, - 3040: 0x651F, - 3041: 0x6522, - 3042: 0x6526, - 3043: 0x6529, - 3044: 0x652E, - 3045: 0x6531, - 3046: 0x653A, - 3047: 0x653C, - 3048: 0x653D, - 3049: 0x6543, - 3050: 0x6547, - 3051: 0x6549, - 3052: 0x6550, - 3053: 0x6552, - 3054: 0x6554, - 3055: 0x655F, - 3056: 0x6560, - 3057: 0x6567, - 3058: 0x656B, - 3059: 0x657A, - 3060: 0x657D, - 3061: 0x6581, - 3062: 0x6585, - 3063: 0x658A, - 3064: 0x6592, - 3065: 0x6595, - 3066: 0x6598, - 3067: 0x659D, - 3068: 0x65A0, - 3069: 0x65A3, - 3070: 0x65A6, - 3071: 0x65AE, - 3072: 0x65B2, - 3073: 0x65B3, - 3074: 0x65B4, - 3075: 0x65BF, - 3076: 0x65C2, - 3077: 0x65C8, - 3078: 0x65C9, - 3079: 0x65CE, - 3080: 0x65D0, - 3081: 0x65D4, - 3082: 0x65D6, - 3083: 0x65D8, - 3084: 0x65DF, - 3085: 0x65F0, - 3086: 0x65F2, - 3087: 0x65F4, - 3088: 0x65F5, - 3089: 0x65F9, - 3090: 0x65FE, - 3091: 0x65FF, - 3092: 0x6600, - 3093: 0x6604, - 3094: 0x6608, - 3095: 0x6609, - 3096: 0x660D, - 3097: 0x6611, - 3098: 0x6612, - 3099: 0x6615, - 3100: 0x6616, - 3101: 0x661D, - 3102: 0x661E, - 3103: 0x6621, - 3104: 0x6622, - 3105: 0x6623, - 3106: 0x6624, - 3107: 0x6626, - 3108: 0x6629, - 3109: 0x662A, - 3110: 0x662B, - 3111: 0x662C, - 3112: 0x662E, - 3113: 0x6630, - 3114: 0x6631, - 3115: 0x6633, - 3116: 0x6639, - 3117: 0x6637, - 3118: 0x6640, - 3119: 0x6645, - 3120: 0x6646, - 3121: 0x664A, - 3122: 0x664C, - 3123: 0x6651, - 3124: 0x664E, - 3125: 0x6657, - 3126: 0x6658, - 3127: 0x6659, - 3128: 0x665B, - 3129: 0x665C, - 3130: 0x6660, - 3131: 0x6661, - 3132: 0x66FB, - 3133: 0x666A, - 3134: 0x666B, - 3135: 0x666C, - 3136: 0x667E, - 3137: 0x6673, - 3138: 0x6675, - 3139: 0x667F, - 3140: 0x6677, - 3141: 0x6678, - 3142: 0x6679, - 3143: 0x667B, - 3144: 0x6680, - 3145: 0x667C, - 3146: 0x668B, - 3147: 0x668C, - 3148: 0x668D, - 3149: 0x6690, - 3150: 0x6692, - 3151: 0x6699, - 3152: 0x669A, - 3153: 0x669B, - 3154: 0x669C, - 3155: 0x669F, - 3156: 0x66A0, - 3157: 0x66A4, - 3158: 0x66AD, - 3159: 0x66B1, - 3160: 0x66B2, - 3161: 0x66B5, - 3162: 0x66BB, - 3163: 0x66BF, - 3164: 0x66C0, - 3165: 0x66C2, - 3166: 0x66C3, - 3167: 0x66C8, - 3168: 0x66CC, - 3169: 0x66CE, - 3170: 0x66CF, - 3171: 0x66D4, - 3172: 0x66DB, - 3173: 0x66DF, - 3174: 0x66E8, - 3175: 0x66EB, - 3176: 0x66EC, - 3177: 0x66EE, - 3178: 0x66FA, - 3179: 0x6705, - 3180: 0x6707, - 3181: 0x670E, - 3182: 0x6713, - 3183: 0x6719, - 3184: 0x671C, - 3185: 0x6720, - 3186: 0x6722, - 3187: 0x6733, - 3188: 0x673E, - 3189: 0x6745, - 3190: 0x6747, - 3191: 0x6748, - 3192: 0x674C, - 3193: 0x6754, - 3194: 0x6755, - 3195: 0x675D, - 3196: 0x6766, - 3197: 0x676C, - 3198: 0x676E, - 3199: 0x6774, - 3200: 0x6776, - 3201: 0x677B, - 3202: 0x6781, - 3203: 0x6784, - 3204: 0x678E, - 3205: 0x678F, - 3206: 0x6791, - 3207: 0x6793, - 3208: 0x6796, - 3209: 0x6798, - 3210: 0x6799, - 3211: 0x679B, - 3212: 0x67B0, - 3213: 0x67B1, - 3214: 0x67B2, - 3215: 0x67B5, - 3216: 0x67BB, - 3217: 0x67BC, - 3218: 0x67BD, - 3219: 0x67F9, - 3220: 0x67C0, - 3221: 0x67C2, - 3222: 0x67C3, - 3223: 0x67C5, - 3224: 0x67C8, - 3225: 0x67C9, - 3226: 0x67D2, - 3227: 0x67D7, - 3228: 0x67D9, - 3229: 0x67DC, - 3230: 0x67E1, - 3231: 0x67E6, - 3232: 0x67F0, - 3233: 0x67F2, - 3234: 0x67F6, - 3235: 0x67F7, - 3236: 0x6852, - 3237: 0x6814, - 3238: 0x6819, - 3239: 0x681D, - 3240: 0x681F, - 3241: 0x6828, - 3242: 0x6827, - 3243: 0x682C, - 3244: 0x682D, - 3245: 0x682F, - 3246: 0x6830, - 3247: 0x6831, - 3248: 0x6833, - 3249: 0x683B, - 3250: 0x683F, - 3251: 0x6844, - 3252: 0x6845, - 3253: 0x684A, - 3254: 0x684C, - 3255: 0x6855, - 3256: 0x6857, - 3257: 0x6858, - 3258: 0x685B, - 3259: 0x686B, - 3260: 0x686E, - 3261: 0x686F, - 3262: 0x6870, - 3263: 0x6871, - 3264: 0x6872, - 3265: 0x6875, - 3266: 0x6879, - 3267: 0x687A, - 3268: 0x687B, - 3269: 0x687C, - 3270: 0x6882, - 3271: 0x6884, - 3272: 0x6886, - 3273: 0x6888, - 3274: 0x6896, - 3275: 0x6898, - 3276: 0x689A, - 3277: 0x689C, - 3278: 0x68A1, - 3279: 0x68A3, - 3280: 0x68A5, - 3281: 0x68A9, - 3282: 0x68AA, - 3283: 0x68AE, - 3284: 0x68B2, - 3285: 0x68BB, - 3286: 0x68C5, - 3287: 0x68C8, - 3288: 0x68CC, - 3289: 0x68CF, - 3290: 0x68D0, - 3291: 0x68D1, - 3292: 0x68D3, - 3293: 0x68D6, - 3294: 0x68D9, - 3295: 0x68DC, - 3296: 0x68DD, - 3297: 0x68E5, - 3298: 0x68E8, - 3299: 0x68EA, - 3300: 0x68EB, - 3301: 0x68EC, - 3302: 0x68ED, - 3303: 0x68F0, - 3304: 0x68F1, - 3305: 0x68F5, - 3306: 0x68F6, - 3307: 0x68FB, - 3308: 0x68FC, - 3309: 0x68FD, - 3310: 0x6906, - 3311: 0x6909, - 3312: 0x690A, - 3313: 0x6910, - 3314: 0x6911, - 3315: 0x6913, - 3316: 0x6916, - 3317: 0x6917, - 3318: 0x6931, - 3319: 0x6933, - 3320: 0x6935, - 3321: 0x6938, - 3322: 0x693B, - 3323: 0x6942, - 3324: 0x6945, - 3325: 0x6949, - 3326: 0x694E, - 3327: 0x6957, - 3328: 0x695B, - 3329: 0x6963, - 3330: 0x6964, - 3331: 0x6965, - 3332: 0x6966, - 3333: 0x6968, - 3334: 0x6969, - 3335: 0x696C, - 3336: 0x6970, - 3337: 0x6971, - 3338: 0x6972, - 3339: 0x697A, - 3340: 0x697B, - 3341: 0x697F, - 3342: 0x6980, - 3343: 0x698D, - 3344: 0x6992, - 3345: 0x6996, - 3346: 0x6998, - 3347: 0x69A1, - 3348: 0x69A5, - 3349: 0x69A6, - 3350: 0x69A8, - 3351: 0x69AB, - 3352: 0x69AD, - 3353: 0x69AF, - 3354: 0x69B7, - 3355: 0x69B8, - 3356: 0x69BA, - 3357: 0x69BC, - 3358: 0x69C5, - 3359: 0x69C8, - 3360: 0x69D1, - 3361: 0x69D6, - 3362: 0x69D7, - 3363: 0x69E2, - 3364: 0x69E5, - 3365: 0x69EE, - 3366: 0x69EF, - 3367: 0x69F1, - 3368: 0x69F3, - 3369: 0x69F5, - 3370: 0x69FE, - 3371: 0x6A00, - 3372: 0x6A01, - 3373: 0x6A03, - 3374: 0x6A0F, - 3375: 0x6A11, - 3376: 0x6A15, - 3377: 0x6A1A, - 3378: 0x6A1D, - 3379: 0x6A20, - 3380: 0x6A24, - 3381: 0x6A28, - 3382: 0x6A30, - 3383: 0x6A32, - 3384: 0x6A34, - 3385: 0x6A37, - 3386: 0x6A3B, - 3387: 0x6A3E, - 3388: 0x6A3F, - 3389: 0x6A45, - 3390: 0x6A46, - 3391: 0x6A49, - 3392: 0x6A4A, - 3393: 0x6A4E, - 3394: 0x6A50, - 3395: 0x6A51, - 3396: 0x6A52, - 3397: 0x6A55, - 3398: 0x6A56, - 3399: 0x6A5B, - 3400: 0x6A64, - 3401: 0x6A67, - 3402: 0x6A6A, - 3403: 0x6A71, - 3404: 0x6A73, - 3405: 0x6A7E, - 3406: 0x6A81, - 3407: 0x6A83, - 3408: 0x6A86, - 3409: 0x6A87, - 3410: 0x6A89, - 3411: 0x6A8B, - 3412: 0x6A91, - 3413: 0x6A9B, - 3414: 0x6A9D, - 3415: 0x6A9E, - 3416: 0x6A9F, - 3417: 0x6AA5, - 3418: 0x6AAB, - 3419: 0x6AAF, - 3420: 0x6AB0, - 3421: 0x6AB1, - 3422: 0x6AB4, - 3423: 0x6ABD, - 3424: 0x6ABE, - 3425: 0x6ABF, - 3426: 0x6AC6, - 3427: 0x6AC9, - 3428: 0x6AC8, - 3429: 0x6ACC, - 3430: 0x6AD0, - 3431: 0x6AD4, - 3432: 0x6AD5, - 3433: 0x6AD6, - 3434: 0x6ADC, - 3435: 0x6ADD, - 3436: 0x6AE4, - 3437: 0x6AE7, - 3438: 0x6AEC, - 3439: 0x6AF0, - 3440: 0x6AF1, - 3441: 0x6AF2, - 3442: 0x6AFC, - 3443: 0x6AFD, - 3444: 0x6B02, - 3445: 0x6B03, - 3446: 0x6B06, - 3447: 0x6B07, - 3448: 0x6B09, - 3449: 0x6B0F, - 3450: 0x6B10, - 3451: 0x6B11, - 3452: 0x6B17, - 3453: 0x6B1B, - 3454: 0x6B1E, - 3455: 0x6B24, - 3456: 0x6B28, - 3457: 0x6B2B, - 3458: 0x6B2C, - 3459: 0x6B2F, - 3460: 0x6B35, - 3461: 0x6B36, - 3462: 0x6B3B, - 3463: 0x6B3F, - 3464: 0x6B46, - 3465: 0x6B4A, - 3466: 0x6B4D, - 3467: 0x6B52, - 3468: 0x6B56, - 3469: 0x6B58, - 3470: 0x6B5D, - 3471: 0x6B60, - 3472: 0x6B67, - 3473: 0x6B6B, - 3474: 0x6B6E, - 3475: 0x6B70, - 3476: 0x6B75, - 3477: 0x6B7D, - 3478: 0x6B7E, - 3479: 0x6B82, - 3480: 0x6B85, - 3481: 0x6B97, - 3482: 0x6B9B, - 3483: 0x6B9F, - 3484: 0x6BA0, - 3485: 0x6BA2, - 3486: 0x6BA3, - 3487: 0x6BA8, - 3488: 0x6BA9, - 3489: 0x6BAC, - 3490: 0x6BAD, - 3491: 0x6BAE, - 3492: 0x6BB0, - 3493: 0x6BB8, - 3494: 0x6BB9, - 3495: 0x6BBD, - 3496: 0x6BBE, - 3497: 0x6BC3, - 3498: 0x6BC4, - 3499: 0x6BC9, - 3500: 0x6BCC, - 3501: 0x6BD6, - 3502: 0x6BDA, - 3503: 0x6BE1, - 3504: 0x6BE3, - 3505: 0x6BE6, - 3506: 0x6BE7, - 3507: 0x6BEE, - 3508: 0x6BF1, - 3509: 0x6BF7, - 3510: 0x6BF9, - 3511: 0x6BFF, - 3512: 0x6C02, - 3513: 0x6C04, - 3514: 0x6C05, - 3515: 0x6C09, - 3516: 0x6C0D, - 3517: 0x6C0E, - 3518: 0x6C10, - 3519: 0x6C12, - 3520: 0x6C19, - 3521: 0x6C1F, - 3522: 0x6C26, - 3523: 0x6C27, - 3524: 0x6C28, - 3525: 0x6C2C, - 3526: 0x6C2E, - 3527: 0x6C33, - 3528: 0x6C35, - 3529: 0x6C36, - 3530: 0x6C3A, - 3531: 0x6C3B, - 3532: 0x6C3F, - 3533: 0x6C4A, - 3534: 0x6C4B, - 3535: 0x6C4D, - 3536: 0x6C4F, - 3537: 0x6C52, - 3538: 0x6C54, - 3539: 0x6C59, - 3540: 0x6C5B, - 3541: 0x6C5C, - 3542: 0x6C6B, - 3543: 0x6C6D, - 3544: 0x6C6F, - 3545: 0x6C74, - 3546: 0x6C76, - 3547: 0x6C78, - 3548: 0x6C79, - 3549: 0x6C7B, - 3550: 0x6C85, - 3551: 0x6C86, - 3552: 0x6C87, - 3553: 0x6C89, - 3554: 0x6C94, - 3555: 0x6C95, - 3556: 0x6C97, - 3557: 0x6C98, - 3558: 0x6C9C, - 3559: 0x6C9F, - 3560: 0x6CB0, - 3561: 0x6CB2, - 3562: 0x6CB4, - 3563: 0x6CC2, - 3564: 0x6CC6, - 3565: 0x6CCD, - 3566: 0x6CCF, - 3567: 0x6CD0, - 3568: 0x6CD1, - 3569: 0x6CD2, - 3570: 0x6CD4, - 3571: 0x6CD6, - 3572: 0x6CDA, - 3573: 0x6CDC, - 3574: 0x6CE0, - 3575: 0x6CE7, - 3576: 0x6CE9, - 3577: 0x6CEB, - 3578: 0x6CEC, - 3579: 0x6CEE, - 3580: 0x6CF2, - 3581: 0x6CF4, - 3582: 0x6D04, - 3583: 0x6D07, - 3584: 0x6D0A, - 3585: 0x6D0E, - 3586: 0x6D0F, - 3587: 0x6D11, - 3588: 0x6D13, - 3589: 0x6D1A, - 3590: 0x6D26, - 3591: 0x6D27, - 3592: 0x6D28, - 3593: 0x6C67, - 3594: 0x6D2E, - 3595: 0x6D2F, - 3596: 0x6D31, - 3597: 0x6D39, - 3598: 0x6D3C, - 3599: 0x6D3F, - 3600: 0x6D57, - 3601: 0x6D5E, - 3602: 0x6D5F, - 3603: 0x6D61, - 3604: 0x6D65, - 3605: 0x6D67, - 3606: 0x6D6F, - 3607: 0x6D70, - 3608: 0x6D7C, - 3609: 0x6D82, - 3610: 0x6D87, - 3611: 0x6D91, - 3612: 0x6D92, - 3613: 0x6D94, - 3614: 0x6D96, - 3615: 0x6D97, - 3616: 0x6D98, - 3617: 0x6DAA, - 3618: 0x6DAC, - 3619: 0x6DB4, - 3620: 0x6DB7, - 3621: 0x6DB9, - 3622: 0x6DBD, - 3623: 0x6DBF, - 3624: 0x6DC4, - 3625: 0x6DC8, - 3626: 0x6DCA, - 3627: 0x6DCE, - 3628: 0x6DCF, - 3629: 0x6DD6, - 3630: 0x6DDB, - 3631: 0x6DDD, - 3632: 0x6DDF, - 3633: 0x6DE0, - 3634: 0x6DE2, - 3635: 0x6DE5, - 3636: 0x6DE9, - 3637: 0x6DEF, - 3638: 0x6DF0, - 3639: 0x6DF4, - 3640: 0x6DF6, - 3641: 0x6DFC, - 3642: 0x6E00, - 3643: 0x6E04, - 3644: 0x6E1E, - 3645: 0x6E22, - 3646: 0x6E27, - 3647: 0x6E32, - 3648: 0x6E36, - 3649: 0x6E39, - 3650: 0x6E3B, - 3651: 0x6E3C, - 3652: 0x6E44, - 3653: 0x6E45, - 3654: 0x6E48, - 3655: 0x6E49, - 3656: 0x6E4B, - 3657: 0x6E4F, - 3658: 0x6E51, - 3659: 0x6E52, - 3660: 0x6E53, - 3661: 0x6E54, - 3662: 0x6E57, - 3663: 0x6E5C, - 3664: 0x6E5D, - 3665: 0x6E5E, - 3666: 0x6E62, - 3667: 0x6E63, - 3668: 0x6E68, - 3669: 0x6E73, - 3670: 0x6E7B, - 3671: 0x6E7D, - 3672: 0x6E8D, - 3673: 0x6E93, - 3674: 0x6E99, - 3675: 0x6EA0, - 3676: 0x6EA7, - 3677: 0x6EAD, - 3678: 0x6EAE, - 3679: 0x6EB1, - 3680: 0x6EB3, - 3681: 0x6EBB, - 3682: 0x6EBF, - 3683: 0x6EC0, - 3684: 0x6EC1, - 3685: 0x6EC3, - 3686: 0x6EC7, - 3687: 0x6EC8, - 3688: 0x6ECA, - 3689: 0x6ECD, - 3690: 0x6ECE, - 3691: 0x6ECF, - 3692: 0x6EEB, - 3693: 0x6EED, - 3694: 0x6EEE, - 3695: 0x6EF9, - 3696: 0x6EFB, - 3697: 0x6EFD, - 3698: 0x6F04, - 3699: 0x6F08, - 3700: 0x6F0A, - 3701: 0x6F0C, - 3702: 0x6F0D, - 3703: 0x6F16, - 3704: 0x6F18, - 3705: 0x6F1A, - 3706: 0x6F1B, - 3707: 0x6F26, - 3708: 0x6F29, - 3709: 0x6F2A, - 3710: 0x6F2F, - 3711: 0x6F30, - 3712: 0x6F33, - 3713: 0x6F36, - 3714: 0x6F3B, - 3715: 0x6F3C, - 3716: 0x6F2D, - 3717: 0x6F4F, - 3718: 0x6F51, - 3719: 0x6F52, - 3720: 0x6F53, - 3721: 0x6F57, - 3722: 0x6F59, - 3723: 0x6F5A, - 3724: 0x6F5D, - 3725: 0x6F5E, - 3726: 0x6F61, - 3727: 0x6F62, - 3728: 0x6F68, - 3729: 0x6F6C, - 3730: 0x6F7D, - 3731: 0x6F7E, - 3732: 0x6F83, - 3733: 0x6F87, - 3734: 0x6F88, - 3735: 0x6F8B, - 3736: 0x6F8C, - 3737: 0x6F8D, - 3738: 0x6F90, - 3739: 0x6F92, - 3740: 0x6F93, - 3741: 0x6F94, - 3742: 0x6F96, - 3743: 0x6F9A, - 3744: 0x6F9F, - 3745: 0x6FA0, - 3746: 0x6FA5, - 3747: 0x6FA6, - 3748: 0x6FA7, - 3749: 0x6FA8, - 3750: 0x6FAE, - 3751: 0x6FAF, - 3752: 0x6FB0, - 3753: 0x6FB5, - 3754: 0x6FB6, - 3755: 0x6FBC, - 3756: 0x6FC5, - 3757: 0x6FC7, - 3758: 0x6FC8, - 3759: 0x6FCA, - 3760: 0x6FDA, - 3761: 0x6FDE, - 3762: 0x6FE8, - 3763: 0x6FE9, - 3764: 0x6FF0, - 3765: 0x6FF5, - 3766: 0x6FF9, - 3767: 0x6FFC, - 3768: 0x6FFD, - 3769: 0x7000, - 3770: 0x7005, - 3771: 0x7006, - 3772: 0x7007, - 3773: 0x700D, - 3774: 0x7017, - 3775: 0x7020, - 3776: 0x7023, - 3777: 0x702F, - 3778: 0x7034, - 3779: 0x7037, - 3780: 0x7039, - 3781: 0x703C, - 3782: 0x7043, - 3783: 0x7044, - 3784: 0x7048, - 3785: 0x7049, - 3786: 0x704A, - 3787: 0x704B, - 3788: 0x7054, - 3789: 0x7055, - 3790: 0x705D, - 3791: 0x705E, - 3792: 0x704E, - 3793: 0x7064, - 3794: 0x7065, - 3795: 0x706C, - 3796: 0x706E, - 3797: 0x7075, - 3798: 0x7076, - 3799: 0x707E, - 3800: 0x7081, - 3801: 0x7085, - 3802: 0x7086, - 3803: 0x7094, - 3804: 0x7095, - 3805: 0x7096, - 3806: 0x7097, - 3807: 0x7098, - 3808: 0x709B, - 3809: 0x70A4, - 3810: 0x70AB, - 3811: 0x70B0, - 3812: 0x70B1, - 3813: 0x70B4, - 3814: 0x70B7, - 3815: 0x70CA, - 3816: 0x70D1, - 3817: 0x70D3, - 3818: 0x70D4, - 3819: 0x70D5, - 3820: 0x70D6, - 3821: 0x70D8, - 3822: 0x70DC, - 3823: 0x70E4, - 3824: 0x70FA, - 3825: 0x7103, - 3826: 0x7104, - 3827: 0x7105, - 3828: 0x7106, - 3829: 0x7107, - 3830: 0x710B, - 3831: 0x710C, - 3832: 0x710F, - 3833: 0x711E, - 3834: 0x7120, - 3835: 0x712B, - 3836: 0x712D, - 3837: 0x712F, - 3838: 0x7130, - 3839: 0x7131, - 3840: 0x7138, - 3841: 0x7141, - 3842: 0x7145, - 3843: 0x7146, - 3844: 0x7147, - 3845: 0x714A, - 3846: 0x714B, - 3847: 0x7150, - 3848: 0x7152, - 3849: 0x7157, - 3850: 0x715A, - 3851: 0x715C, - 3852: 0x715E, - 3853: 0x7160, - 3854: 0x7168, - 3855: 0x7179, - 3856: 0x7180, - 3857: 0x7185, - 3858: 0x7187, - 3859: 0x718C, - 3860: 0x7192, - 3861: 0x719A, - 3862: 0x719B, - 3863: 0x71A0, - 3864: 0x71A2, - 3865: 0x71AF, - 3866: 0x71B0, - 3867: 0x71B2, - 3868: 0x71B3, - 3869: 0x71BA, - 3870: 0x71BF, - 3871: 0x71C0, - 3872: 0x71C1, - 3873: 0x71C4, - 3874: 0x71CB, - 3875: 0x71CC, - 3876: 0x71D3, - 3877: 0x71D6, - 3878: 0x71D9, - 3879: 0x71DA, - 3880: 0x71DC, - 3881: 0x71F8, - 3882: 0x71FE, - 3883: 0x7200, - 3884: 0x7207, - 3885: 0x7208, - 3886: 0x7209, - 3887: 0x7213, - 3888: 0x7217, - 3889: 0x721A, - 3890: 0x721D, - 3891: 0x721F, - 3892: 0x7224, - 3893: 0x722B, - 3894: 0x722F, - 3895: 0x7234, - 3896: 0x7238, - 3897: 0x7239, - 3898: 0x7241, - 3899: 0x7242, - 3900: 0x7243, - 3901: 0x7245, - 3902: 0x724E, - 3903: 0x724F, - 3904: 0x7250, - 3905: 0x7253, - 3906: 0x7255, - 3907: 0x7256, - 3908: 0x725A, - 3909: 0x725C, - 3910: 0x725E, - 3911: 0x7260, - 3912: 0x7263, - 3913: 0x7268, - 3914: 0x726B, - 3915: 0x726E, - 3916: 0x726F, - 3917: 0x7271, - 3918: 0x7277, - 3919: 0x7278, - 3920: 0x727B, - 3921: 0x727C, - 3922: 0x727F, - 3923: 0x7284, - 3924: 0x7289, - 3925: 0x728D, - 3926: 0x728E, - 3927: 0x7293, - 3928: 0x729B, - 3929: 0x72A8, - 3930: 0x72AD, - 3931: 0x72AE, - 3932: 0x72B1, - 3933: 0x72B4, - 3934: 0x72BE, - 3935: 0x72C1, - 3936: 0x72C7, - 3937: 0x72C9, - 3938: 0x72CC, - 3939: 0x72D5, - 3940: 0x72D6, - 3941: 0x72D8, - 3942: 0x72DF, - 3943: 0x72E5, - 3944: 0x72F3, - 3945: 0x72F4, - 3946: 0x72FA, - 3947: 0x72FB, - 3948: 0x72FE, - 3949: 0x7302, - 3950: 0x7304, - 3951: 0x7305, - 3952: 0x7307, - 3953: 0x730B, - 3954: 0x730D, - 3955: 0x7312, - 3956: 0x7313, - 3957: 0x7318, - 3958: 0x7319, - 3959: 0x731E, - 3960: 0x7322, - 3961: 0x7324, - 3962: 0x7327, - 3963: 0x7328, - 3964: 0x732C, - 3965: 0x7331, - 3966: 0x7332, - 3967: 0x7335, - 3968: 0x733A, - 3969: 0x733B, - 3970: 0x733D, - 3971: 0x7343, - 3972: 0x734D, - 3973: 0x7350, - 3974: 0x7352, - 3975: 0x7356, - 3976: 0x7358, - 3977: 0x735D, - 3978: 0x735E, - 3979: 0x735F, - 3980: 0x7360, - 3981: 0x7366, - 3982: 0x7367, - 3983: 0x7369, - 3984: 0x736B, - 3985: 0x736C, - 3986: 0x736E, - 3987: 0x736F, - 3988: 0x7371, - 3989: 0x7377, - 3990: 0x7379, - 3991: 0x737C, - 3992: 0x7380, - 3993: 0x7381, - 3994: 0x7383, - 3995: 0x7385, - 3996: 0x7386, - 3997: 0x738E, - 3998: 0x7390, - 3999: 0x7393, - 4000: 0x7395, - 4001: 0x7397, - 4002: 0x7398, - 4003: 0x739C, - 4004: 0x739E, - 4005: 0x739F, - 4006: 0x73A0, - 4007: 0x73A2, - 4008: 0x73A5, - 4009: 0x73A6, - 4010: 0x73AA, - 4011: 0x73AB, - 4012: 0x73AD, - 4013: 0x73B5, - 4014: 0x73B7, - 4015: 0x73B9, - 4016: 0x73BC, - 4017: 0x73BD, - 4018: 0x73BF, - 4019: 0x73C5, - 4020: 0x73C6, - 4021: 0x73C9, - 4022: 0x73CB, - 4023: 0x73CC, - 4024: 0x73CF, - 4025: 0x73D2, - 4026: 0x73D3, - 4027: 0x73D6, - 4028: 0x73D9, - 4029: 0x73DD, - 4030: 0x73E1, - 4031: 0x73E3, - 4032: 0x73E6, - 4033: 0x73E7, - 4034: 0x73E9, - 4035: 0x73F4, - 4036: 0x73F5, - 4037: 0x73F7, - 4038: 0x73F9, - 4039: 0x73FA, - 4040: 0x73FB, - 4041: 0x73FD, - 4042: 0x73FF, - 4043: 0x7400, - 4044: 0x7401, - 4045: 0x7404, - 4046: 0x7407, - 4047: 0x740A, - 4048: 0x7411, - 4049: 0x741A, - 4050: 0x741B, - 4051: 0x7424, - 4052: 0x7426, - 4053: 0x7428, - 4054: 0x7429, - 4055: 0x742A, - 4056: 0x742B, - 4057: 0x742C, - 4058: 0x742D, - 4059: 0x742E, - 4060: 0x742F, - 4061: 0x7430, - 4062: 0x7431, - 4063: 0x7439, - 4064: 0x7440, - 4065: 0x7443, - 4066: 0x7444, - 4067: 0x7446, - 4068: 0x7447, - 4069: 0x744B, - 4070: 0x744D, - 4071: 0x7451, - 4072: 0x7452, - 4073: 0x7457, - 4074: 0x745D, - 4075: 0x7462, - 4076: 0x7466, - 4077: 0x7467, - 4078: 0x7468, - 4079: 0x746B, - 4080: 0x746D, - 4081: 0x746E, - 4082: 0x7471, - 4083: 0x7472, - 4084: 0x7480, - 4085: 0x7481, - 4086: 0x7485, - 4087: 0x7486, - 4088: 0x7487, - 4089: 0x7489, - 4090: 0x748F, - 4091: 0x7490, - 4092: 0x7491, - 4093: 0x7492, - 4094: 0x7498, - 4095: 0x7499, - 4096: 0x749A, - 4097: 0x749C, - 4098: 0x749F, - 4099: 0x74A0, - 4100: 0x74A1, - 4101: 0x74A3, - 4102: 0x74A6, - 4103: 0x74A8, - 4104: 0x74A9, - 4105: 0x74AA, - 4106: 0x74AB, - 4107: 0x74AE, - 4108: 0x74AF, - 4109: 0x74B1, - 4110: 0x74B2, - 4111: 0x74B5, - 4112: 0x74B9, - 4113: 0x74BB, - 4114: 0x74BF, - 4115: 0x74C8, - 4116: 0x74C9, - 4117: 0x74CC, - 4118: 0x74D0, - 4119: 0x74D3, - 4120: 0x74D8, - 4121: 0x74DA, - 4122: 0x74DB, - 4123: 0x74DE, - 4124: 0x74DF, - 4125: 0x74E4, - 4126: 0x74E8, - 4127: 0x74EA, - 4128: 0x74EB, - 4129: 0x74EF, - 4130: 0x74F4, - 4131: 0x74FA, - 4132: 0x74FB, - 4133: 0x74FC, - 4134: 0x74FF, - 4135: 0x7506, - 4136: 0x7512, - 4137: 0x7516, - 4138: 0x7517, - 4139: 0x7520, - 4140: 0x7521, - 4141: 0x7524, - 4142: 0x7527, - 4143: 0x7529, - 4144: 0x752A, - 4145: 0x752F, - 4146: 0x7536, - 4147: 0x7539, - 4148: 0x753D, - 4149: 0x753E, - 4150: 0x753F, - 4151: 0x7540, - 4152: 0x7543, - 4153: 0x7547, - 4154: 0x7548, - 4155: 0x754E, - 4156: 0x7550, - 4157: 0x7552, - 4158: 0x7557, - 4159: 0x755E, - 4160: 0x755F, - 4161: 0x7561, - 4162: 0x756F, - 4163: 0x7571, - 4164: 0x7579, - 4165: 0x757A, - 4166: 0x757B, - 4167: 0x757C, - 4168: 0x757D, - 4169: 0x757E, - 4170: 0x7581, - 4171: 0x7585, - 4172: 0x7590, - 4173: 0x7592, - 4174: 0x7593, - 4175: 0x7595, - 4176: 0x7599, - 4177: 0x759C, - 4178: 0x75A2, - 4179: 0x75A4, - 4180: 0x75B4, - 4181: 0x75BA, - 4182: 0x75BF, - 4183: 0x75C0, - 4184: 0x75C1, - 4185: 0x75C4, - 4186: 0x75C6, - 4187: 0x75CC, - 4188: 0x75CE, - 4189: 0x75CF, - 4190: 0x75D7, - 4191: 0x75DC, - 4192: 0x75DF, - 4193: 0x75E0, - 4194: 0x75E1, - 4195: 0x75E4, - 4196: 0x75E7, - 4197: 0x75EC, - 4198: 0x75EE, - 4199: 0x75EF, - 4200: 0x75F1, - 4201: 0x75F9, - 4202: 0x7600, - 4203: 0x7602, - 4204: 0x7603, - 4205: 0x7604, - 4206: 0x7607, - 4207: 0x7608, - 4208: 0x760A, - 4209: 0x760C, - 4210: 0x760F, - 4211: 0x7612, - 4212: 0x7613, - 4213: 0x7615, - 4214: 0x7616, - 4215: 0x7619, - 4216: 0x761B, - 4217: 0x761C, - 4218: 0x761D, - 4219: 0x761E, - 4220: 0x7623, - 4221: 0x7625, - 4222: 0x7626, - 4223: 0x7629, - 4224: 0x762D, - 4225: 0x7632, - 4226: 0x7633, - 4227: 0x7635, - 4228: 0x7638, - 4229: 0x7639, - 4230: 0x763A, - 4231: 0x763C, - 4232: 0x764A, - 4233: 0x7640, - 4234: 0x7641, - 4235: 0x7643, - 4236: 0x7644, - 4237: 0x7645, - 4238: 0x7649, - 4239: 0x764B, - 4240: 0x7655, - 4241: 0x7659, - 4242: 0x765F, - 4243: 0x7664, - 4244: 0x7665, - 4245: 0x766D, - 4246: 0x766E, - 4247: 0x766F, - 4248: 0x7671, - 4249: 0x7674, - 4250: 0x7681, - 4251: 0x7685, - 4252: 0x768C, - 4253: 0x768D, - 4254: 0x7695, - 4255: 0x769B, - 4256: 0x769C, - 4257: 0x769D, - 4258: 0x769F, - 4259: 0x76A0, - 4260: 0x76A2, - 4261: 0x76A3, - 4262: 0x76A4, - 4263: 0x76A5, - 4264: 0x76A6, - 4265: 0x76A7, - 4266: 0x76A8, - 4267: 0x76AA, - 4268: 0x76AD, - 4269: 0x76BD, - 4270: 0x76C1, - 4271: 0x76C5, - 4272: 0x76C9, - 4273: 0x76CB, - 4274: 0x76CC, - 4275: 0x76CE, - 4276: 0x76D4, - 4277: 0x76D9, - 4278: 0x76E0, - 4279: 0x76E6, - 4280: 0x76E8, - 4281: 0x76EC, - 4282: 0x76F0, - 4283: 0x76F1, - 4284: 0x76F6, - 4285: 0x76F9, - 4286: 0x76FC, - 4287: 0x7700, - 4288: 0x7706, - 4289: 0x770A, - 4290: 0x770E, - 4291: 0x7712, - 4292: 0x7714, - 4293: 0x7715, - 4294: 0x7717, - 4295: 0x7719, - 4296: 0x771A, - 4297: 0x771C, - 4298: 0x7722, - 4299: 0x7728, - 4300: 0x772D, - 4301: 0x772E, - 4302: 0x772F, - 4303: 0x7734, - 4304: 0x7735, - 4305: 0x7736, - 4306: 0x7739, - 4307: 0x773D, - 4308: 0x773E, - 4309: 0x7742, - 4310: 0x7745, - 4311: 0x7746, - 4312: 0x774A, - 4313: 0x774D, - 4314: 0x774E, - 4315: 0x774F, - 4316: 0x7752, - 4317: 0x7756, - 4318: 0x7757, - 4319: 0x775C, - 4320: 0x775E, - 4321: 0x775F, - 4322: 0x7760, - 4323: 0x7762, - 4324: 0x7764, - 4325: 0x7767, - 4326: 0x776A, - 4327: 0x776C, - 4328: 0x7770, - 4329: 0x7772, - 4330: 0x7773, - 4331: 0x7774, - 4332: 0x777A, - 4333: 0x777D, - 4334: 0x7780, - 4335: 0x7784, - 4336: 0x778C, - 4337: 0x778D, - 4338: 0x7794, - 4339: 0x7795, - 4340: 0x7796, - 4341: 0x779A, - 4342: 0x779F, - 4343: 0x77A2, - 4344: 0x77A7, - 4345: 0x77AA, - 4346: 0x77AE, - 4347: 0x77AF, - 4348: 0x77B1, - 4349: 0x77B5, - 4350: 0x77BE, - 4351: 0x77C3, - 4352: 0x77C9, - 4353: 0x77D1, - 4354: 0x77D2, - 4355: 0x77D5, - 4356: 0x77D9, - 4357: 0x77DE, - 4358: 0x77DF, - 4359: 0x77E0, - 4360: 0x77E4, - 4361: 0x77E6, - 4362: 0x77EA, - 4363: 0x77EC, - 4364: 0x77F0, - 4365: 0x77F1, - 4366: 0x77F4, - 4367: 0x77F8, - 4368: 0x77FB, - 4369: 0x7805, - 4370: 0x7806, - 4371: 0x7809, - 4372: 0x780D, - 4373: 0x780E, - 4374: 0x7811, - 4375: 0x781D, - 4376: 0x7821, - 4377: 0x7822, - 4378: 0x7823, - 4379: 0x782D, - 4380: 0x782E, - 4381: 0x7830, - 4382: 0x7835, - 4383: 0x7837, - 4384: 0x7843, - 4385: 0x7844, - 4386: 0x7847, - 4387: 0x7848, - 4388: 0x784C, - 4389: 0x784E, - 4390: 0x7852, - 4391: 0x785C, - 4392: 0x785E, - 4393: 0x7860, - 4394: 0x7861, - 4395: 0x7863, - 4396: 0x7864, - 4397: 0x7868, - 4398: 0x786A, - 4399: 0x786E, - 4400: 0x787A, - 4401: 0x787E, - 4402: 0x788A, - 4403: 0x788F, - 4404: 0x7894, - 4405: 0x7898, - 4406: 0x78A1, - 4407: 0x789D, - 4408: 0x789E, - 4409: 0x789F, - 4410: 0x78A4, - 4411: 0x78A8, - 4412: 0x78AC, - 4413: 0x78AD, - 4414: 0x78B0, - 4415: 0x78B1, - 4416: 0x78B2, - 4417: 0x78B3, - 4418: 0x78BB, - 4419: 0x78BD, - 4420: 0x78BF, - 4421: 0x78C7, - 4422: 0x78C8, - 4423: 0x78C9, - 4424: 0x78CC, - 4425: 0x78CE, - 4426: 0x78D2, - 4427: 0x78D3, - 4428: 0x78D5, - 4429: 0x78D6, - 4430: 0x78E4, - 4431: 0x78DB, - 4432: 0x78DF, - 4433: 0x78E0, - 4434: 0x78E1, - 4435: 0x78E6, - 4436: 0x78EA, - 4437: 0x78F2, - 4438: 0x78F3, - 4439: 0x7900, - 4440: 0x78F6, - 4441: 0x78F7, - 4442: 0x78FA, - 4443: 0x78FB, - 4444: 0x78FF, - 4445: 0x7906, - 4446: 0x790C, - 4447: 0x7910, - 4448: 0x791A, - 4449: 0x791C, - 4450: 0x791E, - 4451: 0x791F, - 4452: 0x7920, - 4453: 0x7925, - 4454: 0x7927, - 4455: 0x7929, - 4456: 0x792D, - 4457: 0x7931, - 4458: 0x7934, - 4459: 0x7935, - 4460: 0x793B, - 4461: 0x793D, - 4462: 0x793F, - 4463: 0x7944, - 4464: 0x7945, - 4465: 0x7946, - 4466: 0x794A, - 4467: 0x794B, - 4468: 0x794F, - 4469: 0x7951, - 4470: 0x7954, - 4471: 0x7958, - 4472: 0x795B, - 4473: 0x795C, - 4474: 0x7967, - 4475: 0x7969, - 4476: 0x796B, - 4477: 0x7972, - 4478: 0x7979, - 4479: 0x797B, - 4480: 0x797C, - 4481: 0x797E, - 4482: 0x798B, - 4483: 0x798C, - 4484: 0x7991, - 4485: 0x7993, - 4486: 0x7994, - 4487: 0x7995, - 4488: 0x7996, - 4489: 0x7998, - 4490: 0x799B, - 4491: 0x799C, - 4492: 0x79A1, - 4493: 0x79A8, - 4494: 0x79A9, - 4495: 0x79AB, - 4496: 0x79AF, - 4497: 0x79B1, - 4498: 0x79B4, - 4499: 0x79B8, - 4500: 0x79BB, - 4501: 0x79C2, - 4502: 0x79C4, - 4503: 0x79C7, - 4504: 0x79C8, - 4505: 0x79CA, - 4506: 0x79CF, - 4507: 0x79D4, - 4508: 0x79D6, - 4509: 0x79DA, - 4510: 0x79DD, - 4511: 0x79DE, - 4512: 0x79E0, - 4513: 0x79E2, - 4514: 0x79E5, - 4515: 0x79EA, - 4516: 0x79EB, - 4517: 0x79ED, - 4518: 0x79F1, - 4519: 0x79F8, - 4520: 0x79FC, - 4521: 0x7A02, - 4522: 0x7A03, - 4523: 0x7A07, - 4524: 0x7A09, - 4525: 0x7A0A, - 4526: 0x7A0C, - 4527: 0x7A11, - 4528: 0x7A15, - 4529: 0x7A1B, - 4530: 0x7A1E, - 4531: 0x7A21, - 4532: 0x7A27, - 4533: 0x7A2B, - 4534: 0x7A2D, - 4535: 0x7A2F, - 4536: 0x7A30, - 4537: 0x7A34, - 4538: 0x7A35, - 4539: 0x7A38, - 4540: 0x7A39, - 4541: 0x7A3A, - 4542: 0x7A44, - 4543: 0x7A45, - 4544: 0x7A47, - 4545: 0x7A48, - 4546: 0x7A4C, - 4547: 0x7A55, - 4548: 0x7A56, - 4549: 0x7A59, - 4550: 0x7A5C, - 4551: 0x7A5D, - 4552: 0x7A5F, - 4553: 0x7A60, - 4554: 0x7A65, - 4555: 0x7A67, - 4556: 0x7A6A, - 4557: 0x7A6D, - 4558: 0x7A75, - 4559: 0x7A78, - 4560: 0x7A7E, - 4561: 0x7A80, - 4562: 0x7A82, - 4563: 0x7A85, - 4564: 0x7A86, - 4565: 0x7A8A, - 4566: 0x7A8B, - 4567: 0x7A90, - 4568: 0x7A91, - 4569: 0x7A94, - 4570: 0x7A9E, - 4571: 0x7AA0, - 4572: 0x7AA3, - 4573: 0x7AAC, - 4574: 0x7AB3, - 4575: 0x7AB5, - 4576: 0x7AB9, - 4577: 0x7ABB, - 4578: 0x7ABC, - 4579: 0x7AC6, - 4580: 0x7AC9, - 4581: 0x7ACC, - 4582: 0x7ACE, - 4583: 0x7AD1, - 4584: 0x7ADB, - 4585: 0x7AE8, - 4586: 0x7AE9, - 4587: 0x7AEB, - 4588: 0x7AEC, - 4589: 0x7AF1, - 4590: 0x7AF4, - 4591: 0x7AFB, - 4592: 0x7AFD, - 4593: 0x7AFE, - 4594: 0x7B07, - 4595: 0x7B14, - 4596: 0x7B1F, - 4597: 0x7B23, - 4598: 0x7B27, - 4599: 0x7B29, - 4600: 0x7B2A, - 4601: 0x7B2B, - 4602: 0x7B2D, - 4603: 0x7B2E, - 4604: 0x7B2F, - 4605: 0x7B30, - 4606: 0x7B31, - 4607: 0x7B34, - 4608: 0x7B3D, - 4609: 0x7B3F, - 4610: 0x7B40, - 4611: 0x7B41, - 4612: 0x7B47, - 4613: 0x7B4E, - 4614: 0x7B55, - 4615: 0x7B60, - 4616: 0x7B64, - 4617: 0x7B66, - 4618: 0x7B69, - 4619: 0x7B6A, - 4620: 0x7B6D, - 4621: 0x7B6F, - 4622: 0x7B72, - 4623: 0x7B73, - 4624: 0x7B77, - 4625: 0x7B84, - 4626: 0x7B89, - 4627: 0x7B8E, - 4628: 0x7B90, - 4629: 0x7B91, - 4630: 0x7B96, - 4631: 0x7B9B, - 4632: 0x7B9E, - 4633: 0x7BA0, - 4634: 0x7BA5, - 4635: 0x7BAC, - 4636: 0x7BAF, - 4637: 0x7BB0, - 4638: 0x7BB2, - 4639: 0x7BB5, - 4640: 0x7BB6, - 4641: 0x7BBA, - 4642: 0x7BBB, - 4643: 0x7BBC, - 4644: 0x7BBD, - 4645: 0x7BC2, - 4646: 0x7BC5, - 4647: 0x7BC8, - 4648: 0x7BCA, - 4649: 0x7BD4, - 4650: 0x7BD6, - 4651: 0x7BD7, - 4652: 0x7BD9, - 4653: 0x7BDA, - 4654: 0x7BDB, - 4655: 0x7BE8, - 4656: 0x7BEA, - 4657: 0x7BF2, - 4658: 0x7BF4, - 4659: 0x7BF5, - 4660: 0x7BF8, - 4661: 0x7BF9, - 4662: 0x7BFA, - 4663: 0x7BFC, - 4664: 0x7BFE, - 4665: 0x7C01, - 4666: 0x7C02, - 4667: 0x7C03, - 4668: 0x7C04, - 4669: 0x7C06, - 4670: 0x7C09, - 4671: 0x7C0B, - 4672: 0x7C0C, - 4673: 0x7C0E, - 4674: 0x7C0F, - 4675: 0x7C19, - 4676: 0x7C1B, - 4677: 0x7C20, - 4678: 0x7C25, - 4679: 0x7C26, - 4680: 0x7C28, - 4681: 0x7C2C, - 4682: 0x7C31, - 4683: 0x7C33, - 4684: 0x7C34, - 4685: 0x7C36, - 4686: 0x7C39, - 4687: 0x7C3A, - 4688: 0x7C46, - 4689: 0x7C4A, - 4690: 0x7C55, - 4691: 0x7C51, - 4692: 0x7C52, - 4693: 0x7C53, - 4694: 0x7C59, - 4695: 0x7C5A, - 4696: 0x7C5B, - 4697: 0x7C5C, - 4698: 0x7C5D, - 4699: 0x7C5E, - 4700: 0x7C61, - 4701: 0x7C63, - 4702: 0x7C67, - 4703: 0x7C69, - 4704: 0x7C6D, - 4705: 0x7C6E, - 4706: 0x7C70, - 4707: 0x7C72, - 4708: 0x7C79, - 4709: 0x7C7C, - 4710: 0x7C7D, - 4711: 0x7C86, - 4712: 0x7C87, - 4713: 0x7C8F, - 4714: 0x7C94, - 4715: 0x7C9E, - 4716: 0x7CA0, - 4717: 0x7CA6, - 4718: 0x7CB0, - 4719: 0x7CB6, - 4720: 0x7CB7, - 4721: 0x7CBA, - 4722: 0x7CBB, - 4723: 0x7CBC, - 4724: 0x7CBF, - 4725: 0x7CC4, - 4726: 0x7CC7, - 4727: 0x7CC8, - 4728: 0x7CC9, - 4729: 0x7CCD, - 4730: 0x7CCF, - 4731: 0x7CD3, - 4732: 0x7CD4, - 4733: 0x7CD5, - 4734: 0x7CD7, - 4735: 0x7CD9, - 4736: 0x7CDA, - 4737: 0x7CDD, - 4738: 0x7CE6, - 4739: 0x7CE9, - 4740: 0x7CEB, - 4741: 0x7CF5, - 4742: 0x7D03, - 4743: 0x7D07, - 4744: 0x7D08, - 4745: 0x7D09, - 4746: 0x7D0F, - 4747: 0x7D11, - 4748: 0x7D12, - 4749: 0x7D13, - 4750: 0x7D16, - 4751: 0x7D1D, - 4752: 0x7D1E, - 4753: 0x7D23, - 4754: 0x7D26, - 4755: 0x7D2A, - 4756: 0x7D2D, - 4757: 0x7D31, - 4758: 0x7D3C, - 4759: 0x7D3D, - 4760: 0x7D3E, - 4761: 0x7D40, - 4762: 0x7D41, - 4763: 0x7D47, - 4764: 0x7D48, - 4765: 0x7D4D, - 4766: 0x7D51, - 4767: 0x7D53, - 4768: 0x7D57, - 4769: 0x7D59, - 4770: 0x7D5A, - 4771: 0x7D5C, - 4772: 0x7D5D, - 4773: 0x7D65, - 4774: 0x7D67, - 4775: 0x7D6A, - 4776: 0x7D70, - 4777: 0x7D78, - 4778: 0x7D7A, - 4779: 0x7D7B, - 4780: 0x7D7F, - 4781: 0x7D81, - 4782: 0x7D82, - 4783: 0x7D83, - 4784: 0x7D85, - 4785: 0x7D86, - 4786: 0x7D88, - 4787: 0x7D8B, - 4788: 0x7D8C, - 4789: 0x7D8D, - 4790: 0x7D91, - 4791: 0x7D96, - 4792: 0x7D97, - 4793: 0x7D9D, - 4794: 0x7D9E, - 4795: 0x7DA6, - 4796: 0x7DA7, - 4797: 0x7DAA, - 4798: 0x7DB3, - 4799: 0x7DB6, - 4800: 0x7DB7, - 4801: 0x7DB9, - 4802: 0x7DC2, - 4803: 0x7DC3, - 4804: 0x7DC4, - 4805: 0x7DC5, - 4806: 0x7DC6, - 4807: 0x7DCC, - 4808: 0x7DCD, - 4809: 0x7DCE, - 4810: 0x7DD7, - 4811: 0x7DD9, - 4812: 0x7E00, - 4813: 0x7DE2, - 4814: 0x7DE5, - 4815: 0x7DE6, - 4816: 0x7DEA, - 4817: 0x7DEB, - 4818: 0x7DED, - 4819: 0x7DF1, - 4820: 0x7DF5, - 4821: 0x7DF6, - 4822: 0x7DF9, - 4823: 0x7DFA, - 4824: 0x7E08, - 4825: 0x7E10, - 4826: 0x7E11, - 4827: 0x7E15, - 4828: 0x7E17, - 4829: 0x7E1C, - 4830: 0x7E1D, - 4831: 0x7E20, - 4832: 0x7E27, - 4833: 0x7E28, - 4834: 0x7E2C, - 4835: 0x7E2D, - 4836: 0x7E2F, - 4837: 0x7E33, - 4838: 0x7E36, - 4839: 0x7E3F, - 4840: 0x7E44, - 4841: 0x7E45, - 4842: 0x7E47, - 4843: 0x7E4E, - 4844: 0x7E50, - 4845: 0x7E52, - 4846: 0x7E58, - 4847: 0x7E5F, - 4848: 0x7E61, - 4849: 0x7E62, - 4850: 0x7E65, - 4851: 0x7E6B, - 4852: 0x7E6E, - 4853: 0x7E6F, - 4854: 0x7E73, - 4855: 0x7E78, - 4856: 0x7E7E, - 4857: 0x7E81, - 4858: 0x7E86, - 4859: 0x7E87, - 4860: 0x7E8A, - 4861: 0x7E8D, - 4862: 0x7E91, - 4863: 0x7E95, - 4864: 0x7E98, - 4865: 0x7E9A, - 4866: 0x7E9D, - 4867: 0x7E9E, - 4868: 0x7F3C, - 4869: 0x7F3B, - 4870: 0x7F3D, - 4871: 0x7F3E, - 4872: 0x7F3F, - 4873: 0x7F43, - 4874: 0x7F44, - 4875: 0x7F47, - 4876: 0x7F4F, - 4877: 0x7F52, - 4878: 0x7F53, - 4879: 0x7F5B, - 4880: 0x7F5C, - 4881: 0x7F5D, - 4882: 0x7F61, - 4883: 0x7F63, - 4884: 0x7F64, - 4885: 0x7F65, - 4886: 0x7F66, - 4887: 0x7F6D, - 4888: 0x7F71, - 4889: 0x7F7D, - 4890: 0x7F7E, - 4891: 0x7F7F, - 4892: 0x7F80, - 4893: 0x7F8B, - 4894: 0x7F8D, - 4895: 0x7F8F, - 4896: 0x7F90, - 4897: 0x7F91, - 4898: 0x7F96, - 4899: 0x7F97, - 4900: 0x7F9C, - 4901: 0x7FA1, - 4902: 0x7FA2, - 4903: 0x7FA6, - 4904: 0x7FAA, - 4905: 0x7FAD, - 4906: 0x7FB4, - 4907: 0x7FBC, - 4908: 0x7FBF, - 4909: 0x7FC0, - 4910: 0x7FC3, - 4911: 0x7FC8, - 4912: 0x7FCE, - 4913: 0x7FCF, - 4914: 0x7FDB, - 4915: 0x7FDF, - 4916: 0x7FE3, - 4917: 0x7FE5, - 4918: 0x7FE8, - 4919: 0x7FEC, - 4920: 0x7FEE, - 4921: 0x7FEF, - 4922: 0x7FF2, - 4923: 0x7FFA, - 4924: 0x7FFD, - 4925: 0x7FFE, - 4926: 0x7FFF, - 4927: 0x8007, - 4928: 0x8008, - 4929: 0x800A, - 4930: 0x800D, - 4931: 0x800E, - 4932: 0x800F, - 4933: 0x8011, - 4934: 0x8013, - 4935: 0x8014, - 4936: 0x8016, - 4937: 0x801D, - 4938: 0x801E, - 4939: 0x801F, - 4940: 0x8020, - 4941: 0x8024, - 4942: 0x8026, - 4943: 0x802C, - 4944: 0x802E, - 4945: 0x8030, - 4946: 0x8034, - 4947: 0x8035, - 4948: 0x8037, - 4949: 0x8039, - 4950: 0x803A, - 4951: 0x803C, - 4952: 0x803E, - 4953: 0x8040, - 4954: 0x8044, - 4955: 0x8060, - 4956: 0x8064, - 4957: 0x8066, - 4958: 0x806D, - 4959: 0x8071, - 4960: 0x8075, - 4961: 0x8081, - 4962: 0x8088, - 4963: 0x808E, - 4964: 0x809C, - 4965: 0x809E, - 4966: 0x80A6, - 4967: 0x80A7, - 4968: 0x80AB, - 4969: 0x80B8, - 4970: 0x80B9, - 4971: 0x80C8, - 4972: 0x80CD, - 4973: 0x80CF, - 4974: 0x80D2, - 4975: 0x80D4, - 4976: 0x80D5, - 4977: 0x80D7, - 4978: 0x80D8, - 4979: 0x80E0, - 4980: 0x80ED, - 4981: 0x80EE, - 4982: 0x80F0, - 4983: 0x80F2, - 4984: 0x80F3, - 4985: 0x80F6, - 4986: 0x80F9, - 4987: 0x80FA, - 4988: 0x80FE, - 4989: 0x8103, - 4990: 0x810B, - 4991: 0x8116, - 4992: 0x8117, - 4993: 0x8118, - 4994: 0x811C, - 4995: 0x811E, - 4996: 0x8120, - 4997: 0x8124, - 4998: 0x8127, - 4999: 0x812C, - 5000: 0x8130, - 5001: 0x8135, - 5002: 0x813A, - 5003: 0x813C, - 5004: 0x8145, - 5005: 0x8147, - 5006: 0x814A, - 5007: 0x814C, - 5008: 0x8152, - 5009: 0x8157, - 5010: 0x8160, - 5011: 0x8161, - 5012: 0x8167, - 5013: 0x8168, - 5014: 0x8169, - 5015: 0x816D, - 5016: 0x816F, - 5017: 0x8177, - 5018: 0x8181, - 5019: 0x8190, - 5020: 0x8184, - 5021: 0x8185, - 5022: 0x8186, - 5023: 0x818B, - 5024: 0x818E, - 5025: 0x8196, - 5026: 0x8198, - 5027: 0x819B, - 5028: 0x819E, - 5029: 0x81A2, - 5030: 0x81AE, - 5031: 0x81B2, - 5032: 0x81B4, - 5033: 0x81BB, - 5034: 0x81CB, - 5035: 0x81C3, - 5036: 0x81C5, - 5037: 0x81CA, - 5038: 0x81CE, - 5039: 0x81CF, - 5040: 0x81D5, - 5041: 0x81D7, - 5042: 0x81DB, - 5043: 0x81DD, - 5044: 0x81DE, - 5045: 0x81E1, - 5046: 0x81E4, - 5047: 0x81EB, - 5048: 0x81EC, - 5049: 0x81F0, - 5050: 0x81F1, - 5051: 0x81F2, - 5052: 0x81F5, - 5053: 0x81F6, - 5054: 0x81F8, - 5055: 0x81F9, - 5056: 0x81FD, - 5057: 0x81FF, - 5058: 0x8200, - 5059: 0x8203, - 5060: 0x820F, - 5061: 0x8213, - 5062: 0x8214, - 5063: 0x8219, - 5064: 0x821A, - 5065: 0x821D, - 5066: 0x8221, - 5067: 0x8222, - 5068: 0x8228, - 5069: 0x8232, - 5070: 0x8234, - 5071: 0x823A, - 5072: 0x8243, - 5073: 0x8244, - 5074: 0x8245, - 5075: 0x8246, - 5076: 0x824B, - 5077: 0x824E, - 5078: 0x824F, - 5079: 0x8251, - 5080: 0x8256, - 5081: 0x825C, - 5082: 0x8260, - 5083: 0x8263, - 5084: 0x8267, - 5085: 0x826D, - 5086: 0x8274, - 5087: 0x827B, - 5088: 0x827D, - 5089: 0x827F, - 5090: 0x8280, - 5091: 0x8281, - 5092: 0x8283, - 5093: 0x8284, - 5094: 0x8287, - 5095: 0x8289, - 5096: 0x828A, - 5097: 0x828E, - 5098: 0x8291, - 5099: 0x8294, - 5100: 0x8296, - 5101: 0x8298, - 5102: 0x829A, - 5103: 0x829B, - 5104: 0x82A0, - 5105: 0x82A1, - 5106: 0x82A3, - 5107: 0x82A4, - 5108: 0x82A7, - 5109: 0x82A8, - 5110: 0x82A9, - 5111: 0x82AA, - 5112: 0x82AE, - 5113: 0x82B0, - 5114: 0x82B2, - 5115: 0x82B4, - 5116: 0x82B7, - 5117: 0x82BA, - 5118: 0x82BC, - 5119: 0x82BE, - 5120: 0x82BF, - 5121: 0x82C6, - 5122: 0x82D0, - 5123: 0x82D5, - 5124: 0x82DA, - 5125: 0x82E0, - 5126: 0x82E2, - 5127: 0x82E4, - 5128: 0x82E8, - 5129: 0x82EA, - 5130: 0x82ED, - 5131: 0x82EF, - 5132: 0x82F6, - 5133: 0x82F7, - 5134: 0x82FD, - 5135: 0x82FE, - 5136: 0x8300, - 5137: 0x8301, - 5138: 0x8307, - 5139: 0x8308, - 5140: 0x830A, - 5141: 0x830B, - 5142: 0x8354, - 5143: 0x831B, - 5144: 0x831D, - 5145: 0x831E, - 5146: 0x831F, - 5147: 0x8321, - 5148: 0x8322, - 5149: 0x832C, - 5150: 0x832D, - 5151: 0x832E, - 5152: 0x8330, - 5153: 0x8333, - 5154: 0x8337, - 5155: 0x833A, - 5156: 0x833C, - 5157: 0x833D, - 5158: 0x8342, - 5159: 0x8343, - 5160: 0x8344, - 5161: 0x8347, - 5162: 0x834D, - 5163: 0x834E, - 5164: 0x8351, - 5165: 0x8355, - 5166: 0x8356, - 5167: 0x8357, - 5168: 0x8370, - 5169: 0x8378, - 5170: 0x837D, - 5171: 0x837F, - 5172: 0x8380, - 5173: 0x8382, - 5174: 0x8384, - 5175: 0x8386, - 5176: 0x838D, - 5177: 0x8392, - 5178: 0x8394, - 5179: 0x8395, - 5180: 0x8398, - 5181: 0x8399, - 5182: 0x839B, - 5183: 0x839C, - 5184: 0x839D, - 5185: 0x83A6, - 5186: 0x83A7, - 5187: 0x83A9, - 5188: 0x83AC, - 5189: 0x83BE, - 5190: 0x83BF, - 5191: 0x83C0, - 5192: 0x83C7, - 5193: 0x83C9, - 5194: 0x83CF, - 5195: 0x83D0, - 5196: 0x83D1, - 5197: 0x83D4, - 5198: 0x83DD, - 5199: 0x8353, - 5200: 0x83E8, - 5201: 0x83EA, - 5202: 0x83F6, - 5203: 0x83F8, - 5204: 0x83F9, - 5205: 0x83FC, - 5206: 0x8401, - 5207: 0x8406, - 5208: 0x840A, - 5209: 0x840F, - 5210: 0x8411, - 5211: 0x8415, - 5212: 0x8419, - 5213: 0x83AD, - 5214: 0x842F, - 5215: 0x8439, - 5216: 0x8445, - 5217: 0x8447, - 5218: 0x8448, - 5219: 0x844A, - 5220: 0x844D, - 5221: 0x844F, - 5222: 0x8451, - 5223: 0x8452, - 5224: 0x8456, - 5225: 0x8458, - 5226: 0x8459, - 5227: 0x845A, - 5228: 0x845C, - 5229: 0x8460, - 5230: 0x8464, - 5231: 0x8465, - 5232: 0x8467, - 5233: 0x846A, - 5234: 0x8470, - 5235: 0x8473, - 5236: 0x8474, - 5237: 0x8476, - 5238: 0x8478, - 5239: 0x847C, - 5240: 0x847D, - 5241: 0x8481, - 5242: 0x8485, - 5243: 0x8492, - 5244: 0x8493, - 5245: 0x8495, - 5246: 0x849E, - 5247: 0x84A6, - 5248: 0x84A8, - 5249: 0x84A9, - 5250: 0x84AA, - 5251: 0x84AF, - 5252: 0x84B1, - 5253: 0x84B4, - 5254: 0x84BA, - 5255: 0x84BD, - 5256: 0x84BE, - 5257: 0x84C0, - 5258: 0x84C2, - 5259: 0x84C7, - 5260: 0x84C8, - 5261: 0x84CC, - 5262: 0x84CF, - 5263: 0x84D3, - 5264: 0x84DC, - 5265: 0x84E7, - 5266: 0x84EA, - 5267: 0x84EF, - 5268: 0x84F0, - 5269: 0x84F1, - 5270: 0x84F2, - 5271: 0x84F7, - 5272: 0x8532, - 5273: 0x84FA, - 5274: 0x84FB, - 5275: 0x84FD, - 5276: 0x8502, - 5277: 0x8503, - 5278: 0x8507, - 5279: 0x850C, - 5280: 0x850E, - 5281: 0x8510, - 5282: 0x851C, - 5283: 0x851E, - 5284: 0x8522, - 5285: 0x8523, - 5286: 0x8524, - 5287: 0x8525, - 5288: 0x8527, - 5289: 0x852A, - 5290: 0x852B, - 5291: 0x852F, - 5292: 0x8533, - 5293: 0x8534, - 5294: 0x8536, - 5295: 0x853F, - 5296: 0x8546, - 5297: 0x854F, - 5298: 0x8550, - 5299: 0x8551, - 5300: 0x8552, - 5301: 0x8553, - 5302: 0x8556, - 5303: 0x8559, - 5304: 0x855C, - 5305: 0x855D, - 5306: 0x855E, - 5307: 0x855F, - 5308: 0x8560, - 5309: 0x8561, - 5310: 0x8562, - 5311: 0x8564, - 5312: 0x856B, - 5313: 0x856F, - 5314: 0x8579, - 5315: 0x857A, - 5316: 0x857B, - 5317: 0x857D, - 5318: 0x857F, - 5319: 0x8581, - 5320: 0x8585, - 5321: 0x8586, - 5322: 0x8589, - 5323: 0x858B, - 5324: 0x858C, - 5325: 0x858F, - 5326: 0x8593, - 5327: 0x8598, - 5328: 0x859D, - 5329: 0x859F, - 5330: 0x85A0, - 5331: 0x85A2, - 5332: 0x85A5, - 5333: 0x85A7, - 5334: 0x85B4, - 5335: 0x85B6, - 5336: 0x85B7, - 5337: 0x85B8, - 5338: 0x85BC, - 5339: 0x85BD, - 5340: 0x85BE, - 5341: 0x85BF, - 5342: 0x85C2, - 5343: 0x85C7, - 5344: 0x85CA, - 5345: 0x85CB, - 5346: 0x85CE, - 5347: 0x85AD, - 5348: 0x85D8, - 5349: 0x85DA, - 5350: 0x85DF, - 5351: 0x85E0, - 5352: 0x85E6, - 5353: 0x85E8, - 5354: 0x85ED, - 5355: 0x85F3, - 5356: 0x85F6, - 5357: 0x85FC, - 5358: 0x85FF, - 5359: 0x8600, - 5360: 0x8604, - 5361: 0x8605, - 5362: 0x860D, - 5363: 0x860E, - 5364: 0x8610, - 5365: 0x8611, - 5366: 0x8612, - 5367: 0x8618, - 5368: 0x8619, - 5369: 0x861B, - 5370: 0x861E, - 5371: 0x8621, - 5372: 0x8627, - 5373: 0x8629, - 5374: 0x8636, - 5375: 0x8638, - 5376: 0x863A, - 5377: 0x863C, - 5378: 0x863D, - 5379: 0x8640, - 5380: 0x8642, - 5381: 0x8646, - 5382: 0x8652, - 5383: 0x8653, - 5384: 0x8656, - 5385: 0x8657, - 5386: 0x8658, - 5387: 0x8659, - 5388: 0x865D, - 5389: 0x8660, - 5390: 0x8661, - 5391: 0x8662, - 5392: 0x8663, - 5393: 0x8664, - 5394: 0x8669, - 5395: 0x866C, - 5396: 0x866F, - 5397: 0x8675, - 5398: 0x8676, - 5399: 0x8677, - 5400: 0x867A, - 5401: 0x868D, - 5402: 0x8691, - 5403: 0x8696, - 5404: 0x8698, - 5405: 0x869A, - 5406: 0x869C, - 5407: 0x86A1, - 5408: 0x86A6, - 5409: 0x86A7, - 5410: 0x86A8, - 5411: 0x86AD, - 5412: 0x86B1, - 5413: 0x86B3, - 5414: 0x86B4, - 5415: 0x86B5, - 5416: 0x86B7, - 5417: 0x86B8, - 5418: 0x86B9, - 5419: 0x86BF, - 5420: 0x86C0, - 5421: 0x86C1, - 5422: 0x86C3, - 5423: 0x86C5, - 5424: 0x86D1, - 5425: 0x86D2, - 5426: 0x86D5, - 5427: 0x86D7, - 5428: 0x86DA, - 5429: 0x86DC, - 5430: 0x86E0, - 5431: 0x86E3, - 5432: 0x86E5, - 5433: 0x86E7, - 5434: 0x8688, - 5435: 0x86FA, - 5436: 0x86FC, - 5437: 0x86FD, - 5438: 0x8704, - 5439: 0x8705, - 5440: 0x8707, - 5441: 0x870B, - 5442: 0x870E, - 5443: 0x870F, - 5444: 0x8710, - 5445: 0x8713, - 5446: 0x8714, - 5447: 0x8719, - 5448: 0x871E, - 5449: 0x871F, - 5450: 0x8721, - 5451: 0x8723, - 5452: 0x8728, - 5453: 0x872E, - 5454: 0x872F, - 5455: 0x8731, - 5456: 0x8732, - 5457: 0x8739, - 5458: 0x873A, - 5459: 0x873C, - 5460: 0x873D, - 5461: 0x873E, - 5462: 0x8740, - 5463: 0x8743, - 5464: 0x8745, - 5465: 0x874D, - 5466: 0x8758, - 5467: 0x875D, - 5468: 0x8761, - 5469: 0x8764, - 5470: 0x8765, - 5471: 0x876F, - 5472: 0x8771, - 5473: 0x8772, - 5474: 0x877B, - 5475: 0x8783, - 5476: 0x8784, - 5477: 0x8785, - 5478: 0x8786, - 5479: 0x8787, - 5480: 0x8788, - 5481: 0x8789, - 5482: 0x878B, - 5483: 0x878C, - 5484: 0x8790, - 5485: 0x8793, - 5486: 0x8795, - 5487: 0x8797, - 5488: 0x8798, - 5489: 0x8799, - 5490: 0x879E, - 5491: 0x87A0, - 5492: 0x87A3, - 5493: 0x87A7, - 5494: 0x87AC, - 5495: 0x87AD, - 5496: 0x87AE, - 5497: 0x87B1, - 5498: 0x87B5, - 5499: 0x87BE, - 5500: 0x87BF, - 5501: 0x87C1, - 5502: 0x87C8, - 5503: 0x87C9, - 5504: 0x87CA, - 5505: 0x87CE, - 5506: 0x87D5, - 5507: 0x87D6, - 5508: 0x87D9, - 5509: 0x87DA, - 5510: 0x87DC, - 5511: 0x87DF, - 5512: 0x87E2, - 5513: 0x87E3, - 5514: 0x87E4, - 5515: 0x87EA, - 5516: 0x87EB, - 5517: 0x87ED, - 5518: 0x87F1, - 5519: 0x87F3, - 5520: 0x87F8, - 5521: 0x87FA, - 5522: 0x87FF, - 5523: 0x8801, - 5524: 0x8803, - 5525: 0x8806, - 5526: 0x8809, - 5527: 0x880A, - 5528: 0x880B, - 5529: 0x8810, - 5530: 0x8819, - 5531: 0x8812, - 5532: 0x8813, - 5533: 0x8814, - 5534: 0x8818, - 5535: 0x881A, - 5536: 0x881B, - 5537: 0x881C, - 5538: 0x881E, - 5539: 0x881F, - 5540: 0x8828, - 5541: 0x882D, - 5542: 0x882E, - 5543: 0x8830, - 5544: 0x8832, - 5545: 0x8835, - 5546: 0x883A, - 5547: 0x883C, - 5548: 0x8841, - 5549: 0x8843, - 5550: 0x8845, - 5551: 0x8848, - 5552: 0x8849, - 5553: 0x884A, - 5554: 0x884B, - 5555: 0x884E, - 5556: 0x8851, - 5557: 0x8855, - 5558: 0x8856, - 5559: 0x8858, - 5560: 0x885A, - 5561: 0x885C, - 5562: 0x885F, - 5563: 0x8860, - 5564: 0x8864, - 5565: 0x8869, - 5566: 0x8871, - 5567: 0x8879, - 5568: 0x887B, - 5569: 0x8880, - 5570: 0x8898, - 5571: 0x889A, - 5572: 0x889B, - 5573: 0x889C, - 5574: 0x889F, - 5575: 0x88A0, - 5576: 0x88A8, - 5577: 0x88AA, - 5578: 0x88BA, - 5579: 0x88BD, - 5580: 0x88BE, - 5581: 0x88C0, - 5582: 0x88CA, - 5583: 0x88CB, - 5584: 0x88CC, - 5585: 0x88CD, - 5586: 0x88CE, - 5587: 0x88D1, - 5588: 0x88D2, - 5589: 0x88D3, - 5590: 0x88DB, - 5591: 0x88DE, - 5592: 0x88E7, - 5593: 0x88EF, - 5594: 0x88F0, - 5595: 0x88F1, - 5596: 0x88F5, - 5597: 0x88F7, - 5598: 0x8901, - 5599: 0x8906, - 5600: 0x890D, - 5601: 0x890E, - 5602: 0x890F, - 5603: 0x8915, - 5604: 0x8916, - 5605: 0x8918, - 5606: 0x8919, - 5607: 0x891A, - 5608: 0x891C, - 5609: 0x8920, - 5610: 0x8926, - 5611: 0x8927, - 5612: 0x8928, - 5613: 0x8930, - 5614: 0x8931, - 5615: 0x8932, - 5616: 0x8935, - 5617: 0x8939, - 5618: 0x893A, - 5619: 0x893E, - 5620: 0x8940, - 5621: 0x8942, - 5622: 0x8945, - 5623: 0x8946, - 5624: 0x8949, - 5625: 0x894F, - 5626: 0x8952, - 5627: 0x8957, - 5628: 0x895A, - 5629: 0x895B, - 5630: 0x895C, - 5631: 0x8961, - 5632: 0x8962, - 5633: 0x8963, - 5634: 0x896B, - 5635: 0x896E, - 5636: 0x8970, - 5637: 0x8973, - 5638: 0x8975, - 5639: 0x897A, - 5640: 0x897B, - 5641: 0x897C, - 5642: 0x897D, - 5643: 0x8989, - 5644: 0x898D, - 5645: 0x8990, - 5646: 0x8994, - 5647: 0x8995, - 5648: 0x899B, - 5649: 0x899C, - 5650: 0x899F, - 5651: 0x89A0, - 5652: 0x89A5, - 5653: 0x89B0, - 5654: 0x89B4, - 5655: 0x89B5, - 5656: 0x89B6, - 5657: 0x89B7, - 5658: 0x89BC, - 5659: 0x89D4, - 5660: 0x89D5, - 5661: 0x89D6, - 5662: 0x89D7, - 5663: 0x89D8, - 5664: 0x89E5, - 5665: 0x89E9, - 5666: 0x89EB, - 5667: 0x89ED, - 5668: 0x89F1, - 5669: 0x89F3, - 5670: 0x89F6, - 5671: 0x89F9, - 5672: 0x89FD, - 5673: 0x89FF, - 5674: 0x8A04, - 5675: 0x8A05, - 5676: 0x8A07, - 5677: 0x8A0F, - 5678: 0x8A11, - 5679: 0x8A12, - 5680: 0x8A14, - 5681: 0x8A15, - 5682: 0x8A1E, - 5683: 0x8A20, - 5684: 0x8A22, - 5685: 0x8A24, - 5686: 0x8A26, - 5687: 0x8A2B, - 5688: 0x8A2C, - 5689: 0x8A2F, - 5690: 0x8A35, - 5691: 0x8A37, - 5692: 0x8A3D, - 5693: 0x8A3E, - 5694: 0x8A40, - 5695: 0x8A43, - 5696: 0x8A45, - 5697: 0x8A47, - 5698: 0x8A49, - 5699: 0x8A4D, - 5700: 0x8A4E, - 5701: 0x8A53, - 5702: 0x8A56, - 5703: 0x8A57, - 5704: 0x8A58, - 5705: 0x8A5C, - 5706: 0x8A5D, - 5707: 0x8A61, - 5708: 0x8A65, - 5709: 0x8A67, - 5710: 0x8A75, - 5711: 0x8A76, - 5712: 0x8A77, - 5713: 0x8A79, - 5714: 0x8A7A, - 5715: 0x8A7B, - 5716: 0x8A7E, - 5717: 0x8A7F, - 5718: 0x8A80, - 5719: 0x8A83, - 5720: 0x8A86, - 5721: 0x8A8B, - 5722: 0x8A8F, - 5723: 0x8A90, - 5724: 0x8A92, - 5725: 0x8A96, - 5726: 0x8A97, - 5727: 0x8A99, - 5728: 0x8A9F, - 5729: 0x8AA7, - 5730: 0x8AA9, - 5731: 0x8AAE, - 5732: 0x8AAF, - 5733: 0x8AB3, - 5734: 0x8AB6, - 5735: 0x8AB7, - 5736: 0x8ABB, - 5737: 0x8ABE, - 5738: 0x8AC3, - 5739: 0x8AC6, - 5740: 0x8AC8, - 5741: 0x8AC9, - 5742: 0x8ACA, - 5743: 0x8AD1, - 5744: 0x8AD3, - 5745: 0x8AD4, - 5746: 0x8AD5, - 5747: 0x8AD7, - 5748: 0x8ADD, - 5749: 0x8ADF, - 5750: 0x8AEC, - 5751: 0x8AF0, - 5752: 0x8AF4, - 5753: 0x8AF5, - 5754: 0x8AF6, - 5755: 0x8AFC, - 5756: 0x8AFF, - 5757: 0x8B05, - 5758: 0x8B06, - 5759: 0x8B0B, - 5760: 0x8B11, - 5761: 0x8B1C, - 5762: 0x8B1E, - 5763: 0x8B1F, - 5764: 0x8B0A, - 5765: 0x8B2D, - 5766: 0x8B30, - 5767: 0x8B37, - 5768: 0x8B3C, - 5769: 0x8B42, - 5770: 0x8B43, - 5771: 0x8B44, - 5772: 0x8B45, - 5773: 0x8B46, - 5774: 0x8B48, - 5775: 0x8B52, - 5776: 0x8B53, - 5777: 0x8B54, - 5778: 0x8B59, - 5779: 0x8B4D, - 5780: 0x8B5E, - 5781: 0x8B63, - 5782: 0x8B6D, - 5783: 0x8B76, - 5784: 0x8B78, - 5785: 0x8B79, - 5786: 0x8B7C, - 5787: 0x8B7E, - 5788: 0x8B81, - 5789: 0x8B84, - 5790: 0x8B85, - 5791: 0x8B8B, - 5792: 0x8B8D, - 5793: 0x8B8F, - 5794: 0x8B94, - 5795: 0x8B95, - 5796: 0x8B9C, - 5797: 0x8B9E, - 5798: 0x8B9F, - 5799: 0x8C38, - 5800: 0x8C39, - 5801: 0x8C3D, - 5802: 0x8C3E, - 5803: 0x8C45, - 5804: 0x8C47, - 5805: 0x8C49, - 5806: 0x8C4B, - 5807: 0x8C4F, - 5808: 0x8C51, - 5809: 0x8C53, - 5810: 0x8C54, - 5811: 0x8C57, - 5812: 0x8C58, - 5813: 0x8C5B, - 5814: 0x8C5D, - 5815: 0x8C59, - 5816: 0x8C63, - 5817: 0x8C64, - 5818: 0x8C66, - 5819: 0x8C68, - 5820: 0x8C69, - 5821: 0x8C6D, - 5822: 0x8C73, - 5823: 0x8C75, - 5824: 0x8C76, - 5825: 0x8C7B, - 5826: 0x8C7E, - 5827: 0x8C86, - 5828: 0x8C87, - 5829: 0x8C8B, - 5830: 0x8C90, - 5831: 0x8C92, - 5832: 0x8C93, - 5833: 0x8C99, - 5834: 0x8C9B, - 5835: 0x8C9C, - 5836: 0x8CA4, - 5837: 0x8CB9, - 5838: 0x8CBA, - 5839: 0x8CC5, - 5840: 0x8CC6, - 5841: 0x8CC9, - 5842: 0x8CCB, - 5843: 0x8CCF, - 5844: 0x8CD6, - 5845: 0x8CD5, - 5846: 0x8CD9, - 5847: 0x8CDD, - 5848: 0x8CE1, - 5849: 0x8CE8, - 5850: 0x8CEC, - 5851: 0x8CEF, - 5852: 0x8CF0, - 5853: 0x8CF2, - 5854: 0x8CF5, - 5855: 0x8CF7, - 5856: 0x8CF8, - 5857: 0x8CFE, - 5858: 0x8CFF, - 5859: 0x8D01, - 5860: 0x8D03, - 5861: 0x8D09, - 5862: 0x8D12, - 5863: 0x8D17, - 5864: 0x8D1B, - 5865: 0x8D65, - 5866: 0x8D69, - 5867: 0x8D6C, - 5868: 0x8D6E, - 5869: 0x8D7F, - 5870: 0x8D82, - 5871: 0x8D84, - 5872: 0x8D88, - 5873: 0x8D8D, - 5874: 0x8D90, - 5875: 0x8D91, - 5876: 0x8D95, - 5877: 0x8D9E, - 5878: 0x8D9F, - 5879: 0x8DA0, - 5880: 0x8DA6, - 5881: 0x8DAB, - 5882: 0x8DAC, - 5883: 0x8DAF, - 5884: 0x8DB2, - 5885: 0x8DB5, - 5886: 0x8DB7, - 5887: 0x8DB9, - 5888: 0x8DBB, - 5889: 0x8DC0, - 5890: 0x8DC5, - 5891: 0x8DC6, - 5892: 0x8DC7, - 5893: 0x8DC8, - 5894: 0x8DCA, - 5895: 0x8DCE, - 5896: 0x8DD1, - 5897: 0x8DD4, - 5898: 0x8DD5, - 5899: 0x8DD7, - 5900: 0x8DD9, - 5901: 0x8DE4, - 5902: 0x8DE5, - 5903: 0x8DE7, - 5904: 0x8DEC, - 5905: 0x8DF0, - 5906: 0x8DBC, - 5907: 0x8DF1, - 5908: 0x8DF2, - 5909: 0x8DF4, - 5910: 0x8DFD, - 5911: 0x8E01, - 5912: 0x8E04, - 5913: 0x8E05, - 5914: 0x8E06, - 5915: 0x8E0B, - 5916: 0x8E11, - 5917: 0x8E14, - 5918: 0x8E16, - 5919: 0x8E20, - 5920: 0x8E21, - 5921: 0x8E22, - 5922: 0x8E23, - 5923: 0x8E26, - 5924: 0x8E27, - 5925: 0x8E31, - 5926: 0x8E33, - 5927: 0x8E36, - 5928: 0x8E37, - 5929: 0x8E38, - 5930: 0x8E39, - 5931: 0x8E3D, - 5932: 0x8E40, - 5933: 0x8E41, - 5934: 0x8E4B, - 5935: 0x8E4D, - 5936: 0x8E4E, - 5937: 0x8E4F, - 5938: 0x8E54, - 5939: 0x8E5B, - 5940: 0x8E5C, - 5941: 0x8E5D, - 5942: 0x8E5E, - 5943: 0x8E61, - 5944: 0x8E62, - 5945: 0x8E69, - 5946: 0x8E6C, - 5947: 0x8E6D, - 5948: 0x8E6F, - 5949: 0x8E70, - 5950: 0x8E71, - 5951: 0x8E79, - 5952: 0x8E7A, - 5953: 0x8E7B, - 5954: 0x8E82, - 5955: 0x8E83, - 5956: 0x8E89, - 5957: 0x8E90, - 5958: 0x8E92, - 5959: 0x8E95, - 5960: 0x8E9A, - 5961: 0x8E9B, - 5962: 0x8E9D, - 5963: 0x8E9E, - 5964: 0x8EA2, - 5965: 0x8EA7, - 5966: 0x8EA9, - 5967: 0x8EAD, - 5968: 0x8EAE, - 5969: 0x8EB3, - 5970: 0x8EB5, - 5971: 0x8EBA, - 5972: 0x8EBB, - 5973: 0x8EC0, - 5974: 0x8EC1, - 5975: 0x8EC3, - 5976: 0x8EC4, - 5977: 0x8EC7, - 5978: 0x8ECF, - 5979: 0x8ED1, - 5980: 0x8ED4, - 5981: 0x8EDC, - 5982: 0x8EE8, - 5983: 0x8EEE, - 5984: 0x8EF0, - 5985: 0x8EF1, - 5986: 0x8EF7, - 5987: 0x8EF9, - 5988: 0x8EFA, - 5989: 0x8EED, - 5990: 0x8F00, - 5991: 0x8F02, - 5992: 0x8F07, - 5993: 0x8F08, - 5994: 0x8F0F, - 5995: 0x8F10, - 5996: 0x8F16, - 5997: 0x8F17, - 5998: 0x8F18, - 5999: 0x8F1E, - 6000: 0x8F20, - 6001: 0x8F21, - 6002: 0x8F23, - 6003: 0x8F25, - 6004: 0x8F27, - 6005: 0x8F28, - 6006: 0x8F2C, - 6007: 0x8F2D, - 6008: 0x8F2E, - 6009: 0x8F34, - 6010: 0x8F35, - 6011: 0x8F36, - 6012: 0x8F37, - 6013: 0x8F3A, - 6014: 0x8F40, - 6015: 0x8F41, - 6016: 0x8F43, - 6017: 0x8F47, - 6018: 0x8F4F, - 6019: 0x8F51, - 6020: 0x8F52, - 6021: 0x8F53, - 6022: 0x8F54, - 6023: 0x8F55, - 6024: 0x8F58, - 6025: 0x8F5D, - 6026: 0x8F5E, - 6027: 0x8F65, - 6028: 0x8F9D, - 6029: 0x8FA0, - 6030: 0x8FA1, - 6031: 0x8FA4, - 6032: 0x8FA5, - 6033: 0x8FA6, - 6034: 0x8FB5, - 6035: 0x8FB6, - 6036: 0x8FB8, - 6037: 0x8FBE, - 6038: 0x8FC0, - 6039: 0x8FC1, - 6040: 0x8FC6, - 6041: 0x8FCA, - 6042: 0x8FCB, - 6043: 0x8FCD, - 6044: 0x8FD0, - 6045: 0x8FD2, - 6046: 0x8FD3, - 6047: 0x8FD5, - 6048: 0x8FE0, - 6049: 0x8FE3, - 6050: 0x8FE4, - 6051: 0x8FE8, - 6052: 0x8FEE, - 6053: 0x8FF1, - 6054: 0x8FF5, - 6055: 0x8FF6, - 6056: 0x8FFB, - 6057: 0x8FFE, - 6058: 0x9002, - 6059: 0x9004, - 6060: 0x9008, - 6061: 0x900C, - 6062: 0x9018, - 6063: 0x901B, - 6064: 0x9028, - 6065: 0x9029, - 6066: 0x902F, - 6067: 0x902A, - 6068: 0x902C, - 6069: 0x902D, - 6070: 0x9033, - 6071: 0x9034, - 6072: 0x9037, - 6073: 0x903F, - 6074: 0x9043, - 6075: 0x9044, - 6076: 0x904C, - 6077: 0x905B, - 6078: 0x905D, - 6079: 0x9062, - 6080: 0x9066, - 6081: 0x9067, - 6082: 0x906C, - 6083: 0x9070, - 6084: 0x9074, - 6085: 0x9079, - 6086: 0x9085, - 6087: 0x9088, - 6088: 0x908B, - 6089: 0x908C, - 6090: 0x908E, - 6091: 0x9090, - 6092: 0x9095, - 6093: 0x9097, - 6094: 0x9098, - 6095: 0x9099, - 6096: 0x909B, - 6097: 0x90A0, - 6098: 0x90A1, - 6099: 0x90A2, - 6100: 0x90A5, - 6101: 0x90B0, - 6102: 0x90B2, - 6103: 0x90B3, - 6104: 0x90B4, - 6105: 0x90B6, - 6106: 0x90BD, - 6107: 0x90CC, - 6108: 0x90BE, - 6109: 0x90C3, - 6110: 0x90C4, - 6111: 0x90C5, - 6112: 0x90C7, - 6113: 0x90C8, - 6114: 0x90D5, - 6115: 0x90D7, - 6116: 0x90D8, - 6117: 0x90D9, - 6118: 0x90DC, - 6119: 0x90DD, - 6120: 0x90DF, - 6121: 0x90E5, - 6122: 0x90D2, - 6123: 0x90F6, - 6124: 0x90EB, - 6125: 0x90EF, - 6126: 0x90F0, - 6127: 0x90F4, - 6128: 0x90FE, - 6129: 0x90FF, - 6130: 0x9100, - 6131: 0x9104, - 6132: 0x9105, - 6133: 0x9106, - 6134: 0x9108, - 6135: 0x910D, - 6136: 0x9110, - 6137: 0x9114, - 6138: 0x9116, - 6139: 0x9117, - 6140: 0x9118, - 6141: 0x911A, - 6142: 0x911C, - 6143: 0x911E, - 6144: 0x9120, - 6145: 0x9125, - 6146: 0x9122, - 6147: 0x9123, - 6148: 0x9127, - 6149: 0x9129, - 6150: 0x912E, - 6151: 0x912F, - 6152: 0x9131, - 6153: 0x9134, - 6154: 0x9136, - 6155: 0x9137, - 6156: 0x9139, - 6157: 0x913A, - 6158: 0x913C, - 6159: 0x913D, - 6160: 0x9143, - 6161: 0x9147, - 6162: 0x9148, - 6163: 0x914F, - 6164: 0x9153, - 6165: 0x9157, - 6166: 0x9159, - 6167: 0x915A, - 6168: 0x915B, - 6169: 0x9161, - 6170: 0x9164, - 6171: 0x9167, - 6172: 0x916D, - 6173: 0x9174, - 6174: 0x9179, - 6175: 0x917A, - 6176: 0x917B, - 6177: 0x9181, - 6178: 0x9183, - 6179: 0x9185, - 6180: 0x9186, - 6181: 0x918A, - 6182: 0x918E, - 6183: 0x9191, - 6184: 0x9193, - 6185: 0x9194, - 6186: 0x9195, - 6187: 0x9198, - 6188: 0x919E, - 6189: 0x91A1, - 6190: 0x91A6, - 6191: 0x91A8, - 6192: 0x91AC, - 6193: 0x91AD, - 6194: 0x91AE, - 6195: 0x91B0, - 6196: 0x91B1, - 6197: 0x91B2, - 6198: 0x91B3, - 6199: 0x91B6, - 6200: 0x91BB, - 6201: 0x91BC, - 6202: 0x91BD, - 6203: 0x91BF, - 6204: 0x91C2, - 6205: 0x91C3, - 6206: 0x91C5, - 6207: 0x91D3, - 6208: 0x91D4, - 6209: 0x91D7, - 6210: 0x91D9, - 6211: 0x91DA, - 6212: 0x91DE, - 6213: 0x91E4, - 6214: 0x91E5, - 6215: 0x91E9, - 6216: 0x91EA, - 6217: 0x91EC, - 6218: 0x91ED, - 6219: 0x91EE, - 6220: 0x91EF, - 6221: 0x91F0, - 6222: 0x91F1, - 6223: 0x91F7, - 6224: 0x91F9, - 6225: 0x91FB, - 6226: 0x91FD, - 6227: 0x9200, - 6228: 0x9201, - 6229: 0x9204, - 6230: 0x9205, - 6231: 0x9206, - 6232: 0x9207, - 6233: 0x9209, - 6234: 0x920A, - 6235: 0x920C, - 6236: 0x9210, - 6237: 0x9212, - 6238: 0x9213, - 6239: 0x9216, - 6240: 0x9218, - 6241: 0x921C, - 6242: 0x921D, - 6243: 0x9223, - 6244: 0x9224, - 6245: 0x9225, - 6246: 0x9226, - 6247: 0x9228, - 6248: 0x922E, - 6249: 0x922F, - 6250: 0x9230, - 6251: 0x9233, - 6252: 0x9235, - 6253: 0x9236, - 6254: 0x9238, - 6255: 0x9239, - 6256: 0x923A, - 6257: 0x923C, - 6258: 0x923E, - 6259: 0x9240, - 6260: 0x9242, - 6261: 0x9243, - 6262: 0x9246, - 6263: 0x9247, - 6264: 0x924A, - 6265: 0x924D, - 6266: 0x924E, - 6267: 0x924F, - 6268: 0x9251, - 6269: 0x9258, - 6270: 0x9259, - 6271: 0x925C, - 6272: 0x925D, - 6273: 0x9260, - 6274: 0x9261, - 6275: 0x9265, - 6276: 0x9267, - 6277: 0x9268, - 6278: 0x9269, - 6279: 0x926E, - 6280: 0x926F, - 6281: 0x9270, - 6282: 0x9275, - 6283: 0x9276, - 6284: 0x9277, - 6285: 0x9278, - 6286: 0x9279, - 6287: 0x927B, - 6288: 0x927C, - 6289: 0x927D, - 6290: 0x927F, - 6291: 0x9288, - 6292: 0x9289, - 6293: 0x928A, - 6294: 0x928D, - 6295: 0x928E, - 6296: 0x9292, - 6297: 0x9297, - 6298: 0x9299, - 6299: 0x929F, - 6300: 0x92A0, - 6301: 0x92A4, - 6302: 0x92A5, - 6303: 0x92A7, - 6304: 0x92A8, - 6305: 0x92AB, - 6306: 0x92AF, - 6307: 0x92B2, - 6308: 0x92B6, - 6309: 0x92B8, - 6310: 0x92BA, - 6311: 0x92BB, - 6312: 0x92BC, - 6313: 0x92BD, - 6314: 0x92BF, - 6315: 0x92C0, - 6316: 0x92C1, - 6317: 0x92C2, - 6318: 0x92C3, - 6319: 0x92C5, - 6320: 0x92C6, - 6321: 0x92C7, - 6322: 0x92C8, - 6323: 0x92CB, - 6324: 0x92CC, - 6325: 0x92CD, - 6326: 0x92CE, - 6327: 0x92D0, - 6328: 0x92D3, - 6329: 0x92D5, - 6330: 0x92D7, - 6331: 0x92D8, - 6332: 0x92D9, - 6333: 0x92DC, - 6334: 0x92DD, - 6335: 0x92DF, - 6336: 0x92E0, - 6337: 0x92E1, - 6338: 0x92E3, - 6339: 0x92E5, - 6340: 0x92E7, - 6341: 0x92E8, - 6342: 0x92EC, - 6343: 0x92EE, - 6344: 0x92F0, - 6345: 0x92F9, - 6346: 0x92FB, - 6347: 0x92FF, - 6348: 0x9300, - 6349: 0x9302, - 6350: 0x9308, - 6351: 0x930D, - 6352: 0x9311, - 6353: 0x9314, - 6354: 0x9315, - 6355: 0x931C, - 6356: 0x931D, - 6357: 0x931E, - 6358: 0x931F, - 6359: 0x9321, - 6360: 0x9324, - 6361: 0x9325, - 6362: 0x9327, - 6363: 0x9329, - 6364: 0x932A, - 6365: 0x9333, - 6366: 0x9334, - 6367: 0x9336, - 6368: 0x9337, - 6369: 0x9347, - 6370: 0x9348, - 6371: 0x9349, - 6372: 0x9350, - 6373: 0x9351, - 6374: 0x9352, - 6375: 0x9355, - 6376: 0x9357, - 6377: 0x9358, - 6378: 0x935A, - 6379: 0x935E, - 6380: 0x9364, - 6381: 0x9365, - 6382: 0x9367, - 6383: 0x9369, - 6384: 0x936A, - 6385: 0x936D, - 6386: 0x936F, - 6387: 0x9370, - 6388: 0x9371, - 6389: 0x9373, - 6390: 0x9374, - 6391: 0x9376, - 6392: 0x937A, - 6393: 0x937D, - 6394: 0x937F, - 6395: 0x9380, - 6396: 0x9381, - 6397: 0x9382, - 6398: 0x9388, - 6399: 0x938A, - 6400: 0x938B, - 6401: 0x938D, - 6402: 0x938F, - 6403: 0x9392, - 6404: 0x9395, - 6405: 0x9398, - 6406: 0x939B, - 6407: 0x939E, - 6408: 0x93A1, - 6409: 0x93A3, - 6410: 0x93A4, - 6411: 0x93A6, - 6412: 0x93A8, - 6413: 0x93AB, - 6414: 0x93B4, - 6415: 0x93B5, - 6416: 0x93B6, - 6417: 0x93BA, - 6418: 0x93A9, - 6419: 0x93C1, - 6420: 0x93C4, - 6421: 0x93C5, - 6422: 0x93C6, - 6423: 0x93C7, - 6424: 0x93C9, - 6425: 0x93CA, - 6426: 0x93CB, - 6427: 0x93CC, - 6428: 0x93CD, - 6429: 0x93D3, - 6430: 0x93D9, - 6431: 0x93DC, - 6432: 0x93DE, - 6433: 0x93DF, - 6434: 0x93E2, - 6435: 0x93E6, - 6436: 0x93E7, - 6437: 0x93F9, - 6438: 0x93F7, - 6439: 0x93F8, - 6440: 0x93FA, - 6441: 0x93FB, - 6442: 0x93FD, - 6443: 0x9401, - 6444: 0x9402, - 6445: 0x9404, - 6446: 0x9408, - 6447: 0x9409, - 6448: 0x940D, - 6449: 0x940E, - 6450: 0x940F, - 6451: 0x9415, - 6452: 0x9416, - 6453: 0x9417, - 6454: 0x941F, - 6455: 0x942E, - 6456: 0x942F, - 6457: 0x9431, - 6458: 0x9432, - 6459: 0x9433, - 6460: 0x9434, - 6461: 0x943B, - 6462: 0x943F, - 6463: 0x943D, - 6464: 0x9443, - 6465: 0x9445, - 6466: 0x9448, - 6467: 0x944A, - 6468: 0x944C, - 6469: 0x9455, - 6470: 0x9459, - 6471: 0x945C, - 6472: 0x945F, - 6473: 0x9461, - 6474: 0x9463, - 6475: 0x9468, - 6476: 0x946B, - 6477: 0x946D, - 6478: 0x946E, - 6479: 0x946F, - 6480: 0x9471, - 6481: 0x9472, - 6482: 0x9484, - 6483: 0x9483, - 6484: 0x9578, - 6485: 0x9579, - 6486: 0x957E, - 6487: 0x9584, - 6488: 0x9588, - 6489: 0x958C, - 6490: 0x958D, - 6491: 0x958E, - 6492: 0x959D, - 6493: 0x959E, - 6494: 0x959F, - 6495: 0x95A1, - 6496: 0x95A6, - 6497: 0x95A9, - 6498: 0x95AB, - 6499: 0x95AC, - 6500: 0x95B4, - 6501: 0x95B6, - 6502: 0x95BA, - 6503: 0x95BD, - 6504: 0x95BF, - 6505: 0x95C6, - 6506: 0x95C8, - 6507: 0x95C9, - 6508: 0x95CB, - 6509: 0x95D0, - 6510: 0x95D1, - 6511: 0x95D2, - 6512: 0x95D3, - 6513: 0x95D9, - 6514: 0x95DA, - 6515: 0x95DD, - 6516: 0x95DE, - 6517: 0x95DF, - 6518: 0x95E0, - 6519: 0x95E4, - 6520: 0x95E6, - 6521: 0x961D, - 6522: 0x961E, - 6523: 0x9622, - 6524: 0x9624, - 6525: 0x9625, - 6526: 0x9626, - 6527: 0x962C, - 6528: 0x9631, - 6529: 0x9633, - 6530: 0x9637, - 6531: 0x9638, - 6532: 0x9639, - 6533: 0x963A, - 6534: 0x963C, - 6535: 0x963D, - 6536: 0x9641, - 6537: 0x9652, - 6538: 0x9654, - 6539: 0x9656, - 6540: 0x9657, - 6541: 0x9658, - 6542: 0x9661, - 6543: 0x966E, - 6544: 0x9674, - 6545: 0x967B, - 6546: 0x967C, - 6547: 0x967E, - 6548: 0x967F, - 6549: 0x9681, - 6550: 0x9682, - 6551: 0x9683, - 6552: 0x9684, - 6553: 0x9689, - 6554: 0x9691, - 6555: 0x9696, - 6556: 0x969A, - 6557: 0x969D, - 6558: 0x969F, - 6559: 0x96A4, - 6560: 0x96A5, - 6561: 0x96A6, - 6562: 0x96A9, - 6563: 0x96AE, - 6564: 0x96AF, - 6565: 0x96B3, - 6566: 0x96BA, - 6567: 0x96CA, - 6568: 0x96D2, - 6569: 0x5DB2, - 6570: 0x96D8, - 6571: 0x96DA, - 6572: 0x96DD, - 6573: 0x96DE, - 6574: 0x96DF, - 6575: 0x96E9, - 6576: 0x96EF, - 6577: 0x96F1, - 6578: 0x96FA, - 6579: 0x9702, - 6580: 0x9703, - 6581: 0x9705, - 6582: 0x9709, - 6583: 0x971A, - 6584: 0x971B, - 6585: 0x971D, - 6586: 0x9721, - 6587: 0x9722, - 6588: 0x9723, - 6589: 0x9728, - 6590: 0x9731, - 6591: 0x9733, - 6592: 0x9741, - 6593: 0x9743, - 6594: 0x974A, - 6595: 0x974E, - 6596: 0x974F, - 6597: 0x9755, - 6598: 0x9757, - 6599: 0x9758, - 6600: 0x975A, - 6601: 0x975B, - 6602: 0x9763, - 6603: 0x9767, - 6604: 0x976A, - 6605: 0x976E, - 6606: 0x9773, - 6607: 0x9776, - 6608: 0x9777, - 6609: 0x9778, - 6610: 0x977B, - 6611: 0x977D, - 6612: 0x977F, - 6613: 0x9780, - 6614: 0x9789, - 6615: 0x9795, - 6616: 0x9796, - 6617: 0x9797, - 6618: 0x9799, - 6619: 0x979A, - 6620: 0x979E, - 6621: 0x979F, - 6622: 0x97A2, - 6623: 0x97AC, - 6624: 0x97AE, - 6625: 0x97B1, - 6626: 0x97B2, - 6627: 0x97B5, - 6628: 0x97B6, - 6629: 0x97B8, - 6630: 0x97B9, - 6631: 0x97BA, - 6632: 0x97BC, - 6633: 0x97BE, - 6634: 0x97BF, - 6635: 0x97C1, - 6636: 0x97C4, - 6637: 0x97C5, - 6638: 0x97C7, - 6639: 0x97C9, - 6640: 0x97CA, - 6641: 0x97CC, - 6642: 0x97CD, - 6643: 0x97CE, - 6644: 0x97D0, - 6645: 0x97D1, - 6646: 0x97D4, - 6647: 0x97D7, - 6648: 0x97D8, - 6649: 0x97D9, - 6650: 0x97DD, - 6651: 0x97DE, - 6652: 0x97E0, - 6653: 0x97DB, - 6654: 0x97E1, - 6655: 0x97E4, - 6656: 0x97EF, - 6657: 0x97F1, - 6658: 0x97F4, - 6659: 0x97F7, - 6660: 0x97F8, - 6661: 0x97FA, - 6662: 0x9807, - 6663: 0x980A, - 6664: 0x9819, - 6665: 0x980D, - 6666: 0x980E, - 6667: 0x9814, - 6668: 0x9816, - 6669: 0x981C, - 6670: 0x981E, - 6671: 0x9820, - 6672: 0x9823, - 6673: 0x9826, - 6674: 0x982B, - 6675: 0x982E, - 6676: 0x982F, - 6677: 0x9830, - 6678: 0x9832, - 6679: 0x9833, - 6680: 0x9835, - 6681: 0x9825, - 6682: 0x983E, - 6683: 0x9844, - 6684: 0x9847, - 6685: 0x984A, - 6686: 0x9851, - 6687: 0x9852, - 6688: 0x9853, - 6689: 0x9856, - 6690: 0x9857, - 6691: 0x9859, - 6692: 0x985A, - 6693: 0x9862, - 6694: 0x9863, - 6695: 0x9865, - 6696: 0x9866, - 6697: 0x986A, - 6698: 0x986C, - 6699: 0x98AB, - 6700: 0x98AD, - 6701: 0x98AE, - 6702: 0x98B0, - 6703: 0x98B4, - 6704: 0x98B7, - 6705: 0x98B8, - 6706: 0x98BA, - 6707: 0x98BB, - 6708: 0x98BF, - 6709: 0x98C2, - 6710: 0x98C5, - 6711: 0x98C8, - 6712: 0x98CC, - 6713: 0x98E1, - 6714: 0x98E3, - 6715: 0x98E5, - 6716: 0x98E6, - 6717: 0x98E7, - 6718: 0x98EA, - 6719: 0x98F3, - 6720: 0x98F6, - 6721: 0x9902, - 6722: 0x9907, - 6723: 0x9908, - 6724: 0x9911, - 6725: 0x9915, - 6726: 0x9916, - 6727: 0x9917, - 6728: 0x991A, - 6729: 0x991B, - 6730: 0x991C, - 6731: 0x991F, - 6732: 0x9922, - 6733: 0x9926, - 6734: 0x9927, - 6735: 0x992B, - 6736: 0x9931, - 6737: 0x9932, - 6738: 0x9933, - 6739: 0x9934, - 6740: 0x9935, - 6741: 0x9939, - 6742: 0x993A, - 6743: 0x993B, - 6744: 0x993C, - 6745: 0x9940, - 6746: 0x9941, - 6747: 0x9946, - 6748: 0x9947, - 6749: 0x9948, - 6750: 0x994D, - 6751: 0x994E, - 6752: 0x9954, - 6753: 0x9958, - 6754: 0x9959, - 6755: 0x995B, - 6756: 0x995C, - 6757: 0x995E, - 6758: 0x995F, - 6759: 0x9960, - 6760: 0x999B, - 6761: 0x999D, - 6762: 0x999F, - 6763: 0x99A6, - 6764: 0x99B0, - 6765: 0x99B1, - 6766: 0x99B2, - 6767: 0x99B5, - 6768: 0x99B9, - 6769: 0x99BA, - 6770: 0x99BD, - 6771: 0x99BF, - 6772: 0x99C3, - 6773: 0x99C9, - 6774: 0x99D3, - 6775: 0x99D4, - 6776: 0x99D9, - 6777: 0x99DA, - 6778: 0x99DC, - 6779: 0x99DE, - 6780: 0x99E7, - 6781: 0x99EA, - 6782: 0x99EB, - 6783: 0x99EC, - 6784: 0x99F0, - 6785: 0x99F4, - 6786: 0x99F5, - 6787: 0x99F9, - 6788: 0x99FD, - 6789: 0x99FE, - 6790: 0x9A02, - 6791: 0x9A03, - 6792: 0x9A04, - 6793: 0x9A0B, - 6794: 0x9A0C, - 6795: 0x9A10, - 6796: 0x9A11, - 6797: 0x9A16, - 6798: 0x9A1E, - 6799: 0x9A20, - 6800: 0x9A22, - 6801: 0x9A23, - 6802: 0x9A24, - 6803: 0x9A27, - 6804: 0x9A2D, - 6805: 0x9A2E, - 6806: 0x9A33, - 6807: 0x9A35, - 6808: 0x9A36, - 6809: 0x9A38, - 6810: 0x9A47, - 6811: 0x9A41, - 6812: 0x9A44, - 6813: 0x9A4A, - 6814: 0x9A4B, - 6815: 0x9A4C, - 6816: 0x9A4E, - 6817: 0x9A51, - 6818: 0x9A54, - 6819: 0x9A56, - 6820: 0x9A5D, - 6821: 0x9AAA, - 6822: 0x9AAC, - 6823: 0x9AAE, - 6824: 0x9AAF, - 6825: 0x9AB2, - 6826: 0x9AB4, - 6827: 0x9AB5, - 6828: 0x9AB6, - 6829: 0x9AB9, - 6830: 0x9ABB, - 6831: 0x9ABE, - 6832: 0x9ABF, - 6833: 0x9AC1, - 6834: 0x9AC3, - 6835: 0x9AC6, - 6836: 0x9AC8, - 6837: 0x9ACE, - 6838: 0x9AD0, - 6839: 0x9AD2, - 6840: 0x9AD5, - 6841: 0x9AD6, - 6842: 0x9AD7, - 6843: 0x9ADB, - 6844: 0x9ADC, - 6845: 0x9AE0, - 6846: 0x9AE4, - 6847: 0x9AE5, - 6848: 0x9AE7, - 6849: 0x9AE9, - 6850: 0x9AEC, - 6851: 0x9AF2, - 6852: 0x9AF3, - 6853: 0x9AF5, - 6854: 0x9AF9, - 6855: 0x9AFA, - 6856: 0x9AFD, - 6857: 0x9AFF, - 6858: 0x9B00, - 6859: 0x9B01, - 6860: 0x9B02, - 6861: 0x9B03, - 6862: 0x9B04, - 6863: 0x9B05, - 6864: 0x9B08, - 6865: 0x9B09, - 6866: 0x9B0B, - 6867: 0x9B0C, - 6868: 0x9B0D, - 6869: 0x9B0E, - 6870: 0x9B10, - 6871: 0x9B12, - 6872: 0x9B16, - 6873: 0x9B19, - 6874: 0x9B1B, - 6875: 0x9B1C, - 6876: 0x9B20, - 6877: 0x9B26, - 6878: 0x9B2B, - 6879: 0x9B2D, - 6880: 0x9B33, - 6881: 0x9B34, - 6882: 0x9B35, - 6883: 0x9B37, - 6884: 0x9B39, - 6885: 0x9B3A, - 6886: 0x9B3D, - 6887: 0x9B48, - 6888: 0x9B4B, - 6889: 0x9B4C, - 6890: 0x9B55, - 6891: 0x9B56, - 6892: 0x9B57, - 6893: 0x9B5B, - 6894: 0x9B5E, - 6895: 0x9B61, - 6896: 0x9B63, - 6897: 0x9B65, - 6898: 0x9B66, - 6899: 0x9B68, - 6900: 0x9B6A, - 6901: 0x9B6B, - 6902: 0x9B6C, - 6903: 0x9B6D, - 6904: 0x9B6E, - 6905: 0x9B73, - 6906: 0x9B75, - 6907: 0x9B77, - 6908: 0x9B78, - 6909: 0x9B79, - 6910: 0x9B7F, - 6911: 0x9B80, - 6912: 0x9B84, - 6913: 0x9B85, - 6914: 0x9B86, - 6915: 0x9B87, - 6916: 0x9B89, - 6917: 0x9B8A, - 6918: 0x9B8B, - 6919: 0x9B8D, - 6920: 0x9B8F, - 6921: 0x9B90, - 6922: 0x9B94, - 6923: 0x9B9A, - 6924: 0x9B9D, - 6925: 0x9B9E, - 6926: 0x9BA6, - 6927: 0x9BA7, - 6928: 0x9BA9, - 6929: 0x9BAC, - 6930: 0x9BB0, - 6931: 0x9BB1, - 6932: 0x9BB2, - 6933: 0x9BB7, - 6934: 0x9BB8, - 6935: 0x9BBB, - 6936: 0x9BBC, - 6937: 0x9BBE, - 6938: 0x9BBF, - 6939: 0x9BC1, - 6940: 0x9BC7, - 6941: 0x9BC8, - 6942: 0x9BCE, - 6943: 0x9BD0, - 6944: 0x9BD7, - 6945: 0x9BD8, - 6946: 0x9BDD, - 6947: 0x9BDF, - 6948: 0x9BE5, - 6949: 0x9BE7, - 6950: 0x9BEA, - 6951: 0x9BEB, - 6952: 0x9BEF, - 6953: 0x9BF3, - 6954: 0x9BF7, - 6955: 0x9BF8, - 6956: 0x9BF9, - 6957: 0x9BFA, - 6958: 0x9BFD, - 6959: 0x9BFF, - 6960: 0x9C00, - 6961: 0x9C02, - 6962: 0x9C0B, - 6963: 0x9C0F, - 6964: 0x9C11, - 6965: 0x9C16, - 6966: 0x9C18, - 6967: 0x9C19, - 6968: 0x9C1A, - 6969: 0x9C1C, - 6970: 0x9C1E, - 6971: 0x9C22, - 6972: 0x9C23, - 6973: 0x9C26, - 6974: 0x9C27, - 6975: 0x9C28, - 6976: 0x9C29, - 6977: 0x9C2A, - 6978: 0x9C31, - 6979: 0x9C35, - 6980: 0x9C36, - 6981: 0x9C37, - 6982: 0x9C3D, - 6983: 0x9C41, - 6984: 0x9C43, - 6985: 0x9C44, - 6986: 0x9C45, - 6987: 0x9C49, - 6988: 0x9C4A, - 6989: 0x9C4E, - 6990: 0x9C4F, - 6991: 0x9C50, - 6992: 0x9C53, - 6993: 0x9C54, - 6994: 0x9C56, - 6995: 0x9C58, - 6996: 0x9C5B, - 6997: 0x9C5D, - 6998: 0x9C5E, - 6999: 0x9C5F, - 7000: 0x9C63, - 7001: 0x9C69, - 7002: 0x9C6A, - 7003: 0x9C5C, - 7004: 0x9C6B, - 7005: 0x9C68, - 7006: 0x9C6E, - 7007: 0x9C70, - 7008: 0x9C72, - 7009: 0x9C75, - 7010: 0x9C77, - 7011: 0x9C7B, - 7012: 0x9CE6, - 7013: 0x9CF2, - 7014: 0x9CF7, - 7015: 0x9CF9, - 7016: 0x9D0B, - 7017: 0x9D02, - 7018: 0x9D11, - 7019: 0x9D17, - 7020: 0x9D18, - 7021: 0x9D1C, - 7022: 0x9D1D, - 7023: 0x9D1E, - 7024: 0x9D2F, - 7025: 0x9D30, - 7026: 0x9D32, - 7027: 0x9D33, - 7028: 0x9D34, - 7029: 0x9D3A, - 7030: 0x9D3C, - 7031: 0x9D45, - 7032: 0x9D3D, - 7033: 0x9D42, - 7034: 0x9D43, - 7035: 0x9D47, - 7036: 0x9D4A, - 7037: 0x9D53, - 7038: 0x9D54, - 7039: 0x9D5F, - 7040: 0x9D63, - 7041: 0x9D62, - 7042: 0x9D65, - 7043: 0x9D69, - 7044: 0x9D6A, - 7045: 0x9D6B, - 7046: 0x9D70, - 7047: 0x9D76, - 7048: 0x9D77, - 7049: 0x9D7B, - 7050: 0x9D7C, - 7051: 0x9D7E, - 7052: 0x9D83, - 7053: 0x9D84, - 7054: 0x9D86, - 7055: 0x9D8A, - 7056: 0x9D8D, - 7057: 0x9D8E, - 7058: 0x9D92, - 7059: 0x9D93, - 7060: 0x9D95, - 7061: 0x9D96, - 7062: 0x9D97, - 7063: 0x9D98, - 7064: 0x9DA1, - 7065: 0x9DAA, - 7066: 0x9DAC, - 7067: 0x9DAE, - 7068: 0x9DB1, - 7069: 0x9DB5, - 7070: 0x9DB9, - 7071: 0x9DBC, - 7072: 0x9DBF, - 7073: 0x9DC3, - 7074: 0x9DC7, - 7075: 0x9DC9, - 7076: 0x9DCA, - 7077: 0x9DD4, - 7078: 0x9DD5, - 7079: 0x9DD6, - 7080: 0x9DD7, - 7081: 0x9DDA, - 7082: 0x9DDE, - 7083: 0x9DDF, - 7084: 0x9DE0, - 7085: 0x9DE5, - 7086: 0x9DE7, - 7087: 0x9DE9, - 7088: 0x9DEB, - 7089: 0x9DEE, - 7090: 0x9DF0, - 7091: 0x9DF3, - 7092: 0x9DF4, - 7093: 0x9DFE, - 7094: 0x9E0A, - 7095: 0x9E02, - 7096: 0x9E07, - 7097: 0x9E0E, - 7098: 0x9E10, - 7099: 0x9E11, - 7100: 0x9E12, - 7101: 0x9E15, - 7102: 0x9E16, - 7103: 0x9E19, - 7104: 0x9E1C, - 7105: 0x9E1D, - 7106: 0x9E7A, - 7107: 0x9E7B, - 7108: 0x9E7C, - 7109: 0x9E80, - 7110: 0x9E82, - 7111: 0x9E83, - 7112: 0x9E84, - 7113: 0x9E85, - 7114: 0x9E87, - 7115: 0x9E8E, - 7116: 0x9E8F, - 7117: 0x9E96, - 7118: 0x9E98, - 7119: 0x9E9B, - 7120: 0x9E9E, - 7121: 0x9EA4, - 7122: 0x9EA8, - 7123: 0x9EAC, - 7124: 0x9EAE, - 7125: 0x9EAF, - 7126: 0x9EB0, - 7127: 0x9EB3, - 7128: 0x9EB4, - 7129: 0x9EB5, - 7130: 0x9EC6, - 7131: 0x9EC8, - 7132: 0x9ECB, - 7133: 0x9ED5, - 7134: 0x9EDF, - 7135: 0x9EE4, - 7136: 0x9EE7, - 7137: 0x9EEC, - 7138: 0x9EED, - 7139: 0x9EEE, - 7140: 0x9EF0, - 7141: 0x9EF1, - 7142: 0x9EF2, - 7143: 0x9EF5, - 7144: 0x9EF8, - 7145: 0x9EFF, - 7146: 0x9F02, - 7147: 0x9F03, - 7148: 0x9F09, - 7149: 0x9F0F, - 7150: 0x9F10, - 7151: 0x9F11, - 7152: 0x9F12, - 7153: 0x9F14, - 7154: 0x9F16, - 7155: 0x9F17, - 7156: 0x9F19, - 7157: 0x9F1A, - 7158: 0x9F1B, - 7159: 0x9F1F, - 7160: 0x9F22, - 7161: 0x9F26, - 7162: 0x9F2A, - 7163: 0x9F2B, - 7164: 0x9F2F, - 7165: 0x9F31, - 7166: 0x9F32, - 7167: 0x9F34, - 7168: 0x9F37, - 7169: 0x9F39, - 7170: 0x9F3A, - 7171: 0x9F3C, - 7172: 0x9F3D, - 7173: 0x9F3F, - 7174: 0x9F41, - 7175: 0x9F43, - 7176: 0x9F44, - 7177: 0x9F45, - 7178: 0x9F46, - 7179: 0x9F47, - 7180: 0x9F53, - 7181: 0x9F55, - 7182: 0x9F56, - 7183: 0x9F57, - 7184: 0x9F58, - 7185: 0x9F5A, - 7186: 0x9F5D, - 7187: 0x9F5E, - 7188: 0x9F68, - 7189: 0x9F69, - 7190: 0x9F6D, - 7191: 0x9F6E, - 7192: 0x9F6F, - 7193: 0x9F70, - 7194: 0x9F71, - 7195: 0x9F73, - 7196: 0x9F75, - 7197: 0x9F7A, - 7198: 0x9F7D, - 7199: 0x9F8F, - 7200: 0x9F90, - 7201: 0x9F91, - 7202: 0x9F92, - 7203: 0x9F94, - 7204: 0x9F96, - 7205: 0x9F97, - 7206: 0x9F9E, - 7207: 0x9FA1, - 7208: 0x9FA2, - 7209: 0x9FA3, - 7210: 0x9FA5, -} - -const ( - jis0208 = 1 - jis0212 = 2 - codeMask = 0x7f - codeShift = 7 - tableShift = 14 -) - -const numEncodeTables = 6 - -// encodeX are the encoding tables from Unicode to JIS code, -// sorted by decreasing length. -// encode0: 20902 entries for runes in [19968, 40870). -// encode1: 1632 entries for runes in [ 8208, 9840). -// encode2: 974 entries for runes in [12288, 13262). -// encode3: 959 entries for runes in [ 161, 1120). -// encode4: 261 entries for runes in [63785, 64046). -// encode5: 229 entries for runes in [65281, 65510). -// -// The high two bits of the value record whether the JIS code comes from the -// JIS0208 table (high bits == 1) or the JIS0212 table (high bits == 2). -// The low 14 bits are two 7-bit unsigned integers j1 and j2 that form the -// JIS code (94*j1 + j2) within that table. - -const encode0Low, encode0High = 19968, 40870 - -var encode0 = [...]uint16{ - 19968 - 19968: jis0208<<14 | 0x0F<<7 | 0x4B, - 19969 - 19968: jis0208<<14 | 0x22<<7 | 0x59, - 19970 - 19968: jis0212<<14 | 0x0F<<7 | 0x00, - 19971 - 19968: jis0208<<14 | 0x1B<<7 | 0x16, - 19972 - 19968: jis0212<<14 | 0x0F<<7 | 0x01, - 19973 - 19968: jis0212<<14 | 0x0F<<7 | 0x02, - 19975 - 19968: jis0208<<14 | 0x2A<<7 | 0x5B, - 19976 - 19968: jis0208<<14 | 0x1D<<7 | 0x45, - 19977 - 19968: jis0208<<14 | 0x1A<<7 | 0x0F, - 19978 - 19968: jis0208<<14 | 0x1D<<7 | 0x44, - 19979 - 19968: jis0208<<14 | 0x11<<7 | 0x1B, - 19980 - 19968: jis0212<<14 | 0x0F<<7 | 0x03, - 19981 - 19968: jis0208<<14 | 0x28<<7 | 0x33, - 19982 - 19968: jis0208<<14 | 0x2C<<7 | 0x1E, - 19984 - 19968: jis0208<<14 | 0x2F<<7 | 0x01, - 19985 - 19968: jis0208<<14 | 0x10<<7 | 0x0E, - 19986 - 19968: jis0212<<14 | 0x0F<<7 | 0x04, - 19988 - 19968: jis0208<<14 | 0x12<<7 | 0x4D, - 19989 - 19968: jis0208<<14 | 0x2F<<7 | 0x02, - 19990 - 19968: jis0208<<14 | 0x1F<<7 | 0x03, - 19991 - 19968: jis0208<<14 | 0x31<<7 | 0x21, - 19992 - 19968: jis0208<<14 | 0x14<<7 | 0x35, - 19993 - 19968: jis0208<<14 | 0x29<<7 | 0x19, - 19998 - 19968: jis0208<<14 | 0x1D<<7 | 0x46, - 19999 - 19968: jis0212<<14 | 0x0F<<7 | 0x05, - 20001 - 19968: jis0208<<14 | 0x2D<<7 | 0x1D, - 20003 - 19968: jis0212<<14 | 0x0F<<7 | 0x06, - 20004 - 19968: jis0212<<14 | 0x0F<<7 | 0x07, - 20006 - 19968: jis0208<<14 | 0x29<<7 | 0x21, - 20008 - 19968: jis0208<<14 | 0x58<<7 | 0x0C, - 20010 - 19968: jis0208<<14 | 0x2F<<7 | 0x03, - 20011 - 19968: jis0212<<14 | 0x0F<<7 | 0x09, - 20013 - 19968: jis0208<<14 | 0x22<<7 | 0x45, - 20014 - 19968: jis0212<<14 | 0x0F<<7 | 0x0A, - 20015 - 19968: jis0212<<14 | 0x0F<<7 | 0x0B, - 20016 - 19968: jis0212<<14 | 0x0F<<7 | 0x0C, - 20017 - 19968: jis0208<<14 | 0x2F<<7 | 0x04, - 20018 - 19968: jis0208<<14 | 0x15<<7 | 0x59, - 20021 - 19968: jis0212<<14 | 0x0F<<7 | 0x0D, - 20022 - 19968: jis0208<<14 | 0x2F<<7 | 0x05, - 20024 - 19968: jis0208<<14 | 0x13<<7 | 0x3C, - 20025 - 19968: jis0208<<14 | 0x22<<7 | 0x0F, - 20027 - 19968: jis0208<<14 | 0x1B<<7 | 0x46, - 20028 - 19968: jis0208<<14 | 0x2F<<7 | 0x06, - 20031 - 19968: jis0208<<14 | 0x2F<<7 | 0x07, - 20032 - 19968: jis0212<<14 | 0x0F<<7 | 0x0E, - 20033 - 19968: jis0212<<14 | 0x0F<<7 | 0x0F, - 20034 - 19968: jis0208<<14 | 0x2F<<7 | 0x08, - 20035 - 19968: jis0208<<14 | 0x26<<7 | 0x14, - 20036 - 19968: jis0212<<14 | 0x0F<<7 | 0x10, - 20037 - 19968: jis0208<<14 | 0x14<<7 | 0x36, - 20039 - 19968: jis0212<<14 | 0x0F<<7 | 0x11, - 20043 - 19968: jis0208<<14 | 0x26<<7 | 0x16, - 20045 - 19968: jis0208<<14 | 0x25<<7 | 0x42, - 20046 - 19968: jis0208<<14 | 0x17<<7 | 0x22, - 20047 - 19968: jis0208<<14 | 0x2A<<7 | 0x12, - 20049 - 19968: jis0212<<14 | 0x0F<<7 | 0x12, - 20053 - 19968: jis0208<<14 | 0x48<<7 | 0x28, - 20054 - 19968: jis0208<<14 | 0x2F<<7 | 0x09, - 20055 - 19968: jis0208<<14 | 0x1D<<7 | 0x47, - 20056 - 19968: jis0208<<14 | 0x2F<<7 | 0x0A, - 20057 - 19968: jis0208<<14 | 0x11<<7 | 0x14, - 20058 - 19968: jis0212<<14 | 0x0F<<7 | 0x13, - 20060 - 19968: jis0212<<14 | 0x0F<<7 | 0x14, - 20061 - 19968: jis0208<<14 | 0x15<<7 | 0x44, - 20062 - 19968: jis0208<<14 | 0x17<<7 | 0x4F, - 20063 - 19968: jis0208<<14 | 0x2B<<7 | 0x48, - 20066 - 19968: jis0208<<14 | 0x35<<7 | 0x05, - 20067 - 19968: jis0212<<14 | 0x0F<<7 | 0x15, - 20072 - 19968: jis0212<<14 | 0x0F<<7 | 0x16, - 20073 - 19968: jis0212<<14 | 0x0F<<7 | 0x17, - 20081 - 19968: jis0208<<14 | 0x2C<<7 | 0x4F, - 20083 - 19968: jis0208<<14 | 0x25<<7 | 0x5C, - 20084 - 19968: jis0212<<14 | 0x0F<<7 | 0x18, - 20085 - 19968: jis0212<<14 | 0x0F<<7 | 0x19, - 20089 - 19968: jis0212<<14 | 0x0F<<7 | 0x1A, - 20094 - 19968: jis0208<<14 | 0x13<<7 | 0x04, - 20095 - 19968: jis0212<<14 | 0x0F<<7 | 0x1B, - 20096 - 19968: jis0208<<14 | 0x14<<7 | 0x14, - 20098 - 19968: jis0208<<14 | 0x2F<<7 | 0x0B, - 20101 - 19968: jis0208<<14 | 0x2F<<7 | 0x0C, - 20102 - 19968: jis0208<<14 | 0x2D<<7 | 0x1A, - 20104 - 19968: jis0208<<14 | 0x2C<<7 | 0x1C, - 20105 - 19968: jis0208<<14 | 0x20<<7 | 0x47, - 20106 - 19968: jis0208<<14 | 0x2F<<7 | 0x0E, - 20107 - 19968: jis0208<<14 | 0x1A<<7 | 0x55, - 20108 - 19968: jis0208<<14 | 0x25<<7 | 0x52, - 20109 - 19968: jis0212<<14 | 0x0F<<7 | 0x1C, - 20110 - 19968: jis0208<<14 | 0x2F<<7 | 0x11, - 20113 - 19968: jis0208<<14 | 0x10<<7 | 0x1D, - 20114 - 19968: jis0208<<14 | 0x17<<7 | 0x3E, - 20116 - 19968: jis0208<<14 | 0x17<<7 | 0x3D, - 20117 - 19968: jis0208<<14 | 0x0F<<7 | 0x45, - 20118 - 19968: jis0212<<14 | 0x0F<<7 | 0x1D, - 20119 - 19968: jis0212<<14 | 0x0F<<7 | 0x1E, - 20120 - 19968: jis0208<<14 | 0x2E<<7 | 0x2A, - 20121 - 19968: jis0208<<14 | 0x2E<<7 | 0x29, - 20123 - 19968: jis0208<<14 | 0x19<<7 | 0x12, - 20124 - 19968: jis0208<<14 | 0x0F<<7 | 0x00, - 20125 - 19968: jis0212<<14 | 0x0F<<7 | 0x1F, - 20126 - 19968: jis0208<<14 | 0x2F<<7 | 0x12, - 20127 - 19968: jis0208<<14 | 0x2F<<7 | 0x13, - 20128 - 19968: jis0208<<14 | 0x2F<<7 | 0x14, - 20129 - 19968: jis0208<<14 | 0x2A<<7 | 0x13, - 20130 - 19968: jis0208<<14 | 0x2F<<7 | 0x15, - 20132 - 19968: jis0208<<14 | 0x17<<7 | 0x51, - 20133 - 19968: jis0208<<14 | 0x0F<<7 | 0x46, - 20134 - 19968: jis0208<<14 | 0x2A<<7 | 0x51, - 20136 - 19968: jis0208<<14 | 0x14<<7 | 0x5B, - 20139 - 19968: jis0208<<14 | 0x14<<7 | 0x5C, - 20140 - 19968: jis0208<<14 | 0x14<<7 | 0x5D, - 20141 - 19968: jis0208<<14 | 0x23<<7 | 0x41, - 20142 - 19968: jis0208<<14 | 0x2D<<7 | 0x1B, - 20143 - 19968: jis0212<<14 | 0x0F<<7 | 0x20, - 20144 - 19968: jis0208<<14 | 0x2F<<7 | 0x16, - 20147 - 19968: jis0208<<14 | 0x2F<<7 | 0x17, - 20150 - 19968: jis0208<<14 | 0x2F<<7 | 0x18, - 20153 - 19968: jis0212<<14 | 0x0F<<7 | 0x21, - 20154 - 19968: jis0208<<14 | 0x1E<<7 | 0x2C, - 20160 - 19968: jis0208<<14 | 0x1C<<7 | 0x19, - 20161 - 19968: jis0208<<14 | 0x1E<<7 | 0x2D, - 20162 - 19968: jis0208<<14 | 0x2F<<7 | 0x1D, - 20163 - 19968: jis0212<<14 | 0x0F<<7 | 0x22, - 20164 - 19968: jis0208<<14 | 0x2F<<7 | 0x1B, - 20166 - 19968: jis0208<<14 | 0x2F<<7 | 0x1C, - 20167 - 19968: jis0208<<14 | 0x14<<7 | 0x37, - 20170 - 19968: jis0208<<14 | 0x19<<7 | 0x02, - 20171 - 19968: jis0208<<14 | 0x11<<7 | 0x4F, - 20173 - 19968: jis0208<<14 | 0x2F<<7 | 0x1A, - 20174 - 19968: jis0208<<14 | 0x2F<<7 | 0x19, - 20175 - 19968: jis0208<<14 | 0x29<<7 | 0x08, - 20176 - 19968: jis0212<<14 | 0x0F<<7 | 0x23, - 20180 - 19968: jis0208<<14 | 0x1A<<7 | 0x25, - 20181 - 19968: jis0208<<14 | 0x1A<<7 | 0x24, - 20182 - 19968: jis0208<<14 | 0x21<<7 | 0x1D, - 20183 - 19968: jis0208<<14 | 0x2F<<7 | 0x1E, - 20184 - 19968: jis0208<<14 | 0x28<<7 | 0x34, - 20185 - 19968: jis0208<<14 | 0x1F<<7 | 0x46, - 20186 - 19968: jis0212<<14 | 0x0F<<7 | 0x24, - 20187 - 19968: jis0212<<14 | 0x0F<<7 | 0x25, - 20189 - 19968: jis0208<<14 | 0x00<<7 | 0x17, - 20190 - 19968: jis0208<<14 | 0x2F<<7 | 0x1F, - 20191 - 19968: jis0208<<14 | 0x2F<<7 | 0x21, - 20192 - 19968: jis0212<<14 | 0x0F<<7 | 0x26, - 20193 - 19968: jis0208<<14 | 0x58<<7 | 0x0D, - 20194 - 19968: jis0212<<14 | 0x0F<<7 | 0x28, - 20195 - 19968: jis0208<<14 | 0x21<<7 | 0x44, - 20196 - 19968: jis0208<<14 | 0x2D<<7 | 0x40, - 20197 - 19968: jis0208<<14 | 0x0F<<7 | 0x29, - 20200 - 19968: jis0212<<14 | 0x0F<<7 | 0x29, - 20205 - 19968: jis0208<<14 | 0x2F<<7 | 0x20, - 20206 - 19968: jis0208<<14 | 0x11<<7 | 0x1D, - 20207 - 19968: jis0212<<14 | 0x0F<<7 | 0x2A, - 20208 - 19968: jis0208<<14 | 0x15<<7 | 0x23, - 20209 - 19968: jis0212<<14 | 0x0F<<7 | 0x2B, - 20210 - 19968: jis0208<<14 | 0x22<<7 | 0x46, - 20211 - 19968: jis0212<<14 | 0x0F<<7 | 0x2C, - 20213 - 19968: jis0212<<14 | 0x0F<<7 | 0x2D, - 20214 - 19968: jis0208<<14 | 0x16<<7 | 0x4E, - 20215 - 19968: jis0208<<14 | 0x2F<<7 | 0x22, - 20219 - 19968: jis0208<<14 | 0x26<<7 | 0x03, - 20220 - 19968: jis0208<<14 | 0x58<<7 | 0x0E, - 20221 - 19968: jis0212<<14 | 0x0F<<7 | 0x2E, - 20222 - 19968: jis0212<<14 | 0x0F<<7 | 0x2F, - 20223 - 19968: jis0212<<14 | 0x0F<<7 | 0x30, - 20224 - 19968: jis0208<<14 | 0x58<<7 | 0x0F, - 20225 - 19968: jis0208<<14 | 0x13<<7 | 0x4A, - 20226 - 19968: jis0212<<14 | 0x0F<<7 | 0x32, - 20227 - 19968: jis0208<<14 | 0x58<<7 | 0x10, - 20232 - 19968: jis0212<<14 | 0x0F<<7 | 0x34, - 20233 - 19968: jis0208<<14 | 0x2F<<7 | 0x23, - 20234 - 19968: jis0208<<14 | 0x0F<<7 | 0x2A, - 20235 - 19968: jis0212<<14 | 0x0F<<7 | 0x35, - 20236 - 19968: jis0212<<14 | 0x0F<<7 | 0x36, - 20237 - 19968: jis0208<<14 | 0x17<<7 | 0x3F, - 20238 - 19968: jis0208<<14 | 0x13<<7 | 0x4B, - 20239 - 19968: jis0208<<14 | 0x28<<7 | 0x59, - 20240 - 19968: jis0208<<14 | 0x27<<7 | 0x11, - 20241 - 19968: jis0208<<14 | 0x14<<7 | 0x38, - 20242 - 19968: jis0212<<14 | 0x0F<<7 | 0x37, - 20245 - 19968: jis0212<<14 | 0x0F<<7 | 0x38, - 20246 - 19968: jis0212<<14 | 0x0F<<7 | 0x39, - 20247 - 19968: jis0212<<14 | 0x0F<<7 | 0x3A, - 20249 - 19968: jis0212<<14 | 0x0F<<7 | 0x3B, - 20250 - 19968: jis0208<<14 | 0x11<<7 | 0x50, - 20252 - 19968: jis0208<<14 | 0x2F<<7 | 0x46, - 20253 - 19968: jis0208<<14 | 0x24<<7 | 0x20, - 20270 - 19968: jis0212<<14 | 0x0F<<7 | 0x3C, - 20271 - 19968: jis0208<<14 | 0x26<<7 | 0x4B, - 20272 - 19968: jis0208<<14 | 0x2F<<7 | 0x25, - 20273 - 19968: jis0212<<14 | 0x0F<<7 | 0x3D, - 20275 - 19968: jis0212<<14 | 0x0F<<7 | 0x3F, - 20276 - 19968: jis0208<<14 | 0x27<<7 | 0x1B, - 20277 - 19968: jis0212<<14 | 0x0F<<7 | 0x40, - 20278 - 19968: jis0208<<14 | 0x2D<<7 | 0x41, - 20279 - 19968: jis0212<<14 | 0x0F<<7 | 0x41, - 20280 - 19968: jis0208<<14 | 0x1E<<7 | 0x0C, - 20281 - 19968: jis0208<<14 | 0x58<<7 | 0x11, - 20282 - 19968: jis0208<<14 | 0x1A<<7 | 0x26, - 20283 - 19968: jis0212<<14 | 0x0F<<7 | 0x43, - 20284 - 19968: jis0208<<14 | 0x1A<<7 | 0x56, - 20285 - 19968: jis0208<<14 | 0x11<<7 | 0x1F, - 20286 - 19968: jis0212<<14 | 0x0F<<7 | 0x44, - 20288 - 19968: jis0212<<14 | 0x0F<<7 | 0x45, - 20290 - 19968: jis0212<<14 | 0x0F<<7 | 0x46, - 20291 - 19968: jis0208<<14 | 0x23<<7 | 0x30, - 20294 - 19968: jis0208<<14 | 0x22<<7 | 0x01, - 20295 - 19968: jis0208<<14 | 0x2F<<7 | 0x29, - 20296 - 19968: jis0212<<14 | 0x0F<<7 | 0x47, - 20297 - 19968: jis0212<<14 | 0x0F<<7 | 0x48, - 20299 - 19968: jis0212<<14 | 0x0F<<7 | 0x49, - 20300 - 19968: jis0212<<14 | 0x0F<<7 | 0x4A, - 20301 - 19968: jis0208<<14 | 0x0F<<7 | 0x2B, - 20302 - 19968: jis0208<<14 | 0x23<<7 | 0x42, - 20303 - 19968: jis0208<<14 | 0x1C<<7 | 0x1A, - 20304 - 19968: jis0208<<14 | 0x19<<7 | 0x13, - 20305 - 19968: jis0208<<14 | 0x2C<<7 | 0x03, - 20306 - 19968: jis0212<<14 | 0x0F<<7 | 0x4B, - 20307 - 19968: jis0208<<14 | 0x21<<7 | 0x2D, - 20308 - 19968: jis0212<<14 | 0x0F<<7 | 0x4C, - 20309 - 19968: jis0208<<14 | 0x11<<7 | 0x1E, - 20310 - 19968: jis0208<<14 | 0x58<<7 | 0x12, - 20311 - 19968: jis0208<<14 | 0x2F<<7 | 0x28, - 20312 - 19968: jis0212<<14 | 0x0F<<7 | 0x4E, - 20313 - 19968: jis0208<<14 | 0x2C<<7 | 0x1D, - 20314 - 19968: jis0208<<14 | 0x2F<<7 | 0x24, - 20315 - 19968: jis0208<<14 | 0x2F<<7 | 0x26, - 20316 - 19968: jis0208<<14 | 0x19<<7 | 0x4D, - 20317 - 19968: jis0208<<14 | 0x2F<<7 | 0x27, - 20318 - 19968: jis0208<<14 | 0x34<<7 | 0x03, - 20319 - 19968: jis0212<<14 | 0x0F<<7 | 0x4F, - 20320 - 19968: jis0212<<14 | 0x0F<<7 | 0x3E, - 20323 - 19968: jis0212<<14 | 0x0F<<7 | 0x50, - 20329 - 19968: jis0208<<14 | 0x2F<<7 | 0x2F, - 20330 - 19968: jis0212<<14 | 0x0F<<7 | 0x51, - 20332 - 19968: jis0212<<14 | 0x0F<<7 | 0x52, - 20334 - 19968: jis0212<<14 | 0x0F<<7 | 0x53, - 20335 - 19968: jis0208<<14 | 0x2F<<7 | 0x32, - 20336 - 19968: jis0208<<14 | 0x2F<<7 | 0x30, - 20337 - 19968: jis0212<<14 | 0x0F<<7 | 0x54, - 20339 - 19968: jis0208<<14 | 0x11<<7 | 0x21, - 20341 - 19968: jis0208<<14 | 0x29<<7 | 0x1A, - 20342 - 19968: jis0208<<14 | 0x2F<<7 | 0x2A, - 20343 - 19968: jis0212<<14 | 0x0F<<7 | 0x55, - 20344 - 19968: jis0212<<14 | 0x0F<<7 | 0x56, - 20345 - 19968: jis0212<<14 | 0x0F<<7 | 0x57, - 20346 - 19968: jis0212<<14 | 0x0F<<7 | 0x58, - 20347 - 19968: jis0208<<14 | 0x2F<<7 | 0x2E, - 20348 - 19968: jis0208<<14 | 0x17<<7 | 0x52, - 20349 - 19968: jis0212<<14 | 0x0F<<7 | 0x59, - 20350 - 19968: jis0212<<14 | 0x0F<<7 | 0x5A, - 20351 - 19968: jis0208<<14 | 0x1A<<7 | 0x27, - 20353 - 19968: jis0212<<14 | 0x0F<<7 | 0x5B, - 20354 - 19968: jis0212<<14 | 0x0F<<7 | 0x5C, - 20355 - 19968: jis0208<<14 | 0x13<<7 | 0x05, - 20356 - 19968: jis0212<<14 | 0x0F<<7 | 0x5D, - 20357 - 19968: jis0212<<14 | 0x10<<7 | 0x00, - 20358 - 19968: jis0208<<14 | 0x2F<<7 | 0x33, - 20360 - 19968: jis0208<<14 | 0x2F<<7 | 0x2B, - 20361 - 19968: jis0212<<14 | 0x10<<7 | 0x01, - 20362 - 19968: jis0208<<14 | 0x58<<7 | 0x14, - 20363 - 19968: jis0208<<14 | 0x2D<<7 | 0x42, - 20364 - 19968: jis0212<<14 | 0x10<<7 | 0x03, - 20365 - 19968: jis0208<<14 | 0x1A<<7 | 0x57, - 20366 - 19968: jis0212<<14 | 0x10<<7 | 0x04, - 20367 - 19968: jis0208<<14 | 0x2F<<7 | 0x2C, - 20368 - 19968: jis0212<<14 | 0x10<<7 | 0x05, - 20369 - 19968: jis0208<<14 | 0x2F<<7 | 0x31, - 20370 - 19968: jis0208<<14 | 0x58<<7 | 0x13, - 20371 - 19968: jis0212<<14 | 0x10<<7 | 0x07, - 20372 - 19968: jis0208<<14 | 0x58<<7 | 0x16, - 20374 - 19968: jis0208<<14 | 0x2F<<7 | 0x34, - 20375 - 19968: jis0212<<14 | 0x10<<7 | 0x09, - 20376 - 19968: jis0208<<14 | 0x2F<<7 | 0x2D, - 20377 - 19968: jis0212<<14 | 0x10<<7 | 0x0A, - 20378 - 19968: jis0208<<14 | 0x58<<7 | 0x15, - 20379 - 19968: jis0208<<14 | 0x15<<7 | 0x00, - 20381 - 19968: jis0208<<14 | 0x0F<<7 | 0x2C, - 20382 - 19968: jis0212<<14 | 0x10<<7 | 0x0C, - 20383 - 19968: jis0212<<14 | 0x10<<7 | 0x0D, - 20384 - 19968: jis0208<<14 | 0x15<<7 | 0x01, - 20385 - 19968: jis0208<<14 | 0x11<<7 | 0x20, - 20395 - 19968: jis0208<<14 | 0x34<<7 | 0x04, - 20397 - 19968: jis0208<<14 | 0x2A<<7 | 0x58, - 20398 - 19968: jis0208<<14 | 0x28<<7 | 0x4D, - 20399 - 19968: jis0208<<14 | 0x17<<7 | 0x53, - 20402 - 19968: jis0212<<14 | 0x10<<7 | 0x0E, - 20405 - 19968: jis0208<<14 | 0x1E<<7 | 0x0E, - 20406 - 19968: jis0208<<14 | 0x2D<<7 | 0x16, - 20407 - 19968: jis0212<<14 | 0x10<<7 | 0x0F, - 20409 - 19968: jis0212<<14 | 0x10<<7 | 0x10, - 20411 - 19968: jis0212<<14 | 0x10<<7 | 0x11, - 20412 - 19968: jis0212<<14 | 0x10<<7 | 0x12, - 20413 - 19968: jis0212<<14 | 0x10<<7 | 0x13, - 20414 - 19968: jis0212<<14 | 0x10<<7 | 0x14, - 20415 - 19968: jis0208<<14 | 0x29<<7 | 0x37, - 20416 - 19968: jis0212<<14 | 0x10<<7 | 0x15, - 20417 - 19968: jis0212<<14 | 0x10<<7 | 0x16, - 20418 - 19968: jis0208<<14 | 0x16<<7 | 0x17, - 20419 - 19968: jis0208<<14 | 0x21<<7 | 0x04, - 20420 - 19968: jis0208<<14 | 0x11<<7 | 0x43, - 20421 - 19968: jis0212<<14 | 0x10<<7 | 0x17, - 20422 - 19968: jis0212<<14 | 0x10<<7 | 0x18, - 20424 - 19968: jis0212<<14 | 0x10<<7 | 0x19, - 20425 - 19968: jis0208<<14 | 0x58<<7 | 0x05, - 20426 - 19968: jis0208<<14 | 0x1C<<7 | 0x32, - 20427 - 19968: jis0212<<14 | 0x10<<7 | 0x1B, - 20428 - 19968: jis0212<<14 | 0x10<<7 | 0x1C, - 20429 - 19968: jis0208<<14 | 0x58<<7 | 0x17, - 20430 - 19968: jis0208<<14 | 0x2F<<7 | 0x38, - 20431 - 19968: jis0212<<14 | 0x10<<7 | 0x1E, - 20432 - 19968: jis0208<<14 | 0x2F<<7 | 0x3D, - 20433 - 19968: jis0208<<14 | 0x2F<<7 | 0x3B, - 20434 - 19968: jis0212<<14 | 0x10<<7 | 0x1F, - 20436 - 19968: jis0208<<14 | 0x2F<<7 | 0x36, - 20439 - 19968: jis0208<<14 | 0x21<<7 | 0x0E, - 20440 - 19968: jis0208<<14 | 0x2F<<7 | 0x39, - 20442 - 19968: jis0208<<14 | 0x2F<<7 | 0x3C, - 20443 - 19968: jis0208<<14 | 0x2F<<7 | 0x3A, - 20444 - 19968: jis0212<<14 | 0x10<<7 | 0x20, - 20445 - 19968: jis0208<<14 | 0x29<<7 | 0x3C, - 20447 - 19968: jis0208<<14 | 0x2F<<7 | 0x37, - 20448 - 19968: jis0212<<14 | 0x10<<7 | 0x21, - 20449 - 19968: jis0208<<14 | 0x1E<<7 | 0x0D, - 20450 - 19968: jis0212<<14 | 0x10<<7 | 0x22, - 20451 - 19968: jis0208<<14 | 0x2A<<7 | 0x52, - 20452 - 19968: jis0208<<14 | 0x2F<<7 | 0x3E, - 20453 - 19968: jis0208<<14 | 0x2F<<7 | 0x3F, - 20462 - 19968: jis0208<<14 | 0x1C<<7 | 0x03, - 20463 - 19968: jis0208<<14 | 0x2F<<7 | 0x4C, - 20464 - 19968: jis0212<<14 | 0x10<<7 | 0x23, - 20466 - 19968: jis0212<<14 | 0x10<<7 | 0x24, - 20467 - 19968: jis0208<<14 | 0x26<<7 | 0x2F, - 20469 - 19968: jis0208<<14 | 0x28<<7 | 0x15, - 20470 - 19968: jis0208<<14 | 0x2F<<7 | 0x47, - 20472 - 19968: jis0208<<14 | 0x29<<7 | 0x4F, - 20474 - 19968: jis0208<<14 | 0x11<<7 | 0x15, - 20476 - 19968: jis0212<<14 | 0x10<<7 | 0x25, - 20477 - 19968: jis0212<<14 | 0x10<<7 | 0x26, - 20478 - 19968: jis0208<<14 | 0x2F<<7 | 0x4B, - 20479 - 19968: jis0208<<14 | 0x58<<7 | 0x1A, - 20480 - 19968: jis0212<<14 | 0x10<<7 | 0x28, - 20481 - 19968: jis0212<<14 | 0x10<<7 | 0x29, - 20484 - 19968: jis0212<<14 | 0x10<<7 | 0x2A, - 20485 - 19968: jis0208<<14 | 0x2F<<7 | 0x45, - 20486 - 19968: jis0208<<14 | 0x2F<<7 | 0x4E, - 20487 - 19968: jis0212<<14 | 0x10<<7 | 0x2B, - 20489 - 19968: jis0208<<14 | 0x20<<7 | 0x31, - 20490 - 19968: jis0212<<14 | 0x10<<7 | 0x2C, - 20491 - 19968: jis0208<<14 | 0x17<<7 | 0x23, - 20492 - 19968: jis0212<<14 | 0x10<<7 | 0x2D, - 20493 - 19968: jis0208<<14 | 0x26<<7 | 0x3B, - 20494 - 19968: jis0212<<14 | 0x10<<7 | 0x2E, - 20495 - 19968: jis0208<<14 | 0x3F<<7 | 0x26, - 20496 - 19968: jis0212<<14 | 0x10<<7 | 0x2F, - 20497 - 19968: jis0208<<14 | 0x2F<<7 | 0x4D, - 20498 - 19968: jis0208<<14 | 0x24<<7 | 0x3C, - 20499 - 19968: jis0212<<14 | 0x10<<7 | 0x30, - 20500 - 19968: jis0208<<14 | 0x2F<<7 | 0x42, - 20502 - 19968: jis0208<<14 | 0x17<<7 | 0x55, - 20503 - 19968: jis0212<<14 | 0x10<<7 | 0x31, - 20504 - 19968: jis0212<<14 | 0x10<<7 | 0x32, - 20505 - 19968: jis0208<<14 | 0x17<<7 | 0x54, - 20506 - 19968: jis0208<<14 | 0x2F<<7 | 0x40, - 20507 - 19968: jis0212<<14 | 0x10<<7 | 0x33, - 20508 - 19968: jis0212<<14 | 0x10<<7 | 0x34, - 20509 - 19968: jis0212<<14 | 0x10<<7 | 0x35, - 20510 - 19968: jis0208<<14 | 0x58<<7 | 0x1B, - 20511 - 19968: jis0208<<14 | 0x1B<<7 | 0x39, - 20513 - 19968: jis0208<<14 | 0x2F<<7 | 0x48, - 20514 - 19968: jis0208<<14 | 0x58<<7 | 0x19, - 20515 - 19968: jis0208<<14 | 0x29<<7 | 0x4E, - 20516 - 19968: jis0208<<14 | 0x22<<7 | 0x2C, - 20517 - 19968: jis0208<<14 | 0x2F<<7 | 0x44, - 20518 - 19968: jis0208<<14 | 0x16<<7 | 0x50, - 20519 - 19968: jis0212<<14 | 0x10<<7 | 0x38, - 20520 - 19968: jis0208<<14 | 0x2F<<7 | 0x41, - 20521 - 19968: jis0208<<14 | 0x2F<<7 | 0x49, - 20522 - 19968: jis0208<<14 | 0x2F<<7 | 0x43, - 20523 - 19968: jis0208<<14 | 0x2D<<7 | 0x30, - 20524 - 19968: jis0208<<14 | 0x2F<<7 | 0x4A, - 20525 - 19968: jis0208<<14 | 0x2E<<7 | 0x20, - 20526 - 19968: jis0212<<14 | 0x10<<7 | 0x39, - 20528 - 19968: jis0212<<14 | 0x10<<7 | 0x3A, - 20530 - 19968: jis0212<<14 | 0x10<<7 | 0x3B, - 20531 - 19968: jis0212<<14 | 0x10<<7 | 0x3C, - 20533 - 19968: jis0212<<14 | 0x10<<7 | 0x3D, - 20534 - 19968: jis0208<<14 | 0x15<<7 | 0x45, - 20537 - 19968: jis0208<<14 | 0x16<<7 | 0x4F, - 20539 - 19968: jis0212<<14 | 0x10<<7 | 0x55, - 20544 - 19968: jis0208<<14 | 0x58<<7 | 0x18, - 20545 - 19968: jis0212<<14 | 0x10<<7 | 0x3F, - 20546 - 19968: jis0208<<14 | 0x58<<7 | 0x1E, - 20547 - 19968: jis0208<<14 | 0x2F<<7 | 0x4F, - 20549 - 19968: jis0212<<14 | 0x10<<7 | 0x41, - 20550 - 19968: jis0208<<14 | 0x58<<7 | 0x1C, - 20551 - 19968: jis0208<<14 | 0x2F<<7 | 0x50, - 20552 - 19968: jis0208<<14 | 0x2F<<7 | 0x54, - 20553 - 19968: jis0208<<14 | 0x0F<<7 | 0x2D, - 20554 - 19968: jis0212<<14 | 0x10<<7 | 0x43, - 20556 - 19968: jis0212<<14 | 0x10<<7 | 0x44, - 20558 - 19968: jis0212<<14 | 0x10<<7 | 0x45, - 20559 - 19968: jis0208<<14 | 0x29<<7 | 0x2F, - 20560 - 19968: jis0208<<14 | 0x2F<<7 | 0x53, - 20561 - 19968: jis0212<<14 | 0x10<<7 | 0x46, - 20562 - 19968: jis0212<<14 | 0x10<<7 | 0x47, - 20563 - 19968: jis0212<<14 | 0x10<<7 | 0x48, - 20565 - 19968: jis0208<<14 | 0x2F<<7 | 0x52, - 20566 - 19968: jis0208<<14 | 0x2F<<7 | 0x56, - 20567 - 19968: jis0212<<14 | 0x10<<7 | 0x49, - 20569 - 19968: jis0212<<14 | 0x10<<7 | 0x4A, - 20570 - 19968: jis0208<<14 | 0x2F<<7 | 0x55, - 20572 - 19968: jis0208<<14 | 0x23<<7 | 0x43, - 20575 - 19968: jis0212<<14 | 0x10<<7 | 0x4B, - 20576 - 19968: jis0212<<14 | 0x10<<7 | 0x4C, - 20578 - 19968: jis0212<<14 | 0x10<<7 | 0x4D, - 20579 - 19968: jis0212<<14 | 0x10<<7 | 0x4E, - 20581 - 19968: jis0208<<14 | 0x16<<7 | 0x51, - 20582 - 19968: jis0212<<14 | 0x10<<7 | 0x4F, - 20583 - 19968: jis0212<<14 | 0x10<<7 | 0x50, - 20586 - 19968: jis0212<<14 | 0x10<<7 | 0x51, - 20588 - 19968: jis0208<<14 | 0x2F<<7 | 0x57, - 20589 - 19968: jis0212<<14 | 0x10<<7 | 0x52, - 20592 - 19968: jis0208<<14 | 0x58<<7 | 0x1D, - 20593 - 19968: jis0212<<14 | 0x10<<7 | 0x54, - 20594 - 19968: jis0208<<14 | 0x1B<<7 | 0x24, - 20596 - 19968: jis0208<<14 | 0x21<<7 | 0x05, - 20597 - 19968: jis0208<<14 | 0x23<<7 | 0x44, - 20598 - 19968: jis0208<<14 | 0x15<<7 | 0x55, - 20600 - 19968: jis0208<<14 | 0x2F<<7 | 0x58, - 20605 - 19968: jis0208<<14 | 0x14<<7 | 0x15, - 20608 - 19968: jis0208<<14 | 0x2F<<7 | 0x59, - 20609 - 19968: jis0212<<14 | 0x10<<7 | 0x56, - 20611 - 19968: jis0212<<14 | 0x10<<7 | 0x57, - 20612 - 19968: jis0212<<14 | 0x10<<7 | 0x58, - 20613 - 19968: jis0208<<14 | 0x2F<<7 | 0x5B, - 20614 - 19968: jis0212<<14 | 0x10<<7 | 0x59, - 20618 - 19968: jis0212<<14 | 0x10<<7 | 0x5A, - 20621 - 19968: jis0208<<14 | 0x2A<<7 | 0x14, - 20622 - 19968: jis0212<<14 | 0x10<<7 | 0x5B, - 20623 - 19968: jis0212<<14 | 0x10<<7 | 0x5C, - 20624 - 19968: jis0212<<14 | 0x10<<7 | 0x5D, - 20625 - 19968: jis0208<<14 | 0x16<<7 | 0x45, - 20626 - 19968: jis0212<<14 | 0x11<<7 | 0x00, - 20627 - 19968: jis0212<<14 | 0x11<<7 | 0x01, - 20628 - 19968: jis0208<<14 | 0x58<<7 | 0x1F, - 20630 - 19968: jis0212<<14 | 0x11<<7 | 0x03, - 20632 - 19968: jis0208<<14 | 0x1A<<7 | 0x10, - 20633 - 19968: jis0208<<14 | 0x27<<7 | 0x56, - 20634 - 19968: jis0208<<14 | 0x2F<<7 | 0x5A, - 20635 - 19968: jis0212<<14 | 0x11<<7 | 0x04, - 20636 - 19968: jis0212<<14 | 0x11<<7 | 0x05, - 20638 - 19968: jis0212<<14 | 0x11<<7 | 0x06, - 20639 - 19968: jis0212<<14 | 0x11<<7 | 0x07, - 20640 - 19968: jis0212<<14 | 0x11<<7 | 0x08, - 20641 - 19968: jis0212<<14 | 0x11<<7 | 0x09, - 20642 - 19968: jis0212<<14 | 0x11<<7 | 0x0A, - 20650 - 19968: jis0212<<14 | 0x11<<7 | 0x0B, - 20652 - 19968: jis0208<<14 | 0x19<<7 | 0x24, - 20653 - 19968: jis0208<<14 | 0x2C<<7 | 0x22, - 20655 - 19968: jis0212<<14 | 0x11<<7 | 0x0C, - 20656 - 19968: jis0212<<14 | 0x11<<7 | 0x0D, - 20658 - 19968: jis0208<<14 | 0x2F<<7 | 0x5D, - 20659 - 19968: jis0208<<14 | 0x30<<7 | 0x02, - 20660 - 19968: jis0208<<14 | 0x2F<<7 | 0x5C, - 20661 - 19968: jis0208<<14 | 0x19<<7 | 0x23, - 20663 - 19968: jis0208<<14 | 0x1C<<7 | 0x5C, - 20665 - 19968: jis0212<<14 | 0x11<<7 | 0x0E, - 20666 - 19968: jis0212<<14 | 0x11<<7 | 0x0F, - 20669 - 19968: jis0212<<14 | 0x11<<7 | 0x10, - 20670 - 19968: jis0208<<14 | 0x16<<7 | 0x18, - 20672 - 19968: jis0212<<14 | 0x11<<7 | 0x11, - 20674 - 19968: jis0208<<14 | 0x30<<7 | 0x03, - 20675 - 19968: jis0212<<14 | 0x11<<7 | 0x12, - 20676 - 19968: jis0212<<14 | 0x11<<7 | 0x13, - 20677 - 19968: jis0208<<14 | 0x15<<7 | 0x2E, - 20679 - 19968: jis0212<<14 | 0x11<<7 | 0x14, - 20681 - 19968: jis0208<<14 | 0x30<<7 | 0x00, - 20682 - 19968: jis0208<<14 | 0x30<<7 | 0x01, - 20684 - 19968: jis0212<<14 | 0x11<<7 | 0x15, - 20685 - 19968: jis0208<<14 | 0x25<<7 | 0x0E, - 20686 - 19968: jis0212<<14 | 0x11<<7 | 0x16, - 20687 - 19968: jis0208<<14 | 0x20<<7 | 0x5B, - 20688 - 19968: jis0212<<14 | 0x11<<7 | 0x17, - 20689 - 19968: jis0208<<14 | 0x15<<7 | 0x02, - 20691 - 19968: jis0212<<14 | 0x11<<7 | 0x18, - 20692 - 19968: jis0212<<14 | 0x11<<7 | 0x19, - 20693 - 19968: jis0208<<14 | 0x2A<<7 | 0x2C, - 20694 - 19968: jis0208<<14 | 0x30<<7 | 0x04, - 20696 - 19968: jis0208<<14 | 0x58<<7 | 0x21, - 20698 - 19968: jis0208<<14 | 0x2D<<7 | 0x1C, - 20700 - 19968: jis0212<<14 | 0x11<<7 | 0x1B, - 20701 - 19968: jis0212<<14 | 0x11<<7 | 0x1C, - 20702 - 19968: jis0208<<14 | 0x30<<7 | 0x05, - 20703 - 19968: jis0212<<14 | 0x11<<7 | 0x1D, - 20706 - 19968: jis0212<<14 | 0x11<<7 | 0x1E, - 20707 - 19968: jis0208<<14 | 0x30<<7 | 0x08, - 20708 - 19968: jis0212<<14 | 0x11<<7 | 0x1F, - 20709 - 19968: jis0208<<14 | 0x30<<7 | 0x06, - 20710 - 19968: jis0212<<14 | 0x11<<7 | 0x20, - 20711 - 19968: jis0208<<14 | 0x20<<7 | 0x2D, - 20712 - 19968: jis0212<<14 | 0x11<<7 | 0x21, - 20713 - 19968: jis0212<<14 | 0x11<<7 | 0x22, - 20717 - 19968: jis0208<<14 | 0x30<<7 | 0x07, - 20718 - 19968: jis0208<<14 | 0x30<<7 | 0x09, - 20719 - 19968: jis0212<<14 | 0x11<<7 | 0x23, - 20721 - 19968: jis0212<<14 | 0x11<<7 | 0x24, - 20722 - 19968: jis0212<<14 | 0x11<<7 | 0x30, - 20724 - 19968: jis0208<<14 | 0x58<<7 | 0x20, - 20725 - 19968: jis0208<<14 | 0x30<<7 | 0x0B, - 20726 - 19968: jis0212<<14 | 0x11<<7 | 0x25, - 20729 - 19968: jis0208<<14 | 0x30<<7 | 0x0A, - 20730 - 19968: jis0212<<14 | 0x11<<7 | 0x26, - 20731 - 19968: jis0208<<14 | 0x29<<7 | 0x27, - 20734 - 19968: jis0212<<14 | 0x11<<7 | 0x27, - 20736 - 19968: jis0208<<14 | 0x14<<7 | 0x16, - 20737 - 19968: jis0208<<14 | 0x30<<7 | 0x0D, - 20738 - 19968: jis0208<<14 | 0x30<<7 | 0x0E, - 20739 - 19968: jis0212<<14 | 0x11<<7 | 0x28, - 20740 - 19968: jis0208<<14 | 0x11<<7 | 0x0E, - 20742 - 19968: jis0212<<14 | 0x11<<7 | 0x29, - 20743 - 19968: jis0212<<14 | 0x11<<7 | 0x2A, - 20744 - 19968: jis0212<<14 | 0x11<<7 | 0x2B, - 20745 - 19968: jis0208<<14 | 0x30<<7 | 0x0C, - 20747 - 19968: jis0212<<14 | 0x11<<7 | 0x2C, - 20748 - 19968: jis0212<<14 | 0x11<<7 | 0x2D, - 20749 - 19968: jis0212<<14 | 0x11<<7 | 0x2E, - 20750 - 19968: jis0212<<14 | 0x11<<7 | 0x2F, - 20752 - 19968: jis0212<<14 | 0x11<<7 | 0x31, - 20754 - 19968: jis0208<<14 | 0x1B<<7 | 0x53, - 20756 - 19968: jis0208<<14 | 0x30<<7 | 0x11, - 20757 - 19968: jis0208<<14 | 0x30<<7 | 0x10, - 20758 - 19968: jis0208<<14 | 0x30<<7 | 0x0F, - 20759 - 19968: jis0212<<14 | 0x11<<7 | 0x32, - 20760 - 19968: jis0208<<14 | 0x2F<<7 | 0x35, - 20761 - 19968: jis0212<<14 | 0x11<<7 | 0x33, - 20762 - 19968: jis0208<<14 | 0x30<<7 | 0x12, - 20763 - 19968: jis0212<<14 | 0x11<<7 | 0x34, - 20764 - 19968: jis0212<<14 | 0x11<<7 | 0x35, - 20765 - 19968: jis0212<<14 | 0x11<<7 | 0x36, - 20766 - 19968: jis0212<<14 | 0x11<<7 | 0x37, - 20767 - 19968: jis0208<<14 | 0x1C<<7 | 0x5D, - 20769 - 19968: jis0208<<14 | 0x30<<7 | 0x13, - 20771 - 19968: jis0212<<14 | 0x11<<7 | 0x38, - 20775 - 19968: jis0212<<14 | 0x11<<7 | 0x39, - 20776 - 19968: jis0212<<14 | 0x11<<7 | 0x3A, - 20778 - 19968: jis0208<<14 | 0x2C<<7 | 0x04, - 20780 - 19968: jis0212<<14 | 0x11<<7 | 0x3B, - 20781 - 19968: jis0212<<14 | 0x11<<7 | 0x3C, - 20783 - 19968: jis0212<<14 | 0x11<<7 | 0x3D, - 20785 - 19968: jis0212<<14 | 0x11<<7 | 0x3E, - 20786 - 19968: jis0208<<14 | 0x2B<<7 | 0x38, - 20787 - 19968: jis0212<<14 | 0x11<<7 | 0x3F, - 20788 - 19968: jis0212<<14 | 0x11<<7 | 0x40, - 20789 - 19968: jis0212<<14 | 0x11<<7 | 0x41, - 20791 - 19968: jis0208<<14 | 0x30<<7 | 0x15, - 20792 - 19968: jis0212<<14 | 0x11<<7 | 0x42, - 20793 - 19968: jis0212<<14 | 0x11<<7 | 0x43, - 20794 - 19968: jis0208<<14 | 0x30<<7 | 0x14, - 20795 - 19968: jis0208<<14 | 0x30<<7 | 0x17, - 20796 - 19968: jis0208<<14 | 0x30<<7 | 0x16, - 20799 - 19968: jis0208<<14 | 0x30<<7 | 0x18, - 20800 - 19968: jis0208<<14 | 0x30<<7 | 0x19, - 20801 - 19968: jis0208<<14 | 0x0F<<7 | 0x53, - 20802 - 19968: jis0212<<14 | 0x11<<7 | 0x44, - 20803 - 19968: jis0208<<14 | 0x17<<7 | 0x14, - 20804 - 19968: jis0208<<14 | 0x16<<7 | 0x1A, - 20805 - 19968: jis0208<<14 | 0x1C<<7 | 0x1B, - 20806 - 19968: jis0208<<14 | 0x22<<7 | 0x5A, - 20807 - 19968: jis0208<<14 | 0x15<<7 | 0x03, - 20808 - 19968: jis0208<<14 | 0x1F<<7 | 0x47, - 20809 - 19968: jis0208<<14 | 0x17<<7 | 0x56, - 20810 - 19968: jis0208<<14 | 0x58<<7 | 0x22, - 20811 - 19968: jis0208<<14 | 0x18<<7 | 0x4D, - 20812 - 19968: jis0208<<14 | 0x30<<7 | 0x1B, - 20813 - 19968: jis0208<<14 | 0x2B<<7 | 0x27, - 20814 - 19968: jis0208<<14 | 0x24<<7 | 0x25, - 20815 - 19968: jis0212<<14 | 0x11<<7 | 0x46, - 20816 - 19968: jis0208<<14 | 0x1A<<7 | 0x58, - 20818 - 19968: jis0208<<14 | 0x30<<7 | 0x1A, - 20819 - 19968: jis0212<<14 | 0x11<<7 | 0x47, - 20820 - 19968: jis0208<<14 | 0x30<<7 | 0x1C, - 20821 - 19968: jis0212<<14 | 0x11<<7 | 0x48, - 20823 - 19968: jis0212<<14 | 0x11<<7 | 0x49, - 20824 - 19968: jis0212<<14 | 0x11<<7 | 0x4A, - 20826 - 19968: jis0208<<14 | 0x24<<7 | 0x3D, - 20828 - 19968: jis0208<<14 | 0x12<<7 | 0x54, - 20831 - 19968: jis0212<<14 | 0x11<<7 | 0x4B, - 20834 - 19968: jis0208<<14 | 0x30<<7 | 0x1D, - 20836 - 19968: jis0208<<14 | 0x58<<7 | 0x23, - 20837 - 19968: jis0208<<14 | 0x25<<7 | 0x5D, - 20838 - 19968: jis0212<<14 | 0x11<<7 | 0x4D, - 20840 - 19968: jis0208<<14 | 0x20<<7 | 0x13, - 20841 - 19968: jis0208<<14 | 0x30<<7 | 0x1F, - 20842 - 19968: jis0208<<14 | 0x30<<7 | 0x20, - 20843 - 19968: jis0208<<14 | 0x27<<7 | 0x0B, - 20844 - 19968: jis0208<<14 | 0x17<<7 | 0x57, - 20845 - 19968: jis0208<<14 | 0x2E<<7 | 0x1A, - 20846 - 19968: jis0208<<14 | 0x30<<7 | 0x21, - 20849 - 19968: jis0208<<14 | 0x15<<7 | 0x05, - 20853 - 19968: jis0208<<14 | 0x29<<7 | 0x1B, - 20854 - 19968: jis0208<<14 | 0x21<<7 | 0x15, - 20855 - 19968: jis0208<<14 | 0x15<<7 | 0x50, - 20856 - 19968: jis0208<<14 | 0x24<<7 | 0x14, - 20860 - 19968: jis0208<<14 | 0x16<<7 | 0x52, - 20862 - 19968: jis0212<<14 | 0x11<<7 | 0x4E, - 20864 - 19968: jis0208<<14 | 0x30<<7 | 0x22, - 20866 - 19968: jis0208<<14 | 0x30<<7 | 0x23, - 20867 - 19968: jis0212<<14 | 0x11<<7 | 0x4F, - 20868 - 19968: jis0212<<14 | 0x11<<7 | 0x50, - 20869 - 19968: jis0208<<14 | 0x25<<7 | 0x41, - 20870 - 19968: jis0208<<14 | 0x10<<7 | 0x3E, - 20873 - 19968: jis0208<<14 | 0x30<<7 | 0x26, - 20874 - 19968: jis0208<<14 | 0x19<<7 | 0x5C, - 20875 - 19968: jis0212<<14 | 0x11<<7 | 0x51, - 20876 - 19968: jis0208<<14 | 0x30<<7 | 0x25, - 20877 - 19968: jis0208<<14 | 0x19<<7 | 0x25, - 20878 - 19968: jis0212<<14 | 0x11<<7 | 0x52, - 20879 - 19968: jis0208<<14 | 0x30<<7 | 0x27, - 20880 - 19968: jis0208<<14 | 0x45<<7 | 0x4D, - 20881 - 19968: jis0208<<14 | 0x30<<7 | 0x28, - 20882 - 19968: jis0208<<14 | 0x2A<<7 | 0x20, - 20883 - 19968: jis0208<<14 | 0x30<<7 | 0x29, - 20885 - 19968: jis0208<<14 | 0x30<<7 | 0x2A, - 20886 - 19968: jis0208<<14 | 0x30<<7 | 0x2B, - 20887 - 19968: jis0208<<14 | 0x1D<<7 | 0x48, - 20888 - 19968: jis0212<<14 | 0x11<<7 | 0x53, - 20889 - 19968: jis0208<<14 | 0x1B<<7 | 0x2B, - 20893 - 19968: jis0208<<14 | 0x58<<7 | 0x24, - 20896 - 19968: jis0208<<14 | 0x13<<7 | 0x06, - 20897 - 19968: jis0212<<14 | 0x11<<7 | 0x55, - 20898 - 19968: jis0208<<14 | 0x30<<7 | 0x2E, - 20899 - 19968: jis0212<<14 | 0x11<<7 | 0x56, - 20900 - 19968: jis0208<<14 | 0x30<<7 | 0x2C, - 20901 - 19968: jis0208<<14 | 0x2B<<7 | 0x1C, - 20902 - 19968: jis0208<<14 | 0x30<<7 | 0x2D, - 20904 - 19968: jis0208<<14 | 0x28<<7 | 0x39, - 20905 - 19968: jis0208<<14 | 0x30<<7 | 0x2F, - 20906 - 19968: jis0208<<14 | 0x30<<7 | 0x30, - 20907 - 19968: jis0208<<14 | 0x30<<7 | 0x31, - 20908 - 19968: jis0208<<14 | 0x24<<7 | 0x3E, - 20909 - 19968: jis0212<<14 | 0x11<<7 | 0x57, - 20912 - 19968: jis0208<<14 | 0x30<<7 | 0x35, - 20913 - 19968: jis0208<<14 | 0x30<<7 | 0x33, - 20914 - 19968: jis0208<<14 | 0x30<<7 | 0x34, - 20915 - 19968: jis0208<<14 | 0x30<<7 | 0x32, - 20916 - 19968: jis0208<<14 | 0x19<<7 | 0x42, - 20917 - 19968: jis0208<<14 | 0x30<<7 | 0x36, - 20918 - 19968: jis0208<<14 | 0x2B<<7 | 0x49, - 20919 - 19968: jis0208<<14 | 0x2D<<7 | 0x43, - 20920 - 19968: jis0212<<14 | 0x11<<7 | 0x58, - 20922 - 19968: jis0212<<14 | 0x11<<7 | 0x59, - 20924 - 19968: jis0212<<14 | 0x11<<7 | 0x5A, - 20925 - 19968: jis0208<<14 | 0x30<<7 | 0x37, - 20926 - 19968: jis0208<<14 | 0x58<<7 | 0x25, - 20927 - 19968: jis0212<<14 | 0x11<<7 | 0x5C, - 20930 - 19968: jis0212<<14 | 0x11<<7 | 0x5D, - 20932 - 19968: jis0208<<14 | 0x1F<<7 | 0x07, - 20933 - 19968: jis0208<<14 | 0x30<<7 | 0x38, - 20934 - 19968: jis0208<<14 | 0x1C<<7 | 0x39, - 20936 - 19968: jis0212<<14 | 0x12<<7 | 0x00, - 20937 - 19968: jis0208<<14 | 0x30<<7 | 0x39, - 20939 - 19968: jis0208<<14 | 0x22<<7 | 0x5B, - 20940 - 19968: jis0208<<14 | 0x2D<<7 | 0x1E, - 20941 - 19968: jis0208<<14 | 0x24<<7 | 0x3F, - 20943 - 19968: jis0212<<14 | 0x12<<7 | 0x01, - 20945 - 19968: jis0212<<14 | 0x12<<7 | 0x02, - 20946 - 19968: jis0212<<14 | 0x12<<7 | 0x03, - 20947 - 19968: jis0212<<14 | 0x12<<7 | 0x04, - 20949 - 19968: jis0212<<14 | 0x12<<7 | 0x05, - 20950 - 19968: jis0208<<14 | 0x31<<7 | 0x24, - 20952 - 19968: jis0212<<14 | 0x12<<7 | 0x06, - 20955 - 19968: jis0208<<14 | 0x30<<7 | 0x3A, - 20956 - 19968: jis0208<<14 | 0x53<<7 | 0x04, - 20957 - 19968: jis0208<<14 | 0x15<<7 | 0x24, - 20958 - 19968: jis0212<<14 | 0x12<<7 | 0x07, - 20960 - 19968: jis0208<<14 | 0x30<<7 | 0x3B, - 20961 - 19968: jis0208<<14 | 0x2A<<7 | 0x3D, - 20962 - 19968: jis0212<<14 | 0x12<<7 | 0x08, - 20965 - 19968: jis0212<<14 | 0x12<<7 | 0x09, - 20966 - 19968: jis0208<<14 | 0x1C<<7 | 0x47, - 20967 - 19968: jis0208<<14 | 0x21<<7 | 0x5B, - 20969 - 19968: jis0208<<14 | 0x30<<7 | 0x3D, - 20970 - 19968: jis0208<<14 | 0x25<<7 | 0x43, - 20972 - 19968: jis0208<<14 | 0x58<<7 | 0x26, - 20973 - 19968: jis0208<<14 | 0x30<<7 | 0x3E, - 20974 - 19968: jis0212<<14 | 0x12<<7 | 0x0A, - 20976 - 19968: jis0208<<14 | 0x30<<7 | 0x3F, - 20977 - 19968: jis0208<<14 | 0x12<<7 | 0x0D, - 20978 - 19968: jis0212<<14 | 0x12<<7 | 0x0B, - 20979 - 19968: jis0212<<14 | 0x12<<7 | 0x0C, - 20980 - 19968: jis0212<<14 | 0x12<<7 | 0x0D, - 20981 - 19968: jis0208<<14 | 0x30<<7 | 0x40, - 20982 - 19968: jis0208<<14 | 0x15<<7 | 0x06, - 20983 - 19968: jis0212<<14 | 0x12<<7 | 0x0E, - 20984 - 19968: jis0208<<14 | 0x25<<7 | 0x2B, - 20985 - 19968: jis0208<<14 | 0x10<<7 | 0x59, - 20986 - 19968: jis0208<<14 | 0x1C<<7 | 0x2F, - 20989 - 19968: jis0208<<14 | 0x27<<7 | 0x00, - 20990 - 19968: jis0208<<14 | 0x30<<7 | 0x41, - 20992 - 19968: jis0208<<14 | 0x24<<7 | 0x40, - 20993 - 19968: jis0212<<14 | 0x12<<7 | 0x0F, - 20994 - 19968: jis0212<<14 | 0x12<<7 | 0x10, - 20995 - 19968: jis0208<<14 | 0x1E<<7 | 0x2E, - 20996 - 19968: jis0208<<14 | 0x30<<7 | 0x42, - 20997 - 19968: jis0212<<14 | 0x12<<7 | 0x11, - 20998 - 19968: jis0208<<14 | 0x29<<7 | 0x0B, - 20999 - 19968: jis0208<<14 | 0x1F<<7 | 0x39, - 21000 - 19968: jis0208<<14 | 0x13<<7 | 0x01, - 21002 - 19968: jis0208<<14 | 0x13<<7 | 0x08, - 21003 - 19968: jis0208<<14 | 0x30<<7 | 0x43, - 21006 - 19968: jis0208<<14 | 0x30<<7 | 0x45, - 21009 - 19968: jis0208<<14 | 0x16<<7 | 0x19, - 21010 - 19968: jis0212<<14 | 0x12<<7 | 0x12, - 21011 - 19968: jis0212<<14 | 0x12<<7 | 0x13, - 21012 - 19968: jis0208<<14 | 0x30<<7 | 0x44, - 21013 - 19968: jis0208<<14 | 0x58<<7 | 0x27, - 21014 - 19968: jis0212<<14 | 0x12<<7 | 0x15, - 21015 - 19968: jis0208<<14 | 0x2D<<7 | 0x52, - 21016 - 19968: jis0212<<14 | 0x12<<7 | 0x16, - 21021 - 19968: jis0208<<14 | 0x1C<<7 | 0x48, - 21026 - 19968: jis0212<<14 | 0x12<<7 | 0x17, - 21028 - 19968: jis0208<<14 | 0x27<<7 | 0x1C, - 21029 - 19968: jis0208<<14 | 0x29<<7 | 0x2B, - 21031 - 19968: jis0208<<14 | 0x30<<7 | 0x46, - 21032 - 19968: jis0212<<14 | 0x12<<7 | 0x18, - 21033 - 19968: jis0208<<14 | 0x2C<<7 | 0x57, - 21034 - 19968: jis0208<<14 | 0x30<<7 | 0x47, - 21038 - 19968: jis0208<<14 | 0x30<<7 | 0x48, - 21040 - 19968: jis0208<<14 | 0x24<<7 | 0x5D, - 21041 - 19968: jis0212<<14 | 0x12<<7 | 0x19, - 21042 - 19968: jis0212<<14 | 0x12<<7 | 0x1A, - 21043 - 19968: jis0208<<14 | 0x30<<7 | 0x49, - 21045 - 19968: jis0212<<14 | 0x12<<7 | 0x1B, - 21046 - 19968: jis0208<<14 | 0x1F<<7 | 0x08, - 21047 - 19968: jis0208<<14 | 0x19<<7 | 0x5D, - 21048 - 19968: jis0208<<14 | 0x16<<7 | 0x53, - 21049 - 19968: jis0208<<14 | 0x30<<7 | 0x4A, - 21050 - 19968: jis0208<<14 | 0x1A<<7 | 0x28, - 21051 - 19968: jis0208<<14 | 0x18<<7 | 0x4E, - 21052 - 19968: jis0212<<14 | 0x12<<7 | 0x1C, - 21059 - 19968: jis0208<<14 | 0x23<<7 | 0x45, - 21060 - 19968: jis0208<<14 | 0x30<<7 | 0x4C, - 21061 - 19968: jis0212<<14 | 0x12<<7 | 0x1D, - 21063 - 19968: jis0208<<14 | 0x21<<7 | 0x06, - 21065 - 19968: jis0212<<14 | 0x12<<7 | 0x1E, - 21066 - 19968: jis0208<<14 | 0x19<<7 | 0x4E, - 21067 - 19968: jis0208<<14 | 0x30<<7 | 0x4D, - 21068 - 19968: jis0208<<14 | 0x30<<7 | 0x4E, - 21069 - 19968: jis0208<<14 | 0x20<<7 | 0x0F, - 21071 - 19968: jis0208<<14 | 0x30<<7 | 0x4B, - 21076 - 19968: jis0208<<14 | 0x30<<7 | 0x50, - 21077 - 19968: jis0212<<14 | 0x12<<7 | 0x1F, - 21078 - 19968: jis0208<<14 | 0x2A<<7 | 0x15, - 21079 - 19968: jis0212<<14 | 0x12<<7 | 0x20, - 21080 - 19968: jis0212<<14 | 0x12<<7 | 0x21, - 21082 - 19968: jis0212<<14 | 0x12<<7 | 0x22, - 21083 - 19968: jis0208<<14 | 0x18<<7 | 0x43, - 21084 - 19968: jis0212<<14 | 0x12<<7 | 0x23, - 21086 - 19968: jis0208<<14 | 0x30<<7 | 0x4F, - 21087 - 19968: jis0212<<14 | 0x12<<7 | 0x24, - 21088 - 19968: jis0212<<14 | 0x12<<7 | 0x25, - 21089 - 19968: jis0212<<14 | 0x12<<7 | 0x26, - 21091 - 19968: jis0208<<14 | 0x16<<7 | 0x54, - 21092 - 19968: jis0208<<14 | 0x19<<7 | 0x3D, - 21093 - 19968: jis0208<<14 | 0x26<<7 | 0x4C, - 21094 - 19968: jis0212<<14 | 0x12<<7 | 0x27, - 21097 - 19968: jis0208<<14 | 0x30<<7 | 0x53, - 21098 - 19968: jis0208<<14 | 0x30<<7 | 0x51, - 21102 - 19968: jis0212<<14 | 0x12<<7 | 0x28, - 21103 - 19968: jis0208<<14 | 0x28<<7 | 0x5A, - 21104 - 19968: jis0208<<14 | 0x1D<<7 | 0x49, - 21105 - 19968: jis0208<<14 | 0x30<<7 | 0x5A, - 21106 - 19968: jis0208<<14 | 0x12<<7 | 0x43, - 21107 - 19968: jis0208<<14 | 0x30<<7 | 0x54, - 21108 - 19968: jis0208<<14 | 0x30<<7 | 0x52, - 21109 - 19968: jis0208<<14 | 0x20<<7 | 0x2E, - 21111 - 19968: jis0212<<14 | 0x12<<7 | 0x29, - 21112 - 19968: jis0212<<14 | 0x12<<7 | 0x2A, - 21113 - 19968: jis0212<<14 | 0x12<<7 | 0x2B, - 21117 - 19968: jis0208<<14 | 0x30<<7 | 0x56, - 21119 - 19968: jis0208<<14 | 0x30<<7 | 0x55, - 21120 - 19968: jis0212<<14 | 0x12<<7 | 0x2C, - 21122 - 19968: jis0212<<14 | 0x12<<7 | 0x2D, - 21123 - 19968: jis0208<<14 | 0x12<<7 | 0x23, - 21125 - 19968: jis0212<<14 | 0x12<<7 | 0x2E, - 21127 - 19968: jis0208<<14 | 0x16<<7 | 0x3F, - 21128 - 19968: jis0208<<14 | 0x30<<7 | 0x5B, - 21129 - 19968: jis0208<<14 | 0x2D<<7 | 0x0C, - 21130 - 19968: jis0212<<14 | 0x12<<7 | 0x2F, - 21132 - 19968: jis0212<<14 | 0x12<<7 | 0x30, - 21133 - 19968: jis0208<<14 | 0x30<<7 | 0x57, - 21137 - 19968: jis0208<<14 | 0x30<<7 | 0x5C, - 21138 - 19968: jis0208<<14 | 0x30<<7 | 0x59, - 21139 - 19968: jis0212<<14 | 0x12<<7 | 0x31, - 21140 - 19968: jis0208<<14 | 0x30<<7 | 0x58, - 21141 - 19968: jis0212<<14 | 0x12<<7 | 0x32, - 21142 - 19968: jis0212<<14 | 0x12<<7 | 0x33, - 21143 - 19968: jis0212<<14 | 0x12<<7 | 0x34, - 21144 - 19968: jis0212<<14 | 0x12<<7 | 0x35, - 21146 - 19968: jis0212<<14 | 0x12<<7 | 0x36, - 21147 - 19968: jis0208<<14 | 0x2D<<7 | 0x2E, - 21148 - 19968: jis0208<<14 | 0x58<<7 | 0x28, - 21151 - 19968: jis0208<<14 | 0x17<<7 | 0x58, - 21152 - 19968: jis0208<<14 | 0x11<<7 | 0x22, - 21155 - 19968: jis0208<<14 | 0x2D<<7 | 0x53, - 21156 - 19968: jis0212<<14 | 0x12<<7 | 0x38, - 21157 - 19968: jis0212<<14 | 0x12<<7 | 0x39, - 21158 - 19968: jis0208<<14 | 0x58<<7 | 0x29, - 21159 - 19968: jis0212<<14 | 0x12<<7 | 0x3B, - 21161 - 19968: jis0208<<14 | 0x1C<<7 | 0x54, - 21162 - 19968: jis0208<<14 | 0x24<<7 | 0x37, - 21163 - 19968: jis0208<<14 | 0x18<<7 | 0x44, - 21164 - 19968: jis0208<<14 | 0x31<<7 | 0x01, - 21165 - 19968: jis0208<<14 | 0x31<<7 | 0x02, - 21167 - 19968: jis0208<<14 | 0x5A<<7 | 0x1B, - 21168 - 19968: jis0212<<14 | 0x12<<7 | 0x3D, - 21169 - 19968: jis0208<<14 | 0x2D<<7 | 0x44, - 21172 - 19968: jis0208<<14 | 0x2E<<7 | 0x0A, - 21173 - 19968: jis0208<<14 | 0x31<<7 | 0x04, - 21174 - 19968: jis0212<<14 | 0x12<<7 | 0x3E, - 21175 - 19968: jis0212<<14 | 0x12<<7 | 0x3F, - 21176 - 19968: jis0212<<14 | 0x12<<7 | 0x40, - 21177 - 19968: jis0208<<14 | 0x17<<7 | 0x59, - 21178 - 19968: jis0212<<14 | 0x12<<7 | 0x41, - 21179 - 19968: jis0212<<14 | 0x12<<7 | 0x42, - 21180 - 19968: jis0208<<14 | 0x31<<7 | 0x03, - 21181 - 19968: jis0212<<14 | 0x12<<7 | 0x43, - 21182 - 19968: jis0208<<14 | 0x12<<7 | 0x0E, - 21184 - 19968: jis0208<<14 | 0x58<<7 | 0x2A, - 21185 - 19968: jis0208<<14 | 0x31<<7 | 0x05, - 21187 - 19968: jis0208<<14 | 0x2A<<7 | 0x35, - 21188 - 19968: jis0212<<14 | 0x12<<7 | 0x45, - 21189 - 19968: jis0208<<14 | 0x23<<7 | 0x1B, - 21190 - 19968: jis0212<<14 | 0x12<<7 | 0x46, - 21191 - 19968: jis0208<<14 | 0x2C<<7 | 0x05, - 21192 - 19968: jis0212<<14 | 0x12<<7 | 0x47, - 21193 - 19968: jis0208<<14 | 0x29<<7 | 0x38, - 21196 - 19968: jis0212<<14 | 0x12<<7 | 0x48, - 21197 - 19968: jis0208<<14 | 0x31<<7 | 0x06, - 21199 - 19968: jis0212<<14 | 0x12<<7 | 0x49, - 21201 - 19968: jis0212<<14 | 0x12<<7 | 0x4A, - 21202 - 19968: jis0208<<14 | 0x4F<<7 | 0x34, - 21204 - 19968: jis0212<<14 | 0x12<<7 | 0x4B, - 21205 - 19968: jis0208<<14 | 0x25<<7 | 0x0F, - 21206 - 19968: jis0212<<14 | 0x12<<7 | 0x4C, - 21207 - 19968: jis0208<<14 | 0x31<<7 | 0x07, - 21208 - 19968: jis0208<<14 | 0x13<<7 | 0x09, - 21209 - 19968: jis0208<<14 | 0x2B<<7 | 0x12, - 21211 - 19968: jis0208<<14 | 0x58<<7 | 0x2B, - 21212 - 19968: jis0212<<14 | 0x12<<7 | 0x4E, - 21213 - 19968: jis0208<<14 | 0x1D<<7 | 0x00, - 21214 - 19968: jis0208<<14 | 0x31<<7 | 0x08, - 21215 - 19968: jis0208<<14 | 0x29<<7 | 0x46, - 21216 - 19968: jis0208<<14 | 0x31<<7 | 0x0C, - 21217 - 19968: jis0212<<14 | 0x12<<7 | 0x4F, - 21218 - 19968: jis0208<<14 | 0x1F<<7 | 0x09, - 21219 - 19968: jis0208<<14 | 0x31<<7 | 0x09, - 21220 - 19968: jis0208<<14 | 0x15<<7 | 0x2F, - 21221 - 19968: jis0212<<14 | 0x12<<7 | 0x50, - 21222 - 19968: jis0208<<14 | 0x31<<7 | 0x0A, - 21223 - 19968: jis0208<<14 | 0x13<<7 | 0x0A, - 21224 - 19968: jis0212<<14 | 0x12<<7 | 0x51, - 21225 - 19968: jis0212<<14 | 0x12<<7 | 0x52, - 21226 - 19968: jis0212<<14 | 0x12<<7 | 0x53, - 21228 - 19968: jis0212<<14 | 0x12<<7 | 0x54, - 21232 - 19968: jis0212<<14 | 0x12<<7 | 0x55, - 21233 - 19968: jis0212<<14 | 0x12<<7 | 0x56, - 21234 - 19968: jis0208<<14 | 0x16<<7 | 0x0D, - 21235 - 19968: jis0208<<14 | 0x31<<7 | 0x0D, - 21236 - 19968: jis0212<<14 | 0x12<<7 | 0x57, - 21237 - 19968: jis0208<<14 | 0x31<<7 | 0x0E, - 21238 - 19968: jis0212<<14 | 0x12<<7 | 0x58, - 21239 - 19968: jis0212<<14 | 0x12<<7 | 0x59, - 21240 - 19968: jis0208<<14 | 0x31<<7 | 0x0F, - 21241 - 19968: jis0208<<14 | 0x31<<7 | 0x10, - 21242 - 19968: jis0208<<14 | 0x1B<<7 | 0x3A, - 21246 - 19968: jis0208<<14 | 0x17<<7 | 0x5A, - 21247 - 19968: jis0208<<14 | 0x2B<<7 | 0x3D, - 21248 - 19968: jis0208<<14 | 0x58<<7 | 0x2C, - 21249 - 19968: jis0208<<14 | 0x2B<<7 | 0x47, - 21250 - 19968: jis0208<<14 | 0x25<<7 | 0x56, - 21251 - 19968: jis0212<<14 | 0x12<<7 | 0x5B, - 21253 - 19968: jis0208<<14 | 0x29<<7 | 0x50, - 21254 - 19968: jis0208<<14 | 0x31<<7 | 0x11, - 21255 - 19968: jis0208<<14 | 0x58<<7 | 0x2D, - 21256 - 19968: jis0208<<14 | 0x31<<7 | 0x12, - 21258 - 19968: jis0212<<14 | 0x12<<7 | 0x5C, - 21259 - 19968: jis0212<<14 | 0x12<<7 | 0x5D, - 21260 - 19968: jis0212<<14 | 0x13<<7 | 0x00, - 21261 - 19968: jis0208<<14 | 0x31<<7 | 0x14, - 21263 - 19968: jis0208<<14 | 0x31<<7 | 0x16, - 21264 - 19968: jis0208<<14 | 0x31<<7 | 0x15, - 21265 - 19968: jis0212<<14 | 0x13<<7 | 0x01, - 21267 - 19968: jis0212<<14 | 0x13<<7 | 0x02, - 21269 - 19968: jis0208<<14 | 0x31<<7 | 0x17, - 21270 - 19968: jis0208<<14 | 0x11<<7 | 0x1C, - 21271 - 19968: jis0208<<14 | 0x2A<<7 | 0x2B, - 21272 - 19968: jis0212<<14 | 0x13<<7 | 0x03, - 21273 - 19968: jis0208<<14 | 0x19<<7 | 0x5B, - 21274 - 19968: jis0208<<14 | 0x31<<7 | 0x18, - 21275 - 19968: jis0212<<14 | 0x13<<7 | 0x04, - 21276 - 19968: jis0212<<14 | 0x13<<7 | 0x05, - 21277 - 19968: jis0208<<14 | 0x20<<7 | 0x38, - 21278 - 19968: jis0212<<14 | 0x13<<7 | 0x06, - 21279 - 19968: jis0212<<14 | 0x13<<7 | 0x07, - 21280 - 19968: jis0208<<14 | 0x1D<<7 | 0x01, - 21281 - 19968: jis0208<<14 | 0x15<<7 | 0x08, - 21283 - 19968: jis0208<<14 | 0x31<<7 | 0x19, - 21284 - 19968: jis0208<<14 | 0x58<<7 | 0x2E, - 21285 - 19968: jis0212<<14 | 0x13<<7 | 0x08, - 21287 - 19968: jis0212<<14 | 0x13<<7 | 0x09, - 21288 - 19968: jis0212<<14 | 0x13<<7 | 0x0A, - 21289 - 19968: jis0212<<14 | 0x13<<7 | 0x0B, - 21290 - 19968: jis0208<<14 | 0x27<<7 | 0x3A, - 21291 - 19968: jis0212<<14 | 0x13<<7 | 0x0C, - 21292 - 19968: jis0212<<14 | 0x13<<7 | 0x0D, - 21293 - 19968: jis0212<<14 | 0x13<<7 | 0x0E, - 21295 - 19968: jis0208<<14 | 0x31<<7 | 0x1A, - 21296 - 19968: jis0212<<14 | 0x13<<7 | 0x0F, - 21297 - 19968: jis0208<<14 | 0x31<<7 | 0x1B, - 21298 - 19968: jis0212<<14 | 0x13<<7 | 0x10, - 21299 - 19968: jis0208<<14 | 0x31<<7 | 0x1C, - 21301 - 19968: jis0212<<14 | 0x13<<7 | 0x11, - 21304 - 19968: jis0208<<14 | 0x31<<7 | 0x1D, - 21305 - 19968: jis0208<<14 | 0x28<<7 | 0x03, - 21306 - 19968: jis0208<<14 | 0x15<<7 | 0x47, - 21307 - 19968: jis0208<<14 | 0x0F<<7 | 0x44, - 21308 - 19968: jis0212<<14 | 0x13<<7 | 0x12, - 21309 - 19968: jis0212<<14 | 0x13<<7 | 0x13, - 21310 - 19968: jis0212<<14 | 0x13<<7 | 0x14, - 21311 - 19968: jis0208<<14 | 0x25<<7 | 0x1E, - 21312 - 19968: jis0208<<14 | 0x31<<7 | 0x1E, - 21313 - 19968: jis0208<<14 | 0x1C<<7 | 0x1C, - 21314 - 19968: jis0212<<14 | 0x13<<7 | 0x15, - 21315 - 19968: jis0208<<14 | 0x1F<<7 | 0x48, - 21317 - 19968: jis0208<<14 | 0x31<<7 | 0x20, - 21318 - 19968: jis0208<<14 | 0x31<<7 | 0x1F, - 21319 - 19968: jis0208<<14 | 0x1D<<7 | 0x02, - 21320 - 19968: jis0208<<14 | 0x17<<7 | 0x40, - 21321 - 19968: jis0208<<14 | 0x31<<7 | 0x22, - 21322 - 19968: jis0208<<14 | 0x27<<7 | 0x1D, - 21323 - 19968: jis0212<<14 | 0x13<<7 | 0x17, - 21324 - 19968: jis0212<<14 | 0x13<<7 | 0x16, - 21325 - 19968: jis0208<<14 | 0x31<<7 | 0x23, - 21329 - 19968: jis0208<<14 | 0x27<<7 | 0x3B, - 21330 - 19968: jis0208<<14 | 0x21<<7 | 0x13, - 21331 - 19968: jis0208<<14 | 0x21<<7 | 0x4D, - 21332 - 19968: jis0208<<14 | 0x15<<7 | 0x07, - 21335 - 19968: jis0208<<14 | 0x25<<7 | 0x4D, - 21336 - 19968: jis0208<<14 | 0x22<<7 | 0x10, - 21337 - 19968: jis0212<<14 | 0x13<<7 | 0x18, - 21338 - 19968: jis0208<<14 | 0x26<<7 | 0x4D, - 21339 - 19968: jis0212<<14 | 0x13<<7 | 0x19, - 21340 - 19968: jis0208<<14 | 0x2A<<7 | 0x2D, - 21342 - 19968: jis0208<<14 | 0x31<<7 | 0x25, - 21344 - 19968: jis0208<<14 | 0x1F<<7 | 0x49, - 21345 - 19968: jis0212<<14 | 0x13<<7 | 0x1A, - 21347 - 19968: jis0212<<14 | 0x13<<7 | 0x1B, - 21349 - 19968: jis0212<<14 | 0x13<<7 | 0x1C, - 21350 - 19968: jis0208<<14 | 0x16<<7 | 0x14, - 21353 - 19968: jis0208<<14 | 0x31<<7 | 0x26, - 21356 - 19968: jis0212<<14 | 0x13<<7 | 0x1D, - 21357 - 19968: jis0212<<14 | 0x13<<7 | 0x1E, - 21358 - 19968: jis0208<<14 | 0x31<<7 | 0x27, - 21359 - 19968: jis0208<<14 | 0x10<<7 | 0x0B, - 21360 - 19968: jis0208<<14 | 0x0F<<7 | 0x54, - 21361 - 19968: jis0208<<14 | 0x13<<7 | 0x4C, - 21362 - 19968: jis0208<<14 | 0x58<<7 | 0x2F, - 21363 - 19968: jis0208<<14 | 0x21<<7 | 0x07, - 21364 - 19968: jis0208<<14 | 0x14<<7 | 0x30, - 21365 - 19968: jis0208<<14 | 0x2C<<7 | 0x50, - 21367 - 19968: jis0208<<14 | 0x31<<7 | 0x2A, - 21368 - 19968: jis0208<<14 | 0x11<<7 | 0x16, - 21369 - 19968: jis0212<<14 | 0x13<<7 | 0x20, - 21371 - 19968: jis0208<<14 | 0x31<<7 | 0x29, - 21374 - 19968: jis0212<<14 | 0x13<<7 | 0x21, - 21375 - 19968: jis0208<<14 | 0x15<<7 | 0x09, - 21378 - 19968: jis0208<<14 | 0x31<<7 | 0x2B, - 21379 - 19968: jis0212<<14 | 0x13<<7 | 0x22, - 21380 - 19968: jis0208<<14 | 0x2B<<7 | 0x50, - 21383 - 19968: jis0212<<14 | 0x13<<7 | 0x23, - 21384 - 19968: jis0212<<14 | 0x13<<7 | 0x24, - 21390 - 19968: jis0212<<14 | 0x13<<7 | 0x25, - 21395 - 19968: jis0208<<14 | 0x58<<7 | 0x30, - 21396 - 19968: jis0212<<14 | 0x13<<7 | 0x27, - 21398 - 19968: jis0208<<14 | 0x31<<7 | 0x2C, - 21400 - 19968: jis0208<<14 | 0x2D<<7 | 0x31, - 21401 - 19968: jis0212<<14 | 0x13<<7 | 0x28, - 21402 - 19968: jis0208<<14 | 0x17<<7 | 0x5B, - 21405 - 19968: jis0212<<14 | 0x13<<7 | 0x29, - 21407 - 19968: jis0208<<14 | 0x17<<7 | 0x15, - 21408 - 19968: jis0208<<14 | 0x31<<7 | 0x2D, - 21409 - 19968: jis0212<<14 | 0x13<<7 | 0x2A, - 21412 - 19968: jis0212<<14 | 0x13<<7 | 0x2B, - 21413 - 19968: jis0208<<14 | 0x31<<7 | 0x2F, - 21414 - 19968: jis0208<<14 | 0x31<<7 | 0x2E, - 21416 - 19968: jis0208<<14 | 0x1E<<7 | 0x3E, - 21417 - 19968: jis0208<<14 | 0x10<<7 | 0x18, - 21418 - 19968: jis0212<<14 | 0x13<<7 | 0x2C, - 21419 - 19968: jis0212<<14 | 0x13<<7 | 0x2D, - 21421 - 19968: jis0208<<14 | 0x10<<7 | 0x3D, - 21422 - 19968: jis0208<<14 | 0x31<<7 | 0x30, - 21423 - 19968: jis0212<<14 | 0x13<<7 | 0x2E, - 21424 - 19968: jis0208<<14 | 0x31<<7 | 0x31, - 21426 - 19968: jis0208<<14 | 0x58<<7 | 0x31, - 21427 - 19968: jis0208<<14 | 0x17<<7 | 0x16, - 21428 - 19968: jis0212<<14 | 0x13<<7 | 0x30, - 21429 - 19968: jis0212<<14 | 0x13<<7 | 0x31, - 21430 - 19968: jis0208<<14 | 0x31<<7 | 0x32, - 21431 - 19968: jis0212<<14 | 0x13<<7 | 0x32, - 21432 - 19968: jis0212<<14 | 0x13<<7 | 0x33, - 21434 - 19968: jis0212<<14 | 0x13<<7 | 0x34, - 21435 - 19968: jis0208<<14 | 0x14<<7 | 0x4D, - 21437 - 19968: jis0212<<14 | 0x13<<7 | 0x35, - 21440 - 19968: jis0212<<14 | 0x13<<7 | 0x36, - 21442 - 19968: jis0208<<14 | 0x1A<<7 | 0x11, - 21443 - 19968: jis0208<<14 | 0x31<<7 | 0x33, - 21445 - 19968: jis0212<<14 | 0x13<<7 | 0x37, - 21448 - 19968: jis0208<<14 | 0x2A<<7 | 0x53, - 21449 - 19968: jis0208<<14 | 0x19<<7 | 0x14, - 21450 - 19968: jis0208<<14 | 0x14<<7 | 0x39, - 21451 - 19968: jis0208<<14 | 0x2C<<7 | 0x06, - 21452 - 19968: jis0208<<14 | 0x20<<7 | 0x2F, - 21453 - 19968: jis0208<<14 | 0x27<<7 | 0x1E, - 21454 - 19968: jis0208<<14 | 0x1B<<7 | 0x5C, - 21455 - 19968: jis0212<<14 | 0x13<<7 | 0x38, - 21458 - 19968: jis0212<<14 | 0x13<<7 | 0x39, - 21459 - 19968: jis0212<<14 | 0x13<<7 | 0x3A, - 21460 - 19968: jis0208<<14 | 0x1C<<7 | 0x26, - 21461 - 19968: jis0212<<14 | 0x13<<7 | 0x3B, - 21462 - 19968: jis0208<<14 | 0x1B<<7 | 0x47, - 21463 - 19968: jis0208<<14 | 0x1B<<7 | 0x54, - 21465 - 19968: jis0208<<14 | 0x1C<<7 | 0x55, - 21466 - 19968: jis0212<<14 | 0x13<<7 | 0x3C, - 21467 - 19968: jis0208<<14 | 0x27<<7 | 0x1F, - 21469 - 19968: jis0208<<14 | 0x58<<7 | 0x32, - 21470 - 19968: jis0212<<14 | 0x13<<7 | 0x3E, - 21471 - 19968: jis0208<<14 | 0x31<<7 | 0x36, - 21472 - 19968: jis0212<<14 | 0x13<<7 | 0x3F, - 21473 - 19968: jis0208<<14 | 0x10<<7 | 0x22, - 21474 - 19968: jis0208<<14 | 0x20<<7 | 0x30, - 21475 - 19968: jis0208<<14 | 0x17<<7 | 0x5C, - 21476 - 19968: jis0208<<14 | 0x17<<7 | 0x24, - 21477 - 19968: jis0208<<14 | 0x15<<7 | 0x46, - 21478 - 19968: jis0212<<14 | 0x13<<7 | 0x40, - 21479 - 19968: jis0212<<14 | 0x13<<7 | 0x41, - 21480 - 19968: jis0208<<14 | 0x31<<7 | 0x3A, - 21481 - 19968: jis0208<<14 | 0x22<<7 | 0x00, - 21482 - 19968: jis0208<<14 | 0x21<<7 | 0x5D, - 21483 - 19968: jis0208<<14 | 0x15<<7 | 0x0A, - 21484 - 19968: jis0208<<14 | 0x1D<<7 | 0x03, - 21485 - 19968: jis0208<<14 | 0x31<<7 | 0x3B, - 21486 - 19968: jis0208<<14 | 0x31<<7 | 0x39, - 21487 - 19968: jis0208<<14 | 0x11<<7 | 0x23, - 21488 - 19968: jis0208<<14 | 0x21<<7 | 0x45, - 21489 - 19968: jis0208<<14 | 0x1B<<7 | 0x17, - 21490 - 19968: jis0208<<14 | 0x1A<<7 | 0x2A, - 21491 - 19968: jis0208<<14 | 0x10<<7 | 0x05, - 21493 - 19968: jis0212<<14 | 0x13<<7 | 0x42, - 21494 - 19968: jis0208<<14 | 0x12<<7 | 0x4F, - 21495 - 19968: jis0208<<14 | 0x18<<7 | 0x45, - 21496 - 19968: jis0208<<14 | 0x1A<<7 | 0x29, - 21498 - 19968: jis0208<<14 | 0x31<<7 | 0x3C, - 21505 - 19968: jis0208<<14 | 0x31<<7 | 0x3D, - 21506 - 19968: jis0212<<14 | 0x13<<7 | 0x43, - 21507 - 19968: jis0208<<14 | 0x14<<7 | 0x28, - 21508 - 19968: jis0208<<14 | 0x12<<7 | 0x25, - 21512 - 19968: jis0208<<14 | 0x18<<7 | 0x46, - 21513 - 19968: jis0208<<14 | 0x14<<7 | 0x27, - 21514 - 19968: jis0208<<14 | 0x23<<7 | 0x3E, - 21515 - 19968: jis0208<<14 | 0x10<<7 | 0x04, - 21516 - 19968: jis0208<<14 | 0x25<<7 | 0x10, - 21517 - 19968: jis0208<<14 | 0x2B<<7 | 0x1D, - 21518 - 19968: jis0208<<14 | 0x18<<7 | 0x00, - 21519 - 19968: jis0208<<14 | 0x2C<<7 | 0x58, - 21520 - 19968: jis0208<<14 | 0x24<<7 | 0x26, - 21521 - 19968: jis0208<<14 | 0x17<<7 | 0x5D, - 21523 - 19968: jis0212<<14 | 0x13<<7 | 0x44, - 21530 - 19968: jis0212<<14 | 0x13<<7 | 0x45, - 21531 - 19968: jis0208<<14 | 0x16<<7 | 0x0E, - 21533 - 19968: jis0208<<14 | 0x31<<7 | 0x46, - 21535 - 19968: jis0208<<14 | 0x15<<7 | 0x42, - 21536 - 19968: jis0208<<14 | 0x2A<<7 | 0x29, - 21537 - 19968: jis0212<<14 | 0x13<<7 | 0x46, - 21542 - 19968: jis0208<<14 | 0x27<<7 | 0x3C, - 21543 - 19968: jis0212<<14 | 0x13<<7 | 0x47, - 21544 - 19968: jis0212<<14 | 0x13<<7 | 0x48, - 21545 - 19968: jis0208<<14 | 0x31<<7 | 0x45, - 21546 - 19968: jis0212<<14 | 0x13<<7 | 0x49, - 21547 - 19968: jis0208<<14 | 0x13<<7 | 0x3D, - 21548 - 19968: jis0208<<14 | 0x31<<7 | 0x40, - 21549 - 19968: jis0208<<14 | 0x31<<7 | 0x41, - 21550 - 19968: jis0208<<14 | 0x31<<7 | 0x43, - 21551 - 19968: jis0212<<14 | 0x13<<7 | 0x4A, - 21553 - 19968: jis0212<<14 | 0x13<<7 | 0x4B, - 21556 - 19968: jis0212<<14 | 0x13<<7 | 0x4C, - 21557 - 19968: jis0212<<14 | 0x13<<7 | 0x4D, - 21558 - 19968: jis0208<<14 | 0x31<<7 | 0x44, - 21560 - 19968: jis0208<<14 | 0x14<<7 | 0x3A, - 21561 - 19968: jis0208<<14 | 0x1E<<7 | 0x40, - 21563 - 19968: jis0208<<14 | 0x29<<7 | 0x0C, - 21564 - 19968: jis0208<<14 | 0x31<<7 | 0x42, - 21565 - 19968: jis0208<<14 | 0x31<<7 | 0x3E, - 21566 - 19968: jis0208<<14 | 0x17<<7 | 0x42, - 21568 - 19968: jis0208<<14 | 0x31<<7 | 0x3F, - 21570 - 19968: jis0208<<14 | 0x2E<<7 | 0x03, - 21571 - 19968: jis0212<<14 | 0x13<<7 | 0x4E, - 21572 - 19968: jis0212<<14 | 0x13<<7 | 0x4F, - 21574 - 19968: jis0208<<14 | 0x29<<7 | 0x51, - 21575 - 19968: jis0212<<14 | 0x13<<7 | 0x50, - 21576 - 19968: jis0208<<14 | 0x23<<7 | 0x47, - 21577 - 19968: jis0208<<14 | 0x17<<7 | 0x41, - 21578 - 19968: jis0208<<14 | 0x18<<7 | 0x4F, - 21581 - 19968: jis0212<<14 | 0x13<<7 | 0x51, - 21582 - 19968: jis0208<<14 | 0x31<<7 | 0x47, - 21583 - 19968: jis0212<<14 | 0x13<<7 | 0x52, - 21585 - 19968: jis0208<<14 | 0x25<<7 | 0x3C, - 21598 - 19968: jis0212<<14 | 0x13<<7 | 0x53, - 21599 - 19968: jis0208<<14 | 0x31<<7 | 0x4B, - 21602 - 19968: jis0212<<14 | 0x13<<7 | 0x54, - 21604 - 19968: jis0212<<14 | 0x13<<7 | 0x55, - 21606 - 19968: jis0212<<14 | 0x13<<7 | 0x56, - 21607 - 19968: jis0212<<14 | 0x13<<7 | 0x57, - 21608 - 19968: jis0208<<14 | 0x1B<<7 | 0x5D, - 21609 - 19968: jis0212<<14 | 0x13<<7 | 0x58, - 21610 - 19968: jis0208<<14 | 0x1B<<7 | 0x55, - 21611 - 19968: jis0212<<14 | 0x13<<7 | 0x59, - 21613 - 19968: jis0212<<14 | 0x13<<7 | 0x5A, - 21614 - 19968: jis0212<<14 | 0x13<<7 | 0x5B, - 21616 - 19968: jis0208<<14 | 0x31<<7 | 0x4E, - 21617 - 19968: jis0208<<14 | 0x31<<7 | 0x4C, - 21619 - 19968: jis0208<<14 | 0x2B<<7 | 0x02, - 21620 - 19968: jis0212<<14 | 0x13<<7 | 0x5C, - 21621 - 19968: jis0208<<14 | 0x31<<7 | 0x49, - 21622 - 19968: jis0208<<14 | 0x31<<7 | 0x52, - 21623 - 19968: jis0208<<14 | 0x31<<7 | 0x4D, - 21627 - 19968: jis0208<<14 | 0x31<<7 | 0x50, - 21628 - 19968: jis0208<<14 | 0x17<<7 | 0x25, - 21629 - 19968: jis0208<<14 | 0x2B<<7 | 0x1E, - 21631 - 19968: jis0212<<14 | 0x13<<7 | 0x5D, - 21632 - 19968: jis0208<<14 | 0x31<<7 | 0x51, - 21633 - 19968: jis0212<<14 | 0x14<<7 | 0x00, - 21635 - 19968: jis0212<<14 | 0x14<<7 | 0x01, - 21636 - 19968: jis0208<<14 | 0x31<<7 | 0x53, - 21637 - 19968: jis0212<<14 | 0x14<<7 | 0x02, - 21638 - 19968: jis0208<<14 | 0x31<<7 | 0x55, - 21640 - 19968: jis0212<<14 | 0x14<<7 | 0x03, - 21641 - 19968: jis0212<<14 | 0x14<<7 | 0x04, - 21642 - 19968: jis0208<<14 | 0x58<<7 | 0x35, - 21643 - 19968: jis0208<<14 | 0x19<<7 | 0x4F, - 21644 - 19968: jis0208<<14 | 0x2E<<7 | 0x21, - 21645 - 19968: jis0212<<14 | 0x14<<7 | 0x05, - 21646 - 19968: jis0208<<14 | 0x31<<7 | 0x4A, - 21647 - 19968: jis0208<<14 | 0x31<<7 | 0x48, - 21648 - 19968: jis0208<<14 | 0x31<<7 | 0x54, - 21649 - 19968: jis0212<<14 | 0x14<<7 | 0x06, - 21650 - 19968: jis0208<<14 | 0x31<<7 | 0x4F, - 21653 - 19968: jis0212<<14 | 0x14<<7 | 0x07, - 21654 - 19968: jis0212<<14 | 0x14<<7 | 0x08, - 21660 - 19968: jis0208<<14 | 0x58<<7 | 0x34, - 21663 - 19968: jis0212<<14 | 0x14<<7 | 0x0A, - 21665 - 19968: jis0212<<14 | 0x14<<7 | 0x0B, - 21666 - 19968: jis0208<<14 | 0x31<<7 | 0x57, - 21668 - 19968: jis0208<<14 | 0x32<<7 | 0x02, - 21669 - 19968: jis0208<<14 | 0x31<<7 | 0x59, - 21670 - 19968: jis0212<<14 | 0x14<<7 | 0x0C, - 21671 - 19968: jis0212<<14 | 0x14<<7 | 0x0D, - 21672 - 19968: jis0208<<14 | 0x31<<7 | 0x5D, - 21673 - 19968: jis0208<<14 | 0x58<<7 | 0x36, - 21674 - 19968: jis0212<<14 | 0x14<<7 | 0x0F, - 21675 - 19968: jis0208<<14 | 0x32<<7 | 0x00, - 21676 - 19968: jis0208<<14 | 0x31<<7 | 0x5A, - 21677 - 19968: jis0212<<14 | 0x14<<7 | 0x10, - 21678 - 19968: jis0212<<14 | 0x14<<7 | 0x11, - 21679 - 19968: jis0208<<14 | 0x32<<7 | 0x1D, - 21681 - 19968: jis0212<<14 | 0x14<<7 | 0x12, - 21682 - 19968: jis0208<<14 | 0x19<<7 | 0x48, - 21683 - 19968: jis0208<<14 | 0x12<<7 | 0x10, - 21687 - 19968: jis0212<<14 | 0x14<<7 | 0x13, - 21688 - 19968: jis0208<<14 | 0x31<<7 | 0x58, - 21689 - 19968: jis0212<<14 | 0x14<<7 | 0x14, - 21690 - 19968: jis0212<<14 | 0x14<<7 | 0x15, - 21691 - 19968: jis0212<<14 | 0x14<<7 | 0x16, - 21692 - 19968: jis0208<<14 | 0x32<<7 | 0x04, - 21693 - 19968: jis0208<<14 | 0x0F<<7 | 0x55, - 21694 - 19968: jis0208<<14 | 0x32<<7 | 0x03, - 21695 - 19968: jis0212<<14 | 0x14<<7 | 0x17, - 21696 - 19968: jis0208<<14 | 0x0F<<7 | 0x04, - 21697 - 19968: jis0208<<14 | 0x28<<7 | 0x29, - 21698 - 19968: jis0208<<14 | 0x32<<7 | 0x01, - 21700 - 19968: jis0208<<14 | 0x31<<7 | 0x5B, - 21702 - 19968: jis0212<<14 | 0x14<<7 | 0x18, - 21703 - 19968: jis0208<<14 | 0x31<<7 | 0x56, - 21704 - 19968: jis0208<<14 | 0x31<<7 | 0x5C, - 21705 - 19968: jis0208<<14 | 0x19<<7 | 0x27, - 21706 - 19968: jis0212<<14 | 0x14<<7 | 0x19, - 21709 - 19968: jis0212<<14 | 0x14<<7 | 0x1A, - 21710 - 19968: jis0212<<14 | 0x14<<7 | 0x1B, - 21720 - 19968: jis0208<<14 | 0x32<<7 | 0x05, - 21728 - 19968: jis0212<<14 | 0x14<<7 | 0x1C, - 21729 - 19968: jis0208<<14 | 0x0F<<7 | 0x56, - 21730 - 19968: jis0208<<14 | 0x32<<7 | 0x0E, - 21733 - 19968: jis0208<<14 | 0x32<<7 | 0x06, - 21734 - 19968: jis0208<<14 | 0x32<<7 | 0x07, - 21736 - 19968: jis0208<<14 | 0x1D<<7 | 0x04, - 21737 - 19968: jis0208<<14 | 0x2A<<7 | 0x48, - 21738 - 19968: jis0212<<14 | 0x14<<7 | 0x1D, - 21740 - 19968: jis0212<<14 | 0x14<<7 | 0x1E, - 21741 - 19968: jis0208<<14 | 0x32<<7 | 0x0C, - 21742 - 19968: jis0208<<14 | 0x32<<7 | 0x0B, - 21743 - 19968: jis0212<<14 | 0x14<<7 | 0x1F, - 21746 - 19968: jis0208<<14 | 0x24<<7 | 0x0E, - 21750 - 19968: jis0212<<14 | 0x14<<7 | 0x20, - 21754 - 19968: jis0208<<14 | 0x32<<7 | 0x0D, - 21756 - 19968: jis0212<<14 | 0x14<<7 | 0x21, - 21757 - 19968: jis0208<<14 | 0x32<<7 | 0x0A, - 21758 - 19968: jis0212<<14 | 0x14<<7 | 0x22, - 21759 - 19968: jis0208<<14 | 0x58<<7 | 0x37, - 21760 - 19968: jis0212<<14 | 0x14<<7 | 0x24, - 21761 - 19968: jis0212<<14 | 0x14<<7 | 0x25, - 21764 - 19968: jis0208<<14 | 0x10<<7 | 0x13, - 21765 - 19968: jis0212<<14 | 0x14<<7 | 0x26, - 21766 - 19968: jis0208<<14 | 0x19<<7 | 0x15, - 21767 - 19968: jis0208<<14 | 0x1E<<7 | 0x0F, - 21768 - 19968: jis0212<<14 | 0x14<<7 | 0x27, - 21769 - 19968: jis0212<<14 | 0x14<<7 | 0x28, - 21772 - 19968: jis0212<<14 | 0x14<<7 | 0x29, - 21773 - 19968: jis0212<<14 | 0x14<<7 | 0x2A, - 21774 - 19968: jis0212<<14 | 0x14<<7 | 0x2B, - 21775 - 19968: jis0208<<14 | 0x32<<7 | 0x08, - 21776 - 19968: jis0208<<14 | 0x24<<7 | 0x41, - 21780 - 19968: jis0208<<14 | 0x32<<7 | 0x09, - 21781 - 19968: jis0212<<14 | 0x14<<7 | 0x2C, - 21782 - 19968: jis0208<<14 | 0x0F<<7 | 0x01, - 21802 - 19968: jis0212<<14 | 0x14<<7 | 0x2D, - 21803 - 19968: jis0212<<14 | 0x14<<7 | 0x2E, - 21806 - 19968: jis0208<<14 | 0x32<<7 | 0x13, - 21807 - 19968: jis0208<<14 | 0x2C<<7 | 0x02, - 21809 - 19968: jis0208<<14 | 0x1D<<7 | 0x06, - 21810 - 19968: jis0212<<14 | 0x14<<7 | 0x2F, - 21811 - 19968: jis0208<<14 | 0x32<<7 | 0x19, - 21813 - 19968: jis0212<<14 | 0x14<<7 | 0x30, - 21814 - 19968: jis0212<<14 | 0x14<<7 | 0x31, - 21816 - 19968: jis0208<<14 | 0x32<<7 | 0x18, - 21817 - 19968: jis0208<<14 | 0x32<<7 | 0x0F, - 21819 - 19968: jis0212<<14 | 0x14<<7 | 0x32, - 21820 - 19968: jis0212<<14 | 0x14<<7 | 0x33, - 21821 - 19968: jis0212<<14 | 0x14<<7 | 0x34, - 21822 - 19968: jis0208<<14 | 0x21<<7 | 0x22, - 21824 - 19968: jis0208<<14 | 0x32<<7 | 0x10, - 21825 - 19968: jis0212<<14 | 0x14<<7 | 0x35, - 21828 - 19968: jis0208<<14 | 0x21<<7 | 0x4E, - 21829 - 19968: jis0208<<14 | 0x32<<7 | 0x15, - 21830 - 19968: jis0208<<14 | 0x1D<<7 | 0x05, - 21831 - 19968: jis0212<<14 | 0x14<<7 | 0x36, - 21833 - 19968: jis0212<<14 | 0x14<<7 | 0x37, - 21834 - 19968: jis0212<<14 | 0x14<<7 | 0x38, - 21836 - 19968: jis0208<<14 | 0x32<<7 | 0x12, - 21837 - 19968: jis0212<<14 | 0x14<<7 | 0x39, - 21839 - 19968: jis0208<<14 | 0x2B<<7 | 0x43, - 21840 - 19968: jis0212<<14 | 0x14<<7 | 0x3A, - 21841 - 19968: jis0212<<14 | 0x14<<7 | 0x3B, - 21843 - 19968: jis0208<<14 | 0x16<<7 | 0x1B, - 21846 - 19968: jis0208<<14 | 0x32<<7 | 0x16, - 21847 - 19968: jis0208<<14 | 0x32<<7 | 0x17, - 21848 - 19968: jis0212<<14 | 0x14<<7 | 0x3C, - 21850 - 19968: jis0212<<14 | 0x14<<7 | 0x3D, - 21851 - 19968: jis0212<<14 | 0x14<<7 | 0x3E, - 21852 - 19968: jis0208<<14 | 0x32<<7 | 0x14, - 21853 - 19968: jis0208<<14 | 0x32<<7 | 0x1A, - 21854 - 19968: jis0212<<14 | 0x14<<7 | 0x3F, - 21856 - 19968: jis0212<<14 | 0x14<<7 | 0x40, - 21857 - 19968: jis0212<<14 | 0x14<<7 | 0x41, - 21859 - 19968: jis0208<<14 | 0x32<<7 | 0x11, - 21860 - 19968: jis0212<<14 | 0x14<<7 | 0x42, - 21862 - 19968: jis0212<<14 | 0x14<<7 | 0x43, - 21883 - 19968: jis0208<<14 | 0x32<<7 | 0x20, - 21884 - 19968: jis0208<<14 | 0x32<<7 | 0x25, - 21886 - 19968: jis0208<<14 | 0x32<<7 | 0x21, - 21887 - 19968: jis0212<<14 | 0x14<<7 | 0x44, - 21888 - 19968: jis0208<<14 | 0x32<<7 | 0x1C, - 21889 - 19968: jis0212<<14 | 0x14<<7 | 0x45, - 21890 - 19968: jis0212<<14 | 0x14<<7 | 0x46, - 21891 - 19968: jis0208<<14 | 0x32<<7 | 0x26, - 21892 - 19968: jis0208<<14 | 0x20<<7 | 0x10, - 21894 - 19968: jis0208<<14 | 0x58<<7 | 0x38, - 21895 - 19968: jis0208<<14 | 0x32<<7 | 0x28, - 21896 - 19968: jis0212<<14 | 0x14<<7 | 0x48, - 21897 - 19968: jis0208<<14 | 0x18<<7 | 0x01, - 21898 - 19968: jis0208<<14 | 0x32<<7 | 0x1E, - 21899 - 19968: jis0208<<14 | 0x22<<7 | 0x5C, - 21902 - 19968: jis0212<<14 | 0x14<<7 | 0x49, - 21903 - 19968: jis0212<<14 | 0x14<<7 | 0x4A, - 21905 - 19968: jis0212<<14 | 0x14<<7 | 0x4B, - 21906 - 19968: jis0212<<14 | 0x14<<7 | 0x4C, - 21907 - 19968: jis0212<<14 | 0x14<<7 | 0x4D, - 21908 - 19968: jis0212<<14 | 0x14<<7 | 0x4E, - 21911 - 19968: jis0212<<14 | 0x14<<7 | 0x4F, - 21912 - 19968: jis0208<<14 | 0x32<<7 | 0x22, - 21913 - 19968: jis0208<<14 | 0x32<<7 | 0x1B, - 21914 - 19968: jis0208<<14 | 0x13<<7 | 0x0C, - 21916 - 19968: jis0208<<14 | 0x13<<7 | 0x4D, - 21917 - 19968: jis0208<<14 | 0x12<<7 | 0x44, - 21918 - 19968: jis0208<<14 | 0x32<<7 | 0x23, - 21919 - 19968: jis0208<<14 | 0x32<<7 | 0x1F, - 21923 - 19968: jis0212<<14 | 0x14<<7 | 0x50, - 21924 - 19968: jis0212<<14 | 0x14<<7 | 0x51, - 21927 - 19968: jis0208<<14 | 0x16<<7 | 0x55, - 21928 - 19968: jis0208<<14 | 0x32<<7 | 0x29, - 21929 - 19968: jis0208<<14 | 0x32<<7 | 0x27, - 21930 - 19968: jis0208<<14 | 0x20<<7 | 0x32, - 21931 - 19968: jis0208<<14 | 0x14<<7 | 0x29, - 21932 - 19968: jis0208<<14 | 0x15<<7 | 0x0B, - 21933 - 19968: jis0212<<14 | 0x14<<7 | 0x52, - 21934 - 19968: jis0208<<14 | 0x32<<7 | 0x24, - 21936 - 19968: jis0208<<14 | 0x15<<7 | 0x53, - 21938 - 19968: jis0212<<14 | 0x14<<7 | 0x53, - 21942 - 19968: jis0208<<14 | 0x10<<7 | 0x23, - 21951 - 19968: jis0212<<14 | 0x14<<7 | 0x54, - 21953 - 19968: jis0212<<14 | 0x14<<7 | 0x55, - 21955 - 19968: jis0212<<14 | 0x14<<7 | 0x56, - 21956 - 19968: jis0208<<14 | 0x32<<7 | 0x2D, - 21957 - 19968: jis0208<<14 | 0x32<<7 | 0x2B, - 21958 - 19968: jis0212<<14 | 0x14<<7 | 0x57, - 21959 - 19968: jis0208<<14 | 0x33<<7 | 0x06, - 21961 - 19968: jis0212<<14 | 0x14<<7 | 0x58, - 21963 - 19968: jis0212<<14 | 0x14<<7 | 0x59, - 21964 - 19968: jis0212<<14 | 0x14<<7 | 0x5A, - 21966 - 19968: jis0212<<14 | 0x14<<7 | 0x5B, - 21969 - 19968: jis0212<<14 | 0x14<<7 | 0x5C, - 21970 - 19968: jis0212<<14 | 0x14<<7 | 0x5D, - 21971 - 19968: jis0212<<14 | 0x15<<7 | 0x00, - 21972 - 19968: jis0208<<14 | 0x32<<7 | 0x30, - 21975 - 19968: jis0212<<14 | 0x15<<7 | 0x01, - 21976 - 19968: jis0212<<14 | 0x15<<7 | 0x02, - 21978 - 19968: jis0208<<14 | 0x32<<7 | 0x2A, - 21979 - 19968: jis0212<<14 | 0x15<<7 | 0x03, - 21980 - 19968: jis0208<<14 | 0x32<<7 | 0x2E, - 21982 - 19968: jis0212<<14 | 0x15<<7 | 0x04, - 21983 - 19968: jis0208<<14 | 0x32<<7 | 0x2C, - 21986 - 19968: jis0212<<14 | 0x15<<7 | 0x05, - 21987 - 19968: jis0208<<14 | 0x1A<<7 | 0x2B, - 21988 - 19968: jis0208<<14 | 0x32<<7 | 0x2F, - 21993 - 19968: jis0212<<14 | 0x15<<7 | 0x06, - 22006 - 19968: jis0212<<14 | 0x15<<7 | 0x07, - 22007 - 19968: jis0208<<14 | 0x32<<7 | 0x32, - 22009 - 19968: jis0208<<14 | 0x32<<7 | 0x37, - 22013 - 19968: jis0208<<14 | 0x32<<7 | 0x35, - 22014 - 19968: jis0208<<14 | 0x32<<7 | 0x34, - 22015 - 19968: jis0212<<14 | 0x15<<7 | 0x08, - 22021 - 19968: jis0212<<14 | 0x15<<7 | 0x09, - 22022 - 19968: jis0208<<14 | 0x22<<7 | 0x11, - 22024 - 19968: jis0212<<14 | 0x15<<7 | 0x0A, - 22025 - 19968: jis0208<<14 | 0x11<<7 | 0x24, - 22026 - 19968: jis0212<<14 | 0x15<<7 | 0x0B, - 22029 - 19968: jis0212<<14 | 0x15<<7 | 0x0C, - 22030 - 19968: jis0212<<14 | 0x15<<7 | 0x0D, - 22031 - 19968: jis0212<<14 | 0x15<<7 | 0x0E, - 22032 - 19968: jis0212<<14 | 0x15<<7 | 0x0F, - 22033 - 19968: jis0212<<14 | 0x15<<7 | 0x10, - 22034 - 19968: jis0212<<14 | 0x15<<7 | 0x11, - 22036 - 19968: jis0208<<14 | 0x32<<7 | 0x31, - 22038 - 19968: jis0208<<14 | 0x32<<7 | 0x33, - 22039 - 19968: jis0208<<14 | 0x1D<<7 | 0x07, - 22040 - 19968: jis0208<<14 | 0x10<<7 | 0x12, - 22041 - 19968: jis0212<<14 | 0x15<<7 | 0x12, - 22043 - 19968: jis0208<<14 | 0x32<<7 | 0x36, - 22057 - 19968: jis0208<<14 | 0x11<<7 | 0x3D, - 22060 - 19968: jis0212<<14 | 0x15<<7 | 0x13, - 22063 - 19968: jis0208<<14 | 0x32<<7 | 0x41, - 22064 - 19968: jis0212<<14 | 0x15<<7 | 0x14, - 22065 - 19968: jis0208<<14 | 0x1D<<7 | 0x5B, - 22066 - 19968: jis0208<<14 | 0x32<<7 | 0x3D, - 22067 - 19968: jis0212<<14 | 0x15<<7 | 0x15, - 22068 - 19968: jis0208<<14 | 0x32<<7 | 0x3B, - 22069 - 19968: jis0212<<14 | 0x15<<7 | 0x16, - 22070 - 19968: jis0208<<14 | 0x32<<7 | 0x3C, - 22071 - 19968: jis0212<<14 | 0x15<<7 | 0x17, - 22072 - 19968: jis0208<<14 | 0x32<<7 | 0x3E, - 22073 - 19968: jis0212<<14 | 0x15<<7 | 0x18, - 22075 - 19968: jis0212<<14 | 0x15<<7 | 0x19, - 22076 - 19968: jis0212<<14 | 0x15<<7 | 0x1A, - 22077 - 19968: jis0212<<14 | 0x15<<7 | 0x1B, - 22079 - 19968: jis0212<<14 | 0x15<<7 | 0x1C, - 22080 - 19968: jis0212<<14 | 0x15<<7 | 0x1D, - 22081 - 19968: jis0212<<14 | 0x15<<7 | 0x1E, - 22082 - 19968: jis0208<<14 | 0x10<<7 | 0x1C, - 22083 - 19968: jis0212<<14 | 0x15<<7 | 0x1F, - 22084 - 19968: jis0212<<14 | 0x15<<7 | 0x20, - 22086 - 19968: jis0212<<14 | 0x15<<7 | 0x21, - 22089 - 19968: jis0212<<14 | 0x15<<7 | 0x22, - 22091 - 19968: jis0212<<14 | 0x15<<7 | 0x23, - 22092 - 19968: jis0208<<14 | 0x20<<7 | 0x18, - 22093 - 19968: jis0212<<14 | 0x15<<7 | 0x24, - 22094 - 19968: jis0208<<14 | 0x32<<7 | 0x38, - 22095 - 19968: jis0212<<14 | 0x15<<7 | 0x25, - 22096 - 19968: jis0208<<14 | 0x32<<7 | 0x39, - 22100 - 19968: jis0212<<14 | 0x15<<7 | 0x26, - 22107 - 19968: jis0208<<14 | 0x12<<7 | 0x59, - 22110 - 19968: jis0212<<14 | 0x15<<7 | 0x27, - 22112 - 19968: jis0212<<14 | 0x15<<7 | 0x28, - 22113 - 19968: jis0212<<14 | 0x15<<7 | 0x29, - 22114 - 19968: jis0212<<14 | 0x15<<7 | 0x2A, - 22115 - 19968: jis0212<<14 | 0x15<<7 | 0x2B, - 22116 - 19968: jis0208<<14 | 0x32<<7 | 0x40, - 22118 - 19968: jis0212<<14 | 0x15<<7 | 0x2C, - 22120 - 19968: jis0208<<14 | 0x13<<7 | 0x4E, - 22121 - 19968: jis0212<<14 | 0x15<<7 | 0x2D, - 22122 - 19968: jis0208<<14 | 0x32<<7 | 0x43, - 22123 - 19968: jis0208<<14 | 0x32<<7 | 0x3F, - 22124 - 19968: jis0208<<14 | 0x32<<7 | 0x42, - 22125 - 19968: jis0212<<14 | 0x15<<7 | 0x2E, - 22127 - 19968: jis0212<<14 | 0x15<<7 | 0x2F, - 22129 - 19968: jis0212<<14 | 0x15<<7 | 0x30, - 22130 - 19968: jis0212<<14 | 0x15<<7 | 0x31, - 22132 - 19968: jis0208<<14 | 0x29<<7 | 0x0D, - 22133 - 19968: jis0212<<14 | 0x15<<7 | 0x32, - 22136 - 19968: jis0208<<14 | 0x25<<7 | 0x34, - 22138 - 19968: jis0208<<14 | 0x27<<7 | 0x17, - 22144 - 19968: jis0208<<14 | 0x32<<7 | 0x45, - 22148 - 19968: jis0212<<14 | 0x15<<7 | 0x33, - 22149 - 19968: jis0212<<14 | 0x15<<7 | 0x34, - 22150 - 19968: jis0208<<14 | 0x32<<7 | 0x44, - 22151 - 19968: jis0208<<14 | 0x12<<7 | 0x24, - 22152 - 19968: jis0212<<14 | 0x15<<7 | 0x35, - 22154 - 19968: jis0208<<14 | 0x32<<7 | 0x46, - 22155 - 19968: jis0212<<14 | 0x15<<7 | 0x36, - 22156 - 19968: jis0212<<14 | 0x15<<7 | 0x37, - 22159 - 19968: jis0208<<14 | 0x32<<7 | 0x49, - 22164 - 19968: jis0208<<14 | 0x32<<7 | 0x48, - 22165 - 19968: jis0212<<14 | 0x15<<7 | 0x38, - 22169 - 19968: jis0212<<14 | 0x15<<7 | 0x39, - 22170 - 19968: jis0212<<14 | 0x15<<7 | 0x3A, - 22173 - 19968: jis0212<<14 | 0x15<<7 | 0x3B, - 22174 - 19968: jis0212<<14 | 0x15<<7 | 0x3C, - 22175 - 19968: jis0212<<14 | 0x15<<7 | 0x3D, - 22176 - 19968: jis0208<<14 | 0x32<<7 | 0x47, - 22178 - 19968: jis0208<<14 | 0x26<<7 | 0x18, - 22181 - 19968: jis0208<<14 | 0x32<<7 | 0x4A, - 22182 - 19968: jis0212<<14 | 0x15<<7 | 0x3E, - 22183 - 19968: jis0212<<14 | 0x15<<7 | 0x3F, - 22184 - 19968: jis0212<<14 | 0x15<<7 | 0x40, - 22185 - 19968: jis0212<<14 | 0x15<<7 | 0x41, - 22187 - 19968: jis0212<<14 | 0x15<<7 | 0x42, - 22188 - 19968: jis0212<<14 | 0x15<<7 | 0x43, - 22189 - 19968: jis0212<<14 | 0x15<<7 | 0x44, - 22190 - 19968: jis0208<<14 | 0x32<<7 | 0x4B, - 22193 - 19968: jis0212<<14 | 0x15<<7 | 0x45, - 22195 - 19968: jis0212<<14 | 0x15<<7 | 0x46, - 22196 - 19968: jis0208<<14 | 0x32<<7 | 0x4D, - 22198 - 19968: jis0208<<14 | 0x32<<7 | 0x4C, - 22199 - 19968: jis0212<<14 | 0x15<<7 | 0x47, - 22204 - 19968: jis0208<<14 | 0x32<<7 | 0x4F, - 22206 - 19968: jis0212<<14 | 0x15<<7 | 0x48, - 22208 - 19968: jis0208<<14 | 0x32<<7 | 0x52, - 22209 - 19968: jis0208<<14 | 0x32<<7 | 0x50, - 22210 - 19968: jis0208<<14 | 0x32<<7 | 0x4E, - 22211 - 19968: jis0208<<14 | 0x32<<7 | 0x51, - 22213 - 19968: jis0212<<14 | 0x15<<7 | 0x49, - 22216 - 19968: jis0208<<14 | 0x32<<7 | 0x53, - 22217 - 19968: jis0212<<14 | 0x15<<7 | 0x4A, - 22218 - 19968: jis0212<<14 | 0x15<<7 | 0x4B, - 22219 - 19968: jis0212<<14 | 0x15<<7 | 0x4C, - 22220 - 19968: jis0212<<14 | 0x15<<7 | 0x4F, - 22221 - 19968: jis0212<<14 | 0x15<<7 | 0x50, - 22222 - 19968: jis0208<<14 | 0x32<<7 | 0x54, - 22223 - 19968: jis0212<<14 | 0x15<<7 | 0x4D, - 22224 - 19968: jis0212<<14 | 0x15<<7 | 0x4E, - 22225 - 19968: jis0208<<14 | 0x32<<7 | 0x55, - 22227 - 19968: jis0208<<14 | 0x32<<7 | 0x56, - 22231 - 19968: jis0208<<14 | 0x32<<7 | 0x57, - 22232 - 19968: jis0208<<14 | 0x30<<7 | 0x24, - 22233 - 19968: jis0212<<14 | 0x15<<7 | 0x51, - 22234 - 19968: jis0208<<14 | 0x1B<<7 | 0x5B, - 22235 - 19968: jis0208<<14 | 0x1A<<7 | 0x2C, - 22236 - 19968: jis0212<<14 | 0x15<<7 | 0x52, - 22237 - 19968: jis0212<<14 | 0x15<<7 | 0x53, - 22238 - 19968: jis0208<<14 | 0x11<<7 | 0x52, - 22239 - 19968: jis0212<<14 | 0x15<<7 | 0x54, - 22240 - 19968: jis0208<<14 | 0x0F<<7 | 0x57, - 22241 - 19968: jis0212<<14 | 0x15<<7 | 0x55, - 22243 - 19968: jis0208<<14 | 0x22<<7 | 0x23, - 22244 - 19968: jis0212<<14 | 0x15<<7 | 0x56, - 22245 - 19968: jis0212<<14 | 0x15<<7 | 0x57, - 22246 - 19968: jis0212<<14 | 0x15<<7 | 0x58, - 22247 - 19968: jis0212<<14 | 0x15<<7 | 0x59, - 22248 - 19968: jis0212<<14 | 0x15<<7 | 0x5A, - 22251 - 19968: jis0212<<14 | 0x15<<7 | 0x5C, - 22253 - 19968: jis0212<<14 | 0x15<<7 | 0x5D, - 22254 - 19968: jis0208<<14 | 0x32<<7 | 0x58, - 22256 - 19968: jis0208<<14 | 0x19<<7 | 0x03, - 22257 - 19968: jis0212<<14 | 0x15<<7 | 0x5B, - 22258 - 19968: jis0208<<14 | 0x0F<<7 | 0x2E, - 22259 - 19968: jis0208<<14 | 0x1E<<7 | 0x3D, - 22262 - 19968: jis0212<<14 | 0x16<<7 | 0x00, - 22263 - 19968: jis0212<<14 | 0x16<<7 | 0x01, - 22265 - 19968: jis0208<<14 | 0x32<<7 | 0x59, - 22266 - 19968: jis0208<<14 | 0x17<<7 | 0x26, - 22269 - 19968: jis0208<<14 | 0x18<<7 | 0x50, - 22271 - 19968: jis0208<<14 | 0x32<<7 | 0x5B, - 22272 - 19968: jis0208<<14 | 0x32<<7 | 0x5A, - 22273 - 19968: jis0212<<14 | 0x16<<7 | 0x02, - 22274 - 19968: jis0212<<14 | 0x16<<7 | 0x03, - 22275 - 19968: jis0208<<14 | 0x29<<7 | 0x3F, - 22276 - 19968: jis0208<<14 | 0x32<<7 | 0x5C, - 22279 - 19968: jis0212<<14 | 0x16<<7 | 0x04, - 22280 - 19968: jis0208<<14 | 0x33<<7 | 0x00, - 22281 - 19968: jis0208<<14 | 0x32<<7 | 0x5D, - 22282 - 19968: jis0212<<14 | 0x16<<7 | 0x05, - 22283 - 19968: jis0208<<14 | 0x33<<7 | 0x01, - 22284 - 19968: jis0212<<14 | 0x16<<7 | 0x06, - 22285 - 19968: jis0208<<14 | 0x33<<7 | 0x02, - 22287 - 19968: jis0208<<14 | 0x16<<7 | 0x56, - 22289 - 19968: jis0212<<14 | 0x16<<7 | 0x07, - 22290 - 19968: jis0208<<14 | 0x10<<7 | 0x3F, - 22291 - 19968: jis0208<<14 | 0x33<<7 | 0x03, - 22293 - 19968: jis0212<<14 | 0x16<<7 | 0x08, - 22294 - 19968: jis0208<<14 | 0x33<<7 | 0x05, - 22296 - 19968: jis0208<<14 | 0x33<<7 | 0x04, - 22298 - 19968: jis0212<<14 | 0x16<<7 | 0x09, - 22299 - 19968: jis0212<<14 | 0x16<<7 | 0x0A, - 22300 - 19968: jis0208<<14 | 0x33<<7 | 0x07, - 22301 - 19968: jis0212<<14 | 0x16<<7 | 0x0B, - 22303 - 19968: jis0208<<14 | 0x24<<7 | 0x39, - 22304 - 19968: jis0212<<14 | 0x16<<7 | 0x0C, - 22306 - 19968: jis0212<<14 | 0x16<<7 | 0x0D, - 22307 - 19968: jis0212<<14 | 0x16<<7 | 0x0E, - 22308 - 19968: jis0212<<14 | 0x16<<7 | 0x0F, - 22309 - 19968: jis0212<<14 | 0x16<<7 | 0x10, - 22310 - 19968: jis0208<<14 | 0x33<<7 | 0x08, - 22311 - 19968: jis0208<<14 | 0x0F<<7 | 0x14, - 22312 - 19968: jis0208<<14 | 0x19<<7 | 0x3E, - 22313 - 19968: jis0212<<14 | 0x16<<7 | 0x11, - 22314 - 19968: jis0212<<14 | 0x16<<7 | 0x12, - 22316 - 19968: jis0212<<14 | 0x16<<7 | 0x13, - 22317 - 19968: jis0208<<14 | 0x16<<7 | 0x1C, - 22318 - 19968: jis0212<<14 | 0x16<<7 | 0x14, - 22319 - 19968: jis0212<<14 | 0x16<<7 | 0x15, - 22320 - 19968: jis0208<<14 | 0x22<<7 | 0x2E, - 22323 - 19968: jis0212<<14 | 0x16<<7 | 0x16, - 22324 - 19968: jis0212<<14 | 0x16<<7 | 0x17, - 22327 - 19968: jis0208<<14 | 0x33<<7 | 0x09, - 22328 - 19968: jis0208<<14 | 0x33<<7 | 0x0A, - 22331 - 19968: jis0208<<14 | 0x33<<7 | 0x0C, - 22333 - 19968: jis0212<<14 | 0x16<<7 | 0x18, - 22334 - 19968: jis0212<<14 | 0x16<<7 | 0x19, - 22335 - 19968: jis0212<<14 | 0x16<<7 | 0x1A, - 22336 - 19968: jis0208<<14 | 0x33<<7 | 0x0D, - 22338 - 19968: jis0208<<14 | 0x19<<7 | 0x43, - 22341 - 19968: jis0212<<14 | 0x16<<7 | 0x1B, - 22342 - 19968: jis0212<<14 | 0x16<<7 | 0x1C, - 22343 - 19968: jis0208<<14 | 0x15<<7 | 0x30, - 22346 - 19968: jis0208<<14 | 0x2A<<7 | 0x16, - 22348 - 19968: jis0212<<14 | 0x16<<7 | 0x1D, - 22349 - 19968: jis0212<<14 | 0x16<<7 | 0x1E, - 22350 - 19968: jis0208<<14 | 0x33<<7 | 0x0B, - 22351 - 19968: jis0208<<14 | 0x33<<7 | 0x0E, - 22352 - 19968: jis0208<<14 | 0x19<<7 | 0x20, - 22353 - 19968: jis0208<<14 | 0x18<<7 | 0x02, - 22354 - 19968: jis0212<<14 | 0x16<<7 | 0x1F, - 22361 - 19968: jis0208<<14 | 0x58<<7 | 0x39, - 22369 - 19968: jis0208<<14 | 0x33<<7 | 0x12, - 22370 - 19968: jis0212<<14 | 0x16<<7 | 0x20, - 22372 - 19968: jis0208<<14 | 0x19<<7 | 0x04, - 22373 - 19968: jis0208<<14 | 0x58<<7 | 0x3A, - 22374 - 19968: jis0208<<14 | 0x22<<7 | 0x12, - 22375 - 19968: jis0212<<14 | 0x16<<7 | 0x22, - 22376 - 19968: jis0212<<14 | 0x16<<7 | 0x23, - 22377 - 19968: jis0208<<14 | 0x33<<7 | 0x0F, - 22378 - 19968: jis0208<<14 | 0x23<<7 | 0x39, - 22379 - 19968: jis0212<<14 | 0x16<<7 | 0x24, - 22381 - 19968: jis0212<<14 | 0x16<<7 | 0x25, - 22382 - 19968: jis0212<<14 | 0x16<<7 | 0x26, - 22383 - 19968: jis0212<<14 | 0x16<<7 | 0x27, - 22384 - 19968: jis0212<<14 | 0x16<<7 | 0x28, - 22385 - 19968: jis0212<<14 | 0x16<<7 | 0x29, - 22387 - 19968: jis0212<<14 | 0x16<<7 | 0x2A, - 22388 - 19968: jis0212<<14 | 0x16<<7 | 0x2B, - 22389 - 19968: jis0212<<14 | 0x16<<7 | 0x2C, - 22391 - 19968: jis0212<<14 | 0x16<<7 | 0x2D, - 22393 - 19968: jis0212<<14 | 0x16<<7 | 0x2E, - 22394 - 19968: jis0212<<14 | 0x16<<7 | 0x2F, - 22395 - 19968: jis0212<<14 | 0x16<<7 | 0x30, - 22396 - 19968: jis0212<<14 | 0x16<<7 | 0x31, - 22398 - 19968: jis0212<<14 | 0x16<<7 | 0x32, - 22399 - 19968: jis0208<<14 | 0x33<<7 | 0x13, - 22401 - 19968: jis0212<<14 | 0x16<<7 | 0x33, - 22402 - 19968: jis0208<<14 | 0x1E<<7 | 0x41, - 22403 - 19968: jis0212<<14 | 0x16<<7 | 0x34, - 22408 - 19968: jis0208<<14 | 0x33<<7 | 0x11, - 22409 - 19968: jis0208<<14 | 0x33<<7 | 0x14, - 22411 - 19968: jis0208<<14 | 0x16<<7 | 0x1E, - 22412 - 19968: jis0212<<14 | 0x16<<7 | 0x35, - 22419 - 19968: jis0208<<14 | 0x33<<7 | 0x15, - 22420 - 19968: jis0212<<14 | 0x16<<7 | 0x36, - 22421 - 19968: jis0212<<14 | 0x16<<7 | 0x3F, - 22423 - 19968: jis0212<<14 | 0x16<<7 | 0x37, - 22425 - 19968: jis0212<<14 | 0x16<<7 | 0x38, - 22426 - 19968: jis0212<<14 | 0x16<<7 | 0x39, - 22428 - 19968: jis0212<<14 | 0x16<<7 | 0x3A, - 22429 - 19968: jis0212<<14 | 0x16<<7 | 0x3B, - 22430 - 19968: jis0212<<14 | 0x16<<7 | 0x3C, - 22431 - 19968: jis0212<<14 | 0x16<<7 | 0x3D, - 22432 - 19968: jis0208<<14 | 0x33<<7 | 0x16, - 22433 - 19968: jis0212<<14 | 0x16<<7 | 0x3E, - 22434 - 19968: jis0208<<14 | 0x18<<7 | 0x03, - 22435 - 19968: jis0208<<14 | 0x12<<7 | 0x1F, - 22436 - 19968: jis0208<<14 | 0x33<<7 | 0x18, - 22439 - 19968: jis0212<<14 | 0x16<<7 | 0x40, - 22440 - 19968: jis0212<<14 | 0x16<<7 | 0x41, - 22441 - 19968: jis0212<<14 | 0x16<<7 | 0x42, - 22442 - 19968: jis0208<<14 | 0x33<<7 | 0x19, - 22444 - 19968: jis0208<<14 | 0x58<<7 | 0x3B, - 22448 - 19968: jis0208<<14 | 0x33<<7 | 0x1A, - 22451 - 19968: jis0208<<14 | 0x33<<7 | 0x17, - 22456 - 19968: jis0212<<14 | 0x16<<7 | 0x44, - 22461 - 19968: jis0212<<14 | 0x16<<7 | 0x45, - 22464 - 19968: jis0208<<14 | 0x33<<7 | 0x10, - 22467 - 19968: jis0208<<14 | 0x33<<7 | 0x1B, - 22470 - 19968: jis0208<<14 | 0x33<<7 | 0x1C, - 22471 - 19968: jis0208<<14 | 0x58<<7 | 0x3D, - 22472 - 19968: jis0208<<14 | 0x58<<7 | 0x3C, - 22475 - 19968: jis0208<<14 | 0x2A<<7 | 0x43, - 22476 - 19968: jis0212<<14 | 0x16<<7 | 0x48, - 22478 - 19968: jis0208<<14 | 0x1D<<7 | 0x4A, - 22479 - 19968: jis0212<<14 | 0x16<<7 | 0x49, - 22482 - 19968: jis0208<<14 | 0x33<<7 | 0x1E, - 22483 - 19968: jis0208<<14 | 0x33<<7 | 0x1F, - 22484 - 19968: jis0208<<14 | 0x33<<7 | 0x1D, - 22485 - 19968: jis0212<<14 | 0x16<<7 | 0x4A, - 22486 - 19968: jis0208<<14 | 0x33<<7 | 0x21, - 22492 - 19968: jis0208<<14 | 0x26<<7 | 0x17, - 22493 - 19968: jis0212<<14 | 0x16<<7 | 0x4B, - 22494 - 19968: jis0212<<14 | 0x16<<7 | 0x4C, - 22495 - 19968: jis0208<<14 | 0x0F<<7 | 0x47, - 22496 - 19968: jis0208<<14 | 0x28<<7 | 0x35, - 22497 - 19968: jis0212<<14 | 0x16<<7 | 0x5D, - 22499 - 19968: jis0208<<14 | 0x33<<7 | 0x22, - 22500 - 19968: jis0212<<14 | 0x16<<7 | 0x4D, - 22502 - 19968: jis0212<<14 | 0x16<<7 | 0x4E, - 22503 - 19968: jis0212<<14 | 0x16<<7 | 0x4F, - 22505 - 19968: jis0212<<14 | 0x16<<7 | 0x50, - 22509 - 19968: jis0212<<14 | 0x16<<7 | 0x51, - 22512 - 19968: jis0212<<14 | 0x16<<7 | 0x52, - 22516 - 19968: jis0208<<14 | 0x1D<<7 | 0x5C, - 22517 - 19968: jis0212<<14 | 0x16<<7 | 0x53, - 22518 - 19968: jis0212<<14 | 0x16<<7 | 0x54, - 22519 - 19968: jis0208<<14 | 0x1B<<7 | 0x18, - 22520 - 19968: jis0212<<14 | 0x16<<7 | 0x55, - 22521 - 19968: jis0208<<14 | 0x26<<7 | 0x3C, - 22522 - 19968: jis0208<<14 | 0x13<<7 | 0x4F, - 22524 - 19968: jis0208<<14 | 0x19<<7 | 0x4A, - 22525 - 19968: jis0212<<14 | 0x16<<7 | 0x56, - 22526 - 19968: jis0212<<14 | 0x16<<7 | 0x57, - 22527 - 19968: jis0212<<14 | 0x16<<7 | 0x58, - 22528 - 19968: jis0208<<14 | 0x2A<<7 | 0x38, - 22530 - 19968: jis0208<<14 | 0x25<<7 | 0x11, - 22531 - 19968: jis0212<<14 | 0x16<<7 | 0x59, - 22532 - 19968: jis0212<<14 | 0x16<<7 | 0x5A, - 22533 - 19968: jis0208<<14 | 0x16<<7 | 0x57, - 22534 - 19968: jis0208<<14 | 0x21<<7 | 0x2E, - 22536 - 19968: jis0212<<14 | 0x16<<7 | 0x5B, - 22537 - 19968: jis0212<<14 | 0x16<<7 | 0x5C, - 22538 - 19968: jis0208<<14 | 0x33<<7 | 0x20, - 22539 - 19968: jis0208<<14 | 0x33<<7 | 0x23, - 22540 - 19968: jis0212<<14 | 0x17<<7 | 0x00, - 22541 - 19968: jis0212<<14 | 0x17<<7 | 0x01, - 22549 - 19968: jis0208<<14 | 0x21<<7 | 0x23, - 22553 - 19968: jis0208<<14 | 0x33<<7 | 0x24, - 22555 - 19968: jis0212<<14 | 0x17<<7 | 0x02, - 22557 - 19968: jis0208<<14 | 0x33<<7 | 0x25, - 22558 - 19968: jis0212<<14 | 0x17<<7 | 0x03, - 22559 - 19968: jis0212<<14 | 0x17<<7 | 0x04, - 22560 - 19968: jis0212<<14 | 0x17<<7 | 0x05, - 22561 - 19968: jis0208<<14 | 0x33<<7 | 0x27, - 22564 - 19968: jis0208<<14 | 0x23<<7 | 0x48, - 22566 - 19968: jis0212<<14 | 0x17<<7 | 0x06, - 22567 - 19968: jis0212<<14 | 0x17<<7 | 0x07, - 22570 - 19968: jis0208<<14 | 0x13<<7 | 0x0D, - 22573 - 19968: jis0212<<14 | 0x17<<7 | 0x08, - 22575 - 19968: jis0208<<14 | 0x53<<7 | 0x00, - 22576 - 19968: jis0208<<14 | 0x10<<7 | 0x40, - 22577 - 19968: jis0208<<14 | 0x29<<7 | 0x52, - 22578 - 19968: jis0212<<14 | 0x17<<7 | 0x09, - 22580 - 19968: jis0208<<14 | 0x1D<<7 | 0x4B, - 22581 - 19968: jis0208<<14 | 0x24<<7 | 0x27, - 22585 - 19968: jis0212<<14 | 0x17<<7 | 0x0A, - 22586 - 19968: jis0208<<14 | 0x19<<7 | 0x45, - 22589 - 19968: jis0208<<14 | 0x33<<7 | 0x2D, - 22591 - 19968: jis0212<<14 | 0x17<<7 | 0x0B, - 22592 - 19968: jis0208<<14 | 0x29<<7 | 0x1C, - 22593 - 19968: jis0208<<14 | 0x2D<<7 | 0x3C, - 22601 - 19968: jis0212<<14 | 0x17<<7 | 0x0C, - 22602 - 19968: jis0208<<14 | 0x11<<7 | 0x53, - 22603 - 19968: jis0208<<14 | 0x33<<7 | 0x29, - 22604 - 19968: jis0212<<14 | 0x17<<7 | 0x0D, - 22605 - 19968: jis0212<<14 | 0x17<<7 | 0x0E, - 22607 - 19968: jis0212<<14 | 0x17<<7 | 0x0F, - 22608 - 19968: jis0212<<14 | 0x17<<7 | 0x10, - 22609 - 19968: jis0208<<14 | 0x20<<7 | 0x19, - 22610 - 19968: jis0208<<14 | 0x33<<7 | 0x2C, - 22612 - 19968: jis0208<<14 | 0x24<<7 | 0x42, - 22613 - 19968: jis0212<<14 | 0x17<<7 | 0x11, - 22615 - 19968: jis0208<<14 | 0x24<<7 | 0x28, - 22616 - 19968: jis0208<<14 | 0x24<<7 | 0x43, - 22617 - 19968: jis0208<<14 | 0x27<<7 | 0x18, - 22618 - 19968: jis0208<<14 | 0x23<<7 | 0x2C, - 22622 - 19968: jis0208<<14 | 0x19<<7 | 0x28, - 22623 - 19968: jis0212<<14 | 0x17<<7 | 0x12, - 22625 - 19968: jis0212<<14 | 0x17<<7 | 0x13, - 22626 - 19968: jis0208<<14 | 0x33<<7 | 0x28, - 22628 - 19968: jis0212<<14 | 0x17<<7 | 0x14, - 22631 - 19968: jis0212<<14 | 0x17<<7 | 0x15, - 22632 - 19968: jis0212<<14 | 0x17<<7 | 0x16, - 22633 - 19968: jis0208<<14 | 0x10<<7 | 0x55, - 22635 - 19968: jis0208<<14 | 0x24<<7 | 0x15, - 22640 - 19968: jis0208<<14 | 0x33<<7 | 0x2A, - 22642 - 19968: jis0208<<14 | 0x33<<7 | 0x26, - 22645 - 19968: jis0208<<14 | 0x1E<<7 | 0x2F, - 22648 - 19968: jis0212<<14 | 0x17<<7 | 0x17, - 22649 - 19968: jis0208<<14 | 0x33<<7 | 0x2E, - 22652 - 19968: jis0212<<14 | 0x17<<7 | 0x18, - 22654 - 19968: jis0208<<14 | 0x1C<<7 | 0x2D, - 22655 - 19968: jis0212<<14 | 0x17<<7 | 0x19, - 22656 - 19968: jis0212<<14 | 0x17<<7 | 0x1A, - 22657 - 19968: jis0212<<14 | 0x17<<7 | 0x1B, - 22659 - 19968: jis0208<<14 | 0x15<<7 | 0x0C, - 22661 - 19968: jis0208<<14 | 0x33<<7 | 0x2F, - 22663 - 19968: jis0212<<14 | 0x17<<7 | 0x1C, - 22664 - 19968: jis0212<<14 | 0x17<<7 | 0x1D, - 22665 - 19968: jis0212<<14 | 0x17<<7 | 0x1E, - 22666 - 19968: jis0212<<14 | 0x17<<7 | 0x1F, - 22668 - 19968: jis0212<<14 | 0x17<<7 | 0x20, - 22669 - 19968: jis0212<<14 | 0x17<<7 | 0x21, - 22671 - 19968: jis0212<<14 | 0x17<<7 | 0x22, - 22672 - 19968: jis0212<<14 | 0x17<<7 | 0x23, - 22675 - 19968: jis0208<<14 | 0x29<<7 | 0x47, - 22676 - 19968: jis0212<<14 | 0x17<<7 | 0x24, - 22678 - 19968: jis0212<<14 | 0x17<<7 | 0x25, - 22679 - 19968: jis0208<<14 | 0x20<<7 | 0x5C, - 22684 - 19968: jis0208<<14 | 0x23<<7 | 0x25, - 22685 - 19968: jis0212<<14 | 0x17<<7 | 0x26, - 22686 - 19968: jis0208<<14 | 0x58<<7 | 0x40, - 22687 - 19968: jis0208<<14 | 0x33<<7 | 0x31, - 22688 - 19968: jis0212<<14 | 0x17<<7 | 0x27, - 22689 - 19968: jis0212<<14 | 0x17<<7 | 0x28, - 22690 - 19968: jis0212<<14 | 0x17<<7 | 0x29, - 22694 - 19968: jis0212<<14 | 0x17<<7 | 0x2A, - 22696 - 19968: jis0208<<14 | 0x2A<<7 | 0x2E, - 22697 - 19968: jis0212<<14 | 0x17<<7 | 0x2B, - 22699 - 19968: jis0208<<14 | 0x33<<7 | 0x32, - 22702 - 19968: jis0208<<14 | 0x33<<7 | 0x37, - 22705 - 19968: jis0212<<14 | 0x17<<7 | 0x2C, - 22706 - 19968: jis0208<<14 | 0x58<<7 | 0x41, - 22707 - 19968: jis0208<<14 | 0x29<<7 | 0x0E, - 22712 - 19968: jis0208<<14 | 0x33<<7 | 0x36, - 22713 - 19968: jis0208<<14 | 0x33<<7 | 0x30, - 22714 - 19968: jis0208<<14 | 0x33<<7 | 0x33, - 22715 - 19968: jis0208<<14 | 0x33<<7 | 0x35, - 22716 - 19968: jis0212<<14 | 0x17<<7 | 0x2F, - 22718 - 19968: jis0208<<14 | 0x19<<7 | 0x05, - 22721 - 19968: jis0208<<14 | 0x29<<7 | 0x28, - 22722 - 19968: jis0212<<14 | 0x17<<7 | 0x30, - 22724 - 19968: jis0212<<14 | 0x17<<7 | 0x2E, - 22725 - 19968: jis0208<<14 | 0x33<<7 | 0x38, - 22727 - 19968: jis0208<<14 | 0x22<<7 | 0x24, - 22728 - 19968: jis0212<<14 | 0x17<<7 | 0x31, - 22730 - 19968: jis0208<<14 | 0x11<<7 | 0x54, - 22732 - 19968: jis0208<<14 | 0x1D<<7 | 0x4C, - 22733 - 19968: jis0212<<14 | 0x17<<7 | 0x32, - 22734 - 19968: jis0212<<14 | 0x17<<7 | 0x33, - 22736 - 19968: jis0212<<14 | 0x17<<7 | 0x34, - 22737 - 19968: jis0208<<14 | 0x33<<7 | 0x3A, - 22738 - 19968: jis0212<<14 | 0x17<<7 | 0x35, - 22739 - 19968: jis0208<<14 | 0x33<<7 | 0x39, - 22740 - 19968: jis0212<<14 | 0x17<<7 | 0x36, - 22741 - 19968: jis0208<<14 | 0x18<<7 | 0x47, - 22742 - 19968: jis0212<<14 | 0x17<<7 | 0x37, - 22743 - 19968: jis0208<<14 | 0x33<<7 | 0x3B, - 22744 - 19968: jis0208<<14 | 0x33<<7 | 0x3D, - 22745 - 19968: jis0208<<14 | 0x33<<7 | 0x3C, - 22746 - 19968: jis0212<<14 | 0x17<<7 | 0x38, - 22748 - 19968: jis0208<<14 | 0x33<<7 | 0x3F, - 22749 - 19968: jis0212<<14 | 0x17<<7 | 0x39, - 22750 - 19968: jis0208<<14 | 0x33<<7 | 0x34, - 22751 - 19968: jis0208<<14 | 0x33<<7 | 0x41, - 22753 - 19968: jis0212<<14 | 0x17<<7 | 0x3A, - 22754 - 19968: jis0212<<14 | 0x17<<7 | 0x3B, - 22756 - 19968: jis0208<<14 | 0x33<<7 | 0x40, - 22757 - 19968: jis0208<<14 | 0x33<<7 | 0x3E, - 22761 - 19968: jis0212<<14 | 0x17<<7 | 0x3C, - 22763 - 19968: jis0208<<14 | 0x1A<<7 | 0x2D, - 22764 - 19968: jis0208<<14 | 0x1E<<7 | 0x30, - 22766 - 19968: jis0208<<14 | 0x20<<7 | 0x33, - 22767 - 19968: jis0208<<14 | 0x33<<7 | 0x42, - 22768 - 19968: jis0208<<14 | 0x1F<<7 | 0x1B, - 22769 - 19968: jis0208<<14 | 0x0F<<7 | 0x4C, - 22770 - 19968: jis0208<<14 | 0x26<<7 | 0x43, - 22771 - 19968: jis0212<<14 | 0x17<<7 | 0x3D, - 22775 - 19968: jis0208<<14 | 0x23<<7 | 0x3A, - 22777 - 19968: jis0208<<14 | 0x33<<7 | 0x44, - 22778 - 19968: jis0208<<14 | 0x33<<7 | 0x43, - 22779 - 19968: jis0208<<14 | 0x33<<7 | 0x45, - 22780 - 19968: jis0208<<14 | 0x33<<7 | 0x46, - 22781 - 19968: jis0208<<14 | 0x33<<7 | 0x47, - 22786 - 19968: jis0208<<14 | 0x33<<7 | 0x48, - 22789 - 19968: jis0212<<14 | 0x17<<7 | 0x3E, - 22790 - 19968: jis0212<<14 | 0x17<<7 | 0x3F, - 22793 - 19968: jis0208<<14 | 0x29<<7 | 0x30, - 22794 - 19968: jis0208<<14 | 0x33<<7 | 0x49, - 22795 - 19968: jis0208<<14 | 0x58<<7 | 0x42, - 22796 - 19968: jis0212<<14 | 0x17<<7 | 0x41, - 22799 - 19968: jis0208<<14 | 0x11<<7 | 0x25, - 22800 - 19968: jis0208<<14 | 0x33<<7 | 0x4A, - 22802 - 19968: jis0212<<14 | 0x17<<7 | 0x42, - 22803 - 19968: jis0212<<14 | 0x17<<7 | 0x43, - 22804 - 19968: jis0212<<14 | 0x17<<7 | 0x44, - 22805 - 19968: jis0208<<14 | 0x2C<<7 | 0x1B, - 22806 - 19968: jis0208<<14 | 0x12<<7 | 0x0F, - 22808 - 19968: jis0208<<14 | 0x31<<7 | 0x28, - 22809 - 19968: jis0208<<14 | 0x1C<<7 | 0x27, - 22810 - 19968: jis0208<<14 | 0x21<<7 | 0x1E, - 22811 - 19968: jis0208<<14 | 0x33<<7 | 0x4B, - 22812 - 19968: jis0208<<14 | 0x2B<<7 | 0x4A, - 22813 - 19968: jis0212<<14 | 0x17<<7 | 0x46, - 22817 - 19968: jis0212<<14 | 0x17<<7 | 0x47, - 22818 - 19968: jis0208<<14 | 0x2B<<7 | 0x13, - 22819 - 19968: jis0212<<14 | 0x17<<7 | 0x48, - 22820 - 19968: jis0212<<14 | 0x17<<7 | 0x49, - 22821 - 19968: jis0208<<14 | 0x33<<7 | 0x4D, - 22823 - 19968: jis0208<<14 | 0x21<<7 | 0x46, - 22824 - 19968: jis0212<<14 | 0x17<<7 | 0x4A, - 22825 - 19968: jis0208<<14 | 0x24<<7 | 0x16, - 22826 - 19968: jis0208<<14 | 0x21<<7 | 0x1F, - 22827 - 19968: jis0208<<14 | 0x28<<7 | 0x36, - 22828 - 19968: jis0208<<14 | 0x33<<7 | 0x4E, - 22829 - 19968: jis0208<<14 | 0x33<<7 | 0x4F, - 22830 - 19968: jis0208<<14 | 0x10<<7 | 0x5A, - 22831 - 19968: jis0212<<14 | 0x17<<7 | 0x4B, - 22832 - 19968: jis0212<<14 | 0x17<<7 | 0x4C, - 22833 - 19968: jis0208<<14 | 0x1B<<7 | 0x19, - 22834 - 19968: jis0208<<14 | 0x33<<7 | 0x50, - 22835 - 19968: jis0212<<14 | 0x17<<7 | 0x4D, - 22837 - 19968: jis0212<<14 | 0x17<<7 | 0x4E, - 22838 - 19968: jis0212<<14 | 0x17<<7 | 0x4F, - 22839 - 19968: jis0208<<14 | 0x0F<<7 | 0x2F, - 22840 - 19968: jis0208<<14 | 0x33<<7 | 0x51, - 22846 - 19968: jis0208<<14 | 0x33<<7 | 0x52, - 22847 - 19968: jis0212<<14 | 0x17<<7 | 0x50, - 22851 - 19968: jis0212<<14 | 0x17<<7 | 0x51, - 22852 - 19968: jis0208<<14 | 0x10<<7 | 0x41, - 22854 - 19968: jis0212<<14 | 0x17<<7 | 0x52, - 22855 - 19968: jis0208<<14 | 0x13<<7 | 0x50, - 22856 - 19968: jis0208<<14 | 0x25<<7 | 0x3F, - 22857 - 19968: jis0208<<14 | 0x29<<7 | 0x53, - 22862 - 19968: jis0208<<14 | 0x33<<7 | 0x56, - 22863 - 19968: jis0208<<14 | 0x20<<7 | 0x34, - 22864 - 19968: jis0208<<14 | 0x33<<7 | 0x55, - 22865 - 19968: jis0208<<14 | 0x16<<7 | 0x1F, - 22866 - 19968: jis0212<<14 | 0x17<<7 | 0x53, - 22867 - 19968: jis0208<<14 | 0x58<<7 | 0x43, - 22868 - 19968: jis0208<<14 | 0x2A<<7 | 0x3A, - 22869 - 19968: jis0208<<14 | 0x33<<7 | 0x54, - 22871 - 19968: jis0208<<14 | 0x24<<7 | 0x44, - 22872 - 19968: jis0208<<14 | 0x33<<7 | 0x58, - 22873 - 19968: jis0212<<14 | 0x17<<7 | 0x55, - 22874 - 19968: jis0208<<14 | 0x33<<7 | 0x57, - 22875 - 19968: jis0208<<14 | 0x58<<7 | 0x44, - 22877 - 19968: jis0208<<14 | 0x58<<7 | 0x45, - 22878 - 19968: jis0212<<14 | 0x17<<7 | 0x58, - 22879 - 19968: jis0212<<14 | 0x17<<7 | 0x59, - 22880 - 19968: jis0208<<14 | 0x33<<7 | 0x5A, - 22881 - 19968: jis0212<<14 | 0x17<<7 | 0x5A, - 22882 - 19968: jis0208<<14 | 0x33<<7 | 0x59, - 22883 - 19968: jis0208<<14 | 0x58<<7 | 0x46, - 22885 - 19968: jis0208<<14 | 0x10<<7 | 0x5B, - 22887 - 19968: jis0208<<14 | 0x33<<7 | 0x5B, - 22888 - 19968: jis0208<<14 | 0x1D<<7 | 0x08, - 22889 - 19968: jis0208<<14 | 0x33<<7 | 0x5D, - 22890 - 19968: jis0208<<14 | 0x22<<7 | 0x04, - 22891 - 19968: jis0212<<14 | 0x17<<7 | 0x5C, - 22892 - 19968: jis0208<<14 | 0x33<<7 | 0x5C, - 22893 - 19968: jis0212<<14 | 0x17<<7 | 0x5D, - 22894 - 19968: jis0208<<14 | 0x29<<7 | 0x12, - 22895 - 19968: jis0212<<14 | 0x18<<7 | 0x00, - 22898 - 19968: jis0212<<14 | 0x18<<7 | 0x01, - 22899 - 19968: jis0208<<14 | 0x1C<<7 | 0x56, - 22900 - 19968: jis0208<<14 | 0x24<<7 | 0x3A, - 22901 - 19968: jis0212<<14 | 0x18<<7 | 0x02, - 22902 - 19968: jis0212<<14 | 0x18<<7 | 0x03, - 22904 - 19968: jis0208<<14 | 0x34<<7 | 0x00, - 22905 - 19968: jis0212<<14 | 0x18<<7 | 0x04, - 22907 - 19968: jis0212<<14 | 0x18<<7 | 0x05, - 22908 - 19968: jis0212<<14 | 0x18<<7 | 0x06, - 22909 - 19968: jis0208<<14 | 0x18<<7 | 0x04, - 22913 - 19968: jis0208<<14 | 0x34<<7 | 0x01, - 22914 - 19968: jis0208<<14 | 0x26<<7 | 0x00, - 22915 - 19968: jis0208<<14 | 0x27<<7 | 0x3D, - 22916 - 19968: jis0208<<14 | 0x2B<<7 | 0x30, - 22922 - 19968: jis0208<<14 | 0x26<<7 | 0x04, - 22923 - 19968: jis0212<<14 | 0x18<<7 | 0x07, - 22924 - 19968: jis0212<<14 | 0x18<<7 | 0x08, - 22925 - 19968: jis0208<<14 | 0x34<<7 | 0x0A, - 22926 - 19968: jis0212<<14 | 0x18<<7 | 0x09, - 22930 - 19968: jis0212<<14 | 0x18<<7 | 0x0A, - 22931 - 19968: jis0208<<14 | 0x14<<7 | 0x17, - 22933 - 19968: jis0212<<14 | 0x18<<7 | 0x0B, - 22934 - 19968: jis0208<<14 | 0x2C<<7 | 0x24, - 22935 - 19968: jis0212<<14 | 0x18<<7 | 0x0C, - 22937 - 19968: jis0208<<14 | 0x2B<<7 | 0x0E, - 22939 - 19968: jis0208<<14 | 0x35<<7 | 0x0B, - 22941 - 19968: jis0208<<14 | 0x34<<7 | 0x02, - 22943 - 19968: jis0212<<14 | 0x18<<7 | 0x0D, - 22947 - 19968: jis0208<<14 | 0x34<<7 | 0x05, - 22948 - 19968: jis0208<<14 | 0x58<<7 | 0x47, - 22949 - 19968: jis0208<<14 | 0x21<<7 | 0x24, - 22951 - 19968: jis0212<<14 | 0x18<<7 | 0x0F, - 22952 - 19968: jis0208<<14 | 0x2A<<7 | 0x17, - 22956 - 19968: jis0208<<14 | 0x24<<7 | 0x29, - 22957 - 19968: jis0212<<14 | 0x18<<7 | 0x10, - 22958 - 19968: jis0212<<14 | 0x18<<7 | 0x11, - 22959 - 19968: jis0212<<14 | 0x18<<7 | 0x12, - 22960 - 19968: jis0212<<14 | 0x18<<7 | 0x13, - 22962 - 19968: jis0208<<14 | 0x34<<7 | 0x06, - 22963 - 19968: jis0212<<14 | 0x18<<7 | 0x14, - 22967 - 19968: jis0212<<14 | 0x18<<7 | 0x15, - 22969 - 19968: jis0208<<14 | 0x2A<<7 | 0x44, - 22970 - 19968: jis0208<<14 | 0x58<<7 | 0x48, - 22971 - 19968: jis0208<<14 | 0x19<<7 | 0x29, - 22972 - 19968: jis0212<<14 | 0x18<<7 | 0x17, - 22974 - 19968: jis0208<<14 | 0x1D<<7 | 0x09, - 22977 - 19968: jis0212<<14 | 0x18<<7 | 0x18, - 22979 - 19968: jis0212<<14 | 0x18<<7 | 0x19, - 22980 - 19968: jis0212<<14 | 0x18<<7 | 0x1A, - 22982 - 19968: jis0208<<14 | 0x34<<7 | 0x07, - 22984 - 19968: jis0212<<14 | 0x18<<7 | 0x1B, - 22985 - 19968: jis0208<<14 | 0x1A<<7 | 0x2F, - 22986 - 19968: jis0212<<14 | 0x18<<7 | 0x1C, - 22987 - 19968: jis0208<<14 | 0x1A<<7 | 0x2E, - 22989 - 19968: jis0212<<14 | 0x18<<7 | 0x1D, - 22992 - 19968: jis0208<<14 | 0x0F<<7 | 0x18, - 22993 - 19968: jis0208<<14 | 0x17<<7 | 0x27, - 22994 - 19968: jis0212<<14 | 0x18<<7 | 0x1E, - 22995 - 19968: jis0208<<14 | 0x1F<<7 | 0x0A, - 22996 - 19968: jis0208<<14 | 0x0F<<7 | 0x30, - 23001 - 19968: jis0208<<14 | 0x34<<7 | 0x0B, - 23002 - 19968: jis0208<<14 | 0x34<<7 | 0x0C, - 23004 - 19968: jis0208<<14 | 0x34<<7 | 0x09, - 23005 - 19968: jis0212<<14 | 0x18<<7 | 0x1F, - 23006 - 19968: jis0212<<14 | 0x18<<7 | 0x20, - 23007 - 19968: jis0212<<14 | 0x18<<7 | 0x21, - 23011 - 19968: jis0212<<14 | 0x18<<7 | 0x22, - 23012 - 19968: jis0212<<14 | 0x18<<7 | 0x23, - 23013 - 19968: jis0208<<14 | 0x10<<7 | 0x17, - 23014 - 19968: jis0208<<14 | 0x13<<7 | 0x0E, - 23015 - 19968: jis0212<<14 | 0x18<<7 | 0x24, - 23016 - 19968: jis0208<<14 | 0x34<<7 | 0x08, - 23018 - 19968: jis0208<<14 | 0x2B<<7 | 0x24, - 23019 - 19968: jis0208<<14 | 0x28<<7 | 0x10, - 23022 - 19968: jis0212<<14 | 0x18<<7 | 0x25, - 23023 - 19968: jis0212<<14 | 0x18<<7 | 0x26, - 23025 - 19968: jis0212<<14 | 0x18<<7 | 0x27, - 23026 - 19968: jis0212<<14 | 0x18<<7 | 0x28, - 23028 - 19968: jis0212<<14 | 0x18<<7 | 0x29, - 23030 - 19968: jis0208<<14 | 0x0F<<7 | 0x07, - 23031 - 19968: jis0212<<14 | 0x18<<7 | 0x2A, - 23035 - 19968: jis0208<<14 | 0x0F<<7 | 0x58, - 23039 - 19968: jis0208<<14 | 0x1A<<7 | 0x30, - 23040 - 19968: jis0212<<14 | 0x18<<7 | 0x2B, - 23041 - 19968: jis0208<<14 | 0x0F<<7 | 0x31, - 23043 - 19968: jis0208<<14 | 0x0F<<7 | 0x02, - 23044 - 19968: jis0212<<14 | 0x18<<7 | 0x2C, - 23049 - 19968: jis0208<<14 | 0x34<<7 | 0x11, - 23052 - 19968: jis0212<<14 | 0x18<<7 | 0x2D, - 23053 - 19968: jis0212<<14 | 0x18<<7 | 0x2E, - 23054 - 19968: jis0212<<14 | 0x18<<7 | 0x2F, - 23057 - 19968: jis0208<<14 | 0x34<<7 | 0x0F, - 23058 - 19968: jis0212<<14 | 0x18<<7 | 0x30, - 23059 - 19968: jis0212<<14 | 0x18<<7 | 0x31, - 23064 - 19968: jis0208<<14 | 0x2B<<7 | 0x1B, - 23066 - 19968: jis0208<<14 | 0x34<<7 | 0x12, - 23068 - 19968: jis0208<<14 | 0x34<<7 | 0x10, - 23070 - 19968: jis0212<<14 | 0x18<<7 | 0x32, - 23071 - 19968: jis0208<<14 | 0x34<<7 | 0x0E, - 23072 - 19968: jis0208<<14 | 0x1E<<7 | 0x10, - 23075 - 19968: jis0212<<14 | 0x18<<7 | 0x33, - 23076 - 19968: jis0212<<14 | 0x18<<7 | 0x34, - 23077 - 19968: jis0208<<14 | 0x34<<7 | 0x0D, - 23079 - 19968: jis0212<<14 | 0x18<<7 | 0x35, - 23080 - 19968: jis0212<<14 | 0x18<<7 | 0x36, - 23081 - 19968: jis0208<<14 | 0x29<<7 | 0x39, - 23082 - 19968: jis0212<<14 | 0x18<<7 | 0x37, - 23085 - 19968: jis0212<<14 | 0x18<<7 | 0x38, - 23087 - 19968: jis0208<<14 | 0x17<<7 | 0x43, - 23088 - 19968: jis0212<<14 | 0x18<<7 | 0x39, - 23093 - 19968: jis0208<<14 | 0x34<<7 | 0x16, - 23094 - 19968: jis0208<<14 | 0x34<<7 | 0x17, - 23100 - 19968: jis0208<<14 | 0x1D<<7 | 0x0A, - 23104 - 19968: jis0208<<14 | 0x34<<7 | 0x13, - 23105 - 19968: jis0208<<14 | 0x2E<<7 | 0x0B, - 23108 - 19968: jis0212<<14 | 0x18<<7 | 0x3A, - 23109 - 19968: jis0212<<14 | 0x18<<7 | 0x3B, - 23110 - 19968: jis0208<<14 | 0x26<<7 | 0x2B, - 23111 - 19968: jis0212<<14 | 0x18<<7 | 0x3C, - 23112 - 19968: jis0212<<14 | 0x18<<7 | 0x3D, - 23113 - 19968: jis0208<<14 | 0x34<<7 | 0x15, - 23116 - 19968: jis0212<<14 | 0x18<<7 | 0x3E, - 23120 - 19968: jis0212<<14 | 0x18<<7 | 0x3F, - 23125 - 19968: jis0212<<14 | 0x18<<7 | 0x40, - 23130 - 19968: jis0208<<14 | 0x19<<7 | 0x06, - 23134 - 19968: jis0212<<14 | 0x18<<7 | 0x41, - 23138 - 19968: jis0208<<14 | 0x34<<7 | 0x18, - 23139 - 19968: jis0212<<14 | 0x18<<7 | 0x42, - 23141 - 19968: jis0212<<14 | 0x18<<7 | 0x43, - 23142 - 19968: jis0208<<14 | 0x28<<7 | 0x37, - 23143 - 19968: jis0212<<14 | 0x18<<7 | 0x44, - 23146 - 19968: jis0208<<14 | 0x34<<7 | 0x19, - 23148 - 19968: jis0208<<14 | 0x34<<7 | 0x14, - 23149 - 19968: jis0212<<14 | 0x18<<7 | 0x45, - 23159 - 19968: jis0212<<14 | 0x18<<7 | 0x46, - 23162 - 19968: jis0212<<14 | 0x18<<7 | 0x47, - 23163 - 19968: jis0212<<14 | 0x18<<7 | 0x48, - 23166 - 19968: jis0212<<14 | 0x18<<7 | 0x49, - 23167 - 19968: jis0208<<14 | 0x2B<<7 | 0x1A, - 23179 - 19968: jis0212<<14 | 0x18<<7 | 0x4A, - 23184 - 19968: jis0212<<14 | 0x18<<7 | 0x4B, - 23186 - 19968: jis0208<<14 | 0x26<<7 | 0x3D, - 23187 - 19968: jis0212<<14 | 0x18<<7 | 0x4C, - 23190 - 19968: jis0212<<14 | 0x18<<7 | 0x4D, - 23193 - 19968: jis0212<<14 | 0x18<<7 | 0x4E, - 23194 - 19968: jis0208<<14 | 0x34<<7 | 0x1A, - 23195 - 19968: jis0208<<14 | 0x28<<7 | 0x11, - 23196 - 19968: jis0212<<14 | 0x18<<7 | 0x4F, - 23198 - 19968: jis0212<<14 | 0x18<<7 | 0x50, - 23199 - 19968: jis0212<<14 | 0x18<<7 | 0x51, - 23200 - 19968: jis0212<<14 | 0x18<<7 | 0x52, - 23202 - 19968: jis0212<<14 | 0x18<<7 | 0x53, - 23207 - 19968: jis0212<<14 | 0x18<<7 | 0x54, - 23212 - 19968: jis0212<<14 | 0x18<<7 | 0x55, - 23217 - 19968: jis0212<<14 | 0x18<<7 | 0x56, - 23218 - 19968: jis0212<<14 | 0x18<<7 | 0x57, - 23219 - 19968: jis0212<<14 | 0x18<<7 | 0x58, - 23221 - 19968: jis0212<<14 | 0x18<<7 | 0x59, - 23224 - 19968: jis0212<<14 | 0x18<<7 | 0x5A, - 23226 - 19968: jis0212<<14 | 0x18<<7 | 0x5B, - 23227 - 19968: jis0212<<14 | 0x18<<7 | 0x5C, - 23228 - 19968: jis0208<<14 | 0x34<<7 | 0x1B, - 23229 - 19968: jis0208<<14 | 0x34<<7 | 0x1F, - 23230 - 19968: jis0208<<14 | 0x34<<7 | 0x1C, - 23231 - 19968: jis0212<<14 | 0x18<<7 | 0x5D, - 23233 - 19968: jis0208<<14 | 0x11<<7 | 0x26, - 23234 - 19968: jis0208<<14 | 0x34<<7 | 0x1E, - 23236 - 19968: jis0212<<14 | 0x19<<7 | 0x00, - 23238 - 19968: jis0212<<14 | 0x19<<7 | 0x01, - 23240 - 19968: jis0212<<14 | 0x19<<7 | 0x02, - 23241 - 19968: jis0208<<14 | 0x1B<<7 | 0x1A, - 23243 - 19968: jis0208<<14 | 0x34<<7 | 0x1D, - 23244 - 19968: jis0208<<14 | 0x16<<7 | 0x58, - 23247 - 19968: jis0212<<14 | 0x19<<7 | 0x03, - 23248 - 19968: jis0208<<14 | 0x34<<7 | 0x2B, - 23254 - 19968: jis0208<<14 | 0x34<<7 | 0x24, - 23255 - 19968: jis0208<<14 | 0x34<<7 | 0x21, - 23258 - 19968: jis0212<<14 | 0x19<<7 | 0x04, - 23260 - 19968: jis0212<<14 | 0x19<<7 | 0x05, - 23264 - 19968: jis0212<<14 | 0x19<<7 | 0x06, - 23265 - 19968: jis0208<<14 | 0x22<<7 | 0x43, - 23267 - 19968: jis0208<<14 | 0x34<<7 | 0x20, - 23269 - 19968: jis0212<<14 | 0x19<<7 | 0x07, - 23270 - 19968: jis0208<<14 | 0x34<<7 | 0x22, - 23273 - 19968: jis0208<<14 | 0x34<<7 | 0x23, - 23274 - 19968: jis0212<<14 | 0x19<<7 | 0x08, - 23278 - 19968: jis0212<<14 | 0x19<<7 | 0x09, - 23285 - 19968: jis0212<<14 | 0x19<<7 | 0x0A, - 23286 - 19968: jis0212<<14 | 0x19<<7 | 0x0B, - 23290 - 19968: jis0208<<14 | 0x34<<7 | 0x25, - 23291 - 19968: jis0208<<14 | 0x34<<7 | 0x26, - 23293 - 19968: jis0212<<14 | 0x19<<7 | 0x0C, - 23296 - 19968: jis0212<<14 | 0x19<<7 | 0x0D, - 23297 - 19968: jis0212<<14 | 0x19<<7 | 0x0E, - 23304 - 19968: jis0212<<14 | 0x19<<7 | 0x0F, - 23305 - 19968: jis0208<<14 | 0x13<<7 | 0x51, - 23307 - 19968: jis0208<<14 | 0x34<<7 | 0x28, - 23308 - 19968: jis0208<<14 | 0x34<<7 | 0x27, - 23318 - 19968: jis0208<<14 | 0x34<<7 | 0x29, - 23319 - 19968: jis0212<<14 | 0x19<<7 | 0x10, - 23321 - 19968: jis0212<<14 | 0x19<<7 | 0x12, - 23323 - 19968: jis0212<<14 | 0x19<<7 | 0x13, - 23325 - 19968: jis0212<<14 | 0x19<<7 | 0x14, - 23329 - 19968: jis0212<<14 | 0x19<<7 | 0x15, - 23330 - 19968: jis0208<<14 | 0x1D<<7 | 0x4D, - 23333 - 19968: jis0212<<14 | 0x19<<7 | 0x16, - 23338 - 19968: jis0208<<14 | 0x34<<7 | 0x2C, - 23340 - 19968: jis0208<<14 | 0x23<<7 | 0x3B, - 23341 - 19968: jis0212<<14 | 0x19<<7 | 0x17, - 23344 - 19968: jis0208<<14 | 0x10<<7 | 0x24, - 23346 - 19968: jis0208<<14 | 0x34<<7 | 0x2A, - 23348 - 19968: jis0212<<14 | 0x19<<7 | 0x11, - 23350 - 19968: jis0208<<14 | 0x34<<7 | 0x2D, - 23352 - 19968: jis0212<<14 | 0x19<<7 | 0x18, - 23358 - 19968: jis0208<<14 | 0x34<<7 | 0x2E, - 23360 - 19968: jis0208<<14 | 0x34<<7 | 0x31, - 23361 - 19968: jis0212<<14 | 0x19<<7 | 0x19, - 23363 - 19968: jis0208<<14 | 0x34<<7 | 0x2F, - 23365 - 19968: jis0208<<14 | 0x34<<7 | 0x30, - 23371 - 19968: jis0212<<14 | 0x19<<7 | 0x1A, - 23372 - 19968: jis0212<<14 | 0x19<<7 | 0x1B, - 23376 - 19968: jis0208<<14 | 0x1A<<7 | 0x31, - 23377 - 19968: jis0208<<14 | 0x34<<7 | 0x32, - 23378 - 19968: jis0212<<14 | 0x19<<7 | 0x1C, - 23380 - 19968: jis0208<<14 | 0x18<<7 | 0x05, - 23381 - 19968: jis0208<<14 | 0x34<<7 | 0x33, - 23382 - 19968: jis0208<<14 | 0x58<<7 | 0x49, - 23383 - 19968: jis0208<<14 | 0x1A<<7 | 0x59, - 23384 - 19968: jis0208<<14 | 0x21<<7 | 0x17, - 23386 - 19968: jis0208<<14 | 0x34<<7 | 0x34, - 23387 - 19968: jis0208<<14 | 0x34<<7 | 0x35, - 23388 - 19968: jis0208<<14 | 0x1A<<7 | 0x39, - 23389 - 19968: jis0208<<14 | 0x18<<7 | 0x06, - 23390 - 19968: jis0212<<14 | 0x19<<7 | 0x1E, - 23391 - 19968: jis0208<<14 | 0x2B<<7 | 0x31, - 23395 - 19968: jis0208<<14 | 0x14<<7 | 0x07, - 23396 - 19968: jis0208<<14 | 0x17<<7 | 0x28, - 23397 - 19968: jis0208<<14 | 0x34<<7 | 0x36, - 23398 - 19968: jis0208<<14 | 0x12<<7 | 0x37, - 23400 - 19968: jis0212<<14 | 0x19<<7 | 0x1F, - 23401 - 19968: jis0208<<14 | 0x34<<7 | 0x37, - 23403 - 19968: jis0208<<14 | 0x21<<7 | 0x18, - 23406 - 19968: jis0212<<14 | 0x19<<7 | 0x20, - 23407 - 19968: jis0212<<14 | 0x19<<7 | 0x21, - 23408 - 19968: jis0208<<14 | 0x34<<7 | 0x38, - 23409 - 19968: jis0208<<14 | 0x35<<7 | 0x02, - 23411 - 19968: jis0208<<14 | 0x34<<7 | 0x39, - 23413 - 19968: jis0208<<14 | 0x34<<7 | 0x3A, - 23416 - 19968: jis0208<<14 | 0x34<<7 | 0x3B, - 23418 - 19968: jis0208<<14 | 0x34<<7 | 0x3D, - 23420 - 19968: jis0212<<14 | 0x19<<7 | 0x22, - 23421 - 19968: jis0212<<14 | 0x19<<7 | 0x23, - 23422 - 19968: jis0212<<14 | 0x19<<7 | 0x24, - 23423 - 19968: jis0212<<14 | 0x19<<7 | 0x25, - 23424 - 19968: jis0208<<14 | 0x34<<7 | 0x3E, - 23425 - 19968: jis0212<<14 | 0x19<<7 | 0x26, - 23427 - 19968: jis0208<<14 | 0x34<<7 | 0x3F, - 23428 - 19968: jis0212<<14 | 0x19<<7 | 0x27, - 23429 - 19968: jis0208<<14 | 0x21<<7 | 0x4F, - 23430 - 19968: jis0212<<14 | 0x19<<7 | 0x28, - 23431 - 19968: jis0208<<14 | 0x10<<7 | 0x06, - 23432 - 19968: jis0208<<14 | 0x1B<<7 | 0x48, - 23433 - 19968: jis0208<<14 | 0x0F<<7 | 0x21, - 23434 - 19968: jis0212<<14 | 0x19<<7 | 0x29, - 23435 - 19968: jis0208<<14 | 0x20<<7 | 0x36, - 23436 - 19968: jis0208<<14 | 0x13<<7 | 0x0F, - 23437 - 19968: jis0208<<14 | 0x1B<<7 | 0x14, - 23438 - 19968: jis0212<<14 | 0x19<<7 | 0x2A, - 23439 - 19968: jis0208<<14 | 0x18<<7 | 0x07, - 23440 - 19968: jis0212<<14 | 0x19<<7 | 0x2B, - 23441 - 19968: jis0212<<14 | 0x19<<7 | 0x2C, - 23443 - 19968: jis0212<<14 | 0x19<<7 | 0x2D, - 23444 - 19968: jis0212<<14 | 0x19<<7 | 0x2E, - 23445 - 19968: jis0208<<14 | 0x24<<7 | 0x45, - 23446 - 19968: jis0212<<14 | 0x19<<7 | 0x2F, - 23447 - 19968: jis0208<<14 | 0x1C<<7 | 0x00, - 23448 - 19968: jis0208<<14 | 0x13<<7 | 0x10, - 23449 - 19968: jis0208<<14 | 0x22<<7 | 0x47, - 23450 - 19968: jis0208<<14 | 0x23<<7 | 0x49, - 23451 - 19968: jis0208<<14 | 0x0F<<7 | 0x17, - 23452 - 19968: jis0208<<14 | 0x14<<7 | 0x18, - 23453 - 19968: jis0208<<14 | 0x29<<7 | 0x54, - 23455 - 19968: jis0208<<14 | 0x1B<<7 | 0x21, - 23458 - 19968: jis0208<<14 | 0x14<<7 | 0x31, - 23459 - 19968: jis0208<<14 | 0x1F<<7 | 0x4A, - 23460 - 19968: jis0208<<14 | 0x1B<<7 | 0x1B, - 23461 - 19968: jis0208<<14 | 0x2C<<7 | 0x07, - 23462 - 19968: jis0208<<14 | 0x34<<7 | 0x40, - 23464 - 19968: jis0212<<14 | 0x19<<7 | 0x30, - 23465 - 19968: jis0212<<14 | 0x19<<7 | 0x31, - 23468 - 19968: jis0212<<14 | 0x19<<7 | 0x32, - 23469 - 19968: jis0212<<14 | 0x19<<7 | 0x33, - 23470 - 19968: jis0208<<14 | 0x14<<7 | 0x3B, - 23471 - 19968: jis0212<<14 | 0x19<<7 | 0x34, - 23472 - 19968: jis0208<<14 | 0x19<<7 | 0x2A, - 23473 - 19968: jis0212<<14 | 0x19<<7 | 0x35, - 23474 - 19968: jis0212<<14 | 0x19<<7 | 0x36, - 23475 - 19968: jis0208<<14 | 0x12<<7 | 0x11, - 23476 - 19968: jis0208<<14 | 0x10<<7 | 0x42, - 23477 - 19968: jis0208<<14 | 0x1D<<7 | 0x0B, - 23478 - 19968: jis0208<<14 | 0x11<<7 | 0x27, - 23479 - 19968: jis0212<<14 | 0x19<<7 | 0x37, - 23480 - 19968: jis0208<<14 | 0x34<<7 | 0x41, - 23481 - 19968: jis0208<<14 | 0x2C<<7 | 0x25, - 23482 - 19968: jis0212<<14 | 0x19<<7 | 0x38, - 23484 - 19968: jis0212<<14 | 0x19<<7 | 0x39, - 23487 - 19968: jis0208<<14 | 0x1C<<7 | 0x28, - 23488 - 19968: jis0208<<14 | 0x58<<7 | 0x4A, - 23489 - 19968: jis0212<<14 | 0x19<<7 | 0x3B, - 23490 - 19968: jis0208<<14 | 0x1B<<7 | 0x43, - 23491 - 19968: jis0208<<14 | 0x34<<7 | 0x42, - 23492 - 19968: jis0208<<14 | 0x13<<7 | 0x52, - 23493 - 19968: jis0208<<14 | 0x25<<7 | 0x31, - 23494 - 19968: jis0208<<14 | 0x2B<<7 | 0x08, - 23495 - 19968: jis0208<<14 | 0x34<<7 | 0x43, - 23497 - 19968: jis0208<<14 | 0x34<<7 | 0x44, - 23500 - 19968: jis0208<<14 | 0x28<<7 | 0x38, - 23501 - 19968: jis0212<<14 | 0x19<<7 | 0x3C, - 23503 - 19968: jis0212<<14 | 0x19<<7 | 0x3D, - 23504 - 19968: jis0208<<14 | 0x34<<7 | 0x46, - 23506 - 19968: jis0208<<14 | 0x13<<7 | 0x07, - 23507 - 19968: jis0208<<14 | 0x15<<7 | 0x56, - 23508 - 19968: jis0208<<14 | 0x34<<7 | 0x45, - 23510 - 19968: jis0212<<14 | 0x19<<7 | 0x3E, - 23511 - 19968: jis0212<<14 | 0x19<<7 | 0x3F, - 23512 - 19968: jis0208<<14 | 0x58<<7 | 0x4C, - 23513 - 19968: jis0212<<14 | 0x19<<7 | 0x41, - 23514 - 19968: jis0212<<14 | 0x19<<7 | 0x42, - 23515 - 19968: jis0208<<14 | 0x13<<7 | 0x11, - 23517 - 19968: jis0208<<14 | 0x1E<<7 | 0x11, - 23518 - 19968: jis0208<<14 | 0x34<<7 | 0x4A, - 23519 - 19968: jis0208<<14 | 0x1A<<7 | 0x00, - 23520 - 19968: jis0212<<14 | 0x19<<7 | 0x43, - 23521 - 19968: jis0208<<14 | 0x11<<7 | 0x28, - 23522 - 19968: jis0208<<14 | 0x34<<7 | 0x49, - 23524 - 19968: jis0208<<14 | 0x34<<7 | 0x47, - 23525 - 19968: jis0208<<14 | 0x34<<7 | 0x4B, - 23526 - 19968: jis0208<<14 | 0x34<<7 | 0x48, - 23527 - 19968: jis0208<<14 | 0x26<<7 | 0x0A, - 23528 - 19968: jis0208<<14 | 0x3B<<7 | 0x2C, - 23529 - 19968: jis0208<<14 | 0x1E<<7 | 0x12, - 23531 - 19968: jis0208<<14 | 0x34<<7 | 0x4C, - 23532 - 19968: jis0208<<14 | 0x58<<7 | 0x4D, - 23534 - 19968: jis0208<<14 | 0x2D<<7 | 0x1F, - 23535 - 19968: jis0212<<14 | 0x19<<7 | 0x44, - 23536 - 19968: jis0208<<14 | 0x34<<7 | 0x4D, - 23537 - 19968: jis0212<<14 | 0x19<<7 | 0x45, - 23539 - 19968: jis0208<<14 | 0x34<<7 | 0x4F, - 23540 - 19968: jis0212<<14 | 0x19<<7 | 0x46, - 23541 - 19968: jis0208<<14 | 0x22<<7 | 0x5D, - 23542 - 19968: jis0208<<14 | 0x34<<7 | 0x4E, - 23544 - 19968: jis0208<<14 | 0x1F<<7 | 0x02, - 23546 - 19968: jis0208<<14 | 0x1A<<7 | 0x5A, - 23549 - 19968: jis0212<<14 | 0x19<<7 | 0x47, - 23550 - 19968: jis0208<<14 | 0x21<<7 | 0x2F, - 23551 - 19968: jis0208<<14 | 0x1B<<7 | 0x56, - 23553 - 19968: jis0208<<14 | 0x28<<7 | 0x54, - 23554 - 19968: jis0208<<14 | 0x1F<<7 | 0x4B, - 23556 - 19968: jis0208<<14 | 0x1B<<7 | 0x2C, - 23557 - 19968: jis0208<<14 | 0x34<<7 | 0x50, - 23558 - 19968: jis0208<<14 | 0x1D<<7 | 0x0C, - 23559 - 19968: jis0208<<14 | 0x34<<7 | 0x51, - 23560 - 19968: jis0208<<14 | 0x34<<7 | 0x52, - 23561 - 19968: jis0208<<14 | 0x0F<<7 | 0x32, - 23562 - 19968: jis0208<<14 | 0x21<<7 | 0x19, - 23563 - 19968: jis0208<<14 | 0x1E<<7 | 0x31, - 23564 - 19968: jis0212<<14 | 0x19<<7 | 0x48, - 23565 - 19968: jis0208<<14 | 0x34<<7 | 0x53, - 23566 - 19968: jis0208<<14 | 0x25<<7 | 0x12, - 23567 - 19968: jis0208<<14 | 0x1D<<7 | 0x0D, - 23569 - 19968: jis0208<<14 | 0x1D<<7 | 0x0E, - 23571 - 19968: jis0208<<14 | 0x34<<7 | 0x54, - 23574 - 19968: jis0208<<14 | 0x1F<<7 | 0x4C, - 23575 - 19968: jis0212<<14 | 0x19<<7 | 0x49, - 23578 - 19968: jis0208<<14 | 0x1D<<7 | 0x0F, - 23582 - 19968: jis0208<<14 | 0x58<<7 | 0x4E, - 23583 - 19968: jis0212<<14 | 0x19<<7 | 0x4B, - 23584 - 19968: jis0208<<14 | 0x34<<7 | 0x55, - 23586 - 19968: jis0208<<14 | 0x34<<7 | 0x56, - 23587 - 19968: jis0212<<14 | 0x19<<7 | 0x4C, - 23588 - 19968: jis0208<<14 | 0x2B<<7 | 0x3F, - 23590 - 19968: jis0212<<14 | 0x19<<7 | 0x4D, - 23592 - 19968: jis0208<<14 | 0x34<<7 | 0x57, - 23593 - 19968: jis0212<<14 | 0x19<<7 | 0x4E, - 23595 - 19968: jis0212<<14 | 0x19<<7 | 0x4F, - 23596 - 19968: jis0212<<14 | 0x19<<7 | 0x50, - 23597 - 19968: jis0208<<14 | 0x15<<7 | 0x25, - 23598 - 19968: jis0212<<14 | 0x19<<7 | 0x51, - 23600 - 19968: jis0212<<14 | 0x19<<7 | 0x52, - 23601 - 19968: jis0208<<14 | 0x1C<<7 | 0x01, - 23602 - 19968: jis0212<<14 | 0x19<<7 | 0x53, - 23605 - 19968: jis0212<<14 | 0x19<<7 | 0x54, - 23606 - 19968: jis0212<<14 | 0x19<<7 | 0x55, - 23608 - 19968: jis0208<<14 | 0x34<<7 | 0x58, - 23609 - 19968: jis0208<<14 | 0x34<<7 | 0x59, - 23610 - 19968: jis0208<<14 | 0x1B<<7 | 0x3B, - 23611 - 19968: jis0208<<14 | 0x1E<<7 | 0x0B, - 23612 - 19968: jis0208<<14 | 0x25<<7 | 0x53, - 23613 - 19968: jis0208<<14 | 0x1E<<7 | 0x33, - 23614 - 19968: jis0208<<14 | 0x27<<7 | 0x57, - 23615 - 19968: jis0208<<14 | 0x26<<7 | 0x01, - 23616 - 19968: jis0208<<14 | 0x15<<7 | 0x28, - 23617 - 19968: jis0208<<14 | 0x34<<7 | 0x5A, - 23621 - 19968: jis0208<<14 | 0x14<<7 | 0x4E, - 23622 - 19968: jis0208<<14 | 0x34<<7 | 0x5B, - 23624 - 19968: jis0208<<14 | 0x15<<7 | 0x5D, - 23626 - 19968: jis0208<<14 | 0x25<<7 | 0x2E, - 23627 - 19968: jis0208<<14 | 0x11<<7 | 0x0F, - 23629 - 19968: jis0208<<14 | 0x1A<<7 | 0x32, - 23630 - 19968: jis0208<<14 | 0x34<<7 | 0x5C, - 23631 - 19968: jis0208<<14 | 0x35<<7 | 0x01, - 23632 - 19968: jis0208<<14 | 0x35<<7 | 0x00, - 23633 - 19968: jis0208<<14 | 0x15<<7 | 0x5C, - 23635 - 19968: jis0208<<14 | 0x34<<7 | 0x5D, - 23637 - 19968: jis0208<<14 | 0x24<<7 | 0x17, - 23641 - 19968: jis0212<<14 | 0x19<<7 | 0x56, - 23642 - 19968: jis0212<<14 | 0x19<<7 | 0x57, - 23644 - 19968: jis0212<<14 | 0x19<<7 | 0x58, - 23646 - 19968: jis0208<<14 | 0x21<<7 | 0x0F, - 23648 - 19968: jis0208<<14 | 0x24<<7 | 0x2A, - 23649 - 19968: jis0208<<14 | 0x1B<<7 | 0x27, - 23650 - 19968: jis0212<<14 | 0x19<<7 | 0x59, - 23651 - 19968: jis0212<<14 | 0x19<<7 | 0x5A, - 23652 - 19968: jis0208<<14 | 0x20<<7 | 0x37, - 23653 - 19968: jis0208<<14 | 0x2C<<7 | 0x59, - 23655 - 19968: jis0212<<14 | 0x19<<7 | 0x5B, - 23656 - 19968: jis0212<<14 | 0x19<<7 | 0x5C, - 23657 - 19968: jis0212<<14 | 0x19<<7 | 0x5D, - 23660 - 19968: jis0208<<14 | 0x35<<7 | 0x03, - 23661 - 19968: jis0212<<14 | 0x1A<<7 | 0x00, - 23662 - 19968: jis0208<<14 | 0x35<<7 | 0x04, - 23663 - 19968: jis0208<<14 | 0x25<<7 | 0x35, - 23664 - 19968: jis0212<<14 | 0x1A<<7 | 0x01, - 23665 - 19968: jis0208<<14 | 0x1A<<7 | 0x12, - 23668 - 19968: jis0212<<14 | 0x1A<<7 | 0x02, - 23669 - 19968: jis0212<<14 | 0x1A<<7 | 0x03, - 23670 - 19968: jis0208<<14 | 0x35<<7 | 0x06, - 23673 - 19968: jis0208<<14 | 0x35<<7 | 0x07, - 23674 - 19968: jis0212<<14 | 0x1A<<7 | 0x04, - 23675 - 19968: jis0212<<14 | 0x1A<<7 | 0x05, - 23676 - 19968: jis0212<<14 | 0x1A<<7 | 0x06, - 23677 - 19968: jis0212<<14 | 0x1A<<7 | 0x07, - 23687 - 19968: jis0212<<14 | 0x1A<<7 | 0x08, - 23688 - 19968: jis0212<<14 | 0x1A<<7 | 0x09, - 23690 - 19968: jis0212<<14 | 0x1A<<7 | 0x0A, - 23692 - 19968: jis0208<<14 | 0x35<<7 | 0x08, - 23695 - 19968: jis0212<<14 | 0x1A<<7 | 0x0B, - 23696 - 19968: jis0208<<14 | 0x13<<7 | 0x53, - 23697 - 19968: jis0208<<14 | 0x35<<7 | 0x09, - 23698 - 19968: jis0212<<14 | 0x1A<<7 | 0x0C, - 23700 - 19968: jis0208<<14 | 0x35<<7 | 0x0A, - 23709 - 19968: jis0212<<14 | 0x1A<<7 | 0x0D, - 23711 - 19968: jis0212<<14 | 0x1A<<7 | 0x0E, - 23712 - 19968: jis0212<<14 | 0x1A<<7 | 0x0F, - 23713 - 19968: jis0208<<14 | 0x11<<7 | 0x0B, - 23714 - 19968: jis0212<<14 | 0x1A<<7 | 0x10, - 23715 - 19968: jis0212<<14 | 0x1A<<7 | 0x11, - 23718 - 19968: jis0208<<14 | 0x58<<7 | 0x4F, - 23720 - 19968: jis0208<<14 | 0x20<<7 | 0x1A, - 23721 - 19968: jis0208<<14 | 0x13<<7 | 0x43, - 23722 - 19968: jis0212<<14 | 0x1A<<7 | 0x13, - 23723 - 19968: jis0208<<14 | 0x35<<7 | 0x0C, - 23724 - 19968: jis0208<<14 | 0x2B<<7 | 0x07, - 23729 - 19968: jis0208<<14 | 0x21<<7 | 0x31, - 23730 - 19968: jis0212<<14 | 0x1A<<7 | 0x14, - 23731 - 19968: jis0208<<14 | 0x12<<7 | 0x38, - 23732 - 19968: jis0212<<14 | 0x1A<<7 | 0x15, - 23733 - 19968: jis0212<<14 | 0x1A<<7 | 0x16, - 23734 - 19968: jis0208<<14 | 0x35<<7 | 0x0E, - 23735 - 19968: jis0208<<14 | 0x35<<7 | 0x10, - 23736 - 19968: jis0208<<14 | 0x13<<7 | 0x3E, - 23738 - 19968: jis0208<<14 | 0x58<<7 | 0x50, - 23739 - 19968: jis0208<<14 | 0x35<<7 | 0x0D, - 23740 - 19968: jis0208<<14 | 0x35<<7 | 0x0F, - 23742 - 19968: jis0208<<14 | 0x35<<7 | 0x12, - 23749 - 19968: jis0208<<14 | 0x35<<7 | 0x11, - 23751 - 19968: jis0208<<14 | 0x35<<7 | 0x13, - 23753 - 19968: jis0212<<14 | 0x1A<<7 | 0x18, - 23755 - 19968: jis0212<<14 | 0x1A<<7 | 0x19, - 23762 - 19968: jis0212<<14 | 0x1A<<7 | 0x1A, - 23767 - 19968: jis0212<<14 | 0x1A<<7 | 0x1C, - 23769 - 19968: jis0208<<14 | 0x35<<7 | 0x14, - 23773 - 19968: jis0212<<14 | 0x1A<<7 | 0x1B, - 23776 - 19968: jis0208<<14 | 0x25<<7 | 0x1C, - 23777 - 19968: jis0208<<14 | 0x15<<7 | 0x0D, - 23784 - 19968: jis0208<<14 | 0x11<<7 | 0x44, - 23785 - 19968: jis0208<<14 | 0x35<<7 | 0x15, - 23786 - 19968: jis0208<<14 | 0x35<<7 | 0x1A, - 23789 - 19968: jis0208<<14 | 0x35<<7 | 0x18, - 23790 - 19968: jis0212<<14 | 0x1A<<7 | 0x1D, - 23791 - 19968: jis0208<<14 | 0x29<<7 | 0x56, - 23792 - 19968: jis0208<<14 | 0x29<<7 | 0x55, - 23793 - 19968: jis0212<<14 | 0x1A<<7 | 0x1E, - 23794 - 19968: jis0212<<14 | 0x1A<<7 | 0x1F, - 23796 - 19968: jis0212<<14 | 0x1A<<7 | 0x20, - 23797 - 19968: jis0208<<14 | 0x58<<7 | 0x51, - 23798 - 19968: jis0208<<14 | 0x24<<7 | 0x46, - 23802 - 19968: jis0208<<14 | 0x35<<7 | 0x17, - 23803 - 19968: jis0208<<14 | 0x1C<<7 | 0x33, - 23805 - 19968: jis0208<<14 | 0x35<<7 | 0x16, - 23809 - 19968: jis0212<<14 | 0x1A<<7 | 0x21, - 23814 - 19968: jis0212<<14 | 0x1A<<7 | 0x22, - 23815 - 19968: jis0208<<14 | 0x1E<<7 | 0x51, - 23819 - 19968: jis0208<<14 | 0x35<<7 | 0x1B, - 23821 - 19968: jis0212<<14 | 0x1A<<7 | 0x23, - 23822 - 19968: jis0208<<14 | 0x19<<7 | 0x49, - 23825 - 19968: jis0208<<14 | 0x35<<7 | 0x21, - 23826 - 19968: jis0212<<14 | 0x1A<<7 | 0x24, - 23828 - 19968: jis0208<<14 | 0x35<<7 | 0x22, - 23829 - 19968: jis0208<<14 | 0x35<<7 | 0x1C, - 23830 - 19968: jis0208<<14 | 0x12<<7 | 0x12, - 23831 - 19968: jis0208<<14 | 0x35<<7 | 0x1D, - 23832 - 19968: jis0208<<14 | 0x35<<7 | 0x26, - 23833 - 19968: jis0208<<14 | 0x35<<7 | 0x25, - 23834 - 19968: jis0208<<14 | 0x35<<7 | 0x24, - 23835 - 19968: jis0208<<14 | 0x35<<7 | 0x20, - 23839 - 19968: jis0208<<14 | 0x35<<7 | 0x1F, - 23842 - 19968: jis0208<<14 | 0x35<<7 | 0x23, - 23843 - 19968: jis0212<<14 | 0x1A<<7 | 0x26, - 23844 - 19968: jis0212<<14 | 0x1A<<7 | 0x27, - 23846 - 19968: jis0212<<14 | 0x1A<<7 | 0x28, - 23847 - 19968: jis0208<<14 | 0x58<<7 | 0x52, - 23849 - 19968: jis0208<<14 | 0x29<<7 | 0x57, - 23851 - 19968: jis0212<<14 | 0x1A<<7 | 0x25, - 23857 - 19968: jis0212<<14 | 0x1A<<7 | 0x2A, - 23860 - 19968: jis0212<<14 | 0x1A<<7 | 0x2B, - 23865 - 19968: jis0212<<14 | 0x1A<<7 | 0x2C, - 23869 - 19968: jis0212<<14 | 0x1A<<7 | 0x2D, - 23871 - 19968: jis0212<<14 | 0x1A<<7 | 0x2E, - 23874 - 19968: jis0208<<14 | 0x58<<7 | 0x55, - 23875 - 19968: jis0212<<14 | 0x1A<<7 | 0x30, - 23878 - 19968: jis0212<<14 | 0x1A<<7 | 0x31, - 23880 - 19968: jis0212<<14 | 0x1A<<7 | 0x32, - 23882 - 19968: jis0212<<14 | 0x1A<<7 | 0x36, - 23883 - 19968: jis0208<<14 | 0x35<<7 | 0x2A, - 23884 - 19968: jis0208<<14 | 0x35<<7 | 0x27, - 23886 - 19968: jis0208<<14 | 0x35<<7 | 0x29, - 23888 - 19968: jis0208<<14 | 0x2C<<7 | 0x51, - 23889 - 19968: jis0212<<14 | 0x1A<<7 | 0x34, - 23890 - 19968: jis0208<<14 | 0x35<<7 | 0x28, - 23891 - 19968: jis0208<<14 | 0x58<<7 | 0x53, - 23893 - 19968: jis0212<<14 | 0x1A<<7 | 0x33, - 23897 - 19968: jis0212<<14 | 0x1A<<7 | 0x35, - 23900 - 19968: jis0208<<14 | 0x35<<7 | 0x1E, - 23903 - 19968: jis0212<<14 | 0x1A<<7 | 0x37, - 23904 - 19968: jis0212<<14 | 0x1A<<7 | 0x38, - 23905 - 19968: jis0212<<14 | 0x1A<<7 | 0x39, - 23906 - 19968: jis0212<<14 | 0x1A<<7 | 0x3A, - 23908 - 19968: jis0212<<14 | 0x1A<<7 | 0x3B, - 23913 - 19968: jis0208<<14 | 0x1E<<7 | 0x52, - 23914 - 19968: jis0212<<14 | 0x1A<<7 | 0x3C, - 23916 - 19968: jis0208<<14 | 0x35<<7 | 0x2B, - 23917 - 19968: jis0208<<14 | 0x58<<7 | 0x56, - 23919 - 19968: jis0208<<14 | 0x19<<7 | 0x16, - 23920 - 19968: jis0212<<14 | 0x1A<<7 | 0x3E, - 23923 - 19968: jis0208<<14 | 0x35<<7 | 0x2C, - 23926 - 19968: jis0208<<14 | 0x35<<7 | 0x2D, - 23929 - 19968: jis0212<<14 | 0x1A<<7 | 0x3F, - 23930 - 19968: jis0212<<14 | 0x1A<<7 | 0x40, - 23934 - 19968: jis0212<<14 | 0x1A<<7 | 0x41, - 23935 - 19968: jis0212<<14 | 0x1A<<7 | 0x42, - 23937 - 19968: jis0212<<14 | 0x1A<<7 | 0x43, - 23938 - 19968: jis0208<<14 | 0x35<<7 | 0x30, - 23939 - 19968: jis0212<<14 | 0x1A<<7 | 0x44, - 23940 - 19968: jis0208<<14 | 0x35<<7 | 0x2F, - 23943 - 19968: jis0208<<14 | 0x35<<7 | 0x2E, - 23944 - 19968: jis0212<<14 | 0x1A<<7 | 0x45, - 23946 - 19968: jis0212<<14 | 0x1A<<7 | 0x46, - 23947 - 19968: jis0208<<14 | 0x24<<7 | 0x47, - 23948 - 19968: jis0208<<14 | 0x35<<7 | 0x19, - 23952 - 19968: jis0208<<14 | 0x35<<7 | 0x36, - 23954 - 19968: jis0212<<14 | 0x1A<<7 | 0x47, - 23955 - 19968: jis0212<<14 | 0x1A<<7 | 0x48, - 23956 - 19968: jis0212<<14 | 0x1A<<7 | 0x49, - 23957 - 19968: jis0212<<14 | 0x1A<<7 | 0x4A, - 23961 - 19968: jis0212<<14 | 0x1A<<7 | 0x4B, - 23963 - 19968: jis0212<<14 | 0x1A<<7 | 0x4C, - 23965 - 19968: jis0208<<14 | 0x35<<7 | 0x32, - 23967 - 19968: jis0212<<14 | 0x1A<<7 | 0x4D, - 23968 - 19968: jis0212<<14 | 0x1A<<7 | 0x4E, - 23970 - 19968: jis0208<<14 | 0x35<<7 | 0x31, - 23975 - 19968: jis0212<<14 | 0x1A<<7 | 0x4F, - 23979 - 19968: jis0212<<14 | 0x1A<<7 | 0x50, - 23980 - 19968: jis0208<<14 | 0x35<<7 | 0x33, - 23982 - 19968: jis0208<<14 | 0x35<<7 | 0x34, - 23984 - 19968: jis0212<<14 | 0x1A<<7 | 0x51, - 23986 - 19968: jis0212<<14 | 0x45<<7 | 0x53, - 23988 - 19968: jis0212<<14 | 0x1A<<7 | 0x52, - 23991 - 19968: jis0208<<14 | 0x35<<7 | 0x37, - 23992 - 19968: jis0208<<14 | 0x58<<7 | 0x57, - 23993 - 19968: jis0208<<14 | 0x58<<7 | 0x58, - 23994 - 19968: jis0208<<14 | 0x2D<<7 | 0x45, - 23996 - 19968: jis0208<<14 | 0x35<<7 | 0x38, - 23997 - 19968: jis0208<<14 | 0x35<<7 | 0x35, - 24003 - 19968: jis0212<<14 | 0x1A<<7 | 0x55, - 24007 - 19968: jis0212<<14 | 0x1A<<7 | 0x56, - 24009 - 19968: jis0208<<14 | 0x35<<7 | 0x39, - 24011 - 19968: jis0212<<14 | 0x1A<<7 | 0x57, - 24012 - 19968: jis0208<<14 | 0x13<<7 | 0x3F, - 24013 - 19968: jis0208<<14 | 0x35<<7 | 0x3A, - 24014 - 19968: jis0212<<14 | 0x1A<<7 | 0x59, - 24016 - 19968: jis0208<<14 | 0x58<<7 | 0x59, - 24018 - 19968: jis0208<<14 | 0x35<<7 | 0x3C, - 24019 - 19968: jis0208<<14 | 0x35<<7 | 0x3B, - 24022 - 19968: jis0208<<14 | 0x35<<7 | 0x3D, - 24024 - 19968: jis0212<<14 | 0x1A<<7 | 0x5A, - 24025 - 19968: jis0212<<14 | 0x1A<<7 | 0x5B, - 24027 - 19968: jis0208<<14 | 0x35<<7 | 0x3E, - 24029 - 19968: jis0208<<14 | 0x1F<<7 | 0x4D, - 24030 - 19968: jis0208<<14 | 0x1C<<7 | 0x02, - 24032 - 19968: jis0212<<14 | 0x1A<<7 | 0x5C, - 24033 - 19968: jis0208<<14 | 0x1C<<7 | 0x43, - 24035 - 19968: jis0208<<14 | 0x20<<7 | 0x42, - 24036 - 19968: jis0212<<14 | 0x1A<<7 | 0x5D, - 24037 - 19968: jis0208<<14 | 0x18<<7 | 0x08, - 24038 - 19968: jis0208<<14 | 0x19<<7 | 0x17, - 24039 - 19968: jis0208<<14 | 0x18<<7 | 0x09, - 24040 - 19968: jis0208<<14 | 0x14<<7 | 0x4F, - 24041 - 19968: jis0212<<14 | 0x1B<<7 | 0x00, - 24043 - 19968: jis0208<<14 | 0x35<<7 | 0x3F, - 24046 - 19968: jis0208<<14 | 0x19<<7 | 0x18, - 24049 - 19968: jis0208<<14 | 0x17<<7 | 0x29, - 24050 - 19968: jis0208<<14 | 0x35<<7 | 0x40, - 24051 - 19968: jis0208<<14 | 0x2B<<7 | 0x05, - 24052 - 19968: jis0208<<14 | 0x26<<7 | 0x22, - 24053 - 19968: jis0208<<14 | 0x35<<7 | 0x41, - 24055 - 19968: jis0208<<14 | 0x18<<7 | 0x0A, - 24056 - 19968: jis0212<<14 | 0x1B<<7 | 0x01, - 24057 - 19968: jis0212<<14 | 0x1B<<7 | 0x02, - 24059 - 19968: jis0208<<14 | 0x13<<7 | 0x0B, - 24061 - 19968: jis0208<<14 | 0x22<<7 | 0x06, - 24062 - 19968: jis0208<<14 | 0x15<<7 | 0x31, - 24064 - 19968: jis0212<<14 | 0x1B<<7 | 0x03, - 24066 - 19968: jis0208<<14 | 0x1A<<7 | 0x33, - 24067 - 19968: jis0208<<14 | 0x28<<7 | 0x3A, - 24070 - 19968: jis0208<<14 | 0x27<<7 | 0x20, - 24071 - 19968: jis0212<<14 | 0x1B<<7 | 0x04, - 24075 - 19968: jis0208<<14 | 0x35<<7 | 0x42, - 24076 - 19968: jis0208<<14 | 0x13<<7 | 0x54, - 24077 - 19968: jis0212<<14 | 0x1B<<7 | 0x05, - 24081 - 19968: jis0208<<14 | 0x35<<7 | 0x45, - 24082 - 19968: jis0212<<14 | 0x1B<<7 | 0x06, - 24084 - 19968: jis0212<<14 | 0x1B<<7 | 0x07, - 24085 - 19968: jis0212<<14 | 0x1B<<7 | 0x08, - 24086 - 19968: jis0208<<14 | 0x23<<7 | 0x00, - 24088 - 19968: jis0212<<14 | 0x1B<<7 | 0x09, - 24089 - 19968: jis0208<<14 | 0x35<<7 | 0x44, - 24090 - 19968: jis0208<<14 | 0x35<<7 | 0x43, - 24091 - 19968: jis0208<<14 | 0x35<<7 | 0x46, - 24093 - 19968: jis0208<<14 | 0x23<<7 | 0x4A, - 24095 - 19968: jis0212<<14 | 0x1B<<7 | 0x0A, - 24096 - 19968: jis0212<<14 | 0x1B<<7 | 0x0B, - 24101 - 19968: jis0208<<14 | 0x1E<<7 | 0x42, - 24104 - 19968: jis0212<<14 | 0x1B<<7 | 0x0D, - 24107 - 19968: jis0208<<14 | 0x1A<<7 | 0x34, - 24109 - 19968: jis0208<<14 | 0x1F<<7 | 0x29, - 24110 - 19968: jis0212<<14 | 0x1B<<7 | 0x0C, - 24111 - 19968: jis0208<<14 | 0x21<<7 | 0x32, - 24112 - 19968: jis0208<<14 | 0x14<<7 | 0x01, - 24114 - 19968: jis0212<<14 | 0x1B<<7 | 0x0E, - 24115 - 19968: jis0208<<14 | 0x23<<7 | 0x01, - 24117 - 19968: jis0212<<14 | 0x1B<<7 | 0x0F, - 24118 - 19968: jis0208<<14 | 0x35<<7 | 0x47, - 24119 - 19968: jis0208<<14 | 0x35<<7 | 0x48, - 24120 - 19968: jis0208<<14 | 0x1D<<7 | 0x4E, - 24125 - 19968: jis0208<<14 | 0x2A<<7 | 0x18, - 24126 - 19968: jis0212<<14 | 0x1B<<7 | 0x10, - 24128 - 19968: jis0208<<14 | 0x35<<7 | 0x4B, - 24131 - 19968: jis0208<<14 | 0x35<<7 | 0x4A, - 24132 - 19968: jis0208<<14 | 0x35<<7 | 0x49, - 24133 - 19968: jis0208<<14 | 0x28<<7 | 0x5C, - 24135 - 19968: jis0208<<14 | 0x35<<7 | 0x52, - 24137 - 19968: jis0212<<14 | 0x1B<<7 | 0x13, - 24139 - 19968: jis0212<<14 | 0x1B<<7 | 0x11, - 24140 - 19968: jis0208<<14 | 0x2A<<7 | 0x39, - 24142 - 19968: jis0208<<14 | 0x35<<7 | 0x4C, - 24144 - 19968: jis0212<<14 | 0x1B<<7 | 0x12, - 24145 - 19968: jis0212<<14 | 0x1B<<7 | 0x14, - 24148 - 19968: jis0208<<14 | 0x35<<7 | 0x4E, - 24149 - 19968: jis0208<<14 | 0x2A<<7 | 0x4A, - 24150 - 19968: jis0212<<14 | 0x1B<<7 | 0x15, - 24151 - 19968: jis0208<<14 | 0x35<<7 | 0x4D, - 24152 - 19968: jis0212<<14 | 0x1B<<7 | 0x16, - 24155 - 19968: jis0212<<14 | 0x1B<<7 | 0x17, - 24156 - 19968: jis0212<<14 | 0x1B<<7 | 0x18, - 24158 - 19968: jis0212<<14 | 0x1B<<7 | 0x19, - 24159 - 19968: jis0208<<14 | 0x35<<7 | 0x4F, - 24161 - 19968: jis0208<<14 | 0x27<<7 | 0x07, - 24162 - 19968: jis0208<<14 | 0x35<<7 | 0x50, - 24163 - 19968: jis0208<<14 | 0x29<<7 | 0x1D, - 24164 - 19968: jis0208<<14 | 0x35<<7 | 0x51, - 24168 - 19968: jis0212<<14 | 0x1B<<7 | 0x1A, - 24170 - 19968: jis0212<<14 | 0x1B<<7 | 0x1B, - 24171 - 19968: jis0212<<14 | 0x1B<<7 | 0x1C, - 24172 - 19968: jis0212<<14 | 0x1B<<7 | 0x1D, - 24173 - 19968: jis0212<<14 | 0x1B<<7 | 0x1E, - 24174 - 19968: jis0212<<14 | 0x1B<<7 | 0x1F, - 24176 - 19968: jis0212<<14 | 0x1B<<7 | 0x20, - 24178 - 19968: jis0208<<14 | 0x13<<7 | 0x12, - 24179 - 19968: jis0208<<14 | 0x29<<7 | 0x1E, - 24180 - 19968: jis0208<<14 | 0x26<<7 | 0x0E, - 24181 - 19968: jis0208<<14 | 0x35<<7 | 0x53, - 24182 - 19968: jis0208<<14 | 0x35<<7 | 0x54, - 24184 - 19968: jis0208<<14 | 0x18<<7 | 0x0B, - 24185 - 19968: jis0208<<14 | 0x13<<7 | 0x13, - 24186 - 19968: jis0208<<14 | 0x35<<7 | 0x55, - 24187 - 19968: jis0208<<14 | 0x17<<7 | 0x17, - 24188 - 19968: jis0208<<14 | 0x2C<<7 | 0x23, - 24189 - 19968: jis0208<<14 | 0x2C<<7 | 0x08, - 24190 - 19968: jis0208<<14 | 0x13<<7 | 0x55, - 24191 - 19968: jis0208<<14 | 0x35<<7 | 0x57, - 24192 - 19968: jis0212<<14 | 0x1B<<7 | 0x21, - 24193 - 19968: jis0208<<14 | 0x23<<7 | 0x02, - 24195 - 19968: jis0208<<14 | 0x18<<7 | 0x0C, - 24196 - 19968: jis0208<<14 | 0x1D<<7 | 0x10, - 24199 - 19968: jis0208<<14 | 0x27<<7 | 0x3E, - 24202 - 19968: jis0208<<14 | 0x1D<<7 | 0x11, - 24203 - 19968: jis0212<<14 | 0x1B<<7 | 0x22, - 24206 - 19968: jis0212<<14 | 0x1B<<7 | 0x23, - 24207 - 19968: jis0208<<14 | 0x1C<<7 | 0x57, - 24213 - 19968: jis0208<<14 | 0x23<<7 | 0x4B, - 24214 - 19968: jis0208<<14 | 0x29<<7 | 0x58, - 24215 - 19968: jis0208<<14 | 0x24<<7 | 0x18, - 24218 - 19968: jis0208<<14 | 0x18<<7 | 0x0D, - 24220 - 19968: jis0208<<14 | 0x28<<7 | 0x3B, - 24224 - 19968: jis0208<<14 | 0x35<<7 | 0x58, - 24226 - 19968: jis0212<<14 | 0x1B<<7 | 0x24, - 24228 - 19968: jis0212<<14 | 0x1B<<7 | 0x25, - 24229 - 19968: jis0212<<14 | 0x1B<<7 | 0x26, - 24230 - 19968: jis0208<<14 | 0x24<<7 | 0x38, - 24231 - 19968: jis0208<<14 | 0x19<<7 | 0x21, - 24232 - 19968: jis0212<<14 | 0x1B<<7 | 0x27, - 24234 - 19968: jis0212<<14 | 0x1B<<7 | 0x28, - 24235 - 19968: jis0208<<14 | 0x17<<7 | 0x2A, - 24236 - 19968: jis0212<<14 | 0x1B<<7 | 0x29, - 24237 - 19968: jis0208<<14 | 0x23<<7 | 0x4C, - 24241 - 19968: jis0212<<14 | 0x1B<<7 | 0x2A, - 24243 - 19968: jis0212<<14 | 0x1B<<7 | 0x2B, - 24245 - 19968: jis0208<<14 | 0x0F<<7 | 0x22, - 24246 - 19968: jis0208<<14 | 0x1C<<7 | 0x4D, - 24247 - 19968: jis0208<<14 | 0x18<<7 | 0x0E, - 24248 - 19968: jis0208<<14 | 0x2C<<7 | 0x26, - 24253 - 19968: jis0212<<14 | 0x1B<<7 | 0x2C, - 24254 - 19968: jis0212<<14 | 0x1B<<7 | 0x2D, - 24255 - 19968: jis0212<<14 | 0x1B<<7 | 0x2E, - 24257 - 19968: jis0208<<14 | 0x35<<7 | 0x59, - 24258 - 19968: jis0208<<14 | 0x35<<7 | 0x5A, - 24259 - 19968: jis0208<<14 | 0x26<<7 | 0x30, - 24262 - 19968: jis0212<<14 | 0x1B<<7 | 0x2F, - 24264 - 19968: jis0208<<14 | 0x35<<7 | 0x5B, - 24265 - 19968: jis0208<<14 | 0x2D<<7 | 0x56, - 24266 - 19968: jis0208<<14 | 0x2E<<7 | 0x0C, - 24267 - 19968: jis0212<<14 | 0x1B<<7 | 0x31, - 24268 - 19968: jis0212<<14 | 0x1B<<7 | 0x30, - 24270 - 19968: jis0212<<14 | 0x1B<<7 | 0x32, - 24271 - 19968: jis0208<<14 | 0x35<<7 | 0x5D, - 24272 - 19968: jis0208<<14 | 0x35<<7 | 0x5C, - 24273 - 19968: jis0212<<14 | 0x1B<<7 | 0x33, - 24274 - 19968: jis0212<<14 | 0x1B<<7 | 0x34, - 24275 - 19968: jis0208<<14 | 0x12<<7 | 0x26, - 24276 - 19968: jis0212<<14 | 0x1B<<7 | 0x35, - 24277 - 19968: jis0212<<14 | 0x1B<<7 | 0x36, - 24278 - 19968: jis0208<<14 | 0x36<<7 | 0x00, - 24282 - 19968: jis0208<<14 | 0x36<<7 | 0x03, - 24283 - 19968: jis0208<<14 | 0x36<<7 | 0x04, - 24284 - 19968: jis0212<<14 | 0x1B<<7 | 0x37, - 24285 - 19968: jis0208<<14 | 0x36<<7 | 0x02, - 24286 - 19968: jis0212<<14 | 0x1B<<7 | 0x38, - 24287 - 19968: jis0208<<14 | 0x28<<7 | 0x1F, - 24288 - 19968: jis0208<<14 | 0x1D<<7 | 0x12, - 24289 - 19968: jis0208<<14 | 0x36<<7 | 0x06, - 24290 - 19968: jis0208<<14 | 0x36<<7 | 0x05, - 24291 - 19968: jis0208<<14 | 0x36<<7 | 0x01, - 24293 - 19968: jis0212<<14 | 0x1B<<7 | 0x39, - 24296 - 19968: jis0208<<14 | 0x36<<7 | 0x07, - 24297 - 19968: jis0208<<14 | 0x36<<7 | 0x08, - 24299 - 19968: jis0212<<14 | 0x1B<<7 | 0x3A, - 24300 - 19968: jis0208<<14 | 0x36<<7 | 0x09, - 24304 - 19968: jis0208<<14 | 0x36<<7 | 0x0C, - 24305 - 19968: jis0208<<14 | 0x36<<7 | 0x0A, - 24307 - 19968: jis0208<<14 | 0x36<<7 | 0x0B, - 24308 - 19968: jis0208<<14 | 0x36<<7 | 0x0D, - 24310 - 19968: jis0208<<14 | 0x10<<7 | 0x43, - 24311 - 19968: jis0208<<14 | 0x23<<7 | 0x4D, - 24312 - 19968: jis0208<<14 | 0x36<<7 | 0x0E, - 24314 - 19968: jis0208<<14 | 0x16<<7 | 0x59, - 24315 - 19968: jis0208<<14 | 0x11<<7 | 0x55, - 24316 - 19968: jis0208<<14 | 0x26<<7 | 0x15, - 24318 - 19968: jis0208<<14 | 0x36<<7 | 0x0F, - 24319 - 19968: jis0208<<14 | 0x25<<7 | 0x5A, - 24321 - 19968: jis0208<<14 | 0x29<<7 | 0x3A, - 24322 - 19968: jis0212<<14 | 0x1B<<7 | 0x3B, - 24323 - 19968: jis0208<<14 | 0x36<<7 | 0x10, - 24324 - 19968: jis0208<<14 | 0x2E<<7 | 0x0D, - 24326 - 19968: jis0212<<14 | 0x1B<<7 | 0x3C, - 24327 - 19968: jis0212<<14 | 0x1B<<7 | 0x3D, - 24328 - 19968: jis0212<<14 | 0x1B<<7 | 0x3E, - 24329 - 19968: jis0208<<14 | 0x36<<7 | 0x11, - 24330 - 19968: jis0208<<14 | 0x29<<7 | 0x1F, - 24331 - 19968: jis0208<<14 | 0x36<<7 | 0x14, - 24332 - 19968: jis0208<<14 | 0x2F<<7 | 0x00, - 24333 - 19968: jis0208<<14 | 0x2F<<7 | 0x10, - 24334 - 19968: jis0212<<14 | 0x1B<<7 | 0x3F, - 24335 - 19968: jis0208<<14 | 0x1B<<7 | 0x0F, - 24336 - 19968: jis0208<<14 | 0x25<<7 | 0x54, - 24337 - 19968: jis0208<<14 | 0x36<<7 | 0x15, - 24339 - 19968: jis0208<<14 | 0x14<<7 | 0x3C, - 24340 - 19968: jis0208<<14 | 0x23<<7 | 0x03, - 24341 - 19968: jis0208<<14 | 0x0F<<7 | 0x59, - 24342 - 19968: jis0208<<14 | 0x36<<7 | 0x16, - 24343 - 19968: jis0208<<14 | 0x29<<7 | 0x05, - 24344 - 19968: jis0208<<14 | 0x18<<7 | 0x0F, - 24345 - 19968: jis0212<<14 | 0x1B<<7 | 0x40, - 24347 - 19968: jis0208<<14 | 0x22<<7 | 0x2F, - 24348 - 19968: jis0212<<14 | 0x1B<<7 | 0x41, - 24349 - 19968: jis0212<<14 | 0x1B<<7 | 0x42, - 24351 - 19968: jis0208<<14 | 0x23<<7 | 0x4E, - 24353 - 19968: jis0208<<14 | 0x58<<7 | 0x5A, - 24354 - 19968: jis0212<<14 | 0x1B<<7 | 0x44, - 24355 - 19968: jis0212<<14 | 0x1B<<7 | 0x45, - 24356 - 19968: jis0212<<14 | 0x1B<<7 | 0x46, - 24357 - 19968: jis0208<<14 | 0x2B<<7 | 0x4E, - 24358 - 19968: jis0208<<14 | 0x17<<7 | 0x18, - 24359 - 19968: jis0208<<14 | 0x17<<7 | 0x2B, - 24360 - 19968: jis0212<<14 | 0x1B<<7 | 0x47, - 24361 - 19968: jis0208<<14 | 0x36<<7 | 0x17, - 24363 - 19968: jis0212<<14 | 0x1B<<7 | 0x48, - 24364 - 19968: jis0212<<14 | 0x1B<<7 | 0x49, - 24365 - 19968: jis0208<<14 | 0x36<<7 | 0x18, - 24366 - 19968: jis0212<<14 | 0x1B<<7 | 0x4A, - 24367 - 19968: jis0208<<14 | 0x36<<7 | 0x1E, - 24368 - 19968: jis0212<<14 | 0x1B<<7 | 0x4B, - 24369 - 19968: jis0208<<14 | 0x1B<<7 | 0x44, - 24372 - 19968: jis0208<<14 | 0x58<<7 | 0x5B, - 24373 - 19968: jis0208<<14 | 0x23<<7 | 0x04, - 24374 - 19968: jis0212<<14 | 0x1B<<7 | 0x4D, - 24375 - 19968: jis0208<<14 | 0x15<<7 | 0x0E, - 24376 - 19968: jis0208<<14 | 0x36<<7 | 0x19, - 24379 - 19968: jis0212<<14 | 0x1B<<7 | 0x4E, - 24380 - 19968: jis0208<<14 | 0x28<<7 | 0x0A, - 24381 - 19968: jis0212<<14 | 0x1B<<7 | 0x4F, - 24382 - 19968: jis0208<<14 | 0x22<<7 | 0x25, - 24383 - 19968: jis0212<<14 | 0x1B<<7 | 0x50, - 24384 - 19968: jis0212<<14 | 0x1B<<7 | 0x51, - 24385 - 19968: jis0208<<14 | 0x36<<7 | 0x1A, - 24388 - 19968: jis0212<<14 | 0x1B<<7 | 0x52, - 24389 - 19968: jis0208<<14 | 0x58<<7 | 0x0B, - 24391 - 19968: jis0212<<14 | 0x1B<<7 | 0x54, - 24392 - 19968: jis0208<<14 | 0x36<<7 | 0x1B, - 24394 - 19968: jis0208<<14 | 0x15<<7 | 0x0F, - 24396 - 19968: jis0208<<14 | 0x36<<7 | 0x1C, - 24397 - 19968: jis0212<<14 | 0x1B<<7 | 0x55, - 24398 - 19968: jis0208<<14 | 0x36<<7 | 0x1D, - 24400 - 19968: jis0212<<14 | 0x1B<<7 | 0x56, - 24401 - 19968: jis0208<<14 | 0x36<<7 | 0x1F, - 24403 - 19968: jis0208<<14 | 0x24<<7 | 0x55, - 24404 - 19968: jis0212<<14 | 0x1B<<7 | 0x57, - 24406 - 19968: jis0208<<14 | 0x36<<7 | 0x20, - 24407 - 19968: jis0208<<14 | 0x36<<7 | 0x21, - 24408 - 19968: jis0212<<14 | 0x1B<<7 | 0x58, - 24409 - 19968: jis0208<<14 | 0x36<<7 | 0x22, - 24411 - 19968: jis0212<<14 | 0x1B<<7 | 0x59, - 24412 - 19968: jis0208<<14 | 0x36<<7 | 0x13, - 24413 - 19968: jis0208<<14 | 0x36<<7 | 0x12, - 24416 - 19968: jis0212<<14 | 0x1B<<7 | 0x5A, - 24417 - 19968: jis0208<<14 | 0x36<<7 | 0x23, - 24418 - 19968: jis0208<<14 | 0x16<<7 | 0x20, - 24419 - 19968: jis0212<<14 | 0x1B<<7 | 0x5B, - 24420 - 19968: jis0212<<14 | 0x1B<<7 | 0x5C, - 24422 - 19968: jis0208<<14 | 0x28<<7 | 0x06, - 24423 - 19968: jis0208<<14 | 0x58<<7 | 0x5C, - 24425 - 19968: jis0208<<14 | 0x19<<7 | 0x2B, - 24426 - 19968: jis0208<<14 | 0x28<<7 | 0x16, - 24427 - 19968: jis0208<<14 | 0x23<<7 | 0x05, - 24428 - 19968: jis0208<<14 | 0x28<<7 | 0x2A, - 24429 - 19968: jis0208<<14 | 0x36<<7 | 0x24, - 24431 - 19968: jis0212<<14 | 0x1C<<7 | 0x00, - 24432 - 19968: jis0208<<14 | 0x1D<<7 | 0x13, - 24433 - 19968: jis0208<<14 | 0x10<<7 | 0x25, - 24434 - 19968: jis0212<<14 | 0x1C<<7 | 0x01, - 24435 - 19968: jis0208<<14 | 0x36<<7 | 0x25, - 24436 - 19968: jis0212<<14 | 0x1C<<7 | 0x02, - 24437 - 19968: jis0212<<14 | 0x1C<<7 | 0x03, - 24439 - 19968: jis0208<<14 | 0x36<<7 | 0x26, - 24440 - 19968: jis0212<<14 | 0x1C<<7 | 0x04, - 24441 - 19968: jis0208<<14 | 0x2B<<7 | 0x51, - 24442 - 19968: jis0212<<14 | 0x1C<<7 | 0x05, - 24444 - 19968: jis0208<<14 | 0x27<<7 | 0x3F, - 24445 - 19968: jis0212<<14 | 0x1C<<7 | 0x06, - 24446 - 19968: jis0212<<14 | 0x1C<<7 | 0x07, - 24447 - 19968: jis0208<<14 | 0x36<<7 | 0x29, - 24448 - 19968: jis0208<<14 | 0x10<<7 | 0x5C, - 24449 - 19968: jis0208<<14 | 0x1F<<7 | 0x0B, - 24450 - 19968: jis0208<<14 | 0x36<<7 | 0x28, - 24451 - 19968: jis0208<<14 | 0x36<<7 | 0x27, - 24452 - 19968: jis0208<<14 | 0x16<<7 | 0x21, - 24453 - 19968: jis0208<<14 | 0x21<<7 | 0x33, - 24455 - 19968: jis0208<<14 | 0x36<<7 | 0x2D, - 24456 - 19968: jis0208<<14 | 0x36<<7 | 0x2B, - 24457 - 19968: jis0212<<14 | 0x1C<<7 | 0x08, - 24458 - 19968: jis0208<<14 | 0x36<<7 | 0x2A, - 24459 - 19968: jis0208<<14 | 0x2D<<7 | 0x06, - 24460 - 19968: jis0208<<14 | 0x17<<7 | 0x44, - 24461 - 19968: jis0212<<14 | 0x1C<<7 | 0x09, - 24463 - 19968: jis0212<<14 | 0x1C<<7 | 0x0A, - 24464 - 19968: jis0208<<14 | 0x1C<<7 | 0x58, - 24465 - 19968: jis0208<<14 | 0x36<<7 | 0x2C, - 24466 - 19968: jis0208<<14 | 0x24<<7 | 0x2B, - 24467 - 19968: jis0208<<14 | 0x1C<<7 | 0x1D, - 24470 - 19968: jis0212<<14 | 0x1C<<7 | 0x0B, - 24471 - 19968: jis0208<<14 | 0x25<<7 | 0x1F, - 24472 - 19968: jis0208<<14 | 0x36<<7 | 0x30, - 24473 - 19968: jis0208<<14 | 0x36<<7 | 0x2F, - 24476 - 19968: jis0212<<14 | 0x1C<<7 | 0x0C, - 24477 - 19968: jis0212<<14 | 0x1C<<7 | 0x0D, - 24478 - 19968: jis0208<<14 | 0x36<<7 | 0x2E, - 24480 - 19968: jis0208<<14 | 0x36<<7 | 0x31, - 24481 - 19968: jis0208<<14 | 0x17<<7 | 0x45, - 24482 - 19968: jis0212<<14 | 0x1C<<7 | 0x0E, - 24484 - 19968: jis0212<<14 | 0x1C<<7 | 0x11, - 24487 - 19968: jis0212<<14 | 0x1C<<7 | 0x0F, - 24488 - 19968: jis0208<<14 | 0x36<<7 | 0x32, - 24489 - 19968: jis0208<<14 | 0x28<<7 | 0x5B, - 24490 - 19968: jis0208<<14 | 0x1C<<7 | 0x3A, - 24491 - 19968: jis0212<<14 | 0x1C<<7 | 0x10, - 24492 - 19968: jis0212<<14 | 0x1C<<7 | 0x12, - 24493 - 19968: jis0208<<14 | 0x36<<7 | 0x33, - 24494 - 19968: jis0208<<14 | 0x27<<7 | 0x58, - 24495 - 19968: jis0212<<14 | 0x1C<<7 | 0x13, - 24496 - 19968: jis0212<<14 | 0x1C<<7 | 0x14, - 24497 - 19968: jis0212<<14 | 0x1C<<7 | 0x15, - 24499 - 19968: jis0208<<14 | 0x25<<7 | 0x20, - 24500 - 19968: jis0208<<14 | 0x23<<7 | 0x06, - 24503 - 19968: jis0208<<14 | 0x58<<7 | 0x5D, - 24504 - 19968: jis0212<<14 | 0x1C<<7 | 0x16, - 24505 - 19968: jis0208<<14 | 0x24<<7 | 0x0F, - 24508 - 19968: jis0208<<14 | 0x36<<7 | 0x34, - 24509 - 19968: jis0208<<14 | 0x14<<7 | 0x0A, - 24515 - 19968: jis0208<<14 | 0x1E<<7 | 0x13, - 24516 - 19968: jis0212<<14 | 0x1C<<7 | 0x17, - 24517 - 19968: jis0208<<14 | 0x28<<7 | 0x0B, - 24519 - 19968: jis0212<<14 | 0x1C<<7 | 0x18, - 24520 - 19968: jis0212<<14 | 0x1C<<7 | 0x19, - 24521 - 19968: jis0212<<14 | 0x1C<<7 | 0x1A, - 24523 - 19968: jis0212<<14 | 0x1C<<7 | 0x1B, - 24524 - 19968: jis0208<<14 | 0x13<<7 | 0x56, - 24525 - 19968: jis0208<<14 | 0x26<<7 | 0x05, - 24528 - 19968: jis0212<<14 | 0x1C<<7 | 0x1C, - 24529 - 19968: jis0212<<14 | 0x1C<<7 | 0x1D, - 24530 - 19968: jis0212<<14 | 0x1C<<7 | 0x1E, - 24531 - 19968: jis0212<<14 | 0x1C<<7 | 0x1F, - 24532 - 19968: jis0212<<14 | 0x1C<<7 | 0x20, - 24534 - 19968: jis0208<<14 | 0x36<<7 | 0x35, - 24535 - 19968: jis0208<<14 | 0x1A<<7 | 0x35, - 24536 - 19968: jis0208<<14 | 0x2A<<7 | 0x19, - 24537 - 19968: jis0208<<14 | 0x2A<<7 | 0x1A, - 24540 - 19968: jis0208<<14 | 0x10<<7 | 0x5D, - 24541 - 19968: jis0208<<14 | 0x36<<7 | 0x3A, - 24542 - 19968: jis0208<<14 | 0x59<<7 | 0x00, - 24544 - 19968: jis0208<<14 | 0x22<<7 | 0x48, - 24545 - 19968: jis0212<<14 | 0x1C<<7 | 0x22, - 24546 - 19968: jis0212<<14 | 0x1C<<7 | 0x23, - 24548 - 19968: jis0208<<14 | 0x36<<7 | 0x37, - 24552 - 19968: jis0212<<14 | 0x1C<<7 | 0x24, - 24553 - 19968: jis0212<<14 | 0x1C<<7 | 0x25, - 24554 - 19968: jis0212<<14 | 0x1C<<7 | 0x26, - 24555 - 19968: jis0208<<14 | 0x11<<7 | 0x56, - 24556 - 19968: jis0212<<14 | 0x1C<<7 | 0x27, - 24557 - 19968: jis0212<<14 | 0x1C<<7 | 0x28, - 24558 - 19968: jis0212<<14 | 0x1C<<7 | 0x29, - 24559 - 19968: jis0212<<14 | 0x1C<<7 | 0x2A, - 24560 - 19968: jis0208<<14 | 0x37<<7 | 0x0C, - 24561 - 19968: jis0208<<14 | 0x36<<7 | 0x39, - 24562 - 19968: jis0212<<14 | 0x1C<<7 | 0x2B, - 24563 - 19968: jis0212<<14 | 0x1C<<7 | 0x2C, - 24565 - 19968: jis0208<<14 | 0x26<<7 | 0x0F, - 24566 - 19968: jis0212<<14 | 0x1C<<7 | 0x2D, - 24568 - 19968: jis0208<<14 | 0x36<<7 | 0x38, - 24570 - 19968: jis0212<<14 | 0x1C<<7 | 0x2E, - 24571 - 19968: jis0208<<14 | 0x36<<7 | 0x36, - 24572 - 19968: jis0212<<14 | 0x1C<<7 | 0x2F, - 24573 - 19968: jis0208<<14 | 0x18<<7 | 0x59, - 24575 - 19968: jis0208<<14 | 0x36<<7 | 0x3C, - 24583 - 19968: jis0212<<14 | 0x1C<<7 | 0x30, - 24586 - 19968: jis0212<<14 | 0x1C<<7 | 0x31, - 24589 - 19968: jis0212<<14 | 0x1C<<7 | 0x32, - 24590 - 19968: jis0208<<14 | 0x36<<7 | 0x42, - 24591 - 19968: jis0208<<14 | 0x36<<7 | 0x48, - 24592 - 19968: jis0208<<14 | 0x36<<7 | 0x40, - 24594 - 19968: jis0208<<14 | 0x24<<7 | 0x3B, - 24595 - 19968: jis0212<<14 | 0x1C<<7 | 0x33, - 24596 - 19968: jis0212<<14 | 0x1C<<7 | 0x34, - 24597 - 19968: jis0208<<14 | 0x36<<7 | 0x45, - 24598 - 19968: jis0208<<14 | 0x28<<7 | 0x3C, - 24599 - 19968: jis0212<<14 | 0x1C<<7 | 0x35, - 24600 - 19968: jis0212<<14 | 0x1C<<7 | 0x36, - 24601 - 19968: jis0208<<14 | 0x36<<7 | 0x3F, - 24602 - 19968: jis0212<<14 | 0x1C<<7 | 0x37, - 24603 - 19968: jis0208<<14 | 0x36<<7 | 0x44, - 24604 - 19968: jis0208<<14 | 0x2D<<7 | 0x46, - 24605 - 19968: jis0208<<14 | 0x1A<<7 | 0x36, - 24607 - 19968: jis0212<<14 | 0x1C<<7 | 0x38, - 24608 - 19968: jis0208<<14 | 0x21<<7 | 0x34, - 24609 - 19968: jis0208<<14 | 0x36<<7 | 0x3D, - 24612 - 19968: jis0212<<14 | 0x1C<<7 | 0x39, - 24613 - 19968: jis0208<<14 | 0x14<<7 | 0x3D, - 24614 - 19968: jis0208<<14 | 0x36<<7 | 0x47, - 24615 - 19968: jis0208<<14 | 0x1F<<7 | 0x0C, - 24616 - 19968: jis0208<<14 | 0x10<<7 | 0x44, - 24617 - 19968: jis0208<<14 | 0x36<<7 | 0x41, - 24618 - 19968: jis0208<<14 | 0x11<<7 | 0x57, - 24619 - 19968: jis0208<<14 | 0x36<<7 | 0x46, - 24621 - 19968: jis0212<<14 | 0x1C<<7 | 0x3A, - 24623 - 19968: jis0208<<14 | 0x15<<7 | 0x10, - 24625 - 19968: jis0208<<14 | 0x36<<7 | 0x43, - 24627 - 19968: jis0212<<14 | 0x1C<<7 | 0x3B, - 24629 - 19968: jis0212<<14 | 0x1C<<7 | 0x3C, - 24634 - 19968: jis0208<<14 | 0x36<<7 | 0x49, - 24640 - 19968: jis0212<<14 | 0x1C<<7 | 0x3D, - 24641 - 19968: jis0208<<14 | 0x36<<7 | 0x4B, - 24642 - 19968: jis0208<<14 | 0x36<<7 | 0x55, - 24643 - 19968: jis0208<<14 | 0x36<<7 | 0x53, - 24646 - 19968: jis0208<<14 | 0x36<<7 | 0x50, - 24647 - 19968: jis0212<<14 | 0x1C<<7 | 0x3E, - 24648 - 19968: jis0212<<14 | 0x1C<<7 | 0x3F, - 24649 - 19968: jis0212<<14 | 0x1C<<7 | 0x40, - 24650 - 19968: jis0208<<14 | 0x36<<7 | 0x4F, - 24651 - 19968: jis0208<<14 | 0x2D<<7 | 0x57, - 24652 - 19968: jis0212<<14 | 0x1C<<7 | 0x41, - 24653 - 19968: jis0208<<14 | 0x36<<7 | 0x51, - 24656 - 19968: jis0208<<14 | 0x15<<7 | 0x11, - 24657 - 19968: jis0212<<14 | 0x1C<<7 | 0x42, - 24658 - 19968: jis0208<<14 | 0x18<<7 | 0x10, - 24660 - 19968: jis0212<<14 | 0x1C<<7 | 0x43, - 24661 - 19968: jis0208<<14 | 0x1C<<7 | 0x59, - 24662 - 19968: jis0212<<14 | 0x1C<<7 | 0x44, - 24663 - 19968: jis0212<<14 | 0x1C<<7 | 0x45, - 24665 - 19968: jis0208<<14 | 0x36<<7 | 0x58, - 24666 - 19968: jis0208<<14 | 0x36<<7 | 0x4A, - 24669 - 19968: jis0208<<14 | 0x59<<7 | 0x01, - 24671 - 19968: jis0208<<14 | 0x36<<7 | 0x4E, - 24672 - 19968: jis0208<<14 | 0x36<<7 | 0x3E, - 24673 - 19968: jis0212<<14 | 0x1C<<7 | 0x47, - 24674 - 19968: jis0208<<14 | 0x11<<7 | 0x59, - 24675 - 19968: jis0208<<14 | 0x36<<7 | 0x52, - 24676 - 19968: jis0208<<14 | 0x36<<7 | 0x54, - 24677 - 19968: jis0208<<14 | 0x22<<7 | 0x30, - 24679 - 19968: jis0212<<14 | 0x1C<<7 | 0x48, - 24680 - 19968: jis0208<<14 | 0x19<<7 | 0x07, - 24681 - 19968: jis0208<<14 | 0x11<<7 | 0x17, - 24682 - 19968: jis0208<<14 | 0x36<<7 | 0x4C, - 24683 - 19968: jis0208<<14 | 0x36<<7 | 0x57, - 24684 - 19968: jis0208<<14 | 0x36<<7 | 0x56, - 24685 - 19968: jis0208<<14 | 0x15<<7 | 0x12, - 24687 - 19968: jis0208<<14 | 0x21<<7 | 0x08, - 24688 - 19968: jis0208<<14 | 0x12<<7 | 0x45, - 24689 - 19968: jis0212<<14 | 0x1C<<7 | 0x49, - 24693 - 19968: jis0208<<14 | 0x16<<7 | 0x22, - 24695 - 19968: jis0208<<14 | 0x36<<7 | 0x4D, - 24702 - 19968: jis0212<<14 | 0x1C<<7 | 0x4A, - 24703 - 19968: jis0212<<14 | 0x1C<<7 | 0x4B, - 24705 - 19968: jis0208<<14 | 0x36<<7 | 0x59, - 24706 - 19968: jis0212<<14 | 0x1C<<7 | 0x4C, - 24707 - 19968: jis0208<<14 | 0x36<<7 | 0x5C, - 24708 - 19968: jis0208<<14 | 0x37<<7 | 0x00, - 24709 - 19968: jis0208<<14 | 0x59<<7 | 0x02, - 24710 - 19968: jis0212<<14 | 0x1C<<7 | 0x4D, - 24712 - 19968: jis0212<<14 | 0x1C<<7 | 0x4E, - 24713 - 19968: jis0208<<14 | 0x1B<<7 | 0x1C, - 24714 - 19968: jis0208<<14 | 0x59<<7 | 0x03, - 24715 - 19968: jis0208<<14 | 0x37<<7 | 0x06, - 24716 - 19968: jis0208<<14 | 0x23<<7 | 0x4F, - 24717 - 19968: jis0208<<14 | 0x36<<7 | 0x5A, - 24718 - 19968: jis0212<<14 | 0x1C<<7 | 0x50, - 24721 - 19968: jis0212<<14 | 0x1C<<7 | 0x51, - 24722 - 19968: jis0208<<14 | 0x37<<7 | 0x04, - 24723 - 19968: jis0212<<14 | 0x1C<<7 | 0x52, - 24724 - 19968: jis0208<<14 | 0x11<<7 | 0x58, - 24725 - 19968: jis0212<<14 | 0x1C<<7 | 0x53, - 24726 - 19968: jis0208<<14 | 0x37<<7 | 0x02, - 24727 - 19968: jis0208<<14 | 0x37<<7 | 0x03, - 24728 - 19968: jis0212<<14 | 0x1C<<7 | 0x54, - 24730 - 19968: jis0208<<14 | 0x36<<7 | 0x5D, - 24731 - 19968: jis0208<<14 | 0x37<<7 | 0x01, - 24733 - 19968: jis0212<<14 | 0x1C<<7 | 0x55, - 24734 - 19968: jis0212<<14 | 0x1C<<7 | 0x56, - 24735 - 19968: jis0208<<14 | 0x17<<7 | 0x46, - 24736 - 19968: jis0208<<14 | 0x2C<<7 | 0x09, - 24738 - 19968: jis0212<<14 | 0x1C<<7 | 0x57, - 24739 - 19968: jis0208<<14 | 0x13<<7 | 0x14, - 24740 - 19968: jis0212<<14 | 0x1C<<7 | 0x58, - 24741 - 19968: jis0212<<14 | 0x1C<<7 | 0x59, - 24742 - 19968: jis0208<<14 | 0x10<<7 | 0x38, - 24743 - 19968: jis0208<<14 | 0x37<<7 | 0x05, - 24744 - 19968: jis0212<<14 | 0x1C<<7 | 0x5A, - 24745 - 19968: jis0208<<14 | 0x26<<7 | 0x19, - 24746 - 19968: jis0208<<14 | 0x0F<<7 | 0x0C, - 24752 - 19968: jis0212<<14 | 0x1C<<7 | 0x5B, - 24753 - 19968: jis0212<<14 | 0x1C<<7 | 0x5C, - 24754 - 19968: jis0208<<14 | 0x27<<7 | 0x40, - 24755 - 19968: jis0208<<14 | 0x36<<7 | 0x3B, - 24756 - 19968: jis0208<<14 | 0x37<<7 | 0x0B, - 24757 - 19968: jis0208<<14 | 0x37<<7 | 0x0F, - 24758 - 19968: jis0208<<14 | 0x2B<<7 | 0x44, - 24759 - 19968: jis0212<<14 | 0x1C<<7 | 0x5D, - 24760 - 19968: jis0208<<14 | 0x37<<7 | 0x08, - 24763 - 19968: jis0212<<14 | 0x1D<<7 | 0x00, - 24764 - 19968: jis0208<<14 | 0x24<<7 | 0x48, - 24765 - 19968: jis0208<<14 | 0x37<<7 | 0x0D, - 24766 - 19968: jis0212<<14 | 0x1D<<7 | 0x01, - 24770 - 19968: jis0212<<14 | 0x1D<<7 | 0x02, - 24772 - 19968: jis0212<<14 | 0x1D<<7 | 0x03, - 24773 - 19968: jis0208<<14 | 0x1D<<7 | 0x4F, - 24774 - 19968: jis0208<<14 | 0x37<<7 | 0x0E, - 24775 - 19968: jis0208<<14 | 0x25<<7 | 0x36, - 24776 - 19968: jis0212<<14 | 0x1D<<7 | 0x04, - 24777 - 19968: jis0212<<14 | 0x1D<<7 | 0x05, - 24778 - 19968: jis0212<<14 | 0x1D<<7 | 0x06, - 24779 - 19968: jis0212<<14 | 0x1D<<7 | 0x07, - 24782 - 19968: jis0212<<14 | 0x1D<<7 | 0x08, - 24783 - 19968: jis0212<<14 | 0x1D<<7 | 0x09, - 24785 - 19968: jis0208<<14 | 0x2E<<7 | 0x26, - 24787 - 19968: jis0208<<14 | 0x37<<7 | 0x0A, - 24788 - 19968: jis0212<<14 | 0x1D<<7 | 0x0A, - 24789 - 19968: jis0208<<14 | 0x59<<7 | 0x05, - 24792 - 19968: jis0208<<14 | 0x37<<7 | 0x10, - 24793 - 19968: jis0212<<14 | 0x1D<<7 | 0x0C, - 24794 - 19968: jis0208<<14 | 0x18<<7 | 0x5A, - 24795 - 19968: jis0212<<14 | 0x1D<<7 | 0x0D, - 24796 - 19968: jis0208<<14 | 0x1F<<7 | 0x2A, - 24797 - 19968: jis0212<<14 | 0x1D<<7 | 0x0E, - 24798 - 19968: jis0208<<14 | 0x59<<7 | 0x04, - 24799 - 19968: jis0208<<14 | 0x0F<<7 | 0x33, - 24800 - 19968: jis0208<<14 | 0x37<<7 | 0x09, - 24801 - 19968: jis0208<<14 | 0x37<<7 | 0x07, - 24802 - 19968: jis0212<<14 | 0x1D<<7 | 0x10, - 24803 - 19968: jis0208<<14 | 0x20<<7 | 0x39, - 24805 - 19968: jis0212<<14 | 0x1D<<7 | 0x11, - 24807 - 19968: jis0208<<14 | 0x36<<7 | 0x5B, - 24808 - 19968: jis0208<<14 | 0x1A<<7 | 0x13, - 24816 - 19968: jis0208<<14 | 0x21<<7 | 0x25, - 24817 - 19968: jis0208<<14 | 0x37<<7 | 0x1C, - 24818 - 19968: jis0208<<14 | 0x59<<7 | 0x07, - 24819 - 19968: jis0208<<14 | 0x20<<7 | 0x3A, - 24820 - 19968: jis0208<<14 | 0x37<<7 | 0x17, - 24821 - 19968: jis0212<<14 | 0x1D<<7 | 0x13, - 24822 - 19968: jis0208<<14 | 0x37<<7 | 0x14, - 24823 - 19968: jis0208<<14 | 0x37<<7 | 0x15, - 24824 - 19968: jis0212<<14 | 0x1D<<7 | 0x14, - 24825 - 19968: jis0208<<14 | 0x1B<<7 | 0x45, - 24826 - 19968: jis0208<<14 | 0x37<<7 | 0x18, - 24827 - 19968: jis0208<<14 | 0x37<<7 | 0x1B, - 24828 - 19968: jis0212<<14 | 0x1D<<7 | 0x15, - 24829 - 19968: jis0212<<14 | 0x1D<<7 | 0x16, - 24832 - 19968: jis0208<<14 | 0x37<<7 | 0x16, - 24833 - 19968: jis0208<<14 | 0x1C<<7 | 0x04, - 24834 - 19968: jis0212<<14 | 0x1D<<7 | 0x17, - 24835 - 19968: jis0208<<14 | 0x37<<7 | 0x19, - 24838 - 19968: jis0208<<14 | 0x37<<7 | 0x13, - 24839 - 19968: jis0212<<14 | 0x1D<<7 | 0x18, - 24840 - 19968: jis0208<<14 | 0x2B<<7 | 0x5B, - 24841 - 19968: jis0208<<14 | 0x2B<<7 | 0x5A, - 24842 - 19968: jis0212<<14 | 0x1D<<7 | 0x19, - 24844 - 19968: jis0212<<14 | 0x1D<<7 | 0x1A, - 24845 - 19968: jis0208<<14 | 0x37<<7 | 0x1D, - 24846 - 19968: jis0208<<14 | 0x37<<7 | 0x1E, - 24847 - 19968: jis0208<<14 | 0x0F<<7 | 0x34, - 24848 - 19968: jis0212<<14 | 0x1D<<7 | 0x1B, - 24849 - 19968: jis0208<<14 | 0x59<<7 | 0x08, - 24850 - 19968: jis0212<<14 | 0x1D<<7 | 0x1D, - 24851 - 19968: jis0212<<14 | 0x1D<<7 | 0x1E, - 24852 - 19968: jis0212<<14 | 0x1D<<7 | 0x1F, - 24853 - 19968: jis0208<<14 | 0x37<<7 | 0x12, - 24854 - 19968: jis0212<<14 | 0x1D<<7 | 0x20, - 24855 - 19968: jis0212<<14 | 0x1D<<7 | 0x21, - 24857 - 19968: jis0212<<14 | 0x1D<<7 | 0x22, - 24858 - 19968: jis0208<<14 | 0x15<<7 | 0x51, - 24859 - 19968: jis0208<<14 | 0x0F<<7 | 0x05, - 24860 - 19968: jis0212<<14 | 0x1D<<7 | 0x23, - 24862 - 19968: jis0212<<14 | 0x1D<<7 | 0x24, - 24863 - 19968: jis0208<<14 | 0x13<<7 | 0x15, - 24864 - 19968: jis0208<<14 | 0x59<<7 | 0x06, - 24865 - 19968: jis0208<<14 | 0x37<<7 | 0x1A, - 24866 - 19968: jis0212<<14 | 0x1D<<7 | 0x25, - 24871 - 19968: jis0208<<14 | 0x37<<7 | 0x22, - 24872 - 19968: jis0208<<14 | 0x37<<7 | 0x21, - 24874 - 19968: jis0212<<14 | 0x1D<<7 | 0x26, - 24875 - 19968: jis0212<<14 | 0x1D<<7 | 0x27, - 24876 - 19968: jis0208<<14 | 0x37<<7 | 0x26, - 24880 - 19968: jis0208<<14 | 0x59<<7 | 0x0A, - 24881 - 19968: jis0212<<14 | 0x1D<<7 | 0x29, - 24884 - 19968: jis0208<<14 | 0x37<<7 | 0x27, - 24885 - 19968: jis0212<<14 | 0x1D<<7 | 0x2A, - 24886 - 19968: jis0212<<14 | 0x1D<<7 | 0x2B, - 24887 - 19968: jis0208<<14 | 0x59<<7 | 0x09, - 24889 - 19968: jis0212<<14 | 0x1D<<7 | 0x2D, - 24892 - 19968: jis0208<<14 | 0x37<<7 | 0x25, - 24893 - 19968: jis0208<<14 | 0x37<<7 | 0x28, - 24894 - 19968: jis0208<<14 | 0x37<<7 | 0x20, - 24895 - 19968: jis0208<<14 | 0x37<<7 | 0x24, - 24897 - 19968: jis0212<<14 | 0x1D<<7 | 0x2E, - 24898 - 19968: jis0208<<14 | 0x37<<7 | 0x29, - 24900 - 19968: jis0208<<14 | 0x37<<7 | 0x2A, - 24901 - 19968: jis0212<<14 | 0x1D<<7 | 0x2F, - 24902 - 19968: jis0212<<14 | 0x1D<<7 | 0x30, - 24903 - 19968: jis0208<<14 | 0x37<<7 | 0x1F, - 24904 - 19968: jis0208<<14 | 0x1A<<7 | 0x5B, - 24905 - 19968: jis0212<<14 | 0x1D<<7 | 0x31, - 24906 - 19968: jis0208<<14 | 0x37<<7 | 0x23, - 24907 - 19968: jis0208<<14 | 0x21<<7 | 0x35, - 24908 - 19968: jis0208<<14 | 0x18<<7 | 0x11, - 24909 - 19968: jis0208<<14 | 0x37<<7 | 0x11, - 24910 - 19968: jis0208<<14 | 0x1E<<7 | 0x14, - 24915 - 19968: jis0208<<14 | 0x37<<7 | 0x37, - 24917 - 19968: jis0208<<14 | 0x29<<7 | 0x48, - 24920 - 19968: jis0208<<14 | 0x37<<7 | 0x2D, - 24921 - 19968: jis0208<<14 | 0x37<<7 | 0x2E, - 24922 - 19968: jis0208<<14 | 0x37<<7 | 0x2F, - 24925 - 19968: jis0208<<14 | 0x37<<7 | 0x36, - 24926 - 19968: jis0212<<14 | 0x1D<<7 | 0x32, - 24927 - 19968: jis0208<<14 | 0x37<<7 | 0x35, - 24928 - 19968: jis0212<<14 | 0x1D<<7 | 0x33, - 24930 - 19968: jis0208<<14 | 0x2A<<7 | 0x5C, - 24931 - 19968: jis0208<<14 | 0x13<<7 | 0x16, - 24933 - 19968: jis0208<<14 | 0x37<<7 | 0x33, - 24935 - 19968: jis0208<<14 | 0x16<<7 | 0x24, - 24936 - 19968: jis0208<<14 | 0x12<<7 | 0x13, - 24939 - 19968: jis0208<<14 | 0x37<<7 | 0x30, - 24940 - 19968: jis0212<<14 | 0x1D<<7 | 0x34, - 24942 - 19968: jis0208<<14 | 0x2D<<7 | 0x17, - 24943 - 19968: jis0208<<14 | 0x37<<7 | 0x32, - 24944 - 19968: jis0208<<14 | 0x0F<<7 | 0x35, - 24945 - 19968: jis0208<<14 | 0x37<<7 | 0x34, - 24946 - 19968: jis0212<<14 | 0x1D<<7 | 0x35, - 24947 - 19968: jis0208<<14 | 0x37<<7 | 0x2B, - 24948 - 19968: jis0208<<14 | 0x37<<7 | 0x31, - 24949 - 19968: jis0208<<14 | 0x37<<7 | 0x38, - 24950 - 19968: jis0208<<14 | 0x16<<7 | 0x23, - 24951 - 19968: jis0208<<14 | 0x37<<7 | 0x2C, - 24952 - 19968: jis0212<<14 | 0x1D<<7 | 0x36, - 24955 - 19968: jis0212<<14 | 0x1D<<7 | 0x37, - 24956 - 19968: jis0212<<14 | 0x1D<<7 | 0x38, - 24958 - 19968: jis0208<<14 | 0x2C<<7 | 0x3C, - 24959 - 19968: jis0212<<14 | 0x1D<<7 | 0x39, - 24960 - 19968: jis0212<<14 | 0x1D<<7 | 0x3A, - 24961 - 19968: jis0212<<14 | 0x1D<<7 | 0x3B, - 24962 - 19968: jis0208<<14 | 0x2C<<7 | 0x0A, - 24963 - 19968: jis0212<<14 | 0x1D<<7 | 0x3C, - 24964 - 19968: jis0212<<14 | 0x1D<<7 | 0x3D, - 24967 - 19968: jis0208<<14 | 0x37<<7 | 0x3B, - 24970 - 19968: jis0208<<14 | 0x37<<7 | 0x3F, - 24971 - 19968: jis0212<<14 | 0x1D<<7 | 0x3E, - 24973 - 19968: jis0212<<14 | 0x1D<<7 | 0x3F, - 24974 - 19968: jis0208<<14 | 0x20<<7 | 0x5D, - 24976 - 19968: jis0208<<14 | 0x2D<<7 | 0x58, - 24977 - 19968: jis0208<<14 | 0x37<<7 | 0x40, - 24978 - 19968: jis0212<<14 | 0x1D<<7 | 0x40, - 24979 - 19968: jis0212<<14 | 0x1D<<7 | 0x41, - 24980 - 19968: jis0208<<14 | 0x37<<7 | 0x3D, - 24982 - 19968: jis0208<<14 | 0x37<<7 | 0x3A, - 24983 - 19968: jis0212<<14 | 0x1D<<7 | 0x42, - 24984 - 19968: jis0208<<14 | 0x59<<7 | 0x0B, - 24985 - 19968: jis0208<<14 | 0x37<<7 | 0x39, - 24986 - 19968: jis0208<<14 | 0x37<<7 | 0x3E, - 24988 - 19968: jis0212<<14 | 0x1D<<7 | 0x44, - 24989 - 19968: jis0212<<14 | 0x1D<<7 | 0x45, - 24991 - 19968: jis0212<<14 | 0x1D<<7 | 0x46, - 24992 - 19968: jis0212<<14 | 0x1D<<7 | 0x47, - 24996 - 19968: jis0208<<14 | 0x29<<7 | 0x0F, - 24997 - 19968: jis0212<<14 | 0x1D<<7 | 0x48, - 24999 - 19968: jis0208<<14 | 0x25<<7 | 0x13, - 25000 - 19968: jis0212<<14 | 0x1D<<7 | 0x49, - 25001 - 19968: jis0208<<14 | 0x16<<7 | 0x25, - 25002 - 19968: jis0212<<14 | 0x1D<<7 | 0x4A, - 25003 - 19968: jis0208<<14 | 0x37<<7 | 0x41, - 25004 - 19968: jis0208<<14 | 0x37<<7 | 0x3C, - 25005 - 19968: jis0212<<14 | 0x1D<<7 | 0x4B, - 25006 - 19968: jis0208<<14 | 0x37<<7 | 0x42, - 25010 - 19968: jis0208<<14 | 0x16<<7 | 0x5A, - 25014 - 19968: jis0208<<14 | 0x11<<7 | 0x10, - 25016 - 19968: jis0212<<14 | 0x1D<<7 | 0x4C, - 25017 - 19968: jis0212<<14 | 0x1D<<7 | 0x4D, - 25018 - 19968: jis0208<<14 | 0x37<<7 | 0x4A, - 25020 - 19968: jis0212<<14 | 0x1D<<7 | 0x4E, - 25022 - 19968: jis0208<<14 | 0x13<<7 | 0x17, - 25024 - 19968: jis0212<<14 | 0x1D<<7 | 0x4F, - 25025 - 19968: jis0212<<14 | 0x1D<<7 | 0x50, - 25026 - 19968: jis0212<<14 | 0x1D<<7 | 0x51, - 25027 - 19968: jis0208<<14 | 0x37<<7 | 0x48, - 25030 - 19968: jis0208<<14 | 0x37<<7 | 0x49, - 25031 - 19968: jis0208<<14 | 0x19<<7 | 0x08, - 25032 - 19968: jis0208<<14 | 0x37<<7 | 0x47, - 25033 - 19968: jis0208<<14 | 0x37<<7 | 0x45, - 25034 - 19968: jis0208<<14 | 0x37<<7 | 0x44, - 25035 - 19968: jis0208<<14 | 0x37<<7 | 0x4B, - 25036 - 19968: jis0208<<14 | 0x37<<7 | 0x43, - 25037 - 19968: jis0208<<14 | 0x37<<7 | 0x4D, - 25038 - 19968: jis0212<<14 | 0x1D<<7 | 0x52, - 25039 - 19968: jis0212<<14 | 0x1D<<7 | 0x53, - 25040 - 19968: jis0208<<14 | 0x11<<7 | 0x5A, - 25045 - 19968: jis0212<<14 | 0x1D<<7 | 0x54, - 25052 - 19968: jis0212<<14 | 0x1D<<7 | 0x55, - 25053 - 19968: jis0212<<14 | 0x1D<<7 | 0x56, - 25054 - 19968: jis0212<<14 | 0x1D<<7 | 0x57, - 25055 - 19968: jis0212<<14 | 0x1D<<7 | 0x58, - 25057 - 19968: jis0212<<14 | 0x1D<<7 | 0x59, - 25058 - 19968: jis0212<<14 | 0x1D<<7 | 0x5A, - 25059 - 19968: jis0208<<14 | 0x37<<7 | 0x4F, - 25061 - 19968: jis0212<<14 | 0x1D<<7 | 0x5D, - 25062 - 19968: jis0208<<14 | 0x37<<7 | 0x4E, - 25063 - 19968: jis0212<<14 | 0x1D<<7 | 0x5B, - 25065 - 19968: jis0212<<14 | 0x1D<<7 | 0x5C, - 25068 - 19968: jis0212<<14 | 0x1E<<7 | 0x00, - 25069 - 19968: jis0212<<14 | 0x1E<<7 | 0x01, - 25071 - 19968: jis0212<<14 | 0x1E<<7 | 0x02, - 25074 - 19968: jis0208<<14 | 0x23<<7 | 0x07, - 25076 - 19968: jis0208<<14 | 0x37<<7 | 0x52, - 25078 - 19968: jis0208<<14 | 0x37<<7 | 0x50, - 25079 - 19968: jis0208<<14 | 0x37<<7 | 0x46, - 25080 - 19968: jis0208<<14 | 0x16<<7 | 0x5B, - 25082 - 19968: jis0208<<14 | 0x37<<7 | 0x51, - 25084 - 19968: jis0208<<14 | 0x37<<7 | 0x55, - 25085 - 19968: jis0208<<14 | 0x37<<7 | 0x54, - 25086 - 19968: jis0208<<14 | 0x37<<7 | 0x56, - 25087 - 19968: jis0208<<14 | 0x37<<7 | 0x53, - 25088 - 19968: jis0208<<14 | 0x37<<7 | 0x57, - 25089 - 19968: jis0212<<14 | 0x1E<<7 | 0x03, - 25091 - 19968: jis0212<<14 | 0x1E<<7 | 0x04, - 25092 - 19968: jis0212<<14 | 0x1E<<7 | 0x05, - 25095 - 19968: jis0212<<14 | 0x1E<<7 | 0x06, - 25096 - 19968: jis0208<<14 | 0x37<<7 | 0x58, - 25097 - 19968: jis0208<<14 | 0x37<<7 | 0x59, - 25098 - 19968: jis0208<<14 | 0x29<<7 | 0x49, - 25100 - 19968: jis0208<<14 | 0x37<<7 | 0x5B, - 25101 - 19968: jis0208<<14 | 0x37<<7 | 0x5A, - 25102 - 19968: jis0208<<14 | 0x1C<<7 | 0x1E, - 25104 - 19968: jis0208<<14 | 0x1F<<7 | 0x0D, - 25105 - 19968: jis0208<<14 | 0x11<<7 | 0x45, - 25106 - 19968: jis0208<<14 | 0x11<<7 | 0x5B, - 25107 - 19968: jis0208<<14 | 0x59<<7 | 0x0C, - 25108 - 19968: jis0208<<14 | 0x37<<7 | 0x5C, - 25109 - 19968: jis0212<<14 | 0x1E<<7 | 0x08, - 25110 - 19968: jis0208<<14 | 0x0F<<7 | 0x1E, - 25114 - 19968: jis0208<<14 | 0x1F<<7 | 0x2B, - 25115 - 19968: jis0208<<14 | 0x37<<7 | 0x5D, - 25116 - 19968: jis0212<<14 | 0x1E<<7 | 0x09, - 25117 - 19968: jis0208<<14 | 0x4B<<7 | 0x22, - 25118 - 19968: jis0208<<14 | 0x38<<7 | 0x00, - 25119 - 19968: jis0208<<14 | 0x16<<7 | 0x40, - 25120 - 19968: jis0212<<14 | 0x1E<<7 | 0x0A, - 25121 - 19968: jis0208<<14 | 0x38<<7 | 0x01, - 25122 - 19968: jis0212<<14 | 0x1E<<7 | 0x0B, - 25123 - 19968: jis0212<<14 | 0x1E<<7 | 0x0C, - 25126 - 19968: jis0208<<14 | 0x1F<<7 | 0x4E, - 25127 - 19968: jis0212<<14 | 0x1E<<7 | 0x0D, - 25129 - 19968: jis0212<<14 | 0x1E<<7 | 0x0E, - 25130 - 19968: jis0208<<14 | 0x38<<7 | 0x02, - 25131 - 19968: jis0212<<14 | 0x1E<<7 | 0x0F, - 25134 - 19968: jis0208<<14 | 0x38<<7 | 0x03, - 25135 - 19968: jis0208<<14 | 0x14<<7 | 0x19, - 25136 - 19968: jis0208<<14 | 0x38<<7 | 0x04, - 25138 - 19968: jis0208<<14 | 0x38<<7 | 0x05, - 25139 - 19968: jis0208<<14 | 0x38<<7 | 0x06, - 25140 - 19968: jis0208<<14 | 0x21<<7 | 0x36, - 25144 - 19968: jis0208<<14 | 0x17<<7 | 0x2C, - 25145 - 19968: jis0212<<14 | 0x1E<<7 | 0x10, - 25147 - 19968: jis0208<<14 | 0x2B<<7 | 0x40, - 25149 - 19968: jis0212<<14 | 0x1E<<7 | 0x11, - 25151 - 19968: jis0208<<14 | 0x2A<<7 | 0x1B, - 25152 - 19968: jis0208<<14 | 0x1C<<7 | 0x49, - 25153 - 19968: jis0208<<14 | 0x38<<7 | 0x07, - 25154 - 19968: jis0212<<14 | 0x1E<<7 | 0x12, - 25155 - 19968: jis0212<<14 | 0x1E<<7 | 0x13, - 25156 - 19968: jis0212<<14 | 0x1E<<7 | 0x14, - 25158 - 19968: jis0212<<14 | 0x1E<<7 | 0x15, - 25159 - 19968: jis0208<<14 | 0x1F<<7 | 0x4F, - 25160 - 19968: jis0208<<14 | 0x4D<<7 | 0x1C, - 25161 - 19968: jis0208<<14 | 0x27<<7 | 0x41, - 25163 - 19968: jis0208<<14 | 0x1B<<7 | 0x49, - 25164 - 19968: jis0212<<14 | 0x1E<<7 | 0x16, - 25165 - 19968: jis0208<<14 | 0x19<<7 | 0x2C, - 25166 - 19968: jis0208<<14 | 0x38<<7 | 0x08, - 25168 - 19968: jis0212<<14 | 0x1E<<7 | 0x17, - 25169 - 19968: jis0212<<14 | 0x1E<<7 | 0x18, - 25170 - 19968: jis0212<<14 | 0x1E<<7 | 0x19, - 25171 - 19968: jis0208<<14 | 0x21<<7 | 0x26, - 25172 - 19968: jis0212<<14 | 0x1E<<7 | 0x1A, - 25173 - 19968: jis0208<<14 | 0x29<<7 | 0x06, - 25174 - 19968: jis0212<<14 | 0x1E<<7 | 0x1B, - 25176 - 19968: jis0208<<14 | 0x21<<7 | 0x50, - 25178 - 19968: jis0212<<14 | 0x1E<<7 | 0x1C, - 25179 - 19968: jis0208<<14 | 0x38<<7 | 0x0B, - 25180 - 19968: jis0212<<14 | 0x1E<<7 | 0x1D, - 25182 - 19968: jis0208<<14 | 0x38<<7 | 0x09, - 25184 - 19968: jis0208<<14 | 0x38<<7 | 0x0C, - 25187 - 19968: jis0208<<14 | 0x38<<7 | 0x0A, - 25188 - 19968: jis0212<<14 | 0x1E<<7 | 0x1E, - 25192 - 19968: jis0208<<14 | 0x38<<7 | 0x0D, - 25197 - 19968: jis0212<<14 | 0x1E<<7 | 0x1F, - 25198 - 19968: jis0208<<14 | 0x29<<7 | 0x10, - 25199 - 19968: jis0212<<14 | 0x1E<<7 | 0x20, - 25201 - 19968: jis0208<<14 | 0x0F<<7 | 0x16, - 25203 - 19968: jis0212<<14 | 0x1E<<7 | 0x21, - 25206 - 19968: jis0208<<14 | 0x28<<7 | 0x3D, - 25209 - 19968: jis0208<<14 | 0x27<<7 | 0x42, - 25210 - 19968: jis0212<<14 | 0x1E<<7 | 0x22, - 25212 - 19968: jis0208<<14 | 0x38<<7 | 0x0E, - 25213 - 19968: jis0212<<14 | 0x1E<<7 | 0x23, - 25214 - 19968: jis0208<<14 | 0x38<<7 | 0x11, - 25215 - 19968: jis0208<<14 | 0x1D<<7 | 0x14, - 25216 - 19968: jis0208<<14 | 0x14<<7 | 0x1A, - 25218 - 19968: jis0208<<14 | 0x38<<7 | 0x0F, - 25219 - 19968: jis0208<<14 | 0x38<<7 | 0x16, - 25220 - 19968: jis0208<<14 | 0x1D<<7 | 0x15, - 25225 - 19968: jis0208<<14 | 0x38<<7 | 0x10, - 25226 - 19968: jis0208<<14 | 0x26<<7 | 0x23, - 25229 - 19968: jis0212<<14 | 0x1E<<7 | 0x24, - 25230 - 19968: jis0212<<14 | 0x1E<<7 | 0x25, - 25231 - 19968: jis0212<<14 | 0x1E<<7 | 0x26, - 25232 - 19968: jis0212<<14 | 0x1E<<7 | 0x27, - 25233 - 19968: jis0208<<14 | 0x2C<<7 | 0x3D, - 25234 - 19968: jis0208<<14 | 0x38<<7 | 0x12, - 25235 - 19968: jis0208<<14 | 0x38<<7 | 0x13, - 25236 - 19968: jis0208<<14 | 0x38<<7 | 0x17, - 25237 - 19968: jis0208<<14 | 0x24<<7 | 0x49, - 25238 - 19968: jis0208<<14 | 0x38<<7 | 0x14, - 25239 - 19968: jis0208<<14 | 0x18<<7 | 0x12, - 25240 - 19968: jis0208<<14 | 0x1F<<7 | 0x3D, - 25243 - 19968: jis0208<<14 | 0x38<<7 | 0x25, - 25244 - 19968: jis0208<<14 | 0x27<<7 | 0x13, - 25246 - 19968: jis0208<<14 | 0x21<<7 | 0x51, - 25254 - 19968: jis0208<<14 | 0x59<<7 | 0x0D, - 25256 - 19968: jis0212<<14 | 0x1E<<7 | 0x29, - 25259 - 19968: jis0208<<14 | 0x27<<7 | 0x43, - 25260 - 19968: jis0208<<14 | 0x39<<7 | 0x0C, - 25265 - 19968: jis0208<<14 | 0x29<<7 | 0x59, - 25267 - 19968: jis0212<<14 | 0x1E<<7 | 0x2A, - 25269 - 19968: jis0208<<14 | 0x23<<7 | 0x50, - 25270 - 19968: jis0212<<14 | 0x1E<<7 | 0x2B, - 25271 - 19968: jis0212<<14 | 0x1E<<7 | 0x2C, - 25273 - 19968: jis0208<<14 | 0x2A<<7 | 0x54, - 25274 - 19968: jis0212<<14 | 0x1E<<7 | 0x2D, - 25275 - 19968: jis0208<<14 | 0x38<<7 | 0x1A, - 25276 - 19968: jis0208<<14 | 0x11<<7 | 0x00, - 25277 - 19968: jis0208<<14 | 0x22<<7 | 0x49, - 25278 - 19968: jis0212<<14 | 0x1E<<7 | 0x2E, - 25279 - 19968: jis0212<<14 | 0x1E<<7 | 0x2F, - 25282 - 19968: jis0208<<14 | 0x38<<7 | 0x23, - 25284 - 19968: jis0212<<14 | 0x1E<<7 | 0x30, - 25285 - 19968: jis0208<<14 | 0x22<<7 | 0x13, - 25286 - 19968: jis0208<<14 | 0x38<<7 | 0x1D, - 25287 - 19968: jis0208<<14 | 0x38<<7 | 0x24, - 25288 - 19968: jis0208<<14 | 0x38<<7 | 0x1F, - 25289 - 19968: jis0208<<14 | 0x38<<7 | 0x26, - 25290 - 19968: jis0208<<14 | 0x38<<7 | 0x22, - 25292 - 19968: jis0208<<14 | 0x38<<7 | 0x21, - 25293 - 19968: jis0208<<14 | 0x26<<7 | 0x4E, - 25294 - 19968: jis0212<<14 | 0x1E<<7 | 0x31, - 25295 - 19968: jis0208<<14 | 0x38<<7 | 0x1B, - 25296 - 19968: jis0208<<14 | 0x11<<7 | 0x5C, - 25297 - 19968: jis0208<<14 | 0x38<<7 | 0x19, - 25298 - 19968: jis0208<<14 | 0x14<<7 | 0x50, - 25299 - 19968: jis0208<<14 | 0x21<<7 | 0x52, - 25300 - 19968: jis0208<<14 | 0x38<<7 | 0x15, - 25301 - 19968: jis0212<<14 | 0x1E<<7 | 0x32, - 25302 - 19968: jis0212<<14 | 0x1E<<7 | 0x33, - 25303 - 19968: jis0208<<14 | 0x38<<7 | 0x18, - 25304 - 19968: jis0208<<14 | 0x18<<7 | 0x13, - 25305 - 19968: jis0208<<14 | 0x1F<<7 | 0x3A, - 25306 - 19968: jis0212<<14 | 0x1E<<7 | 0x34, - 25307 - 19968: jis0208<<14 | 0x1D<<7 | 0x16, - 25308 - 19968: jis0208<<14 | 0x38<<7 | 0x20, - 25309 - 19968: jis0208<<14 | 0x26<<7 | 0x31, - 25312 - 19968: jis0208<<14 | 0x14<<7 | 0x51, - 25313 - 19968: jis0208<<14 | 0x12<<7 | 0x27, - 25322 - 19968: jis0212<<14 | 0x1E<<7 | 0x35, - 25324 - 19968: jis0208<<14 | 0x12<<7 | 0x46, - 25325 - 19968: jis0208<<14 | 0x1E<<7 | 0x00, - 25326 - 19968: jis0208<<14 | 0x38<<7 | 0x28, - 25327 - 19968: jis0208<<14 | 0x38<<7 | 0x2D, - 25329 - 19968: jis0208<<14 | 0x38<<7 | 0x29, - 25330 - 19968: jis0212<<14 | 0x1E<<7 | 0x36, - 25331 - 19968: jis0208<<14 | 0x16<<7 | 0x5C, - 25332 - 19968: jis0212<<14 | 0x1E<<7 | 0x37, - 25333 - 19968: jis0208<<14 | 0x38<<7 | 0x2E, - 25334 - 19968: jis0208<<14 | 0x1A<<7 | 0x01, - 25335 - 19968: jis0208<<14 | 0x18<<7 | 0x48, - 25340 - 19968: jis0212<<14 | 0x1E<<7 | 0x38, - 25341 - 19968: jis0212<<14 | 0x1E<<7 | 0x39, - 25342 - 19968: jis0208<<14 | 0x1C<<7 | 0x05, - 25343 - 19968: jis0208<<14 | 0x38<<7 | 0x1C, - 25345 - 19968: jis0208<<14 | 0x1A<<7 | 0x5C, - 25346 - 19968: jis0208<<14 | 0x38<<7 | 0x2B, - 25347 - 19968: jis0212<<14 | 0x1E<<7 | 0x3A, - 25348 - 19968: jis0212<<14 | 0x1E<<7 | 0x3B, - 25351 - 19968: jis0208<<14 | 0x1A<<7 | 0x37, - 25352 - 19968: jis0208<<14 | 0x38<<7 | 0x2C, - 25353 - 19968: jis0208<<14 | 0x0F<<7 | 0x23, - 25354 - 19968: jis0212<<14 | 0x1E<<7 | 0x3C, - 25355 - 19968: jis0212<<14 | 0x1E<<7 | 0x3D, - 25356 - 19968: jis0208<<14 | 0x38<<7 | 0x27, - 25357 - 19968: jis0212<<14 | 0x1E<<7 | 0x3E, - 25360 - 19968: jis0212<<14 | 0x1E<<7 | 0x3F, - 25361 - 19968: jis0208<<14 | 0x23<<7 | 0x08, - 25363 - 19968: jis0212<<14 | 0x1E<<7 | 0x40, - 25366 - 19968: jis0212<<14 | 0x1E<<7 | 0x41, - 25368 - 19968: jis0212<<14 | 0x1E<<7 | 0x42, - 25369 - 19968: jis0208<<14 | 0x14<<7 | 0x52, - 25375 - 19968: jis0208<<14 | 0x15<<7 | 0x13, - 25383 - 19968: jis0208<<14 | 0x38<<7 | 0x2A, - 25384 - 19968: jis0208<<14 | 0x0F<<7 | 0x06, - 25385 - 19968: jis0212<<14 | 0x1E<<7 | 0x43, - 25386 - 19968: jis0212<<14 | 0x1E<<7 | 0x44, - 25387 - 19968: jis0208<<14 | 0x19<<7 | 0x22, - 25389 - 19968: jis0212<<14 | 0x1E<<7 | 0x45, - 25391 - 19968: jis0208<<14 | 0x1E<<7 | 0x15, - 25397 - 19968: jis0212<<14 | 0x1E<<7 | 0x46, - 25398 - 19968: jis0212<<14 | 0x1E<<7 | 0x47, - 25401 - 19968: jis0212<<14 | 0x1E<<7 | 0x48, - 25402 - 19968: jis0208<<14 | 0x23<<7 | 0x51, - 25404 - 19968: jis0212<<14 | 0x1E<<7 | 0x49, - 25405 - 19968: jis0208<<14 | 0x27<<7 | 0x33, - 25406 - 19968: jis0208<<14 | 0x38<<7 | 0x30, - 25407 - 19968: jis0208<<14 | 0x20<<7 | 0x3D, - 25409 - 19968: jis0212<<14 | 0x1E<<7 | 0x4A, - 25410 - 19968: jis0212<<14 | 0x1E<<7 | 0x4B, - 25411 - 19968: jis0212<<14 | 0x1E<<7 | 0x4C, - 25412 - 19968: jis0212<<14 | 0x1E<<7 | 0x4D, - 25414 - 19968: jis0212<<14 | 0x1E<<7 | 0x4E, - 25417 - 19968: jis0208<<14 | 0x21<<7 | 0x09, - 25418 - 19968: jis0212<<14 | 0x1E<<7 | 0x4F, - 25419 - 19968: jis0212<<14 | 0x1E<<7 | 0x50, - 25420 - 19968: jis0208<<14 | 0x1A<<7 | 0x0A, - 25421 - 19968: jis0208<<14 | 0x38<<7 | 0x31, - 25422 - 19968: jis0212<<14 | 0x1E<<7 | 0x51, - 25423 - 19968: jis0208<<14 | 0x38<<7 | 0x33, - 25424 - 19968: jis0208<<14 | 0x38<<7 | 0x2F, - 25426 - 19968: jis0212<<14 | 0x1E<<7 | 0x52, - 25427 - 19968: jis0212<<14 | 0x1E<<7 | 0x53, - 25428 - 19968: jis0212<<14 | 0x1E<<7 | 0x54, - 25429 - 19968: jis0208<<14 | 0x29<<7 | 0x40, - 25431 - 19968: jis0208<<14 | 0x23<<7 | 0x1C, - 25432 - 19968: jis0212<<14 | 0x1E<<7 | 0x55, - 25435 - 19968: jis0212<<14 | 0x1E<<7 | 0x56, - 25436 - 19968: jis0208<<14 | 0x20<<7 | 0x3B, - 25445 - 19968: jis0212<<14 | 0x1E<<7 | 0x57, - 25446 - 19968: jis0212<<14 | 0x1E<<7 | 0x58, - 25447 - 19968: jis0208<<14 | 0x29<<7 | 0x5A, - 25448 - 19968: jis0208<<14 | 0x1B<<7 | 0x2D, - 25449 - 19968: jis0208<<14 | 0x38<<7 | 0x3F, - 25451 - 19968: jis0208<<14 | 0x38<<7 | 0x3E, - 25452 - 19968: jis0212<<14 | 0x1E<<7 | 0x59, - 25453 - 19968: jis0212<<14 | 0x1E<<7 | 0x5A, - 25454 - 19968: jis0208<<14 | 0x1E<<7 | 0x57, - 25457 - 19968: jis0212<<14 | 0x1E<<7 | 0x5B, - 25458 - 19968: jis0208<<14 | 0x16<<7 | 0x5D, - 25460 - 19968: jis0212<<14 | 0x1E<<7 | 0x5C, - 25461 - 19968: jis0212<<14 | 0x1E<<7 | 0x5D, - 25462 - 19968: jis0208<<14 | 0x38<<7 | 0x38, - 25463 - 19968: jis0208<<14 | 0x1D<<7 | 0x18, - 25464 - 19968: jis0212<<14 | 0x1F<<7 | 0x00, - 25466 - 19968: jis0208<<14 | 0x25<<7 | 0x47, - 25467 - 19968: jis0208<<14 | 0x26<<7 | 0x10, - 25468 - 19968: jis0212<<14 | 0x1F<<7 | 0x01, - 25469 - 19968: jis0212<<14 | 0x1F<<7 | 0x02, - 25471 - 19968: jis0212<<14 | 0x1F<<7 | 0x03, - 25472 - 19968: jis0208<<14 | 0x38<<7 | 0x36, - 25474 - 19968: jis0212<<14 | 0x1F<<7 | 0x04, - 25475 - 19968: jis0208<<14 | 0x20<<7 | 0x3C, - 25476 - 19968: jis0212<<14 | 0x1F<<7 | 0x05, - 25479 - 19968: jis0212<<14 | 0x1F<<7 | 0x06, - 25480 - 19968: jis0208<<14 | 0x1B<<7 | 0x57, - 25481 - 19968: jis0208<<14 | 0x38<<7 | 0x3B, - 25482 - 19968: jis0212<<14 | 0x1F<<7 | 0x07, - 25484 - 19968: jis0208<<14 | 0x1D<<7 | 0x17, - 25486 - 19968: jis0208<<14 | 0x38<<7 | 0x35, - 25487 - 19968: jis0208<<14 | 0x38<<7 | 0x3A, - 25488 - 19968: jis0212<<14 | 0x1F<<7 | 0x08, - 25490 - 19968: jis0208<<14 | 0x26<<7 | 0x32, - 25492 - 19968: jis0212<<14 | 0x1F<<7 | 0x09, - 25493 - 19968: jis0212<<14 | 0x1F<<7 | 0x0A, - 25494 - 19968: jis0208<<14 | 0x38<<7 | 0x34, - 25496 - 19968: jis0208<<14 | 0x16<<7 | 0x00, - 25497 - 19968: jis0212<<14 | 0x1F<<7 | 0x0B, - 25498 - 19968: jis0212<<14 | 0x1F<<7 | 0x0C, - 25499 - 19968: jis0208<<14 | 0x12<<7 | 0x3C, - 25502 - 19968: jis0212<<14 | 0x1F<<7 | 0x0D, - 25503 - 19968: jis0208<<14 | 0x38<<7 | 0x3C, - 25504 - 19968: jis0208<<14 | 0x2D<<7 | 0x0A, - 25505 - 19968: jis0208<<14 | 0x19<<7 | 0x2D, - 25506 - 19968: jis0208<<14 | 0x22<<7 | 0x14, - 25507 - 19968: jis0208<<14 | 0x38<<7 | 0x39, - 25508 - 19968: jis0212<<14 | 0x1F<<7 | 0x0E, - 25509 - 19968: jis0208<<14 | 0x1F<<7 | 0x3B, - 25510 - 19968: jis0212<<14 | 0x1F<<7 | 0x0F, - 25511 - 19968: jis0208<<14 | 0x18<<7 | 0x14, - 25512 - 19968: jis0208<<14 | 0x1E<<7 | 0x43, - 25513 - 19968: jis0208<<14 | 0x10<<7 | 0x45, - 25514 - 19968: jis0208<<14 | 0x20<<7 | 0x1B, - 25515 - 19968: jis0208<<14 | 0x38<<7 | 0x37, - 25516 - 19968: jis0208<<14 | 0x14<<7 | 0x24, - 25517 - 19968: jis0212<<14 | 0x1F<<7 | 0x10, - 25518 - 19968: jis0212<<14 | 0x1F<<7 | 0x11, - 25519 - 19968: jis0212<<14 | 0x1F<<7 | 0x12, - 25522 - 19968: jis0208<<14 | 0x16<<7 | 0x26, - 25524 - 19968: jis0208<<14 | 0x23<<7 | 0x2E, - 25525 - 19968: jis0208<<14 | 0x38<<7 | 0x3D, - 25531 - 19968: jis0208<<14 | 0x20<<7 | 0x3E, - 25533 - 19968: jis0212<<14 | 0x1F<<7 | 0x13, - 25534 - 19968: jis0208<<14 | 0x38<<7 | 0x40, - 25536 - 19968: jis0208<<14 | 0x38<<7 | 0x42, - 25537 - 19968: jis0212<<14 | 0x1F<<7 | 0x14, - 25539 - 19968: jis0208<<14 | 0x21<<7 | 0x16, - 25540 - 19968: jis0208<<14 | 0x38<<7 | 0x48, - 25541 - 19968: jis0212<<14 | 0x1F<<7 | 0x15, - 25542 - 19968: jis0208<<14 | 0x38<<7 | 0x43, - 25544 - 19968: jis0212<<14 | 0x1F<<7 | 0x16, - 25545 - 19968: jis0208<<14 | 0x38<<7 | 0x45, - 25550 - 19968: jis0212<<14 | 0x1F<<7 | 0x17, - 25551 - 19968: jis0208<<14 | 0x28<<7 | 0x20, - 25552 - 19968: jis0208<<14 | 0x23<<7 | 0x52, - 25553 - 19968: jis0212<<14 | 0x1F<<7 | 0x18, - 25554 - 19968: jis0208<<14 | 0x38<<7 | 0x46, - 25555 - 19968: jis0212<<14 | 0x1F<<7 | 0x19, - 25556 - 19968: jis0212<<14 | 0x1F<<7 | 0x1A, - 25557 - 19968: jis0212<<14 | 0x1F<<7 | 0x1B, - 25558 - 19968: jis0208<<14 | 0x2C<<7 | 0x0B, - 25562 - 19968: jis0208<<14 | 0x2C<<7 | 0x27, - 25563 - 19968: jis0208<<14 | 0x13<<7 | 0x18, - 25564 - 19968: jis0212<<14 | 0x1F<<7 | 0x1C, - 25568 - 19968: jis0212<<14 | 0x1F<<7 | 0x1D, - 25569 - 19968: jis0208<<14 | 0x0F<<7 | 0x0D, - 25571 - 19968: jis0208<<14 | 0x38<<7 | 0x44, - 25573 - 19968: jis0212<<14 | 0x1F<<7 | 0x1E, - 25577 - 19968: jis0208<<14 | 0x38<<7 | 0x41, - 25578 - 19968: jis0212<<14 | 0x1F<<7 | 0x1F, - 25580 - 19968: jis0212<<14 | 0x1F<<7 | 0x20, - 25582 - 19968: jis0208<<14 | 0x13<<7 | 0x57, - 25586 - 19968: jis0212<<14 | 0x1F<<7 | 0x21, - 25587 - 19968: jis0212<<14 | 0x1F<<7 | 0x22, - 25588 - 19968: jis0208<<14 | 0x10<<7 | 0x46, - 25589 - 19968: jis0208<<14 | 0x59<<7 | 0x0E, - 25590 - 19968: jis0208<<14 | 0x38<<7 | 0x47, - 25592 - 19968: jis0212<<14 | 0x1F<<7 | 0x24, - 25593 - 19968: jis0212<<14 | 0x1F<<7 | 0x25, - 25594 - 19968: jis0208<<14 | 0x2C<<7 | 0x28, - 25606 - 19968: jis0208<<14 | 0x38<<7 | 0x4B, - 25609 - 19968: jis0212<<14 | 0x1F<<7 | 0x26, - 25610 - 19968: jis0212<<14 | 0x1F<<7 | 0x27, - 25613 - 19968: jis0208<<14 | 0x21<<7 | 0x1A, - 25615 - 19968: jis0208<<14 | 0x38<<7 | 0x52, - 25616 - 19968: jis0212<<14 | 0x1F<<7 | 0x28, - 25618 - 19968: jis0212<<14 | 0x1F<<7 | 0x29, - 25619 - 19968: jis0208<<14 | 0x38<<7 | 0x4C, - 25620 - 19968: jis0212<<14 | 0x1F<<7 | 0x2A, - 25622 - 19968: jis0208<<14 | 0x38<<7 | 0x49, - 25623 - 19968: jis0208<<14 | 0x38<<7 | 0x50, - 25624 - 19968: jis0212<<14 | 0x1F<<7 | 0x2B, - 25628 - 19968: jis0208<<14 | 0x38<<7 | 0x32, - 25630 - 19968: jis0212<<14 | 0x1F<<7 | 0x2C, - 25632 - 19968: jis0212<<14 | 0x1F<<7 | 0x2D, - 25634 - 19968: jis0212<<14 | 0x1F<<7 | 0x2E, - 25636 - 19968: jis0212<<14 | 0x1F<<7 | 0x2F, - 25637 - 19968: jis0212<<14 | 0x1F<<7 | 0x30, - 25638 - 19968: jis0208<<14 | 0x38<<7 | 0x4D, - 25640 - 19968: jis0208<<14 | 0x38<<7 | 0x51, - 25641 - 19968: jis0212<<14 | 0x1F<<7 | 0x31, - 25642 - 19968: jis0212<<14 | 0x1F<<7 | 0x32, - 25644 - 19968: jis0208<<14 | 0x27<<7 | 0x21, - 25645 - 19968: jis0208<<14 | 0x24<<7 | 0x4A, - 25647 - 19968: jis0212<<14 | 0x1F<<7 | 0x33, - 25648 - 19968: jis0212<<14 | 0x1F<<7 | 0x34, - 25652 - 19968: jis0208<<14 | 0x38<<7 | 0x4A, - 25653 - 19968: jis0212<<14 | 0x1F<<7 | 0x35, - 25654 - 19968: jis0208<<14 | 0x38<<7 | 0x4E, - 25658 - 19968: jis0208<<14 | 0x16<<7 | 0x27, - 25661 - 19968: jis0212<<14 | 0x1F<<7 | 0x36, - 25662 - 19968: jis0208<<14 | 0x19<<7 | 0x50, - 25663 - 19968: jis0212<<14 | 0x1F<<7 | 0x37, - 25666 - 19968: jis0208<<14 | 0x1F<<7 | 0x3C, - 25675 - 19968: jis0212<<14 | 0x1F<<7 | 0x38, - 25678 - 19968: jis0208<<14 | 0x38<<7 | 0x56, - 25679 - 19968: jis0212<<14 | 0x1F<<7 | 0x39, - 25681 - 19968: jis0212<<14 | 0x1F<<7 | 0x3A, - 25682 - 19968: jis0212<<14 | 0x1F<<7 | 0x3B, - 25683 - 19968: jis0212<<14 | 0x1F<<7 | 0x3C, - 25684 - 19968: jis0212<<14 | 0x1F<<7 | 0x3D, - 25688 - 19968: jis0208<<14 | 0x24<<7 | 0x05, - 25690 - 19968: jis0212<<14 | 0x1F<<7 | 0x3E, - 25691 - 19968: jis0212<<14 | 0x1F<<7 | 0x3F, - 25692 - 19968: jis0212<<14 | 0x1F<<7 | 0x40, - 25693 - 19968: jis0212<<14 | 0x1F<<7 | 0x41, - 25695 - 19968: jis0212<<14 | 0x1F<<7 | 0x42, - 25696 - 19968: jis0208<<14 | 0x59<<7 | 0x0F, - 25697 - 19968: jis0212<<14 | 0x1F<<7 | 0x44, - 25699 - 19968: jis0212<<14 | 0x1F<<7 | 0x45, - 25703 - 19968: jis0208<<14 | 0x38<<7 | 0x53, - 25705 - 19968: jis0208<<14 | 0x2A<<7 | 0x3F, - 25709 - 19968: jis0212<<14 | 0x1F<<7 | 0x46, - 25711 - 19968: jis0208<<14 | 0x38<<7 | 0x54, - 25715 - 19968: jis0212<<14 | 0x1F<<7 | 0x47, - 25716 - 19968: jis0212<<14 | 0x1F<<7 | 0x48, - 25718 - 19968: jis0208<<14 | 0x38<<7 | 0x55, - 25720 - 19968: jis0208<<14 | 0x2B<<7 | 0x2D, - 25722 - 19968: jis0208<<14 | 0x1F<<7 | 0x01, - 25723 - 19968: jis0212<<14 | 0x1F<<7 | 0x49, - 25725 - 19968: jis0212<<14 | 0x1F<<7 | 0x4A, - 25731 - 19968: jis0208<<14 | 0x16<<7 | 0x41, - 25733 - 19968: jis0212<<14 | 0x1F<<7 | 0x4B, - 25735 - 19968: jis0212<<14 | 0x1F<<7 | 0x4C, - 25736 - 19968: jis0208<<14 | 0x38<<7 | 0x5C, - 25743 - 19968: jis0212<<14 | 0x1F<<7 | 0x4D, - 25744 - 19968: jis0212<<14 | 0x1F<<7 | 0x4E, - 25745 - 19968: jis0212<<14 | 0x1F<<7 | 0x4F, - 25746 - 19968: jis0208<<14 | 0x1A<<7 | 0x14, - 25747 - 19968: jis0208<<14 | 0x38<<7 | 0x59, - 25749 - 19968: jis0208<<14 | 0x38<<7 | 0x58, - 25752 - 19968: jis0212<<14 | 0x1F<<7 | 0x50, - 25753 - 19968: jis0212<<14 | 0x1F<<7 | 0x51, - 25754 - 19968: jis0208<<14 | 0x26<<7 | 0x11, - 25755 - 19968: jis0212<<14 | 0x1F<<7 | 0x52, - 25757 - 19968: jis0208<<14 | 0x59<<7 | 0x10, - 25758 - 19968: jis0208<<14 | 0x25<<7 | 0x14, - 25759 - 19968: jis0212<<14 | 0x1F<<7 | 0x54, - 25761 - 19968: jis0212<<14 | 0x1F<<7 | 0x55, - 25763 - 19968: jis0212<<14 | 0x1F<<7 | 0x56, - 25764 - 19968: jis0208<<14 | 0x24<<7 | 0x10, - 25765 - 19968: jis0208<<14 | 0x38<<7 | 0x5A, - 25766 - 19968: jis0212<<14 | 0x1F<<7 | 0x57, - 25768 - 19968: jis0212<<14 | 0x1F<<7 | 0x58, - 25769 - 19968: jis0208<<14 | 0x38<<7 | 0x5B, - 25771 - 19968: jis0208<<14 | 0x28<<7 | 0x4E, - 25772 - 19968: jis0212<<14 | 0x1F<<7 | 0x59, - 25773 - 19968: jis0208<<14 | 0x26<<7 | 0x24, - 25774 - 19968: jis0208<<14 | 0x1A<<7 | 0x02, - 25776 - 19968: jis0208<<14 | 0x1F<<7 | 0x50, - 25778 - 19968: jis0208<<14 | 0x2A<<7 | 0x2F, - 25779 - 19968: jis0212<<14 | 0x1F<<7 | 0x5A, - 25785 - 19968: jis0208<<14 | 0x12<<7 | 0x28, - 25787 - 19968: jis0208<<14 | 0x39<<7 | 0x04, - 25788 - 19968: jis0208<<14 | 0x38<<7 | 0x5D, - 25789 - 19968: jis0212<<14 | 0x1F<<7 | 0x5B, - 25790 - 19968: jis0212<<14 | 0x1F<<7 | 0x5C, - 25791 - 19968: jis0212<<14 | 0x1F<<7 | 0x5D, - 25793 - 19968: jis0208<<14 | 0x2C<<7 | 0x29, - 25794 - 19968: jis0208<<14 | 0x39<<7 | 0x06, - 25796 - 19968: jis0212<<14 | 0x20<<7 | 0x00, - 25797 - 19968: jis0208<<14 | 0x39<<7 | 0x02, - 25799 - 19968: jis0208<<14 | 0x39<<7 | 0x03, - 25801 - 19968: jis0212<<14 | 0x20<<7 | 0x01, - 25802 - 19968: jis0212<<14 | 0x20<<7 | 0x02, - 25803 - 19968: jis0212<<14 | 0x20<<7 | 0x03, - 25804 - 19968: jis0212<<14 | 0x20<<7 | 0x04, - 25805 - 19968: jis0208<<14 | 0x20<<7 | 0x3F, - 25806 - 19968: jis0208<<14 | 0x59<<7 | 0x11, - 25808 - 19968: jis0212<<14 | 0x20<<7 | 0x06, - 25809 - 19968: jis0212<<14 | 0x20<<7 | 0x07, - 25810 - 19968: jis0208<<14 | 0x39<<7 | 0x01, - 25812 - 19968: jis0208<<14 | 0x38<<7 | 0x1E, - 25813 - 19968: jis0212<<14 | 0x20<<7 | 0x08, - 25815 - 19968: jis0212<<14 | 0x20<<7 | 0x09, - 25816 - 19968: jis0208<<14 | 0x39<<7 | 0x05, - 25818 - 19968: jis0208<<14 | 0x39<<7 | 0x00, - 25824 - 19968: jis0208<<14 | 0x39<<7 | 0x0A, - 25825 - 19968: jis0208<<14 | 0x39<<7 | 0x0B, - 25826 - 19968: jis0208<<14 | 0x24<<7 | 0x06, - 25827 - 19968: jis0208<<14 | 0x39<<7 | 0x0D, - 25828 - 19968: jis0212<<14 | 0x20<<7 | 0x0A, - 25829 - 19968: jis0212<<14 | 0x20<<7 | 0x0B, - 25830 - 19968: jis0208<<14 | 0x1A<<7 | 0x03, - 25831 - 19968: jis0208<<14 | 0x39<<7 | 0x08, - 25833 - 19968: jis0212<<14 | 0x20<<7 | 0x0C, - 25834 - 19968: jis0212<<14 | 0x20<<7 | 0x0D, - 25836 - 19968: jis0208<<14 | 0x14<<7 | 0x1B, - 25837 - 19968: jis0212<<14 | 0x20<<7 | 0x0E, - 25839 - 19968: jis0208<<14 | 0x39<<7 | 0x0E, - 25840 - 19968: jis0212<<14 | 0x20<<7 | 0x0F, - 25841 - 19968: jis0208<<14 | 0x39<<7 | 0x07, - 25842 - 19968: jis0208<<14 | 0x39<<7 | 0x12, - 25844 - 19968: jis0208<<14 | 0x39<<7 | 0x11, - 25845 - 19968: jis0212<<14 | 0x20<<7 | 0x10, - 25846 - 19968: jis0208<<14 | 0x39<<7 | 0x10, - 25847 - 19968: jis0212<<14 | 0x20<<7 | 0x11, - 25850 - 19968: jis0208<<14 | 0x39<<7 | 0x13, - 25851 - 19968: jis0212<<14 | 0x20<<7 | 0x12, - 25853 - 19968: jis0208<<14 | 0x39<<7 | 0x15, - 25854 - 19968: jis0208<<14 | 0x1D<<7 | 0x50, - 25855 - 19968: jis0212<<14 | 0x20<<7 | 0x13, - 25856 - 19968: jis0208<<14 | 0x39<<7 | 0x14, - 25857 - 19968: jis0212<<14 | 0x20<<7 | 0x14, - 25860 - 19968: jis0212<<14 | 0x20<<7 | 0x15, - 25861 - 19968: jis0208<<14 | 0x39<<7 | 0x18, - 25864 - 19968: jis0212<<14 | 0x20<<7 | 0x16, - 25865 - 19968: jis0212<<14 | 0x20<<7 | 0x17, - 25866 - 19968: jis0212<<14 | 0x20<<7 | 0x18, - 25871 - 19968: jis0212<<14 | 0x20<<7 | 0x19, - 25875 - 19968: jis0212<<14 | 0x20<<7 | 0x1A, - 25876 - 19968: jis0212<<14 | 0x20<<7 | 0x1B, - 25878 - 19968: jis0212<<14 | 0x20<<7 | 0x1C, - 25880 - 19968: jis0208<<14 | 0x39<<7 | 0x16, - 25881 - 19968: jis0212<<14 | 0x20<<7 | 0x1D, - 25883 - 19968: jis0212<<14 | 0x20<<7 | 0x1E, - 25884 - 19968: jis0208<<14 | 0x39<<7 | 0x17, - 25885 - 19968: jis0208<<14 | 0x38<<7 | 0x4F, - 25886 - 19968: jis0212<<14 | 0x20<<7 | 0x1F, - 25887 - 19968: jis0212<<14 | 0x20<<7 | 0x20, - 25890 - 19968: jis0212<<14 | 0x20<<7 | 0x21, - 25891 - 19968: jis0208<<14 | 0x39<<7 | 0x1A, - 25892 - 19968: jis0208<<14 | 0x39<<7 | 0x19, - 25894 - 19968: jis0212<<14 | 0x20<<7 | 0x22, - 25897 - 19968: jis0212<<14 | 0x20<<7 | 0x23, - 25898 - 19968: jis0208<<14 | 0x38<<7 | 0x57, - 25899 - 19968: jis0208<<14 | 0x39<<7 | 0x1B, - 25900 - 19968: jis0208<<14 | 0x39<<7 | 0x0F, - 25902 - 19968: jis0212<<14 | 0x20<<7 | 0x24, - 25903 - 19968: jis0208<<14 | 0x1A<<7 | 0x38, - 25905 - 19968: jis0212<<14 | 0x20<<7 | 0x25, - 25908 - 19968: jis0208<<14 | 0x39<<7 | 0x1C, - 25909 - 19968: jis0208<<14 | 0x39<<7 | 0x1D, - 25910 - 19968: jis0208<<14 | 0x39<<7 | 0x1F, - 25911 - 19968: jis0208<<14 | 0x39<<7 | 0x1E, - 25912 - 19968: jis0208<<14 | 0x39<<7 | 0x20, - 25913 - 19968: jis0208<<14 | 0x11<<7 | 0x5D, - 25914 - 19968: jis0212<<14 | 0x20<<7 | 0x26, - 25915 - 19968: jis0208<<14 | 0x18<<7 | 0x15, - 25916 - 19968: jis0212<<14 | 0x20<<7 | 0x27, - 25917 - 19968: jis0212<<14 | 0x20<<7 | 0x28, - 25918 - 19968: jis0208<<14 | 0x29<<7 | 0x5B, - 25919 - 19968: jis0208<<14 | 0x1F<<7 | 0x0E, - 25923 - 19968: jis0212<<14 | 0x20<<7 | 0x29, - 25925 - 19968: jis0208<<14 | 0x17<<7 | 0x2D, - 25927 - 19968: jis0212<<14 | 0x20<<7 | 0x2A, - 25928 - 19968: jis0208<<14 | 0x39<<7 | 0x22, - 25929 - 19968: jis0212<<14 | 0x20<<7 | 0x2B, - 25933 - 19968: jis0208<<14 | 0x39<<7 | 0x25, - 25934 - 19968: jis0208<<14 | 0x59<<7 | 0x12, - 25935 - 19968: jis0208<<14 | 0x28<<7 | 0x31, - 25936 - 19968: jis0212<<14 | 0x20<<7 | 0x2C, - 25937 - 19968: jis0208<<14 | 0x14<<7 | 0x3E, - 25938 - 19968: jis0212<<14 | 0x20<<7 | 0x2D, - 25940 - 19968: jis0212<<14 | 0x20<<7 | 0x2E, - 25941 - 19968: jis0208<<14 | 0x39<<7 | 0x24, - 25942 - 19968: jis0208<<14 | 0x39<<7 | 0x23, - 25943 - 19968: jis0208<<14 | 0x26<<7 | 0x33, - 25944 - 19968: jis0208<<14 | 0x39<<7 | 0x26, - 25945 - 19968: jis0208<<14 | 0x15<<7 | 0x14, - 25949 - 19968: jis0208<<14 | 0x39<<7 | 0x28, - 25950 - 19968: jis0208<<14 | 0x39<<7 | 0x27, - 25951 - 19968: jis0212<<14 | 0x20<<7 | 0x2F, - 25952 - 19968: jis0212<<14 | 0x20<<7 | 0x30, - 25954 - 19968: jis0208<<14 | 0x13<<7 | 0x19, - 25955 - 19968: jis0208<<14 | 0x1A<<7 | 0x15, - 25958 - 19968: jis0208<<14 | 0x25<<7 | 0x37, - 25959 - 19968: jis0212<<14 | 0x20<<7 | 0x31, - 25963 - 19968: jis0212<<14 | 0x20<<7 | 0x32, - 25964 - 19968: jis0208<<14 | 0x16<<7 | 0x28, - 25968 - 19968: jis0208<<14 | 0x1E<<7 | 0x53, - 25970 - 19968: jis0208<<14 | 0x39<<7 | 0x29, - 25972 - 19968: jis0208<<14 | 0x1F<<7 | 0x0F, - 25973 - 19968: jis0208<<14 | 0x24<<7 | 0x07, - 25975 - 19968: jis0208<<14 | 0x28<<7 | 0x3E, - 25976 - 19968: jis0208<<14 | 0x39<<7 | 0x2A, - 25978 - 19968: jis0212<<14 | 0x20<<7 | 0x33, - 25981 - 19968: jis0212<<14 | 0x20<<7 | 0x34, - 25985 - 19968: jis0212<<14 | 0x20<<7 | 0x35, - 25986 - 19968: jis0208<<14 | 0x39<<7 | 0x2B, - 25987 - 19968: jis0208<<14 | 0x39<<7 | 0x2C, - 25989 - 19968: jis0212<<14 | 0x20<<7 | 0x36, - 25991 - 19968: jis0208<<14 | 0x29<<7 | 0x17, - 25992 - 19968: jis0208<<14 | 0x34<<7 | 0x3C, - 25993 - 19968: jis0208<<14 | 0x1F<<7 | 0x25, - 25994 - 19968: jis0212<<14 | 0x20<<7 | 0x37, - 25996 - 19968: jis0208<<14 | 0x28<<7 | 0x2B, - 25998 - 19968: jis0208<<14 | 0x19<<7 | 0x37, - 26000 - 19968: jis0208<<14 | 0x27<<7 | 0x44, - 26001 - 19968: jis0208<<14 | 0x27<<7 | 0x22, - 26002 - 19968: jis0212<<14 | 0x20<<7 | 0x38, - 26005 - 19968: jis0212<<14 | 0x20<<7 | 0x39, - 26007 - 19968: jis0208<<14 | 0x24<<7 | 0x2C, - 26008 - 19968: jis0212<<14 | 0x20<<7 | 0x3A, - 26009 - 19968: jis0208<<14 | 0x2D<<7 | 0x20, - 26011 - 19968: jis0208<<14 | 0x39<<7 | 0x2E, - 26012 - 19968: jis0208<<14 | 0x1B<<7 | 0x2F, - 26013 - 19968: jis0212<<14 | 0x20<<7 | 0x3B, - 26015 - 19968: jis0208<<14 | 0x39<<7 | 0x2F, - 26016 - 19968: jis0212<<14 | 0x20<<7 | 0x3C, - 26017 - 19968: jis0208<<14 | 0x0F<<7 | 0x15, - 26019 - 19968: jis0212<<14 | 0x20<<7 | 0x3D, - 26020 - 19968: jis0208<<14 | 0x15<<7 | 0x33, - 26021 - 19968: jis0208<<14 | 0x1F<<7 | 0x2C, - 26022 - 19968: jis0212<<14 | 0x20<<7 | 0x3E, - 26023 - 19968: jis0208<<14 | 0x28<<7 | 0x3F, - 26027 - 19968: jis0208<<14 | 0x39<<7 | 0x30, - 26028 - 19968: jis0208<<14 | 0x1A<<7 | 0x21, - 26029 - 19968: jis0208<<14 | 0x22<<7 | 0x26, - 26030 - 19968: jis0212<<14 | 0x20<<7 | 0x3F, - 26031 - 19968: jis0208<<14 | 0x1A<<7 | 0x3A, - 26032 - 19968: jis0208<<14 | 0x1E<<7 | 0x16, - 26034 - 19968: jis0212<<14 | 0x20<<7 | 0x40, - 26035 - 19968: jis0212<<14 | 0x20<<7 | 0x41, - 26036 - 19968: jis0212<<14 | 0x20<<7 | 0x42, - 26039 - 19968: jis0208<<14 | 0x39<<7 | 0x31, - 26041 - 19968: jis0208<<14 | 0x29<<7 | 0x5C, - 26044 - 19968: jis0208<<14 | 0x10<<7 | 0x56, - 26045 - 19968: jis0208<<14 | 0x1A<<7 | 0x3B, - 26047 - 19968: jis0212<<14 | 0x20<<7 | 0x43, - 26049 - 19968: jis0208<<14 | 0x39<<7 | 0x34, - 26050 - 19968: jis0212<<14 | 0x20<<7 | 0x44, - 26051 - 19968: jis0208<<14 | 0x39<<7 | 0x32, - 26052 - 19968: jis0208<<14 | 0x39<<7 | 0x35, - 26053 - 19968: jis0208<<14 | 0x2D<<7 | 0x18, - 26054 - 19968: jis0208<<14 | 0x39<<7 | 0x33, - 26056 - 19968: jis0212<<14 | 0x20<<7 | 0x45, - 26057 - 19968: jis0212<<14 | 0x20<<7 | 0x46, - 26059 - 19968: jis0208<<14 | 0x1F<<7 | 0x5A, - 26060 - 19968: jis0208<<14 | 0x39<<7 | 0x36, - 26062 - 19968: jis0212<<14 | 0x20<<7 | 0x47, - 26063 - 19968: jis0208<<14 | 0x21<<7 | 0x11, - 26064 - 19968: jis0212<<14 | 0x20<<7 | 0x48, - 26066 - 19968: jis0208<<14 | 0x39<<7 | 0x37, - 26068 - 19968: jis0212<<14 | 0x20<<7 | 0x49, - 26070 - 19968: jis0212<<14 | 0x20<<7 | 0x4A, - 26071 - 19968: jis0208<<14 | 0x13<<7 | 0x59, - 26072 - 19968: jis0212<<14 | 0x20<<7 | 0x4B, - 26073 - 19968: jis0208<<14 | 0x39<<7 | 0x39, - 26075 - 19968: jis0208<<14 | 0x39<<7 | 0x38, - 26079 - 19968: jis0212<<14 | 0x20<<7 | 0x4C, - 26080 - 19968: jis0208<<14 | 0x39<<7 | 0x3A, - 26081 - 19968: jis0208<<14 | 0x39<<7 | 0x3B, - 26082 - 19968: jis0208<<14 | 0x13<<7 | 0x5A, - 26085 - 19968: jis0208<<14 | 0x25<<7 | 0x5B, - 26086 - 19968: jis0208<<14 | 0x22<<7 | 0x15, - 26087 - 19968: jis0208<<14 | 0x14<<7 | 0x4B, - 26088 - 19968: jis0208<<14 | 0x1A<<7 | 0x3C, - 26089 - 19968: jis0208<<14 | 0x20<<7 | 0x40, - 26092 - 19968: jis0208<<14 | 0x1C<<7 | 0x3B, - 26093 - 19968: jis0208<<14 | 0x0F<<7 | 0x0F, - 26096 - 19968: jis0212<<14 | 0x20<<7 | 0x4D, - 26097 - 19968: jis0208<<14 | 0x39<<7 | 0x3C, - 26098 - 19968: jis0212<<14 | 0x20<<7 | 0x4E, - 26100 - 19968: jis0212<<14 | 0x20<<7 | 0x4F, - 26101 - 19968: jis0212<<14 | 0x20<<7 | 0x50, - 26105 - 19968: jis0212<<14 | 0x20<<7 | 0x51, - 26106 - 19968: jis0208<<14 | 0x11<<7 | 0x01, - 26107 - 19968: jis0208<<14 | 0x39<<7 | 0x40, - 26110 - 19968: jis0212<<14 | 0x20<<7 | 0x52, - 26111 - 19968: jis0212<<14 | 0x20<<7 | 0x53, - 26112 - 19968: jis0208<<14 | 0x59<<7 | 0x13, - 26114 - 19968: jis0208<<14 | 0x18<<7 | 0x16, - 26115 - 19968: jis0208<<14 | 0x39<<7 | 0x3F, - 26116 - 19968: jis0212<<14 | 0x20<<7 | 0x55, - 26118 - 19968: jis0208<<14 | 0x19<<7 | 0x0A, - 26119 - 19968: jis0208<<14 | 0x1D<<7 | 0x19, - 26120 - 19968: jis0212<<14 | 0x20<<7 | 0x56, - 26121 - 19968: jis0208<<14 | 0x59<<7 | 0x16, - 26122 - 19968: jis0208<<14 | 0x39<<7 | 0x3E, - 26124 - 19968: jis0208<<14 | 0x1D<<7 | 0x1A, - 26125 - 19968: jis0212<<14 | 0x20<<7 | 0x58, - 26126 - 19968: jis0208<<14 | 0x2B<<7 | 0x1F, - 26127 - 19968: jis0208<<14 | 0x19<<7 | 0x09, - 26129 - 19968: jis0212<<14 | 0x20<<7 | 0x59, - 26130 - 19968: jis0212<<14 | 0x20<<7 | 0x5A, - 26131 - 19968: jis0208<<14 | 0x0F<<7 | 0x36, - 26132 - 19968: jis0208<<14 | 0x1F<<7 | 0x2D, - 26133 - 19968: jis0208<<14 | 0x59<<7 | 0x14, - 26134 - 19968: jis0212<<14 | 0x20<<7 | 0x5C, - 26140 - 19968: jis0208<<14 | 0x39<<7 | 0x45, - 26141 - 19968: jis0212<<14 | 0x20<<7 | 0x5D, - 26142 - 19968: jis0208<<14 | 0x59<<7 | 0x18, - 26143 - 19968: jis0208<<14 | 0x1F<<7 | 0x10, - 26144 - 19968: jis0208<<14 | 0x10<<7 | 0x26, - 26145 - 19968: jis0212<<14 | 0x21<<7 | 0x01, - 26146 - 19968: jis0212<<14 | 0x21<<7 | 0x02, - 26147 - 19968: jis0212<<14 | 0x21<<7 | 0x03, - 26148 - 19968: jis0208<<14 | 0x59<<7 | 0x19, - 26149 - 19968: jis0208<<14 | 0x1C<<7 | 0x34, - 26150 - 19968: jis0212<<14 | 0x21<<7 | 0x05, - 26151 - 19968: jis0208<<14 | 0x2A<<7 | 0x45, - 26152 - 19968: jis0208<<14 | 0x19<<7 | 0x51, - 26153 - 19968: jis0212<<14 | 0x21<<7 | 0x06, - 26154 - 19968: jis0212<<14 | 0x21<<7 | 0x07, - 26155 - 19968: jis0212<<14 | 0x21<<7 | 0x08, - 26156 - 19968: jis0212<<14 | 0x21<<7 | 0x09, - 26157 - 19968: jis0208<<14 | 0x1D<<7 | 0x1B, - 26158 - 19968: jis0208<<14 | 0x59<<7 | 0x17, - 26159 - 19968: jis0208<<14 | 0x1F<<7 | 0x06, - 26160 - 19968: jis0212<<14 | 0x21<<7 | 0x0B, - 26161 - 19968: jis0208<<14 | 0x58<<7 | 0x07, - 26163 - 19968: jis0212<<14 | 0x21<<7 | 0x0D, - 26164 - 19968: jis0208<<14 | 0x39<<7 | 0x44, - 26165 - 19968: jis0208<<14 | 0x39<<7 | 0x42, - 26166 - 19968: jis0208<<14 | 0x39<<7 | 0x43, - 26167 - 19968: jis0212<<14 | 0x21<<7 | 0x0F, - 26169 - 19968: jis0212<<14 | 0x21<<7 | 0x0E, - 26171 - 19968: jis0208<<14 | 0x59<<7 | 0x15, - 26172 - 19968: jis0208<<14 | 0x22<<7 | 0x4A, - 26175 - 19968: jis0208<<14 | 0x3A<<7 | 0x05, - 26176 - 19968: jis0212<<14 | 0x21<<7 | 0x10, - 26177 - 19968: jis0208<<14 | 0x39<<7 | 0x49, - 26178 - 19968: jis0208<<14 | 0x1A<<7 | 0x5D, - 26179 - 19968: jis0208<<14 | 0x18<<7 | 0x17, - 26180 - 19968: jis0208<<14 | 0x39<<7 | 0x47, - 26181 - 19968: jis0212<<14 | 0x21<<7 | 0x11, - 26182 - 19968: jis0212<<14 | 0x21<<7 | 0x12, - 26185 - 19968: jis0208<<14 | 0x39<<7 | 0x48, - 26186 - 19968: jis0212<<14 | 0x21<<7 | 0x13, - 26187 - 19968: jis0208<<14 | 0x1E<<7 | 0x17, - 26188 - 19968: jis0212<<14 | 0x21<<7 | 0x14, - 26190 - 19968: jis0212<<14 | 0x21<<7 | 0x16, - 26191 - 19968: jis0208<<14 | 0x39<<7 | 0x46, - 26193 - 19968: jis0212<<14 | 0x21<<7 | 0x15, - 26194 - 19968: jis0208<<14 | 0x1A<<7 | 0x0E, - 26199 - 19968: jis0208<<14 | 0x59<<7 | 0x1B, - 26200 - 19968: jis0212<<14 | 0x21<<7 | 0x18, - 26201 - 19968: jis0208<<14 | 0x59<<7 | 0x1C, - 26203 - 19968: jis0212<<14 | 0x21<<7 | 0x1A, - 26204 - 19968: jis0212<<14 | 0x21<<7 | 0x1B, - 26205 - 19968: jis0208<<14 | 0x39<<7 | 0x4B, - 26206 - 19968: jis0208<<14 | 0x39<<7 | 0x4A, - 26207 - 19968: jis0208<<14 | 0x39<<7 | 0x4F, - 26208 - 19968: jis0212<<14 | 0x21<<7 | 0x1C, - 26209 - 19968: jis0212<<14 | 0x21<<7 | 0x1D, - 26210 - 19968: jis0208<<14 | 0x39<<7 | 0x50, - 26212 - 19968: jis0208<<14 | 0x39<<7 | 0x4C, - 26213 - 19968: jis0208<<14 | 0x59<<7 | 0x1A, - 26214 - 19968: jis0208<<14 | 0x12<<7 | 0x01, - 26215 - 19968: jis0208<<14 | 0x39<<7 | 0x4D, - 26216 - 19968: jis0208<<14 | 0x39<<7 | 0x4E, - 26217 - 19968: jis0208<<14 | 0x27<<7 | 0x34, - 26218 - 19968: jis0212<<14 | 0x21<<7 | 0x1F, - 26219 - 19968: jis0212<<14 | 0x21<<7 | 0x20, - 26220 - 19968: jis0212<<14 | 0x21<<7 | 0x21, - 26222 - 19968: jis0208<<14 | 0x28<<7 | 0x40, - 26223 - 19968: jis0208<<14 | 0x16<<7 | 0x29, - 26224 - 19968: jis0208<<14 | 0x39<<7 | 0x51, - 26227 - 19968: jis0208<<14 | 0x59<<7 | 0x1E, - 26228 - 19968: jis0208<<14 | 0x1F<<7 | 0x11, - 26229 - 19968: jis0212<<14 | 0x21<<7 | 0x24, - 26230 - 19968: jis0208<<14 | 0x1D<<7 | 0x1C, - 26231 - 19968: jis0212<<14 | 0x21<<7 | 0x26, - 26232 - 19968: jis0212<<14 | 0x21<<7 | 0x27, - 26233 - 19968: jis0212<<14 | 0x21<<7 | 0x28, - 26234 - 19968: jis0208<<14 | 0x22<<7 | 0x31, - 26235 - 19968: jis0212<<14 | 0x21<<7 | 0x29, - 26236 - 19968: jis0212<<14 | 0x21<<7 | 0x2B, - 26238 - 19968: jis0212<<14 | 0x21<<7 | 0x22, - 26239 - 19968: jis0212<<14 | 0x21<<7 | 0x25, - 26240 - 19968: jis0212<<14 | 0x21<<7 | 0x2A, - 26241 - 19968: jis0208<<14 | 0x15<<7 | 0x26, - 26243 - 19968: jis0208<<14 | 0x39<<7 | 0x52, - 26244 - 19968: jis0208<<14 | 0x39<<7 | 0x56, - 26247 - 19968: jis0208<<14 | 0x11<<7 | 0x2A, - 26248 - 19968: jis0208<<14 | 0x39<<7 | 0x53, - 26249 - 19968: jis0208<<14 | 0x39<<7 | 0x55, - 26251 - 19968: jis0212<<14 | 0x21<<7 | 0x2C, - 26252 - 19968: jis0212<<14 | 0x21<<7 | 0x2D, - 26253 - 19968: jis0212<<14 | 0x21<<7 | 0x2E, - 26254 - 19968: jis0208<<14 | 0x39<<7 | 0x54, - 26256 - 19968: jis0212<<14 | 0x21<<7 | 0x2F, - 26257 - 19968: jis0208<<14 | 0x1C<<7 | 0x4A, - 26258 - 19968: jis0212<<14 | 0x21<<7 | 0x30, - 26262 - 19968: jis0208<<14 | 0x22<<7 | 0x27, - 26263 - 19968: jis0208<<14 | 0x0F<<7 | 0x24, - 26264 - 19968: jis0208<<14 | 0x39<<7 | 0x57, - 26265 - 19968: jis0208<<14 | 0x59<<7 | 0x1F, - 26266 - 19968: jis0212<<14 | 0x21<<7 | 0x32, - 26267 - 19968: jis0212<<14 | 0x21<<7 | 0x33, - 26268 - 19968: jis0212<<14 | 0x21<<7 | 0x34, - 26269 - 19968: jis0208<<14 | 0x39<<7 | 0x58, - 26271 - 19968: jis0212<<14 | 0x21<<7 | 0x35, - 26272 - 19968: jis0208<<14 | 0x59<<7 | 0x20, - 26274 - 19968: jis0208<<14 | 0x23<<7 | 0x09, - 26276 - 19968: jis0212<<14 | 0x21<<7 | 0x37, - 26278 - 19968: jis0208<<14 | 0x2D<<7 | 0x50, - 26283 - 19968: jis0208<<14 | 0x1A<<7 | 0x22, - 26285 - 19968: jis0212<<14 | 0x21<<7 | 0x38, - 26286 - 19968: jis0208<<14 | 0x29<<7 | 0x4A, - 26289 - 19968: jis0212<<14 | 0x21<<7 | 0x39, - 26290 - 19968: jis0208<<14 | 0x59<<7 | 0x21, - 26292 - 19968: jis0208<<14 | 0x2A<<7 | 0x1C, - 26293 - 19968: jis0212<<14 | 0x21<<7 | 0x3B, - 26296 - 19968: jis0208<<14 | 0x3A<<7 | 0x01, - 26297 - 19968: jis0208<<14 | 0x39<<7 | 0x5A, - 26299 - 19968: jis0212<<14 | 0x21<<7 | 0x3C, - 26300 - 19968: jis0208<<14 | 0x39<<7 | 0x5D, - 26302 - 19968: jis0208<<14 | 0x39<<7 | 0x5C, - 26303 - 19968: jis0208<<14 | 0x59<<7 | 0x22, - 26304 - 19968: jis0212<<14 | 0x21<<7 | 0x3E, - 26305 - 19968: jis0208<<14 | 0x39<<7 | 0x59, - 26306 - 19968: jis0212<<14 | 0x21<<7 | 0x3F, - 26307 - 19968: jis0212<<14 | 0x21<<7 | 0x40, - 26308 - 19968: jis0208<<14 | 0x3A<<7 | 0x00, - 26311 - 19968: jis0208<<14 | 0x25<<7 | 0x3D, - 26312 - 19968: jis0212<<14 | 0x21<<7 | 0x41, - 26313 - 19968: jis0208<<14 | 0x39<<7 | 0x5B, - 26316 - 19968: jis0212<<14 | 0x21<<7 | 0x42, - 26318 - 19968: jis0212<<14 | 0x21<<7 | 0x43, - 26319 - 19968: jis0212<<14 | 0x21<<7 | 0x44, - 26324 - 19968: jis0212<<14 | 0x21<<7 | 0x45, - 26326 - 19968: jis0208<<14 | 0x3A<<7 | 0x02, - 26329 - 19968: jis0208<<14 | 0x1C<<7 | 0x4B, - 26330 - 19968: jis0208<<14 | 0x3A<<7 | 0x03, - 26331 - 19968: jis0212<<14 | 0x21<<7 | 0x46, - 26332 - 19968: jis0208<<14 | 0x2C<<7 | 0x2A, - 26333 - 19968: jis0208<<14 | 0x26<<7 | 0x57, - 26335 - 19968: jis0212<<14 | 0x21<<7 | 0x47, - 26336 - 19968: jis0208<<14 | 0x3A<<7 | 0x04, - 26342 - 19968: jis0208<<14 | 0x3A<<7 | 0x06, - 26344 - 19968: jis0212<<14 | 0x21<<7 | 0x48, - 26345 - 19968: jis0208<<14 | 0x3A<<7 | 0x07, - 26347 - 19968: jis0212<<14 | 0x21<<7 | 0x49, - 26348 - 19968: jis0212<<14 | 0x21<<7 | 0x4A, - 26350 - 19968: jis0212<<14 | 0x21<<7 | 0x4B, - 26352 - 19968: jis0208<<14 | 0x3A<<7 | 0x08, - 26354 - 19968: jis0208<<14 | 0x15<<7 | 0x29, - 26355 - 19968: jis0208<<14 | 0x10<<7 | 0x27, - 26356 - 19968: jis0208<<14 | 0x18<<7 | 0x18, - 26357 - 19968: jis0208<<14 | 0x3A<<7 | 0x09, - 26359 - 19968: jis0208<<14 | 0x3A<<7 | 0x0A, - 26360 - 19968: jis0208<<14 | 0x1C<<7 | 0x50, - 26361 - 19968: jis0208<<14 | 0x20<<7 | 0x41, - 26362 - 19968: jis0208<<14 | 0x59<<7 | 0x23, - 26363 - 19968: jis0208<<14 | 0x58<<7 | 0x0A, - 26364 - 19968: jis0208<<14 | 0x31<<7 | 0x37, - 26365 - 19968: jis0208<<14 | 0x20<<7 | 0x1D, - 26366 - 19968: jis0208<<14 | 0x20<<7 | 0x1C, - 26367 - 19968: jis0208<<14 | 0x21<<7 | 0x37, - 26368 - 19968: jis0208<<14 | 0x19<<7 | 0x26, - 26371 - 19968: jis0208<<14 | 0x2F<<7 | 0x51, - 26373 - 19968: jis0212<<14 | 0x21<<7 | 0x4D, - 26375 - 19968: jis0212<<14 | 0x21<<7 | 0x4E, - 26376 - 19968: jis0208<<14 | 0x16<<7 | 0x4D, - 26377 - 19968: jis0208<<14 | 0x2C<<7 | 0x0C, - 26379 - 19968: jis0208<<14 | 0x29<<7 | 0x5D, - 26381 - 19968: jis0208<<14 | 0x28<<7 | 0x5D, - 26382 - 19968: jis0208<<14 | 0x59<<7 | 0x24, - 26383 - 19968: jis0208<<14 | 0x3A<<7 | 0x0B, - 26387 - 19968: jis0212<<14 | 0x21<<7 | 0x50, - 26388 - 19968: jis0208<<14 | 0x19<<7 | 0x52, - 26389 - 19968: jis0208<<14 | 0x23<<7 | 0x1E, - 26390 - 19968: jis0208<<14 | 0x3A<<7 | 0x0C, - 26391 - 19968: jis0208<<14 | 0x2E<<7 | 0x0E, - 26393 - 19968: jis0212<<14 | 0x21<<7 | 0x51, - 26395 - 19968: jis0208<<14 | 0x2A<<7 | 0x1D, - 26396 - 19968: jis0212<<14 | 0x21<<7 | 0x52, - 26397 - 19968: jis0208<<14 | 0x23<<7 | 0x0A, - 26398 - 19968: jis0208<<14 | 0x3A<<7 | 0x0D, - 26399 - 19968: jis0208<<14 | 0x13<<7 | 0x5B, - 26400 - 19968: jis0212<<14 | 0x21<<7 | 0x53, - 26402 - 19968: jis0212<<14 | 0x21<<7 | 0x54, - 26406 - 19968: jis0208<<14 | 0x3A<<7 | 0x0E, - 26407 - 19968: jis0208<<14 | 0x3A<<7 | 0x0F, - 26408 - 19968: jis0208<<14 | 0x2B<<7 | 0x39, - 26410 - 19968: jis0208<<14 | 0x2B<<7 | 0x03, - 26411 - 19968: jis0208<<14 | 0x2A<<7 | 0x55, - 26412 - 19968: jis0208<<14 | 0x2A<<7 | 0x3B, - 26413 - 19968: jis0208<<14 | 0x1A<<7 | 0x04, - 26414 - 19968: jis0208<<14 | 0x3A<<7 | 0x11, - 26417 - 19968: jis0208<<14 | 0x1B<<7 | 0x4A, - 26419 - 19968: jis0212<<14 | 0x21<<7 | 0x55, - 26420 - 19968: jis0208<<14 | 0x2A<<7 | 0x30, - 26422 - 19968: jis0208<<14 | 0x3A<<7 | 0x13, - 26423 - 19968: jis0208<<14 | 0x3A<<7 | 0x16, - 26424 - 19968: jis0208<<14 | 0x3A<<7 | 0x15, - 26426 - 19968: jis0208<<14 | 0x13<<7 | 0x58, - 26429 - 19968: jis0208<<14 | 0x14<<7 | 0x3F, - 26430 - 19968: jis0212<<14 | 0x21<<7 | 0x56, - 26431 - 19968: jis0208<<14 | 0x3A<<7 | 0x12, - 26433 - 19968: jis0208<<14 | 0x3A<<7 | 0x14, - 26437 - 19968: jis0212<<14 | 0x21<<7 | 0x57, - 26438 - 19968: jis0208<<14 | 0x3A<<7 | 0x17, - 26439 - 19968: jis0212<<14 | 0x21<<7 | 0x58, - 26440 - 19968: jis0212<<14 | 0x21<<7 | 0x59, - 26441 - 19968: jis0208<<14 | 0x1E<<7 | 0x58, - 26444 - 19968: jis0212<<14 | 0x21<<7 | 0x5A, - 26446 - 19968: jis0208<<14 | 0x2C<<7 | 0x5A, - 26447 - 19968: jis0208<<14 | 0x0F<<7 | 0x28, - 26448 - 19968: jis0208<<14 | 0x19<<7 | 0x3F, - 26449 - 19968: jis0208<<14 | 0x21<<7 | 0x1B, - 26451 - 19968: jis0208<<14 | 0x1B<<7 | 0x3C, - 26452 - 19968: jis0212<<14 | 0x21<<7 | 0x5B, - 26453 - 19968: jis0212<<14 | 0x21<<7 | 0x5C, - 26454 - 19968: jis0208<<14 | 0x1D<<7 | 0x52, - 26457 - 19968: jis0208<<14 | 0x3A<<7 | 0x1A, - 26460 - 19968: jis0208<<14 | 0x24<<7 | 0x2D, - 26461 - 19968: jis0212<<14 | 0x21<<7 | 0x5D, - 26462 - 19968: jis0208<<14 | 0x3A<<7 | 0x18, - 26463 - 19968: jis0208<<14 | 0x21<<7 | 0x0A, - 26464 - 19968: jis0208<<14 | 0x3A<<7 | 0x19, - 26465 - 19968: jis0208<<14 | 0x1D<<7 | 0x51, - 26466 - 19968: jis0208<<14 | 0x2B<<7 | 0x3C, - 26467 - 19968: jis0208<<14 | 0x3A<<7 | 0x1B, - 26468 - 19968: jis0208<<14 | 0x3A<<7 | 0x1C, - 26469 - 19968: jis0208<<14 | 0x2C<<7 | 0x47, - 26470 - 19968: jis0208<<14 | 0x59<<7 | 0x26, - 26474 - 19968: jis0208<<14 | 0x3A<<7 | 0x21, - 26476 - 19968: jis0212<<14 | 0x22<<7 | 0x01, - 26477 - 19968: jis0208<<14 | 0x18<<7 | 0x19, - 26478 - 19968: jis0212<<14 | 0x22<<7 | 0x02, - 26479 - 19968: jis0208<<14 | 0x26<<7 | 0x34, - 26480 - 19968: jis0208<<14 | 0x3A<<7 | 0x1E, - 26481 - 19968: jis0208<<14 | 0x24<<7 | 0x4B, - 26482 - 19968: jis0208<<14 | 0x39<<7 | 0x3D, - 26483 - 19968: jis0208<<14 | 0x39<<7 | 0x41, - 26484 - 19968: jis0212<<14 | 0x22<<7 | 0x03, - 26485 - 19968: jis0208<<14 | 0x14<<7 | 0x2E, - 26486 - 19968: jis0212<<14 | 0x22<<7 | 0x04, - 26487 - 19968: jis0208<<14 | 0x26<<7 | 0x26, - 26491 - 19968: jis0212<<14 | 0x22<<7 | 0x05, - 26492 - 19968: jis0208<<14 | 0x3A<<7 | 0x20, - 26494 - 19968: jis0208<<14 | 0x1D<<7 | 0x1D, - 26495 - 19968: jis0208<<14 | 0x27<<7 | 0x23, - 26497 - 19968: jis0212<<14 | 0x22<<7 | 0x06, - 26500 - 19968: jis0212<<14 | 0x22<<7 | 0x07, - 26501 - 19968: jis0208<<14 | 0x3A<<7 | 0x26, - 26503 - 19968: jis0208<<14 | 0x27<<7 | 0x59, - 26505 - 19968: jis0208<<14 | 0x3A<<7 | 0x1D, - 26507 - 19968: jis0208<<14 | 0x3A<<7 | 0x23, - 26508 - 19968: jis0208<<14 | 0x3A<<7 | 0x22, - 26510 - 19968: jis0212<<14 | 0x22<<7 | 0x08, - 26511 - 19968: jis0212<<14 | 0x22<<7 | 0x09, - 26512 - 19968: jis0208<<14 | 0x1F<<7 | 0x2E, - 26513 - 19968: jis0212<<14 | 0x22<<7 | 0x0A, - 26515 - 19968: jis0212<<14 | 0x22<<7 | 0x0B, - 26517 - 19968: jis0208<<14 | 0x2A<<7 | 0x4C, - 26518 - 19968: jis0212<<14 | 0x22<<7 | 0x0C, - 26519 - 19968: jis0208<<14 | 0x2D<<7 | 0x32, - 26520 - 19968: jis0212<<14 | 0x22<<7 | 0x0D, - 26521 - 19968: jis0212<<14 | 0x22<<7 | 0x0E, - 26522 - 19968: jis0208<<14 | 0x2A<<7 | 0x46, - 26523 - 19968: jis0212<<14 | 0x22<<7 | 0x0F, - 26524 - 19968: jis0208<<14 | 0x11<<7 | 0x2B, - 26525 - 19968: jis0208<<14 | 0x1A<<7 | 0x3D, - 26528 - 19968: jis0208<<14 | 0x2E<<7 | 0x27, - 26529 - 19968: jis0208<<14 | 0x3A<<7 | 0x25, - 26530 - 19968: jis0208<<14 | 0x1E<<7 | 0x54, - 26534 - 19968: jis0208<<14 | 0x3A<<7 | 0x24, - 26537 - 19968: jis0208<<14 | 0x3A<<7 | 0x1F, - 26543 - 19968: jis0208<<14 | 0x17<<7 | 0x2E, - 26544 - 19968: jis0212<<14 | 0x22<<7 | 0x10, - 26545 - 19968: jis0212<<14 | 0x22<<7 | 0x11, - 26546 - 19968: jis0212<<14 | 0x22<<7 | 0x12, - 26547 - 19968: jis0208<<14 | 0x3A<<7 | 0x2B, - 26548 - 19968: jis0208<<14 | 0x3A<<7 | 0x29, - 26549 - 19968: jis0212<<14 | 0x22<<7 | 0x13, - 26550 - 19968: jis0208<<14 | 0x11<<7 | 0x2C, - 26551 - 19968: jis0208<<14 | 0x3A<<7 | 0x27, - 26552 - 19968: jis0208<<14 | 0x3A<<7 | 0x2D, - 26553 - 19968: jis0208<<14 | 0x3A<<7 | 0x33, - 26555 - 19968: jis0208<<14 | 0x59<<7 | 0x27, - 26556 - 19968: jis0212<<14 | 0x22<<7 | 0x15, - 26557 - 19968: jis0212<<14 | 0x22<<7 | 0x16, - 26560 - 19968: jis0208<<14 | 0x59<<7 | 0x29, - 26561 - 19968: jis0208<<14 | 0x21<<7 | 0x27, - 26562 - 19968: jis0212<<14 | 0x22<<7 | 0x19, - 26563 - 19968: jis0212<<14 | 0x22<<7 | 0x1A, - 26564 - 19968: jis0208<<14 | 0x29<<7 | 0x20, - 26565 - 19968: jis0212<<14 | 0x22<<7 | 0x1B, - 26566 - 19968: jis0208<<14 | 0x3A<<7 | 0x35, - 26568 - 19968: jis0212<<14 | 0x22<<7 | 0x1C, - 26569 - 19968: jis0212<<14 | 0x22<<7 | 0x1D, - 26570 - 19968: jis0208<<14 | 0x28<<7 | 0x01, - 26574 - 19968: jis0208<<14 | 0x3A<<7 | 0x34, - 26575 - 19968: jis0208<<14 | 0x26<<7 | 0x4F, - 26576 - 19968: jis0208<<14 | 0x2A<<7 | 0x1E, - 26577 - 19968: jis0208<<14 | 0x13<<7 | 0x1A, - 26578 - 19968: jis0212<<14 | 0x22<<7 | 0x1E, - 26579 - 19968: jis0208<<14 | 0x1F<<7 | 0x56, - 26580 - 19968: jis0208<<14 | 0x1C<<7 | 0x1F, - 26583 - 19968: jis0212<<14 | 0x22<<7 | 0x1F, - 26584 - 19968: jis0208<<14 | 0x23<<7 | 0x32, - 26585 - 19968: jis0212<<14 | 0x22<<7 | 0x20, - 26586 - 19968: jis0208<<14 | 0x2C<<7 | 0x0D, - 26588 - 19968: jis0212<<14 | 0x22<<7 | 0x21, - 26589 - 19968: jis0208<<14 | 0x3A<<7 | 0x30, - 26590 - 19968: jis0208<<14 | 0x3A<<7 | 0x2F, - 26593 - 19968: jis0212<<14 | 0x22<<7 | 0x22, - 26594 - 19968: jis0208<<14 | 0x3A<<7 | 0x31, - 26596 - 19968: jis0208<<14 | 0x3A<<7 | 0x2E, - 26598 - 19968: jis0212<<14 | 0x22<<7 | 0x23, - 26599 - 19968: jis0208<<14 | 0x3A<<7 | 0x36, - 26601 - 19968: jis0208<<14 | 0x3A<<7 | 0x2C, - 26604 - 19968: jis0208<<14 | 0x3A<<7 | 0x2A, - 26606 - 19968: jis0208<<14 | 0x3A<<7 | 0x32, - 26607 - 19968: jis0208<<14 | 0x3A<<7 | 0x28, - 26608 - 19968: jis0212<<14 | 0x22<<7 | 0x24, - 26609 - 19968: jis0208<<14 | 0x22<<7 | 0x4B, - 26610 - 19968: jis0212<<14 | 0x22<<7 | 0x25, - 26611 - 19968: jis0208<<14 | 0x2B<<7 | 0x57, - 26612 - 19968: jis0208<<14 | 0x1B<<7 | 0x25, - 26613 - 19968: jis0208<<14 | 0x19<<7 | 0x53, - 26614 - 19968: jis0212<<14 | 0x22<<7 | 0x26, - 26615 - 19968: jis0212<<14 | 0x22<<7 | 0x27, - 26617 - 19968: jis0212<<14 | 0x22<<7 | 0x17, - 26619 - 19968: jis0208<<14 | 0x19<<7 | 0x19, - 26622 - 19968: jis0208<<14 | 0x2A<<7 | 0x4E, - 26623 - 19968: jis0208<<14 | 0x12<<7 | 0x20, - 26625 - 19968: jis0208<<14 | 0x59<<7 | 0x2A, - 26626 - 19968: jis0208<<14 | 0x23<<7 | 0x2D, - 26627 - 19968: jis0208<<14 | 0x25<<7 | 0x29, - 26628 - 19968: jis0208<<14 | 0x10<<7 | 0x28, - 26643 - 19968: jis0208<<14 | 0x1F<<7 | 0x51, - 26644 - 19968: jis0212<<14 | 0x22<<7 | 0x29, - 26646 - 19968: jis0208<<14 | 0x1F<<7 | 0x13, - 26647 - 19968: jis0208<<14 | 0x16<<7 | 0x09, - 26649 - 19968: jis0212<<14 | 0x22<<7 | 0x2A, - 26653 - 19968: jis0212<<14 | 0x22<<7 | 0x2B, - 26654 - 19968: jis0208<<14 | 0x3A<<7 | 0x38, - 26655 - 19968: jis0212<<14 | 0x22<<7 | 0x2C, - 26657 - 19968: jis0208<<14 | 0x18<<7 | 0x1A, - 26658 - 19968: jis0208<<14 | 0x12<<7 | 0x5B, - 26663 - 19968: jis0212<<14 | 0x22<<7 | 0x2E, - 26664 - 19968: jis0212<<14 | 0x22<<7 | 0x2D, - 26665 - 19968: jis0208<<14 | 0x3A<<7 | 0x3A, - 26666 - 19968: jis0208<<14 | 0x12<<7 | 0x53, - 26667 - 19968: jis0208<<14 | 0x3A<<7 | 0x40, - 26668 - 19968: jis0212<<14 | 0x22<<7 | 0x2F, - 26669 - 19968: jis0212<<14 | 0x22<<7 | 0x30, - 26671 - 19968: jis0212<<14 | 0x22<<7 | 0x31, - 26672 - 19968: jis0212<<14 | 0x22<<7 | 0x32, - 26673 - 19968: jis0212<<14 | 0x22<<7 | 0x33, - 26674 - 19968: jis0208<<14 | 0x3A<<7 | 0x3D, - 26675 - 19968: jis0212<<14 | 0x22<<7 | 0x34, - 26676 - 19968: jis0208<<14 | 0x1F<<7 | 0x52, - 26680 - 19968: jis0208<<14 | 0x12<<7 | 0x2A, - 26681 - 19968: jis0208<<14 | 0x19<<7 | 0x0B, - 26683 - 19968: jis0212<<14 | 0x22<<7 | 0x35, - 26684 - 19968: jis0208<<14 | 0x12<<7 | 0x29, - 26685 - 19968: jis0208<<14 | 0x19<<7 | 0x2E, - 26687 - 19968: jis0212<<14 | 0x22<<7 | 0x36, - 26688 - 19968: jis0208<<14 | 0x3A<<7 | 0x3B, - 26689 - 19968: jis0208<<14 | 0x16<<7 | 0x44, - 26690 - 19968: jis0208<<14 | 0x16<<7 | 0x2A, - 26691 - 19968: jis0208<<14 | 0x24<<7 | 0x4C, - 26692 - 19968: jis0208<<14 | 0x59<<7 | 0x2B, - 26693 - 19968: jis0212<<14 | 0x22<<7 | 0x38, - 26694 - 19968: jis0208<<14 | 0x3A<<7 | 0x39, - 26696 - 19968: jis0208<<14 | 0x0F<<7 | 0x25, - 26698 - 19968: jis0212<<14 | 0x22<<7 | 0x39, - 26700 - 19968: jis0212<<14 | 0x22<<7 | 0x3A, - 26701 - 19968: jis0208<<14 | 0x3A<<7 | 0x3C, - 26702 - 19968: jis0208<<14 | 0x3A<<7 | 0x3E, - 26704 - 19968: jis0208<<14 | 0x15<<7 | 0x2C, - 26705 - 19968: jis0208<<14 | 0x16<<7 | 0x0B, - 26706 - 19968: jis0208<<14 | 0x59<<7 | 0x28, - 26707 - 19968: jis0208<<14 | 0x13<<7 | 0x1B, - 26708 - 19968: jis0208<<14 | 0x14<<7 | 0x2A, - 26709 - 19968: jis0212<<14 | 0x22<<7 | 0x3B, - 26711 - 19968: jis0212<<14 | 0x22<<7 | 0x3C, - 26712 - 19968: jis0212<<14 | 0x22<<7 | 0x3D, - 26713 - 19968: jis0208<<14 | 0x3A<<7 | 0x41, - 26715 - 19968: jis0212<<14 | 0x22<<7 | 0x3E, - 26716 - 19968: jis0208<<14 | 0x19<<7 | 0x58, - 26717 - 19968: jis0208<<14 | 0x2A<<7 | 0x50, - 26719 - 19968: jis0208<<14 | 0x1A<<7 | 0x16, - 26723 - 19968: jis0208<<14 | 0x3A<<7 | 0x42, - 26727 - 19968: jis0208<<14 | 0x28<<7 | 0x0F, - 26731 - 19968: jis0212<<14 | 0x22<<7 | 0x3F, - 26734 - 19968: jis0212<<14 | 0x22<<7 | 0x40, - 26735 - 19968: jis0212<<14 | 0x22<<7 | 0x41, - 26736 - 19968: jis0212<<14 | 0x22<<7 | 0x42, - 26737 - 19968: jis0212<<14 | 0x22<<7 | 0x43, - 26738 - 19968: jis0212<<14 | 0x22<<7 | 0x44, - 26740 - 19968: jis0208<<14 | 0x3A<<7 | 0x4E, - 26741 - 19968: jis0212<<14 | 0x22<<7 | 0x45, - 26742 - 19968: jis0208<<14 | 0x11<<7 | 0x12, - 26743 - 19968: jis0208<<14 | 0x3A<<7 | 0x43, - 26745 - 19968: jis0212<<14 | 0x22<<7 | 0x46, - 26746 - 19968: jis0212<<14 | 0x22<<7 | 0x47, - 26747 - 19968: jis0212<<14 | 0x22<<7 | 0x48, - 26748 - 19968: jis0212<<14 | 0x22<<7 | 0x49, - 26750 - 19968: jis0208<<14 | 0x3A<<7 | 0x54, - 26751 - 19968: jis0208<<14 | 0x3A<<7 | 0x44, - 26753 - 19968: jis0208<<14 | 0x2D<<7 | 0x21, - 26754 - 19968: jis0212<<14 | 0x22<<7 | 0x4A, - 26755 - 19968: jis0208<<14 | 0x3A<<7 | 0x4B, - 26756 - 19968: jis0212<<14 | 0x22<<7 | 0x4B, - 26757 - 19968: jis0208<<14 | 0x26<<7 | 0x3E, - 26758 - 19968: jis0212<<14 | 0x22<<7 | 0x4C, - 26760 - 19968: jis0212<<14 | 0x22<<7 | 0x4D, - 26765 - 19968: jis0208<<14 | 0x3A<<7 | 0x53, - 26767 - 19968: jis0208<<14 | 0x3A<<7 | 0x46, - 26771 - 19968: jis0208<<14 | 0x0F<<7 | 0x13, - 26772 - 19968: jis0208<<14 | 0x3A<<7 | 0x48, - 26774 - 19968: jis0212<<14 | 0x22<<7 | 0x4E, - 26775 - 19968: jis0208<<14 | 0x18<<7 | 0x1B, - 26776 - 19968: jis0212<<14 | 0x22<<7 | 0x4F, - 26778 - 19968: jis0212<<14 | 0x22<<7 | 0x50, - 26779 - 19968: jis0208<<14 | 0x3A<<7 | 0x4A, - 26780 - 19968: jis0212<<14 | 0x22<<7 | 0x51, - 26781 - 19968: jis0208<<14 | 0x3A<<7 | 0x49, - 26783 - 19968: jis0208<<14 | 0x3A<<7 | 0x45, - 26784 - 19968: jis0208<<14 | 0x3A<<7 | 0x50, - 26785 - 19968: jis0212<<14 | 0x22<<7 | 0x52, - 26786 - 19968: jis0208<<14 | 0x1D<<7 | 0x1E, - 26787 - 19968: jis0212<<14 | 0x22<<7 | 0x53, - 26789 - 19968: jis0212<<14 | 0x22<<7 | 0x54, - 26790 - 19968: jis0208<<14 | 0x33<<7 | 0x4C, - 26791 - 19968: jis0208<<14 | 0x17<<7 | 0x47, - 26792 - 19968: jis0208<<14 | 0x2C<<7 | 0x5B, - 26793 - 19968: jis0212<<14 | 0x22<<7 | 0x55, - 26794 - 19968: jis0212<<14 | 0x22<<7 | 0x56, - 26797 - 19968: jis0208<<14 | 0x3A<<7 | 0x47, - 26798 - 19968: jis0212<<14 | 0x22<<7 | 0x57, - 26799 - 19968: jis0208<<14 | 0x23<<7 | 0x53, - 26800 - 19968: jis0208<<14 | 0x12<<7 | 0x02, - 26801 - 19968: jis0208<<14 | 0x19<<7 | 0x0C, - 26802 - 19968: jis0212<<14 | 0x22<<7 | 0x58, - 26803 - 19968: jis0208<<14 | 0x3A<<7 | 0x3F, - 26805 - 19968: jis0208<<14 | 0x3A<<7 | 0x4F, - 26806 - 19968: jis0208<<14 | 0x12<<7 | 0x40, - 26809 - 19968: jis0208<<14 | 0x3A<<7 | 0x4D, - 26810 - 19968: jis0208<<14 | 0x3A<<7 | 0x51, - 26811 - 19968: jis0212<<14 | 0x22<<7 | 0x59, - 26812 - 19968: jis0208<<14 | 0x24<<7 | 0x4D, - 26820 - 19968: jis0208<<14 | 0x13<<7 | 0x5D, - 26821 - 19968: jis0212<<14 | 0x22<<7 | 0x5A, - 26822 - 19968: jis0208<<14 | 0x3B<<7 | 0x11, - 26824 - 19968: jis0208<<14 | 0x58<<7 | 0x08, - 26825 - 19968: jis0208<<14 | 0x2B<<7 | 0x28, - 26826 - 19968: jis0208<<14 | 0x3A<<7 | 0x56, - 26827 - 19968: jis0208<<14 | 0x13<<7 | 0x5C, - 26828 - 19968: jis0212<<14 | 0x22<<7 | 0x5C, - 26829 - 19968: jis0208<<14 | 0x3A<<7 | 0x5D, - 26831 - 19968: jis0208<<14 | 0x59<<7 | 0x2C, - 26832 - 19968: jis0212<<14 | 0x23<<7 | 0x00, - 26833 - 19968: jis0212<<14 | 0x23<<7 | 0x01, - 26834 - 19968: jis0208<<14 | 0x2A<<7 | 0x1F, - 26835 - 19968: jis0212<<14 | 0x23<<7 | 0x02, - 26836 - 19968: jis0208<<14 | 0x3B<<7 | 0x00, - 26837 - 19968: jis0208<<14 | 0x3B<<7 | 0x02, - 26838 - 19968: jis0212<<14 | 0x23<<7 | 0x03, - 26839 - 19968: jis0208<<14 | 0x3B<<7 | 0x06, - 26840 - 19968: jis0208<<14 | 0x3A<<7 | 0x58, - 26841 - 19968: jis0212<<14 | 0x23<<7 | 0x04, - 26842 - 19968: jis0208<<14 | 0x22<<7 | 0x09, - 26844 - 19968: jis0212<<14 | 0x23<<7 | 0x05, - 26845 - 19968: jis0212<<14 | 0x23<<7 | 0x06, - 26847 - 19968: jis0208<<14 | 0x24<<7 | 0x4E, - 26848 - 19968: jis0208<<14 | 0x3B<<7 | 0x0A, - 26849 - 19968: jis0208<<14 | 0x3A<<7 | 0x5B, - 26851 - 19968: jis0208<<14 | 0x3B<<7 | 0x07, - 26853 - 19968: jis0212<<14 | 0x23<<7 | 0x07, - 26855 - 19968: jis0208<<14 | 0x3B<<7 | 0x01, - 26856 - 19968: jis0212<<14 | 0x23<<7 | 0x08, - 26858 - 19968: jis0212<<14 | 0x23<<7 | 0x09, - 26859 - 19968: jis0212<<14 | 0x23<<7 | 0x0A, - 26860 - 19968: jis0212<<14 | 0x23<<7 | 0x0B, - 26861 - 19968: jis0212<<14 | 0x23<<7 | 0x0C, - 26862 - 19968: jis0208<<14 | 0x1E<<7 | 0x18, - 26863 - 19968: jis0208<<14 | 0x3B<<7 | 0x0B, - 26864 - 19968: jis0212<<14 | 0x23<<7 | 0x0D, - 26865 - 19968: jis0212<<14 | 0x23<<7 | 0x0E, - 26866 - 19968: jis0208<<14 | 0x1F<<7 | 0x12, - 26869 - 19968: jis0212<<14 | 0x23<<7 | 0x0F, - 26870 - 19968: jis0212<<14 | 0x23<<7 | 0x10, - 26873 - 19968: jis0208<<14 | 0x3B<<7 | 0x09, - 26874 - 19968: jis0208<<14 | 0x13<<7 | 0x1C, - 26875 - 19968: jis0212<<14 | 0x23<<7 | 0x11, - 26876 - 19968: jis0212<<14 | 0x23<<7 | 0x12, - 26877 - 19968: jis0212<<14 | 0x23<<7 | 0x13, - 26880 - 19968: jis0208<<14 | 0x2E<<7 | 0x2F, - 26881 - 19968: jis0208<<14 | 0x3A<<7 | 0x55, - 26884 - 19968: jis0208<<14 | 0x3B<<7 | 0x05, - 26885 - 19968: jis0208<<14 | 0x0F<<7 | 0x37, - 26886 - 19968: jis0212<<14 | 0x23<<7 | 0x14, - 26888 - 19968: jis0208<<14 | 0x3A<<7 | 0x57, - 26889 - 19968: jis0212<<14 | 0x23<<7 | 0x15, - 26890 - 19968: jis0212<<14 | 0x23<<7 | 0x16, - 26891 - 19968: jis0208<<14 | 0x2B<<7 | 0x19, - 26892 - 19968: jis0208<<14 | 0x3A<<7 | 0x5C, - 26893 - 19968: jis0208<<14 | 0x1E<<7 | 0x01, - 26894 - 19968: jis0208<<14 | 0x23<<7 | 0x26, - 26895 - 19968: jis0208<<14 | 0x3A<<7 | 0x52, - 26896 - 19968: jis0212<<14 | 0x23<<7 | 0x17, - 26897 - 19968: jis0212<<14 | 0x23<<7 | 0x18, - 26898 - 19968: jis0208<<14 | 0x3B<<7 | 0x04, - 26899 - 19968: jis0212<<14 | 0x23<<7 | 0x19, - 26902 - 19968: jis0212<<14 | 0x23<<7 | 0x1A, - 26903 - 19968: jis0212<<14 | 0x23<<7 | 0x1B, - 26905 - 19968: jis0208<<14 | 0x1E<<7 | 0x59, - 26906 - 19968: jis0208<<14 | 0x3B<<7 | 0x0E, - 26907 - 19968: jis0208<<14 | 0x12<<7 | 0x50, - 26908 - 19968: jis0208<<14 | 0x17<<7 | 0x00, - 26913 - 19968: jis0208<<14 | 0x3B<<7 | 0x10, - 26914 - 19968: jis0208<<14 | 0x3A<<7 | 0x59, - 26915 - 19968: jis0208<<14 | 0x3B<<7 | 0x0F, - 26917 - 19968: jis0208<<14 | 0x3B<<7 | 0x08, - 26918 - 19968: jis0208<<14 | 0x3A<<7 | 0x5A, - 26920 - 19968: jis0208<<14 | 0x3B<<7 | 0x0C, - 26922 - 19968: jis0208<<14 | 0x3B<<7 | 0x0D, - 26928 - 19968: jis0208<<14 | 0x3B<<7 | 0x1E, - 26929 - 19968: jis0212<<14 | 0x23<<7 | 0x1C, - 26931 - 19968: jis0212<<14 | 0x23<<7 | 0x1D, - 26932 - 19968: jis0208<<14 | 0x25<<7 | 0x2D, - 26933 - 19968: jis0212<<14 | 0x23<<7 | 0x1E, - 26934 - 19968: jis0208<<14 | 0x3B<<7 | 0x03, - 26936 - 19968: jis0212<<14 | 0x23<<7 | 0x1F, - 26937 - 19968: jis0208<<14 | 0x3B<<7 | 0x1A, - 26939 - 19968: jis0212<<14 | 0x23<<7 | 0x20, - 26941 - 19968: jis0208<<14 | 0x3B<<7 | 0x1C, - 26943 - 19968: jis0208<<14 | 0x23<<7 | 0x37, - 26946 - 19968: jis0212<<14 | 0x23<<7 | 0x21, - 26949 - 19968: jis0212<<14 | 0x23<<7 | 0x22, - 26953 - 19968: jis0212<<14 | 0x23<<7 | 0x23, - 26954 - 19968: jis0208<<14 | 0x2C<<7 | 0x2B, - 26958 - 19968: jis0212<<14 | 0x23<<7 | 0x24, - 26963 - 19968: jis0208<<14 | 0x28<<7 | 0x55, - 26964 - 19968: jis0208<<14 | 0x3B<<7 | 0x17, - 26965 - 19968: jis0208<<14 | 0x21<<7 | 0x29, - 26967 - 19968: jis0212<<14 | 0x23<<7 | 0x25, - 26969 - 19968: jis0208<<14 | 0x3B<<7 | 0x1D, - 26970 - 19968: jis0208<<14 | 0x20<<7 | 0x1E, - 26971 - 19968: jis0212<<14 | 0x23<<7 | 0x26, - 26972 - 19968: jis0208<<14 | 0x3B<<7 | 0x14, - 26973 - 19968: jis0208<<14 | 0x3B<<7 | 0x21, - 26974 - 19968: jis0208<<14 | 0x3B<<7 | 0x20, - 26976 - 19968: jis0208<<14 | 0x25<<7 | 0x4E, - 26977 - 19968: jis0208<<14 | 0x3B<<7 | 0x1F, - 26978 - 19968: jis0208<<14 | 0x25<<7 | 0x49, - 26979 - 19968: jis0212<<14 | 0x23<<7 | 0x27, - 26980 - 19968: jis0212<<14 | 0x23<<7 | 0x28, - 26981 - 19968: jis0212<<14 | 0x23<<7 | 0x29, - 26982 - 19968: jis0212<<14 | 0x23<<7 | 0x2A, - 26984 - 19968: jis0208<<14 | 0x59<<7 | 0x2E, - 26985 - 19968: jis0212<<14 | 0x23<<7 | 0x2C, - 26986 - 19968: jis0208<<14 | 0x3B<<7 | 0x23, - 26987 - 19968: jis0208<<14 | 0x3B<<7 | 0x16, - 26988 - 19968: jis0212<<14 | 0x23<<7 | 0x2D, - 26989 - 19968: jis0208<<14 | 0x15<<7 | 0x27, - 26990 - 19968: jis0208<<14 | 0x3B<<7 | 0x19, - 26991 - 19968: jis0208<<14 | 0x1C<<7 | 0x3C, - 26992 - 19968: jis0212<<14 | 0x23<<7 | 0x2E, - 26993 - 19968: jis0212<<14 | 0x23<<7 | 0x2F, - 26994 - 19968: jis0212<<14 | 0x23<<7 | 0x30, - 26995 - 19968: jis0208<<14 | 0x26<<7 | 0x3F, - 26996 - 19968: jis0208<<14 | 0x3B<<7 | 0x1B, - 26997 - 19968: jis0208<<14 | 0x15<<7 | 0x2A, - 26999 - 19968: jis0208<<14 | 0x3B<<7 | 0x13, - 27000 - 19968: jis0208<<14 | 0x3B<<7 | 0x15, - 27001 - 19968: jis0208<<14 | 0x3B<<7 | 0x12, - 27002 - 19968: jis0212<<14 | 0x23<<7 | 0x31, - 27003 - 19968: jis0212<<14 | 0x23<<7 | 0x32, - 27004 - 19968: jis0208<<14 | 0x2E<<7 | 0x0F, - 27005 - 19968: jis0208<<14 | 0x12<<7 | 0x39, - 27006 - 19968: jis0208<<14 | 0x3B<<7 | 0x18, - 27007 - 19968: jis0212<<14 | 0x23<<7 | 0x33, - 27008 - 19968: jis0212<<14 | 0x23<<7 | 0x34, - 27009 - 19968: jis0208<<14 | 0x3B<<7 | 0x22, - 27010 - 19968: jis0208<<14 | 0x12<<7 | 0x14, - 27018 - 19968: jis0208<<14 | 0x19<<7 | 0x46, - 27021 - 19968: jis0212<<14 | 0x23<<7 | 0x35, - 27022 - 19968: jis0208<<14 | 0x10<<7 | 0x3C, - 27025 - 19968: jis0208<<14 | 0x3B<<7 | 0x33, - 27026 - 19968: jis0212<<14 | 0x23<<7 | 0x36, - 27028 - 19968: jis0208<<14 | 0x2E<<7 | 0x10, - 27029 - 19968: jis0208<<14 | 0x3B<<7 | 0x36, - 27030 - 19968: jis0212<<14 | 0x23<<7 | 0x37, - 27032 - 19968: jis0208<<14 | 0x59<<7 | 0x30, - 27035 - 19968: jis0208<<14 | 0x1E<<7 | 0x19, - 27036 - 19968: jis0208<<14 | 0x3B<<7 | 0x35, - 27040 - 19968: jis0208<<14 | 0x3B<<7 | 0x34, - 27041 - 19968: jis0212<<14 | 0x23<<7 | 0x39, - 27045 - 19968: jis0212<<14 | 0x23<<7 | 0x3A, - 27046 - 19968: jis0212<<14 | 0x23<<7 | 0x3B, - 27047 - 19968: jis0208<<14 | 0x3B<<7 | 0x31, - 27048 - 19968: jis0212<<14 | 0x23<<7 | 0x3C, - 27051 - 19968: jis0212<<14 | 0x23<<7 | 0x3D, - 27053 - 19968: jis0212<<14 | 0x23<<7 | 0x3E, - 27054 - 19968: jis0208<<14 | 0x3B<<7 | 0x25, - 27055 - 19968: jis0212<<14 | 0x23<<7 | 0x3F, - 27057 - 19968: jis0208<<14 | 0x3B<<7 | 0x42, - 27058 - 19968: jis0208<<14 | 0x3B<<7 | 0x24, - 27060 - 19968: jis0208<<14 | 0x3B<<7 | 0x37, - 27063 - 19968: jis0212<<14 | 0x23<<7 | 0x40, - 27064 - 19968: jis0212<<14 | 0x23<<7 | 0x41, - 27066 - 19968: jis0212<<14 | 0x23<<7 | 0x42, - 27067 - 19968: jis0208<<14 | 0x3B<<7 | 0x2F, - 27068 - 19968: jis0212<<14 | 0x23<<7 | 0x43, - 27070 - 19968: jis0208<<14 | 0x3B<<7 | 0x2A, - 27071 - 19968: jis0208<<14 | 0x3B<<7 | 0x27, - 27073 - 19968: jis0208<<14 | 0x3B<<7 | 0x28, - 27075 - 19968: jis0208<<14 | 0x3B<<7 | 0x30, - 27077 - 19968: jis0212<<14 | 0x23<<7 | 0x44, - 27079 - 19968: jis0208<<14 | 0x53<<7 | 0x01, - 27080 - 19968: jis0212<<14 | 0x23<<7 | 0x45, - 27082 - 19968: jis0208<<14 | 0x3B<<7 | 0x2D, - 27083 - 19968: jis0208<<14 | 0x18<<7 | 0x1C, - 27084 - 19968: jis0208<<14 | 0x23<<7 | 0x27, - 27085 - 19968: jis0208<<14 | 0x20<<7 | 0x43, - 27086 - 19968: jis0208<<14 | 0x3B<<7 | 0x2B, - 27088 - 19968: jis0208<<14 | 0x3B<<7 | 0x26, - 27089 - 19968: jis0212<<14 | 0x23<<7 | 0x46, - 27091 - 19968: jis0208<<14 | 0x3B<<7 | 0x29, - 27094 - 19968: jis0212<<14 | 0x23<<7 | 0x47, - 27095 - 19968: jis0212<<14 | 0x23<<7 | 0x48, - 27096 - 19968: jis0208<<14 | 0x2C<<7 | 0x2C, - 27097 - 19968: jis0208<<14 | 0x2A<<7 | 0x49, - 27101 - 19968: jis0208<<14 | 0x3B<<7 | 0x2E, - 27102 - 19968: jis0208<<14 | 0x3B<<7 | 0x38, - 27106 - 19968: jis0208<<14 | 0x59<<7 | 0x31, - 27109 - 19968: jis0212<<14 | 0x23<<7 | 0x4A, - 27111 - 19968: jis0208<<14 | 0x3B<<7 | 0x40, - 27112 - 19968: jis0208<<14 | 0x3B<<7 | 0x39, - 27115 - 19968: jis0208<<14 | 0x3B<<7 | 0x46, - 27117 - 19968: jis0208<<14 | 0x3B<<7 | 0x44, - 27118 - 19968: jis0212<<14 | 0x23<<7 | 0x4B, - 27119 - 19968: jis0212<<14 | 0x23<<7 | 0x4C, - 27121 - 19968: jis0212<<14 | 0x23<<7 | 0x4D, - 27122 - 19968: jis0208<<14 | 0x3B<<7 | 0x3F, - 27123 - 19968: jis0212<<14 | 0x23<<7 | 0x4E, - 27125 - 19968: jis0212<<14 | 0x23<<7 | 0x4F, - 27129 - 19968: jis0208<<14 | 0x3B<<7 | 0x3E, - 27131 - 19968: jis0208<<14 | 0x23<<7 | 0x2F, - 27133 - 19968: jis0208<<14 | 0x20<<7 | 0x44, - 27134 - 19968: jis0212<<14 | 0x23<<7 | 0x50, - 27135 - 19968: jis0208<<14 | 0x3B<<7 | 0x3C, - 27136 - 19968: jis0212<<14 | 0x23<<7 | 0x51, - 27137 - 19968: jis0212<<14 | 0x23<<7 | 0x52, - 27138 - 19968: jis0208<<14 | 0x3B<<7 | 0x3A, - 27139 - 19968: jis0212<<14 | 0x23<<7 | 0x53, - 27141 - 19968: jis0208<<14 | 0x3B<<7 | 0x41, - 27146 - 19968: jis0208<<14 | 0x3B<<7 | 0x47, - 27147 - 19968: jis0208<<14 | 0x27<<7 | 0x54, - 27148 - 19968: jis0208<<14 | 0x3B<<7 | 0x4D, - 27151 - 19968: jis0212<<14 | 0x23<<7 | 0x54, - 27153 - 19968: jis0212<<14 | 0x23<<7 | 0x55, - 27154 - 19968: jis0208<<14 | 0x3B<<7 | 0x48, - 27155 - 19968: jis0208<<14 | 0x3B<<7 | 0x4B, - 27156 - 19968: jis0208<<14 | 0x3B<<7 | 0x45, - 27157 - 19968: jis0212<<14 | 0x23<<7 | 0x56, - 27159 - 19968: jis0208<<14 | 0x22<<7 | 0x53, - 27161 - 19968: jis0208<<14 | 0x28<<7 | 0x17, - 27162 - 19968: jis0212<<14 | 0x23<<7 | 0x57, - 27163 - 19968: jis0208<<14 | 0x3B<<7 | 0x3B, - 27165 - 19968: jis0212<<14 | 0x23<<7 | 0x58, - 27166 - 19968: jis0208<<14 | 0x3B<<7 | 0x43, - 27167 - 19968: jis0208<<14 | 0x1D<<7 | 0x1F, - 27168 - 19968: jis0212<<14 | 0x23<<7 | 0x59, - 27169 - 19968: jis0208<<14 | 0x2B<<7 | 0x2E, - 27170 - 19968: jis0208<<14 | 0x3B<<7 | 0x57, - 27171 - 19968: jis0208<<14 | 0x3B<<7 | 0x4A, - 27172 - 19968: jis0212<<14 | 0x23<<7 | 0x5A, - 27176 - 19968: jis0212<<14 | 0x23<<7 | 0x5B, - 27177 - 19968: jis0208<<14 | 0x17<<7 | 0x01, - 27178 - 19968: jis0208<<14 | 0x11<<7 | 0x02, - 27179 - 19968: jis0208<<14 | 0x12<<7 | 0x3E, - 27182 - 19968: jis0208<<14 | 0x3B<<7 | 0x32, - 27184 - 19968: jis0208<<14 | 0x59<<7 | 0x32, - 27186 - 19968: jis0212<<14 | 0x23<<7 | 0x5D, - 27188 - 19968: jis0212<<14 | 0x24<<7 | 0x00, - 27189 - 19968: jis0208<<14 | 0x1D<<7 | 0x20, - 27190 - 19968: jis0208<<14 | 0x3B<<7 | 0x4F, - 27191 - 19968: jis0212<<14 | 0x24<<7 | 0x01, - 27192 - 19968: jis0208<<14 | 0x3B<<7 | 0x56, - 27193 - 19968: jis0208<<14 | 0x1B<<7 | 0x58, - 27194 - 19968: jis0208<<14 | 0x12<<7 | 0x51, - 27195 - 19968: jis0212<<14 | 0x24<<7 | 0x02, - 27197 - 19968: jis0208<<14 | 0x22<<7 | 0x0D, - 27198 - 19968: jis0212<<14 | 0x24<<7 | 0x03, - 27199 - 19968: jis0212<<14 | 0x24<<7 | 0x04, - 27204 - 19968: jis0208<<14 | 0x3B<<7 | 0x4C, - 27205 - 19968: jis0212<<14 | 0x24<<7 | 0x05, - 27206 - 19968: jis0208<<14 | 0x59<<7 | 0x34, - 27207 - 19968: jis0208<<14 | 0x3B<<7 | 0x51, - 27208 - 19968: jis0208<<14 | 0x3B<<7 | 0x55, - 27209 - 19968: jis0212<<14 | 0x24<<7 | 0x07, - 27210 - 19968: jis0212<<14 | 0x24<<7 | 0x08, - 27211 - 19968: jis0208<<14 | 0x15<<7 | 0x15, - 27214 - 19968: jis0212<<14 | 0x24<<7 | 0x09, - 27216 - 19968: jis0212<<14 | 0x24<<7 | 0x0A, - 27217 - 19968: jis0212<<14 | 0x24<<7 | 0x0B, - 27218 - 19968: jis0212<<14 | 0x24<<7 | 0x0C, - 27221 - 19968: jis0212<<14 | 0x24<<7 | 0x0D, - 27222 - 19968: jis0212<<14 | 0x24<<7 | 0x0E, - 27224 - 19968: jis0208<<14 | 0x14<<7 | 0x2B, - 27225 - 19968: jis0208<<14 | 0x3B<<7 | 0x53, - 27227 - 19968: jis0212<<14 | 0x24<<7 | 0x0F, - 27231 - 19968: jis0208<<14 | 0x14<<7 | 0x00, - 27233 - 19968: jis0208<<14 | 0x25<<7 | 0x2A, - 27234 - 19968: jis0208<<14 | 0x3B<<7 | 0x52, - 27236 - 19968: jis0212<<14 | 0x24<<7 | 0x10, - 27238 - 19968: jis0208<<14 | 0x3B<<7 | 0x54, - 27239 - 19968: jis0212<<14 | 0x24<<7 | 0x11, - 27242 - 19968: jis0212<<14 | 0x24<<7 | 0x12, - 27243 - 19968: jis0208<<14 | 0x59<<7 | 0x33, - 27249 - 19968: jis0212<<14 | 0x24<<7 | 0x13, - 27250 - 19968: jis0208<<14 | 0x3B<<7 | 0x4E, - 27251 - 19968: jis0208<<14 | 0x59<<7 | 0x35, - 27256 - 19968: jis0208<<14 | 0x3B<<7 | 0x50, - 27262 - 19968: jis0208<<14 | 0x59<<7 | 0x36, - 27263 - 19968: jis0208<<14 | 0x12<<7 | 0x3F, - 27264 - 19968: jis0208<<14 | 0x22<<7 | 0x28, - 27265 - 19968: jis0212<<14 | 0x24<<7 | 0x16, - 27267 - 19968: jis0212<<14 | 0x24<<7 | 0x17, - 27268 - 19968: jis0208<<14 | 0x3B<<7 | 0x5B, - 27270 - 19968: jis0212<<14 | 0x24<<7 | 0x18, - 27271 - 19968: jis0212<<14 | 0x24<<7 | 0x19, - 27273 - 19968: jis0212<<14 | 0x24<<7 | 0x1A, - 27275 - 19968: jis0212<<14 | 0x24<<7 | 0x1B, - 27277 - 19968: jis0208<<14 | 0x3B<<7 | 0x59, - 27278 - 19968: jis0208<<14 | 0x17<<7 | 0x48, - 27280 - 19968: jis0208<<14 | 0x3B<<7 | 0x58, - 27281 - 19968: jis0212<<14 | 0x24<<7 | 0x1C, - 27287 - 19968: jis0208<<14 | 0x3C<<7 | 0x00, - 27291 - 19968: jis0212<<14 | 0x24<<7 | 0x1D, - 27292 - 19968: jis0208<<14 | 0x3A<<7 | 0x37, - 27293 - 19968: jis0212<<14 | 0x24<<7 | 0x1E, - 27294 - 19968: jis0212<<14 | 0x24<<7 | 0x1F, - 27295 - 19968: jis0212<<14 | 0x24<<7 | 0x20, - 27296 - 19968: jis0208<<14 | 0x3B<<7 | 0x5A, - 27298 - 19968: jis0208<<14 | 0x3B<<7 | 0x5C, - 27299 - 19968: jis0208<<14 | 0x3B<<7 | 0x5D, - 27301 - 19968: jis0212<<14 | 0x24<<7 | 0x21, - 27306 - 19968: jis0208<<14 | 0x3C<<7 | 0x0B, - 27307 - 19968: jis0212<<14 | 0x24<<7 | 0x22, - 27308 - 19968: jis0208<<14 | 0x3C<<7 | 0x07, - 27310 - 19968: jis0208<<14 | 0x3A<<7 | 0x4C, - 27311 - 19968: jis0212<<14 | 0x24<<7 | 0x23, - 27312 - 19968: jis0212<<14 | 0x24<<7 | 0x24, - 27313 - 19968: jis0212<<14 | 0x24<<7 | 0x25, - 27315 - 19968: jis0208<<14 | 0x3C<<7 | 0x06, - 27316 - 19968: jis0212<<14 | 0x24<<7 | 0x26, - 27320 - 19968: jis0208<<14 | 0x3C<<7 | 0x05, - 27323 - 19968: jis0208<<14 | 0x3C<<7 | 0x02, - 27325 - 19968: jis0212<<14 | 0x24<<7 | 0x27, - 27326 - 19968: jis0212<<14 | 0x24<<7 | 0x28, - 27327 - 19968: jis0212<<14 | 0x24<<7 | 0x29, - 27329 - 19968: jis0208<<14 | 0x3B<<7 | 0x49, - 27330 - 19968: jis0208<<14 | 0x3C<<7 | 0x04, - 27331 - 19968: jis0208<<14 | 0x3C<<7 | 0x03, - 27334 - 19968: jis0212<<14 | 0x24<<7 | 0x2A, - 27336 - 19968: jis0212<<14 | 0x24<<7 | 0x2C, - 27337 - 19968: jis0212<<14 | 0x24<<7 | 0x2B, - 27340 - 19968: jis0212<<14 | 0x24<<7 | 0x2D, - 27344 - 19968: jis0212<<14 | 0x24<<7 | 0x2E, - 27345 - 19968: jis0208<<14 | 0x3C<<7 | 0x09, - 27347 - 19968: jis0208<<14 | 0x2E<<7 | 0x05, - 27348 - 19968: jis0212<<14 | 0x24<<7 | 0x2F, - 27349 - 19968: jis0212<<14 | 0x24<<7 | 0x30, - 27350 - 19968: jis0212<<14 | 0x24<<7 | 0x31, - 27354 - 19968: jis0208<<14 | 0x3C<<7 | 0x0C, - 27355 - 19968: jis0208<<14 | 0x15<<7 | 0x5A, - 27356 - 19968: jis0212<<14 | 0x24<<7 | 0x32, - 27357 - 19968: jis0212<<14 | 0x24<<7 | 0x33, - 27358 - 19968: jis0208<<14 | 0x3C<<7 | 0x08, - 27359 - 19968: jis0208<<14 | 0x3C<<7 | 0x0A, - 27362 - 19968: jis0208<<14 | 0x59<<7 | 0x37, - 27364 - 19968: jis0208<<14 | 0x59<<7 | 0x38, - 27367 - 19968: jis0212<<14 | 0x24<<7 | 0x35, - 27368 - 19968: jis0208<<14 | 0x27<<7 | 0x06, - 27370 - 19968: jis0208<<14 | 0x3C<<7 | 0x0D, - 27372 - 19968: jis0212<<14 | 0x24<<7 | 0x36, - 27376 - 19968: jis0212<<14 | 0x24<<7 | 0x37, - 27377 - 19968: jis0212<<14 | 0x24<<7 | 0x38, - 27378 - 19968: jis0212<<14 | 0x24<<7 | 0x39, - 27386 - 19968: jis0208<<14 | 0x3C<<7 | 0x11, - 27387 - 19968: jis0208<<14 | 0x3C<<7 | 0x0E, - 27388 - 19968: jis0212<<14 | 0x24<<7 | 0x3A, - 27389 - 19968: jis0212<<14 | 0x24<<7 | 0x3B, - 27394 - 19968: jis0212<<14 | 0x24<<7 | 0x3C, - 27395 - 19968: jis0212<<14 | 0x24<<7 | 0x3D, - 27396 - 19968: jis0208<<14 | 0x2C<<7 | 0x52, - 27397 - 19968: jis0208<<14 | 0x3C<<7 | 0x0F, - 27398 - 19968: jis0212<<14 | 0x24<<7 | 0x3E, - 27399 - 19968: jis0212<<14 | 0x24<<7 | 0x3F, - 27401 - 19968: jis0212<<14 | 0x24<<7 | 0x40, - 27402 - 19968: jis0208<<14 | 0x3B<<7 | 0x3D, - 27407 - 19968: jis0212<<14 | 0x24<<7 | 0x41, - 27408 - 19968: jis0212<<14 | 0x24<<7 | 0x42, - 27409 - 19968: jis0212<<14 | 0x24<<7 | 0x43, - 27410 - 19968: jis0208<<14 | 0x3C<<7 | 0x12, - 27414 - 19968: jis0208<<14 | 0x3C<<7 | 0x13, - 27415 - 19968: jis0212<<14 | 0x24<<7 | 0x44, - 27419 - 19968: jis0212<<14 | 0x24<<7 | 0x45, - 27421 - 19968: jis0208<<14 | 0x10<<7 | 0x14, - 27422 - 19968: jis0212<<14 | 0x24<<7 | 0x46, - 27423 - 19968: jis0208<<14 | 0x3C<<7 | 0x15, - 27424 - 19968: jis0208<<14 | 0x16<<7 | 0x46, - 27425 - 19968: jis0208<<14 | 0x1B<<7 | 0x00, - 27427 - 19968: jis0208<<14 | 0x15<<7 | 0x34, - 27428 - 19968: jis0212<<14 | 0x24<<7 | 0x47, - 27431 - 19968: jis0208<<14 | 0x11<<7 | 0x03, - 27432 - 19968: jis0212<<14 | 0x24<<7 | 0x48, - 27435 - 19968: jis0212<<14 | 0x24<<7 | 0x49, - 27436 - 19968: jis0212<<14 | 0x24<<7 | 0x4A, - 27439 - 19968: jis0212<<14 | 0x24<<7 | 0x4B, - 27442 - 19968: jis0208<<14 | 0x2C<<7 | 0x3E, - 27445 - 19968: jis0212<<14 | 0x24<<7 | 0x4C, - 27446 - 19968: jis0212<<14 | 0x24<<7 | 0x4D, - 27447 - 19968: jis0208<<14 | 0x3C<<7 | 0x17, - 27448 - 19968: jis0208<<14 | 0x3C<<7 | 0x16, - 27449 - 19968: jis0208<<14 | 0x3C<<7 | 0x19, - 27450 - 19968: jis0208<<14 | 0x14<<7 | 0x1C, - 27451 - 19968: jis0212<<14 | 0x24<<7 | 0x4E, - 27453 - 19968: jis0208<<14 | 0x15<<7 | 0x35, - 27454 - 19968: jis0208<<14 | 0x13<<7 | 0x1D, - 27455 - 19968: jis0212<<14 | 0x24<<7 | 0x4F, - 27459 - 19968: jis0208<<14 | 0x3C<<7 | 0x1C, - 27462 - 19968: jis0212<<14 | 0x24<<7 | 0x50, - 27463 - 19968: jis0208<<14 | 0x3C<<7 | 0x1B, - 27465 - 19968: jis0208<<14 | 0x3C<<7 | 0x1D, - 27466 - 19968: jis0212<<14 | 0x24<<7 | 0x51, - 27468 - 19968: jis0208<<14 | 0x11<<7 | 0x2D, - 27469 - 19968: jis0212<<14 | 0x24<<7 | 0x52, - 27470 - 19968: jis0208<<14 | 0x22<<7 | 0x16, - 27472 - 19968: jis0208<<14 | 0x3C<<7 | 0x1E, - 27474 - 19968: jis0212<<14 | 0x24<<7 | 0x53, - 27475 - 19968: jis0208<<14 | 0x13<<7 | 0x1E, - 27476 - 19968: jis0208<<14 | 0x3C<<7 | 0x20, - 27478 - 19968: jis0212<<14 | 0x24<<7 | 0x54, - 27480 - 19968: jis0212<<14 | 0x24<<7 | 0x55, - 27481 - 19968: jis0208<<14 | 0x3C<<7 | 0x1F, - 27483 - 19968: jis0208<<14 | 0x3C<<7 | 0x21, - 27485 - 19968: jis0212<<14 | 0x24<<7 | 0x56, - 27487 - 19968: jis0208<<14 | 0x3C<<7 | 0x22, - 27488 - 19968: jis0212<<14 | 0x24<<7 | 0x57, - 27489 - 19968: jis0208<<14 | 0x3C<<7 | 0x23, - 27490 - 19968: jis0208<<14 | 0x1A<<7 | 0x3E, - 27491 - 19968: jis0208<<14 | 0x1F<<7 | 0x14, - 27492 - 19968: jis0208<<14 | 0x19<<7 | 0x00, - 27494 - 19968: jis0208<<14 | 0x28<<7 | 0x4F, - 27495 - 19968: jis0212<<14 | 0x24<<7 | 0x58, - 27497 - 19968: jis0208<<14 | 0x29<<7 | 0x41, - 27498 - 19968: jis0208<<14 | 0x2E<<7 | 0x23, - 27499 - 19968: jis0212<<14 | 0x24<<7 | 0x59, - 27502 - 19968: jis0212<<14 | 0x24<<7 | 0x5A, - 27503 - 19968: jis0208<<14 | 0x1A<<7 | 0x54, - 27504 - 19968: jis0212<<14 | 0x24<<7 | 0x5B, - 27507 - 19968: jis0208<<14 | 0x19<<7 | 0x2F, - 27508 - 19968: jis0208<<14 | 0x2D<<7 | 0x51, - 27509 - 19968: jis0212<<14 | 0x24<<7 | 0x5C, - 27512 - 19968: jis0208<<14 | 0x3C<<7 | 0x24, - 27513 - 19968: jis0208<<14 | 0x3C<<7 | 0x25, - 27515 - 19968: jis0208<<14 | 0x1A<<7 | 0x3F, - 27517 - 19968: jis0212<<14 | 0x24<<7 | 0x5D, - 27518 - 19968: jis0212<<14 | 0x25<<7 | 0x00, - 27519 - 19968: jis0208<<14 | 0x3C<<7 | 0x26, - 27520 - 19968: jis0208<<14 | 0x3C<<7 | 0x27, - 27522 - 19968: jis0212<<14 | 0x25<<7 | 0x01, - 27523 - 19968: jis0208<<14 | 0x3C<<7 | 0x29, - 27524 - 19968: jis0208<<14 | 0x3C<<7 | 0x28, - 27525 - 19968: jis0212<<14 | 0x25<<7 | 0x02, - 27526 - 19968: jis0208<<14 | 0x2A<<7 | 0x37, - 27529 - 19968: jis0208<<14 | 0x1C<<7 | 0x3D, - 27530 - 19968: jis0208<<14 | 0x1B<<7 | 0x4B, - 27531 - 19968: jis0208<<14 | 0x1A<<7 | 0x23, - 27533 - 19968: jis0208<<14 | 0x3C<<7 | 0x2A, - 27541 - 19968: jis0208<<14 | 0x3C<<7 | 0x2C, - 27542 - 19968: jis0208<<14 | 0x1E<<7 | 0x02, - 27543 - 19968: jis0212<<14 | 0x25<<7 | 0x03, - 27544 - 19968: jis0208<<14 | 0x3C<<7 | 0x2B, - 27547 - 19968: jis0212<<14 | 0x25<<7 | 0x04, - 27550 - 19968: jis0208<<14 | 0x3C<<7 | 0x2D, - 27551 - 19968: jis0212<<14 | 0x25<<7 | 0x05, - 27552 - 19968: jis0212<<14 | 0x25<<7 | 0x06, - 27554 - 19968: jis0212<<14 | 0x25<<7 | 0x07, - 27555 - 19968: jis0212<<14 | 0x25<<7 | 0x08, - 27556 - 19968: jis0208<<14 | 0x3C<<7 | 0x2E, - 27560 - 19968: jis0212<<14 | 0x25<<7 | 0x09, - 27561 - 19968: jis0212<<14 | 0x25<<7 | 0x0A, - 27562 - 19968: jis0208<<14 | 0x3C<<7 | 0x2F, - 27563 - 19968: jis0208<<14 | 0x3C<<7 | 0x30, - 27564 - 19968: jis0212<<14 | 0x25<<7 | 0x0B, - 27565 - 19968: jis0212<<14 | 0x25<<7 | 0x0C, - 27566 - 19968: jis0212<<14 | 0x25<<7 | 0x0D, - 27567 - 19968: jis0208<<14 | 0x3C<<7 | 0x31, - 27568 - 19968: jis0212<<14 | 0x25<<7 | 0x0E, - 27569 - 19968: jis0208<<14 | 0x3C<<7 | 0x33, - 27570 - 19968: jis0208<<14 | 0x3C<<7 | 0x32, - 27571 - 19968: jis0208<<14 | 0x3C<<7 | 0x34, - 27572 - 19968: jis0208<<14 | 0x11<<7 | 0x04, - 27573 - 19968: jis0208<<14 | 0x22<<7 | 0x29, - 27575 - 19968: jis0208<<14 | 0x3C<<7 | 0x35, - 27576 - 19968: jis0212<<14 | 0x25<<7 | 0x0F, - 27577 - 19968: jis0212<<14 | 0x25<<7 | 0x10, - 27578 - 19968: jis0208<<14 | 0x1A<<7 | 0x05, - 27579 - 19968: jis0208<<14 | 0x12<<7 | 0x2B, - 27580 - 19968: jis0208<<14 | 0x3C<<7 | 0x36, - 27581 - 19968: jis0212<<14 | 0x25<<7 | 0x11, - 27582 - 19968: jis0212<<14 | 0x25<<7 | 0x12, - 27583 - 19968: jis0208<<14 | 0x24<<7 | 0x21, - 27584 - 19968: jis0208<<14 | 0x33<<7 | 0x2B, - 27587 - 19968: jis0212<<14 | 0x25<<7 | 0x13, - 27588 - 19968: jis0212<<14 | 0x25<<7 | 0x14, - 27589 - 19968: jis0208<<14 | 0x14<<7 | 0x02, - 27590 - 19968: jis0208<<14 | 0x3C<<7 | 0x37, - 27593 - 19968: jis0212<<14 | 0x25<<7 | 0x15, - 27595 - 19968: jis0208<<14 | 0x3C<<7 | 0x38, - 27596 - 19968: jis0212<<14 | 0x25<<7 | 0x16, - 27597 - 19968: jis0208<<14 | 0x29<<7 | 0x4B, - 27598 - 19968: jis0208<<14 | 0x2A<<7 | 0x47, - 27602 - 19968: jis0208<<14 | 0x25<<7 | 0x26, - 27603 - 19968: jis0208<<14 | 0x3C<<7 | 0x39, - 27604 - 19968: jis0208<<14 | 0x27<<7 | 0x45, - 27606 - 19968: jis0208<<14 | 0x59<<7 | 0x39, - 27608 - 19968: jis0208<<14 | 0x27<<7 | 0x5A, - 27610 - 19968: jis0212<<14 | 0x25<<7 | 0x18, - 27611 - 19968: jis0208<<14 | 0x2B<<7 | 0x32, - 27615 - 19968: jis0208<<14 | 0x3C<<7 | 0x3A, - 27617 - 19968: jis0212<<14 | 0x25<<7 | 0x19, - 27619 - 19968: jis0212<<14 | 0x25<<7 | 0x1A, - 27622 - 19968: jis0212<<14 | 0x25<<7 | 0x1B, - 27623 - 19968: jis0212<<14 | 0x25<<7 | 0x1C, - 27627 - 19968: jis0208<<14 | 0x3C<<7 | 0x3C, - 27628 - 19968: jis0208<<14 | 0x3C<<7 | 0x3B, - 27630 - 19968: jis0212<<14 | 0x25<<7 | 0x1D, - 27631 - 19968: jis0208<<14 | 0x3C<<7 | 0x3E, - 27633 - 19968: jis0212<<14 | 0x25<<7 | 0x1E, - 27635 - 19968: jis0208<<14 | 0x3C<<7 | 0x3D, - 27639 - 19968: jis0212<<14 | 0x25<<7 | 0x1F, - 27641 - 19968: jis0212<<14 | 0x25<<7 | 0x20, - 27647 - 19968: jis0212<<14 | 0x25<<7 | 0x21, - 27650 - 19968: jis0212<<14 | 0x25<<7 | 0x22, - 27652 - 19968: jis0212<<14 | 0x25<<7 | 0x23, - 27653 - 19968: jis0212<<14 | 0x25<<7 | 0x24, - 27656 - 19968: jis0208<<14 | 0x3C<<7 | 0x40, - 27657 - 19968: jis0212<<14 | 0x25<<7 | 0x25, - 27661 - 19968: jis0212<<14 | 0x25<<7 | 0x26, - 27662 - 19968: jis0212<<14 | 0x25<<7 | 0x27, - 27663 - 19968: jis0208<<14 | 0x1A<<7 | 0x40, - 27664 - 19968: jis0212<<14 | 0x25<<7 | 0x28, - 27665 - 19968: jis0208<<14 | 0x2B<<7 | 0x10, - 27666 - 19968: jis0212<<14 | 0x25<<7 | 0x29, - 27667 - 19968: jis0208<<14 | 0x3C<<7 | 0x41, - 27668 - 19968: jis0208<<14 | 0x3C<<7 | 0x42, - 27671 - 19968: jis0208<<14 | 0x14<<7 | 0x03, - 27673 - 19968: jis0212<<14 | 0x25<<7 | 0x2A, - 27675 - 19968: jis0208<<14 | 0x3C<<7 | 0x43, - 27679 - 19968: jis0212<<14 | 0x25<<7 | 0x2B, - 27683 - 19968: jis0208<<14 | 0x3C<<7 | 0x45, - 27684 - 19968: jis0208<<14 | 0x3C<<7 | 0x44, - 27686 - 19968: jis0212<<14 | 0x25<<7 | 0x2C, - 27687 - 19968: jis0212<<14 | 0x25<<7 | 0x2D, - 27688 - 19968: jis0212<<14 | 0x25<<7 | 0x2E, - 27692 - 19968: jis0212<<14 | 0x25<<7 | 0x2F, - 27694 - 19968: jis0212<<14 | 0x25<<7 | 0x30, - 27699 - 19968: jis0212<<14 | 0x25<<7 | 0x31, - 27700 - 19968: jis0208<<14 | 0x1E<<7 | 0x44, - 27701 - 19968: jis0212<<14 | 0x25<<7 | 0x32, - 27702 - 19968: jis0212<<14 | 0x25<<7 | 0x33, - 27703 - 19968: jis0208<<14 | 0x28<<7 | 0x18, - 27704 - 19968: jis0208<<14 | 0x10<<7 | 0x29, - 27706 - 19968: jis0212<<14 | 0x25<<7 | 0x34, - 27707 - 19968: jis0212<<14 | 0x25<<7 | 0x35, - 27710 - 19968: jis0208<<14 | 0x27<<7 | 0x24, - 27711 - 19968: jis0208<<14 | 0x59<<7 | 0x3A, - 27712 - 19968: jis0208<<14 | 0x23<<7 | 0x54, - 27713 - 19968: jis0208<<14 | 0x1C<<7 | 0x20, - 27714 - 19968: jis0208<<14 | 0x14<<7 | 0x40, - 27722 - 19968: jis0212<<14 | 0x25<<7 | 0x37, - 27723 - 19968: jis0212<<14 | 0x25<<7 | 0x38, - 27725 - 19968: jis0212<<14 | 0x25<<7 | 0x39, - 27726 - 19968: jis0208<<14 | 0x27<<7 | 0x25, - 27727 - 19968: jis0212<<14 | 0x25<<7 | 0x3A, - 27728 - 19968: jis0208<<14 | 0x1B<<7 | 0x0D, - 27730 - 19968: jis0212<<14 | 0x25<<7 | 0x3B, - 27732 - 19968: jis0212<<14 | 0x25<<7 | 0x3C, - 27733 - 19968: jis0208<<14 | 0x3C<<7 | 0x47, - 27735 - 19968: jis0208<<14 | 0x13<<7 | 0x1F, - 27737 - 19968: jis0212<<14 | 0x25<<7 | 0x3D, - 27738 - 19968: jis0208<<14 | 0x10<<7 | 0x57, - 27739 - 19968: jis0212<<14 | 0x25<<7 | 0x3E, - 27740 - 19968: jis0208<<14 | 0x59<<7 | 0x3B, - 27741 - 19968: jis0208<<14 | 0x25<<7 | 0x51, - 27742 - 19968: jis0208<<14 | 0x3C<<7 | 0x46, - 27743 - 19968: jis0208<<14 | 0x18<<7 | 0x1D, - 27744 - 19968: jis0208<<14 | 0x22<<7 | 0x32, - 27746 - 19968: jis0208<<14 | 0x3C<<7 | 0x48, - 27751 - 19968: jis0212<<14 | 0x26<<7 | 0x15, - 27752 - 19968: jis0208<<14 | 0x3C<<7 | 0x50, - 27754 - 19968: jis0208<<14 | 0x3C<<7 | 0x49, - 27755 - 19968: jis0212<<14 | 0x25<<7 | 0x40, - 27757 - 19968: jis0212<<14 | 0x25<<7 | 0x41, - 27759 - 19968: jis0208<<14 | 0x59<<7 | 0x3D, - 27760 - 19968: jis0208<<14 | 0x21<<7 | 0x20, - 27762 - 19968: jis0208<<14 | 0x14<<7 | 0x41, - 27763 - 19968: jis0208<<14 | 0x3C<<7 | 0x51, - 27764 - 19968: jis0212<<14 | 0x25<<7 | 0x43, - 27766 - 19968: jis0212<<14 | 0x25<<7 | 0x44, - 27768 - 19968: jis0212<<14 | 0x25<<7 | 0x45, - 27769 - 19968: jis0212<<14 | 0x25<<7 | 0x46, - 27770 - 19968: jis0208<<14 | 0x16<<7 | 0x47, - 27771 - 19968: jis0212<<14 | 0x25<<7 | 0x47, - 27773 - 19968: jis0208<<14 | 0x14<<7 | 0x04, - 27774 - 19968: jis0208<<14 | 0x3C<<7 | 0x4F, - 27777 - 19968: jis0208<<14 | 0x3C<<7 | 0x4D, - 27778 - 19968: jis0208<<14 | 0x3C<<7 | 0x4A, - 27779 - 19968: jis0208<<14 | 0x2C<<7 | 0x3F, - 27781 - 19968: jis0212<<14 | 0x25<<7 | 0x48, - 27782 - 19968: jis0208<<14 | 0x59<<7 | 0x3C, - 27783 - 19968: jis0212<<14 | 0x25<<7 | 0x4A, - 27784 - 19968: jis0208<<14 | 0x23<<7 | 0x1F, - 27785 - 19968: jis0212<<14 | 0x25<<7 | 0x4B, - 27788 - 19968: jis0208<<14 | 0x25<<7 | 0x38, - 27789 - 19968: jis0208<<14 | 0x3C<<7 | 0x4B, - 27792 - 19968: jis0208<<14 | 0x3C<<7 | 0x53, - 27794 - 19968: jis0208<<14 | 0x3C<<7 | 0x52, - 27795 - 19968: jis0208<<14 | 0x16<<7 | 0x02, - 27796 - 19968: jis0212<<14 | 0x25<<7 | 0x4C, - 27797 - 19968: jis0212<<14 | 0x25<<7 | 0x4D, - 27798 - 19968: jis0208<<14 | 0x11<<7 | 0x0C, - 27799 - 19968: jis0212<<14 | 0x25<<7 | 0x4E, - 27800 - 19968: jis0212<<14 | 0x25<<7 | 0x4F, - 27801 - 19968: jis0208<<14 | 0x19<<7 | 0x1A, - 27802 - 19968: jis0208<<14 | 0x3C<<7 | 0x4C, - 27803 - 19968: jis0208<<14 | 0x3C<<7 | 0x4E, - 27804 - 19968: jis0212<<14 | 0x25<<7 | 0x50, - 27807 - 19968: jis0212<<14 | 0x25<<7 | 0x51, - 27809 - 19968: jis0208<<14 | 0x2A<<7 | 0x36, - 27810 - 19968: jis0208<<14 | 0x21<<7 | 0x53, - 27819 - 19968: jis0208<<14 | 0x2A<<7 | 0x56, - 27822 - 19968: jis0208<<14 | 0x3C<<7 | 0x5B, - 27824 - 19968: jis0212<<14 | 0x25<<7 | 0x52, - 27825 - 19968: jis0208<<14 | 0x3C<<7 | 0x5C, - 27826 - 19968: jis0212<<14 | 0x25<<7 | 0x53, - 27827 - 19968: jis0208<<14 | 0x11<<7 | 0x2E, - 27828 - 19968: jis0212<<14 | 0x25<<7 | 0x54, - 27832 - 19968: jis0208<<14 | 0x29<<7 | 0x07, - 27833 - 19968: jis0208<<14 | 0x2B<<7 | 0x5C, - 27834 - 19968: jis0208<<14 | 0x3D<<7 | 0x00, - 27835 - 19968: jis0208<<14 | 0x1B<<7 | 0x02, - 27836 - 19968: jis0208<<14 | 0x1D<<7 | 0x21, - 27837 - 19968: jis0208<<14 | 0x3C<<7 | 0x57, - 27838 - 19968: jis0208<<14 | 0x3C<<7 | 0x5D, - 27839 - 19968: jis0208<<14 | 0x10<<7 | 0x47, - 27841 - 19968: jis0208<<14 | 0x15<<7 | 0x16, - 27842 - 19968: jis0212<<14 | 0x25<<7 | 0x55, - 27844 - 19968: jis0208<<14 | 0x3C<<7 | 0x54, - 27845 - 19968: jis0208<<14 | 0x3C<<7 | 0x59, - 27846 - 19968: jis0212<<14 | 0x25<<7 | 0x56, - 27849 - 19968: jis0208<<14 | 0x1F<<7 | 0x53, - 27850 - 19968: jis0208<<14 | 0x26<<7 | 0x50, - 27852 - 19968: jis0208<<14 | 0x27<<7 | 0x46, - 27853 - 19968: jis0212<<14 | 0x25<<7 | 0x57, - 27855 - 19968: jis0212<<14 | 0x25<<7 | 0x58, - 27856 - 19968: jis0212<<14 | 0x25<<7 | 0x59, - 27857 - 19968: jis0212<<14 | 0x25<<7 | 0x5A, - 27858 - 19968: jis0212<<14 | 0x25<<7 | 0x5B, - 27859 - 19968: jis0208<<14 | 0x3C<<7 | 0x56, - 27860 - 19968: jis0212<<14 | 0x25<<7 | 0x5C, - 27861 - 19968: jis0208<<14 | 0x2A<<7 | 0x00, - 27862 - 19968: jis0212<<14 | 0x25<<7 | 0x5D, - 27863 - 19968: jis0208<<14 | 0x3C<<7 | 0x58, - 27865 - 19968: jis0208<<14 | 0x3D<<7 | 0x03, - 27866 - 19968: jis0208<<14 | 0x59<<7 | 0x3E, - 27867 - 19968: jis0208<<14 | 0x3D<<7 | 0x01, - 27868 - 19968: jis0212<<14 | 0x26<<7 | 0x01, - 27869 - 19968: jis0208<<14 | 0x3C<<7 | 0x5A, - 27872 - 19968: jis0212<<14 | 0x26<<7 | 0x02, - 27873 - 19968: jis0208<<14 | 0x2A<<7 | 0x01, - 27874 - 19968: jis0208<<14 | 0x26<<7 | 0x27, - 27875 - 19968: jis0208<<14 | 0x14<<7 | 0x42, - 27877 - 19968: jis0208<<14 | 0x24<<7 | 0x04, - 27879 - 19968: jis0212<<14 | 0x26<<7 | 0x03, - 27880 - 19968: jis0208<<14 | 0x22<<7 | 0x4C, - 27881 - 19968: jis0212<<14 | 0x26<<7 | 0x04, - 27882 - 19968: jis0208<<14 | 0x3D<<7 | 0x04, - 27883 - 19968: jis0212<<14 | 0x26<<7 | 0x05, - 27884 - 19968: jis0212<<14 | 0x26<<7 | 0x06, - 27886 - 19968: jis0212<<14 | 0x26<<7 | 0x07, - 27887 - 19968: jis0208<<14 | 0x3D<<7 | 0x02, - 27888 - 19968: jis0208<<14 | 0x21<<7 | 0x38, - 27889 - 19968: jis0208<<14 | 0x3C<<7 | 0x55, - 27890 - 19968: jis0212<<14 | 0x26<<7 | 0x08, - 27891 - 19968: jis0208<<14 | 0x10<<7 | 0x2A, - 27892 - 19968: jis0212<<14 | 0x26<<7 | 0x09, - 27908 - 19968: jis0208<<14 | 0x59<<7 | 0x3F, - 27911 - 19968: jis0212<<14 | 0x26<<7 | 0x0B, - 27914 - 19968: jis0212<<14 | 0x26<<7 | 0x0C, - 27915 - 19968: jis0208<<14 | 0x2C<<7 | 0x2D, - 27916 - 19968: jis0208<<14 | 0x3D<<7 | 0x0F, - 27918 - 19968: jis0212<<14 | 0x26<<7 | 0x0D, - 27919 - 19968: jis0212<<14 | 0x26<<7 | 0x0E, - 27921 - 19968: jis0212<<14 | 0x26<<7 | 0x0F, - 27922 - 19968: jis0208<<14 | 0x3D<<7 | 0x0E, - 27923 - 19968: jis0212<<14 | 0x26<<7 | 0x10, - 27927 - 19968: jis0208<<14 | 0x1F<<7 | 0x55, - 27929 - 19968: jis0208<<14 | 0x3D<<7 | 0x0B, - 27930 - 19968: jis0212<<14 | 0x26<<7 | 0x11, - 27931 - 19968: jis0208<<14 | 0x2C<<7 | 0x4B, - 27934 - 19968: jis0208<<14 | 0x25<<7 | 0x15, - 27935 - 19968: jis0208<<14 | 0x3D<<7 | 0x05, - 27941 - 19968: jis0208<<14 | 0x23<<7 | 0x24, - 27942 - 19968: jis0212<<14 | 0x26<<7 | 0x12, - 27943 - 19968: jis0212<<14 | 0x26<<7 | 0x13, - 27944 - 19968: jis0212<<14 | 0x26<<7 | 0x14, - 27945 - 19968: jis0208<<14 | 0x10<<7 | 0x2B, - 27946 - 19968: jis0208<<14 | 0x18<<7 | 0x1E, - 27947 - 19968: jis0208<<14 | 0x3D<<7 | 0x08, - 27950 - 19968: jis0212<<14 | 0x26<<7 | 0x16, - 27951 - 19968: jis0212<<14 | 0x26<<7 | 0x17, - 27953 - 19968: jis0212<<14 | 0x26<<7 | 0x18, - 27954 - 19968: jis0208<<14 | 0x1C<<7 | 0x06, - 27955 - 19968: jis0208<<14 | 0x3D<<7 | 0x0D, - 27957 - 19968: jis0208<<14 | 0x3D<<7 | 0x0C, - 27958 - 19968: jis0208<<14 | 0x3D<<7 | 0x07, - 27960 - 19968: jis0208<<14 | 0x3D<<7 | 0x0A, - 27961 - 19968: jis0212<<14 | 0x26<<7 | 0x19, - 27963 - 19968: jis0208<<14 | 0x12<<7 | 0x47, - 27964 - 19968: jis0212<<14 | 0x26<<7 | 0x1A, - 27965 - 19968: jis0208<<14 | 0x3D<<7 | 0x09, - 27966 - 19968: jis0208<<14 | 0x26<<7 | 0x28, - 27967 - 19968: jis0212<<14 | 0x26<<7 | 0x1B, - 27969 - 19968: jis0208<<14 | 0x2D<<7 | 0x0D, - 27972 - 19968: jis0208<<14 | 0x1D<<7 | 0x53, - 27973 - 19968: jis0208<<14 | 0x1F<<7 | 0x54, - 27991 - 19968: jis0212<<14 | 0x26<<7 | 0x1C, - 27993 - 19968: jis0208<<14 | 0x3D<<7 | 0x15, - 27994 - 19968: jis0208<<14 | 0x3D<<7 | 0x13, - 27996 - 19968: jis0208<<14 | 0x28<<7 | 0x2C, - 27998 - 19968: jis0212<<14 | 0x26<<7 | 0x1D, - 27999 - 19968: jis0212<<14 | 0x26<<7 | 0x1E, - 28001 - 19968: jis0212<<14 | 0x26<<7 | 0x1F, - 28003 - 19968: jis0208<<14 | 0x3D<<7 | 0x10, - 28004 - 19968: jis0208<<14 | 0x3D<<7 | 0x12, - 28005 - 19968: jis0212<<14 | 0x26<<7 | 0x20, - 28006 - 19968: jis0208<<14 | 0x10<<7 | 0x19, - 28007 - 19968: jis0212<<14 | 0x26<<7 | 0x21, - 28009 - 19968: jis0208<<14 | 0x18<<7 | 0x1F, - 28010 - 19968: jis0208<<14 | 0x2E<<7 | 0x11, - 28012 - 19968: jis0208<<14 | 0x12<<7 | 0x1C, - 28014 - 19968: jis0208<<14 | 0x28<<7 | 0x41, - 28015 - 19968: jis0208<<14 | 0x59<<7 | 0x41, - 28016 - 19968: jis0212<<14 | 0x26<<7 | 0x23, - 28020 - 19968: jis0208<<14 | 0x2C<<7 | 0x40, - 28023 - 19968: jis0208<<14 | 0x12<<7 | 0x03, - 28024 - 19968: jis0208<<14 | 0x1E<<7 | 0x1A, - 28025 - 19968: jis0208<<14 | 0x3D<<7 | 0x14, - 28028 - 19968: jis0212<<14 | 0x26<<7 | 0x24, - 28034 - 19968: jis0212<<14 | 0x26<<7 | 0x25, - 28037 - 19968: jis0208<<14 | 0x3D<<7 | 0x19, - 28039 - 19968: jis0208<<14 | 0x59<<7 | 0x40, - 28040 - 19968: jis0208<<14 | 0x1D<<7 | 0x22, - 28044 - 19968: jis0208<<14 | 0x2C<<7 | 0x0F, - 28046 - 19968: jis0208<<14 | 0x3D<<7 | 0x16, - 28049 - 19968: jis0212<<14 | 0x26<<7 | 0x27, - 28050 - 19968: jis0212<<14 | 0x26<<7 | 0x28, - 28051 - 19968: jis0208<<14 | 0x3D<<7 | 0x11, - 28052 - 19968: jis0212<<14 | 0x26<<7 | 0x29, - 28053 - 19968: jis0208<<14 | 0x3D<<7 | 0x17, - 28054 - 19968: jis0208<<14 | 0x59<<7 | 0x42, - 28055 - 19968: jis0212<<14 | 0x26<<7 | 0x2B, - 28056 - 19968: jis0212<<14 | 0x26<<7 | 0x2C, - 28057 - 19968: jis0208<<14 | 0x2D<<7 | 0x3D, - 28059 - 19968: jis0208<<14 | 0x24<<7 | 0x52, - 28060 - 19968: jis0208<<14 | 0x25<<7 | 0x21, - 28074 - 19968: jis0212<<14 | 0x26<<7 | 0x2D, - 28076 - 19968: jis0208<<14 | 0x59<<7 | 0x43, - 28079 - 19968: jis0208<<14 | 0x12<<7 | 0x15, - 28082 - 19968: jis0208<<14 | 0x10<<7 | 0x34, - 28084 - 19968: jis0212<<14 | 0x26<<7 | 0x2F, - 28085 - 19968: jis0208<<14 | 0x3D<<7 | 0x1D, - 28087 - 19968: jis0212<<14 | 0x26<<7 | 0x30, - 28088 - 19968: jis0208<<14 | 0x3D<<7 | 0x20, - 28089 - 19968: jis0212<<14 | 0x26<<7 | 0x31, - 28092 - 19968: jis0208<<14 | 0x2D<<7 | 0x22, - 28093 - 19968: jis0212<<14 | 0x26<<7 | 0x32, - 28095 - 19968: jis0212<<14 | 0x26<<7 | 0x33, - 28096 - 19968: jis0208<<14 | 0x2C<<7 | 0x43, - 28100 - 19968: jis0212<<14 | 0x26<<7 | 0x34, - 28101 - 19968: jis0208<<14 | 0x3D<<7 | 0x27, - 28102 - 19968: jis0208<<14 | 0x3D<<7 | 0x21, - 28103 - 19968: jis0208<<14 | 0x3D<<7 | 0x1E, - 28104 - 19968: jis0212<<14 | 0x26<<7 | 0x35, - 28106 - 19968: jis0212<<14 | 0x26<<7 | 0x36, - 28107 - 19968: jis0208<<14 | 0x2D<<7 | 0x33, - 28108 - 19968: jis0208<<14 | 0x3D<<7 | 0x24, - 28110 - 19968: jis0212<<14 | 0x26<<7 | 0x37, - 28111 - 19968: jis0208<<14 | 0x59<<7 | 0x44, - 28113 - 19968: jis0208<<14 | 0x1C<<7 | 0x29, - 28114 - 19968: jis0208<<14 | 0x3D<<7 | 0x26, - 28117 - 19968: jis0208<<14 | 0x3D<<7 | 0x2B, - 28118 - 19968: jis0212<<14 | 0x26<<7 | 0x39, - 28120 - 19968: jis0208<<14 | 0x24<<7 | 0x50, - 28121 - 19968: jis0208<<14 | 0x3D<<7 | 0x29, - 28123 - 19968: jis0212<<14 | 0x26<<7 | 0x3A, - 28125 - 19968: jis0212<<14 | 0x26<<7 | 0x3B, - 28126 - 19968: jis0208<<14 | 0x3D<<7 | 0x23, - 28127 - 19968: jis0212<<14 | 0x26<<7 | 0x3C, - 28128 - 19968: jis0212<<14 | 0x26<<7 | 0x3D, - 28129 - 19968: jis0208<<14 | 0x22<<7 | 0x17, - 28130 - 19968: jis0212<<14 | 0x26<<7 | 0x3E, - 28132 - 19968: jis0208<<14 | 0x3D<<7 | 0x2A, - 28133 - 19968: jis0212<<14 | 0x26<<7 | 0x3F, - 28134 - 19968: jis0208<<14 | 0x3D<<7 | 0x1F, - 28136 - 19968: jis0208<<14 | 0x3D<<7 | 0x25, - 28137 - 19968: jis0212<<14 | 0x26<<7 | 0x40, - 28138 - 19968: jis0208<<14 | 0x3D<<7 | 0x2C, - 28139 - 19968: jis0208<<14 | 0x0F<<7 | 0x5B, - 28140 - 19968: jis0208<<14 | 0x3D<<7 | 0x22, - 28142 - 19968: jis0208<<14 | 0x3D<<7 | 0x2D, - 28143 - 19968: jis0212<<14 | 0x26<<7 | 0x41, - 28144 - 19968: jis0212<<14 | 0x26<<7 | 0x42, - 28145 - 19968: jis0208<<14 | 0x1E<<7 | 0x1B, - 28146 - 19968: jis0208<<14 | 0x59<<7 | 0x46, - 28147 - 19968: jis0208<<14 | 0x1C<<7 | 0x3E, - 28148 - 19968: jis0212<<14 | 0x26<<7 | 0x43, - 28149 - 19968: jis0208<<14 | 0x29<<7 | 0x04, - 28150 - 19968: jis0212<<14 | 0x26<<7 | 0x44, - 28151 - 19968: jis0208<<14 | 0x19<<7 | 0x0D, - 28152 - 19968: jis0208<<14 | 0x59<<7 | 0x45, - 28153 - 19968: jis0208<<14 | 0x3D<<7 | 0x1A, - 28154 - 19968: jis0208<<14 | 0x3D<<7 | 0x28, - 28155 - 19968: jis0208<<14 | 0x24<<7 | 0x19, - 28156 - 19968: jis0208<<14 | 0x59<<7 | 0x47, - 28160 - 19968: jis0212<<14 | 0x26<<7 | 0x46, - 28164 - 19968: jis0212<<14 | 0x26<<7 | 0x47, - 28165 - 19968: jis0208<<14 | 0x1F<<7 | 0x15, - 28167 - 19968: jis0208<<14 | 0x12<<7 | 0x48, - 28168 - 19968: jis0208<<14 | 0x19<<7 | 0x30, - 28169 - 19968: jis0208<<14 | 0x1D<<7 | 0x23, - 28170 - 19968: jis0208<<14 | 0x3D<<7 | 0x1C, - 28171 - 19968: jis0208<<14 | 0x1C<<7 | 0x21, - 28179 - 19968: jis0208<<14 | 0x16<<7 | 0x2B, - 28181 - 19968: jis0208<<14 | 0x3D<<7 | 0x1B, - 28185 - 19968: jis0208<<14 | 0x3D<<7 | 0x31, - 28186 - 19968: jis0208<<14 | 0x1C<<7 | 0x4C, - 28187 - 19968: jis0208<<14 | 0x17<<7 | 0x19, - 28189 - 19968: jis0208<<14 | 0x3D<<7 | 0x40, - 28190 - 19968: jis0212<<14 | 0x26<<7 | 0x48, - 28191 - 19968: jis0208<<14 | 0x3D<<7 | 0x3A, - 28192 - 19968: jis0208<<14 | 0x14<<7 | 0x53, - 28193 - 19968: jis0208<<14 | 0x24<<7 | 0x2E, - 28194 - 19968: jis0212<<14 | 0x26<<7 | 0x49, - 28195 - 19968: jis0208<<14 | 0x3D<<7 | 0x35, - 28196 - 19968: jis0208<<14 | 0x3D<<7 | 0x3E, - 28197 - 19968: jis0208<<14 | 0x0F<<7 | 0x0E, - 28198 - 19968: jis0208<<14 | 0x10<<7 | 0x11, - 28199 - 19968: jis0208<<14 | 0x59<<7 | 0x4A, - 28201 - 19968: jis0208<<14 | 0x11<<7 | 0x18, - 28203 - 19968: jis0208<<14 | 0x3D<<7 | 0x37, - 28204 - 19968: jis0208<<14 | 0x21<<7 | 0x0B, - 28205 - 19968: jis0208<<14 | 0x3D<<7 | 0x2E, - 28206 - 19968: jis0208<<14 | 0x3D<<7 | 0x30, - 28207 - 19968: jis0208<<14 | 0x18<<7 | 0x20, - 28210 - 19968: jis0212<<14 | 0x26<<7 | 0x4B, - 28214 - 19968: jis0212<<14 | 0x26<<7 | 0x4C, - 28216 - 19968: jis0208<<14 | 0x3D<<7 | 0x41, - 28217 - 19968: jis0208<<14 | 0x59<<7 | 0x48, - 28218 - 19968: jis0208<<14 | 0x3D<<7 | 0x3C, - 28219 - 19968: jis0212<<14 | 0x26<<7 | 0x4E, - 28220 - 19968: jis0208<<14 | 0x59<<7 | 0x4B, - 28222 - 19968: jis0208<<14 | 0x3D<<7 | 0x34, - 28227 - 19968: jis0208<<14 | 0x3D<<7 | 0x3B, - 28228 - 19968: jis0212<<14 | 0x26<<7 | 0x50, - 28229 - 19968: jis0212<<14 | 0x26<<7 | 0x51, - 28232 - 19968: jis0212<<14 | 0x26<<7 | 0x52, - 28233 - 19968: jis0212<<14 | 0x26<<7 | 0x53, - 28234 - 19968: jis0208<<14 | 0x2B<<7 | 0x0A, - 28235 - 19968: jis0212<<14 | 0x26<<7 | 0x54, - 28237 - 19968: jis0208<<14 | 0x3D<<7 | 0x39, - 28238 - 19968: jis0208<<14 | 0x3D<<7 | 0x3D, - 28239 - 19968: jis0212<<14 | 0x26<<7 | 0x55, - 28241 - 19968: jis0212<<14 | 0x26<<7 | 0x56, - 28242 - 19968: jis0212<<14 | 0x26<<7 | 0x57, - 28243 - 19968: jis0212<<14 | 0x26<<7 | 0x58, - 28244 - 19968: jis0212<<14 | 0x26<<7 | 0x59, - 28246 - 19968: jis0208<<14 | 0x17<<7 | 0x2F, - 28247 - 19968: jis0212<<14 | 0x26<<7 | 0x5A, - 28248 - 19968: jis0208<<14 | 0x1D<<7 | 0x24, - 28251 - 19968: jis0208<<14 | 0x22<<7 | 0x18, - 28252 - 19968: jis0208<<14 | 0x59<<7 | 0x49, - 28253 - 19968: jis0212<<14 | 0x26<<7 | 0x5C, - 28254 - 19968: jis0212<<14 | 0x26<<7 | 0x5D, - 28255 - 19968: jis0208<<14 | 0x3D<<7 | 0x33, - 28258 - 19968: jis0212<<14 | 0x27<<7 | 0x00, - 28259 - 19968: jis0212<<14 | 0x27<<7 | 0x01, - 28263 - 19968: jis0208<<14 | 0x2C<<7 | 0x0E, - 28264 - 19968: jis0212<<14 | 0x27<<7 | 0x02, - 28267 - 19968: jis0208<<14 | 0x3D<<7 | 0x36, - 28270 - 19968: jis0208<<14 | 0x3D<<7 | 0x2F, - 28271 - 19968: jis0208<<14 | 0x24<<7 | 0x51, - 28274 - 19968: jis0208<<14 | 0x3D<<7 | 0x32, - 28275 - 19968: jis0212<<14 | 0x27<<7 | 0x03, - 28278 - 19968: jis0208<<14 | 0x3D<<7 | 0x38, - 28283 - 19968: jis0212<<14 | 0x27<<7 | 0x04, - 28285 - 19968: jis0212<<14 | 0x27<<7 | 0x05, - 28286 - 19968: jis0208<<14 | 0x2E<<7 | 0x30, - 28287 - 19968: jis0208<<14 | 0x1B<<7 | 0x1D, - 28288 - 19968: jis0208<<14 | 0x2A<<7 | 0x5D, - 28290 - 19968: jis0208<<14 | 0x3D<<7 | 0x42, - 28300 - 19968: jis0208<<14 | 0x27<<7 | 0x0D, - 28301 - 19968: jis0212<<14 | 0x27<<7 | 0x06, - 28303 - 19968: jis0208<<14 | 0x3D<<7 | 0x4E, - 28304 - 19968: jis0208<<14 | 0x17<<7 | 0x1A, - 28307 - 19968: jis0212<<14 | 0x27<<7 | 0x07, - 28310 - 19968: jis0208<<14 | 0x1C<<7 | 0x3F, - 28312 - 19968: jis0208<<14 | 0x3D<<7 | 0x44, - 28313 - 19968: jis0212<<14 | 0x27<<7 | 0x08, - 28316 - 19968: jis0208<<14 | 0x2D<<7 | 0x0E, - 28317 - 19968: jis0208<<14 | 0x18<<7 | 0x21, - 28319 - 19968: jis0208<<14 | 0x3D<<7 | 0x51, - 28320 - 19968: jis0212<<14 | 0x27<<7 | 0x09, - 28322 - 19968: jis0208<<14 | 0x0F<<7 | 0x4D, - 28325 - 19968: jis0208<<14 | 0x3D<<7 | 0x4F, - 28327 - 19968: jis0212<<14 | 0x27<<7 | 0x0A, - 28330 - 19968: jis0208<<14 | 0x3D<<7 | 0x43, - 28333 - 19968: jis0212<<14 | 0x27<<7 | 0x0B, - 28334 - 19968: jis0212<<14 | 0x27<<7 | 0x0C, - 28335 - 19968: jis0208<<14 | 0x3D<<7 | 0x49, - 28337 - 19968: jis0212<<14 | 0x27<<7 | 0x0D, - 28338 - 19968: jis0208<<14 | 0x3D<<7 | 0x4B, - 28339 - 19968: jis0212<<14 | 0x27<<7 | 0x0E, - 28342 - 19968: jis0208<<14 | 0x2C<<7 | 0x2E, - 28343 - 19968: jis0208<<14 | 0x3D<<7 | 0x46, - 28346 - 19968: jis0208<<14 | 0x24<<7 | 0x0D, - 28347 - 19968: jis0212<<14 | 0x27<<7 | 0x0F, - 28349 - 19968: jis0208<<14 | 0x3D<<7 | 0x48, - 28351 - 19968: jis0208<<14 | 0x59<<7 | 0x4C, - 28352 - 19968: jis0212<<14 | 0x27<<7 | 0x11, - 28353 - 19968: jis0212<<14 | 0x27<<7 | 0x12, - 28354 - 19968: jis0208<<14 | 0x3D<<7 | 0x50, - 28355 - 19968: jis0212<<14 | 0x27<<7 | 0x13, - 28356 - 19968: jis0208<<14 | 0x3D<<7 | 0x4A, - 28357 - 19968: jis0208<<14 | 0x2B<<7 | 0x26, - 28359 - 19968: jis0212<<14 | 0x27<<7 | 0x14, - 28360 - 19968: jis0212<<14 | 0x27<<7 | 0x15, - 28361 - 19968: jis0208<<14 | 0x3D<<7 | 0x45, - 28362 - 19968: jis0212<<14 | 0x27<<7 | 0x16, - 28363 - 19968: jis0208<<14 | 0x1B<<7 | 0x01, - 28364 - 19968: jis0208<<14 | 0x3D<<7 | 0x5D, - 28365 - 19968: jis0212<<14 | 0x27<<7 | 0x17, - 28366 - 19968: jis0212<<14 | 0x27<<7 | 0x18, - 28367 - 19968: jis0212<<14 | 0x27<<7 | 0x19, - 28369 - 19968: jis0208<<14 | 0x12<<7 | 0x49, - 28371 - 19968: jis0208<<14 | 0x3D<<7 | 0x47, - 28372 - 19968: jis0208<<14 | 0x3D<<7 | 0x4C, - 28373 - 19968: jis0208<<14 | 0x3D<<7 | 0x4D, - 28381 - 19968: jis0208<<14 | 0x21<<7 | 0x4B, - 28382 - 19968: jis0208<<14 | 0x21<<7 | 0x39, - 28395 - 19968: jis0212<<14 | 0x27<<7 | 0x1A, - 28396 - 19968: jis0208<<14 | 0x3D<<7 | 0x55, - 28397 - 19968: jis0212<<14 | 0x27<<7 | 0x1B, - 28398 - 19968: jis0212<<14 | 0x27<<7 | 0x1C, - 28399 - 19968: jis0208<<14 | 0x3D<<7 | 0x5B, - 28402 - 19968: jis0208<<14 | 0x3D<<7 | 0x59, - 28404 - 19968: jis0208<<14 | 0x24<<7 | 0x08, - 28407 - 19968: jis0208<<14 | 0x3E<<7 | 0x02, - 28408 - 19968: jis0208<<14 | 0x3D<<7 | 0x56, - 28409 - 19968: jis0212<<14 | 0x27<<7 | 0x1D, - 28411 - 19968: jis0212<<14 | 0x27<<7 | 0x1E, - 28413 - 19968: jis0212<<14 | 0x27<<7 | 0x1F, - 28414 - 19968: jis0208<<14 | 0x3D<<7 | 0x57, - 28415 - 19968: jis0208<<14 | 0x3D<<7 | 0x3F, - 28417 - 19968: jis0208<<14 | 0x14<<7 | 0x58, - 28418 - 19968: jis0208<<14 | 0x28<<7 | 0x19, - 28420 - 19968: jis0212<<14 | 0x27<<7 | 0x20, - 28422 - 19968: jis0208<<14 | 0x1B<<7 | 0x1E, - 28424 - 19968: jis0212<<14 | 0x27<<7 | 0x21, - 28425 - 19968: jis0208<<14 | 0x18<<7 | 0x56, - 28426 - 19968: jis0212<<14 | 0x27<<7 | 0x22, - 28428 - 19968: jis0212<<14 | 0x27<<7 | 0x23, - 28429 - 19968: jis0212<<14 | 0x27<<7 | 0x24, - 28431 - 19968: jis0208<<14 | 0x2E<<7 | 0x12, - 28433 - 19968: jis0208<<14 | 0x3D<<7 | 0x53, - 28435 - 19968: jis0208<<14 | 0x3E<<7 | 0x01, - 28436 - 19968: jis0208<<14 | 0x10<<7 | 0x48, - 28437 - 19968: jis0208<<14 | 0x20<<7 | 0x45, - 28438 - 19968: jis0212<<14 | 0x27<<7 | 0x25, - 28440 - 19968: jis0212<<14 | 0x27<<7 | 0x26, - 28442 - 19968: jis0212<<14 | 0x27<<7 | 0x27, - 28443 - 19968: jis0212<<14 | 0x27<<7 | 0x28, - 28448 - 19968: jis0208<<14 | 0x26<<7 | 0x58, - 28450 - 19968: jis0208<<14 | 0x13<<7 | 0x20, - 28451 - 19968: jis0208<<14 | 0x2D<<7 | 0x59, - 28454 - 19968: jis0212<<14 | 0x27<<7 | 0x29, - 28457 - 19968: jis0212<<14 | 0x27<<7 | 0x2A, - 28458 - 19968: jis0212<<14 | 0x27<<7 | 0x2B, - 28459 - 19968: jis0208<<14 | 0x2B<<7 | 0x00, - 28460 - 19968: jis0208<<14 | 0x23<<7 | 0x31, - 28461 - 19968: jis0212<<14 | 0x27<<7 | 0x32, - 28463 - 19968: jis0212<<14 | 0x27<<7 | 0x2C, - 28464 - 19968: jis0212<<14 | 0x27<<7 | 0x2D, - 28465 - 19968: jis0208<<14 | 0x3D<<7 | 0x5A, - 28466 - 19968: jis0208<<14 | 0x3D<<7 | 0x5C, - 28467 - 19968: jis0212<<14 | 0x27<<7 | 0x2E, - 28470 - 19968: jis0212<<14 | 0x27<<7 | 0x2F, - 28472 - 19968: jis0208<<14 | 0x20<<7 | 0x11, - 28475 - 19968: jis0212<<14 | 0x27<<7 | 0x30, - 28476 - 19968: jis0212<<14 | 0x27<<7 | 0x31, - 28478 - 19968: jis0208<<14 | 0x3E<<7 | 0x00, - 28479 - 19968: jis0208<<14 | 0x3D<<7 | 0x58, - 28481 - 19968: jis0208<<14 | 0x3D<<7 | 0x52, - 28485 - 19968: jis0208<<14 | 0x13<<7 | 0x22, - 28495 - 19968: jis0212<<14 | 0x27<<7 | 0x33, - 28497 - 19968: jis0212<<14 | 0x27<<7 | 0x34, - 28498 - 19968: jis0212<<14 | 0x27<<7 | 0x35, - 28499 - 19968: jis0212<<14 | 0x27<<7 | 0x36, - 28500 - 19968: jis0208<<14 | 0x16<<7 | 0x48, - 28503 - 19968: jis0212<<14 | 0x27<<7 | 0x37, - 28504 - 19968: jis0208<<14 | 0x3E<<7 | 0x0E, - 28505 - 19968: jis0212<<14 | 0x27<<7 | 0x38, - 28506 - 19968: jis0212<<14 | 0x27<<7 | 0x39, - 28507 - 19968: jis0208<<14 | 0x3E<<7 | 0x09, - 28508 - 19968: jis0208<<14 | 0x1F<<7 | 0x57, - 28509 - 19968: jis0212<<14 | 0x27<<7 | 0x3A, - 28510 - 19968: jis0212<<14 | 0x27<<7 | 0x3B, - 28511 - 19968: jis0208<<14 | 0x12<<7 | 0x42, - 28513 - 19968: jis0212<<14 | 0x27<<7 | 0x3C, - 28514 - 19968: jis0212<<14 | 0x27<<7 | 0x3D, - 28516 - 19968: jis0208<<14 | 0x1C<<7 | 0x40, - 28518 - 19968: jis0208<<14 | 0x3E<<7 | 0x12, - 28520 - 19968: jis0212<<14 | 0x27<<7 | 0x3E, - 28524 - 19968: jis0212<<14 | 0x27<<7 | 0x3F, - 28525 - 19968: jis0208<<14 | 0x3E<<7 | 0x0B, - 28526 - 19968: jis0208<<14 | 0x23<<7 | 0x0B, - 28527 - 19968: jis0208<<14 | 0x3E<<7 | 0x08, - 28528 - 19968: jis0208<<14 | 0x23<<7 | 0x38, - 28532 - 19968: jis0208<<14 | 0x3E<<7 | 0x2B, - 28536 - 19968: jis0208<<14 | 0x3E<<7 | 0x05, - 28538 - 19968: jis0208<<14 | 0x3E<<7 | 0x04, - 28540 - 19968: jis0208<<14 | 0x3E<<7 | 0x0D, - 28541 - 19968: jis0212<<14 | 0x27<<7 | 0x40, - 28542 - 19968: jis0212<<14 | 0x27<<7 | 0x41, - 28544 - 19968: jis0208<<14 | 0x3E<<7 | 0x07, - 28545 - 19968: jis0208<<14 | 0x3E<<7 | 0x06, - 28546 - 19968: jis0208<<14 | 0x3E<<7 | 0x0C, - 28547 - 19968: jis0212<<14 | 0x27<<7 | 0x42, - 28548 - 19968: jis0208<<14 | 0x1F<<7 | 0x00, - 28550 - 19968: jis0208<<14 | 0x3E<<7 | 0x03, - 28551 - 19968: jis0212<<14 | 0x27<<7 | 0x43, - 28552 - 19968: jis0208<<14 | 0x59<<7 | 0x4D, - 28555 - 19968: jis0212<<14 | 0x27<<7 | 0x45, - 28556 - 19968: jis0212<<14 | 0x27<<7 | 0x46, - 28557 - 19968: jis0212<<14 | 0x27<<7 | 0x47, - 28558 - 19968: jis0208<<14 | 0x3E<<7 | 0x0F, - 28560 - 19968: jis0212<<14 | 0x27<<7 | 0x48, - 28561 - 19968: jis0208<<14 | 0x3E<<7 | 0x10, - 28562 - 19968: jis0212<<14 | 0x27<<7 | 0x49, - 28563 - 19968: jis0212<<14 | 0x27<<7 | 0x4A, - 28564 - 19968: jis0212<<14 | 0x27<<7 | 0x4B, - 28566 - 19968: jis0212<<14 | 0x27<<7 | 0x4C, - 28567 - 19968: jis0208<<14 | 0x13<<7 | 0x21, - 28570 - 19968: jis0212<<14 | 0x27<<7 | 0x4D, - 28575 - 19968: jis0212<<14 | 0x27<<7 | 0x4E, - 28576 - 19968: jis0212<<14 | 0x27<<7 | 0x4F, - 28577 - 19968: jis0208<<14 | 0x3E<<7 | 0x15, - 28579 - 19968: jis0208<<14 | 0x3E<<7 | 0x14, - 28580 - 19968: jis0208<<14 | 0x3E<<7 | 0x16, - 28581 - 19968: jis0212<<14 | 0x27<<7 | 0x50, - 28582 - 19968: jis0212<<14 | 0x27<<7 | 0x51, - 28583 - 19968: jis0212<<14 | 0x27<<7 | 0x52, - 28584 - 19968: jis0212<<14 | 0x27<<7 | 0x53, - 28586 - 19968: jis0208<<14 | 0x3E<<7 | 0x19, - 28590 - 19968: jis0212<<14 | 0x27<<7 | 0x54, - 28591 - 19968: jis0212<<14 | 0x27<<7 | 0x55, - 28592 - 19968: jis0212<<14 | 0x27<<7 | 0x56, - 28593 - 19968: jis0208<<14 | 0x24<<7 | 0x22, - 28595 - 19968: jis0208<<14 | 0x3E<<7 | 0x13, - 28597 - 19968: jis0208<<14 | 0x59<<7 | 0x4E, - 28598 - 19968: jis0212<<14 | 0x27<<7 | 0x58, - 28601 - 19968: jis0208<<14 | 0x3E<<7 | 0x17, - 28604 - 19968: jis0212<<14 | 0x27<<7 | 0x59, - 28608 - 19968: jis0208<<14 | 0x16<<7 | 0x42, - 28609 - 19968: jis0208<<14 | 0x21<<7 | 0x58, - 28610 - 19968: jis0208<<14 | 0x3E<<7 | 0x11, - 28611 - 19968: jis0208<<14 | 0x26<<7 | 0x1A, - 28613 - 19968: jis0212<<14 | 0x27<<7 | 0x5A, - 28614 - 19968: jis0208<<14 | 0x3E<<7 | 0x18, - 28615 - 19968: jis0212<<14 | 0x27<<7 | 0x5B, - 28616 - 19968: jis0212<<14 | 0x27<<7 | 0x5C, - 28618 - 19968: jis0212<<14 | 0x27<<7 | 0x5D, - 28628 - 19968: jis0208<<14 | 0x3E<<7 | 0x1D, - 28629 - 19968: jis0208<<14 | 0x3E<<7 | 0x1B, - 28632 - 19968: jis0208<<14 | 0x3E<<7 | 0x1E, - 28634 - 19968: jis0212<<14 | 0x28<<7 | 0x00, - 28635 - 19968: jis0208<<14 | 0x3E<<7 | 0x21, - 28638 - 19968: jis0212<<14 | 0x28<<7 | 0x01, - 28639 - 19968: jis0208<<14 | 0x3E<<7 | 0x1A, - 28640 - 19968: jis0208<<14 | 0x18<<7 | 0x49, - 28641 - 19968: jis0208<<14 | 0x26<<7 | 0x07, - 28644 - 19968: jis0208<<14 | 0x3D<<7 | 0x18, - 28648 - 19968: jis0212<<14 | 0x28<<7 | 0x02, - 28649 - 19968: jis0212<<14 | 0x28<<7 | 0x03, - 28651 - 19968: jis0208<<14 | 0x2C<<7 | 0x53, - 28652 - 19968: jis0208<<14 | 0x3E<<7 | 0x1C, - 28654 - 19968: jis0208<<14 | 0x3E<<7 | 0x20, - 28655 - 19968: jis0208<<14 | 0x21<<7 | 0x54, - 28656 - 19968: jis0212<<14 | 0x28<<7 | 0x04, - 28657 - 19968: jis0208<<14 | 0x3E<<7 | 0x1F, - 28659 - 19968: jis0208<<14 | 0x3E<<7 | 0x0A, - 28661 - 19968: jis0208<<14 | 0x59<<7 | 0x4F, - 28662 - 19968: jis0208<<14 | 0x4E<<7 | 0x48, - 28665 - 19968: jis0212<<14 | 0x28<<7 | 0x06, - 28666 - 19968: jis0208<<14 | 0x3E<<7 | 0x24, - 28668 - 19968: jis0212<<14 | 0x28<<7 | 0x07, - 28669 - 19968: jis0212<<14 | 0x28<<7 | 0x08, - 28670 - 19968: jis0208<<14 | 0x3E<<7 | 0x28, - 28672 - 19968: jis0212<<14 | 0x28<<7 | 0x09, - 28673 - 19968: jis0208<<14 | 0x3E<<7 | 0x26, - 28677 - 19968: jis0208<<14 | 0x59<<7 | 0x50, - 28678 - 19968: jis0212<<14 | 0x28<<7 | 0x0B, - 28679 - 19968: jis0208<<14 | 0x59<<7 | 0x51, - 28681 - 19968: jis0208<<14 | 0x3E<<7 | 0x22, - 28683 - 19968: jis0208<<14 | 0x3E<<7 | 0x23, - 28685 - 19968: jis0212<<14 | 0x28<<7 | 0x0D, - 28687 - 19968: jis0208<<14 | 0x3E<<7 | 0x27, - 28689 - 19968: jis0208<<14 | 0x3E<<7 | 0x25, - 28693 - 19968: jis0208<<14 | 0x28<<7 | 0x2D, - 28695 - 19968: jis0212<<14 | 0x28<<7 | 0x0E, - 28696 - 19968: jis0208<<14 | 0x3E<<7 | 0x2D, - 28698 - 19968: jis0208<<14 | 0x3E<<7 | 0x2A, - 28699 - 19968: jis0208<<14 | 0x3E<<7 | 0x29, - 28701 - 19968: jis0208<<14 | 0x3E<<7 | 0x2C, - 28702 - 19968: jis0208<<14 | 0x25<<7 | 0x33, - 28703 - 19968: jis0208<<14 | 0x3E<<7 | 0x2E, - 28704 - 19968: jis0212<<14 | 0x28<<7 | 0x0F, - 28707 - 19968: jis0212<<14 | 0x28<<7 | 0x10, - 28710 - 19968: jis0208<<14 | 0x22<<7 | 0x54, - 28711 - 19968: jis0208<<14 | 0x21<<7 | 0x4C, - 28712 - 19968: jis0208<<14 | 0x59<<7 | 0x52, - 28716 - 19968: jis0208<<14 | 0x1F<<7 | 0x04, - 28719 - 19968: jis0212<<14 | 0x28<<7 | 0x11, - 28720 - 19968: jis0208<<14 | 0x3E<<7 | 0x2F, - 28722 - 19968: jis0208<<14 | 0x3E<<7 | 0x31, - 28724 - 19968: jis0212<<14 | 0x28<<7 | 0x12, - 28727 - 19968: jis0212<<14 | 0x28<<7 | 0x13, - 28729 - 19968: jis0212<<14 | 0x28<<7 | 0x14, - 28732 - 19968: jis0212<<14 | 0x28<<7 | 0x15, - 28734 - 19968: jis0208<<14 | 0x3E<<7 | 0x30, - 28739 - 19968: jis0212<<14 | 0x28<<7 | 0x16, - 28740 - 19968: jis0212<<14 | 0x28<<7 | 0x17, - 28744 - 19968: jis0212<<14 | 0x28<<7 | 0x18, - 28745 - 19968: jis0212<<14 | 0x28<<7 | 0x19, - 28746 - 19968: jis0212<<14 | 0x28<<7 | 0x1A, - 28747 - 19968: jis0212<<14 | 0x28<<7 | 0x1B, - 28748 - 19968: jis0208<<14 | 0x3D<<7 | 0x54, - 28750 - 19968: jis0212<<14 | 0x28<<7 | 0x20, - 28753 - 19968: jis0208<<14 | 0x3E<<7 | 0x32, - 28756 - 19968: jis0212<<14 | 0x28<<7 | 0x1C, - 28757 - 19968: jis0212<<14 | 0x28<<7 | 0x1D, - 28760 - 19968: jis0208<<14 | 0x25<<7 | 0x46, - 28765 - 19968: jis0212<<14 | 0x28<<7 | 0x1E, - 28766 - 19968: jis0212<<14 | 0x28<<7 | 0x1F, - 28771 - 19968: jis0208<<14 | 0x3E<<7 | 0x33, - 28772 - 19968: jis0212<<14 | 0x28<<7 | 0x21, - 28773 - 19968: jis0212<<14 | 0x28<<7 | 0x22, - 28779 - 19968: jis0208<<14 | 0x11<<7 | 0x2F, - 28780 - 19968: jis0212<<14 | 0x28<<7 | 0x23, - 28782 - 19968: jis0212<<14 | 0x28<<7 | 0x24, - 28783 - 19968: jis0208<<14 | 0x24<<7 | 0x53, - 28784 - 19968: jis0208<<14 | 0x12<<7 | 0x04, - 28789 - 19968: jis0212<<14 | 0x28<<7 | 0x25, - 28790 - 19968: jis0212<<14 | 0x28<<7 | 0x26, - 28792 - 19968: jis0208<<14 | 0x14<<7 | 0x43, - 28796 - 19968: jis0208<<14 | 0x1B<<7 | 0x3D, - 28797 - 19968: jis0208<<14 | 0x19<<7 | 0x31, - 28798 - 19968: jis0212<<14 | 0x28<<7 | 0x27, - 28801 - 19968: jis0212<<14 | 0x28<<7 | 0x28, - 28805 - 19968: jis0208<<14 | 0x59<<7 | 0x53, - 28806 - 19968: jis0212<<14 | 0x28<<7 | 0x2A, - 28809 - 19968: jis0208<<14 | 0x2E<<7 | 0x06, - 28810 - 19968: jis0208<<14 | 0x1E<<7 | 0x45, - 28814 - 19968: jis0208<<14 | 0x10<<7 | 0x49, - 28818 - 19968: jis0208<<14 | 0x3E<<7 | 0x35, - 28820 - 19968: jis0212<<14 | 0x28<<7 | 0x2B, - 28821 - 19968: jis0212<<14 | 0x28<<7 | 0x2C, - 28822 - 19968: jis0212<<14 | 0x28<<7 | 0x2D, - 28823 - 19968: jis0212<<14 | 0x28<<7 | 0x2E, - 28824 - 19968: jis0212<<14 | 0x28<<7 | 0x2F, - 28825 - 19968: jis0208<<14 | 0x3E<<7 | 0x34, - 28827 - 19968: jis0212<<14 | 0x28<<7 | 0x30, - 28836 - 19968: jis0212<<14 | 0x28<<7 | 0x31, - 28843 - 19968: jis0208<<14 | 0x59<<7 | 0x54, - 28844 - 19968: jis0208<<14 | 0x3E<<7 | 0x38, - 28845 - 19968: jis0208<<14 | 0x22<<7 | 0x19, - 28846 - 19968: jis0208<<14 | 0x3E<<7 | 0x3B, - 28847 - 19968: jis0208<<14 | 0x3E<<7 | 0x36, - 28848 - 19968: jis0212<<14 | 0x28<<7 | 0x33, - 28849 - 19968: jis0212<<14 | 0x28<<7 | 0x34, - 28851 - 19968: jis0208<<14 | 0x3E<<7 | 0x3A, - 28852 - 19968: jis0212<<14 | 0x28<<7 | 0x35, - 28855 - 19968: jis0212<<14 | 0x28<<7 | 0x36, - 28856 - 19968: jis0208<<14 | 0x3E<<7 | 0x39, - 28857 - 19968: jis0208<<14 | 0x24<<7 | 0x1F, - 28858 - 19968: jis0208<<14 | 0x0F<<7 | 0x38, - 28859 - 19968: jis0208<<14 | 0x58<<7 | 0x06, - 28872 - 19968: jis0208<<14 | 0x2D<<7 | 0x54, - 28874 - 19968: jis0212<<14 | 0x28<<7 | 0x37, - 28875 - 19968: jis0208<<14 | 0x3E<<7 | 0x3D, - 28879 - 19968: jis0208<<14 | 0x10<<7 | 0x07, - 28881 - 19968: jis0212<<14 | 0x28<<7 | 0x38, - 28883 - 19968: jis0212<<14 | 0x28<<7 | 0x39, - 28884 - 19968: jis0212<<14 | 0x28<<7 | 0x3A, - 28885 - 19968: jis0212<<14 | 0x28<<7 | 0x3B, - 28886 - 19968: jis0212<<14 | 0x28<<7 | 0x3C, - 28888 - 19968: jis0212<<14 | 0x28<<7 | 0x3D, - 28889 - 19968: jis0208<<14 | 0x3E<<7 | 0x3F, - 28892 - 19968: jis0212<<14 | 0x28<<7 | 0x3E, - 28893 - 19968: jis0208<<14 | 0x3E<<7 | 0x3E, - 28895 - 19968: jis0208<<14 | 0x3E<<7 | 0x3C, - 28900 - 19968: jis0212<<14 | 0x28<<7 | 0x3F, - 28913 - 19968: jis0208<<14 | 0x3E<<7 | 0x37, - 28921 - 19968: jis0208<<14 | 0x2A<<7 | 0x02, - 28922 - 19968: jis0212<<14 | 0x28<<7 | 0x40, - 28925 - 19968: jis0208<<14 | 0x3E<<7 | 0x41, - 28931 - 19968: jis0212<<14 | 0x28<<7 | 0x41, - 28932 - 19968: jis0208<<14 | 0x59<<7 | 0x56, - 28933 - 19968: jis0212<<14 | 0x28<<7 | 0x43, - 28934 - 19968: jis0212<<14 | 0x28<<7 | 0x44, - 28935 - 19968: jis0212<<14 | 0x28<<7 | 0x45, - 28937 - 19968: jis0208<<14 | 0x3E<<7 | 0x40, - 28939 - 19968: jis0212<<14 | 0x28<<7 | 0x46, - 28940 - 19968: jis0212<<14 | 0x28<<7 | 0x47, - 28943 - 19968: jis0208<<14 | 0x59<<7 | 0x55, - 28948 - 19968: jis0208<<14 | 0x10<<7 | 0x4A, - 28953 - 19968: jis0208<<14 | 0x3E<<7 | 0x43, - 28954 - 19968: jis0208<<14 | 0x29<<7 | 0x11, - 28956 - 19968: jis0208<<14 | 0x3E<<7 | 0x42, - 28958 - 19968: jis0212<<14 | 0x28<<7 | 0x49, - 28960 - 19968: jis0212<<14 | 0x28<<7 | 0x4A, - 28961 - 19968: jis0208<<14 | 0x2B<<7 | 0x14, - 28966 - 19968: jis0208<<14 | 0x1D<<7 | 0x26, - 28971 - 19968: jis0212<<14 | 0x28<<7 | 0x4B, - 28973 - 19968: jis0212<<14 | 0x28<<7 | 0x4C, - 28975 - 19968: jis0212<<14 | 0x28<<7 | 0x4D, - 28976 - 19968: jis0212<<14 | 0x28<<7 | 0x4E, - 28977 - 19968: jis0212<<14 | 0x28<<7 | 0x4F, - 28982 - 19968: jis0208<<14 | 0x20<<7 | 0x12, - 28984 - 19968: jis0212<<14 | 0x28<<7 | 0x50, - 28988 - 19968: jis0208<<14 | 0x1D<<7 | 0x25, - 28993 - 19968: jis0212<<14 | 0x28<<7 | 0x51, - 28997 - 19968: jis0212<<14 | 0x28<<7 | 0x52, - 28998 - 19968: jis0208<<14 | 0x59<<7 | 0x58, - 28999 - 19968: jis0208<<14 | 0x59<<7 | 0x59, - 29001 - 19968: jis0208<<14 | 0x2D<<7 | 0x5A, - 29002 - 19968: jis0212<<14 | 0x28<<7 | 0x55, - 29003 - 19968: jis0212<<14 | 0x28<<7 | 0x56, - 29004 - 19968: jis0208<<14 | 0x3E<<7 | 0x49, - 29006 - 19968: jis0208<<14 | 0x1F<<7 | 0x58, - 29008 - 19968: jis0212<<14 | 0x28<<7 | 0x57, - 29010 - 19968: jis0212<<14 | 0x28<<7 | 0x58, - 29013 - 19968: jis0208<<14 | 0x3E<<7 | 0x45, - 29014 - 19968: jis0208<<14 | 0x3E<<7 | 0x4A, - 29015 - 19968: jis0212<<14 | 0x28<<7 | 0x59, - 29017 - 19968: jis0208<<14 | 0x10<<7 | 0x4B, - 29018 - 19968: jis0212<<14 | 0x28<<7 | 0x5A, - 29020 - 19968: jis0208<<14 | 0x59<<7 | 0x57, - 29022 - 19968: jis0212<<14 | 0x28<<7 | 0x5C, - 29024 - 19968: jis0212<<14 | 0x28<<7 | 0x5D, - 29026 - 19968: jis0208<<14 | 0x3E<<7 | 0x48, - 29028 - 19968: jis0208<<14 | 0x26<<7 | 0x40, - 29029 - 19968: jis0208<<14 | 0x3E<<7 | 0x44, - 29030 - 19968: jis0208<<14 | 0x3E<<7 | 0x47, - 29031 - 19968: jis0208<<14 | 0x1D<<7 | 0x27, - 29032 - 19968: jis0212<<14 | 0x29<<7 | 0x00, - 29033 - 19968: jis0208<<14 | 0x27<<7 | 0x30, - 29036 - 19968: jis0208<<14 | 0x3E<<7 | 0x4B, - 29038 - 19968: jis0208<<14 | 0x1B<<7 | 0x30, - 29049 - 19968: jis0212<<14 | 0x29<<7 | 0x01, - 29053 - 19968: jis0208<<14 | 0x1F<<7 | 0x59, - 29056 - 19968: jis0212<<14 | 0x29<<7 | 0x02, - 29060 - 19968: jis0208<<14 | 0x3E<<7 | 0x4E, - 29061 - 19968: jis0212<<14 | 0x29<<7 | 0x03, - 29063 - 19968: jis0212<<14 | 0x29<<7 | 0x04, - 29064 - 19968: jis0208<<14 | 0x3E<<7 | 0x46, - 29066 - 19968: jis0208<<14 | 0x16<<7 | 0x06, - 29068 - 19968: jis0212<<14 | 0x29<<7 | 0x05, - 29071 - 19968: jis0208<<14 | 0x3E<<7 | 0x4C, - 29074 - 19968: jis0212<<14 | 0x29<<7 | 0x06, - 29076 - 19968: jis0208<<14 | 0x2C<<7 | 0x2F, - 29077 - 19968: jis0208<<14 | 0x3E<<7 | 0x4F, - 29081 - 19968: jis0208<<14 | 0x53<<7 | 0x05, - 29082 - 19968: jis0212<<14 | 0x29<<7 | 0x07, - 29083 - 19968: jis0212<<14 | 0x29<<7 | 0x08, - 29087 - 19968: jis0208<<14 | 0x1C<<7 | 0x2E, - 29088 - 19968: jis0212<<14 | 0x29<<7 | 0x09, - 29090 - 19968: jis0212<<14 | 0x29<<7 | 0x0A, - 29096 - 19968: jis0208<<14 | 0x3E<<7 | 0x50, - 29100 - 19968: jis0208<<14 | 0x3E<<7 | 0x51, - 29103 - 19968: jis0212<<14 | 0x29<<7 | 0x0B, - 29104 - 19968: jis0212<<14 | 0x29<<7 | 0x0C, - 29105 - 19968: jis0208<<14 | 0x26<<7 | 0x0D, - 29106 - 19968: jis0212<<14 | 0x29<<7 | 0x0D, - 29107 - 19968: jis0212<<14 | 0x29<<7 | 0x0E, - 29113 - 19968: jis0208<<14 | 0x3E<<7 | 0x53, - 29114 - 19968: jis0212<<14 | 0x29<<7 | 0x0F, - 29118 - 19968: jis0208<<14 | 0x3E<<7 | 0x54, - 29119 - 19968: jis0212<<14 | 0x29<<7 | 0x10, - 29120 - 19968: jis0212<<14 | 0x29<<7 | 0x11, - 29121 - 19968: jis0208<<14 | 0x59<<7 | 0x5B, - 29123 - 19968: jis0208<<14 | 0x26<<7 | 0x12, - 29124 - 19968: jis0212<<14 | 0x29<<7 | 0x13, - 29128 - 19968: jis0208<<14 | 0x24<<7 | 0x54, - 29129 - 19968: jis0208<<14 | 0x3E<<7 | 0x56, - 29131 - 19968: jis0212<<14 | 0x29<<7 | 0x14, - 29132 - 19968: jis0212<<14 | 0x29<<7 | 0x15, - 29134 - 19968: jis0208<<14 | 0x3E<<7 | 0x58, - 29136 - 19968: jis0208<<14 | 0x2D<<7 | 0x34, - 29138 - 19968: jis0208<<14 | 0x3E<<7 | 0x55, - 29139 - 19968: jis0212<<14 | 0x29<<7 | 0x16, - 29140 - 19968: jis0208<<14 | 0x3E<<7 | 0x57, - 29141 - 19968: jis0208<<14 | 0x10<<7 | 0x4C, - 29142 - 19968: jis0212<<14 | 0x29<<7 | 0x17, - 29143 - 19968: jis0208<<14 | 0x3E<<7 | 0x52, - 29145 - 19968: jis0212<<14 | 0x29<<7 | 0x18, - 29146 - 19968: jis0212<<14 | 0x29<<7 | 0x19, - 29148 - 19968: jis0212<<14 | 0x29<<7 | 0x1A, - 29151 - 19968: jis0208<<14 | 0x32<<7 | 0x3A, - 29152 - 19968: jis0208<<14 | 0x3E<<7 | 0x59, - 29157 - 19968: jis0208<<14 | 0x20<<7 | 0x46, - 29158 - 19968: jis0208<<14 | 0x1A<<7 | 0x17, - 29159 - 19968: jis0208<<14 | 0x3E<<7 | 0x5B, - 29164 - 19968: jis0208<<14 | 0x3E<<7 | 0x5A, - 29165 - 19968: jis0208<<14 | 0x1E<<7 | 0x03, - 29166 - 19968: jis0208<<14 | 0x31<<7 | 0x38, - 29173 - 19968: jis0208<<14 | 0x3E<<7 | 0x5C, - 29176 - 19968: jis0212<<14 | 0x29<<7 | 0x1B, - 29177 - 19968: jis0208<<14 | 0x3F<<7 | 0x00, - 29179 - 19968: jis0208<<14 | 0x3E<<7 | 0x4D, - 29180 - 19968: jis0208<<14 | 0x3E<<7 | 0x5D, - 29182 - 19968: jis0208<<14 | 0x59<<7 | 0x5C, - 29183 - 19968: jis0208<<14 | 0x3F<<7 | 0x01, - 29184 - 19968: jis0212<<14 | 0x29<<7 | 0x1D, - 29190 - 19968: jis0208<<14 | 0x26<<7 | 0x59, - 29191 - 19968: jis0212<<14 | 0x29<<7 | 0x1E, - 29192 - 19968: jis0212<<14 | 0x29<<7 | 0x1F, - 29193 - 19968: jis0212<<14 | 0x29<<7 | 0x20, - 29197 - 19968: jis0208<<14 | 0x3F<<7 | 0x02, - 29200 - 19968: jis0208<<14 | 0x3F<<7 | 0x03, - 29203 - 19968: jis0212<<14 | 0x29<<7 | 0x21, - 29207 - 19968: jis0212<<14 | 0x29<<7 | 0x22, - 29210 - 19968: jis0212<<14 | 0x29<<7 | 0x23, - 29211 - 19968: jis0208<<14 | 0x3F<<7 | 0x04, - 29213 - 19968: jis0212<<14 | 0x29<<7 | 0x24, - 29215 - 19968: jis0212<<14 | 0x29<<7 | 0x25, - 29220 - 19968: jis0212<<14 | 0x29<<7 | 0x26, - 29224 - 19968: jis0208<<14 | 0x3F<<7 | 0x05, - 29226 - 19968: jis0208<<14 | 0x23<<7 | 0x3D, - 29227 - 19968: jis0212<<14 | 0x29<<7 | 0x27, - 29228 - 19968: jis0208<<14 | 0x3F<<7 | 0x07, - 29229 - 19968: jis0208<<14 | 0x3F<<7 | 0x06, - 29231 - 19968: jis0212<<14 | 0x29<<7 | 0x28, - 29232 - 19968: jis0208<<14 | 0x3F<<7 | 0x08, - 29234 - 19968: jis0208<<14 | 0x3F<<7 | 0x09, - 29236 - 19968: jis0212<<14 | 0x29<<7 | 0x29, - 29237 - 19968: jis0208<<14 | 0x1B<<7 | 0x3E, - 29238 - 19968: jis0208<<14 | 0x28<<7 | 0x42, - 29240 - 19968: jis0212<<14 | 0x29<<7 | 0x2A, - 29241 - 19968: jis0212<<14 | 0x29<<7 | 0x2B, - 29242 - 19968: jis0208<<14 | 0x2B<<7 | 0x4B, - 29243 - 19968: jis0208<<14 | 0x3F<<7 | 0x0A, - 29244 - 19968: jis0208<<14 | 0x3F<<7 | 0x0B, - 29245 - 19968: jis0208<<14 | 0x20<<7 | 0x35, - 29246 - 19968: jis0208<<14 | 0x1B<<7 | 0x03, - 29247 - 19968: jis0208<<14 | 0x3F<<7 | 0x0C, - 29248 - 19968: jis0208<<14 | 0x3F<<7 | 0x0D, - 29249 - 19968: jis0212<<14 | 0x29<<7 | 0x2C, - 29250 - 19968: jis0212<<14 | 0x29<<7 | 0x2D, - 29251 - 19968: jis0212<<14 | 0x29<<7 | 0x2E, - 29253 - 19968: jis0212<<14 | 0x29<<7 | 0x2F, - 29254 - 19968: jis0208<<14 | 0x3F<<7 | 0x0E, - 29255 - 19968: jis0208<<14 | 0x29<<7 | 0x31, - 29256 - 19968: jis0208<<14 | 0x27<<7 | 0x26, - 29259 - 19968: jis0208<<14 | 0x3F<<7 | 0x0F, - 29260 - 19968: jis0208<<14 | 0x26<<7 | 0x36, - 29262 - 19968: jis0212<<14 | 0x29<<7 | 0x30, - 29263 - 19968: jis0212<<14 | 0x29<<7 | 0x31, - 29264 - 19968: jis0212<<14 | 0x29<<7 | 0x32, - 29266 - 19968: jis0208<<14 | 0x23<<7 | 0x0C, - 29267 - 19968: jis0212<<14 | 0x29<<7 | 0x33, - 29269 - 19968: jis0212<<14 | 0x29<<7 | 0x34, - 29270 - 19968: jis0212<<14 | 0x29<<7 | 0x35, - 29272 - 19968: jis0208<<14 | 0x3F<<7 | 0x10, - 29273 - 19968: jis0208<<14 | 0x11<<7 | 0x46, - 29274 - 19968: jis0212<<14 | 0x29<<7 | 0x36, - 29275 - 19968: jis0208<<14 | 0x14<<7 | 0x4C, - 29276 - 19968: jis0212<<14 | 0x29<<7 | 0x37, - 29277 - 19968: jis0208<<14 | 0x2B<<7 | 0x25, - 29278 - 19968: jis0212<<14 | 0x29<<7 | 0x38, - 29279 - 19968: jis0208<<14 | 0x2B<<7 | 0x15, - 29280 - 19968: jis0212<<14 | 0x29<<7 | 0x39, - 29281 - 19968: jis0208<<14 | 0x11<<7 | 0x13, - 29282 - 19968: jis0208<<14 | 0x2E<<7 | 0x13, - 29283 - 19968: jis0212<<14 | 0x29<<7 | 0x3A, - 29287 - 19968: jis0208<<14 | 0x2A<<7 | 0x31, - 29288 - 19968: jis0212<<14 | 0x29<<7 | 0x3B, - 29289 - 19968: jis0208<<14 | 0x29<<7 | 0x09, - 29291 - 19968: jis0212<<14 | 0x29<<7 | 0x3C, - 29294 - 19968: jis0212<<14 | 0x29<<7 | 0x3D, - 29295 - 19968: jis0212<<14 | 0x29<<7 | 0x3E, - 29297 - 19968: jis0212<<14 | 0x29<<7 | 0x3F, - 29298 - 19968: jis0208<<14 | 0x1F<<7 | 0x16, - 29300 - 19968: jis0208<<14 | 0x3F<<7 | 0x11, - 29303 - 19968: jis0212<<14 | 0x29<<7 | 0x40, - 29304 - 19968: jis0212<<14 | 0x29<<7 | 0x41, - 29305 - 19968: jis0208<<14 | 0x25<<7 | 0x22, - 29307 - 19968: jis0212<<14 | 0x29<<7 | 0x42, - 29308 - 19968: jis0212<<14 | 0x29<<7 | 0x43, - 29309 - 19968: jis0208<<14 | 0x17<<7 | 0x02, - 29310 - 19968: jis0208<<14 | 0x3F<<7 | 0x12, - 29311 - 19968: jis0212<<14 | 0x29<<7 | 0x44, - 29312 - 19968: jis0208<<14 | 0x19<<7 | 0x33, - 29313 - 19968: jis0208<<14 | 0x3F<<7 | 0x14, - 29314 - 19968: jis0208<<14 | 0x3F<<7 | 0x13, - 29316 - 19968: jis0212<<14 | 0x29<<7 | 0x45, - 29319 - 19968: jis0208<<14 | 0x3F<<7 | 0x15, - 29321 - 19968: jis0212<<14 | 0x29<<7 | 0x46, - 29325 - 19968: jis0212<<14 | 0x29<<7 | 0x47, - 29326 - 19968: jis0212<<14 | 0x29<<7 | 0x48, - 29330 - 19968: jis0208<<14 | 0x3F<<7 | 0x16, - 29331 - 19968: jis0212<<14 | 0x29<<7 | 0x49, - 29334 - 19968: jis0208<<14 | 0x3F<<7 | 0x17, - 29339 - 19968: jis0212<<14 | 0x29<<7 | 0x4A, - 29344 - 19968: jis0208<<14 | 0x14<<7 | 0x1D, - 29346 - 19968: jis0208<<14 | 0x3F<<7 | 0x18, - 29351 - 19968: jis0208<<14 | 0x3F<<7 | 0x19, - 29352 - 19968: jis0212<<14 | 0x29<<7 | 0x4B, - 29356 - 19968: jis0208<<14 | 0x17<<7 | 0x03, - 29357 - 19968: jis0212<<14 | 0x29<<7 | 0x4C, - 29358 - 19968: jis0212<<14 | 0x29<<7 | 0x4D, - 29359 - 19968: jis0208<<14 | 0x27<<7 | 0x27, - 29361 - 19968: jis0208<<14 | 0x59<<7 | 0x5D, - 29362 - 19968: jis0208<<14 | 0x3F<<7 | 0x1B, - 29364 - 19968: jis0212<<14 | 0x29<<7 | 0x4F, - 29366 - 19968: jis0208<<14 | 0x1D<<7 | 0x54, - 29369 - 19968: jis0208<<14 | 0x3F<<7 | 0x1A, - 29374 - 19968: jis0208<<14 | 0x5A<<7 | 0x00, - 29377 - 19968: jis0212<<14 | 0x29<<7 | 0x51, - 29378 - 19968: jis0208<<14 | 0x15<<7 | 0x17, - 29379 - 19968: jis0208<<14 | 0x3F<<7 | 0x1C, - 29380 - 19968: jis0208<<14 | 0x3F<<7 | 0x1E, - 29382 - 19968: jis0208<<14 | 0x3F<<7 | 0x1D, - 29383 - 19968: jis0212<<14 | 0x29<<7 | 0x52, - 29385 - 19968: jis0212<<14 | 0x29<<7 | 0x53, - 29388 - 19968: jis0212<<14 | 0x29<<7 | 0x54, - 29390 - 19968: jis0208<<14 | 0x3F<<7 | 0x1F, - 29392 - 19968: jis0208<<14 | 0x17<<7 | 0x30, - 29394 - 19968: jis0208<<14 | 0x3F<<7 | 0x20, - 29397 - 19968: jis0212<<14 | 0x29<<7 | 0x55, - 29398 - 19968: jis0212<<14 | 0x29<<7 | 0x56, - 29399 - 19968: jis0208<<14 | 0x15<<7 | 0x48, - 29400 - 19968: jis0212<<14 | 0x29<<7 | 0x57, - 29401 - 19968: jis0208<<14 | 0x20<<7 | 0x1F, - 29403 - 19968: jis0208<<14 | 0x18<<7 | 0x5C, - 29407 - 19968: jis0212<<14 | 0x29<<7 | 0x58, - 29408 - 19968: jis0208<<14 | 0x3F<<7 | 0x22, - 29409 - 19968: jis0208<<14 | 0x3F<<7 | 0x23, - 29410 - 19968: jis0208<<14 | 0x3F<<7 | 0x21, - 29413 - 19968: jis0212<<14 | 0x29<<7 | 0x59, - 29417 - 19968: jis0208<<14 | 0x1B<<7 | 0x4C, - 29420 - 19968: jis0208<<14 | 0x25<<7 | 0x27, - 29421 - 19968: jis0208<<14 | 0x15<<7 | 0x18, - 29427 - 19968: jis0212<<14 | 0x29<<7 | 0x5A, - 29428 - 19968: jis0212<<14 | 0x29<<7 | 0x5B, - 29431 - 19968: jis0208<<14 | 0x3F<<7 | 0x25, - 29432 - 19968: jis0208<<14 | 0x22<<7 | 0x0B, - 29433 - 19968: jis0208<<14 | 0x3F<<7 | 0x24, - 29434 - 19968: jis0212<<14 | 0x29<<7 | 0x5C, - 29435 - 19968: jis0212<<14 | 0x29<<7 | 0x5D, - 29436 - 19968: jis0208<<14 | 0x2E<<7 | 0x14, - 29437 - 19968: jis0208<<14 | 0x26<<7 | 0x41, - 29438 - 19968: jis0212<<14 | 0x2A<<7 | 0x00, - 29442 - 19968: jis0212<<14 | 0x2A<<7 | 0x01, - 29444 - 19968: jis0212<<14 | 0x2A<<7 | 0x02, - 29445 - 19968: jis0212<<14 | 0x2A<<7 | 0x03, - 29447 - 19968: jis0212<<14 | 0x2A<<7 | 0x04, - 29450 - 19968: jis0208<<14 | 0x3F<<7 | 0x28, - 29451 - 19968: jis0212<<14 | 0x2A<<7 | 0x05, - 29453 - 19968: jis0212<<14 | 0x2A<<7 | 0x06, - 29458 - 19968: jis0212<<14 | 0x2A<<7 | 0x07, - 29459 - 19968: jis0212<<14 | 0x2A<<7 | 0x08, - 29462 - 19968: jis0208<<14 | 0x3F<<7 | 0x2A, - 29463 - 19968: jis0208<<14 | 0x3F<<7 | 0x27, - 29464 - 19968: jis0212<<14 | 0x2A<<7 | 0x09, - 29465 - 19968: jis0212<<14 | 0x2A<<7 | 0x0A, - 29467 - 19968: jis0208<<14 | 0x2B<<7 | 0x33, - 29468 - 19968: jis0208<<14 | 0x3F<<7 | 0x29, - 29469 - 19968: jis0208<<14 | 0x3F<<7 | 0x2B, - 29470 - 19968: jis0212<<14 | 0x2A<<7 | 0x0B, - 29471 - 19968: jis0208<<14 | 0x2D<<7 | 0x23, - 29474 - 19968: jis0212<<14 | 0x2A<<7 | 0x0C, - 29476 - 19968: jis0208<<14 | 0x5A<<7 | 0x01, - 29477 - 19968: jis0208<<14 | 0x3F<<7 | 0x2F, - 29479 - 19968: jis0212<<14 | 0x2A<<7 | 0x0E, - 29480 - 19968: jis0212<<14 | 0x2A<<7 | 0x0F, - 29481 - 19968: jis0208<<14 | 0x3F<<7 | 0x2E, - 29482 - 19968: jis0208<<14 | 0x22<<7 | 0x55, - 29483 - 19968: jis0208<<14 | 0x26<<7 | 0x0C, - 29484 - 19968: jis0212<<14 | 0x2A<<7 | 0x10, - 29486 - 19968: jis0208<<14 | 0x17<<7 | 0x04, - 29487 - 19968: jis0208<<14 | 0x3F<<7 | 0x2D, - 29489 - 19968: jis0212<<14 | 0x2A<<7 | 0x11, - 29490 - 19968: jis0212<<14 | 0x2A<<7 | 0x12, - 29492 - 19968: jis0208<<14 | 0x3F<<7 | 0x2C, - 29493 - 19968: jis0212<<14 | 0x2A<<7 | 0x13, - 29494 - 19968: jis0208<<14 | 0x2C<<7 | 0x10, - 29495 - 19968: jis0208<<14 | 0x2C<<7 | 0x11, - 29498 - 19968: jis0212<<14 | 0x2A<<7 | 0x14, - 29499 - 19968: jis0212<<14 | 0x2A<<7 | 0x15, - 29501 - 19968: jis0212<<14 | 0x2A<<7 | 0x16, - 29502 - 19968: jis0208<<14 | 0x3F<<7 | 0x30, - 29503 - 19968: jis0208<<14 | 0x10<<7 | 0x4D, - 29507 - 19968: jis0212<<14 | 0x2A<<7 | 0x17, - 29508 - 19968: jis0208<<14 | 0x18<<7 | 0x55, - 29509 - 19968: jis0208<<14 | 0x1A<<7 | 0x41, - 29517 - 19968: jis0212<<14 | 0x2A<<7 | 0x18, - 29518 - 19968: jis0208<<14 | 0x3F<<7 | 0x31, - 29519 - 19968: jis0208<<14 | 0x3F<<7 | 0x32, - 29520 - 19968: jis0212<<14 | 0x2A<<7 | 0x19, - 29522 - 19968: jis0212<<14 | 0x2A<<7 | 0x1A, - 29526 - 19968: jis0212<<14 | 0x2A<<7 | 0x1B, - 29527 - 19968: jis0208<<14 | 0x3F<<7 | 0x34, - 29528 - 19968: jis0212<<14 | 0x2A<<7 | 0x1C, - 29533 - 19968: jis0212<<14 | 0x2A<<7 | 0x1D, - 29534 - 19968: jis0212<<14 | 0x2A<<7 | 0x1E, - 29535 - 19968: jis0212<<14 | 0x2A<<7 | 0x1F, - 29536 - 19968: jis0212<<14 | 0x2A<<7 | 0x20, - 29539 - 19968: jis0208<<14 | 0x1C<<7 | 0x22, - 29542 - 19968: jis0212<<14 | 0x2A<<7 | 0x21, - 29543 - 19968: jis0212<<14 | 0x2A<<7 | 0x22, - 29544 - 19968: jis0208<<14 | 0x3F<<7 | 0x36, - 29545 - 19968: jis0212<<14 | 0x2A<<7 | 0x23, - 29546 - 19968: jis0208<<14 | 0x3F<<7 | 0x35, - 29547 - 19968: jis0212<<14 | 0x2A<<7 | 0x24, - 29548 - 19968: jis0212<<14 | 0x2A<<7 | 0x25, - 29550 - 19968: jis0212<<14 | 0x2A<<7 | 0x26, - 29551 - 19968: jis0212<<14 | 0x2A<<7 | 0x27, - 29552 - 19968: jis0208<<14 | 0x3F<<7 | 0x37, - 29553 - 19968: jis0212<<14 | 0x2A<<7 | 0x28, - 29554 - 19968: jis0208<<14 | 0x12<<7 | 0x2C, - 29557 - 19968: jis0208<<14 | 0x3F<<7 | 0x39, - 29559 - 19968: jis0208<<14 | 0x5A<<7 | 0x03, - 29560 - 19968: jis0208<<14 | 0x3F<<7 | 0x38, - 29561 - 19968: jis0212<<14 | 0x2A<<7 | 0x2A, - 29562 - 19968: jis0208<<14 | 0x3F<<7 | 0x3B, - 29563 - 19968: jis0208<<14 | 0x3F<<7 | 0x3A, - 29564 - 19968: jis0212<<14 | 0x2A<<7 | 0x2B, - 29568 - 19968: jis0212<<14 | 0x2A<<7 | 0x2C, - 29569 - 19968: jis0212<<14 | 0x2A<<7 | 0x2D, - 29571 - 19968: jis0212<<14 | 0x2A<<7 | 0x2E, - 29572 - 19968: jis0208<<14 | 0x17<<7 | 0x1B, - 29573 - 19968: jis0212<<14 | 0x2A<<7 | 0x2F, - 29574 - 19968: jis0212<<14 | 0x2A<<7 | 0x30, - 29575 - 19968: jis0208<<14 | 0x2D<<7 | 0x07, - 29577 - 19968: jis0208<<14 | 0x15<<7 | 0x2B, - 29579 - 19968: jis0208<<14 | 0x11<<7 | 0x05, - 29582 - 19968: jis0212<<14 | 0x2A<<7 | 0x31, - 29584 - 19968: jis0212<<14 | 0x2A<<7 | 0x32, - 29587 - 19968: jis0212<<14 | 0x2A<<7 | 0x33, - 29589 - 19968: jis0212<<14 | 0x2A<<7 | 0x34, - 29590 - 19968: jis0208<<14 | 0x15<<7 | 0x49, - 29591 - 19968: jis0212<<14 | 0x2A<<7 | 0x35, - 29592 - 19968: jis0212<<14 | 0x2A<<7 | 0x36, - 29596 - 19968: jis0212<<14 | 0x2A<<7 | 0x37, - 29598 - 19968: jis0212<<14 | 0x2A<<7 | 0x38, - 29599 - 19968: jis0212<<14 | 0x2A<<7 | 0x39, - 29600 - 19968: jis0212<<14 | 0x2A<<7 | 0x3A, - 29602 - 19968: jis0212<<14 | 0x2A<<7 | 0x3B, - 29605 - 19968: jis0212<<14 | 0x2A<<7 | 0x3C, - 29606 - 19968: jis0212<<14 | 0x2A<<7 | 0x3D, - 29609 - 19968: jis0208<<14 | 0x13<<7 | 0x40, - 29610 - 19968: jis0212<<14 | 0x2A<<7 | 0x3E, - 29611 - 19968: jis0212<<14 | 0x2A<<7 | 0x3F, - 29613 - 19968: jis0212<<14 | 0x2A<<7 | 0x40, - 29618 - 19968: jis0208<<14 | 0x2D<<7 | 0x47, - 29619 - 19968: jis0208<<14 | 0x3F<<7 | 0x3D, - 29621 - 19968: jis0212<<14 | 0x2A<<7 | 0x41, - 29623 - 19968: jis0212<<14 | 0x2A<<7 | 0x42, - 29625 - 19968: jis0212<<14 | 0x2A<<7 | 0x43, - 29627 - 19968: jis0208<<14 | 0x3F<<7 | 0x3F, - 29628 - 19968: jis0212<<14 | 0x2A<<7 | 0x44, - 29629 - 19968: jis0208<<14 | 0x5A<<7 | 0x04, - 29631 - 19968: jis0212<<14 | 0x2A<<7 | 0x46, - 29632 - 19968: jis0208<<14 | 0x3F<<7 | 0x40, - 29634 - 19968: jis0208<<14 | 0x11<<7 | 0x30, - 29637 - 19968: jis0212<<14 | 0x2A<<7 | 0x47, - 29638 - 19968: jis0212<<14 | 0x2A<<7 | 0x48, - 29640 - 19968: jis0208<<14 | 0x3F<<7 | 0x3C, - 29641 - 19968: jis0208<<14 | 0x5A<<7 | 0x05, - 29642 - 19968: jis0208<<14 | 0x1A<<7 | 0x18, - 29643 - 19968: jis0212<<14 | 0x2A<<7 | 0x4A, - 29644 - 19968: jis0212<<14 | 0x2A<<7 | 0x4B, - 29645 - 19968: jis0208<<14 | 0x23<<7 | 0x20, - 29646 - 19968: jis0208<<14 | 0x3F<<7 | 0x3E, - 29647 - 19968: jis0212<<14 | 0x2A<<7 | 0x4C, - 29650 - 19968: jis0208<<14 | 0x5A<<7 | 0x08, - 29651 - 19968: jis0212<<14 | 0x2A<<7 | 0x4E, - 29654 - 19968: jis0208<<14 | 0x5A<<7 | 0x06, - 29657 - 19968: jis0212<<14 | 0x2A<<7 | 0x50, - 29661 - 19968: jis0212<<14 | 0x2A<<7 | 0x51, - 29662 - 19968: jis0208<<14 | 0x3F<<7 | 0x43, - 29664 - 19968: jis0208<<14 | 0x1B<<7 | 0x4D, - 29665 - 19968: jis0212<<14 | 0x2A<<7 | 0x52, - 29667 - 19968: jis0208<<14 | 0x5A<<7 | 0x07, - 29669 - 19968: jis0208<<14 | 0x3F<<7 | 0x41, - 29670 - 19968: jis0212<<14 | 0x2A<<7 | 0x54, - 29671 - 19968: jis0212<<14 | 0x2A<<7 | 0x55, - 29673 - 19968: jis0212<<14 | 0x2A<<7 | 0x56, - 29674 - 19968: jis0208<<14 | 0x16<<7 | 0x1D, - 29677 - 19968: jis0208<<14 | 0x27<<7 | 0x28, - 29678 - 19968: jis0208<<14 | 0x3F<<7 | 0x42, - 29681 - 19968: jis0208<<14 | 0x3F<<7 | 0x5D, - 29684 - 19968: jis0212<<14 | 0x2A<<7 | 0x57, - 29685 - 19968: jis0208<<14 | 0x5A<<7 | 0x0A, - 29687 - 19968: jis0212<<14 | 0x2A<<7 | 0x59, - 29688 - 19968: jis0208<<14 | 0x3F<<7 | 0x48, - 29689 - 19968: jis0212<<14 | 0x2A<<7 | 0x5A, - 29690 - 19968: jis0212<<14 | 0x2A<<7 | 0x5B, - 29691 - 19968: jis0212<<14 | 0x2A<<7 | 0x5C, - 29693 - 19968: jis0212<<14 | 0x2A<<7 | 0x5D, - 29694 - 19968: jis0208<<14 | 0x17<<7 | 0x1C, - 29695 - 19968: jis0212<<14 | 0x2B<<7 | 0x00, - 29696 - 19968: jis0212<<14 | 0x2B<<7 | 0x01, - 29697 - 19968: jis0212<<14 | 0x2B<<7 | 0x02, - 29699 - 19968: jis0208<<14 | 0x14<<7 | 0x44, - 29700 - 19968: jis0212<<14 | 0x2B<<7 | 0x03, - 29701 - 19968: jis0208<<14 | 0x3F<<7 | 0x45, - 29702 - 19968: jis0208<<14 | 0x2C<<7 | 0x5C, - 29703 - 19968: jis0208<<14 | 0x5A<<7 | 0x09, - 29705 - 19968: jis0208<<14 | 0x2D<<7 | 0x0F, - 29706 - 19968: jis0212<<14 | 0x2B<<7 | 0x05, - 29713 - 19968: jis0212<<14 | 0x2B<<7 | 0x06, - 29722 - 19968: jis0212<<14 | 0x2B<<7 | 0x07, - 29723 - 19968: jis0212<<14 | 0x2B<<7 | 0x08, - 29730 - 19968: jis0208<<14 | 0x21<<7 | 0x55, - 29732 - 19968: jis0212<<14 | 0x2B<<7 | 0x09, - 29733 - 19968: jis0208<<14 | 0x3F<<7 | 0x47, - 29734 - 19968: jis0208<<14 | 0x5A<<7 | 0x0B, - 29736 - 19968: jis0212<<14 | 0x2B<<7 | 0x0B, - 29737 - 19968: jis0208<<14 | 0x5A<<7 | 0x0D, - 29738 - 19968: jis0208<<14 | 0x5A<<7 | 0x0C, - 29739 - 19968: jis0212<<14 | 0x2B<<7 | 0x0E, - 29740 - 19968: jis0212<<14 | 0x2B<<7 | 0x0F, - 29741 - 19968: jis0212<<14 | 0x2B<<7 | 0x10, - 29742 - 19968: jis0208<<14 | 0x5A<<7 | 0x0E, - 29743 - 19968: jis0212<<14 | 0x2B<<7 | 0x12, - 29744 - 19968: jis0212<<14 | 0x2B<<7 | 0x13, - 29745 - 19968: jis0212<<14 | 0x2B<<7 | 0x14, - 29746 - 19968: jis0208<<14 | 0x3F<<7 | 0x49, - 29747 - 19968: jis0208<<14 | 0x2D<<7 | 0x35, - 29748 - 19968: jis0208<<14 | 0x15<<7 | 0x36, - 29749 - 19968: jis0208<<14 | 0x27<<7 | 0x5B, - 29750 - 19968: jis0208<<14 | 0x26<<7 | 0x29, - 29753 - 19968: jis0212<<14 | 0x2B<<7 | 0x15, - 29754 - 19968: jis0208<<14 | 0x3F<<7 | 0x4A, - 29759 - 19968: jis0208<<14 | 0x3F<<7 | 0x4C, - 29760 - 19968: jis0212<<14 | 0x2B<<7 | 0x16, - 29761 - 19968: jis0208<<14 | 0x3F<<7 | 0x4F, - 29763 - 19968: jis0212<<14 | 0x2B<<7 | 0x17, - 29764 - 19968: jis0212<<14 | 0x2B<<7 | 0x18, - 29766 - 19968: jis0212<<14 | 0x2B<<7 | 0x19, - 29767 - 19968: jis0212<<14 | 0x2B<<7 | 0x1A, - 29771 - 19968: jis0212<<14 | 0x2B<<7 | 0x1B, - 29773 - 19968: jis0212<<14 | 0x2B<<7 | 0x1C, - 29777 - 19968: jis0212<<14 | 0x2B<<7 | 0x1D, - 29778 - 19968: jis0212<<14 | 0x2B<<7 | 0x1E, - 29781 - 19968: jis0208<<14 | 0x3F<<7 | 0x4B, - 29783 - 19968: jis0212<<14 | 0x2B<<7 | 0x1F, - 29785 - 19968: jis0208<<14 | 0x3F<<7 | 0x4E, - 29786 - 19968: jis0208<<14 | 0x17<<7 | 0x49, - 29787 - 19968: jis0208<<14 | 0x10<<7 | 0x2C, - 29788 - 19968: jis0208<<14 | 0x3F<<7 | 0x50, - 29789 - 19968: jis0212<<14 | 0x2B<<7 | 0x20, - 29790 - 19968: jis0208<<14 | 0x1E<<7 | 0x4F, - 29791 - 19968: jis0208<<14 | 0x3F<<7 | 0x4D, - 29792 - 19968: jis0208<<14 | 0x2D<<7 | 0x3B, - 29794 - 19968: jis0208<<14 | 0x5A<<7 | 0x0F, - 29795 - 19968: jis0208<<14 | 0x3F<<7 | 0x53, - 29796 - 19968: jis0208<<14 | 0x53<<7 | 0x03, - 29798 - 19968: jis0212<<14 | 0x2B<<7 | 0x22, - 29799 - 19968: jis0212<<14 | 0x2B<<7 | 0x23, - 29800 - 19968: jis0212<<14 | 0x2B<<7 | 0x24, - 29801 - 19968: jis0208<<14 | 0x3F<<7 | 0x51, - 29802 - 19968: jis0208<<14 | 0x3F<<7 | 0x54, - 29803 - 19968: jis0212<<14 | 0x2B<<7 | 0x25, - 29805 - 19968: jis0212<<14 | 0x2B<<7 | 0x26, - 29806 - 19968: jis0212<<14 | 0x2B<<7 | 0x27, - 29807 - 19968: jis0208<<14 | 0x3F<<7 | 0x46, - 29808 - 19968: jis0208<<14 | 0x3F<<7 | 0x52, - 29809 - 19968: jis0212<<14 | 0x2B<<7 | 0x28, - 29810 - 19968: jis0212<<14 | 0x2B<<7 | 0x29, - 29811 - 19968: jis0208<<14 | 0x19<<7 | 0x1B, - 29814 - 19968: jis0208<<14 | 0x3F<<7 | 0x55, - 29822 - 19968: jis0208<<14 | 0x3F<<7 | 0x56, - 29824 - 19968: jis0212<<14 | 0x2B<<7 | 0x2A, - 29825 - 19968: jis0212<<14 | 0x2B<<7 | 0x2B, - 29827 - 19968: jis0208<<14 | 0x2C<<7 | 0x5D, - 29829 - 19968: jis0212<<14 | 0x2B<<7 | 0x2C, - 29830 - 19968: jis0212<<14 | 0x2B<<7 | 0x2D, - 29831 - 19968: jis0212<<14 | 0x2B<<7 | 0x2E, - 29833 - 19968: jis0208<<14 | 0x5A<<7 | 0x10, - 29835 - 19968: jis0208<<14 | 0x3F<<7 | 0x57, - 29839 - 19968: jis0212<<14 | 0x2B<<7 | 0x30, - 29840 - 19968: jis0212<<14 | 0x2B<<7 | 0x31, - 29841 - 19968: jis0212<<14 | 0x2B<<7 | 0x32, - 29842 - 19968: jis0212<<14 | 0x2B<<7 | 0x33, - 29848 - 19968: jis0212<<14 | 0x2B<<7 | 0x34, - 29849 - 19968: jis0212<<14 | 0x2B<<7 | 0x35, - 29850 - 19968: jis0212<<14 | 0x2B<<7 | 0x36, - 29852 - 19968: jis0212<<14 | 0x2B<<7 | 0x37, - 29854 - 19968: jis0208<<14 | 0x3F<<7 | 0x58, - 29855 - 19968: jis0208<<14 | 0x5A<<7 | 0x11, - 29856 - 19968: jis0212<<14 | 0x2B<<7 | 0x39, - 29857 - 19968: jis0212<<14 | 0x2B<<7 | 0x3A, - 29858 - 19968: jis0208<<14 | 0x3F<<7 | 0x44, - 29859 - 19968: jis0212<<14 | 0x2B<<7 | 0x3B, - 29862 - 19968: jis0212<<14 | 0x2B<<7 | 0x3C, - 29863 - 19968: jis0208<<14 | 0x3F<<7 | 0x59, - 29864 - 19968: jis0212<<14 | 0x2B<<7 | 0x3D, - 29865 - 19968: jis0212<<14 | 0x2B<<7 | 0x3E, - 29866 - 19968: jis0212<<14 | 0x2B<<7 | 0x3F, - 29867 - 19968: jis0212<<14 | 0x2B<<7 | 0x40, - 29870 - 19968: jis0212<<14 | 0x2B<<7 | 0x41, - 29871 - 19968: jis0212<<14 | 0x2B<<7 | 0x42, - 29872 - 19968: jis0208<<14 | 0x13<<7 | 0x23, - 29873 - 19968: jis0212<<14 | 0x2B<<7 | 0x43, - 29874 - 19968: jis0212<<14 | 0x2B<<7 | 0x44, - 29877 - 19968: jis0212<<14 | 0x2B<<7 | 0x45, - 29881 - 19968: jis0212<<14 | 0x2B<<7 | 0x46, - 29883 - 19968: jis0212<<14 | 0x2B<<7 | 0x47, - 29885 - 19968: jis0208<<14 | 0x1B<<7 | 0x04, - 29887 - 19968: jis0212<<14 | 0x2B<<7 | 0x48, - 29896 - 19968: jis0212<<14 | 0x2B<<7 | 0x49, - 29897 - 19968: jis0212<<14 | 0x2B<<7 | 0x4A, - 29898 - 19968: jis0208<<14 | 0x3F<<7 | 0x5A, - 29900 - 19968: jis0212<<14 | 0x2B<<7 | 0x4B, - 29903 - 19968: jis0208<<14 | 0x3F<<7 | 0x5B, - 29904 - 19968: jis0212<<14 | 0x2B<<7 | 0x4C, - 29907 - 19968: jis0212<<14 | 0x2B<<7 | 0x4D, - 29908 - 19968: jis0208<<14 | 0x3F<<7 | 0x5C, - 29912 - 19968: jis0212<<14 | 0x2B<<7 | 0x4E, - 29914 - 19968: jis0212<<14 | 0x2B<<7 | 0x4F, - 29915 - 19968: jis0212<<14 | 0x2B<<7 | 0x50, - 29916 - 19968: jis0208<<14 | 0x10<<7 | 0x1A, - 29918 - 19968: jis0212<<14 | 0x2B<<7 | 0x51, - 29919 - 19968: jis0212<<14 | 0x2B<<7 | 0x52, - 29920 - 19968: jis0208<<14 | 0x40<<7 | 0x00, - 29922 - 19968: jis0208<<14 | 0x28<<7 | 0x1A, - 29923 - 19968: jis0208<<14 | 0x40<<7 | 0x01, - 29924 - 19968: jis0212<<14 | 0x2B<<7 | 0x53, - 29926 - 19968: jis0208<<14 | 0x13<<7 | 0x03, - 29927 - 19968: jis0208<<14 | 0x40<<7 | 0x02, - 29928 - 19968: jis0212<<14 | 0x2B<<7 | 0x54, - 29929 - 19968: jis0208<<14 | 0x40<<7 | 0x03, - 29930 - 19968: jis0212<<14 | 0x2B<<7 | 0x55, - 29931 - 19968: jis0212<<14 | 0x2B<<7 | 0x56, - 29934 - 19968: jis0208<<14 | 0x40<<7 | 0x04, - 29935 - 19968: jis0212<<14 | 0x2B<<7 | 0x57, - 29936 - 19968: jis0208<<14 | 0x40<<7 | 0x06, - 29937 - 19968: jis0208<<14 | 0x40<<7 | 0x07, - 29938 - 19968: jis0208<<14 | 0x40<<7 | 0x05, - 29940 - 19968: jis0212<<14 | 0x2B<<7 | 0x58, - 29942 - 19968: jis0208<<14 | 0x28<<7 | 0x32, - 29943 - 19968: jis0208<<14 | 0x40<<7 | 0x09, - 29944 - 19968: jis0208<<14 | 0x40<<7 | 0x08, - 29946 - 19968: jis0212<<14 | 0x2B<<7 | 0x59, - 29947 - 19968: jis0212<<14 | 0x2B<<7 | 0x5A, - 29948 - 19968: jis0212<<14 | 0x2B<<7 | 0x5B, - 29951 - 19968: jis0212<<14 | 0x2B<<7 | 0x5C, - 29953 - 19968: jis0208<<14 | 0x5A<<7 | 0x12, - 29955 - 19968: jis0208<<14 | 0x40<<7 | 0x0B, - 29956 - 19968: jis0208<<14 | 0x40<<7 | 0x0A, - 29957 - 19968: jis0208<<14 | 0x40<<7 | 0x0C, - 29958 - 19968: jis0212<<14 | 0x2B<<7 | 0x5D, - 29964 - 19968: jis0208<<14 | 0x40<<7 | 0x0D, - 29965 - 19968: jis0208<<14 | 0x40<<7 | 0x0F, - 29966 - 19968: jis0208<<14 | 0x40<<7 | 0x0E, - 29969 - 19968: jis0208<<14 | 0x18<<7 | 0x58, - 29970 - 19968: jis0212<<14 | 0x2C<<7 | 0x00, - 29971 - 19968: jis0208<<14 | 0x40<<7 | 0x11, - 29973 - 19968: jis0208<<14 | 0x40<<7 | 0x10, - 29974 - 19968: jis0212<<14 | 0x2C<<7 | 0x01, - 29975 - 19968: jis0212<<14 | 0x2C<<7 | 0x02, - 29976 - 19968: jis0208<<14 | 0x13<<7 | 0x24, - 29978 - 19968: jis0208<<14 | 0x1E<<7 | 0x32, - 29980 - 19968: jis0208<<14 | 0x24<<7 | 0x1B, - 29982 - 19968: jis0208<<14 | 0x40<<7 | 0x12, - 29983 - 19968: jis0208<<14 | 0x1F<<7 | 0x17, - 29984 - 19968: jis0212<<14 | 0x2C<<7 | 0x03, - 29985 - 19968: jis0212<<14 | 0x2C<<7 | 0x04, - 29987 - 19968: jis0208<<14 | 0x1A<<7 | 0x19, - 29988 - 19968: jis0212<<14 | 0x2C<<7 | 0x05, - 29989 - 19968: jis0208<<14 | 0x10<<7 | 0x58, - 29990 - 19968: jis0208<<14 | 0x40<<7 | 0x13, - 29991 - 19968: jis0212<<14 | 0x2C<<7 | 0x06, - 29992 - 19968: jis0208<<14 | 0x2C<<7 | 0x30, - 29993 - 19968: jis0212<<14 | 0x2C<<7 | 0x07, - 29994 - 19968: jis0212<<14 | 0x2C<<7 | 0x08, - 29995 - 19968: jis0208<<14 | 0x29<<7 | 0x42, - 29996 - 19968: jis0208<<14 | 0x40<<7 | 0x14, - 29999 - 19968: jis0208<<14 | 0x58<<7 | 0x4B, - 30000 - 19968: jis0208<<14 | 0x24<<7 | 0x23, - 30001 - 19968: jis0208<<14 | 0x2C<<7 | 0x12, - 30002 - 19968: jis0208<<14 | 0x18<<7 | 0x22, - 30003 - 19968: jis0208<<14 | 0x1E<<7 | 0x1C, - 30006 - 19968: jis0212<<14 | 0x2C<<7 | 0x0A, - 30007 - 19968: jis0208<<14 | 0x22<<7 | 0x2A, - 30008 - 19968: jis0208<<14 | 0x31<<7 | 0x13, - 30009 - 19968: jis0212<<14 | 0x2C<<7 | 0x0B, - 30010 - 19968: jis0208<<14 | 0x23<<7 | 0x0D, - 30011 - 19968: jis0208<<14 | 0x11<<7 | 0x47, - 30012 - 19968: jis0208<<14 | 0x40<<7 | 0x15, - 30013 - 19968: jis0212<<14 | 0x2C<<7 | 0x0C, - 30014 - 19968: jis0212<<14 | 0x2C<<7 | 0x0D, - 30015 - 19968: jis0212<<14 | 0x2C<<7 | 0x0E, - 30016 - 19968: jis0212<<14 | 0x2C<<7 | 0x0F, - 30019 - 19968: jis0212<<14 | 0x2C<<7 | 0x10, - 30020 - 19968: jis0208<<14 | 0x40<<7 | 0x16, - 30022 - 19968: jis0208<<14 | 0x40<<7 | 0x1B, - 30023 - 19968: jis0212<<14 | 0x2C<<7 | 0x11, - 30024 - 19968: jis0212<<14 | 0x2C<<7 | 0x12, - 30025 - 19968: jis0208<<14 | 0x40<<7 | 0x19, - 30026 - 19968: jis0208<<14 | 0x40<<7 | 0x18, - 30027 - 19968: jis0208<<14 | 0x39<<7 | 0x21, - 30028 - 19968: jis0208<<14 | 0x12<<7 | 0x05, - 30029 - 19968: jis0208<<14 | 0x40<<7 | 0x17, - 30030 - 19968: jis0212<<14 | 0x2C<<7 | 0x13, - 30031 - 19968: jis0208<<14 | 0x0F<<7 | 0x39, - 30032 - 19968: jis0212<<14 | 0x2C<<7 | 0x14, - 30033 - 19968: jis0208<<14 | 0x27<<7 | 0x09, - 30034 - 19968: jis0212<<14 | 0x2C<<7 | 0x15, - 30036 - 19968: jis0208<<14 | 0x27<<7 | 0x29, - 30039 - 19968: jis0212<<14 | 0x2C<<7 | 0x16, - 30041 - 19968: jis0208<<14 | 0x2D<<7 | 0x10, - 30042 - 19968: jis0208<<14 | 0x40<<7 | 0x1C, - 30043 - 19968: jis0208<<14 | 0x40<<7 | 0x1A, - 30044 - 19968: jis0208<<14 | 0x22<<7 | 0x3B, - 30045 - 19968: jis0208<<14 | 0x1F<<7 | 0x05, - 30046 - 19968: jis0212<<14 | 0x2C<<7 | 0x17, - 30047 - 19968: jis0212<<14 | 0x2C<<7 | 0x18, - 30048 - 19968: jis0208<<14 | 0x27<<7 | 0x0A, - 30049 - 19968: jis0212<<14 | 0x2C<<7 | 0x19, - 30050 - 19968: jis0208<<14 | 0x28<<7 | 0x0C, - 30052 - 19968: jis0208<<14 | 0x40<<7 | 0x1E, - 30053 - 19968: jis0208<<14 | 0x2D<<7 | 0x0B, - 30054 - 19968: jis0208<<14 | 0x16<<7 | 0x2C, - 30055 - 19968: jis0208<<14 | 0x40<<7 | 0x1F, - 30057 - 19968: jis0208<<14 | 0x40<<7 | 0x1D, - 30058 - 19968: jis0208<<14 | 0x27<<7 | 0x35, - 30059 - 19968: jis0208<<14 | 0x40<<7 | 0x20, - 30061 - 19968: jis0208<<14 | 0x40<<7 | 0x21, - 30063 - 19968: jis0208<<14 | 0x5A<<7 | 0x13, - 30064 - 19968: jis0208<<14 | 0x0F<<7 | 0x3A, - 30065 - 19968: jis0212<<14 | 0x2C<<7 | 0x1B, - 30067 - 19968: jis0208<<14 | 0x1D<<7 | 0x55, - 30068 - 19968: jis0208<<14 | 0x40<<7 | 0x26, - 30070 - 19968: jis0208<<14 | 0x40<<7 | 0x23, - 30071 - 19968: jis0208<<14 | 0x25<<7 | 0x4C, - 30072 - 19968: jis0208<<14 | 0x40<<7 | 0x22, - 30073 - 19968: jis0212<<14 | 0x2C<<7 | 0x1C, - 30074 - 19968: jis0212<<14 | 0x2C<<7 | 0x1D, - 30075 - 19968: jis0212<<14 | 0x2C<<7 | 0x1E, - 30076 - 19968: jis0212<<14 | 0x2C<<7 | 0x1F, - 30077 - 19968: jis0212<<14 | 0x2C<<7 | 0x20, - 30078 - 19968: jis0212<<14 | 0x2C<<7 | 0x21, - 30079 - 19968: jis0208<<14 | 0x14<<7 | 0x05, - 30081 - 19968: jis0212<<14 | 0x2C<<7 | 0x22, - 30082 - 19968: jis0208<<14 | 0x40<<7 | 0x29, - 30085 - 19968: jis0212<<14 | 0x2C<<7 | 0x23, - 30086 - 19968: jis0208<<14 | 0x40<<7 | 0x24, - 30087 - 19968: jis0208<<14 | 0x40<<7 | 0x25, - 30089 - 19968: jis0208<<14 | 0x40<<7 | 0x28, - 30090 - 19968: jis0208<<14 | 0x40<<7 | 0x27, - 30091 - 19968: jis0208<<14 | 0x28<<7 | 0x04, - 30094 - 19968: jis0208<<14 | 0x20<<7 | 0x21, - 30095 - 19968: jis0208<<14 | 0x20<<7 | 0x20, - 30096 - 19968: jis0212<<14 | 0x2C<<7 | 0x24, - 30097 - 19968: jis0208<<14 | 0x14<<7 | 0x1E, - 30098 - 19968: jis0212<<14 | 0x2C<<7 | 0x25, - 30099 - 19968: jis0212<<14 | 0x2C<<7 | 0x26, - 30100 - 19968: jis0208<<14 | 0x40<<7 | 0x2A, - 30101 - 19968: jis0212<<14 | 0x2C<<7 | 0x27, - 30105 - 19968: jis0212<<14 | 0x2C<<7 | 0x28, - 30106 - 19968: jis0208<<14 | 0x40<<7 | 0x2B, - 30108 - 19968: jis0212<<14 | 0x2C<<7 | 0x29, - 30109 - 19968: jis0208<<14 | 0x40<<7 | 0x2C, - 30114 - 19968: jis0212<<14 | 0x2C<<7 | 0x2A, - 30115 - 19968: jis0208<<14 | 0x40<<7 | 0x2E, - 30116 - 19968: jis0212<<14 | 0x2C<<7 | 0x2B, - 30117 - 19968: jis0208<<14 | 0x40<<7 | 0x2D, - 30123 - 19968: jis0208<<14 | 0x10<<7 | 0x35, - 30129 - 19968: jis0208<<14 | 0x40<<7 | 0x36, - 30130 - 19968: jis0208<<14 | 0x27<<7 | 0x47, - 30131 - 19968: jis0208<<14 | 0x40<<7 | 0x30, - 30132 - 19968: jis0212<<14 | 0x2C<<7 | 0x2C, - 30133 - 19968: jis0208<<14 | 0x40<<7 | 0x32, - 30136 - 19968: jis0208<<14 | 0x40<<7 | 0x34, - 30137 - 19968: jis0208<<14 | 0x1E<<7 | 0x1D, - 30138 - 19968: jis0212<<14 | 0x2C<<7 | 0x2D, - 30140 - 19968: jis0208<<14 | 0x40<<7 | 0x35, - 30141 - 19968: jis0208<<14 | 0x40<<7 | 0x33, - 30142 - 19968: jis0208<<14 | 0x1B<<7 | 0x1F, - 30143 - 19968: jis0212<<14 | 0x2C<<7 | 0x2E, - 30144 - 19968: jis0212<<14 | 0x2C<<7 | 0x2F, - 30145 - 19968: jis0212<<14 | 0x2C<<7 | 0x30, - 30146 - 19968: jis0208<<14 | 0x40<<7 | 0x2F, - 30147 - 19968: jis0208<<14 | 0x40<<7 | 0x31, - 30148 - 19968: jis0212<<14 | 0x2C<<7 | 0x31, - 30149 - 19968: jis0208<<14 | 0x28<<7 | 0x21, - 30150 - 19968: jis0212<<14 | 0x2C<<7 | 0x32, - 30151 - 19968: jis0208<<14 | 0x1D<<7 | 0x28, - 30154 - 19968: jis0208<<14 | 0x40<<7 | 0x38, - 30156 - 19968: jis0212<<14 | 0x2C<<7 | 0x33, - 30157 - 19968: jis0208<<14 | 0x40<<7 | 0x37, - 30158 - 19968: jis0212<<14 | 0x2C<<7 | 0x34, - 30159 - 19968: jis0212<<14 | 0x2C<<7 | 0x35, - 30162 - 19968: jis0208<<14 | 0x40<<7 | 0x39, - 30164 - 19968: jis0208<<14 | 0x1B<<7 | 0x05, - 30165 - 19968: jis0208<<14 | 0x19<<7 | 0x0E, - 30167 - 19968: jis0212<<14 | 0x2C<<7 | 0x36, - 30168 - 19968: jis0208<<14 | 0x24<<7 | 0x56, - 30169 - 19968: jis0208<<14 | 0x40<<7 | 0x3A, - 30171 - 19968: jis0208<<14 | 0x23<<7 | 0x2A, - 30172 - 19968: jis0212<<14 | 0x2C<<7 | 0x37, - 30174 - 19968: jis0208<<14 | 0x40<<7 | 0x3C, - 30175 - 19968: jis0212<<14 | 0x2C<<7 | 0x38, - 30176 - 19968: jis0212<<14 | 0x2C<<7 | 0x39, - 30177 - 19968: jis0212<<14 | 0x2C<<7 | 0x3A, - 30178 - 19968: jis0208<<14 | 0x2D<<7 | 0x00, - 30179 - 19968: jis0208<<14 | 0x40<<7 | 0x3B, - 30180 - 19968: jis0212<<14 | 0x2C<<7 | 0x3B, - 30183 - 19968: jis0212<<14 | 0x2C<<7 | 0x3C, - 30185 - 19968: jis0208<<14 | 0x20<<7 | 0x48, - 30188 - 19968: jis0212<<14 | 0x2C<<7 | 0x3D, - 30190 - 19968: jis0212<<14 | 0x2C<<7 | 0x3E, - 30191 - 19968: jis0212<<14 | 0x2C<<7 | 0x3F, - 30192 - 19968: jis0208<<14 | 0x40<<7 | 0x41, - 30193 - 19968: jis0212<<14 | 0x2C<<7 | 0x40, - 30194 - 19968: jis0208<<14 | 0x40<<7 | 0x43, - 30195 - 19968: jis0208<<14 | 0x40<<7 | 0x44, - 30196 - 19968: jis0208<<14 | 0x22<<7 | 0x33, - 30201 - 19968: jis0212<<14 | 0x2C<<7 | 0x41, - 30202 - 19968: jis0208<<14 | 0x40<<7 | 0x42, - 30204 - 19968: jis0208<<14 | 0x40<<7 | 0x3F, - 30206 - 19968: jis0208<<14 | 0x40<<7 | 0x3D, - 30207 - 19968: jis0208<<14 | 0x40<<7 | 0x3E, - 30208 - 19968: jis0212<<14 | 0x2C<<7 | 0x42, - 30209 - 19968: jis0208<<14 | 0x40<<7 | 0x40, - 30210 - 19968: jis0212<<14 | 0x2C<<7 | 0x43, - 30211 - 19968: jis0212<<14 | 0x2C<<7 | 0x44, - 30212 - 19968: jis0212<<14 | 0x2C<<7 | 0x45, - 30215 - 19968: jis0212<<14 | 0x2C<<7 | 0x46, - 30216 - 19968: jis0212<<14 | 0x2C<<7 | 0x47, - 30217 - 19968: jis0208<<14 | 0x40<<7 | 0x47, - 30218 - 19968: jis0212<<14 | 0x2C<<7 | 0x48, - 30219 - 19968: jis0208<<14 | 0x40<<7 | 0x45, - 30220 - 19968: jis0212<<14 | 0x2C<<7 | 0x49, - 30221 - 19968: jis0208<<14 | 0x40<<7 | 0x46, - 30223 - 19968: jis0212<<14 | 0x2C<<7 | 0x4A, - 30226 - 19968: jis0212<<14 | 0x2C<<7 | 0x4B, - 30227 - 19968: jis0212<<14 | 0x2C<<7 | 0x4C, - 30229 - 19968: jis0212<<14 | 0x2C<<7 | 0x4D, - 30230 - 19968: jis0212<<14 | 0x2C<<7 | 0x4E, - 30233 - 19968: jis0212<<14 | 0x2C<<7 | 0x4F, - 30235 - 19968: jis0212<<14 | 0x2C<<7 | 0x50, - 30236 - 19968: jis0212<<14 | 0x2C<<7 | 0x51, - 30237 - 19968: jis0212<<14 | 0x2C<<7 | 0x52, - 30238 - 19968: jis0212<<14 | 0x2C<<7 | 0x53, - 30239 - 19968: jis0208<<14 | 0x40<<7 | 0x48, - 30240 - 19968: jis0208<<14 | 0x40<<7 | 0x4A, - 30241 - 19968: jis0208<<14 | 0x40<<7 | 0x4B, - 30242 - 19968: jis0208<<14 | 0x40<<7 | 0x4C, - 30243 - 19968: jis0212<<14 | 0x2C<<7 | 0x54, - 30244 - 19968: jis0208<<14 | 0x40<<7 | 0x4D, - 30245 - 19968: jis0212<<14 | 0x2C<<7 | 0x55, - 30246 - 19968: jis0212<<14 | 0x2C<<7 | 0x56, - 30247 - 19968: jis0208<<14 | 0x40<<7 | 0x49, - 30249 - 19968: jis0212<<14 | 0x2C<<7 | 0x57, - 30253 - 19968: jis0212<<14 | 0x2C<<7 | 0x58, - 30256 - 19968: jis0208<<14 | 0x40<<7 | 0x4F, - 30258 - 19968: jis0212<<14 | 0x2C<<7 | 0x59, - 30259 - 19968: jis0212<<14 | 0x2C<<7 | 0x5A, - 30260 - 19968: jis0208<<14 | 0x40<<7 | 0x4E, - 30261 - 19968: jis0212<<14 | 0x2C<<7 | 0x5B, - 30264 - 19968: jis0212<<14 | 0x2C<<7 | 0x5C, - 30265 - 19968: jis0212<<14 | 0x2C<<7 | 0x5D, - 30266 - 19968: jis0212<<14 | 0x2D<<7 | 0x00, - 30267 - 19968: jis0208<<14 | 0x40<<7 | 0x50, - 30268 - 19968: jis0212<<14 | 0x2D<<7 | 0x01, - 30272 - 19968: jis0212<<14 | 0x2D<<7 | 0x03, - 30273 - 19968: jis0212<<14 | 0x2D<<7 | 0x04, - 30274 - 19968: jis0208<<14 | 0x2D<<7 | 0x24, - 30275 - 19968: jis0212<<14 | 0x2D<<7 | 0x05, - 30276 - 19968: jis0212<<14 | 0x2D<<7 | 0x06, - 30277 - 19968: jis0212<<14 | 0x2D<<7 | 0x07, - 30278 - 19968: jis0208<<14 | 0x40<<7 | 0x53, - 30279 - 19968: jis0208<<14 | 0x40<<7 | 0x51, - 30280 - 19968: jis0208<<14 | 0x40<<7 | 0x52, - 30281 - 19968: jis0212<<14 | 0x2D<<7 | 0x08, - 30282 - 19968: jis0212<<14 | 0x2D<<7 | 0x02, - 30283 - 19968: jis0212<<14 | 0x2D<<7 | 0x09, - 30284 - 19968: jis0208<<14 | 0x13<<7 | 0x41, - 30290 - 19968: jis0208<<14 | 0x2B<<7 | 0x5D, - 30293 - 19968: jis0212<<14 | 0x2D<<7 | 0x0A, - 30294 - 19968: jis0208<<14 | 0x29<<7 | 0x29, - 30296 - 19968: jis0208<<14 | 0x40<<7 | 0x55, - 30297 - 19968: jis0212<<14 | 0x2D<<7 | 0x0B, - 30300 - 19968: jis0208<<14 | 0x40<<7 | 0x54, - 30303 - 19968: jis0212<<14 | 0x2D<<7 | 0x0C, - 30305 - 19968: jis0208<<14 | 0x40<<7 | 0x56, - 30306 - 19968: jis0208<<14 | 0x40<<7 | 0x57, - 30308 - 19968: jis0212<<14 | 0x2D<<7 | 0x0D, - 30309 - 19968: jis0212<<14 | 0x2D<<7 | 0x0E, - 30311 - 19968: jis0208<<14 | 0x40<<7 | 0x5B, - 30312 - 19968: jis0208<<14 | 0x40<<7 | 0x58, - 30313 - 19968: jis0208<<14 | 0x40<<7 | 0x59, - 30314 - 19968: jis0208<<14 | 0x40<<7 | 0x5A, - 30316 - 19968: jis0208<<14 | 0x40<<7 | 0x5C, - 30317 - 19968: jis0212<<14 | 0x2D<<7 | 0x0F, - 30318 - 19968: jis0212<<14 | 0x2D<<7 | 0x10, - 30319 - 19968: jis0212<<14 | 0x2D<<7 | 0x11, - 30320 - 19968: jis0208<<14 | 0x40<<7 | 0x5D, - 30321 - 19968: jis0212<<14 | 0x2D<<7 | 0x12, - 30322 - 19968: jis0208<<14 | 0x41<<7 | 0x00, - 30324 - 19968: jis0212<<14 | 0x2D<<7 | 0x13, - 30326 - 19968: jis0208<<14 | 0x41<<7 | 0x01, - 30328 - 19968: jis0208<<14 | 0x41<<7 | 0x02, - 30330 - 19968: jis0208<<14 | 0x27<<7 | 0x0E, - 30331 - 19968: jis0208<<14 | 0x24<<7 | 0x2F, - 30332 - 19968: jis0208<<14 | 0x41<<7 | 0x03, - 30333 - 19968: jis0208<<14 | 0x26<<7 | 0x51, - 30334 - 19968: jis0208<<14 | 0x28<<7 | 0x13, - 30336 - 19968: jis0208<<14 | 0x41<<7 | 0x04, - 30337 - 19968: jis0212<<14 | 0x2D<<7 | 0x14, - 30338 - 19968: jis0208<<14 | 0x5A<<7 | 0x14, - 30339 - 19968: jis0208<<14 | 0x41<<7 | 0x05, - 30340 - 19968: jis0208<<14 | 0x24<<7 | 0x09, - 30341 - 19968: jis0212<<14 | 0x2D<<7 | 0x15, - 30342 - 19968: jis0208<<14 | 0x12<<7 | 0x06, - 30343 - 19968: jis0208<<14 | 0x18<<7 | 0x23, - 30344 - 19968: jis0208<<14 | 0x41<<7 | 0x06, - 30347 - 19968: jis0208<<14 | 0x41<<7 | 0x07, - 30348 - 19968: jis0212<<14 | 0x2D<<7 | 0x16, - 30349 - 19968: jis0212<<14 | 0x2D<<7 | 0x17, - 30350 - 19968: jis0208<<14 | 0x41<<7 | 0x08, - 30352 - 19968: jis0208<<14 | 0x1A<<7 | 0x08, - 30355 - 19968: jis0208<<14 | 0x41<<7 | 0x0A, - 30357 - 19968: jis0212<<14 | 0x2D<<7 | 0x18, - 30358 - 19968: jis0208<<14 | 0x41<<7 | 0x09, - 30361 - 19968: jis0208<<14 | 0x41<<7 | 0x0B, - 30362 - 19968: jis0208<<14 | 0x41<<7 | 0x0C, - 30363 - 19968: jis0208<<14 | 0x5A<<7 | 0x17, - 30364 - 19968: jis0208<<14 | 0x5A<<7 | 0x15, - 30365 - 19968: jis0212<<14 | 0x2D<<7 | 0x1B, - 30366 - 19968: jis0208<<14 | 0x5A<<7 | 0x16, - 30367 - 19968: jis0212<<14 | 0x2D<<7 | 0x1C, - 30368 - 19968: jis0212<<14 | 0x2D<<7 | 0x1D, - 30370 - 19968: jis0212<<14 | 0x2D<<7 | 0x1E, - 30371 - 19968: jis0212<<14 | 0x2D<<7 | 0x1F, - 30372 - 19968: jis0212<<14 | 0x2D<<7 | 0x20, - 30373 - 19968: jis0212<<14 | 0x2D<<7 | 0x21, - 30374 - 19968: jis0208<<14 | 0x5A<<7 | 0x18, - 30375 - 19968: jis0212<<14 | 0x2D<<7 | 0x23, - 30376 - 19968: jis0212<<14 | 0x2D<<7 | 0x24, - 30378 - 19968: jis0212<<14 | 0x2D<<7 | 0x25, - 30381 - 19968: jis0212<<14 | 0x2D<<7 | 0x26, - 30382 - 19968: jis0208<<14 | 0x27<<7 | 0x48, - 30384 - 19968: jis0208<<14 | 0x41<<7 | 0x0D, - 30388 - 19968: jis0208<<14 | 0x41<<7 | 0x0E, - 30391 - 19968: jis0208<<14 | 0x52<<7 | 0x48, - 30392 - 19968: jis0208<<14 | 0x41<<7 | 0x0F, - 30393 - 19968: jis0208<<14 | 0x41<<7 | 0x10, - 30394 - 19968: jis0208<<14 | 0x41<<7 | 0x11, - 30397 - 19968: jis0212<<14 | 0x2D<<7 | 0x27, - 30399 - 19968: jis0208<<14 | 0x1A<<7 | 0x0D, - 30401 - 19968: jis0212<<14 | 0x2D<<7 | 0x28, - 30402 - 19968: jis0208<<14 | 0x41<<7 | 0x12, - 30403 - 19968: jis0208<<14 | 0x26<<7 | 0x35, - 30405 - 19968: jis0212<<14 | 0x2D<<7 | 0x29, - 30406 - 19968: jis0208<<14 | 0x2A<<7 | 0x3E, - 30408 - 19968: jis0208<<14 | 0x10<<7 | 0x2D, - 30409 - 19968: jis0212<<14 | 0x2D<<7 | 0x2A, - 30410 - 19968: jis0208<<14 | 0x10<<7 | 0x36, - 30411 - 19968: jis0212<<14 | 0x2D<<7 | 0x2B, - 30412 - 19968: jis0212<<14 | 0x2D<<7 | 0x2C, - 30413 - 19968: jis0208<<14 | 0x41<<7 | 0x13, - 30414 - 19968: jis0212<<14 | 0x2D<<7 | 0x2D, - 30418 - 19968: jis0208<<14 | 0x41<<7 | 0x15, - 30420 - 19968: jis0212<<14 | 0x2D<<7 | 0x2E, - 30422 - 19968: jis0208<<14 | 0x41<<7 | 0x14, - 30423 - 19968: jis0208<<14 | 0x24<<7 | 0x4F, - 30425 - 19968: jis0212<<14 | 0x2D<<7 | 0x2F, - 30427 - 19968: jis0208<<14 | 0x1F<<7 | 0x18, - 30428 - 19968: jis0208<<14 | 0x3C<<7 | 0x18, - 30430 - 19968: jis0208<<14 | 0x41<<7 | 0x16, - 30431 - 19968: jis0208<<14 | 0x2B<<7 | 0x20, - 30432 - 19968: jis0212<<14 | 0x2D<<7 | 0x30, - 30433 - 19968: jis0208<<14 | 0x41<<7 | 0x17, - 30435 - 19968: jis0208<<14 | 0x13<<7 | 0x25, - 30436 - 19968: jis0208<<14 | 0x27<<7 | 0x36, - 30437 - 19968: jis0208<<14 | 0x41<<7 | 0x18, - 30438 - 19968: jis0212<<14 | 0x2D<<7 | 0x31, - 30439 - 19968: jis0208<<14 | 0x41<<7 | 0x19, - 30440 - 19968: jis0212<<14 | 0x2D<<7 | 0x32, - 30442 - 19968: jis0208<<14 | 0x41<<7 | 0x1A, - 30444 - 19968: jis0212<<14 | 0x2D<<7 | 0x33, - 30446 - 19968: jis0208<<14 | 0x2B<<7 | 0x3B, - 30448 - 19968: jis0212<<14 | 0x2D<<7 | 0x34, - 30449 - 19968: jis0212<<14 | 0x2D<<7 | 0x35, - 30450 - 19968: jis0208<<14 | 0x2B<<7 | 0x34, - 30452 - 19968: jis0208<<14 | 0x23<<7 | 0x1D, - 30454 - 19968: jis0212<<14 | 0x2D<<7 | 0x36, - 30456 - 19968: jis0208<<14 | 0x20<<7 | 0x49, - 30457 - 19968: jis0212<<14 | 0x2D<<7 | 0x37, - 30459 - 19968: jis0208<<14 | 0x41<<7 | 0x1C, - 30460 - 19968: jis0212<<14 | 0x2D<<7 | 0x38, - 30462 - 19968: jis0208<<14 | 0x1C<<7 | 0x41, - 30464 - 19968: jis0212<<14 | 0x2D<<7 | 0x39, - 30465 - 19968: jis0208<<14 | 0x1D<<7 | 0x29, - 30468 - 19968: jis0208<<14 | 0x41<<7 | 0x1F, - 30470 - 19968: jis0212<<14 | 0x2D<<7 | 0x3A, - 30471 - 19968: jis0208<<14 | 0x41<<7 | 0x1E, - 30472 - 19968: jis0208<<14 | 0x41<<7 | 0x1D, - 30473 - 19968: jis0208<<14 | 0x27<<7 | 0x5C, - 30474 - 19968: jis0212<<14 | 0x2D<<7 | 0x3B, - 30475 - 19968: jis0208<<14 | 0x13<<7 | 0x26, - 30476 - 19968: jis0208<<14 | 0x17<<7 | 0x08, - 30478 - 19968: jis0212<<14 | 0x2D<<7 | 0x3C, - 30482 - 19968: jis0212<<14 | 0x2D<<7 | 0x3D, - 30484 - 19968: jis0212<<14 | 0x2D<<7 | 0x3E, - 30485 - 19968: jis0212<<14 | 0x2D<<7 | 0x3F, - 30487 - 19968: jis0212<<14 | 0x2D<<7 | 0x40, - 30489 - 19968: jis0212<<14 | 0x2D<<7 | 0x41, - 30490 - 19968: jis0212<<14 | 0x2D<<7 | 0x42, - 30491 - 19968: jis0208<<14 | 0x41<<7 | 0x25, - 30492 - 19968: jis0212<<14 | 0x2D<<7 | 0x43, - 30494 - 19968: jis0208<<14 | 0x41<<7 | 0x22, - 30495 - 19968: jis0208<<14 | 0x1E<<7 | 0x1E, - 30496 - 19968: jis0208<<14 | 0x2B<<7 | 0x11, - 30498 - 19968: jis0212<<14 | 0x2D<<7 | 0x44, - 30500 - 19968: jis0208<<14 | 0x41<<7 | 0x21, - 30501 - 19968: jis0208<<14 | 0x41<<7 | 0x23, - 30502 - 19968: jis0208<<14 | 0x41<<7 | 0x24, - 30504 - 19968: jis0212<<14 | 0x2D<<7 | 0x45, - 30505 - 19968: jis0208<<14 | 0x41<<7 | 0x20, - 30509 - 19968: jis0212<<14 | 0x2D<<7 | 0x46, - 30510 - 19968: jis0212<<14 | 0x2D<<7 | 0x47, - 30511 - 19968: jis0212<<14 | 0x2D<<7 | 0x48, - 30516 - 19968: jis0212<<14 | 0x2D<<7 | 0x49, - 30517 - 19968: jis0212<<14 | 0x2D<<7 | 0x4A, - 30518 - 19968: jis0212<<14 | 0x2D<<7 | 0x4B, - 30519 - 19968: jis0208<<14 | 0x41<<7 | 0x26, - 30520 - 19968: jis0208<<14 | 0x41<<7 | 0x27, - 30521 - 19968: jis0212<<14 | 0x2D<<7 | 0x4C, - 30522 - 19968: jis0208<<14 | 0x23<<7 | 0x0E, - 30524 - 19968: jis0208<<14 | 0x13<<7 | 0x42, - 30525 - 19968: jis0212<<14 | 0x2D<<7 | 0x4D, - 30526 - 19968: jis0212<<14 | 0x2D<<7 | 0x4E, - 30528 - 19968: jis0208<<14 | 0x22<<7 | 0x44, - 30530 - 19968: jis0212<<14 | 0x2D<<7 | 0x4F, - 30533 - 19968: jis0212<<14 | 0x2D<<7 | 0x50, - 30534 - 19968: jis0208<<14 | 0x5A<<7 | 0x1A, - 30535 - 19968: jis0208<<14 | 0x41<<7 | 0x28, - 30538 - 19968: jis0212<<14 | 0x2D<<7 | 0x52, - 30541 - 19968: jis0212<<14 | 0x2D<<7 | 0x53, - 30542 - 19968: jis0212<<14 | 0x2D<<7 | 0x54, - 30543 - 19968: jis0212<<14 | 0x2D<<7 | 0x55, - 30546 - 19968: jis0212<<14 | 0x2D<<7 | 0x56, - 30550 - 19968: jis0212<<14 | 0x2D<<7 | 0x57, - 30551 - 19968: jis0212<<14 | 0x2D<<7 | 0x58, - 30554 - 19968: jis0208<<14 | 0x41<<7 | 0x29, - 30555 - 19968: jis0208<<14 | 0x41<<7 | 0x2C, - 30556 - 19968: jis0212<<14 | 0x2D<<7 | 0x59, - 30558 - 19968: jis0212<<14 | 0x2D<<7 | 0x5A, - 30559 - 19968: jis0212<<14 | 0x2D<<7 | 0x5B, - 30560 - 19968: jis0212<<14 | 0x2D<<7 | 0x5C, - 30561 - 19968: jis0208<<14 | 0x1E<<7 | 0x46, - 30562 - 19968: jis0212<<14 | 0x2D<<7 | 0x5D, - 30563 - 19968: jis0208<<14 | 0x25<<7 | 0x23, - 30564 - 19968: jis0212<<14 | 0x2E<<7 | 0x00, - 30565 - 19968: jis0208<<14 | 0x41<<7 | 0x2D, - 30566 - 19968: jis0208<<14 | 0x2A<<7 | 0x32, - 30567 - 19968: jis0212<<14 | 0x2E<<7 | 0x01, - 30568 - 19968: jis0208<<14 | 0x41<<7 | 0x2A, - 30570 - 19968: jis0212<<14 | 0x2E<<7 | 0x02, - 30571 - 19968: jis0208<<14 | 0x41<<7 | 0x2B, - 30572 - 19968: jis0212<<14 | 0x2E<<7 | 0x03, - 30576 - 19968: jis0212<<14 | 0x2E<<7 | 0x04, - 30578 - 19968: jis0212<<14 | 0x2E<<7 | 0x05, - 30579 - 19968: jis0212<<14 | 0x2E<<7 | 0x06, - 30580 - 19968: jis0212<<14 | 0x2E<<7 | 0x07, - 30585 - 19968: jis0208<<14 | 0x41<<7 | 0x30, - 30586 - 19968: jis0212<<14 | 0x2E<<7 | 0x08, - 30589 - 19968: jis0212<<14 | 0x2E<<7 | 0x09, - 30590 - 19968: jis0208<<14 | 0x41<<7 | 0x2F, - 30591 - 19968: jis0208<<14 | 0x41<<7 | 0x2E, - 30592 - 19968: jis0212<<14 | 0x2E<<7 | 0x0A, - 30596 - 19968: jis0212<<14 | 0x2E<<7 | 0x0B, - 30603 - 19968: jis0208<<14 | 0x41<<7 | 0x32, - 30604 - 19968: jis0212<<14 | 0x2E<<7 | 0x0C, - 30605 - 19968: jis0212<<14 | 0x2E<<7 | 0x0D, - 30606 - 19968: jis0208<<14 | 0x41<<7 | 0x31, - 30609 - 19968: jis0208<<14 | 0x41<<7 | 0x33, - 30612 - 19968: jis0212<<14 | 0x2E<<7 | 0x0E, - 30613 - 19968: jis0212<<14 | 0x2E<<7 | 0x0F, - 30614 - 19968: jis0212<<14 | 0x2E<<7 | 0x10, - 30618 - 19968: jis0212<<14 | 0x2E<<7 | 0x11, - 30622 - 19968: jis0208<<14 | 0x41<<7 | 0x35, - 30623 - 19968: jis0212<<14 | 0x2E<<7 | 0x12, - 30624 - 19968: jis0208<<14 | 0x41<<7 | 0x34, - 30626 - 19968: jis0212<<14 | 0x2E<<7 | 0x13, - 30629 - 19968: jis0208<<14 | 0x29<<7 | 0x2C, - 30631 - 19968: jis0212<<14 | 0x2E<<7 | 0x14, - 30634 - 19968: jis0212<<14 | 0x2E<<7 | 0x15, - 30636 - 19968: jis0208<<14 | 0x1C<<7 | 0x35, - 30637 - 19968: jis0208<<14 | 0x2D<<7 | 0x25, - 30638 - 19968: jis0212<<14 | 0x2E<<7 | 0x16, - 30639 - 19968: jis0212<<14 | 0x2E<<7 | 0x17, - 30640 - 19968: jis0208<<14 | 0x41<<7 | 0x36, - 30641 - 19968: jis0212<<14 | 0x2E<<7 | 0x18, - 30643 - 19968: jis0208<<14 | 0x25<<7 | 0x16, - 30645 - 19968: jis0212<<14 | 0x2E<<7 | 0x19, - 30646 - 19968: jis0208<<14 | 0x41<<7 | 0x37, - 30649 - 19968: jis0208<<14 | 0x41<<7 | 0x38, - 30651 - 19968: jis0208<<14 | 0x41<<7 | 0x3C, - 30652 - 19968: jis0208<<14 | 0x41<<7 | 0x3A, - 30653 - 19968: jis0208<<14 | 0x41<<7 | 0x3B, - 30654 - 19968: jis0212<<14 | 0x2E<<7 | 0x1A, - 30655 - 19968: jis0208<<14 | 0x41<<7 | 0x39, - 30659 - 19968: jis0212<<14 | 0x2E<<7 | 0x1B, - 30663 - 19968: jis0208<<14 | 0x41<<7 | 0x3D, - 30665 - 19968: jis0212<<14 | 0x2E<<7 | 0x1C, - 30669 - 19968: jis0208<<14 | 0x41<<7 | 0x3E, - 30673 - 19968: jis0212<<14 | 0x2E<<7 | 0x1D, - 30674 - 19968: jis0212<<14 | 0x2E<<7 | 0x1E, - 30677 - 19968: jis0212<<14 | 0x2E<<7 | 0x1F, - 30679 - 19968: jis0208<<14 | 0x41<<7 | 0x3F, - 30681 - 19968: jis0212<<14 | 0x2E<<7 | 0x20, - 30682 - 19968: jis0208<<14 | 0x41<<7 | 0x40, - 30683 - 19968: jis0208<<14 | 0x2B<<7 | 0x16, - 30684 - 19968: jis0208<<14 | 0x41<<7 | 0x41, - 30686 - 19968: jis0212<<14 | 0x2E<<7 | 0x21, - 30687 - 19968: jis0212<<14 | 0x2E<<7 | 0x22, - 30688 - 19968: jis0212<<14 | 0x2E<<7 | 0x23, - 30690 - 19968: jis0208<<14 | 0x2B<<7 | 0x4F, - 30691 - 19968: jis0208<<14 | 0x41<<7 | 0x42, - 30692 - 19968: jis0212<<14 | 0x2E<<7 | 0x24, - 30693 - 19968: jis0208<<14 | 0x22<<7 | 0x2D, - 30694 - 19968: jis0212<<14 | 0x2E<<7 | 0x25, - 30695 - 19968: jis0208<<14 | 0x26<<7 | 0x49, - 30697 - 19968: jis0208<<14 | 0x15<<7 | 0x4A, - 30698 - 19968: jis0212<<14 | 0x2E<<7 | 0x26, - 30700 - 19968: jis0212<<14 | 0x2E<<7 | 0x27, - 30701 - 19968: jis0208<<14 | 0x22<<7 | 0x1A, - 30702 - 19968: jis0208<<14 | 0x41<<7 | 0x43, - 30703 - 19968: jis0208<<14 | 0x15<<7 | 0x19, - 30704 - 19968: jis0212<<14 | 0x2E<<7 | 0x28, - 30705 - 19968: jis0212<<14 | 0x2E<<7 | 0x29, - 30707 - 19968: jis0208<<14 | 0x1F<<7 | 0x2F, - 30708 - 19968: jis0212<<14 | 0x2E<<7 | 0x2A, - 30712 - 19968: jis0212<<14 | 0x2E<<7 | 0x2B, - 30715 - 19968: jis0212<<14 | 0x2E<<7 | 0x2C, - 30716 - 19968: jis0208<<14 | 0x41<<7 | 0x44, - 30722 - 19968: jis0208<<14 | 0x19<<7 | 0x1C, - 30725 - 19968: jis0212<<14 | 0x2E<<7 | 0x2D, - 30726 - 19968: jis0212<<14 | 0x2E<<7 | 0x2E, - 30729 - 19968: jis0212<<14 | 0x2E<<7 | 0x2F, - 30732 - 19968: jis0208<<14 | 0x41<<7 | 0x45, - 30733 - 19968: jis0212<<14 | 0x2E<<7 | 0x30, - 30734 - 19968: jis0212<<14 | 0x2E<<7 | 0x31, - 30737 - 19968: jis0212<<14 | 0x2E<<7 | 0x32, - 30738 - 19968: jis0208<<14 | 0x41<<7 | 0x46, - 30740 - 19968: jis0208<<14 | 0x17<<7 | 0x05, - 30741 - 19968: jis0208<<14 | 0x19<<7 | 0x34, - 30749 - 19968: jis0212<<14 | 0x2E<<7 | 0x33, - 30752 - 19968: jis0208<<14 | 0x41<<7 | 0x48, - 30753 - 19968: jis0208<<14 | 0x5A<<7 | 0x1C, - 30754 - 19968: jis0212<<14 | 0x2E<<7 | 0x35, - 30755 - 19968: jis0212<<14 | 0x2E<<7 | 0x36, - 30757 - 19968: jis0208<<14 | 0x24<<7 | 0x35, - 30758 - 19968: jis0208<<14 | 0x19<<7 | 0x35, - 30759 - 19968: jis0208<<14 | 0x14<<7 | 0x2D, - 30765 - 19968: jis0212<<14 | 0x2E<<7 | 0x37, - 30766 - 19968: jis0212<<14 | 0x2E<<7 | 0x38, - 30768 - 19968: jis0212<<14 | 0x2E<<7 | 0x39, - 30770 - 19968: jis0208<<14 | 0x2A<<7 | 0x03, - 30772 - 19968: jis0208<<14 | 0x26<<7 | 0x2A, - 30773 - 19968: jis0212<<14 | 0x2E<<7 | 0x3A, - 30775 - 19968: jis0212<<14 | 0x2E<<7 | 0x3B, - 30778 - 19968: jis0208<<14 | 0x24<<7 | 0x36, - 30783 - 19968: jis0208<<14 | 0x18<<7 | 0x3B, - 30787 - 19968: jis0212<<14 | 0x2E<<7 | 0x3C, - 30788 - 19968: jis0212<<14 | 0x2E<<7 | 0x3D, - 30789 - 19968: jis0208<<14 | 0x41<<7 | 0x4A, - 30791 - 19968: jis0212<<14 | 0x2E<<7 | 0x3E, - 30792 - 19968: jis0212<<14 | 0x2E<<7 | 0x3F, - 30796 - 19968: jis0212<<14 | 0x2E<<7 | 0x40, - 30798 - 19968: jis0208<<14 | 0x5A<<7 | 0x1D, - 30802 - 19968: jis0212<<14 | 0x2E<<7 | 0x42, - 30812 - 19968: jis0212<<14 | 0x2E<<7 | 0x43, - 30813 - 19968: jis0208<<14 | 0x1D<<7 | 0x2A, - 30814 - 19968: jis0212<<14 | 0x2E<<7 | 0x44, - 30816 - 19968: jis0212<<14 | 0x2E<<7 | 0x45, - 30817 - 19968: jis0212<<14 | 0x2E<<7 | 0x46, - 30819 - 19968: jis0212<<14 | 0x2E<<7 | 0x47, - 30820 - 19968: jis0208<<14 | 0x5A<<7 | 0x1E, - 30824 - 19968: jis0212<<14 | 0x2E<<7 | 0x49, - 30826 - 19968: jis0212<<14 | 0x2E<<7 | 0x4A, - 30827 - 19968: jis0208<<14 | 0x2D<<7 | 0x11, - 30828 - 19968: jis0208<<14 | 0x18<<7 | 0x24, - 30830 - 19968: jis0212<<14 | 0x2E<<7 | 0x4B, - 30831 - 19968: jis0208<<14 | 0x17<<7 | 0x06, - 30834 - 19968: jis0208<<14 | 0x27<<7 | 0x02, - 30836 - 19968: jis0208<<14 | 0x41<<7 | 0x4C, - 30842 - 19968: jis0208<<14 | 0x5A<<7 | 0x1F, - 30844 - 19968: jis0208<<14 | 0x41<<7 | 0x4E, - 30846 - 19968: jis0212<<14 | 0x2E<<7 | 0x4D, - 30849 - 19968: jis0208<<14 | 0x17<<7 | 0x4A, - 30854 - 19968: jis0208<<14 | 0x41<<7 | 0x4D, - 30855 - 19968: jis0208<<14 | 0x23<<7 | 0x55, - 30858 - 19968: jis0212<<14 | 0x2E<<7 | 0x4E, - 30860 - 19968: jis0208<<14 | 0x41<<7 | 0x50, - 30861 - 19968: jis0208<<14 | 0x12<<7 | 0x16, - 30862 - 19968: jis0208<<14 | 0x41<<7 | 0x4B, - 30863 - 19968: jis0212<<14 | 0x2E<<7 | 0x4F, - 30865 - 19968: jis0208<<14 | 0x27<<7 | 0x49, - 30867 - 19968: jis0208<<14 | 0x10<<7 | 0x0F, - 30868 - 19968: jis0212<<14 | 0x2E<<7 | 0x50, - 30869 - 19968: jis0208<<14 | 0x19<<7 | 0x4B, - 30871 - 19968: jis0208<<14 | 0x2E<<7 | 0x31, - 30872 - 19968: jis0212<<14 | 0x2E<<7 | 0x51, - 30874 - 19968: jis0208<<14 | 0x41<<7 | 0x4F, - 30877 - 19968: jis0212<<14 | 0x2E<<7 | 0x53, - 30878 - 19968: jis0212<<14 | 0x2E<<7 | 0x54, - 30879 - 19968: jis0212<<14 | 0x2E<<7 | 0x55, - 30881 - 19968: jis0212<<14 | 0x2E<<7 | 0x52, - 30883 - 19968: jis0208<<14 | 0x41<<7 | 0x51, - 30884 - 19968: jis0212<<14 | 0x2E<<7 | 0x56, - 30887 - 19968: jis0208<<14 | 0x29<<7 | 0x2A, - 30888 - 19968: jis0212<<14 | 0x2E<<7 | 0x57, - 30889 - 19968: jis0208<<14 | 0x1F<<7 | 0x38, - 30890 - 19968: jis0208<<14 | 0x41<<7 | 0x53, - 30892 - 19968: jis0212<<14 | 0x2E<<7 | 0x58, - 30893 - 19968: jis0212<<14 | 0x2E<<7 | 0x59, - 30895 - 19968: jis0208<<14 | 0x41<<7 | 0x54, - 30896 - 19968: jis0212<<14 | 0x2E<<7 | 0x5A, - 30897 - 19968: jis0212<<14 | 0x2E<<7 | 0x5B, - 30898 - 19968: jis0212<<14 | 0x2E<<7 | 0x5C, - 30899 - 19968: jis0212<<14 | 0x2E<<7 | 0x5D, - 30901 - 19968: jis0208<<14 | 0x41<<7 | 0x52, - 30906 - 19968: jis0208<<14 | 0x12<<7 | 0x2D, - 30907 - 19968: jis0212<<14 | 0x2F<<7 | 0x00, - 30908 - 19968: jis0208<<14 | 0x41<<7 | 0x5A, - 30909 - 19968: jis0212<<14 | 0x2F<<7 | 0x01, - 30910 - 19968: jis0208<<14 | 0x41<<7 | 0x59, - 30911 - 19968: jis0212<<14 | 0x2F<<7 | 0x02, - 30913 - 19968: jis0208<<14 | 0x1B<<7 | 0x06, - 30917 - 19968: jis0208<<14 | 0x41<<7 | 0x5B, - 30918 - 19968: jis0208<<14 | 0x41<<7 | 0x56, - 30919 - 19968: jis0212<<14 | 0x2F<<7 | 0x03, - 30920 - 19968: jis0212<<14 | 0x2F<<7 | 0x04, - 30921 - 19968: jis0212<<14 | 0x2F<<7 | 0x05, - 30922 - 19968: jis0208<<14 | 0x41<<7 | 0x5C, - 30923 - 19968: jis0208<<14 | 0x41<<7 | 0x57, - 30924 - 19968: jis0212<<14 | 0x2F<<7 | 0x06, - 30926 - 19968: jis0212<<14 | 0x2F<<7 | 0x07, - 30928 - 19968: jis0208<<14 | 0x27<<7 | 0x37, - 30929 - 19968: jis0208<<14 | 0x41<<7 | 0x55, - 30930 - 19968: jis0212<<14 | 0x2F<<7 | 0x08, - 30931 - 19968: jis0212<<14 | 0x2F<<7 | 0x09, - 30932 - 19968: jis0208<<14 | 0x41<<7 | 0x58, - 30933 - 19968: jis0212<<14 | 0x2F<<7 | 0x0A, - 30934 - 19968: jis0212<<14 | 0x2F<<7 | 0x0B, - 30938 - 19968: jis0208<<14 | 0x42<<7 | 0x01, - 30939 - 19968: jis0212<<14 | 0x2F<<7 | 0x0D, - 30943 - 19968: jis0212<<14 | 0x2F<<7 | 0x0E, - 30944 - 19968: jis0212<<14 | 0x2F<<7 | 0x0F, - 30945 - 19968: jis0212<<14 | 0x2F<<7 | 0x10, - 30948 - 19968: jis0212<<14 | 0x2F<<7 | 0x0C, - 30950 - 19968: jis0212<<14 | 0x2F<<7 | 0x11, - 30951 - 19968: jis0208<<14 | 0x42<<7 | 0x00, - 30952 - 19968: jis0208<<14 | 0x2A<<7 | 0x40, - 30954 - 19968: jis0212<<14 | 0x2F<<7 | 0x12, - 30956 - 19968: jis0208<<14 | 0x41<<7 | 0x5D, - 30959 - 19968: jis0208<<14 | 0x0F<<7 | 0x4A, - 30962 - 19968: jis0212<<14 | 0x2F<<7 | 0x13, - 30963 - 19968: jis0212<<14 | 0x2F<<7 | 0x14, - 30964 - 19968: jis0208<<14 | 0x42<<7 | 0x03, - 30966 - 19968: jis0212<<14 | 0x2F<<7 | 0x16, - 30967 - 19968: jis0212<<14 | 0x2F<<7 | 0x17, - 30970 - 19968: jis0212<<14 | 0x2F<<7 | 0x18, - 30971 - 19968: jis0212<<14 | 0x2F<<7 | 0x19, - 30973 - 19968: jis0208<<14 | 0x42<<7 | 0x02, - 30975 - 19968: jis0212<<14 | 0x2F<<7 | 0x1A, - 30976 - 19968: jis0212<<14 | 0x2F<<7 | 0x15, - 30977 - 19968: jis0208<<14 | 0x1D<<7 | 0x2B, - 30982 - 19968: jis0212<<14 | 0x2F<<7 | 0x1B, - 30983 - 19968: jis0208<<14 | 0x42<<7 | 0x04, - 30988 - 19968: jis0212<<14 | 0x2F<<7 | 0x1C, - 30990 - 19968: jis0208<<14 | 0x20<<7 | 0x22, - 30992 - 19968: jis0212<<14 | 0x2F<<7 | 0x1D, - 30993 - 19968: jis0208<<14 | 0x42<<7 | 0x06, - 30994 - 19968: jis0208<<14 | 0x42<<7 | 0x05, - 31001 - 19968: jis0208<<14 | 0x42<<7 | 0x07, - 31002 - 19968: jis0212<<14 | 0x2F<<7 | 0x1E, - 31004 - 19968: jis0212<<14 | 0x2F<<7 | 0x1F, - 31006 - 19968: jis0212<<14 | 0x2F<<7 | 0x20, - 31007 - 19968: jis0212<<14 | 0x2F<<7 | 0x21, - 31008 - 19968: jis0212<<14 | 0x2F<<7 | 0x22, - 31013 - 19968: jis0212<<14 | 0x2F<<7 | 0x23, - 31014 - 19968: jis0208<<14 | 0x41<<7 | 0x47, - 31015 - 19968: jis0212<<14 | 0x2F<<7 | 0x24, - 31017 - 19968: jis0212<<14 | 0x2F<<7 | 0x25, - 31018 - 19968: jis0208<<14 | 0x41<<7 | 0x49, - 31019 - 19968: jis0208<<14 | 0x42<<7 | 0x09, - 31020 - 19968: jis0208<<14 | 0x42<<7 | 0x08, - 31021 - 19968: jis0212<<14 | 0x2F<<7 | 0x26, - 31024 - 19968: jis0208<<14 | 0x5A<<7 | 0x20, - 31025 - 19968: jis0212<<14 | 0x2F<<7 | 0x27, - 31028 - 19968: jis0212<<14 | 0x2F<<7 | 0x28, - 31029 - 19968: jis0212<<14 | 0x2F<<7 | 0x29, - 31034 - 19968: jis0208<<14 | 0x1B<<7 | 0x07, - 31035 - 19968: jis0212<<14 | 0x2F<<7 | 0x2A, - 31036 - 19968: jis0208<<14 | 0x2D<<7 | 0x48, - 31037 - 19968: jis0212<<14 | 0x2F<<7 | 0x2B, - 31038 - 19968: jis0208<<14 | 0x1B<<7 | 0x31, - 31039 - 19968: jis0212<<14 | 0x2F<<7 | 0x2C, - 31040 - 19968: jis0208<<14 | 0x42<<7 | 0x0A, - 31041 - 19968: jis0208<<14 | 0x16<<7 | 0x16, - 31044 - 19968: jis0212<<14 | 0x2F<<7 | 0x2D, - 31045 - 19968: jis0212<<14 | 0x2F<<7 | 0x2E, - 31046 - 19968: jis0212<<14 | 0x2F<<7 | 0x2F, - 31047 - 19968: jis0208<<14 | 0x14<<7 | 0x1F, - 31048 - 19968: jis0208<<14 | 0x14<<7 | 0x06, - 31049 - 19968: jis0208<<14 | 0x1A<<7 | 0x42, - 31050 - 19968: jis0212<<14 | 0x2F<<7 | 0x30, - 31051 - 19968: jis0212<<14 | 0x2F<<7 | 0x31, - 31055 - 19968: jis0212<<14 | 0x2F<<7 | 0x32, - 31056 - 19968: jis0208<<14 | 0x2C<<7 | 0x13, - 31057 - 19968: jis0212<<14 | 0x2F<<7 | 0x33, - 31059 - 19968: jis0208<<14 | 0x42<<7 | 0x10, - 31060 - 19968: jis0212<<14 | 0x2F<<7 | 0x34, - 31061 - 19968: jis0208<<14 | 0x42<<7 | 0x0F, - 31062 - 19968: jis0208<<14 | 0x20<<7 | 0x23, - 31063 - 19968: jis0208<<14 | 0x42<<7 | 0x0C, - 31064 - 19968: jis0212<<14 | 0x2F<<7 | 0x35, - 31066 - 19968: jis0208<<14 | 0x42<<7 | 0x0E, - 31067 - 19968: jis0212<<14 | 0x2F<<7 | 0x36, - 31068 - 19968: jis0212<<14 | 0x2F<<7 | 0x37, - 31069 - 19968: jis0208<<14 | 0x1C<<7 | 0x2A, - 31070 - 19968: jis0208<<14 | 0x1E<<7 | 0x1F, - 31071 - 19968: jis0208<<14 | 0x42<<7 | 0x0D, - 31072 - 19968: jis0208<<14 | 0x42<<7 | 0x0B, - 31074 - 19968: jis0208<<14 | 0x26<<7 | 0x09, - 31077 - 19968: jis0208<<14 | 0x1D<<7 | 0x2C, - 31079 - 19968: jis0212<<14 | 0x2F<<7 | 0x38, - 31080 - 19968: jis0208<<14 | 0x28<<7 | 0x1B, - 31081 - 19968: jis0212<<14 | 0x2F<<7 | 0x39, - 31083 - 19968: jis0212<<14 | 0x2F<<7 | 0x3A, - 31085 - 19968: jis0208<<14 | 0x19<<7 | 0x36, - 31090 - 19968: jis0212<<14 | 0x2F<<7 | 0x3B, - 31095 - 19968: jis0208<<14 | 0x24<<7 | 0x57, - 31097 - 19968: jis0212<<14 | 0x2F<<7 | 0x3C, - 31098 - 19968: jis0208<<14 | 0x42<<7 | 0x11, - 31099 - 19968: jis0212<<14 | 0x2F<<7 | 0x3D, - 31100 - 19968: jis0212<<14 | 0x2F<<7 | 0x3E, - 31102 - 19968: jis0212<<14 | 0x2F<<7 | 0x3F, - 31103 - 19968: jis0208<<14 | 0x42<<7 | 0x12, - 31104 - 19968: jis0208<<14 | 0x42<<7 | 0x28, - 31105 - 19968: jis0208<<14 | 0x15<<7 | 0x37, - 31108 - 19968: jis0208<<14 | 0x2E<<7 | 0x1C, - 31109 - 19968: jis0208<<14 | 0x20<<7 | 0x14, - 31114 - 19968: jis0208<<14 | 0x42<<7 | 0x13, - 31115 - 19968: jis0212<<14 | 0x2F<<7 | 0x40, - 31116 - 19968: jis0212<<14 | 0x2F<<7 | 0x41, - 31117 - 19968: jis0208<<14 | 0x11<<7 | 0x31, - 31118 - 19968: jis0208<<14 | 0x23<<7 | 0x56, - 31119 - 19968: jis0208<<14 | 0x29<<7 | 0x00, - 31121 - 19968: jis0212<<14 | 0x2F<<7 | 0x42, - 31123 - 19968: jis0212<<14 | 0x2F<<7 | 0x43, - 31124 - 19968: jis0208<<14 | 0x5A<<7 | 0x24, - 31125 - 19968: jis0212<<14 | 0x2F<<7 | 0x45, - 31126 - 19968: jis0212<<14 | 0x2F<<7 | 0x46, - 31128 - 19968: jis0212<<14 | 0x2F<<7 | 0x47, - 31131 - 19968: jis0208<<14 | 0x5A<<7 | 0x26, - 31132 - 19968: jis0212<<14 | 0x2F<<7 | 0x49, - 31133 - 19968: jis0208<<14 | 0x42<<7 | 0x14, - 31137 - 19968: jis0212<<14 | 0x2F<<7 | 0x4A, - 31142 - 19968: jis0208<<14 | 0x14<<7 | 0x59, - 31143 - 19968: jis0208<<14 | 0x42<<7 | 0x15, - 31144 - 19968: jis0212<<14 | 0x2F<<7 | 0x4B, - 31145 - 19968: jis0212<<14 | 0x2F<<7 | 0x4C, - 31146 - 19968: jis0208<<14 | 0x42<<7 | 0x17, - 31147 - 19968: jis0212<<14 | 0x2F<<7 | 0x4D, - 31150 - 19968: jis0208<<14 | 0x42<<7 | 0x18, - 31151 - 19968: jis0212<<14 | 0x2F<<7 | 0x4E, - 31152 - 19968: jis0208<<14 | 0x26<<7 | 0x08, - 31153 - 19968: jis0212<<14 | 0x2F<<7 | 0x4F, - 31155 - 19968: jis0208<<14 | 0x42<<7 | 0x19, - 31156 - 19968: jis0212<<14 | 0x2F<<7 | 0x50, - 31160 - 19968: jis0212<<14 | 0x2F<<7 | 0x51, - 31161 - 19968: jis0208<<14 | 0x42<<7 | 0x1A, - 31162 - 19968: jis0208<<14 | 0x42<<7 | 0x1B, - 31163 - 19968: jis0212<<14 | 0x2F<<7 | 0x52, - 31165 - 19968: jis0208<<14 | 0x15<<7 | 0x38, - 31166 - 19968: jis0208<<14 | 0x11<<7 | 0x32, - 31167 - 19968: jis0208<<14 | 0x25<<7 | 0x24, - 31168 - 19968: jis0208<<14 | 0x1C<<7 | 0x07, - 31169 - 19968: jis0208<<14 | 0x1A<<7 | 0x43, - 31170 - 19968: jis0212<<14 | 0x2F<<7 | 0x53, - 31172 - 19968: jis0212<<14 | 0x2F<<7 | 0x54, - 31175 - 19968: jis0212<<14 | 0x2F<<7 | 0x55, - 31176 - 19968: jis0212<<14 | 0x2F<<7 | 0x56, - 31177 - 19968: jis0208<<14 | 0x42<<7 | 0x1C, - 31178 - 19968: jis0212<<14 | 0x2F<<7 | 0x57, - 31179 - 19968: jis0208<<14 | 0x1C<<7 | 0x08, - 31183 - 19968: jis0212<<14 | 0x2F<<7 | 0x58, - 31185 - 19968: jis0208<<14 | 0x11<<7 | 0x29, - 31186 - 19968: jis0208<<14 | 0x28<<7 | 0x22, - 31188 - 19968: jis0212<<14 | 0x2F<<7 | 0x59, - 31189 - 19968: jis0208<<14 | 0x42<<7 | 0x1D, - 31190 - 19968: jis0212<<14 | 0x2F<<7 | 0x5A, - 31192 - 19968: jis0208<<14 | 0x27<<7 | 0x4A, - 31194 - 19968: jis0212<<14 | 0x2F<<7 | 0x5B, - 31197 - 19968: jis0212<<14 | 0x2F<<7 | 0x5C, - 31198 - 19968: jis0212<<14 | 0x2F<<7 | 0x5D, - 31199 - 19968: jis0208<<14 | 0x20<<7 | 0x24, - 31200 - 19968: jis0212<<14 | 0x30<<7 | 0x00, - 31201 - 19968: jis0208<<14 | 0x42<<7 | 0x20, - 31202 - 19968: jis0212<<14 | 0x30<<7 | 0x01, - 31203 - 19968: jis0208<<14 | 0x42<<7 | 0x21, - 31204 - 19968: jis0208<<14 | 0x26<<7 | 0x48, - 31205 - 19968: jis0212<<14 | 0x30<<7 | 0x02, - 31206 - 19968: jis0208<<14 | 0x1E<<7 | 0x20, - 31207 - 19968: jis0208<<14 | 0x42<<7 | 0x1E, - 31209 - 19968: jis0208<<14 | 0x22<<7 | 0x40, - 31210 - 19968: jis0212<<14 | 0x30<<7 | 0x03, - 31211 - 19968: jis0212<<14 | 0x30<<7 | 0x04, - 31212 - 19968: jis0208<<14 | 0x42<<7 | 0x1F, - 31213 - 19968: jis0212<<14 | 0x30<<7 | 0x05, - 31216 - 19968: jis0208<<14 | 0x1D<<7 | 0x2D, - 31217 - 19968: jis0212<<14 | 0x30<<7 | 0x06, - 31224 - 19968: jis0212<<14 | 0x30<<7 | 0x07, - 31227 - 19968: jis0208<<14 | 0x0F<<7 | 0x3B, - 31228 - 19968: jis0212<<14 | 0x30<<7 | 0x08, - 31232 - 19968: jis0208<<14 | 0x14<<7 | 0x08, - 31234 - 19968: jis0212<<14 | 0x30<<7 | 0x09, - 31235 - 19968: jis0212<<14 | 0x30<<7 | 0x0A, - 31239 - 19968: jis0212<<14 | 0x30<<7 | 0x0B, - 31240 - 19968: jis0208<<14 | 0x42<<7 | 0x22, - 31241 - 19968: jis0212<<14 | 0x30<<7 | 0x0C, - 31242 - 19968: jis0212<<14 | 0x30<<7 | 0x0D, - 31243 - 19968: jis0208<<14 | 0x23<<7 | 0x57, - 31244 - 19968: jis0212<<14 | 0x30<<7 | 0x0E, - 31245 - 19968: jis0208<<14 | 0x42<<7 | 0x23, - 31246 - 19968: jis0208<<14 | 0x1F<<7 | 0x26, - 31249 - 19968: jis0212<<14 | 0x30<<7 | 0x0F, - 31252 - 19968: jis0208<<14 | 0x2B<<7 | 0x0C, - 31253 - 19968: jis0212<<14 | 0x30<<7 | 0x10, - 31255 - 19968: jis0208<<14 | 0x28<<7 | 0x02, - 31256 - 19968: jis0208<<14 | 0x42<<7 | 0x24, - 31257 - 19968: jis0208<<14 | 0x42<<7 | 0x25, - 31258 - 19968: jis0208<<14 | 0x22<<7 | 0x34, - 31259 - 19968: jis0212<<14 | 0x30<<7 | 0x11, - 31260 - 19968: jis0208<<14 | 0x2D<<7 | 0x26, - 31262 - 19968: jis0212<<14 | 0x30<<7 | 0x12, - 31263 - 19968: jis0208<<14 | 0x42<<7 | 0x27, - 31264 - 19968: jis0208<<14 | 0x42<<7 | 0x26, - 31265 - 19968: jis0212<<14 | 0x30<<7 | 0x13, - 31271 - 19968: jis0212<<14 | 0x30<<7 | 0x14, - 31275 - 19968: jis0212<<14 | 0x30<<7 | 0x15, - 31277 - 19968: jis0212<<14 | 0x30<<7 | 0x16, - 31278 - 19968: jis0208<<14 | 0x1B<<7 | 0x4E, - 31279 - 19968: jis0212<<14 | 0x30<<7 | 0x17, - 31280 - 19968: jis0212<<14 | 0x30<<7 | 0x18, - 31281 - 19968: jis0208<<14 | 0x42<<7 | 0x29, - 31282 - 19968: jis0208<<14 | 0x0F<<7 | 0x4F, - 31284 - 19968: jis0212<<14 | 0x30<<7 | 0x19, - 31285 - 19968: jis0212<<14 | 0x30<<7 | 0x1A, - 31287 - 19968: jis0208<<14 | 0x42<<7 | 0x2C, - 31288 - 19968: jis0212<<14 | 0x30<<7 | 0x1B, - 31289 - 19968: jis0212<<14 | 0x30<<7 | 0x1C, - 31290 - 19968: jis0212<<14 | 0x30<<7 | 0x1D, - 31291 - 19968: jis0208<<14 | 0x42<<7 | 0x2A, - 31292 - 19968: jis0208<<14 | 0x11<<7 | 0x33, - 31293 - 19968: jis0208<<14 | 0x16<<7 | 0x2D, - 31294 - 19968: jis0208<<14 | 0x42<<7 | 0x2B, - 31295 - 19968: jis0208<<14 | 0x18<<7 | 0x25, - 31296 - 19968: jis0208<<14 | 0x18<<7 | 0x51, - 31298 - 19968: jis0208<<14 | 0x29<<7 | 0x45, - 31299 - 19968: jis0208<<14 | 0x42<<7 | 0x2D, - 31300 - 19968: jis0212<<14 | 0x30<<7 | 0x1E, - 31301 - 19968: jis0212<<14 | 0x30<<7 | 0x1F, - 31302 - 19968: jis0208<<14 | 0x2A<<7 | 0x33, - 31303 - 19968: jis0212<<14 | 0x30<<7 | 0x20, - 31304 - 19968: jis0212<<14 | 0x30<<7 | 0x21, - 31305 - 19968: jis0208<<14 | 0x42<<7 | 0x2F, - 31308 - 19968: jis0212<<14 | 0x30<<7 | 0x22, - 31309 - 19968: jis0208<<14 | 0x1F<<7 | 0x30, - 31310 - 19968: jis0208<<14 | 0x10<<7 | 0x2E, - 31311 - 19968: jis0208<<14 | 0x11<<7 | 0x19, - 31312 - 19968: jis0208<<14 | 0x0F<<7 | 0x0B, - 31317 - 19968: jis0212<<14 | 0x30<<7 | 0x23, - 31318 - 19968: jis0212<<14 | 0x30<<7 | 0x24, - 31319 - 19968: jis0208<<14 | 0x42<<7 | 0x2E, - 31321 - 19968: jis0212<<14 | 0x30<<7 | 0x25, - 31324 - 19968: jis0212<<14 | 0x30<<7 | 0x26, - 31325 - 19968: jis0212<<14 | 0x30<<7 | 0x27, - 31327 - 19968: jis0212<<14 | 0x30<<7 | 0x28, - 31328 - 19968: jis0212<<14 | 0x30<<7 | 0x29, - 31329 - 19968: jis0208<<14 | 0x42<<7 | 0x30, - 31330 - 19968: jis0208<<14 | 0x42<<7 | 0x31, - 31331 - 19968: jis0208<<14 | 0x1D<<7 | 0x56, - 31333 - 19968: jis0212<<14 | 0x30<<7 | 0x2A, - 31335 - 19968: jis0212<<14 | 0x30<<7 | 0x2B, - 31337 - 19968: jis0208<<14 | 0x42<<7 | 0x32, - 31338 - 19968: jis0212<<14 | 0x30<<7 | 0x2C, - 31339 - 19968: jis0208<<14 | 0x12<<7 | 0x2E, - 31341 - 19968: jis0212<<14 | 0x30<<7 | 0x2D, - 31344 - 19968: jis0208<<14 | 0x42<<7 | 0x34, - 31348 - 19968: jis0208<<14 | 0x16<<7 | 0x49, - 31349 - 19968: jis0212<<14 | 0x30<<7 | 0x2E, - 31350 - 19968: jis0208<<14 | 0x14<<7 | 0x45, - 31352 - 19968: jis0212<<14 | 0x30<<7 | 0x2F, - 31353 - 19968: jis0208<<14 | 0x42<<7 | 0x35, - 31354 - 19968: jis0208<<14 | 0x15<<7 | 0x54, - 31357 - 19968: jis0208<<14 | 0x42<<7 | 0x36, - 31358 - 19968: jis0212<<14 | 0x30<<7 | 0x30, - 31359 - 19968: jis0208<<14 | 0x1F<<7 | 0x5B, - 31360 - 19968: jis0212<<14 | 0x30<<7 | 0x31, - 31361 - 19968: jis0208<<14 | 0x25<<7 | 0x2C, - 31362 - 19968: jis0212<<14 | 0x30<<7 | 0x32, - 31363 - 19968: jis0208<<14 | 0x1F<<7 | 0x3F, - 31364 - 19968: jis0208<<14 | 0x19<<7 | 0x54, - 31365 - 19968: jis0212<<14 | 0x30<<7 | 0x33, - 31366 - 19968: jis0212<<14 | 0x30<<7 | 0x34, - 31368 - 19968: jis0208<<14 | 0x42<<7 | 0x37, - 31370 - 19968: jis0212<<14 | 0x30<<7 | 0x35, - 31371 - 19968: jis0212<<14 | 0x30<<7 | 0x36, - 31376 - 19968: jis0212<<14 | 0x30<<7 | 0x37, - 31377 - 19968: jis0212<<14 | 0x30<<7 | 0x38, - 31378 - 19968: jis0208<<14 | 0x22<<7 | 0x41, - 31379 - 19968: jis0208<<14 | 0x20<<7 | 0x4A, - 31380 - 19968: jis0212<<14 | 0x30<<7 | 0x39, - 31381 - 19968: jis0208<<14 | 0x42<<7 | 0x39, - 31382 - 19968: jis0208<<14 | 0x42<<7 | 0x3B, - 31383 - 19968: jis0208<<14 | 0x42<<7 | 0x38, - 31384 - 19968: jis0208<<14 | 0x42<<7 | 0x3A, - 31390 - 19968: jis0212<<14 | 0x30<<7 | 0x3A, - 31391 - 19968: jis0208<<14 | 0x16<<7 | 0x01, - 31392 - 19968: jis0212<<14 | 0x30<<7 | 0x3B, - 31395 - 19968: jis0212<<14 | 0x30<<7 | 0x3C, - 31401 - 19968: jis0208<<14 | 0x42<<7 | 0x3C, - 31402 - 19968: jis0208<<14 | 0x16<<7 | 0x05, - 31404 - 19968: jis0212<<14 | 0x30<<7 | 0x3D, - 31406 - 19968: jis0208<<14 | 0x14<<7 | 0x46, - 31407 - 19968: jis0208<<14 | 0x2C<<7 | 0x31, - 31408 - 19968: jis0208<<14 | 0x42<<7 | 0x3E, - 31411 - 19968: jis0212<<14 | 0x30<<7 | 0x3E, - 31413 - 19968: jis0212<<14 | 0x30<<7 | 0x3F, - 31414 - 19968: jis0208<<14 | 0x42<<7 | 0x3F, - 31417 - 19968: jis0212<<14 | 0x30<<7 | 0x40, - 31418 - 19968: jis0208<<14 | 0x10<<7 | 0x0D, - 31419 - 19968: jis0212<<14 | 0x30<<7 | 0x41, - 31420 - 19968: jis0212<<14 | 0x30<<7 | 0x42, - 31423 - 19968: jis0208<<14 | 0x42<<7 | 0x42, - 31427 - 19968: jis0208<<14 | 0x12<<7 | 0x55, - 31428 - 19968: jis0208<<14 | 0x42<<7 | 0x41, - 31429 - 19968: jis0208<<14 | 0x42<<7 | 0x40, - 31430 - 19968: jis0212<<14 | 0x30<<7 | 0x43, - 31431 - 19968: jis0208<<14 | 0x42<<7 | 0x44, - 31432 - 19968: jis0208<<14 | 0x42<<7 | 0x3D, - 31433 - 19968: jis0212<<14 | 0x30<<7 | 0x44, - 31434 - 19968: jis0208<<14 | 0x42<<7 | 0x45, - 31435 - 19968: jis0208<<14 | 0x2D<<7 | 0x08, - 31436 - 19968: jis0212<<14 | 0x30<<7 | 0x45, - 31437 - 19968: jis0208<<14 | 0x42<<7 | 0x46, - 31438 - 19968: jis0212<<14 | 0x30<<7 | 0x46, - 31439 - 19968: jis0208<<14 | 0x42<<7 | 0x47, - 31441 - 19968: jis0208<<14 | 0x5A<<7 | 0x27, - 31442 - 19968: jis0208<<14 | 0x33<<7 | 0x53, - 31443 - 19968: jis0208<<14 | 0x42<<7 | 0x49, - 31445 - 19968: jis0208<<14 | 0x42<<7 | 0x48, - 31449 - 19968: jis0208<<14 | 0x42<<7 | 0x4A, - 31450 - 19968: jis0208<<14 | 0x42<<7 | 0x4B, - 31451 - 19968: jis0212<<14 | 0x30<<7 | 0x48, - 31452 - 19968: jis0208<<14 | 0x2D<<7 | 0x14, - 31453 - 19968: jis0208<<14 | 0x42<<7 | 0x4C, - 31455 - 19968: jis0208<<14 | 0x4F<<7 | 0x4E, - 31456 - 19968: jis0208<<14 | 0x1D<<7 | 0x2E, - 31457 - 19968: jis0208<<14 | 0x42<<7 | 0x4D, - 31458 - 19968: jis0208<<14 | 0x42<<7 | 0x4E, - 31459 - 19968: jis0208<<14 | 0x1C<<7 | 0x36, - 31461 - 19968: jis0208<<14 | 0x25<<7 | 0x17, - 31462 - 19968: jis0208<<14 | 0x42<<7 | 0x4F, - 31463 - 19968: jis0208<<14 | 0x5A<<7 | 0x28, - 31464 - 19968: jis0212<<14 | 0x30<<7 | 0x49, - 31465 - 19968: jis0212<<14 | 0x30<<7 | 0x4A, - 31466 - 19968: jis0208<<14 | 0x22<<7 | 0x07, - 31467 - 19968: jis0208<<14 | 0x5A<<7 | 0x2A, - 31468 - 19968: jis0212<<14 | 0x30<<7 | 0x4C, - 31469 - 19968: jis0208<<14 | 0x42<<7 | 0x50, - 31471 - 19968: jis0208<<14 | 0x22<<7 | 0x1B, - 31472 - 19968: jis0208<<14 | 0x42<<7 | 0x51, - 31473 - 19968: jis0212<<14 | 0x30<<7 | 0x4D, - 31476 - 19968: jis0212<<14 | 0x30<<7 | 0x4E, - 31478 - 19968: jis0208<<14 | 0x15<<7 | 0x04, - 31480 - 19968: jis0208<<14 | 0x30<<7 | 0x1E, - 31481 - 19968: jis0208<<14 | 0x22<<7 | 0x3C, - 31482 - 19968: jis0208<<14 | 0x1B<<7 | 0x12, - 31483 - 19968: jis0212<<14 | 0x30<<7 | 0x4F, - 31485 - 19968: jis0212<<14 | 0x30<<7 | 0x50, - 31486 - 19968: jis0212<<14 | 0x30<<7 | 0x51, - 31487 - 19968: jis0208<<14 | 0x13<<7 | 0x27, - 31490 - 19968: jis0208<<14 | 0x42<<7 | 0x52, - 31492 - 19968: jis0208<<14 | 0x43<<7 | 0x01, - 31494 - 19968: jis0208<<14 | 0x42<<7 | 0x55, - 31495 - 19968: jis0212<<14 | 0x30<<7 | 0x52, - 31496 - 19968: jis0208<<14 | 0x14<<7 | 0x47, - 31498 - 19968: jis0208<<14 | 0x42<<7 | 0x54, - 31499 - 19968: jis0208<<14 | 0x43<<7 | 0x03, - 31503 - 19968: jis0208<<14 | 0x42<<7 | 0x53, - 31505 - 19968: jis0208<<14 | 0x1D<<7 | 0x2F, - 31508 - 19968: jis0212<<14 | 0x30<<7 | 0x53, - 31512 - 19968: jis0208<<14 | 0x42<<7 | 0x57, - 31513 - 19968: jis0208<<14 | 0x42<<7 | 0x58, - 31515 - 19968: jis0208<<14 | 0x24<<7 | 0x0A, - 31518 - 19968: jis0208<<14 | 0x42<<7 | 0x59, - 31519 - 19968: jis0212<<14 | 0x30<<7 | 0x54, - 31520 - 19968: jis0208<<14 | 0x12<<7 | 0x3D, - 31523 - 19968: jis0212<<14 | 0x30<<7 | 0x55, - 31525 - 19968: jis0208<<14 | 0x1E<<7 | 0x39, - 31526 - 19968: jis0208<<14 | 0x28<<7 | 0x43, - 31527 - 19968: jis0212<<14 | 0x30<<7 | 0x56, - 31528 - 19968: jis0208<<14 | 0x42<<7 | 0x5B, - 31529 - 19968: jis0212<<14 | 0x30<<7 | 0x57, - 31530 - 19968: jis0212<<14 | 0x30<<7 | 0x58, - 31531 - 19968: jis0212<<14 | 0x30<<7 | 0x59, - 31532 - 19968: jis0208<<14 | 0x21<<7 | 0x47, - 31533 - 19968: jis0212<<14 | 0x30<<7 | 0x5A, - 31534 - 19968: jis0212<<14 | 0x30<<7 | 0x5B, - 31535 - 19968: jis0212<<14 | 0x30<<7 | 0x5C, - 31536 - 19968: jis0212<<14 | 0x30<<7 | 0x5D, - 31537 - 19968: jis0212<<14 | 0x31<<7 | 0x00, - 31539 - 19968: jis0208<<14 | 0x42<<7 | 0x56, - 31540 - 19968: jis0212<<14 | 0x31<<7 | 0x01, - 31541 - 19968: jis0208<<14 | 0x42<<7 | 0x5A, - 31542 - 19968: jis0208<<14 | 0x42<<7 | 0x5C, - 31545 - 19968: jis0208<<14 | 0x19<<7 | 0x5A, - 31549 - 19968: jis0212<<14 | 0x31<<7 | 0x02, - 31551 - 19968: jis0212<<14 | 0x31<<7 | 0x03, - 31552 - 19968: jis0212<<14 | 0x31<<7 | 0x04, - 31553 - 19968: jis0212<<14 | 0x31<<7 | 0x05, - 31557 - 19968: jis0208<<14 | 0x43<<7 | 0x05, - 31558 - 19968: jis0208<<14 | 0x28<<7 | 0x0D, - 31559 - 19968: jis0212<<14 | 0x31<<7 | 0x06, - 31560 - 19968: jis0208<<14 | 0x27<<7 | 0x05, - 31561 - 19968: jis0208<<14 | 0x24<<7 | 0x58, - 31563 - 19968: jis0208<<14 | 0x15<<7 | 0x39, - 31564 - 19968: jis0208<<14 | 0x43<<7 | 0x04, - 31565 - 19968: jis0208<<14 | 0x43<<7 | 0x02, - 31566 - 19968: jis0212<<14 | 0x31<<7 | 0x07, - 31567 - 19968: jis0208<<14 | 0x27<<7 | 0x14, - 31568 - 19968: jis0208<<14 | 0x42<<7 | 0x5D, - 31569 - 19968: jis0208<<14 | 0x22<<7 | 0x3D, - 31570 - 19968: jis0208<<14 | 0x24<<7 | 0x5A, - 31572 - 19968: jis0208<<14 | 0x24<<7 | 0x59, - 31573 - 19968: jis0212<<14 | 0x31<<7 | 0x08, - 31574 - 19968: jis0208<<14 | 0x19<<7 | 0x55, - 31581 - 19968: jis0208<<14 | 0x43<<7 | 0x17, - 31584 - 19968: jis0212<<14 | 0x31<<7 | 0x09, - 31588 - 19968: jis0212<<14 | 0x31<<7 | 0x0A, - 31589 - 19968: jis0208<<14 | 0x43<<7 | 0x07, - 31590 - 19968: jis0212<<14 | 0x31<<7 | 0x0B, - 31591 - 19968: jis0208<<14 | 0x43<<7 | 0x09, - 31593 - 19968: jis0212<<14 | 0x31<<7 | 0x0C, - 31594 - 19968: jis0212<<14 | 0x31<<7 | 0x0D, - 31596 - 19968: jis0208<<14 | 0x43<<7 | 0x0C, - 31597 - 19968: jis0212<<14 | 0x31<<7 | 0x0E, - 31598 - 19968: jis0208<<14 | 0x43<<7 | 0x0D, - 31599 - 19968: jis0212<<14 | 0x31<<7 | 0x0F, - 31600 - 19968: jis0208<<14 | 0x43<<7 | 0x0A, - 31601 - 19968: jis0208<<14 | 0x43<<7 | 0x0B, - 31602 - 19968: jis0212<<14 | 0x31<<7 | 0x10, - 31603 - 19968: jis0212<<14 | 0x31<<7 | 0x11, - 31604 - 19968: jis0208<<14 | 0x43<<7 | 0x08, - 31605 - 19968: jis0208<<14 | 0x43<<7 | 0x06, - 31607 - 19968: jis0212<<14 | 0x31<<7 | 0x12, - 31610 - 19968: jis0208<<14 | 0x43<<7 | 0x00, - 31620 - 19968: jis0212<<14 | 0x31<<7 | 0x13, - 31622 - 19968: jis0208<<14 | 0x29<<7 | 0x2E, - 31623 - 19968: jis0208<<14 | 0x11<<7 | 0x34, - 31625 - 19968: jis0212<<14 | 0x31<<7 | 0x14, - 31627 - 19968: jis0208<<14 | 0x43<<7 | 0x14, - 31629 - 19968: jis0208<<14 | 0x43<<7 | 0x11, - 31630 - 19968: jis0212<<14 | 0x31<<7 | 0x15, - 31631 - 19968: jis0208<<14 | 0x43<<7 | 0x16, - 31632 - 19968: jis0212<<14 | 0x31<<7 | 0x16, - 31633 - 19968: jis0212<<14 | 0x31<<7 | 0x17, - 31634 - 19968: jis0208<<14 | 0x43<<7 | 0x15, - 31636 - 19968: jis0208<<14 | 0x26<<7 | 0x52, - 31637 - 19968: jis0208<<14 | 0x2B<<7 | 0x06, - 31638 - 19968: jis0212<<14 | 0x31<<7 | 0x18, - 31639 - 19968: jis0208<<14 | 0x1A<<7 | 0x1A, - 31640 - 19968: jis0208<<14 | 0x43<<7 | 0x0F, - 31641 - 19968: jis0208<<14 | 0x43<<7 | 0x18, - 31642 - 19968: jis0208<<14 | 0x43<<7 | 0x13, - 31643 - 19968: jis0212<<14 | 0x31<<7 | 0x19, - 31644 - 19968: jis0208<<14 | 0x43<<7 | 0x12, - 31645 - 19968: jis0208<<14 | 0x43<<7 | 0x0E, - 31646 - 19968: jis0208<<14 | 0x5A<<7 | 0x2B, - 31647 - 19968: jis0208<<14 | 0x43<<7 | 0x10, - 31648 - 19968: jis0212<<14 | 0x31<<7 | 0x1B, - 31649 - 19968: jis0208<<14 | 0x13<<7 | 0x28, - 31653 - 19968: jis0212<<14 | 0x31<<7 | 0x1C, - 31658 - 19968: jis0208<<14 | 0x22<<7 | 0x1C, - 31660 - 19968: jis0212<<14 | 0x31<<7 | 0x1D, - 31661 - 19968: jis0208<<14 | 0x1F<<7 | 0x5C, - 31663 - 19968: jis0212<<14 | 0x31<<7 | 0x1E, - 31664 - 19968: jis0212<<14 | 0x31<<7 | 0x1F, - 31665 - 19968: jis0208<<14 | 0x27<<7 | 0x01, - 31666 - 19968: jis0212<<14 | 0x31<<7 | 0x20, - 31668 - 19968: jis0208<<14 | 0x43<<7 | 0x1D, - 31669 - 19968: jis0212<<14 | 0x31<<7 | 0x21, - 31670 - 19968: jis0212<<14 | 0x31<<7 | 0x22, - 31672 - 19968: jis0208<<14 | 0x27<<7 | 0x03, - 31674 - 19968: jis0212<<14 | 0x31<<7 | 0x23, - 31675 - 19968: jis0212<<14 | 0x31<<7 | 0x24, - 31676 - 19968: jis0212<<14 | 0x31<<7 | 0x25, - 31677 - 19968: jis0212<<14 | 0x31<<7 | 0x26, - 31680 - 19968: jis0208<<14 | 0x1F<<7 | 0x40, - 31681 - 19968: jis0208<<14 | 0x43<<7 | 0x1A, - 31682 - 19968: jis0212<<14 | 0x31<<7 | 0x27, - 31684 - 19968: jis0208<<14 | 0x27<<7 | 0x2E, - 31685 - 19968: jis0212<<14 | 0x31<<7 | 0x28, - 31686 - 19968: jis0208<<14 | 0x43<<7 | 0x1E, - 31687 - 19968: jis0208<<14 | 0x29<<7 | 0x32, - 31688 - 19968: jis0212<<14 | 0x31<<7 | 0x29, - 31689 - 19968: jis0208<<14 | 0x22<<7 | 0x3A, - 31690 - 19968: jis0212<<14 | 0x31<<7 | 0x2A, - 31691 - 19968: jis0208<<14 | 0x43<<7 | 0x19, - 31692 - 19968: jis0208<<14 | 0x43<<7 | 0x1B, - 31695 - 19968: jis0208<<14 | 0x43<<7 | 0x1C, - 31700 - 19968: jis0212<<14 | 0x31<<7 | 0x2B, - 31702 - 19968: jis0212<<14 | 0x31<<7 | 0x2C, - 31703 - 19968: jis0212<<14 | 0x31<<7 | 0x2D, - 31705 - 19968: jis0212<<14 | 0x31<<7 | 0x2E, - 31706 - 19968: jis0212<<14 | 0x31<<7 | 0x2F, - 31707 - 19968: jis0212<<14 | 0x31<<7 | 0x30, - 31709 - 19968: jis0208<<14 | 0x43<<7 | 0x1F, - 31712 - 19968: jis0208<<14 | 0x1B<<7 | 0x23, - 31716 - 19968: jis0208<<14 | 0x25<<7 | 0x25, - 31717 - 19968: jis0208<<14 | 0x43<<7 | 0x24, - 31718 - 19968: jis0208<<14 | 0x43<<7 | 0x23, - 31720 - 19968: jis0212<<14 | 0x31<<7 | 0x31, - 31721 - 19968: jis0208<<14 | 0x43<<7 | 0x20, - 31722 - 19968: jis0212<<14 | 0x31<<7 | 0x32, - 31725 - 19968: jis0208<<14 | 0x2E<<7 | 0x15, - 31730 - 19968: jis0212<<14 | 0x31<<7 | 0x33, - 31731 - 19968: jis0208<<14 | 0x43<<7 | 0x29, - 31732 - 19968: jis0212<<14 | 0x31<<7 | 0x34, - 31733 - 19968: jis0212<<14 | 0x31<<7 | 0x35, - 31734 - 19968: jis0208<<14 | 0x43<<7 | 0x2D, - 31735 - 19968: jis0208<<14 | 0x43<<7 | 0x2A, - 31736 - 19968: jis0212<<14 | 0x31<<7 | 0x36, - 31737 - 19968: jis0212<<14 | 0x31<<7 | 0x37, - 31738 - 19968: jis0212<<14 | 0x31<<7 | 0x38, - 31740 - 19968: jis0212<<14 | 0x31<<7 | 0x39, - 31742 - 19968: jis0212<<14 | 0x31<<7 | 0x3A, - 31744 - 19968: jis0208<<14 | 0x43<<7 | 0x26, - 31745 - 19968: jis0212<<14 | 0x31<<7 | 0x3B, - 31746 - 19968: jis0212<<14 | 0x31<<7 | 0x3C, - 31747 - 19968: jis0212<<14 | 0x31<<7 | 0x3D, - 31748 - 19968: jis0212<<14 | 0x31<<7 | 0x3E, - 31750 - 19968: jis0212<<14 | 0x31<<7 | 0x3F, - 31751 - 19968: jis0208<<14 | 0x43<<7 | 0x27, - 31753 - 19968: jis0212<<14 | 0x31<<7 | 0x40, - 31755 - 19968: jis0212<<14 | 0x31<<7 | 0x41, - 31756 - 19968: jis0212<<14 | 0x31<<7 | 0x42, - 31757 - 19968: jis0208<<14 | 0x43<<7 | 0x2C, - 31758 - 19968: jis0212<<14 | 0x31<<7 | 0x43, - 31759 - 19968: jis0212<<14 | 0x31<<7 | 0x44, - 31761 - 19968: jis0208<<14 | 0x43<<7 | 0x21, - 31762 - 19968: jis0208<<14 | 0x31<<7 | 0x34, - 31763 - 19968: jis0208<<14 | 0x43<<7 | 0x28, - 31764 - 19968: jis0208<<14 | 0x43<<7 | 0x22, - 31767 - 19968: jis0208<<14 | 0x43<<7 | 0x2B, - 31769 - 19968: jis0212<<14 | 0x31<<7 | 0x45, - 31771 - 19968: jis0212<<14 | 0x31<<7 | 0x46, - 31775 - 19968: jis0208<<14 | 0x43<<7 | 0x31, - 31776 - 19968: jis0212<<14 | 0x31<<7 | 0x47, - 31777 - 19968: jis0208<<14 | 0x13<<7 | 0x29, - 31779 - 19968: jis0208<<14 | 0x43<<7 | 0x2E, - 31781 - 19968: jis0212<<14 | 0x31<<7 | 0x48, - 31782 - 19968: jis0212<<14 | 0x31<<7 | 0x49, - 31783 - 19968: jis0208<<14 | 0x43<<7 | 0x2F, - 31784 - 19968: jis0212<<14 | 0x31<<7 | 0x4A, - 31786 - 19968: jis0208<<14 | 0x43<<7 | 0x30, - 31787 - 19968: jis0208<<14 | 0x43<<7 | 0x33, - 31788 - 19968: jis0212<<14 | 0x31<<7 | 0x4B, - 31793 - 19968: jis0212<<14 | 0x31<<7 | 0x4C, - 31795 - 19968: jis0212<<14 | 0x31<<7 | 0x4D, - 31796 - 19968: jis0212<<14 | 0x31<<7 | 0x4E, - 31798 - 19968: jis0212<<14 | 0x31<<7 | 0x4F, - 31799 - 19968: jis0208<<14 | 0x43<<7 | 0x32, - 31800 - 19968: jis0208<<14 | 0x27<<7 | 0x55, - 31801 - 19968: jis0212<<14 | 0x31<<7 | 0x50, - 31802 - 19968: jis0212<<14 | 0x31<<7 | 0x51, - 31805 - 19968: jis0208<<14 | 0x43<<7 | 0x34, - 31806 - 19968: jis0208<<14 | 0x2D<<7 | 0x5B, - 31807 - 19968: jis0208<<14 | 0x29<<7 | 0x4C, - 31808 - 19968: jis0208<<14 | 0x43<<7 | 0x39, - 31811 - 19968: jis0208<<14 | 0x43<<7 | 0x36, - 31814 - 19968: jis0212<<14 | 0x31<<7 | 0x52, - 31818 - 19968: jis0212<<14 | 0x31<<7 | 0x53, - 31820 - 19968: jis0208<<14 | 0x43<<7 | 0x35, - 31821 - 19968: jis0208<<14 | 0x1F<<7 | 0x31, - 31823 - 19968: jis0208<<14 | 0x43<<7 | 0x38, - 31824 - 19968: jis0208<<14 | 0x43<<7 | 0x3A, - 31825 - 19968: jis0212<<14 | 0x31<<7 | 0x55, - 31826 - 19968: jis0212<<14 | 0x31<<7 | 0x56, - 31827 - 19968: jis0212<<14 | 0x31<<7 | 0x57, - 31828 - 19968: jis0208<<14 | 0x43<<7 | 0x37, - 31829 - 19968: jis0212<<14 | 0x31<<7 | 0x54, - 31830 - 19968: jis0208<<14 | 0x43<<7 | 0x3E, - 31832 - 19968: jis0208<<14 | 0x43<<7 | 0x3B, - 31833 - 19968: jis0212<<14 | 0x31<<7 | 0x58, - 31834 - 19968: jis0212<<14 | 0x31<<7 | 0x59, - 31835 - 19968: jis0212<<14 | 0x31<<7 | 0x5A, - 31836 - 19968: jis0212<<14 | 0x31<<7 | 0x5B, - 31837 - 19968: jis0212<<14 | 0x31<<7 | 0x5C, - 31838 - 19968: jis0212<<14 | 0x31<<7 | 0x5D, - 31839 - 19968: jis0208<<14 | 0x43<<7 | 0x3C, - 31840 - 19968: jis0208<<14 | 0x43<<7 | 0x25, - 31841 - 19968: jis0212<<14 | 0x32<<7 | 0x00, - 31843 - 19968: jis0212<<14 | 0x32<<7 | 0x01, - 31844 - 19968: jis0208<<14 | 0x43<<7 | 0x3D, - 31845 - 19968: jis0208<<14 | 0x43<<7 | 0x3F, - 31847 - 19968: jis0212<<14 | 0x32<<7 | 0x02, - 31849 - 19968: jis0212<<14 | 0x32<<7 | 0x03, - 31852 - 19968: jis0208<<14 | 0x43<<7 | 0x40, - 31853 - 19968: jis0212<<14 | 0x32<<7 | 0x04, - 31854 - 19968: jis0212<<14 | 0x32<<7 | 0x05, - 31856 - 19968: jis0212<<14 | 0x32<<7 | 0x06, - 31858 - 19968: jis0212<<14 | 0x32<<7 | 0x07, - 31859 - 19968: jis0208<<14 | 0x29<<7 | 0x25, - 31861 - 19968: jis0208<<14 | 0x43<<7 | 0x41, - 31865 - 19968: jis0212<<14 | 0x32<<7 | 0x08, - 31868 - 19968: jis0212<<14 | 0x32<<7 | 0x09, - 31869 - 19968: jis0212<<14 | 0x32<<7 | 0x0A, - 31870 - 19968: jis0208<<14 | 0x2B<<7 | 0x41, - 31873 - 19968: jis0208<<14 | 0x15<<7 | 0x2D, - 31874 - 19968: jis0208<<14 | 0x16<<7 | 0x08, - 31875 - 19968: jis0208<<14 | 0x43<<7 | 0x42, - 31878 - 19968: jis0212<<14 | 0x32<<7 | 0x0B, - 31879 - 19968: jis0212<<14 | 0x32<<7 | 0x0C, - 31881 - 19968: jis0208<<14 | 0x29<<7 | 0x13, - 31883 - 19968: jis0208<<14 | 0x1E<<7 | 0x47, - 31885 - 19968: jis0208<<14 | 0x2B<<7 | 0x0F, - 31887 - 19968: jis0212<<14 | 0x32<<7 | 0x0D, - 31888 - 19968: jis0208<<14 | 0x43<<7 | 0x43, - 31890 - 19968: jis0208<<14 | 0x2D<<7 | 0x12, - 31892 - 19968: jis0212<<14 | 0x32<<7 | 0x0E, - 31893 - 19968: jis0208<<14 | 0x26<<7 | 0x53, - 31895 - 19968: jis0208<<14 | 0x20<<7 | 0x25, - 31896 - 19968: jis0208<<14 | 0x26<<7 | 0x13, - 31899 - 19968: jis0208<<14 | 0x1C<<7 | 0x2C, - 31902 - 19968: jis0212<<14 | 0x32<<7 | 0x0F, - 31903 - 19968: jis0208<<14 | 0x0F<<7 | 0x1F, - 31904 - 19968: jis0212<<14 | 0x32<<7 | 0x10, - 31905 - 19968: jis0208<<14 | 0x43<<7 | 0x48, - 31906 - 19968: jis0208<<14 | 0x43<<7 | 0x46, - 31908 - 19968: jis0208<<14 | 0x43<<7 | 0x44, - 31909 - 19968: jis0208<<14 | 0x13<<7 | 0x00, - 31910 - 19968: jis0212<<14 | 0x32<<7 | 0x11, - 31911 - 19968: jis0208<<14 | 0x1D<<7 | 0x30, - 31912 - 19968: jis0208<<14 | 0x43<<7 | 0x49, - 31915 - 19968: jis0208<<14 | 0x43<<7 | 0x47, - 31917 - 19968: jis0208<<14 | 0x43<<7 | 0x45, - 31918 - 19968: jis0208<<14 | 0x43<<7 | 0x4D, - 31920 - 19968: jis0212<<14 | 0x32<<7 | 0x12, - 31921 - 19968: jis0208<<14 | 0x43<<7 | 0x4C, - 31922 - 19968: jis0208<<14 | 0x43<<7 | 0x4B, - 31923 - 19968: jis0208<<14 | 0x43<<7 | 0x4A, - 31926 - 19968: jis0212<<14 | 0x32<<7 | 0x13, - 31927 - 19968: jis0212<<14 | 0x32<<7 | 0x14, - 31929 - 19968: jis0208<<14 | 0x43<<7 | 0x4E, - 31930 - 19968: jis0212<<14 | 0x32<<7 | 0x15, - 31931 - 19968: jis0212<<14 | 0x32<<7 | 0x16, - 31932 - 19968: jis0212<<14 | 0x32<<7 | 0x17, - 31933 - 19968: jis0208<<14 | 0x43<<7 | 0x4F, - 31934 - 19968: jis0208<<14 | 0x1F<<7 | 0x19, - 31935 - 19968: jis0212<<14 | 0x32<<7 | 0x18, - 31936 - 19968: jis0208<<14 | 0x43<<7 | 0x50, - 31938 - 19968: jis0208<<14 | 0x43<<7 | 0x52, - 31940 - 19968: jis0212<<14 | 0x32<<7 | 0x19, - 31941 - 19968: jis0208<<14 | 0x43<<7 | 0x51, - 31943 - 19968: jis0212<<14 | 0x32<<7 | 0x1A, - 31944 - 19968: jis0212<<14 | 0x32<<7 | 0x1B, - 31945 - 19968: jis0212<<14 | 0x32<<7 | 0x1C, - 31946 - 19968: jis0208<<14 | 0x17<<7 | 0x31, - 31949 - 19968: jis0212<<14 | 0x32<<7 | 0x1D, - 31950 - 19968: jis0208<<14 | 0x20<<7 | 0x17, - 31951 - 19968: jis0212<<14 | 0x32<<7 | 0x1E, - 31954 - 19968: jis0208<<14 | 0x43<<7 | 0x54, - 31955 - 19968: jis0212<<14 | 0x32<<7 | 0x1F, - 31956 - 19968: jis0212<<14 | 0x32<<7 | 0x20, - 31957 - 19968: jis0212<<14 | 0x32<<7 | 0x21, - 31958 - 19968: jis0208<<14 | 0x24<<7 | 0x5B, - 31959 - 19968: jis0212<<14 | 0x32<<7 | 0x22, - 31960 - 19968: jis0208<<14 | 0x43<<7 | 0x53, - 31961 - 19968: jis0212<<14 | 0x32<<7 | 0x23, - 31962 - 19968: jis0212<<14 | 0x32<<7 | 0x24, - 31964 - 19968: jis0208<<14 | 0x43<<7 | 0x55, - 31965 - 19968: jis0212<<14 | 0x32<<7 | 0x25, - 31966 - 19968: jis0208<<14 | 0x29<<7 | 0x14, - 31967 - 19968: jis0208<<14 | 0x20<<7 | 0x4B, - 31968 - 19968: jis0208<<14 | 0x18<<7 | 0x26, - 31970 - 19968: jis0208<<14 | 0x43<<7 | 0x56, - 31974 - 19968: jis0212<<14 | 0x32<<7 | 0x26, - 31975 - 19968: jis0208<<14 | 0x2D<<7 | 0x27, - 31977 - 19968: jis0212<<14 | 0x32<<7 | 0x27, - 31979 - 19968: jis0212<<14 | 0x32<<7 | 0x28, - 31983 - 19968: jis0208<<14 | 0x43<<7 | 0x58, - 31986 - 19968: jis0208<<14 | 0x43<<7 | 0x59, - 31988 - 19968: jis0208<<14 | 0x43<<7 | 0x5A, - 31989 - 19968: jis0212<<14 | 0x32<<7 | 0x29, - 31990 - 19968: jis0208<<14 | 0x43<<7 | 0x5B, - 31992 - 19968: jis0208<<14 | 0x1A<<7 | 0x44, - 31994 - 19968: jis0208<<14 | 0x43<<7 | 0x5C, - 31995 - 19968: jis0208<<14 | 0x16<<7 | 0x2E, - 31998 - 19968: jis0208<<14 | 0x14<<7 | 0x49, - 32000 - 19968: jis0208<<14 | 0x14<<7 | 0x09, - 32002 - 19968: jis0208<<14 | 0x44<<7 | 0x00, - 32003 - 19968: jis0212<<14 | 0x32<<7 | 0x2A, - 32004 - 19968: jis0208<<14 | 0x2B<<7 | 0x52, - 32005 - 19968: jis0208<<14 | 0x18<<7 | 0x27, - 32006 - 19968: jis0208<<14 | 0x43<<7 | 0x5D, - 32007 - 19968: jis0212<<14 | 0x32<<7 | 0x2B, - 32008 - 19968: jis0212<<14 | 0x32<<7 | 0x2C, - 32009 - 19968: jis0212<<14 | 0x32<<7 | 0x2D, - 32010 - 19968: jis0208<<14 | 0x44<<7 | 0x03, - 32011 - 19968: jis0208<<14 | 0x2B<<7 | 0x45, - 32013 - 19968: jis0208<<14 | 0x26<<7 | 0x1B, - 32015 - 19968: jis0212<<14 | 0x32<<7 | 0x2E, - 32016 - 19968: jis0208<<14 | 0x28<<7 | 0x12, - 32017 - 19968: jis0212<<14 | 0x32<<7 | 0x2F, - 32018 - 19968: jis0212<<14 | 0x32<<7 | 0x30, - 32019 - 19968: jis0212<<14 | 0x32<<7 | 0x31, - 32020 - 19968: jis0208<<14 | 0x1C<<7 | 0x42, - 32021 - 19968: jis0208<<14 | 0x44<<7 | 0x02, - 32022 - 19968: jis0212<<14 | 0x32<<7 | 0x32, - 32023 - 19968: jis0208<<14 | 0x1B<<7 | 0x32, - 32024 - 19968: jis0208<<14 | 0x18<<7 | 0x28, - 32025 - 19968: jis0208<<14 | 0x1A<<7 | 0x45, - 32026 - 19968: jis0208<<14 | 0x14<<7 | 0x48, - 32027 - 19968: jis0208<<14 | 0x29<<7 | 0x15, - 32028 - 19968: jis0208<<14 | 0x44<<7 | 0x01, - 32029 - 19968: jis0212<<14 | 0x32<<7 | 0x33, - 32030 - 19968: jis0212<<14 | 0x32<<7 | 0x34, - 32032 - 19968: jis0208<<14 | 0x20<<7 | 0x26, - 32033 - 19968: jis0208<<14 | 0x2A<<7 | 0x21, - 32034 - 19968: jis0208<<14 | 0x19<<7 | 0x56, - 32035 - 19968: jis0212<<14 | 0x32<<7 | 0x35, - 32038 - 19968: jis0212<<14 | 0x32<<7 | 0x36, - 32042 - 19968: jis0212<<14 | 0x32<<7 | 0x37, - 32043 - 19968: jis0208<<14 | 0x1A<<7 | 0x46, - 32044 - 19968: jis0208<<14 | 0x23<<7 | 0x3C, - 32045 - 19968: jis0212<<14 | 0x32<<7 | 0x38, - 32046 - 19968: jis0208<<14 | 0x44<<7 | 0x06, - 32047 - 19968: jis0208<<14 | 0x2D<<7 | 0x3E, - 32048 - 19968: jis0208<<14 | 0x19<<7 | 0x38, - 32049 - 19968: jis0212<<14 | 0x32<<7 | 0x39, - 32050 - 19968: jis0208<<14 | 0x44<<7 | 0x07, - 32051 - 19968: jis0208<<14 | 0x1E<<7 | 0x21, - 32053 - 19968: jis0208<<14 | 0x44<<7 | 0x09, - 32057 - 19968: jis0208<<14 | 0x1D<<7 | 0x31, - 32058 - 19968: jis0208<<14 | 0x19<<7 | 0x0F, - 32060 - 19968: jis0212<<14 | 0x32<<7 | 0x3A, - 32061 - 19968: jis0212<<14 | 0x32<<7 | 0x3B, - 32062 - 19968: jis0212<<14 | 0x32<<7 | 0x3C, - 32063 - 19968: jis0208<<14 | 0x44<<7 | 0x08, - 32064 - 19968: jis0212<<14 | 0x32<<7 | 0x3D, - 32065 - 19968: jis0212<<14 | 0x32<<7 | 0x3E, - 32066 - 19968: jis0208<<14 | 0x1C<<7 | 0x09, - 32067 - 19968: jis0208<<14 | 0x17<<7 | 0x1D, - 32068 - 19968: jis0208<<14 | 0x20<<7 | 0x27, - 32069 - 19968: jis0208<<14 | 0x44<<7 | 0x04, - 32070 - 19968: jis0208<<14 | 0x44<<7 | 0x0A, - 32071 - 19968: jis0212<<14 | 0x32<<7 | 0x3F, - 32072 - 19968: jis0208<<14 | 0x5A<<7 | 0x2D, - 32075 - 19968: jis0208<<14 | 0x44<<7 | 0x05, - 32076 - 19968: jis0208<<14 | 0x16<<7 | 0x2F, - 32077 - 19968: jis0212<<14 | 0x32<<7 | 0x41, - 32078 - 19968: jis0208<<14 | 0x44<<7 | 0x0D, - 32079 - 19968: jis0208<<14 | 0x44<<7 | 0x11, - 32080 - 19968: jis0208<<14 | 0x16<<7 | 0x4A, - 32081 - 19968: jis0212<<14 | 0x32<<7 | 0x42, - 32083 - 19968: jis0212<<14 | 0x32<<7 | 0x43, - 32086 - 19968: jis0208<<14 | 0x44<<7 | 0x0C, - 32087 - 19968: jis0212<<14 | 0x32<<7 | 0x44, - 32089 - 19968: jis0212<<14 | 0x32<<7 | 0x45, - 32090 - 19968: jis0212<<14 | 0x32<<7 | 0x46, - 32091 - 19968: jis0208<<14 | 0x44<<7 | 0x15, - 32092 - 19968: jis0208<<14 | 0x5A<<7 | 0x2E, - 32093 - 19968: jis0212<<14 | 0x32<<7 | 0x48, - 32094 - 19968: jis0208<<14 | 0x18<<7 | 0x29, - 32097 - 19968: jis0208<<14 | 0x2C<<7 | 0x4C, - 32098 - 19968: jis0208<<14 | 0x0F<<7 | 0x1B, - 32099 - 19968: jis0208<<14 | 0x44<<7 | 0x12, - 32101 - 19968: jis0212<<14 | 0x32<<7 | 0x49, - 32102 - 19968: jis0208<<14 | 0x14<<7 | 0x4A, - 32103 - 19968: jis0212<<14 | 0x32<<7 | 0x4A, - 32104 - 19968: jis0208<<14 | 0x44<<7 | 0x0F, - 32106 - 19968: jis0212<<14 | 0x32<<7 | 0x4B, - 32110 - 19968: jis0208<<14 | 0x44<<7 | 0x10, - 32112 - 19968: jis0212<<14 | 0x32<<7 | 0x4C, - 32113 - 19968: jis0208<<14 | 0x24<<7 | 0x5C, - 32114 - 19968: jis0208<<14 | 0x44<<7 | 0x0E, - 32115 - 19968: jis0208<<14 | 0x44<<7 | 0x0B, - 32117 - 19968: jis0208<<14 | 0x12<<7 | 0x07, - 32118 - 19968: jis0208<<14 | 0x1F<<7 | 0x43, - 32120 - 19968: jis0212<<14 | 0x32<<7 | 0x4D, - 32121 - 19968: jis0208<<14 | 0x17<<7 | 0x07, - 32122 - 19968: jis0212<<14 | 0x32<<7 | 0x4E, - 32123 - 19968: jis0212<<14 | 0x32<<7 | 0x4F, - 32125 - 19968: jis0208<<14 | 0x44<<7 | 0x17, - 32127 - 19968: jis0212<<14 | 0x32<<7 | 0x50, - 32129 - 19968: jis0212<<14 | 0x32<<7 | 0x51, - 32130 - 19968: jis0212<<14 | 0x32<<7 | 0x52, - 32131 - 19968: jis0212<<14 | 0x32<<7 | 0x53, - 32133 - 19968: jis0212<<14 | 0x32<<7 | 0x54, - 32134 - 19968: jis0212<<14 | 0x32<<7 | 0x55, - 32136 - 19968: jis0212<<14 | 0x32<<7 | 0x56, - 32137 - 19968: jis0208<<14 | 0x44<<7 | 0x14, - 32139 - 19968: jis0212<<14 | 0x32<<7 | 0x57, - 32140 - 19968: jis0212<<14 | 0x32<<7 | 0x58, - 32141 - 19968: jis0212<<14 | 0x32<<7 | 0x59, - 32143 - 19968: jis0208<<14 | 0x44<<7 | 0x16, - 32145 - 19968: jis0212<<14 | 0x32<<7 | 0x5A, - 32147 - 19968: jis0208<<14 | 0x44<<7 | 0x13, - 32150 - 19968: jis0212<<14 | 0x32<<7 | 0x5B, - 32151 - 19968: jis0212<<14 | 0x32<<7 | 0x5C, - 32153 - 19968: jis0208<<14 | 0x16<<7 | 0x30, - 32154 - 19968: jis0208<<14 | 0x21<<7 | 0x12, - 32155 - 19968: jis0208<<14 | 0x44<<7 | 0x18, - 32156 - 19968: jis0208<<14 | 0x20<<7 | 0x4D, - 32157 - 19968: jis0212<<14 | 0x32<<7 | 0x5D, - 32158 - 19968: jis0212<<14 | 0x33<<7 | 0x00, - 32159 - 19968: jis0208<<14 | 0x44<<7 | 0x25, - 32160 - 19968: jis0208<<14 | 0x5A<<7 | 0x30, - 32162 - 19968: jis0208<<14 | 0x44<<7 | 0x21, - 32163 - 19968: jis0208<<14 | 0x44<<7 | 0x1B, - 32166 - 19968: jis0212<<14 | 0x33<<7 | 0x01, - 32167 - 19968: jis0212<<14 | 0x33<<7 | 0x02, - 32170 - 19968: jis0212<<14 | 0x33<<7 | 0x03, - 32171 - 19968: jis0208<<14 | 0x44<<7 | 0x1F, - 32172 - 19968: jis0208<<14 | 0x1B<<7 | 0x59, - 32173 - 19968: jis0208<<14 | 0x0F<<7 | 0x3C, - 32174 - 19968: jis0208<<14 | 0x44<<7 | 0x1A, - 32175 - 19968: jis0208<<14 | 0x44<<7 | 0x22, - 32176 - 19968: jis0208<<14 | 0x44<<7 | 0x26, - 32177 - 19968: jis0208<<14 | 0x18<<7 | 0x2A, - 32178 - 19968: jis0208<<14 | 0x2B<<7 | 0x35, - 32179 - 19968: jis0212<<14 | 0x33<<7 | 0x04, - 32180 - 19968: jis0208<<14 | 0x23<<7 | 0x35, - 32181 - 19968: jis0208<<14 | 0x44<<7 | 0x1C, - 32182 - 19968: jis0212<<14 | 0x33<<7 | 0x05, - 32183 - 19968: jis0208<<14 | 0x5A<<7 | 0x2F, - 32184 - 19968: jis0208<<14 | 0x44<<7 | 0x24, - 32185 - 19968: jis0212<<14 | 0x33<<7 | 0x07, - 32186 - 19968: jis0208<<14 | 0x44<<7 | 0x19, - 32187 - 19968: jis0208<<14 | 0x22<<7 | 0x1D, - 32189 - 19968: jis0208<<14 | 0x44<<7 | 0x1E, - 32190 - 19968: jis0208<<14 | 0x0F<<7 | 0x1C, - 32191 - 19968: jis0208<<14 | 0x2B<<7 | 0x29, - 32194 - 19968: jis0212<<14 | 0x33<<7 | 0x08, - 32195 - 19968: jis0212<<14 | 0x33<<7 | 0x09, - 32196 - 19968: jis0212<<14 | 0x33<<7 | 0x0A, - 32197 - 19968: jis0212<<14 | 0x33<<7 | 0x0B, - 32198 - 19968: jis0212<<14 | 0x33<<7 | 0x0C, - 32199 - 19968: jis0208<<14 | 0x44<<7 | 0x1D, - 32202 - 19968: jis0208<<14 | 0x15<<7 | 0x3A, - 32203 - 19968: jis0208<<14 | 0x27<<7 | 0x4B, - 32204 - 19968: jis0212<<14 | 0x33<<7 | 0x0D, - 32205 - 19968: jis0212<<14 | 0x33<<7 | 0x0E, - 32206 - 19968: jis0212<<14 | 0x33<<7 | 0x0F, - 32207 - 19968: jis0208<<14 | 0x20<<7 | 0x4C, - 32209 - 19968: jis0208<<14 | 0x2D<<7 | 0x2F, - 32210 - 19968: jis0208<<14 | 0x1C<<7 | 0x4E, - 32213 - 19968: jis0208<<14 | 0x44<<7 | 0x4D, - 32214 - 19968: jis0208<<14 | 0x5A<<7 | 0x31, - 32215 - 19968: jis0212<<14 | 0x33<<7 | 0x10, - 32216 - 19968: jis0208<<14 | 0x44<<7 | 0x27, - 32217 - 19968: jis0212<<14 | 0x33<<7 | 0x11, - 32218 - 19968: jis0208<<14 | 0x1F<<7 | 0x5D, - 32220 - 19968: jis0208<<14 | 0x44<<7 | 0x23, - 32221 - 19968: jis0208<<14 | 0x44<<7 | 0x28, - 32222 - 19968: jis0208<<14 | 0x44<<7 | 0x2A, - 32224 - 19968: jis0208<<14 | 0x23<<7 | 0x58, - 32225 - 19968: jis0208<<14 | 0x44<<7 | 0x2D, - 32226 - 19968: jis0212<<14 | 0x33<<7 | 0x13, - 32228 - 19968: jis0208<<14 | 0x44<<7 | 0x29, - 32229 - 19968: jis0212<<14 | 0x33<<7 | 0x14, - 32230 - 19968: jis0212<<14 | 0x33<<7 | 0x15, - 32232 - 19968: jis0208<<14 | 0x29<<7 | 0x33, - 32233 - 19968: jis0208<<14 | 0x13<<7 | 0x2A, - 32234 - 19968: jis0212<<14 | 0x33<<7 | 0x16, - 32235 - 19968: jis0212<<14 | 0x33<<7 | 0x17, - 32236 - 19968: jis0208<<14 | 0x2B<<7 | 0x2A, - 32237 - 19968: jis0212<<14 | 0x33<<7 | 0x18, - 32239 - 19968: jis0208<<14 | 0x0F<<7 | 0x3D, - 32241 - 19968: jis0212<<14 | 0x33<<7 | 0x19, - 32242 - 19968: jis0208<<14 | 0x44<<7 | 0x2C, - 32244 - 19968: jis0208<<14 | 0x2D<<7 | 0x5C, - 32245 - 19968: jis0212<<14 | 0x33<<7 | 0x1A, - 32246 - 19968: jis0212<<14 | 0x33<<7 | 0x1B, - 32249 - 19968: jis0212<<14 | 0x33<<7 | 0x1C, - 32250 - 19968: jis0212<<14 | 0x33<<7 | 0x1D, - 32251 - 19968: jis0208<<14 | 0x44<<7 | 0x2B, - 32256 - 19968: jis0212<<14 | 0x33<<7 | 0x12, - 32257 - 19968: jis0208<<14 | 0x10<<7 | 0x4E, - 32260 - 19968: jis0208<<14 | 0x25<<7 | 0x4B, - 32261 - 19968: jis0208<<14 | 0x44<<7 | 0x2E, - 32264 - 19968: jis0212<<14 | 0x33<<7 | 0x1E, - 32265 - 19968: jis0208<<14 | 0x44<<7 | 0x35, - 32266 - 19968: jis0208<<14 | 0x44<<7 | 0x2F, - 32267 - 19968: jis0208<<14 | 0x44<<7 | 0x36, - 32272 - 19968: jis0212<<14 | 0x33<<7 | 0x1F, - 32273 - 19968: jis0212<<14 | 0x33<<7 | 0x20, - 32274 - 19968: jis0208<<14 | 0x44<<7 | 0x32, - 32277 - 19968: jis0212<<14 | 0x33<<7 | 0x21, - 32279 - 19968: jis0212<<14 | 0x33<<7 | 0x22, - 32283 - 19968: jis0208<<14 | 0x26<<7 | 0x5A, - 32284 - 19968: jis0212<<14 | 0x33<<7 | 0x23, - 32285 - 19968: jis0212<<14 | 0x33<<7 | 0x24, - 32286 - 19968: jis0208<<14 | 0x1B<<7 | 0x29, - 32287 - 19968: jis0208<<14 | 0x44<<7 | 0x34, - 32288 - 19968: jis0212<<14 | 0x33<<7 | 0x25, - 32289 - 19968: jis0208<<14 | 0x44<<7 | 0x31, - 32290 - 19968: jis0208<<14 | 0x44<<7 | 0x37, - 32291 - 19968: jis0208<<14 | 0x44<<7 | 0x30, - 32294 - 19968: jis0208<<14 | 0x1C<<7 | 0x23, - 32295 - 19968: jis0212<<14 | 0x33<<7 | 0x26, - 32296 - 19968: jis0212<<14 | 0x33<<7 | 0x27, - 32299 - 19968: jis0208<<14 | 0x2A<<7 | 0x04, - 32300 - 19968: jis0212<<14 | 0x33<<7 | 0x28, - 32301 - 19968: jis0212<<14 | 0x33<<7 | 0x29, - 32302 - 19968: jis0208<<14 | 0x1C<<7 | 0x2B, - 32303 - 19968: jis0212<<14 | 0x33<<7 | 0x2A, - 32305 - 19968: jis0208<<14 | 0x44<<7 | 0x33, - 32306 - 19968: jis0208<<14 | 0x44<<7 | 0x3F, - 32307 - 19968: jis0212<<14 | 0x33<<7 | 0x2B, - 32309 - 19968: jis0208<<14 | 0x44<<7 | 0x3B, - 32310 - 19968: jis0212<<14 | 0x33<<7 | 0x2C, - 32311 - 19968: jis0208<<14 | 0x44<<7 | 0x3E, - 32313 - 19968: jis0208<<14 | 0x44<<7 | 0x3C, - 32314 - 19968: jis0208<<14 | 0x44<<7 | 0x40, - 32315 - 19968: jis0208<<14 | 0x44<<7 | 0x3A, - 32317 - 19968: jis0208<<14 | 0x44<<7 | 0x20, - 32318 - 19968: jis0208<<14 | 0x1F<<7 | 0x32, - 32319 - 19968: jis0212<<14 | 0x33<<7 | 0x2D, - 32321 - 19968: jis0208<<14 | 0x27<<7 | 0x2A, - 32323 - 19968: jis0208<<14 | 0x44<<7 | 0x3D, - 32324 - 19968: jis0212<<14 | 0x33<<7 | 0x2E, - 32325 - 19968: jis0212<<14 | 0x33<<7 | 0x2F, - 32326 - 19968: jis0208<<14 | 0x44<<7 | 0x38, - 32327 - 19968: jis0212<<14 | 0x33<<7 | 0x30, - 32330 - 19968: jis0208<<14 | 0x20<<7 | 0x00, - 32331 - 19968: jis0208<<14 | 0x16<<7 | 0x31, - 32333 - 19968: jis0208<<14 | 0x1C<<7 | 0x0A, - 32334 - 19968: jis0212<<14 | 0x33<<7 | 0x31, - 32336 - 19968: jis0212<<14 | 0x33<<7 | 0x32, - 32338 - 19968: jis0208<<14 | 0x5A<<7 | 0x32, - 32340 - 19968: jis0208<<14 | 0x1E<<7 | 0x04, - 32341 - 19968: jis0208<<14 | 0x20<<7 | 0x15, - 32342 - 19968: jis0208<<14 | 0x44<<7 | 0x43, - 32344 - 19968: jis0212<<14 | 0x33<<7 | 0x34, - 32345 - 19968: jis0208<<14 | 0x44<<7 | 0x45, - 32346 - 19968: jis0208<<14 | 0x44<<7 | 0x46, - 32349 - 19968: jis0208<<14 | 0x44<<7 | 0x42, - 32350 - 19968: jis0208<<14 | 0x44<<7 | 0x44, - 32351 - 19968: jis0212<<14 | 0x33<<7 | 0x35, - 32353 - 19968: jis0212<<14 | 0x33<<7 | 0x36, - 32354 - 19968: jis0212<<14 | 0x33<<7 | 0x37, - 32357 - 19968: jis0212<<14 | 0x33<<7 | 0x38, - 32358 - 19968: jis0208<<14 | 0x44<<7 | 0x39, - 32359 - 19968: jis0208<<14 | 0x44<<7 | 0x41, - 32361 - 19968: jis0208<<14 | 0x44<<7 | 0x49, - 32362 - 19968: jis0208<<14 | 0x44<<7 | 0x48, - 32363 - 19968: jis0212<<14 | 0x33<<7 | 0x39, - 32365 - 19968: jis0208<<14 | 0x2A<<7 | 0x59, - 32366 - 19968: jis0212<<14 | 0x33<<7 | 0x3A, - 32367 - 19968: jis0212<<14 | 0x33<<7 | 0x3B, - 32368 - 19968: jis0208<<14 | 0x16<<7 | 0x0A, - 32371 - 19968: jis0212<<14 | 0x33<<7 | 0x3C, - 32376 - 19968: jis0212<<14 | 0x33<<7 | 0x3D, - 32377 - 19968: jis0208<<14 | 0x44<<7 | 0x47, - 32379 - 19968: jis0208<<14 | 0x44<<7 | 0x4B, - 32380 - 19968: jis0208<<14 | 0x44<<7 | 0x4A, - 32381 - 19968: jis0208<<14 | 0x44<<7 | 0x4E, - 32382 - 19968: jis0212<<14 | 0x33<<7 | 0x3E, - 32383 - 19968: jis0208<<14 | 0x44<<7 | 0x50, - 32385 - 19968: jis0212<<14 | 0x33<<7 | 0x3F, - 32386 - 19968: jis0208<<14 | 0x1A<<7 | 0x1B, - 32387 - 19968: jis0208<<14 | 0x44<<7 | 0x4C, - 32390 - 19968: jis0212<<14 | 0x33<<7 | 0x40, - 32391 - 19968: jis0212<<14 | 0x33<<7 | 0x41, - 32392 - 19968: jis0208<<14 | 0x44<<7 | 0x51, - 32393 - 19968: jis0208<<14 | 0x44<<7 | 0x52, - 32394 - 19968: jis0208<<14 | 0x58<<7 | 0x00, - 32396 - 19968: jis0208<<14 | 0x44<<7 | 0x53, - 32397 - 19968: jis0212<<14 | 0x33<<7 | 0x43, - 32398 - 19968: jis0208<<14 | 0x44<<7 | 0x59, - 32399 - 19968: jis0208<<14 | 0x24<<7 | 0x1A, - 32400 - 19968: jis0208<<14 | 0x44<<7 | 0x55, - 32401 - 19968: jis0212<<14 | 0x33<<7 | 0x44, - 32402 - 19968: jis0208<<14 | 0x44<<7 | 0x54, - 32403 - 19968: jis0208<<14 | 0x44<<7 | 0x56, - 32404 - 19968: jis0208<<14 | 0x44<<7 | 0x57, - 32405 - 19968: jis0212<<14 | 0x33<<7 | 0x45, - 32406 - 19968: jis0208<<14 | 0x44<<7 | 0x58, - 32408 - 19968: jis0212<<14 | 0x33<<7 | 0x46, - 32410 - 19968: jis0212<<14 | 0x33<<7 | 0x47, - 32411 - 19968: jis0208<<14 | 0x44<<7 | 0x5A, - 32412 - 19968: jis0208<<14 | 0x44<<7 | 0x5B, - 32413 - 19968: jis0212<<14 | 0x33<<7 | 0x48, - 32414 - 19968: jis0212<<14 | 0x33<<7 | 0x49, - 32566 - 19968: jis0208<<14 | 0x13<<7 | 0x2B, - 32568 - 19968: jis0208<<14 | 0x44<<7 | 0x5C, - 32570 - 19968: jis0208<<14 | 0x44<<7 | 0x5D, - 32571 - 19968: jis0212<<14 | 0x33<<7 | 0x4B, - 32572 - 19968: jis0212<<14 | 0x33<<7 | 0x4A, - 32573 - 19968: jis0212<<14 | 0x33<<7 | 0x4C, - 32574 - 19968: jis0212<<14 | 0x33<<7 | 0x4D, - 32575 - 19968: jis0212<<14 | 0x33<<7 | 0x4E, - 32579 - 19968: jis0212<<14 | 0x33<<7 | 0x4F, - 32580 - 19968: jis0212<<14 | 0x33<<7 | 0x50, - 32581 - 19968: jis0208<<14 | 0x45<<7 | 0x00, - 32583 - 19968: jis0208<<14 | 0x5A<<7 | 0x33, - 32588 - 19968: jis0208<<14 | 0x45<<7 | 0x01, - 32589 - 19968: jis0208<<14 | 0x45<<7 | 0x02, - 32590 - 19968: jis0208<<14 | 0x45<<7 | 0x03, - 32591 - 19968: jis0212<<14 | 0x33<<7 | 0x52, - 32592 - 19968: jis0208<<14 | 0x45<<7 | 0x04, - 32593 - 19968: jis0208<<14 | 0x45<<7 | 0x05, - 32594 - 19968: jis0212<<14 | 0x33<<7 | 0x53, - 32595 - 19968: jis0212<<14 | 0x33<<7 | 0x54, - 32596 - 19968: jis0208<<14 | 0x45<<7 | 0x07, - 32597 - 19968: jis0208<<14 | 0x45<<7 | 0x06, - 32600 - 19968: jis0208<<14 | 0x45<<7 | 0x08, - 32603 - 19968: jis0212<<14 | 0x33<<7 | 0x55, - 32604 - 19968: jis0212<<14 | 0x33<<7 | 0x56, - 32605 - 19968: jis0212<<14 | 0x33<<7 | 0x57, - 32607 - 19968: jis0208<<14 | 0x45<<7 | 0x09, - 32608 - 19968: jis0208<<14 | 0x45<<7 | 0x0A, - 32609 - 19968: jis0212<<14 | 0x33<<7 | 0x58, - 32611 - 19968: jis0212<<14 | 0x33<<7 | 0x59, - 32612 - 19968: jis0212<<14 | 0x33<<7 | 0x5A, - 32613 - 19968: jis0212<<14 | 0x33<<7 | 0x5B, - 32614 - 19968: jis0212<<14 | 0x33<<7 | 0x5C, - 32615 - 19968: jis0208<<14 | 0x45<<7 | 0x0D, - 32616 - 19968: jis0208<<14 | 0x45<<7 | 0x0B, - 32617 - 19968: jis0208<<14 | 0x45<<7 | 0x0C, - 32618 - 19968: jis0208<<14 | 0x19<<7 | 0x40, - 32619 - 19968: jis0208<<14 | 0x16<<7 | 0x32, - 32621 - 19968: jis0212<<14 | 0x33<<7 | 0x5D, - 32622 - 19968: jis0208<<14 | 0x22<<7 | 0x35, - 32624 - 19968: jis0208<<14 | 0x27<<7 | 0x12, - 32625 - 19968: jis0212<<14 | 0x34<<7 | 0x00, - 32626 - 19968: jis0208<<14 | 0x1C<<7 | 0x4F, - 32629 - 19968: jis0208<<14 | 0x26<<7 | 0x2C, - 32631 - 19968: jis0208<<14 | 0x27<<7 | 0x4C, - 32632 - 19968: jis0208<<14 | 0x45<<7 | 0x0E, - 32633 - 19968: jis0208<<14 | 0x37<<7 | 0x4C, - 32637 - 19968: jis0212<<14 | 0x34<<7 | 0x01, - 32638 - 19968: jis0212<<14 | 0x34<<7 | 0x02, - 32639 - 19968: jis0212<<14 | 0x34<<7 | 0x03, - 32640 - 19968: jis0212<<14 | 0x34<<7 | 0x04, - 32642 - 19968: jis0208<<14 | 0x45<<7 | 0x0F, - 32643 - 19968: jis0208<<14 | 0x45<<7 | 0x11, - 32645 - 19968: jis0208<<14 | 0x2C<<7 | 0x44, - 32646 - 19968: jis0208<<14 | 0x45<<7 | 0x10, - 32647 - 19968: jis0208<<14 | 0x45<<7 | 0x13, - 32648 - 19968: jis0208<<14 | 0x45<<7 | 0x12, - 32650 - 19968: jis0208<<14 | 0x2C<<7 | 0x32, - 32651 - 19968: jis0212<<14 | 0x34<<7 | 0x05, - 32652 - 19968: jis0208<<14 | 0x45<<7 | 0x14, - 32653 - 19968: jis0212<<14 | 0x34<<7 | 0x06, - 32654 - 19968: jis0208<<14 | 0x27<<7 | 0x5D, - 32655 - 19968: jis0212<<14 | 0x34<<7 | 0x07, - 32656 - 19968: jis0212<<14 | 0x34<<7 | 0x08, - 32657 - 19968: jis0212<<14 | 0x34<<7 | 0x09, - 32660 - 19968: jis0208<<14 | 0x45<<7 | 0x15, - 32662 - 19968: jis0212<<14 | 0x34<<7 | 0x0A, - 32663 - 19968: jis0212<<14 | 0x34<<7 | 0x0B, - 32666 - 19968: jis0208<<14 | 0x45<<7 | 0x18, - 32668 - 19968: jis0212<<14 | 0x34<<7 | 0x0C, - 32669 - 19968: jis0208<<14 | 0x45<<7 | 0x17, - 32670 - 19968: jis0208<<14 | 0x45<<7 | 0x16, - 32673 - 19968: jis0208<<14 | 0x5A<<7 | 0x34, - 32674 - 19968: jis0212<<14 | 0x34<<7 | 0x0E, - 32675 - 19968: jis0208<<14 | 0x45<<7 | 0x19, - 32676 - 19968: jis0208<<14 | 0x16<<7 | 0x11, - 32678 - 19968: jis0212<<14 | 0x34<<7 | 0x0F, - 32680 - 19968: jis0208<<14 | 0x20<<7 | 0x01, - 32681 - 19968: jis0208<<14 | 0x14<<7 | 0x20, - 32682 - 19968: jis0212<<14 | 0x34<<7 | 0x10, - 32685 - 19968: jis0212<<14 | 0x34<<7 | 0x11, - 32686 - 19968: jis0208<<14 | 0x45<<7 | 0x1D, - 32687 - 19968: jis0208<<14 | 0x45<<7 | 0x1A, - 32690 - 19968: jis0208<<14 | 0x45<<7 | 0x1B, - 32692 - 19968: jis0212<<14 | 0x34<<7 | 0x12, - 32694 - 19968: jis0208<<14 | 0x45<<7 | 0x1E, - 32696 - 19968: jis0208<<14 | 0x45<<7 | 0x1F, - 32697 - 19968: jis0208<<14 | 0x45<<7 | 0x1C, - 32700 - 19968: jis0212<<14 | 0x34<<7 | 0x13, - 32701 - 19968: jis0208<<14 | 0x10<<7 | 0x08, - 32703 - 19968: jis0212<<14 | 0x34<<7 | 0x14, - 32704 - 19968: jis0212<<14 | 0x34<<7 | 0x15, - 32705 - 19968: jis0208<<14 | 0x11<<7 | 0x06, - 32707 - 19968: jis0212<<14 | 0x34<<7 | 0x16, - 32709 - 19968: jis0208<<14 | 0x45<<7 | 0x21, - 32710 - 19968: jis0208<<14 | 0x45<<7 | 0x22, - 32712 - 19968: jis0212<<14 | 0x34<<7 | 0x17, - 32714 - 19968: jis0208<<14 | 0x45<<7 | 0x23, - 32716 - 19968: jis0208<<14 | 0x2C<<7 | 0x41, - 32718 - 19968: jis0212<<14 | 0x34<<7 | 0x18, - 32719 - 19968: jis0212<<14 | 0x34<<7 | 0x19, - 32722 - 19968: jis0208<<14 | 0x1C<<7 | 0x0B, - 32724 - 19968: jis0208<<14 | 0x45<<7 | 0x25, - 32725 - 19968: jis0208<<14 | 0x45<<7 | 0x24, - 32731 - 19968: jis0212<<14 | 0x34<<7 | 0x1A, - 32735 - 19968: jis0212<<14 | 0x34<<7 | 0x1B, - 32736 - 19968: jis0208<<14 | 0x1E<<7 | 0x48, - 32737 - 19968: jis0208<<14 | 0x45<<7 | 0x26, - 32739 - 19968: jis0212<<14 | 0x34<<7 | 0x1C, - 32741 - 19968: jis0212<<14 | 0x34<<7 | 0x1D, - 32742 - 19968: jis0208<<14 | 0x45<<7 | 0x27, - 32744 - 19968: jis0212<<14 | 0x34<<7 | 0x1E, - 32745 - 19968: jis0208<<14 | 0x45<<7 | 0x28, - 32747 - 19968: jis0208<<14 | 0x13<<7 | 0x44, - 32748 - 19968: jis0212<<14 | 0x34<<7 | 0x1F, - 32750 - 19968: jis0212<<14 | 0x34<<7 | 0x20, - 32751 - 19968: jis0212<<14 | 0x34<<7 | 0x21, - 32752 - 19968: jis0208<<14 | 0x13<<7 | 0x2C, - 32754 - 19968: jis0212<<14 | 0x34<<7 | 0x22, - 32755 - 19968: jis0208<<14 | 0x45<<7 | 0x29, - 32761 - 19968: jis0208<<14 | 0x45<<7 | 0x2A, - 32762 - 19968: jis0212<<14 | 0x34<<7 | 0x23, - 32763 - 19968: jis0208<<14 | 0x2A<<7 | 0x3C, - 32764 - 19968: jis0208<<14 | 0x2C<<7 | 0x42, - 32765 - 19968: jis0212<<14 | 0x34<<7 | 0x24, - 32766 - 19968: jis0212<<14 | 0x34<<7 | 0x25, - 32767 - 19968: jis0212<<14 | 0x34<<7 | 0x26, - 32768 - 19968: jis0208<<14 | 0x2C<<7 | 0x33, - 32769 - 19968: jis0208<<14 | 0x2E<<7 | 0x16, - 32771 - 19968: jis0208<<14 | 0x18<<7 | 0x2C, - 32772 - 19968: jis0208<<14 | 0x45<<7 | 0x2D, - 32773 - 19968: jis0208<<14 | 0x1B<<7 | 0x33, - 32774 - 19968: jis0208<<14 | 0x45<<7 | 0x2C, - 32775 - 19968: jis0212<<14 | 0x34<<7 | 0x27, - 32776 - 19968: jis0212<<14 | 0x34<<7 | 0x28, - 32778 - 19968: jis0212<<14 | 0x34<<7 | 0x29, - 32779 - 19968: jis0208<<14 | 0x45<<7 | 0x2E, - 32780 - 19968: jis0208<<14 | 0x1B<<7 | 0x08, - 32781 - 19968: jis0212<<14 | 0x34<<7 | 0x2A, - 32782 - 19968: jis0212<<14 | 0x34<<7 | 0x2B, - 32783 - 19968: jis0212<<14 | 0x34<<7 | 0x2C, - 32784 - 19968: jis0208<<14 | 0x21<<7 | 0x30, - 32785 - 19968: jis0212<<14 | 0x34<<7 | 0x2D, - 32786 - 19968: jis0208<<14 | 0x45<<7 | 0x2F, - 32787 - 19968: jis0212<<14 | 0x34<<7 | 0x2E, - 32788 - 19968: jis0212<<14 | 0x34<<7 | 0x2F, - 32789 - 19968: jis0208<<14 | 0x18<<7 | 0x2B, - 32790 - 19968: jis0212<<14 | 0x34<<7 | 0x30, - 32791 - 19968: jis0208<<14 | 0x2B<<7 | 0x36, - 32792 - 19968: jis0208<<14 | 0x45<<7 | 0x30, - 32793 - 19968: jis0208<<14 | 0x45<<7 | 0x31, - 32796 - 19968: jis0208<<14 | 0x45<<7 | 0x32, - 32797 - 19968: jis0212<<14 | 0x34<<7 | 0x31, - 32798 - 19968: jis0212<<14 | 0x34<<7 | 0x32, - 32799 - 19968: jis0212<<14 | 0x34<<7 | 0x33, - 32800 - 19968: jis0212<<14 | 0x34<<7 | 0x34, - 32801 - 19968: jis0208<<14 | 0x45<<7 | 0x33, - 32804 - 19968: jis0212<<14 | 0x34<<7 | 0x35, - 32806 - 19968: jis0212<<14 | 0x34<<7 | 0x36, - 32808 - 19968: jis0208<<14 | 0x45<<7 | 0x34, - 32812 - 19968: jis0212<<14 | 0x34<<7 | 0x37, - 32814 - 19968: jis0212<<14 | 0x34<<7 | 0x38, - 32816 - 19968: jis0212<<14 | 0x34<<7 | 0x39, - 32819 - 19968: jis0208<<14 | 0x1B<<7 | 0x09, - 32820 - 19968: jis0212<<14 | 0x34<<7 | 0x3A, - 32821 - 19968: jis0212<<14 | 0x34<<7 | 0x3B, - 32822 - 19968: jis0208<<14 | 0x2B<<7 | 0x4C, - 32823 - 19968: jis0212<<14 | 0x34<<7 | 0x3C, - 32825 - 19968: jis0212<<14 | 0x34<<7 | 0x3D, - 32826 - 19968: jis0212<<14 | 0x34<<7 | 0x3E, - 32827 - 19968: jis0208<<14 | 0x45<<7 | 0x36, - 32828 - 19968: jis0212<<14 | 0x34<<7 | 0x3F, - 32829 - 19968: jis0208<<14 | 0x22<<7 | 0x1E, - 32830 - 19968: jis0212<<14 | 0x34<<7 | 0x40, - 32831 - 19968: jis0208<<14 | 0x45<<7 | 0x35, - 32832 - 19968: jis0212<<14 | 0x34<<7 | 0x41, - 32836 - 19968: jis0212<<14 | 0x34<<7 | 0x42, - 32838 - 19968: jis0208<<14 | 0x45<<7 | 0x38, - 32842 - 19968: jis0208<<14 | 0x45<<7 | 0x37, - 32850 - 19968: jis0208<<14 | 0x45<<7 | 0x39, - 32854 - 19968: jis0208<<14 | 0x1F<<7 | 0x1A, - 32856 - 19968: jis0208<<14 | 0x45<<7 | 0x3A, - 32858 - 19968: jis0208<<14 | 0x45<<7 | 0x3B, - 32862 - 19968: jis0208<<14 | 0x29<<7 | 0x18, - 32863 - 19968: jis0208<<14 | 0x45<<7 | 0x3C, - 32864 - 19968: jis0212<<14 | 0x34<<7 | 0x43, - 32865 - 19968: jis0208<<14 | 0x20<<7 | 0x4E, - 32866 - 19968: jis0208<<14 | 0x45<<7 | 0x3D, - 32868 - 19968: jis0212<<14 | 0x34<<7 | 0x44, - 32870 - 19968: jis0212<<14 | 0x34<<7 | 0x45, - 32872 - 19968: jis0208<<14 | 0x45<<7 | 0x3E, - 32877 - 19968: jis0212<<14 | 0x34<<7 | 0x46, - 32879 - 19968: jis0208<<14 | 0x2D<<7 | 0x5D, - 32880 - 19968: jis0208<<14 | 0x45<<7 | 0x41, - 32881 - 19968: jis0212<<14 | 0x34<<7 | 0x47, - 32882 - 19968: jis0208<<14 | 0x45<<7 | 0x40, - 32883 - 19968: jis0208<<14 | 0x45<<7 | 0x3F, - 32884 - 19968: jis0208<<14 | 0x23<<7 | 0x0F, - 32885 - 19968: jis0212<<14 | 0x34<<7 | 0x48, - 32886 - 19968: jis0208<<14 | 0x45<<7 | 0x42, - 32887 - 19968: jis0208<<14 | 0x1E<<7 | 0x05, - 32889 - 19968: jis0208<<14 | 0x45<<7 | 0x43, - 32893 - 19968: jis0208<<14 | 0x45<<7 | 0x44, - 32894 - 19968: jis0208<<14 | 0x2E<<7 | 0x17, - 32895 - 19968: jis0208<<14 | 0x45<<7 | 0x45, - 32897 - 19968: jis0212<<14 | 0x34<<7 | 0x49, - 32900 - 19968: jis0208<<14 | 0x45<<7 | 0x46, - 32901 - 19968: jis0208<<14 | 0x45<<7 | 0x48, - 32902 - 19968: jis0208<<14 | 0x45<<7 | 0x47, - 32903 - 19968: jis0208<<14 | 0x27<<7 | 0x04, - 32904 - 19968: jis0212<<14 | 0x34<<7 | 0x4A, - 32905 - 19968: jis0208<<14 | 0x25<<7 | 0x58, - 32907 - 19968: jis0208<<14 | 0x2E<<7 | 0x1D, - 32908 - 19968: jis0208<<14 | 0x27<<7 | 0x08, - 32910 - 19968: jis0212<<14 | 0x34<<7 | 0x4B, - 32915 - 19968: jis0208<<14 | 0x45<<7 | 0x4A, - 32918 - 19968: jis0208<<14 | 0x1D<<7 | 0x32, - 32920 - 19968: jis0208<<14 | 0x28<<7 | 0x09, - 32922 - 19968: jis0208<<14 | 0x45<<7 | 0x4B, - 32923 - 19968: jis0208<<14 | 0x45<<7 | 0x49, - 32924 - 19968: jis0212<<14 | 0x34<<7 | 0x4C, - 32925 - 19968: jis0208<<14 | 0x13<<7 | 0x2D, - 32926 - 19968: jis0212<<14 | 0x34<<7 | 0x4D, - 32929 - 19968: jis0208<<14 | 0x17<<7 | 0x33, - 32930 - 19968: jis0208<<14 | 0x1A<<7 | 0x47, - 32933 - 19968: jis0208<<14 | 0x27<<7 | 0x4D, - 32934 - 19968: jis0212<<14 | 0x34<<7 | 0x4E, - 32935 - 19968: jis0212<<14 | 0x34<<7 | 0x4F, - 32937 - 19968: jis0208<<14 | 0x17<<7 | 0x09, - 32938 - 19968: jis0208<<14 | 0x2A<<7 | 0x22, - 32939 - 19968: jis0212<<14 | 0x34<<7 | 0x50, - 32940 - 19968: jis0208<<14 | 0x45<<7 | 0x4E, - 32941 - 19968: jis0208<<14 | 0x45<<7 | 0x4C, - 32943 - 19968: jis0208<<14 | 0x18<<7 | 0x2D, - 32945 - 19968: jis0208<<14 | 0x18<<7 | 0x2E, - 32946 - 19968: jis0208<<14 | 0x0F<<7 | 0x48, - 32948 - 19968: jis0208<<14 | 0x19<<7 | 0x47, - 32952 - 19968: jis0212<<14 | 0x34<<7 | 0x51, - 32953 - 19968: jis0212<<14 | 0x34<<7 | 0x52, - 32954 - 19968: jis0208<<14 | 0x26<<7 | 0x38, - 32963 - 19968: jis0208<<14 | 0x0F<<7 | 0x3E, - 32964 - 19968: jis0208<<14 | 0x45<<7 | 0x53, - 32966 - 19968: jis0208<<14 | 0x22<<7 | 0x1F, - 32968 - 19968: jis0212<<14 | 0x34<<7 | 0x53, - 32972 - 19968: jis0208<<14 | 0x26<<7 | 0x37, - 32973 - 19968: jis0212<<14 | 0x34<<7 | 0x54, - 32974 - 19968: jis0208<<14 | 0x21<<7 | 0x3A, - 32975 - 19968: jis0212<<14 | 0x34<<7 | 0x55, - 32978 - 19968: jis0212<<14 | 0x34<<7 | 0x56, - 32980 - 19968: jis0212<<14 | 0x34<<7 | 0x57, - 32981 - 19968: jis0212<<14 | 0x34<<7 | 0x58, - 32982 - 19968: jis0208<<14 | 0x45<<7 | 0x55, - 32983 - 19968: jis0212<<14 | 0x34<<7 | 0x59, - 32984 - 19968: jis0212<<14 | 0x34<<7 | 0x5A, - 32985 - 19968: jis0208<<14 | 0x45<<7 | 0x51, - 32986 - 19968: jis0208<<14 | 0x45<<7 | 0x54, - 32987 - 19968: jis0208<<14 | 0x45<<7 | 0x4F, - 32989 - 19968: jis0208<<14 | 0x45<<7 | 0x52, - 32990 - 19968: jis0208<<14 | 0x2A<<7 | 0x05, - 32992 - 19968: jis0212<<14 | 0x34<<7 | 0x5B, - 32993 - 19968: jis0208<<14 | 0x17<<7 | 0x34, - 32996 - 19968: jis0208<<14 | 0x0F<<7 | 0x5C, - 32997 - 19968: jis0208<<14 | 0x45<<7 | 0x50, - 33005 - 19968: jis0212<<14 | 0x34<<7 | 0x5C, - 33006 - 19968: jis0212<<14 | 0x34<<7 | 0x5D, - 33007 - 19968: jis0208<<14 | 0x45<<7 | 0x57, - 33008 - 19968: jis0212<<14 | 0x35<<7 | 0x00, - 33009 - 19968: jis0208<<14 | 0x45<<7 | 0x58, - 33010 - 19968: jis0212<<14 | 0x35<<7 | 0x01, - 33011 - 19968: jis0212<<14 | 0x35<<7 | 0x02, - 33012 - 19968: jis0208<<14 | 0x25<<7 | 0x18, - 33014 - 19968: jis0212<<14 | 0x35<<7 | 0x03, - 33016 - 19968: jis0208<<14 | 0x15<<7 | 0x1A, - 33017 - 19968: jis0212<<14 | 0x35<<7 | 0x04, - 33018 - 19968: jis0212<<14 | 0x35<<7 | 0x05, - 33020 - 19968: jis0208<<14 | 0x46<<7 | 0x05, - 33021 - 19968: jis0208<<14 | 0x26<<7 | 0x1C, - 33022 - 19968: jis0212<<14 | 0x35<<7 | 0x06, - 33026 - 19968: jis0208<<14 | 0x1A<<7 | 0x48, - 33027 - 19968: jis0212<<14 | 0x35<<7 | 0x07, - 33029 - 19968: jis0208<<14 | 0x15<<7 | 0x1B, - 33030 - 19968: jis0208<<14 | 0x1F<<7 | 0x27, - 33031 - 19968: jis0208<<14 | 0x2E<<7 | 0x25, - 33032 - 19968: jis0208<<14 | 0x2B<<7 | 0x0D, - 33033 - 19968: jis0208<<14 | 0x45<<7 | 0x56, - 33034 - 19968: jis0208<<14 | 0x1F<<7 | 0x33, - 33035 - 19968: jis0212<<14 | 0x35<<7 | 0x08, - 33046 - 19968: jis0212<<14 | 0x35<<7 | 0x09, - 33047 - 19968: jis0212<<14 | 0x35<<7 | 0x0A, - 33048 - 19968: jis0212<<14 | 0x35<<7 | 0x0B, - 33050 - 19968: jis0208<<14 | 0x14<<7 | 0x32, - 33051 - 19968: jis0208<<14 | 0x45<<7 | 0x59, - 33052 - 19968: jis0212<<14 | 0x35<<7 | 0x0C, - 33054 - 19968: jis0212<<14 | 0x35<<7 | 0x0D, - 33056 - 19968: jis0212<<14 | 0x35<<7 | 0x0E, - 33059 - 19968: jis0208<<14 | 0x45<<7 | 0x5B, - 33060 - 19968: jis0212<<14 | 0x35<<7 | 0x0F, - 33063 - 19968: jis0212<<14 | 0x35<<7 | 0x10, - 33065 - 19968: jis0208<<14 | 0x45<<7 | 0x5A, - 33068 - 19968: jis0212<<14 | 0x35<<7 | 0x11, - 33071 - 19968: jis0208<<14 | 0x45<<7 | 0x5C, - 33072 - 19968: jis0212<<14 | 0x35<<7 | 0x12, - 33073 - 19968: jis0208<<14 | 0x22<<7 | 0x05, - 33075 - 19968: jis0208<<14 | 0x26<<7 | 0x1D, - 33077 - 19968: jis0212<<14 | 0x35<<7 | 0x13, - 33081 - 19968: jis0208<<14 | 0x23<<7 | 0x10, - 33082 - 19968: jis0212<<14 | 0x35<<7 | 0x14, - 33084 - 19968: jis0212<<14 | 0x35<<7 | 0x15, - 33086 - 19968: jis0208<<14 | 0x46<<7 | 0x02, - 33093 - 19968: jis0212<<14 | 0x35<<7 | 0x16, - 33094 - 19968: jis0208<<14 | 0x46<<7 | 0x01, - 33095 - 19968: jis0212<<14 | 0x35<<7 | 0x17, - 33098 - 19968: jis0212<<14 | 0x35<<7 | 0x18, - 33099 - 19968: jis0208<<14 | 0x45<<7 | 0x5D, - 33100 - 19968: jis0212<<14 | 0x35<<7 | 0x19, - 33102 - 19968: jis0208<<14 | 0x1E<<7 | 0x34, - 33104 - 19968: jis0208<<14 | 0x28<<7 | 0x44, - 33105 - 19968: jis0208<<14 | 0x46<<7 | 0x04, - 33106 - 19968: jis0212<<14 | 0x35<<7 | 0x1A, - 33107 - 19968: jis0208<<14 | 0x46<<7 | 0x03, - 33108 - 19968: jis0208<<14 | 0x18<<7 | 0x2F, - 33109 - 19968: jis0208<<14 | 0x2E<<7 | 0x32, - 33111 - 19968: jis0212<<14 | 0x35<<7 | 0x1B, - 33119 - 19968: jis0208<<14 | 0x46<<7 | 0x14, - 33120 - 19968: jis0212<<14 | 0x35<<7 | 0x1C, - 33121 - 19968: jis0212<<14 | 0x35<<7 | 0x1D, - 33125 - 19968: jis0208<<14 | 0x46<<7 | 0x08, - 33126 - 19968: jis0208<<14 | 0x46<<7 | 0x09, - 33127 - 19968: jis0212<<14 | 0x35<<7 | 0x1E, - 33128 - 19968: jis0212<<14 | 0x35<<7 | 0x1F, - 33129 - 19968: jis0212<<14 | 0x35<<7 | 0x20, - 33131 - 19968: jis0208<<14 | 0x1B<<7 | 0x4F, - 33133 - 19968: jis0212<<14 | 0x35<<7 | 0x21, - 33134 - 19968: jis0208<<14 | 0x46<<7 | 0x07, - 33135 - 19968: jis0212<<14 | 0x35<<7 | 0x22, - 33136 - 19968: jis0208<<14 | 0x18<<7 | 0x57, - 33137 - 19968: jis0208<<14 | 0x46<<7 | 0x06, - 33140 - 19968: jis0208<<14 | 0x46<<7 | 0x0A, - 33143 - 19968: jis0212<<14 | 0x35<<7 | 0x23, - 33144 - 19968: jis0208<<14 | 0x23<<7 | 0x11, - 33145 - 19968: jis0208<<14 | 0x29<<7 | 0x01, - 33146 - 19968: jis0208<<14 | 0x20<<7 | 0x02, - 33151 - 19968: jis0208<<14 | 0x21<<7 | 0x3B, - 33152 - 19968: jis0208<<14 | 0x46<<7 | 0x0E, - 33153 - 19968: jis0212<<14 | 0x35<<7 | 0x24, - 33154 - 19968: jis0208<<14 | 0x46<<7 | 0x0F, - 33155 - 19968: jis0208<<14 | 0x46<<7 | 0x0B, - 33156 - 19968: jis0212<<14 | 0x35<<7 | 0x26, - 33157 - 19968: jis0212<<14 | 0x35<<7 | 0x27, - 33158 - 19968: jis0212<<14 | 0x35<<7 | 0x28, - 33160 - 19968: jis0208<<14 | 0x46<<7 | 0x0C, - 33162 - 19968: jis0208<<14 | 0x46<<7 | 0x0D, - 33163 - 19968: jis0212<<14 | 0x35<<7 | 0x29, - 33166 - 19968: jis0212<<14 | 0x35<<7 | 0x2A, - 33167 - 19968: jis0208<<14 | 0x18<<7 | 0x30, - 33168 - 19968: jis0212<<14 | 0x35<<7 | 0x25, - 33171 - 19968: jis0208<<14 | 0x46<<7 | 0x15, - 33173 - 19968: jis0208<<14 | 0x46<<7 | 0x11, - 33174 - 19968: jis0212<<14 | 0x35<<7 | 0x2B, - 33176 - 19968: jis0212<<14 | 0x35<<7 | 0x2C, - 33178 - 19968: jis0208<<14 | 0x28<<7 | 0x45, - 33179 - 19968: jis0212<<14 | 0x35<<7 | 0x2D, - 33180 - 19968: jis0208<<14 | 0x2A<<7 | 0x4B, - 33181 - 19968: jis0208<<14 | 0x28<<7 | 0x07, - 33182 - 19968: jis0212<<14 | 0x35<<7 | 0x2E, - 33184 - 19968: jis0208<<14 | 0x46<<7 | 0x10, - 33186 - 19968: jis0212<<14 | 0x35<<7 | 0x2F, - 33187 - 19968: jis0208<<14 | 0x46<<7 | 0x13, - 33188 - 19968: jis0208<<14 | 0x46<<7 | 0x12, - 33192 - 19968: jis0208<<14 | 0x2A<<7 | 0x23, - 33193 - 19968: jis0208<<14 | 0x46<<7 | 0x16, - 33198 - 19968: jis0212<<14 | 0x35<<7 | 0x30, - 33200 - 19968: jis0208<<14 | 0x46<<7 | 0x17, - 33202 - 19968: jis0212<<14 | 0x35<<7 | 0x31, - 33203 - 19968: jis0208<<14 | 0x20<<7 | 0x16, - 33204 - 19968: jis0212<<14 | 0x35<<7 | 0x32, - 33205 - 19968: jis0208<<14 | 0x46<<7 | 0x18, - 33208 - 19968: jis0208<<14 | 0x46<<7 | 0x1A, - 33210 - 19968: jis0208<<14 | 0x46<<7 | 0x1E, - 33211 - 19968: jis0212<<14 | 0x35<<7 | 0x33, - 33213 - 19968: jis0208<<14 | 0x46<<7 | 0x1B, - 33214 - 19968: jis0208<<14 | 0x46<<7 | 0x19, - 33215 - 19968: jis0208<<14 | 0x26<<7 | 0x1E, - 33216 - 19968: jis0208<<14 | 0x46<<7 | 0x1C, - 33218 - 19968: jis0208<<14 | 0x46<<7 | 0x1D, - 33219 - 19968: jis0212<<14 | 0x35<<7 | 0x35, - 33221 - 19968: jis0212<<14 | 0x35<<7 | 0x36, - 33222 - 19968: jis0208<<14 | 0x11<<7 | 0x11, - 33224 - 19968: jis0208<<14 | 0x46<<7 | 0x24, - 33225 - 19968: jis0208<<14 | 0x46<<7 | 0x1F, - 33226 - 19968: jis0212<<14 | 0x35<<7 | 0x37, - 33227 - 19968: jis0212<<14 | 0x35<<7 | 0x34, - 33229 - 19968: jis0208<<14 | 0x46<<7 | 0x20, - 33230 - 19968: jis0212<<14 | 0x35<<7 | 0x38, - 33231 - 19968: jis0212<<14 | 0x35<<7 | 0x39, - 33233 - 19968: jis0208<<14 | 0x46<<7 | 0x21, - 33235 - 19968: jis0208<<14 | 0x21<<7 | 0x00, - 33237 - 19968: jis0212<<14 | 0x35<<7 | 0x3A, - 33239 - 19968: jis0212<<14 | 0x35<<7 | 0x3B, - 33240 - 19968: jis0208<<14 | 0x46<<7 | 0x23, - 33241 - 19968: jis0208<<14 | 0x46<<7 | 0x22, - 33242 - 19968: jis0208<<14 | 0x46<<7 | 0x25, - 33243 - 19968: jis0212<<14 | 0x35<<7 | 0x3C, - 33245 - 19968: jis0212<<14 | 0x35<<7 | 0x3D, - 33246 - 19968: jis0212<<14 | 0x35<<7 | 0x3E, - 33247 - 19968: jis0208<<14 | 0x46<<7 | 0x26, - 33248 - 19968: jis0208<<14 | 0x46<<7 | 0x27, - 33249 - 19968: jis0212<<14 | 0x35<<7 | 0x3F, - 33251 - 19968: jis0208<<14 | 0x1E<<7 | 0x22, - 33252 - 19968: jis0212<<14 | 0x35<<7 | 0x40, - 33253 - 19968: jis0208<<14 | 0x11<<7 | 0x48, - 33255 - 19968: jis0208<<14 | 0x46<<7 | 0x28, - 33256 - 19968: jis0208<<14 | 0x2D<<7 | 0x36, - 33258 - 19968: jis0208<<14 | 0x1B<<7 | 0x0A, - 33259 - 19968: jis0212<<14 | 0x35<<7 | 0x41, - 33260 - 19968: jis0212<<14 | 0x35<<7 | 0x42, - 33261 - 19968: jis0208<<14 | 0x1C<<7 | 0x0C, - 33264 - 19968: jis0212<<14 | 0x35<<7 | 0x43, - 33265 - 19968: jis0212<<14 | 0x35<<7 | 0x44, - 33266 - 19968: jis0212<<14 | 0x35<<7 | 0x45, - 33267 - 19968: jis0208<<14 | 0x1A<<7 | 0x49, - 33268 - 19968: jis0208<<14 | 0x22<<7 | 0x36, - 33269 - 19968: jis0212<<14 | 0x35<<7 | 0x46, - 33270 - 19968: jis0212<<14 | 0x35<<7 | 0x47, - 33272 - 19968: jis0212<<14 | 0x35<<7 | 0x48, - 33273 - 19968: jis0212<<14 | 0x35<<7 | 0x49, - 33274 - 19968: jis0208<<14 | 0x46<<7 | 0x29, - 33275 - 19968: jis0208<<14 | 0x46<<7 | 0x2A, - 33276 - 19968: jis0208<<14 | 0x10<<7 | 0x10, - 33277 - 19968: jis0212<<14 | 0x35<<7 | 0x4A, - 33278 - 19968: jis0208<<14 | 0x46<<7 | 0x2B, - 33279 - 19968: jis0212<<14 | 0x35<<7 | 0x4B, - 33280 - 19968: jis0212<<14 | 0x35<<7 | 0x4C, - 33281 - 19968: jis0208<<14 | 0x46<<7 | 0x2C, - 33282 - 19968: jis0208<<14 | 0x46<<7 | 0x2D, - 33283 - 19968: jis0212<<14 | 0x35<<7 | 0x4D, - 33285 - 19968: jis0208<<14 | 0x46<<7 | 0x2E, - 33287 - 19968: jis0208<<14 | 0x46<<7 | 0x2F, - 33288 - 19968: jis0208<<14 | 0x15<<7 | 0x1C, - 33289 - 19968: jis0208<<14 | 0x39<<7 | 0x09, - 33290 - 19968: jis0208<<14 | 0x46<<7 | 0x30, - 33292 - 19968: jis0208<<14 | 0x1F<<7 | 0x44, - 33293 - 19968: jis0208<<14 | 0x46<<7 | 0x31, - 33294 - 19968: jis0208<<14 | 0x1B<<7 | 0x2A, - 33295 - 19968: jis0212<<14 | 0x35<<7 | 0x4E, - 33296 - 19968: jis0208<<14 | 0x46<<7 | 0x32, - 33298 - 19968: jis0208<<14 | 0x2F<<7 | 0x0F, - 33299 - 19968: jis0212<<14 | 0x35<<7 | 0x4F, - 33300 - 19968: jis0212<<14 | 0x35<<7 | 0x50, - 33302 - 19968: jis0208<<14 | 0x46<<7 | 0x33, - 33303 - 19968: jis0208<<14 | 0x29<<7 | 0x3D, - 33304 - 19968: jis0208<<14 | 0x13<<7 | 0x3B, - 33305 - 19968: jis0212<<14 | 0x35<<7 | 0x51, - 33306 - 19968: jis0212<<14 | 0x35<<7 | 0x52, - 33307 - 19968: jis0208<<14 | 0x20<<7 | 0x03, - 33308 - 19968: jis0208<<14 | 0x1C<<7 | 0x37, - 33309 - 19968: jis0212<<14 | 0x35<<7 | 0x53, - 33310 - 19968: jis0208<<14 | 0x28<<7 | 0x50, - 33311 - 19968: jis0208<<14 | 0x1C<<7 | 0x0D, - 33313 - 19968: jis0212<<14 | 0x35<<7 | 0x54, - 33314 - 19968: jis0212<<14 | 0x35<<7 | 0x55, - 33320 - 19968: jis0212<<14 | 0x35<<7 | 0x56, - 33321 - 19968: jis0208<<14 | 0x46<<7 | 0x34, - 33322 - 19968: jis0208<<14 | 0x18<<7 | 0x31, - 33323 - 19968: jis0208<<14 | 0x46<<7 | 0x35, - 33324 - 19968: jis0208<<14 | 0x27<<7 | 0x2B, - 33326 - 19968: jis0208<<14 | 0x46<<7 | 0x43, - 33330 - 19968: jis0212<<14 | 0x35<<7 | 0x57, - 33331 - 19968: jis0208<<14 | 0x46<<7 | 0x37, - 33332 - 19968: jis0212<<14 | 0x35<<7 | 0x58, - 33333 - 19968: jis0208<<14 | 0x21<<7 | 0x28, - 33334 - 19968: jis0208<<14 | 0x26<<7 | 0x54, - 33335 - 19968: jis0208<<14 | 0x17<<7 | 0x1E, - 33336 - 19968: jis0208<<14 | 0x46<<7 | 0x36, - 33337 - 19968: jis0208<<14 | 0x20<<7 | 0x04, - 33338 - 19968: jis0212<<14 | 0x35<<7 | 0x59, - 33344 - 19968: jis0208<<14 | 0x46<<7 | 0x38, - 33347 - 19968: jis0212<<14 | 0x35<<7 | 0x5A, - 33348 - 19968: jis0212<<14 | 0x35<<7 | 0x5B, - 33349 - 19968: jis0212<<14 | 0x35<<7 | 0x5C, - 33350 - 19968: jis0212<<14 | 0x35<<7 | 0x5D, - 33351 - 19968: jis0208<<14 | 0x23<<7 | 0x59, - 33355 - 19968: jis0212<<14 | 0x36<<7 | 0x00, - 33358 - 19968: jis0212<<14 | 0x36<<7 | 0x01, - 33359 - 19968: jis0212<<14 | 0x36<<7 | 0x02, - 33361 - 19968: jis0212<<14 | 0x36<<7 | 0x03, - 33366 - 19968: jis0212<<14 | 0x36<<7 | 0x04, - 33368 - 19968: jis0208<<14 | 0x46<<7 | 0x3A, - 33369 - 19968: jis0208<<14 | 0x46<<7 | 0x39, - 33370 - 19968: jis0208<<14 | 0x46<<7 | 0x3C, - 33372 - 19968: jis0212<<14 | 0x36<<7 | 0x05, - 33373 - 19968: jis0208<<14 | 0x46<<7 | 0x3B, - 33375 - 19968: jis0208<<14 | 0x46<<7 | 0x3D, - 33376 - 19968: jis0212<<14 | 0x36<<7 | 0x06, - 33378 - 19968: jis0208<<14 | 0x46<<7 | 0x3F, - 33379 - 19968: jis0212<<14 | 0x36<<7 | 0x07, - 33380 - 19968: jis0208<<14 | 0x46<<7 | 0x3E, - 33382 - 19968: jis0208<<14 | 0x13<<7 | 0x2E, - 33383 - 19968: jis0212<<14 | 0x36<<7 | 0x08, - 33384 - 19968: jis0208<<14 | 0x46<<7 | 0x40, - 33386 - 19968: jis0208<<14 | 0x46<<7 | 0x41, - 33387 - 19968: jis0208<<14 | 0x46<<7 | 0x42, - 33389 - 19968: jis0212<<14 | 0x36<<7 | 0x09, - 33390 - 19968: jis0208<<14 | 0x19<<7 | 0x10, - 33391 - 19968: jis0208<<14 | 0x2D<<7 | 0x28, - 33393 - 19968: jis0208<<14 | 0x46<<7 | 0x44, - 33394 - 19968: jis0208<<14 | 0x1E<<7 | 0x06, - 33396 - 19968: jis0212<<14 | 0x36<<7 | 0x0A, - 33398 - 19968: jis0208<<14 | 0x10<<7 | 0x4F, - 33399 - 19968: jis0208<<14 | 0x46<<7 | 0x45, - 33400 - 19968: jis0208<<14 | 0x46<<7 | 0x46, - 33403 - 19968: jis0212<<14 | 0x36<<7 | 0x0B, - 33405 - 19968: jis0212<<14 | 0x36<<7 | 0x0C, - 33406 - 19968: jis0208<<14 | 0x46<<7 | 0x47, - 33407 - 19968: jis0212<<14 | 0x36<<7 | 0x0D, - 33408 - 19968: jis0212<<14 | 0x36<<7 | 0x0E, - 33409 - 19968: jis0212<<14 | 0x36<<7 | 0x0F, - 33411 - 19968: jis0212<<14 | 0x36<<7 | 0x10, - 33412 - 19968: jis0212<<14 | 0x36<<7 | 0x11, - 33415 - 19968: jis0212<<14 | 0x36<<7 | 0x12, - 33417 - 19968: jis0212<<14 | 0x36<<7 | 0x13, - 33418 - 19968: jis0212<<14 | 0x36<<7 | 0x14, - 33419 - 19968: jis0208<<14 | 0x0F<<7 | 0x51, - 33421 - 19968: jis0208<<14 | 0x46<<7 | 0x48, - 33422 - 19968: jis0212<<14 | 0x36<<7 | 0x15, - 33425 - 19968: jis0212<<14 | 0x36<<7 | 0x16, - 33426 - 19968: jis0208<<14 | 0x46<<7 | 0x49, - 33428 - 19968: jis0212<<14 | 0x36<<7 | 0x17, - 33430 - 19968: jis0212<<14 | 0x36<<7 | 0x18, - 33432 - 19968: jis0212<<14 | 0x36<<7 | 0x19, - 33433 - 19968: jis0208<<14 | 0x28<<7 | 0x46, - 33434 - 19968: jis0212<<14 | 0x36<<7 | 0x1A, - 33435 - 19968: jis0212<<14 | 0x36<<7 | 0x1B, - 33437 - 19968: jis0208<<14 | 0x1B<<7 | 0x26, - 33439 - 19968: jis0208<<14 | 0x46<<7 | 0x4B, - 33440 - 19968: jis0212<<14 | 0x36<<7 | 0x1C, - 33441 - 19968: jis0212<<14 | 0x36<<7 | 0x1D, - 33443 - 19968: jis0212<<14 | 0x36<<7 | 0x1E, - 33444 - 19968: jis0212<<14 | 0x36<<7 | 0x1F, - 33445 - 19968: jis0208<<14 | 0x12<<7 | 0x08, - 33446 - 19968: jis0208<<14 | 0x0F<<7 | 0x11, - 33447 - 19968: jis0212<<14 | 0x36<<7 | 0x20, - 33448 - 19968: jis0212<<14 | 0x36<<7 | 0x21, - 33449 - 19968: jis0212<<14 | 0x36<<7 | 0x22, - 33450 - 19968: jis0212<<14 | 0x36<<7 | 0x23, - 33451 - 19968: jis0208<<14 | 0x46<<7 | 0x4A, - 33452 - 19968: jis0208<<14 | 0x46<<7 | 0x4D, - 33453 - 19968: jis0208<<14 | 0x26<<7 | 0x2D, - 33454 - 19968: jis0212<<14 | 0x36<<7 | 0x24, - 33455 - 19968: jis0208<<14 | 0x1E<<7 | 0x23, - 33456 - 19968: jis0212<<14 | 0x36<<7 | 0x25, - 33457 - 19968: jis0208<<14 | 0x11<<7 | 0x35, - 33458 - 19968: jis0212<<14 | 0x36<<7 | 0x26, - 33459 - 19968: jis0208<<14 | 0x2A<<7 | 0x06, - 33460 - 19968: jis0212<<14 | 0x36<<7 | 0x27, - 33463 - 19968: jis0212<<14 | 0x36<<7 | 0x28, - 33464 - 19968: jis0208<<14 | 0x16<<7 | 0x3C, - 33465 - 19968: jis0208<<14 | 0x15<<7 | 0x3B, - 33466 - 19968: jis0212<<14 | 0x36<<7 | 0x29, - 33467 - 19968: jis0208<<14 | 0x46<<7 | 0x4C, - 33468 - 19968: jis0212<<14 | 0x36<<7 | 0x2A, - 33469 - 19968: jis0208<<14 | 0x11<<7 | 0x49, - 33470 - 19968: jis0212<<14 | 0x36<<7 | 0x2B, - 33471 - 19968: jis0212<<14 | 0x36<<7 | 0x2C, - 33477 - 19968: jis0208<<14 | 0x13<<7 | 0x02, - 33478 - 19968: jis0212<<14 | 0x36<<7 | 0x2D, - 33488 - 19968: jis0212<<14 | 0x36<<7 | 0x2E, - 33489 - 19968: jis0208<<14 | 0x10<<7 | 0x50, - 33490 - 19968: jis0208<<14 | 0x46<<7 | 0x51, - 33491 - 19968: jis0208<<14 | 0x2D<<7 | 0x49, - 33492 - 19968: jis0208<<14 | 0x21<<7 | 0x3C, - 33493 - 19968: jis0212<<14 | 0x36<<7 | 0x2F, - 33495 - 19968: jis0208<<14 | 0x28<<7 | 0x23, - 33497 - 19968: jis0208<<14 | 0x46<<7 | 0x5D, - 33498 - 19968: jis0212<<14 | 0x36<<7 | 0x30, - 33499 - 19968: jis0208<<14 | 0x11<<7 | 0x36, - 33500 - 19968: jis0208<<14 | 0x46<<7 | 0x5B, - 33502 - 19968: jis0208<<14 | 0x46<<7 | 0x59, - 33503 - 19968: jis0208<<14 | 0x46<<7 | 0x50, - 33504 - 19968: jis0212<<14 | 0x36<<7 | 0x31, - 33505 - 19968: jis0208<<14 | 0x46<<7 | 0x4E, - 33506 - 19968: jis0212<<14 | 0x36<<7 | 0x32, - 33507 - 19968: jis0208<<14 | 0x46<<7 | 0x4F, - 33508 - 19968: jis0212<<14 | 0x36<<7 | 0x33, - 33509 - 19968: jis0208<<14 | 0x1B<<7 | 0x42, - 33510 - 19968: jis0208<<14 | 0x15<<7 | 0x4B, - 33511 - 19968: jis0208<<14 | 0x22<<7 | 0x56, - 33512 - 19968: jis0212<<14 | 0x36<<7 | 0x34, - 33514 - 19968: jis0212<<14 | 0x36<<7 | 0x35, - 33515 - 19968: jis0208<<14 | 0x25<<7 | 0x30, - 33517 - 19968: jis0212<<14 | 0x36<<7 | 0x36, - 33519 - 19968: jis0212<<14 | 0x36<<7 | 0x37, - 33521 - 19968: jis0208<<14 | 0x10<<7 | 0x30, - 33523 - 19968: jis0208<<14 | 0x46<<7 | 0x53, - 33524 - 19968: jis0208<<14 | 0x46<<7 | 0x52, - 33526 - 19968: jis0212<<14 | 0x36<<7 | 0x38, - 33527 - 19968: jis0212<<14 | 0x36<<7 | 0x39, - 33529 - 19968: jis0208<<14 | 0x46<<7 | 0x58, - 33530 - 19968: jis0208<<14 | 0x46<<7 | 0x54, - 33531 - 19968: jis0208<<14 | 0x46<<7 | 0x57, - 33533 - 19968: jis0212<<14 | 0x36<<7 | 0x3A, - 33534 - 19968: jis0212<<14 | 0x36<<7 | 0x3B, - 33536 - 19968: jis0212<<14 | 0x36<<7 | 0x3C, - 33537 - 19968: jis0208<<14 | 0x5A<<7 | 0x36, - 33538 - 19968: jis0208<<14 | 0x2B<<7 | 0x2F, - 33539 - 19968: jis0208<<14 | 0x46<<7 | 0x56, - 33540 - 19968: jis0208<<14 | 0x11<<7 | 0x37, - 33541 - 19968: jis0208<<14 | 0x12<<7 | 0x5C, - 33542 - 19968: jis0208<<14 | 0x46<<7 | 0x5A, - 33543 - 19968: jis0212<<14 | 0x36<<7 | 0x3E, - 33544 - 19968: jis0212<<14 | 0x36<<7 | 0x3F, - 33545 - 19968: jis0208<<14 | 0x46<<7 | 0x5C, - 33546 - 19968: jis0212<<14 | 0x36<<7 | 0x40, - 33547 - 19968: jis0212<<14 | 0x36<<7 | 0x41, - 33550 - 19968: jis0208<<14 | 0x16<<7 | 0x33, - 33558 - 19968: jis0208<<14 | 0x47<<7 | 0x02, - 33559 - 19968: jis0208<<14 | 0x47<<7 | 0x0B, - 33560 - 19968: jis0208<<14 | 0x47<<7 | 0x0C, - 33563 - 19968: jis0212<<14 | 0x36<<7 | 0x43, - 33564 - 19968: jis0208<<14 | 0x0F<<7 | 0x0A, - 33565 - 19968: jis0212<<14 | 0x36<<7 | 0x44, - 33566 - 19968: jis0212<<14 | 0x36<<7 | 0x45, - 33567 - 19968: jis0212<<14 | 0x36<<7 | 0x46, - 33569 - 19968: jis0212<<14 | 0x36<<7 | 0x47, - 33570 - 19968: jis0212<<14 | 0x36<<7 | 0x48, - 33571 - 19968: jis0208<<14 | 0x47<<7 | 0x13, - 33576 - 19968: jis0208<<14 | 0x0F<<7 | 0x50, - 33579 - 19968: jis0208<<14 | 0x47<<7 | 0x0A, - 33580 - 19968: jis0212<<14 | 0x36<<7 | 0x49, - 33581 - 19968: jis0212<<14 | 0x36<<7 | 0x4A, - 33582 - 19968: jis0212<<14 | 0x36<<7 | 0x4B, - 33583 - 19968: jis0208<<14 | 0x47<<7 | 0x09, - 33584 - 19968: jis0212<<14 | 0x36<<7 | 0x4C, - 33585 - 19968: jis0208<<14 | 0x47<<7 | 0x04, - 33586 - 19968: jis0208<<14 | 0x47<<7 | 0x03, - 33587 - 19968: jis0212<<14 | 0x36<<7 | 0x4D, - 33588 - 19968: jis0208<<14 | 0x47<<7 | 0x01, - 33589 - 19968: jis0208<<14 | 0x47<<7 | 0x00, - 33590 - 19968: jis0208<<14 | 0x22<<7 | 0x42, - 33591 - 19968: jis0212<<14 | 0x36<<7 | 0x4E, - 33592 - 19968: jis0208<<14 | 0x21<<7 | 0x5A, - 33593 - 19968: jis0208<<14 | 0x47<<7 | 0x06, - 33594 - 19968: jis0212<<14 | 0x36<<7 | 0x4F, - 33596 - 19968: jis0212<<14 | 0x36<<7 | 0x50, - 33597 - 19968: jis0212<<14 | 0x36<<7 | 0x51, - 33600 - 19968: jis0208<<14 | 0x47<<7 | 0x05, - 33602 - 19968: jis0212<<14 | 0x36<<7 | 0x52, - 33603 - 19968: jis0212<<14 | 0x36<<7 | 0x53, - 33604 - 19968: jis0212<<14 | 0x36<<7 | 0x54, - 33605 - 19968: jis0208<<14 | 0x47<<7 | 0x08, - 33607 - 19968: jis0212<<14 | 0x36<<7 | 0x55, - 33609 - 19968: jis0208<<14 | 0x20<<7 | 0x4F, - 33610 - 19968: jis0208<<14 | 0x16<<7 | 0x34, - 33613 - 19968: jis0212<<14 | 0x36<<7 | 0x56, - 33614 - 19968: jis0212<<14 | 0x36<<7 | 0x57, - 33615 - 19968: jis0208<<14 | 0x10<<7 | 0x20, - 33616 - 19968: jis0208<<14 | 0x47<<7 | 0x07, - 33617 - 19968: jis0212<<14 | 0x36<<7 | 0x58, - 33618 - 19968: jis0208<<14 | 0x18<<7 | 0x32, - 33619 - 19968: jis0212<<14 | 0x37<<7 | 0x1D, - 33620 - 19968: jis0212<<14 | 0x36<<7 | 0x42, - 33621 - 19968: jis0212<<14 | 0x36<<7 | 0x59, - 33622 - 19968: jis0212<<14 | 0x36<<7 | 0x5A, - 33623 - 19968: jis0212<<14 | 0x36<<7 | 0x5B, - 33624 - 19968: jis0208<<14 | 0x20<<7 | 0x50, - 33634 - 19968: jis0208<<14 | 0x5A<<7 | 0x37, - 33648 - 19968: jis0212<<14 | 0x36<<7 | 0x5C, - 33651 - 19968: jis0208<<14 | 0x47<<7 | 0x19, - 33653 - 19968: jis0208<<14 | 0x47<<7 | 0x1A, - 33655 - 19968: jis0208<<14 | 0x11<<7 | 0x38, - 33656 - 19968: jis0212<<14 | 0x36<<7 | 0x5D, - 33659 - 19968: jis0208<<14 | 0x11<<7 | 0x0D, - 33660 - 19968: jis0208<<14 | 0x47<<7 | 0x17, - 33661 - 19968: jis0212<<14 | 0x37<<7 | 0x00, - 33663 - 19968: jis0208<<14 | 0x5A<<7 | 0x38, - 33664 - 19968: jis0212<<14 | 0x37<<7 | 0x02, - 33666 - 19968: jis0212<<14 | 0x37<<7 | 0x03, - 33668 - 19968: jis0212<<14 | 0x37<<7 | 0x04, - 33669 - 19968: jis0208<<14 | 0x47<<7 | 0x0D, - 33670 - 19968: jis0212<<14 | 0x37<<7 | 0x05, - 33671 - 19968: jis0208<<14 | 0x47<<7 | 0x15, - 33673 - 19968: jis0208<<14 | 0x47<<7 | 0x1C, - 33674 - 19968: jis0208<<14 | 0x47<<7 | 0x16, - 33677 - 19968: jis0212<<14 | 0x37<<7 | 0x06, - 33678 - 19968: jis0208<<14 | 0x47<<7 | 0x14, - 33682 - 19968: jis0212<<14 | 0x37<<7 | 0x07, - 33683 - 19968: jis0208<<14 | 0x46<<7 | 0x55, - 33684 - 19968: jis0212<<14 | 0x37<<7 | 0x08, - 33685 - 19968: jis0212<<14 | 0x37<<7 | 0x09, - 33686 - 19968: jis0208<<14 | 0x47<<7 | 0x12, - 33688 - 19968: jis0212<<14 | 0x37<<7 | 0x0A, - 33689 - 19968: jis0212<<14 | 0x37<<7 | 0x0B, - 33690 - 19968: jis0208<<14 | 0x47<<7 | 0x0E, - 33691 - 19968: jis0212<<14 | 0x37<<7 | 0x0C, - 33692 - 19968: jis0212<<14 | 0x37<<7 | 0x0D, - 33693 - 19968: jis0212<<14 | 0x37<<7 | 0x0E, - 33694 - 19968: jis0208<<14 | 0x13<<7 | 0x2F, - 33695 - 19968: jis0208<<14 | 0x47<<7 | 0x10, - 33696 - 19968: jis0208<<14 | 0x47<<7 | 0x1B, - 33698 - 19968: jis0208<<14 | 0x47<<7 | 0x11, - 33702 - 19968: jis0212<<14 | 0x37<<7 | 0x0F, - 33703 - 19968: jis0212<<14 | 0x37<<7 | 0x10, - 33704 - 19968: jis0208<<14 | 0x47<<7 | 0x1D, - 33705 - 19968: jis0212<<14 | 0x37<<7 | 0x11, - 33706 - 19968: jis0208<<14 | 0x47<<7 | 0x0F, - 33707 - 19968: jis0208<<14 | 0x26<<7 | 0x5B, - 33708 - 19968: jis0212<<14 | 0x37<<7 | 0x12, - 33709 - 19968: jis0212<<14 | 0x37<<7 | 0x2B, - 33713 - 19968: jis0208<<14 | 0x2C<<7 | 0x48, - 33717 - 19968: jis0208<<14 | 0x47<<7 | 0x18, - 33725 - 19968: jis0208<<14 | 0x47<<7 | 0x2E, - 33726 - 19968: jis0212<<14 | 0x37<<7 | 0x13, - 33727 - 19968: jis0212<<14 | 0x37<<7 | 0x14, - 33728 - 19968: jis0212<<14 | 0x37<<7 | 0x15, - 33729 - 19968: jis0208<<14 | 0x47<<7 | 0x26, - 33733 - 19968: jis0208<<14 | 0x1E<<7 | 0x5A, - 33735 - 19968: jis0208<<14 | 0x5A<<7 | 0x39, - 33737 - 19968: jis0212<<14 | 0x37<<7 | 0x17, - 33738 - 19968: jis0208<<14 | 0x14<<7 | 0x25, - 33740 - 19968: jis0208<<14 | 0x15<<7 | 0x3C, - 33742 - 19968: jis0208<<14 | 0x47<<7 | 0x21, - 33743 - 19968: jis0212<<14 | 0x37<<7 | 0x18, - 33744 - 19968: jis0212<<14 | 0x37<<7 | 0x19, - 33745 - 19968: jis0212<<14 | 0x37<<7 | 0x1A, - 33747 - 19968: jis0208<<14 | 0x11<<7 | 0x3A, - 33748 - 19968: jis0212<<14 | 0x37<<7 | 0x1B, - 33750 - 19968: jis0208<<14 | 0x1D<<7 | 0x33, - 33752 - 19968: jis0208<<14 | 0x47<<7 | 0x24, - 33756 - 19968: jis0208<<14 | 0x19<<7 | 0x39, - 33757 - 19968: jis0212<<14 | 0x37<<7 | 0x1C, - 33759 - 19968: jis0208<<14 | 0x24<<7 | 0x30, - 33760 - 19968: jis0208<<14 | 0x47<<7 | 0x29, - 33768 - 19968: jis0212<<14 | 0x37<<7 | 0x1E, - 33769 - 19968: jis0208<<14 | 0x29<<7 | 0x4D, - 33770 - 19968: jis0212<<14 | 0x37<<7 | 0x1F, - 33771 - 19968: jis0208<<14 | 0x47<<7 | 0x20, - 33775 - 19968: jis0208<<14 | 0x11<<7 | 0x39, - 33776 - 19968: jis0208<<14 | 0x17<<7 | 0x35, - 33777 - 19968: jis0208<<14 | 0x28<<7 | 0x08, - 33778 - 19968: jis0208<<14 | 0x47<<7 | 0x2A, - 33780 - 19968: jis0208<<14 | 0x47<<7 | 0x1E, - 33782 - 19968: jis0208<<14 | 0x5A<<7 | 0x3A, - 33783 - 19968: jis0208<<14 | 0x47<<7 | 0x27, - 33784 - 19968: jis0212<<14 | 0x37<<7 | 0x21, - 33785 - 19968: jis0212<<14 | 0x37<<7 | 0x22, - 33787 - 19968: jis0208<<14 | 0x47<<7 | 0x31, - 33788 - 19968: jis0212<<14 | 0x37<<7 | 0x23, - 33789 - 19968: jis0208<<14 | 0x47<<7 | 0x22, - 33793 - 19968: jis0212<<14 | 0x37<<7 | 0x24, - 33795 - 19968: jis0208<<14 | 0x47<<7 | 0x23, - 33796 - 19968: jis0208<<14 | 0x25<<7 | 0x19, - 33798 - 19968: jis0212<<14 | 0x37<<7 | 0x25, - 33799 - 19968: jis0208<<14 | 0x47<<7 | 0x28, - 33802 - 19968: jis0212<<14 | 0x37<<7 | 0x26, - 33803 - 19968: jis0208<<14 | 0x47<<7 | 0x25, - 33804 - 19968: jis0208<<14 | 0x2A<<7 | 0x07, - 33805 - 19968: jis0208<<14 | 0x47<<7 | 0x2B, - 33806 - 19968: jis0208<<14 | 0x0F<<7 | 0x3F, - 33807 - 19968: jis0212<<14 | 0x37<<7 | 0x27, - 33809 - 19968: jis0212<<14 | 0x37<<7 | 0x28, - 33811 - 19968: jis0208<<14 | 0x47<<7 | 0x1F, - 33813 - 19968: jis0212<<14 | 0x37<<7 | 0x29, - 33817 - 19968: jis0212<<14 | 0x37<<7 | 0x2A, - 33824 - 19968: jis0208<<14 | 0x47<<7 | 0x2D, - 33826 - 19968: jis0208<<14 | 0x47<<7 | 0x2C, - 33833 - 19968: jis0208<<14 | 0x26<<7 | 0x4A, - 33834 - 19968: jis0208<<14 | 0x47<<7 | 0x33, - 33836 - 19968: jis0208<<14 | 0x47<<7 | 0x3E, - 33839 - 19968: jis0212<<14 | 0x37<<7 | 0x2C, - 33841 - 19968: jis0208<<14 | 0x12<<7 | 0x5D, - 33845 - 19968: jis0208<<14 | 0x47<<7 | 0x41, - 33848 - 19968: jis0208<<14 | 0x47<<7 | 0x2F, - 33849 - 19968: jis0212<<14 | 0x37<<7 | 0x2D, - 33852 - 19968: jis0208<<14 | 0x47<<7 | 0x34, - 33853 - 19968: jis0208<<14 | 0x2C<<7 | 0x4D, - 33861 - 19968: jis0212<<14 | 0x37<<7 | 0x2E, - 33862 - 19968: jis0208<<14 | 0x47<<7 | 0x3D, - 33863 - 19968: jis0212<<14 | 0x37<<7 | 0x2F, - 33864 - 19968: jis0208<<14 | 0x5A<<7 | 0x3B, - 33865 - 19968: jis0208<<14 | 0x2C<<7 | 0x34, - 33866 - 19968: jis0212<<14 | 0x37<<7 | 0x31, - 33869 - 19968: jis0212<<14 | 0x37<<7 | 0x32, - 33870 - 19968: jis0208<<14 | 0x2D<<7 | 0x09, - 33871 - 19968: jis0212<<14 | 0x37<<7 | 0x33, - 33873 - 19968: jis0212<<14 | 0x37<<7 | 0x34, - 33874 - 19968: jis0212<<14 | 0x37<<7 | 0x35, - 33878 - 19968: jis0212<<14 | 0x37<<7 | 0x36, - 33879 - 19968: jis0208<<14 | 0x22<<7 | 0x57, - 33880 - 19968: jis0212<<14 | 0x37<<7 | 0x37, - 33881 - 19968: jis0212<<14 | 0x37<<7 | 0x38, - 33882 - 19968: jis0212<<14 | 0x37<<7 | 0x39, - 33883 - 19968: jis0208<<14 | 0x12<<7 | 0x4A, - 33884 - 19968: jis0212<<14 | 0x37<<7 | 0x3A, - 33888 - 19968: jis0212<<14 | 0x37<<7 | 0x3B, - 33889 - 19968: jis0208<<14 | 0x28<<7 | 0x51, - 33890 - 19968: jis0208<<14 | 0x47<<7 | 0x43, - 33891 - 19968: jis0208<<14 | 0x25<<7 | 0x00, - 33892 - 19968: jis0212<<14 | 0x37<<7 | 0x3C, - 33893 - 19968: jis0212<<14 | 0x37<<7 | 0x3D, - 33894 - 19968: jis0208<<14 | 0x0F<<7 | 0x10, - 33895 - 19968: jis0212<<14 | 0x37<<7 | 0x3E, - 33897 - 19968: jis0208<<14 | 0x47<<7 | 0x3C, - 33898 - 19968: jis0212<<14 | 0x37<<7 | 0x3F, - 33899 - 19968: jis0208<<14 | 0x47<<7 | 0x38, - 33900 - 19968: jis0208<<14 | 0x20<<7 | 0x51, - 33901 - 19968: jis0208<<14 | 0x47<<7 | 0x32, - 33902 - 19968: jis0208<<14 | 0x47<<7 | 0x3A, - 33903 - 19968: jis0208<<14 | 0x47<<7 | 0x3F, - 33904 - 19968: jis0212<<14 | 0x37<<7 | 0x40, - 33905 - 19968: jis0208<<14 | 0x26<<7 | 0x0B, - 33907 - 19968: jis0212<<14 | 0x37<<7 | 0x41, - 33908 - 19968: jis0212<<14 | 0x37<<7 | 0x42, - 33909 - 19968: jis0208<<14 | 0x0F<<7 | 0x09, - 33910 - 19968: jis0212<<14 | 0x37<<7 | 0x43, - 33911 - 19968: jis0208<<14 | 0x47<<7 | 0x37, - 33912 - 19968: jis0212<<14 | 0x37<<7 | 0x44, - 33913 - 19968: jis0208<<14 | 0x47<<7 | 0x40, - 33914 - 19968: jis0208<<14 | 0x28<<7 | 0x57, - 33916 - 19968: jis0212<<14 | 0x37<<7 | 0x45, - 33917 - 19968: jis0212<<14 | 0x37<<7 | 0x46, - 33921 - 19968: jis0212<<14 | 0x37<<7 | 0x47, - 33922 - 19968: jis0208<<14 | 0x47<<7 | 0x3B, - 33924 - 19968: jis0208<<14 | 0x47<<7 | 0x36, - 33925 - 19968: jis0212<<14 | 0x37<<7 | 0x48, - 33931 - 19968: jis0208<<14 | 0x1D<<7 | 0x34, - 33936 - 19968: jis0208<<14 | 0x1C<<7 | 0x0E, - 33938 - 19968: jis0212<<14 | 0x37<<7 | 0x49, - 33939 - 19968: jis0212<<14 | 0x37<<7 | 0x4A, - 33940 - 19968: jis0208<<14 | 0x1B<<7 | 0x0B, - 33941 - 19968: jis0212<<14 | 0x37<<7 | 0x4B, - 33945 - 19968: jis0208<<14 | 0x2B<<7 | 0x37, - 33948 - 19968: jis0208<<14 | 0x28<<7 | 0x26, - 33950 - 19968: jis0212<<14 | 0x37<<7 | 0x4C, - 33951 - 19968: jis0208<<14 | 0x47<<7 | 0x46, - 33953 - 19968: jis0208<<14 | 0x47<<7 | 0x4F, - 33958 - 19968: jis0212<<14 | 0x37<<7 | 0x4D, - 33960 - 19968: jis0212<<14 | 0x37<<7 | 0x4E, - 33961 - 19968: jis0212<<14 | 0x37<<7 | 0x4F, - 33962 - 19968: jis0212<<14 | 0x37<<7 | 0x50, - 33965 - 19968: jis0208<<14 | 0x47<<7 | 0x39, - 33967 - 19968: jis0212<<14 | 0x37<<7 | 0x51, - 33969 - 19968: jis0212<<14 | 0x37<<7 | 0x52, - 33970 - 19968: jis0208<<14 | 0x12<<7 | 0x56, - 33972 - 19968: jis0208<<14 | 0x5A<<7 | 0x3C, - 33976 - 19968: jis0208<<14 | 0x1D<<7 | 0x57, - 33977 - 19968: jis0208<<14 | 0x47<<7 | 0x44, - 33978 - 19968: jis0212<<14 | 0x37<<7 | 0x54, - 33979 - 19968: jis0208<<14 | 0x47<<7 | 0x49, - 33980 - 19968: jis0208<<14 | 0x20<<7 | 0x52, - 33981 - 19968: jis0212<<14 | 0x37<<7 | 0x55, - 33982 - 19968: jis0212<<14 | 0x37<<7 | 0x56, - 33983 - 19968: jis0208<<14 | 0x47<<7 | 0x45, - 33984 - 19968: jis0212<<14 | 0x37<<7 | 0x57, - 33985 - 19968: jis0208<<14 | 0x47<<7 | 0x4C, - 33986 - 19968: jis0212<<14 | 0x37<<7 | 0x58, - 33988 - 19968: jis0208<<14 | 0x22<<7 | 0x3E, - 33990 - 19968: jis0208<<14 | 0x47<<7 | 0x4D, - 33991 - 19968: jis0212<<14 | 0x37<<7 | 0x59, - 33992 - 19968: jis0212<<14 | 0x37<<7 | 0x5A, - 33993 - 19968: jis0208<<14 | 0x2C<<7 | 0x35, - 33994 - 19968: jis0208<<14 | 0x47<<7 | 0x42, - 33995 - 19968: jis0208<<14 | 0x12<<7 | 0x17, - 33996 - 19968: jis0212<<14 | 0x37<<7 | 0x5B, - 33997 - 19968: jis0208<<14 | 0x47<<7 | 0x48, - 33999 - 19968: jis0212<<14 | 0x37<<7 | 0x5C, - 34000 - 19968: jis0208<<14 | 0x47<<7 | 0x4B, - 34001 - 19968: jis0208<<14 | 0x2B<<7 | 0x0B, - 34003 - 19968: jis0212<<14 | 0x37<<7 | 0x5D, - 34006 - 19968: jis0208<<14 | 0x47<<7 | 0x4E, - 34009 - 19968: jis0208<<14 | 0x47<<7 | 0x47, - 34010 - 19968: jis0208<<14 | 0x47<<7 | 0x4A, - 34012 - 19968: jis0208<<14 | 0x58<<7 | 0x04, - 34023 - 19968: jis0212<<14 | 0x38<<7 | 0x01, - 34026 - 19968: jis0212<<14 | 0x38<<7 | 0x02, - 34028 - 19968: jis0208<<14 | 0x2A<<7 | 0x08, - 34030 - 19968: jis0208<<14 | 0x2E<<7 | 0x00, - 34031 - 19968: jis0212<<14 | 0x38<<7 | 0x03, - 34032 - 19968: jis0212<<14 | 0x38<<7 | 0x04, - 34033 - 19968: jis0212<<14 | 0x38<<7 | 0x05, - 34034 - 19968: jis0212<<14 | 0x38<<7 | 0x06, - 34036 - 19968: jis0208<<14 | 0x47<<7 | 0x52, - 34039 - 19968: jis0212<<14 | 0x38<<7 | 0x07, - 34042 - 19968: jis0212<<14 | 0x38<<7 | 0x09, - 34043 - 19968: jis0212<<14 | 0x38<<7 | 0x0A, - 34044 - 19968: jis0208<<14 | 0x47<<7 | 0x59, - 34045 - 19968: jis0212<<14 | 0x38<<7 | 0x0B, - 34047 - 19968: jis0208<<14 | 0x47<<7 | 0x51, - 34048 - 19968: jis0208<<14 | 0x1B<<7 | 0x22, - 34050 - 19968: jis0212<<14 | 0x38<<7 | 0x0C, - 34051 - 19968: jis0212<<14 | 0x38<<7 | 0x0D, - 34054 - 19968: jis0208<<14 | 0x47<<7 | 0x30, - 34055 - 19968: jis0212<<14 | 0x38<<7 | 0x0E, - 34060 - 19968: jis0212<<14 | 0x38<<7 | 0x0F, - 34062 - 19968: jis0212<<14 | 0x38<<7 | 0x10, - 34064 - 19968: jis0212<<14 | 0x38<<7 | 0x11, - 34065 - 19968: jis0208<<14 | 0x29<<7 | 0x2D, - 34067 - 19968: jis0208<<14 | 0x2B<<7 | 0x01, - 34068 - 19968: jis0208<<14 | 0x47<<7 | 0x58, - 34069 - 19968: jis0208<<14 | 0x47<<7 | 0x57, - 34071 - 19968: jis0208<<14 | 0x47<<7 | 0x53, - 34072 - 19968: jis0208<<14 | 0x47<<7 | 0x54, - 34074 - 19968: jis0208<<14 | 0x10<<7 | 0x15, - 34076 - 19968: jis0212<<14 | 0x38<<7 | 0x12, - 34078 - 19968: jis0212<<14 | 0x38<<7 | 0x13, - 34079 - 19968: jis0208<<14 | 0x47<<7 | 0x56, - 34081 - 19968: jis0208<<14 | 0x47<<7 | 0x50, - 34082 - 19968: jis0212<<14 | 0x38<<7 | 0x14, - 34083 - 19968: jis0212<<14 | 0x38<<7 | 0x15, - 34084 - 19968: jis0212<<14 | 0x38<<7 | 0x16, - 34085 - 19968: jis0212<<14 | 0x38<<7 | 0x17, - 34086 - 19968: jis0208<<14 | 0x23<<7 | 0x34, - 34087 - 19968: jis0212<<14 | 0x38<<7 | 0x18, - 34090 - 19968: jis0212<<14 | 0x38<<7 | 0x19, - 34091 - 19968: jis0212<<14 | 0x38<<7 | 0x1A, - 34092 - 19968: jis0208<<14 | 0x47<<7 | 0x55, - 34093 - 19968: jis0208<<14 | 0x0F<<7 | 0x5D, - 34095 - 19968: jis0212<<14 | 0x38<<7 | 0x1B, - 34098 - 19968: jis0212<<14 | 0x38<<7 | 0x08, - 34099 - 19968: jis0212<<14 | 0x38<<7 | 0x1C, - 34100 - 19968: jis0212<<14 | 0x38<<7 | 0x1D, - 34101 - 19968: jis0208<<14 | 0x21<<7 | 0x01, - 34102 - 19968: jis0212<<14 | 0x38<<7 | 0x1E, - 34109 - 19968: jis0208<<14 | 0x29<<7 | 0x22, - 34111 - 19968: jis0212<<14 | 0x38<<7 | 0x1F, - 34112 - 19968: jis0208<<14 | 0x47<<7 | 0x5A, - 34113 - 19968: jis0208<<14 | 0x48<<7 | 0x00, - 34115 - 19968: jis0208<<14 | 0x27<<7 | 0x38, - 34118 - 19968: jis0212<<14 | 0x38<<7 | 0x20, - 34120 - 19968: jis0208<<14 | 0x47<<7 | 0x5D, - 34121 - 19968: jis0208<<14 | 0x1D<<7 | 0x35, - 34122 - 19968: jis0208<<14 | 0x1B<<7 | 0x28, - 34123 - 19968: jis0208<<14 | 0x48<<7 | 0x02, - 34126 - 19968: jis0208<<14 | 0x15<<7 | 0x1D, - 34127 - 19968: jis0212<<14 | 0x38<<7 | 0x21, - 34128 - 19968: jis0212<<14 | 0x38<<7 | 0x22, - 34129 - 19968: jis0212<<14 | 0x38<<7 | 0x23, - 34130 - 19968: jis0212<<14 | 0x38<<7 | 0x24, - 34131 - 19968: jis0208<<14 | 0x5A<<7 | 0x3D, - 34133 - 19968: jis0208<<14 | 0x48<<7 | 0x03, - 34134 - 19968: jis0212<<14 | 0x38<<7 | 0x26, - 34135 - 19968: jis0208<<14 | 0x28<<7 | 0x58, - 34136 - 19968: jis0208<<14 | 0x47<<7 | 0x5C, - 34137 - 19968: jis0208<<14 | 0x5A<<7 | 0x3E, - 34138 - 19968: jis0208<<14 | 0x47<<7 | 0x35, - 34140 - 19968: jis0212<<14 | 0x38<<7 | 0x28, - 34141 - 19968: jis0212<<14 | 0x38<<7 | 0x29, - 34142 - 19968: jis0212<<14 | 0x38<<7 | 0x2A, - 34143 - 19968: jis0212<<14 | 0x38<<7 | 0x2B, - 34144 - 19968: jis0212<<14 | 0x38<<7 | 0x2C, - 34145 - 19968: jis0212<<14 | 0x38<<7 | 0x2D, - 34146 - 19968: jis0212<<14 | 0x38<<7 | 0x2E, - 34147 - 19968: jis0208<<14 | 0x47<<7 | 0x5B, - 34148 - 19968: jis0212<<14 | 0x38<<7 | 0x2F, - 34152 - 19968: jis0208<<14 | 0x2E<<7 | 0x2E, - 34153 - 19968: jis0208<<14 | 0x25<<7 | 0x01, - 34154 - 19968: jis0208<<14 | 0x28<<7 | 0x52, - 34155 - 19968: jis0208<<14 | 0x5A<<7 | 0x3F, - 34157 - 19968: jis0208<<14 | 0x48<<7 | 0x0A, - 34159 - 19968: jis0212<<14 | 0x38<<7 | 0x31, - 34167 - 19968: jis0208<<14 | 0x48<<7 | 0x10, - 34169 - 19968: jis0212<<14 | 0x38<<7 | 0x32, - 34170 - 19968: jis0212<<14 | 0x38<<7 | 0x33, - 34171 - 19968: jis0212<<14 | 0x38<<7 | 0x34, - 34173 - 19968: jis0212<<14 | 0x38<<7 | 0x35, - 34174 - 19968: jis0208<<14 | 0x48<<7 | 0x11, - 34175 - 19968: jis0212<<14 | 0x38<<7 | 0x36, - 34176 - 19968: jis0208<<14 | 0x48<<7 | 0x04, - 34177 - 19968: jis0212<<14 | 0x38<<7 | 0x37, - 34180 - 19968: jis0208<<14 | 0x26<<7 | 0x55, - 34181 - 19968: jis0212<<14 | 0x38<<7 | 0x38, - 34182 - 19968: jis0212<<14 | 0x38<<7 | 0x39, - 34183 - 19968: jis0208<<14 | 0x48<<7 | 0x0E, - 34184 - 19968: jis0208<<14 | 0x48<<7 | 0x06, - 34185 - 19968: jis0212<<14 | 0x38<<7 | 0x3A, - 34186 - 19968: jis0208<<14 | 0x48<<7 | 0x08, - 34187 - 19968: jis0212<<14 | 0x38<<7 | 0x3B, - 34188 - 19968: jis0212<<14 | 0x38<<7 | 0x3C, - 34191 - 19968: jis0212<<14 | 0x38<<7 | 0x3D, - 34192 - 19968: jis0208<<14 | 0x48<<7 | 0x12, - 34193 - 19968: jis0208<<14 | 0x48<<7 | 0x07, - 34195 - 19968: jis0212<<14 | 0x38<<7 | 0x3E, - 34196 - 19968: jis0208<<14 | 0x48<<7 | 0x0B, - 34199 - 19968: jis0208<<14 | 0x10<<7 | 0x51, - 34200 - 19968: jis0212<<14 | 0x38<<7 | 0x3F, - 34201 - 19968: jis0208<<14 | 0x25<<7 | 0x44, - 34203 - 19968: jis0208<<14 | 0x48<<7 | 0x0C, - 34204 - 19968: jis0208<<14 | 0x48<<7 | 0x0F, - 34205 - 19968: jis0212<<14 | 0x38<<7 | 0x40, - 34207 - 19968: jis0212<<14 | 0x38<<7 | 0x41, - 34208 - 19968: jis0212<<14 | 0x38<<7 | 0x42, - 34210 - 19968: jis0212<<14 | 0x38<<7 | 0x43, - 34212 - 19968: jis0208<<14 | 0x48<<7 | 0x05, - 34213 - 19968: jis0212<<14 | 0x38<<7 | 0x44, - 34214 - 19968: jis0208<<14 | 0x20<<7 | 0x05, - 34215 - 19968: jis0212<<14 | 0x38<<7 | 0x45, - 34216 - 19968: jis0208<<14 | 0x48<<7 | 0x09, - 34217 - 19968: jis0208<<14 | 0x1A<<7 | 0x06, - 34218 - 19968: jis0208<<14 | 0x1E<<7 | 0x24, - 34219 - 19968: jis0208<<14 | 0x16<<7 | 0x0F, - 34220 - 19968: jis0208<<14 | 0x2B<<7 | 0x53, - 34221 - 19968: jis0212<<14 | 0x38<<7 | 0x53, - 34222 - 19968: jis0208<<14 | 0x2B<<7 | 0x58, - 34223 - 19968: jis0208<<14 | 0x1C<<7 | 0x51, - 34224 - 19968: jis0208<<14 | 0x5A<<7 | 0x41, - 34228 - 19968: jis0212<<14 | 0x38<<7 | 0x46, - 34230 - 19968: jis0212<<14 | 0x38<<7 | 0x47, - 34231 - 19968: jis0212<<14 | 0x38<<7 | 0x48, - 34232 - 19968: jis0212<<14 | 0x38<<7 | 0x49, - 34233 - 19968: jis0208<<14 | 0x48<<7 | 0x16, - 34234 - 19968: jis0208<<14 | 0x48<<7 | 0x14, - 34236 - 19968: jis0212<<14 | 0x38<<7 | 0x4A, - 34237 - 19968: jis0212<<14 | 0x38<<7 | 0x4B, - 34238 - 19968: jis0212<<14 | 0x38<<7 | 0x4C, - 34239 - 19968: jis0212<<14 | 0x38<<7 | 0x4D, - 34241 - 19968: jis0208<<14 | 0x2E<<7 | 0x2D, - 34242 - 19968: jis0212<<14 | 0x38<<7 | 0x4E, - 34247 - 19968: jis0212<<14 | 0x38<<7 | 0x4F, - 34249 - 19968: jis0208<<14 | 0x48<<7 | 0x13, - 34250 - 19968: jis0212<<14 | 0x38<<7 | 0x50, - 34251 - 19968: jis0212<<14 | 0x38<<7 | 0x51, - 34253 - 19968: jis0208<<14 | 0x2C<<7 | 0x54, - 34254 - 19968: jis0212<<14 | 0x38<<7 | 0x52, - 34255 - 19968: jis0208<<14 | 0x48<<7 | 0x15, - 34256 - 19968: jis0208<<14 | 0x48<<7 | 0x17, - 34261 - 19968: jis0208<<14 | 0x48<<7 | 0x18, - 34264 - 19968: jis0212<<14 | 0x38<<7 | 0x54, - 34266 - 19968: jis0212<<14 | 0x38<<7 | 0x55, - 34268 - 19968: jis0208<<14 | 0x48<<7 | 0x1B, - 34269 - 19968: jis0208<<14 | 0x48<<7 | 0x19, - 34271 - 19968: jis0212<<14 | 0x38<<7 | 0x56, - 34272 - 19968: jis0212<<14 | 0x38<<7 | 0x57, - 34276 - 19968: jis0208<<14 | 0x25<<7 | 0x02, - 34277 - 19968: jis0208<<14 | 0x48<<7 | 0x1A, - 34278 - 19968: jis0212<<14 | 0x38<<7 | 0x58, - 34280 - 19968: jis0212<<14 | 0x38<<7 | 0x59, - 34281 - 19968: jis0208<<14 | 0x27<<7 | 0x2C, - 34282 - 19968: jis0208<<14 | 0x48<<7 | 0x0D, - 34285 - 19968: jis0212<<14 | 0x38<<7 | 0x5A, - 34291 - 19968: jis0212<<14 | 0x38<<7 | 0x5B, - 34294 - 19968: jis0212<<14 | 0x38<<7 | 0x5C, - 34295 - 19968: jis0208<<14 | 0x1C<<7 | 0x52, - 34297 - 19968: jis0208<<14 | 0x48<<7 | 0x1C, - 34298 - 19968: jis0208<<14 | 0x48<<7 | 0x21, - 34299 - 19968: jis0208<<14 | 0x20<<7 | 0x53, - 34300 - 19968: jis0212<<14 | 0x38<<7 | 0x5D, - 34302 - 19968: jis0208<<14 | 0x48<<7 | 0x20, - 34303 - 19968: jis0212<<14 | 0x39<<7 | 0x00, - 34304 - 19968: jis0212<<14 | 0x39<<7 | 0x01, - 34306 - 19968: jis0208<<14 | 0x48<<7 | 0x01, - 34308 - 19968: jis0212<<14 | 0x39<<7 | 0x02, - 34309 - 19968: jis0212<<14 | 0x39<<7 | 0x03, - 34310 - 19968: jis0208<<14 | 0x48<<7 | 0x22, - 34311 - 19968: jis0208<<14 | 0x20<<7 | 0x28, - 34314 - 19968: jis0208<<14 | 0x48<<7 | 0x1D, - 34315 - 19968: jis0208<<14 | 0x48<<7 | 0x1F, - 34317 - 19968: jis0212<<14 | 0x39<<7 | 0x04, - 34318 - 19968: jis0212<<14 | 0x39<<7 | 0x05, - 34320 - 19968: jis0212<<14 | 0x39<<7 | 0x06, - 34321 - 19968: jis0212<<14 | 0x39<<7 | 0x07, - 34322 - 19968: jis0212<<14 | 0x39<<7 | 0x08, - 34323 - 19968: jis0208<<14 | 0x48<<7 | 0x1E, - 34326 - 19968: jis0208<<14 | 0x3C<<7 | 0x10, - 34327 - 19968: jis0208<<14 | 0x3C<<7 | 0x01, - 34328 - 19968: jis0212<<14 | 0x39<<7 | 0x09, - 34329 - 19968: jis0212<<14 | 0x39<<7 | 0x0A, - 34330 - 19968: jis0208<<14 | 0x48<<7 | 0x24, - 34331 - 19968: jis0212<<14 | 0x39<<7 | 0x0B, - 34334 - 19968: jis0212<<14 | 0x39<<7 | 0x0C, - 34337 - 19968: jis0212<<14 | 0x39<<7 | 0x0D, - 34338 - 19968: jis0208<<14 | 0x48<<7 | 0x23, - 34343 - 19968: jis0212<<14 | 0x39<<7 | 0x0E, - 34345 - 19968: jis0212<<14 | 0x39<<7 | 0x0F, - 34349 - 19968: jis0208<<14 | 0x2C<<7 | 0x55, - 34351 - 19968: jis0208<<14 | 0x41<<7 | 0x1B, - 34352 - 19968: jis0208<<14 | 0x48<<7 | 0x25, - 34358 - 19968: jis0212<<14 | 0x39<<7 | 0x10, - 34360 - 19968: jis0212<<14 | 0x39<<7 | 0x11, - 34362 - 19968: jis0212<<14 | 0x39<<7 | 0x12, - 34364 - 19968: jis0212<<14 | 0x39<<7 | 0x13, - 34365 - 19968: jis0212<<14 | 0x39<<7 | 0x14, - 34367 - 19968: jis0208<<14 | 0x48<<7 | 0x26, - 34368 - 19968: jis0212<<14 | 0x39<<7 | 0x15, - 34369 - 19968: jis0212<<14 | 0x17<<7 | 0x45, - 34370 - 19968: jis0212<<14 | 0x39<<7 | 0x16, - 34374 - 19968: jis0212<<14 | 0x39<<7 | 0x17, - 34381 - 19968: jis0208<<14 | 0x48<<7 | 0x27, - 34382 - 19968: jis0208<<14 | 0x17<<7 | 0x36, - 34384 - 19968: jis0208<<14 | 0x14<<7 | 0x33, - 34386 - 19968: jis0212<<14 | 0x39<<7 | 0x18, - 34387 - 19968: jis0212<<14 | 0x39<<7 | 0x19, - 34388 - 19968: jis0208<<14 | 0x48<<7 | 0x29, - 34389 - 19968: jis0208<<14 | 0x30<<7 | 0x3C, - 34390 - 19968: jis0212<<14 | 0x39<<7 | 0x1A, - 34391 - 19968: jis0212<<14 | 0x39<<7 | 0x1B, - 34392 - 19968: jis0212<<14 | 0x39<<7 | 0x1C, - 34393 - 19968: jis0212<<14 | 0x39<<7 | 0x1D, - 34394 - 19968: jis0208<<14 | 0x14<<7 | 0x54, - 34396 - 19968: jis0208<<14 | 0x2D<<7 | 0x19, - 34397 - 19968: jis0212<<14 | 0x39<<7 | 0x1E, - 34398 - 19968: jis0208<<14 | 0x15<<7 | 0x52, - 34399 - 19968: jis0208<<14 | 0x48<<7 | 0x2A, - 34400 - 19968: jis0212<<14 | 0x39<<7 | 0x1F, - 34401 - 19968: jis0212<<14 | 0x39<<7 | 0x20, - 34402 - 19968: jis0212<<14 | 0x39<<7 | 0x21, - 34403 - 19968: jis0212<<14 | 0x39<<7 | 0x22, - 34404 - 19968: jis0212<<14 | 0x39<<7 | 0x23, - 34407 - 19968: jis0208<<14 | 0x48<<7 | 0x2B, - 34409 - 19968: jis0212<<14 | 0x39<<7 | 0x24, - 34411 - 19968: jis0208<<14 | 0x22<<7 | 0x4D, - 34412 - 19968: jis0212<<14 | 0x39<<7 | 0x25, - 34415 - 19968: jis0212<<14 | 0x39<<7 | 0x26, - 34417 - 19968: jis0208<<14 | 0x48<<7 | 0x2C, - 34421 - 19968: jis0212<<14 | 0x39<<7 | 0x27, - 34422 - 19968: jis0212<<14 | 0x39<<7 | 0x28, - 34423 - 19968: jis0212<<14 | 0x39<<7 | 0x29, - 34425 - 19968: jis0208<<14 | 0x25<<7 | 0x59, - 34426 - 19968: jis0212<<14 | 0x39<<7 | 0x2A, - 34427 - 19968: jis0208<<14 | 0x0F<<7 | 0x19, - 34440 - 19968: jis0212<<14 | 0x39<<7 | 0x4C, - 34442 - 19968: jis0208<<14 | 0x11<<7 | 0x42, - 34443 - 19968: jis0208<<14 | 0x48<<7 | 0x31, - 34444 - 19968: jis0208<<14 | 0x48<<7 | 0x32, - 34445 - 19968: jis0212<<14 | 0x39<<7 | 0x2B, - 34449 - 19968: jis0212<<14 | 0x39<<7 | 0x2C, - 34451 - 19968: jis0208<<14 | 0x48<<7 | 0x2D, - 34453 - 19968: jis0208<<14 | 0x1A<<7 | 0x1C, - 34454 - 19968: jis0212<<14 | 0x39<<7 | 0x2D, - 34456 - 19968: jis0212<<14 | 0x39<<7 | 0x2E, - 34458 - 19968: jis0212<<14 | 0x39<<7 | 0x2F, - 34460 - 19968: jis0212<<14 | 0x39<<7 | 0x30, - 34465 - 19968: jis0212<<14 | 0x39<<7 | 0x31, - 34467 - 19968: jis0208<<14 | 0x48<<7 | 0x2E, - 34468 - 19968: jis0208<<14 | 0x26<<7 | 0x21, - 34470 - 19968: jis0212<<14 | 0x39<<7 | 0x32, - 34471 - 19968: jis0212<<14 | 0x39<<7 | 0x33, - 34472 - 19968: jis0212<<14 | 0x39<<7 | 0x34, - 34473 - 19968: jis0208<<14 | 0x48<<7 | 0x2F, - 34474 - 19968: jis0208<<14 | 0x48<<7 | 0x30, - 34475 - 19968: jis0208<<14 | 0x48<<7 | 0x3A, - 34477 - 19968: jis0212<<14 | 0x39<<7 | 0x35, - 34479 - 19968: jis0208<<14 | 0x48<<7 | 0x34, - 34480 - 19968: jis0208<<14 | 0x48<<7 | 0x37, - 34481 - 19968: jis0212<<14 | 0x39<<7 | 0x36, - 34483 - 19968: jis0212<<14 | 0x39<<7 | 0x37, - 34484 - 19968: jis0212<<14 | 0x39<<7 | 0x38, - 34485 - 19968: jis0212<<14 | 0x39<<7 | 0x39, - 34486 - 19968: jis0208<<14 | 0x48<<7 | 0x33, - 34487 - 19968: jis0212<<14 | 0x39<<7 | 0x3A, - 34488 - 19968: jis0212<<14 | 0x39<<7 | 0x3B, - 34489 - 19968: jis0212<<14 | 0x39<<7 | 0x3C, - 34495 - 19968: jis0212<<14 | 0x39<<7 | 0x3D, - 34496 - 19968: jis0212<<14 | 0x39<<7 | 0x3E, - 34497 - 19968: jis0212<<14 | 0x39<<7 | 0x3F, - 34499 - 19968: jis0212<<14 | 0x39<<7 | 0x40, - 34500 - 19968: jis0208<<14 | 0x48<<7 | 0x35, - 34501 - 19968: jis0212<<14 | 0x39<<7 | 0x41, - 34502 - 19968: jis0208<<14 | 0x48<<7 | 0x36, - 34503 - 19968: jis0208<<14 | 0x1B<<7 | 0x37, - 34505 - 19968: jis0208<<14 | 0x48<<7 | 0x38, - 34507 - 19968: jis0208<<14 | 0x22<<7 | 0x20, - 34509 - 19968: jis0208<<14 | 0x16<<7 | 0x35, - 34510 - 19968: jis0208<<14 | 0x12<<7 | 0x21, - 34513 - 19968: jis0212<<14 | 0x39<<7 | 0x42, - 34514 - 19968: jis0212<<14 | 0x39<<7 | 0x43, - 34516 - 19968: jis0208<<14 | 0x48<<7 | 0x3B, - 34517 - 19968: jis0212<<14 | 0x39<<7 | 0x44, - 34519 - 19968: jis0212<<14 | 0x39<<7 | 0x45, - 34521 - 19968: jis0208<<14 | 0x12<<7 | 0x1E, - 34522 - 19968: jis0212<<14 | 0x39<<7 | 0x46, - 34523 - 19968: jis0208<<14 | 0x48<<7 | 0x40, - 34524 - 19968: jis0212<<14 | 0x39<<7 | 0x47, - 34526 - 19968: jis0208<<14 | 0x48<<7 | 0x3C, - 34527 - 19968: jis0208<<14 | 0x48<<7 | 0x3F, - 34528 - 19968: jis0212<<14 | 0x39<<7 | 0x48, - 34531 - 19968: jis0212<<14 | 0x39<<7 | 0x49, - 34532 - 19968: jis0208<<14 | 0x27<<7 | 0x19, - 34533 - 19968: jis0212<<14 | 0x39<<7 | 0x4A, - 34535 - 19968: jis0212<<14 | 0x39<<7 | 0x4B, - 34537 - 19968: jis0208<<14 | 0x48<<7 | 0x3D, - 34540 - 19968: jis0208<<14 | 0x48<<7 | 0x3E, - 34541 - 19968: jis0208<<14 | 0x28<<7 | 0x27, - 34542 - 19968: jis0208<<14 | 0x27<<7 | 0x39, - 34543 - 19968: jis0208<<14 | 0x48<<7 | 0x41, - 34552 - 19968: jis0208<<14 | 0x21<<7 | 0x5C, - 34553 - 19968: jis0208<<14 | 0x48<<7 | 0x4B, - 34554 - 19968: jis0212<<14 | 0x39<<7 | 0x4D, - 34555 - 19968: jis0208<<14 | 0x48<<7 | 0x47, - 34556 - 19968: jis0212<<14 | 0x39<<7 | 0x4E, - 34557 - 19968: jis0212<<14 | 0x39<<7 | 0x4F, - 34558 - 19968: jis0208<<14 | 0x11<<7 | 0x4A, - 34560 - 19968: jis0208<<14 | 0x48<<7 | 0x45, - 34562 - 19968: jis0208<<14 | 0x2A<<7 | 0x09, - 34563 - 19968: jis0208<<14 | 0x48<<7 | 0x46, - 34564 - 19968: jis0212<<14 | 0x39<<7 | 0x50, - 34565 - 19968: jis0212<<14 | 0x39<<7 | 0x51, - 34566 - 19968: jis0208<<14 | 0x48<<7 | 0x43, - 34567 - 19968: jis0212<<14 | 0x39<<7 | 0x52, - 34568 - 19968: jis0208<<14 | 0x48<<7 | 0x44, - 34569 - 19968: jis0208<<14 | 0x48<<7 | 0x49, - 34570 - 19968: jis0208<<14 | 0x48<<7 | 0x4C, - 34571 - 19968: jis0212<<14 | 0x39<<7 | 0x53, - 34573 - 19968: jis0208<<14 | 0x48<<7 | 0x4A, - 34574 - 19968: jis0212<<14 | 0x39<<7 | 0x54, - 34575 - 19968: jis0212<<14 | 0x39<<7 | 0x55, - 34576 - 19968: jis0212<<14 | 0x39<<7 | 0x56, - 34577 - 19968: jis0208<<14 | 0x48<<7 | 0x48, - 34578 - 19968: jis0208<<14 | 0x48<<7 | 0x42, - 34579 - 19968: jis0212<<14 | 0x39<<7 | 0x57, - 34580 - 19968: jis0212<<14 | 0x39<<7 | 0x58, - 34584 - 19968: jis0208<<14 | 0x22<<7 | 0x37, - 34585 - 19968: jis0212<<14 | 0x39<<7 | 0x59, - 34586 - 19968: jis0208<<14 | 0x48<<7 | 0x53, - 34588 - 19968: jis0208<<14 | 0x2B<<7 | 0x09, - 34590 - 19968: jis0212<<14 | 0x39<<7 | 0x5A, - 34591 - 19968: jis0212<<14 | 0x39<<7 | 0x5B, - 34593 - 19968: jis0212<<14 | 0x39<<7 | 0x5C, - 34595 - 19968: jis0212<<14 | 0x39<<7 | 0x5D, - 34597 - 19968: jis0208<<14 | 0x48<<7 | 0x51, - 34600 - 19968: jis0212<<14 | 0x3A<<7 | 0x00, - 34601 - 19968: jis0208<<14 | 0x48<<7 | 0x52, - 34606 - 19968: jis0212<<14 | 0x3A<<7 | 0x01, - 34607 - 19968: jis0212<<14 | 0x3A<<7 | 0x02, - 34609 - 19968: jis0212<<14 | 0x3A<<7 | 0x03, - 34610 - 19968: jis0212<<14 | 0x3A<<7 | 0x04, - 34612 - 19968: jis0208<<14 | 0x48<<7 | 0x4D, - 34615 - 19968: jis0208<<14 | 0x48<<7 | 0x4F, - 34617 - 19968: jis0212<<14 | 0x3A<<7 | 0x05, - 34618 - 19968: jis0212<<14 | 0x3A<<7 | 0x06, - 34619 - 19968: jis0208<<14 | 0x48<<7 | 0x50, - 34620 - 19968: jis0212<<14 | 0x3A<<7 | 0x07, - 34621 - 19968: jis0212<<14 | 0x3A<<7 | 0x08, - 34622 - 19968: jis0212<<14 | 0x3A<<7 | 0x09, - 34623 - 19968: jis0208<<14 | 0x48<<7 | 0x4E, - 34624 - 19968: jis0212<<14 | 0x3A<<7 | 0x0A, - 34627 - 19968: jis0212<<14 | 0x3A<<7 | 0x0B, - 34629 - 19968: jis0212<<14 | 0x3A<<7 | 0x0C, - 34633 - 19968: jis0208<<14 | 0x1F<<7 | 0x45, - 34635 - 19968: jis0208<<14 | 0x2E<<7 | 0x18, - 34636 - 19968: jis0208<<14 | 0x48<<7 | 0x57, - 34637 - 19968: jis0212<<14 | 0x3A<<7 | 0x0D, - 34638 - 19968: jis0208<<14 | 0x48<<7 | 0x58, - 34643 - 19968: jis0208<<14 | 0x49<<7 | 0x00, - 34645 - 19968: jis0208<<14 | 0x1E<<7 | 0x09, - 34647 - 19968: jis0208<<14 | 0x48<<7 | 0x5A, - 34648 - 19968: jis0212<<14 | 0x3A<<7 | 0x0E, - 34649 - 19968: jis0208<<14 | 0x48<<7 | 0x5D, - 34653 - 19968: jis0212<<14 | 0x3A<<7 | 0x0F, - 34655 - 19968: jis0208<<14 | 0x48<<7 | 0x55, - 34656 - 19968: jis0208<<14 | 0x48<<7 | 0x54, - 34657 - 19968: jis0212<<14 | 0x3A<<7 | 0x10, - 34659 - 19968: jis0208<<14 | 0x49<<7 | 0x01, - 34660 - 19968: jis0212<<14 | 0x3A<<7 | 0x11, - 34661 - 19968: jis0212<<14 | 0x3A<<7 | 0x12, - 34662 - 19968: jis0208<<14 | 0x11<<7 | 0x3B, - 34664 - 19968: jis0208<<14 | 0x48<<7 | 0x5B, - 34666 - 19968: jis0208<<14 | 0x49<<7 | 0x02, - 34670 - 19968: jis0208<<14 | 0x48<<7 | 0x5C, - 34671 - 19968: jis0212<<14 | 0x3A<<7 | 0x13, - 34673 - 19968: jis0212<<14 | 0x3A<<7 | 0x14, - 34674 - 19968: jis0212<<14 | 0x3A<<7 | 0x15, - 34676 - 19968: jis0208<<14 | 0x48<<7 | 0x59, - 34678 - 19968: jis0208<<14 | 0x23<<7 | 0x12, - 34680 - 19968: jis0208<<14 | 0x48<<7 | 0x56, - 34683 - 19968: jis0212<<14 | 0x3A<<7 | 0x16, - 34687 - 19968: jis0208<<14 | 0x26<<7 | 0x47, - 34690 - 19968: jis0208<<14 | 0x49<<7 | 0x06, - 34691 - 19968: jis0212<<14 | 0x3A<<7 | 0x17, - 34692 - 19968: jis0212<<14 | 0x3A<<7 | 0x18, - 34693 - 19968: jis0212<<14 | 0x3A<<7 | 0x19, - 34694 - 19968: jis0212<<14 | 0x3A<<7 | 0x1A, - 34695 - 19968: jis0212<<14 | 0x3A<<7 | 0x1B, - 34696 - 19968: jis0212<<14 | 0x3A<<7 | 0x1C, - 34697 - 19968: jis0212<<14 | 0x3A<<7 | 0x1D, - 34699 - 19968: jis0212<<14 | 0x3A<<7 | 0x1E, - 34700 - 19968: jis0212<<14 | 0x3A<<7 | 0x1F, - 34701 - 19968: jis0208<<14 | 0x2C<<7 | 0x1A, - 34704 - 19968: jis0212<<14 | 0x3A<<7 | 0x20, - 34707 - 19968: jis0212<<14 | 0x3A<<7 | 0x21, - 34709 - 19968: jis0212<<14 | 0x3A<<7 | 0x22, - 34711 - 19968: jis0212<<14 | 0x3A<<7 | 0x23, - 34712 - 19968: jis0212<<14 | 0x3A<<7 | 0x24, - 34713 - 19968: jis0212<<14 | 0x3A<<7 | 0x25, - 34718 - 19968: jis0212<<14 | 0x3A<<7 | 0x26, - 34719 - 19968: jis0208<<14 | 0x49<<7 | 0x05, - 34720 - 19968: jis0212<<14 | 0x3A<<7 | 0x27, - 34722 - 19968: jis0208<<14 | 0x49<<7 | 0x04, - 34723 - 19968: jis0212<<14 | 0x3A<<7 | 0x28, - 34727 - 19968: jis0212<<14 | 0x3A<<7 | 0x29, - 34731 - 19968: jis0208<<14 | 0x49<<7 | 0x0D, - 34732 - 19968: jis0212<<14 | 0x3A<<7 | 0x2A, - 34733 - 19968: jis0212<<14 | 0x3A<<7 | 0x2B, - 34734 - 19968: jis0212<<14 | 0x3A<<7 | 0x2C, - 34735 - 19968: jis0208<<14 | 0x49<<7 | 0x07, - 34737 - 19968: jis0212<<14 | 0x3A<<7 | 0x2D, - 34739 - 19968: jis0208<<14 | 0x49<<7 | 0x0F, - 34741 - 19968: jis0212<<14 | 0x3A<<7 | 0x2E, - 34746 - 19968: jis0208<<14 | 0x2C<<7 | 0x45, - 34747 - 19968: jis0208<<14 | 0x49<<7 | 0x12, - 34749 - 19968: jis0208<<14 | 0x49<<7 | 0x09, - 34750 - 19968: jis0212<<14 | 0x3A<<7 | 0x2F, - 34751 - 19968: jis0212<<14 | 0x3A<<7 | 0x30, - 34752 - 19968: jis0208<<14 | 0x49<<7 | 0x0A, - 34753 - 19968: jis0212<<14 | 0x3A<<7 | 0x31, - 34756 - 19968: jis0208<<14 | 0x49<<7 | 0x0E, - 34758 - 19968: jis0208<<14 | 0x49<<7 | 0x11, - 34759 - 19968: jis0208<<14 | 0x49<<7 | 0x10, - 34760 - 19968: jis0212<<14 | 0x3A<<7 | 0x32, - 34761 - 19968: jis0212<<14 | 0x3A<<7 | 0x33, - 34762 - 19968: jis0212<<14 | 0x3A<<7 | 0x34, - 34763 - 19968: jis0208<<14 | 0x49<<7 | 0x08, - 34766 - 19968: jis0212<<14 | 0x3A<<7 | 0x35, - 34768 - 19968: jis0208<<14 | 0x49<<7 | 0x0B, - 34770 - 19968: jis0208<<14 | 0x49<<7 | 0x1C, - 34773 - 19968: jis0212<<14 | 0x3A<<7 | 0x36, - 34774 - 19968: jis0212<<14 | 0x3A<<7 | 0x37, - 34777 - 19968: jis0212<<14 | 0x3A<<7 | 0x38, - 34778 - 19968: jis0212<<14 | 0x3A<<7 | 0x39, - 34780 - 19968: jis0212<<14 | 0x3A<<7 | 0x3A, - 34783 - 19968: jis0212<<14 | 0x3A<<7 | 0x3B, - 34784 - 19968: jis0208<<14 | 0x49<<7 | 0x15, - 34786 - 19968: jis0212<<14 | 0x3A<<7 | 0x3C, - 34787 - 19968: jis0212<<14 | 0x3A<<7 | 0x3D, - 34788 - 19968: jis0212<<14 | 0x3A<<7 | 0x3E, - 34794 - 19968: jis0212<<14 | 0x3A<<7 | 0x3F, - 34795 - 19968: jis0212<<14 | 0x3A<<7 | 0x40, - 34797 - 19968: jis0212<<14 | 0x3A<<7 | 0x41, - 34799 - 19968: jis0208<<14 | 0x49<<7 | 0x13, - 34801 - 19968: jis0212<<14 | 0x3A<<7 | 0x42, - 34802 - 19968: jis0208<<14 | 0x49<<7 | 0x14, - 34803 - 19968: jis0212<<14 | 0x3A<<7 | 0x43, - 34806 - 19968: jis0208<<14 | 0x49<<7 | 0x19, - 34807 - 19968: jis0208<<14 | 0x49<<7 | 0x1A, - 34808 - 19968: jis0212<<14 | 0x3A<<7 | 0x44, - 34809 - 19968: jis0208<<14 | 0x12<<7 | 0x09, - 34810 - 19968: jis0212<<14 | 0x3A<<7 | 0x45, - 34811 - 19968: jis0208<<14 | 0x14<<7 | 0x21, - 34814 - 19968: jis0208<<14 | 0x49<<7 | 0x18, - 34815 - 19968: jis0212<<14 | 0x3A<<7 | 0x46, - 34817 - 19968: jis0212<<14 | 0x3A<<7 | 0x47, - 34819 - 19968: jis0212<<14 | 0x3A<<7 | 0x48, - 34821 - 19968: jis0208<<14 | 0x49<<7 | 0x03, - 34822 - 19968: jis0212<<14 | 0x3A<<7 | 0x49, - 34823 - 19968: jis0208<<14 | 0x5A<<7 | 0x44, - 34825 - 19968: jis0212<<14 | 0x3A<<7 | 0x4A, - 34826 - 19968: jis0212<<14 | 0x3A<<7 | 0x4B, - 34827 - 19968: jis0212<<14 | 0x3A<<7 | 0x4C, - 34829 - 19968: jis0208<<14 | 0x49<<7 | 0x17, - 34830 - 19968: jis0208<<14 | 0x49<<7 | 0x1B, - 34831 - 19968: jis0208<<14 | 0x49<<7 | 0x16, - 34832 - 19968: jis0212<<14 | 0x3A<<7 | 0x4D, - 34833 - 19968: jis0208<<14 | 0x49<<7 | 0x1D, - 34834 - 19968: jis0212<<14 | 0x3A<<7 | 0x4F, - 34835 - 19968: jis0212<<14 | 0x3A<<7 | 0x50, - 34836 - 19968: jis0212<<14 | 0x3A<<7 | 0x51, - 34837 - 19968: jis0208<<14 | 0x49<<7 | 0x1F, - 34838 - 19968: jis0208<<14 | 0x49<<7 | 0x1E, - 34840 - 19968: jis0212<<14 | 0x3A<<7 | 0x52, - 34841 - 19968: jis0212<<14 | 0x3A<<7 | 0x4E, - 34842 - 19968: jis0212<<14 | 0x3A<<7 | 0x53, - 34843 - 19968: jis0212<<14 | 0x3A<<7 | 0x54, - 34844 - 19968: jis0212<<14 | 0x3A<<7 | 0x55, - 34846 - 19968: jis0212<<14 | 0x3A<<7 | 0x56, - 34847 - 19968: jis0212<<14 | 0x3A<<7 | 0x57, - 34849 - 19968: jis0208<<14 | 0x49<<7 | 0x21, - 34850 - 19968: jis0208<<14 | 0x49<<7 | 0x20, - 34851 - 19968: jis0208<<14 | 0x48<<7 | 0x39, - 34855 - 19968: jis0208<<14 | 0x49<<7 | 0x25, - 34856 - 19968: jis0212<<14 | 0x3A<<7 | 0x58, - 34861 - 19968: jis0212<<14 | 0x3A<<7 | 0x59, - 34862 - 19968: jis0212<<14 | 0x3A<<7 | 0x5A, - 34864 - 19968: jis0212<<14 | 0x3A<<7 | 0x5B, - 34865 - 19968: jis0208<<14 | 0x49<<7 | 0x22, - 34866 - 19968: jis0212<<14 | 0x3A<<7 | 0x5C, - 34869 - 19968: jis0212<<14 | 0x3A<<7 | 0x5D, - 34870 - 19968: jis0208<<14 | 0x49<<7 | 0x23, - 34873 - 19968: jis0208<<14 | 0x49<<7 | 0x24, - 34874 - 19968: jis0212<<14 | 0x3B<<7 | 0x00, - 34875 - 19968: jis0208<<14 | 0x49<<7 | 0x26, - 34876 - 19968: jis0212<<14 | 0x3B<<7 | 0x01, - 34880 - 19968: jis0208<<14 | 0x16<<7 | 0x4B, - 34881 - 19968: jis0212<<14 | 0x3B<<7 | 0x02, - 34882 - 19968: jis0208<<14 | 0x49<<7 | 0x28, - 34883 - 19968: jis0212<<14 | 0x3B<<7 | 0x03, - 34884 - 19968: jis0208<<14 | 0x49<<7 | 0x27, - 34885 - 19968: jis0212<<14 | 0x3B<<7 | 0x04, - 34886 - 19968: jis0208<<14 | 0x1C<<7 | 0x0F, - 34888 - 19968: jis0212<<14 | 0x3B<<7 | 0x05, - 34889 - 19968: jis0212<<14 | 0x3B<<7 | 0x06, - 34890 - 19968: jis0212<<14 | 0x3B<<7 | 0x07, - 34891 - 19968: jis0212<<14 | 0x3B<<7 | 0x08, - 34892 - 19968: jis0208<<14 | 0x18<<7 | 0x33, - 34893 - 19968: jis0208<<14 | 0x3D<<7 | 0x06, - 34894 - 19968: jis0212<<14 | 0x3B<<7 | 0x09, - 34897 - 19968: jis0212<<14 | 0x3B<<7 | 0x0A, - 34898 - 19968: jis0208<<14 | 0x49<<7 | 0x29, - 34899 - 19968: jis0208<<14 | 0x1C<<7 | 0x30, - 34901 - 19968: jis0212<<14 | 0x3B<<7 | 0x0B, - 34902 - 19968: jis0212<<14 | 0x3B<<7 | 0x0C, - 34903 - 19968: jis0208<<14 | 0x12<<7 | 0x18, - 34904 - 19968: jis0212<<14 | 0x3B<<7 | 0x0D, - 34905 - 19968: jis0208<<14 | 0x49<<7 | 0x2A, - 34906 - 19968: jis0212<<14 | 0x3B<<7 | 0x0E, - 34907 - 19968: jis0208<<14 | 0x10<<7 | 0x31, - 34908 - 19968: jis0212<<14 | 0x3B<<7 | 0x0F, - 34909 - 19968: jis0208<<14 | 0x1D<<7 | 0x36, - 34910 - 19968: jis0208<<14 | 0x49<<7 | 0x2B, - 34911 - 19968: jis0212<<14 | 0x3B<<7 | 0x10, - 34912 - 19968: jis0212<<14 | 0x3B<<7 | 0x11, - 34913 - 19968: jis0208<<14 | 0x18<<7 | 0x34, - 34914 - 19968: jis0208<<14 | 0x49<<7 | 0x2C, - 34915 - 19968: jis0208<<14 | 0x0F<<7 | 0x40, - 34916 - 19968: jis0212<<14 | 0x3B<<7 | 0x12, - 34920 - 19968: jis0208<<14 | 0x28<<7 | 0x1C, - 34921 - 19968: jis0212<<14 | 0x3B<<7 | 0x13, - 34923 - 19968: jis0208<<14 | 0x49<<7 | 0x2D, - 34928 - 19968: jis0208<<14 | 0x1E<<7 | 0x49, - 34929 - 19968: jis0212<<14 | 0x3B<<7 | 0x14, - 34930 - 19968: jis0208<<14 | 0x49<<7 | 0x34, - 34933 - 19968: jis0208<<14 | 0x49<<7 | 0x31, - 34935 - 19968: jis0208<<14 | 0x22<<7 | 0x4E, - 34937 - 19968: jis0212<<14 | 0x3B<<7 | 0x15, - 34939 - 19968: jis0212<<14 | 0x3B<<7 | 0x16, - 34941 - 19968: jis0208<<14 | 0x49<<7 | 0x32, - 34942 - 19968: jis0208<<14 | 0x49<<7 | 0x2F, - 34943 - 19968: jis0208<<14 | 0x15<<7 | 0x3D, - 34944 - 19968: jis0212<<14 | 0x3B<<7 | 0x17, - 34945 - 19968: jis0208<<14 | 0x49<<7 | 0x2E, - 34946 - 19968: jis0208<<14 | 0x49<<7 | 0x35, - 34952 - 19968: jis0208<<14 | 0x16<<7 | 0x15, - 34955 - 19968: jis0208<<14 | 0x21<<7 | 0x3D, - 34957 - 19968: jis0208<<14 | 0x49<<7 | 0x3B, - 34962 - 19968: jis0208<<14 | 0x49<<7 | 0x37, - 34966 - 19968: jis0208<<14 | 0x21<<7 | 0x14, - 34967 - 19968: jis0208<<14 | 0x49<<7 | 0x36, - 34968 - 19968: jis0212<<14 | 0x3B<<7 | 0x18, - 34969 - 19968: jis0208<<14 | 0x49<<7 | 0x39, - 34970 - 19968: jis0212<<14 | 0x3B<<7 | 0x19, - 34971 - 19968: jis0212<<14 | 0x3B<<7 | 0x1A, - 34972 - 19968: jis0212<<14 | 0x3B<<7 | 0x1B, - 34974 - 19968: jis0208<<14 | 0x49<<7 | 0x30, - 34975 - 19968: jis0212<<14 | 0x3B<<7 | 0x1C, - 34976 - 19968: jis0212<<14 | 0x3B<<7 | 0x1D, - 34978 - 19968: jis0208<<14 | 0x49<<7 | 0x3A, - 34980 - 19968: jis0208<<14 | 0x49<<7 | 0x3C, - 34984 - 19968: jis0212<<14 | 0x3B<<7 | 0x1E, - 34986 - 19968: jis0212<<14 | 0x3B<<7 | 0x1F, - 34987 - 19968: jis0208<<14 | 0x27<<7 | 0x4E, - 34990 - 19968: jis0208<<14 | 0x49<<7 | 0x38, - 34992 - 19968: jis0208<<14 | 0x49<<7 | 0x3D, - 34993 - 19968: jis0208<<14 | 0x49<<7 | 0x3F, - 34996 - 19968: jis0208<<14 | 0x17<<7 | 0x32, - 34997 - 19968: jis0208<<14 | 0x49<<7 | 0x33, - 34999 - 19968: jis0208<<14 | 0x0F<<7 | 0x20, - 35002 - 19968: jis0212<<14 | 0x3B<<7 | 0x20, - 35005 - 19968: jis0212<<14 | 0x3B<<7 | 0x21, - 35006 - 19968: jis0212<<14 | 0x3B<<7 | 0x22, - 35007 - 19968: jis0208<<14 | 0x49<<7 | 0x3E, - 35008 - 19968: jis0212<<14 | 0x3B<<7 | 0x23, - 35009 - 19968: jis0208<<14 | 0x19<<7 | 0x3A, - 35010 - 19968: jis0208<<14 | 0x2D<<7 | 0x55, - 35011 - 19968: jis0208<<14 | 0x49<<7 | 0x40, - 35012 - 19968: jis0208<<14 | 0x49<<7 | 0x41, - 35013 - 19968: jis0208<<14 | 0x20<<7 | 0x54, - 35018 - 19968: jis0212<<14 | 0x3B<<7 | 0x24, - 35019 - 19968: jis0212<<14 | 0x3B<<7 | 0x25, - 35020 - 19968: jis0212<<14 | 0x3B<<7 | 0x26, - 35021 - 19968: jis0212<<14 | 0x3B<<7 | 0x27, - 35022 - 19968: jis0212<<14 | 0x3B<<7 | 0x28, - 35023 - 19968: jis0208<<14 | 0x2D<<7 | 0x01, - 35025 - 19968: jis0212<<14 | 0x3B<<7 | 0x29, - 35026 - 19968: jis0212<<14 | 0x3B<<7 | 0x2A, - 35027 - 19968: jis0212<<14 | 0x3B<<7 | 0x2B, - 35028 - 19968: jis0208<<14 | 0x49<<7 | 0x42, - 35029 - 19968: jis0208<<14 | 0x2C<<7 | 0x14, - 35032 - 19968: jis0208<<14 | 0x49<<7 | 0x43, - 35033 - 19968: jis0208<<14 | 0x49<<7 | 0x44, - 35035 - 19968: jis0212<<14 | 0x3B<<7 | 0x2C, - 35036 - 19968: jis0208<<14 | 0x29<<7 | 0x43, - 35037 - 19968: jis0208<<14 | 0x49<<7 | 0x45, - 35038 - 19968: jis0212<<14 | 0x3B<<7 | 0x2D, - 35039 - 19968: jis0208<<14 | 0x19<<7 | 0x1F, - 35041 - 19968: jis0208<<14 | 0x2D<<7 | 0x02, - 35047 - 19968: jis0212<<14 | 0x3B<<7 | 0x2E, - 35048 - 19968: jis0208<<14 | 0x49<<7 | 0x4A, - 35055 - 19968: jis0212<<14 | 0x3B<<7 | 0x2F, - 35056 - 19968: jis0212<<14 | 0x3B<<7 | 0x30, - 35057 - 19968: jis0212<<14 | 0x3B<<7 | 0x31, - 35058 - 19968: jis0208<<14 | 0x49<<7 | 0x4B, - 35059 - 19968: jis0208<<14 | 0x1D<<7 | 0x37, - 35060 - 19968: jis0208<<14 | 0x49<<7 | 0x49, - 35061 - 19968: jis0208<<14 | 0x5A<<7 | 0x45, - 35063 - 19968: jis0212<<14 | 0x3B<<7 | 0x33, - 35064 - 19968: jis0208<<14 | 0x2C<<7 | 0x46, - 35065 - 19968: jis0208<<14 | 0x49<<7 | 0x46, - 35068 - 19968: jis0208<<14 | 0x49<<7 | 0x48, - 35069 - 19968: jis0208<<14 | 0x1F<<7 | 0x1C, - 35070 - 19968: jis0208<<14 | 0x1E<<7 | 0x5D, - 35073 - 19968: jis0212<<14 | 0x3B<<7 | 0x34, - 35074 - 19968: jis0208<<14 | 0x49<<7 | 0x47, - 35076 - 19968: jis0208<<14 | 0x49<<7 | 0x4C, - 35078 - 19968: jis0212<<14 | 0x3B<<7 | 0x35, - 35079 - 19968: jis0208<<14 | 0x29<<7 | 0x02, - 35082 - 19968: jis0208<<14 | 0x49<<7 | 0x4E, - 35084 - 19968: jis0208<<14 | 0x49<<7 | 0x4D, - 35085 - 19968: jis0212<<14 | 0x3B<<7 | 0x36, - 35086 - 19968: jis0212<<14 | 0x3B<<7 | 0x37, - 35087 - 19968: jis0212<<14 | 0x3B<<7 | 0x38, - 35088 - 19968: jis0208<<14 | 0x12<<7 | 0x4B, - 35090 - 19968: jis0208<<14 | 0x2A<<7 | 0x0A, - 35091 - 19968: jis0208<<14 | 0x49<<7 | 0x4F, - 35093 - 19968: jis0212<<14 | 0x3B<<7 | 0x39, - 35094 - 19968: jis0212<<14 | 0x3B<<7 | 0x3A, - 35096 - 19968: jis0212<<14 | 0x3B<<7 | 0x3B, - 35097 - 19968: jis0212<<14 | 0x3B<<7 | 0x3C, - 35098 - 19968: jis0212<<14 | 0x3B<<7 | 0x3D, - 35100 - 19968: jis0208<<14 | 0x58<<7 | 0x01, - 35101 - 19968: jis0208<<14 | 0x49<<7 | 0x5B, - 35102 - 19968: jis0208<<14 | 0x49<<7 | 0x51, - 35104 - 19968: jis0212<<14 | 0x3B<<7 | 0x3F, - 35109 - 19968: jis0208<<14 | 0x49<<7 | 0x52, - 35110 - 19968: jis0212<<14 | 0x3B<<7 | 0x40, - 35111 - 19968: jis0212<<14 | 0x3B<<7 | 0x41, - 35112 - 19968: jis0212<<14 | 0x3B<<7 | 0x42, - 35114 - 19968: jis0208<<14 | 0x49<<7 | 0x53, - 35115 - 19968: jis0208<<14 | 0x49<<7 | 0x54, - 35120 - 19968: jis0212<<14 | 0x3B<<7 | 0x43, - 35121 - 19968: jis0212<<14 | 0x3B<<7 | 0x44, - 35122 - 19968: jis0212<<14 | 0x3B<<7 | 0x45, - 35125 - 19968: jis0212<<14 | 0x3B<<7 | 0x46, - 35126 - 19968: jis0208<<14 | 0x49<<7 | 0x58, - 35128 - 19968: jis0208<<14 | 0x49<<7 | 0x59, - 35129 - 19968: jis0212<<14 | 0x3B<<7 | 0x47, - 35130 - 19968: jis0212<<14 | 0x3B<<7 | 0x48, - 35131 - 19968: jis0208<<14 | 0x49<<7 | 0x57, - 35134 - 19968: jis0212<<14 | 0x3B<<7 | 0x49, - 35136 - 19968: jis0212<<14 | 0x3B<<7 | 0x4A, - 35137 - 19968: jis0208<<14 | 0x49<<7 | 0x55, - 35138 - 19968: jis0212<<14 | 0x3B<<7 | 0x4B, - 35139 - 19968: jis0208<<14 | 0x49<<7 | 0x50, - 35140 - 19968: jis0208<<14 | 0x49<<7 | 0x56, - 35141 - 19968: jis0212<<14 | 0x3B<<7 | 0x4C, - 35142 - 19968: jis0212<<14 | 0x3B<<7 | 0x4D, - 35145 - 19968: jis0212<<14 | 0x3B<<7 | 0x4E, - 35148 - 19968: jis0208<<14 | 0x49<<7 | 0x5A, - 35149 - 19968: jis0208<<14 | 0x4F<<7 | 0x16, - 35151 - 19968: jis0212<<14 | 0x3B<<7 | 0x4F, - 35154 - 19968: jis0212<<14 | 0x3B<<7 | 0x50, - 35158 - 19968: jis0208<<14 | 0x11<<7 | 0x07, - 35159 - 19968: jis0212<<14 | 0x3B<<7 | 0x51, - 35162 - 19968: jis0212<<14 | 0x3B<<7 | 0x52, - 35163 - 19968: jis0212<<14 | 0x3B<<7 | 0x53, - 35164 - 19968: jis0212<<14 | 0x3B<<7 | 0x54, - 35166 - 19968: jis0208<<14 | 0x49<<7 | 0x5D, - 35167 - 19968: jis0208<<14 | 0x15<<7 | 0x3E, - 35168 - 19968: jis0208<<14 | 0x49<<7 | 0x5C, - 35169 - 19968: jis0212<<14 | 0x3B<<7 | 0x55, - 35170 - 19968: jis0212<<14 | 0x3B<<7 | 0x56, - 35171 - 19968: jis0212<<14 | 0x3B<<7 | 0x57, - 35172 - 19968: jis0208<<14 | 0x4A<<7 | 0x01, - 35174 - 19968: jis0208<<14 | 0x4A<<7 | 0x00, - 35178 - 19968: jis0208<<14 | 0x4A<<7 | 0x03, - 35179 - 19968: jis0212<<14 | 0x3B<<7 | 0x58, - 35181 - 19968: jis0208<<14 | 0x4A<<7 | 0x02, - 35182 - 19968: jis0212<<14 | 0x3B<<7 | 0x59, - 35183 - 19968: jis0208<<14 | 0x4A<<7 | 0x04, - 35184 - 19968: jis0212<<14 | 0x3B<<7 | 0x5A, - 35186 - 19968: jis0208<<14 | 0x1C<<7 | 0x10, - 35187 - 19968: jis0212<<14 | 0x3B<<7 | 0x5B, - 35188 - 19968: jis0208<<14 | 0x4A<<7 | 0x05, - 35189 - 19968: jis0212<<14 | 0x3B<<7 | 0x5C, - 35191 - 19968: jis0208<<14 | 0x4A<<7 | 0x06, - 35194 - 19968: jis0212<<14 | 0x3B<<7 | 0x5D, - 35195 - 19968: jis0212<<14 | 0x3C<<7 | 0x00, - 35196 - 19968: jis0212<<14 | 0x3C<<7 | 0x01, - 35197 - 19968: jis0212<<14 | 0x3C<<7 | 0x02, - 35198 - 19968: jis0208<<14 | 0x4A<<7 | 0x07, - 35199 - 19968: jis0208<<14 | 0x1F<<7 | 0x1D, - 35201 - 19968: jis0208<<14 | 0x2C<<7 | 0x36, - 35203 - 19968: jis0208<<14 | 0x4A<<7 | 0x08, - 35206 - 19968: jis0208<<14 | 0x29<<7 | 0x03, - 35207 - 19968: jis0208<<14 | 0x26<<7 | 0x25, - 35208 - 19968: jis0208<<14 | 0x4A<<7 | 0x09, - 35209 - 19968: jis0212<<14 | 0x3C<<7 | 0x03, - 35210 - 19968: jis0208<<14 | 0x4A<<7 | 0x0A, - 35211 - 19968: jis0208<<14 | 0x17<<7 | 0x0A, - 35213 - 19968: jis0212<<14 | 0x3C<<7 | 0x04, - 35215 - 19968: jis0208<<14 | 0x14<<7 | 0x0B, - 35216 - 19968: jis0212<<14 | 0x3C<<7 | 0x05, - 35219 - 19968: jis0208<<14 | 0x4A<<7 | 0x0B, - 35220 - 19968: jis0212<<14 | 0x3C<<7 | 0x06, - 35221 - 19968: jis0212<<14 | 0x3C<<7 | 0x07, - 35222 - 19968: jis0208<<14 | 0x1A<<7 | 0x4A, - 35223 - 19968: jis0208<<14 | 0x26<<7 | 0x20, - 35224 - 19968: jis0208<<14 | 0x4A<<7 | 0x0C, - 35226 - 19968: jis0208<<14 | 0x12<<7 | 0x2F, - 35227 - 19968: jis0212<<14 | 0x3C<<7 | 0x08, - 35228 - 19968: jis0212<<14 | 0x3C<<7 | 0x09, - 35231 - 19968: jis0212<<14 | 0x3C<<7 | 0x0A, - 35232 - 19968: jis0212<<14 | 0x3C<<7 | 0x0B, - 35233 - 19968: jis0208<<14 | 0x4A<<7 | 0x0D, - 35237 - 19968: jis0212<<14 | 0x3C<<7 | 0x0C, - 35238 - 19968: jis0208<<14 | 0x4A<<7 | 0x0F, - 35239 - 19968: jis0208<<14 | 0x2C<<7 | 0x56, - 35241 - 19968: jis0208<<14 | 0x4A<<7 | 0x0E, - 35242 - 19968: jis0208<<14 | 0x1E<<7 | 0x25, - 35244 - 19968: jis0208<<14 | 0x4A<<7 | 0x10, - 35247 - 19968: jis0208<<14 | 0x4A<<7 | 0x11, - 35248 - 19968: jis0212<<14 | 0x3C<<7 | 0x0D, - 35250 - 19968: jis0208<<14 | 0x4A<<7 | 0x12, - 35251 - 19968: jis0208<<14 | 0x13<<7 | 0x30, - 35252 - 19968: jis0212<<14 | 0x3C<<7 | 0x0E, - 35253 - 19968: jis0212<<14 | 0x3C<<7 | 0x0F, - 35254 - 19968: jis0212<<14 | 0x3C<<7 | 0x10, - 35255 - 19968: jis0212<<14 | 0x3C<<7 | 0x11, - 35258 - 19968: jis0208<<14 | 0x4A<<7 | 0x13, - 35260 - 19968: jis0212<<14 | 0x3C<<7 | 0x12, - 35261 - 19968: jis0208<<14 | 0x4A<<7 | 0x14, - 35263 - 19968: jis0208<<14 | 0x4A<<7 | 0x15, - 35264 - 19968: jis0208<<14 | 0x4A<<7 | 0x16, - 35282 - 19968: jis0208<<14 | 0x12<<7 | 0x30, - 35284 - 19968: jis0212<<14 | 0x3C<<7 | 0x13, - 35285 - 19968: jis0212<<14 | 0x3C<<7 | 0x14, - 35286 - 19968: jis0212<<14 | 0x3C<<7 | 0x15, - 35287 - 19968: jis0212<<14 | 0x3C<<7 | 0x16, - 35288 - 19968: jis0212<<14 | 0x3C<<7 | 0x17, - 35290 - 19968: jis0208<<14 | 0x4A<<7 | 0x17, - 35292 - 19968: jis0208<<14 | 0x4A<<7 | 0x18, - 35293 - 19968: jis0208<<14 | 0x4A<<7 | 0x19, - 35299 - 19968: jis0208<<14 | 0x11<<7 | 0x51, - 35301 - 19968: jis0212<<14 | 0x3C<<7 | 0x18, - 35302 - 19968: jis0208<<14 | 0x1E<<7 | 0x07, - 35303 - 19968: jis0208<<14 | 0x4A<<7 | 0x1A, - 35305 - 19968: jis0212<<14 | 0x3C<<7 | 0x19, - 35307 - 19968: jis0212<<14 | 0x3C<<7 | 0x1A, - 35309 - 19968: jis0212<<14 | 0x3C<<7 | 0x1B, - 35313 - 19968: jis0212<<14 | 0x3C<<7 | 0x1C, - 35315 - 19968: jis0212<<14 | 0x3C<<7 | 0x1D, - 35316 - 19968: jis0208<<14 | 0x4A<<7 | 0x1B, - 35318 - 19968: jis0212<<14 | 0x3C<<7 | 0x1E, - 35320 - 19968: jis0208<<14 | 0x4A<<7 | 0x1C, - 35321 - 19968: jis0212<<14 | 0x3C<<7 | 0x1F, - 35325 - 19968: jis0212<<14 | 0x3C<<7 | 0x20, - 35327 - 19968: jis0212<<14 | 0x3C<<7 | 0x21, - 35328 - 19968: jis0208<<14 | 0x17<<7 | 0x1F, - 35330 - 19968: jis0208<<14 | 0x23<<7 | 0x5A, - 35331 - 19968: jis0208<<14 | 0x4A<<7 | 0x1D, - 35332 - 19968: jis0212<<14 | 0x3C<<7 | 0x22, - 35333 - 19968: jis0212<<14 | 0x3C<<7 | 0x23, - 35335 - 19968: jis0212<<14 | 0x3C<<7 | 0x24, - 35336 - 19968: jis0208<<14 | 0x16<<7 | 0x36, - 35338 - 19968: jis0208<<14 | 0x1E<<7 | 0x35, - 35340 - 19968: jis0208<<14 | 0x4A<<7 | 0x20, - 35342 - 19968: jis0208<<14 | 0x25<<7 | 0x03, - 35343 - 19968: jis0212<<14 | 0x3C<<7 | 0x25, - 35344 - 19968: jis0208<<14 | 0x4A<<7 | 0x1F, - 35345 - 19968: jis0212<<14 | 0x3C<<7 | 0x26, - 35346 - 19968: jis0208<<14 | 0x5A<<7 | 0x46, - 35347 - 19968: jis0208<<14 | 0x16<<7 | 0x10, - 35348 - 19968: jis0212<<14 | 0x3C<<7 | 0x28, - 35349 - 19968: jis0212<<14 | 0x3C<<7 | 0x29, - 35350 - 19968: jis0208<<14 | 0x4A<<7 | 0x1E, - 35351 - 19968: jis0208<<14 | 0x21<<7 | 0x56, - 35352 - 19968: jis0208<<14 | 0x14<<7 | 0x0C, - 35355 - 19968: jis0208<<14 | 0x4A<<7 | 0x21, - 35357 - 19968: jis0208<<14 | 0x4A<<7 | 0x22, - 35358 - 19968: jis0212<<14 | 0x3C<<7 | 0x2A, - 35359 - 19968: jis0208<<14 | 0x1D<<7 | 0x38, - 35360 - 19968: jis0212<<14 | 0x3C<<7 | 0x2B, - 35362 - 19968: jis0212<<14 | 0x3C<<7 | 0x2C, - 35363 - 19968: jis0208<<14 | 0x16<<7 | 0x4C, - 35364 - 19968: jis0212<<14 | 0x3C<<7 | 0x2D, - 35365 - 19968: jis0208<<14 | 0x4A<<7 | 0x23, - 35366 - 19968: jis0212<<14 | 0x3C<<7 | 0x2E, - 35370 - 19968: jis0208<<14 | 0x2A<<7 | 0x0B, - 35371 - 19968: jis0212<<14 | 0x3C<<7 | 0x2F, - 35372 - 19968: jis0212<<14 | 0x3C<<7 | 0x30, - 35373 - 19968: jis0208<<14 | 0x1F<<7 | 0x3E, - 35375 - 19968: jis0212<<14 | 0x3C<<7 | 0x31, - 35377 - 19968: jis0208<<14 | 0x14<<7 | 0x55, - 35379 - 19968: jis0208<<14 | 0x2B<<7 | 0x54, - 35380 - 19968: jis0208<<14 | 0x20<<7 | 0x29, - 35381 - 19968: jis0212<<14 | 0x3C<<7 | 0x32, - 35382 - 19968: jis0208<<14 | 0x4A<<7 | 0x24, - 35383 - 19968: jis0208<<14 | 0x5A<<7 | 0x47, - 35386 - 19968: jis0208<<14 | 0x1E<<7 | 0x26, - 35387 - 19968: jis0208<<14 | 0x22<<7 | 0x4F, - 35388 - 19968: jis0208<<14 | 0x1D<<7 | 0x39, - 35389 - 19968: jis0212<<14 | 0x3C<<7 | 0x34, - 35390 - 19968: jis0212<<14 | 0x3C<<7 | 0x35, - 35392 - 19968: jis0212<<14 | 0x3C<<7 | 0x36, - 35393 - 19968: jis0208<<14 | 0x4A<<7 | 0x25, - 35395 - 19968: jis0212<<14 | 0x3C<<7 | 0x37, - 35397 - 19968: jis0212<<14 | 0x3C<<7 | 0x38, - 35398 - 19968: jis0208<<14 | 0x4A<<7 | 0x28, - 35399 - 19968: jis0212<<14 | 0x3C<<7 | 0x39, - 35400 - 19968: jis0208<<14 | 0x4A<<7 | 0x29, - 35401 - 19968: jis0212<<14 | 0x3C<<7 | 0x3A, - 35405 - 19968: jis0212<<14 | 0x3C<<7 | 0x3B, - 35406 - 19968: jis0212<<14 | 0x3C<<7 | 0x3C, - 35408 - 19968: jis0208<<14 | 0x19<<7 | 0x1D, - 35409 - 19968: jis0208<<14 | 0x21<<7 | 0x21, - 35410 - 19968: jis0208<<14 | 0x4A<<7 | 0x27, - 35411 - 19968: jis0212<<14 | 0x3C<<7 | 0x3D, - 35412 - 19968: jis0208<<14 | 0x1D<<7 | 0x3A, - 35413 - 19968: jis0208<<14 | 0x28<<7 | 0x1D, - 35414 - 19968: jis0212<<14 | 0x3C<<7 | 0x3E, - 35415 - 19968: jis0212<<14 | 0x3C<<7 | 0x3F, - 35416 - 19968: jis0212<<14 | 0x3C<<7 | 0x40, - 35419 - 19968: jis0208<<14 | 0x4A<<7 | 0x26, - 35420 - 19968: jis0212<<14 | 0x3C<<7 | 0x41, - 35421 - 19968: jis0212<<14 | 0x3C<<7 | 0x42, - 35422 - 19968: jis0208<<14 | 0x1A<<7 | 0x4B, - 35424 - 19968: jis0208<<14 | 0x10<<7 | 0x32, - 35425 - 19968: jis0212<<14 | 0x3C<<7 | 0x43, - 35426 - 19968: jis0208<<14 | 0x4A<<7 | 0x2D, - 35427 - 19968: jis0208<<14 | 0x16<<7 | 0x37, - 35429 - 19968: jis0212<<14 | 0x3C<<7 | 0x44, - 35430 - 19968: jis0208<<14 | 0x1A<<7 | 0x4D, - 35431 - 19968: jis0212<<14 | 0x3C<<7 | 0x45, - 35433 - 19968: jis0208<<14 | 0x1A<<7 | 0x4C, - 35435 - 19968: jis0208<<14 | 0x2E<<7 | 0x2C, - 35436 - 19968: jis0208<<14 | 0x4A<<7 | 0x2C, - 35437 - 19968: jis0208<<14 | 0x4A<<7 | 0x2B, - 35438 - 19968: jis0208<<14 | 0x20<<7 | 0x06, - 35440 - 19968: jis0208<<14 | 0x14<<7 | 0x2C, - 35441 - 19968: jis0208<<14 | 0x2E<<7 | 0x22, - 35442 - 19968: jis0208<<14 | 0x12<<7 | 0x19, - 35443 - 19968: jis0208<<14 | 0x1D<<7 | 0x3B, - 35445 - 19968: jis0212<<14 | 0x3C<<7 | 0x46, - 35446 - 19968: jis0212<<14 | 0x3C<<7 | 0x47, - 35447 - 19968: jis0212<<14 | 0x3C<<7 | 0x48, - 35449 - 19968: jis0208<<14 | 0x5A<<7 | 0x48, - 35450 - 19968: jis0212<<14 | 0x3C<<7 | 0x4A, - 35451 - 19968: jis0212<<14 | 0x3C<<7 | 0x4B, - 35452 - 19968: jis0208<<14 | 0x4A<<7 | 0x2A, - 35454 - 19968: jis0212<<14 | 0x3C<<7 | 0x4C, - 35455 - 19968: jis0212<<14 | 0x3C<<7 | 0x4D, - 35456 - 19968: jis0212<<14 | 0x3C<<7 | 0x4E, - 35458 - 19968: jis0208<<14 | 0x4A<<7 | 0x2F, - 35459 - 19968: jis0212<<14 | 0x3C<<7 | 0x4F, - 35460 - 19968: jis0208<<14 | 0x4A<<7 | 0x30, - 35461 - 19968: jis0208<<14 | 0x4A<<7 | 0x2E, - 35462 - 19968: jis0212<<14 | 0x3C<<7 | 0x50, - 35463 - 19968: jis0208<<14 | 0x17<<7 | 0x37, - 35465 - 19968: jis0208<<14 | 0x2C<<7 | 0x1F, - 35467 - 19968: jis0212<<14 | 0x3C<<7 | 0x51, - 35468 - 19968: jis0208<<14 | 0x1A<<7 | 0x4E, - 35469 - 19968: jis0208<<14 | 0x26<<7 | 0x06, - 35471 - 19968: jis0212<<14 | 0x3C<<7 | 0x52, - 35472 - 19968: jis0212<<14 | 0x3C<<7 | 0x53, - 35473 - 19968: jis0208<<14 | 0x4A<<7 | 0x33, - 35474 - 19968: jis0212<<14 | 0x3C<<7 | 0x54, - 35475 - 19968: jis0208<<14 | 0x1F<<7 | 0x1F, - 35477 - 19968: jis0208<<14 | 0x22<<7 | 0x21, - 35478 - 19968: jis0212<<14 | 0x3C<<7 | 0x55, - 35479 - 19968: jis0212<<14 | 0x3C<<7 | 0x56, - 35480 - 19968: jis0208<<14 | 0x2C<<7 | 0x15, - 35481 - 19968: jis0212<<14 | 0x3C<<7 | 0x57, - 35482 - 19968: jis0208<<14 | 0x4A<<7 | 0x36, - 35486 - 19968: jis0208<<14 | 0x17<<7 | 0x4B, - 35487 - 19968: jis0212<<14 | 0x3C<<7 | 0x58, - 35488 - 19968: jis0208<<14 | 0x1F<<7 | 0x1E, - 35489 - 19968: jis0208<<14 | 0x4A<<7 | 0x32, - 35491 - 19968: jis0208<<14 | 0x4A<<7 | 0x37, - 35492 - 19968: jis0208<<14 | 0x17<<7 | 0x4C, - 35493 - 19968: jis0208<<14 | 0x4A<<7 | 0x34, - 35494 - 19968: jis0208<<14 | 0x4A<<7 | 0x35, - 35495 - 19968: jis0208<<14 | 0x5A<<7 | 0x49, - 35496 - 19968: jis0208<<14 | 0x4A<<7 | 0x31, - 35497 - 19968: jis0212<<14 | 0x3C<<7 | 0x5A, - 35500 - 19968: jis0208<<14 | 0x1F<<7 | 0x41, - 35501 - 19968: jis0208<<14 | 0x25<<7 | 0x28, - 35502 - 19968: jis0212<<14 | 0x3C<<7 | 0x5B, - 35503 - 19968: jis0212<<14 | 0x3C<<7 | 0x5C, - 35504 - 19968: jis0208<<14 | 0x22<<7 | 0x0E, - 35506 - 19968: jis0208<<14 | 0x11<<7 | 0x3C, - 35507 - 19968: jis0212<<14 | 0x3C<<7 | 0x5D, - 35510 - 19968: jis0212<<14 | 0x3D<<7 | 0x00, - 35511 - 19968: jis0212<<14 | 0x3D<<7 | 0x01, - 35513 - 19968: jis0208<<14 | 0x27<<7 | 0x4F, - 35515 - 19968: jis0212<<14 | 0x3D<<7 | 0x02, - 35516 - 19968: jis0208<<14 | 0x14<<7 | 0x22, - 35518 - 19968: jis0208<<14 | 0x5A<<7 | 0x4A, - 35519 - 19968: jis0208<<14 | 0x23<<7 | 0x13, - 35522 - 19968: jis0208<<14 | 0x4A<<7 | 0x3A, - 35523 - 19968: jis0212<<14 | 0x3D<<7 | 0x04, - 35524 - 19968: jis0208<<14 | 0x4A<<7 | 0x38, - 35526 - 19968: jis0212<<14 | 0x3D<<7 | 0x05, - 35527 - 19968: jis0208<<14 | 0x22<<7 | 0x2B, - 35528 - 19968: jis0212<<14 | 0x3D<<7 | 0x06, - 35529 - 19968: jis0212<<14 | 0x3D<<7 | 0x07, - 35530 - 19968: jis0212<<14 | 0x3D<<7 | 0x08, - 35531 - 19968: jis0208<<14 | 0x1F<<7 | 0x20, - 35532 - 19968: jis0208<<14 | 0x13<<7 | 0x31, - 35533 - 19968: jis0208<<14 | 0x4A<<7 | 0x39, - 35535 - 19968: jis0208<<14 | 0x1E<<7 | 0x3A, - 35537 - 19968: jis0212<<14 | 0x3D<<7 | 0x09, - 35538 - 19968: jis0208<<14 | 0x2D<<7 | 0x29, - 35539 - 19968: jis0212<<14 | 0x3D<<7 | 0x0A, - 35540 - 19968: jis0212<<14 | 0x3D<<7 | 0x0B, - 35541 - 19968: jis0212<<14 | 0x3D<<7 | 0x0C, - 35542 - 19968: jis0208<<14 | 0x2E<<7 | 0x1F, - 35543 - 19968: jis0212<<14 | 0x3D<<7 | 0x0D, - 35546 - 19968: jis0208<<14 | 0x4A<<7 | 0x3B, - 35547 - 19968: jis0208<<14 | 0x4A<<7 | 0x46, - 35548 - 19968: jis0208<<14 | 0x23<<7 | 0x14, - 35549 - 19968: jis0212<<14 | 0x3D<<7 | 0x0E, - 35550 - 19968: jis0208<<14 | 0x4A<<7 | 0x45, - 35551 - 19968: jis0208<<14 | 0x5A<<7 | 0x4B, - 35552 - 19968: jis0208<<14 | 0x4A<<7 | 0x42, - 35553 - 19968: jis0208<<14 | 0x4A<<7 | 0x4A, - 35554 - 19968: jis0208<<14 | 0x4A<<7 | 0x43, - 35556 - 19968: jis0208<<14 | 0x4A<<7 | 0x3F, - 35558 - 19968: jis0208<<14 | 0x23<<7 | 0x5B, - 35559 - 19968: jis0208<<14 | 0x4A<<7 | 0x3E, - 35563 - 19968: jis0208<<14 | 0x4A<<7 | 0x3C, - 35564 - 19968: jis0212<<14 | 0x3D<<7 | 0x10, - 35565 - 19968: jis0208<<14 | 0x2C<<7 | 0x00, - 35566 - 19968: jis0208<<14 | 0x1A<<7 | 0x4F, - 35568 - 19968: jis0212<<14 | 0x3D<<7 | 0x11, - 35569 - 19968: jis0208<<14 | 0x4A<<7 | 0x40, - 35571 - 19968: jis0208<<14 | 0x4A<<7 | 0x3D, - 35572 - 19968: jis0212<<14 | 0x3D<<7 | 0x12, - 35573 - 19968: jis0212<<14 | 0x3D<<7 | 0x13, - 35574 - 19968: jis0208<<14 | 0x5A<<7 | 0x4D, - 35575 - 19968: jis0208<<14 | 0x4A<<7 | 0x44, - 35576 - 19968: jis0208<<14 | 0x1C<<7 | 0x53, - 35578 - 19968: jis0208<<14 | 0x17<<7 | 0x20, - 35580 - 19968: jis0212<<14 | 0x3D<<7 | 0x15, - 35582 - 19968: jis0208<<14 | 0x21<<7 | 0x59, - 35583 - 19968: jis0212<<14 | 0x3D<<7 | 0x16, - 35584 - 19968: jis0208<<14 | 0x2A<<7 | 0x24, - 35585 - 19968: jis0208<<14 | 0x10<<7 | 0x39, - 35586 - 19968: jis0208<<14 | 0x0F<<7 | 0x41, - 35588 - 19968: jis0208<<14 | 0x25<<7 | 0x04, - 35589 - 19968: jis0212<<14 | 0x3D<<7 | 0x17, - 35590 - 19968: jis0212<<14 | 0x3D<<7 | 0x18, - 35591 - 19968: jis0208<<14 | 0x4A<<7 | 0x48, - 35594 - 19968: jis0212<<14 | 0x3D<<7 | 0x1E, - 35595 - 19968: jis0212<<14 | 0x3D<<7 | 0x19, - 35596 - 19968: jis0208<<14 | 0x4A<<7 | 0x47, - 35598 - 19968: jis0208<<14 | 0x25<<7 | 0x45, - 35600 - 19968: jis0208<<14 | 0x4A<<7 | 0x4C, - 35601 - 19968: jis0212<<14 | 0x3D<<7 | 0x1A, - 35604 - 19968: jis0208<<14 | 0x4A<<7 | 0x41, - 35606 - 19968: jis0208<<14 | 0x4A<<7 | 0x4B, - 35607 - 19968: jis0208<<14 | 0x4A<<7 | 0x4D, - 35609 - 19968: jis0208<<14 | 0x17<<7 | 0x0B, - 35610 - 19968: jis0208<<14 | 0x4A<<7 | 0x49, - 35611 - 19968: jis0208<<14 | 0x18<<7 | 0x35, - 35612 - 19968: jis0212<<14 | 0x3D<<7 | 0x1B, - 35613 - 19968: jis0208<<14 | 0x1B<<7 | 0x34, - 35614 - 19968: jis0212<<14 | 0x3D<<7 | 0x1C, - 35615 - 19968: jis0212<<14 | 0x3D<<7 | 0x1D, - 35616 - 19968: jis0208<<14 | 0x4A<<7 | 0x4E, - 35617 - 19968: jis0208<<14 | 0x2C<<7 | 0x37, - 35622 - 19968: jis0208<<14 | 0x4A<<7 | 0x51, - 35624 - 19968: jis0208<<14 | 0x4A<<7 | 0x54, - 35627 - 19968: jis0208<<14 | 0x4A<<7 | 0x52, - 35628 - 19968: jis0208<<14 | 0x28<<7 | 0x14, - 35629 - 19968: jis0212<<14 | 0x3D<<7 | 0x1F, - 35632 - 19968: jis0212<<14 | 0x3D<<7 | 0x20, - 35635 - 19968: jis0208<<14 | 0x4A<<7 | 0x4F, - 35639 - 19968: jis0212<<14 | 0x3D<<7 | 0x21, - 35641 - 19968: jis0208<<14 | 0x15<<7 | 0x3F, - 35644 - 19968: jis0212<<14 | 0x3D<<7 | 0x22, - 35646 - 19968: jis0208<<14 | 0x4A<<7 | 0x53, - 35649 - 19968: jis0208<<14 | 0x4A<<7 | 0x55, - 35650 - 19968: jis0212<<14 | 0x3D<<7 | 0x23, - 35651 - 19968: jis0212<<14 | 0x3D<<7 | 0x24, - 35652 - 19968: jis0212<<14 | 0x3D<<7 | 0x25, - 35653 - 19968: jis0212<<14 | 0x3D<<7 | 0x26, - 35654 - 19968: jis0212<<14 | 0x3D<<7 | 0x27, - 35656 - 19968: jis0212<<14 | 0x3D<<7 | 0x28, - 35657 - 19968: jis0208<<14 | 0x4A<<7 | 0x59, - 35660 - 19968: jis0208<<14 | 0x4A<<7 | 0x56, - 35661 - 19968: jis0212<<14 | 0x3D<<7 | 0x2D, - 35662 - 19968: jis0208<<14 | 0x4A<<7 | 0x58, - 35663 - 19968: jis0208<<14 | 0x4A<<7 | 0x57, - 35666 - 19968: jis0212<<14 | 0x3D<<7 | 0x29, - 35667 - 19968: jis0208<<14 | 0x5A<<7 | 0x4E, - 35668 - 19968: jis0212<<14 | 0x3D<<7 | 0x2B, - 35670 - 19968: jis0208<<14 | 0x4A<<7 | 0x5A, - 35672 - 19968: jis0208<<14 | 0x1B<<7 | 0x10, - 35673 - 19968: jis0212<<14 | 0x3D<<7 | 0x2C, - 35674 - 19968: jis0208<<14 | 0x4A<<7 | 0x5C, - 35675 - 19968: jis0208<<14 | 0x4A<<7 | 0x5B, - 35676 - 19968: jis0208<<14 | 0x28<<7 | 0x47, - 35678 - 19968: jis0212<<14 | 0x3D<<7 | 0x2E, - 35679 - 19968: jis0208<<14 | 0x4B<<7 | 0x00, - 35683 - 19968: jis0212<<14 | 0x3D<<7 | 0x2F, - 35686 - 19968: jis0208<<14 | 0x16<<7 | 0x38, - 35691 - 19968: jis0208<<14 | 0x4A<<7 | 0x5D, - 35692 - 19968: jis0208<<14 | 0x4B<<7 | 0x01, - 35693 - 19968: jis0212<<14 | 0x3D<<7 | 0x30, - 35695 - 19968: jis0208<<14 | 0x4B<<7 | 0x02, - 35696 - 19968: jis0208<<14 | 0x14<<7 | 0x23, - 35697 - 19968: jis0208<<14 | 0x45<<7 | 0x20, - 35698 - 19968: jis0208<<14 | 0x1D<<7 | 0x58, - 35700 - 19968: jis0208<<14 | 0x4B<<7 | 0x03, - 35702 - 19968: jis0212<<14 | 0x3D<<7 | 0x31, - 35703 - 19968: jis0208<<14 | 0x17<<7 | 0x4D, - 35704 - 19968: jis0212<<14 | 0x3D<<7 | 0x32, - 35705 - 19968: jis0212<<14 | 0x3D<<7 | 0x33, - 35708 - 19968: jis0212<<14 | 0x3D<<7 | 0x34, - 35709 - 19968: jis0208<<14 | 0x4B<<7 | 0x04, - 35710 - 19968: jis0212<<14 | 0x3D<<7 | 0x35, - 35711 - 19968: jis0208<<14 | 0x5A<<7 | 0x4F, - 35712 - 19968: jis0208<<14 | 0x4B<<7 | 0x05, - 35713 - 19968: jis0212<<14 | 0x3D<<7 | 0x36, - 35715 - 19968: jis0208<<14 | 0x1A<<7 | 0x1D, - 35716 - 19968: jis0212<<14 | 0x3D<<7 | 0x37, - 35717 - 19968: jis0212<<14 | 0x3D<<7 | 0x38, - 35722 - 19968: jis0208<<14 | 0x39<<7 | 0x2D, - 35723 - 19968: jis0212<<14 | 0x3D<<7 | 0x39, - 35724 - 19968: jis0208<<14 | 0x4B<<7 | 0x06, - 35725 - 19968: jis0212<<14 | 0x3D<<7 | 0x3A, - 35726 - 19968: jis0208<<14 | 0x4B<<7 | 0x07, - 35727 - 19968: jis0212<<14 | 0x3D<<7 | 0x3B, - 35728 - 19968: jis0208<<14 | 0x1C<<7 | 0x11, - 35730 - 19968: jis0208<<14 | 0x4B<<7 | 0x08, - 35731 - 19968: jis0208<<14 | 0x4B<<7 | 0x09, - 35732 - 19968: jis0212<<14 | 0x3D<<7 | 0x3C, - 35733 - 19968: jis0212<<14 | 0x3D<<7 | 0x3D, - 35734 - 19968: jis0208<<14 | 0x4B<<7 | 0x0A, - 35737 - 19968: jis0208<<14 | 0x4B<<7 | 0x0B, - 35738 - 19968: jis0208<<14 | 0x4B<<7 | 0x0C, - 35740 - 19968: jis0212<<14 | 0x3D<<7 | 0x3E, - 35742 - 19968: jis0212<<14 | 0x3D<<7 | 0x3F, - 35743 - 19968: jis0212<<14 | 0x3D<<7 | 0x40, - 35895 - 19968: jis0208<<14 | 0x22<<7 | 0x0A, - 35896 - 19968: jis0212<<14 | 0x3D<<7 | 0x41, - 35897 - 19968: jis0212<<14 | 0x3D<<7 | 0x42, - 35898 - 19968: jis0208<<14 | 0x4B<<7 | 0x0D, - 35901 - 19968: jis0212<<14 | 0x3D<<7 | 0x43, - 35902 - 19968: jis0212<<14 | 0x3D<<7 | 0x44, - 35903 - 19968: jis0208<<14 | 0x4B<<7 | 0x0F, - 35905 - 19968: jis0208<<14 | 0x4B<<7 | 0x0E, - 35909 - 19968: jis0212<<14 | 0x3D<<7 | 0x45, - 35910 - 19968: jis0208<<14 | 0x25<<7 | 0x05, - 35911 - 19968: jis0212<<14 | 0x3D<<7 | 0x46, - 35912 - 19968: jis0208<<14 | 0x4B<<7 | 0x10, - 35913 - 19968: jis0212<<14 | 0x3D<<7 | 0x47, - 35914 - 19968: jis0208<<14 | 0x2A<<7 | 0x0C, - 35915 - 19968: jis0212<<14 | 0x3D<<7 | 0x48, - 35916 - 19968: jis0208<<14 | 0x4B<<7 | 0x11, - 35918 - 19968: jis0208<<14 | 0x4B<<7 | 0x12, - 35919 - 19968: jis0212<<14 | 0x3D<<7 | 0x49, - 35920 - 19968: jis0208<<14 | 0x4B<<7 | 0x13, - 35921 - 19968: jis0212<<14 | 0x3D<<7 | 0x4A, - 35923 - 19968: jis0212<<14 | 0x3D<<7 | 0x4B, - 35924 - 19968: jis0212<<14 | 0x3D<<7 | 0x4C, - 35925 - 19968: jis0208<<14 | 0x4B<<7 | 0x14, - 35927 - 19968: jis0212<<14 | 0x3D<<7 | 0x4D, - 35928 - 19968: jis0212<<14 | 0x3D<<7 | 0x4E, - 35929 - 19968: jis0212<<14 | 0x3D<<7 | 0x51, - 35930 - 19968: jis0208<<14 | 0x25<<7 | 0x39, - 35931 - 19968: jis0212<<14 | 0x3D<<7 | 0x4F, - 35933 - 19968: jis0212<<14 | 0x3D<<7 | 0x50, - 35937 - 19968: jis0208<<14 | 0x1D<<7 | 0x3C, - 35938 - 19968: jis0208<<14 | 0x4B<<7 | 0x15, - 35939 - 19968: jis0212<<14 | 0x3D<<7 | 0x52, - 35940 - 19968: jis0212<<14 | 0x3D<<7 | 0x53, - 35942 - 19968: jis0212<<14 | 0x3D<<7 | 0x54, - 35944 - 19968: jis0212<<14 | 0x3D<<7 | 0x55, - 35945 - 19968: jis0212<<14 | 0x3D<<7 | 0x56, - 35946 - 19968: jis0208<<14 | 0x18<<7 | 0x4A, - 35947 - 19968: jis0208<<14 | 0x2F<<7 | 0x0D, - 35948 - 19968: jis0208<<14 | 0x4B<<7 | 0x16, - 35949 - 19968: jis0212<<14 | 0x3D<<7 | 0x57, - 35955 - 19968: jis0212<<14 | 0x3D<<7 | 0x58, - 35957 - 19968: jis0212<<14 | 0x3D<<7 | 0x59, - 35958 - 19968: jis0212<<14 | 0x3D<<7 | 0x5A, - 35960 - 19968: jis0208<<14 | 0x4B<<7 | 0x17, - 35961 - 19968: jis0208<<14 | 0x28<<7 | 0x1E, - 35962 - 19968: jis0208<<14 | 0x4B<<7 | 0x18, - 35963 - 19968: jis0212<<14 | 0x3D<<7 | 0x5B, - 35964 - 19968: jis0208<<14 | 0x4B<<7 | 0x20, - 35966 - 19968: jis0212<<14 | 0x3D<<7 | 0x5C, - 35970 - 19968: jis0208<<14 | 0x4B<<7 | 0x19, - 35973 - 19968: jis0208<<14 | 0x4B<<7 | 0x1B, - 35974 - 19968: jis0212<<14 | 0x3D<<7 | 0x5D, - 35975 - 19968: jis0212<<14 | 0x3E<<7 | 0x00, - 35977 - 19968: jis0208<<14 | 0x4B<<7 | 0x1A, - 35978 - 19968: jis0208<<14 | 0x4B<<7 | 0x1C, - 35979 - 19968: jis0212<<14 | 0x3E<<7 | 0x01, - 35980 - 19968: jis0208<<14 | 0x2A<<7 | 0x25, - 35981 - 19968: jis0208<<14 | 0x4B<<7 | 0x1D, - 35982 - 19968: jis0208<<14 | 0x4B<<7 | 0x1E, - 35984 - 19968: jis0212<<14 | 0x3E<<7 | 0x02, - 35986 - 19968: jis0212<<14 | 0x3E<<7 | 0x03, - 35987 - 19968: jis0212<<14 | 0x3E<<7 | 0x04, - 35988 - 19968: jis0208<<14 | 0x4B<<7 | 0x1F, - 35992 - 19968: jis0208<<14 | 0x4B<<7 | 0x21, - 35993 - 19968: jis0212<<14 | 0x3E<<7 | 0x05, - 35995 - 19968: jis0212<<14 | 0x3E<<7 | 0x06, - 35996 - 19968: jis0212<<14 | 0x3E<<7 | 0x07, - 35997 - 19968: jis0208<<14 | 0x12<<7 | 0x0C, - 35998 - 19968: jis0208<<14 | 0x23<<7 | 0x46, - 36000 - 19968: jis0208<<14 | 0x28<<7 | 0x48, - 36001 - 19968: jis0208<<14 | 0x19<<7 | 0x41, - 36002 - 19968: jis0208<<14 | 0x18<<7 | 0x36, - 36004 - 19968: jis0212<<14 | 0x3E<<7 | 0x08, - 36007 - 19968: jis0208<<14 | 0x28<<7 | 0x2E, - 36008 - 19968: jis0208<<14 | 0x11<<7 | 0x3E, - 36009 - 19968: jis0208<<14 | 0x27<<7 | 0x2D, - 36010 - 19968: jis0208<<14 | 0x4B<<7 | 0x24, - 36011 - 19968: jis0208<<14 | 0x13<<7 | 0x32, - 36012 - 19968: jis0208<<14 | 0x1F<<7 | 0x34, - 36013 - 19968: jis0208<<14 | 0x4B<<7 | 0x23, - 36014 - 19968: jis0208<<14 | 0x4B<<7 | 0x28, - 36015 - 19968: jis0208<<14 | 0x22<<7 | 0x58, - 36016 - 19968: jis0208<<14 | 0x2B<<7 | 0x42, - 36018 - 19968: jis0208<<14 | 0x4B<<7 | 0x26, - 36019 - 19968: jis0208<<14 | 0x4B<<7 | 0x27, - 36020 - 19968: jis0208<<14 | 0x14<<7 | 0x0D, - 36022 - 19968: jis0208<<14 | 0x4B<<7 | 0x29, - 36023 - 19968: jis0208<<14 | 0x26<<7 | 0x42, - 36024 - 19968: jis0208<<14 | 0x21<<7 | 0x3E, - 36025 - 19968: jis0212<<14 | 0x3E<<7 | 0x09, - 36026 - 19968: jis0212<<14 | 0x3E<<7 | 0x0A, - 36027 - 19968: jis0208<<14 | 0x27<<7 | 0x50, - 36028 - 19968: jis0208<<14 | 0x24<<7 | 0x1C, - 36029 - 19968: jis0208<<14 | 0x4B<<7 | 0x25, - 36031 - 19968: jis0208<<14 | 0x2A<<7 | 0x26, - 36032 - 19968: jis0208<<14 | 0x11<<7 | 0x4B, - 36033 - 19968: jis0208<<14 | 0x4B<<7 | 0x2B, - 36034 - 19968: jis0208<<14 | 0x2E<<7 | 0x07, - 36035 - 19968: jis0208<<14 | 0x23<<7 | 0x21, - 36036 - 19968: jis0208<<14 | 0x2E<<7 | 0x24, - 36037 - 19968: jis0212<<14 | 0x3E<<7 | 0x0B, - 36038 - 19968: jis0212<<14 | 0x3E<<7 | 0x0C, - 36039 - 19968: jis0208<<14 | 0x1A<<7 | 0x50, - 36040 - 19968: jis0208<<14 | 0x4B<<7 | 0x2A, - 36041 - 19968: jis0212<<14 | 0x3E<<7 | 0x0D, - 36042 - 19968: jis0208<<14 | 0x21<<7 | 0x10, - 36043 - 19968: jis0212<<14 | 0x3E<<7 | 0x0E, - 36045 - 19968: jis0208<<14 | 0x4B<<7 | 0x3B, - 36046 - 19968: jis0208<<14 | 0x20<<7 | 0x07, - 36047 - 19968: jis0212<<14 | 0x3E<<7 | 0x0F, - 36049 - 19968: jis0208<<14 | 0x25<<7 | 0x57, - 36051 - 19968: jis0208<<14 | 0x28<<7 | 0x2F, - 36053 - 19968: jis0212<<14 | 0x3E<<7 | 0x11, - 36054 - 19968: jis0212<<14 | 0x3E<<7 | 0x10, - 36057 - 19968: jis0212<<14 | 0x3E<<7 | 0x12, - 36058 - 19968: jis0208<<14 | 0x4B<<7 | 0x2E, - 36059 - 19968: jis0208<<14 | 0x1A<<7 | 0x1E, - 36060 - 19968: jis0208<<14 | 0x1A<<7 | 0x51, - 36061 - 19968: jis0212<<14 | 0x3E<<7 | 0x13, - 36062 - 19968: jis0208<<14 | 0x1D<<7 | 0x3D, - 36064 - 19968: jis0208<<14 | 0x26<<7 | 0x44, - 36065 - 19968: jis0212<<14 | 0x3E<<7 | 0x14, - 36066 - 19968: jis0208<<14 | 0x17<<7 | 0x0C, - 36067 - 19968: jis0208<<14 | 0x4B<<7 | 0x2D, - 36068 - 19968: jis0208<<14 | 0x4B<<7 | 0x2C, - 36070 - 19968: jis0208<<14 | 0x28<<7 | 0x49, - 36072 - 19968: jis0212<<14 | 0x3E<<7 | 0x15, - 36074 - 19968: jis0208<<14 | 0x1B<<7 | 0x20, - 36076 - 19968: jis0212<<14 | 0x3E<<7 | 0x16, - 36077 - 19968: jis0208<<14 | 0x24<<7 | 0x31, - 36079 - 19968: jis0212<<14 | 0x3E<<7 | 0x17, - 36080 - 19968: jis0208<<14 | 0x5A<<7 | 0x50, - 36082 - 19968: jis0212<<14 | 0x3E<<7 | 0x19, - 36084 - 19968: jis0208<<14 | 0x5A<<7 | 0x51, - 36085 - 19968: jis0212<<14 | 0x3E<<7 | 0x1A, - 36087 - 19968: jis0212<<14 | 0x3E<<7 | 0x1B, - 36088 - 19968: jis0212<<14 | 0x3E<<7 | 0x1C, - 36090 - 19968: jis0208<<14 | 0x4B<<7 | 0x30, - 36091 - 19968: jis0208<<14 | 0x4B<<7 | 0x31, - 36092 - 19968: jis0208<<14 | 0x18<<7 | 0x37, - 36093 - 19968: jis0208<<14 | 0x4B<<7 | 0x2F, - 36094 - 19968: jis0212<<14 | 0x3E<<7 | 0x1D, - 36095 - 19968: jis0212<<14 | 0x3E<<7 | 0x1E, - 36097 - 19968: jis0212<<14 | 0x3E<<7 | 0x1F, - 36099 - 19968: jis0212<<14 | 0x3E<<7 | 0x20, - 36100 - 19968: jis0208<<14 | 0x4B<<7 | 0x32, - 36101 - 19968: jis0208<<14 | 0x4B<<7 | 0x33, - 36103 - 19968: jis0208<<14 | 0x4B<<7 | 0x35, - 36104 - 19968: jis0208<<14 | 0x21<<7 | 0x02, - 36105 - 19968: jis0212<<14 | 0x3E<<7 | 0x21, - 36106 - 19968: jis0208<<14 | 0x4B<<7 | 0x34, - 36107 - 19968: jis0208<<14 | 0x13<<7 | 0x45, - 36109 - 19968: jis0208<<14 | 0x4B<<7 | 0x37, - 36111 - 19968: jis0208<<14 | 0x4B<<7 | 0x36, - 36112 - 19968: jis0208<<14 | 0x4B<<7 | 0x38, - 36114 - 19968: jis0208<<14 | 0x5A<<7 | 0x52, - 36115 - 19968: jis0208<<14 | 0x4B<<7 | 0x3A, - 36116 - 19968: jis0208<<14 | 0x4B<<7 | 0x3C, - 36118 - 19968: jis0208<<14 | 0x4B<<7 | 0x3D, - 36119 - 19968: jis0212<<14 | 0x3E<<7 | 0x23, - 36123 - 19968: jis0212<<14 | 0x3E<<7 | 0x24, - 36196 - 19968: jis0208<<14 | 0x1F<<7 | 0x35, - 36197 - 19968: jis0212<<14 | 0x3E<<7 | 0x25, - 36198 - 19968: jis0208<<14 | 0x1B<<7 | 0x2E, - 36199 - 19968: jis0208<<14 | 0x4B<<7 | 0x3E, - 36201 - 19968: jis0212<<14 | 0x3E<<7 | 0x26, - 36203 - 19968: jis0208<<14 | 0x12<<7 | 0x31, - 36204 - 19968: jis0212<<14 | 0x3E<<7 | 0x27, - 36205 - 19968: jis0208<<14 | 0x4B<<7 | 0x3F, - 36206 - 19968: jis0212<<14 | 0x3E<<7 | 0x28, - 36208 - 19968: jis0208<<14 | 0x20<<7 | 0x55, - 36209 - 19968: jis0208<<14 | 0x4B<<7 | 0x40, - 36211 - 19968: jis0208<<14 | 0x4B<<7 | 0x41, - 36212 - 19968: jis0208<<14 | 0x28<<7 | 0x4A, - 36214 - 19968: jis0208<<14 | 0x5A<<7 | 0x53, - 36215 - 19968: jis0208<<14 | 0x14<<7 | 0x0E, - 36223 - 19968: jis0212<<14 | 0x3E<<7 | 0x29, - 36225 - 19968: jis0208<<14 | 0x4B<<7 | 0x42, - 36226 - 19968: jis0212<<14 | 0x3E<<7 | 0x2A, - 36228 - 19968: jis0212<<14 | 0x3E<<7 | 0x2B, - 36229 - 19968: jis0208<<14 | 0x23<<7 | 0x15, - 36232 - 19968: jis0212<<14 | 0x3E<<7 | 0x2C, - 36234 - 19968: jis0208<<14 | 0x10<<7 | 0x3A, - 36237 - 19968: jis0212<<14 | 0x3E<<7 | 0x2D, - 36240 - 19968: jis0212<<14 | 0x3E<<7 | 0x2E, - 36241 - 19968: jis0212<<14 | 0x3E<<7 | 0x2F, - 36245 - 19968: jis0212<<14 | 0x3E<<7 | 0x30, - 36249 - 19968: jis0208<<14 | 0x4B<<7 | 0x43, - 36254 - 19968: jis0212<<14 | 0x3E<<7 | 0x31, - 36255 - 19968: jis0212<<14 | 0x3E<<7 | 0x32, - 36256 - 19968: jis0212<<14 | 0x3E<<7 | 0x33, - 36259 - 19968: jis0208<<14 | 0x1B<<7 | 0x50, - 36262 - 19968: jis0212<<14 | 0x3E<<7 | 0x34, - 36264 - 19968: jis0208<<14 | 0x1E<<7 | 0x55, - 36267 - 19968: jis0212<<14 | 0x3E<<7 | 0x35, - 36268 - 19968: jis0212<<14 | 0x3E<<7 | 0x36, - 36271 - 19968: jis0212<<14 | 0x3E<<7 | 0x37, - 36274 - 19968: jis0212<<14 | 0x3E<<7 | 0x38, - 36275 - 19968: jis0208<<14 | 0x21<<7 | 0x0C, - 36277 - 19968: jis0212<<14 | 0x3E<<7 | 0x39, - 36279 - 19968: jis0212<<14 | 0x3E<<7 | 0x3A, - 36281 - 19968: jis0212<<14 | 0x3E<<7 | 0x3B, - 36282 - 19968: jis0208<<14 | 0x4B<<7 | 0x46, - 36283 - 19968: jis0212<<14 | 0x3E<<7 | 0x3C, - 36284 - 19968: jis0212<<14 | 0x3E<<7 | 0x4E, - 36286 - 19968: jis0208<<14 | 0x4B<<7 | 0x45, - 36288 - 19968: jis0212<<14 | 0x3E<<7 | 0x3D, - 36290 - 19968: jis0208<<14 | 0x4B<<7 | 0x44, - 36293 - 19968: jis0212<<14 | 0x3E<<7 | 0x3E, - 36294 - 19968: jis0212<<14 | 0x3E<<7 | 0x3F, - 36295 - 19968: jis0212<<14 | 0x3E<<7 | 0x40, - 36296 - 19968: jis0212<<14 | 0x3E<<7 | 0x41, - 36298 - 19968: jis0212<<14 | 0x3E<<7 | 0x42, - 36299 - 19968: jis0208<<14 | 0x4B<<7 | 0x4C, - 36300 - 19968: jis0208<<14 | 0x4B<<7 | 0x4A, - 36302 - 19968: jis0212<<14 | 0x3E<<7 | 0x43, - 36303 - 19968: jis0208<<14 | 0x4B<<7 | 0x47, - 36305 - 19968: jis0212<<14 | 0x3E<<7 | 0x44, - 36308 - 19968: jis0212<<14 | 0x3E<<7 | 0x45, - 36309 - 19968: jis0212<<14 | 0x3E<<7 | 0x46, - 36310 - 19968: jis0208<<14 | 0x4B<<7 | 0x49, - 36311 - 19968: jis0212<<14 | 0x3E<<7 | 0x47, - 36313 - 19968: jis0212<<14 | 0x3E<<7 | 0x48, - 36314 - 19968: jis0208<<14 | 0x4B<<7 | 0x48, - 36315 - 19968: jis0208<<14 | 0x4B<<7 | 0x4B, - 36317 - 19968: jis0208<<14 | 0x14<<7 | 0x56, - 36319 - 19968: jis0208<<14 | 0x4B<<7 | 0x4F, - 36321 - 19968: jis0208<<14 | 0x1F<<7 | 0x36, - 36323 - 19968: jis0208<<14 | 0x4B<<7 | 0x50, - 36324 - 19968: jis0212<<14 | 0x3E<<7 | 0x49, - 36325 - 19968: jis0212<<14 | 0x3E<<7 | 0x4A, - 36327 - 19968: jis0212<<14 | 0x3E<<7 | 0x4B, - 36328 - 19968: jis0208<<14 | 0x17<<7 | 0x38, - 36330 - 19968: jis0208<<14 | 0x4B<<7 | 0x4D, - 36331 - 19968: jis0208<<14 | 0x4B<<7 | 0x4E, - 36332 - 19968: jis0212<<14 | 0x3E<<7 | 0x4C, - 36335 - 19968: jis0208<<14 | 0x2E<<7 | 0x08, - 36336 - 19968: jis0212<<14 | 0x3E<<7 | 0x4D, - 36337 - 19968: jis0212<<14 | 0x3E<<7 | 0x4F, - 36338 - 19968: jis0212<<14 | 0x3E<<7 | 0x50, - 36339 - 19968: jis0208<<14 | 0x23<<7 | 0x16, - 36340 - 19968: jis0212<<14 | 0x3E<<7 | 0x51, - 36341 - 19968: jis0208<<14 | 0x20<<7 | 0x08, - 36348 - 19968: jis0208<<14 | 0x4B<<7 | 0x51, - 36349 - 19968: jis0212<<14 | 0x3E<<7 | 0x52, - 36351 - 19968: jis0208<<14 | 0x4B<<7 | 0x54, - 36353 - 19968: jis0212<<14 | 0x3E<<7 | 0x53, - 36356 - 19968: jis0212<<14 | 0x3E<<7 | 0x54, - 36357 - 19968: jis0212<<14 | 0x3E<<7 | 0x55, - 36358 - 19968: jis0212<<14 | 0x3E<<7 | 0x56, - 36360 - 19968: jis0208<<14 | 0x4B<<7 | 0x52, - 36361 - 19968: jis0208<<14 | 0x4B<<7 | 0x53, - 36362 - 19968: jis0208<<14 | 0x2C<<7 | 0x38, - 36363 - 19968: jis0212<<14 | 0x3E<<7 | 0x57, - 36367 - 19968: jis0208<<14 | 0x25<<7 | 0x06, - 36368 - 19968: jis0208<<14 | 0x4B<<7 | 0x57, - 36369 - 19968: jis0212<<14 | 0x3E<<7 | 0x58, - 36372 - 19968: jis0212<<14 | 0x3E<<7 | 0x59, - 36374 - 19968: jis0212<<14 | 0x3E<<7 | 0x5A, - 36381 - 19968: jis0208<<14 | 0x4B<<7 | 0x55, - 36382 - 19968: jis0208<<14 | 0x4B<<7 | 0x56, - 36383 - 19968: jis0208<<14 | 0x4B<<7 | 0x58, - 36384 - 19968: jis0212<<14 | 0x3E<<7 | 0x5B, - 36385 - 19968: jis0212<<14 | 0x3E<<7 | 0x5C, - 36386 - 19968: jis0212<<14 | 0x3E<<7 | 0x5D, - 36387 - 19968: jis0212<<14 | 0x3F<<7 | 0x00, - 36390 - 19968: jis0212<<14 | 0x3F<<7 | 0x01, - 36391 - 19968: jis0212<<14 | 0x3F<<7 | 0x02, - 36394 - 19968: jis0208<<14 | 0x4C<<7 | 0x08, - 36400 - 19968: jis0208<<14 | 0x4B<<7 | 0x5B, - 36401 - 19968: jis0212<<14 | 0x3F<<7 | 0x03, - 36403 - 19968: jis0212<<14 | 0x3F<<7 | 0x04, - 36404 - 19968: jis0208<<14 | 0x4B<<7 | 0x5C, - 36405 - 19968: jis0208<<14 | 0x4B<<7 | 0x5A, - 36406 - 19968: jis0212<<14 | 0x3F<<7 | 0x05, - 36407 - 19968: jis0212<<14 | 0x3F<<7 | 0x06, - 36408 - 19968: jis0212<<14 | 0x3F<<7 | 0x07, - 36409 - 19968: jis0212<<14 | 0x3F<<7 | 0x08, - 36413 - 19968: jis0212<<14 | 0x3F<<7 | 0x09, - 36416 - 19968: jis0212<<14 | 0x3F<<7 | 0x0A, - 36417 - 19968: jis0212<<14 | 0x3F<<7 | 0x0B, - 36418 - 19968: jis0208<<14 | 0x4B<<7 | 0x59, - 36420 - 19968: jis0208<<14 | 0x23<<7 | 0x5C, - 36423 - 19968: jis0208<<14 | 0x4C<<7 | 0x00, - 36424 - 19968: jis0208<<14 | 0x4C<<7 | 0x04, - 36425 - 19968: jis0208<<14 | 0x4C<<7 | 0x01, - 36426 - 19968: jis0208<<14 | 0x4B<<7 | 0x5D, - 36427 - 19968: jis0212<<14 | 0x3F<<7 | 0x0C, - 36428 - 19968: jis0208<<14 | 0x4C<<7 | 0x02, - 36429 - 19968: jis0212<<14 | 0x3F<<7 | 0x0D, - 36430 - 19968: jis0212<<14 | 0x3F<<7 | 0x0E, - 36431 - 19968: jis0212<<14 | 0x3F<<7 | 0x0F, - 36432 - 19968: jis0208<<14 | 0x4C<<7 | 0x03, - 36436 - 19968: jis0212<<14 | 0x3F<<7 | 0x10, - 36437 - 19968: jis0208<<14 | 0x4C<<7 | 0x0A, - 36441 - 19968: jis0208<<14 | 0x4C<<7 | 0x05, - 36443 - 19968: jis0212<<14 | 0x3F<<7 | 0x11, - 36444 - 19968: jis0212<<14 | 0x3F<<7 | 0x12, - 36445 - 19968: jis0212<<14 | 0x3F<<7 | 0x13, - 36446 - 19968: jis0212<<14 | 0x3F<<7 | 0x14, - 36447 - 19968: jis0208<<14 | 0x1F<<7 | 0x37, - 36448 - 19968: jis0208<<14 | 0x4C<<7 | 0x07, - 36449 - 19968: jis0212<<14 | 0x3F<<7 | 0x15, - 36450 - 19968: jis0212<<14 | 0x3F<<7 | 0x16, - 36451 - 19968: jis0208<<14 | 0x4C<<7 | 0x09, - 36452 - 19968: jis0208<<14 | 0x4C<<7 | 0x06, - 36457 - 19968: jis0212<<14 | 0x3F<<7 | 0x17, - 36460 - 19968: jis0212<<14 | 0x3F<<7 | 0x18, - 36461 - 19968: jis0212<<14 | 0x3F<<7 | 0x19, - 36463 - 19968: jis0212<<14 | 0x3F<<7 | 0x1A, - 36464 - 19968: jis0212<<14 | 0x3F<<7 | 0x1B, - 36465 - 19968: jis0212<<14 | 0x3F<<7 | 0x1C, - 36466 - 19968: jis0208<<14 | 0x4C<<7 | 0x0C, - 36468 - 19968: jis0208<<14 | 0x1C<<7 | 0x12, - 36470 - 19968: jis0208<<14 | 0x4C<<7 | 0x0B, - 36473 - 19968: jis0212<<14 | 0x3F<<7 | 0x1D, - 36474 - 19968: jis0212<<14 | 0x3F<<7 | 0x1E, - 36475 - 19968: jis0212<<14 | 0x3F<<7 | 0x1F, - 36476 - 19968: jis0208<<14 | 0x4C<<7 | 0x0D, - 36481 - 19968: jis0208<<14 | 0x4C<<7 | 0x0E, - 36482 - 19968: jis0212<<14 | 0x3F<<7 | 0x20, - 36483 - 19968: jis0212<<14 | 0x3F<<7 | 0x21, - 36484 - 19968: jis0208<<14 | 0x4C<<7 | 0x11, - 36485 - 19968: jis0208<<14 | 0x4C<<7 | 0x10, - 36487 - 19968: jis0208<<14 | 0x4C<<7 | 0x0F, - 36489 - 19968: jis0212<<14 | 0x3F<<7 | 0x22, - 36490 - 19968: jis0208<<14 | 0x4C<<7 | 0x13, - 36491 - 19968: jis0208<<14 | 0x4C<<7 | 0x12, - 36493 - 19968: jis0208<<14 | 0x2B<<7 | 0x55, - 36496 - 19968: jis0212<<14 | 0x3F<<7 | 0x23, - 36497 - 19968: jis0208<<14 | 0x4C<<7 | 0x15, - 36498 - 19968: jis0212<<14 | 0x3F<<7 | 0x24, - 36499 - 19968: jis0208<<14 | 0x4C<<7 | 0x14, - 36500 - 19968: jis0208<<14 | 0x4C<<7 | 0x16, - 36501 - 19968: jis0212<<14 | 0x3F<<7 | 0x25, - 36505 - 19968: jis0208<<14 | 0x4C<<7 | 0x17, - 36506 - 19968: jis0212<<14 | 0x3F<<7 | 0x26, - 36507 - 19968: jis0212<<14 | 0x3F<<7 | 0x27, - 36509 - 19968: jis0212<<14 | 0x3F<<7 | 0x28, - 36510 - 19968: jis0212<<14 | 0x3F<<7 | 0x29, - 36513 - 19968: jis0208<<14 | 0x4C<<7 | 0x19, - 36514 - 19968: jis0212<<14 | 0x3F<<7 | 0x2A, - 36519 - 19968: jis0212<<14 | 0x3F<<7 | 0x2B, - 36521 - 19968: jis0212<<14 | 0x3F<<7 | 0x2C, - 36522 - 19968: jis0208<<14 | 0x4C<<7 | 0x18, - 36523 - 19968: jis0208<<14 | 0x1E<<7 | 0x27, - 36524 - 19968: jis0208<<14 | 0x4C<<7 | 0x1A, - 36525 - 19968: jis0212<<14 | 0x3F<<7 | 0x2D, - 36526 - 19968: jis0212<<14 | 0x3F<<7 | 0x2E, - 36527 - 19968: jis0208<<14 | 0x15<<7 | 0x4C, - 36528 - 19968: jis0208<<14 | 0x4C<<7 | 0x1B, - 36529 - 19968: jis0208<<14 | 0x4C<<7 | 0x1D, - 36531 - 19968: jis0212<<14 | 0x3F<<7 | 0x2F, - 36533 - 19968: jis0212<<14 | 0x3F<<7 | 0x30, - 36538 - 19968: jis0212<<14 | 0x3F<<7 | 0x31, - 36539 - 19968: jis0212<<14 | 0x3F<<7 | 0x32, - 36542 - 19968: jis0208<<14 | 0x4C<<7 | 0x1E, - 36544 - 19968: jis0212<<14 | 0x3F<<7 | 0x33, - 36545 - 19968: jis0212<<14 | 0x3F<<7 | 0x34, - 36547 - 19968: jis0212<<14 | 0x3F<<7 | 0x35, - 36548 - 19968: jis0212<<14 | 0x3F<<7 | 0x36, - 36549 - 19968: jis0208<<14 | 0x4C<<7 | 0x1F, - 36550 - 19968: jis0208<<14 | 0x4C<<7 | 0x1C, - 36551 - 19968: jis0212<<14 | 0x3F<<7 | 0x37, - 36552 - 19968: jis0208<<14 | 0x4C<<7 | 0x20, - 36554 - 19968: jis0208<<14 | 0x1B<<7 | 0x35, - 36555 - 19968: jis0208<<14 | 0x4C<<7 | 0x21, - 36556 - 19968: jis0208<<14 | 0x14<<7 | 0x0F, - 36557 - 19968: jis0208<<14 | 0x16<<7 | 0x12, - 36559 - 19968: jis0208<<14 | 0x5A<<7 | 0x55, - 36561 - 19968: jis0212<<14 | 0x3F<<7 | 0x39, - 36562 - 19968: jis0208<<14 | 0x17<<7 | 0x0D, - 36564 - 19968: jis0212<<14 | 0x3F<<7 | 0x3A, - 36571 - 19968: jis0208<<14 | 0x4C<<7 | 0x22, - 36572 - 19968: jis0212<<14 | 0x3F<<7 | 0x3B, - 36575 - 19968: jis0208<<14 | 0x25<<7 | 0x4F, - 36578 - 19968: jis0208<<14 | 0x24<<7 | 0x1D, - 36579 - 19968: jis0208<<14 | 0x4C<<7 | 0x23, - 36584 - 19968: jis0212<<14 | 0x3F<<7 | 0x3C, - 36587 - 19968: jis0208<<14 | 0x4C<<7 | 0x26, - 36589 - 19968: jis0212<<14 | 0x3F<<7 | 0x43, - 36590 - 19968: jis0212<<14 | 0x3F<<7 | 0x3D, - 36592 - 19968: jis0212<<14 | 0x3F<<7 | 0x3E, - 36593 - 19968: jis0212<<14 | 0x3F<<7 | 0x3F, - 36599 - 19968: jis0212<<14 | 0x3F<<7 | 0x40, - 36600 - 19968: jis0208<<14 | 0x1B<<7 | 0x13, - 36601 - 19968: jis0212<<14 | 0x3F<<7 | 0x41, - 36602 - 19968: jis0212<<14 | 0x3F<<7 | 0x42, - 36603 - 19968: jis0208<<14 | 0x4C<<7 | 0x25, - 36604 - 19968: jis0208<<14 | 0x4C<<7 | 0x24, - 36605 - 19968: jis0208<<14 | 0x16<<7 | 0x39, - 36606 - 19968: jis0208<<14 | 0x4C<<7 | 0x27, - 36608 - 19968: jis0212<<14 | 0x3F<<7 | 0x44, - 36610 - 19968: jis0212<<14 | 0x3F<<7 | 0x45, - 36611 - 19968: jis0208<<14 | 0x12<<7 | 0x32, - 36613 - 19968: jis0208<<14 | 0x4C<<7 | 0x29, - 36615 - 19968: jis0212<<14 | 0x3F<<7 | 0x46, - 36616 - 19968: jis0212<<14 | 0x3F<<7 | 0x47, - 36617 - 19968: jis0208<<14 | 0x19<<7 | 0x3B, - 36618 - 19968: jis0208<<14 | 0x4C<<7 | 0x28, - 36620 - 19968: jis0208<<14 | 0x4C<<7 | 0x31, - 36623 - 19968: jis0212<<14 | 0x3F<<7 | 0x48, - 36624 - 19968: jis0212<<14 | 0x3F<<7 | 0x49, - 36626 - 19968: jis0208<<14 | 0x4C<<7 | 0x2B, - 36627 - 19968: jis0208<<14 | 0x4C<<7 | 0x2D, - 36628 - 19968: jis0208<<14 | 0x29<<7 | 0x44, - 36629 - 19968: jis0208<<14 | 0x4C<<7 | 0x2A, - 36630 - 19968: jis0212<<14 | 0x3F<<7 | 0x4A, - 36631 - 19968: jis0212<<14 | 0x3F<<7 | 0x4B, - 36632 - 19968: jis0212<<14 | 0x3F<<7 | 0x4C, - 36633 - 19968: jis0208<<14 | 0x4C<<7 | 0x2C, - 36635 - 19968: jis0208<<14 | 0x4C<<7 | 0x30, - 36636 - 19968: jis0208<<14 | 0x4C<<7 | 0x2E, - 36637 - 19968: jis0208<<14 | 0x14<<7 | 0x10, - 36638 - 19968: jis0212<<14 | 0x3F<<7 | 0x4D, - 36639 - 19968: jis0208<<14 | 0x4C<<7 | 0x2F, - 36640 - 19968: jis0212<<14 | 0x3F<<7 | 0x4E, - 36641 - 19968: jis0212<<14 | 0x3F<<7 | 0x4F, - 36643 - 19968: jis0212<<14 | 0x3F<<7 | 0x50, - 36645 - 19968: jis0212<<14 | 0x3F<<7 | 0x51, - 36646 - 19968: jis0208<<14 | 0x4C<<7 | 0x32, - 36647 - 19968: jis0212<<14 | 0x3F<<7 | 0x52, - 36648 - 19968: jis0212<<14 | 0x3F<<7 | 0x53, - 36649 - 19968: jis0208<<14 | 0x26<<7 | 0x39, - 36650 - 19968: jis0208<<14 | 0x2D<<7 | 0x37, - 36652 - 19968: jis0212<<14 | 0x3F<<7 | 0x54, - 36653 - 19968: jis0212<<14 | 0x3F<<7 | 0x55, - 36654 - 19968: jis0212<<14 | 0x3F<<7 | 0x56, - 36655 - 19968: jis0208<<14 | 0x1C<<7 | 0x13, - 36659 - 19968: jis0208<<14 | 0x4C<<7 | 0x33, - 36660 - 19968: jis0212<<14 | 0x3F<<7 | 0x57, - 36661 - 19968: jis0212<<14 | 0x3F<<7 | 0x58, - 36662 - 19968: jis0212<<14 | 0x3F<<7 | 0x59, - 36663 - 19968: jis0212<<14 | 0x3F<<7 | 0x5A, - 36664 - 19968: jis0208<<14 | 0x2C<<7 | 0x01, - 36665 - 19968: jis0208<<14 | 0x4C<<7 | 0x35, - 36666 - 19968: jis0212<<14 | 0x3F<<7 | 0x5B, - 36667 - 19968: jis0208<<14 | 0x4C<<7 | 0x34, - 36670 - 19968: jis0208<<14 | 0x4C<<7 | 0x38, - 36671 - 19968: jis0208<<14 | 0x2C<<7 | 0x20, - 36672 - 19968: jis0212<<14 | 0x3F<<7 | 0x5C, - 36673 - 19968: jis0212<<14 | 0x3F<<7 | 0x5D, - 36674 - 19968: jis0208<<14 | 0x4C<<7 | 0x37, - 36675 - 19968: jis0212<<14 | 0x40<<7 | 0x00, - 36676 - 19968: jis0208<<14 | 0x12<<7 | 0x4C, - 36677 - 19968: jis0208<<14 | 0x4C<<7 | 0x36, - 36678 - 19968: jis0208<<14 | 0x4C<<7 | 0x3B, - 36679 - 19968: jis0212<<14 | 0x40<<7 | 0x01, - 36681 - 19968: jis0208<<14 | 0x4C<<7 | 0x3A, - 36684 - 19968: jis0208<<14 | 0x4C<<7 | 0x39, - 36685 - 19968: jis0208<<14 | 0x24<<7 | 0x11, - 36686 - 19968: jis0208<<14 | 0x4C<<7 | 0x3C, - 36687 - 19968: jis0212<<14 | 0x40<<7 | 0x02, - 36689 - 19968: jis0212<<14 | 0x40<<7 | 0x03, - 36690 - 19968: jis0212<<14 | 0x40<<7 | 0x04, - 36691 - 19968: jis0212<<14 | 0x40<<7 | 0x05, - 36692 - 19968: jis0212<<14 | 0x40<<7 | 0x06, - 36693 - 19968: jis0212<<14 | 0x40<<7 | 0x07, - 36695 - 19968: jis0208<<14 | 0x4C<<7 | 0x3D, - 36696 - 19968: jis0212<<14 | 0x40<<7 | 0x08, - 36700 - 19968: jis0208<<14 | 0x4C<<7 | 0x3E, - 36701 - 19968: jis0212<<14 | 0x40<<7 | 0x09, - 36702 - 19968: jis0212<<14 | 0x40<<7 | 0x0A, - 36703 - 19968: jis0208<<14 | 0x18<<7 | 0x4B, - 36705 - 19968: jis0208<<14 | 0x16<<7 | 0x04, - 36706 - 19968: jis0208<<14 | 0x4C<<7 | 0x3F, - 36707 - 19968: jis0208<<14 | 0x4C<<7 | 0x40, - 36708 - 19968: jis0208<<14 | 0x4C<<7 | 0x41, - 36709 - 19968: jis0212<<14 | 0x40<<7 | 0x0B, - 36763 - 19968: jis0208<<14 | 0x1E<<7 | 0x28, - 36764 - 19968: jis0208<<14 | 0x4C<<7 | 0x42, - 36765 - 19968: jis0212<<14 | 0x40<<7 | 0x0C, - 36766 - 19968: jis0208<<14 | 0x1B<<7 | 0x0C, - 36767 - 19968: jis0208<<14 | 0x4C<<7 | 0x43, - 36768 - 19968: jis0212<<14 | 0x40<<7 | 0x0D, - 36769 - 19968: jis0212<<14 | 0x40<<7 | 0x0E, - 36771 - 19968: jis0208<<14 | 0x4C<<7 | 0x44, - 36772 - 19968: jis0212<<14 | 0x40<<7 | 0x0F, - 36773 - 19968: jis0212<<14 | 0x40<<7 | 0x10, - 36774 - 19968: jis0212<<14 | 0x40<<7 | 0x11, - 36775 - 19968: jis0208<<14 | 0x31<<7 | 0x00, - 36776 - 19968: jis0208<<14 | 0x30<<7 | 0x5D, - 36781 - 19968: jis0208<<14 | 0x4C<<7 | 0x45, - 36782 - 19968: jis0208<<14 | 0x44<<7 | 0x4F, - 36783 - 19968: jis0208<<14 | 0x4C<<7 | 0x46, - 36784 - 19968: jis0208<<14 | 0x22<<7 | 0x03, - 36785 - 19968: jis0208<<14 | 0x1E<<7 | 0x0A, - 36786 - 19968: jis0208<<14 | 0x26<<7 | 0x1F, - 36789 - 19968: jis0212<<14 | 0x40<<7 | 0x12, - 36790 - 19968: jis0212<<14 | 0x40<<7 | 0x13, - 36791 - 19968: jis0208<<14 | 0x4C<<7 | 0x47, - 36792 - 19968: jis0212<<14 | 0x40<<7 | 0x14, - 36794 - 19968: jis0208<<14 | 0x29<<7 | 0x34, - 36795 - 19968: jis0208<<14 | 0x23<<7 | 0x33, - 36796 - 19968: jis0208<<14 | 0x18<<7 | 0x5D, - 36798 - 19968: jis0212<<14 | 0x40<<7 | 0x15, - 36799 - 19968: jis0208<<14 | 0x22<<7 | 0x08, - 36800 - 19968: jis0212<<14 | 0x40<<7 | 0x16, - 36801 - 19968: jis0212<<14 | 0x40<<7 | 0x17, - 36802 - 19968: jis0208<<14 | 0x10<<7 | 0x09, - 36804 - 19968: jis0208<<14 | 0x2A<<7 | 0x57, - 36805 - 19968: jis0208<<14 | 0x1E<<7 | 0x36, - 36806 - 19968: jis0212<<14 | 0x40<<7 | 0x18, - 36810 - 19968: jis0212<<14 | 0x40<<7 | 0x19, - 36811 - 19968: jis0212<<14 | 0x40<<7 | 0x1A, - 36813 - 19968: jis0212<<14 | 0x40<<7 | 0x1B, - 36814 - 19968: jis0208<<14 | 0x16<<7 | 0x3D, - 36816 - 19968: jis0212<<14 | 0x40<<7 | 0x1C, - 36817 - 19968: jis0208<<14 | 0x15<<7 | 0x40, - 36818 - 19968: jis0212<<14 | 0x40<<7 | 0x1D, - 36819 - 19968: jis0212<<14 | 0x40<<7 | 0x1E, - 36820 - 19968: jis0208<<14 | 0x29<<7 | 0x35, - 36821 - 19968: jis0212<<14 | 0x40<<7 | 0x1F, - 36826 - 19968: jis0208<<14 | 0x4C<<7 | 0x48, - 36832 - 19968: jis0212<<14 | 0x40<<7 | 0x20, - 36834 - 19968: jis0208<<14 | 0x4C<<7 | 0x4A, - 36835 - 19968: jis0212<<14 | 0x40<<7 | 0x21, - 36836 - 19968: jis0212<<14 | 0x40<<7 | 0x22, - 36837 - 19968: jis0208<<14 | 0x4C<<7 | 0x49, - 36838 - 19968: jis0208<<14 | 0x11<<7 | 0x3F, - 36840 - 19968: jis0212<<14 | 0x40<<7 | 0x23, - 36841 - 19968: jis0208<<14 | 0x25<<7 | 0x55, - 36842 - 19968: jis0208<<14 | 0x4C<<7 | 0x4B, - 36843 - 19968: jis0208<<14 | 0x26<<7 | 0x56, - 36845 - 19968: jis0208<<14 | 0x24<<7 | 0x12, - 36846 - 19968: jis0212<<14 | 0x40<<7 | 0x24, - 36847 - 19968: jis0208<<14 | 0x4C<<7 | 0x4C, - 36848 - 19968: jis0208<<14 | 0x1C<<7 | 0x31, - 36849 - 19968: jis0212<<14 | 0x40<<7 | 0x25, - 36852 - 19968: jis0208<<14 | 0x4C<<7 | 0x4E, - 36853 - 19968: jis0212<<14 | 0x40<<7 | 0x26, - 36854 - 19968: jis0212<<14 | 0x40<<7 | 0x27, - 36855 - 19968: jis0208<<14 | 0x2B<<7 | 0x21, - 36856 - 19968: jis0208<<14 | 0x4C<<7 | 0x5D, - 36857 - 19968: jis0208<<14 | 0x4C<<7 | 0x50, - 36858 - 19968: jis0208<<14 | 0x4C<<7 | 0x51, - 36859 - 19968: jis0212<<14 | 0x40<<7 | 0x28, - 36861 - 19968: jis0208<<14 | 0x23<<7 | 0x28, - 36862 - 19968: jis0212<<14 | 0x40<<7 | 0x29, - 36864 - 19968: jis0208<<14 | 0x21<<7 | 0x3F, - 36865 - 19968: jis0208<<14 | 0x20<<7 | 0x56, - 36866 - 19968: jis0212<<14 | 0x40<<7 | 0x2A, - 36867 - 19968: jis0208<<14 | 0x25<<7 | 0x07, - 36868 - 19968: jis0212<<14 | 0x40<<7 | 0x2B, - 36869 - 19968: jis0208<<14 | 0x4C<<7 | 0x4F, - 36870 - 19968: jis0208<<14 | 0x14<<7 | 0x34, - 36872 - 19968: jis0212<<14 | 0x40<<7 | 0x2C, - 36875 - 19968: jis0208<<14 | 0x4C<<7 | 0x58, - 36876 - 19968: jis0212<<14 | 0x40<<7 | 0x2D, - 36877 - 19968: jis0208<<14 | 0x4C<<7 | 0x55, - 36878 - 19968: jis0208<<14 | 0x4D<<7 | 0x04, - 36879 - 19968: jis0208<<14 | 0x25<<7 | 0x08, - 36880 - 19968: jis0208<<14 | 0x22<<7 | 0x3F, - 36881 - 19968: jis0208<<14 | 0x4C<<7 | 0x52, - 36883 - 19968: jis0208<<14 | 0x23<<7 | 0x5D, - 36884 - 19968: jis0208<<14 | 0x24<<7 | 0x32, - 36885 - 19968: jis0208<<14 | 0x4C<<7 | 0x53, - 36886 - 19968: jis0208<<14 | 0x4C<<7 | 0x57, - 36887 - 19968: jis0208<<14 | 0x1E<<7 | 0x3F, - 36888 - 19968: jis0212<<14 | 0x40<<7 | 0x2E, - 36889 - 19968: jis0208<<14 | 0x26<<7 | 0x46, - 36890 - 19968: jis0208<<14 | 0x23<<7 | 0x2B, - 36891 - 19968: jis0212<<14 | 0x40<<7 | 0x2F, - 36893 - 19968: jis0208<<14 | 0x1F<<7 | 0x21, - 36894 - 19968: jis0208<<14 | 0x4C<<7 | 0x56, - 36895 - 19968: jis0208<<14 | 0x21<<7 | 0x0D, - 36896 - 19968: jis0208<<14 | 0x21<<7 | 0x03, - 36897 - 19968: jis0208<<14 | 0x4C<<7 | 0x54, - 36898 - 19968: jis0208<<14 | 0x0F<<7 | 0x08, - 36899 - 19968: jis0208<<14 | 0x2E<<7 | 0x01, - 36903 - 19968: jis0208<<14 | 0x4C<<7 | 0x59, - 36904 - 19968: jis0212<<14 | 0x40<<7 | 0x30, - 36905 - 19968: jis0212<<14 | 0x40<<7 | 0x31, - 36906 - 19968: jis0212<<14 | 0x40<<7 | 0x33, - 36908 - 19968: jis0212<<14 | 0x40<<7 | 0x34, - 36909 - 19968: jis0212<<14 | 0x40<<7 | 0x35, - 36910 - 19968: jis0208<<14 | 0x21<<7 | 0x40, - 36911 - 19968: jis0212<<14 | 0x40<<7 | 0x32, - 36913 - 19968: jis0208<<14 | 0x1C<<7 | 0x14, - 36914 - 19968: jis0208<<14 | 0x1E<<7 | 0x29, - 36915 - 19968: jis0212<<14 | 0x40<<7 | 0x36, - 36916 - 19968: jis0212<<14 | 0x40<<7 | 0x37, - 36917 - 19968: jis0208<<14 | 0x4C<<7 | 0x5B, - 36918 - 19968: jis0208<<14 | 0x4C<<7 | 0x5A, - 36919 - 19968: jis0212<<14 | 0x40<<7 | 0x38, - 36920 - 19968: jis0208<<14 | 0x0F<<7 | 0x4E, - 36921 - 19968: jis0208<<14 | 0x4C<<7 | 0x5C, - 36924 - 19968: jis0208<<14 | 0x28<<7 | 0x0E, - 36926 - 19968: jis0208<<14 | 0x4D<<7 | 0x06, - 36927 - 19968: jis0212<<14 | 0x40<<7 | 0x39, - 36929 - 19968: jis0208<<14 | 0x25<<7 | 0x3A, - 36930 - 19968: jis0208<<14 | 0x1E<<7 | 0x4A, - 36931 - 19968: jis0212<<14 | 0x40<<7 | 0x3A, - 36932 - 19968: jis0212<<14 | 0x40<<7 | 0x3B, - 36933 - 19968: jis0208<<14 | 0x22<<7 | 0x38, - 36935 - 19968: jis0208<<14 | 0x15<<7 | 0x57, - 36937 - 19968: jis0208<<14 | 0x4D<<7 | 0x05, - 36938 - 19968: jis0208<<14 | 0x2C<<7 | 0x16, - 36939 - 19968: jis0208<<14 | 0x10<<7 | 0x1E, - 36940 - 19968: jis0212<<14 | 0x40<<7 | 0x3C, - 36941 - 19968: jis0208<<14 | 0x29<<7 | 0x36, - 36942 - 19968: jis0208<<14 | 0x11<<7 | 0x40, - 36943 - 19968: jis0208<<14 | 0x4D<<7 | 0x00, - 36944 - 19968: jis0208<<14 | 0x4D<<7 | 0x01, - 36945 - 19968: jis0208<<14 | 0x4D<<7 | 0x02, - 36946 - 19968: jis0208<<14 | 0x4D<<7 | 0x03, - 36947 - 19968: jis0208<<14 | 0x25<<7 | 0x1A, - 36948 - 19968: jis0208<<14 | 0x22<<7 | 0x02, - 36949 - 19968: jis0208<<14 | 0x0F<<7 | 0x42, - 36950 - 19968: jis0208<<14 | 0x4D<<7 | 0x07, - 36952 - 19968: jis0208<<14 | 0x4D<<7 | 0x08, - 36953 - 19968: jis0208<<14 | 0x53<<7 | 0x02, - 36955 - 19968: jis0212<<14 | 0x40<<7 | 0x3D, - 36956 - 19968: jis0208<<14 | 0x21<<7 | 0x1C, - 36957 - 19968: jis0212<<14 | 0x40<<7 | 0x3E, - 36958 - 19968: jis0208<<14 | 0x4D<<7 | 0x09, - 36960 - 19968: jis0208<<14 | 0x10<<7 | 0x52, - 36961 - 19968: jis0208<<14 | 0x20<<7 | 0x2B, - 36962 - 19968: jis0212<<14 | 0x40<<7 | 0x3F, - 36963 - 19968: jis0208<<14 | 0x17<<7 | 0x0E, - 36965 - 19968: jis0208<<14 | 0x2C<<7 | 0x39, - 36966 - 19968: jis0212<<14 | 0x40<<7 | 0x40, - 36967 - 19968: jis0208<<14 | 0x5A<<7 | 0x58, - 36968 - 19968: jis0208<<14 | 0x4D<<7 | 0x0A, - 36969 - 19968: jis0208<<14 | 0x24<<7 | 0x0B, - 36972 - 19968: jis0212<<14 | 0x40<<7 | 0x42, - 36973 - 19968: jis0208<<14 | 0x20<<7 | 0x57, - 36974 - 19968: jis0208<<14 | 0x1B<<7 | 0x36, - 36975 - 19968: jis0208<<14 | 0x4D<<7 | 0x0B, - 36976 - 19968: jis0212<<14 | 0x40<<7 | 0x43, - 36978 - 19968: jis0208<<14 | 0x4D<<7 | 0x0E, - 36980 - 19968: jis0212<<14 | 0x40<<7 | 0x44, - 36981 - 19968: jis0208<<14 | 0x1C<<7 | 0x44, - 36982 - 19968: jis0208<<14 | 0x4D<<7 | 0x0C, - 36983 - 19968: jis0208<<14 | 0x20<<7 | 0x0A, - 36984 - 19968: jis0208<<14 | 0x20<<7 | 0x09, - 36985 - 19968: jis0212<<14 | 0x40<<7 | 0x45, - 36986 - 19968: jis0208<<14 | 0x0F<<7 | 0x43, - 36988 - 19968: jis0208<<14 | 0x2D<<7 | 0x2A, - 36989 - 19968: jis0208<<14 | 0x4D<<7 | 0x10, - 36991 - 19968: jis0208<<14 | 0x27<<7 | 0x51, - 36992 - 19968: jis0208<<14 | 0x4D<<7 | 0x12, - 36993 - 19968: jis0208<<14 | 0x4D<<7 | 0x11, - 36994 - 19968: jis0208<<14 | 0x4D<<7 | 0x0F, - 36995 - 19968: jis0208<<14 | 0x42<<7 | 0x43, - 36996 - 19968: jis0208<<14 | 0x13<<7 | 0x33, - 36997 - 19968: jis0212<<14 | 0x40<<7 | 0x46, - 36999 - 19968: jis0208<<14 | 0x4C<<7 | 0x4D, - 37000 - 19968: jis0212<<14 | 0x40<<7 | 0x47, - 37001 - 19968: jis0208<<14 | 0x4D<<7 | 0x14, - 37002 - 19968: jis0208<<14 | 0x4D<<7 | 0x13, - 37003 - 19968: jis0212<<14 | 0x40<<7 | 0x48, - 37004 - 19968: jis0212<<14 | 0x40<<7 | 0x49, - 37006 - 19968: jis0212<<14 | 0x40<<7 | 0x4A, - 37007 - 19968: jis0208<<14 | 0x4D<<7 | 0x15, - 37008 - 19968: jis0212<<14 | 0x40<<7 | 0x4B, - 37009 - 19968: jis0208<<14 | 0x2C<<7 | 0x17, - 37013 - 19968: jis0212<<14 | 0x40<<7 | 0x4C, - 37015 - 19968: jis0212<<14 | 0x40<<7 | 0x4D, - 37016 - 19968: jis0212<<14 | 0x40<<7 | 0x4E, - 37017 - 19968: jis0212<<14 | 0x40<<7 | 0x4F, - 37019 - 19968: jis0212<<14 | 0x40<<7 | 0x50, - 37024 - 19968: jis0212<<14 | 0x40<<7 | 0x51, - 37025 - 19968: jis0212<<14 | 0x40<<7 | 0x52, - 37026 - 19968: jis0212<<14 | 0x40<<7 | 0x53, - 37027 - 19968: jis0208<<14 | 0x25<<7 | 0x40, - 37029 - 19968: jis0212<<14 | 0x40<<7 | 0x54, - 37030 - 19968: jis0208<<14 | 0x2A<<7 | 0x0D, - 37032 - 19968: jis0208<<14 | 0x4D<<7 | 0x16, - 37034 - 19968: jis0208<<14 | 0x1B<<7 | 0x38, - 37039 - 19968: jis0208<<14 | 0x4D<<7 | 0x17, - 37040 - 19968: jis0212<<14 | 0x40<<7 | 0x55, - 37041 - 19968: jis0208<<14 | 0x4D<<7 | 0x18, - 37042 - 19968: jis0212<<14 | 0x40<<7 | 0x56, - 37043 - 19968: jis0212<<14 | 0x40<<7 | 0x57, - 37044 - 19968: jis0212<<14 | 0x40<<7 | 0x58, - 37045 - 19968: jis0208<<14 | 0x4D<<7 | 0x19, - 37046 - 19968: jis0212<<14 | 0x40<<7 | 0x59, - 37048 - 19968: jis0208<<14 | 0x24<<7 | 0x00, - 37053 - 19968: jis0212<<14 | 0x40<<7 | 0x5A, - 37054 - 19968: jis0212<<14 | 0x40<<7 | 0x5C, - 37057 - 19968: jis0208<<14 | 0x0F<<7 | 0x49, - 37059 - 19968: jis0212<<14 | 0x40<<7 | 0x5D, - 37060 - 19968: jis0212<<14 | 0x41<<7 | 0x00, - 37061 - 19968: jis0212<<14 | 0x41<<7 | 0x01, - 37063 - 19968: jis0212<<14 | 0x41<<7 | 0x02, - 37064 - 19968: jis0212<<14 | 0x41<<7 | 0x03, - 37066 - 19968: jis0208<<14 | 0x18<<7 | 0x38, - 37068 - 19968: jis0212<<14 | 0x40<<7 | 0x5B, - 37070 - 19968: jis0208<<14 | 0x2E<<7 | 0x19, - 37074 - 19968: jis0212<<14 | 0x41<<7 | 0x0C, - 37077 - 19968: jis0212<<14 | 0x41<<7 | 0x04, - 37079 - 19968: jis0212<<14 | 0x41<<7 | 0x05, - 37080 - 19968: jis0212<<14 | 0x41<<7 | 0x06, - 37081 - 19968: jis0212<<14 | 0x41<<7 | 0x07, - 37083 - 19968: jis0208<<14 | 0x4D<<7 | 0x1D, - 37084 - 19968: jis0212<<14 | 0x41<<7 | 0x08, - 37085 - 19968: jis0212<<14 | 0x41<<7 | 0x09, - 37086 - 19968: jis0208<<14 | 0x5A<<7 | 0x59, - 37087 - 19968: jis0212<<14 | 0x41<<7 | 0x0A, - 37089 - 19968: jis0208<<14 | 0x16<<7 | 0x13, - 37090 - 19968: jis0208<<14 | 0x4D<<7 | 0x1A, - 37092 - 19968: jis0208<<14 | 0x4D<<7 | 0x1B, - 37093 - 19968: jis0212<<14 | 0x41<<7 | 0x0B, - 37096 - 19968: jis0208<<14 | 0x28<<7 | 0x53, - 37099 - 19968: jis0212<<14 | 0x41<<7 | 0x0E, - 37101 - 19968: jis0208<<14 | 0x12<<7 | 0x33, - 37103 - 19968: jis0212<<14 | 0x41<<7 | 0x0F, - 37104 - 19968: jis0212<<14 | 0x41<<7 | 0x10, - 37108 - 19968: jis0212<<14 | 0x41<<7 | 0x11, - 37109 - 19968: jis0208<<14 | 0x2C<<7 | 0x18, - 37110 - 19968: jis0212<<14 | 0x41<<7 | 0x0D, - 37111 - 19968: jis0208<<14 | 0x15<<7 | 0x1E, - 37117 - 19968: jis0208<<14 | 0x24<<7 | 0x33, - 37118 - 19968: jis0212<<14 | 0x41<<7 | 0x12, - 37119 - 19968: jis0212<<14 | 0x41<<7 | 0x13, - 37120 - 19968: jis0212<<14 | 0x41<<7 | 0x14, - 37122 - 19968: jis0208<<14 | 0x4D<<7 | 0x1E, - 37124 - 19968: jis0212<<14 | 0x41<<7 | 0x15, - 37125 - 19968: jis0212<<14 | 0x41<<7 | 0x16, - 37126 - 19968: jis0212<<14 | 0x41<<7 | 0x17, - 37128 - 19968: jis0212<<14 | 0x41<<7 | 0x18, - 37133 - 19968: jis0212<<14 | 0x41<<7 | 0x19, - 37136 - 19968: jis0212<<14 | 0x41<<7 | 0x1A, - 37138 - 19968: jis0208<<14 | 0x4D<<7 | 0x1F, - 37140 - 19968: jis0212<<14 | 0x41<<7 | 0x1B, - 37141 - 19968: jis0208<<14 | 0x5A<<7 | 0x5B, - 37142 - 19968: jis0212<<14 | 0x41<<7 | 0x1C, - 37143 - 19968: jis0212<<14 | 0x41<<7 | 0x1D, - 37144 - 19968: jis0212<<14 | 0x41<<7 | 0x1E, - 37145 - 19968: jis0208<<14 | 0x4D<<7 | 0x20, - 37146 - 19968: jis0212<<14 | 0x41<<7 | 0x1F, - 37148 - 19968: jis0212<<14 | 0x41<<7 | 0x20, - 37150 - 19968: jis0212<<14 | 0x41<<7 | 0x21, - 37152 - 19968: jis0212<<14 | 0x41<<7 | 0x22, - 37154 - 19968: jis0212<<14 | 0x41<<7 | 0x24, - 37155 - 19968: jis0212<<14 | 0x41<<7 | 0x25, - 37157 - 19968: jis0212<<14 | 0x41<<7 | 0x23, - 37159 - 19968: jis0208<<14 | 0x5A<<7 | 0x5C, - 37161 - 19968: jis0212<<14 | 0x41<<7 | 0x27, - 37165 - 19968: jis0208<<14 | 0x24<<7 | 0x01, - 37166 - 19968: jis0212<<14 | 0x41<<7 | 0x28, - 37167 - 19968: jis0212<<14 | 0x41<<7 | 0x29, - 37168 - 19968: jis0208<<14 | 0x4D<<7 | 0x22, - 37169 - 19968: jis0212<<14 | 0x41<<7 | 0x2A, - 37170 - 19968: jis0208<<14 | 0x4D<<7 | 0x21, - 37172 - 19968: jis0212<<14 | 0x41<<7 | 0x2B, - 37174 - 19968: jis0212<<14 | 0x41<<7 | 0x2C, - 37175 - 19968: jis0212<<14 | 0x41<<7 | 0x2D, - 37177 - 19968: jis0212<<14 | 0x41<<7 | 0x2E, - 37178 - 19968: jis0212<<14 | 0x41<<7 | 0x2F, - 37180 - 19968: jis0212<<14 | 0x41<<7 | 0x30, - 37181 - 19968: jis0212<<14 | 0x41<<7 | 0x31, - 37187 - 19968: jis0212<<14 | 0x41<<7 | 0x32, - 37191 - 19968: jis0212<<14 | 0x41<<7 | 0x33, - 37192 - 19968: jis0212<<14 | 0x41<<7 | 0x34, - 37193 - 19968: jis0208<<14 | 0x25<<7 | 0x32, - 37194 - 19968: jis0208<<14 | 0x4D<<7 | 0x23, - 37195 - 19968: jis0208<<14 | 0x1C<<7 | 0x15, - 37196 - 19968: jis0208<<14 | 0x1B<<7 | 0x3F, - 37197 - 19968: jis0208<<14 | 0x26<<7 | 0x3A, - 37198 - 19968: jis0208<<14 | 0x22<<7 | 0x50, - 37199 - 19968: jis0212<<14 | 0x41<<7 | 0x35, - 37202 - 19968: jis0208<<14 | 0x1B<<7 | 0x51, - 37203 - 19968: jis0212<<14 | 0x41<<7 | 0x36, - 37204 - 19968: jis0208<<14 | 0x1E<<7 | 0x4B, - 37206 - 19968: jis0208<<14 | 0x4D<<7 | 0x24, - 37207 - 19968: jis0212<<14 | 0x41<<7 | 0x37, - 37208 - 19968: jis0208<<14 | 0x4D<<7 | 0x25, - 37209 - 19968: jis0212<<14 | 0x41<<7 | 0x38, - 37210 - 19968: jis0212<<14 | 0x41<<7 | 0x39, - 37211 - 19968: jis0212<<14 | 0x41<<7 | 0x3A, - 37217 - 19968: jis0212<<14 | 0x41<<7 | 0x3B, - 37218 - 19968: jis0208<<14 | 0x1E<<7 | 0x3C, - 37219 - 19968: jis0208<<14 | 0x4D<<7 | 0x26, - 37220 - 19968: jis0212<<14 | 0x41<<7 | 0x3C, - 37221 - 19968: jis0208<<14 | 0x4D<<7 | 0x27, - 37223 - 19968: jis0212<<14 | 0x41<<7 | 0x3D, - 37225 - 19968: jis0208<<14 | 0x4D<<7 | 0x28, - 37226 - 19968: jis0208<<14 | 0x2C<<7 | 0x4E, - 37228 - 19968: jis0208<<14 | 0x1C<<7 | 0x16, - 37229 - 19968: jis0212<<14 | 0x41<<7 | 0x3E, - 37234 - 19968: jis0208<<14 | 0x4D<<7 | 0x2A, - 37235 - 19968: jis0208<<14 | 0x4D<<7 | 0x29, - 37236 - 19968: jis0212<<14 | 0x41<<7 | 0x3F, - 37237 - 19968: jis0208<<14 | 0x18<<7 | 0x39, - 37239 - 19968: jis0208<<14 | 0x18<<7 | 0x52, - 37240 - 19968: jis0208<<14 | 0x1A<<7 | 0x1F, - 37241 - 19968: jis0212<<14 | 0x41<<7 | 0x40, - 37242 - 19968: jis0212<<14 | 0x41<<7 | 0x41, - 37243 - 19968: jis0212<<14 | 0x41<<7 | 0x42, - 37249 - 19968: jis0212<<14 | 0x41<<7 | 0x43, - 37250 - 19968: jis0208<<14 | 0x4D<<7 | 0x2D, - 37251 - 19968: jis0212<<14 | 0x41<<7 | 0x44, - 37253 - 19968: jis0212<<14 | 0x41<<7 | 0x45, - 37254 - 19968: jis0212<<14 | 0x41<<7 | 0x46, - 37255 - 19968: jis0208<<14 | 0x1C<<7 | 0x45, - 37257 - 19968: jis0208<<14 | 0x4D<<7 | 0x2C, - 37258 - 19968: jis0212<<14 | 0x41<<7 | 0x47, - 37259 - 19968: jis0208<<14 | 0x4D<<7 | 0x2B, - 37261 - 19968: jis0208<<14 | 0x21<<7 | 0x48, - 37262 - 19968: jis0212<<14 | 0x41<<7 | 0x48, - 37264 - 19968: jis0208<<14 | 0x17<<7 | 0x4E, - 37265 - 19968: jis0212<<14 | 0x41<<7 | 0x49, - 37266 - 19968: jis0208<<14 | 0x1F<<7 | 0x22, - 37267 - 19968: jis0212<<14 | 0x41<<7 | 0x4A, - 37268 - 19968: jis0212<<14 | 0x41<<7 | 0x4B, - 37269 - 19968: jis0212<<14 | 0x41<<7 | 0x4C, - 37271 - 19968: jis0208<<14 | 0x27<<7 | 0x0F, - 37272 - 19968: jis0212<<14 | 0x41<<7 | 0x4D, - 37276 - 19968: jis0208<<14 | 0x1C<<7 | 0x18, - 37278 - 19968: jis0212<<14 | 0x41<<7 | 0x4E, - 37281 - 19968: jis0212<<14 | 0x41<<7 | 0x4F, - 37282 - 19968: jis0208<<14 | 0x4D<<7 | 0x2E, - 37284 - 19968: jis0208<<14 | 0x1D<<7 | 0x3E, - 37286 - 19968: jis0212<<14 | 0x41<<7 | 0x50, - 37288 - 19968: jis0212<<14 | 0x41<<7 | 0x51, - 37290 - 19968: jis0208<<14 | 0x4D<<7 | 0x31, - 37291 - 19968: jis0208<<14 | 0x4D<<7 | 0x2F, - 37292 - 19968: jis0212<<14 | 0x41<<7 | 0x52, - 37293 - 19968: jis0212<<14 | 0x41<<7 | 0x53, - 37294 - 19968: jis0212<<14 | 0x41<<7 | 0x54, - 37295 - 19968: jis0208<<14 | 0x4D<<7 | 0x30, - 37296 - 19968: jis0212<<14 | 0x41<<7 | 0x55, - 37297 - 19968: jis0212<<14 | 0x41<<7 | 0x56, - 37298 - 19968: jis0212<<14 | 0x41<<7 | 0x57, - 37299 - 19968: jis0212<<14 | 0x41<<7 | 0x58, - 37300 - 19968: jis0208<<14 | 0x4D<<7 | 0x33, - 37301 - 19968: jis0208<<14 | 0x4D<<7 | 0x32, - 37302 - 19968: jis0212<<14 | 0x41<<7 | 0x59, - 37304 - 19968: jis0208<<14 | 0x1D<<7 | 0x59, - 37306 - 19968: jis0208<<14 | 0x4D<<7 | 0x34, - 37307 - 19968: jis0212<<14 | 0x41<<7 | 0x5A, - 37308 - 19968: jis0212<<14 | 0x41<<7 | 0x5B, - 37309 - 19968: jis0212<<14 | 0x41<<7 | 0x5C, - 37311 - 19968: jis0212<<14 | 0x41<<7 | 0x5D, - 37312 - 19968: jis0208<<14 | 0x4D<<7 | 0x35, - 37313 - 19968: jis0208<<14 | 0x4D<<7 | 0x36, - 37314 - 19968: jis0212<<14 | 0x42<<7 | 0x00, - 37315 - 19968: jis0212<<14 | 0x42<<7 | 0x01, - 37317 - 19968: jis0212<<14 | 0x42<<7 | 0x02, - 37318 - 19968: jis0208<<14 | 0x27<<7 | 0x2F, - 37319 - 19968: jis0208<<14 | 0x19<<7 | 0x32, - 37320 - 19968: jis0208<<14 | 0x1B<<7 | 0x40, - 37321 - 19968: jis0208<<14 | 0x4D<<7 | 0x37, - 37323 - 19968: jis0208<<14 | 0x4D<<7 | 0x38, - 37324 - 19968: jis0208<<14 | 0x2D<<7 | 0x03, - 37325 - 19968: jis0208<<14 | 0x1C<<7 | 0x24, - 37326 - 19968: jis0208<<14 | 0x2B<<7 | 0x4D, - 37327 - 19968: jis0208<<14 | 0x2D<<7 | 0x2B, - 37328 - 19968: jis0208<<14 | 0x4D<<7 | 0x39, - 37329 - 19968: jis0208<<14 | 0x15<<7 | 0x41, - 37331 - 19968: jis0212<<14 | 0x42<<7 | 0x03, - 37332 - 19968: jis0212<<14 | 0x42<<7 | 0x04, - 37334 - 19968: jis0208<<14 | 0x4D<<7 | 0x3A, - 37335 - 19968: jis0208<<14 | 0x5B<<7 | 0x00, - 37336 - 19968: jis0208<<14 | 0x24<<7 | 0x02, - 37337 - 19968: jis0212<<14 | 0x42<<7 | 0x06, - 37338 - 19968: jis0208<<14 | 0x5A<<7 | 0x5D, - 37339 - 19968: jis0208<<14 | 0x4D<<7 | 0x3D, - 37340 - 19968: jis0208<<14 | 0x12<<7 | 0x57, - 37341 - 19968: jis0208<<14 | 0x1E<<7 | 0x2A, - 37342 - 19968: jis0208<<14 | 0x5B<<7 | 0x01, - 37343 - 19968: jis0208<<14 | 0x4D<<7 | 0x3B, - 37345 - 19968: jis0208<<14 | 0x4D<<7 | 0x3C, - 37347 - 19968: jis0208<<14 | 0x23<<7 | 0x3F, - 37348 - 19968: jis0208<<14 | 0x5B<<7 | 0x04, - 37349 - 19968: jis0208<<14 | 0x5B<<7 | 0x05, - 37350 - 19968: jis0208<<14 | 0x2A<<7 | 0x34, - 37351 - 19968: jis0208<<14 | 0x15<<7 | 0x5B, - 37353 - 19968: jis0212<<14 | 0x42<<7 | 0x0B, - 37354 - 19968: jis0212<<14 | 0x42<<7 | 0x0C, - 37356 - 19968: jis0212<<14 | 0x42<<7 | 0x0D, - 37357 - 19968: jis0208<<14 | 0x5B<<7 | 0x02, - 37358 - 19968: jis0208<<14 | 0x5B<<7 | 0x03, - 37359 - 19968: jis0212<<14 | 0x42<<7 | 0x10, - 37360 - 19968: jis0212<<14 | 0x42<<7 | 0x11, - 37361 - 19968: jis0212<<14 | 0x42<<7 | 0x12, - 37365 - 19968: jis0208<<14 | 0x4D<<7 | 0x3F, - 37366 - 19968: jis0208<<14 | 0x4D<<7 | 0x40, - 37367 - 19968: jis0212<<14 | 0x42<<7 | 0x13, - 37369 - 19968: jis0212<<14 | 0x42<<7 | 0x14, - 37371 - 19968: jis0212<<14 | 0x42<<7 | 0x15, - 37372 - 19968: jis0208<<14 | 0x4D<<7 | 0x3E, - 37373 - 19968: jis0212<<14 | 0x42<<7 | 0x16, - 37375 - 19968: jis0208<<14 | 0x4D<<7 | 0x42, - 37376 - 19968: jis0212<<14 | 0x42<<7 | 0x17, - 37377 - 19968: jis0212<<14 | 0x42<<7 | 0x18, - 37380 - 19968: jis0212<<14 | 0x42<<7 | 0x19, - 37381 - 19968: jis0212<<14 | 0x42<<7 | 0x1A, - 37382 - 19968: jis0208<<14 | 0x5B<<7 | 0x06, - 37383 - 19968: jis0212<<14 | 0x42<<7 | 0x1C, - 37385 - 19968: jis0212<<14 | 0x42<<7 | 0x1D, - 37386 - 19968: jis0208<<14 | 0x5B<<7 | 0x08, - 37388 - 19968: jis0212<<14 | 0x42<<7 | 0x1F, - 37389 - 19968: jis0208<<14 | 0x25<<7 | 0x3E, - 37390 - 19968: jis0208<<14 | 0x12<<7 | 0x22, - 37392 - 19968: jis0208<<14 | 0x5B<<7 | 0x07, - 37393 - 19968: jis0208<<14 | 0x4D<<7 | 0x46, - 37394 - 19968: jis0212<<14 | 0x42<<7 | 0x21, - 37395 - 19968: jis0212<<14 | 0x42<<7 | 0x22, - 37396 - 19968: jis0208<<14 | 0x4D<<7 | 0x43, - 37397 - 19968: jis0208<<14 | 0x4D<<7 | 0x45, - 37398 - 19968: jis0212<<14 | 0x42<<7 | 0x23, - 37400 - 19968: jis0212<<14 | 0x42<<7 | 0x24, - 37404 - 19968: jis0212<<14 | 0x42<<7 | 0x25, - 37405 - 19968: jis0212<<14 | 0x42<<7 | 0x26, - 37406 - 19968: jis0208<<14 | 0x4D<<7 | 0x41, - 37411 - 19968: jis0212<<14 | 0x42<<7 | 0x27, - 37412 - 19968: jis0212<<14 | 0x42<<7 | 0x28, - 37413 - 19968: jis0212<<14 | 0x42<<7 | 0x29, - 37414 - 19968: jis0212<<14 | 0x42<<7 | 0x2A, - 37416 - 19968: jis0212<<14 | 0x42<<7 | 0x2B, - 37417 - 19968: jis0208<<14 | 0x4E<<7 | 0x2E, - 37420 - 19968: jis0208<<14 | 0x4D<<7 | 0x44, - 37422 - 19968: jis0212<<14 | 0x42<<7 | 0x2C, - 37423 - 19968: jis0212<<14 | 0x42<<7 | 0x2D, - 37424 - 19968: jis0212<<14 | 0x42<<7 | 0x2E, - 37427 - 19968: jis0212<<14 | 0x42<<7 | 0x2F, - 37428 - 19968: jis0208<<14 | 0x2D<<7 | 0x4A, - 37429 - 19968: jis0212<<14 | 0x42<<7 | 0x30, - 37430 - 19968: jis0212<<14 | 0x42<<7 | 0x31, - 37431 - 19968: jis0208<<14 | 0x17<<7 | 0x39, - 37432 - 19968: jis0212<<14 | 0x42<<7 | 0x32, - 37433 - 19968: jis0208<<14 | 0x5B<<7 | 0x0F, - 37434 - 19968: jis0208<<14 | 0x5B<<7 | 0x09, - 37436 - 19968: jis0208<<14 | 0x5B<<7 | 0x0B, - 37438 - 19968: jis0212<<14 | 0x42<<7 | 0x36, - 37439 - 19968: jis0208<<14 | 0x4D<<7 | 0x4E, - 37440 - 19968: jis0208<<14 | 0x5B<<7 | 0x0A, - 37442 - 19968: jis0212<<14 | 0x42<<7 | 0x38, - 37443 - 19968: jis0212<<14 | 0x42<<7 | 0x39, - 37444 - 19968: jis0208<<14 | 0x24<<7 | 0x13, - 37445 - 19968: jis0208<<14 | 0x4D<<7 | 0x49, - 37446 - 19968: jis0212<<14 | 0x42<<7 | 0x3A, - 37447 - 19968: jis0212<<14 | 0x42<<7 | 0x3B, - 37448 - 19968: jis0208<<14 | 0x4D<<7 | 0x4C, - 37449 - 19968: jis0208<<14 | 0x4D<<7 | 0x4A, - 37450 - 19968: jis0212<<14 | 0x42<<7 | 0x3C, - 37451 - 19968: jis0208<<14 | 0x4D<<7 | 0x4F, - 37453 - 19968: jis0212<<14 | 0x42<<7 | 0x3D, - 37454 - 19968: jis0208<<14 | 0x5B<<7 | 0x0C, - 37455 - 19968: jis0212<<14 | 0x42<<7 | 0x3F, - 37456 - 19968: jis0208<<14 | 0x4D<<7 | 0x50, - 37457 - 19968: jis0208<<14 | 0x5B<<7 | 0x0E, - 37463 - 19968: jis0208<<14 | 0x4D<<7 | 0x48, - 37464 - 19968: jis0212<<14 | 0x42<<7 | 0x41, - 37465 - 19968: jis0208<<14 | 0x5B<<7 | 0x0D, - 37466 - 19968: jis0208<<14 | 0x4D<<7 | 0x55, - 37467 - 19968: jis0208<<14 | 0x10<<7 | 0x53, - 37468 - 19968: jis0212<<14 | 0x42<<7 | 0x43, - 37469 - 19968: jis0212<<14 | 0x42<<7 | 0x44, - 37470 - 19968: jis0208<<14 | 0x4D<<7 | 0x47, - 37472 - 19968: jis0212<<14 | 0x42<<7 | 0x45, - 37473 - 19968: jis0212<<14 | 0x42<<7 | 0x46, - 37474 - 19968: jis0208<<14 | 0x27<<7 | 0x0C, - 37476 - 19968: jis0208<<14 | 0x4D<<7 | 0x4B, - 37477 - 19968: jis0212<<14 | 0x42<<7 | 0x47, - 37478 - 19968: jis0208<<14 | 0x1D<<7 | 0x3F, - 37479 - 19968: jis0208<<14 | 0x5B<<7 | 0x10, - 37480 - 19968: jis0212<<14 | 0x42<<7 | 0x49, - 37481 - 19968: jis0212<<14 | 0x42<<7 | 0x4A, - 37486 - 19968: jis0212<<14 | 0x42<<7 | 0x4B, - 37487 - 19968: jis0212<<14 | 0x42<<7 | 0x4C, - 37488 - 19968: jis0212<<14 | 0x42<<7 | 0x4D, - 37489 - 19968: jis0208<<14 | 0x18<<7 | 0x3A, - 37493 - 19968: jis0212<<14 | 0x42<<7 | 0x4E, - 37494 - 19968: jis0212<<14 | 0x42<<7 | 0x4F, - 37495 - 19968: jis0208<<14 | 0x5B<<7 | 0x12, - 37496 - 19968: jis0208<<14 | 0x5B<<7 | 0x13, - 37497 - 19968: jis0212<<14 | 0x42<<7 | 0x52, - 37499 - 19968: jis0212<<14 | 0x42<<7 | 0x53, - 37500 - 19968: jis0212<<14 | 0x42<<7 | 0x54, - 37501 - 19968: jis0212<<14 | 0x42<<7 | 0x55, - 37502 - 19968: jis0208<<14 | 0x2A<<7 | 0x27, - 37503 - 19968: jis0212<<14 | 0x42<<7 | 0x56, - 37504 - 19968: jis0208<<14 | 0x15<<7 | 0x43, - 37507 - 19968: jis0208<<14 | 0x1C<<7 | 0x25, - 37509 - 19968: jis0208<<14 | 0x25<<7 | 0x1B, - 37512 - 19968: jis0208<<14 | 0x58<<7 | 0x03, - 37513 - 19968: jis0212<<14 | 0x42<<7 | 0x58, - 37514 - 19968: jis0212<<14 | 0x42<<7 | 0x59, - 37517 - 19968: jis0212<<14 | 0x42<<7 | 0x5A, - 37518 - 19968: jis0212<<14 | 0x42<<7 | 0x5B, - 37521 - 19968: jis0208<<14 | 0x20<<7 | 0x0C, - 37522 - 19968: jis0212<<14 | 0x42<<7 | 0x5C, - 37523 - 19968: jis0208<<14 | 0x4D<<7 | 0x53, - 37525 - 19968: jis0208<<14 | 0x4D<<7 | 0x4D, - 37526 - 19968: jis0208<<14 | 0x4D<<7 | 0x52, - 37527 - 19968: jis0212<<14 | 0x42<<7 | 0x5D, - 37528 - 19968: jis0208<<14 | 0x2B<<7 | 0x22, - 37529 - 19968: jis0212<<14 | 0x43<<7 | 0x00, - 37530 - 19968: jis0208<<14 | 0x23<<7 | 0x17, - 37531 - 19968: jis0208<<14 | 0x4D<<7 | 0x54, - 37532 - 19968: jis0208<<14 | 0x4D<<7 | 0x51, - 37535 - 19968: jis0212<<14 | 0x43<<7 | 0x01, - 37536 - 19968: jis0212<<14 | 0x43<<7 | 0x02, - 37540 - 19968: jis0212<<14 | 0x43<<7 | 0x03, - 37541 - 19968: jis0212<<14 | 0x43<<7 | 0x04, - 37543 - 19968: jis0208<<14 | 0x5B<<7 | 0x11, - 37544 - 19968: jis0212<<14 | 0x43<<7 | 0x06, - 37547 - 19968: jis0212<<14 | 0x43<<7 | 0x07, - 37549 - 19968: jis0208<<14 | 0x20<<7 | 0x0B, - 37551 - 19968: jis0212<<14 | 0x43<<7 | 0x08, - 37554 - 19968: jis0212<<14 | 0x43<<7 | 0x09, - 37558 - 19968: jis0212<<14 | 0x43<<7 | 0x0A, - 37559 - 19968: jis0208<<14 | 0x4D<<7 | 0x58, - 37560 - 19968: jis0212<<14 | 0x43<<7 | 0x0B, - 37561 - 19968: jis0208<<14 | 0x4D<<7 | 0x57, - 37562 - 19968: jis0212<<14 | 0x43<<7 | 0x0C, - 37563 - 19968: jis0212<<14 | 0x43<<7 | 0x0D, - 37564 - 19968: jis0212<<14 | 0x43<<7 | 0x0E, - 37565 - 19968: jis0212<<14 | 0x43<<7 | 0x0F, - 37567 - 19968: jis0212<<14 | 0x43<<7 | 0x10, - 37568 - 19968: jis0212<<14 | 0x43<<7 | 0x11, - 37569 - 19968: jis0212<<14 | 0x43<<7 | 0x12, - 37570 - 19968: jis0212<<14 | 0x43<<7 | 0x13, - 37571 - 19968: jis0212<<14 | 0x43<<7 | 0x14, - 37573 - 19968: jis0212<<14 | 0x43<<7 | 0x15, - 37574 - 19968: jis0212<<14 | 0x43<<7 | 0x16, - 37575 - 19968: jis0212<<14 | 0x43<<7 | 0x17, - 37576 - 19968: jis0212<<14 | 0x43<<7 | 0x18, - 37579 - 19968: jis0212<<14 | 0x43<<7 | 0x19, - 37580 - 19968: jis0212<<14 | 0x43<<7 | 0x1A, - 37581 - 19968: jis0212<<14 | 0x43<<7 | 0x1B, - 37582 - 19968: jis0212<<14 | 0x43<<7 | 0x1C, - 37583 - 19968: jis0208<<14 | 0x4D<<7 | 0x56, - 37584 - 19968: jis0208<<14 | 0x5B<<7 | 0x17, - 37586 - 19968: jis0208<<14 | 0x2A<<7 | 0x0E, - 37587 - 19968: jis0208<<14 | 0x5B<<7 | 0x1B, - 37589 - 19968: jis0208<<14 | 0x5B<<7 | 0x19, - 37591 - 19968: jis0208<<14 | 0x5B<<7 | 0x15, - 37592 - 19968: jis0212<<14 | 0x43<<7 | 0x21, - 37593 - 19968: jis0208<<14 | 0x5B<<7 | 0x16, - 37596 - 19968: jis0212<<14 | 0x43<<7 | 0x23, - 37597 - 19968: jis0212<<14 | 0x43<<7 | 0x24, - 37599 - 19968: jis0212<<14 | 0x43<<7 | 0x25, - 37600 - 19968: jis0208<<14 | 0x5B<<7 | 0x1A, - 37601 - 19968: jis0212<<14 | 0x43<<7 | 0x27, - 37603 - 19968: jis0212<<14 | 0x43<<7 | 0x28, - 37604 - 19968: jis0208<<14 | 0x1C<<7 | 0x5A, - 37605 - 19968: jis0212<<14 | 0x43<<7 | 0x29, - 37607 - 19968: jis0208<<14 | 0x5B<<7 | 0x14, - 37608 - 19968: jis0212<<14 | 0x43<<7 | 0x2B, - 37609 - 19968: jis0208<<14 | 0x4D<<7 | 0x59, - 37610 - 19968: jis0208<<14 | 0x29<<7 | 0x3E, - 37612 - 19968: jis0212<<14 | 0x43<<7 | 0x2C, - 37613 - 19968: jis0208<<14 | 0x10<<7 | 0x33, - 37614 - 19968: jis0212<<14 | 0x43<<7 | 0x2D, - 37616 - 19968: jis0212<<14 | 0x43<<7 | 0x2E, - 37618 - 19968: jis0208<<14 | 0x28<<7 | 0x25, - 37619 - 19968: jis0208<<14 | 0x22<<7 | 0x51, - 37624 - 19968: jis0208<<14 | 0x14<<7 | 0x57, - 37625 - 19968: jis0208<<14 | 0x58<<7 | 0x09, - 37626 - 19968: jis0208<<14 | 0x4D<<7 | 0x5B, - 37627 - 19968: jis0208<<14 | 0x5B<<7 | 0x1E, - 37628 - 19968: jis0208<<14 | 0x18<<7 | 0x3C, - 37631 - 19968: jis0208<<14 | 0x5B<<7 | 0x21, - 37632 - 19968: jis0212<<14 | 0x43<<7 | 0x32, - 37634 - 19968: jis0208<<14 | 0x5B<<7 | 0x23, - 37638 - 19968: jis0208<<14 | 0x1A<<7 | 0x0B, - 37640 - 19968: jis0212<<14 | 0x43<<7 | 0x34, - 37645 - 19968: jis0212<<14 | 0x43<<7 | 0x35, - 37647 - 19968: jis0208<<14 | 0x4D<<7 | 0x5A, - 37648 - 19968: jis0208<<14 | 0x1E<<7 | 0x4C, - 37649 - 19968: jis0212<<14 | 0x43<<7 | 0x36, - 37652 - 19968: jis0212<<14 | 0x43<<7 | 0x37, - 37653 - 19968: jis0212<<14 | 0x43<<7 | 0x38, - 37656 - 19968: jis0208<<14 | 0x1E<<7 | 0x4D, - 37657 - 19968: jis0208<<14 | 0x4E<<7 | 0x00, - 37658 - 19968: jis0208<<14 | 0x4E<<7 | 0x02, - 37660 - 19968: jis0212<<14 | 0x43<<7 | 0x39, - 37661 - 19968: jis0208<<14 | 0x5B<<7 | 0x22, - 37662 - 19968: jis0208<<14 | 0x5B<<7 | 0x20, - 37663 - 19968: jis0212<<14 | 0x43<<7 | 0x3C, - 37664 - 19968: jis0208<<14 | 0x1D<<7 | 0x5A, - 37665 - 19968: jis0208<<14 | 0x5B<<7 | 0x1D, - 37666 - 19968: jis0208<<14 | 0x4E<<7 | 0x01, - 37667 - 19968: jis0208<<14 | 0x4E<<7 | 0x03, - 37668 - 19968: jis0212<<14 | 0x43<<7 | 0x3E, - 37669 - 19968: jis0208<<14 | 0x5B<<7 | 0x1C, - 37670 - 19968: jis0208<<14 | 0x15<<7 | 0x32, - 37671 - 19968: jis0212<<14 | 0x43<<7 | 0x40, - 37672 - 19968: jis0208<<14 | 0x28<<7 | 0x24, - 37673 - 19968: jis0212<<14 | 0x43<<7 | 0x41, - 37674 - 19968: jis0212<<14 | 0x43<<7 | 0x42, - 37675 - 19968: jis0208<<14 | 0x1B<<7 | 0x41, - 37676 - 19968: jis0208<<14 | 0x2E<<7 | 0x02, - 37678 - 19968: jis0208<<14 | 0x4D<<7 | 0x5D, - 37679 - 19968: jis0208<<14 | 0x19<<7 | 0x57, - 37682 - 19968: jis0208<<14 | 0x2E<<7 | 0x1E, - 37683 - 19968: jis0212<<14 | 0x43<<7 | 0x43, - 37684 - 19968: jis0212<<14 | 0x43<<7 | 0x44, - 37685 - 19968: jis0208<<14 | 0x4E<<7 | 0x05, - 37686 - 19968: jis0212<<14 | 0x43<<7 | 0x45, - 37687 - 19968: jis0212<<14 | 0x43<<7 | 0x46, - 37690 - 19968: jis0208<<14 | 0x4E<<7 | 0x04, - 37691 - 19968: jis0208<<14 | 0x4E<<7 | 0x06, - 37700 - 19968: jis0208<<14 | 0x4D<<7 | 0x5C, - 37703 - 19968: jis0212<<14 | 0x43<<7 | 0x47, - 37704 - 19968: jis0208<<14 | 0x58<<7 | 0x02, - 37705 - 19968: jis0212<<14 | 0x43<<7 | 0x49, - 37707 - 19968: jis0208<<14 | 0x25<<7 | 0x48, - 37709 - 19968: jis0208<<14 | 0x24<<7 | 0x34, - 37712 - 19968: jis0212<<14 | 0x43<<7 | 0x4A, - 37713 - 19968: jis0212<<14 | 0x43<<7 | 0x4B, - 37714 - 19968: jis0212<<14 | 0x43<<7 | 0x4C, - 37716 - 19968: jis0208<<14 | 0x23<<7 | 0x36, - 37717 - 19968: jis0212<<14 | 0x43<<7 | 0x4D, - 37718 - 19968: jis0208<<14 | 0x4E<<7 | 0x0B, - 37719 - 19968: jis0208<<14 | 0x5B<<7 | 0x25, - 37720 - 19968: jis0212<<14 | 0x43<<7 | 0x4F, - 37722 - 19968: jis0212<<14 | 0x43<<7 | 0x50, - 37723 - 19968: jis0208<<14 | 0x22<<7 | 0x22, - 37724 - 19968: jis0208<<14 | 0x4E<<7 | 0x07, - 37726 - 19968: jis0212<<14 | 0x43<<7 | 0x51, - 37728 - 19968: jis0208<<14 | 0x4E<<7 | 0x08, - 37732 - 19968: jis0212<<14 | 0x43<<7 | 0x52, - 37733 - 19968: jis0212<<14 | 0x43<<7 | 0x53, - 37735 - 19968: jis0212<<14 | 0x43<<7 | 0x54, - 37737 - 19968: jis0212<<14 | 0x43<<7 | 0x55, - 37738 - 19968: jis0212<<14 | 0x43<<7 | 0x56, - 37740 - 19968: jis0208<<14 | 0x16<<7 | 0x0C, - 37741 - 19968: jis0212<<14 | 0x43<<7 | 0x57, - 37742 - 19968: jis0208<<14 | 0x4E<<7 | 0x0A, - 37743 - 19968: jis0212<<14 | 0x43<<7 | 0x58, - 37744 - 19968: jis0208<<14 | 0x5B<<7 | 0x24, - 37745 - 19968: jis0212<<14 | 0x43<<7 | 0x5A, - 37747 - 19968: jis0212<<14 | 0x43<<7 | 0x5B, - 37748 - 19968: jis0212<<14 | 0x43<<7 | 0x5C, - 37749 - 19968: jis0208<<14 | 0x17<<7 | 0x0F, - 37750 - 19968: jis0212<<14 | 0x43<<7 | 0x5D, - 37754 - 19968: jis0212<<14 | 0x44<<7 | 0x00, - 37756 - 19968: jis0208<<14 | 0x4E<<7 | 0x09, - 37757 - 19968: jis0212<<14 | 0x44<<7 | 0x01, - 37758 - 19968: jis0208<<14 | 0x1D<<7 | 0x40, - 37759 - 19968: jis0212<<14 | 0x44<<7 | 0x02, - 37760 - 19968: jis0212<<14 | 0x44<<7 | 0x03, - 37761 - 19968: jis0212<<14 | 0x44<<7 | 0x04, - 37762 - 19968: jis0212<<14 | 0x44<<7 | 0x05, - 37768 - 19968: jis0212<<14 | 0x44<<7 | 0x06, - 37770 - 19968: jis0212<<14 | 0x44<<7 | 0x07, - 37771 - 19968: jis0212<<14 | 0x44<<7 | 0x08, - 37772 - 19968: jis0208<<14 | 0x12<<7 | 0x58, - 37773 - 19968: jis0212<<14 | 0x44<<7 | 0x09, - 37775 - 19968: jis0212<<14 | 0x44<<7 | 0x0A, - 37778 - 19968: jis0212<<14 | 0x44<<7 | 0x0B, - 37780 - 19968: jis0208<<14 | 0x4E<<7 | 0x0F, - 37781 - 19968: jis0212<<14 | 0x44<<7 | 0x0C, - 37782 - 19968: jis0208<<14 | 0x19<<7 | 0x1E, - 37783 - 19968: jis0208<<14 | 0x20<<7 | 0x58, - 37784 - 19968: jis0212<<14 | 0x44<<7 | 0x0D, - 37786 - 19968: jis0208<<14 | 0x23<<7 | 0x29, - 37787 - 19968: jis0212<<14 | 0x44<<7 | 0x0E, - 37790 - 19968: jis0212<<14 | 0x44<<7 | 0x0F, - 37793 - 19968: jis0212<<14 | 0x44<<7 | 0x10, - 37795 - 19968: jis0212<<14 | 0x44<<7 | 0x11, - 37796 - 19968: jis0208<<14 | 0x5B<<7 | 0x26, - 37798 - 19968: jis0212<<14 | 0x44<<7 | 0x13, - 37799 - 19968: jis0208<<14 | 0x12<<7 | 0x1A, - 37800 - 19968: jis0212<<14 | 0x44<<7 | 0x14, - 37801 - 19968: jis0212<<14 | 0x44<<7 | 0x1A, - 37803 - 19968: jis0212<<14 | 0x44<<7 | 0x15, - 37804 - 19968: jis0208<<14 | 0x4E<<7 | 0x0D, - 37805 - 19968: jis0208<<14 | 0x4E<<7 | 0x0E, - 37806 - 19968: jis0208<<14 | 0x23<<7 | 0x22, - 37808 - 19968: jis0208<<14 | 0x4E<<7 | 0x0C, - 37812 - 19968: jis0212<<14 | 0x44<<7 | 0x16, - 37813 - 19968: jis0212<<14 | 0x44<<7 | 0x17, - 37814 - 19968: jis0212<<14 | 0x44<<7 | 0x18, - 37817 - 19968: jis0208<<14 | 0x4E<<7 | 0x10, - 37818 - 19968: jis0212<<14 | 0x44<<7 | 0x19, - 37825 - 19968: jis0212<<14 | 0x44<<7 | 0x1B, - 37827 - 19968: jis0208<<14 | 0x4E<<7 | 0x16, - 37828 - 19968: jis0212<<14 | 0x44<<7 | 0x1C, - 37829 - 19968: jis0212<<14 | 0x44<<7 | 0x1D, - 37830 - 19968: jis0208<<14 | 0x5B<<7 | 0x27, - 37831 - 19968: jis0212<<14 | 0x44<<7 | 0x1F, - 37832 - 19968: jis0208<<14 | 0x4E<<7 | 0x19, - 37833 - 19968: jis0212<<14 | 0x44<<7 | 0x20, - 37834 - 19968: jis0212<<14 | 0x44<<7 | 0x21, - 37835 - 19968: jis0212<<14 | 0x44<<7 | 0x22, - 37836 - 19968: jis0212<<14 | 0x44<<7 | 0x23, - 37837 - 19968: jis0212<<14 | 0x44<<7 | 0x24, - 37840 - 19968: jis0208<<14 | 0x4E<<7 | 0x18, - 37841 - 19968: jis0208<<14 | 0x24<<7 | 0x0C, - 37843 - 19968: jis0212<<14 | 0x44<<7 | 0x25, - 37846 - 19968: jis0208<<14 | 0x4E<<7 | 0x11, - 37847 - 19968: jis0208<<14 | 0x4E<<7 | 0x12, - 37848 - 19968: jis0208<<14 | 0x4E<<7 | 0x15, - 37849 - 19968: jis0212<<14 | 0x44<<7 | 0x26, - 37852 - 19968: jis0212<<14 | 0x44<<7 | 0x27, - 37853 - 19968: jis0208<<14 | 0x4E<<7 | 0x17, - 37854 - 19968: jis0208<<14 | 0x5B<<7 | 0x28, - 37855 - 19968: jis0212<<14 | 0x44<<7 | 0x29, - 37857 - 19968: jis0208<<14 | 0x15<<7 | 0x1F, - 37858 - 19968: jis0212<<14 | 0x44<<7 | 0x2A, - 37860 - 19968: jis0208<<14 | 0x4E<<7 | 0x1A, - 37861 - 19968: jis0208<<14 | 0x4E<<7 | 0x14, - 37862 - 19968: jis0212<<14 | 0x44<<7 | 0x2B, - 37863 - 19968: jis0212<<14 | 0x44<<7 | 0x2C, - 37864 - 19968: jis0208<<14 | 0x4E<<7 | 0x13, - 37879 - 19968: jis0212<<14 | 0x44<<7 | 0x2E, - 37880 - 19968: jis0208<<14 | 0x5B<<7 | 0x29, - 37881 - 19968: jis0212<<14 | 0x44<<7 | 0x2D, - 37882 - 19968: jis0212<<14 | 0x44<<7 | 0x30, - 37883 - 19968: jis0212<<14 | 0x44<<7 | 0x31, - 37885 - 19968: jis0212<<14 | 0x44<<7 | 0x32, - 37889 - 19968: jis0212<<14 | 0x44<<7 | 0x33, - 37890 - 19968: jis0212<<14 | 0x44<<7 | 0x34, - 37891 - 19968: jis0208<<14 | 0x4E<<7 | 0x1E, - 37892 - 19968: jis0212<<14 | 0x44<<7 | 0x35, - 37895 - 19968: jis0208<<14 | 0x4E<<7 | 0x1F, - 37896 - 19968: jis0212<<14 | 0x44<<7 | 0x36, - 37897 - 19968: jis0212<<14 | 0x44<<7 | 0x37, - 37901 - 19968: jis0212<<14 | 0x44<<7 | 0x38, - 37902 - 19968: jis0212<<14 | 0x44<<7 | 0x39, - 37903 - 19968: jis0212<<14 | 0x44<<7 | 0x3A, - 37904 - 19968: jis0208<<14 | 0x4E<<7 | 0x20, - 37907 - 19968: jis0208<<14 | 0x4E<<7 | 0x1D, - 37908 - 19968: jis0208<<14 | 0x4E<<7 | 0x1C, - 37909 - 19968: jis0212<<14 | 0x44<<7 | 0x3B, - 37910 - 19968: jis0212<<14 | 0x44<<7 | 0x3C, - 37911 - 19968: jis0212<<14 | 0x44<<7 | 0x3D, - 37912 - 19968: jis0208<<14 | 0x1D<<7 | 0x41, - 37913 - 19968: jis0208<<14 | 0x25<<7 | 0x09, - 37914 - 19968: jis0208<<14 | 0x4E<<7 | 0x1B, - 37919 - 19968: jis0212<<14 | 0x44<<7 | 0x3E, - 37921 - 19968: jis0208<<14 | 0x4E<<7 | 0x24, - 37931 - 19968: jis0208<<14 | 0x4E<<7 | 0x22, - 37934 - 19968: jis0212<<14 | 0x44<<7 | 0x3F, - 37935 - 19968: jis0212<<14 | 0x44<<7 | 0x40, - 37937 - 19968: jis0208<<14 | 0x5B<<7 | 0x2A, - 37938 - 19968: jis0212<<14 | 0x44<<7 | 0x42, - 37939 - 19968: jis0212<<14 | 0x44<<7 | 0x43, - 37940 - 19968: jis0212<<14 | 0x44<<7 | 0x44, - 37941 - 19968: jis0208<<14 | 0x4E<<7 | 0x23, - 37942 - 19968: jis0208<<14 | 0x4E<<7 | 0x21, - 37944 - 19968: jis0208<<14 | 0x21<<7 | 0x57, - 37946 - 19968: jis0208<<14 | 0x4E<<7 | 0x25, - 37947 - 19968: jis0212<<14 | 0x44<<7 | 0x45, - 37949 - 19968: jis0212<<14 | 0x44<<7 | 0x47, - 37951 - 19968: jis0212<<14 | 0x44<<7 | 0x46, - 37953 - 19968: jis0208<<14 | 0x4E<<7 | 0x26, - 37955 - 19968: jis0212<<14 | 0x44<<7 | 0x48, - 37956 - 19968: jis0208<<14 | 0x4E<<7 | 0x28, - 37957 - 19968: jis0208<<14 | 0x5B<<7 | 0x2B, - 37960 - 19968: jis0208<<14 | 0x5B<<7 | 0x2C, - 37962 - 19968: jis0212<<14 | 0x44<<7 | 0x4B, - 37964 - 19968: jis0212<<14 | 0x44<<7 | 0x4C, - 37969 - 19968: jis0208<<14 | 0x13<<7 | 0x34, - 37970 - 19968: jis0208<<14 | 0x4E<<7 | 0x27, - 37971 - 19968: jis0208<<14 | 0x2B<<7 | 0x59, - 37973 - 19968: jis0212<<14 | 0x44<<7 | 0x4D, - 37977 - 19968: jis0212<<14 | 0x44<<7 | 0x4E, - 37978 - 19968: jis0208<<14 | 0x4E<<7 | 0x33, - 37979 - 19968: jis0208<<14 | 0x4E<<7 | 0x29, - 37980 - 19968: jis0212<<14 | 0x44<<7 | 0x4F, - 37982 - 19968: jis0208<<14 | 0x4E<<7 | 0x2C, - 37983 - 19968: jis0212<<14 | 0x44<<7 | 0x50, - 37984 - 19968: jis0208<<14 | 0x4E<<7 | 0x2A, - 37985 - 19968: jis0212<<14 | 0x44<<7 | 0x51, - 37986 - 19968: jis0208<<14 | 0x4E<<7 | 0x2B, - 37987 - 19968: jis0212<<14 | 0x44<<7 | 0x52, - 37992 - 19968: jis0212<<14 | 0x44<<7 | 0x53, - 37994 - 19968: jis0208<<14 | 0x4E<<7 | 0x2D, - 37995 - 19968: jis0212<<14 | 0x44<<7 | 0x54, - 37997 - 19968: jis0212<<14 | 0x44<<7 | 0x55, - 37998 - 19968: jis0212<<14 | 0x44<<7 | 0x56, - 37999 - 19968: jis0212<<14 | 0x44<<7 | 0x57, - 38000 - 19968: jis0208<<14 | 0x4E<<7 | 0x2F, - 38001 - 19968: jis0212<<14 | 0x44<<7 | 0x58, - 38002 - 19968: jis0212<<14 | 0x44<<7 | 0x59, - 38005 - 19968: jis0208<<14 | 0x4E<<7 | 0x30, - 38007 - 19968: jis0208<<14 | 0x4E<<7 | 0x31, - 38012 - 19968: jis0208<<14 | 0x4E<<7 | 0x34, - 38013 - 19968: jis0208<<14 | 0x4E<<7 | 0x32, - 38014 - 19968: jis0208<<14 | 0x4E<<7 | 0x35, - 38015 - 19968: jis0208<<14 | 0x4E<<7 | 0x37, - 38017 - 19968: jis0208<<14 | 0x4E<<7 | 0x36, - 38019 - 19968: jis0212<<14 | 0x44<<7 | 0x5B, - 38020 - 19968: jis0212<<14 | 0x44<<7 | 0x5A, - 38263 - 19968: jis0208<<14 | 0x23<<7 | 0x18, - 38264 - 19968: jis0212<<14 | 0x44<<7 | 0x5C, - 38265 - 19968: jis0212<<14 | 0x44<<7 | 0x5D, - 38270 - 19968: jis0212<<14 | 0x45<<7 | 0x00, - 38272 - 19968: jis0208<<14 | 0x2B<<7 | 0x46, - 38274 - 19968: jis0208<<14 | 0x4E<<7 | 0x38, - 38275 - 19968: jis0208<<14 | 0x20<<7 | 0x0D, - 38276 - 19968: jis0212<<14 | 0x45<<7 | 0x01, - 38279 - 19968: jis0208<<14 | 0x4E<<7 | 0x39, - 38280 - 19968: jis0212<<14 | 0x45<<7 | 0x02, - 38281 - 19968: jis0208<<14 | 0x29<<7 | 0x23, - 38282 - 19968: jis0208<<14 | 0x4E<<7 | 0x3A, - 38283 - 19968: jis0208<<14 | 0x12<<7 | 0x0A, - 38284 - 19968: jis0212<<14 | 0x45<<7 | 0x03, - 38285 - 19968: jis0212<<14 | 0x45<<7 | 0x04, - 38286 - 19968: jis0212<<14 | 0x45<<7 | 0x05, - 38287 - 19968: jis0208<<14 | 0x10<<7 | 0x1B, - 38289 - 19968: jis0208<<14 | 0x13<<7 | 0x36, - 38290 - 19968: jis0208<<14 | 0x5B<<7 | 0x2D, - 38291 - 19968: jis0208<<14 | 0x13<<7 | 0x35, - 38292 - 19968: jis0208<<14 | 0x4E<<7 | 0x3B, - 38294 - 19968: jis0208<<14 | 0x4E<<7 | 0x3C, - 38296 - 19968: jis0208<<14 | 0x4E<<7 | 0x3D, - 38297 - 19968: jis0208<<14 | 0x4E<<7 | 0x3E, - 38301 - 19968: jis0212<<14 | 0x45<<7 | 0x06, - 38302 - 19968: jis0212<<14 | 0x45<<7 | 0x07, - 38303 - 19968: jis0212<<14 | 0x45<<7 | 0x08, - 38304 - 19968: jis0208<<14 | 0x4E<<7 | 0x3F, - 38305 - 19968: jis0212<<14 | 0x45<<7 | 0x09, - 38306 - 19968: jis0208<<14 | 0x13<<7 | 0x37, - 38307 - 19968: jis0208<<14 | 0x12<<7 | 0x34, - 38308 - 19968: jis0208<<14 | 0x18<<7 | 0x3D, - 38309 - 19968: jis0208<<14 | 0x27<<7 | 0x15, - 38310 - 19968: jis0212<<14 | 0x45<<7 | 0x0A, - 38311 - 19968: jis0208<<14 | 0x4E<<7 | 0x41, - 38312 - 19968: jis0208<<14 | 0x4E<<7 | 0x40, - 38313 - 19968: jis0212<<14 | 0x45<<7 | 0x0B, - 38315 - 19968: jis0212<<14 | 0x45<<7 | 0x0C, - 38316 - 19968: jis0212<<14 | 0x45<<7 | 0x0D, - 38317 - 19968: jis0208<<14 | 0x4E<<7 | 0x42, - 38322 - 19968: jis0208<<14 | 0x10<<7 | 0x3B, - 38324 - 19968: jis0212<<14 | 0x45<<7 | 0x0E, - 38326 - 19968: jis0212<<14 | 0x45<<7 | 0x0F, - 38329 - 19968: jis0208<<14 | 0x4E<<7 | 0x45, - 38330 - 19968: jis0212<<14 | 0x45<<7 | 0x10, - 38331 - 19968: jis0208<<14 | 0x4E<<7 | 0x44, - 38332 - 19968: jis0208<<14 | 0x4E<<7 | 0x43, - 38333 - 19968: jis0212<<14 | 0x45<<7 | 0x11, - 38334 - 19968: jis0208<<14 | 0x4E<<7 | 0x46, - 38335 - 19968: jis0212<<14 | 0x45<<7 | 0x12, - 38339 - 19968: jis0208<<14 | 0x4E<<7 | 0x49, - 38342 - 19968: jis0212<<14 | 0x45<<7 | 0x13, - 38343 - 19968: jis0208<<14 | 0x0F<<7 | 0x26, - 38344 - 19968: jis0212<<14 | 0x45<<7 | 0x14, - 38345 - 19968: jis0212<<14 | 0x45<<7 | 0x15, - 38346 - 19968: jis0208<<14 | 0x4E<<7 | 0x47, - 38347 - 19968: jis0212<<14 | 0x45<<7 | 0x16, - 38348 - 19968: jis0208<<14 | 0x4E<<7 | 0x4B, - 38349 - 19968: jis0208<<14 | 0x4E<<7 | 0x4A, - 38352 - 19968: jis0212<<14 | 0x45<<7 | 0x17, - 38353 - 19968: jis0212<<14 | 0x45<<7 | 0x18, - 38354 - 19968: jis0212<<14 | 0x45<<7 | 0x19, - 38355 - 19968: jis0212<<14 | 0x45<<7 | 0x1A, - 38356 - 19968: jis0208<<14 | 0x4E<<7 | 0x4D, - 38357 - 19968: jis0208<<14 | 0x4E<<7 | 0x4C, - 38358 - 19968: jis0208<<14 | 0x4E<<7 | 0x4E, - 38360 - 19968: jis0208<<14 | 0x25<<7 | 0x0D, - 38361 - 19968: jis0212<<14 | 0x45<<7 | 0x1B, - 38362 - 19968: jis0212<<14 | 0x45<<7 | 0x1C, - 38364 - 19968: jis0208<<14 | 0x4E<<7 | 0x4F, - 38365 - 19968: jis0212<<14 | 0x45<<7 | 0x1D, - 38366 - 19968: jis0212<<14 | 0x45<<7 | 0x1E, - 38367 - 19968: jis0212<<14 | 0x45<<7 | 0x1F, - 38368 - 19968: jis0212<<14 | 0x45<<7 | 0x20, - 38369 - 19968: jis0208<<14 | 0x4E<<7 | 0x50, - 38370 - 19968: jis0208<<14 | 0x4E<<7 | 0x52, - 38372 - 19968: jis0212<<14 | 0x45<<7 | 0x21, - 38373 - 19968: jis0208<<14 | 0x4E<<7 | 0x51, - 38374 - 19968: jis0212<<14 | 0x45<<7 | 0x22, - 38428 - 19968: jis0208<<14 | 0x28<<7 | 0x4B, - 38429 - 19968: jis0212<<14 | 0x45<<7 | 0x23, - 38430 - 19968: jis0212<<14 | 0x45<<7 | 0x24, - 38433 - 19968: jis0208<<14 | 0x4E<<7 | 0x53, - 38434 - 19968: jis0212<<14 | 0x45<<7 | 0x25, - 38436 - 19968: jis0212<<14 | 0x45<<7 | 0x26, - 38437 - 19968: jis0212<<14 | 0x45<<7 | 0x27, - 38438 - 19968: jis0212<<14 | 0x45<<7 | 0x28, - 38440 - 19968: jis0208<<14 | 0x4E<<7 | 0x54, - 38442 - 19968: jis0208<<14 | 0x19<<7 | 0x44, - 38444 - 19968: jis0212<<14 | 0x45<<7 | 0x29, - 38446 - 19968: jis0208<<14 | 0x4E<<7 | 0x55, - 38447 - 19968: jis0208<<14 | 0x4E<<7 | 0x56, - 38449 - 19968: jis0212<<14 | 0x45<<7 | 0x2A, - 38450 - 19968: jis0208<<14 | 0x2A<<7 | 0x28, - 38451 - 19968: jis0212<<14 | 0x45<<7 | 0x2B, - 38455 - 19968: jis0212<<14 | 0x45<<7 | 0x2C, - 38456 - 19968: jis0212<<14 | 0x45<<7 | 0x2D, - 38457 - 19968: jis0212<<14 | 0x45<<7 | 0x2E, - 38458 - 19968: jis0212<<14 | 0x45<<7 | 0x2F, - 38459 - 19968: jis0208<<14 | 0x20<<7 | 0x2A, - 38460 - 19968: jis0212<<14 | 0x45<<7 | 0x30, - 38461 - 19968: jis0212<<14 | 0x45<<7 | 0x31, - 38463 - 19968: jis0208<<14 | 0x0F<<7 | 0x03, - 38464 - 19968: jis0208<<14 | 0x21<<7 | 0x2A, - 38465 - 19968: jis0212<<14 | 0x45<<7 | 0x32, - 38466 - 19968: jis0208<<14 | 0x4E<<7 | 0x57, - 38468 - 19968: jis0208<<14 | 0x28<<7 | 0x4C, - 38475 - 19968: jis0208<<14 | 0x4E<<7 | 0x5A, - 38476 - 19968: jis0208<<14 | 0x4E<<7 | 0x58, - 38477 - 19968: jis0208<<14 | 0x18<<7 | 0x3E, - 38479 - 19968: jis0208<<14 | 0x4E<<7 | 0x59, - 38480 - 19968: jis0208<<14 | 0x17<<7 | 0x21, - 38482 - 19968: jis0212<<14 | 0x45<<7 | 0x33, - 38484 - 19968: jis0212<<14 | 0x45<<7 | 0x34, - 38486 - 19968: jis0212<<14 | 0x45<<7 | 0x35, - 38487 - 19968: jis0212<<14 | 0x45<<7 | 0x36, - 38488 - 19968: jis0212<<14 | 0x45<<7 | 0x37, - 38491 - 19968: jis0208<<14 | 0x29<<7 | 0x24, - 38492 - 19968: jis0208<<14 | 0x4E<<7 | 0x5C, - 38493 - 19968: jis0208<<14 | 0x4F<<7 | 0x00, - 38494 - 19968: jis0208<<14 | 0x4E<<7 | 0x5D, - 38495 - 19968: jis0208<<14 | 0x4F<<7 | 0x01, - 38497 - 19968: jis0212<<14 | 0x45<<7 | 0x38, - 38498 - 19968: jis0208<<14 | 0x10<<7 | 0x00, - 38499 - 19968: jis0208<<14 | 0x1E<<7 | 0x37, - 38500 - 19968: jis0208<<14 | 0x1C<<7 | 0x5B, - 38501 - 19968: jis0208<<14 | 0x13<<7 | 0x38, - 38502 - 19968: jis0208<<14 | 0x4F<<7 | 0x02, - 38506 - 19968: jis0208<<14 | 0x26<<7 | 0x45, - 38508 - 19968: jis0208<<14 | 0x4F<<7 | 0x04, - 38510 - 19968: jis0212<<14 | 0x45<<7 | 0x39, - 38512 - 19968: jis0208<<14 | 0x10<<7 | 0x01, - 38514 - 19968: jis0208<<14 | 0x4F<<7 | 0x03, - 38515 - 19968: jis0208<<14 | 0x23<<7 | 0x23, - 38516 - 19968: jis0212<<14 | 0x45<<7 | 0x3A, - 38517 - 19968: jis0208<<14 | 0x2D<<7 | 0x2C, - 38518 - 19968: jis0208<<14 | 0x25<<7 | 0x0A, - 38519 - 19968: jis0208<<14 | 0x4E<<7 | 0x5B, - 38520 - 19968: jis0208<<14 | 0x2D<<7 | 0x05, - 38522 - 19968: jis0208<<14 | 0x17<<7 | 0x10, - 38523 - 19968: jis0212<<14 | 0x45<<7 | 0x3B, - 38524 - 19968: jis0212<<14 | 0x45<<7 | 0x3C, - 38525 - 19968: jis0208<<14 | 0x2C<<7 | 0x3A, - 38526 - 19968: jis0212<<14 | 0x45<<7 | 0x3D, - 38527 - 19968: jis0212<<14 | 0x45<<7 | 0x3E, - 38529 - 19968: jis0212<<14 | 0x45<<7 | 0x3F, - 38530 - 19968: jis0212<<14 | 0x45<<7 | 0x40, - 38531 - 19968: jis0212<<14 | 0x45<<7 | 0x41, - 38532 - 19968: jis0212<<14 | 0x45<<7 | 0x42, - 38533 - 19968: jis0208<<14 | 0x15<<7 | 0x58, - 38534 - 19968: jis0208<<14 | 0x2D<<7 | 0x13, - 38536 - 19968: jis0208<<14 | 0x16<<7 | 0x07, - 38537 - 19968: jis0212<<14 | 0x45<<7 | 0x43, - 38538 - 19968: jis0208<<14 | 0x21<<7 | 0x41, - 38539 - 19968: jis0208<<14 | 0x46<<7 | 0x00, - 38541 - 19968: jis0208<<14 | 0x4F<<7 | 0x05, - 38542 - 19968: jis0208<<14 | 0x12<<7 | 0x0B, - 38543 - 19968: jis0208<<14 | 0x1E<<7 | 0x4E, - 38545 - 19968: jis0212<<14 | 0x45<<7 | 0x44, - 38548 - 19968: jis0208<<14 | 0x12<<7 | 0x35, - 38549 - 19968: jis0208<<14 | 0x4F<<7 | 0x07, - 38550 - 19968: jis0212<<14 | 0x45<<7 | 0x45, - 38551 - 19968: jis0208<<14 | 0x4F<<7 | 0x08, - 38552 - 19968: jis0208<<14 | 0x4F<<7 | 0x06, - 38553 - 19968: jis0208<<14 | 0x16<<7 | 0x43, - 38554 - 19968: jis0212<<14 | 0x45<<7 | 0x46, - 38555 - 19968: jis0208<<14 | 0x19<<7 | 0x3C, - 38556 - 19968: jis0208<<14 | 0x1D<<7 | 0x42, - 38557 - 19968: jis0208<<14 | 0x5B<<7 | 0x30, - 38559 - 19968: jis0212<<14 | 0x45<<7 | 0x48, - 38560 - 19968: jis0208<<14 | 0x10<<7 | 0x02, - 38563 - 19968: jis0208<<14 | 0x2D<<7 | 0x38, - 38564 - 19968: jis0212<<14 | 0x45<<7 | 0x49, - 38565 - 19968: jis0212<<14 | 0x45<<7 | 0x4A, - 38566 - 19968: jis0212<<14 | 0x45<<7 | 0x4B, - 38567 - 19968: jis0208<<14 | 0x4F<<7 | 0x0A, - 38568 - 19968: jis0208<<14 | 0x4D<<7 | 0x0D, - 38569 - 19968: jis0212<<14 | 0x45<<7 | 0x4C, - 38570 - 19968: jis0208<<14 | 0x4F<<7 | 0x09, - 38574 - 19968: jis0212<<14 | 0x45<<7 | 0x4D, - 38575 - 19968: jis0208<<14 | 0x5B<<7 | 0x31, - 38576 - 19968: jis0208<<14 | 0x4F<<7 | 0x0D, - 38577 - 19968: jis0208<<14 | 0x4F<<7 | 0x0B, - 38578 - 19968: jis0208<<14 | 0x4F<<7 | 0x0C, - 38579 - 19968: jis0212<<14 | 0x45<<7 | 0x4F, - 38580 - 19968: jis0208<<14 | 0x4F<<7 | 0x0E, - 38582 - 19968: jis0208<<14 | 0x4F<<7 | 0x0F, - 38583 - 19968: jis0208<<14 | 0x2D<<7 | 0x4B, - 38584 - 19968: jis0208<<14 | 0x4F<<7 | 0x10, - 38585 - 19968: jis0208<<14 | 0x4F<<7 | 0x11, - 38586 - 19968: jis0212<<14 | 0x45<<7 | 0x50, - 38587 - 19968: jis0208<<14 | 0x1F<<7 | 0x28, - 38588 - 19968: jis0208<<14 | 0x27<<7 | 0x1A, - 38592 - 19968: jis0208<<14 | 0x1E<<7 | 0x5C, - 38593 - 19968: jis0208<<14 | 0x13<<7 | 0x46, - 38596 - 19968: jis0208<<14 | 0x2C<<7 | 0x19, - 38597 - 19968: jis0208<<14 | 0x11<<7 | 0x4C, - 38598 - 19968: jis0208<<14 | 0x1C<<7 | 0x17, - 38599 - 19968: jis0208<<14 | 0x17<<7 | 0x3A, - 38601 - 19968: jis0208<<14 | 0x4F<<7 | 0x14, - 38602 - 19968: jis0212<<14 | 0x45<<7 | 0x51, - 38603 - 19968: jis0208<<14 | 0x4F<<7 | 0x13, - 38604 - 19968: jis0208<<14 | 0x1A<<7 | 0x52, - 38605 - 19968: jis0208<<14 | 0x4F<<7 | 0x15, - 38606 - 19968: jis0208<<14 | 0x4F<<7 | 0x12, - 38609 - 19968: jis0208<<14 | 0x1A<<7 | 0x07, - 38610 - 19968: jis0212<<14 | 0x45<<7 | 0x52, - 38613 - 19968: jis0208<<14 | 0x4F<<7 | 0x19, - 38614 - 19968: jis0208<<14 | 0x49<<7 | 0x0C, - 38616 - 19968: jis0212<<14 | 0x45<<7 | 0x54, - 38617 - 19968: jis0208<<14 | 0x31<<7 | 0x35, - 38618 - 19968: jis0212<<14 | 0x45<<7 | 0x55, - 38619 - 19968: jis0208<<14 | 0x1E<<7 | 0x56, - 38620 - 19968: jis0208<<14 | 0x4F<<7 | 0x17, - 38621 - 19968: jis0212<<14 | 0x45<<7 | 0x56, - 38622 - 19968: jis0212<<14 | 0x45<<7 | 0x57, - 38623 - 19968: jis0212<<14 | 0x45<<7 | 0x58, - 38626 - 19968: jis0208<<14 | 0x2D<<7 | 0x04, - 38627 - 19968: jis0208<<14 | 0x25<<7 | 0x50, - 38632 - 19968: jis0208<<14 | 0x10<<7 | 0x0A, - 38633 - 19968: jis0212<<14 | 0x45<<7 | 0x59, - 38634 - 19968: jis0208<<14 | 0x1F<<7 | 0x42, - 38635 - 19968: jis0208<<14 | 0x1B<<7 | 0x15, - 38639 - 19968: jis0212<<14 | 0x45<<7 | 0x5A, - 38640 - 19968: jis0208<<14 | 0x29<<7 | 0x16, - 38641 - 19968: jis0212<<14 | 0x45<<7 | 0x5B, - 38642 - 19968: jis0208<<14 | 0x10<<7 | 0x1F, - 38646 - 19968: jis0208<<14 | 0x2D<<7 | 0x4C, - 38647 - 19968: jis0208<<14 | 0x2C<<7 | 0x4A, - 38649 - 19968: jis0208<<14 | 0x4F<<7 | 0x1A, - 38650 - 19968: jis0212<<14 | 0x45<<7 | 0x5C, - 38651 - 19968: jis0208<<14 | 0x24<<7 | 0x24, - 38656 - 19968: jis0208<<14 | 0x1B<<7 | 0x5A, - 38658 - 19968: jis0212<<14 | 0x45<<7 | 0x5D, - 38659 - 19968: jis0212<<14 | 0x46<<7 | 0x00, - 38660 - 19968: jis0208<<14 | 0x4F<<7 | 0x1B, - 38661 - 19968: jis0212<<14 | 0x46<<7 | 0x01, - 38662 - 19968: jis0208<<14 | 0x4F<<7 | 0x1C, - 38663 - 19968: jis0208<<14 | 0x1E<<7 | 0x2B, - 38664 - 19968: jis0208<<14 | 0x4F<<7 | 0x1D, - 38665 - 19968: jis0212<<14 | 0x46<<7 | 0x02, - 38666 - 19968: jis0208<<14 | 0x2D<<7 | 0x4D, - 38669 - 19968: jis0208<<14 | 0x4F<<7 | 0x18, - 38670 - 19968: jis0208<<14 | 0x4F<<7 | 0x1F, - 38671 - 19968: jis0208<<14 | 0x4F<<7 | 0x21, - 38673 - 19968: jis0208<<14 | 0x4F<<7 | 0x20, - 38675 - 19968: jis0208<<14 | 0x4F<<7 | 0x1E, - 38678 - 19968: jis0208<<14 | 0x4F<<7 | 0x22, - 38681 - 19968: jis0208<<14 | 0x4F<<7 | 0x23, - 38682 - 19968: jis0212<<14 | 0x46<<7 | 0x03, - 38683 - 19968: jis0212<<14 | 0x46<<7 | 0x04, - 38684 - 19968: jis0208<<14 | 0x20<<7 | 0x59, - 38685 - 19968: jis0212<<14 | 0x46<<7 | 0x05, - 38686 - 19968: jis0208<<14 | 0x11<<7 | 0x41, - 38689 - 19968: jis0212<<14 | 0x46<<7 | 0x06, - 38690 - 19968: jis0212<<14 | 0x46<<7 | 0x07, - 38691 - 19968: jis0212<<14 | 0x46<<7 | 0x08, - 38692 - 19968: jis0208<<14 | 0x4F<<7 | 0x24, - 38695 - 19968: jis0208<<14 | 0x2B<<7 | 0x17, - 38696 - 19968: jis0212<<14 | 0x46<<7 | 0x09, - 38698 - 19968: jis0208<<14 | 0x4F<<7 | 0x25, - 38704 - 19968: jis0208<<14 | 0x4F<<7 | 0x26, - 38705 - 19968: jis0212<<14 | 0x46<<7 | 0x0A, - 38706 - 19968: jis0208<<14 | 0x2E<<7 | 0x09, - 38707 - 19968: jis0208<<14 | 0x5B<<7 | 0x32, - 38712 - 19968: jis0208<<14 | 0x3A<<7 | 0x10, - 38713 - 19968: jis0208<<14 | 0x4F<<7 | 0x27, - 38715 - 19968: jis0208<<14 | 0x5B<<7 | 0x33, - 38717 - 19968: jis0208<<14 | 0x4F<<7 | 0x28, - 38718 - 19968: jis0208<<14 | 0x4F<<7 | 0x29, - 38721 - 19968: jis0212<<14 | 0x46<<7 | 0x0C, - 38722 - 19968: jis0208<<14 | 0x4F<<7 | 0x2D, - 38723 - 19968: jis0208<<14 | 0x5B<<7 | 0x34, - 38724 - 19968: jis0208<<14 | 0x4F<<7 | 0x2A, - 38726 - 19968: jis0208<<14 | 0x4F<<7 | 0x2B, - 38728 - 19968: jis0208<<14 | 0x4F<<7 | 0x2C, - 38729 - 19968: jis0208<<14 | 0x4F<<7 | 0x2E, - 38730 - 19968: jis0212<<14 | 0x46<<7 | 0x0E, - 38733 - 19968: jis0208<<14 | 0x5B<<7 | 0x35, - 38734 - 19968: jis0212<<14 | 0x46<<7 | 0x0F, - 38735 - 19968: jis0208<<14 | 0x5B<<7 | 0x36, - 38737 - 19968: jis0208<<14 | 0x5B<<7 | 0x37, - 38738 - 19968: jis0208<<14 | 0x1F<<7 | 0x23, - 38741 - 19968: jis0208<<14 | 0x5B<<7 | 0x38, - 38742 - 19968: jis0208<<14 | 0x2B<<7 | 0x56, - 38743 - 19968: jis0212<<14 | 0x46<<7 | 0x12, - 38744 - 19968: jis0212<<14 | 0x46<<7 | 0x13, - 38745 - 19968: jis0208<<14 | 0x1F<<7 | 0x24, - 38746 - 19968: jis0212<<14 | 0x46<<7 | 0x14, - 38747 - 19968: jis0212<<14 | 0x46<<7 | 0x15, - 38748 - 19968: jis0208<<14 | 0x4F<<7 | 0x2F, - 38750 - 19968: jis0208<<14 | 0x27<<7 | 0x52, - 38752 - 19968: jis0208<<14 | 0x4F<<7 | 0x30, - 38753 - 19968: jis0208<<14 | 0x52<<7 | 0x32, - 38754 - 19968: jis0208<<14 | 0x2B<<7 | 0x2B, - 38755 - 19968: jis0212<<14 | 0x46<<7 | 0x16, - 38756 - 19968: jis0208<<14 | 0x4F<<7 | 0x31, - 38758 - 19968: jis0208<<14 | 0x4F<<7 | 0x32, - 38759 - 19968: jis0212<<14 | 0x46<<7 | 0x17, - 38760 - 19968: jis0208<<14 | 0x4F<<7 | 0x33, - 38761 - 19968: jis0208<<14 | 0x12<<7 | 0x36, - 38762 - 19968: jis0212<<14 | 0x46<<7 | 0x18, - 38763 - 19968: jis0208<<14 | 0x4F<<7 | 0x35, - 38765 - 19968: jis0208<<14 | 0x1E<<7 | 0x38, - 38766 - 19968: jis0212<<14 | 0x46<<7 | 0x19, - 38769 - 19968: jis0208<<14 | 0x4F<<7 | 0x36, - 38771 - 19968: jis0212<<14 | 0x46<<7 | 0x1A, - 38772 - 19968: jis0208<<14 | 0x16<<7 | 0x03, - 38774 - 19968: jis0212<<14 | 0x46<<7 | 0x1B, - 38775 - 19968: jis0212<<14 | 0x46<<7 | 0x1C, - 38776 - 19968: jis0212<<14 | 0x46<<7 | 0x1D, - 38777 - 19968: jis0208<<14 | 0x4F<<7 | 0x37, - 38778 - 19968: jis0208<<14 | 0x4F<<7 | 0x3B, - 38779 - 19968: jis0212<<14 | 0x46<<7 | 0x1E, - 38780 - 19968: jis0208<<14 | 0x4F<<7 | 0x39, - 38781 - 19968: jis0212<<14 | 0x46<<7 | 0x1F, - 38783 - 19968: jis0212<<14 | 0x46<<7 | 0x20, - 38784 - 19968: jis0212<<14 | 0x46<<7 | 0x21, - 38785 - 19968: jis0208<<14 | 0x4F<<7 | 0x3A, - 38788 - 19968: jis0208<<14 | 0x12<<7 | 0x52, - 38789 - 19968: jis0208<<14 | 0x4F<<7 | 0x38, - 38790 - 19968: jis0208<<14 | 0x4F<<7 | 0x3C, - 38793 - 19968: jis0212<<14 | 0x46<<7 | 0x22, - 38795 - 19968: jis0208<<14 | 0x4F<<7 | 0x3D, - 38797 - 19968: jis0208<<14 | 0x0F<<7 | 0x27, - 38799 - 19968: jis0208<<14 | 0x4F<<7 | 0x3E, - 38800 - 19968: jis0208<<14 | 0x4F<<7 | 0x3F, - 38805 - 19968: jis0212<<14 | 0x46<<7 | 0x23, - 38806 - 19968: jis0212<<14 | 0x46<<7 | 0x24, - 38807 - 19968: jis0212<<14 | 0x46<<7 | 0x25, - 38808 - 19968: jis0208<<14 | 0x1D<<7 | 0x43, - 38809 - 19968: jis0212<<14 | 0x46<<7 | 0x26, - 38810 - 19968: jis0212<<14 | 0x46<<7 | 0x27, - 38812 - 19968: jis0208<<14 | 0x4F<<7 | 0x40, - 38814 - 19968: jis0212<<14 | 0x46<<7 | 0x28, - 38815 - 19968: jis0212<<14 | 0x46<<7 | 0x29, - 38816 - 19968: jis0208<<14 | 0x14<<7 | 0x26, - 38818 - 19968: jis0212<<14 | 0x46<<7 | 0x2A, - 38819 - 19968: jis0208<<14 | 0x4F<<7 | 0x43, - 38822 - 19968: jis0208<<14 | 0x4F<<7 | 0x42, - 38824 - 19968: jis0208<<14 | 0x4F<<7 | 0x41, - 38827 - 19968: jis0208<<14 | 0x4A<<7 | 0x50, - 38828 - 19968: jis0212<<14 | 0x46<<7 | 0x2B, - 38829 - 19968: jis0208<<14 | 0x29<<7 | 0x3B, - 38830 - 19968: jis0212<<14 | 0x46<<7 | 0x2C, - 38833 - 19968: jis0212<<14 | 0x46<<7 | 0x2D, - 38834 - 19968: jis0212<<14 | 0x46<<7 | 0x2E, - 38835 - 19968: jis0208<<14 | 0x4F<<7 | 0x44, - 38836 - 19968: jis0208<<14 | 0x4F<<7 | 0x45, - 38837 - 19968: jis0212<<14 | 0x46<<7 | 0x2F, - 38838 - 19968: jis0212<<14 | 0x46<<7 | 0x30, - 38840 - 19968: jis0212<<14 | 0x46<<7 | 0x31, - 38841 - 19968: jis0212<<14 | 0x46<<7 | 0x32, - 38842 - 19968: jis0212<<14 | 0x46<<7 | 0x33, - 38844 - 19968: jis0212<<14 | 0x46<<7 | 0x34, - 38846 - 19968: jis0212<<14 | 0x46<<7 | 0x35, - 38847 - 19968: jis0212<<14 | 0x46<<7 | 0x36, - 38849 - 19968: jis0212<<14 | 0x46<<7 | 0x37, - 38851 - 19968: jis0208<<14 | 0x4F<<7 | 0x46, - 38852 - 19968: jis0212<<14 | 0x46<<7 | 0x38, - 38853 - 19968: jis0212<<14 | 0x46<<7 | 0x39, - 38854 - 19968: jis0208<<14 | 0x4F<<7 | 0x47, - 38855 - 19968: jis0212<<14 | 0x46<<7 | 0x3A, - 38856 - 19968: jis0208<<14 | 0x4F<<7 | 0x48, - 38857 - 19968: jis0212<<14 | 0x46<<7 | 0x3B, - 38858 - 19968: jis0212<<14 | 0x46<<7 | 0x3C, - 38859 - 19968: jis0208<<14 | 0x4F<<7 | 0x49, - 38860 - 19968: jis0212<<14 | 0x46<<7 | 0x3D, - 38861 - 19968: jis0212<<14 | 0x46<<7 | 0x3E, - 38862 - 19968: jis0212<<14 | 0x46<<7 | 0x3F, - 38864 - 19968: jis0212<<14 | 0x46<<7 | 0x40, - 38865 - 19968: jis0212<<14 | 0x46<<7 | 0x41, - 38867 - 19968: jis0208<<14 | 0x13<<7 | 0x39, - 38868 - 19968: jis0212<<14 | 0x46<<7 | 0x42, - 38871 - 19968: jis0212<<14 | 0x46<<7 | 0x43, - 38872 - 19968: jis0212<<14 | 0x46<<7 | 0x44, - 38873 - 19968: jis0212<<14 | 0x46<<7 | 0x45, - 38875 - 19968: jis0212<<14 | 0x46<<7 | 0x49, - 38876 - 19968: jis0208<<14 | 0x4F<<7 | 0x4A, - 38877 - 19968: jis0212<<14 | 0x46<<7 | 0x46, - 38878 - 19968: jis0212<<14 | 0x46<<7 | 0x47, - 38880 - 19968: jis0212<<14 | 0x46<<7 | 0x48, - 38881 - 19968: jis0212<<14 | 0x46<<7 | 0x4A, - 38884 - 19968: jis0212<<14 | 0x46<<7 | 0x4B, - 38893 - 19968: jis0208<<14 | 0x4F<<7 | 0x4B, - 38894 - 19968: jis0208<<14 | 0x26<<7 | 0x02, - 38895 - 19968: jis0212<<14 | 0x46<<7 | 0x4C, - 38897 - 19968: jis0212<<14 | 0x46<<7 | 0x4D, - 38898 - 19968: jis0208<<14 | 0x4F<<7 | 0x4D, - 38899 - 19968: jis0208<<14 | 0x11<<7 | 0x1A, - 38900 - 19968: jis0212<<14 | 0x46<<7 | 0x4E, - 38901 - 19968: jis0208<<14 | 0x4F<<7 | 0x50, - 38902 - 19968: jis0208<<14 | 0x4F<<7 | 0x4F, - 38903 - 19968: jis0212<<14 | 0x46<<7 | 0x4F, - 38904 - 19968: jis0212<<14 | 0x46<<7 | 0x50, - 38906 - 19968: jis0212<<14 | 0x46<<7 | 0x51, - 38907 - 19968: jis0208<<14 | 0x10<<7 | 0x03, - 38911 - 19968: jis0208<<14 | 0x15<<7 | 0x20, - 38913 - 19968: jis0208<<14 | 0x29<<7 | 0x26, - 38914 - 19968: jis0208<<14 | 0x23<<7 | 0x19, - 38915 - 19968: jis0208<<14 | 0x19<<7 | 0x01, - 38917 - 19968: jis0208<<14 | 0x18<<7 | 0x3F, - 38918 - 19968: jis0208<<14 | 0x1C<<7 | 0x46, - 38919 - 19968: jis0212<<14 | 0x46<<7 | 0x52, - 38920 - 19968: jis0208<<14 | 0x1E<<7 | 0x3B, - 38922 - 19968: jis0212<<14 | 0x46<<7 | 0x53, - 38924 - 19968: jis0208<<14 | 0x4F<<7 | 0x52, - 38925 - 19968: jis0212<<14 | 0x46<<7 | 0x55, - 38926 - 19968: jis0212<<14 | 0x46<<7 | 0x56, - 38927 - 19968: jis0208<<14 | 0x4F<<7 | 0x51, - 38928 - 19968: jis0208<<14 | 0x2C<<7 | 0x21, - 38929 - 19968: jis0208<<14 | 0x13<<7 | 0x47, - 38930 - 19968: jis0208<<14 | 0x27<<7 | 0x31, - 38931 - 19968: jis0208<<14 | 0x25<<7 | 0x3B, - 38932 - 19968: jis0212<<14 | 0x46<<7 | 0x57, - 38934 - 19968: jis0212<<14 | 0x46<<7 | 0x58, - 38935 - 19968: jis0208<<14 | 0x1E<<7 | 0x5B, - 38936 - 19968: jis0208<<14 | 0x2D<<7 | 0x2D, - 38937 - 19968: jis0212<<14 | 0x46<<7 | 0x54, - 38938 - 19968: jis0208<<14 | 0x16<<7 | 0x3A, - 38940 - 19968: jis0212<<14 | 0x46<<7 | 0x59, - 38942 - 19968: jis0212<<14 | 0x46<<7 | 0x5A, - 38944 - 19968: jis0212<<14 | 0x46<<7 | 0x5B, - 38945 - 19968: jis0208<<14 | 0x4F<<7 | 0x55, - 38947 - 19968: jis0212<<14 | 0x46<<7 | 0x5C, - 38948 - 19968: jis0208<<14 | 0x4F<<7 | 0x54, - 38949 - 19968: jis0212<<14 | 0x47<<7 | 0x07, - 38950 - 19968: jis0212<<14 | 0x46<<7 | 0x5D, - 38955 - 19968: jis0212<<14 | 0x47<<7 | 0x00, - 38956 - 19968: jis0208<<14 | 0x2A<<7 | 0x2A, - 38957 - 19968: jis0208<<14 | 0x25<<7 | 0x0B, - 38958 - 19968: jis0212<<14 | 0x47<<7 | 0x01, - 38959 - 19968: jis0212<<14 | 0x47<<7 | 0x02, - 38960 - 19968: jis0212<<14 | 0x47<<7 | 0x03, - 38962 - 19968: jis0212<<14 | 0x47<<7 | 0x04, - 38963 - 19968: jis0212<<14 | 0x47<<7 | 0x05, - 38964 - 19968: jis0208<<14 | 0x10<<7 | 0x2F, - 38965 - 19968: jis0212<<14 | 0x47<<7 | 0x06, - 38967 - 19968: jis0208<<14 | 0x4F<<7 | 0x56, - 38968 - 19968: jis0208<<14 | 0x4F<<7 | 0x53, - 38971 - 19968: jis0208<<14 | 0x28<<7 | 0x30, - 38972 - 19968: jis0208<<14 | 0x2C<<7 | 0x49, - 38973 - 19968: jis0208<<14 | 0x4F<<7 | 0x57, - 38974 - 19968: jis0212<<14 | 0x47<<7 | 0x08, - 38980 - 19968: jis0212<<14 | 0x47<<7 | 0x09, - 38982 - 19968: jis0208<<14 | 0x4F<<7 | 0x58, - 38983 - 19968: jis0212<<14 | 0x47<<7 | 0x0A, - 38986 - 19968: jis0212<<14 | 0x47<<7 | 0x0B, - 38987 - 19968: jis0208<<14 | 0x4F<<7 | 0x5A, - 38988 - 19968: jis0208<<14 | 0x21<<7 | 0x49, - 38989 - 19968: jis0208<<14 | 0x12<<7 | 0x3A, - 38990 - 19968: jis0208<<14 | 0x12<<7 | 0x3B, - 38991 - 19968: jis0208<<14 | 0x4F<<7 | 0x59, - 38993 - 19968: jis0212<<14 | 0x47<<7 | 0x0C, - 38994 - 19968: jis0212<<14 | 0x47<<7 | 0x0D, - 38995 - 19968: jis0212<<14 | 0x47<<7 | 0x0E, - 38996 - 19968: jis0208<<14 | 0x13<<7 | 0x48, - 38997 - 19968: jis0208<<14 | 0x17<<7 | 0x11, - 38998 - 19968: jis0212<<14 | 0x47<<7 | 0x0F, - 38999 - 19968: jis0208<<14 | 0x5B<<7 | 0x39, - 39000 - 19968: jis0208<<14 | 0x13<<7 | 0x49, - 39001 - 19968: jis0212<<14 | 0x47<<7 | 0x11, - 39002 - 19968: jis0212<<14 | 0x47<<7 | 0x12, - 39003 - 19968: jis0208<<14 | 0x24<<7 | 0x1E, - 39006 - 19968: jis0208<<14 | 0x2D<<7 | 0x3F, - 39010 - 19968: jis0212<<14 | 0x47<<7 | 0x13, - 39011 - 19968: jis0212<<14 | 0x47<<7 | 0x14, - 39013 - 19968: jis0208<<14 | 0x5B<<7 | 0x3A, - 39014 - 19968: jis0212<<14 | 0x47<<7 | 0x16, - 39015 - 19968: jis0208<<14 | 0x17<<7 | 0x3B, - 39018 - 19968: jis0212<<14 | 0x47<<7 | 0x17, - 39019 - 19968: jis0208<<14 | 0x4F<<7 | 0x5B, - 39020 - 19968: jis0212<<14 | 0x47<<7 | 0x18, - 39023 - 19968: jis0208<<14 | 0x4F<<7 | 0x5C, - 39024 - 19968: jis0208<<14 | 0x4F<<7 | 0x5D, - 39025 - 19968: jis0208<<14 | 0x50<<7 | 0x00, - 39027 - 19968: jis0208<<14 | 0x50<<7 | 0x02, - 39028 - 19968: jis0208<<14 | 0x50<<7 | 0x01, - 39080 - 19968: jis0208<<14 | 0x28<<7 | 0x56, - 39082 - 19968: jis0208<<14 | 0x50<<7 | 0x03, - 39083 - 19968: jis0212<<14 | 0x47<<7 | 0x19, - 39085 - 19968: jis0212<<14 | 0x47<<7 | 0x1A, - 39086 - 19968: jis0212<<14 | 0x47<<7 | 0x1B, - 39087 - 19968: jis0208<<14 | 0x50<<7 | 0x04, - 39088 - 19968: jis0212<<14 | 0x47<<7 | 0x1C, - 39089 - 19968: jis0208<<14 | 0x50<<7 | 0x05, - 39092 - 19968: jis0212<<14 | 0x47<<7 | 0x1D, - 39094 - 19968: jis0208<<14 | 0x50<<7 | 0x06, - 39095 - 19968: jis0212<<14 | 0x47<<7 | 0x1E, - 39096 - 19968: jis0212<<14 | 0x47<<7 | 0x1F, - 39098 - 19968: jis0212<<14 | 0x47<<7 | 0x20, - 39099 - 19968: jis0212<<14 | 0x47<<7 | 0x21, - 39103 - 19968: jis0212<<14 | 0x47<<7 | 0x22, - 39106 - 19968: jis0212<<14 | 0x47<<7 | 0x23, - 39107 - 19968: jis0208<<14 | 0x50<<7 | 0x08, - 39108 - 19968: jis0208<<14 | 0x50<<7 | 0x07, - 39109 - 19968: jis0212<<14 | 0x47<<7 | 0x24, - 39110 - 19968: jis0208<<14 | 0x50<<7 | 0x09, - 39112 - 19968: jis0212<<14 | 0x47<<7 | 0x25, - 39116 - 19968: jis0212<<14 | 0x47<<7 | 0x26, - 39131 - 19968: jis0208<<14 | 0x27<<7 | 0x53, - 39132 - 19968: jis0208<<14 | 0x45<<7 | 0x2B, - 39135 - 19968: jis0208<<14 | 0x1E<<7 | 0x08, - 39137 - 19968: jis0212<<14 | 0x47<<7 | 0x27, - 39138 - 19968: jis0208<<14 | 0x14<<7 | 0x11, - 39139 - 19968: jis0212<<14 | 0x47<<7 | 0x28, - 39141 - 19968: jis0212<<14 | 0x47<<7 | 0x29, - 39142 - 19968: jis0212<<14 | 0x47<<7 | 0x2A, - 39143 - 19968: jis0212<<14 | 0x47<<7 | 0x2B, - 39145 - 19968: jis0208<<14 | 0x50<<7 | 0x0A, - 39146 - 19968: jis0212<<14 | 0x47<<7 | 0x2C, - 39147 - 19968: jis0208<<14 | 0x50<<7 | 0x0B, - 39149 - 19968: jis0208<<14 | 0x31<<7 | 0x0B, - 39150 - 19968: jis0208<<14 | 0x3C<<7 | 0x1A, - 39151 - 19968: jis0208<<14 | 0x27<<7 | 0x32, - 39154 - 19968: jis0208<<14 | 0x0F<<7 | 0x5A, - 39155 - 19968: jis0212<<14 | 0x47<<7 | 0x2D, - 39156 - 19968: jis0208<<14 | 0x0F<<7 | 0x1A, - 39158 - 19968: jis0212<<14 | 0x47<<7 | 0x2E, - 39164 - 19968: jis0208<<14 | 0x1A<<7 | 0x53, - 39165 - 19968: jis0208<<14 | 0x2A<<7 | 0x0F, - 39166 - 19968: jis0208<<14 | 0x1D<<7 | 0x5D, - 39170 - 19968: jis0212<<14 | 0x47<<7 | 0x2F, - 39171 - 19968: jis0208<<14 | 0x50<<7 | 0x0C, - 39173 - 19968: jis0208<<14 | 0x2B<<7 | 0x3E, - 39175 - 19968: jis0212<<14 | 0x47<<7 | 0x30, - 39176 - 19968: jis0212<<14 | 0x47<<7 | 0x31, - 39177 - 19968: jis0208<<14 | 0x50<<7 | 0x0D, - 39178 - 19968: jis0208<<14 | 0x2C<<7 | 0x3B, - 39180 - 19968: jis0208<<14 | 0x10<<7 | 0x21, - 39184 - 19968: jis0208<<14 | 0x1A<<7 | 0x20, - 39185 - 19968: jis0212<<14 | 0x47<<7 | 0x32, - 39186 - 19968: jis0208<<14 | 0x50<<7 | 0x0E, - 39187 - 19968: jis0208<<14 | 0x11<<7 | 0x4D, - 39188 - 19968: jis0208<<14 | 0x50<<7 | 0x0F, - 39189 - 19968: jis0212<<14 | 0x47<<7 | 0x33, - 39190 - 19968: jis0212<<14 | 0x47<<7 | 0x34, - 39191 - 19968: jis0212<<14 | 0x47<<7 | 0x35, - 39192 - 19968: jis0208<<14 | 0x50<<7 | 0x10, - 39194 - 19968: jis0212<<14 | 0x47<<7 | 0x36, - 39195 - 19968: jis0212<<14 | 0x47<<7 | 0x37, - 39196 - 19968: jis0212<<14 | 0x47<<7 | 0x38, - 39197 - 19968: jis0208<<14 | 0x50<<7 | 0x12, - 39198 - 19968: jis0208<<14 | 0x50<<7 | 0x13, - 39199 - 19968: jis0212<<14 | 0x47<<7 | 0x39, - 39200 - 19968: jis0208<<14 | 0x50<<7 | 0x15, - 39201 - 19968: jis0208<<14 | 0x50<<7 | 0x11, - 39202 - 19968: jis0212<<14 | 0x47<<7 | 0x3A, - 39204 - 19968: jis0208<<14 | 0x50<<7 | 0x14, - 39206 - 19968: jis0212<<14 | 0x47<<7 | 0x3B, - 39207 - 19968: jis0208<<14 | 0x5B<<7 | 0x3D, - 39208 - 19968: jis0208<<14 | 0x13<<7 | 0x3A, - 39211 - 19968: jis0212<<14 | 0x47<<7 | 0x3D, - 39212 - 19968: jis0208<<14 | 0x50<<7 | 0x16, - 39214 - 19968: jis0208<<14 | 0x50<<7 | 0x17, - 39217 - 19968: jis0212<<14 | 0x47<<7 | 0x3E, - 39218 - 19968: jis0212<<14 | 0x47<<7 | 0x3F, - 39219 - 19968: jis0212<<14 | 0x47<<7 | 0x40, - 39220 - 19968: jis0212<<14 | 0x47<<7 | 0x41, - 39221 - 19968: jis0212<<14 | 0x47<<7 | 0x42, - 39225 - 19968: jis0212<<14 | 0x47<<7 | 0x43, - 39226 - 19968: jis0212<<14 | 0x47<<7 | 0x44, - 39227 - 19968: jis0212<<14 | 0x47<<7 | 0x45, - 39228 - 19968: jis0212<<14 | 0x47<<7 | 0x46, - 39229 - 19968: jis0208<<14 | 0x50<<7 | 0x18, - 39230 - 19968: jis0208<<14 | 0x50<<7 | 0x19, - 39232 - 19968: jis0212<<14 | 0x47<<7 | 0x47, - 39233 - 19968: jis0212<<14 | 0x47<<7 | 0x48, - 39234 - 19968: jis0208<<14 | 0x50<<7 | 0x1A, - 39237 - 19968: jis0208<<14 | 0x50<<7 | 0x1C, - 39238 - 19968: jis0212<<14 | 0x47<<7 | 0x49, - 39239 - 19968: jis0212<<14 | 0x47<<7 | 0x4A, - 39240 - 19968: jis0212<<14 | 0x47<<7 | 0x4B, - 39241 - 19968: jis0208<<14 | 0x50<<7 | 0x1B, - 39243 - 19968: jis0208<<14 | 0x50<<7 | 0x1E, - 39244 - 19968: jis0208<<14 | 0x50<<7 | 0x21, - 39245 - 19968: jis0212<<14 | 0x47<<7 | 0x4C, - 39246 - 19968: jis0212<<14 | 0x47<<7 | 0x4D, - 39248 - 19968: jis0208<<14 | 0x50<<7 | 0x1D, - 39249 - 19968: jis0208<<14 | 0x50<<7 | 0x1F, - 39250 - 19968: jis0208<<14 | 0x50<<7 | 0x20, - 39252 - 19968: jis0212<<14 | 0x47<<7 | 0x4E, - 39253 - 19968: jis0208<<14 | 0x50<<7 | 0x22, - 39255 - 19968: jis0208<<14 | 0x15<<7 | 0x21, - 39256 - 19968: jis0212<<14 | 0x47<<7 | 0x4F, - 39257 - 19968: jis0212<<14 | 0x47<<7 | 0x50, - 39259 - 19968: jis0212<<14 | 0x47<<7 | 0x51, - 39260 - 19968: jis0212<<14 | 0x47<<7 | 0x52, - 39262 - 19968: jis0212<<14 | 0x47<<7 | 0x53, - 39263 - 19968: jis0212<<14 | 0x47<<7 | 0x54, - 39264 - 19968: jis0212<<14 | 0x47<<7 | 0x55, - 39318 - 19968: jis0208<<14 | 0x1B<<7 | 0x52, - 39319 - 19968: jis0208<<14 | 0x50<<7 | 0x23, - 39320 - 19968: jis0208<<14 | 0x50<<7 | 0x24, - 39321 - 19968: jis0208<<14 | 0x18<<7 | 0x40, - 39323 - 19968: jis0212<<14 | 0x47<<7 | 0x56, - 39325 - 19968: jis0212<<14 | 0x47<<7 | 0x57, - 39326 - 19968: jis0208<<14 | 0x5B<<7 | 0x3F, - 39327 - 19968: jis0212<<14 | 0x47<<7 | 0x58, - 39333 - 19968: jis0208<<14 | 0x50<<7 | 0x25, - 39334 - 19968: jis0212<<14 | 0x47<<7 | 0x59, - 39336 - 19968: jis0208<<14 | 0x12<<7 | 0x1D, - 39340 - 19968: jis0208<<14 | 0x26<<7 | 0x2E, - 39341 - 19968: jis0208<<14 | 0x50<<7 | 0x26, - 39342 - 19968: jis0208<<14 | 0x50<<7 | 0x27, - 39344 - 19968: jis0212<<14 | 0x47<<7 | 0x5A, - 39345 - 19968: jis0212<<14 | 0x47<<7 | 0x5B, - 39346 - 19968: jis0212<<14 | 0x47<<7 | 0x5C, - 39347 - 19968: jis0208<<14 | 0x22<<7 | 0x39, - 39348 - 19968: jis0208<<14 | 0x25<<7 | 0x4A, - 39349 - 19968: jis0212<<14 | 0x47<<7 | 0x5D, - 39353 - 19968: jis0212<<14 | 0x48<<7 | 0x00, - 39354 - 19968: jis0212<<14 | 0x48<<7 | 0x01, - 39356 - 19968: jis0208<<14 | 0x50<<7 | 0x28, - 39357 - 19968: jis0212<<14 | 0x48<<7 | 0x02, - 39359 - 19968: jis0212<<14 | 0x48<<7 | 0x03, - 39361 - 19968: jis0208<<14 | 0x26<<7 | 0x5C, - 39363 - 19968: jis0212<<14 | 0x48<<7 | 0x04, - 39364 - 19968: jis0208<<14 | 0x21<<7 | 0x2B, - 39365 - 19968: jis0208<<14 | 0x10<<7 | 0x37, - 39366 - 19968: jis0208<<14 | 0x15<<7 | 0x4D, - 39368 - 19968: jis0208<<14 | 0x15<<7 | 0x4E, - 39369 - 19968: jis0212<<14 | 0x48<<7 | 0x05, - 39376 - 19968: jis0208<<14 | 0x22<<7 | 0x52, - 39377 - 19968: jis0208<<14 | 0x50<<7 | 0x2D, - 39378 - 19968: jis0208<<14 | 0x15<<7 | 0x4F, - 39379 - 19968: jis0212<<14 | 0x48<<7 | 0x06, - 39380 - 19968: jis0212<<14 | 0x48<<7 | 0x07, - 39381 - 19968: jis0208<<14 | 0x11<<7 | 0x4E, - 39384 - 19968: jis0208<<14 | 0x50<<7 | 0x2C, - 39385 - 19968: jis0212<<14 | 0x48<<7 | 0x08, - 39386 - 19968: jis0212<<14 | 0x48<<7 | 0x09, - 39387 - 19968: jis0208<<14 | 0x50<<7 | 0x2A, - 39388 - 19968: jis0212<<14 | 0x48<<7 | 0x0A, - 39389 - 19968: jis0208<<14 | 0x50<<7 | 0x2B, - 39390 - 19968: jis0212<<14 | 0x48<<7 | 0x0B, - 39391 - 19968: jis0208<<14 | 0x50<<7 | 0x29, - 39394 - 19968: jis0208<<14 | 0x50<<7 | 0x37, - 39399 - 19968: jis0212<<14 | 0x48<<7 | 0x0C, - 39402 - 19968: jis0212<<14 | 0x48<<7 | 0x0D, - 39403 - 19968: jis0212<<14 | 0x48<<7 | 0x0E, - 39404 - 19968: jis0212<<14 | 0x48<<7 | 0x0F, - 39405 - 19968: jis0208<<14 | 0x50<<7 | 0x2E, - 39406 - 19968: jis0208<<14 | 0x50<<7 | 0x2F, - 39408 - 19968: jis0212<<14 | 0x48<<7 | 0x10, - 39409 - 19968: jis0208<<14 | 0x50<<7 | 0x30, - 39410 - 19968: jis0208<<14 | 0x50<<7 | 0x31, - 39412 - 19968: jis0212<<14 | 0x48<<7 | 0x11, - 39413 - 19968: jis0212<<14 | 0x48<<7 | 0x12, - 39416 - 19968: jis0208<<14 | 0x50<<7 | 0x33, - 39417 - 19968: jis0212<<14 | 0x48<<7 | 0x13, - 39419 - 19968: jis0208<<14 | 0x50<<7 | 0x32, - 39421 - 19968: jis0212<<14 | 0x48<<7 | 0x14, - 39422 - 19968: jis0212<<14 | 0x48<<7 | 0x15, - 39423 - 19968: jis0208<<14 | 0x1C<<7 | 0x38, - 39425 - 19968: jis0208<<14 | 0x50<<7 | 0x34, - 39426 - 19968: jis0212<<14 | 0x48<<7 | 0x16, - 39427 - 19968: jis0212<<14 | 0x48<<7 | 0x17, - 39428 - 19968: jis0212<<14 | 0x48<<7 | 0x18, - 39429 - 19968: jis0208<<14 | 0x50<<7 | 0x36, - 39435 - 19968: jis0212<<14 | 0x48<<7 | 0x19, - 39436 - 19968: jis0212<<14 | 0x48<<7 | 0x1A, - 39438 - 19968: jis0208<<14 | 0x14<<7 | 0x12, - 39439 - 19968: jis0208<<14 | 0x50<<7 | 0x35, - 39440 - 19968: jis0212<<14 | 0x48<<7 | 0x1B, - 39441 - 19968: jis0212<<14 | 0x48<<7 | 0x1C, - 39442 - 19968: jis0208<<14 | 0x20<<7 | 0x5A, - 39443 - 19968: jis0208<<14 | 0x17<<7 | 0x12, - 39446 - 19968: jis0212<<14 | 0x48<<7 | 0x1D, - 39449 - 19968: jis0208<<14 | 0x50<<7 | 0x38, - 39454 - 19968: jis0212<<14 | 0x48<<7 | 0x1E, - 39456 - 19968: jis0212<<14 | 0x48<<7 | 0x1F, - 39458 - 19968: jis0212<<14 | 0x48<<7 | 0x20, - 39459 - 19968: jis0212<<14 | 0x48<<7 | 0x21, - 39460 - 19968: jis0212<<14 | 0x48<<7 | 0x22, - 39463 - 19968: jis0212<<14 | 0x48<<7 | 0x23, - 39464 - 19968: jis0208<<14 | 0x21<<7 | 0x2C, - 39467 - 19968: jis0208<<14 | 0x50<<7 | 0x39, - 39469 - 19968: jis0212<<14 | 0x48<<7 | 0x24, - 39470 - 19968: jis0212<<14 | 0x48<<7 | 0x25, - 39472 - 19968: jis0208<<14 | 0x25<<7 | 0x0C, - 39475 - 19968: jis0212<<14 | 0x48<<7 | 0x26, - 39477 - 19968: jis0212<<14 | 0x48<<7 | 0x27, - 39478 - 19968: jis0212<<14 | 0x48<<7 | 0x28, - 39479 - 19968: jis0208<<14 | 0x50<<7 | 0x3A, - 39480 - 19968: jis0212<<14 | 0x48<<7 | 0x29, - 39486 - 19968: jis0208<<14 | 0x50<<7 | 0x3F, - 39488 - 19968: jis0208<<14 | 0x50<<7 | 0x3D, - 39489 - 19968: jis0212<<14 | 0x48<<7 | 0x2B, - 39490 - 19968: jis0208<<14 | 0x50<<7 | 0x3C, - 39491 - 19968: jis0208<<14 | 0x50<<7 | 0x3E, - 39492 - 19968: jis0212<<14 | 0x48<<7 | 0x2C, - 39493 - 19968: jis0208<<14 | 0x50<<7 | 0x3B, - 39495 - 19968: jis0212<<14 | 0x48<<7 | 0x2A, - 39498 - 19968: jis0212<<14 | 0x48<<7 | 0x2D, - 39499 - 19968: jis0212<<14 | 0x48<<7 | 0x2E, - 39500 - 19968: jis0212<<14 | 0x48<<7 | 0x2F, - 39501 - 19968: jis0208<<14 | 0x50<<7 | 0x41, - 39502 - 19968: jis0208<<14 | 0x5B<<7 | 0x40, - 39505 - 19968: jis0212<<14 | 0x48<<7 | 0x31, - 39508 - 19968: jis0212<<14 | 0x48<<7 | 0x32, - 39509 - 19968: jis0208<<14 | 0x50<<7 | 0x40, - 39510 - 19968: jis0212<<14 | 0x48<<7 | 0x33, - 39511 - 19968: jis0208<<14 | 0x50<<7 | 0x43, - 39514 - 19968: jis0208<<14 | 0x15<<7 | 0x22, - 39515 - 19968: jis0208<<14 | 0x50<<7 | 0x42, - 39517 - 19968: jis0212<<14 | 0x48<<7 | 0x34, - 39519 - 19968: jis0208<<14 | 0x50<<7 | 0x44, - 39522 - 19968: jis0208<<14 | 0x50<<7 | 0x45, - 39524 - 19968: jis0208<<14 | 0x50<<7 | 0x47, - 39525 - 19968: jis0208<<14 | 0x50<<7 | 0x46, - 39529 - 19968: jis0208<<14 | 0x50<<7 | 0x48, - 39530 - 19968: jis0208<<14 | 0x50<<7 | 0x4A, - 39531 - 19968: jis0208<<14 | 0x50<<7 | 0x49, - 39592 - 19968: jis0208<<14 | 0x18<<7 | 0x5B, - 39594 - 19968: jis0212<<14 | 0x48<<7 | 0x35, - 39596 - 19968: jis0212<<14 | 0x48<<7 | 0x36, - 39597 - 19968: jis0208<<14 | 0x50<<7 | 0x4B, - 39598 - 19968: jis0212<<14 | 0x48<<7 | 0x37, - 39599 - 19968: jis0212<<14 | 0x48<<7 | 0x38, - 39600 - 19968: jis0208<<14 | 0x50<<7 | 0x4C, - 39602 - 19968: jis0212<<14 | 0x48<<7 | 0x39, - 39604 - 19968: jis0212<<14 | 0x48<<7 | 0x3A, - 39605 - 19968: jis0212<<14 | 0x48<<7 | 0x3B, - 39606 - 19968: jis0212<<14 | 0x48<<7 | 0x3C, - 39608 - 19968: jis0208<<14 | 0x12<<7 | 0x1B, - 39609 - 19968: jis0212<<14 | 0x48<<7 | 0x3D, - 39611 - 19968: jis0212<<14 | 0x48<<7 | 0x3E, - 39612 - 19968: jis0208<<14 | 0x50<<7 | 0x4D, - 39614 - 19968: jis0212<<14 | 0x48<<7 | 0x3F, - 39615 - 19968: jis0212<<14 | 0x48<<7 | 0x40, - 39616 - 19968: jis0208<<14 | 0x50<<7 | 0x4E, - 39617 - 19968: jis0212<<14 | 0x48<<7 | 0x41, - 39619 - 19968: jis0212<<14 | 0x48<<7 | 0x42, - 39620 - 19968: jis0208<<14 | 0x1E<<7 | 0x50, - 39622 - 19968: jis0212<<14 | 0x48<<7 | 0x43, - 39624 - 19968: jis0212<<14 | 0x48<<7 | 0x44, - 39630 - 19968: jis0212<<14 | 0x48<<7 | 0x45, - 39631 - 19968: jis0208<<14 | 0x50<<7 | 0x4F, - 39632 - 19968: jis0212<<14 | 0x48<<7 | 0x46, - 39633 - 19968: jis0208<<14 | 0x50<<7 | 0x50, - 39634 - 19968: jis0212<<14 | 0x48<<7 | 0x47, - 39635 - 19968: jis0208<<14 | 0x50<<7 | 0x51, - 39636 - 19968: jis0208<<14 | 0x50<<7 | 0x52, - 39637 - 19968: jis0212<<14 | 0x48<<7 | 0x48, - 39638 - 19968: jis0212<<14 | 0x48<<7 | 0x49, - 39639 - 19968: jis0212<<14 | 0x48<<7 | 0x4A, - 39640 - 19968: jis0208<<14 | 0x18<<7 | 0x41, - 39641 - 19968: jis0208<<14 | 0x5B<<7 | 0x41, - 39643 - 19968: jis0212<<14 | 0x48<<7 | 0x4B, - 39644 - 19968: jis0208<<14 | 0x5B<<7 | 0x42, - 39646 - 19968: jis0208<<14 | 0x50<<7 | 0x53, - 39647 - 19968: jis0208<<14 | 0x50<<7 | 0x54, - 39648 - 19968: jis0212<<14 | 0x48<<7 | 0x4D, - 39650 - 19968: jis0208<<14 | 0x50<<7 | 0x55, - 39651 - 19968: jis0208<<14 | 0x50<<7 | 0x56, - 39652 - 19968: jis0212<<14 | 0x48<<7 | 0x4E, - 39653 - 19968: jis0212<<14 | 0x48<<7 | 0x4F, - 39654 - 19968: jis0208<<14 | 0x50<<7 | 0x57, - 39655 - 19968: jis0212<<14 | 0x48<<7 | 0x50, - 39657 - 19968: jis0212<<14 | 0x48<<7 | 0x51, - 39658 - 19968: jis0208<<14 | 0x27<<7 | 0x10, - 39659 - 19968: jis0208<<14 | 0x50<<7 | 0x59, - 39660 - 19968: jis0212<<14 | 0x48<<7 | 0x52, - 39661 - 19968: jis0208<<14 | 0x28<<7 | 0x05, - 39662 - 19968: jis0208<<14 | 0x50<<7 | 0x5A, - 39663 - 19968: jis0208<<14 | 0x50<<7 | 0x58, - 39665 - 19968: jis0208<<14 | 0x50<<7 | 0x5C, - 39666 - 19968: jis0212<<14 | 0x48<<7 | 0x53, - 39667 - 19968: jis0212<<14 | 0x48<<7 | 0x54, - 39668 - 19968: jis0208<<14 | 0x50<<7 | 0x5B, - 39669 - 19968: jis0212<<14 | 0x48<<7 | 0x55, - 39671 - 19968: jis0208<<14 | 0x50<<7 | 0x5D, - 39673 - 19968: jis0212<<14 | 0x48<<7 | 0x56, - 39674 - 19968: jis0212<<14 | 0x48<<7 | 0x57, - 39675 - 19968: jis0208<<14 | 0x51<<7 | 0x00, - 39677 - 19968: jis0212<<14 | 0x48<<7 | 0x58, - 39679 - 19968: jis0212<<14 | 0x48<<7 | 0x59, - 39680 - 19968: jis0212<<14 | 0x48<<7 | 0x5A, - 39681 - 19968: jis0212<<14 | 0x48<<7 | 0x5B, - 39682 - 19968: jis0212<<14 | 0x48<<7 | 0x5C, - 39683 - 19968: jis0212<<14 | 0x48<<7 | 0x5D, - 39684 - 19968: jis0212<<14 | 0x49<<7 | 0x00, - 39685 - 19968: jis0212<<14 | 0x49<<7 | 0x01, - 39686 - 19968: jis0208<<14 | 0x51<<7 | 0x01, - 39688 - 19968: jis0212<<14 | 0x49<<7 | 0x02, - 39689 - 19968: jis0212<<14 | 0x49<<7 | 0x03, - 39691 - 19968: jis0212<<14 | 0x49<<7 | 0x04, - 39692 - 19968: jis0212<<14 | 0x49<<7 | 0x05, - 39693 - 19968: jis0212<<14 | 0x49<<7 | 0x06, - 39694 - 19968: jis0212<<14 | 0x49<<7 | 0x07, - 39696 - 19968: jis0212<<14 | 0x49<<7 | 0x08, - 39698 - 19968: jis0212<<14 | 0x49<<7 | 0x09, - 39702 - 19968: jis0212<<14 | 0x49<<7 | 0x0A, - 39704 - 19968: jis0208<<14 | 0x51<<7 | 0x02, - 39705 - 19968: jis0212<<14 | 0x49<<7 | 0x0B, - 39706 - 19968: jis0208<<14 | 0x51<<7 | 0x03, - 39707 - 19968: jis0212<<14 | 0x49<<7 | 0x0C, - 39708 - 19968: jis0212<<14 | 0x49<<7 | 0x0D, - 39711 - 19968: jis0208<<14 | 0x51<<7 | 0x04, - 39712 - 19968: jis0212<<14 | 0x49<<7 | 0x0E, - 39714 - 19968: jis0208<<14 | 0x51<<7 | 0x05, - 39715 - 19968: jis0208<<14 | 0x51<<7 | 0x06, - 39717 - 19968: jis0208<<14 | 0x51<<7 | 0x07, - 39718 - 19968: jis0212<<14 | 0x49<<7 | 0x0F, - 39719 - 19968: jis0208<<14 | 0x51<<7 | 0x08, - 39720 - 19968: jis0208<<14 | 0x51<<7 | 0x09, - 39721 - 19968: jis0208<<14 | 0x51<<7 | 0x0A, - 39722 - 19968: jis0208<<14 | 0x51<<7 | 0x0B, - 39723 - 19968: jis0212<<14 | 0x49<<7 | 0x10, - 39725 - 19968: jis0212<<14 | 0x49<<7 | 0x11, - 39726 - 19968: jis0208<<14 | 0x51<<7 | 0x0C, - 39727 - 19968: jis0208<<14 | 0x51<<7 | 0x0D, - 39729 - 19968: jis0208<<14 | 0x3C<<7 | 0x14, - 39730 - 19968: jis0208<<14 | 0x51<<7 | 0x0E, - 39731 - 19968: jis0212<<14 | 0x49<<7 | 0x12, - 39732 - 19968: jis0212<<14 | 0x49<<7 | 0x13, - 39733 - 19968: jis0212<<14 | 0x49<<7 | 0x14, - 39735 - 19968: jis0212<<14 | 0x49<<7 | 0x15, - 39737 - 19968: jis0212<<14 | 0x49<<7 | 0x16, - 39738 - 19968: jis0212<<14 | 0x49<<7 | 0x17, - 39739 - 19968: jis0208<<14 | 0x43<<7 | 0x57, - 39740 - 19968: jis0208<<14 | 0x14<<7 | 0x13, - 39741 - 19968: jis0212<<14 | 0x49<<7 | 0x18, - 39745 - 19968: jis0208<<14 | 0x12<<7 | 0x00, - 39746 - 19968: jis0208<<14 | 0x19<<7 | 0x11, - 39747 - 19968: jis0208<<14 | 0x51<<7 | 0x10, - 39748 - 19968: jis0208<<14 | 0x51<<7 | 0x0F, - 39749 - 19968: jis0208<<14 | 0x2B<<7 | 0x04, - 39752 - 19968: jis0212<<14 | 0x49<<7 | 0x19, - 39755 - 19968: jis0212<<14 | 0x49<<7 | 0x1A, - 39756 - 19968: jis0212<<14 | 0x49<<7 | 0x1B, - 39757 - 19968: jis0208<<14 | 0x51<<7 | 0x12, - 39758 - 19968: jis0208<<14 | 0x51<<7 | 0x13, - 39759 - 19968: jis0208<<14 | 0x51<<7 | 0x11, - 39761 - 19968: jis0208<<14 | 0x51<<7 | 0x14, - 39764 - 19968: jis0208<<14 | 0x2A<<7 | 0x41, - 39765 - 19968: jis0212<<14 | 0x49<<7 | 0x1C, - 39766 - 19968: jis0212<<14 | 0x49<<7 | 0x1D, - 39767 - 19968: jis0212<<14 | 0x49<<7 | 0x1E, - 39768 - 19968: jis0208<<14 | 0x51<<7 | 0x15, - 39770 - 19968: jis0208<<14 | 0x14<<7 | 0x5A, - 39771 - 19968: jis0212<<14 | 0x49<<7 | 0x1F, - 39774 - 19968: jis0212<<14 | 0x49<<7 | 0x20, - 39777 - 19968: jis0212<<14 | 0x49<<7 | 0x21, - 39779 - 19968: jis0212<<14 | 0x49<<7 | 0x22, - 39781 - 19968: jis0212<<14 | 0x49<<7 | 0x23, - 39782 - 19968: jis0212<<14 | 0x49<<7 | 0x24, - 39784 - 19968: jis0212<<14 | 0x49<<7 | 0x25, - 39786 - 19968: jis0212<<14 | 0x49<<7 | 0x26, - 39787 - 19968: jis0212<<14 | 0x49<<7 | 0x27, - 39788 - 19968: jis0212<<14 | 0x49<<7 | 0x28, - 39789 - 19968: jis0212<<14 | 0x49<<7 | 0x29, - 39790 - 19968: jis0212<<14 | 0x49<<7 | 0x2A, - 39791 - 19968: jis0208<<14 | 0x2E<<7 | 0x04, - 39794 - 19968: jis0208<<14 | 0x5B<<7 | 0x44, - 39795 - 19968: jis0212<<14 | 0x49<<7 | 0x2B, - 39796 - 19968: jis0208<<14 | 0x51<<7 | 0x16, - 39797 - 19968: jis0208<<14 | 0x5B<<7 | 0x43, - 39799 - 19968: jis0212<<14 | 0x49<<7 | 0x2D, - 39800 - 19968: jis0212<<14 | 0x49<<7 | 0x2E, - 39801 - 19968: jis0212<<14 | 0x49<<7 | 0x2F, - 39807 - 19968: jis0212<<14 | 0x49<<7 | 0x30, - 39808 - 19968: jis0212<<14 | 0x49<<7 | 0x31, - 39811 - 19968: jis0208<<14 | 0x51<<7 | 0x18, - 39812 - 19968: jis0212<<14 | 0x49<<7 | 0x32, - 39813 - 19968: jis0212<<14 | 0x49<<7 | 0x33, - 39814 - 19968: jis0212<<14 | 0x49<<7 | 0x34, - 39815 - 19968: jis0212<<14 | 0x49<<7 | 0x35, - 39817 - 19968: jis0212<<14 | 0x49<<7 | 0x36, - 39818 - 19968: jis0212<<14 | 0x49<<7 | 0x37, - 39819 - 19968: jis0212<<14 | 0x49<<7 | 0x38, - 39821 - 19968: jis0212<<14 | 0x49<<7 | 0x39, - 39822 - 19968: jis0208<<14 | 0x0F<<7 | 0x1D, - 39823 - 19968: jis0208<<14 | 0x5B<<7 | 0x45, - 39824 - 19968: jis0212<<14 | 0x49<<7 | 0x3B, - 39825 - 19968: jis0208<<14 | 0x51<<7 | 0x19, - 39826 - 19968: jis0208<<14 | 0x29<<7 | 0x0A, - 39827 - 19968: jis0208<<14 | 0x51<<7 | 0x17, - 39828 - 19968: jis0212<<14 | 0x49<<7 | 0x3C, - 39830 - 19968: jis0208<<14 | 0x51<<7 | 0x1A, - 39831 - 19968: jis0208<<14 | 0x51<<7 | 0x1B, - 39834 - 19968: jis0212<<14 | 0x49<<7 | 0x3D, - 39837 - 19968: jis0212<<14 | 0x49<<7 | 0x3E, - 39838 - 19968: jis0212<<14 | 0x49<<7 | 0x3F, - 39839 - 19968: jis0208<<14 | 0x51<<7 | 0x1C, - 39840 - 19968: jis0208<<14 | 0x51<<7 | 0x1D, - 39846 - 19968: jis0212<<14 | 0x49<<7 | 0x40, - 39847 - 19968: jis0212<<14 | 0x49<<7 | 0x41, - 39848 - 19968: jis0208<<14 | 0x51<<7 | 0x1E, - 39849 - 19968: jis0212<<14 | 0x49<<7 | 0x42, - 39850 - 19968: jis0208<<14 | 0x2A<<7 | 0x4D, - 39851 - 19968: jis0208<<14 | 0x1A<<7 | 0x0C, - 39852 - 19968: jis0212<<14 | 0x49<<7 | 0x43, - 39853 - 19968: jis0208<<14 | 0x19<<7 | 0x59, - 39854 - 19968: jis0208<<14 | 0x20<<7 | 0x0E, - 39856 - 19968: jis0212<<14 | 0x49<<7 | 0x44, - 39857 - 19968: jis0208<<14 | 0x5B<<7 | 0x46, - 39858 - 19968: jis0212<<14 | 0x49<<7 | 0x46, - 39860 - 19968: jis0208<<14 | 0x51<<7 | 0x1F, - 39863 - 19968: jis0212<<14 | 0x49<<7 | 0x47, - 39864 - 19968: jis0212<<14 | 0x49<<7 | 0x48, - 39865 - 19968: jis0208<<14 | 0x51<<7 | 0x22, - 39867 - 19968: jis0208<<14 | 0x5B<<7 | 0x47, - 39868 - 19968: jis0212<<14 | 0x49<<7 | 0x4A, - 39870 - 19968: jis0212<<14 | 0x49<<7 | 0x4B, - 39871 - 19968: jis0212<<14 | 0x49<<7 | 0x4C, - 39872 - 19968: jis0208<<14 | 0x51<<7 | 0x20, - 39873 - 19968: jis0212<<14 | 0x49<<7 | 0x4D, - 39878 - 19968: jis0208<<14 | 0x51<<7 | 0x23, - 39879 - 19968: jis0212<<14 | 0x49<<7 | 0x4E, - 39880 - 19968: jis0212<<14 | 0x49<<7 | 0x4F, - 39881 - 19968: jis0208<<14 | 0x17<<7 | 0x50, - 39882 - 19968: jis0208<<14 | 0x51<<7 | 0x21, - 39886 - 19968: jis0212<<14 | 0x49<<7 | 0x50, - 39887 - 19968: jis0208<<14 | 0x51<<7 | 0x24, - 39888 - 19968: jis0212<<14 | 0x49<<7 | 0x51, - 39889 - 19968: jis0208<<14 | 0x51<<7 | 0x25, - 39890 - 19968: jis0208<<14 | 0x51<<7 | 0x26, - 39892 - 19968: jis0208<<14 | 0x51<<7 | 0x2A, - 39894 - 19968: jis0208<<14 | 0x1A<<7 | 0x09, - 39895 - 19968: jis0212<<14 | 0x49<<7 | 0x52, - 39896 - 19968: jis0212<<14 | 0x49<<7 | 0x53, - 39899 - 19968: jis0208<<14 | 0x21<<7 | 0x43, - 39901 - 19968: jis0212<<14 | 0x49<<7 | 0x54, - 39903 - 19968: jis0212<<14 | 0x49<<7 | 0x55, - 39905 - 19968: jis0208<<14 | 0x51<<7 | 0x2B, - 39906 - 19968: jis0208<<14 | 0x51<<7 | 0x28, - 39907 - 19968: jis0208<<14 | 0x51<<7 | 0x27, - 39908 - 19968: jis0208<<14 | 0x51<<7 | 0x29, - 39909 - 19968: jis0212<<14 | 0x49<<7 | 0x56, - 39911 - 19968: jis0212<<14 | 0x49<<7 | 0x57, - 39912 - 19968: jis0208<<14 | 0x16<<7 | 0x3E, - 39914 - 19968: jis0212<<14 | 0x49<<7 | 0x58, - 39915 - 19968: jis0212<<14 | 0x49<<7 | 0x59, - 39919 - 19968: jis0212<<14 | 0x49<<7 | 0x5A, - 39920 - 19968: jis0208<<14 | 0x51<<7 | 0x2F, - 39921 - 19968: jis0208<<14 | 0x51<<7 | 0x2E, - 39922 - 19968: jis0208<<14 | 0x51<<7 | 0x2D, - 39923 - 19968: jis0212<<14 | 0x49<<7 | 0x5B, - 39925 - 19968: jis0208<<14 | 0x0F<<7 | 0x12, - 39927 - 19968: jis0212<<14 | 0x49<<7 | 0x5C, - 39928 - 19968: jis0212<<14 | 0x49<<7 | 0x5D, - 39929 - 19968: jis0212<<14 | 0x4A<<7 | 0x00, - 39930 - 19968: jis0212<<14 | 0x4A<<7 | 0x01, - 39933 - 19968: jis0212<<14 | 0x4A<<7 | 0x02, - 39935 - 19968: jis0212<<14 | 0x4A<<7 | 0x03, - 39936 - 19968: jis0208<<14 | 0x5B<<7 | 0x48, - 39938 - 19968: jis0212<<14 | 0x4A<<7 | 0x05, - 39940 - 19968: jis0208<<14 | 0x51<<7 | 0x39, - 39942 - 19968: jis0208<<14 | 0x51<<7 | 0x35, - 39944 - 19968: jis0208<<14 | 0x51<<7 | 0x36, - 39945 - 19968: jis0208<<14 | 0x51<<7 | 0x32, - 39946 - 19968: jis0208<<14 | 0x51<<7 | 0x38, - 39947 - 19968: jis0212<<14 | 0x4A<<7 | 0x06, - 39948 - 19968: jis0208<<14 | 0x51<<7 | 0x34, - 39949 - 19968: jis0208<<14 | 0x12<<7 | 0x41, - 39951 - 19968: jis0212<<14 | 0x4A<<7 | 0x07, - 39952 - 19968: jis0208<<14 | 0x2E<<7 | 0x2B, - 39953 - 19968: jis0212<<14 | 0x4A<<7 | 0x08, - 39954 - 19968: jis0208<<14 | 0x51<<7 | 0x37, - 39955 - 19968: jis0208<<14 | 0x51<<7 | 0x33, - 39956 - 19968: jis0208<<14 | 0x51<<7 | 0x31, - 39957 - 19968: jis0208<<14 | 0x51<<7 | 0x30, - 39958 - 19968: jis0212<<14 | 0x4A<<7 | 0x09, - 39960 - 19968: jis0212<<14 | 0x4A<<7 | 0x0A, - 39961 - 19968: jis0212<<14 | 0x4A<<7 | 0x0B, - 39962 - 19968: jis0212<<14 | 0x4A<<7 | 0x0C, - 39963 - 19968: jis0208<<14 | 0x51<<7 | 0x3B, - 39964 - 19968: jis0212<<14 | 0x4A<<7 | 0x0D, - 39966 - 19968: jis0212<<14 | 0x4A<<7 | 0x0E, - 39969 - 19968: jis0208<<14 | 0x51<<7 | 0x3E, - 39970 - 19968: jis0212<<14 | 0x4A<<7 | 0x0F, - 39971 - 19968: jis0212<<14 | 0x4A<<7 | 0x10, - 39972 - 19968: jis0208<<14 | 0x51<<7 | 0x3D, - 39973 - 19968: jis0208<<14 | 0x51<<7 | 0x3C, - 39974 - 19968: jis0212<<14 | 0x4A<<7 | 0x11, - 39975 - 19968: jis0212<<14 | 0x4A<<7 | 0x12, - 39976 - 19968: jis0212<<14 | 0x4A<<7 | 0x13, - 39977 - 19968: jis0212<<14 | 0x4A<<7 | 0x14, - 39978 - 19968: jis0212<<14 | 0x4A<<7 | 0x15, - 39981 - 19968: jis0208<<14 | 0x28<<7 | 0x28, - 39982 - 19968: jis0208<<14 | 0x51<<7 | 0x3A, - 39983 - 19968: jis0208<<14 | 0x0F<<7 | 0x52, - 39984 - 19968: jis0208<<14 | 0x51<<7 | 0x3F, - 39985 - 19968: jis0212<<14 | 0x4A<<7 | 0x16, - 39986 - 19968: jis0208<<14 | 0x51<<7 | 0x41, - 39989 - 19968: jis0212<<14 | 0x4A<<7 | 0x17, - 39990 - 19968: jis0212<<14 | 0x4A<<7 | 0x18, - 39991 - 19968: jis0212<<14 | 0x4A<<7 | 0x19, - 39993 - 19968: jis0208<<14 | 0x12<<7 | 0x4E, - 39994 - 19968: jis0208<<14 | 0x51<<7 | 0x2C, - 39995 - 19968: jis0208<<14 | 0x10<<7 | 0x16, - 39997 - 19968: jis0212<<14 | 0x4A<<7 | 0x1A, - 39998 - 19968: jis0208<<14 | 0x51<<7 | 0x43, - 40001 - 19968: jis0212<<14 | 0x4A<<7 | 0x1B, - 40003 - 19968: jis0212<<14 | 0x4A<<7 | 0x1C, - 40004 - 19968: jis0212<<14 | 0x4A<<7 | 0x1D, - 40005 - 19968: jis0212<<14 | 0x4A<<7 | 0x1E, - 40006 - 19968: jis0208<<14 | 0x51<<7 | 0x42, - 40007 - 19968: jis0208<<14 | 0x51<<7 | 0x40, - 40008 - 19968: jis0208<<14 | 0x22<<7 | 0x0C, - 40009 - 19968: jis0212<<14 | 0x4A<<7 | 0x1F, - 40010 - 19968: jis0212<<14 | 0x4A<<7 | 0x20, - 40014 - 19968: jis0212<<14 | 0x4A<<7 | 0x21, - 40015 - 19968: jis0212<<14 | 0x4A<<7 | 0x22, - 40016 - 19968: jis0212<<14 | 0x4A<<7 | 0x23, - 40018 - 19968: jis0208<<14 | 0x2A<<7 | 0x4F, - 40019 - 19968: jis0212<<14 | 0x4A<<7 | 0x24, - 40020 - 19968: jis0212<<14 | 0x4A<<7 | 0x25, - 40022 - 19968: jis0212<<14 | 0x4A<<7 | 0x26, - 40023 - 19968: jis0208<<14 | 0x2D<<7 | 0x39, - 40024 - 19968: jis0212<<14 | 0x4A<<7 | 0x27, - 40026 - 19968: jis0208<<14 | 0x51<<7 | 0x44, - 40027 - 19968: jis0212<<14 | 0x4A<<7 | 0x28, - 40028 - 19968: jis0212<<14 | 0x4A<<7 | 0x2F, - 40029 - 19968: jis0212<<14 | 0x4A<<7 | 0x29, - 40030 - 19968: jis0212<<14 | 0x4A<<7 | 0x2A, - 40031 - 19968: jis0212<<14 | 0x4A<<7 | 0x2B, - 40032 - 19968: jis0208<<14 | 0x51<<7 | 0x45, - 40035 - 19968: jis0212<<14 | 0x4A<<7 | 0x2C, - 40039 - 19968: jis0208<<14 | 0x51<<7 | 0x46, - 40040 - 19968: jis0212<<14 | 0x4A<<7 | 0x31, - 40041 - 19968: jis0212<<14 | 0x4A<<7 | 0x2D, - 40042 - 19968: jis0212<<14 | 0x4A<<7 | 0x2E, - 40043 - 19968: jis0212<<14 | 0x4A<<7 | 0x30, - 40046 - 19968: jis0212<<14 | 0x4A<<7 | 0x32, - 40048 - 19968: jis0212<<14 | 0x4A<<7 | 0x33, - 40050 - 19968: jis0212<<14 | 0x4A<<7 | 0x34, - 40053 - 19968: jis0212<<14 | 0x4A<<7 | 0x35, - 40054 - 19968: jis0208<<14 | 0x51<<7 | 0x47, - 40055 - 19968: jis0212<<14 | 0x4A<<7 | 0x36, - 40056 - 19968: jis0208<<14 | 0x51<<7 | 0x48, - 40059 - 19968: jis0212<<14 | 0x4A<<7 | 0x37, - 40165 - 19968: jis0208<<14 | 0x23<<7 | 0x1A, - 40166 - 19968: jis0212<<14 | 0x4A<<7 | 0x38, - 40167 - 19968: jis0208<<14 | 0x51<<7 | 0x49, - 40169 - 19968: jis0208<<14 | 0x27<<7 | 0x16, - 40171 - 19968: jis0208<<14 | 0x51<<7 | 0x4E, - 40172 - 19968: jis0208<<14 | 0x51<<7 | 0x4A, - 40176 - 19968: jis0208<<14 | 0x51<<7 | 0x4B, - 40178 - 19968: jis0212<<14 | 0x4A<<7 | 0x39, - 40179 - 19968: jis0208<<14 | 0x2A<<7 | 0x10, - 40180 - 19968: jis0208<<14 | 0x2B<<7 | 0x23, - 40182 - 19968: jis0208<<14 | 0x25<<7 | 0x2F, - 40183 - 19968: jis0212<<14 | 0x4A<<7 | 0x3A, - 40185 - 19968: jis0212<<14 | 0x4A<<7 | 0x3B, - 40194 - 19968: jis0212<<14 | 0x4A<<7 | 0x3D, - 40195 - 19968: jis0208<<14 | 0x51<<7 | 0x4F, - 40198 - 19968: jis0208<<14 | 0x51<<7 | 0x50, - 40199 - 19968: jis0208<<14 | 0x25<<7 | 0x1D, - 40200 - 19968: jis0208<<14 | 0x51<<7 | 0x4D, - 40201 - 19968: jis0208<<14 | 0x51<<7 | 0x4C, - 40203 - 19968: jis0212<<14 | 0x4A<<7 | 0x3C, - 40206 - 19968: jis0208<<14 | 0x11<<7 | 0x09, - 40209 - 19968: jis0212<<14 | 0x4A<<7 | 0x3E, - 40210 - 19968: jis0208<<14 | 0x51<<7 | 0x58, - 40213 - 19968: jis0208<<14 | 0x51<<7 | 0x57, - 40215 - 19968: jis0212<<14 | 0x4A<<7 | 0x3F, - 40216 - 19968: jis0212<<14 | 0x4A<<7 | 0x40, - 40219 - 19968: jis0208<<14 | 0x10<<7 | 0x54, - 40220 - 19968: jis0212<<14 | 0x4A<<7 | 0x41, - 40221 - 19968: jis0212<<14 | 0x4A<<7 | 0x42, - 40222 - 19968: jis0212<<14 | 0x4A<<7 | 0x43, - 40223 - 19968: jis0208<<14 | 0x51<<7 | 0x55, - 40227 - 19968: jis0208<<14 | 0x51<<7 | 0x54, - 40230 - 19968: jis0208<<14 | 0x51<<7 | 0x52, - 40232 - 19968: jis0208<<14 | 0x12<<7 | 0x5A, - 40234 - 19968: jis0208<<14 | 0x51<<7 | 0x51, - 40235 - 19968: jis0208<<14 | 0x1B<<7 | 0x11, - 40236 - 19968: jis0208<<14 | 0x11<<7 | 0x08, - 40239 - 19968: jis0212<<14 | 0x4A<<7 | 0x44, - 40240 - 19968: jis0212<<14 | 0x4A<<7 | 0x45, - 40242 - 19968: jis0212<<14 | 0x4A<<7 | 0x46, - 40243 - 19968: jis0212<<14 | 0x4A<<7 | 0x47, - 40244 - 19968: jis0212<<14 | 0x4A<<7 | 0x48, - 40250 - 19968: jis0212<<14 | 0x4A<<7 | 0x49, - 40251 - 19968: jis0208<<14 | 0x18<<7 | 0x42, - 40252 - 19968: jis0212<<14 | 0x4A<<7 | 0x4A, - 40253 - 19968: jis0212<<14 | 0x4A<<7 | 0x4C, - 40254 - 19968: jis0208<<14 | 0x51<<7 | 0x5B, - 40255 - 19968: jis0208<<14 | 0x51<<7 | 0x5A, - 40257 - 19968: jis0208<<14 | 0x51<<7 | 0x59, - 40258 - 19968: jis0212<<14 | 0x4A<<7 | 0x4D, - 40259 - 19968: jis0212<<14 | 0x4A<<7 | 0x4E, - 40260 - 19968: jis0208<<14 | 0x51<<7 | 0x56, - 40261 - 19968: jis0212<<14 | 0x4A<<7 | 0x4B, - 40262 - 19968: jis0208<<14 | 0x51<<7 | 0x5C, - 40263 - 19968: jis0212<<14 | 0x4A<<7 | 0x4F, - 40264 - 19968: jis0208<<14 | 0x51<<7 | 0x5D, - 40266 - 19968: jis0212<<14 | 0x4A<<7 | 0x50, - 40272 - 19968: jis0208<<14 | 0x52<<7 | 0x04, - 40273 - 19968: jis0208<<14 | 0x52<<7 | 0x03, - 40275 - 19968: jis0212<<14 | 0x4A<<7 | 0x51, - 40276 - 19968: jis0212<<14 | 0x4A<<7 | 0x52, - 40281 - 19968: jis0208<<14 | 0x52<<7 | 0x05, - 40284 - 19968: jis0208<<14 | 0x10<<7 | 0x0C, - 40285 - 19968: jis0208<<14 | 0x52<<7 | 0x00, - 40286 - 19968: jis0208<<14 | 0x52<<7 | 0x01, - 40287 - 19968: jis0212<<14 | 0x4A<<7 | 0x53, - 40288 - 19968: jis0208<<14 | 0x18<<7 | 0x53, - 40289 - 19968: jis0208<<14 | 0x2B<<7 | 0x18, - 40290 - 19968: jis0212<<14 | 0x4A<<7 | 0x55, - 40291 - 19968: jis0212<<14 | 0x4A<<7 | 0x54, - 40292 - 19968: jis0208<<14 | 0x52<<7 | 0x02, - 40293 - 19968: jis0212<<14 | 0x4A<<7 | 0x56, - 40297 - 19968: jis0212<<14 | 0x4A<<7 | 0x57, - 40298 - 19968: jis0212<<14 | 0x4A<<7 | 0x58, - 40299 - 19968: jis0208<<14 | 0x5B<<7 | 0x4A, - 40300 - 19968: jis0208<<14 | 0x2A<<7 | 0x11, - 40303 - 19968: jis0208<<14 | 0x52<<7 | 0x0A, - 40304 - 19968: jis0208<<14 | 0x5B<<7 | 0x49, - 40306 - 19968: jis0208<<14 | 0x52<<7 | 0x06, - 40310 - 19968: jis0212<<14 | 0x4A<<7 | 0x5B, - 40311 - 19968: jis0212<<14 | 0x4A<<7 | 0x5C, - 40314 - 19968: jis0208<<14 | 0x52<<7 | 0x0B, - 40315 - 19968: jis0212<<14 | 0x4A<<7 | 0x5D, - 40316 - 19968: jis0212<<14 | 0x4B<<7 | 0x00, - 40318 - 19968: jis0212<<14 | 0x4B<<7 | 0x01, - 40323 - 19968: jis0212<<14 | 0x4B<<7 | 0x02, - 40324 - 19968: jis0212<<14 | 0x4B<<7 | 0x03, - 40326 - 19968: jis0212<<14 | 0x4B<<7 | 0x04, - 40327 - 19968: jis0208<<14 | 0x52<<7 | 0x08, - 40329 - 19968: jis0208<<14 | 0x52<<7 | 0x07, - 40330 - 19968: jis0212<<14 | 0x4B<<7 | 0x05, - 40333 - 19968: jis0212<<14 | 0x4B<<7 | 0x06, - 40334 - 19968: jis0212<<14 | 0x4B<<7 | 0x07, - 40335 - 19968: jis0208<<14 | 0x16<<7 | 0x3B, - 40338 - 19968: jis0212<<14 | 0x4B<<7 | 0x08, - 40339 - 19968: jis0212<<14 | 0x4B<<7 | 0x09, - 40341 - 19968: jis0212<<14 | 0x4B<<7 | 0x0A, - 40342 - 19968: jis0212<<14 | 0x4B<<7 | 0x0B, - 40343 - 19968: jis0212<<14 | 0x4B<<7 | 0x0C, - 40344 - 19968: jis0212<<14 | 0x4B<<7 | 0x0D, - 40346 - 19968: jis0208<<14 | 0x52<<7 | 0x0C, - 40353 - 19968: jis0212<<14 | 0x4B<<7 | 0x0E, - 40356 - 19968: jis0208<<14 | 0x52<<7 | 0x0D, - 40361 - 19968: jis0208<<14 | 0x52<<7 | 0x0E, - 40362 - 19968: jis0212<<14 | 0x4B<<7 | 0x0F, - 40363 - 19968: jis0208<<14 | 0x52<<7 | 0x09, - 40364 - 19968: jis0212<<14 | 0x4B<<7 | 0x10, - 40366 - 19968: jis0212<<14 | 0x4B<<7 | 0x11, - 40367 - 19968: jis0208<<14 | 0x51<<7 | 0x53, - 40369 - 19968: jis0212<<14 | 0x4B<<7 | 0x12, - 40370 - 19968: jis0208<<14 | 0x52<<7 | 0x0F, - 40372 - 19968: jis0208<<14 | 0x23<<7 | 0x40, - 40373 - 19968: jis0212<<14 | 0x4B<<7 | 0x13, - 40376 - 19968: jis0208<<14 | 0x52<<7 | 0x13, - 40377 - 19968: jis0212<<14 | 0x4B<<7 | 0x14, - 40378 - 19968: jis0208<<14 | 0x52<<7 | 0x14, - 40379 - 19968: jis0208<<14 | 0x52<<7 | 0x12, - 40380 - 19968: jis0212<<14 | 0x4B<<7 | 0x15, - 40383 - 19968: jis0212<<14 | 0x4B<<7 | 0x16, - 40385 - 19968: jis0208<<14 | 0x52<<7 | 0x11, - 40386 - 19968: jis0208<<14 | 0x52<<7 | 0x17, - 40387 - 19968: jis0212<<14 | 0x4B<<7 | 0x17, - 40388 - 19968: jis0208<<14 | 0x52<<7 | 0x10, - 40390 - 19968: jis0208<<14 | 0x52<<7 | 0x15, - 40391 - 19968: jis0212<<14 | 0x4B<<7 | 0x18, - 40393 - 19968: jis0212<<14 | 0x4B<<7 | 0x19, - 40394 - 19968: jis0212<<14 | 0x4B<<7 | 0x1A, - 40399 - 19968: jis0208<<14 | 0x52<<7 | 0x16, - 40403 - 19968: jis0208<<14 | 0x52<<7 | 0x19, - 40404 - 19968: jis0212<<14 | 0x4B<<7 | 0x1B, - 40405 - 19968: jis0212<<14 | 0x4B<<7 | 0x1C, - 40406 - 19968: jis0212<<14 | 0x4B<<7 | 0x1D, - 40407 - 19968: jis0212<<14 | 0x4B<<7 | 0x1E, - 40409 - 19968: jis0208<<14 | 0x52<<7 | 0x18, - 40410 - 19968: jis0212<<14 | 0x4B<<7 | 0x1F, - 40414 - 19968: jis0212<<14 | 0x4B<<7 | 0x20, - 40415 - 19968: jis0212<<14 | 0x4B<<7 | 0x21, - 40416 - 19968: jis0212<<14 | 0x4B<<7 | 0x22, - 40421 - 19968: jis0212<<14 | 0x4B<<7 | 0x23, - 40422 - 19968: jis0208<<14 | 0x52<<7 | 0x1B, - 40423 - 19968: jis0212<<14 | 0x4B<<7 | 0x24, - 40425 - 19968: jis0212<<14 | 0x4B<<7 | 0x25, - 40427 - 19968: jis0212<<14 | 0x4B<<7 | 0x26, - 40429 - 19968: jis0208<<14 | 0x52<<7 | 0x1C, - 40430 - 19968: jis0212<<14 | 0x4B<<7 | 0x27, - 40431 - 19968: jis0208<<14 | 0x52<<7 | 0x1D, - 40432 - 19968: jis0212<<14 | 0x4B<<7 | 0x28, - 40434 - 19968: jis0208<<14 | 0x2E<<7 | 0x28, - 40435 - 19968: jis0212<<14 | 0x4B<<7 | 0x29, - 40436 - 19968: jis0212<<14 | 0x4B<<7 | 0x2A, - 40440 - 19968: jis0208<<14 | 0x52<<7 | 0x1A, - 40441 - 19968: jis0208<<14 | 0x21<<7 | 0x4A, - 40442 - 19968: jis0208<<14 | 0x19<<7 | 0x4C, - 40445 - 19968: jis0208<<14 | 0x52<<7 | 0x1E, - 40446 - 19968: jis0212<<14 | 0x4B<<7 | 0x2B, - 40450 - 19968: jis0212<<14 | 0x4B<<7 | 0x2D, - 40455 - 19968: jis0212<<14 | 0x4B<<7 | 0x2E, - 40458 - 19968: jis0212<<14 | 0x4B<<7 | 0x2C, - 40462 - 19968: jis0212<<14 | 0x4B<<7 | 0x2F, - 40464 - 19968: jis0212<<14 | 0x4B<<7 | 0x30, - 40465 - 19968: jis0212<<14 | 0x4B<<7 | 0x31, - 40466 - 19968: jis0212<<14 | 0x4B<<7 | 0x32, - 40469 - 19968: jis0212<<14 | 0x4B<<7 | 0x33, - 40470 - 19968: jis0212<<14 | 0x4B<<7 | 0x34, - 40473 - 19968: jis0208<<14 | 0x5B<<7 | 0x4C, - 40474 - 19968: jis0208<<14 | 0x52<<7 | 0x1F, - 40475 - 19968: jis0208<<14 | 0x52<<7 | 0x20, - 40476 - 19968: jis0212<<14 | 0x4B<<7 | 0x36, - 40477 - 19968: jis0212<<14 | 0x4B<<7 | 0x37, - 40478 - 19968: jis0208<<14 | 0x52<<7 | 0x21, - 40565 - 19968: jis0208<<14 | 0x52<<7 | 0x22, - 40568 - 19968: jis0208<<14 | 0x17<<7 | 0x13, - 40569 - 19968: jis0208<<14 | 0x52<<7 | 0x23, - 40570 - 19968: jis0212<<14 | 0x4B<<7 | 0x38, - 40571 - 19968: jis0212<<14 | 0x4B<<7 | 0x39, - 40572 - 19968: jis0212<<14 | 0x4B<<7 | 0x3A, - 40573 - 19968: jis0208<<14 | 0x52<<7 | 0x24, - 40575 - 19968: jis0208<<14 | 0x1B<<7 | 0x0E, - 40576 - 19968: jis0212<<14 | 0x4B<<7 | 0x3B, - 40577 - 19968: jis0208<<14 | 0x52<<7 | 0x25, - 40578 - 19968: jis0212<<14 | 0x4B<<7 | 0x3C, - 40579 - 19968: jis0212<<14 | 0x4B<<7 | 0x3D, - 40580 - 19968: jis0212<<14 | 0x4B<<7 | 0x3E, - 40581 - 19968: jis0212<<14 | 0x4B<<7 | 0x3F, - 40583 - 19968: jis0212<<14 | 0x4B<<7 | 0x40, - 40584 - 19968: jis0208<<14 | 0x52<<7 | 0x26, - 40587 - 19968: jis0208<<14 | 0x52<<7 | 0x27, - 40588 - 19968: jis0208<<14 | 0x52<<7 | 0x28, - 40590 - 19968: jis0212<<14 | 0x4B<<7 | 0x41, - 40591 - 19968: jis0212<<14 | 0x4B<<7 | 0x42, - 40593 - 19968: jis0208<<14 | 0x52<<7 | 0x2B, - 40594 - 19968: jis0208<<14 | 0x52<<7 | 0x29, - 40595 - 19968: jis0208<<14 | 0x2E<<7 | 0x1B, - 40597 - 19968: jis0208<<14 | 0x52<<7 | 0x2A, - 40598 - 19968: jis0212<<14 | 0x4B<<7 | 0x43, - 40599 - 19968: jis0208<<14 | 0x2D<<7 | 0x4E, - 40600 - 19968: jis0212<<14 | 0x4B<<7 | 0x44, - 40603 - 19968: jis0212<<14 | 0x4B<<7 | 0x45, - 40605 - 19968: jis0208<<14 | 0x52<<7 | 0x2C, - 40606 - 19968: jis0212<<14 | 0x4B<<7 | 0x46, - 40607 - 19968: jis0208<<14 | 0x2D<<7 | 0x3A, - 40612 - 19968: jis0212<<14 | 0x4B<<7 | 0x47, - 40613 - 19968: jis0208<<14 | 0x52<<7 | 0x2D, - 40614 - 19968: jis0208<<14 | 0x26<<7 | 0x5D, - 40616 - 19968: jis0212<<14 | 0x4B<<7 | 0x48, - 40617 - 19968: jis0208<<14 | 0x52<<7 | 0x2E, - 40618 - 19968: jis0208<<14 | 0x52<<7 | 0x30, - 40620 - 19968: jis0212<<14 | 0x4B<<7 | 0x49, - 40621 - 19968: jis0208<<14 | 0x52<<7 | 0x31, - 40622 - 19968: jis0212<<14 | 0x4B<<7 | 0x4A, - 40623 - 19968: jis0212<<14 | 0x4B<<7 | 0x4B, - 40624 - 19968: jis0212<<14 | 0x4B<<7 | 0x4C, - 40627 - 19968: jis0212<<14 | 0x4B<<7 | 0x4D, - 40628 - 19968: jis0212<<14 | 0x4B<<7 | 0x4E, - 40629 - 19968: jis0212<<14 | 0x4B<<7 | 0x4F, - 40632 - 19968: jis0208<<14 | 0x52<<7 | 0x2F, - 40633 - 19968: jis0208<<14 | 0x18<<7 | 0x4C, - 40634 - 19968: jis0208<<14 | 0x2B<<7 | 0x2C, - 40635 - 19968: jis0208<<14 | 0x2A<<7 | 0x42, - 40636 - 19968: jis0208<<14 | 0x35<<7 | 0x56, - 40638 - 19968: jis0208<<14 | 0x3C<<7 | 0x3F, - 40639 - 19968: jis0208<<14 | 0x2A<<7 | 0x5A, - 40644 - 19968: jis0208<<14 | 0x11<<7 | 0x0A, - 40646 - 19968: jis0212<<14 | 0x4B<<7 | 0x50, - 40648 - 19968: jis0212<<14 | 0x4B<<7 | 0x51, - 40651 - 19968: jis0212<<14 | 0x4B<<7 | 0x52, - 40652 - 19968: jis0208<<14 | 0x52<<7 | 0x33, - 40653 - 19968: jis0208<<14 | 0x14<<7 | 0x2F, - 40654 - 19968: jis0208<<14 | 0x52<<7 | 0x34, - 40655 - 19968: jis0208<<14 | 0x52<<7 | 0x35, - 40656 - 19968: jis0208<<14 | 0x52<<7 | 0x36, - 40657 - 19968: jis0208<<14 | 0x5B<<7 | 0x4D, - 40658 - 19968: jis0208<<14 | 0x18<<7 | 0x54, - 40660 - 19968: jis0208<<14 | 0x52<<7 | 0x37, - 40661 - 19968: jis0212<<14 | 0x4B<<7 | 0x53, - 40664 - 19968: jis0208<<14 | 0x3F<<7 | 0x33, - 40665 - 19968: jis0208<<14 | 0x2B<<7 | 0x3A, - 40667 - 19968: jis0208<<14 | 0x21<<7 | 0x42, - 40668 - 19968: jis0208<<14 | 0x52<<7 | 0x38, - 40669 - 19968: jis0208<<14 | 0x52<<7 | 0x3A, - 40670 - 19968: jis0208<<14 | 0x52<<7 | 0x39, - 40671 - 19968: jis0212<<14 | 0x4B<<7 | 0x54, - 40672 - 19968: jis0208<<14 | 0x52<<7 | 0x3B, - 40676 - 19968: jis0212<<14 | 0x4B<<7 | 0x55, - 40677 - 19968: jis0208<<14 | 0x52<<7 | 0x3C, - 40679 - 19968: jis0212<<14 | 0x4B<<7 | 0x56, - 40680 - 19968: jis0208<<14 | 0x52<<7 | 0x3D, - 40684 - 19968: jis0212<<14 | 0x4B<<7 | 0x57, - 40685 - 19968: jis0212<<14 | 0x4B<<7 | 0x58, - 40686 - 19968: jis0212<<14 | 0x4B<<7 | 0x59, - 40687 - 19968: jis0208<<14 | 0x52<<7 | 0x3E, - 40688 - 19968: jis0212<<14 | 0x4B<<7 | 0x5A, - 40689 - 19968: jis0212<<14 | 0x4B<<7 | 0x5B, - 40690 - 19968: jis0212<<14 | 0x4B<<7 | 0x5C, - 40692 - 19968: jis0208<<14 | 0x52<<7 | 0x3F, - 40693 - 19968: jis0212<<14 | 0x4B<<7 | 0x5D, - 40694 - 19968: jis0208<<14 | 0x52<<7 | 0x40, - 40695 - 19968: jis0208<<14 | 0x52<<7 | 0x41, - 40696 - 19968: jis0212<<14 | 0x4C<<7 | 0x00, - 40697 - 19968: jis0208<<14 | 0x52<<7 | 0x42, - 40699 - 19968: jis0208<<14 | 0x52<<7 | 0x43, - 40700 - 19968: jis0208<<14 | 0x52<<7 | 0x44, - 40701 - 19968: jis0208<<14 | 0x52<<7 | 0x45, - 40703 - 19968: jis0212<<14 | 0x4C<<7 | 0x01, - 40706 - 19968: jis0212<<14 | 0x4C<<7 | 0x02, - 40707 - 19968: jis0212<<14 | 0x4C<<7 | 0x03, - 40711 - 19968: jis0208<<14 | 0x52<<7 | 0x46, - 40712 - 19968: jis0208<<14 | 0x52<<7 | 0x47, - 40713 - 19968: jis0212<<14 | 0x4C<<7 | 0x04, - 40718 - 19968: jis0208<<14 | 0x24<<7 | 0x03, - 40719 - 19968: jis0212<<14 | 0x4C<<7 | 0x05, - 40720 - 19968: jis0212<<14 | 0x4C<<7 | 0x06, - 40721 - 19968: jis0212<<14 | 0x4C<<7 | 0x07, - 40722 - 19968: jis0212<<14 | 0x4C<<7 | 0x08, - 40723 - 19968: jis0208<<14 | 0x17<<7 | 0x3C, - 40724 - 19968: jis0212<<14 | 0x4C<<7 | 0x09, - 40725 - 19968: jis0208<<14 | 0x52<<7 | 0x49, - 40726 - 19968: jis0212<<14 | 0x4C<<7 | 0x0A, - 40727 - 19968: jis0212<<14 | 0x4C<<7 | 0x0B, - 40729 - 19968: jis0212<<14 | 0x4C<<7 | 0x0C, - 40730 - 19968: jis0212<<14 | 0x4C<<7 | 0x0D, - 40731 - 19968: jis0212<<14 | 0x4C<<7 | 0x0E, - 40735 - 19968: jis0212<<14 | 0x4C<<7 | 0x0F, - 40736 - 19968: jis0208<<14 | 0x20<<7 | 0x2C, - 40737 - 19968: jis0208<<14 | 0x52<<7 | 0x4A, - 40738 - 19968: jis0212<<14 | 0x4C<<7 | 0x10, - 40742 - 19968: jis0212<<14 | 0x4C<<7 | 0x11, - 40746 - 19968: jis0212<<14 | 0x4C<<7 | 0x12, - 40747 - 19968: jis0212<<14 | 0x4C<<7 | 0x13, - 40748 - 19968: jis0208<<14 | 0x52<<7 | 0x4B, - 40751 - 19968: jis0212<<14 | 0x4C<<7 | 0x14, - 40753 - 19968: jis0212<<14 | 0x4C<<7 | 0x15, - 40754 - 19968: jis0212<<14 | 0x4C<<7 | 0x16, - 40756 - 19968: jis0212<<14 | 0x4C<<7 | 0x17, - 40759 - 19968: jis0212<<14 | 0x4C<<7 | 0x18, - 40761 - 19968: jis0212<<14 | 0x4C<<7 | 0x19, - 40762 - 19968: jis0212<<14 | 0x4C<<7 | 0x1A, - 40763 - 19968: jis0208<<14 | 0x28<<7 | 0x00, - 40764 - 19968: jis0212<<14 | 0x4C<<7 | 0x1B, - 40765 - 19968: jis0212<<14 | 0x4C<<7 | 0x1C, - 40766 - 19968: jis0208<<14 | 0x52<<7 | 0x4C, - 40767 - 19968: jis0212<<14 | 0x4C<<7 | 0x1D, - 40769 - 19968: jis0212<<14 | 0x4C<<7 | 0x1E, - 40771 - 19968: jis0212<<14 | 0x4C<<7 | 0x1F, - 40772 - 19968: jis0212<<14 | 0x4C<<7 | 0x20, - 40773 - 19968: jis0212<<14 | 0x4C<<7 | 0x21, - 40774 - 19968: jis0212<<14 | 0x4C<<7 | 0x22, - 40775 - 19968: jis0212<<14 | 0x4C<<7 | 0x23, - 40778 - 19968: jis0208<<14 | 0x52<<7 | 0x4D, - 40779 - 19968: jis0208<<14 | 0x42<<7 | 0x16, - 40782 - 19968: jis0208<<14 | 0x4B<<7 | 0x39, - 40783 - 19968: jis0208<<14 | 0x4F<<7 | 0x4C, - 40786 - 19968: jis0208<<14 | 0x52<<7 | 0x4E, - 40787 - 19968: jis0212<<14 | 0x4C<<7 | 0x24, - 40788 - 19968: jis0208<<14 | 0x52<<7 | 0x4F, - 40789 - 19968: jis0212<<14 | 0x4C<<7 | 0x25, - 40790 - 19968: jis0212<<14 | 0x4C<<7 | 0x26, - 40791 - 19968: jis0212<<14 | 0x4C<<7 | 0x27, - 40792 - 19968: jis0212<<14 | 0x4C<<7 | 0x28, - 40794 - 19968: jis0212<<14 | 0x4C<<7 | 0x29, - 40797 - 19968: jis0212<<14 | 0x4C<<7 | 0x2A, - 40798 - 19968: jis0212<<14 | 0x4C<<7 | 0x2B, - 40799 - 19968: jis0208<<14 | 0x52<<7 | 0x51, - 40800 - 19968: jis0208<<14 | 0x52<<7 | 0x52, - 40801 - 19968: jis0208<<14 | 0x52<<7 | 0x53, - 40802 - 19968: jis0208<<14 | 0x2D<<7 | 0x4F, - 40803 - 19968: jis0208<<14 | 0x52<<7 | 0x50, - 40806 - 19968: jis0208<<14 | 0x52<<7 | 0x54, - 40807 - 19968: jis0208<<14 | 0x52<<7 | 0x55, - 40808 - 19968: jis0212<<14 | 0x4C<<7 | 0x2C, - 40809 - 19968: jis0212<<14 | 0x4C<<7 | 0x2D, - 40810 - 19968: jis0208<<14 | 0x52<<7 | 0x57, - 40812 - 19968: jis0208<<14 | 0x52<<7 | 0x56, - 40813 - 19968: jis0212<<14 | 0x4C<<7 | 0x2E, - 40814 - 19968: jis0212<<14 | 0x4C<<7 | 0x2F, - 40815 - 19968: jis0212<<14 | 0x4C<<7 | 0x30, - 40816 - 19968: jis0212<<14 | 0x4C<<7 | 0x31, - 40817 - 19968: jis0212<<14 | 0x4C<<7 | 0x32, - 40818 - 19968: jis0208<<14 | 0x52<<7 | 0x59, - 40819 - 19968: jis0212<<14 | 0x4C<<7 | 0x33, - 40821 - 19968: jis0212<<14 | 0x4C<<7 | 0x34, - 40822 - 19968: jis0208<<14 | 0x52<<7 | 0x5A, - 40823 - 19968: jis0208<<14 | 0x52<<7 | 0x58, - 40826 - 19968: jis0212<<14 | 0x4C<<7 | 0x35, - 40829 - 19968: jis0212<<14 | 0x4C<<7 | 0x36, - 40845 - 19968: jis0208<<14 | 0x2D<<7 | 0x15, - 40847 - 19968: jis0212<<14 | 0x4C<<7 | 0x37, - 40848 - 19968: jis0212<<14 | 0x4C<<7 | 0x38, - 40849 - 19968: jis0212<<14 | 0x4C<<7 | 0x39, - 40850 - 19968: jis0212<<14 | 0x4C<<7 | 0x3A, - 40852 - 19968: jis0212<<14 | 0x4C<<7 | 0x3B, - 40853 - 19968: jis0208<<14 | 0x52<<7 | 0x5B, - 40854 - 19968: jis0212<<14 | 0x4C<<7 | 0x3C, - 40855 - 19968: jis0212<<14 | 0x4C<<7 | 0x3D, - 40860 - 19968: jis0208<<14 | 0x52<<7 | 0x5C, - 40861 - 19968: jis0208<<14 | 0x42<<7 | 0x33, - 40862 - 19968: jis0212<<14 | 0x4C<<7 | 0x3E, - 40864 - 19968: jis0208<<14 | 0x52<<7 | 0x5D, - 40865 - 19968: jis0212<<14 | 0x4C<<7 | 0x3F, - 40866 - 19968: jis0212<<14 | 0x4C<<7 | 0x40, - 40867 - 19968: jis0212<<14 | 0x4C<<7 | 0x41, - 40869 - 19968: jis0212<<14 | 0x4C<<7 | 0x42, -} - -const encode1Low, encode1High = 8208, 9840 - -var encode1 = [...]uint16{ - 8208 - 8208: jis0208<<14 | 0x00<<7 | 0x1D, - 8213 - 8208: jis0208<<14 | 0x00<<7 | 0x1C, - 8216 - 8208: jis0208<<14 | 0x00<<7 | 0x25, - 8217 - 8208: jis0208<<14 | 0x00<<7 | 0x26, - 8220 - 8208: jis0208<<14 | 0x00<<7 | 0x27, - 8221 - 8208: jis0208<<14 | 0x00<<7 | 0x28, - 8224 - 8208: jis0208<<14 | 0x01<<7 | 0x56, - 8225 - 8208: jis0208<<14 | 0x01<<7 | 0x57, - 8229 - 8208: jis0208<<14 | 0x00<<7 | 0x24, - 8230 - 8208: jis0208<<14 | 0x00<<7 | 0x23, - 8240 - 8208: jis0208<<14 | 0x01<<7 | 0x52, - 8242 - 8208: jis0208<<14 | 0x00<<7 | 0x4B, - 8243 - 8208: jis0208<<14 | 0x00<<7 | 0x4C, - 8251 - 8208: jis0208<<14 | 0x01<<7 | 0x07, - 8451 - 8208: jis0208<<14 | 0x00<<7 | 0x4D, - 8470 - 8208: jis0208<<14 | 0x0C<<7 | 0x41, - 8481 - 8208: jis0208<<14 | 0x0C<<7 | 0x43, - 8482 - 8208: jis0212<<14 | 0x01<<7 | 0x4E, - 8491 - 8208: jis0208<<14 | 0x01<<7 | 0x51, - 8544 - 8208: jis0208<<14 | 0x0C<<7 | 0x14, - 8545 - 8208: jis0208<<14 | 0x0C<<7 | 0x15, - 8546 - 8208: jis0208<<14 | 0x0C<<7 | 0x16, - 8547 - 8208: jis0208<<14 | 0x0C<<7 | 0x17, - 8548 - 8208: jis0208<<14 | 0x0C<<7 | 0x18, - 8549 - 8208: jis0208<<14 | 0x0C<<7 | 0x19, - 8550 - 8208: jis0208<<14 | 0x0C<<7 | 0x1A, - 8551 - 8208: jis0208<<14 | 0x0C<<7 | 0x1B, - 8552 - 8208: jis0208<<14 | 0x0C<<7 | 0x1C, - 8553 - 8208: jis0208<<14 | 0x0C<<7 | 0x1D, - 8560 - 8208: jis0208<<14 | 0x5B<<7 | 0x50, - 8561 - 8208: jis0208<<14 | 0x5B<<7 | 0x51, - 8562 - 8208: jis0208<<14 | 0x5B<<7 | 0x52, - 8563 - 8208: jis0208<<14 | 0x5B<<7 | 0x53, - 8564 - 8208: jis0208<<14 | 0x5B<<7 | 0x54, - 8565 - 8208: jis0208<<14 | 0x5B<<7 | 0x55, - 8566 - 8208: jis0208<<14 | 0x5B<<7 | 0x56, - 8567 - 8208: jis0208<<14 | 0x5B<<7 | 0x57, - 8568 - 8208: jis0208<<14 | 0x5B<<7 | 0x58, - 8569 - 8208: jis0208<<14 | 0x5B<<7 | 0x59, - 8592 - 8208: jis0208<<14 | 0x01<<7 | 0x0A, - 8593 - 8208: jis0208<<14 | 0x01<<7 | 0x0B, - 8594 - 8208: jis0208<<14 | 0x01<<7 | 0x09, - 8595 - 8208: jis0208<<14 | 0x01<<7 | 0x0C, - 8658 - 8208: jis0208<<14 | 0x01<<7 | 0x2C, - 8660 - 8208: jis0208<<14 | 0x01<<7 | 0x2D, - 8704 - 8208: jis0208<<14 | 0x01<<7 | 0x2E, - 8706 - 8208: jis0208<<14 | 0x01<<7 | 0x3E, - 8707 - 8208: jis0208<<14 | 0x01<<7 | 0x2F, - 8711 - 8208: jis0208<<14 | 0x01<<7 | 0x3F, - 8712 - 8208: jis0208<<14 | 0x01<<7 | 0x19, - 8715 - 8208: jis0208<<14 | 0x01<<7 | 0x1A, - 8721 - 8208: jis0208<<14 | 0x0C<<7 | 0x53, - 8730 - 8208: jis0208<<14 | 0x01<<7 | 0x44, - 8733 - 8208: jis0208<<14 | 0x01<<7 | 0x46, - 8734 - 8208: jis0208<<14 | 0x00<<7 | 0x46, - 8735 - 8208: jis0208<<14 | 0x0C<<7 | 0x57, - 8736 - 8208: jis0208<<14 | 0x01<<7 | 0x3B, - 8741 - 8208: jis0208<<14 | 0x00<<7 | 0x21, - 8743 - 8208: jis0208<<14 | 0x01<<7 | 0x29, - 8744 - 8208: jis0208<<14 | 0x01<<7 | 0x2A, - 8745 - 8208: jis0208<<14 | 0x01<<7 | 0x20, - 8746 - 8208: jis0208<<14 | 0x01<<7 | 0x1F, - 8747 - 8208: jis0208<<14 | 0x01<<7 | 0x48, - 8748 - 8208: jis0208<<14 | 0x01<<7 | 0x49, - 8750 - 8208: jis0208<<14 | 0x0C<<7 | 0x52, - 8756 - 8208: jis0208<<14 | 0x00<<7 | 0x47, - 8757 - 8208: jis0208<<14 | 0x01<<7 | 0x47, - 8765 - 8208: jis0208<<14 | 0x01<<7 | 0x45, - 8786 - 8208: jis0208<<14 | 0x01<<7 | 0x41, - 8800 - 8208: jis0208<<14 | 0x00<<7 | 0x41, - 8801 - 8208: jis0208<<14 | 0x01<<7 | 0x40, - 8806 - 8208: jis0208<<14 | 0x00<<7 | 0x44, - 8807 - 8208: jis0208<<14 | 0x00<<7 | 0x45, - 8810 - 8208: jis0208<<14 | 0x01<<7 | 0x42, - 8811 - 8208: jis0208<<14 | 0x01<<7 | 0x43, - 8834 - 8208: jis0208<<14 | 0x01<<7 | 0x1D, - 8835 - 8208: jis0208<<14 | 0x01<<7 | 0x1E, - 8838 - 8208: jis0208<<14 | 0x01<<7 | 0x1B, - 8839 - 8208: jis0208<<14 | 0x01<<7 | 0x1C, - 8869 - 8208: jis0208<<14 | 0x01<<7 | 0x3C, - 8895 - 8208: jis0208<<14 | 0x0C<<7 | 0x58, - 8978 - 8208: jis0208<<14 | 0x01<<7 | 0x3D, - 9312 - 8208: jis0208<<14 | 0x0C<<7 | 0x00, - 9313 - 8208: jis0208<<14 | 0x0C<<7 | 0x01, - 9314 - 8208: jis0208<<14 | 0x0C<<7 | 0x02, - 9315 - 8208: jis0208<<14 | 0x0C<<7 | 0x03, - 9316 - 8208: jis0208<<14 | 0x0C<<7 | 0x04, - 9317 - 8208: jis0208<<14 | 0x0C<<7 | 0x05, - 9318 - 8208: jis0208<<14 | 0x0C<<7 | 0x06, - 9319 - 8208: jis0208<<14 | 0x0C<<7 | 0x07, - 9320 - 8208: jis0208<<14 | 0x0C<<7 | 0x08, - 9321 - 8208: jis0208<<14 | 0x0C<<7 | 0x09, - 9322 - 8208: jis0208<<14 | 0x0C<<7 | 0x0A, - 9323 - 8208: jis0208<<14 | 0x0C<<7 | 0x0B, - 9324 - 8208: jis0208<<14 | 0x0C<<7 | 0x0C, - 9325 - 8208: jis0208<<14 | 0x0C<<7 | 0x0D, - 9326 - 8208: jis0208<<14 | 0x0C<<7 | 0x0E, - 9327 - 8208: jis0208<<14 | 0x0C<<7 | 0x0F, - 9328 - 8208: jis0208<<14 | 0x0C<<7 | 0x10, - 9329 - 8208: jis0208<<14 | 0x0C<<7 | 0x11, - 9330 - 8208: jis0208<<14 | 0x0C<<7 | 0x12, - 9331 - 8208: jis0208<<14 | 0x0C<<7 | 0x13, - 9472 - 8208: jis0208<<14 | 0x07<<7 | 0x00, - 9473 - 8208: jis0208<<14 | 0x07<<7 | 0x0B, - 9474 - 8208: jis0208<<14 | 0x07<<7 | 0x01, - 9475 - 8208: jis0208<<14 | 0x07<<7 | 0x0C, - 9484 - 8208: jis0208<<14 | 0x07<<7 | 0x02, - 9487 - 8208: jis0208<<14 | 0x07<<7 | 0x0D, - 9488 - 8208: jis0208<<14 | 0x07<<7 | 0x03, - 9491 - 8208: jis0208<<14 | 0x07<<7 | 0x0E, - 9492 - 8208: jis0208<<14 | 0x07<<7 | 0x05, - 9495 - 8208: jis0208<<14 | 0x07<<7 | 0x10, - 9496 - 8208: jis0208<<14 | 0x07<<7 | 0x04, - 9499 - 8208: jis0208<<14 | 0x07<<7 | 0x0F, - 9500 - 8208: jis0208<<14 | 0x07<<7 | 0x06, - 9501 - 8208: jis0208<<14 | 0x07<<7 | 0x1B, - 9504 - 8208: jis0208<<14 | 0x07<<7 | 0x16, - 9507 - 8208: jis0208<<14 | 0x07<<7 | 0x11, - 9508 - 8208: jis0208<<14 | 0x07<<7 | 0x08, - 9509 - 8208: jis0208<<14 | 0x07<<7 | 0x1D, - 9512 - 8208: jis0208<<14 | 0x07<<7 | 0x18, - 9515 - 8208: jis0208<<14 | 0x07<<7 | 0x13, - 9516 - 8208: jis0208<<14 | 0x07<<7 | 0x07, - 9519 - 8208: jis0208<<14 | 0x07<<7 | 0x17, - 9520 - 8208: jis0208<<14 | 0x07<<7 | 0x1C, - 9523 - 8208: jis0208<<14 | 0x07<<7 | 0x12, - 9524 - 8208: jis0208<<14 | 0x07<<7 | 0x09, - 9527 - 8208: jis0208<<14 | 0x07<<7 | 0x19, - 9528 - 8208: jis0208<<14 | 0x07<<7 | 0x1E, - 9531 - 8208: jis0208<<14 | 0x07<<7 | 0x14, - 9532 - 8208: jis0208<<14 | 0x07<<7 | 0x0A, - 9535 - 8208: jis0208<<14 | 0x07<<7 | 0x1A, - 9538 - 8208: jis0208<<14 | 0x07<<7 | 0x1F, - 9547 - 8208: jis0208<<14 | 0x07<<7 | 0x15, - 9632 - 8208: jis0208<<14 | 0x01<<7 | 0x02, - 9633 - 8208: jis0208<<14 | 0x01<<7 | 0x01, - 9650 - 8208: jis0208<<14 | 0x01<<7 | 0x04, - 9651 - 8208: jis0208<<14 | 0x01<<7 | 0x03, - 9660 - 8208: jis0208<<14 | 0x01<<7 | 0x06, - 9661 - 8208: jis0208<<14 | 0x01<<7 | 0x05, - 9670 - 8208: jis0208<<14 | 0x01<<7 | 0x00, - 9671 - 8208: jis0208<<14 | 0x00<<7 | 0x5D, - 9675 - 8208: jis0208<<14 | 0x00<<7 | 0x5A, - 9678 - 8208: jis0208<<14 | 0x00<<7 | 0x5C, - 9679 - 8208: jis0208<<14 | 0x00<<7 | 0x5B, - 9711 - 8208: jis0208<<14 | 0x01<<7 | 0x5D, - 9733 - 8208: jis0208<<14 | 0x00<<7 | 0x59, - 9734 - 8208: jis0208<<14 | 0x00<<7 | 0x58, - 9792 - 8208: jis0208<<14 | 0x00<<7 | 0x49, - 9794 - 8208: jis0208<<14 | 0x00<<7 | 0x48, - 9834 - 8208: jis0208<<14 | 0x01<<7 | 0x55, - 9837 - 8208: jis0208<<14 | 0x01<<7 | 0x54, - 9839 - 8208: jis0208<<14 | 0x01<<7 | 0x53, -} - -const encode2Low, encode2High = 12288, 13262 - -var encode2 = [...]uint16{ - 12288 - 12288: jis0208<<14 | 0x00<<7 | 0x00, - 12289 - 12288: jis0208<<14 | 0x00<<7 | 0x01, - 12290 - 12288: jis0208<<14 | 0x00<<7 | 0x02, - 12291 - 12288: jis0208<<14 | 0x00<<7 | 0x16, - 12293 - 12288: jis0208<<14 | 0x00<<7 | 0x18, - 12294 - 12288: jis0208<<14 | 0x00<<7 | 0x19, - 12295 - 12288: jis0208<<14 | 0x00<<7 | 0x1A, - 12296 - 12288: jis0208<<14 | 0x00<<7 | 0x31, - 12297 - 12288: jis0208<<14 | 0x00<<7 | 0x32, - 12298 - 12288: jis0208<<14 | 0x00<<7 | 0x33, - 12299 - 12288: jis0208<<14 | 0x00<<7 | 0x34, - 12300 - 12288: jis0208<<14 | 0x00<<7 | 0x35, - 12301 - 12288: jis0208<<14 | 0x00<<7 | 0x36, - 12302 - 12288: jis0208<<14 | 0x00<<7 | 0x37, - 12303 - 12288: jis0208<<14 | 0x00<<7 | 0x38, - 12304 - 12288: jis0208<<14 | 0x00<<7 | 0x39, - 12305 - 12288: jis0208<<14 | 0x00<<7 | 0x3A, - 12306 - 12288: jis0208<<14 | 0x01<<7 | 0x08, - 12307 - 12288: jis0208<<14 | 0x01<<7 | 0x0D, - 12308 - 12288: jis0208<<14 | 0x00<<7 | 0x2B, - 12309 - 12288: jis0208<<14 | 0x00<<7 | 0x2C, - 12317 - 12288: jis0208<<14 | 0x0C<<7 | 0x3F, - 12319 - 12288: jis0208<<14 | 0x0C<<7 | 0x40, - 12353 - 12288: jis0208<<14 | 0x03<<7 | 0x00, - 12354 - 12288: jis0208<<14 | 0x03<<7 | 0x01, - 12355 - 12288: jis0208<<14 | 0x03<<7 | 0x02, - 12356 - 12288: jis0208<<14 | 0x03<<7 | 0x03, - 12357 - 12288: jis0208<<14 | 0x03<<7 | 0x04, - 12358 - 12288: jis0208<<14 | 0x03<<7 | 0x05, - 12359 - 12288: jis0208<<14 | 0x03<<7 | 0x06, - 12360 - 12288: jis0208<<14 | 0x03<<7 | 0x07, - 12361 - 12288: jis0208<<14 | 0x03<<7 | 0x08, - 12362 - 12288: jis0208<<14 | 0x03<<7 | 0x09, - 12363 - 12288: jis0208<<14 | 0x03<<7 | 0x0A, - 12364 - 12288: jis0208<<14 | 0x03<<7 | 0x0B, - 12365 - 12288: jis0208<<14 | 0x03<<7 | 0x0C, - 12366 - 12288: jis0208<<14 | 0x03<<7 | 0x0D, - 12367 - 12288: jis0208<<14 | 0x03<<7 | 0x0E, - 12368 - 12288: jis0208<<14 | 0x03<<7 | 0x0F, - 12369 - 12288: jis0208<<14 | 0x03<<7 | 0x10, - 12370 - 12288: jis0208<<14 | 0x03<<7 | 0x11, - 12371 - 12288: jis0208<<14 | 0x03<<7 | 0x12, - 12372 - 12288: jis0208<<14 | 0x03<<7 | 0x13, - 12373 - 12288: jis0208<<14 | 0x03<<7 | 0x14, - 12374 - 12288: jis0208<<14 | 0x03<<7 | 0x15, - 12375 - 12288: jis0208<<14 | 0x03<<7 | 0x16, - 12376 - 12288: jis0208<<14 | 0x03<<7 | 0x17, - 12377 - 12288: jis0208<<14 | 0x03<<7 | 0x18, - 12378 - 12288: jis0208<<14 | 0x03<<7 | 0x19, - 12379 - 12288: jis0208<<14 | 0x03<<7 | 0x1A, - 12380 - 12288: jis0208<<14 | 0x03<<7 | 0x1B, - 12381 - 12288: jis0208<<14 | 0x03<<7 | 0x1C, - 12382 - 12288: jis0208<<14 | 0x03<<7 | 0x1D, - 12383 - 12288: jis0208<<14 | 0x03<<7 | 0x1E, - 12384 - 12288: jis0208<<14 | 0x03<<7 | 0x1F, - 12385 - 12288: jis0208<<14 | 0x03<<7 | 0x20, - 12386 - 12288: jis0208<<14 | 0x03<<7 | 0x21, - 12387 - 12288: jis0208<<14 | 0x03<<7 | 0x22, - 12388 - 12288: jis0208<<14 | 0x03<<7 | 0x23, - 12389 - 12288: jis0208<<14 | 0x03<<7 | 0x24, - 12390 - 12288: jis0208<<14 | 0x03<<7 | 0x25, - 12391 - 12288: jis0208<<14 | 0x03<<7 | 0x26, - 12392 - 12288: jis0208<<14 | 0x03<<7 | 0x27, - 12393 - 12288: jis0208<<14 | 0x03<<7 | 0x28, - 12394 - 12288: jis0208<<14 | 0x03<<7 | 0x29, - 12395 - 12288: jis0208<<14 | 0x03<<7 | 0x2A, - 12396 - 12288: jis0208<<14 | 0x03<<7 | 0x2B, - 12397 - 12288: jis0208<<14 | 0x03<<7 | 0x2C, - 12398 - 12288: jis0208<<14 | 0x03<<7 | 0x2D, - 12399 - 12288: jis0208<<14 | 0x03<<7 | 0x2E, - 12400 - 12288: jis0208<<14 | 0x03<<7 | 0x2F, - 12401 - 12288: jis0208<<14 | 0x03<<7 | 0x30, - 12402 - 12288: jis0208<<14 | 0x03<<7 | 0x31, - 12403 - 12288: jis0208<<14 | 0x03<<7 | 0x32, - 12404 - 12288: jis0208<<14 | 0x03<<7 | 0x33, - 12405 - 12288: jis0208<<14 | 0x03<<7 | 0x34, - 12406 - 12288: jis0208<<14 | 0x03<<7 | 0x35, - 12407 - 12288: jis0208<<14 | 0x03<<7 | 0x36, - 12408 - 12288: jis0208<<14 | 0x03<<7 | 0x37, - 12409 - 12288: jis0208<<14 | 0x03<<7 | 0x38, - 12410 - 12288: jis0208<<14 | 0x03<<7 | 0x39, - 12411 - 12288: jis0208<<14 | 0x03<<7 | 0x3A, - 12412 - 12288: jis0208<<14 | 0x03<<7 | 0x3B, - 12413 - 12288: jis0208<<14 | 0x03<<7 | 0x3C, - 12414 - 12288: jis0208<<14 | 0x03<<7 | 0x3D, - 12415 - 12288: jis0208<<14 | 0x03<<7 | 0x3E, - 12416 - 12288: jis0208<<14 | 0x03<<7 | 0x3F, - 12417 - 12288: jis0208<<14 | 0x03<<7 | 0x40, - 12418 - 12288: jis0208<<14 | 0x03<<7 | 0x41, - 12419 - 12288: jis0208<<14 | 0x03<<7 | 0x42, - 12420 - 12288: jis0208<<14 | 0x03<<7 | 0x43, - 12421 - 12288: jis0208<<14 | 0x03<<7 | 0x44, - 12422 - 12288: jis0208<<14 | 0x03<<7 | 0x45, - 12423 - 12288: jis0208<<14 | 0x03<<7 | 0x46, - 12424 - 12288: jis0208<<14 | 0x03<<7 | 0x47, - 12425 - 12288: jis0208<<14 | 0x03<<7 | 0x48, - 12426 - 12288: jis0208<<14 | 0x03<<7 | 0x49, - 12427 - 12288: jis0208<<14 | 0x03<<7 | 0x4A, - 12428 - 12288: jis0208<<14 | 0x03<<7 | 0x4B, - 12429 - 12288: jis0208<<14 | 0x03<<7 | 0x4C, - 12430 - 12288: jis0208<<14 | 0x03<<7 | 0x4D, - 12431 - 12288: jis0208<<14 | 0x03<<7 | 0x4E, - 12432 - 12288: jis0208<<14 | 0x03<<7 | 0x4F, - 12433 - 12288: jis0208<<14 | 0x03<<7 | 0x50, - 12434 - 12288: jis0208<<14 | 0x03<<7 | 0x51, - 12435 - 12288: jis0208<<14 | 0x03<<7 | 0x52, - 12443 - 12288: jis0208<<14 | 0x00<<7 | 0x0A, - 12444 - 12288: jis0208<<14 | 0x00<<7 | 0x0B, - 12445 - 12288: jis0208<<14 | 0x00<<7 | 0x14, - 12446 - 12288: jis0208<<14 | 0x00<<7 | 0x15, - 12449 - 12288: jis0208<<14 | 0x04<<7 | 0x00, - 12450 - 12288: jis0208<<14 | 0x04<<7 | 0x01, - 12451 - 12288: jis0208<<14 | 0x04<<7 | 0x02, - 12452 - 12288: jis0208<<14 | 0x04<<7 | 0x03, - 12453 - 12288: jis0208<<14 | 0x04<<7 | 0x04, - 12454 - 12288: jis0208<<14 | 0x04<<7 | 0x05, - 12455 - 12288: jis0208<<14 | 0x04<<7 | 0x06, - 12456 - 12288: jis0208<<14 | 0x04<<7 | 0x07, - 12457 - 12288: jis0208<<14 | 0x04<<7 | 0x08, - 12458 - 12288: jis0208<<14 | 0x04<<7 | 0x09, - 12459 - 12288: jis0208<<14 | 0x04<<7 | 0x0A, - 12460 - 12288: jis0208<<14 | 0x04<<7 | 0x0B, - 12461 - 12288: jis0208<<14 | 0x04<<7 | 0x0C, - 12462 - 12288: jis0208<<14 | 0x04<<7 | 0x0D, - 12463 - 12288: jis0208<<14 | 0x04<<7 | 0x0E, - 12464 - 12288: jis0208<<14 | 0x04<<7 | 0x0F, - 12465 - 12288: jis0208<<14 | 0x04<<7 | 0x10, - 12466 - 12288: jis0208<<14 | 0x04<<7 | 0x11, - 12467 - 12288: jis0208<<14 | 0x04<<7 | 0x12, - 12468 - 12288: jis0208<<14 | 0x04<<7 | 0x13, - 12469 - 12288: jis0208<<14 | 0x04<<7 | 0x14, - 12470 - 12288: jis0208<<14 | 0x04<<7 | 0x15, - 12471 - 12288: jis0208<<14 | 0x04<<7 | 0x16, - 12472 - 12288: jis0208<<14 | 0x04<<7 | 0x17, - 12473 - 12288: jis0208<<14 | 0x04<<7 | 0x18, - 12474 - 12288: jis0208<<14 | 0x04<<7 | 0x19, - 12475 - 12288: jis0208<<14 | 0x04<<7 | 0x1A, - 12476 - 12288: jis0208<<14 | 0x04<<7 | 0x1B, - 12477 - 12288: jis0208<<14 | 0x04<<7 | 0x1C, - 12478 - 12288: jis0208<<14 | 0x04<<7 | 0x1D, - 12479 - 12288: jis0208<<14 | 0x04<<7 | 0x1E, - 12480 - 12288: jis0208<<14 | 0x04<<7 | 0x1F, - 12481 - 12288: jis0208<<14 | 0x04<<7 | 0x20, - 12482 - 12288: jis0208<<14 | 0x04<<7 | 0x21, - 12483 - 12288: jis0208<<14 | 0x04<<7 | 0x22, - 12484 - 12288: jis0208<<14 | 0x04<<7 | 0x23, - 12485 - 12288: jis0208<<14 | 0x04<<7 | 0x24, - 12486 - 12288: jis0208<<14 | 0x04<<7 | 0x25, - 12487 - 12288: jis0208<<14 | 0x04<<7 | 0x26, - 12488 - 12288: jis0208<<14 | 0x04<<7 | 0x27, - 12489 - 12288: jis0208<<14 | 0x04<<7 | 0x28, - 12490 - 12288: jis0208<<14 | 0x04<<7 | 0x29, - 12491 - 12288: jis0208<<14 | 0x04<<7 | 0x2A, - 12492 - 12288: jis0208<<14 | 0x04<<7 | 0x2B, - 12493 - 12288: jis0208<<14 | 0x04<<7 | 0x2C, - 12494 - 12288: jis0208<<14 | 0x04<<7 | 0x2D, - 12495 - 12288: jis0208<<14 | 0x04<<7 | 0x2E, - 12496 - 12288: jis0208<<14 | 0x04<<7 | 0x2F, - 12497 - 12288: jis0208<<14 | 0x04<<7 | 0x30, - 12498 - 12288: jis0208<<14 | 0x04<<7 | 0x31, - 12499 - 12288: jis0208<<14 | 0x04<<7 | 0x32, - 12500 - 12288: jis0208<<14 | 0x04<<7 | 0x33, - 12501 - 12288: jis0208<<14 | 0x04<<7 | 0x34, - 12502 - 12288: jis0208<<14 | 0x04<<7 | 0x35, - 12503 - 12288: jis0208<<14 | 0x04<<7 | 0x36, - 12504 - 12288: jis0208<<14 | 0x04<<7 | 0x37, - 12505 - 12288: jis0208<<14 | 0x04<<7 | 0x38, - 12506 - 12288: jis0208<<14 | 0x04<<7 | 0x39, - 12507 - 12288: jis0208<<14 | 0x04<<7 | 0x3A, - 12508 - 12288: jis0208<<14 | 0x04<<7 | 0x3B, - 12509 - 12288: jis0208<<14 | 0x04<<7 | 0x3C, - 12510 - 12288: jis0208<<14 | 0x04<<7 | 0x3D, - 12511 - 12288: jis0208<<14 | 0x04<<7 | 0x3E, - 12512 - 12288: jis0208<<14 | 0x04<<7 | 0x3F, - 12513 - 12288: jis0208<<14 | 0x04<<7 | 0x40, - 12514 - 12288: jis0208<<14 | 0x04<<7 | 0x41, - 12515 - 12288: jis0208<<14 | 0x04<<7 | 0x42, - 12516 - 12288: jis0208<<14 | 0x04<<7 | 0x43, - 12517 - 12288: jis0208<<14 | 0x04<<7 | 0x44, - 12518 - 12288: jis0208<<14 | 0x04<<7 | 0x45, - 12519 - 12288: jis0208<<14 | 0x04<<7 | 0x46, - 12520 - 12288: jis0208<<14 | 0x04<<7 | 0x47, - 12521 - 12288: jis0208<<14 | 0x04<<7 | 0x48, - 12522 - 12288: jis0208<<14 | 0x04<<7 | 0x49, - 12523 - 12288: jis0208<<14 | 0x04<<7 | 0x4A, - 12524 - 12288: jis0208<<14 | 0x04<<7 | 0x4B, - 12525 - 12288: jis0208<<14 | 0x04<<7 | 0x4C, - 12526 - 12288: jis0208<<14 | 0x04<<7 | 0x4D, - 12527 - 12288: jis0208<<14 | 0x04<<7 | 0x4E, - 12528 - 12288: jis0208<<14 | 0x04<<7 | 0x4F, - 12529 - 12288: jis0208<<14 | 0x04<<7 | 0x50, - 12530 - 12288: jis0208<<14 | 0x04<<7 | 0x51, - 12531 - 12288: jis0208<<14 | 0x04<<7 | 0x52, - 12532 - 12288: jis0208<<14 | 0x04<<7 | 0x53, - 12533 - 12288: jis0208<<14 | 0x04<<7 | 0x54, - 12534 - 12288: jis0208<<14 | 0x04<<7 | 0x55, - 12539 - 12288: jis0208<<14 | 0x00<<7 | 0x05, - 12540 - 12288: jis0208<<14 | 0x00<<7 | 0x1B, - 12541 - 12288: jis0208<<14 | 0x00<<7 | 0x12, - 12542 - 12288: jis0208<<14 | 0x00<<7 | 0x13, - 12849 - 12288: jis0208<<14 | 0x0C<<7 | 0x49, - 12850 - 12288: jis0208<<14 | 0x0C<<7 | 0x4A, - 12857 - 12288: jis0208<<14 | 0x0C<<7 | 0x4B, - 12964 - 12288: jis0208<<14 | 0x0C<<7 | 0x44, - 12965 - 12288: jis0208<<14 | 0x0C<<7 | 0x45, - 12966 - 12288: jis0208<<14 | 0x0C<<7 | 0x46, - 12967 - 12288: jis0208<<14 | 0x0C<<7 | 0x47, - 12968 - 12288: jis0208<<14 | 0x0C<<7 | 0x48, - 13059 - 12288: jis0208<<14 | 0x0C<<7 | 0x25, - 13069 - 12288: jis0208<<14 | 0x0C<<7 | 0x29, - 13076 - 12288: jis0208<<14 | 0x0C<<7 | 0x20, - 13080 - 12288: jis0208<<14 | 0x0C<<7 | 0x23, - 13090 - 12288: jis0208<<14 | 0x0C<<7 | 0x21, - 13091 - 12288: jis0208<<14 | 0x0C<<7 | 0x2B, - 13094 - 12288: jis0208<<14 | 0x0C<<7 | 0x2A, - 13095 - 12288: jis0208<<14 | 0x0C<<7 | 0x24, - 13099 - 12288: jis0208<<14 | 0x0C<<7 | 0x2C, - 13110 - 12288: jis0208<<14 | 0x0C<<7 | 0x26, - 13115 - 12288: jis0208<<14 | 0x0C<<7 | 0x2E, - 13129 - 12288: jis0208<<14 | 0x0C<<7 | 0x1F, - 13130 - 12288: jis0208<<14 | 0x0C<<7 | 0x2D, - 13133 - 12288: jis0208<<14 | 0x0C<<7 | 0x22, - 13137 - 12288: jis0208<<14 | 0x0C<<7 | 0x27, - 13143 - 12288: jis0208<<14 | 0x0C<<7 | 0x28, - 13179 - 12288: jis0208<<14 | 0x0C<<7 | 0x3E, - 13180 - 12288: jis0208<<14 | 0x0C<<7 | 0x4E, - 13181 - 12288: jis0208<<14 | 0x0C<<7 | 0x4D, - 13182 - 12288: jis0208<<14 | 0x0C<<7 | 0x4C, - 13198 - 12288: jis0208<<14 | 0x0C<<7 | 0x32, - 13199 - 12288: jis0208<<14 | 0x0C<<7 | 0x33, - 13212 - 12288: jis0208<<14 | 0x0C<<7 | 0x2F, - 13213 - 12288: jis0208<<14 | 0x0C<<7 | 0x30, - 13214 - 12288: jis0208<<14 | 0x0C<<7 | 0x31, - 13217 - 12288: jis0208<<14 | 0x0C<<7 | 0x35, - 13252 - 12288: jis0208<<14 | 0x0C<<7 | 0x34, - 13261 - 12288: jis0208<<14 | 0x0C<<7 | 0x42, -} - -const encode3Low, encode3High = 161, 1120 - -var encode3 = [...]uint16{ - 161 - 161: jis0212<<14 | 0x01<<7 | 0x21, - 164 - 161: jis0212<<14 | 0x01<<7 | 0x4F, - 166 - 161: jis0212<<14 | 0x01<<7 | 0x22, - 167 - 161: jis0208<<14 | 0x00<<7 | 0x57, - 168 - 161: jis0208<<14 | 0x00<<7 | 0x0E, - 169 - 161: jis0212<<14 | 0x01<<7 | 0x4C, - 170 - 161: jis0212<<14 | 0x01<<7 | 0x4B, - 174 - 161: jis0212<<14 | 0x01<<7 | 0x4D, - 175 - 161: jis0212<<14 | 0x01<<7 | 0x13, - 176 - 161: jis0208<<14 | 0x00<<7 | 0x4A, - 177 - 161: jis0208<<14 | 0x00<<7 | 0x3D, - 180 - 161: jis0208<<14 | 0x00<<7 | 0x0C, - 182 - 161: jis0208<<14 | 0x01<<7 | 0x58, - 184 - 161: jis0212<<14 | 0x01<<7 | 0x10, - 186 - 161: jis0212<<14 | 0x01<<7 | 0x4A, - 191 - 161: jis0212<<14 | 0x01<<7 | 0x23, - 192 - 161: jis0212<<14 | 0x09<<7 | 0x01, - 193 - 161: jis0212<<14 | 0x09<<7 | 0x00, - 194 - 161: jis0212<<14 | 0x09<<7 | 0x03, - 195 - 161: jis0212<<14 | 0x09<<7 | 0x09, - 196 - 161: jis0212<<14 | 0x09<<7 | 0x02, - 197 - 161: jis0212<<14 | 0x09<<7 | 0x08, - 198 - 161: jis0212<<14 | 0x08<<7 | 0x00, - 199 - 161: jis0212<<14 | 0x09<<7 | 0x0D, - 200 - 161: jis0212<<14 | 0x09<<7 | 0x11, - 201 - 161: jis0212<<14 | 0x09<<7 | 0x10, - 202 - 161: jis0212<<14 | 0x09<<7 | 0x13, - 203 - 161: jis0212<<14 | 0x09<<7 | 0x12, - 204 - 161: jis0212<<14 | 0x09<<7 | 0x1F, - 205 - 161: jis0212<<14 | 0x09<<7 | 0x1E, - 206 - 161: jis0212<<14 | 0x09<<7 | 0x21, - 207 - 161: jis0212<<14 | 0x09<<7 | 0x20, - 209 - 161: jis0212<<14 | 0x09<<7 | 0x2F, - 210 - 161: jis0212<<14 | 0x09<<7 | 0x31, - 211 - 161: jis0212<<14 | 0x09<<7 | 0x30, - 212 - 161: jis0212<<14 | 0x09<<7 | 0x33, - 213 - 161: jis0212<<14 | 0x09<<7 | 0x37, - 214 - 161: jis0212<<14 | 0x09<<7 | 0x32, - 215 - 161: jis0208<<14 | 0x00<<7 | 0x3E, - 216 - 161: jis0212<<14 | 0x08<<7 | 0x0B, - 217 - 161: jis0212<<14 | 0x09<<7 | 0x42, - 218 - 161: jis0212<<14 | 0x09<<7 | 0x41, - 219 - 161: jis0212<<14 | 0x09<<7 | 0x44, - 220 - 161: jis0212<<14 | 0x09<<7 | 0x43, - 221 - 161: jis0212<<14 | 0x09<<7 | 0x51, - 222 - 161: jis0212<<14 | 0x08<<7 | 0x0F, - 223 - 161: jis0212<<14 | 0x08<<7 | 0x2D, - 224 - 161: jis0212<<14 | 0x0A<<7 | 0x01, - 225 - 161: jis0212<<14 | 0x0A<<7 | 0x00, - 226 - 161: jis0212<<14 | 0x0A<<7 | 0x03, - 227 - 161: jis0212<<14 | 0x0A<<7 | 0x09, - 228 - 161: jis0212<<14 | 0x0A<<7 | 0x02, - 229 - 161: jis0212<<14 | 0x0A<<7 | 0x08, - 230 - 161: jis0212<<14 | 0x08<<7 | 0x20, - 231 - 161: jis0212<<14 | 0x0A<<7 | 0x0D, - 232 - 161: jis0212<<14 | 0x0A<<7 | 0x11, - 233 - 161: jis0212<<14 | 0x0A<<7 | 0x10, - 234 - 161: jis0212<<14 | 0x0A<<7 | 0x13, - 235 - 161: jis0212<<14 | 0x0A<<7 | 0x12, - 236 - 161: jis0212<<14 | 0x0A<<7 | 0x1F, - 237 - 161: jis0212<<14 | 0x0A<<7 | 0x1E, - 238 - 161: jis0212<<14 | 0x0A<<7 | 0x21, - 239 - 161: jis0212<<14 | 0x0A<<7 | 0x20, - 240 - 161: jis0212<<14 | 0x08<<7 | 0x22, - 241 - 161: jis0212<<14 | 0x0A<<7 | 0x2F, - 242 - 161: jis0212<<14 | 0x0A<<7 | 0x31, - 243 - 161: jis0212<<14 | 0x0A<<7 | 0x30, - 244 - 161: jis0212<<14 | 0x0A<<7 | 0x33, - 245 - 161: jis0212<<14 | 0x0A<<7 | 0x37, - 246 - 161: jis0212<<14 | 0x0A<<7 | 0x32, - 247 - 161: jis0208<<14 | 0x00<<7 | 0x3F, - 248 - 161: jis0212<<14 | 0x08<<7 | 0x2B, - 249 - 161: jis0212<<14 | 0x0A<<7 | 0x42, - 250 - 161: jis0212<<14 | 0x0A<<7 | 0x41, - 251 - 161: jis0212<<14 | 0x0A<<7 | 0x44, - 252 - 161: jis0212<<14 | 0x0A<<7 | 0x43, - 253 - 161: jis0212<<14 | 0x0A<<7 | 0x51, - 254 - 161: jis0212<<14 | 0x08<<7 | 0x2F, - 255 - 161: jis0212<<14 | 0x0A<<7 | 0x52, - 256 - 161: jis0212<<14 | 0x09<<7 | 0x06, - 257 - 161: jis0212<<14 | 0x0A<<7 | 0x06, - 258 - 161: jis0212<<14 | 0x09<<7 | 0x04, - 259 - 161: jis0212<<14 | 0x0A<<7 | 0x04, - 260 - 161: jis0212<<14 | 0x09<<7 | 0x07, - 261 - 161: jis0212<<14 | 0x0A<<7 | 0x07, - 262 - 161: jis0212<<14 | 0x09<<7 | 0x0A, - 263 - 161: jis0212<<14 | 0x0A<<7 | 0x0A, - 264 - 161: jis0212<<14 | 0x09<<7 | 0x0B, - 265 - 161: jis0212<<14 | 0x0A<<7 | 0x0B, - 266 - 161: jis0212<<14 | 0x09<<7 | 0x0E, - 267 - 161: jis0212<<14 | 0x0A<<7 | 0x0E, - 268 - 161: jis0212<<14 | 0x09<<7 | 0x0C, - 269 - 161: jis0212<<14 | 0x0A<<7 | 0x0C, - 270 - 161: jis0212<<14 | 0x09<<7 | 0x0F, - 271 - 161: jis0212<<14 | 0x0A<<7 | 0x0F, - 272 - 161: jis0212<<14 | 0x08<<7 | 0x01, - 273 - 161: jis0212<<14 | 0x08<<7 | 0x21, - 274 - 161: jis0212<<14 | 0x09<<7 | 0x16, - 275 - 161: jis0212<<14 | 0x0A<<7 | 0x16, - 278 - 161: jis0212<<14 | 0x09<<7 | 0x15, - 279 - 161: jis0212<<14 | 0x0A<<7 | 0x15, - 280 - 161: jis0212<<14 | 0x09<<7 | 0x17, - 281 - 161: jis0212<<14 | 0x0A<<7 | 0x17, - 282 - 161: jis0212<<14 | 0x09<<7 | 0x14, - 283 - 161: jis0212<<14 | 0x0A<<7 | 0x14, - 284 - 161: jis0212<<14 | 0x09<<7 | 0x19, - 285 - 161: jis0212<<14 | 0x0A<<7 | 0x19, - 286 - 161: jis0212<<14 | 0x09<<7 | 0x1A, - 287 - 161: jis0212<<14 | 0x0A<<7 | 0x1A, - 288 - 161: jis0212<<14 | 0x09<<7 | 0x1C, - 289 - 161: jis0212<<14 | 0x0A<<7 | 0x1C, - 290 - 161: jis0212<<14 | 0x09<<7 | 0x1B, - 292 - 161: jis0212<<14 | 0x09<<7 | 0x1D, - 293 - 161: jis0212<<14 | 0x0A<<7 | 0x1D, - 294 - 161: jis0212<<14 | 0x08<<7 | 0x03, - 295 - 161: jis0212<<14 | 0x08<<7 | 0x23, - 296 - 161: jis0212<<14 | 0x09<<7 | 0x26, - 297 - 161: jis0212<<14 | 0x0A<<7 | 0x26, - 298 - 161: jis0212<<14 | 0x09<<7 | 0x24, - 299 - 161: jis0212<<14 | 0x0A<<7 | 0x24, - 302 - 161: jis0212<<14 | 0x09<<7 | 0x25, - 303 - 161: jis0212<<14 | 0x0A<<7 | 0x25, - 304 - 161: jis0212<<14 | 0x09<<7 | 0x23, - 305 - 161: jis0212<<14 | 0x08<<7 | 0x24, - 306 - 161: jis0212<<14 | 0x08<<7 | 0x05, - 307 - 161: jis0212<<14 | 0x08<<7 | 0x25, - 308 - 161: jis0212<<14 | 0x09<<7 | 0x27, - 309 - 161: jis0212<<14 | 0x0A<<7 | 0x27, - 310 - 161: jis0212<<14 | 0x09<<7 | 0x28, - 311 - 161: jis0212<<14 | 0x0A<<7 | 0x28, - 312 - 161: jis0212<<14 | 0x08<<7 | 0x26, - 313 - 161: jis0212<<14 | 0x09<<7 | 0x29, - 314 - 161: jis0212<<14 | 0x0A<<7 | 0x29, - 315 - 161: jis0212<<14 | 0x09<<7 | 0x2B, - 316 - 161: jis0212<<14 | 0x0A<<7 | 0x2B, - 317 - 161: jis0212<<14 | 0x09<<7 | 0x2A, - 318 - 161: jis0212<<14 | 0x0A<<7 | 0x2A, - 319 - 161: jis0212<<14 | 0x08<<7 | 0x08, - 320 - 161: jis0212<<14 | 0x08<<7 | 0x28, - 321 - 161: jis0212<<14 | 0x08<<7 | 0x07, - 322 - 161: jis0212<<14 | 0x08<<7 | 0x27, - 323 - 161: jis0212<<14 | 0x09<<7 | 0x2C, - 324 - 161: jis0212<<14 | 0x0A<<7 | 0x2C, - 325 - 161: jis0212<<14 | 0x09<<7 | 0x2E, - 326 - 161: jis0212<<14 | 0x0A<<7 | 0x2E, - 327 - 161: jis0212<<14 | 0x09<<7 | 0x2D, - 328 - 161: jis0212<<14 | 0x0A<<7 | 0x2D, - 329 - 161: jis0212<<14 | 0x08<<7 | 0x29, - 330 - 161: jis0212<<14 | 0x08<<7 | 0x0A, - 331 - 161: jis0212<<14 | 0x08<<7 | 0x2A, - 332 - 161: jis0212<<14 | 0x09<<7 | 0x36, - 333 - 161: jis0212<<14 | 0x0A<<7 | 0x36, - 336 - 161: jis0212<<14 | 0x09<<7 | 0x35, - 337 - 161: jis0212<<14 | 0x0A<<7 | 0x35, - 338 - 161: jis0212<<14 | 0x08<<7 | 0x0C, - 339 - 161: jis0212<<14 | 0x08<<7 | 0x2C, - 340 - 161: jis0212<<14 | 0x09<<7 | 0x38, - 341 - 161: jis0212<<14 | 0x0A<<7 | 0x38, - 342 - 161: jis0212<<14 | 0x09<<7 | 0x3A, - 343 - 161: jis0212<<14 | 0x0A<<7 | 0x3A, - 344 - 161: jis0212<<14 | 0x09<<7 | 0x39, - 345 - 161: jis0212<<14 | 0x0A<<7 | 0x39, - 346 - 161: jis0212<<14 | 0x09<<7 | 0x3B, - 347 - 161: jis0212<<14 | 0x0A<<7 | 0x3B, - 348 - 161: jis0212<<14 | 0x09<<7 | 0x3C, - 349 - 161: jis0212<<14 | 0x0A<<7 | 0x3C, - 350 - 161: jis0212<<14 | 0x09<<7 | 0x3E, - 351 - 161: jis0212<<14 | 0x0A<<7 | 0x3E, - 352 - 161: jis0212<<14 | 0x09<<7 | 0x3D, - 353 - 161: jis0212<<14 | 0x0A<<7 | 0x3D, - 354 - 161: jis0212<<14 | 0x09<<7 | 0x40, - 355 - 161: jis0212<<14 | 0x0A<<7 | 0x40, - 356 - 161: jis0212<<14 | 0x09<<7 | 0x3F, - 357 - 161: jis0212<<14 | 0x0A<<7 | 0x3F, - 358 - 161: jis0212<<14 | 0x08<<7 | 0x0E, - 359 - 161: jis0212<<14 | 0x08<<7 | 0x2E, - 360 - 161: jis0212<<14 | 0x09<<7 | 0x4B, - 361 - 161: jis0212<<14 | 0x0A<<7 | 0x4B, - 362 - 161: jis0212<<14 | 0x09<<7 | 0x48, - 363 - 161: jis0212<<14 | 0x0A<<7 | 0x48, - 364 - 161: jis0212<<14 | 0x09<<7 | 0x45, - 365 - 161: jis0212<<14 | 0x0A<<7 | 0x45, - 366 - 161: jis0212<<14 | 0x09<<7 | 0x4A, - 367 - 161: jis0212<<14 | 0x0A<<7 | 0x4A, - 368 - 161: jis0212<<14 | 0x09<<7 | 0x47, - 369 - 161: jis0212<<14 | 0x0A<<7 | 0x47, - 370 - 161: jis0212<<14 | 0x09<<7 | 0x49, - 371 - 161: jis0212<<14 | 0x0A<<7 | 0x49, - 372 - 161: jis0212<<14 | 0x09<<7 | 0x50, - 373 - 161: jis0212<<14 | 0x0A<<7 | 0x50, - 374 - 161: jis0212<<14 | 0x09<<7 | 0x53, - 375 - 161: jis0212<<14 | 0x0A<<7 | 0x53, - 376 - 161: jis0212<<14 | 0x09<<7 | 0x52, - 377 - 161: jis0212<<14 | 0x09<<7 | 0x54, - 378 - 161: jis0212<<14 | 0x0A<<7 | 0x54, - 379 - 161: jis0212<<14 | 0x09<<7 | 0x56, - 380 - 161: jis0212<<14 | 0x0A<<7 | 0x56, - 381 - 161: jis0212<<14 | 0x09<<7 | 0x55, - 382 - 161: jis0212<<14 | 0x0A<<7 | 0x55, - 461 - 161: jis0212<<14 | 0x09<<7 | 0x05, - 462 - 161: jis0212<<14 | 0x0A<<7 | 0x05, - 463 - 161: jis0212<<14 | 0x09<<7 | 0x22, - 464 - 161: jis0212<<14 | 0x0A<<7 | 0x22, - 465 - 161: jis0212<<14 | 0x09<<7 | 0x34, - 466 - 161: jis0212<<14 | 0x0A<<7 | 0x34, - 467 - 161: jis0212<<14 | 0x09<<7 | 0x46, - 468 - 161: jis0212<<14 | 0x0A<<7 | 0x46, - 469 - 161: jis0212<<14 | 0x09<<7 | 0x4F, - 470 - 161: jis0212<<14 | 0x0A<<7 | 0x4F, - 471 - 161: jis0212<<14 | 0x09<<7 | 0x4C, - 472 - 161: jis0212<<14 | 0x0A<<7 | 0x4C, - 473 - 161: jis0212<<14 | 0x09<<7 | 0x4E, - 474 - 161: jis0212<<14 | 0x0A<<7 | 0x4E, - 475 - 161: jis0212<<14 | 0x09<<7 | 0x4D, - 476 - 161: jis0212<<14 | 0x0A<<7 | 0x4D, - 501 - 161: jis0212<<14 | 0x0A<<7 | 0x18, - 711 - 161: jis0212<<14 | 0x01<<7 | 0x0F, - 728 - 161: jis0212<<14 | 0x01<<7 | 0x0E, - 729 - 161: jis0212<<14 | 0x01<<7 | 0x11, - 730 - 161: jis0212<<14 | 0x01<<7 | 0x15, - 731 - 161: jis0212<<14 | 0x01<<7 | 0x14, - 733 - 161: jis0212<<14 | 0x01<<7 | 0x12, - 900 - 161: jis0212<<14 | 0x01<<7 | 0x17, - 901 - 161: jis0212<<14 | 0x01<<7 | 0x18, - 902 - 161: jis0212<<14 | 0x05<<7 | 0x40, - 904 - 161: jis0212<<14 | 0x05<<7 | 0x41, - 905 - 161: jis0212<<14 | 0x05<<7 | 0x42, - 906 - 161: jis0212<<14 | 0x05<<7 | 0x43, - 908 - 161: jis0212<<14 | 0x05<<7 | 0x46, - 910 - 161: jis0212<<14 | 0x05<<7 | 0x48, - 911 - 161: jis0212<<14 | 0x05<<7 | 0x4B, - 912 - 161: jis0212<<14 | 0x05<<7 | 0x55, - 913 - 161: jis0208<<14 | 0x05<<7 | 0x00, - 914 - 161: jis0208<<14 | 0x05<<7 | 0x01, - 915 - 161: jis0208<<14 | 0x05<<7 | 0x02, - 916 - 161: jis0208<<14 | 0x05<<7 | 0x03, - 917 - 161: jis0208<<14 | 0x05<<7 | 0x04, - 918 - 161: jis0208<<14 | 0x05<<7 | 0x05, - 919 - 161: jis0208<<14 | 0x05<<7 | 0x06, - 920 - 161: jis0208<<14 | 0x05<<7 | 0x07, - 921 - 161: jis0208<<14 | 0x05<<7 | 0x08, - 922 - 161: jis0208<<14 | 0x05<<7 | 0x09, - 923 - 161: jis0208<<14 | 0x05<<7 | 0x0A, - 924 - 161: jis0208<<14 | 0x05<<7 | 0x0B, - 925 - 161: jis0208<<14 | 0x05<<7 | 0x0C, - 926 - 161: jis0208<<14 | 0x05<<7 | 0x0D, - 927 - 161: jis0208<<14 | 0x05<<7 | 0x0E, - 928 - 161: jis0208<<14 | 0x05<<7 | 0x0F, - 929 - 161: jis0208<<14 | 0x05<<7 | 0x10, - 931 - 161: jis0208<<14 | 0x05<<7 | 0x11, - 932 - 161: jis0208<<14 | 0x05<<7 | 0x12, - 933 - 161: jis0208<<14 | 0x05<<7 | 0x13, - 934 - 161: jis0208<<14 | 0x05<<7 | 0x14, - 935 - 161: jis0208<<14 | 0x05<<7 | 0x15, - 936 - 161: jis0208<<14 | 0x05<<7 | 0x16, - 937 - 161: jis0208<<14 | 0x05<<7 | 0x17, - 938 - 161: jis0212<<14 | 0x05<<7 | 0x44, - 939 - 161: jis0212<<14 | 0x05<<7 | 0x49, - 940 - 161: jis0212<<14 | 0x05<<7 | 0x50, - 941 - 161: jis0212<<14 | 0x05<<7 | 0x51, - 942 - 161: jis0212<<14 | 0x05<<7 | 0x52, - 943 - 161: jis0212<<14 | 0x05<<7 | 0x53, - 944 - 161: jis0212<<14 | 0x05<<7 | 0x5A, - 945 - 161: jis0208<<14 | 0x05<<7 | 0x20, - 946 - 161: jis0208<<14 | 0x05<<7 | 0x21, - 947 - 161: jis0208<<14 | 0x05<<7 | 0x22, - 948 - 161: jis0208<<14 | 0x05<<7 | 0x23, - 949 - 161: jis0208<<14 | 0x05<<7 | 0x24, - 950 - 161: jis0208<<14 | 0x05<<7 | 0x25, - 951 - 161: jis0208<<14 | 0x05<<7 | 0x26, - 952 - 161: jis0208<<14 | 0x05<<7 | 0x27, - 953 - 161: jis0208<<14 | 0x05<<7 | 0x28, - 954 - 161: jis0208<<14 | 0x05<<7 | 0x29, - 955 - 161: jis0208<<14 | 0x05<<7 | 0x2A, - 956 - 161: jis0208<<14 | 0x05<<7 | 0x2B, - 957 - 161: jis0208<<14 | 0x05<<7 | 0x2C, - 958 - 161: jis0208<<14 | 0x05<<7 | 0x2D, - 959 - 161: jis0208<<14 | 0x05<<7 | 0x2E, - 960 - 161: jis0208<<14 | 0x05<<7 | 0x2F, - 961 - 161: jis0208<<14 | 0x05<<7 | 0x30, - 962 - 161: jis0212<<14 | 0x05<<7 | 0x57, - 963 - 161: jis0208<<14 | 0x05<<7 | 0x31, - 964 - 161: jis0208<<14 | 0x05<<7 | 0x32, - 965 - 161: jis0208<<14 | 0x05<<7 | 0x33, - 966 - 161: jis0208<<14 | 0x05<<7 | 0x34, - 967 - 161: jis0208<<14 | 0x05<<7 | 0x35, - 968 - 161: jis0208<<14 | 0x05<<7 | 0x36, - 969 - 161: jis0208<<14 | 0x05<<7 | 0x37, - 970 - 161: jis0212<<14 | 0x05<<7 | 0x54, - 971 - 161: jis0212<<14 | 0x05<<7 | 0x59, - 972 - 161: jis0212<<14 | 0x05<<7 | 0x56, - 973 - 161: jis0212<<14 | 0x05<<7 | 0x58, - 974 - 161: jis0212<<14 | 0x05<<7 | 0x5B, - 1025 - 161: jis0208<<14 | 0x06<<7 | 0x06, - 1026 - 161: jis0212<<14 | 0x06<<7 | 0x21, - 1027 - 161: jis0212<<14 | 0x06<<7 | 0x22, - 1028 - 161: jis0212<<14 | 0x06<<7 | 0x23, - 1029 - 161: jis0212<<14 | 0x06<<7 | 0x24, - 1030 - 161: jis0212<<14 | 0x06<<7 | 0x25, - 1031 - 161: jis0212<<14 | 0x06<<7 | 0x26, - 1032 - 161: jis0212<<14 | 0x06<<7 | 0x27, - 1033 - 161: jis0212<<14 | 0x06<<7 | 0x28, - 1034 - 161: jis0212<<14 | 0x06<<7 | 0x29, - 1035 - 161: jis0212<<14 | 0x06<<7 | 0x2A, - 1036 - 161: jis0212<<14 | 0x06<<7 | 0x2B, - 1038 - 161: jis0212<<14 | 0x06<<7 | 0x2C, - 1039 - 161: jis0212<<14 | 0x06<<7 | 0x2D, - 1040 - 161: jis0208<<14 | 0x06<<7 | 0x00, - 1041 - 161: jis0208<<14 | 0x06<<7 | 0x01, - 1042 - 161: jis0208<<14 | 0x06<<7 | 0x02, - 1043 - 161: jis0208<<14 | 0x06<<7 | 0x03, - 1044 - 161: jis0208<<14 | 0x06<<7 | 0x04, - 1045 - 161: jis0208<<14 | 0x06<<7 | 0x05, - 1046 - 161: jis0208<<14 | 0x06<<7 | 0x07, - 1047 - 161: jis0208<<14 | 0x06<<7 | 0x08, - 1048 - 161: jis0208<<14 | 0x06<<7 | 0x09, - 1049 - 161: jis0208<<14 | 0x06<<7 | 0x0A, - 1050 - 161: jis0208<<14 | 0x06<<7 | 0x0B, - 1051 - 161: jis0208<<14 | 0x06<<7 | 0x0C, - 1052 - 161: jis0208<<14 | 0x06<<7 | 0x0D, - 1053 - 161: jis0208<<14 | 0x06<<7 | 0x0E, - 1054 - 161: jis0208<<14 | 0x06<<7 | 0x0F, - 1055 - 161: jis0208<<14 | 0x06<<7 | 0x10, - 1056 - 161: jis0208<<14 | 0x06<<7 | 0x11, - 1057 - 161: jis0208<<14 | 0x06<<7 | 0x12, - 1058 - 161: jis0208<<14 | 0x06<<7 | 0x13, - 1059 - 161: jis0208<<14 | 0x06<<7 | 0x14, - 1060 - 161: jis0208<<14 | 0x06<<7 | 0x15, - 1061 - 161: jis0208<<14 | 0x06<<7 | 0x16, - 1062 - 161: jis0208<<14 | 0x06<<7 | 0x17, - 1063 - 161: jis0208<<14 | 0x06<<7 | 0x18, - 1064 - 161: jis0208<<14 | 0x06<<7 | 0x19, - 1065 - 161: jis0208<<14 | 0x06<<7 | 0x1A, - 1066 - 161: jis0208<<14 | 0x06<<7 | 0x1B, - 1067 - 161: jis0208<<14 | 0x06<<7 | 0x1C, - 1068 - 161: jis0208<<14 | 0x06<<7 | 0x1D, - 1069 - 161: jis0208<<14 | 0x06<<7 | 0x1E, - 1070 - 161: jis0208<<14 | 0x06<<7 | 0x1F, - 1071 - 161: jis0208<<14 | 0x06<<7 | 0x20, - 1072 - 161: jis0208<<14 | 0x06<<7 | 0x30, - 1073 - 161: jis0208<<14 | 0x06<<7 | 0x31, - 1074 - 161: jis0208<<14 | 0x06<<7 | 0x32, - 1075 - 161: jis0208<<14 | 0x06<<7 | 0x33, - 1076 - 161: jis0208<<14 | 0x06<<7 | 0x34, - 1077 - 161: jis0208<<14 | 0x06<<7 | 0x35, - 1078 - 161: jis0208<<14 | 0x06<<7 | 0x37, - 1079 - 161: jis0208<<14 | 0x06<<7 | 0x38, - 1080 - 161: jis0208<<14 | 0x06<<7 | 0x39, - 1081 - 161: jis0208<<14 | 0x06<<7 | 0x3A, - 1082 - 161: jis0208<<14 | 0x06<<7 | 0x3B, - 1083 - 161: jis0208<<14 | 0x06<<7 | 0x3C, - 1084 - 161: jis0208<<14 | 0x06<<7 | 0x3D, - 1085 - 161: jis0208<<14 | 0x06<<7 | 0x3E, - 1086 - 161: jis0208<<14 | 0x06<<7 | 0x3F, - 1087 - 161: jis0208<<14 | 0x06<<7 | 0x40, - 1088 - 161: jis0208<<14 | 0x06<<7 | 0x41, - 1089 - 161: jis0208<<14 | 0x06<<7 | 0x42, - 1090 - 161: jis0208<<14 | 0x06<<7 | 0x43, - 1091 - 161: jis0208<<14 | 0x06<<7 | 0x44, - 1092 - 161: jis0208<<14 | 0x06<<7 | 0x45, - 1093 - 161: jis0208<<14 | 0x06<<7 | 0x46, - 1094 - 161: jis0208<<14 | 0x06<<7 | 0x47, - 1095 - 161: jis0208<<14 | 0x06<<7 | 0x48, - 1096 - 161: jis0208<<14 | 0x06<<7 | 0x49, - 1097 - 161: jis0208<<14 | 0x06<<7 | 0x4A, - 1098 - 161: jis0208<<14 | 0x06<<7 | 0x4B, - 1099 - 161: jis0208<<14 | 0x06<<7 | 0x4C, - 1100 - 161: jis0208<<14 | 0x06<<7 | 0x4D, - 1101 - 161: jis0208<<14 | 0x06<<7 | 0x4E, - 1102 - 161: jis0208<<14 | 0x06<<7 | 0x4F, - 1103 - 161: jis0208<<14 | 0x06<<7 | 0x50, - 1105 - 161: jis0208<<14 | 0x06<<7 | 0x36, - 1106 - 161: jis0212<<14 | 0x06<<7 | 0x51, - 1107 - 161: jis0212<<14 | 0x06<<7 | 0x52, - 1108 - 161: jis0212<<14 | 0x06<<7 | 0x53, - 1109 - 161: jis0212<<14 | 0x06<<7 | 0x54, - 1110 - 161: jis0212<<14 | 0x06<<7 | 0x55, - 1111 - 161: jis0212<<14 | 0x06<<7 | 0x56, - 1112 - 161: jis0212<<14 | 0x06<<7 | 0x57, - 1113 - 161: jis0212<<14 | 0x06<<7 | 0x58, - 1114 - 161: jis0212<<14 | 0x06<<7 | 0x59, - 1115 - 161: jis0212<<14 | 0x06<<7 | 0x5A, - 1116 - 161: jis0212<<14 | 0x06<<7 | 0x5B, - 1118 - 161: jis0212<<14 | 0x06<<7 | 0x5C, - 1119 - 161: jis0212<<14 | 0x06<<7 | 0x5D, -} - -const encode4Low, encode4High = 63785, 64046 - -var encode4 = [...]uint16{ - 63785 - 63785: jis0208<<14 | 0x59<<7 | 0x25, - 63964 - 63785: jis0208<<14 | 0x5B<<7 | 0x2E, - 64014 - 63785: jis0208<<14 | 0x58<<7 | 0x33, - 64015 - 63785: jis0208<<14 | 0x58<<7 | 0x3E, - 64016 - 63785: jis0208<<14 | 0x58<<7 | 0x3F, - 64017 - 63785: jis0208<<14 | 0x58<<7 | 0x54, - 64018 - 63785: jis0208<<14 | 0x59<<7 | 0x1D, - 64019 - 63785: jis0208<<14 | 0x59<<7 | 0x2D, - 64020 - 63785: jis0208<<14 | 0x59<<7 | 0x2F, - 64021 - 63785: jis0208<<14 | 0x59<<7 | 0x5A, - 64022 - 63785: jis0208<<14 | 0x5A<<7 | 0x02, - 64023 - 63785: jis0208<<14 | 0x5A<<7 | 0x19, - 64024 - 63785: jis0208<<14 | 0x5A<<7 | 0x21, - 64025 - 63785: jis0208<<14 | 0x5A<<7 | 0x22, - 64026 - 63785: jis0208<<14 | 0x5A<<7 | 0x23, - 64027 - 63785: jis0208<<14 | 0x5A<<7 | 0x25, - 64028 - 63785: jis0208<<14 | 0x5A<<7 | 0x29, - 64029 - 63785: jis0208<<14 | 0x5A<<7 | 0x2C, - 64030 - 63785: jis0208<<14 | 0x5A<<7 | 0x35, - 64031 - 63785: jis0208<<14 | 0x5A<<7 | 0x40, - 64032 - 63785: jis0208<<14 | 0x5A<<7 | 0x42, - 64033 - 63785: jis0208<<14 | 0x5A<<7 | 0x43, - 64034 - 63785: jis0208<<14 | 0x5A<<7 | 0x4C, - 64035 - 63785: jis0208<<14 | 0x5A<<7 | 0x54, - 64036 - 63785: jis0208<<14 | 0x5A<<7 | 0x56, - 64037 - 63785: jis0208<<14 | 0x5A<<7 | 0x57, - 64038 - 63785: jis0208<<14 | 0x5A<<7 | 0x5A, - 64039 - 63785: jis0208<<14 | 0x5B<<7 | 0x18, - 64040 - 63785: jis0208<<14 | 0x5B<<7 | 0x1F, - 64041 - 63785: jis0208<<14 | 0x5B<<7 | 0x2F, - 64042 - 63785: jis0208<<14 | 0x5B<<7 | 0x3B, - 64043 - 63785: jis0208<<14 | 0x5B<<7 | 0x3C, - 64044 - 63785: jis0208<<14 | 0x5B<<7 | 0x3E, - 64045 - 63785: jis0208<<14 | 0x5B<<7 | 0x4B, -} - -const encode5Low, encode5High = 65281, 65510 - -var encode5 = [...]uint16{ - 65281 - 65281: jis0208<<14 | 0x00<<7 | 0x09, - 65282 - 65281: jis0208<<14 | 0x5B<<7 | 0x5D, - 65283 - 65281: jis0208<<14 | 0x00<<7 | 0x53, - 65284 - 65281: jis0208<<14 | 0x00<<7 | 0x4F, - 65285 - 65281: jis0208<<14 | 0x00<<7 | 0x52, - 65286 - 65281: jis0208<<14 | 0x00<<7 | 0x54, - 65287 - 65281: jis0208<<14 | 0x5B<<7 | 0x5C, - 65288 - 65281: jis0208<<14 | 0x00<<7 | 0x29, - 65289 - 65281: jis0208<<14 | 0x00<<7 | 0x2A, - 65290 - 65281: jis0208<<14 | 0x00<<7 | 0x55, - 65291 - 65281: jis0208<<14 | 0x00<<7 | 0x3B, - 65292 - 65281: jis0208<<14 | 0x00<<7 | 0x03, - 65293 - 65281: jis0208<<14 | 0x00<<7 | 0x3C, - 65294 - 65281: jis0208<<14 | 0x00<<7 | 0x04, - 65295 - 65281: jis0208<<14 | 0x00<<7 | 0x1E, - 65296 - 65281: jis0208<<14 | 0x02<<7 | 0x0F, - 65297 - 65281: jis0208<<14 | 0x02<<7 | 0x10, - 65298 - 65281: jis0208<<14 | 0x02<<7 | 0x11, - 65299 - 65281: jis0208<<14 | 0x02<<7 | 0x12, - 65300 - 65281: jis0208<<14 | 0x02<<7 | 0x13, - 65301 - 65281: jis0208<<14 | 0x02<<7 | 0x14, - 65302 - 65281: jis0208<<14 | 0x02<<7 | 0x15, - 65303 - 65281: jis0208<<14 | 0x02<<7 | 0x16, - 65304 - 65281: jis0208<<14 | 0x02<<7 | 0x17, - 65305 - 65281: jis0208<<14 | 0x02<<7 | 0x18, - 65306 - 65281: jis0208<<14 | 0x00<<7 | 0x06, - 65307 - 65281: jis0208<<14 | 0x00<<7 | 0x07, - 65308 - 65281: jis0208<<14 | 0x00<<7 | 0x42, - 65309 - 65281: jis0208<<14 | 0x00<<7 | 0x40, - 65310 - 65281: jis0208<<14 | 0x00<<7 | 0x43, - 65311 - 65281: jis0208<<14 | 0x00<<7 | 0x08, - 65312 - 65281: jis0208<<14 | 0x00<<7 | 0x56, - 65313 - 65281: jis0208<<14 | 0x02<<7 | 0x20, - 65314 - 65281: jis0208<<14 | 0x02<<7 | 0x21, - 65315 - 65281: jis0208<<14 | 0x02<<7 | 0x22, - 65316 - 65281: jis0208<<14 | 0x02<<7 | 0x23, - 65317 - 65281: jis0208<<14 | 0x02<<7 | 0x24, - 65318 - 65281: jis0208<<14 | 0x02<<7 | 0x25, - 65319 - 65281: jis0208<<14 | 0x02<<7 | 0x26, - 65320 - 65281: jis0208<<14 | 0x02<<7 | 0x27, - 65321 - 65281: jis0208<<14 | 0x02<<7 | 0x28, - 65322 - 65281: jis0208<<14 | 0x02<<7 | 0x29, - 65323 - 65281: jis0208<<14 | 0x02<<7 | 0x2A, - 65324 - 65281: jis0208<<14 | 0x02<<7 | 0x2B, - 65325 - 65281: jis0208<<14 | 0x02<<7 | 0x2C, - 65326 - 65281: jis0208<<14 | 0x02<<7 | 0x2D, - 65327 - 65281: jis0208<<14 | 0x02<<7 | 0x2E, - 65328 - 65281: jis0208<<14 | 0x02<<7 | 0x2F, - 65329 - 65281: jis0208<<14 | 0x02<<7 | 0x30, - 65330 - 65281: jis0208<<14 | 0x02<<7 | 0x31, - 65331 - 65281: jis0208<<14 | 0x02<<7 | 0x32, - 65332 - 65281: jis0208<<14 | 0x02<<7 | 0x33, - 65333 - 65281: jis0208<<14 | 0x02<<7 | 0x34, - 65334 - 65281: jis0208<<14 | 0x02<<7 | 0x35, - 65335 - 65281: jis0208<<14 | 0x02<<7 | 0x36, - 65336 - 65281: jis0208<<14 | 0x02<<7 | 0x37, - 65337 - 65281: jis0208<<14 | 0x02<<7 | 0x38, - 65338 - 65281: jis0208<<14 | 0x02<<7 | 0x39, - 65339 - 65281: jis0208<<14 | 0x00<<7 | 0x2D, - 65340 - 65281: jis0208<<14 | 0x00<<7 | 0x1F, - 65341 - 65281: jis0208<<14 | 0x00<<7 | 0x2E, - 65342 - 65281: jis0208<<14 | 0x00<<7 | 0x0F, - 65343 - 65281: jis0208<<14 | 0x00<<7 | 0x11, - 65344 - 65281: jis0208<<14 | 0x00<<7 | 0x0D, - 65345 - 65281: jis0208<<14 | 0x02<<7 | 0x40, - 65346 - 65281: jis0208<<14 | 0x02<<7 | 0x41, - 65347 - 65281: jis0208<<14 | 0x02<<7 | 0x42, - 65348 - 65281: jis0208<<14 | 0x02<<7 | 0x43, - 65349 - 65281: jis0208<<14 | 0x02<<7 | 0x44, - 65350 - 65281: jis0208<<14 | 0x02<<7 | 0x45, - 65351 - 65281: jis0208<<14 | 0x02<<7 | 0x46, - 65352 - 65281: jis0208<<14 | 0x02<<7 | 0x47, - 65353 - 65281: jis0208<<14 | 0x02<<7 | 0x48, - 65354 - 65281: jis0208<<14 | 0x02<<7 | 0x49, - 65355 - 65281: jis0208<<14 | 0x02<<7 | 0x4A, - 65356 - 65281: jis0208<<14 | 0x02<<7 | 0x4B, - 65357 - 65281: jis0208<<14 | 0x02<<7 | 0x4C, - 65358 - 65281: jis0208<<14 | 0x02<<7 | 0x4D, - 65359 - 65281: jis0208<<14 | 0x02<<7 | 0x4E, - 65360 - 65281: jis0208<<14 | 0x02<<7 | 0x4F, - 65361 - 65281: jis0208<<14 | 0x02<<7 | 0x50, - 65362 - 65281: jis0208<<14 | 0x02<<7 | 0x51, - 65363 - 65281: jis0208<<14 | 0x02<<7 | 0x52, - 65364 - 65281: jis0208<<14 | 0x02<<7 | 0x53, - 65365 - 65281: jis0208<<14 | 0x02<<7 | 0x54, - 65366 - 65281: jis0208<<14 | 0x02<<7 | 0x55, - 65367 - 65281: jis0208<<14 | 0x02<<7 | 0x56, - 65368 - 65281: jis0208<<14 | 0x02<<7 | 0x57, - 65369 - 65281: jis0208<<14 | 0x02<<7 | 0x58, - 65370 - 65281: jis0208<<14 | 0x02<<7 | 0x59, - 65371 - 65281: jis0208<<14 | 0x00<<7 | 0x2F, - 65372 - 65281: jis0208<<14 | 0x00<<7 | 0x22, - 65373 - 65281: jis0208<<14 | 0x00<<7 | 0x30, - 65374 - 65281: jis0208<<14 | 0x00<<7 | 0x20, - 65504 - 65281: jis0208<<14 | 0x00<<7 | 0x50, - 65505 - 65281: jis0208<<14 | 0x00<<7 | 0x51, - 65506 - 65281: jis0208<<14 | 0x01<<7 | 0x2B, - 65507 - 65281: jis0208<<14 | 0x00<<7 | 0x10, - 65508 - 65281: jis0208<<14 | 0x5B<<7 | 0x5B, - 65509 - 65281: jis0208<<14 | 0x00<<7 | 0x4E, -} diff --git a/vendor/golang.org/x/text/encoding/korean/euckr.go b/vendor/golang.org/x/text/encoding/korean/euckr.go deleted file mode 100644 index 034337f..0000000 --- a/vendor/golang.org/x/text/encoding/korean/euckr.go +++ /dev/null @@ -1,177 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package korean - -import ( - "unicode/utf8" - - "golang.org/x/text/encoding" - "golang.org/x/text/encoding/internal" - "golang.org/x/text/encoding/internal/identifier" - "golang.org/x/text/transform" -) - -// All is a list of all defined encodings in this package. -var All = []encoding.Encoding{EUCKR} - -// EUCKR is the EUC-KR encoding, also known as Code Page 949. -var EUCKR encoding.Encoding = &eucKR - -var eucKR = internal.Encoding{ - &internal.SimpleEncoding{eucKRDecoder{}, eucKREncoder{}}, - "EUC-KR", - identifier.EUCKR, -} - -type eucKRDecoder struct{ transform.NopResetter } - -func (eucKRDecoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { - r, size := rune(0), 0 -loop: - for ; nSrc < len(src); nSrc += size { - switch c0 := src[nSrc]; { - case c0 < utf8.RuneSelf: - r, size = rune(c0), 1 - - case 0x81 <= c0 && c0 < 0xff: - if nSrc+1 >= len(src) { - if !atEOF { - err = transform.ErrShortSrc - break loop - } - r, size = utf8.RuneError, 1 - break - } - c1 := src[nSrc+1] - size = 2 - if c0 < 0xc7 { - r = 178 * rune(c0-0x81) - switch { - case 0x41 <= c1 && c1 < 0x5b: - r += rune(c1) - (0x41 - 0*26) - case 0x61 <= c1 && c1 < 0x7b: - r += rune(c1) - (0x61 - 1*26) - case 0x81 <= c1 && c1 < 0xff: - r += rune(c1) - (0x81 - 2*26) - default: - goto decError - } - } else if 0xa1 <= c1 && c1 < 0xff { - r = 178*(0xc7-0x81) + rune(c0-0xc7)*94 + rune(c1-0xa1) - } else { - goto decError - } - if int(r) < len(decode) { - r = rune(decode[r]) - if r != 0 { - break - } - } - decError: - r = utf8.RuneError - if c1 < utf8.RuneSelf { - size = 1 - } - - default: - r, size = utf8.RuneError, 1 - break - } - - if nDst+utf8.RuneLen(r) > len(dst) { - err = transform.ErrShortDst - break - } - nDst += utf8.EncodeRune(dst[nDst:], r) - } - return nDst, nSrc, err -} - -type eucKREncoder struct{ transform.NopResetter } - -func (eucKREncoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { - r, size := rune(0), 0 - for ; nSrc < len(src); nSrc += size { - r = rune(src[nSrc]) - - // Decode a 1-byte rune. - if r < utf8.RuneSelf { - size = 1 - - if nDst >= len(dst) { - err = transform.ErrShortDst - break - } - dst[nDst] = uint8(r) - nDst++ - continue - - } else { - // Decode a multi-byte rune. - r, size = utf8.DecodeRune(src[nSrc:]) - if size == 1 { - // All valid runes of size 1 (those below utf8.RuneSelf) were - // handled above. We have invalid UTF-8 or we haven't seen the - // full character yet. - if !atEOF && !utf8.FullRune(src[nSrc:]) { - err = transform.ErrShortSrc - break - } - } - - // func init checks that the switch covers all tables. - switch { - case encode0Low <= r && r < encode0High: - if r = rune(encode0[r-encode0Low]); r != 0 { - goto write2 - } - case encode1Low <= r && r < encode1High: - if r = rune(encode1[r-encode1Low]); r != 0 { - goto write2 - } - case encode2Low <= r && r < encode2High: - if r = rune(encode2[r-encode2Low]); r != 0 { - goto write2 - } - case encode3Low <= r && r < encode3High: - if r = rune(encode3[r-encode3Low]); r != 0 { - goto write2 - } - case encode4Low <= r && r < encode4High: - if r = rune(encode4[r-encode4Low]); r != 0 { - goto write2 - } - case encode5Low <= r && r < encode5High: - if r = rune(encode5[r-encode5Low]); r != 0 { - goto write2 - } - case encode6Low <= r && r < encode6High: - if r = rune(encode6[r-encode6Low]); r != 0 { - goto write2 - } - } - err = internal.ErrASCIIReplacement - break - } - - write2: - if nDst+2 > len(dst) { - err = transform.ErrShortDst - break - } - dst[nDst+0] = uint8(r >> 8) - dst[nDst+1] = uint8(r) - nDst += 2 - continue - } - return nDst, nSrc, err -} - -func init() { - // Check that the hard-coded encode switch covers all tables. - if numEncodeTables != 7 { - panic("bad numEncodeTables") - } -} diff --git a/vendor/golang.org/x/text/encoding/korean/tables.go b/vendor/golang.org/x/text/encoding/korean/tables.go deleted file mode 100644 index 0480e85..0000000 --- a/vendor/golang.org/x/text/encoding/korean/tables.go +++ /dev/null @@ -1,34152 +0,0 @@ -// generated by go run maketables.go; DO NOT EDIT - -// Package korean provides Korean encodings such as EUC-KR. -package korean // import "golang.org/x/text/encoding/korean" - -// decode is the decoding table from EUC-KR code to Unicode. -// It is defined at http://encoding.spec.whatwg.org/index-euc-kr.txt -var decode = [...]uint16{ - 0: 0xAC02, - 1: 0xAC03, - 2: 0xAC05, - 3: 0xAC06, - 4: 0xAC0B, - 5: 0xAC0C, - 6: 0xAC0D, - 7: 0xAC0E, - 8: 0xAC0F, - 9: 0xAC18, - 10: 0xAC1E, - 11: 0xAC1F, - 12: 0xAC21, - 13: 0xAC22, - 14: 0xAC23, - 15: 0xAC25, - 16: 0xAC26, - 17: 0xAC27, - 18: 0xAC28, - 19: 0xAC29, - 20: 0xAC2A, - 21: 0xAC2B, - 22: 0xAC2E, - 23: 0xAC32, - 24: 0xAC33, - 25: 0xAC34, - 26: 0xAC35, - 27: 0xAC36, - 28: 0xAC37, - 29: 0xAC3A, - 30: 0xAC3B, - 31: 0xAC3D, - 32: 0xAC3E, - 33: 0xAC3F, - 34: 0xAC41, - 35: 0xAC42, - 36: 0xAC43, - 37: 0xAC44, - 38: 0xAC45, - 39: 0xAC46, - 40: 0xAC47, - 41: 0xAC48, - 42: 0xAC49, - 43: 0xAC4A, - 44: 0xAC4C, - 45: 0xAC4E, - 46: 0xAC4F, - 47: 0xAC50, - 48: 0xAC51, - 49: 0xAC52, - 50: 0xAC53, - 51: 0xAC55, - 52: 0xAC56, - 53: 0xAC57, - 54: 0xAC59, - 55: 0xAC5A, - 56: 0xAC5B, - 57: 0xAC5D, - 58: 0xAC5E, - 59: 0xAC5F, - 60: 0xAC60, - 61: 0xAC61, - 62: 0xAC62, - 63: 0xAC63, - 64: 0xAC64, - 65: 0xAC65, - 66: 0xAC66, - 67: 0xAC67, - 68: 0xAC68, - 69: 0xAC69, - 70: 0xAC6A, - 71: 0xAC6B, - 72: 0xAC6C, - 73: 0xAC6D, - 74: 0xAC6E, - 75: 0xAC6F, - 76: 0xAC72, - 77: 0xAC73, - 78: 0xAC75, - 79: 0xAC76, - 80: 0xAC79, - 81: 0xAC7B, - 82: 0xAC7C, - 83: 0xAC7D, - 84: 0xAC7E, - 85: 0xAC7F, - 86: 0xAC82, - 87: 0xAC87, - 88: 0xAC88, - 89: 0xAC8D, - 90: 0xAC8E, - 91: 0xAC8F, - 92: 0xAC91, - 93: 0xAC92, - 94: 0xAC93, - 95: 0xAC95, - 96: 0xAC96, - 97: 0xAC97, - 98: 0xAC98, - 99: 0xAC99, - 100: 0xAC9A, - 101: 0xAC9B, - 102: 0xAC9E, - 103: 0xACA2, - 104: 0xACA3, - 105: 0xACA4, - 106: 0xACA5, - 107: 0xACA6, - 108: 0xACA7, - 109: 0xACAB, - 110: 0xACAD, - 111: 0xACAE, - 112: 0xACB1, - 113: 0xACB2, - 114: 0xACB3, - 115: 0xACB4, - 116: 0xACB5, - 117: 0xACB6, - 118: 0xACB7, - 119: 0xACBA, - 120: 0xACBE, - 121: 0xACBF, - 122: 0xACC0, - 123: 0xACC2, - 124: 0xACC3, - 125: 0xACC5, - 126: 0xACC6, - 127: 0xACC7, - 128: 0xACC9, - 129: 0xACCA, - 130: 0xACCB, - 131: 0xACCD, - 132: 0xACCE, - 133: 0xACCF, - 134: 0xACD0, - 135: 0xACD1, - 136: 0xACD2, - 137: 0xACD3, - 138: 0xACD4, - 139: 0xACD6, - 140: 0xACD8, - 141: 0xACD9, - 142: 0xACDA, - 143: 0xACDB, - 144: 0xACDC, - 145: 0xACDD, - 146: 0xACDE, - 147: 0xACDF, - 148: 0xACE2, - 149: 0xACE3, - 150: 0xACE5, - 151: 0xACE6, - 152: 0xACE9, - 153: 0xACEB, - 154: 0xACED, - 155: 0xACEE, - 156: 0xACF2, - 157: 0xACF4, - 158: 0xACF7, - 159: 0xACF8, - 160: 0xACF9, - 161: 0xACFA, - 162: 0xACFB, - 163: 0xACFE, - 164: 0xACFF, - 165: 0xAD01, - 166: 0xAD02, - 167: 0xAD03, - 168: 0xAD05, - 169: 0xAD07, - 170: 0xAD08, - 171: 0xAD09, - 172: 0xAD0A, - 173: 0xAD0B, - 174: 0xAD0E, - 175: 0xAD10, - 176: 0xAD12, - 177: 0xAD13, - 178: 0xAD14, - 179: 0xAD15, - 180: 0xAD16, - 181: 0xAD17, - 182: 0xAD19, - 183: 0xAD1A, - 184: 0xAD1B, - 185: 0xAD1D, - 186: 0xAD1E, - 187: 0xAD1F, - 188: 0xAD21, - 189: 0xAD22, - 190: 0xAD23, - 191: 0xAD24, - 192: 0xAD25, - 193: 0xAD26, - 194: 0xAD27, - 195: 0xAD28, - 196: 0xAD2A, - 197: 0xAD2B, - 198: 0xAD2E, - 199: 0xAD2F, - 200: 0xAD30, - 201: 0xAD31, - 202: 0xAD32, - 203: 0xAD33, - 204: 0xAD36, - 205: 0xAD37, - 206: 0xAD39, - 207: 0xAD3A, - 208: 0xAD3B, - 209: 0xAD3D, - 210: 0xAD3E, - 211: 0xAD3F, - 212: 0xAD40, - 213: 0xAD41, - 214: 0xAD42, - 215: 0xAD43, - 216: 0xAD46, - 217: 0xAD48, - 218: 0xAD4A, - 219: 0xAD4B, - 220: 0xAD4C, - 221: 0xAD4D, - 222: 0xAD4E, - 223: 0xAD4F, - 224: 0xAD51, - 225: 0xAD52, - 226: 0xAD53, - 227: 0xAD55, - 228: 0xAD56, - 229: 0xAD57, - 230: 0xAD59, - 231: 0xAD5A, - 232: 0xAD5B, - 233: 0xAD5C, - 234: 0xAD5D, - 235: 0xAD5E, - 236: 0xAD5F, - 237: 0xAD60, - 238: 0xAD62, - 239: 0xAD64, - 240: 0xAD65, - 241: 0xAD66, - 242: 0xAD67, - 243: 0xAD68, - 244: 0xAD69, - 245: 0xAD6A, - 246: 0xAD6B, - 247: 0xAD6E, - 248: 0xAD6F, - 249: 0xAD71, - 250: 0xAD72, - 251: 0xAD77, - 252: 0xAD78, - 253: 0xAD79, - 254: 0xAD7A, - 255: 0xAD7E, - 256: 0xAD80, - 257: 0xAD83, - 258: 0xAD84, - 259: 0xAD85, - 260: 0xAD86, - 261: 0xAD87, - 262: 0xAD8A, - 263: 0xAD8B, - 264: 0xAD8D, - 265: 0xAD8E, - 266: 0xAD8F, - 267: 0xAD91, - 268: 0xAD92, - 269: 0xAD93, - 270: 0xAD94, - 271: 0xAD95, - 272: 0xAD96, - 273: 0xAD97, - 274: 0xAD98, - 275: 0xAD99, - 276: 0xAD9A, - 277: 0xAD9B, - 278: 0xAD9E, - 279: 0xAD9F, - 280: 0xADA0, - 281: 0xADA1, - 282: 0xADA2, - 283: 0xADA3, - 284: 0xADA5, - 285: 0xADA6, - 286: 0xADA7, - 287: 0xADA8, - 288: 0xADA9, - 289: 0xADAA, - 290: 0xADAB, - 291: 0xADAC, - 292: 0xADAD, - 293: 0xADAE, - 294: 0xADAF, - 295: 0xADB0, - 296: 0xADB1, - 297: 0xADB2, - 298: 0xADB3, - 299: 0xADB4, - 300: 0xADB5, - 301: 0xADB6, - 302: 0xADB8, - 303: 0xADB9, - 304: 0xADBA, - 305: 0xADBB, - 306: 0xADBC, - 307: 0xADBD, - 308: 0xADBE, - 309: 0xADBF, - 310: 0xADC2, - 311: 0xADC3, - 312: 0xADC5, - 313: 0xADC6, - 314: 0xADC7, - 315: 0xADC9, - 316: 0xADCA, - 317: 0xADCB, - 318: 0xADCC, - 319: 0xADCD, - 320: 0xADCE, - 321: 0xADCF, - 322: 0xADD2, - 323: 0xADD4, - 324: 0xADD5, - 325: 0xADD6, - 326: 0xADD7, - 327: 0xADD8, - 328: 0xADD9, - 329: 0xADDA, - 330: 0xADDB, - 331: 0xADDD, - 332: 0xADDE, - 333: 0xADDF, - 334: 0xADE1, - 335: 0xADE2, - 336: 0xADE3, - 337: 0xADE5, - 338: 0xADE6, - 339: 0xADE7, - 340: 0xADE8, - 341: 0xADE9, - 342: 0xADEA, - 343: 0xADEB, - 344: 0xADEC, - 345: 0xADED, - 346: 0xADEE, - 347: 0xADEF, - 348: 0xADF0, - 349: 0xADF1, - 350: 0xADF2, - 351: 0xADF3, - 352: 0xADF4, - 353: 0xADF5, - 354: 0xADF6, - 355: 0xADF7, - 356: 0xADFA, - 357: 0xADFB, - 358: 0xADFD, - 359: 0xADFE, - 360: 0xAE02, - 361: 0xAE03, - 362: 0xAE04, - 363: 0xAE05, - 364: 0xAE06, - 365: 0xAE07, - 366: 0xAE0A, - 367: 0xAE0C, - 368: 0xAE0E, - 369: 0xAE0F, - 370: 0xAE10, - 371: 0xAE11, - 372: 0xAE12, - 373: 0xAE13, - 374: 0xAE15, - 375: 0xAE16, - 376: 0xAE17, - 377: 0xAE18, - 378: 0xAE19, - 379: 0xAE1A, - 380: 0xAE1B, - 381: 0xAE1C, - 382: 0xAE1D, - 383: 0xAE1E, - 384: 0xAE1F, - 385: 0xAE20, - 386: 0xAE21, - 387: 0xAE22, - 388: 0xAE23, - 389: 0xAE24, - 390: 0xAE25, - 391: 0xAE26, - 392: 0xAE27, - 393: 0xAE28, - 394: 0xAE29, - 395: 0xAE2A, - 396: 0xAE2B, - 397: 0xAE2C, - 398: 0xAE2D, - 399: 0xAE2E, - 400: 0xAE2F, - 401: 0xAE32, - 402: 0xAE33, - 403: 0xAE35, - 404: 0xAE36, - 405: 0xAE39, - 406: 0xAE3B, - 407: 0xAE3C, - 408: 0xAE3D, - 409: 0xAE3E, - 410: 0xAE3F, - 411: 0xAE42, - 412: 0xAE44, - 413: 0xAE47, - 414: 0xAE48, - 415: 0xAE49, - 416: 0xAE4B, - 417: 0xAE4F, - 418: 0xAE51, - 419: 0xAE52, - 420: 0xAE53, - 421: 0xAE55, - 422: 0xAE57, - 423: 0xAE58, - 424: 0xAE59, - 425: 0xAE5A, - 426: 0xAE5B, - 427: 0xAE5E, - 428: 0xAE62, - 429: 0xAE63, - 430: 0xAE64, - 431: 0xAE66, - 432: 0xAE67, - 433: 0xAE6A, - 434: 0xAE6B, - 435: 0xAE6D, - 436: 0xAE6E, - 437: 0xAE6F, - 438: 0xAE71, - 439: 0xAE72, - 440: 0xAE73, - 441: 0xAE74, - 442: 0xAE75, - 443: 0xAE76, - 444: 0xAE77, - 445: 0xAE7A, - 446: 0xAE7E, - 447: 0xAE7F, - 448: 0xAE80, - 449: 0xAE81, - 450: 0xAE82, - 451: 0xAE83, - 452: 0xAE86, - 453: 0xAE87, - 454: 0xAE88, - 455: 0xAE89, - 456: 0xAE8A, - 457: 0xAE8B, - 458: 0xAE8D, - 459: 0xAE8E, - 460: 0xAE8F, - 461: 0xAE90, - 462: 0xAE91, - 463: 0xAE92, - 464: 0xAE93, - 465: 0xAE94, - 466: 0xAE95, - 467: 0xAE96, - 468: 0xAE97, - 469: 0xAE98, - 470: 0xAE99, - 471: 0xAE9A, - 472: 0xAE9B, - 473: 0xAE9C, - 474: 0xAE9D, - 475: 0xAE9E, - 476: 0xAE9F, - 477: 0xAEA0, - 478: 0xAEA1, - 479: 0xAEA2, - 480: 0xAEA3, - 481: 0xAEA4, - 482: 0xAEA5, - 483: 0xAEA6, - 484: 0xAEA7, - 485: 0xAEA8, - 486: 0xAEA9, - 487: 0xAEAA, - 488: 0xAEAB, - 489: 0xAEAC, - 490: 0xAEAD, - 491: 0xAEAE, - 492: 0xAEAF, - 493: 0xAEB0, - 494: 0xAEB1, - 495: 0xAEB2, - 496: 0xAEB3, - 497: 0xAEB4, - 498: 0xAEB5, - 499: 0xAEB6, - 500: 0xAEB7, - 501: 0xAEB8, - 502: 0xAEB9, - 503: 0xAEBA, - 504: 0xAEBB, - 505: 0xAEBF, - 506: 0xAEC1, - 507: 0xAEC2, - 508: 0xAEC3, - 509: 0xAEC5, - 510: 0xAEC6, - 511: 0xAEC7, - 512: 0xAEC8, - 513: 0xAEC9, - 514: 0xAECA, - 515: 0xAECB, - 516: 0xAECE, - 517: 0xAED2, - 518: 0xAED3, - 519: 0xAED4, - 520: 0xAED5, - 521: 0xAED6, - 522: 0xAED7, - 523: 0xAEDA, - 524: 0xAEDB, - 525: 0xAEDD, - 526: 0xAEDE, - 527: 0xAEDF, - 528: 0xAEE0, - 529: 0xAEE1, - 530: 0xAEE2, - 531: 0xAEE3, - 532: 0xAEE4, - 533: 0xAEE5, - 534: 0xAEE6, - 535: 0xAEE7, - 536: 0xAEE9, - 537: 0xAEEA, - 538: 0xAEEC, - 539: 0xAEEE, - 540: 0xAEEF, - 541: 0xAEF0, - 542: 0xAEF1, - 543: 0xAEF2, - 544: 0xAEF3, - 545: 0xAEF5, - 546: 0xAEF6, - 547: 0xAEF7, - 548: 0xAEF9, - 549: 0xAEFA, - 550: 0xAEFB, - 551: 0xAEFD, - 552: 0xAEFE, - 553: 0xAEFF, - 554: 0xAF00, - 555: 0xAF01, - 556: 0xAF02, - 557: 0xAF03, - 558: 0xAF04, - 559: 0xAF05, - 560: 0xAF06, - 561: 0xAF09, - 562: 0xAF0A, - 563: 0xAF0B, - 564: 0xAF0C, - 565: 0xAF0E, - 566: 0xAF0F, - 567: 0xAF11, - 568: 0xAF12, - 569: 0xAF13, - 570: 0xAF14, - 571: 0xAF15, - 572: 0xAF16, - 573: 0xAF17, - 574: 0xAF18, - 575: 0xAF19, - 576: 0xAF1A, - 577: 0xAF1B, - 578: 0xAF1C, - 579: 0xAF1D, - 580: 0xAF1E, - 581: 0xAF1F, - 582: 0xAF20, - 583: 0xAF21, - 584: 0xAF22, - 585: 0xAF23, - 586: 0xAF24, - 587: 0xAF25, - 588: 0xAF26, - 589: 0xAF27, - 590: 0xAF28, - 591: 0xAF29, - 592: 0xAF2A, - 593: 0xAF2B, - 594: 0xAF2E, - 595: 0xAF2F, - 596: 0xAF31, - 597: 0xAF33, - 598: 0xAF35, - 599: 0xAF36, - 600: 0xAF37, - 601: 0xAF38, - 602: 0xAF39, - 603: 0xAF3A, - 604: 0xAF3B, - 605: 0xAF3E, - 606: 0xAF40, - 607: 0xAF44, - 608: 0xAF45, - 609: 0xAF46, - 610: 0xAF47, - 611: 0xAF4A, - 612: 0xAF4B, - 613: 0xAF4C, - 614: 0xAF4D, - 615: 0xAF4E, - 616: 0xAF4F, - 617: 0xAF51, - 618: 0xAF52, - 619: 0xAF53, - 620: 0xAF54, - 621: 0xAF55, - 622: 0xAF56, - 623: 0xAF57, - 624: 0xAF58, - 625: 0xAF59, - 626: 0xAF5A, - 627: 0xAF5B, - 628: 0xAF5E, - 629: 0xAF5F, - 630: 0xAF60, - 631: 0xAF61, - 632: 0xAF62, - 633: 0xAF63, - 634: 0xAF66, - 635: 0xAF67, - 636: 0xAF68, - 637: 0xAF69, - 638: 0xAF6A, - 639: 0xAF6B, - 640: 0xAF6C, - 641: 0xAF6D, - 642: 0xAF6E, - 643: 0xAF6F, - 644: 0xAF70, - 645: 0xAF71, - 646: 0xAF72, - 647: 0xAF73, - 648: 0xAF74, - 649: 0xAF75, - 650: 0xAF76, - 651: 0xAF77, - 652: 0xAF78, - 653: 0xAF7A, - 654: 0xAF7B, - 655: 0xAF7C, - 656: 0xAF7D, - 657: 0xAF7E, - 658: 0xAF7F, - 659: 0xAF81, - 660: 0xAF82, - 661: 0xAF83, - 662: 0xAF85, - 663: 0xAF86, - 664: 0xAF87, - 665: 0xAF89, - 666: 0xAF8A, - 667: 0xAF8B, - 668: 0xAF8C, - 669: 0xAF8D, - 670: 0xAF8E, - 671: 0xAF8F, - 672: 0xAF92, - 673: 0xAF93, - 674: 0xAF94, - 675: 0xAF96, - 676: 0xAF97, - 677: 0xAF98, - 678: 0xAF99, - 679: 0xAF9A, - 680: 0xAF9B, - 681: 0xAF9D, - 682: 0xAF9E, - 683: 0xAF9F, - 684: 0xAFA0, - 685: 0xAFA1, - 686: 0xAFA2, - 687: 0xAFA3, - 688: 0xAFA4, - 689: 0xAFA5, - 690: 0xAFA6, - 691: 0xAFA7, - 692: 0xAFA8, - 693: 0xAFA9, - 694: 0xAFAA, - 695: 0xAFAB, - 696: 0xAFAC, - 697: 0xAFAD, - 698: 0xAFAE, - 699: 0xAFAF, - 700: 0xAFB0, - 701: 0xAFB1, - 702: 0xAFB2, - 703: 0xAFB3, - 704: 0xAFB4, - 705: 0xAFB5, - 706: 0xAFB6, - 707: 0xAFB7, - 708: 0xAFBA, - 709: 0xAFBB, - 710: 0xAFBD, - 711: 0xAFBE, - 712: 0xAFBF, - 713: 0xAFC1, - 714: 0xAFC2, - 715: 0xAFC3, - 716: 0xAFC4, - 717: 0xAFC5, - 718: 0xAFC6, - 719: 0xAFCA, - 720: 0xAFCC, - 721: 0xAFCF, - 722: 0xAFD0, - 723: 0xAFD1, - 724: 0xAFD2, - 725: 0xAFD3, - 726: 0xAFD5, - 727: 0xAFD6, - 728: 0xAFD7, - 729: 0xAFD8, - 730: 0xAFD9, - 731: 0xAFDA, - 732: 0xAFDB, - 733: 0xAFDD, - 734: 0xAFDE, - 735: 0xAFDF, - 736: 0xAFE0, - 737: 0xAFE1, - 738: 0xAFE2, - 739: 0xAFE3, - 740: 0xAFE4, - 741: 0xAFE5, - 742: 0xAFE6, - 743: 0xAFE7, - 744: 0xAFEA, - 745: 0xAFEB, - 746: 0xAFEC, - 747: 0xAFED, - 748: 0xAFEE, - 749: 0xAFEF, - 750: 0xAFF2, - 751: 0xAFF3, - 752: 0xAFF5, - 753: 0xAFF6, - 754: 0xAFF7, - 755: 0xAFF9, - 756: 0xAFFA, - 757: 0xAFFB, - 758: 0xAFFC, - 759: 0xAFFD, - 760: 0xAFFE, - 761: 0xAFFF, - 762: 0xB002, - 763: 0xB003, - 764: 0xB005, - 765: 0xB006, - 766: 0xB007, - 767: 0xB008, - 768: 0xB009, - 769: 0xB00A, - 770: 0xB00B, - 771: 0xB00D, - 772: 0xB00E, - 773: 0xB00F, - 774: 0xB011, - 775: 0xB012, - 776: 0xB013, - 777: 0xB015, - 778: 0xB016, - 779: 0xB017, - 780: 0xB018, - 781: 0xB019, - 782: 0xB01A, - 783: 0xB01B, - 784: 0xB01E, - 785: 0xB01F, - 786: 0xB020, - 787: 0xB021, - 788: 0xB022, - 789: 0xB023, - 790: 0xB024, - 791: 0xB025, - 792: 0xB026, - 793: 0xB027, - 794: 0xB029, - 795: 0xB02A, - 796: 0xB02B, - 797: 0xB02C, - 798: 0xB02D, - 799: 0xB02E, - 800: 0xB02F, - 801: 0xB030, - 802: 0xB031, - 803: 0xB032, - 804: 0xB033, - 805: 0xB034, - 806: 0xB035, - 807: 0xB036, - 808: 0xB037, - 809: 0xB038, - 810: 0xB039, - 811: 0xB03A, - 812: 0xB03B, - 813: 0xB03C, - 814: 0xB03D, - 815: 0xB03E, - 816: 0xB03F, - 817: 0xB040, - 818: 0xB041, - 819: 0xB042, - 820: 0xB043, - 821: 0xB046, - 822: 0xB047, - 823: 0xB049, - 824: 0xB04B, - 825: 0xB04D, - 826: 0xB04F, - 827: 0xB050, - 828: 0xB051, - 829: 0xB052, - 830: 0xB056, - 831: 0xB058, - 832: 0xB05A, - 833: 0xB05B, - 834: 0xB05C, - 835: 0xB05E, - 836: 0xB05F, - 837: 0xB060, - 838: 0xB061, - 839: 0xB062, - 840: 0xB063, - 841: 0xB064, - 842: 0xB065, - 843: 0xB066, - 844: 0xB067, - 845: 0xB068, - 846: 0xB069, - 847: 0xB06A, - 848: 0xB06B, - 849: 0xB06C, - 850: 0xB06D, - 851: 0xB06E, - 852: 0xB06F, - 853: 0xB070, - 854: 0xB071, - 855: 0xB072, - 856: 0xB073, - 857: 0xB074, - 858: 0xB075, - 859: 0xB076, - 860: 0xB077, - 861: 0xB078, - 862: 0xB079, - 863: 0xB07A, - 864: 0xB07B, - 865: 0xB07E, - 866: 0xB07F, - 867: 0xB081, - 868: 0xB082, - 869: 0xB083, - 870: 0xB085, - 871: 0xB086, - 872: 0xB087, - 873: 0xB088, - 874: 0xB089, - 875: 0xB08A, - 876: 0xB08B, - 877: 0xB08E, - 878: 0xB090, - 879: 0xB092, - 880: 0xB093, - 881: 0xB094, - 882: 0xB095, - 883: 0xB096, - 884: 0xB097, - 885: 0xB09B, - 886: 0xB09D, - 887: 0xB09E, - 888: 0xB0A3, - 889: 0xB0A4, - 890: 0xB0A5, - 891: 0xB0A6, - 892: 0xB0A7, - 893: 0xB0AA, - 894: 0xB0B0, - 895: 0xB0B2, - 896: 0xB0B6, - 897: 0xB0B7, - 898: 0xB0B9, - 899: 0xB0BA, - 900: 0xB0BB, - 901: 0xB0BD, - 902: 0xB0BE, - 903: 0xB0BF, - 904: 0xB0C0, - 905: 0xB0C1, - 906: 0xB0C2, - 907: 0xB0C3, - 908: 0xB0C6, - 909: 0xB0CA, - 910: 0xB0CB, - 911: 0xB0CC, - 912: 0xB0CD, - 913: 0xB0CE, - 914: 0xB0CF, - 915: 0xB0D2, - 916: 0xB0D3, - 917: 0xB0D5, - 918: 0xB0D6, - 919: 0xB0D7, - 920: 0xB0D9, - 921: 0xB0DA, - 922: 0xB0DB, - 923: 0xB0DC, - 924: 0xB0DD, - 925: 0xB0DE, - 926: 0xB0DF, - 927: 0xB0E1, - 928: 0xB0E2, - 929: 0xB0E3, - 930: 0xB0E4, - 931: 0xB0E6, - 932: 0xB0E7, - 933: 0xB0E8, - 934: 0xB0E9, - 935: 0xB0EA, - 936: 0xB0EB, - 937: 0xB0EC, - 938: 0xB0ED, - 939: 0xB0EE, - 940: 0xB0EF, - 941: 0xB0F0, - 942: 0xB0F1, - 943: 0xB0F2, - 944: 0xB0F3, - 945: 0xB0F4, - 946: 0xB0F5, - 947: 0xB0F6, - 948: 0xB0F7, - 949: 0xB0F8, - 950: 0xB0F9, - 951: 0xB0FA, - 952: 0xB0FB, - 953: 0xB0FC, - 954: 0xB0FD, - 955: 0xB0FE, - 956: 0xB0FF, - 957: 0xB100, - 958: 0xB101, - 959: 0xB102, - 960: 0xB103, - 961: 0xB104, - 962: 0xB105, - 963: 0xB106, - 964: 0xB107, - 965: 0xB10A, - 966: 0xB10D, - 967: 0xB10E, - 968: 0xB10F, - 969: 0xB111, - 970: 0xB114, - 971: 0xB115, - 972: 0xB116, - 973: 0xB117, - 974: 0xB11A, - 975: 0xB11E, - 976: 0xB11F, - 977: 0xB120, - 978: 0xB121, - 979: 0xB122, - 980: 0xB126, - 981: 0xB127, - 982: 0xB129, - 983: 0xB12A, - 984: 0xB12B, - 985: 0xB12D, - 986: 0xB12E, - 987: 0xB12F, - 988: 0xB130, - 989: 0xB131, - 990: 0xB132, - 991: 0xB133, - 992: 0xB136, - 993: 0xB13A, - 994: 0xB13B, - 995: 0xB13C, - 996: 0xB13D, - 997: 0xB13E, - 998: 0xB13F, - 999: 0xB142, - 1000: 0xB143, - 1001: 0xB145, - 1002: 0xB146, - 1003: 0xB147, - 1004: 0xB149, - 1005: 0xB14A, - 1006: 0xB14B, - 1007: 0xB14C, - 1008: 0xB14D, - 1009: 0xB14E, - 1010: 0xB14F, - 1011: 0xB152, - 1012: 0xB153, - 1013: 0xB156, - 1014: 0xB157, - 1015: 0xB159, - 1016: 0xB15A, - 1017: 0xB15B, - 1018: 0xB15D, - 1019: 0xB15E, - 1020: 0xB15F, - 1021: 0xB161, - 1022: 0xB162, - 1023: 0xB163, - 1024: 0xB164, - 1025: 0xB165, - 1026: 0xB166, - 1027: 0xB167, - 1028: 0xB168, - 1029: 0xB169, - 1030: 0xB16A, - 1031: 0xB16B, - 1032: 0xB16C, - 1033: 0xB16D, - 1034: 0xB16E, - 1035: 0xB16F, - 1036: 0xB170, - 1037: 0xB171, - 1038: 0xB172, - 1039: 0xB173, - 1040: 0xB174, - 1041: 0xB175, - 1042: 0xB176, - 1043: 0xB177, - 1044: 0xB17A, - 1045: 0xB17B, - 1046: 0xB17D, - 1047: 0xB17E, - 1048: 0xB17F, - 1049: 0xB181, - 1050: 0xB183, - 1051: 0xB184, - 1052: 0xB185, - 1053: 0xB186, - 1054: 0xB187, - 1055: 0xB18A, - 1056: 0xB18C, - 1057: 0xB18E, - 1058: 0xB18F, - 1059: 0xB190, - 1060: 0xB191, - 1061: 0xB195, - 1062: 0xB196, - 1063: 0xB197, - 1064: 0xB199, - 1065: 0xB19A, - 1066: 0xB19B, - 1067: 0xB19D, - 1068: 0xB19E, - 1069: 0xB19F, - 1070: 0xB1A0, - 1071: 0xB1A1, - 1072: 0xB1A2, - 1073: 0xB1A3, - 1074: 0xB1A4, - 1075: 0xB1A5, - 1076: 0xB1A6, - 1077: 0xB1A7, - 1078: 0xB1A9, - 1079: 0xB1AA, - 1080: 0xB1AB, - 1081: 0xB1AC, - 1082: 0xB1AD, - 1083: 0xB1AE, - 1084: 0xB1AF, - 1085: 0xB1B0, - 1086: 0xB1B1, - 1087: 0xB1B2, - 1088: 0xB1B3, - 1089: 0xB1B4, - 1090: 0xB1B5, - 1091: 0xB1B6, - 1092: 0xB1B7, - 1093: 0xB1B8, - 1094: 0xB1B9, - 1095: 0xB1BA, - 1096: 0xB1BB, - 1097: 0xB1BC, - 1098: 0xB1BD, - 1099: 0xB1BE, - 1100: 0xB1BF, - 1101: 0xB1C0, - 1102: 0xB1C1, - 1103: 0xB1C2, - 1104: 0xB1C3, - 1105: 0xB1C4, - 1106: 0xB1C5, - 1107: 0xB1C6, - 1108: 0xB1C7, - 1109: 0xB1C8, - 1110: 0xB1C9, - 1111: 0xB1CA, - 1112: 0xB1CB, - 1113: 0xB1CD, - 1114: 0xB1CE, - 1115: 0xB1CF, - 1116: 0xB1D1, - 1117: 0xB1D2, - 1118: 0xB1D3, - 1119: 0xB1D5, - 1120: 0xB1D6, - 1121: 0xB1D7, - 1122: 0xB1D8, - 1123: 0xB1D9, - 1124: 0xB1DA, - 1125: 0xB1DB, - 1126: 0xB1DE, - 1127: 0xB1E0, - 1128: 0xB1E1, - 1129: 0xB1E2, - 1130: 0xB1E3, - 1131: 0xB1E4, - 1132: 0xB1E5, - 1133: 0xB1E6, - 1134: 0xB1E7, - 1135: 0xB1EA, - 1136: 0xB1EB, - 1137: 0xB1ED, - 1138: 0xB1EE, - 1139: 0xB1EF, - 1140: 0xB1F1, - 1141: 0xB1F2, - 1142: 0xB1F3, - 1143: 0xB1F4, - 1144: 0xB1F5, - 1145: 0xB1F6, - 1146: 0xB1F7, - 1147: 0xB1F8, - 1148: 0xB1FA, - 1149: 0xB1FC, - 1150: 0xB1FE, - 1151: 0xB1FF, - 1152: 0xB200, - 1153: 0xB201, - 1154: 0xB202, - 1155: 0xB203, - 1156: 0xB206, - 1157: 0xB207, - 1158: 0xB209, - 1159: 0xB20A, - 1160: 0xB20D, - 1161: 0xB20E, - 1162: 0xB20F, - 1163: 0xB210, - 1164: 0xB211, - 1165: 0xB212, - 1166: 0xB213, - 1167: 0xB216, - 1168: 0xB218, - 1169: 0xB21A, - 1170: 0xB21B, - 1171: 0xB21C, - 1172: 0xB21D, - 1173: 0xB21E, - 1174: 0xB21F, - 1175: 0xB221, - 1176: 0xB222, - 1177: 0xB223, - 1178: 0xB224, - 1179: 0xB225, - 1180: 0xB226, - 1181: 0xB227, - 1182: 0xB228, - 1183: 0xB229, - 1184: 0xB22A, - 1185: 0xB22B, - 1186: 0xB22C, - 1187: 0xB22D, - 1188: 0xB22E, - 1189: 0xB22F, - 1190: 0xB230, - 1191: 0xB231, - 1192: 0xB232, - 1193: 0xB233, - 1194: 0xB235, - 1195: 0xB236, - 1196: 0xB237, - 1197: 0xB238, - 1198: 0xB239, - 1199: 0xB23A, - 1200: 0xB23B, - 1201: 0xB23D, - 1202: 0xB23E, - 1203: 0xB23F, - 1204: 0xB240, - 1205: 0xB241, - 1206: 0xB242, - 1207: 0xB243, - 1208: 0xB244, - 1209: 0xB245, - 1210: 0xB246, - 1211: 0xB247, - 1212: 0xB248, - 1213: 0xB249, - 1214: 0xB24A, - 1215: 0xB24B, - 1216: 0xB24C, - 1217: 0xB24D, - 1218: 0xB24E, - 1219: 0xB24F, - 1220: 0xB250, - 1221: 0xB251, - 1222: 0xB252, - 1223: 0xB253, - 1224: 0xB254, - 1225: 0xB255, - 1226: 0xB256, - 1227: 0xB257, - 1228: 0xB259, - 1229: 0xB25A, - 1230: 0xB25B, - 1231: 0xB25D, - 1232: 0xB25E, - 1233: 0xB25F, - 1234: 0xB261, - 1235: 0xB262, - 1236: 0xB263, - 1237: 0xB264, - 1238: 0xB265, - 1239: 0xB266, - 1240: 0xB267, - 1241: 0xB26A, - 1242: 0xB26B, - 1243: 0xB26C, - 1244: 0xB26D, - 1245: 0xB26E, - 1246: 0xB26F, - 1247: 0xB270, - 1248: 0xB271, - 1249: 0xB272, - 1250: 0xB273, - 1251: 0xB276, - 1252: 0xB277, - 1253: 0xB278, - 1254: 0xB279, - 1255: 0xB27A, - 1256: 0xB27B, - 1257: 0xB27D, - 1258: 0xB27E, - 1259: 0xB27F, - 1260: 0xB280, - 1261: 0xB281, - 1262: 0xB282, - 1263: 0xB283, - 1264: 0xB286, - 1265: 0xB287, - 1266: 0xB288, - 1267: 0xB28A, - 1268: 0xB28B, - 1269: 0xB28C, - 1270: 0xB28D, - 1271: 0xB28E, - 1272: 0xB28F, - 1273: 0xB292, - 1274: 0xB293, - 1275: 0xB295, - 1276: 0xB296, - 1277: 0xB297, - 1278: 0xB29B, - 1279: 0xB29C, - 1280: 0xB29D, - 1281: 0xB29E, - 1282: 0xB29F, - 1283: 0xB2A2, - 1284: 0xB2A4, - 1285: 0xB2A7, - 1286: 0xB2A8, - 1287: 0xB2A9, - 1288: 0xB2AB, - 1289: 0xB2AD, - 1290: 0xB2AE, - 1291: 0xB2AF, - 1292: 0xB2B1, - 1293: 0xB2B2, - 1294: 0xB2B3, - 1295: 0xB2B5, - 1296: 0xB2B6, - 1297: 0xB2B7, - 1298: 0xB2B8, - 1299: 0xB2B9, - 1300: 0xB2BA, - 1301: 0xB2BB, - 1302: 0xB2BC, - 1303: 0xB2BD, - 1304: 0xB2BE, - 1305: 0xB2BF, - 1306: 0xB2C0, - 1307: 0xB2C1, - 1308: 0xB2C2, - 1309: 0xB2C3, - 1310: 0xB2C4, - 1311: 0xB2C5, - 1312: 0xB2C6, - 1313: 0xB2C7, - 1314: 0xB2CA, - 1315: 0xB2CB, - 1316: 0xB2CD, - 1317: 0xB2CE, - 1318: 0xB2CF, - 1319: 0xB2D1, - 1320: 0xB2D3, - 1321: 0xB2D4, - 1322: 0xB2D5, - 1323: 0xB2D6, - 1324: 0xB2D7, - 1325: 0xB2DA, - 1326: 0xB2DC, - 1327: 0xB2DE, - 1328: 0xB2DF, - 1329: 0xB2E0, - 1330: 0xB2E1, - 1331: 0xB2E3, - 1332: 0xB2E7, - 1333: 0xB2E9, - 1334: 0xB2EA, - 1335: 0xB2F0, - 1336: 0xB2F1, - 1337: 0xB2F2, - 1338: 0xB2F6, - 1339: 0xB2FC, - 1340: 0xB2FD, - 1341: 0xB2FE, - 1342: 0xB302, - 1343: 0xB303, - 1344: 0xB305, - 1345: 0xB306, - 1346: 0xB307, - 1347: 0xB309, - 1348: 0xB30A, - 1349: 0xB30B, - 1350: 0xB30C, - 1351: 0xB30D, - 1352: 0xB30E, - 1353: 0xB30F, - 1354: 0xB312, - 1355: 0xB316, - 1356: 0xB317, - 1357: 0xB318, - 1358: 0xB319, - 1359: 0xB31A, - 1360: 0xB31B, - 1361: 0xB31D, - 1362: 0xB31E, - 1363: 0xB31F, - 1364: 0xB320, - 1365: 0xB321, - 1366: 0xB322, - 1367: 0xB323, - 1368: 0xB324, - 1369: 0xB325, - 1370: 0xB326, - 1371: 0xB327, - 1372: 0xB328, - 1373: 0xB329, - 1374: 0xB32A, - 1375: 0xB32B, - 1376: 0xB32C, - 1377: 0xB32D, - 1378: 0xB32E, - 1379: 0xB32F, - 1380: 0xB330, - 1381: 0xB331, - 1382: 0xB332, - 1383: 0xB333, - 1384: 0xB334, - 1385: 0xB335, - 1386: 0xB336, - 1387: 0xB337, - 1388: 0xB338, - 1389: 0xB339, - 1390: 0xB33A, - 1391: 0xB33B, - 1392: 0xB33C, - 1393: 0xB33D, - 1394: 0xB33E, - 1395: 0xB33F, - 1396: 0xB340, - 1397: 0xB341, - 1398: 0xB342, - 1399: 0xB343, - 1400: 0xB344, - 1401: 0xB345, - 1402: 0xB346, - 1403: 0xB347, - 1404: 0xB348, - 1405: 0xB349, - 1406: 0xB34A, - 1407: 0xB34B, - 1408: 0xB34C, - 1409: 0xB34D, - 1410: 0xB34E, - 1411: 0xB34F, - 1412: 0xB350, - 1413: 0xB351, - 1414: 0xB352, - 1415: 0xB353, - 1416: 0xB357, - 1417: 0xB359, - 1418: 0xB35A, - 1419: 0xB35D, - 1420: 0xB360, - 1421: 0xB361, - 1422: 0xB362, - 1423: 0xB363, - 1424: 0xB366, - 1425: 0xB368, - 1426: 0xB36A, - 1427: 0xB36C, - 1428: 0xB36D, - 1429: 0xB36F, - 1430: 0xB372, - 1431: 0xB373, - 1432: 0xB375, - 1433: 0xB376, - 1434: 0xB377, - 1435: 0xB379, - 1436: 0xB37A, - 1437: 0xB37B, - 1438: 0xB37C, - 1439: 0xB37D, - 1440: 0xB37E, - 1441: 0xB37F, - 1442: 0xB382, - 1443: 0xB386, - 1444: 0xB387, - 1445: 0xB388, - 1446: 0xB389, - 1447: 0xB38A, - 1448: 0xB38B, - 1449: 0xB38D, - 1450: 0xB38E, - 1451: 0xB38F, - 1452: 0xB391, - 1453: 0xB392, - 1454: 0xB393, - 1455: 0xB395, - 1456: 0xB396, - 1457: 0xB397, - 1458: 0xB398, - 1459: 0xB399, - 1460: 0xB39A, - 1461: 0xB39B, - 1462: 0xB39C, - 1463: 0xB39D, - 1464: 0xB39E, - 1465: 0xB39F, - 1466: 0xB3A2, - 1467: 0xB3A3, - 1468: 0xB3A4, - 1469: 0xB3A5, - 1470: 0xB3A6, - 1471: 0xB3A7, - 1472: 0xB3A9, - 1473: 0xB3AA, - 1474: 0xB3AB, - 1475: 0xB3AD, - 1476: 0xB3AE, - 1477: 0xB3AF, - 1478: 0xB3B0, - 1479: 0xB3B1, - 1480: 0xB3B2, - 1481: 0xB3B3, - 1482: 0xB3B4, - 1483: 0xB3B5, - 1484: 0xB3B6, - 1485: 0xB3B7, - 1486: 0xB3B8, - 1487: 0xB3B9, - 1488: 0xB3BA, - 1489: 0xB3BB, - 1490: 0xB3BC, - 1491: 0xB3BD, - 1492: 0xB3BE, - 1493: 0xB3BF, - 1494: 0xB3C0, - 1495: 0xB3C1, - 1496: 0xB3C2, - 1497: 0xB3C3, - 1498: 0xB3C6, - 1499: 0xB3C7, - 1500: 0xB3C9, - 1501: 0xB3CA, - 1502: 0xB3CD, - 1503: 0xB3CF, - 1504: 0xB3D1, - 1505: 0xB3D2, - 1506: 0xB3D3, - 1507: 0xB3D6, - 1508: 0xB3D8, - 1509: 0xB3DA, - 1510: 0xB3DC, - 1511: 0xB3DE, - 1512: 0xB3DF, - 1513: 0xB3E1, - 1514: 0xB3E2, - 1515: 0xB3E3, - 1516: 0xB3E5, - 1517: 0xB3E6, - 1518: 0xB3E7, - 1519: 0xB3E9, - 1520: 0xB3EA, - 1521: 0xB3EB, - 1522: 0xB3EC, - 1523: 0xB3ED, - 1524: 0xB3EE, - 1525: 0xB3EF, - 1526: 0xB3F0, - 1527: 0xB3F1, - 1528: 0xB3F2, - 1529: 0xB3F3, - 1530: 0xB3F4, - 1531: 0xB3F5, - 1532: 0xB3F6, - 1533: 0xB3F7, - 1534: 0xB3F8, - 1535: 0xB3F9, - 1536: 0xB3FA, - 1537: 0xB3FB, - 1538: 0xB3FD, - 1539: 0xB3FE, - 1540: 0xB3FF, - 1541: 0xB400, - 1542: 0xB401, - 1543: 0xB402, - 1544: 0xB403, - 1545: 0xB404, - 1546: 0xB405, - 1547: 0xB406, - 1548: 0xB407, - 1549: 0xB408, - 1550: 0xB409, - 1551: 0xB40A, - 1552: 0xB40B, - 1553: 0xB40C, - 1554: 0xB40D, - 1555: 0xB40E, - 1556: 0xB40F, - 1557: 0xB411, - 1558: 0xB412, - 1559: 0xB413, - 1560: 0xB414, - 1561: 0xB415, - 1562: 0xB416, - 1563: 0xB417, - 1564: 0xB419, - 1565: 0xB41A, - 1566: 0xB41B, - 1567: 0xB41D, - 1568: 0xB41E, - 1569: 0xB41F, - 1570: 0xB421, - 1571: 0xB422, - 1572: 0xB423, - 1573: 0xB424, - 1574: 0xB425, - 1575: 0xB426, - 1576: 0xB427, - 1577: 0xB42A, - 1578: 0xB42C, - 1579: 0xB42D, - 1580: 0xB42E, - 1581: 0xB42F, - 1582: 0xB430, - 1583: 0xB431, - 1584: 0xB432, - 1585: 0xB433, - 1586: 0xB435, - 1587: 0xB436, - 1588: 0xB437, - 1589: 0xB438, - 1590: 0xB439, - 1591: 0xB43A, - 1592: 0xB43B, - 1593: 0xB43C, - 1594: 0xB43D, - 1595: 0xB43E, - 1596: 0xB43F, - 1597: 0xB440, - 1598: 0xB441, - 1599: 0xB442, - 1600: 0xB443, - 1601: 0xB444, - 1602: 0xB445, - 1603: 0xB446, - 1604: 0xB447, - 1605: 0xB448, - 1606: 0xB449, - 1607: 0xB44A, - 1608: 0xB44B, - 1609: 0xB44C, - 1610: 0xB44D, - 1611: 0xB44E, - 1612: 0xB44F, - 1613: 0xB452, - 1614: 0xB453, - 1615: 0xB455, - 1616: 0xB456, - 1617: 0xB457, - 1618: 0xB459, - 1619: 0xB45A, - 1620: 0xB45B, - 1621: 0xB45C, - 1622: 0xB45D, - 1623: 0xB45E, - 1624: 0xB45F, - 1625: 0xB462, - 1626: 0xB464, - 1627: 0xB466, - 1628: 0xB467, - 1629: 0xB468, - 1630: 0xB469, - 1631: 0xB46A, - 1632: 0xB46B, - 1633: 0xB46D, - 1634: 0xB46E, - 1635: 0xB46F, - 1636: 0xB470, - 1637: 0xB471, - 1638: 0xB472, - 1639: 0xB473, - 1640: 0xB474, - 1641: 0xB475, - 1642: 0xB476, - 1643: 0xB477, - 1644: 0xB478, - 1645: 0xB479, - 1646: 0xB47A, - 1647: 0xB47B, - 1648: 0xB47C, - 1649: 0xB47D, - 1650: 0xB47E, - 1651: 0xB47F, - 1652: 0xB481, - 1653: 0xB482, - 1654: 0xB483, - 1655: 0xB484, - 1656: 0xB485, - 1657: 0xB486, - 1658: 0xB487, - 1659: 0xB489, - 1660: 0xB48A, - 1661: 0xB48B, - 1662: 0xB48C, - 1663: 0xB48D, - 1664: 0xB48E, - 1665: 0xB48F, - 1666: 0xB490, - 1667: 0xB491, - 1668: 0xB492, - 1669: 0xB493, - 1670: 0xB494, - 1671: 0xB495, - 1672: 0xB496, - 1673: 0xB497, - 1674: 0xB498, - 1675: 0xB499, - 1676: 0xB49A, - 1677: 0xB49B, - 1678: 0xB49C, - 1679: 0xB49E, - 1680: 0xB49F, - 1681: 0xB4A0, - 1682: 0xB4A1, - 1683: 0xB4A2, - 1684: 0xB4A3, - 1685: 0xB4A5, - 1686: 0xB4A6, - 1687: 0xB4A7, - 1688: 0xB4A9, - 1689: 0xB4AA, - 1690: 0xB4AB, - 1691: 0xB4AD, - 1692: 0xB4AE, - 1693: 0xB4AF, - 1694: 0xB4B0, - 1695: 0xB4B1, - 1696: 0xB4B2, - 1697: 0xB4B3, - 1698: 0xB4B4, - 1699: 0xB4B6, - 1700: 0xB4B8, - 1701: 0xB4BA, - 1702: 0xB4BB, - 1703: 0xB4BC, - 1704: 0xB4BD, - 1705: 0xB4BE, - 1706: 0xB4BF, - 1707: 0xB4C1, - 1708: 0xB4C2, - 1709: 0xB4C3, - 1710: 0xB4C5, - 1711: 0xB4C6, - 1712: 0xB4C7, - 1713: 0xB4C9, - 1714: 0xB4CA, - 1715: 0xB4CB, - 1716: 0xB4CC, - 1717: 0xB4CD, - 1718: 0xB4CE, - 1719: 0xB4CF, - 1720: 0xB4D1, - 1721: 0xB4D2, - 1722: 0xB4D3, - 1723: 0xB4D4, - 1724: 0xB4D6, - 1725: 0xB4D7, - 1726: 0xB4D8, - 1727: 0xB4D9, - 1728: 0xB4DA, - 1729: 0xB4DB, - 1730: 0xB4DE, - 1731: 0xB4DF, - 1732: 0xB4E1, - 1733: 0xB4E2, - 1734: 0xB4E5, - 1735: 0xB4E7, - 1736: 0xB4E8, - 1737: 0xB4E9, - 1738: 0xB4EA, - 1739: 0xB4EB, - 1740: 0xB4EE, - 1741: 0xB4F0, - 1742: 0xB4F2, - 1743: 0xB4F3, - 1744: 0xB4F4, - 1745: 0xB4F5, - 1746: 0xB4F6, - 1747: 0xB4F7, - 1748: 0xB4F9, - 1749: 0xB4FA, - 1750: 0xB4FB, - 1751: 0xB4FC, - 1752: 0xB4FD, - 1753: 0xB4FE, - 1754: 0xB4FF, - 1755: 0xB500, - 1756: 0xB501, - 1757: 0xB502, - 1758: 0xB503, - 1759: 0xB504, - 1760: 0xB505, - 1761: 0xB506, - 1762: 0xB507, - 1763: 0xB508, - 1764: 0xB509, - 1765: 0xB50A, - 1766: 0xB50B, - 1767: 0xB50C, - 1768: 0xB50D, - 1769: 0xB50E, - 1770: 0xB50F, - 1771: 0xB510, - 1772: 0xB511, - 1773: 0xB512, - 1774: 0xB513, - 1775: 0xB516, - 1776: 0xB517, - 1777: 0xB519, - 1778: 0xB51A, - 1779: 0xB51D, - 1780: 0xB51E, - 1781: 0xB51F, - 1782: 0xB520, - 1783: 0xB521, - 1784: 0xB522, - 1785: 0xB523, - 1786: 0xB526, - 1787: 0xB52B, - 1788: 0xB52C, - 1789: 0xB52D, - 1790: 0xB52E, - 1791: 0xB52F, - 1792: 0xB532, - 1793: 0xB533, - 1794: 0xB535, - 1795: 0xB536, - 1796: 0xB537, - 1797: 0xB539, - 1798: 0xB53A, - 1799: 0xB53B, - 1800: 0xB53C, - 1801: 0xB53D, - 1802: 0xB53E, - 1803: 0xB53F, - 1804: 0xB542, - 1805: 0xB546, - 1806: 0xB547, - 1807: 0xB548, - 1808: 0xB549, - 1809: 0xB54A, - 1810: 0xB54E, - 1811: 0xB54F, - 1812: 0xB551, - 1813: 0xB552, - 1814: 0xB553, - 1815: 0xB555, - 1816: 0xB556, - 1817: 0xB557, - 1818: 0xB558, - 1819: 0xB559, - 1820: 0xB55A, - 1821: 0xB55B, - 1822: 0xB55E, - 1823: 0xB562, - 1824: 0xB563, - 1825: 0xB564, - 1826: 0xB565, - 1827: 0xB566, - 1828: 0xB567, - 1829: 0xB568, - 1830: 0xB569, - 1831: 0xB56A, - 1832: 0xB56B, - 1833: 0xB56C, - 1834: 0xB56D, - 1835: 0xB56E, - 1836: 0xB56F, - 1837: 0xB570, - 1838: 0xB571, - 1839: 0xB572, - 1840: 0xB573, - 1841: 0xB574, - 1842: 0xB575, - 1843: 0xB576, - 1844: 0xB577, - 1845: 0xB578, - 1846: 0xB579, - 1847: 0xB57A, - 1848: 0xB57B, - 1849: 0xB57C, - 1850: 0xB57D, - 1851: 0xB57E, - 1852: 0xB57F, - 1853: 0xB580, - 1854: 0xB581, - 1855: 0xB582, - 1856: 0xB583, - 1857: 0xB584, - 1858: 0xB585, - 1859: 0xB586, - 1860: 0xB587, - 1861: 0xB588, - 1862: 0xB589, - 1863: 0xB58A, - 1864: 0xB58B, - 1865: 0xB58C, - 1866: 0xB58D, - 1867: 0xB58E, - 1868: 0xB58F, - 1869: 0xB590, - 1870: 0xB591, - 1871: 0xB592, - 1872: 0xB593, - 1873: 0xB594, - 1874: 0xB595, - 1875: 0xB596, - 1876: 0xB597, - 1877: 0xB598, - 1878: 0xB599, - 1879: 0xB59A, - 1880: 0xB59B, - 1881: 0xB59C, - 1882: 0xB59D, - 1883: 0xB59E, - 1884: 0xB59F, - 1885: 0xB5A2, - 1886: 0xB5A3, - 1887: 0xB5A5, - 1888: 0xB5A6, - 1889: 0xB5A7, - 1890: 0xB5A9, - 1891: 0xB5AC, - 1892: 0xB5AD, - 1893: 0xB5AE, - 1894: 0xB5AF, - 1895: 0xB5B2, - 1896: 0xB5B6, - 1897: 0xB5B7, - 1898: 0xB5B8, - 1899: 0xB5B9, - 1900: 0xB5BA, - 1901: 0xB5BE, - 1902: 0xB5BF, - 1903: 0xB5C1, - 1904: 0xB5C2, - 1905: 0xB5C3, - 1906: 0xB5C5, - 1907: 0xB5C6, - 1908: 0xB5C7, - 1909: 0xB5C8, - 1910: 0xB5C9, - 1911: 0xB5CA, - 1912: 0xB5CB, - 1913: 0xB5CE, - 1914: 0xB5D2, - 1915: 0xB5D3, - 1916: 0xB5D4, - 1917: 0xB5D5, - 1918: 0xB5D6, - 1919: 0xB5D7, - 1920: 0xB5D9, - 1921: 0xB5DA, - 1922: 0xB5DB, - 1923: 0xB5DC, - 1924: 0xB5DD, - 1925: 0xB5DE, - 1926: 0xB5DF, - 1927: 0xB5E0, - 1928: 0xB5E1, - 1929: 0xB5E2, - 1930: 0xB5E3, - 1931: 0xB5E4, - 1932: 0xB5E5, - 1933: 0xB5E6, - 1934: 0xB5E7, - 1935: 0xB5E8, - 1936: 0xB5E9, - 1937: 0xB5EA, - 1938: 0xB5EB, - 1939: 0xB5ED, - 1940: 0xB5EE, - 1941: 0xB5EF, - 1942: 0xB5F0, - 1943: 0xB5F1, - 1944: 0xB5F2, - 1945: 0xB5F3, - 1946: 0xB5F4, - 1947: 0xB5F5, - 1948: 0xB5F6, - 1949: 0xB5F7, - 1950: 0xB5F8, - 1951: 0xB5F9, - 1952: 0xB5FA, - 1953: 0xB5FB, - 1954: 0xB5FC, - 1955: 0xB5FD, - 1956: 0xB5FE, - 1957: 0xB5FF, - 1958: 0xB600, - 1959: 0xB601, - 1960: 0xB602, - 1961: 0xB603, - 1962: 0xB604, - 1963: 0xB605, - 1964: 0xB606, - 1965: 0xB607, - 1966: 0xB608, - 1967: 0xB609, - 1968: 0xB60A, - 1969: 0xB60B, - 1970: 0xB60C, - 1971: 0xB60D, - 1972: 0xB60E, - 1973: 0xB60F, - 1974: 0xB612, - 1975: 0xB613, - 1976: 0xB615, - 1977: 0xB616, - 1978: 0xB617, - 1979: 0xB619, - 1980: 0xB61A, - 1981: 0xB61B, - 1982: 0xB61C, - 1983: 0xB61D, - 1984: 0xB61E, - 1985: 0xB61F, - 1986: 0xB620, - 1987: 0xB621, - 1988: 0xB622, - 1989: 0xB623, - 1990: 0xB624, - 1991: 0xB626, - 1992: 0xB627, - 1993: 0xB628, - 1994: 0xB629, - 1995: 0xB62A, - 1996: 0xB62B, - 1997: 0xB62D, - 1998: 0xB62E, - 1999: 0xB62F, - 2000: 0xB630, - 2001: 0xB631, - 2002: 0xB632, - 2003: 0xB633, - 2004: 0xB635, - 2005: 0xB636, - 2006: 0xB637, - 2007: 0xB638, - 2008: 0xB639, - 2009: 0xB63A, - 2010: 0xB63B, - 2011: 0xB63C, - 2012: 0xB63D, - 2013: 0xB63E, - 2014: 0xB63F, - 2015: 0xB640, - 2016: 0xB641, - 2017: 0xB642, - 2018: 0xB643, - 2019: 0xB644, - 2020: 0xB645, - 2021: 0xB646, - 2022: 0xB647, - 2023: 0xB649, - 2024: 0xB64A, - 2025: 0xB64B, - 2026: 0xB64C, - 2027: 0xB64D, - 2028: 0xB64E, - 2029: 0xB64F, - 2030: 0xB650, - 2031: 0xB651, - 2032: 0xB652, - 2033: 0xB653, - 2034: 0xB654, - 2035: 0xB655, - 2036: 0xB656, - 2037: 0xB657, - 2038: 0xB658, - 2039: 0xB659, - 2040: 0xB65A, - 2041: 0xB65B, - 2042: 0xB65C, - 2043: 0xB65D, - 2044: 0xB65E, - 2045: 0xB65F, - 2046: 0xB660, - 2047: 0xB661, - 2048: 0xB662, - 2049: 0xB663, - 2050: 0xB665, - 2051: 0xB666, - 2052: 0xB667, - 2053: 0xB669, - 2054: 0xB66A, - 2055: 0xB66B, - 2056: 0xB66C, - 2057: 0xB66D, - 2058: 0xB66E, - 2059: 0xB66F, - 2060: 0xB670, - 2061: 0xB671, - 2062: 0xB672, - 2063: 0xB673, - 2064: 0xB674, - 2065: 0xB675, - 2066: 0xB676, - 2067: 0xB677, - 2068: 0xB678, - 2069: 0xB679, - 2070: 0xB67A, - 2071: 0xB67B, - 2072: 0xB67C, - 2073: 0xB67D, - 2074: 0xB67E, - 2075: 0xB67F, - 2076: 0xB680, - 2077: 0xB681, - 2078: 0xB682, - 2079: 0xB683, - 2080: 0xB684, - 2081: 0xB685, - 2082: 0xB686, - 2083: 0xB687, - 2084: 0xB688, - 2085: 0xB689, - 2086: 0xB68A, - 2087: 0xB68B, - 2088: 0xB68C, - 2089: 0xB68D, - 2090: 0xB68E, - 2091: 0xB68F, - 2092: 0xB690, - 2093: 0xB691, - 2094: 0xB692, - 2095: 0xB693, - 2096: 0xB694, - 2097: 0xB695, - 2098: 0xB696, - 2099: 0xB697, - 2100: 0xB698, - 2101: 0xB699, - 2102: 0xB69A, - 2103: 0xB69B, - 2104: 0xB69E, - 2105: 0xB69F, - 2106: 0xB6A1, - 2107: 0xB6A2, - 2108: 0xB6A3, - 2109: 0xB6A5, - 2110: 0xB6A6, - 2111: 0xB6A7, - 2112: 0xB6A8, - 2113: 0xB6A9, - 2114: 0xB6AA, - 2115: 0xB6AD, - 2116: 0xB6AE, - 2117: 0xB6AF, - 2118: 0xB6B0, - 2119: 0xB6B2, - 2120: 0xB6B3, - 2121: 0xB6B4, - 2122: 0xB6B5, - 2123: 0xB6B6, - 2124: 0xB6B7, - 2125: 0xB6B8, - 2126: 0xB6B9, - 2127: 0xB6BA, - 2128: 0xB6BB, - 2129: 0xB6BC, - 2130: 0xB6BD, - 2131: 0xB6BE, - 2132: 0xB6BF, - 2133: 0xB6C0, - 2134: 0xB6C1, - 2135: 0xB6C2, - 2136: 0xB6C3, - 2137: 0xB6C4, - 2138: 0xB6C5, - 2139: 0xB6C6, - 2140: 0xB6C7, - 2141: 0xB6C8, - 2142: 0xB6C9, - 2143: 0xB6CA, - 2144: 0xB6CB, - 2145: 0xB6CC, - 2146: 0xB6CD, - 2147: 0xB6CE, - 2148: 0xB6CF, - 2149: 0xB6D0, - 2150: 0xB6D1, - 2151: 0xB6D2, - 2152: 0xB6D3, - 2153: 0xB6D5, - 2154: 0xB6D6, - 2155: 0xB6D7, - 2156: 0xB6D8, - 2157: 0xB6D9, - 2158: 0xB6DA, - 2159: 0xB6DB, - 2160: 0xB6DC, - 2161: 0xB6DD, - 2162: 0xB6DE, - 2163: 0xB6DF, - 2164: 0xB6E0, - 2165: 0xB6E1, - 2166: 0xB6E2, - 2167: 0xB6E3, - 2168: 0xB6E4, - 2169: 0xB6E5, - 2170: 0xB6E6, - 2171: 0xB6E7, - 2172: 0xB6E8, - 2173: 0xB6E9, - 2174: 0xB6EA, - 2175: 0xB6EB, - 2176: 0xB6EC, - 2177: 0xB6ED, - 2178: 0xB6EE, - 2179: 0xB6EF, - 2180: 0xB6F1, - 2181: 0xB6F2, - 2182: 0xB6F3, - 2183: 0xB6F5, - 2184: 0xB6F6, - 2185: 0xB6F7, - 2186: 0xB6F9, - 2187: 0xB6FA, - 2188: 0xB6FB, - 2189: 0xB6FC, - 2190: 0xB6FD, - 2191: 0xB6FE, - 2192: 0xB6FF, - 2193: 0xB702, - 2194: 0xB703, - 2195: 0xB704, - 2196: 0xB706, - 2197: 0xB707, - 2198: 0xB708, - 2199: 0xB709, - 2200: 0xB70A, - 2201: 0xB70B, - 2202: 0xB70C, - 2203: 0xB70D, - 2204: 0xB70E, - 2205: 0xB70F, - 2206: 0xB710, - 2207: 0xB711, - 2208: 0xB712, - 2209: 0xB713, - 2210: 0xB714, - 2211: 0xB715, - 2212: 0xB716, - 2213: 0xB717, - 2214: 0xB718, - 2215: 0xB719, - 2216: 0xB71A, - 2217: 0xB71B, - 2218: 0xB71C, - 2219: 0xB71D, - 2220: 0xB71E, - 2221: 0xB71F, - 2222: 0xB720, - 2223: 0xB721, - 2224: 0xB722, - 2225: 0xB723, - 2226: 0xB724, - 2227: 0xB725, - 2228: 0xB726, - 2229: 0xB727, - 2230: 0xB72A, - 2231: 0xB72B, - 2232: 0xB72D, - 2233: 0xB72E, - 2234: 0xB731, - 2235: 0xB732, - 2236: 0xB733, - 2237: 0xB734, - 2238: 0xB735, - 2239: 0xB736, - 2240: 0xB737, - 2241: 0xB73A, - 2242: 0xB73C, - 2243: 0xB73D, - 2244: 0xB73E, - 2245: 0xB73F, - 2246: 0xB740, - 2247: 0xB741, - 2248: 0xB742, - 2249: 0xB743, - 2250: 0xB745, - 2251: 0xB746, - 2252: 0xB747, - 2253: 0xB749, - 2254: 0xB74A, - 2255: 0xB74B, - 2256: 0xB74D, - 2257: 0xB74E, - 2258: 0xB74F, - 2259: 0xB750, - 2260: 0xB751, - 2261: 0xB752, - 2262: 0xB753, - 2263: 0xB756, - 2264: 0xB757, - 2265: 0xB758, - 2266: 0xB759, - 2267: 0xB75A, - 2268: 0xB75B, - 2269: 0xB75C, - 2270: 0xB75D, - 2271: 0xB75E, - 2272: 0xB75F, - 2273: 0xB761, - 2274: 0xB762, - 2275: 0xB763, - 2276: 0xB765, - 2277: 0xB766, - 2278: 0xB767, - 2279: 0xB769, - 2280: 0xB76A, - 2281: 0xB76B, - 2282: 0xB76C, - 2283: 0xB76D, - 2284: 0xB76E, - 2285: 0xB76F, - 2286: 0xB772, - 2287: 0xB774, - 2288: 0xB776, - 2289: 0xB777, - 2290: 0xB778, - 2291: 0xB779, - 2292: 0xB77A, - 2293: 0xB77B, - 2294: 0xB77E, - 2295: 0xB77F, - 2296: 0xB781, - 2297: 0xB782, - 2298: 0xB783, - 2299: 0xB785, - 2300: 0xB786, - 2301: 0xB787, - 2302: 0xB788, - 2303: 0xB789, - 2304: 0xB78A, - 2305: 0xB78B, - 2306: 0xB78E, - 2307: 0xB793, - 2308: 0xB794, - 2309: 0xB795, - 2310: 0xB79A, - 2311: 0xB79B, - 2312: 0xB79D, - 2313: 0xB79E, - 2314: 0xB79F, - 2315: 0xB7A1, - 2316: 0xB7A2, - 2317: 0xB7A3, - 2318: 0xB7A4, - 2319: 0xB7A5, - 2320: 0xB7A6, - 2321: 0xB7A7, - 2322: 0xB7AA, - 2323: 0xB7AE, - 2324: 0xB7AF, - 2325: 0xB7B0, - 2326: 0xB7B1, - 2327: 0xB7B2, - 2328: 0xB7B3, - 2329: 0xB7B6, - 2330: 0xB7B7, - 2331: 0xB7B9, - 2332: 0xB7BA, - 2333: 0xB7BB, - 2334: 0xB7BC, - 2335: 0xB7BD, - 2336: 0xB7BE, - 2337: 0xB7BF, - 2338: 0xB7C0, - 2339: 0xB7C1, - 2340: 0xB7C2, - 2341: 0xB7C3, - 2342: 0xB7C4, - 2343: 0xB7C5, - 2344: 0xB7C6, - 2345: 0xB7C8, - 2346: 0xB7CA, - 2347: 0xB7CB, - 2348: 0xB7CC, - 2349: 0xB7CD, - 2350: 0xB7CE, - 2351: 0xB7CF, - 2352: 0xB7D0, - 2353: 0xB7D1, - 2354: 0xB7D2, - 2355: 0xB7D3, - 2356: 0xB7D4, - 2357: 0xB7D5, - 2358: 0xB7D6, - 2359: 0xB7D7, - 2360: 0xB7D8, - 2361: 0xB7D9, - 2362: 0xB7DA, - 2363: 0xB7DB, - 2364: 0xB7DC, - 2365: 0xB7DD, - 2366: 0xB7DE, - 2367: 0xB7DF, - 2368: 0xB7E0, - 2369: 0xB7E1, - 2370: 0xB7E2, - 2371: 0xB7E3, - 2372: 0xB7E4, - 2373: 0xB7E5, - 2374: 0xB7E6, - 2375: 0xB7E7, - 2376: 0xB7E8, - 2377: 0xB7E9, - 2378: 0xB7EA, - 2379: 0xB7EB, - 2380: 0xB7EE, - 2381: 0xB7EF, - 2382: 0xB7F1, - 2383: 0xB7F2, - 2384: 0xB7F3, - 2385: 0xB7F5, - 2386: 0xB7F6, - 2387: 0xB7F7, - 2388: 0xB7F8, - 2389: 0xB7F9, - 2390: 0xB7FA, - 2391: 0xB7FB, - 2392: 0xB7FE, - 2393: 0xB802, - 2394: 0xB803, - 2395: 0xB804, - 2396: 0xB805, - 2397: 0xB806, - 2398: 0xB80A, - 2399: 0xB80B, - 2400: 0xB80D, - 2401: 0xB80E, - 2402: 0xB80F, - 2403: 0xB811, - 2404: 0xB812, - 2405: 0xB813, - 2406: 0xB814, - 2407: 0xB815, - 2408: 0xB816, - 2409: 0xB817, - 2410: 0xB81A, - 2411: 0xB81C, - 2412: 0xB81E, - 2413: 0xB81F, - 2414: 0xB820, - 2415: 0xB821, - 2416: 0xB822, - 2417: 0xB823, - 2418: 0xB826, - 2419: 0xB827, - 2420: 0xB829, - 2421: 0xB82A, - 2422: 0xB82B, - 2423: 0xB82D, - 2424: 0xB82E, - 2425: 0xB82F, - 2426: 0xB830, - 2427: 0xB831, - 2428: 0xB832, - 2429: 0xB833, - 2430: 0xB836, - 2431: 0xB83A, - 2432: 0xB83B, - 2433: 0xB83C, - 2434: 0xB83D, - 2435: 0xB83E, - 2436: 0xB83F, - 2437: 0xB841, - 2438: 0xB842, - 2439: 0xB843, - 2440: 0xB845, - 2441: 0xB846, - 2442: 0xB847, - 2443: 0xB848, - 2444: 0xB849, - 2445: 0xB84A, - 2446: 0xB84B, - 2447: 0xB84C, - 2448: 0xB84D, - 2449: 0xB84E, - 2450: 0xB84F, - 2451: 0xB850, - 2452: 0xB852, - 2453: 0xB854, - 2454: 0xB855, - 2455: 0xB856, - 2456: 0xB857, - 2457: 0xB858, - 2458: 0xB859, - 2459: 0xB85A, - 2460: 0xB85B, - 2461: 0xB85E, - 2462: 0xB85F, - 2463: 0xB861, - 2464: 0xB862, - 2465: 0xB863, - 2466: 0xB865, - 2467: 0xB866, - 2468: 0xB867, - 2469: 0xB868, - 2470: 0xB869, - 2471: 0xB86A, - 2472: 0xB86B, - 2473: 0xB86E, - 2474: 0xB870, - 2475: 0xB872, - 2476: 0xB873, - 2477: 0xB874, - 2478: 0xB875, - 2479: 0xB876, - 2480: 0xB877, - 2481: 0xB879, - 2482: 0xB87A, - 2483: 0xB87B, - 2484: 0xB87D, - 2485: 0xB87E, - 2486: 0xB87F, - 2487: 0xB880, - 2488: 0xB881, - 2489: 0xB882, - 2490: 0xB883, - 2491: 0xB884, - 2492: 0xB885, - 2493: 0xB886, - 2494: 0xB887, - 2495: 0xB888, - 2496: 0xB889, - 2497: 0xB88A, - 2498: 0xB88B, - 2499: 0xB88C, - 2500: 0xB88E, - 2501: 0xB88F, - 2502: 0xB890, - 2503: 0xB891, - 2504: 0xB892, - 2505: 0xB893, - 2506: 0xB894, - 2507: 0xB895, - 2508: 0xB896, - 2509: 0xB897, - 2510: 0xB898, - 2511: 0xB899, - 2512: 0xB89A, - 2513: 0xB89B, - 2514: 0xB89C, - 2515: 0xB89D, - 2516: 0xB89E, - 2517: 0xB89F, - 2518: 0xB8A0, - 2519: 0xB8A1, - 2520: 0xB8A2, - 2521: 0xB8A3, - 2522: 0xB8A4, - 2523: 0xB8A5, - 2524: 0xB8A6, - 2525: 0xB8A7, - 2526: 0xB8A9, - 2527: 0xB8AA, - 2528: 0xB8AB, - 2529: 0xB8AC, - 2530: 0xB8AD, - 2531: 0xB8AE, - 2532: 0xB8AF, - 2533: 0xB8B1, - 2534: 0xB8B2, - 2535: 0xB8B3, - 2536: 0xB8B5, - 2537: 0xB8B6, - 2538: 0xB8B7, - 2539: 0xB8B9, - 2540: 0xB8BA, - 2541: 0xB8BB, - 2542: 0xB8BC, - 2543: 0xB8BD, - 2544: 0xB8BE, - 2545: 0xB8BF, - 2546: 0xB8C2, - 2547: 0xB8C4, - 2548: 0xB8C6, - 2549: 0xB8C7, - 2550: 0xB8C8, - 2551: 0xB8C9, - 2552: 0xB8CA, - 2553: 0xB8CB, - 2554: 0xB8CD, - 2555: 0xB8CE, - 2556: 0xB8CF, - 2557: 0xB8D1, - 2558: 0xB8D2, - 2559: 0xB8D3, - 2560: 0xB8D5, - 2561: 0xB8D6, - 2562: 0xB8D7, - 2563: 0xB8D8, - 2564: 0xB8D9, - 2565: 0xB8DA, - 2566: 0xB8DB, - 2567: 0xB8DC, - 2568: 0xB8DE, - 2569: 0xB8E0, - 2570: 0xB8E2, - 2571: 0xB8E3, - 2572: 0xB8E4, - 2573: 0xB8E5, - 2574: 0xB8E6, - 2575: 0xB8E7, - 2576: 0xB8EA, - 2577: 0xB8EB, - 2578: 0xB8ED, - 2579: 0xB8EE, - 2580: 0xB8EF, - 2581: 0xB8F1, - 2582: 0xB8F2, - 2583: 0xB8F3, - 2584: 0xB8F4, - 2585: 0xB8F5, - 2586: 0xB8F6, - 2587: 0xB8F7, - 2588: 0xB8FA, - 2589: 0xB8FC, - 2590: 0xB8FE, - 2591: 0xB8FF, - 2592: 0xB900, - 2593: 0xB901, - 2594: 0xB902, - 2595: 0xB903, - 2596: 0xB905, - 2597: 0xB906, - 2598: 0xB907, - 2599: 0xB908, - 2600: 0xB909, - 2601: 0xB90A, - 2602: 0xB90B, - 2603: 0xB90C, - 2604: 0xB90D, - 2605: 0xB90E, - 2606: 0xB90F, - 2607: 0xB910, - 2608: 0xB911, - 2609: 0xB912, - 2610: 0xB913, - 2611: 0xB914, - 2612: 0xB915, - 2613: 0xB916, - 2614: 0xB917, - 2615: 0xB919, - 2616: 0xB91A, - 2617: 0xB91B, - 2618: 0xB91C, - 2619: 0xB91D, - 2620: 0xB91E, - 2621: 0xB91F, - 2622: 0xB921, - 2623: 0xB922, - 2624: 0xB923, - 2625: 0xB924, - 2626: 0xB925, - 2627: 0xB926, - 2628: 0xB927, - 2629: 0xB928, - 2630: 0xB929, - 2631: 0xB92A, - 2632: 0xB92B, - 2633: 0xB92C, - 2634: 0xB92D, - 2635: 0xB92E, - 2636: 0xB92F, - 2637: 0xB930, - 2638: 0xB931, - 2639: 0xB932, - 2640: 0xB933, - 2641: 0xB934, - 2642: 0xB935, - 2643: 0xB936, - 2644: 0xB937, - 2645: 0xB938, - 2646: 0xB939, - 2647: 0xB93A, - 2648: 0xB93B, - 2649: 0xB93E, - 2650: 0xB93F, - 2651: 0xB941, - 2652: 0xB942, - 2653: 0xB943, - 2654: 0xB945, - 2655: 0xB946, - 2656: 0xB947, - 2657: 0xB948, - 2658: 0xB949, - 2659: 0xB94A, - 2660: 0xB94B, - 2661: 0xB94D, - 2662: 0xB94E, - 2663: 0xB950, - 2664: 0xB952, - 2665: 0xB953, - 2666: 0xB954, - 2667: 0xB955, - 2668: 0xB956, - 2669: 0xB957, - 2670: 0xB95A, - 2671: 0xB95B, - 2672: 0xB95D, - 2673: 0xB95E, - 2674: 0xB95F, - 2675: 0xB961, - 2676: 0xB962, - 2677: 0xB963, - 2678: 0xB964, - 2679: 0xB965, - 2680: 0xB966, - 2681: 0xB967, - 2682: 0xB96A, - 2683: 0xB96C, - 2684: 0xB96E, - 2685: 0xB96F, - 2686: 0xB970, - 2687: 0xB971, - 2688: 0xB972, - 2689: 0xB973, - 2690: 0xB976, - 2691: 0xB977, - 2692: 0xB979, - 2693: 0xB97A, - 2694: 0xB97B, - 2695: 0xB97D, - 2696: 0xB97E, - 2697: 0xB97F, - 2698: 0xB980, - 2699: 0xB981, - 2700: 0xB982, - 2701: 0xB983, - 2702: 0xB986, - 2703: 0xB988, - 2704: 0xB98B, - 2705: 0xB98C, - 2706: 0xB98F, - 2707: 0xB990, - 2708: 0xB991, - 2709: 0xB992, - 2710: 0xB993, - 2711: 0xB994, - 2712: 0xB995, - 2713: 0xB996, - 2714: 0xB997, - 2715: 0xB998, - 2716: 0xB999, - 2717: 0xB99A, - 2718: 0xB99B, - 2719: 0xB99C, - 2720: 0xB99D, - 2721: 0xB99E, - 2722: 0xB99F, - 2723: 0xB9A0, - 2724: 0xB9A1, - 2725: 0xB9A2, - 2726: 0xB9A3, - 2727: 0xB9A4, - 2728: 0xB9A5, - 2729: 0xB9A6, - 2730: 0xB9A7, - 2731: 0xB9A8, - 2732: 0xB9A9, - 2733: 0xB9AA, - 2734: 0xB9AB, - 2735: 0xB9AE, - 2736: 0xB9AF, - 2737: 0xB9B1, - 2738: 0xB9B2, - 2739: 0xB9B3, - 2740: 0xB9B5, - 2741: 0xB9B6, - 2742: 0xB9B7, - 2743: 0xB9B8, - 2744: 0xB9B9, - 2745: 0xB9BA, - 2746: 0xB9BB, - 2747: 0xB9BE, - 2748: 0xB9C0, - 2749: 0xB9C2, - 2750: 0xB9C3, - 2751: 0xB9C4, - 2752: 0xB9C5, - 2753: 0xB9C6, - 2754: 0xB9C7, - 2755: 0xB9CA, - 2756: 0xB9CB, - 2757: 0xB9CD, - 2758: 0xB9D3, - 2759: 0xB9D4, - 2760: 0xB9D5, - 2761: 0xB9D6, - 2762: 0xB9D7, - 2763: 0xB9DA, - 2764: 0xB9DC, - 2765: 0xB9DF, - 2766: 0xB9E0, - 2767: 0xB9E2, - 2768: 0xB9E6, - 2769: 0xB9E7, - 2770: 0xB9E9, - 2771: 0xB9EA, - 2772: 0xB9EB, - 2773: 0xB9ED, - 2774: 0xB9EE, - 2775: 0xB9EF, - 2776: 0xB9F0, - 2777: 0xB9F1, - 2778: 0xB9F2, - 2779: 0xB9F3, - 2780: 0xB9F6, - 2781: 0xB9FB, - 2782: 0xB9FC, - 2783: 0xB9FD, - 2784: 0xB9FE, - 2785: 0xB9FF, - 2786: 0xBA02, - 2787: 0xBA03, - 2788: 0xBA04, - 2789: 0xBA05, - 2790: 0xBA06, - 2791: 0xBA07, - 2792: 0xBA09, - 2793: 0xBA0A, - 2794: 0xBA0B, - 2795: 0xBA0C, - 2796: 0xBA0D, - 2797: 0xBA0E, - 2798: 0xBA0F, - 2799: 0xBA10, - 2800: 0xBA11, - 2801: 0xBA12, - 2802: 0xBA13, - 2803: 0xBA14, - 2804: 0xBA16, - 2805: 0xBA17, - 2806: 0xBA18, - 2807: 0xBA19, - 2808: 0xBA1A, - 2809: 0xBA1B, - 2810: 0xBA1C, - 2811: 0xBA1D, - 2812: 0xBA1E, - 2813: 0xBA1F, - 2814: 0xBA20, - 2815: 0xBA21, - 2816: 0xBA22, - 2817: 0xBA23, - 2818: 0xBA24, - 2819: 0xBA25, - 2820: 0xBA26, - 2821: 0xBA27, - 2822: 0xBA28, - 2823: 0xBA29, - 2824: 0xBA2A, - 2825: 0xBA2B, - 2826: 0xBA2C, - 2827: 0xBA2D, - 2828: 0xBA2E, - 2829: 0xBA2F, - 2830: 0xBA30, - 2831: 0xBA31, - 2832: 0xBA32, - 2833: 0xBA33, - 2834: 0xBA34, - 2835: 0xBA35, - 2836: 0xBA36, - 2837: 0xBA37, - 2838: 0xBA3A, - 2839: 0xBA3B, - 2840: 0xBA3D, - 2841: 0xBA3E, - 2842: 0xBA3F, - 2843: 0xBA41, - 2844: 0xBA43, - 2845: 0xBA44, - 2846: 0xBA45, - 2847: 0xBA46, - 2848: 0xBA47, - 2849: 0xBA4A, - 2850: 0xBA4C, - 2851: 0xBA4F, - 2852: 0xBA50, - 2853: 0xBA51, - 2854: 0xBA52, - 2855: 0xBA56, - 2856: 0xBA57, - 2857: 0xBA59, - 2858: 0xBA5A, - 2859: 0xBA5B, - 2860: 0xBA5D, - 2861: 0xBA5E, - 2862: 0xBA5F, - 2863: 0xBA60, - 2864: 0xBA61, - 2865: 0xBA62, - 2866: 0xBA63, - 2867: 0xBA66, - 2868: 0xBA6A, - 2869: 0xBA6B, - 2870: 0xBA6C, - 2871: 0xBA6D, - 2872: 0xBA6E, - 2873: 0xBA6F, - 2874: 0xBA72, - 2875: 0xBA73, - 2876: 0xBA75, - 2877: 0xBA76, - 2878: 0xBA77, - 2879: 0xBA79, - 2880: 0xBA7A, - 2881: 0xBA7B, - 2882: 0xBA7C, - 2883: 0xBA7D, - 2884: 0xBA7E, - 2885: 0xBA7F, - 2886: 0xBA80, - 2887: 0xBA81, - 2888: 0xBA82, - 2889: 0xBA86, - 2890: 0xBA88, - 2891: 0xBA89, - 2892: 0xBA8A, - 2893: 0xBA8B, - 2894: 0xBA8D, - 2895: 0xBA8E, - 2896: 0xBA8F, - 2897: 0xBA90, - 2898: 0xBA91, - 2899: 0xBA92, - 2900: 0xBA93, - 2901: 0xBA94, - 2902: 0xBA95, - 2903: 0xBA96, - 2904: 0xBA97, - 2905: 0xBA98, - 2906: 0xBA99, - 2907: 0xBA9A, - 2908: 0xBA9B, - 2909: 0xBA9C, - 2910: 0xBA9D, - 2911: 0xBA9E, - 2912: 0xBA9F, - 2913: 0xBAA0, - 2914: 0xBAA1, - 2915: 0xBAA2, - 2916: 0xBAA3, - 2917: 0xBAA4, - 2918: 0xBAA5, - 2919: 0xBAA6, - 2920: 0xBAA7, - 2921: 0xBAAA, - 2922: 0xBAAD, - 2923: 0xBAAE, - 2924: 0xBAAF, - 2925: 0xBAB1, - 2926: 0xBAB3, - 2927: 0xBAB4, - 2928: 0xBAB5, - 2929: 0xBAB6, - 2930: 0xBAB7, - 2931: 0xBABA, - 2932: 0xBABC, - 2933: 0xBABE, - 2934: 0xBABF, - 2935: 0xBAC0, - 2936: 0xBAC1, - 2937: 0xBAC2, - 2938: 0xBAC3, - 2939: 0xBAC5, - 2940: 0xBAC6, - 2941: 0xBAC7, - 2942: 0xBAC9, - 2943: 0xBACA, - 2944: 0xBACB, - 2945: 0xBACC, - 2946: 0xBACD, - 2947: 0xBACE, - 2948: 0xBACF, - 2949: 0xBAD0, - 2950: 0xBAD1, - 2951: 0xBAD2, - 2952: 0xBAD3, - 2953: 0xBAD4, - 2954: 0xBAD5, - 2955: 0xBAD6, - 2956: 0xBAD7, - 2957: 0xBADA, - 2958: 0xBADB, - 2959: 0xBADC, - 2960: 0xBADD, - 2961: 0xBADE, - 2962: 0xBADF, - 2963: 0xBAE0, - 2964: 0xBAE1, - 2965: 0xBAE2, - 2966: 0xBAE3, - 2967: 0xBAE4, - 2968: 0xBAE5, - 2969: 0xBAE6, - 2970: 0xBAE7, - 2971: 0xBAE8, - 2972: 0xBAE9, - 2973: 0xBAEA, - 2974: 0xBAEB, - 2975: 0xBAEC, - 2976: 0xBAED, - 2977: 0xBAEE, - 2978: 0xBAEF, - 2979: 0xBAF0, - 2980: 0xBAF1, - 2981: 0xBAF2, - 2982: 0xBAF3, - 2983: 0xBAF4, - 2984: 0xBAF5, - 2985: 0xBAF6, - 2986: 0xBAF7, - 2987: 0xBAF8, - 2988: 0xBAF9, - 2989: 0xBAFA, - 2990: 0xBAFB, - 2991: 0xBAFD, - 2992: 0xBAFE, - 2993: 0xBAFF, - 2994: 0xBB01, - 2995: 0xBB02, - 2996: 0xBB03, - 2997: 0xBB05, - 2998: 0xBB06, - 2999: 0xBB07, - 3000: 0xBB08, - 3001: 0xBB09, - 3002: 0xBB0A, - 3003: 0xBB0B, - 3004: 0xBB0C, - 3005: 0xBB0E, - 3006: 0xBB10, - 3007: 0xBB12, - 3008: 0xBB13, - 3009: 0xBB14, - 3010: 0xBB15, - 3011: 0xBB16, - 3012: 0xBB17, - 3013: 0xBB19, - 3014: 0xBB1A, - 3015: 0xBB1B, - 3016: 0xBB1D, - 3017: 0xBB1E, - 3018: 0xBB1F, - 3019: 0xBB21, - 3020: 0xBB22, - 3021: 0xBB23, - 3022: 0xBB24, - 3023: 0xBB25, - 3024: 0xBB26, - 3025: 0xBB27, - 3026: 0xBB28, - 3027: 0xBB2A, - 3028: 0xBB2C, - 3029: 0xBB2D, - 3030: 0xBB2E, - 3031: 0xBB2F, - 3032: 0xBB30, - 3033: 0xBB31, - 3034: 0xBB32, - 3035: 0xBB33, - 3036: 0xBB37, - 3037: 0xBB39, - 3038: 0xBB3A, - 3039: 0xBB3F, - 3040: 0xBB40, - 3041: 0xBB41, - 3042: 0xBB42, - 3043: 0xBB43, - 3044: 0xBB46, - 3045: 0xBB48, - 3046: 0xBB4A, - 3047: 0xBB4B, - 3048: 0xBB4C, - 3049: 0xBB4E, - 3050: 0xBB51, - 3051: 0xBB52, - 3052: 0xBB53, - 3053: 0xBB55, - 3054: 0xBB56, - 3055: 0xBB57, - 3056: 0xBB59, - 3057: 0xBB5A, - 3058: 0xBB5B, - 3059: 0xBB5C, - 3060: 0xBB5D, - 3061: 0xBB5E, - 3062: 0xBB5F, - 3063: 0xBB60, - 3064: 0xBB62, - 3065: 0xBB64, - 3066: 0xBB65, - 3067: 0xBB66, - 3068: 0xBB67, - 3069: 0xBB68, - 3070: 0xBB69, - 3071: 0xBB6A, - 3072: 0xBB6B, - 3073: 0xBB6D, - 3074: 0xBB6E, - 3075: 0xBB6F, - 3076: 0xBB70, - 3077: 0xBB71, - 3078: 0xBB72, - 3079: 0xBB73, - 3080: 0xBB74, - 3081: 0xBB75, - 3082: 0xBB76, - 3083: 0xBB77, - 3084: 0xBB78, - 3085: 0xBB79, - 3086: 0xBB7A, - 3087: 0xBB7B, - 3088: 0xBB7C, - 3089: 0xBB7D, - 3090: 0xBB7E, - 3091: 0xBB7F, - 3092: 0xBB80, - 3093: 0xBB81, - 3094: 0xBB82, - 3095: 0xBB83, - 3096: 0xBB84, - 3097: 0xBB85, - 3098: 0xBB86, - 3099: 0xBB87, - 3100: 0xBB89, - 3101: 0xBB8A, - 3102: 0xBB8B, - 3103: 0xBB8D, - 3104: 0xBB8E, - 3105: 0xBB8F, - 3106: 0xBB91, - 3107: 0xBB92, - 3108: 0xBB93, - 3109: 0xBB94, - 3110: 0xBB95, - 3111: 0xBB96, - 3112: 0xBB97, - 3113: 0xBB98, - 3114: 0xBB99, - 3115: 0xBB9A, - 3116: 0xBB9B, - 3117: 0xBB9C, - 3118: 0xBB9D, - 3119: 0xBB9E, - 3120: 0xBB9F, - 3121: 0xBBA0, - 3122: 0xBBA1, - 3123: 0xBBA2, - 3124: 0xBBA3, - 3125: 0xBBA5, - 3126: 0xBBA6, - 3127: 0xBBA7, - 3128: 0xBBA9, - 3129: 0xBBAA, - 3130: 0xBBAB, - 3131: 0xBBAD, - 3132: 0xBBAE, - 3133: 0xBBAF, - 3134: 0xBBB0, - 3135: 0xBBB1, - 3136: 0xBBB2, - 3137: 0xBBB3, - 3138: 0xBBB5, - 3139: 0xBBB6, - 3140: 0xBBB8, - 3141: 0xBBB9, - 3142: 0xBBBA, - 3143: 0xBBBB, - 3144: 0xBBBC, - 3145: 0xBBBD, - 3146: 0xBBBE, - 3147: 0xBBBF, - 3148: 0xBBC1, - 3149: 0xBBC2, - 3150: 0xBBC3, - 3151: 0xBBC5, - 3152: 0xBBC6, - 3153: 0xBBC7, - 3154: 0xBBC9, - 3155: 0xBBCA, - 3156: 0xBBCB, - 3157: 0xBBCC, - 3158: 0xBBCD, - 3159: 0xBBCE, - 3160: 0xBBCF, - 3161: 0xBBD1, - 3162: 0xBBD2, - 3163: 0xBBD4, - 3164: 0xBBD5, - 3165: 0xBBD6, - 3166: 0xBBD7, - 3167: 0xBBD8, - 3168: 0xBBD9, - 3169: 0xBBDA, - 3170: 0xBBDB, - 3171: 0xBBDC, - 3172: 0xBBDD, - 3173: 0xBBDE, - 3174: 0xBBDF, - 3175: 0xBBE0, - 3176: 0xBBE1, - 3177: 0xBBE2, - 3178: 0xBBE3, - 3179: 0xBBE4, - 3180: 0xBBE5, - 3181: 0xBBE6, - 3182: 0xBBE7, - 3183: 0xBBE8, - 3184: 0xBBE9, - 3185: 0xBBEA, - 3186: 0xBBEB, - 3187: 0xBBEC, - 3188: 0xBBED, - 3189: 0xBBEE, - 3190: 0xBBEF, - 3191: 0xBBF0, - 3192: 0xBBF1, - 3193: 0xBBF2, - 3194: 0xBBF3, - 3195: 0xBBF4, - 3196: 0xBBF5, - 3197: 0xBBF6, - 3198: 0xBBF7, - 3199: 0xBBFA, - 3200: 0xBBFB, - 3201: 0xBBFD, - 3202: 0xBBFE, - 3203: 0xBC01, - 3204: 0xBC03, - 3205: 0xBC04, - 3206: 0xBC05, - 3207: 0xBC06, - 3208: 0xBC07, - 3209: 0xBC0A, - 3210: 0xBC0E, - 3211: 0xBC10, - 3212: 0xBC12, - 3213: 0xBC13, - 3214: 0xBC19, - 3215: 0xBC1A, - 3216: 0xBC20, - 3217: 0xBC21, - 3218: 0xBC22, - 3219: 0xBC23, - 3220: 0xBC26, - 3221: 0xBC28, - 3222: 0xBC2A, - 3223: 0xBC2B, - 3224: 0xBC2C, - 3225: 0xBC2E, - 3226: 0xBC2F, - 3227: 0xBC32, - 3228: 0xBC33, - 3229: 0xBC35, - 3230: 0xBC36, - 3231: 0xBC37, - 3232: 0xBC39, - 3233: 0xBC3A, - 3234: 0xBC3B, - 3235: 0xBC3C, - 3236: 0xBC3D, - 3237: 0xBC3E, - 3238: 0xBC3F, - 3239: 0xBC42, - 3240: 0xBC46, - 3241: 0xBC47, - 3242: 0xBC48, - 3243: 0xBC4A, - 3244: 0xBC4B, - 3245: 0xBC4E, - 3246: 0xBC4F, - 3247: 0xBC51, - 3248: 0xBC52, - 3249: 0xBC53, - 3250: 0xBC54, - 3251: 0xBC55, - 3252: 0xBC56, - 3253: 0xBC57, - 3254: 0xBC58, - 3255: 0xBC59, - 3256: 0xBC5A, - 3257: 0xBC5B, - 3258: 0xBC5C, - 3259: 0xBC5E, - 3260: 0xBC5F, - 3261: 0xBC60, - 3262: 0xBC61, - 3263: 0xBC62, - 3264: 0xBC63, - 3265: 0xBC64, - 3266: 0xBC65, - 3267: 0xBC66, - 3268: 0xBC67, - 3269: 0xBC68, - 3270: 0xBC69, - 3271: 0xBC6A, - 3272: 0xBC6B, - 3273: 0xBC6C, - 3274: 0xBC6D, - 3275: 0xBC6E, - 3276: 0xBC6F, - 3277: 0xBC70, - 3278: 0xBC71, - 3279: 0xBC72, - 3280: 0xBC73, - 3281: 0xBC74, - 3282: 0xBC75, - 3283: 0xBC76, - 3284: 0xBC77, - 3285: 0xBC78, - 3286: 0xBC79, - 3287: 0xBC7A, - 3288: 0xBC7B, - 3289: 0xBC7C, - 3290: 0xBC7D, - 3291: 0xBC7E, - 3292: 0xBC7F, - 3293: 0xBC80, - 3294: 0xBC81, - 3295: 0xBC82, - 3296: 0xBC83, - 3297: 0xBC86, - 3298: 0xBC87, - 3299: 0xBC89, - 3300: 0xBC8A, - 3301: 0xBC8D, - 3302: 0xBC8F, - 3303: 0xBC90, - 3304: 0xBC91, - 3305: 0xBC92, - 3306: 0xBC93, - 3307: 0xBC96, - 3308: 0xBC98, - 3309: 0xBC9B, - 3310: 0xBC9C, - 3311: 0xBC9D, - 3312: 0xBC9E, - 3313: 0xBC9F, - 3314: 0xBCA2, - 3315: 0xBCA3, - 3316: 0xBCA5, - 3317: 0xBCA6, - 3318: 0xBCA9, - 3319: 0xBCAA, - 3320: 0xBCAB, - 3321: 0xBCAC, - 3322: 0xBCAD, - 3323: 0xBCAE, - 3324: 0xBCAF, - 3325: 0xBCB2, - 3326: 0xBCB6, - 3327: 0xBCB7, - 3328: 0xBCB8, - 3329: 0xBCB9, - 3330: 0xBCBA, - 3331: 0xBCBB, - 3332: 0xBCBE, - 3333: 0xBCBF, - 3334: 0xBCC1, - 3335: 0xBCC2, - 3336: 0xBCC3, - 3337: 0xBCC5, - 3338: 0xBCC6, - 3339: 0xBCC7, - 3340: 0xBCC8, - 3341: 0xBCC9, - 3342: 0xBCCA, - 3343: 0xBCCB, - 3344: 0xBCCC, - 3345: 0xBCCE, - 3346: 0xBCD2, - 3347: 0xBCD3, - 3348: 0xBCD4, - 3349: 0xBCD6, - 3350: 0xBCD7, - 3351: 0xBCD9, - 3352: 0xBCDA, - 3353: 0xBCDB, - 3354: 0xBCDD, - 3355: 0xBCDE, - 3356: 0xBCDF, - 3357: 0xBCE0, - 3358: 0xBCE1, - 3359: 0xBCE2, - 3360: 0xBCE3, - 3361: 0xBCE4, - 3362: 0xBCE5, - 3363: 0xBCE6, - 3364: 0xBCE7, - 3365: 0xBCE8, - 3366: 0xBCE9, - 3367: 0xBCEA, - 3368: 0xBCEB, - 3369: 0xBCEC, - 3370: 0xBCED, - 3371: 0xBCEE, - 3372: 0xBCEF, - 3373: 0xBCF0, - 3374: 0xBCF1, - 3375: 0xBCF2, - 3376: 0xBCF3, - 3377: 0xBCF7, - 3378: 0xBCF9, - 3379: 0xBCFA, - 3380: 0xBCFB, - 3381: 0xBCFD, - 3382: 0xBCFE, - 3383: 0xBCFF, - 3384: 0xBD00, - 3385: 0xBD01, - 3386: 0xBD02, - 3387: 0xBD03, - 3388: 0xBD06, - 3389: 0xBD08, - 3390: 0xBD0A, - 3391: 0xBD0B, - 3392: 0xBD0C, - 3393: 0xBD0D, - 3394: 0xBD0E, - 3395: 0xBD0F, - 3396: 0xBD11, - 3397: 0xBD12, - 3398: 0xBD13, - 3399: 0xBD15, - 3400: 0xBD16, - 3401: 0xBD17, - 3402: 0xBD18, - 3403: 0xBD19, - 3404: 0xBD1A, - 3405: 0xBD1B, - 3406: 0xBD1C, - 3407: 0xBD1D, - 3408: 0xBD1E, - 3409: 0xBD1F, - 3410: 0xBD20, - 3411: 0xBD21, - 3412: 0xBD22, - 3413: 0xBD23, - 3414: 0xBD25, - 3415: 0xBD26, - 3416: 0xBD27, - 3417: 0xBD28, - 3418: 0xBD29, - 3419: 0xBD2A, - 3420: 0xBD2B, - 3421: 0xBD2D, - 3422: 0xBD2E, - 3423: 0xBD2F, - 3424: 0xBD30, - 3425: 0xBD31, - 3426: 0xBD32, - 3427: 0xBD33, - 3428: 0xBD34, - 3429: 0xBD35, - 3430: 0xBD36, - 3431: 0xBD37, - 3432: 0xBD38, - 3433: 0xBD39, - 3434: 0xBD3A, - 3435: 0xBD3B, - 3436: 0xBD3C, - 3437: 0xBD3D, - 3438: 0xBD3E, - 3439: 0xBD3F, - 3440: 0xBD41, - 3441: 0xBD42, - 3442: 0xBD43, - 3443: 0xBD44, - 3444: 0xBD45, - 3445: 0xBD46, - 3446: 0xBD47, - 3447: 0xBD4A, - 3448: 0xBD4B, - 3449: 0xBD4D, - 3450: 0xBD4E, - 3451: 0xBD4F, - 3452: 0xBD51, - 3453: 0xBD52, - 3454: 0xBD53, - 3455: 0xBD54, - 3456: 0xBD55, - 3457: 0xBD56, - 3458: 0xBD57, - 3459: 0xBD5A, - 3460: 0xBD5B, - 3461: 0xBD5C, - 3462: 0xBD5D, - 3463: 0xBD5E, - 3464: 0xBD5F, - 3465: 0xBD60, - 3466: 0xBD61, - 3467: 0xBD62, - 3468: 0xBD63, - 3469: 0xBD65, - 3470: 0xBD66, - 3471: 0xBD67, - 3472: 0xBD69, - 3473: 0xBD6A, - 3474: 0xBD6B, - 3475: 0xBD6C, - 3476: 0xBD6D, - 3477: 0xBD6E, - 3478: 0xBD6F, - 3479: 0xBD70, - 3480: 0xBD71, - 3481: 0xBD72, - 3482: 0xBD73, - 3483: 0xBD74, - 3484: 0xBD75, - 3485: 0xBD76, - 3486: 0xBD77, - 3487: 0xBD78, - 3488: 0xBD79, - 3489: 0xBD7A, - 3490: 0xBD7B, - 3491: 0xBD7C, - 3492: 0xBD7D, - 3493: 0xBD7E, - 3494: 0xBD7F, - 3495: 0xBD82, - 3496: 0xBD83, - 3497: 0xBD85, - 3498: 0xBD86, - 3499: 0xBD8B, - 3500: 0xBD8C, - 3501: 0xBD8D, - 3502: 0xBD8E, - 3503: 0xBD8F, - 3504: 0xBD92, - 3505: 0xBD94, - 3506: 0xBD96, - 3507: 0xBD97, - 3508: 0xBD98, - 3509: 0xBD9B, - 3510: 0xBD9D, - 3511: 0xBD9E, - 3512: 0xBD9F, - 3513: 0xBDA0, - 3514: 0xBDA1, - 3515: 0xBDA2, - 3516: 0xBDA3, - 3517: 0xBDA5, - 3518: 0xBDA6, - 3519: 0xBDA7, - 3520: 0xBDA8, - 3521: 0xBDA9, - 3522: 0xBDAA, - 3523: 0xBDAB, - 3524: 0xBDAC, - 3525: 0xBDAD, - 3526: 0xBDAE, - 3527: 0xBDAF, - 3528: 0xBDB1, - 3529: 0xBDB2, - 3530: 0xBDB3, - 3531: 0xBDB4, - 3532: 0xBDB5, - 3533: 0xBDB6, - 3534: 0xBDB7, - 3535: 0xBDB9, - 3536: 0xBDBA, - 3537: 0xBDBB, - 3538: 0xBDBC, - 3539: 0xBDBD, - 3540: 0xBDBE, - 3541: 0xBDBF, - 3542: 0xBDC0, - 3543: 0xBDC1, - 3544: 0xBDC2, - 3545: 0xBDC3, - 3546: 0xBDC4, - 3547: 0xBDC5, - 3548: 0xBDC6, - 3549: 0xBDC7, - 3550: 0xBDC8, - 3551: 0xBDC9, - 3552: 0xBDCA, - 3553: 0xBDCB, - 3554: 0xBDCC, - 3555: 0xBDCD, - 3556: 0xBDCE, - 3557: 0xBDCF, - 3558: 0xBDD0, - 3559: 0xBDD1, - 3560: 0xBDD2, - 3561: 0xBDD3, - 3562: 0xBDD6, - 3563: 0xBDD7, - 3564: 0xBDD9, - 3565: 0xBDDA, - 3566: 0xBDDB, - 3567: 0xBDDD, - 3568: 0xBDDE, - 3569: 0xBDDF, - 3570: 0xBDE0, - 3571: 0xBDE1, - 3572: 0xBDE2, - 3573: 0xBDE3, - 3574: 0xBDE4, - 3575: 0xBDE5, - 3576: 0xBDE6, - 3577: 0xBDE7, - 3578: 0xBDE8, - 3579: 0xBDEA, - 3580: 0xBDEB, - 3581: 0xBDEC, - 3582: 0xBDED, - 3583: 0xBDEE, - 3584: 0xBDEF, - 3585: 0xBDF1, - 3586: 0xBDF2, - 3587: 0xBDF3, - 3588: 0xBDF5, - 3589: 0xBDF6, - 3590: 0xBDF7, - 3591: 0xBDF9, - 3592: 0xBDFA, - 3593: 0xBDFB, - 3594: 0xBDFC, - 3595: 0xBDFD, - 3596: 0xBDFE, - 3597: 0xBDFF, - 3598: 0xBE01, - 3599: 0xBE02, - 3600: 0xBE04, - 3601: 0xBE06, - 3602: 0xBE07, - 3603: 0xBE08, - 3604: 0xBE09, - 3605: 0xBE0A, - 3606: 0xBE0B, - 3607: 0xBE0E, - 3608: 0xBE0F, - 3609: 0xBE11, - 3610: 0xBE12, - 3611: 0xBE13, - 3612: 0xBE15, - 3613: 0xBE16, - 3614: 0xBE17, - 3615: 0xBE18, - 3616: 0xBE19, - 3617: 0xBE1A, - 3618: 0xBE1B, - 3619: 0xBE1E, - 3620: 0xBE20, - 3621: 0xBE21, - 3622: 0xBE22, - 3623: 0xBE23, - 3624: 0xBE24, - 3625: 0xBE25, - 3626: 0xBE26, - 3627: 0xBE27, - 3628: 0xBE28, - 3629: 0xBE29, - 3630: 0xBE2A, - 3631: 0xBE2B, - 3632: 0xBE2C, - 3633: 0xBE2D, - 3634: 0xBE2E, - 3635: 0xBE2F, - 3636: 0xBE30, - 3637: 0xBE31, - 3638: 0xBE32, - 3639: 0xBE33, - 3640: 0xBE34, - 3641: 0xBE35, - 3642: 0xBE36, - 3643: 0xBE37, - 3644: 0xBE38, - 3645: 0xBE39, - 3646: 0xBE3A, - 3647: 0xBE3B, - 3648: 0xBE3C, - 3649: 0xBE3D, - 3650: 0xBE3E, - 3651: 0xBE3F, - 3652: 0xBE40, - 3653: 0xBE41, - 3654: 0xBE42, - 3655: 0xBE43, - 3656: 0xBE46, - 3657: 0xBE47, - 3658: 0xBE49, - 3659: 0xBE4A, - 3660: 0xBE4B, - 3661: 0xBE4D, - 3662: 0xBE4F, - 3663: 0xBE50, - 3664: 0xBE51, - 3665: 0xBE52, - 3666: 0xBE53, - 3667: 0xBE56, - 3668: 0xBE58, - 3669: 0xBE5C, - 3670: 0xBE5D, - 3671: 0xBE5E, - 3672: 0xBE5F, - 3673: 0xBE62, - 3674: 0xBE63, - 3675: 0xBE65, - 3676: 0xBE66, - 3677: 0xBE67, - 3678: 0xBE69, - 3679: 0xBE6B, - 3680: 0xBE6C, - 3681: 0xBE6D, - 3682: 0xBE6E, - 3683: 0xBE6F, - 3684: 0xBE72, - 3685: 0xBE76, - 3686: 0xBE77, - 3687: 0xBE78, - 3688: 0xBE79, - 3689: 0xBE7A, - 3690: 0xBE7E, - 3691: 0xBE7F, - 3692: 0xBE81, - 3693: 0xBE82, - 3694: 0xBE83, - 3695: 0xBE85, - 3696: 0xBE86, - 3697: 0xBE87, - 3698: 0xBE88, - 3699: 0xBE89, - 3700: 0xBE8A, - 3701: 0xBE8B, - 3702: 0xBE8E, - 3703: 0xBE92, - 3704: 0xBE93, - 3705: 0xBE94, - 3706: 0xBE95, - 3707: 0xBE96, - 3708: 0xBE97, - 3709: 0xBE9A, - 3710: 0xBE9B, - 3711: 0xBE9C, - 3712: 0xBE9D, - 3713: 0xBE9E, - 3714: 0xBE9F, - 3715: 0xBEA0, - 3716: 0xBEA1, - 3717: 0xBEA2, - 3718: 0xBEA3, - 3719: 0xBEA4, - 3720: 0xBEA5, - 3721: 0xBEA6, - 3722: 0xBEA7, - 3723: 0xBEA9, - 3724: 0xBEAA, - 3725: 0xBEAB, - 3726: 0xBEAC, - 3727: 0xBEAD, - 3728: 0xBEAE, - 3729: 0xBEAF, - 3730: 0xBEB0, - 3731: 0xBEB1, - 3732: 0xBEB2, - 3733: 0xBEB3, - 3734: 0xBEB4, - 3735: 0xBEB5, - 3736: 0xBEB6, - 3737: 0xBEB7, - 3738: 0xBEB8, - 3739: 0xBEB9, - 3740: 0xBEBA, - 3741: 0xBEBB, - 3742: 0xBEBC, - 3743: 0xBEBD, - 3744: 0xBEBE, - 3745: 0xBEBF, - 3746: 0xBEC0, - 3747: 0xBEC1, - 3748: 0xBEC2, - 3749: 0xBEC3, - 3750: 0xBEC4, - 3751: 0xBEC5, - 3752: 0xBEC6, - 3753: 0xBEC7, - 3754: 0xBEC8, - 3755: 0xBEC9, - 3756: 0xBECA, - 3757: 0xBECB, - 3758: 0xBECC, - 3759: 0xBECD, - 3760: 0xBECE, - 3761: 0xBECF, - 3762: 0xBED2, - 3763: 0xBED3, - 3764: 0xBED5, - 3765: 0xBED6, - 3766: 0xBED9, - 3767: 0xBEDA, - 3768: 0xBEDB, - 3769: 0xBEDC, - 3770: 0xBEDD, - 3771: 0xBEDE, - 3772: 0xBEDF, - 3773: 0xBEE1, - 3774: 0xBEE2, - 3775: 0xBEE6, - 3776: 0xBEE7, - 3777: 0xBEE8, - 3778: 0xBEE9, - 3779: 0xBEEA, - 3780: 0xBEEB, - 3781: 0xBEED, - 3782: 0xBEEE, - 3783: 0xBEEF, - 3784: 0xBEF0, - 3785: 0xBEF1, - 3786: 0xBEF2, - 3787: 0xBEF3, - 3788: 0xBEF4, - 3789: 0xBEF5, - 3790: 0xBEF6, - 3791: 0xBEF7, - 3792: 0xBEF8, - 3793: 0xBEF9, - 3794: 0xBEFA, - 3795: 0xBEFB, - 3796: 0xBEFC, - 3797: 0xBEFD, - 3798: 0xBEFE, - 3799: 0xBEFF, - 3800: 0xBF00, - 3801: 0xBF02, - 3802: 0xBF03, - 3803: 0xBF04, - 3804: 0xBF05, - 3805: 0xBF06, - 3806: 0xBF07, - 3807: 0xBF0A, - 3808: 0xBF0B, - 3809: 0xBF0C, - 3810: 0xBF0D, - 3811: 0xBF0E, - 3812: 0xBF0F, - 3813: 0xBF10, - 3814: 0xBF11, - 3815: 0xBF12, - 3816: 0xBF13, - 3817: 0xBF14, - 3818: 0xBF15, - 3819: 0xBF16, - 3820: 0xBF17, - 3821: 0xBF1A, - 3822: 0xBF1E, - 3823: 0xBF1F, - 3824: 0xBF20, - 3825: 0xBF21, - 3826: 0xBF22, - 3827: 0xBF23, - 3828: 0xBF24, - 3829: 0xBF25, - 3830: 0xBF26, - 3831: 0xBF27, - 3832: 0xBF28, - 3833: 0xBF29, - 3834: 0xBF2A, - 3835: 0xBF2B, - 3836: 0xBF2C, - 3837: 0xBF2D, - 3838: 0xBF2E, - 3839: 0xBF2F, - 3840: 0xBF30, - 3841: 0xBF31, - 3842: 0xBF32, - 3843: 0xBF33, - 3844: 0xBF34, - 3845: 0xBF35, - 3846: 0xBF36, - 3847: 0xBF37, - 3848: 0xBF38, - 3849: 0xBF39, - 3850: 0xBF3A, - 3851: 0xBF3B, - 3852: 0xBF3C, - 3853: 0xBF3D, - 3854: 0xBF3E, - 3855: 0xBF3F, - 3856: 0xBF42, - 3857: 0xBF43, - 3858: 0xBF45, - 3859: 0xBF46, - 3860: 0xBF47, - 3861: 0xBF49, - 3862: 0xBF4A, - 3863: 0xBF4B, - 3864: 0xBF4C, - 3865: 0xBF4D, - 3866: 0xBF4E, - 3867: 0xBF4F, - 3868: 0xBF52, - 3869: 0xBF53, - 3870: 0xBF54, - 3871: 0xBF56, - 3872: 0xBF57, - 3873: 0xBF58, - 3874: 0xBF59, - 3875: 0xBF5A, - 3876: 0xBF5B, - 3877: 0xBF5C, - 3878: 0xBF5D, - 3879: 0xBF5E, - 3880: 0xBF5F, - 3881: 0xBF60, - 3882: 0xBF61, - 3883: 0xBF62, - 3884: 0xBF63, - 3885: 0xBF64, - 3886: 0xBF65, - 3887: 0xBF66, - 3888: 0xBF67, - 3889: 0xBF68, - 3890: 0xBF69, - 3891: 0xBF6A, - 3892: 0xBF6B, - 3893: 0xBF6C, - 3894: 0xBF6D, - 3895: 0xBF6E, - 3896: 0xBF6F, - 3897: 0xBF70, - 3898: 0xBF71, - 3899: 0xBF72, - 3900: 0xBF73, - 3901: 0xBF74, - 3902: 0xBF75, - 3903: 0xBF76, - 3904: 0xBF77, - 3905: 0xBF78, - 3906: 0xBF79, - 3907: 0xBF7A, - 3908: 0xBF7B, - 3909: 0xBF7C, - 3910: 0xBF7D, - 3911: 0xBF7E, - 3912: 0xBF7F, - 3913: 0xBF80, - 3914: 0xBF81, - 3915: 0xBF82, - 3916: 0xBF83, - 3917: 0xBF84, - 3918: 0xBF85, - 3919: 0xBF86, - 3920: 0xBF87, - 3921: 0xBF88, - 3922: 0xBF89, - 3923: 0xBF8A, - 3924: 0xBF8B, - 3925: 0xBF8C, - 3926: 0xBF8D, - 3927: 0xBF8E, - 3928: 0xBF8F, - 3929: 0xBF90, - 3930: 0xBF91, - 3931: 0xBF92, - 3932: 0xBF93, - 3933: 0xBF95, - 3934: 0xBF96, - 3935: 0xBF97, - 3936: 0xBF98, - 3937: 0xBF99, - 3938: 0xBF9A, - 3939: 0xBF9B, - 3940: 0xBF9C, - 3941: 0xBF9D, - 3942: 0xBF9E, - 3943: 0xBF9F, - 3944: 0xBFA0, - 3945: 0xBFA1, - 3946: 0xBFA2, - 3947: 0xBFA3, - 3948: 0xBFA4, - 3949: 0xBFA5, - 3950: 0xBFA6, - 3951: 0xBFA7, - 3952: 0xBFA8, - 3953: 0xBFA9, - 3954: 0xBFAA, - 3955: 0xBFAB, - 3956: 0xBFAC, - 3957: 0xBFAD, - 3958: 0xBFAE, - 3959: 0xBFAF, - 3960: 0xBFB1, - 3961: 0xBFB2, - 3962: 0xBFB3, - 3963: 0xBFB4, - 3964: 0xBFB5, - 3965: 0xBFB6, - 3966: 0xBFB7, - 3967: 0xBFB8, - 3968: 0xBFB9, - 3969: 0xBFBA, - 3970: 0xBFBB, - 3971: 0xBFBC, - 3972: 0xBFBD, - 3973: 0xBFBE, - 3974: 0xBFBF, - 3975: 0xBFC0, - 3976: 0xBFC1, - 3977: 0xBFC2, - 3978: 0xBFC3, - 3979: 0xBFC4, - 3980: 0xBFC6, - 3981: 0xBFC7, - 3982: 0xBFC8, - 3983: 0xBFC9, - 3984: 0xBFCA, - 3985: 0xBFCB, - 3986: 0xBFCE, - 3987: 0xBFCF, - 3988: 0xBFD1, - 3989: 0xBFD2, - 3990: 0xBFD3, - 3991: 0xBFD5, - 3992: 0xBFD6, - 3993: 0xBFD7, - 3994: 0xBFD8, - 3995: 0xBFD9, - 3996: 0xBFDA, - 3997: 0xBFDB, - 3998: 0xBFDD, - 3999: 0xBFDE, - 4000: 0xBFE0, - 4001: 0xBFE2, - 4002: 0xBFE3, - 4003: 0xBFE4, - 4004: 0xBFE5, - 4005: 0xBFE6, - 4006: 0xBFE7, - 4007: 0xBFE8, - 4008: 0xBFE9, - 4009: 0xBFEA, - 4010: 0xBFEB, - 4011: 0xBFEC, - 4012: 0xBFED, - 4013: 0xBFEE, - 4014: 0xBFEF, - 4015: 0xBFF0, - 4016: 0xBFF1, - 4017: 0xBFF2, - 4018: 0xBFF3, - 4019: 0xBFF4, - 4020: 0xBFF5, - 4021: 0xBFF6, - 4022: 0xBFF7, - 4023: 0xBFF8, - 4024: 0xBFF9, - 4025: 0xBFFA, - 4026: 0xBFFB, - 4027: 0xBFFC, - 4028: 0xBFFD, - 4029: 0xBFFE, - 4030: 0xBFFF, - 4031: 0xC000, - 4032: 0xC001, - 4033: 0xC002, - 4034: 0xC003, - 4035: 0xC004, - 4036: 0xC005, - 4037: 0xC006, - 4038: 0xC007, - 4039: 0xC008, - 4040: 0xC009, - 4041: 0xC00A, - 4042: 0xC00B, - 4043: 0xC00C, - 4044: 0xC00D, - 4045: 0xC00E, - 4046: 0xC00F, - 4047: 0xC010, - 4048: 0xC011, - 4049: 0xC012, - 4050: 0xC013, - 4051: 0xC014, - 4052: 0xC015, - 4053: 0xC016, - 4054: 0xC017, - 4055: 0xC018, - 4056: 0xC019, - 4057: 0xC01A, - 4058: 0xC01B, - 4059: 0xC01C, - 4060: 0xC01D, - 4061: 0xC01E, - 4062: 0xC01F, - 4063: 0xC020, - 4064: 0xC021, - 4065: 0xC022, - 4066: 0xC023, - 4067: 0xC024, - 4068: 0xC025, - 4069: 0xC026, - 4070: 0xC027, - 4071: 0xC028, - 4072: 0xC029, - 4073: 0xC02A, - 4074: 0xC02B, - 4075: 0xC02C, - 4076: 0xC02D, - 4077: 0xC02E, - 4078: 0xC02F, - 4079: 0xC030, - 4080: 0xC031, - 4081: 0xC032, - 4082: 0xC033, - 4083: 0xC034, - 4084: 0xC035, - 4085: 0xC036, - 4086: 0xC037, - 4087: 0xC038, - 4088: 0xC039, - 4089: 0xC03A, - 4090: 0xC03B, - 4091: 0xC03D, - 4092: 0xC03E, - 4093: 0xC03F, - 4094: 0xC040, - 4095: 0xC041, - 4096: 0xC042, - 4097: 0xC043, - 4098: 0xC044, - 4099: 0xC045, - 4100: 0xC046, - 4101: 0xC047, - 4102: 0xC048, - 4103: 0xC049, - 4104: 0xC04A, - 4105: 0xC04B, - 4106: 0xC04C, - 4107: 0xC04D, - 4108: 0xC04E, - 4109: 0xC04F, - 4110: 0xC050, - 4111: 0xC052, - 4112: 0xC053, - 4113: 0xC054, - 4114: 0xC055, - 4115: 0xC056, - 4116: 0xC057, - 4117: 0xC059, - 4118: 0xC05A, - 4119: 0xC05B, - 4120: 0xC05D, - 4121: 0xC05E, - 4122: 0xC05F, - 4123: 0xC061, - 4124: 0xC062, - 4125: 0xC063, - 4126: 0xC064, - 4127: 0xC065, - 4128: 0xC066, - 4129: 0xC067, - 4130: 0xC06A, - 4131: 0xC06B, - 4132: 0xC06C, - 4133: 0xC06D, - 4134: 0xC06E, - 4135: 0xC06F, - 4136: 0xC070, - 4137: 0xC071, - 4138: 0xC072, - 4139: 0xC073, - 4140: 0xC074, - 4141: 0xC075, - 4142: 0xC076, - 4143: 0xC077, - 4144: 0xC078, - 4145: 0xC079, - 4146: 0xC07A, - 4147: 0xC07B, - 4148: 0xC07C, - 4149: 0xC07D, - 4150: 0xC07E, - 4151: 0xC07F, - 4152: 0xC080, - 4153: 0xC081, - 4154: 0xC082, - 4155: 0xC083, - 4156: 0xC084, - 4157: 0xC085, - 4158: 0xC086, - 4159: 0xC087, - 4160: 0xC088, - 4161: 0xC089, - 4162: 0xC08A, - 4163: 0xC08B, - 4164: 0xC08C, - 4165: 0xC08D, - 4166: 0xC08E, - 4167: 0xC08F, - 4168: 0xC092, - 4169: 0xC093, - 4170: 0xC095, - 4171: 0xC096, - 4172: 0xC097, - 4173: 0xC099, - 4174: 0xC09A, - 4175: 0xC09B, - 4176: 0xC09C, - 4177: 0xC09D, - 4178: 0xC09E, - 4179: 0xC09F, - 4180: 0xC0A2, - 4181: 0xC0A4, - 4182: 0xC0A6, - 4183: 0xC0A7, - 4184: 0xC0A8, - 4185: 0xC0A9, - 4186: 0xC0AA, - 4187: 0xC0AB, - 4188: 0xC0AE, - 4189: 0xC0B1, - 4190: 0xC0B2, - 4191: 0xC0B7, - 4192: 0xC0B8, - 4193: 0xC0B9, - 4194: 0xC0BA, - 4195: 0xC0BB, - 4196: 0xC0BE, - 4197: 0xC0C2, - 4198: 0xC0C3, - 4199: 0xC0C4, - 4200: 0xC0C6, - 4201: 0xC0C7, - 4202: 0xC0CA, - 4203: 0xC0CB, - 4204: 0xC0CD, - 4205: 0xC0CE, - 4206: 0xC0CF, - 4207: 0xC0D1, - 4208: 0xC0D2, - 4209: 0xC0D3, - 4210: 0xC0D4, - 4211: 0xC0D5, - 4212: 0xC0D6, - 4213: 0xC0D7, - 4214: 0xC0DA, - 4215: 0xC0DE, - 4216: 0xC0DF, - 4217: 0xC0E0, - 4218: 0xC0E1, - 4219: 0xC0E2, - 4220: 0xC0E3, - 4221: 0xC0E6, - 4222: 0xC0E7, - 4223: 0xC0E9, - 4224: 0xC0EA, - 4225: 0xC0EB, - 4226: 0xC0ED, - 4227: 0xC0EE, - 4228: 0xC0EF, - 4229: 0xC0F0, - 4230: 0xC0F1, - 4231: 0xC0F2, - 4232: 0xC0F3, - 4233: 0xC0F6, - 4234: 0xC0F8, - 4235: 0xC0FA, - 4236: 0xC0FB, - 4237: 0xC0FC, - 4238: 0xC0FD, - 4239: 0xC0FE, - 4240: 0xC0FF, - 4241: 0xC101, - 4242: 0xC102, - 4243: 0xC103, - 4244: 0xC105, - 4245: 0xC106, - 4246: 0xC107, - 4247: 0xC109, - 4248: 0xC10A, - 4249: 0xC10B, - 4250: 0xC10C, - 4251: 0xC10D, - 4252: 0xC10E, - 4253: 0xC10F, - 4254: 0xC111, - 4255: 0xC112, - 4256: 0xC113, - 4257: 0xC114, - 4258: 0xC116, - 4259: 0xC117, - 4260: 0xC118, - 4261: 0xC119, - 4262: 0xC11A, - 4263: 0xC11B, - 4264: 0xC121, - 4265: 0xC122, - 4266: 0xC125, - 4267: 0xC128, - 4268: 0xC129, - 4269: 0xC12A, - 4270: 0xC12B, - 4271: 0xC12E, - 4272: 0xC132, - 4273: 0xC133, - 4274: 0xC134, - 4275: 0xC135, - 4276: 0xC137, - 4277: 0xC13A, - 4278: 0xC13B, - 4279: 0xC13D, - 4280: 0xC13E, - 4281: 0xC13F, - 4282: 0xC141, - 4283: 0xC142, - 4284: 0xC143, - 4285: 0xC144, - 4286: 0xC145, - 4287: 0xC146, - 4288: 0xC147, - 4289: 0xC14A, - 4290: 0xC14E, - 4291: 0xC14F, - 4292: 0xC150, - 4293: 0xC151, - 4294: 0xC152, - 4295: 0xC153, - 4296: 0xC156, - 4297: 0xC157, - 4298: 0xC159, - 4299: 0xC15A, - 4300: 0xC15B, - 4301: 0xC15D, - 4302: 0xC15E, - 4303: 0xC15F, - 4304: 0xC160, - 4305: 0xC161, - 4306: 0xC162, - 4307: 0xC163, - 4308: 0xC166, - 4309: 0xC16A, - 4310: 0xC16B, - 4311: 0xC16C, - 4312: 0xC16D, - 4313: 0xC16E, - 4314: 0xC16F, - 4315: 0xC171, - 4316: 0xC172, - 4317: 0xC173, - 4318: 0xC175, - 4319: 0xC176, - 4320: 0xC177, - 4321: 0xC179, - 4322: 0xC17A, - 4323: 0xC17B, - 4324: 0xC17C, - 4325: 0xC17D, - 4326: 0xC17E, - 4327: 0xC17F, - 4328: 0xC180, - 4329: 0xC181, - 4330: 0xC182, - 4331: 0xC183, - 4332: 0xC184, - 4333: 0xC186, - 4334: 0xC187, - 4335: 0xC188, - 4336: 0xC189, - 4337: 0xC18A, - 4338: 0xC18B, - 4339: 0xC18F, - 4340: 0xC191, - 4341: 0xC192, - 4342: 0xC193, - 4343: 0xC195, - 4344: 0xC197, - 4345: 0xC198, - 4346: 0xC199, - 4347: 0xC19A, - 4348: 0xC19B, - 4349: 0xC19E, - 4350: 0xC1A0, - 4351: 0xC1A2, - 4352: 0xC1A3, - 4353: 0xC1A4, - 4354: 0xC1A6, - 4355: 0xC1A7, - 4356: 0xC1AA, - 4357: 0xC1AB, - 4358: 0xC1AD, - 4359: 0xC1AE, - 4360: 0xC1AF, - 4361: 0xC1B1, - 4362: 0xC1B2, - 4363: 0xC1B3, - 4364: 0xC1B4, - 4365: 0xC1B5, - 4366: 0xC1B6, - 4367: 0xC1B7, - 4368: 0xC1B8, - 4369: 0xC1B9, - 4370: 0xC1BA, - 4371: 0xC1BB, - 4372: 0xC1BC, - 4373: 0xC1BE, - 4374: 0xC1BF, - 4375: 0xC1C0, - 4376: 0xC1C1, - 4377: 0xC1C2, - 4378: 0xC1C3, - 4379: 0xC1C5, - 4380: 0xC1C6, - 4381: 0xC1C7, - 4382: 0xC1C9, - 4383: 0xC1CA, - 4384: 0xC1CB, - 4385: 0xC1CD, - 4386: 0xC1CE, - 4387: 0xC1CF, - 4388: 0xC1D0, - 4389: 0xC1D1, - 4390: 0xC1D2, - 4391: 0xC1D3, - 4392: 0xC1D5, - 4393: 0xC1D6, - 4394: 0xC1D9, - 4395: 0xC1DA, - 4396: 0xC1DB, - 4397: 0xC1DC, - 4398: 0xC1DD, - 4399: 0xC1DE, - 4400: 0xC1DF, - 4401: 0xC1E1, - 4402: 0xC1E2, - 4403: 0xC1E3, - 4404: 0xC1E5, - 4405: 0xC1E6, - 4406: 0xC1E7, - 4407: 0xC1E9, - 4408: 0xC1EA, - 4409: 0xC1EB, - 4410: 0xC1EC, - 4411: 0xC1ED, - 4412: 0xC1EE, - 4413: 0xC1EF, - 4414: 0xC1F2, - 4415: 0xC1F4, - 4416: 0xC1F5, - 4417: 0xC1F6, - 4418: 0xC1F7, - 4419: 0xC1F8, - 4420: 0xC1F9, - 4421: 0xC1FA, - 4422: 0xC1FB, - 4423: 0xC1FE, - 4424: 0xC1FF, - 4425: 0xC201, - 4426: 0xC202, - 4427: 0xC203, - 4428: 0xC205, - 4429: 0xC206, - 4430: 0xC207, - 4431: 0xC208, - 4432: 0xC209, - 4433: 0xC20A, - 4434: 0xC20B, - 4435: 0xC20E, - 4436: 0xC210, - 4437: 0xC212, - 4438: 0xC213, - 4439: 0xC214, - 4440: 0xC215, - 4441: 0xC216, - 4442: 0xC217, - 4443: 0xC21A, - 4444: 0xC21B, - 4445: 0xC21D, - 4446: 0xC21E, - 4447: 0xC221, - 4448: 0xC222, - 4449: 0xC223, - 4450: 0xC224, - 4451: 0xC225, - 4452: 0xC226, - 4453: 0xC227, - 4454: 0xC22A, - 4455: 0xC22C, - 4456: 0xC22E, - 4457: 0xC230, - 4458: 0xC233, - 4459: 0xC235, - 4460: 0xC236, - 4461: 0xC237, - 4462: 0xC238, - 4463: 0xC239, - 4464: 0xC23A, - 4465: 0xC23B, - 4466: 0xC23C, - 4467: 0xC23D, - 4468: 0xC23E, - 4469: 0xC23F, - 4470: 0xC240, - 4471: 0xC241, - 4472: 0xC242, - 4473: 0xC243, - 4474: 0xC244, - 4475: 0xC245, - 4476: 0xC246, - 4477: 0xC247, - 4478: 0xC249, - 4479: 0xC24A, - 4480: 0xC24B, - 4481: 0xC24C, - 4482: 0xC24D, - 4483: 0xC24E, - 4484: 0xC24F, - 4485: 0xC252, - 4486: 0xC253, - 4487: 0xC255, - 4488: 0xC256, - 4489: 0xC257, - 4490: 0xC259, - 4491: 0xC25A, - 4492: 0xC25B, - 4493: 0xC25C, - 4494: 0xC25D, - 4495: 0xC25E, - 4496: 0xC25F, - 4497: 0xC261, - 4498: 0xC262, - 4499: 0xC263, - 4500: 0xC264, - 4501: 0xC266, - 4502: 0xC267, - 4503: 0xC268, - 4504: 0xC269, - 4505: 0xC26A, - 4506: 0xC26B, - 4507: 0xC26E, - 4508: 0xC26F, - 4509: 0xC271, - 4510: 0xC272, - 4511: 0xC273, - 4512: 0xC275, - 4513: 0xC276, - 4514: 0xC277, - 4515: 0xC278, - 4516: 0xC279, - 4517: 0xC27A, - 4518: 0xC27B, - 4519: 0xC27E, - 4520: 0xC280, - 4521: 0xC282, - 4522: 0xC283, - 4523: 0xC284, - 4524: 0xC285, - 4525: 0xC286, - 4526: 0xC287, - 4527: 0xC28A, - 4528: 0xC28B, - 4529: 0xC28C, - 4530: 0xC28D, - 4531: 0xC28E, - 4532: 0xC28F, - 4533: 0xC291, - 4534: 0xC292, - 4535: 0xC293, - 4536: 0xC294, - 4537: 0xC295, - 4538: 0xC296, - 4539: 0xC297, - 4540: 0xC299, - 4541: 0xC29A, - 4542: 0xC29C, - 4543: 0xC29E, - 4544: 0xC29F, - 4545: 0xC2A0, - 4546: 0xC2A1, - 4547: 0xC2A2, - 4548: 0xC2A3, - 4549: 0xC2A6, - 4550: 0xC2A7, - 4551: 0xC2A9, - 4552: 0xC2AA, - 4553: 0xC2AB, - 4554: 0xC2AE, - 4555: 0xC2AF, - 4556: 0xC2B0, - 4557: 0xC2B1, - 4558: 0xC2B2, - 4559: 0xC2B3, - 4560: 0xC2B6, - 4561: 0xC2B8, - 4562: 0xC2BA, - 4563: 0xC2BB, - 4564: 0xC2BC, - 4565: 0xC2BD, - 4566: 0xC2BE, - 4567: 0xC2BF, - 4568: 0xC2C0, - 4569: 0xC2C1, - 4570: 0xC2C2, - 4571: 0xC2C3, - 4572: 0xC2C4, - 4573: 0xC2C5, - 4574: 0xC2C6, - 4575: 0xC2C7, - 4576: 0xC2C8, - 4577: 0xC2C9, - 4578: 0xC2CA, - 4579: 0xC2CB, - 4580: 0xC2CC, - 4581: 0xC2CD, - 4582: 0xC2CE, - 4583: 0xC2CF, - 4584: 0xC2D0, - 4585: 0xC2D1, - 4586: 0xC2D2, - 4587: 0xC2D3, - 4588: 0xC2D4, - 4589: 0xC2D5, - 4590: 0xC2D6, - 4591: 0xC2D7, - 4592: 0xC2D8, - 4593: 0xC2D9, - 4594: 0xC2DA, - 4595: 0xC2DB, - 4596: 0xC2DE, - 4597: 0xC2DF, - 4598: 0xC2E1, - 4599: 0xC2E2, - 4600: 0xC2E5, - 4601: 0xC2E6, - 4602: 0xC2E7, - 4603: 0xC2E8, - 4604: 0xC2E9, - 4605: 0xC2EA, - 4606: 0xC2EE, - 4607: 0xC2F0, - 4608: 0xC2F2, - 4609: 0xC2F3, - 4610: 0xC2F4, - 4611: 0xC2F5, - 4612: 0xC2F7, - 4613: 0xC2FA, - 4614: 0xC2FD, - 4615: 0xC2FE, - 4616: 0xC2FF, - 4617: 0xC301, - 4618: 0xC302, - 4619: 0xC303, - 4620: 0xC304, - 4621: 0xC305, - 4622: 0xC306, - 4623: 0xC307, - 4624: 0xC30A, - 4625: 0xC30B, - 4626: 0xC30E, - 4627: 0xC30F, - 4628: 0xC310, - 4629: 0xC311, - 4630: 0xC312, - 4631: 0xC316, - 4632: 0xC317, - 4633: 0xC319, - 4634: 0xC31A, - 4635: 0xC31B, - 4636: 0xC31D, - 4637: 0xC31E, - 4638: 0xC31F, - 4639: 0xC320, - 4640: 0xC321, - 4641: 0xC322, - 4642: 0xC323, - 4643: 0xC326, - 4644: 0xC327, - 4645: 0xC32A, - 4646: 0xC32B, - 4647: 0xC32C, - 4648: 0xC32D, - 4649: 0xC32E, - 4650: 0xC32F, - 4651: 0xC330, - 4652: 0xC331, - 4653: 0xC332, - 4654: 0xC333, - 4655: 0xC334, - 4656: 0xC335, - 4657: 0xC336, - 4658: 0xC337, - 4659: 0xC338, - 4660: 0xC339, - 4661: 0xC33A, - 4662: 0xC33B, - 4663: 0xC33C, - 4664: 0xC33D, - 4665: 0xC33E, - 4666: 0xC33F, - 4667: 0xC340, - 4668: 0xC341, - 4669: 0xC342, - 4670: 0xC343, - 4671: 0xC344, - 4672: 0xC346, - 4673: 0xC347, - 4674: 0xC348, - 4675: 0xC349, - 4676: 0xC34A, - 4677: 0xC34B, - 4678: 0xC34C, - 4679: 0xC34D, - 4680: 0xC34E, - 4681: 0xC34F, - 4682: 0xC350, - 4683: 0xC351, - 4684: 0xC352, - 4685: 0xC353, - 4686: 0xC354, - 4687: 0xC355, - 4688: 0xC356, - 4689: 0xC357, - 4690: 0xC358, - 4691: 0xC359, - 4692: 0xC35A, - 4693: 0xC35B, - 4694: 0xC35C, - 4695: 0xC35D, - 4696: 0xC35E, - 4697: 0xC35F, - 4698: 0xC360, - 4699: 0xC361, - 4700: 0xC362, - 4701: 0xC363, - 4702: 0xC364, - 4703: 0xC365, - 4704: 0xC366, - 4705: 0xC367, - 4706: 0xC36A, - 4707: 0xC36B, - 4708: 0xC36D, - 4709: 0xC36E, - 4710: 0xC36F, - 4711: 0xC371, - 4712: 0xC373, - 4713: 0xC374, - 4714: 0xC375, - 4715: 0xC376, - 4716: 0xC377, - 4717: 0xC37A, - 4718: 0xC37B, - 4719: 0xC37E, - 4720: 0xC37F, - 4721: 0xC380, - 4722: 0xC381, - 4723: 0xC382, - 4724: 0xC383, - 4725: 0xC385, - 4726: 0xC386, - 4727: 0xC387, - 4728: 0xC389, - 4729: 0xC38A, - 4730: 0xC38B, - 4731: 0xC38D, - 4732: 0xC38E, - 4733: 0xC38F, - 4734: 0xC390, - 4735: 0xC391, - 4736: 0xC392, - 4737: 0xC393, - 4738: 0xC394, - 4739: 0xC395, - 4740: 0xC396, - 4741: 0xC397, - 4742: 0xC398, - 4743: 0xC399, - 4744: 0xC39A, - 4745: 0xC39B, - 4746: 0xC39C, - 4747: 0xC39D, - 4748: 0xC39E, - 4749: 0xC39F, - 4750: 0xC3A0, - 4751: 0xC3A1, - 4752: 0xC3A2, - 4753: 0xC3A3, - 4754: 0xC3A4, - 4755: 0xC3A5, - 4756: 0xC3A6, - 4757: 0xC3A7, - 4758: 0xC3A8, - 4759: 0xC3A9, - 4760: 0xC3AA, - 4761: 0xC3AB, - 4762: 0xC3AC, - 4763: 0xC3AD, - 4764: 0xC3AE, - 4765: 0xC3AF, - 4766: 0xC3B0, - 4767: 0xC3B1, - 4768: 0xC3B2, - 4769: 0xC3B3, - 4770: 0xC3B4, - 4771: 0xC3B5, - 4772: 0xC3B6, - 4773: 0xC3B7, - 4774: 0xC3B8, - 4775: 0xC3B9, - 4776: 0xC3BA, - 4777: 0xC3BB, - 4778: 0xC3BC, - 4779: 0xC3BD, - 4780: 0xC3BE, - 4781: 0xC3BF, - 4782: 0xC3C1, - 4783: 0xC3C2, - 4784: 0xC3C3, - 4785: 0xC3C4, - 4786: 0xC3C5, - 4787: 0xC3C6, - 4788: 0xC3C7, - 4789: 0xC3C8, - 4790: 0xC3C9, - 4791: 0xC3CA, - 4792: 0xC3CB, - 4793: 0xC3CC, - 4794: 0xC3CD, - 4795: 0xC3CE, - 4796: 0xC3CF, - 4797: 0xC3D0, - 4798: 0xC3D1, - 4799: 0xC3D2, - 4800: 0xC3D3, - 4801: 0xC3D4, - 4802: 0xC3D5, - 4803: 0xC3D6, - 4804: 0xC3D7, - 4805: 0xC3DA, - 4806: 0xC3DB, - 4807: 0xC3DD, - 4808: 0xC3DE, - 4809: 0xC3E1, - 4810: 0xC3E3, - 4811: 0xC3E4, - 4812: 0xC3E5, - 4813: 0xC3E6, - 4814: 0xC3E7, - 4815: 0xC3EA, - 4816: 0xC3EB, - 4817: 0xC3EC, - 4818: 0xC3EE, - 4819: 0xC3EF, - 4820: 0xC3F0, - 4821: 0xC3F1, - 4822: 0xC3F2, - 4823: 0xC3F3, - 4824: 0xC3F6, - 4825: 0xC3F7, - 4826: 0xC3F9, - 4827: 0xC3FA, - 4828: 0xC3FB, - 4829: 0xC3FC, - 4830: 0xC3FD, - 4831: 0xC3FE, - 4832: 0xC3FF, - 4833: 0xC400, - 4834: 0xC401, - 4835: 0xC402, - 4836: 0xC403, - 4837: 0xC404, - 4838: 0xC405, - 4839: 0xC406, - 4840: 0xC407, - 4841: 0xC409, - 4842: 0xC40A, - 4843: 0xC40B, - 4844: 0xC40C, - 4845: 0xC40D, - 4846: 0xC40E, - 4847: 0xC40F, - 4848: 0xC411, - 4849: 0xC412, - 4850: 0xC413, - 4851: 0xC414, - 4852: 0xC415, - 4853: 0xC416, - 4854: 0xC417, - 4855: 0xC418, - 4856: 0xC419, - 4857: 0xC41A, - 4858: 0xC41B, - 4859: 0xC41C, - 4860: 0xC41D, - 4861: 0xC41E, - 4862: 0xC41F, - 4863: 0xC420, - 4864: 0xC421, - 4865: 0xC422, - 4866: 0xC423, - 4867: 0xC425, - 4868: 0xC426, - 4869: 0xC427, - 4870: 0xC428, - 4871: 0xC429, - 4872: 0xC42A, - 4873: 0xC42B, - 4874: 0xC42D, - 4875: 0xC42E, - 4876: 0xC42F, - 4877: 0xC431, - 4878: 0xC432, - 4879: 0xC433, - 4880: 0xC435, - 4881: 0xC436, - 4882: 0xC437, - 4883: 0xC438, - 4884: 0xC439, - 4885: 0xC43A, - 4886: 0xC43B, - 4887: 0xC43E, - 4888: 0xC43F, - 4889: 0xC440, - 4890: 0xC441, - 4891: 0xC442, - 4892: 0xC443, - 4893: 0xC444, - 4894: 0xC445, - 4895: 0xC446, - 4896: 0xC447, - 4897: 0xC449, - 4898: 0xC44A, - 4899: 0xC44B, - 4900: 0xC44C, - 4901: 0xC44D, - 4902: 0xC44E, - 4903: 0xC44F, - 4904: 0xC450, - 4905: 0xC451, - 4906: 0xC452, - 4907: 0xC453, - 4908: 0xC454, - 4909: 0xC455, - 4910: 0xC456, - 4911: 0xC457, - 4912: 0xC458, - 4913: 0xC459, - 4914: 0xC45A, - 4915: 0xC45B, - 4916: 0xC45C, - 4917: 0xC45D, - 4918: 0xC45E, - 4919: 0xC45F, - 4920: 0xC460, - 4921: 0xC461, - 4922: 0xC462, - 4923: 0xC463, - 4924: 0xC466, - 4925: 0xC467, - 4926: 0xC469, - 4927: 0xC46A, - 4928: 0xC46B, - 4929: 0xC46D, - 4930: 0xC46E, - 4931: 0xC46F, - 4932: 0xC470, - 4933: 0xC471, - 4934: 0xC472, - 4935: 0xC473, - 4936: 0xC476, - 4937: 0xC477, - 4938: 0xC478, - 4939: 0xC47A, - 4940: 0xC47B, - 4941: 0xC47C, - 4942: 0xC47D, - 4943: 0xC47E, - 4944: 0xC47F, - 4945: 0xC481, - 4946: 0xC482, - 4947: 0xC483, - 4948: 0xC484, - 4949: 0xC485, - 4950: 0xC486, - 4951: 0xC487, - 4952: 0xC488, - 4953: 0xC489, - 4954: 0xC48A, - 4955: 0xC48B, - 4956: 0xC48C, - 4957: 0xC48D, - 4958: 0xC48E, - 4959: 0xC48F, - 4960: 0xC490, - 4961: 0xC491, - 4962: 0xC492, - 4963: 0xC493, - 4964: 0xC495, - 4965: 0xC496, - 4966: 0xC497, - 4967: 0xC498, - 4968: 0xC499, - 4969: 0xC49A, - 4970: 0xC49B, - 4971: 0xC49D, - 4972: 0xC49E, - 4973: 0xC49F, - 4974: 0xC4A0, - 4975: 0xC4A1, - 4976: 0xC4A2, - 4977: 0xC4A3, - 4978: 0xC4A4, - 4979: 0xC4A5, - 4980: 0xC4A6, - 4981: 0xC4A7, - 4982: 0xC4A8, - 4983: 0xC4A9, - 4984: 0xC4AA, - 4985: 0xC4AB, - 4986: 0xC4AC, - 4987: 0xC4AD, - 4988: 0xC4AE, - 4989: 0xC4AF, - 4990: 0xC4B0, - 4991: 0xC4B1, - 4992: 0xC4B2, - 4993: 0xC4B3, - 4994: 0xC4B4, - 4995: 0xC4B5, - 4996: 0xC4B6, - 4997: 0xC4B7, - 4998: 0xC4B9, - 4999: 0xC4BA, - 5000: 0xC4BB, - 5001: 0xC4BD, - 5002: 0xC4BE, - 5003: 0xC4BF, - 5004: 0xC4C0, - 5005: 0xC4C1, - 5006: 0xC4C2, - 5007: 0xC4C3, - 5008: 0xC4C4, - 5009: 0xC4C5, - 5010: 0xC4C6, - 5011: 0xC4C7, - 5012: 0xC4C8, - 5013: 0xC4C9, - 5014: 0xC4CA, - 5015: 0xC4CB, - 5016: 0xC4CC, - 5017: 0xC4CD, - 5018: 0xC4CE, - 5019: 0xC4CF, - 5020: 0xC4D0, - 5021: 0xC4D1, - 5022: 0xC4D2, - 5023: 0xC4D3, - 5024: 0xC4D4, - 5025: 0xC4D5, - 5026: 0xC4D6, - 5027: 0xC4D7, - 5028: 0xC4D8, - 5029: 0xC4D9, - 5030: 0xC4DA, - 5031: 0xC4DB, - 5032: 0xC4DC, - 5033: 0xC4DD, - 5034: 0xC4DE, - 5035: 0xC4DF, - 5036: 0xC4E0, - 5037: 0xC4E1, - 5038: 0xC4E2, - 5039: 0xC4E3, - 5040: 0xC4E4, - 5041: 0xC4E5, - 5042: 0xC4E6, - 5043: 0xC4E7, - 5044: 0xC4E8, - 5045: 0xC4EA, - 5046: 0xC4EB, - 5047: 0xC4EC, - 5048: 0xC4ED, - 5049: 0xC4EE, - 5050: 0xC4EF, - 5051: 0xC4F2, - 5052: 0xC4F3, - 5053: 0xC4F5, - 5054: 0xC4F6, - 5055: 0xC4F7, - 5056: 0xC4F9, - 5057: 0xC4FB, - 5058: 0xC4FC, - 5059: 0xC4FD, - 5060: 0xC4FE, - 5061: 0xC502, - 5062: 0xC503, - 5063: 0xC504, - 5064: 0xC505, - 5065: 0xC506, - 5066: 0xC507, - 5067: 0xC508, - 5068: 0xC509, - 5069: 0xC50A, - 5070: 0xC50B, - 5071: 0xC50D, - 5072: 0xC50E, - 5073: 0xC50F, - 5074: 0xC511, - 5075: 0xC512, - 5076: 0xC513, - 5077: 0xC515, - 5078: 0xC516, - 5079: 0xC517, - 5080: 0xC518, - 5081: 0xC519, - 5082: 0xC51A, - 5083: 0xC51B, - 5084: 0xC51D, - 5085: 0xC51E, - 5086: 0xC51F, - 5087: 0xC520, - 5088: 0xC521, - 5089: 0xC522, - 5090: 0xC523, - 5091: 0xC524, - 5092: 0xC525, - 5093: 0xC526, - 5094: 0xC527, - 5095: 0xC52A, - 5096: 0xC52B, - 5097: 0xC52D, - 5098: 0xC52E, - 5099: 0xC52F, - 5100: 0xC531, - 5101: 0xC532, - 5102: 0xC533, - 5103: 0xC534, - 5104: 0xC535, - 5105: 0xC536, - 5106: 0xC537, - 5107: 0xC53A, - 5108: 0xC53C, - 5109: 0xC53E, - 5110: 0xC53F, - 5111: 0xC540, - 5112: 0xC541, - 5113: 0xC542, - 5114: 0xC543, - 5115: 0xC546, - 5116: 0xC547, - 5117: 0xC54B, - 5118: 0xC54F, - 5119: 0xC550, - 5120: 0xC551, - 5121: 0xC552, - 5122: 0xC556, - 5123: 0xC55A, - 5124: 0xC55B, - 5125: 0xC55C, - 5126: 0xC55F, - 5127: 0xC562, - 5128: 0xC563, - 5129: 0xC565, - 5130: 0xC566, - 5131: 0xC567, - 5132: 0xC569, - 5133: 0xC56A, - 5134: 0xC56B, - 5135: 0xC56C, - 5136: 0xC56D, - 5137: 0xC56E, - 5138: 0xC56F, - 5139: 0xC572, - 5140: 0xC576, - 5141: 0xC577, - 5142: 0xC578, - 5143: 0xC579, - 5144: 0xC57A, - 5145: 0xC57B, - 5146: 0xC57E, - 5147: 0xC57F, - 5148: 0xC581, - 5149: 0xC582, - 5150: 0xC583, - 5151: 0xC585, - 5152: 0xC586, - 5153: 0xC588, - 5154: 0xC589, - 5155: 0xC58A, - 5156: 0xC58B, - 5157: 0xC58E, - 5158: 0xC590, - 5159: 0xC592, - 5160: 0xC593, - 5161: 0xC594, - 5162: 0xC596, - 5163: 0xC599, - 5164: 0xC59A, - 5165: 0xC59B, - 5166: 0xC59D, - 5167: 0xC59E, - 5168: 0xC59F, - 5169: 0xC5A1, - 5170: 0xC5A2, - 5171: 0xC5A3, - 5172: 0xC5A4, - 5173: 0xC5A5, - 5174: 0xC5A6, - 5175: 0xC5A7, - 5176: 0xC5A8, - 5177: 0xC5AA, - 5178: 0xC5AB, - 5179: 0xC5AC, - 5180: 0xC5AD, - 5181: 0xC5AE, - 5182: 0xC5AF, - 5183: 0xC5B0, - 5184: 0xC5B1, - 5185: 0xC5B2, - 5186: 0xC5B3, - 5187: 0xC5B6, - 5188: 0xC5B7, - 5189: 0xC5BA, - 5190: 0xC5BF, - 5191: 0xC5C0, - 5192: 0xC5C1, - 5193: 0xC5C2, - 5194: 0xC5C3, - 5195: 0xC5CB, - 5196: 0xC5CD, - 5197: 0xC5CF, - 5198: 0xC5D2, - 5199: 0xC5D3, - 5200: 0xC5D5, - 5201: 0xC5D6, - 5202: 0xC5D7, - 5203: 0xC5D9, - 5204: 0xC5DA, - 5205: 0xC5DB, - 5206: 0xC5DC, - 5207: 0xC5DD, - 5208: 0xC5DE, - 5209: 0xC5DF, - 5210: 0xC5E2, - 5211: 0xC5E4, - 5212: 0xC5E6, - 5213: 0xC5E7, - 5214: 0xC5E8, - 5215: 0xC5E9, - 5216: 0xC5EA, - 5217: 0xC5EB, - 5218: 0xC5EF, - 5219: 0xC5F1, - 5220: 0xC5F2, - 5221: 0xC5F3, - 5222: 0xC5F5, - 5223: 0xC5F8, - 5224: 0xC5F9, - 5225: 0xC5FA, - 5226: 0xC5FB, - 5227: 0xC602, - 5228: 0xC603, - 5229: 0xC604, - 5230: 0xC609, - 5231: 0xC60A, - 5232: 0xC60B, - 5233: 0xC60D, - 5234: 0xC60E, - 5235: 0xC60F, - 5236: 0xC611, - 5237: 0xC612, - 5238: 0xC613, - 5239: 0xC614, - 5240: 0xC615, - 5241: 0xC616, - 5242: 0xC617, - 5243: 0xC61A, - 5244: 0xC61D, - 5245: 0xC61E, - 5246: 0xC61F, - 5247: 0xC620, - 5248: 0xC621, - 5249: 0xC622, - 5250: 0xC623, - 5251: 0xC626, - 5252: 0xC627, - 5253: 0xC629, - 5254: 0xC62A, - 5255: 0xC62B, - 5256: 0xC62F, - 5257: 0xC631, - 5258: 0xC632, - 5259: 0xC636, - 5260: 0xC638, - 5261: 0xC63A, - 5262: 0xC63C, - 5263: 0xC63D, - 5264: 0xC63E, - 5265: 0xC63F, - 5266: 0xC642, - 5267: 0xC643, - 5268: 0xC645, - 5269: 0xC646, - 5270: 0xC647, - 5271: 0xC649, - 5272: 0xC64A, - 5273: 0xC64B, - 5274: 0xC64C, - 5275: 0xC64D, - 5276: 0xC64E, - 5277: 0xC64F, - 5278: 0xC652, - 5279: 0xC656, - 5280: 0xC657, - 5281: 0xC658, - 5282: 0xC659, - 5283: 0xC65A, - 5284: 0xC65B, - 5285: 0xC65E, - 5286: 0xC65F, - 5287: 0xC661, - 5288: 0xC662, - 5289: 0xC663, - 5290: 0xC664, - 5291: 0xC665, - 5292: 0xC666, - 5293: 0xC667, - 5294: 0xC668, - 5295: 0xC669, - 5296: 0xC66A, - 5297: 0xC66B, - 5298: 0xC66D, - 5299: 0xC66E, - 5300: 0xC670, - 5301: 0xC672, - 5302: 0xC673, - 5303: 0xC674, - 5304: 0xC675, - 5305: 0xC676, - 5306: 0xC677, - 5307: 0xC67A, - 5308: 0xC67B, - 5309: 0xC67D, - 5310: 0xC67E, - 5311: 0xC67F, - 5312: 0xC681, - 5313: 0xC682, - 5314: 0xC683, - 5315: 0xC684, - 5316: 0xC685, - 5317: 0xC686, - 5318: 0xC687, - 5319: 0xC68A, - 5320: 0xC68C, - 5321: 0xC68E, - 5322: 0xC68F, - 5323: 0xC690, - 5324: 0xC691, - 5325: 0xC692, - 5326: 0xC693, - 5327: 0xC696, - 5328: 0xC697, - 5329: 0xC699, - 5330: 0xC69A, - 5331: 0xC69B, - 5332: 0xC69D, - 5333: 0xC69E, - 5334: 0xC69F, - 5335: 0xC6A0, - 5336: 0xC6A1, - 5337: 0xC6A2, - 5338: 0xC6A3, - 5339: 0xC6A6, - 5340: 0xC6A8, - 5341: 0xC6AA, - 5342: 0xC6AB, - 5343: 0xC6AC, - 5344: 0xC6AD, - 5345: 0xC6AE, - 5346: 0xC6AF, - 5347: 0xC6B2, - 5348: 0xC6B3, - 5349: 0xC6B5, - 5350: 0xC6B6, - 5351: 0xC6B7, - 5352: 0xC6BB, - 5353: 0xC6BC, - 5354: 0xC6BD, - 5355: 0xC6BE, - 5356: 0xC6BF, - 5357: 0xC6C2, - 5358: 0xC6C4, - 5359: 0xC6C6, - 5360: 0xC6C7, - 5361: 0xC6C8, - 5362: 0xC6C9, - 5363: 0xC6CA, - 5364: 0xC6CB, - 5365: 0xC6CE, - 5366: 0xC6CF, - 5367: 0xC6D1, - 5368: 0xC6D2, - 5369: 0xC6D3, - 5370: 0xC6D5, - 5371: 0xC6D6, - 5372: 0xC6D7, - 5373: 0xC6D8, - 5374: 0xC6D9, - 5375: 0xC6DA, - 5376: 0xC6DB, - 5377: 0xC6DE, - 5378: 0xC6DF, - 5379: 0xC6E2, - 5380: 0xC6E3, - 5381: 0xC6E4, - 5382: 0xC6E5, - 5383: 0xC6E6, - 5384: 0xC6E7, - 5385: 0xC6EA, - 5386: 0xC6EB, - 5387: 0xC6ED, - 5388: 0xC6EE, - 5389: 0xC6EF, - 5390: 0xC6F1, - 5391: 0xC6F2, - 5392: 0xC6F3, - 5393: 0xC6F4, - 5394: 0xC6F5, - 5395: 0xC6F6, - 5396: 0xC6F7, - 5397: 0xC6FA, - 5398: 0xC6FB, - 5399: 0xC6FC, - 5400: 0xC6FE, - 5401: 0xC6FF, - 5402: 0xC700, - 5403: 0xC701, - 5404: 0xC702, - 5405: 0xC703, - 5406: 0xC706, - 5407: 0xC707, - 5408: 0xC709, - 5409: 0xC70A, - 5410: 0xC70B, - 5411: 0xC70D, - 5412: 0xC70E, - 5413: 0xC70F, - 5414: 0xC710, - 5415: 0xC711, - 5416: 0xC712, - 5417: 0xC713, - 5418: 0xC716, - 5419: 0xC718, - 5420: 0xC71A, - 5421: 0xC71B, - 5422: 0xC71C, - 5423: 0xC71D, - 5424: 0xC71E, - 5425: 0xC71F, - 5426: 0xC722, - 5427: 0xC723, - 5428: 0xC725, - 5429: 0xC726, - 5430: 0xC727, - 5431: 0xC729, - 5432: 0xC72A, - 5433: 0xC72B, - 5434: 0xC72C, - 5435: 0xC72D, - 5436: 0xC72E, - 5437: 0xC72F, - 5438: 0xC732, - 5439: 0xC734, - 5440: 0xC736, - 5441: 0xC738, - 5442: 0xC739, - 5443: 0xC73A, - 5444: 0xC73B, - 5445: 0xC73E, - 5446: 0xC73F, - 5447: 0xC741, - 5448: 0xC742, - 5449: 0xC743, - 5450: 0xC745, - 5451: 0xC746, - 5452: 0xC747, - 5453: 0xC748, - 5454: 0xC749, - 5455: 0xC74B, - 5456: 0xC74E, - 5457: 0xC750, - 5458: 0xC759, - 5459: 0xC75A, - 5460: 0xC75B, - 5461: 0xC75D, - 5462: 0xC75E, - 5463: 0xC75F, - 5464: 0xC761, - 5465: 0xC762, - 5466: 0xC763, - 5467: 0xC764, - 5468: 0xC765, - 5469: 0xC766, - 5470: 0xC767, - 5471: 0xC769, - 5472: 0xC76A, - 5473: 0xC76C, - 5474: 0xC76D, - 5475: 0xC76E, - 5476: 0xC76F, - 5477: 0xC770, - 5478: 0xC771, - 5479: 0xC772, - 5480: 0xC773, - 5481: 0xC776, - 5482: 0xC777, - 5483: 0xC779, - 5484: 0xC77A, - 5485: 0xC77B, - 5486: 0xC77F, - 5487: 0xC780, - 5488: 0xC781, - 5489: 0xC782, - 5490: 0xC786, - 5491: 0xC78B, - 5492: 0xC78C, - 5493: 0xC78D, - 5494: 0xC78F, - 5495: 0xC792, - 5496: 0xC793, - 5497: 0xC795, - 5498: 0xC799, - 5499: 0xC79B, - 5500: 0xC79C, - 5501: 0xC79D, - 5502: 0xC79E, - 5503: 0xC79F, - 5504: 0xC7A2, - 5505: 0xC7A7, - 5506: 0xC7A8, - 5507: 0xC7A9, - 5508: 0xC7AA, - 5509: 0xC7AB, - 5510: 0xC7AE, - 5511: 0xC7AF, - 5512: 0xC7B1, - 5513: 0xC7B2, - 5514: 0xC7B3, - 5515: 0xC7B5, - 5516: 0xC7B6, - 5517: 0xC7B7, - 5518: 0xC7B8, - 5519: 0xC7B9, - 5520: 0xC7BA, - 5521: 0xC7BB, - 5522: 0xC7BE, - 5523: 0xC7C2, - 5524: 0xC7C3, - 5525: 0xC7C4, - 5526: 0xC7C5, - 5527: 0xC7C6, - 5528: 0xC7C7, - 5529: 0xC7CA, - 5530: 0xC7CB, - 5531: 0xC7CD, - 5532: 0xC7CF, - 5533: 0xC7D1, - 5534: 0xC7D2, - 5535: 0xC7D3, - 5536: 0xC7D4, - 5537: 0xC7D5, - 5538: 0xC7D6, - 5539: 0xC7D7, - 5540: 0xC7D9, - 5541: 0xC7DA, - 5542: 0xC7DB, - 5543: 0xC7DC, - 5544: 0xC7DE, - 5545: 0xC7DF, - 5546: 0xC7E0, - 5547: 0xC7E1, - 5548: 0xC7E2, - 5549: 0xC7E3, - 5550: 0xC7E5, - 5551: 0xC7E6, - 5552: 0xC7E7, - 5553: 0xC7E9, - 5554: 0xC7EA, - 5555: 0xC7EB, - 5556: 0xC7ED, - 5557: 0xC7EE, - 5558: 0xC7EF, - 5559: 0xC7F0, - 5560: 0xC7F1, - 5561: 0xC7F2, - 5562: 0xC7F3, - 5563: 0xC7F4, - 5564: 0xC7F5, - 5565: 0xC7F6, - 5566: 0xC7F7, - 5567: 0xC7F8, - 5568: 0xC7F9, - 5569: 0xC7FA, - 5570: 0xC7FB, - 5571: 0xC7FC, - 5572: 0xC7FD, - 5573: 0xC7FE, - 5574: 0xC7FF, - 5575: 0xC802, - 5576: 0xC803, - 5577: 0xC805, - 5578: 0xC806, - 5579: 0xC807, - 5580: 0xC809, - 5581: 0xC80B, - 5582: 0xC80C, - 5583: 0xC80D, - 5584: 0xC80E, - 5585: 0xC80F, - 5586: 0xC812, - 5587: 0xC814, - 5588: 0xC817, - 5589: 0xC818, - 5590: 0xC819, - 5591: 0xC81A, - 5592: 0xC81B, - 5593: 0xC81E, - 5594: 0xC81F, - 5595: 0xC821, - 5596: 0xC822, - 5597: 0xC823, - 5598: 0xC825, - 5599: 0xC826, - 5600: 0xC827, - 5601: 0xC828, - 5602: 0xC829, - 5603: 0xC82A, - 5604: 0xC82B, - 5605: 0xC82E, - 5606: 0xC830, - 5607: 0xC832, - 5608: 0xC833, - 5609: 0xC834, - 5610: 0xC835, - 5611: 0xC836, - 5612: 0xC837, - 5613: 0xC839, - 5614: 0xC83A, - 5615: 0xC83B, - 5616: 0xC83D, - 5617: 0xC83E, - 5618: 0xC83F, - 5619: 0xC841, - 5620: 0xC842, - 5621: 0xC843, - 5622: 0xC844, - 5623: 0xC845, - 5624: 0xC846, - 5625: 0xC847, - 5626: 0xC84A, - 5627: 0xC84B, - 5628: 0xC84E, - 5629: 0xC84F, - 5630: 0xC850, - 5631: 0xC851, - 5632: 0xC852, - 5633: 0xC853, - 5634: 0xC855, - 5635: 0xC856, - 5636: 0xC857, - 5637: 0xC858, - 5638: 0xC859, - 5639: 0xC85A, - 5640: 0xC85B, - 5641: 0xC85C, - 5642: 0xC85D, - 5643: 0xC85E, - 5644: 0xC85F, - 5645: 0xC860, - 5646: 0xC861, - 5647: 0xC862, - 5648: 0xC863, - 5649: 0xC864, - 5650: 0xC865, - 5651: 0xC866, - 5652: 0xC867, - 5653: 0xC868, - 5654: 0xC869, - 5655: 0xC86A, - 5656: 0xC86B, - 5657: 0xC86C, - 5658: 0xC86D, - 5659: 0xC86E, - 5660: 0xC86F, - 5661: 0xC872, - 5662: 0xC873, - 5663: 0xC875, - 5664: 0xC876, - 5665: 0xC877, - 5666: 0xC879, - 5667: 0xC87B, - 5668: 0xC87C, - 5669: 0xC87D, - 5670: 0xC87E, - 5671: 0xC87F, - 5672: 0xC882, - 5673: 0xC884, - 5674: 0xC888, - 5675: 0xC889, - 5676: 0xC88A, - 5677: 0xC88E, - 5678: 0xC88F, - 5679: 0xC890, - 5680: 0xC891, - 5681: 0xC892, - 5682: 0xC893, - 5683: 0xC895, - 5684: 0xC896, - 5685: 0xC897, - 5686: 0xC898, - 5687: 0xC899, - 5688: 0xC89A, - 5689: 0xC89B, - 5690: 0xC89C, - 5691: 0xC89E, - 5692: 0xC8A0, - 5693: 0xC8A2, - 5694: 0xC8A3, - 5695: 0xC8A4, - 5696: 0xC8A5, - 5697: 0xC8A6, - 5698: 0xC8A7, - 5699: 0xC8A9, - 5700: 0xC8AA, - 5701: 0xC8AB, - 5702: 0xC8AC, - 5703: 0xC8AD, - 5704: 0xC8AE, - 5705: 0xC8AF, - 5706: 0xC8B0, - 5707: 0xC8B1, - 5708: 0xC8B2, - 5709: 0xC8B3, - 5710: 0xC8B4, - 5711: 0xC8B5, - 5712: 0xC8B6, - 5713: 0xC8B7, - 5714: 0xC8B8, - 5715: 0xC8B9, - 5716: 0xC8BA, - 5717: 0xC8BB, - 5718: 0xC8BE, - 5719: 0xC8BF, - 5720: 0xC8C0, - 5721: 0xC8C1, - 5722: 0xC8C2, - 5723: 0xC8C3, - 5724: 0xC8C5, - 5725: 0xC8C6, - 5726: 0xC8C7, - 5727: 0xC8C9, - 5728: 0xC8CA, - 5729: 0xC8CB, - 5730: 0xC8CD, - 5731: 0xC8CE, - 5732: 0xC8CF, - 5733: 0xC8D0, - 5734: 0xC8D1, - 5735: 0xC8D2, - 5736: 0xC8D3, - 5737: 0xC8D6, - 5738: 0xC8D8, - 5739: 0xC8DA, - 5740: 0xC8DB, - 5741: 0xC8DC, - 5742: 0xC8DD, - 5743: 0xC8DE, - 5744: 0xC8DF, - 5745: 0xC8E2, - 5746: 0xC8E3, - 5747: 0xC8E5, - 5748: 0xC8E6, - 5749: 0xC8E7, - 5750: 0xC8E8, - 5751: 0xC8E9, - 5752: 0xC8EA, - 5753: 0xC8EB, - 5754: 0xC8EC, - 5755: 0xC8ED, - 5756: 0xC8EE, - 5757: 0xC8EF, - 5758: 0xC8F0, - 5759: 0xC8F1, - 5760: 0xC8F2, - 5761: 0xC8F3, - 5762: 0xC8F4, - 5763: 0xC8F6, - 5764: 0xC8F7, - 5765: 0xC8F8, - 5766: 0xC8F9, - 5767: 0xC8FA, - 5768: 0xC8FB, - 5769: 0xC8FE, - 5770: 0xC8FF, - 5771: 0xC901, - 5772: 0xC902, - 5773: 0xC903, - 5774: 0xC907, - 5775: 0xC908, - 5776: 0xC909, - 5777: 0xC90A, - 5778: 0xC90B, - 5779: 0xC90E, - 5780: 0x3000, - 5781: 0x3001, - 5782: 0x3002, - 5783: 0x00B7, - 5784: 0x2025, - 5785: 0x2026, - 5786: 0x00A8, - 5787: 0x3003, - 5788: 0x00AD, - 5789: 0x2015, - 5790: 0x2225, - 5791: 0xFF3C, - 5792: 0x223C, - 5793: 0x2018, - 5794: 0x2019, - 5795: 0x201C, - 5796: 0x201D, - 5797: 0x3014, - 5798: 0x3015, - 5799: 0x3008, - 5800: 0x3009, - 5801: 0x300A, - 5802: 0x300B, - 5803: 0x300C, - 5804: 0x300D, - 5805: 0x300E, - 5806: 0x300F, - 5807: 0x3010, - 5808: 0x3011, - 5809: 0x00B1, - 5810: 0x00D7, - 5811: 0x00F7, - 5812: 0x2260, - 5813: 0x2264, - 5814: 0x2265, - 5815: 0x221E, - 5816: 0x2234, - 5817: 0x00B0, - 5818: 0x2032, - 5819: 0x2033, - 5820: 0x2103, - 5821: 0x212B, - 5822: 0xFFE0, - 5823: 0xFFE1, - 5824: 0xFFE5, - 5825: 0x2642, - 5826: 0x2640, - 5827: 0x2220, - 5828: 0x22A5, - 5829: 0x2312, - 5830: 0x2202, - 5831: 0x2207, - 5832: 0x2261, - 5833: 0x2252, - 5834: 0x00A7, - 5835: 0x203B, - 5836: 0x2606, - 5837: 0x2605, - 5838: 0x25CB, - 5839: 0x25CF, - 5840: 0x25CE, - 5841: 0x25C7, - 5842: 0x25C6, - 5843: 0x25A1, - 5844: 0x25A0, - 5845: 0x25B3, - 5846: 0x25B2, - 5847: 0x25BD, - 5848: 0x25BC, - 5849: 0x2192, - 5850: 0x2190, - 5851: 0x2191, - 5852: 0x2193, - 5853: 0x2194, - 5854: 0x3013, - 5855: 0x226A, - 5856: 0x226B, - 5857: 0x221A, - 5858: 0x223D, - 5859: 0x221D, - 5860: 0x2235, - 5861: 0x222B, - 5862: 0x222C, - 5863: 0x2208, - 5864: 0x220B, - 5865: 0x2286, - 5866: 0x2287, - 5867: 0x2282, - 5868: 0x2283, - 5869: 0x222A, - 5870: 0x2229, - 5871: 0x2227, - 5872: 0x2228, - 5873: 0xFFE2, - 5874: 0xC910, - 5875: 0xC912, - 5876: 0xC913, - 5877: 0xC914, - 5878: 0xC915, - 5879: 0xC916, - 5880: 0xC917, - 5881: 0xC919, - 5882: 0xC91A, - 5883: 0xC91B, - 5884: 0xC91C, - 5885: 0xC91D, - 5886: 0xC91E, - 5887: 0xC91F, - 5888: 0xC920, - 5889: 0xC921, - 5890: 0xC922, - 5891: 0xC923, - 5892: 0xC924, - 5893: 0xC925, - 5894: 0xC926, - 5895: 0xC927, - 5896: 0xC928, - 5897: 0xC929, - 5898: 0xC92A, - 5899: 0xC92B, - 5900: 0xC92D, - 5901: 0xC92E, - 5902: 0xC92F, - 5903: 0xC930, - 5904: 0xC931, - 5905: 0xC932, - 5906: 0xC933, - 5907: 0xC935, - 5908: 0xC936, - 5909: 0xC937, - 5910: 0xC938, - 5911: 0xC939, - 5912: 0xC93A, - 5913: 0xC93B, - 5914: 0xC93C, - 5915: 0xC93D, - 5916: 0xC93E, - 5917: 0xC93F, - 5918: 0xC940, - 5919: 0xC941, - 5920: 0xC942, - 5921: 0xC943, - 5922: 0xC944, - 5923: 0xC945, - 5924: 0xC946, - 5925: 0xC947, - 5926: 0xC948, - 5927: 0xC949, - 5928: 0xC94A, - 5929: 0xC94B, - 5930: 0xC94C, - 5931: 0xC94D, - 5932: 0xC94E, - 5933: 0xC94F, - 5934: 0xC952, - 5935: 0xC953, - 5936: 0xC955, - 5937: 0xC956, - 5938: 0xC957, - 5939: 0xC959, - 5940: 0xC95A, - 5941: 0xC95B, - 5942: 0xC95C, - 5943: 0xC95D, - 5944: 0xC95E, - 5945: 0xC95F, - 5946: 0xC962, - 5947: 0xC964, - 5948: 0xC965, - 5949: 0xC966, - 5950: 0xC967, - 5951: 0xC968, - 5952: 0xC969, - 5953: 0xC96A, - 5954: 0xC96B, - 5955: 0xC96D, - 5956: 0xC96E, - 5957: 0xC96F, - 5958: 0x21D2, - 5959: 0x21D4, - 5960: 0x2200, - 5961: 0x2203, - 5962: 0x00B4, - 5963: 0xFF5E, - 5964: 0x02C7, - 5965: 0x02D8, - 5966: 0x02DD, - 5967: 0x02DA, - 5968: 0x02D9, - 5969: 0x00B8, - 5970: 0x02DB, - 5971: 0x00A1, - 5972: 0x00BF, - 5973: 0x02D0, - 5974: 0x222E, - 5975: 0x2211, - 5976: 0x220F, - 5977: 0x00A4, - 5978: 0x2109, - 5979: 0x2030, - 5980: 0x25C1, - 5981: 0x25C0, - 5982: 0x25B7, - 5983: 0x25B6, - 5984: 0x2664, - 5985: 0x2660, - 5986: 0x2661, - 5987: 0x2665, - 5988: 0x2667, - 5989: 0x2663, - 5990: 0x2299, - 5991: 0x25C8, - 5992: 0x25A3, - 5993: 0x25D0, - 5994: 0x25D1, - 5995: 0x2592, - 5996: 0x25A4, - 5997: 0x25A5, - 5998: 0x25A8, - 5999: 0x25A7, - 6000: 0x25A6, - 6001: 0x25A9, - 6002: 0x2668, - 6003: 0x260F, - 6004: 0x260E, - 6005: 0x261C, - 6006: 0x261E, - 6007: 0x00B6, - 6008: 0x2020, - 6009: 0x2021, - 6010: 0x2195, - 6011: 0x2197, - 6012: 0x2199, - 6013: 0x2196, - 6014: 0x2198, - 6015: 0x266D, - 6016: 0x2669, - 6017: 0x266A, - 6018: 0x266C, - 6019: 0x327F, - 6020: 0x321C, - 6021: 0x2116, - 6022: 0x33C7, - 6023: 0x2122, - 6024: 0x33C2, - 6025: 0x33D8, - 6026: 0x2121, - 6027: 0x20AC, - 6028: 0x00AE, - 6052: 0xC971, - 6053: 0xC972, - 6054: 0xC973, - 6055: 0xC975, - 6056: 0xC976, - 6057: 0xC977, - 6058: 0xC978, - 6059: 0xC979, - 6060: 0xC97A, - 6061: 0xC97B, - 6062: 0xC97D, - 6063: 0xC97E, - 6064: 0xC97F, - 6065: 0xC980, - 6066: 0xC981, - 6067: 0xC982, - 6068: 0xC983, - 6069: 0xC984, - 6070: 0xC985, - 6071: 0xC986, - 6072: 0xC987, - 6073: 0xC98A, - 6074: 0xC98B, - 6075: 0xC98D, - 6076: 0xC98E, - 6077: 0xC98F, - 6078: 0xC991, - 6079: 0xC992, - 6080: 0xC993, - 6081: 0xC994, - 6082: 0xC995, - 6083: 0xC996, - 6084: 0xC997, - 6085: 0xC99A, - 6086: 0xC99C, - 6087: 0xC99E, - 6088: 0xC99F, - 6089: 0xC9A0, - 6090: 0xC9A1, - 6091: 0xC9A2, - 6092: 0xC9A3, - 6093: 0xC9A4, - 6094: 0xC9A5, - 6095: 0xC9A6, - 6096: 0xC9A7, - 6097: 0xC9A8, - 6098: 0xC9A9, - 6099: 0xC9AA, - 6100: 0xC9AB, - 6101: 0xC9AC, - 6102: 0xC9AD, - 6103: 0xC9AE, - 6104: 0xC9AF, - 6105: 0xC9B0, - 6106: 0xC9B1, - 6107: 0xC9B2, - 6108: 0xC9B3, - 6109: 0xC9B4, - 6110: 0xC9B5, - 6111: 0xC9B6, - 6112: 0xC9B7, - 6113: 0xC9B8, - 6114: 0xC9B9, - 6115: 0xC9BA, - 6116: 0xC9BB, - 6117: 0xC9BC, - 6118: 0xC9BD, - 6119: 0xC9BE, - 6120: 0xC9BF, - 6121: 0xC9C2, - 6122: 0xC9C3, - 6123: 0xC9C5, - 6124: 0xC9C6, - 6125: 0xC9C9, - 6126: 0xC9CB, - 6127: 0xC9CC, - 6128: 0xC9CD, - 6129: 0xC9CE, - 6130: 0xC9CF, - 6131: 0xC9D2, - 6132: 0xC9D4, - 6133: 0xC9D7, - 6134: 0xC9D8, - 6135: 0xC9DB, - 6136: 0xFF01, - 6137: 0xFF02, - 6138: 0xFF03, - 6139: 0xFF04, - 6140: 0xFF05, - 6141: 0xFF06, - 6142: 0xFF07, - 6143: 0xFF08, - 6144: 0xFF09, - 6145: 0xFF0A, - 6146: 0xFF0B, - 6147: 0xFF0C, - 6148: 0xFF0D, - 6149: 0xFF0E, - 6150: 0xFF0F, - 6151: 0xFF10, - 6152: 0xFF11, - 6153: 0xFF12, - 6154: 0xFF13, - 6155: 0xFF14, - 6156: 0xFF15, - 6157: 0xFF16, - 6158: 0xFF17, - 6159: 0xFF18, - 6160: 0xFF19, - 6161: 0xFF1A, - 6162: 0xFF1B, - 6163: 0xFF1C, - 6164: 0xFF1D, - 6165: 0xFF1E, - 6166: 0xFF1F, - 6167: 0xFF20, - 6168: 0xFF21, - 6169: 0xFF22, - 6170: 0xFF23, - 6171: 0xFF24, - 6172: 0xFF25, - 6173: 0xFF26, - 6174: 0xFF27, - 6175: 0xFF28, - 6176: 0xFF29, - 6177: 0xFF2A, - 6178: 0xFF2B, - 6179: 0xFF2C, - 6180: 0xFF2D, - 6181: 0xFF2E, - 6182: 0xFF2F, - 6183: 0xFF30, - 6184: 0xFF31, - 6185: 0xFF32, - 6186: 0xFF33, - 6187: 0xFF34, - 6188: 0xFF35, - 6189: 0xFF36, - 6190: 0xFF37, - 6191: 0xFF38, - 6192: 0xFF39, - 6193: 0xFF3A, - 6194: 0xFF3B, - 6195: 0xFFE6, - 6196: 0xFF3D, - 6197: 0xFF3E, - 6198: 0xFF3F, - 6199: 0xFF40, - 6200: 0xFF41, - 6201: 0xFF42, - 6202: 0xFF43, - 6203: 0xFF44, - 6204: 0xFF45, - 6205: 0xFF46, - 6206: 0xFF47, - 6207: 0xFF48, - 6208: 0xFF49, - 6209: 0xFF4A, - 6210: 0xFF4B, - 6211: 0xFF4C, - 6212: 0xFF4D, - 6213: 0xFF4E, - 6214: 0xFF4F, - 6215: 0xFF50, - 6216: 0xFF51, - 6217: 0xFF52, - 6218: 0xFF53, - 6219: 0xFF54, - 6220: 0xFF55, - 6221: 0xFF56, - 6222: 0xFF57, - 6223: 0xFF58, - 6224: 0xFF59, - 6225: 0xFF5A, - 6226: 0xFF5B, - 6227: 0xFF5C, - 6228: 0xFF5D, - 6229: 0xFFE3, - 6230: 0xC9DE, - 6231: 0xC9DF, - 6232: 0xC9E1, - 6233: 0xC9E3, - 6234: 0xC9E5, - 6235: 0xC9E6, - 6236: 0xC9E8, - 6237: 0xC9E9, - 6238: 0xC9EA, - 6239: 0xC9EB, - 6240: 0xC9EE, - 6241: 0xC9F2, - 6242: 0xC9F3, - 6243: 0xC9F4, - 6244: 0xC9F5, - 6245: 0xC9F6, - 6246: 0xC9F7, - 6247: 0xC9FA, - 6248: 0xC9FB, - 6249: 0xC9FD, - 6250: 0xC9FE, - 6251: 0xC9FF, - 6252: 0xCA01, - 6253: 0xCA02, - 6254: 0xCA03, - 6255: 0xCA04, - 6256: 0xCA05, - 6257: 0xCA06, - 6258: 0xCA07, - 6259: 0xCA0A, - 6260: 0xCA0E, - 6261: 0xCA0F, - 6262: 0xCA10, - 6263: 0xCA11, - 6264: 0xCA12, - 6265: 0xCA13, - 6266: 0xCA15, - 6267: 0xCA16, - 6268: 0xCA17, - 6269: 0xCA19, - 6270: 0xCA1A, - 6271: 0xCA1B, - 6272: 0xCA1C, - 6273: 0xCA1D, - 6274: 0xCA1E, - 6275: 0xCA1F, - 6276: 0xCA20, - 6277: 0xCA21, - 6278: 0xCA22, - 6279: 0xCA23, - 6280: 0xCA24, - 6281: 0xCA25, - 6282: 0xCA26, - 6283: 0xCA27, - 6284: 0xCA28, - 6285: 0xCA2A, - 6286: 0xCA2B, - 6287: 0xCA2C, - 6288: 0xCA2D, - 6289: 0xCA2E, - 6290: 0xCA2F, - 6291: 0xCA30, - 6292: 0xCA31, - 6293: 0xCA32, - 6294: 0xCA33, - 6295: 0xCA34, - 6296: 0xCA35, - 6297: 0xCA36, - 6298: 0xCA37, - 6299: 0xCA38, - 6300: 0xCA39, - 6301: 0xCA3A, - 6302: 0xCA3B, - 6303: 0xCA3C, - 6304: 0xCA3D, - 6305: 0xCA3E, - 6306: 0xCA3F, - 6307: 0xCA40, - 6308: 0xCA41, - 6309: 0xCA42, - 6310: 0xCA43, - 6311: 0xCA44, - 6312: 0xCA45, - 6313: 0xCA46, - 6314: 0x3131, - 6315: 0x3132, - 6316: 0x3133, - 6317: 0x3134, - 6318: 0x3135, - 6319: 0x3136, - 6320: 0x3137, - 6321: 0x3138, - 6322: 0x3139, - 6323: 0x313A, - 6324: 0x313B, - 6325: 0x313C, - 6326: 0x313D, - 6327: 0x313E, - 6328: 0x313F, - 6329: 0x3140, - 6330: 0x3141, - 6331: 0x3142, - 6332: 0x3143, - 6333: 0x3144, - 6334: 0x3145, - 6335: 0x3146, - 6336: 0x3147, - 6337: 0x3148, - 6338: 0x3149, - 6339: 0x314A, - 6340: 0x314B, - 6341: 0x314C, - 6342: 0x314D, - 6343: 0x314E, - 6344: 0x314F, - 6345: 0x3150, - 6346: 0x3151, - 6347: 0x3152, - 6348: 0x3153, - 6349: 0x3154, - 6350: 0x3155, - 6351: 0x3156, - 6352: 0x3157, - 6353: 0x3158, - 6354: 0x3159, - 6355: 0x315A, - 6356: 0x315B, - 6357: 0x315C, - 6358: 0x315D, - 6359: 0x315E, - 6360: 0x315F, - 6361: 0x3160, - 6362: 0x3161, - 6363: 0x3162, - 6364: 0x3163, - 6365: 0x3164, - 6366: 0x3165, - 6367: 0x3166, - 6368: 0x3167, - 6369: 0x3168, - 6370: 0x3169, - 6371: 0x316A, - 6372: 0x316B, - 6373: 0x316C, - 6374: 0x316D, - 6375: 0x316E, - 6376: 0x316F, - 6377: 0x3170, - 6378: 0x3171, - 6379: 0x3172, - 6380: 0x3173, - 6381: 0x3174, - 6382: 0x3175, - 6383: 0x3176, - 6384: 0x3177, - 6385: 0x3178, - 6386: 0x3179, - 6387: 0x317A, - 6388: 0x317B, - 6389: 0x317C, - 6390: 0x317D, - 6391: 0x317E, - 6392: 0x317F, - 6393: 0x3180, - 6394: 0x3181, - 6395: 0x3182, - 6396: 0x3183, - 6397: 0x3184, - 6398: 0x3185, - 6399: 0x3186, - 6400: 0x3187, - 6401: 0x3188, - 6402: 0x3189, - 6403: 0x318A, - 6404: 0x318B, - 6405: 0x318C, - 6406: 0x318D, - 6407: 0x318E, - 6408: 0xCA47, - 6409: 0xCA48, - 6410: 0xCA49, - 6411: 0xCA4A, - 6412: 0xCA4B, - 6413: 0xCA4E, - 6414: 0xCA4F, - 6415: 0xCA51, - 6416: 0xCA52, - 6417: 0xCA53, - 6418: 0xCA55, - 6419: 0xCA56, - 6420: 0xCA57, - 6421: 0xCA58, - 6422: 0xCA59, - 6423: 0xCA5A, - 6424: 0xCA5B, - 6425: 0xCA5E, - 6426: 0xCA62, - 6427: 0xCA63, - 6428: 0xCA64, - 6429: 0xCA65, - 6430: 0xCA66, - 6431: 0xCA67, - 6432: 0xCA69, - 6433: 0xCA6A, - 6434: 0xCA6B, - 6435: 0xCA6C, - 6436: 0xCA6D, - 6437: 0xCA6E, - 6438: 0xCA6F, - 6439: 0xCA70, - 6440: 0xCA71, - 6441: 0xCA72, - 6442: 0xCA73, - 6443: 0xCA74, - 6444: 0xCA75, - 6445: 0xCA76, - 6446: 0xCA77, - 6447: 0xCA78, - 6448: 0xCA79, - 6449: 0xCA7A, - 6450: 0xCA7B, - 6451: 0xCA7C, - 6452: 0xCA7E, - 6453: 0xCA7F, - 6454: 0xCA80, - 6455: 0xCA81, - 6456: 0xCA82, - 6457: 0xCA83, - 6458: 0xCA85, - 6459: 0xCA86, - 6460: 0xCA87, - 6461: 0xCA88, - 6462: 0xCA89, - 6463: 0xCA8A, - 6464: 0xCA8B, - 6465: 0xCA8C, - 6466: 0xCA8D, - 6467: 0xCA8E, - 6468: 0xCA8F, - 6469: 0xCA90, - 6470: 0xCA91, - 6471: 0xCA92, - 6472: 0xCA93, - 6473: 0xCA94, - 6474: 0xCA95, - 6475: 0xCA96, - 6476: 0xCA97, - 6477: 0xCA99, - 6478: 0xCA9A, - 6479: 0xCA9B, - 6480: 0xCA9C, - 6481: 0xCA9D, - 6482: 0xCA9E, - 6483: 0xCA9F, - 6484: 0xCAA0, - 6485: 0xCAA1, - 6486: 0xCAA2, - 6487: 0xCAA3, - 6488: 0xCAA4, - 6489: 0xCAA5, - 6490: 0xCAA6, - 6491: 0xCAA7, - 6492: 0x2170, - 6493: 0x2171, - 6494: 0x2172, - 6495: 0x2173, - 6496: 0x2174, - 6497: 0x2175, - 6498: 0x2176, - 6499: 0x2177, - 6500: 0x2178, - 6501: 0x2179, - 6507: 0x2160, - 6508: 0x2161, - 6509: 0x2162, - 6510: 0x2163, - 6511: 0x2164, - 6512: 0x2165, - 6513: 0x2166, - 6514: 0x2167, - 6515: 0x2168, - 6516: 0x2169, - 6524: 0x0391, - 6525: 0x0392, - 6526: 0x0393, - 6527: 0x0394, - 6528: 0x0395, - 6529: 0x0396, - 6530: 0x0397, - 6531: 0x0398, - 6532: 0x0399, - 6533: 0x039A, - 6534: 0x039B, - 6535: 0x039C, - 6536: 0x039D, - 6537: 0x039E, - 6538: 0x039F, - 6539: 0x03A0, - 6540: 0x03A1, - 6541: 0x03A3, - 6542: 0x03A4, - 6543: 0x03A5, - 6544: 0x03A6, - 6545: 0x03A7, - 6546: 0x03A8, - 6547: 0x03A9, - 6556: 0x03B1, - 6557: 0x03B2, - 6558: 0x03B3, - 6559: 0x03B4, - 6560: 0x03B5, - 6561: 0x03B6, - 6562: 0x03B7, - 6563: 0x03B8, - 6564: 0x03B9, - 6565: 0x03BA, - 6566: 0x03BB, - 6567: 0x03BC, - 6568: 0x03BD, - 6569: 0x03BE, - 6570: 0x03BF, - 6571: 0x03C0, - 6572: 0x03C1, - 6573: 0x03C3, - 6574: 0x03C4, - 6575: 0x03C5, - 6576: 0x03C6, - 6577: 0x03C7, - 6578: 0x03C8, - 6579: 0x03C9, - 6586: 0xCAA8, - 6587: 0xCAA9, - 6588: 0xCAAA, - 6589: 0xCAAB, - 6590: 0xCAAC, - 6591: 0xCAAD, - 6592: 0xCAAE, - 6593: 0xCAAF, - 6594: 0xCAB0, - 6595: 0xCAB1, - 6596: 0xCAB2, - 6597: 0xCAB3, - 6598: 0xCAB4, - 6599: 0xCAB5, - 6600: 0xCAB6, - 6601: 0xCAB7, - 6602: 0xCAB8, - 6603: 0xCAB9, - 6604: 0xCABA, - 6605: 0xCABB, - 6606: 0xCABE, - 6607: 0xCABF, - 6608: 0xCAC1, - 6609: 0xCAC2, - 6610: 0xCAC3, - 6611: 0xCAC5, - 6612: 0xCAC6, - 6613: 0xCAC7, - 6614: 0xCAC8, - 6615: 0xCAC9, - 6616: 0xCACA, - 6617: 0xCACB, - 6618: 0xCACE, - 6619: 0xCAD0, - 6620: 0xCAD2, - 6621: 0xCAD4, - 6622: 0xCAD5, - 6623: 0xCAD6, - 6624: 0xCAD7, - 6625: 0xCADA, - 6626: 0xCADB, - 6627: 0xCADC, - 6628: 0xCADD, - 6629: 0xCADE, - 6630: 0xCADF, - 6631: 0xCAE1, - 6632: 0xCAE2, - 6633: 0xCAE3, - 6634: 0xCAE4, - 6635: 0xCAE5, - 6636: 0xCAE6, - 6637: 0xCAE7, - 6638: 0xCAE8, - 6639: 0xCAE9, - 6640: 0xCAEA, - 6641: 0xCAEB, - 6642: 0xCAED, - 6643: 0xCAEE, - 6644: 0xCAEF, - 6645: 0xCAF0, - 6646: 0xCAF1, - 6647: 0xCAF2, - 6648: 0xCAF3, - 6649: 0xCAF5, - 6650: 0xCAF6, - 6651: 0xCAF7, - 6652: 0xCAF8, - 6653: 0xCAF9, - 6654: 0xCAFA, - 6655: 0xCAFB, - 6656: 0xCAFC, - 6657: 0xCAFD, - 6658: 0xCAFE, - 6659: 0xCAFF, - 6660: 0xCB00, - 6661: 0xCB01, - 6662: 0xCB02, - 6663: 0xCB03, - 6664: 0xCB04, - 6665: 0xCB05, - 6666: 0xCB06, - 6667: 0xCB07, - 6668: 0xCB09, - 6669: 0xCB0A, - 6670: 0x2500, - 6671: 0x2502, - 6672: 0x250C, - 6673: 0x2510, - 6674: 0x2518, - 6675: 0x2514, - 6676: 0x251C, - 6677: 0x252C, - 6678: 0x2524, - 6679: 0x2534, - 6680: 0x253C, - 6681: 0x2501, - 6682: 0x2503, - 6683: 0x250F, - 6684: 0x2513, - 6685: 0x251B, - 6686: 0x2517, - 6687: 0x2523, - 6688: 0x2533, - 6689: 0x252B, - 6690: 0x253B, - 6691: 0x254B, - 6692: 0x2520, - 6693: 0x252F, - 6694: 0x2528, - 6695: 0x2537, - 6696: 0x253F, - 6697: 0x251D, - 6698: 0x2530, - 6699: 0x2525, - 6700: 0x2538, - 6701: 0x2542, - 6702: 0x2512, - 6703: 0x2511, - 6704: 0x251A, - 6705: 0x2519, - 6706: 0x2516, - 6707: 0x2515, - 6708: 0x250E, - 6709: 0x250D, - 6710: 0x251E, - 6711: 0x251F, - 6712: 0x2521, - 6713: 0x2522, - 6714: 0x2526, - 6715: 0x2527, - 6716: 0x2529, - 6717: 0x252A, - 6718: 0x252D, - 6719: 0x252E, - 6720: 0x2531, - 6721: 0x2532, - 6722: 0x2535, - 6723: 0x2536, - 6724: 0x2539, - 6725: 0x253A, - 6726: 0x253D, - 6727: 0x253E, - 6728: 0x2540, - 6729: 0x2541, - 6730: 0x2543, - 6731: 0x2544, - 6732: 0x2545, - 6733: 0x2546, - 6734: 0x2547, - 6735: 0x2548, - 6736: 0x2549, - 6737: 0x254A, - 6764: 0xCB0B, - 6765: 0xCB0C, - 6766: 0xCB0D, - 6767: 0xCB0E, - 6768: 0xCB0F, - 6769: 0xCB11, - 6770: 0xCB12, - 6771: 0xCB13, - 6772: 0xCB15, - 6773: 0xCB16, - 6774: 0xCB17, - 6775: 0xCB19, - 6776: 0xCB1A, - 6777: 0xCB1B, - 6778: 0xCB1C, - 6779: 0xCB1D, - 6780: 0xCB1E, - 6781: 0xCB1F, - 6782: 0xCB22, - 6783: 0xCB23, - 6784: 0xCB24, - 6785: 0xCB25, - 6786: 0xCB26, - 6787: 0xCB27, - 6788: 0xCB28, - 6789: 0xCB29, - 6790: 0xCB2A, - 6791: 0xCB2B, - 6792: 0xCB2C, - 6793: 0xCB2D, - 6794: 0xCB2E, - 6795: 0xCB2F, - 6796: 0xCB30, - 6797: 0xCB31, - 6798: 0xCB32, - 6799: 0xCB33, - 6800: 0xCB34, - 6801: 0xCB35, - 6802: 0xCB36, - 6803: 0xCB37, - 6804: 0xCB38, - 6805: 0xCB39, - 6806: 0xCB3A, - 6807: 0xCB3B, - 6808: 0xCB3C, - 6809: 0xCB3D, - 6810: 0xCB3E, - 6811: 0xCB3F, - 6812: 0xCB40, - 6813: 0xCB42, - 6814: 0xCB43, - 6815: 0xCB44, - 6816: 0xCB45, - 6817: 0xCB46, - 6818: 0xCB47, - 6819: 0xCB4A, - 6820: 0xCB4B, - 6821: 0xCB4D, - 6822: 0xCB4E, - 6823: 0xCB4F, - 6824: 0xCB51, - 6825: 0xCB52, - 6826: 0xCB53, - 6827: 0xCB54, - 6828: 0xCB55, - 6829: 0xCB56, - 6830: 0xCB57, - 6831: 0xCB5A, - 6832: 0xCB5B, - 6833: 0xCB5C, - 6834: 0xCB5E, - 6835: 0xCB5F, - 6836: 0xCB60, - 6837: 0xCB61, - 6838: 0xCB62, - 6839: 0xCB63, - 6840: 0xCB65, - 6841: 0xCB66, - 6842: 0xCB67, - 6843: 0xCB68, - 6844: 0xCB69, - 6845: 0xCB6A, - 6846: 0xCB6B, - 6847: 0xCB6C, - 6848: 0x3395, - 6849: 0x3396, - 6850: 0x3397, - 6851: 0x2113, - 6852: 0x3398, - 6853: 0x33C4, - 6854: 0x33A3, - 6855: 0x33A4, - 6856: 0x33A5, - 6857: 0x33A6, - 6858: 0x3399, - 6859: 0x339A, - 6860: 0x339B, - 6861: 0x339C, - 6862: 0x339D, - 6863: 0x339E, - 6864: 0x339F, - 6865: 0x33A0, - 6866: 0x33A1, - 6867: 0x33A2, - 6868: 0x33CA, - 6869: 0x338D, - 6870: 0x338E, - 6871: 0x338F, - 6872: 0x33CF, - 6873: 0x3388, - 6874: 0x3389, - 6875: 0x33C8, - 6876: 0x33A7, - 6877: 0x33A8, - 6878: 0x33B0, - 6879: 0x33B1, - 6880: 0x33B2, - 6881: 0x33B3, - 6882: 0x33B4, - 6883: 0x33B5, - 6884: 0x33B6, - 6885: 0x33B7, - 6886: 0x33B8, - 6887: 0x33B9, - 6888: 0x3380, - 6889: 0x3381, - 6890: 0x3382, - 6891: 0x3383, - 6892: 0x3384, - 6893: 0x33BA, - 6894: 0x33BB, - 6895: 0x33BC, - 6896: 0x33BD, - 6897: 0x33BE, - 6898: 0x33BF, - 6899: 0x3390, - 6900: 0x3391, - 6901: 0x3392, - 6902: 0x3393, - 6903: 0x3394, - 6904: 0x2126, - 6905: 0x33C0, - 6906: 0x33C1, - 6907: 0x338A, - 6908: 0x338B, - 6909: 0x338C, - 6910: 0x33D6, - 6911: 0x33C5, - 6912: 0x33AD, - 6913: 0x33AE, - 6914: 0x33AF, - 6915: 0x33DB, - 6916: 0x33A9, - 6917: 0x33AA, - 6918: 0x33AB, - 6919: 0x33AC, - 6920: 0x33DD, - 6921: 0x33D0, - 6922: 0x33D3, - 6923: 0x33C3, - 6924: 0x33C9, - 6925: 0x33DC, - 6926: 0x33C6, - 6942: 0xCB6D, - 6943: 0xCB6E, - 6944: 0xCB6F, - 6945: 0xCB70, - 6946: 0xCB71, - 6947: 0xCB72, - 6948: 0xCB73, - 6949: 0xCB74, - 6950: 0xCB75, - 6951: 0xCB76, - 6952: 0xCB77, - 6953: 0xCB7A, - 6954: 0xCB7B, - 6955: 0xCB7C, - 6956: 0xCB7D, - 6957: 0xCB7E, - 6958: 0xCB7F, - 6959: 0xCB80, - 6960: 0xCB81, - 6961: 0xCB82, - 6962: 0xCB83, - 6963: 0xCB84, - 6964: 0xCB85, - 6965: 0xCB86, - 6966: 0xCB87, - 6967: 0xCB88, - 6968: 0xCB89, - 6969: 0xCB8A, - 6970: 0xCB8B, - 6971: 0xCB8C, - 6972: 0xCB8D, - 6973: 0xCB8E, - 6974: 0xCB8F, - 6975: 0xCB90, - 6976: 0xCB91, - 6977: 0xCB92, - 6978: 0xCB93, - 6979: 0xCB94, - 6980: 0xCB95, - 6981: 0xCB96, - 6982: 0xCB97, - 6983: 0xCB98, - 6984: 0xCB99, - 6985: 0xCB9A, - 6986: 0xCB9B, - 6987: 0xCB9D, - 6988: 0xCB9E, - 6989: 0xCB9F, - 6990: 0xCBA0, - 6991: 0xCBA1, - 6992: 0xCBA2, - 6993: 0xCBA3, - 6994: 0xCBA4, - 6995: 0xCBA5, - 6996: 0xCBA6, - 6997: 0xCBA7, - 6998: 0xCBA8, - 6999: 0xCBA9, - 7000: 0xCBAA, - 7001: 0xCBAB, - 7002: 0xCBAC, - 7003: 0xCBAD, - 7004: 0xCBAE, - 7005: 0xCBAF, - 7006: 0xCBB0, - 7007: 0xCBB1, - 7008: 0xCBB2, - 7009: 0xCBB3, - 7010: 0xCBB4, - 7011: 0xCBB5, - 7012: 0xCBB6, - 7013: 0xCBB7, - 7014: 0xCBB9, - 7015: 0xCBBA, - 7016: 0xCBBB, - 7017: 0xCBBC, - 7018: 0xCBBD, - 7019: 0xCBBE, - 7020: 0xCBBF, - 7021: 0xCBC0, - 7022: 0xCBC1, - 7023: 0xCBC2, - 7024: 0xCBC3, - 7025: 0xCBC4, - 7026: 0x00C6, - 7027: 0x00D0, - 7028: 0x00AA, - 7029: 0x0126, - 7031: 0x0132, - 7033: 0x013F, - 7034: 0x0141, - 7035: 0x00D8, - 7036: 0x0152, - 7037: 0x00BA, - 7038: 0x00DE, - 7039: 0x0166, - 7040: 0x014A, - 7042: 0x3260, - 7043: 0x3261, - 7044: 0x3262, - 7045: 0x3263, - 7046: 0x3264, - 7047: 0x3265, - 7048: 0x3266, - 7049: 0x3267, - 7050: 0x3268, - 7051: 0x3269, - 7052: 0x326A, - 7053: 0x326B, - 7054: 0x326C, - 7055: 0x326D, - 7056: 0x326E, - 7057: 0x326F, - 7058: 0x3270, - 7059: 0x3271, - 7060: 0x3272, - 7061: 0x3273, - 7062: 0x3274, - 7063: 0x3275, - 7064: 0x3276, - 7065: 0x3277, - 7066: 0x3278, - 7067: 0x3279, - 7068: 0x327A, - 7069: 0x327B, - 7070: 0x24D0, - 7071: 0x24D1, - 7072: 0x24D2, - 7073: 0x24D3, - 7074: 0x24D4, - 7075: 0x24D5, - 7076: 0x24D6, - 7077: 0x24D7, - 7078: 0x24D8, - 7079: 0x24D9, - 7080: 0x24DA, - 7081: 0x24DB, - 7082: 0x24DC, - 7083: 0x24DD, - 7084: 0x24DE, - 7085: 0x24DF, - 7086: 0x24E0, - 7087: 0x24E1, - 7088: 0x24E2, - 7089: 0x24E3, - 7090: 0x24E4, - 7091: 0x24E5, - 7092: 0x24E6, - 7093: 0x24E7, - 7094: 0x24E8, - 7095: 0x24E9, - 7096: 0x2460, - 7097: 0x2461, - 7098: 0x2462, - 7099: 0x2463, - 7100: 0x2464, - 7101: 0x2465, - 7102: 0x2466, - 7103: 0x2467, - 7104: 0x2468, - 7105: 0x2469, - 7106: 0x246A, - 7107: 0x246B, - 7108: 0x246C, - 7109: 0x246D, - 7110: 0x246E, - 7111: 0x00BD, - 7112: 0x2153, - 7113: 0x2154, - 7114: 0x00BC, - 7115: 0x00BE, - 7116: 0x215B, - 7117: 0x215C, - 7118: 0x215D, - 7119: 0x215E, - 7120: 0xCBC5, - 7121: 0xCBC6, - 7122: 0xCBC7, - 7123: 0xCBC8, - 7124: 0xCBC9, - 7125: 0xCBCA, - 7126: 0xCBCB, - 7127: 0xCBCC, - 7128: 0xCBCD, - 7129: 0xCBCE, - 7130: 0xCBCF, - 7131: 0xCBD0, - 7132: 0xCBD1, - 7133: 0xCBD2, - 7134: 0xCBD3, - 7135: 0xCBD5, - 7136: 0xCBD6, - 7137: 0xCBD7, - 7138: 0xCBD8, - 7139: 0xCBD9, - 7140: 0xCBDA, - 7141: 0xCBDB, - 7142: 0xCBDC, - 7143: 0xCBDD, - 7144: 0xCBDE, - 7145: 0xCBDF, - 7146: 0xCBE0, - 7147: 0xCBE1, - 7148: 0xCBE2, - 7149: 0xCBE3, - 7150: 0xCBE5, - 7151: 0xCBE6, - 7152: 0xCBE8, - 7153: 0xCBEA, - 7154: 0xCBEB, - 7155: 0xCBEC, - 7156: 0xCBED, - 7157: 0xCBEE, - 7158: 0xCBEF, - 7159: 0xCBF0, - 7160: 0xCBF1, - 7161: 0xCBF2, - 7162: 0xCBF3, - 7163: 0xCBF4, - 7164: 0xCBF5, - 7165: 0xCBF6, - 7166: 0xCBF7, - 7167: 0xCBF8, - 7168: 0xCBF9, - 7169: 0xCBFA, - 7170: 0xCBFB, - 7171: 0xCBFC, - 7172: 0xCBFD, - 7173: 0xCBFE, - 7174: 0xCBFF, - 7175: 0xCC00, - 7176: 0xCC01, - 7177: 0xCC02, - 7178: 0xCC03, - 7179: 0xCC04, - 7180: 0xCC05, - 7181: 0xCC06, - 7182: 0xCC07, - 7183: 0xCC08, - 7184: 0xCC09, - 7185: 0xCC0A, - 7186: 0xCC0B, - 7187: 0xCC0E, - 7188: 0xCC0F, - 7189: 0xCC11, - 7190: 0xCC12, - 7191: 0xCC13, - 7192: 0xCC15, - 7193: 0xCC16, - 7194: 0xCC17, - 7195: 0xCC18, - 7196: 0xCC19, - 7197: 0xCC1A, - 7198: 0xCC1B, - 7199: 0xCC1E, - 7200: 0xCC1F, - 7201: 0xCC20, - 7202: 0xCC23, - 7203: 0xCC24, - 7204: 0x00E6, - 7205: 0x0111, - 7206: 0x00F0, - 7207: 0x0127, - 7208: 0x0131, - 7209: 0x0133, - 7210: 0x0138, - 7211: 0x0140, - 7212: 0x0142, - 7213: 0x00F8, - 7214: 0x0153, - 7215: 0x00DF, - 7216: 0x00FE, - 7217: 0x0167, - 7218: 0x014B, - 7219: 0x0149, - 7220: 0x3200, - 7221: 0x3201, - 7222: 0x3202, - 7223: 0x3203, - 7224: 0x3204, - 7225: 0x3205, - 7226: 0x3206, - 7227: 0x3207, - 7228: 0x3208, - 7229: 0x3209, - 7230: 0x320A, - 7231: 0x320B, - 7232: 0x320C, - 7233: 0x320D, - 7234: 0x320E, - 7235: 0x320F, - 7236: 0x3210, - 7237: 0x3211, - 7238: 0x3212, - 7239: 0x3213, - 7240: 0x3214, - 7241: 0x3215, - 7242: 0x3216, - 7243: 0x3217, - 7244: 0x3218, - 7245: 0x3219, - 7246: 0x321A, - 7247: 0x321B, - 7248: 0x249C, - 7249: 0x249D, - 7250: 0x249E, - 7251: 0x249F, - 7252: 0x24A0, - 7253: 0x24A1, - 7254: 0x24A2, - 7255: 0x24A3, - 7256: 0x24A4, - 7257: 0x24A5, - 7258: 0x24A6, - 7259: 0x24A7, - 7260: 0x24A8, - 7261: 0x24A9, - 7262: 0x24AA, - 7263: 0x24AB, - 7264: 0x24AC, - 7265: 0x24AD, - 7266: 0x24AE, - 7267: 0x24AF, - 7268: 0x24B0, - 7269: 0x24B1, - 7270: 0x24B2, - 7271: 0x24B3, - 7272: 0x24B4, - 7273: 0x24B5, - 7274: 0x2474, - 7275: 0x2475, - 7276: 0x2476, - 7277: 0x2477, - 7278: 0x2478, - 7279: 0x2479, - 7280: 0x247A, - 7281: 0x247B, - 7282: 0x247C, - 7283: 0x247D, - 7284: 0x247E, - 7285: 0x247F, - 7286: 0x2480, - 7287: 0x2481, - 7288: 0x2482, - 7289: 0x00B9, - 7290: 0x00B2, - 7291: 0x00B3, - 7292: 0x2074, - 7293: 0x207F, - 7294: 0x2081, - 7295: 0x2082, - 7296: 0x2083, - 7297: 0x2084, - 7298: 0xCC25, - 7299: 0xCC26, - 7300: 0xCC2A, - 7301: 0xCC2B, - 7302: 0xCC2D, - 7303: 0xCC2F, - 7304: 0xCC31, - 7305: 0xCC32, - 7306: 0xCC33, - 7307: 0xCC34, - 7308: 0xCC35, - 7309: 0xCC36, - 7310: 0xCC37, - 7311: 0xCC3A, - 7312: 0xCC3F, - 7313: 0xCC40, - 7314: 0xCC41, - 7315: 0xCC42, - 7316: 0xCC43, - 7317: 0xCC46, - 7318: 0xCC47, - 7319: 0xCC49, - 7320: 0xCC4A, - 7321: 0xCC4B, - 7322: 0xCC4D, - 7323: 0xCC4E, - 7324: 0xCC4F, - 7325: 0xCC50, - 7326: 0xCC51, - 7327: 0xCC52, - 7328: 0xCC53, - 7329: 0xCC56, - 7330: 0xCC5A, - 7331: 0xCC5B, - 7332: 0xCC5C, - 7333: 0xCC5D, - 7334: 0xCC5E, - 7335: 0xCC5F, - 7336: 0xCC61, - 7337: 0xCC62, - 7338: 0xCC63, - 7339: 0xCC65, - 7340: 0xCC67, - 7341: 0xCC69, - 7342: 0xCC6A, - 7343: 0xCC6B, - 7344: 0xCC6C, - 7345: 0xCC6D, - 7346: 0xCC6E, - 7347: 0xCC6F, - 7348: 0xCC71, - 7349: 0xCC72, - 7350: 0xCC73, - 7351: 0xCC74, - 7352: 0xCC76, - 7353: 0xCC77, - 7354: 0xCC78, - 7355: 0xCC79, - 7356: 0xCC7A, - 7357: 0xCC7B, - 7358: 0xCC7C, - 7359: 0xCC7D, - 7360: 0xCC7E, - 7361: 0xCC7F, - 7362: 0xCC80, - 7363: 0xCC81, - 7364: 0xCC82, - 7365: 0xCC83, - 7366: 0xCC84, - 7367: 0xCC85, - 7368: 0xCC86, - 7369: 0xCC87, - 7370: 0xCC88, - 7371: 0xCC89, - 7372: 0xCC8A, - 7373: 0xCC8B, - 7374: 0xCC8C, - 7375: 0xCC8D, - 7376: 0xCC8E, - 7377: 0xCC8F, - 7378: 0xCC90, - 7379: 0xCC91, - 7380: 0xCC92, - 7381: 0xCC93, - 7382: 0x3041, - 7383: 0x3042, - 7384: 0x3043, - 7385: 0x3044, - 7386: 0x3045, - 7387: 0x3046, - 7388: 0x3047, - 7389: 0x3048, - 7390: 0x3049, - 7391: 0x304A, - 7392: 0x304B, - 7393: 0x304C, - 7394: 0x304D, - 7395: 0x304E, - 7396: 0x304F, - 7397: 0x3050, - 7398: 0x3051, - 7399: 0x3052, - 7400: 0x3053, - 7401: 0x3054, - 7402: 0x3055, - 7403: 0x3056, - 7404: 0x3057, - 7405: 0x3058, - 7406: 0x3059, - 7407: 0x305A, - 7408: 0x305B, - 7409: 0x305C, - 7410: 0x305D, - 7411: 0x305E, - 7412: 0x305F, - 7413: 0x3060, - 7414: 0x3061, - 7415: 0x3062, - 7416: 0x3063, - 7417: 0x3064, - 7418: 0x3065, - 7419: 0x3066, - 7420: 0x3067, - 7421: 0x3068, - 7422: 0x3069, - 7423: 0x306A, - 7424: 0x306B, - 7425: 0x306C, - 7426: 0x306D, - 7427: 0x306E, - 7428: 0x306F, - 7429: 0x3070, - 7430: 0x3071, - 7431: 0x3072, - 7432: 0x3073, - 7433: 0x3074, - 7434: 0x3075, - 7435: 0x3076, - 7436: 0x3077, - 7437: 0x3078, - 7438: 0x3079, - 7439: 0x307A, - 7440: 0x307B, - 7441: 0x307C, - 7442: 0x307D, - 7443: 0x307E, - 7444: 0x307F, - 7445: 0x3080, - 7446: 0x3081, - 7447: 0x3082, - 7448: 0x3083, - 7449: 0x3084, - 7450: 0x3085, - 7451: 0x3086, - 7452: 0x3087, - 7453: 0x3088, - 7454: 0x3089, - 7455: 0x308A, - 7456: 0x308B, - 7457: 0x308C, - 7458: 0x308D, - 7459: 0x308E, - 7460: 0x308F, - 7461: 0x3090, - 7462: 0x3091, - 7463: 0x3092, - 7464: 0x3093, - 7476: 0xCC94, - 7477: 0xCC95, - 7478: 0xCC96, - 7479: 0xCC97, - 7480: 0xCC9A, - 7481: 0xCC9B, - 7482: 0xCC9D, - 7483: 0xCC9E, - 7484: 0xCC9F, - 7485: 0xCCA1, - 7486: 0xCCA2, - 7487: 0xCCA3, - 7488: 0xCCA4, - 7489: 0xCCA5, - 7490: 0xCCA6, - 7491: 0xCCA7, - 7492: 0xCCAA, - 7493: 0xCCAE, - 7494: 0xCCAF, - 7495: 0xCCB0, - 7496: 0xCCB1, - 7497: 0xCCB2, - 7498: 0xCCB3, - 7499: 0xCCB6, - 7500: 0xCCB7, - 7501: 0xCCB9, - 7502: 0xCCBA, - 7503: 0xCCBB, - 7504: 0xCCBD, - 7505: 0xCCBE, - 7506: 0xCCBF, - 7507: 0xCCC0, - 7508: 0xCCC1, - 7509: 0xCCC2, - 7510: 0xCCC3, - 7511: 0xCCC6, - 7512: 0xCCC8, - 7513: 0xCCCA, - 7514: 0xCCCB, - 7515: 0xCCCC, - 7516: 0xCCCD, - 7517: 0xCCCE, - 7518: 0xCCCF, - 7519: 0xCCD1, - 7520: 0xCCD2, - 7521: 0xCCD3, - 7522: 0xCCD5, - 7523: 0xCCD6, - 7524: 0xCCD7, - 7525: 0xCCD8, - 7526: 0xCCD9, - 7527: 0xCCDA, - 7528: 0xCCDB, - 7529: 0xCCDC, - 7530: 0xCCDD, - 7531: 0xCCDE, - 7532: 0xCCDF, - 7533: 0xCCE0, - 7534: 0xCCE1, - 7535: 0xCCE2, - 7536: 0xCCE3, - 7537: 0xCCE5, - 7538: 0xCCE6, - 7539: 0xCCE7, - 7540: 0xCCE8, - 7541: 0xCCE9, - 7542: 0xCCEA, - 7543: 0xCCEB, - 7544: 0xCCED, - 7545: 0xCCEE, - 7546: 0xCCEF, - 7547: 0xCCF1, - 7548: 0xCCF2, - 7549: 0xCCF3, - 7550: 0xCCF4, - 7551: 0xCCF5, - 7552: 0xCCF6, - 7553: 0xCCF7, - 7554: 0xCCF8, - 7555: 0xCCF9, - 7556: 0xCCFA, - 7557: 0xCCFB, - 7558: 0xCCFC, - 7559: 0xCCFD, - 7560: 0x30A1, - 7561: 0x30A2, - 7562: 0x30A3, - 7563: 0x30A4, - 7564: 0x30A5, - 7565: 0x30A6, - 7566: 0x30A7, - 7567: 0x30A8, - 7568: 0x30A9, - 7569: 0x30AA, - 7570: 0x30AB, - 7571: 0x30AC, - 7572: 0x30AD, - 7573: 0x30AE, - 7574: 0x30AF, - 7575: 0x30B0, - 7576: 0x30B1, - 7577: 0x30B2, - 7578: 0x30B3, - 7579: 0x30B4, - 7580: 0x30B5, - 7581: 0x30B6, - 7582: 0x30B7, - 7583: 0x30B8, - 7584: 0x30B9, - 7585: 0x30BA, - 7586: 0x30BB, - 7587: 0x30BC, - 7588: 0x30BD, - 7589: 0x30BE, - 7590: 0x30BF, - 7591: 0x30C0, - 7592: 0x30C1, - 7593: 0x30C2, - 7594: 0x30C3, - 7595: 0x30C4, - 7596: 0x30C5, - 7597: 0x30C6, - 7598: 0x30C7, - 7599: 0x30C8, - 7600: 0x30C9, - 7601: 0x30CA, - 7602: 0x30CB, - 7603: 0x30CC, - 7604: 0x30CD, - 7605: 0x30CE, - 7606: 0x30CF, - 7607: 0x30D0, - 7608: 0x30D1, - 7609: 0x30D2, - 7610: 0x30D3, - 7611: 0x30D4, - 7612: 0x30D5, - 7613: 0x30D6, - 7614: 0x30D7, - 7615: 0x30D8, - 7616: 0x30D9, - 7617: 0x30DA, - 7618: 0x30DB, - 7619: 0x30DC, - 7620: 0x30DD, - 7621: 0x30DE, - 7622: 0x30DF, - 7623: 0x30E0, - 7624: 0x30E1, - 7625: 0x30E2, - 7626: 0x30E3, - 7627: 0x30E4, - 7628: 0x30E5, - 7629: 0x30E6, - 7630: 0x30E7, - 7631: 0x30E8, - 7632: 0x30E9, - 7633: 0x30EA, - 7634: 0x30EB, - 7635: 0x30EC, - 7636: 0x30ED, - 7637: 0x30EE, - 7638: 0x30EF, - 7639: 0x30F0, - 7640: 0x30F1, - 7641: 0x30F2, - 7642: 0x30F3, - 7643: 0x30F4, - 7644: 0x30F5, - 7645: 0x30F6, - 7654: 0xCCFE, - 7655: 0xCCFF, - 7656: 0xCD00, - 7657: 0xCD02, - 7658: 0xCD03, - 7659: 0xCD04, - 7660: 0xCD05, - 7661: 0xCD06, - 7662: 0xCD07, - 7663: 0xCD0A, - 7664: 0xCD0B, - 7665: 0xCD0D, - 7666: 0xCD0E, - 7667: 0xCD0F, - 7668: 0xCD11, - 7669: 0xCD12, - 7670: 0xCD13, - 7671: 0xCD14, - 7672: 0xCD15, - 7673: 0xCD16, - 7674: 0xCD17, - 7675: 0xCD1A, - 7676: 0xCD1C, - 7677: 0xCD1E, - 7678: 0xCD1F, - 7679: 0xCD20, - 7680: 0xCD21, - 7681: 0xCD22, - 7682: 0xCD23, - 7683: 0xCD25, - 7684: 0xCD26, - 7685: 0xCD27, - 7686: 0xCD29, - 7687: 0xCD2A, - 7688: 0xCD2B, - 7689: 0xCD2D, - 7690: 0xCD2E, - 7691: 0xCD2F, - 7692: 0xCD30, - 7693: 0xCD31, - 7694: 0xCD32, - 7695: 0xCD33, - 7696: 0xCD34, - 7697: 0xCD35, - 7698: 0xCD36, - 7699: 0xCD37, - 7700: 0xCD38, - 7701: 0xCD3A, - 7702: 0xCD3B, - 7703: 0xCD3C, - 7704: 0xCD3D, - 7705: 0xCD3E, - 7706: 0xCD3F, - 7707: 0xCD40, - 7708: 0xCD41, - 7709: 0xCD42, - 7710: 0xCD43, - 7711: 0xCD44, - 7712: 0xCD45, - 7713: 0xCD46, - 7714: 0xCD47, - 7715: 0xCD48, - 7716: 0xCD49, - 7717: 0xCD4A, - 7718: 0xCD4B, - 7719: 0xCD4C, - 7720: 0xCD4D, - 7721: 0xCD4E, - 7722: 0xCD4F, - 7723: 0xCD50, - 7724: 0xCD51, - 7725: 0xCD52, - 7726: 0xCD53, - 7727: 0xCD54, - 7728: 0xCD55, - 7729: 0xCD56, - 7730: 0xCD57, - 7731: 0xCD58, - 7732: 0xCD59, - 7733: 0xCD5A, - 7734: 0xCD5B, - 7735: 0xCD5D, - 7736: 0xCD5E, - 7737: 0xCD5F, - 7738: 0x0410, - 7739: 0x0411, - 7740: 0x0412, - 7741: 0x0413, - 7742: 0x0414, - 7743: 0x0415, - 7744: 0x0401, - 7745: 0x0416, - 7746: 0x0417, - 7747: 0x0418, - 7748: 0x0419, - 7749: 0x041A, - 7750: 0x041B, - 7751: 0x041C, - 7752: 0x041D, - 7753: 0x041E, - 7754: 0x041F, - 7755: 0x0420, - 7756: 0x0421, - 7757: 0x0422, - 7758: 0x0423, - 7759: 0x0424, - 7760: 0x0425, - 7761: 0x0426, - 7762: 0x0427, - 7763: 0x0428, - 7764: 0x0429, - 7765: 0x042A, - 7766: 0x042B, - 7767: 0x042C, - 7768: 0x042D, - 7769: 0x042E, - 7770: 0x042F, - 7786: 0x0430, - 7787: 0x0431, - 7788: 0x0432, - 7789: 0x0433, - 7790: 0x0434, - 7791: 0x0435, - 7792: 0x0451, - 7793: 0x0436, - 7794: 0x0437, - 7795: 0x0438, - 7796: 0x0439, - 7797: 0x043A, - 7798: 0x043B, - 7799: 0x043C, - 7800: 0x043D, - 7801: 0x043E, - 7802: 0x043F, - 7803: 0x0440, - 7804: 0x0441, - 7805: 0x0442, - 7806: 0x0443, - 7807: 0x0444, - 7808: 0x0445, - 7809: 0x0446, - 7810: 0x0447, - 7811: 0x0448, - 7812: 0x0449, - 7813: 0x044A, - 7814: 0x044B, - 7815: 0x044C, - 7816: 0x044D, - 7817: 0x044E, - 7818: 0x044F, - 7832: 0xCD61, - 7833: 0xCD62, - 7834: 0xCD63, - 7835: 0xCD65, - 7836: 0xCD66, - 7837: 0xCD67, - 7838: 0xCD68, - 7839: 0xCD69, - 7840: 0xCD6A, - 7841: 0xCD6B, - 7842: 0xCD6E, - 7843: 0xCD70, - 7844: 0xCD72, - 7845: 0xCD73, - 7846: 0xCD74, - 7847: 0xCD75, - 7848: 0xCD76, - 7849: 0xCD77, - 7850: 0xCD79, - 7851: 0xCD7A, - 7852: 0xCD7B, - 7853: 0xCD7C, - 7854: 0xCD7D, - 7855: 0xCD7E, - 7856: 0xCD7F, - 7857: 0xCD80, - 7858: 0xCD81, - 7859: 0xCD82, - 7860: 0xCD83, - 7861: 0xCD84, - 7862: 0xCD85, - 7863: 0xCD86, - 7864: 0xCD87, - 7865: 0xCD89, - 7866: 0xCD8A, - 7867: 0xCD8B, - 7868: 0xCD8C, - 7869: 0xCD8D, - 7870: 0xCD8E, - 7871: 0xCD8F, - 7872: 0xCD90, - 7873: 0xCD91, - 7874: 0xCD92, - 7875: 0xCD93, - 7876: 0xCD96, - 7877: 0xCD97, - 7878: 0xCD99, - 7879: 0xCD9A, - 7880: 0xCD9B, - 7881: 0xCD9D, - 7882: 0xCD9E, - 7883: 0xCD9F, - 7884: 0xCDA0, - 7885: 0xCDA1, - 7886: 0xCDA2, - 7887: 0xCDA3, - 7888: 0xCDA6, - 7889: 0xCDA8, - 7890: 0xCDAA, - 7891: 0xCDAB, - 7892: 0xCDAC, - 7893: 0xCDAD, - 7894: 0xCDAE, - 7895: 0xCDAF, - 7896: 0xCDB1, - 7897: 0xCDB2, - 7898: 0xCDB3, - 7899: 0xCDB4, - 7900: 0xCDB5, - 7901: 0xCDB6, - 7902: 0xCDB7, - 7903: 0xCDB8, - 7904: 0xCDB9, - 7905: 0xCDBA, - 7906: 0xCDBB, - 7907: 0xCDBC, - 7908: 0xCDBD, - 7909: 0xCDBE, - 7910: 0xCDBF, - 7911: 0xCDC0, - 7912: 0xCDC1, - 7913: 0xCDC2, - 7914: 0xCDC3, - 7915: 0xCDC5, - 8010: 0xCDC6, - 8011: 0xCDC7, - 8012: 0xCDC8, - 8013: 0xCDC9, - 8014: 0xCDCA, - 8015: 0xCDCB, - 8016: 0xCDCD, - 8017: 0xCDCE, - 8018: 0xCDCF, - 8019: 0xCDD1, - 8020: 0xCDD2, - 8021: 0xCDD3, - 8022: 0xCDD4, - 8023: 0xCDD5, - 8024: 0xCDD6, - 8025: 0xCDD7, - 8026: 0xCDD8, - 8027: 0xCDD9, - 8028: 0xCDDA, - 8029: 0xCDDB, - 8030: 0xCDDC, - 8031: 0xCDDD, - 8032: 0xCDDE, - 8033: 0xCDDF, - 8034: 0xCDE0, - 8035: 0xCDE1, - 8036: 0xCDE2, - 8037: 0xCDE3, - 8038: 0xCDE4, - 8039: 0xCDE5, - 8040: 0xCDE6, - 8041: 0xCDE7, - 8042: 0xCDE9, - 8043: 0xCDEA, - 8044: 0xCDEB, - 8045: 0xCDED, - 8046: 0xCDEE, - 8047: 0xCDEF, - 8048: 0xCDF1, - 8049: 0xCDF2, - 8050: 0xCDF3, - 8051: 0xCDF4, - 8052: 0xCDF5, - 8053: 0xCDF6, - 8054: 0xCDF7, - 8055: 0xCDFA, - 8056: 0xCDFC, - 8057: 0xCDFE, - 8058: 0xCDFF, - 8059: 0xCE00, - 8060: 0xCE01, - 8061: 0xCE02, - 8062: 0xCE03, - 8063: 0xCE05, - 8064: 0xCE06, - 8065: 0xCE07, - 8066: 0xCE09, - 8067: 0xCE0A, - 8068: 0xCE0B, - 8069: 0xCE0D, - 8070: 0xCE0E, - 8071: 0xCE0F, - 8072: 0xCE10, - 8073: 0xCE11, - 8074: 0xCE12, - 8075: 0xCE13, - 8076: 0xCE15, - 8077: 0xCE16, - 8078: 0xCE17, - 8079: 0xCE18, - 8080: 0xCE1A, - 8081: 0xCE1B, - 8082: 0xCE1C, - 8083: 0xCE1D, - 8084: 0xCE1E, - 8085: 0xCE1F, - 8086: 0xCE22, - 8087: 0xCE23, - 8088: 0xCE25, - 8089: 0xCE26, - 8090: 0xCE27, - 8091: 0xCE29, - 8092: 0xCE2A, - 8093: 0xCE2B, - 8188: 0xCE2C, - 8189: 0xCE2D, - 8190: 0xCE2E, - 8191: 0xCE2F, - 8192: 0xCE32, - 8193: 0xCE34, - 8194: 0xCE36, - 8195: 0xCE37, - 8196: 0xCE38, - 8197: 0xCE39, - 8198: 0xCE3A, - 8199: 0xCE3B, - 8200: 0xCE3C, - 8201: 0xCE3D, - 8202: 0xCE3E, - 8203: 0xCE3F, - 8204: 0xCE40, - 8205: 0xCE41, - 8206: 0xCE42, - 8207: 0xCE43, - 8208: 0xCE44, - 8209: 0xCE45, - 8210: 0xCE46, - 8211: 0xCE47, - 8212: 0xCE48, - 8213: 0xCE49, - 8214: 0xCE4A, - 8215: 0xCE4B, - 8216: 0xCE4C, - 8217: 0xCE4D, - 8218: 0xCE4E, - 8219: 0xCE4F, - 8220: 0xCE50, - 8221: 0xCE51, - 8222: 0xCE52, - 8223: 0xCE53, - 8224: 0xCE54, - 8225: 0xCE55, - 8226: 0xCE56, - 8227: 0xCE57, - 8228: 0xCE5A, - 8229: 0xCE5B, - 8230: 0xCE5D, - 8231: 0xCE5E, - 8232: 0xCE62, - 8233: 0xCE63, - 8234: 0xCE64, - 8235: 0xCE65, - 8236: 0xCE66, - 8237: 0xCE67, - 8238: 0xCE6A, - 8239: 0xCE6C, - 8240: 0xCE6E, - 8241: 0xCE6F, - 8242: 0xCE70, - 8243: 0xCE71, - 8244: 0xCE72, - 8245: 0xCE73, - 8246: 0xCE76, - 8247: 0xCE77, - 8248: 0xCE79, - 8249: 0xCE7A, - 8250: 0xCE7B, - 8251: 0xCE7D, - 8252: 0xCE7E, - 8253: 0xCE7F, - 8254: 0xCE80, - 8255: 0xCE81, - 8256: 0xCE82, - 8257: 0xCE83, - 8258: 0xCE86, - 8259: 0xCE88, - 8260: 0xCE8A, - 8261: 0xCE8B, - 8262: 0xCE8C, - 8263: 0xCE8D, - 8264: 0xCE8E, - 8265: 0xCE8F, - 8266: 0xCE92, - 8267: 0xCE93, - 8268: 0xCE95, - 8269: 0xCE96, - 8270: 0xCE97, - 8271: 0xCE99, - 8366: 0xCE9A, - 8367: 0xCE9B, - 8368: 0xCE9C, - 8369: 0xCE9D, - 8370: 0xCE9E, - 8371: 0xCE9F, - 8372: 0xCEA2, - 8373: 0xCEA6, - 8374: 0xCEA7, - 8375: 0xCEA8, - 8376: 0xCEA9, - 8377: 0xCEAA, - 8378: 0xCEAB, - 8379: 0xCEAE, - 8380: 0xCEAF, - 8381: 0xCEB0, - 8382: 0xCEB1, - 8383: 0xCEB2, - 8384: 0xCEB3, - 8385: 0xCEB4, - 8386: 0xCEB5, - 8387: 0xCEB6, - 8388: 0xCEB7, - 8389: 0xCEB8, - 8390: 0xCEB9, - 8391: 0xCEBA, - 8392: 0xCEBB, - 8393: 0xCEBC, - 8394: 0xCEBD, - 8395: 0xCEBE, - 8396: 0xCEBF, - 8397: 0xCEC0, - 8398: 0xCEC2, - 8399: 0xCEC3, - 8400: 0xCEC4, - 8401: 0xCEC5, - 8402: 0xCEC6, - 8403: 0xCEC7, - 8404: 0xCEC8, - 8405: 0xCEC9, - 8406: 0xCECA, - 8407: 0xCECB, - 8408: 0xCECC, - 8409: 0xCECD, - 8410: 0xCECE, - 8411: 0xCECF, - 8412: 0xCED0, - 8413: 0xCED1, - 8414: 0xCED2, - 8415: 0xCED3, - 8416: 0xCED4, - 8417: 0xCED5, - 8418: 0xCED6, - 8419: 0xCED7, - 8420: 0xCED8, - 8421: 0xCED9, - 8422: 0xCEDA, - 8423: 0xCEDB, - 8424: 0xCEDC, - 8425: 0xCEDD, - 8426: 0xCEDE, - 8427: 0xCEDF, - 8428: 0xCEE0, - 8429: 0xCEE1, - 8430: 0xCEE2, - 8431: 0xCEE3, - 8432: 0xCEE6, - 8433: 0xCEE7, - 8434: 0xCEE9, - 8435: 0xCEEA, - 8436: 0xCEED, - 8437: 0xCEEE, - 8438: 0xCEEF, - 8439: 0xCEF0, - 8440: 0xCEF1, - 8441: 0xCEF2, - 8442: 0xCEF3, - 8443: 0xCEF6, - 8444: 0xCEFA, - 8445: 0xCEFB, - 8446: 0xCEFC, - 8447: 0xCEFD, - 8448: 0xCEFE, - 8449: 0xCEFF, - 8450: 0xAC00, - 8451: 0xAC01, - 8452: 0xAC04, - 8453: 0xAC07, - 8454: 0xAC08, - 8455: 0xAC09, - 8456: 0xAC0A, - 8457: 0xAC10, - 8458: 0xAC11, - 8459: 0xAC12, - 8460: 0xAC13, - 8461: 0xAC14, - 8462: 0xAC15, - 8463: 0xAC16, - 8464: 0xAC17, - 8465: 0xAC19, - 8466: 0xAC1A, - 8467: 0xAC1B, - 8468: 0xAC1C, - 8469: 0xAC1D, - 8470: 0xAC20, - 8471: 0xAC24, - 8472: 0xAC2C, - 8473: 0xAC2D, - 8474: 0xAC2F, - 8475: 0xAC30, - 8476: 0xAC31, - 8477: 0xAC38, - 8478: 0xAC39, - 8479: 0xAC3C, - 8480: 0xAC40, - 8481: 0xAC4B, - 8482: 0xAC4D, - 8483: 0xAC54, - 8484: 0xAC58, - 8485: 0xAC5C, - 8486: 0xAC70, - 8487: 0xAC71, - 8488: 0xAC74, - 8489: 0xAC77, - 8490: 0xAC78, - 8491: 0xAC7A, - 8492: 0xAC80, - 8493: 0xAC81, - 8494: 0xAC83, - 8495: 0xAC84, - 8496: 0xAC85, - 8497: 0xAC86, - 8498: 0xAC89, - 8499: 0xAC8A, - 8500: 0xAC8B, - 8501: 0xAC8C, - 8502: 0xAC90, - 8503: 0xAC94, - 8504: 0xAC9C, - 8505: 0xAC9D, - 8506: 0xAC9F, - 8507: 0xACA0, - 8508: 0xACA1, - 8509: 0xACA8, - 8510: 0xACA9, - 8511: 0xACAA, - 8512: 0xACAC, - 8513: 0xACAF, - 8514: 0xACB0, - 8515: 0xACB8, - 8516: 0xACB9, - 8517: 0xACBB, - 8518: 0xACBC, - 8519: 0xACBD, - 8520: 0xACC1, - 8521: 0xACC4, - 8522: 0xACC8, - 8523: 0xACCC, - 8524: 0xACD5, - 8525: 0xACD7, - 8526: 0xACE0, - 8527: 0xACE1, - 8528: 0xACE4, - 8529: 0xACE7, - 8530: 0xACE8, - 8531: 0xACEA, - 8532: 0xACEC, - 8533: 0xACEF, - 8534: 0xACF0, - 8535: 0xACF1, - 8536: 0xACF3, - 8537: 0xACF5, - 8538: 0xACF6, - 8539: 0xACFC, - 8540: 0xACFD, - 8541: 0xAD00, - 8542: 0xAD04, - 8543: 0xAD06, - 8544: 0xCF02, - 8545: 0xCF03, - 8546: 0xCF05, - 8547: 0xCF06, - 8548: 0xCF07, - 8549: 0xCF09, - 8550: 0xCF0A, - 8551: 0xCF0B, - 8552: 0xCF0C, - 8553: 0xCF0D, - 8554: 0xCF0E, - 8555: 0xCF0F, - 8556: 0xCF12, - 8557: 0xCF14, - 8558: 0xCF16, - 8559: 0xCF17, - 8560: 0xCF18, - 8561: 0xCF19, - 8562: 0xCF1A, - 8563: 0xCF1B, - 8564: 0xCF1D, - 8565: 0xCF1E, - 8566: 0xCF1F, - 8567: 0xCF21, - 8568: 0xCF22, - 8569: 0xCF23, - 8570: 0xCF25, - 8571: 0xCF26, - 8572: 0xCF27, - 8573: 0xCF28, - 8574: 0xCF29, - 8575: 0xCF2A, - 8576: 0xCF2B, - 8577: 0xCF2E, - 8578: 0xCF32, - 8579: 0xCF33, - 8580: 0xCF34, - 8581: 0xCF35, - 8582: 0xCF36, - 8583: 0xCF37, - 8584: 0xCF39, - 8585: 0xCF3A, - 8586: 0xCF3B, - 8587: 0xCF3C, - 8588: 0xCF3D, - 8589: 0xCF3E, - 8590: 0xCF3F, - 8591: 0xCF40, - 8592: 0xCF41, - 8593: 0xCF42, - 8594: 0xCF43, - 8595: 0xCF44, - 8596: 0xCF45, - 8597: 0xCF46, - 8598: 0xCF47, - 8599: 0xCF48, - 8600: 0xCF49, - 8601: 0xCF4A, - 8602: 0xCF4B, - 8603: 0xCF4C, - 8604: 0xCF4D, - 8605: 0xCF4E, - 8606: 0xCF4F, - 8607: 0xCF50, - 8608: 0xCF51, - 8609: 0xCF52, - 8610: 0xCF53, - 8611: 0xCF56, - 8612: 0xCF57, - 8613: 0xCF59, - 8614: 0xCF5A, - 8615: 0xCF5B, - 8616: 0xCF5D, - 8617: 0xCF5E, - 8618: 0xCF5F, - 8619: 0xCF60, - 8620: 0xCF61, - 8621: 0xCF62, - 8622: 0xCF63, - 8623: 0xCF66, - 8624: 0xCF68, - 8625: 0xCF6A, - 8626: 0xCF6B, - 8627: 0xCF6C, - 8628: 0xAD0C, - 8629: 0xAD0D, - 8630: 0xAD0F, - 8631: 0xAD11, - 8632: 0xAD18, - 8633: 0xAD1C, - 8634: 0xAD20, - 8635: 0xAD29, - 8636: 0xAD2C, - 8637: 0xAD2D, - 8638: 0xAD34, - 8639: 0xAD35, - 8640: 0xAD38, - 8641: 0xAD3C, - 8642: 0xAD44, - 8643: 0xAD45, - 8644: 0xAD47, - 8645: 0xAD49, - 8646: 0xAD50, - 8647: 0xAD54, - 8648: 0xAD58, - 8649: 0xAD61, - 8650: 0xAD63, - 8651: 0xAD6C, - 8652: 0xAD6D, - 8653: 0xAD70, - 8654: 0xAD73, - 8655: 0xAD74, - 8656: 0xAD75, - 8657: 0xAD76, - 8658: 0xAD7B, - 8659: 0xAD7C, - 8660: 0xAD7D, - 8661: 0xAD7F, - 8662: 0xAD81, - 8663: 0xAD82, - 8664: 0xAD88, - 8665: 0xAD89, - 8666: 0xAD8C, - 8667: 0xAD90, - 8668: 0xAD9C, - 8669: 0xAD9D, - 8670: 0xADA4, - 8671: 0xADB7, - 8672: 0xADC0, - 8673: 0xADC1, - 8674: 0xADC4, - 8675: 0xADC8, - 8676: 0xADD0, - 8677: 0xADD1, - 8678: 0xADD3, - 8679: 0xADDC, - 8680: 0xADE0, - 8681: 0xADE4, - 8682: 0xADF8, - 8683: 0xADF9, - 8684: 0xADFC, - 8685: 0xADFF, - 8686: 0xAE00, - 8687: 0xAE01, - 8688: 0xAE08, - 8689: 0xAE09, - 8690: 0xAE0B, - 8691: 0xAE0D, - 8692: 0xAE14, - 8693: 0xAE30, - 8694: 0xAE31, - 8695: 0xAE34, - 8696: 0xAE37, - 8697: 0xAE38, - 8698: 0xAE3A, - 8699: 0xAE40, - 8700: 0xAE41, - 8701: 0xAE43, - 8702: 0xAE45, - 8703: 0xAE46, - 8704: 0xAE4A, - 8705: 0xAE4C, - 8706: 0xAE4D, - 8707: 0xAE4E, - 8708: 0xAE50, - 8709: 0xAE54, - 8710: 0xAE56, - 8711: 0xAE5C, - 8712: 0xAE5D, - 8713: 0xAE5F, - 8714: 0xAE60, - 8715: 0xAE61, - 8716: 0xAE65, - 8717: 0xAE68, - 8718: 0xAE69, - 8719: 0xAE6C, - 8720: 0xAE70, - 8721: 0xAE78, - 8722: 0xCF6D, - 8723: 0xCF6E, - 8724: 0xCF6F, - 8725: 0xCF72, - 8726: 0xCF73, - 8727: 0xCF75, - 8728: 0xCF76, - 8729: 0xCF77, - 8730: 0xCF79, - 8731: 0xCF7A, - 8732: 0xCF7B, - 8733: 0xCF7C, - 8734: 0xCF7D, - 8735: 0xCF7E, - 8736: 0xCF7F, - 8737: 0xCF81, - 8738: 0xCF82, - 8739: 0xCF83, - 8740: 0xCF84, - 8741: 0xCF86, - 8742: 0xCF87, - 8743: 0xCF88, - 8744: 0xCF89, - 8745: 0xCF8A, - 8746: 0xCF8B, - 8747: 0xCF8D, - 8748: 0xCF8E, - 8749: 0xCF8F, - 8750: 0xCF90, - 8751: 0xCF91, - 8752: 0xCF92, - 8753: 0xCF93, - 8754: 0xCF94, - 8755: 0xCF95, - 8756: 0xCF96, - 8757: 0xCF97, - 8758: 0xCF98, - 8759: 0xCF99, - 8760: 0xCF9A, - 8761: 0xCF9B, - 8762: 0xCF9C, - 8763: 0xCF9D, - 8764: 0xCF9E, - 8765: 0xCF9F, - 8766: 0xCFA0, - 8767: 0xCFA2, - 8768: 0xCFA3, - 8769: 0xCFA4, - 8770: 0xCFA5, - 8771: 0xCFA6, - 8772: 0xCFA7, - 8773: 0xCFA9, - 8774: 0xCFAA, - 8775: 0xCFAB, - 8776: 0xCFAC, - 8777: 0xCFAD, - 8778: 0xCFAE, - 8779: 0xCFAF, - 8780: 0xCFB1, - 8781: 0xCFB2, - 8782: 0xCFB3, - 8783: 0xCFB4, - 8784: 0xCFB5, - 8785: 0xCFB6, - 8786: 0xCFB7, - 8787: 0xCFB8, - 8788: 0xCFB9, - 8789: 0xCFBA, - 8790: 0xCFBB, - 8791: 0xCFBC, - 8792: 0xCFBD, - 8793: 0xCFBE, - 8794: 0xCFBF, - 8795: 0xCFC0, - 8796: 0xCFC1, - 8797: 0xCFC2, - 8798: 0xCFC3, - 8799: 0xCFC5, - 8800: 0xCFC6, - 8801: 0xCFC7, - 8802: 0xCFC8, - 8803: 0xCFC9, - 8804: 0xCFCA, - 8805: 0xCFCB, - 8806: 0xAE79, - 8807: 0xAE7B, - 8808: 0xAE7C, - 8809: 0xAE7D, - 8810: 0xAE84, - 8811: 0xAE85, - 8812: 0xAE8C, - 8813: 0xAEBC, - 8814: 0xAEBD, - 8815: 0xAEBE, - 8816: 0xAEC0, - 8817: 0xAEC4, - 8818: 0xAECC, - 8819: 0xAECD, - 8820: 0xAECF, - 8821: 0xAED0, - 8822: 0xAED1, - 8823: 0xAED8, - 8824: 0xAED9, - 8825: 0xAEDC, - 8826: 0xAEE8, - 8827: 0xAEEB, - 8828: 0xAEED, - 8829: 0xAEF4, - 8830: 0xAEF8, - 8831: 0xAEFC, - 8832: 0xAF07, - 8833: 0xAF08, - 8834: 0xAF0D, - 8835: 0xAF10, - 8836: 0xAF2C, - 8837: 0xAF2D, - 8838: 0xAF30, - 8839: 0xAF32, - 8840: 0xAF34, - 8841: 0xAF3C, - 8842: 0xAF3D, - 8843: 0xAF3F, - 8844: 0xAF41, - 8845: 0xAF42, - 8846: 0xAF43, - 8847: 0xAF48, - 8848: 0xAF49, - 8849: 0xAF50, - 8850: 0xAF5C, - 8851: 0xAF5D, - 8852: 0xAF64, - 8853: 0xAF65, - 8854: 0xAF79, - 8855: 0xAF80, - 8856: 0xAF84, - 8857: 0xAF88, - 8858: 0xAF90, - 8859: 0xAF91, - 8860: 0xAF95, - 8861: 0xAF9C, - 8862: 0xAFB8, - 8863: 0xAFB9, - 8864: 0xAFBC, - 8865: 0xAFC0, - 8866: 0xAFC7, - 8867: 0xAFC8, - 8868: 0xAFC9, - 8869: 0xAFCB, - 8870: 0xAFCD, - 8871: 0xAFCE, - 8872: 0xAFD4, - 8873: 0xAFDC, - 8874: 0xAFE8, - 8875: 0xAFE9, - 8876: 0xAFF0, - 8877: 0xAFF1, - 8878: 0xAFF4, - 8879: 0xAFF8, - 8880: 0xB000, - 8881: 0xB001, - 8882: 0xB004, - 8883: 0xB00C, - 8884: 0xB010, - 8885: 0xB014, - 8886: 0xB01C, - 8887: 0xB01D, - 8888: 0xB028, - 8889: 0xB044, - 8890: 0xB045, - 8891: 0xB048, - 8892: 0xB04A, - 8893: 0xB04C, - 8894: 0xB04E, - 8895: 0xB053, - 8896: 0xB054, - 8897: 0xB055, - 8898: 0xB057, - 8899: 0xB059, - 8900: 0xCFCC, - 8901: 0xCFCD, - 8902: 0xCFCE, - 8903: 0xCFCF, - 8904: 0xCFD0, - 8905: 0xCFD1, - 8906: 0xCFD2, - 8907: 0xCFD3, - 8908: 0xCFD4, - 8909: 0xCFD5, - 8910: 0xCFD6, - 8911: 0xCFD7, - 8912: 0xCFD8, - 8913: 0xCFD9, - 8914: 0xCFDA, - 8915: 0xCFDB, - 8916: 0xCFDC, - 8917: 0xCFDD, - 8918: 0xCFDE, - 8919: 0xCFDF, - 8920: 0xCFE2, - 8921: 0xCFE3, - 8922: 0xCFE5, - 8923: 0xCFE6, - 8924: 0xCFE7, - 8925: 0xCFE9, - 8926: 0xCFEA, - 8927: 0xCFEB, - 8928: 0xCFEC, - 8929: 0xCFED, - 8930: 0xCFEE, - 8931: 0xCFEF, - 8932: 0xCFF2, - 8933: 0xCFF4, - 8934: 0xCFF6, - 8935: 0xCFF7, - 8936: 0xCFF8, - 8937: 0xCFF9, - 8938: 0xCFFA, - 8939: 0xCFFB, - 8940: 0xCFFD, - 8941: 0xCFFE, - 8942: 0xCFFF, - 8943: 0xD001, - 8944: 0xD002, - 8945: 0xD003, - 8946: 0xD005, - 8947: 0xD006, - 8948: 0xD007, - 8949: 0xD008, - 8950: 0xD009, - 8951: 0xD00A, - 8952: 0xD00B, - 8953: 0xD00C, - 8954: 0xD00D, - 8955: 0xD00E, - 8956: 0xD00F, - 8957: 0xD010, - 8958: 0xD012, - 8959: 0xD013, - 8960: 0xD014, - 8961: 0xD015, - 8962: 0xD016, - 8963: 0xD017, - 8964: 0xD019, - 8965: 0xD01A, - 8966: 0xD01B, - 8967: 0xD01C, - 8968: 0xD01D, - 8969: 0xD01E, - 8970: 0xD01F, - 8971: 0xD020, - 8972: 0xD021, - 8973: 0xD022, - 8974: 0xD023, - 8975: 0xD024, - 8976: 0xD025, - 8977: 0xD026, - 8978: 0xD027, - 8979: 0xD028, - 8980: 0xD029, - 8981: 0xD02A, - 8982: 0xD02B, - 8983: 0xD02C, - 8984: 0xB05D, - 8985: 0xB07C, - 8986: 0xB07D, - 8987: 0xB080, - 8988: 0xB084, - 8989: 0xB08C, - 8990: 0xB08D, - 8991: 0xB08F, - 8992: 0xB091, - 8993: 0xB098, - 8994: 0xB099, - 8995: 0xB09A, - 8996: 0xB09C, - 8997: 0xB09F, - 8998: 0xB0A0, - 8999: 0xB0A1, - 9000: 0xB0A2, - 9001: 0xB0A8, - 9002: 0xB0A9, - 9003: 0xB0AB, - 9004: 0xB0AC, - 9005: 0xB0AD, - 9006: 0xB0AE, - 9007: 0xB0AF, - 9008: 0xB0B1, - 9009: 0xB0B3, - 9010: 0xB0B4, - 9011: 0xB0B5, - 9012: 0xB0B8, - 9013: 0xB0BC, - 9014: 0xB0C4, - 9015: 0xB0C5, - 9016: 0xB0C7, - 9017: 0xB0C8, - 9018: 0xB0C9, - 9019: 0xB0D0, - 9020: 0xB0D1, - 9021: 0xB0D4, - 9022: 0xB0D8, - 9023: 0xB0E0, - 9024: 0xB0E5, - 9025: 0xB108, - 9026: 0xB109, - 9027: 0xB10B, - 9028: 0xB10C, - 9029: 0xB110, - 9030: 0xB112, - 9031: 0xB113, - 9032: 0xB118, - 9033: 0xB119, - 9034: 0xB11B, - 9035: 0xB11C, - 9036: 0xB11D, - 9037: 0xB123, - 9038: 0xB124, - 9039: 0xB125, - 9040: 0xB128, - 9041: 0xB12C, - 9042: 0xB134, - 9043: 0xB135, - 9044: 0xB137, - 9045: 0xB138, - 9046: 0xB139, - 9047: 0xB140, - 9048: 0xB141, - 9049: 0xB144, - 9050: 0xB148, - 9051: 0xB150, - 9052: 0xB151, - 9053: 0xB154, - 9054: 0xB155, - 9055: 0xB158, - 9056: 0xB15C, - 9057: 0xB160, - 9058: 0xB178, - 9059: 0xB179, - 9060: 0xB17C, - 9061: 0xB180, - 9062: 0xB182, - 9063: 0xB188, - 9064: 0xB189, - 9065: 0xB18B, - 9066: 0xB18D, - 9067: 0xB192, - 9068: 0xB193, - 9069: 0xB194, - 9070: 0xB198, - 9071: 0xB19C, - 9072: 0xB1A8, - 9073: 0xB1CC, - 9074: 0xB1D0, - 9075: 0xB1D4, - 9076: 0xB1DC, - 9077: 0xB1DD, - 9078: 0xD02E, - 9079: 0xD02F, - 9080: 0xD030, - 9081: 0xD031, - 9082: 0xD032, - 9083: 0xD033, - 9084: 0xD036, - 9085: 0xD037, - 9086: 0xD039, - 9087: 0xD03A, - 9088: 0xD03B, - 9089: 0xD03D, - 9090: 0xD03E, - 9091: 0xD03F, - 9092: 0xD040, - 9093: 0xD041, - 9094: 0xD042, - 9095: 0xD043, - 9096: 0xD046, - 9097: 0xD048, - 9098: 0xD04A, - 9099: 0xD04B, - 9100: 0xD04C, - 9101: 0xD04D, - 9102: 0xD04E, - 9103: 0xD04F, - 9104: 0xD051, - 9105: 0xD052, - 9106: 0xD053, - 9107: 0xD055, - 9108: 0xD056, - 9109: 0xD057, - 9110: 0xD059, - 9111: 0xD05A, - 9112: 0xD05B, - 9113: 0xD05C, - 9114: 0xD05D, - 9115: 0xD05E, - 9116: 0xD05F, - 9117: 0xD061, - 9118: 0xD062, - 9119: 0xD063, - 9120: 0xD064, - 9121: 0xD065, - 9122: 0xD066, - 9123: 0xD067, - 9124: 0xD068, - 9125: 0xD069, - 9126: 0xD06A, - 9127: 0xD06B, - 9128: 0xD06E, - 9129: 0xD06F, - 9130: 0xD071, - 9131: 0xD072, - 9132: 0xD073, - 9133: 0xD075, - 9134: 0xD076, - 9135: 0xD077, - 9136: 0xD078, - 9137: 0xD079, - 9138: 0xD07A, - 9139: 0xD07B, - 9140: 0xD07E, - 9141: 0xD07F, - 9142: 0xD080, - 9143: 0xD082, - 9144: 0xD083, - 9145: 0xD084, - 9146: 0xD085, - 9147: 0xD086, - 9148: 0xD087, - 9149: 0xD088, - 9150: 0xD089, - 9151: 0xD08A, - 9152: 0xD08B, - 9153: 0xD08C, - 9154: 0xD08D, - 9155: 0xD08E, - 9156: 0xD08F, - 9157: 0xD090, - 9158: 0xD091, - 9159: 0xD092, - 9160: 0xD093, - 9161: 0xD094, - 9162: 0xB1DF, - 9163: 0xB1E8, - 9164: 0xB1E9, - 9165: 0xB1EC, - 9166: 0xB1F0, - 9167: 0xB1F9, - 9168: 0xB1FB, - 9169: 0xB1FD, - 9170: 0xB204, - 9171: 0xB205, - 9172: 0xB208, - 9173: 0xB20B, - 9174: 0xB20C, - 9175: 0xB214, - 9176: 0xB215, - 9177: 0xB217, - 9178: 0xB219, - 9179: 0xB220, - 9180: 0xB234, - 9181: 0xB23C, - 9182: 0xB258, - 9183: 0xB25C, - 9184: 0xB260, - 9185: 0xB268, - 9186: 0xB269, - 9187: 0xB274, - 9188: 0xB275, - 9189: 0xB27C, - 9190: 0xB284, - 9191: 0xB285, - 9192: 0xB289, - 9193: 0xB290, - 9194: 0xB291, - 9195: 0xB294, - 9196: 0xB298, - 9197: 0xB299, - 9198: 0xB29A, - 9199: 0xB2A0, - 9200: 0xB2A1, - 9201: 0xB2A3, - 9202: 0xB2A5, - 9203: 0xB2A6, - 9204: 0xB2AA, - 9205: 0xB2AC, - 9206: 0xB2B0, - 9207: 0xB2B4, - 9208: 0xB2C8, - 9209: 0xB2C9, - 9210: 0xB2CC, - 9211: 0xB2D0, - 9212: 0xB2D2, - 9213: 0xB2D8, - 9214: 0xB2D9, - 9215: 0xB2DB, - 9216: 0xB2DD, - 9217: 0xB2E2, - 9218: 0xB2E4, - 9219: 0xB2E5, - 9220: 0xB2E6, - 9221: 0xB2E8, - 9222: 0xB2EB, - 9223: 0xB2EC, - 9224: 0xB2ED, - 9225: 0xB2EE, - 9226: 0xB2EF, - 9227: 0xB2F3, - 9228: 0xB2F4, - 9229: 0xB2F5, - 9230: 0xB2F7, - 9231: 0xB2F8, - 9232: 0xB2F9, - 9233: 0xB2FA, - 9234: 0xB2FB, - 9235: 0xB2FF, - 9236: 0xB300, - 9237: 0xB301, - 9238: 0xB304, - 9239: 0xB308, - 9240: 0xB310, - 9241: 0xB311, - 9242: 0xB313, - 9243: 0xB314, - 9244: 0xB315, - 9245: 0xB31C, - 9246: 0xB354, - 9247: 0xB355, - 9248: 0xB356, - 9249: 0xB358, - 9250: 0xB35B, - 9251: 0xB35C, - 9252: 0xB35E, - 9253: 0xB35F, - 9254: 0xB364, - 9255: 0xB365, - 9256: 0xD095, - 9257: 0xD096, - 9258: 0xD097, - 9259: 0xD098, - 9260: 0xD099, - 9261: 0xD09A, - 9262: 0xD09B, - 9263: 0xD09C, - 9264: 0xD09D, - 9265: 0xD09E, - 9266: 0xD09F, - 9267: 0xD0A0, - 9268: 0xD0A1, - 9269: 0xD0A2, - 9270: 0xD0A3, - 9271: 0xD0A6, - 9272: 0xD0A7, - 9273: 0xD0A9, - 9274: 0xD0AA, - 9275: 0xD0AB, - 9276: 0xD0AD, - 9277: 0xD0AE, - 9278: 0xD0AF, - 9279: 0xD0B0, - 9280: 0xD0B1, - 9281: 0xD0B2, - 9282: 0xD0B3, - 9283: 0xD0B6, - 9284: 0xD0B8, - 9285: 0xD0BA, - 9286: 0xD0BB, - 9287: 0xD0BC, - 9288: 0xD0BD, - 9289: 0xD0BE, - 9290: 0xD0BF, - 9291: 0xD0C2, - 9292: 0xD0C3, - 9293: 0xD0C5, - 9294: 0xD0C6, - 9295: 0xD0C7, - 9296: 0xD0CA, - 9297: 0xD0CB, - 9298: 0xD0CC, - 9299: 0xD0CD, - 9300: 0xD0CE, - 9301: 0xD0CF, - 9302: 0xD0D2, - 9303: 0xD0D6, - 9304: 0xD0D7, - 9305: 0xD0D8, - 9306: 0xD0D9, - 9307: 0xD0DA, - 9308: 0xD0DB, - 9309: 0xD0DE, - 9310: 0xD0DF, - 9311: 0xD0E1, - 9312: 0xD0E2, - 9313: 0xD0E3, - 9314: 0xD0E5, - 9315: 0xD0E6, - 9316: 0xD0E7, - 9317: 0xD0E8, - 9318: 0xD0E9, - 9319: 0xD0EA, - 9320: 0xD0EB, - 9321: 0xD0EE, - 9322: 0xD0F2, - 9323: 0xD0F3, - 9324: 0xD0F4, - 9325: 0xD0F5, - 9326: 0xD0F6, - 9327: 0xD0F7, - 9328: 0xD0F9, - 9329: 0xD0FA, - 9330: 0xD0FB, - 9331: 0xD0FC, - 9332: 0xD0FD, - 9333: 0xD0FE, - 9334: 0xD0FF, - 9335: 0xD100, - 9336: 0xD101, - 9337: 0xD102, - 9338: 0xD103, - 9339: 0xD104, - 9340: 0xB367, - 9341: 0xB369, - 9342: 0xB36B, - 9343: 0xB36E, - 9344: 0xB370, - 9345: 0xB371, - 9346: 0xB374, - 9347: 0xB378, - 9348: 0xB380, - 9349: 0xB381, - 9350: 0xB383, - 9351: 0xB384, - 9352: 0xB385, - 9353: 0xB38C, - 9354: 0xB390, - 9355: 0xB394, - 9356: 0xB3A0, - 9357: 0xB3A1, - 9358: 0xB3A8, - 9359: 0xB3AC, - 9360: 0xB3C4, - 9361: 0xB3C5, - 9362: 0xB3C8, - 9363: 0xB3CB, - 9364: 0xB3CC, - 9365: 0xB3CE, - 9366: 0xB3D0, - 9367: 0xB3D4, - 9368: 0xB3D5, - 9369: 0xB3D7, - 9370: 0xB3D9, - 9371: 0xB3DB, - 9372: 0xB3DD, - 9373: 0xB3E0, - 9374: 0xB3E4, - 9375: 0xB3E8, - 9376: 0xB3FC, - 9377: 0xB410, - 9378: 0xB418, - 9379: 0xB41C, - 9380: 0xB420, - 9381: 0xB428, - 9382: 0xB429, - 9383: 0xB42B, - 9384: 0xB434, - 9385: 0xB450, - 9386: 0xB451, - 9387: 0xB454, - 9388: 0xB458, - 9389: 0xB460, - 9390: 0xB461, - 9391: 0xB463, - 9392: 0xB465, - 9393: 0xB46C, - 9394: 0xB480, - 9395: 0xB488, - 9396: 0xB49D, - 9397: 0xB4A4, - 9398: 0xB4A8, - 9399: 0xB4AC, - 9400: 0xB4B5, - 9401: 0xB4B7, - 9402: 0xB4B9, - 9403: 0xB4C0, - 9404: 0xB4C4, - 9405: 0xB4C8, - 9406: 0xB4D0, - 9407: 0xB4D5, - 9408: 0xB4DC, - 9409: 0xB4DD, - 9410: 0xB4E0, - 9411: 0xB4E3, - 9412: 0xB4E4, - 9413: 0xB4E6, - 9414: 0xB4EC, - 9415: 0xB4ED, - 9416: 0xB4EF, - 9417: 0xB4F1, - 9418: 0xB4F8, - 9419: 0xB514, - 9420: 0xB515, - 9421: 0xB518, - 9422: 0xB51B, - 9423: 0xB51C, - 9424: 0xB524, - 9425: 0xB525, - 9426: 0xB527, - 9427: 0xB528, - 9428: 0xB529, - 9429: 0xB52A, - 9430: 0xB530, - 9431: 0xB531, - 9432: 0xB534, - 9433: 0xB538, - 9434: 0xD105, - 9435: 0xD106, - 9436: 0xD107, - 9437: 0xD108, - 9438: 0xD109, - 9439: 0xD10A, - 9440: 0xD10B, - 9441: 0xD10C, - 9442: 0xD10E, - 9443: 0xD10F, - 9444: 0xD110, - 9445: 0xD111, - 9446: 0xD112, - 9447: 0xD113, - 9448: 0xD114, - 9449: 0xD115, - 9450: 0xD116, - 9451: 0xD117, - 9452: 0xD118, - 9453: 0xD119, - 9454: 0xD11A, - 9455: 0xD11B, - 9456: 0xD11C, - 9457: 0xD11D, - 9458: 0xD11E, - 9459: 0xD11F, - 9460: 0xD120, - 9461: 0xD121, - 9462: 0xD122, - 9463: 0xD123, - 9464: 0xD124, - 9465: 0xD125, - 9466: 0xD126, - 9467: 0xD127, - 9468: 0xD128, - 9469: 0xD129, - 9470: 0xD12A, - 9471: 0xD12B, - 9472: 0xD12C, - 9473: 0xD12D, - 9474: 0xD12E, - 9475: 0xD12F, - 9476: 0xD132, - 9477: 0xD133, - 9478: 0xD135, - 9479: 0xD136, - 9480: 0xD137, - 9481: 0xD139, - 9482: 0xD13B, - 9483: 0xD13C, - 9484: 0xD13D, - 9485: 0xD13E, - 9486: 0xD13F, - 9487: 0xD142, - 9488: 0xD146, - 9489: 0xD147, - 9490: 0xD148, - 9491: 0xD149, - 9492: 0xD14A, - 9493: 0xD14B, - 9494: 0xD14E, - 9495: 0xD14F, - 9496: 0xD151, - 9497: 0xD152, - 9498: 0xD153, - 9499: 0xD155, - 9500: 0xD156, - 9501: 0xD157, - 9502: 0xD158, - 9503: 0xD159, - 9504: 0xD15A, - 9505: 0xD15B, - 9506: 0xD15E, - 9507: 0xD160, - 9508: 0xD162, - 9509: 0xD163, - 9510: 0xD164, - 9511: 0xD165, - 9512: 0xD166, - 9513: 0xD167, - 9514: 0xD169, - 9515: 0xD16A, - 9516: 0xD16B, - 9517: 0xD16D, - 9518: 0xB540, - 9519: 0xB541, - 9520: 0xB543, - 9521: 0xB544, - 9522: 0xB545, - 9523: 0xB54B, - 9524: 0xB54C, - 9525: 0xB54D, - 9526: 0xB550, - 9527: 0xB554, - 9528: 0xB55C, - 9529: 0xB55D, - 9530: 0xB55F, - 9531: 0xB560, - 9532: 0xB561, - 9533: 0xB5A0, - 9534: 0xB5A1, - 9535: 0xB5A4, - 9536: 0xB5A8, - 9537: 0xB5AA, - 9538: 0xB5AB, - 9539: 0xB5B0, - 9540: 0xB5B1, - 9541: 0xB5B3, - 9542: 0xB5B4, - 9543: 0xB5B5, - 9544: 0xB5BB, - 9545: 0xB5BC, - 9546: 0xB5BD, - 9547: 0xB5C0, - 9548: 0xB5C4, - 9549: 0xB5CC, - 9550: 0xB5CD, - 9551: 0xB5CF, - 9552: 0xB5D0, - 9553: 0xB5D1, - 9554: 0xB5D8, - 9555: 0xB5EC, - 9556: 0xB610, - 9557: 0xB611, - 9558: 0xB614, - 9559: 0xB618, - 9560: 0xB625, - 9561: 0xB62C, - 9562: 0xB634, - 9563: 0xB648, - 9564: 0xB664, - 9565: 0xB668, - 9566: 0xB69C, - 9567: 0xB69D, - 9568: 0xB6A0, - 9569: 0xB6A4, - 9570: 0xB6AB, - 9571: 0xB6AC, - 9572: 0xB6B1, - 9573: 0xB6D4, - 9574: 0xB6F0, - 9575: 0xB6F4, - 9576: 0xB6F8, - 9577: 0xB700, - 9578: 0xB701, - 9579: 0xB705, - 9580: 0xB728, - 9581: 0xB729, - 9582: 0xB72C, - 9583: 0xB72F, - 9584: 0xB730, - 9585: 0xB738, - 9586: 0xB739, - 9587: 0xB73B, - 9588: 0xB744, - 9589: 0xB748, - 9590: 0xB74C, - 9591: 0xB754, - 9592: 0xB755, - 9593: 0xB760, - 9594: 0xB764, - 9595: 0xB768, - 9596: 0xB770, - 9597: 0xB771, - 9598: 0xB773, - 9599: 0xB775, - 9600: 0xB77C, - 9601: 0xB77D, - 9602: 0xB780, - 9603: 0xB784, - 9604: 0xB78C, - 9605: 0xB78D, - 9606: 0xB78F, - 9607: 0xB790, - 9608: 0xB791, - 9609: 0xB792, - 9610: 0xB796, - 9611: 0xB797, - 9612: 0xD16E, - 9613: 0xD16F, - 9614: 0xD170, - 9615: 0xD171, - 9616: 0xD172, - 9617: 0xD173, - 9618: 0xD174, - 9619: 0xD175, - 9620: 0xD176, - 9621: 0xD177, - 9622: 0xD178, - 9623: 0xD179, - 9624: 0xD17A, - 9625: 0xD17B, - 9626: 0xD17D, - 9627: 0xD17E, - 9628: 0xD17F, - 9629: 0xD180, - 9630: 0xD181, - 9631: 0xD182, - 9632: 0xD183, - 9633: 0xD185, - 9634: 0xD186, - 9635: 0xD187, - 9636: 0xD189, - 9637: 0xD18A, - 9638: 0xD18B, - 9639: 0xD18C, - 9640: 0xD18D, - 9641: 0xD18E, - 9642: 0xD18F, - 9643: 0xD190, - 9644: 0xD191, - 9645: 0xD192, - 9646: 0xD193, - 9647: 0xD194, - 9648: 0xD195, - 9649: 0xD196, - 9650: 0xD197, - 9651: 0xD198, - 9652: 0xD199, - 9653: 0xD19A, - 9654: 0xD19B, - 9655: 0xD19C, - 9656: 0xD19D, - 9657: 0xD19E, - 9658: 0xD19F, - 9659: 0xD1A2, - 9660: 0xD1A3, - 9661: 0xD1A5, - 9662: 0xD1A6, - 9663: 0xD1A7, - 9664: 0xD1A9, - 9665: 0xD1AA, - 9666: 0xD1AB, - 9667: 0xD1AC, - 9668: 0xD1AD, - 9669: 0xD1AE, - 9670: 0xD1AF, - 9671: 0xD1B2, - 9672: 0xD1B4, - 9673: 0xD1B6, - 9674: 0xD1B7, - 9675: 0xD1B8, - 9676: 0xD1B9, - 9677: 0xD1BB, - 9678: 0xD1BD, - 9679: 0xD1BE, - 9680: 0xD1BF, - 9681: 0xD1C1, - 9682: 0xD1C2, - 9683: 0xD1C3, - 9684: 0xD1C4, - 9685: 0xD1C5, - 9686: 0xD1C6, - 9687: 0xD1C7, - 9688: 0xD1C8, - 9689: 0xD1C9, - 9690: 0xD1CA, - 9691: 0xD1CB, - 9692: 0xD1CC, - 9693: 0xD1CD, - 9694: 0xD1CE, - 9695: 0xD1CF, - 9696: 0xB798, - 9697: 0xB799, - 9698: 0xB79C, - 9699: 0xB7A0, - 9700: 0xB7A8, - 9701: 0xB7A9, - 9702: 0xB7AB, - 9703: 0xB7AC, - 9704: 0xB7AD, - 9705: 0xB7B4, - 9706: 0xB7B5, - 9707: 0xB7B8, - 9708: 0xB7C7, - 9709: 0xB7C9, - 9710: 0xB7EC, - 9711: 0xB7ED, - 9712: 0xB7F0, - 9713: 0xB7F4, - 9714: 0xB7FC, - 9715: 0xB7FD, - 9716: 0xB7FF, - 9717: 0xB800, - 9718: 0xB801, - 9719: 0xB807, - 9720: 0xB808, - 9721: 0xB809, - 9722: 0xB80C, - 9723: 0xB810, - 9724: 0xB818, - 9725: 0xB819, - 9726: 0xB81B, - 9727: 0xB81D, - 9728: 0xB824, - 9729: 0xB825, - 9730: 0xB828, - 9731: 0xB82C, - 9732: 0xB834, - 9733: 0xB835, - 9734: 0xB837, - 9735: 0xB838, - 9736: 0xB839, - 9737: 0xB840, - 9738: 0xB844, - 9739: 0xB851, - 9740: 0xB853, - 9741: 0xB85C, - 9742: 0xB85D, - 9743: 0xB860, - 9744: 0xB864, - 9745: 0xB86C, - 9746: 0xB86D, - 9747: 0xB86F, - 9748: 0xB871, - 9749: 0xB878, - 9750: 0xB87C, - 9751: 0xB88D, - 9752: 0xB8A8, - 9753: 0xB8B0, - 9754: 0xB8B4, - 9755: 0xB8B8, - 9756: 0xB8C0, - 9757: 0xB8C1, - 9758: 0xB8C3, - 9759: 0xB8C5, - 9760: 0xB8CC, - 9761: 0xB8D0, - 9762: 0xB8D4, - 9763: 0xB8DD, - 9764: 0xB8DF, - 9765: 0xB8E1, - 9766: 0xB8E8, - 9767: 0xB8E9, - 9768: 0xB8EC, - 9769: 0xB8F0, - 9770: 0xB8F8, - 9771: 0xB8F9, - 9772: 0xB8FB, - 9773: 0xB8FD, - 9774: 0xB904, - 9775: 0xB918, - 9776: 0xB920, - 9777: 0xB93C, - 9778: 0xB93D, - 9779: 0xB940, - 9780: 0xB944, - 9781: 0xB94C, - 9782: 0xB94F, - 9783: 0xB951, - 9784: 0xB958, - 9785: 0xB959, - 9786: 0xB95C, - 9787: 0xB960, - 9788: 0xB968, - 9789: 0xB969, - 9790: 0xD1D0, - 9791: 0xD1D1, - 9792: 0xD1D2, - 9793: 0xD1D3, - 9794: 0xD1D4, - 9795: 0xD1D5, - 9796: 0xD1D6, - 9797: 0xD1D7, - 9798: 0xD1D9, - 9799: 0xD1DA, - 9800: 0xD1DB, - 9801: 0xD1DC, - 9802: 0xD1DD, - 9803: 0xD1DE, - 9804: 0xD1DF, - 9805: 0xD1E0, - 9806: 0xD1E1, - 9807: 0xD1E2, - 9808: 0xD1E3, - 9809: 0xD1E4, - 9810: 0xD1E5, - 9811: 0xD1E6, - 9812: 0xD1E7, - 9813: 0xD1E8, - 9814: 0xD1E9, - 9815: 0xD1EA, - 9816: 0xD1EB, - 9817: 0xD1EC, - 9818: 0xD1ED, - 9819: 0xD1EE, - 9820: 0xD1EF, - 9821: 0xD1F0, - 9822: 0xD1F1, - 9823: 0xD1F2, - 9824: 0xD1F3, - 9825: 0xD1F5, - 9826: 0xD1F6, - 9827: 0xD1F7, - 9828: 0xD1F9, - 9829: 0xD1FA, - 9830: 0xD1FB, - 9831: 0xD1FC, - 9832: 0xD1FD, - 9833: 0xD1FE, - 9834: 0xD1FF, - 9835: 0xD200, - 9836: 0xD201, - 9837: 0xD202, - 9838: 0xD203, - 9839: 0xD204, - 9840: 0xD205, - 9841: 0xD206, - 9842: 0xD208, - 9843: 0xD20A, - 9844: 0xD20B, - 9845: 0xD20C, - 9846: 0xD20D, - 9847: 0xD20E, - 9848: 0xD20F, - 9849: 0xD211, - 9850: 0xD212, - 9851: 0xD213, - 9852: 0xD214, - 9853: 0xD215, - 9854: 0xD216, - 9855: 0xD217, - 9856: 0xD218, - 9857: 0xD219, - 9858: 0xD21A, - 9859: 0xD21B, - 9860: 0xD21C, - 9861: 0xD21D, - 9862: 0xD21E, - 9863: 0xD21F, - 9864: 0xD220, - 9865: 0xD221, - 9866: 0xD222, - 9867: 0xD223, - 9868: 0xD224, - 9869: 0xD225, - 9870: 0xD226, - 9871: 0xD227, - 9872: 0xD228, - 9873: 0xD229, - 9874: 0xB96B, - 9875: 0xB96D, - 9876: 0xB974, - 9877: 0xB975, - 9878: 0xB978, - 9879: 0xB97C, - 9880: 0xB984, - 9881: 0xB985, - 9882: 0xB987, - 9883: 0xB989, - 9884: 0xB98A, - 9885: 0xB98D, - 9886: 0xB98E, - 9887: 0xB9AC, - 9888: 0xB9AD, - 9889: 0xB9B0, - 9890: 0xB9B4, - 9891: 0xB9BC, - 9892: 0xB9BD, - 9893: 0xB9BF, - 9894: 0xB9C1, - 9895: 0xB9C8, - 9896: 0xB9C9, - 9897: 0xB9CC, - 9898: 0xB9CE, - 9899: 0xB9CF, - 9900: 0xB9D0, - 9901: 0xB9D1, - 9902: 0xB9D2, - 9903: 0xB9D8, - 9904: 0xB9D9, - 9905: 0xB9DB, - 9906: 0xB9DD, - 9907: 0xB9DE, - 9908: 0xB9E1, - 9909: 0xB9E3, - 9910: 0xB9E4, - 9911: 0xB9E5, - 9912: 0xB9E8, - 9913: 0xB9EC, - 9914: 0xB9F4, - 9915: 0xB9F5, - 9916: 0xB9F7, - 9917: 0xB9F8, - 9918: 0xB9F9, - 9919: 0xB9FA, - 9920: 0xBA00, - 9921: 0xBA01, - 9922: 0xBA08, - 9923: 0xBA15, - 9924: 0xBA38, - 9925: 0xBA39, - 9926: 0xBA3C, - 9927: 0xBA40, - 9928: 0xBA42, - 9929: 0xBA48, - 9930: 0xBA49, - 9931: 0xBA4B, - 9932: 0xBA4D, - 9933: 0xBA4E, - 9934: 0xBA53, - 9935: 0xBA54, - 9936: 0xBA55, - 9937: 0xBA58, - 9938: 0xBA5C, - 9939: 0xBA64, - 9940: 0xBA65, - 9941: 0xBA67, - 9942: 0xBA68, - 9943: 0xBA69, - 9944: 0xBA70, - 9945: 0xBA71, - 9946: 0xBA74, - 9947: 0xBA78, - 9948: 0xBA83, - 9949: 0xBA84, - 9950: 0xBA85, - 9951: 0xBA87, - 9952: 0xBA8C, - 9953: 0xBAA8, - 9954: 0xBAA9, - 9955: 0xBAAB, - 9956: 0xBAAC, - 9957: 0xBAB0, - 9958: 0xBAB2, - 9959: 0xBAB8, - 9960: 0xBAB9, - 9961: 0xBABB, - 9962: 0xBABD, - 9963: 0xBAC4, - 9964: 0xBAC8, - 9965: 0xBAD8, - 9966: 0xBAD9, - 9967: 0xBAFC, - 9968: 0xD22A, - 9969: 0xD22B, - 9970: 0xD22E, - 9971: 0xD22F, - 9972: 0xD231, - 9973: 0xD232, - 9974: 0xD233, - 9975: 0xD235, - 9976: 0xD236, - 9977: 0xD237, - 9978: 0xD238, - 9979: 0xD239, - 9980: 0xD23A, - 9981: 0xD23B, - 9982: 0xD23E, - 9983: 0xD240, - 9984: 0xD242, - 9985: 0xD243, - 9986: 0xD244, - 9987: 0xD245, - 9988: 0xD246, - 9989: 0xD247, - 9990: 0xD249, - 9991: 0xD24A, - 9992: 0xD24B, - 9993: 0xD24C, - 9994: 0xD24D, - 9995: 0xD24E, - 9996: 0xD24F, - 9997: 0xD250, - 9998: 0xD251, - 9999: 0xD252, - 10000: 0xD253, - 10001: 0xD254, - 10002: 0xD255, - 10003: 0xD256, - 10004: 0xD257, - 10005: 0xD258, - 10006: 0xD259, - 10007: 0xD25A, - 10008: 0xD25B, - 10009: 0xD25D, - 10010: 0xD25E, - 10011: 0xD25F, - 10012: 0xD260, - 10013: 0xD261, - 10014: 0xD262, - 10015: 0xD263, - 10016: 0xD265, - 10017: 0xD266, - 10018: 0xD267, - 10019: 0xD268, - 10020: 0xD269, - 10021: 0xD26A, - 10022: 0xD26B, - 10023: 0xD26C, - 10024: 0xD26D, - 10025: 0xD26E, - 10026: 0xD26F, - 10027: 0xD270, - 10028: 0xD271, - 10029: 0xD272, - 10030: 0xD273, - 10031: 0xD274, - 10032: 0xD275, - 10033: 0xD276, - 10034: 0xD277, - 10035: 0xD278, - 10036: 0xD279, - 10037: 0xD27A, - 10038: 0xD27B, - 10039: 0xD27C, - 10040: 0xD27D, - 10041: 0xD27E, - 10042: 0xD27F, - 10043: 0xD282, - 10044: 0xD283, - 10045: 0xD285, - 10046: 0xD286, - 10047: 0xD287, - 10048: 0xD289, - 10049: 0xD28A, - 10050: 0xD28B, - 10051: 0xD28C, - 10052: 0xBB00, - 10053: 0xBB04, - 10054: 0xBB0D, - 10055: 0xBB0F, - 10056: 0xBB11, - 10057: 0xBB18, - 10058: 0xBB1C, - 10059: 0xBB20, - 10060: 0xBB29, - 10061: 0xBB2B, - 10062: 0xBB34, - 10063: 0xBB35, - 10064: 0xBB36, - 10065: 0xBB38, - 10066: 0xBB3B, - 10067: 0xBB3C, - 10068: 0xBB3D, - 10069: 0xBB3E, - 10070: 0xBB44, - 10071: 0xBB45, - 10072: 0xBB47, - 10073: 0xBB49, - 10074: 0xBB4D, - 10075: 0xBB4F, - 10076: 0xBB50, - 10077: 0xBB54, - 10078: 0xBB58, - 10079: 0xBB61, - 10080: 0xBB63, - 10081: 0xBB6C, - 10082: 0xBB88, - 10083: 0xBB8C, - 10084: 0xBB90, - 10085: 0xBBA4, - 10086: 0xBBA8, - 10087: 0xBBAC, - 10088: 0xBBB4, - 10089: 0xBBB7, - 10090: 0xBBC0, - 10091: 0xBBC4, - 10092: 0xBBC8, - 10093: 0xBBD0, - 10094: 0xBBD3, - 10095: 0xBBF8, - 10096: 0xBBF9, - 10097: 0xBBFC, - 10098: 0xBBFF, - 10099: 0xBC00, - 10100: 0xBC02, - 10101: 0xBC08, - 10102: 0xBC09, - 10103: 0xBC0B, - 10104: 0xBC0C, - 10105: 0xBC0D, - 10106: 0xBC0F, - 10107: 0xBC11, - 10108: 0xBC14, - 10109: 0xBC15, - 10110: 0xBC16, - 10111: 0xBC17, - 10112: 0xBC18, - 10113: 0xBC1B, - 10114: 0xBC1C, - 10115: 0xBC1D, - 10116: 0xBC1E, - 10117: 0xBC1F, - 10118: 0xBC24, - 10119: 0xBC25, - 10120: 0xBC27, - 10121: 0xBC29, - 10122: 0xBC2D, - 10123: 0xBC30, - 10124: 0xBC31, - 10125: 0xBC34, - 10126: 0xBC38, - 10127: 0xBC40, - 10128: 0xBC41, - 10129: 0xBC43, - 10130: 0xBC44, - 10131: 0xBC45, - 10132: 0xBC49, - 10133: 0xBC4C, - 10134: 0xBC4D, - 10135: 0xBC50, - 10136: 0xBC5D, - 10137: 0xBC84, - 10138: 0xBC85, - 10139: 0xBC88, - 10140: 0xBC8B, - 10141: 0xBC8C, - 10142: 0xBC8E, - 10143: 0xBC94, - 10144: 0xBC95, - 10145: 0xBC97, - 10146: 0xD28D, - 10147: 0xD28E, - 10148: 0xD28F, - 10149: 0xD292, - 10150: 0xD293, - 10151: 0xD294, - 10152: 0xD296, - 10153: 0xD297, - 10154: 0xD298, - 10155: 0xD299, - 10156: 0xD29A, - 10157: 0xD29B, - 10158: 0xD29D, - 10159: 0xD29E, - 10160: 0xD29F, - 10161: 0xD2A1, - 10162: 0xD2A2, - 10163: 0xD2A3, - 10164: 0xD2A5, - 10165: 0xD2A6, - 10166: 0xD2A7, - 10167: 0xD2A8, - 10168: 0xD2A9, - 10169: 0xD2AA, - 10170: 0xD2AB, - 10171: 0xD2AD, - 10172: 0xD2AE, - 10173: 0xD2AF, - 10174: 0xD2B0, - 10175: 0xD2B2, - 10176: 0xD2B3, - 10177: 0xD2B4, - 10178: 0xD2B5, - 10179: 0xD2B6, - 10180: 0xD2B7, - 10181: 0xD2BA, - 10182: 0xD2BB, - 10183: 0xD2BD, - 10184: 0xD2BE, - 10185: 0xD2C1, - 10186: 0xD2C3, - 10187: 0xD2C4, - 10188: 0xD2C5, - 10189: 0xD2C6, - 10190: 0xD2C7, - 10191: 0xD2CA, - 10192: 0xD2CC, - 10193: 0xD2CD, - 10194: 0xD2CE, - 10195: 0xD2CF, - 10196: 0xD2D0, - 10197: 0xD2D1, - 10198: 0xD2D2, - 10199: 0xD2D3, - 10200: 0xD2D5, - 10201: 0xD2D6, - 10202: 0xD2D7, - 10203: 0xD2D9, - 10204: 0xD2DA, - 10205: 0xD2DB, - 10206: 0xD2DD, - 10207: 0xD2DE, - 10208: 0xD2DF, - 10209: 0xD2E0, - 10210: 0xD2E1, - 10211: 0xD2E2, - 10212: 0xD2E3, - 10213: 0xD2E6, - 10214: 0xD2E7, - 10215: 0xD2E8, - 10216: 0xD2E9, - 10217: 0xD2EA, - 10218: 0xD2EB, - 10219: 0xD2EC, - 10220: 0xD2ED, - 10221: 0xD2EE, - 10222: 0xD2EF, - 10223: 0xD2F2, - 10224: 0xD2F3, - 10225: 0xD2F5, - 10226: 0xD2F6, - 10227: 0xD2F7, - 10228: 0xD2F9, - 10229: 0xD2FA, - 10230: 0xBC99, - 10231: 0xBC9A, - 10232: 0xBCA0, - 10233: 0xBCA1, - 10234: 0xBCA4, - 10235: 0xBCA7, - 10236: 0xBCA8, - 10237: 0xBCB0, - 10238: 0xBCB1, - 10239: 0xBCB3, - 10240: 0xBCB4, - 10241: 0xBCB5, - 10242: 0xBCBC, - 10243: 0xBCBD, - 10244: 0xBCC0, - 10245: 0xBCC4, - 10246: 0xBCCD, - 10247: 0xBCCF, - 10248: 0xBCD0, - 10249: 0xBCD1, - 10250: 0xBCD5, - 10251: 0xBCD8, - 10252: 0xBCDC, - 10253: 0xBCF4, - 10254: 0xBCF5, - 10255: 0xBCF6, - 10256: 0xBCF8, - 10257: 0xBCFC, - 10258: 0xBD04, - 10259: 0xBD05, - 10260: 0xBD07, - 10261: 0xBD09, - 10262: 0xBD10, - 10263: 0xBD14, - 10264: 0xBD24, - 10265: 0xBD2C, - 10266: 0xBD40, - 10267: 0xBD48, - 10268: 0xBD49, - 10269: 0xBD4C, - 10270: 0xBD50, - 10271: 0xBD58, - 10272: 0xBD59, - 10273: 0xBD64, - 10274: 0xBD68, - 10275: 0xBD80, - 10276: 0xBD81, - 10277: 0xBD84, - 10278: 0xBD87, - 10279: 0xBD88, - 10280: 0xBD89, - 10281: 0xBD8A, - 10282: 0xBD90, - 10283: 0xBD91, - 10284: 0xBD93, - 10285: 0xBD95, - 10286: 0xBD99, - 10287: 0xBD9A, - 10288: 0xBD9C, - 10289: 0xBDA4, - 10290: 0xBDB0, - 10291: 0xBDB8, - 10292: 0xBDD4, - 10293: 0xBDD5, - 10294: 0xBDD8, - 10295: 0xBDDC, - 10296: 0xBDE9, - 10297: 0xBDF0, - 10298: 0xBDF4, - 10299: 0xBDF8, - 10300: 0xBE00, - 10301: 0xBE03, - 10302: 0xBE05, - 10303: 0xBE0C, - 10304: 0xBE0D, - 10305: 0xBE10, - 10306: 0xBE14, - 10307: 0xBE1C, - 10308: 0xBE1D, - 10309: 0xBE1F, - 10310: 0xBE44, - 10311: 0xBE45, - 10312: 0xBE48, - 10313: 0xBE4C, - 10314: 0xBE4E, - 10315: 0xBE54, - 10316: 0xBE55, - 10317: 0xBE57, - 10318: 0xBE59, - 10319: 0xBE5A, - 10320: 0xBE5B, - 10321: 0xBE60, - 10322: 0xBE61, - 10323: 0xBE64, - 10324: 0xD2FB, - 10325: 0xD2FC, - 10326: 0xD2FD, - 10327: 0xD2FE, - 10328: 0xD2FF, - 10329: 0xD302, - 10330: 0xD304, - 10331: 0xD306, - 10332: 0xD307, - 10333: 0xD308, - 10334: 0xD309, - 10335: 0xD30A, - 10336: 0xD30B, - 10337: 0xD30F, - 10338: 0xD311, - 10339: 0xD312, - 10340: 0xD313, - 10341: 0xD315, - 10342: 0xD317, - 10343: 0xD318, - 10344: 0xD319, - 10345: 0xD31A, - 10346: 0xD31B, - 10347: 0xD31E, - 10348: 0xD322, - 10349: 0xD323, - 10350: 0xD324, - 10351: 0xD326, - 10352: 0xD327, - 10353: 0xD32A, - 10354: 0xD32B, - 10355: 0xD32D, - 10356: 0xD32E, - 10357: 0xD32F, - 10358: 0xD331, - 10359: 0xD332, - 10360: 0xD333, - 10361: 0xD334, - 10362: 0xD335, - 10363: 0xD336, - 10364: 0xD337, - 10365: 0xD33A, - 10366: 0xD33E, - 10367: 0xD33F, - 10368: 0xD340, - 10369: 0xD341, - 10370: 0xD342, - 10371: 0xD343, - 10372: 0xD346, - 10373: 0xD347, - 10374: 0xD348, - 10375: 0xD349, - 10376: 0xD34A, - 10377: 0xD34B, - 10378: 0xD34C, - 10379: 0xD34D, - 10380: 0xD34E, - 10381: 0xD34F, - 10382: 0xD350, - 10383: 0xD351, - 10384: 0xD352, - 10385: 0xD353, - 10386: 0xD354, - 10387: 0xD355, - 10388: 0xD356, - 10389: 0xD357, - 10390: 0xD358, - 10391: 0xD359, - 10392: 0xD35A, - 10393: 0xD35B, - 10394: 0xD35C, - 10395: 0xD35D, - 10396: 0xD35E, - 10397: 0xD35F, - 10398: 0xD360, - 10399: 0xD361, - 10400: 0xD362, - 10401: 0xD363, - 10402: 0xD364, - 10403: 0xD365, - 10404: 0xD366, - 10405: 0xD367, - 10406: 0xD368, - 10407: 0xD369, - 10408: 0xBE68, - 10409: 0xBE6A, - 10410: 0xBE70, - 10411: 0xBE71, - 10412: 0xBE73, - 10413: 0xBE74, - 10414: 0xBE75, - 10415: 0xBE7B, - 10416: 0xBE7C, - 10417: 0xBE7D, - 10418: 0xBE80, - 10419: 0xBE84, - 10420: 0xBE8C, - 10421: 0xBE8D, - 10422: 0xBE8F, - 10423: 0xBE90, - 10424: 0xBE91, - 10425: 0xBE98, - 10426: 0xBE99, - 10427: 0xBEA8, - 10428: 0xBED0, - 10429: 0xBED1, - 10430: 0xBED4, - 10431: 0xBED7, - 10432: 0xBED8, - 10433: 0xBEE0, - 10434: 0xBEE3, - 10435: 0xBEE4, - 10436: 0xBEE5, - 10437: 0xBEEC, - 10438: 0xBF01, - 10439: 0xBF08, - 10440: 0xBF09, - 10441: 0xBF18, - 10442: 0xBF19, - 10443: 0xBF1B, - 10444: 0xBF1C, - 10445: 0xBF1D, - 10446: 0xBF40, - 10447: 0xBF41, - 10448: 0xBF44, - 10449: 0xBF48, - 10450: 0xBF50, - 10451: 0xBF51, - 10452: 0xBF55, - 10453: 0xBF94, - 10454: 0xBFB0, - 10455: 0xBFC5, - 10456: 0xBFCC, - 10457: 0xBFCD, - 10458: 0xBFD0, - 10459: 0xBFD4, - 10460: 0xBFDC, - 10461: 0xBFDF, - 10462: 0xBFE1, - 10463: 0xC03C, - 10464: 0xC051, - 10465: 0xC058, - 10466: 0xC05C, - 10467: 0xC060, - 10468: 0xC068, - 10469: 0xC069, - 10470: 0xC090, - 10471: 0xC091, - 10472: 0xC094, - 10473: 0xC098, - 10474: 0xC0A0, - 10475: 0xC0A1, - 10476: 0xC0A3, - 10477: 0xC0A5, - 10478: 0xC0AC, - 10479: 0xC0AD, - 10480: 0xC0AF, - 10481: 0xC0B0, - 10482: 0xC0B3, - 10483: 0xC0B4, - 10484: 0xC0B5, - 10485: 0xC0B6, - 10486: 0xC0BC, - 10487: 0xC0BD, - 10488: 0xC0BF, - 10489: 0xC0C0, - 10490: 0xC0C1, - 10491: 0xC0C5, - 10492: 0xC0C8, - 10493: 0xC0C9, - 10494: 0xC0CC, - 10495: 0xC0D0, - 10496: 0xC0D8, - 10497: 0xC0D9, - 10498: 0xC0DB, - 10499: 0xC0DC, - 10500: 0xC0DD, - 10501: 0xC0E4, - 10502: 0xD36A, - 10503: 0xD36B, - 10504: 0xD36C, - 10505: 0xD36D, - 10506: 0xD36E, - 10507: 0xD36F, - 10508: 0xD370, - 10509: 0xD371, - 10510: 0xD372, - 10511: 0xD373, - 10512: 0xD374, - 10513: 0xD375, - 10514: 0xD376, - 10515: 0xD377, - 10516: 0xD378, - 10517: 0xD379, - 10518: 0xD37A, - 10519: 0xD37B, - 10520: 0xD37E, - 10521: 0xD37F, - 10522: 0xD381, - 10523: 0xD382, - 10524: 0xD383, - 10525: 0xD385, - 10526: 0xD386, - 10527: 0xD387, - 10528: 0xD388, - 10529: 0xD389, - 10530: 0xD38A, - 10531: 0xD38B, - 10532: 0xD38E, - 10533: 0xD392, - 10534: 0xD393, - 10535: 0xD394, - 10536: 0xD395, - 10537: 0xD396, - 10538: 0xD397, - 10539: 0xD39A, - 10540: 0xD39B, - 10541: 0xD39D, - 10542: 0xD39E, - 10543: 0xD39F, - 10544: 0xD3A1, - 10545: 0xD3A2, - 10546: 0xD3A3, - 10547: 0xD3A4, - 10548: 0xD3A5, - 10549: 0xD3A6, - 10550: 0xD3A7, - 10551: 0xD3AA, - 10552: 0xD3AC, - 10553: 0xD3AE, - 10554: 0xD3AF, - 10555: 0xD3B0, - 10556: 0xD3B1, - 10557: 0xD3B2, - 10558: 0xD3B3, - 10559: 0xD3B5, - 10560: 0xD3B6, - 10561: 0xD3B7, - 10562: 0xD3B9, - 10563: 0xD3BA, - 10564: 0xD3BB, - 10565: 0xD3BD, - 10566: 0xD3BE, - 10567: 0xD3BF, - 10568: 0xD3C0, - 10569: 0xD3C1, - 10570: 0xD3C2, - 10571: 0xD3C3, - 10572: 0xD3C6, - 10573: 0xD3C7, - 10574: 0xD3CA, - 10575: 0xD3CB, - 10576: 0xD3CC, - 10577: 0xD3CD, - 10578: 0xD3CE, - 10579: 0xD3CF, - 10580: 0xD3D1, - 10581: 0xD3D2, - 10582: 0xD3D3, - 10583: 0xD3D4, - 10584: 0xD3D5, - 10585: 0xD3D6, - 10586: 0xC0E5, - 10587: 0xC0E8, - 10588: 0xC0EC, - 10589: 0xC0F4, - 10590: 0xC0F5, - 10591: 0xC0F7, - 10592: 0xC0F9, - 10593: 0xC100, - 10594: 0xC104, - 10595: 0xC108, - 10596: 0xC110, - 10597: 0xC115, - 10598: 0xC11C, - 10599: 0xC11D, - 10600: 0xC11E, - 10601: 0xC11F, - 10602: 0xC120, - 10603: 0xC123, - 10604: 0xC124, - 10605: 0xC126, - 10606: 0xC127, - 10607: 0xC12C, - 10608: 0xC12D, - 10609: 0xC12F, - 10610: 0xC130, - 10611: 0xC131, - 10612: 0xC136, - 10613: 0xC138, - 10614: 0xC139, - 10615: 0xC13C, - 10616: 0xC140, - 10617: 0xC148, - 10618: 0xC149, - 10619: 0xC14B, - 10620: 0xC14C, - 10621: 0xC14D, - 10622: 0xC154, - 10623: 0xC155, - 10624: 0xC158, - 10625: 0xC15C, - 10626: 0xC164, - 10627: 0xC165, - 10628: 0xC167, - 10629: 0xC168, - 10630: 0xC169, - 10631: 0xC170, - 10632: 0xC174, - 10633: 0xC178, - 10634: 0xC185, - 10635: 0xC18C, - 10636: 0xC18D, - 10637: 0xC18E, - 10638: 0xC190, - 10639: 0xC194, - 10640: 0xC196, - 10641: 0xC19C, - 10642: 0xC19D, - 10643: 0xC19F, - 10644: 0xC1A1, - 10645: 0xC1A5, - 10646: 0xC1A8, - 10647: 0xC1A9, - 10648: 0xC1AC, - 10649: 0xC1B0, - 10650: 0xC1BD, - 10651: 0xC1C4, - 10652: 0xC1C8, - 10653: 0xC1CC, - 10654: 0xC1D4, - 10655: 0xC1D7, - 10656: 0xC1D8, - 10657: 0xC1E0, - 10658: 0xC1E4, - 10659: 0xC1E8, - 10660: 0xC1F0, - 10661: 0xC1F1, - 10662: 0xC1F3, - 10663: 0xC1FC, - 10664: 0xC1FD, - 10665: 0xC200, - 10666: 0xC204, - 10667: 0xC20C, - 10668: 0xC20D, - 10669: 0xC20F, - 10670: 0xC211, - 10671: 0xC218, - 10672: 0xC219, - 10673: 0xC21C, - 10674: 0xC21F, - 10675: 0xC220, - 10676: 0xC228, - 10677: 0xC229, - 10678: 0xC22B, - 10679: 0xC22D, - 10680: 0xD3D7, - 10681: 0xD3D9, - 10682: 0xD3DA, - 10683: 0xD3DB, - 10684: 0xD3DC, - 10685: 0xD3DD, - 10686: 0xD3DE, - 10687: 0xD3DF, - 10688: 0xD3E0, - 10689: 0xD3E2, - 10690: 0xD3E4, - 10691: 0xD3E5, - 10692: 0xD3E6, - 10693: 0xD3E7, - 10694: 0xD3E8, - 10695: 0xD3E9, - 10696: 0xD3EA, - 10697: 0xD3EB, - 10698: 0xD3EE, - 10699: 0xD3EF, - 10700: 0xD3F1, - 10701: 0xD3F2, - 10702: 0xD3F3, - 10703: 0xD3F5, - 10704: 0xD3F6, - 10705: 0xD3F7, - 10706: 0xD3F8, - 10707: 0xD3F9, - 10708: 0xD3FA, - 10709: 0xD3FB, - 10710: 0xD3FE, - 10711: 0xD400, - 10712: 0xD402, - 10713: 0xD403, - 10714: 0xD404, - 10715: 0xD405, - 10716: 0xD406, - 10717: 0xD407, - 10718: 0xD409, - 10719: 0xD40A, - 10720: 0xD40B, - 10721: 0xD40C, - 10722: 0xD40D, - 10723: 0xD40E, - 10724: 0xD40F, - 10725: 0xD410, - 10726: 0xD411, - 10727: 0xD412, - 10728: 0xD413, - 10729: 0xD414, - 10730: 0xD415, - 10731: 0xD416, - 10732: 0xD417, - 10733: 0xD418, - 10734: 0xD419, - 10735: 0xD41A, - 10736: 0xD41B, - 10737: 0xD41C, - 10738: 0xD41E, - 10739: 0xD41F, - 10740: 0xD420, - 10741: 0xD421, - 10742: 0xD422, - 10743: 0xD423, - 10744: 0xD424, - 10745: 0xD425, - 10746: 0xD426, - 10747: 0xD427, - 10748: 0xD428, - 10749: 0xD429, - 10750: 0xD42A, - 10751: 0xD42B, - 10752: 0xD42C, - 10753: 0xD42D, - 10754: 0xD42E, - 10755: 0xD42F, - 10756: 0xD430, - 10757: 0xD431, - 10758: 0xD432, - 10759: 0xD433, - 10760: 0xD434, - 10761: 0xD435, - 10762: 0xD436, - 10763: 0xD437, - 10764: 0xC22F, - 10765: 0xC231, - 10766: 0xC232, - 10767: 0xC234, - 10768: 0xC248, - 10769: 0xC250, - 10770: 0xC251, - 10771: 0xC254, - 10772: 0xC258, - 10773: 0xC260, - 10774: 0xC265, - 10775: 0xC26C, - 10776: 0xC26D, - 10777: 0xC270, - 10778: 0xC274, - 10779: 0xC27C, - 10780: 0xC27D, - 10781: 0xC27F, - 10782: 0xC281, - 10783: 0xC288, - 10784: 0xC289, - 10785: 0xC290, - 10786: 0xC298, - 10787: 0xC29B, - 10788: 0xC29D, - 10789: 0xC2A4, - 10790: 0xC2A5, - 10791: 0xC2A8, - 10792: 0xC2AC, - 10793: 0xC2AD, - 10794: 0xC2B4, - 10795: 0xC2B5, - 10796: 0xC2B7, - 10797: 0xC2B9, - 10798: 0xC2DC, - 10799: 0xC2DD, - 10800: 0xC2E0, - 10801: 0xC2E3, - 10802: 0xC2E4, - 10803: 0xC2EB, - 10804: 0xC2EC, - 10805: 0xC2ED, - 10806: 0xC2EF, - 10807: 0xC2F1, - 10808: 0xC2F6, - 10809: 0xC2F8, - 10810: 0xC2F9, - 10811: 0xC2FB, - 10812: 0xC2FC, - 10813: 0xC300, - 10814: 0xC308, - 10815: 0xC309, - 10816: 0xC30C, - 10817: 0xC30D, - 10818: 0xC313, - 10819: 0xC314, - 10820: 0xC315, - 10821: 0xC318, - 10822: 0xC31C, - 10823: 0xC324, - 10824: 0xC325, - 10825: 0xC328, - 10826: 0xC329, - 10827: 0xC345, - 10828: 0xC368, - 10829: 0xC369, - 10830: 0xC36C, - 10831: 0xC370, - 10832: 0xC372, - 10833: 0xC378, - 10834: 0xC379, - 10835: 0xC37C, - 10836: 0xC37D, - 10837: 0xC384, - 10838: 0xC388, - 10839: 0xC38C, - 10840: 0xC3C0, - 10841: 0xC3D8, - 10842: 0xC3D9, - 10843: 0xC3DC, - 10844: 0xC3DF, - 10845: 0xC3E0, - 10846: 0xC3E2, - 10847: 0xC3E8, - 10848: 0xC3E9, - 10849: 0xC3ED, - 10850: 0xC3F4, - 10851: 0xC3F5, - 10852: 0xC3F8, - 10853: 0xC408, - 10854: 0xC410, - 10855: 0xC424, - 10856: 0xC42C, - 10857: 0xC430, - 10858: 0xD438, - 10859: 0xD439, - 10860: 0xD43A, - 10861: 0xD43B, - 10862: 0xD43C, - 10863: 0xD43D, - 10864: 0xD43E, - 10865: 0xD43F, - 10866: 0xD441, - 10867: 0xD442, - 10868: 0xD443, - 10869: 0xD445, - 10870: 0xD446, - 10871: 0xD447, - 10872: 0xD448, - 10873: 0xD449, - 10874: 0xD44A, - 10875: 0xD44B, - 10876: 0xD44C, - 10877: 0xD44D, - 10878: 0xD44E, - 10879: 0xD44F, - 10880: 0xD450, - 10881: 0xD451, - 10882: 0xD452, - 10883: 0xD453, - 10884: 0xD454, - 10885: 0xD455, - 10886: 0xD456, - 10887: 0xD457, - 10888: 0xD458, - 10889: 0xD459, - 10890: 0xD45A, - 10891: 0xD45B, - 10892: 0xD45D, - 10893: 0xD45E, - 10894: 0xD45F, - 10895: 0xD461, - 10896: 0xD462, - 10897: 0xD463, - 10898: 0xD465, - 10899: 0xD466, - 10900: 0xD467, - 10901: 0xD468, - 10902: 0xD469, - 10903: 0xD46A, - 10904: 0xD46B, - 10905: 0xD46C, - 10906: 0xD46E, - 10907: 0xD470, - 10908: 0xD471, - 10909: 0xD472, - 10910: 0xD473, - 10911: 0xD474, - 10912: 0xD475, - 10913: 0xD476, - 10914: 0xD477, - 10915: 0xD47A, - 10916: 0xD47B, - 10917: 0xD47D, - 10918: 0xD47E, - 10919: 0xD481, - 10920: 0xD483, - 10921: 0xD484, - 10922: 0xD485, - 10923: 0xD486, - 10924: 0xD487, - 10925: 0xD48A, - 10926: 0xD48C, - 10927: 0xD48E, - 10928: 0xD48F, - 10929: 0xD490, - 10930: 0xD491, - 10931: 0xD492, - 10932: 0xD493, - 10933: 0xD495, - 10934: 0xD496, - 10935: 0xD497, - 10936: 0xD498, - 10937: 0xD499, - 10938: 0xD49A, - 10939: 0xD49B, - 10940: 0xD49C, - 10941: 0xD49D, - 10942: 0xC434, - 10943: 0xC43C, - 10944: 0xC43D, - 10945: 0xC448, - 10946: 0xC464, - 10947: 0xC465, - 10948: 0xC468, - 10949: 0xC46C, - 10950: 0xC474, - 10951: 0xC475, - 10952: 0xC479, - 10953: 0xC480, - 10954: 0xC494, - 10955: 0xC49C, - 10956: 0xC4B8, - 10957: 0xC4BC, - 10958: 0xC4E9, - 10959: 0xC4F0, - 10960: 0xC4F1, - 10961: 0xC4F4, - 10962: 0xC4F8, - 10963: 0xC4FA, - 10964: 0xC4FF, - 10965: 0xC500, - 10966: 0xC501, - 10967: 0xC50C, - 10968: 0xC510, - 10969: 0xC514, - 10970: 0xC51C, - 10971: 0xC528, - 10972: 0xC529, - 10973: 0xC52C, - 10974: 0xC530, - 10975: 0xC538, - 10976: 0xC539, - 10977: 0xC53B, - 10978: 0xC53D, - 10979: 0xC544, - 10980: 0xC545, - 10981: 0xC548, - 10982: 0xC549, - 10983: 0xC54A, - 10984: 0xC54C, - 10985: 0xC54D, - 10986: 0xC54E, - 10987: 0xC553, - 10988: 0xC554, - 10989: 0xC555, - 10990: 0xC557, - 10991: 0xC558, - 10992: 0xC559, - 10993: 0xC55D, - 10994: 0xC55E, - 10995: 0xC560, - 10996: 0xC561, - 10997: 0xC564, - 10998: 0xC568, - 10999: 0xC570, - 11000: 0xC571, - 11001: 0xC573, - 11002: 0xC574, - 11003: 0xC575, - 11004: 0xC57C, - 11005: 0xC57D, - 11006: 0xC580, - 11007: 0xC584, - 11008: 0xC587, - 11009: 0xC58C, - 11010: 0xC58D, - 11011: 0xC58F, - 11012: 0xC591, - 11013: 0xC595, - 11014: 0xC597, - 11015: 0xC598, - 11016: 0xC59C, - 11017: 0xC5A0, - 11018: 0xC5A9, - 11019: 0xC5B4, - 11020: 0xC5B5, - 11021: 0xC5B8, - 11022: 0xC5B9, - 11023: 0xC5BB, - 11024: 0xC5BC, - 11025: 0xC5BD, - 11026: 0xC5BE, - 11027: 0xC5C4, - 11028: 0xC5C5, - 11029: 0xC5C6, - 11030: 0xC5C7, - 11031: 0xC5C8, - 11032: 0xC5C9, - 11033: 0xC5CA, - 11034: 0xC5CC, - 11035: 0xC5CE, - 11036: 0xD49E, - 11037: 0xD49F, - 11038: 0xD4A0, - 11039: 0xD4A1, - 11040: 0xD4A2, - 11041: 0xD4A3, - 11042: 0xD4A4, - 11043: 0xD4A5, - 11044: 0xD4A6, - 11045: 0xD4A7, - 11046: 0xD4A8, - 11047: 0xD4AA, - 11048: 0xD4AB, - 11049: 0xD4AC, - 11050: 0xD4AD, - 11051: 0xD4AE, - 11052: 0xD4AF, - 11053: 0xD4B0, - 11054: 0xD4B1, - 11055: 0xD4B2, - 11056: 0xD4B3, - 11057: 0xD4B4, - 11058: 0xD4B5, - 11059: 0xD4B6, - 11060: 0xD4B7, - 11061: 0xD4B8, - 11062: 0xD4B9, - 11063: 0xD4BA, - 11064: 0xD4BB, - 11065: 0xD4BC, - 11066: 0xD4BD, - 11067: 0xD4BE, - 11068: 0xD4BF, - 11069: 0xD4C0, - 11070: 0xD4C1, - 11071: 0xD4C2, - 11072: 0xD4C3, - 11073: 0xD4C4, - 11074: 0xD4C5, - 11075: 0xD4C6, - 11076: 0xD4C7, - 11077: 0xD4C8, - 11078: 0xD4C9, - 11079: 0xD4CA, - 11080: 0xD4CB, - 11081: 0xD4CD, - 11082: 0xD4CE, - 11083: 0xD4CF, - 11084: 0xD4D1, - 11085: 0xD4D2, - 11086: 0xD4D3, - 11087: 0xD4D5, - 11088: 0xD4D6, - 11089: 0xD4D7, - 11090: 0xD4D8, - 11091: 0xD4D9, - 11092: 0xD4DA, - 11093: 0xD4DB, - 11094: 0xD4DD, - 11095: 0xD4DE, - 11096: 0xD4E0, - 11097: 0xD4E1, - 11098: 0xD4E2, - 11099: 0xD4E3, - 11100: 0xD4E4, - 11101: 0xD4E5, - 11102: 0xD4E6, - 11103: 0xD4E7, - 11104: 0xD4E9, - 11105: 0xD4EA, - 11106: 0xD4EB, - 11107: 0xD4ED, - 11108: 0xD4EE, - 11109: 0xD4EF, - 11110: 0xD4F1, - 11111: 0xD4F2, - 11112: 0xD4F3, - 11113: 0xD4F4, - 11114: 0xD4F5, - 11115: 0xD4F6, - 11116: 0xD4F7, - 11117: 0xD4F9, - 11118: 0xD4FA, - 11119: 0xD4FC, - 11120: 0xC5D0, - 11121: 0xC5D1, - 11122: 0xC5D4, - 11123: 0xC5D8, - 11124: 0xC5E0, - 11125: 0xC5E1, - 11126: 0xC5E3, - 11127: 0xC5E5, - 11128: 0xC5EC, - 11129: 0xC5ED, - 11130: 0xC5EE, - 11131: 0xC5F0, - 11132: 0xC5F4, - 11133: 0xC5F6, - 11134: 0xC5F7, - 11135: 0xC5FC, - 11136: 0xC5FD, - 11137: 0xC5FE, - 11138: 0xC5FF, - 11139: 0xC600, - 11140: 0xC601, - 11141: 0xC605, - 11142: 0xC606, - 11143: 0xC607, - 11144: 0xC608, - 11145: 0xC60C, - 11146: 0xC610, - 11147: 0xC618, - 11148: 0xC619, - 11149: 0xC61B, - 11150: 0xC61C, - 11151: 0xC624, - 11152: 0xC625, - 11153: 0xC628, - 11154: 0xC62C, - 11155: 0xC62D, - 11156: 0xC62E, - 11157: 0xC630, - 11158: 0xC633, - 11159: 0xC634, - 11160: 0xC635, - 11161: 0xC637, - 11162: 0xC639, - 11163: 0xC63B, - 11164: 0xC640, - 11165: 0xC641, - 11166: 0xC644, - 11167: 0xC648, - 11168: 0xC650, - 11169: 0xC651, - 11170: 0xC653, - 11171: 0xC654, - 11172: 0xC655, - 11173: 0xC65C, - 11174: 0xC65D, - 11175: 0xC660, - 11176: 0xC66C, - 11177: 0xC66F, - 11178: 0xC671, - 11179: 0xC678, - 11180: 0xC679, - 11181: 0xC67C, - 11182: 0xC680, - 11183: 0xC688, - 11184: 0xC689, - 11185: 0xC68B, - 11186: 0xC68D, - 11187: 0xC694, - 11188: 0xC695, - 11189: 0xC698, - 11190: 0xC69C, - 11191: 0xC6A4, - 11192: 0xC6A5, - 11193: 0xC6A7, - 11194: 0xC6A9, - 11195: 0xC6B0, - 11196: 0xC6B1, - 11197: 0xC6B4, - 11198: 0xC6B8, - 11199: 0xC6B9, - 11200: 0xC6BA, - 11201: 0xC6C0, - 11202: 0xC6C1, - 11203: 0xC6C3, - 11204: 0xC6C5, - 11205: 0xC6CC, - 11206: 0xC6CD, - 11207: 0xC6D0, - 11208: 0xC6D4, - 11209: 0xC6DC, - 11210: 0xC6DD, - 11211: 0xC6E0, - 11212: 0xC6E1, - 11213: 0xC6E8, - 11214: 0xD4FE, - 11215: 0xD4FF, - 11216: 0xD500, - 11217: 0xD501, - 11218: 0xD502, - 11219: 0xD503, - 11220: 0xD505, - 11221: 0xD506, - 11222: 0xD507, - 11223: 0xD509, - 11224: 0xD50A, - 11225: 0xD50B, - 11226: 0xD50D, - 11227: 0xD50E, - 11228: 0xD50F, - 11229: 0xD510, - 11230: 0xD511, - 11231: 0xD512, - 11232: 0xD513, - 11233: 0xD516, - 11234: 0xD518, - 11235: 0xD519, - 11236: 0xD51A, - 11237: 0xD51B, - 11238: 0xD51C, - 11239: 0xD51D, - 11240: 0xD51E, - 11241: 0xD51F, - 11242: 0xD520, - 11243: 0xD521, - 11244: 0xD522, - 11245: 0xD523, - 11246: 0xD524, - 11247: 0xD525, - 11248: 0xD526, - 11249: 0xD527, - 11250: 0xD528, - 11251: 0xD529, - 11252: 0xD52A, - 11253: 0xD52B, - 11254: 0xD52C, - 11255: 0xD52D, - 11256: 0xD52E, - 11257: 0xD52F, - 11258: 0xD530, - 11259: 0xD531, - 11260: 0xD532, - 11261: 0xD533, - 11262: 0xD534, - 11263: 0xD535, - 11264: 0xD536, - 11265: 0xD537, - 11266: 0xD538, - 11267: 0xD539, - 11268: 0xD53A, - 11269: 0xD53B, - 11270: 0xD53E, - 11271: 0xD53F, - 11272: 0xD541, - 11273: 0xD542, - 11274: 0xD543, - 11275: 0xD545, - 11276: 0xD546, - 11277: 0xD547, - 11278: 0xD548, - 11279: 0xD549, - 11280: 0xD54A, - 11281: 0xD54B, - 11282: 0xD54E, - 11283: 0xD550, - 11284: 0xD552, - 11285: 0xD553, - 11286: 0xD554, - 11287: 0xD555, - 11288: 0xD556, - 11289: 0xD557, - 11290: 0xD55A, - 11291: 0xD55B, - 11292: 0xD55D, - 11293: 0xD55E, - 11294: 0xD55F, - 11295: 0xD561, - 11296: 0xD562, - 11297: 0xD563, - 11298: 0xC6E9, - 11299: 0xC6EC, - 11300: 0xC6F0, - 11301: 0xC6F8, - 11302: 0xC6F9, - 11303: 0xC6FD, - 11304: 0xC704, - 11305: 0xC705, - 11306: 0xC708, - 11307: 0xC70C, - 11308: 0xC714, - 11309: 0xC715, - 11310: 0xC717, - 11311: 0xC719, - 11312: 0xC720, - 11313: 0xC721, - 11314: 0xC724, - 11315: 0xC728, - 11316: 0xC730, - 11317: 0xC731, - 11318: 0xC733, - 11319: 0xC735, - 11320: 0xC737, - 11321: 0xC73C, - 11322: 0xC73D, - 11323: 0xC740, - 11324: 0xC744, - 11325: 0xC74A, - 11326: 0xC74C, - 11327: 0xC74D, - 11328: 0xC74F, - 11329: 0xC751, - 11330: 0xC752, - 11331: 0xC753, - 11332: 0xC754, - 11333: 0xC755, - 11334: 0xC756, - 11335: 0xC757, - 11336: 0xC758, - 11337: 0xC75C, - 11338: 0xC760, - 11339: 0xC768, - 11340: 0xC76B, - 11341: 0xC774, - 11342: 0xC775, - 11343: 0xC778, - 11344: 0xC77C, - 11345: 0xC77D, - 11346: 0xC77E, - 11347: 0xC783, - 11348: 0xC784, - 11349: 0xC785, - 11350: 0xC787, - 11351: 0xC788, - 11352: 0xC789, - 11353: 0xC78A, - 11354: 0xC78E, - 11355: 0xC790, - 11356: 0xC791, - 11357: 0xC794, - 11358: 0xC796, - 11359: 0xC797, - 11360: 0xC798, - 11361: 0xC79A, - 11362: 0xC7A0, - 11363: 0xC7A1, - 11364: 0xC7A3, - 11365: 0xC7A4, - 11366: 0xC7A5, - 11367: 0xC7A6, - 11368: 0xC7AC, - 11369: 0xC7AD, - 11370: 0xC7B0, - 11371: 0xC7B4, - 11372: 0xC7BC, - 11373: 0xC7BD, - 11374: 0xC7BF, - 11375: 0xC7C0, - 11376: 0xC7C1, - 11377: 0xC7C8, - 11378: 0xC7C9, - 11379: 0xC7CC, - 11380: 0xC7CE, - 11381: 0xC7D0, - 11382: 0xC7D8, - 11383: 0xC7DD, - 11384: 0xC7E4, - 11385: 0xC7E8, - 11386: 0xC7EC, - 11387: 0xC800, - 11388: 0xC801, - 11389: 0xC804, - 11390: 0xC808, - 11391: 0xC80A, - 11392: 0xD564, - 11393: 0xD566, - 11394: 0xD567, - 11395: 0xD56A, - 11396: 0xD56C, - 11397: 0xD56E, - 11398: 0xD56F, - 11399: 0xD570, - 11400: 0xD571, - 11401: 0xD572, - 11402: 0xD573, - 11403: 0xD576, - 11404: 0xD577, - 11405: 0xD579, - 11406: 0xD57A, - 11407: 0xD57B, - 11408: 0xD57D, - 11409: 0xD57E, - 11410: 0xD57F, - 11411: 0xD580, - 11412: 0xD581, - 11413: 0xD582, - 11414: 0xD583, - 11415: 0xD586, - 11416: 0xD58A, - 11417: 0xD58B, - 11418: 0xD58C, - 11419: 0xD58D, - 11420: 0xD58E, - 11421: 0xD58F, - 11422: 0xD591, - 11423: 0xD592, - 11424: 0xD593, - 11425: 0xD594, - 11426: 0xD595, - 11427: 0xD596, - 11428: 0xD597, - 11429: 0xD598, - 11430: 0xD599, - 11431: 0xD59A, - 11432: 0xD59B, - 11433: 0xD59C, - 11434: 0xD59D, - 11435: 0xD59E, - 11436: 0xD59F, - 11437: 0xD5A0, - 11438: 0xD5A1, - 11439: 0xD5A2, - 11440: 0xD5A3, - 11441: 0xD5A4, - 11442: 0xD5A6, - 11443: 0xD5A7, - 11444: 0xD5A8, - 11445: 0xD5A9, - 11446: 0xD5AA, - 11447: 0xD5AB, - 11448: 0xD5AC, - 11449: 0xD5AD, - 11450: 0xD5AE, - 11451: 0xD5AF, - 11452: 0xD5B0, - 11453: 0xD5B1, - 11454: 0xD5B2, - 11455: 0xD5B3, - 11456: 0xD5B4, - 11457: 0xD5B5, - 11458: 0xD5B6, - 11459: 0xD5B7, - 11460: 0xD5B8, - 11461: 0xD5B9, - 11462: 0xD5BA, - 11463: 0xD5BB, - 11464: 0xD5BC, - 11465: 0xD5BD, - 11466: 0xD5BE, - 11467: 0xD5BF, - 11468: 0xD5C0, - 11469: 0xD5C1, - 11470: 0xD5C2, - 11471: 0xD5C3, - 11472: 0xD5C4, - 11473: 0xD5C5, - 11474: 0xD5C6, - 11475: 0xD5C7, - 11476: 0xC810, - 11477: 0xC811, - 11478: 0xC813, - 11479: 0xC815, - 11480: 0xC816, - 11481: 0xC81C, - 11482: 0xC81D, - 11483: 0xC820, - 11484: 0xC824, - 11485: 0xC82C, - 11486: 0xC82D, - 11487: 0xC82F, - 11488: 0xC831, - 11489: 0xC838, - 11490: 0xC83C, - 11491: 0xC840, - 11492: 0xC848, - 11493: 0xC849, - 11494: 0xC84C, - 11495: 0xC84D, - 11496: 0xC854, - 11497: 0xC870, - 11498: 0xC871, - 11499: 0xC874, - 11500: 0xC878, - 11501: 0xC87A, - 11502: 0xC880, - 11503: 0xC881, - 11504: 0xC883, - 11505: 0xC885, - 11506: 0xC886, - 11507: 0xC887, - 11508: 0xC88B, - 11509: 0xC88C, - 11510: 0xC88D, - 11511: 0xC894, - 11512: 0xC89D, - 11513: 0xC89F, - 11514: 0xC8A1, - 11515: 0xC8A8, - 11516: 0xC8BC, - 11517: 0xC8BD, - 11518: 0xC8C4, - 11519: 0xC8C8, - 11520: 0xC8CC, - 11521: 0xC8D4, - 11522: 0xC8D5, - 11523: 0xC8D7, - 11524: 0xC8D9, - 11525: 0xC8E0, - 11526: 0xC8E1, - 11527: 0xC8E4, - 11528: 0xC8F5, - 11529: 0xC8FC, - 11530: 0xC8FD, - 11531: 0xC900, - 11532: 0xC904, - 11533: 0xC905, - 11534: 0xC906, - 11535: 0xC90C, - 11536: 0xC90D, - 11537: 0xC90F, - 11538: 0xC911, - 11539: 0xC918, - 11540: 0xC92C, - 11541: 0xC934, - 11542: 0xC950, - 11543: 0xC951, - 11544: 0xC954, - 11545: 0xC958, - 11546: 0xC960, - 11547: 0xC961, - 11548: 0xC963, - 11549: 0xC96C, - 11550: 0xC970, - 11551: 0xC974, - 11552: 0xC97C, - 11553: 0xC988, - 11554: 0xC989, - 11555: 0xC98C, - 11556: 0xC990, - 11557: 0xC998, - 11558: 0xC999, - 11559: 0xC99B, - 11560: 0xC99D, - 11561: 0xC9C0, - 11562: 0xC9C1, - 11563: 0xC9C4, - 11564: 0xC9C7, - 11565: 0xC9C8, - 11566: 0xC9CA, - 11567: 0xC9D0, - 11568: 0xC9D1, - 11569: 0xC9D3, - 11570: 0xD5CA, - 11571: 0xD5CB, - 11572: 0xD5CD, - 11573: 0xD5CE, - 11574: 0xD5CF, - 11575: 0xD5D1, - 11576: 0xD5D3, - 11577: 0xD5D4, - 11578: 0xD5D5, - 11579: 0xD5D6, - 11580: 0xD5D7, - 11581: 0xD5DA, - 11582: 0xD5DC, - 11583: 0xD5DE, - 11584: 0xD5DF, - 11585: 0xD5E0, - 11586: 0xD5E1, - 11587: 0xD5E2, - 11588: 0xD5E3, - 11589: 0xD5E6, - 11590: 0xD5E7, - 11591: 0xD5E9, - 11592: 0xD5EA, - 11593: 0xD5EB, - 11594: 0xD5ED, - 11595: 0xD5EE, - 11596: 0xD5EF, - 11597: 0xD5F0, - 11598: 0xD5F1, - 11599: 0xD5F2, - 11600: 0xD5F3, - 11601: 0xD5F6, - 11602: 0xD5F8, - 11603: 0xD5FA, - 11604: 0xD5FB, - 11605: 0xD5FC, - 11606: 0xD5FD, - 11607: 0xD5FE, - 11608: 0xD5FF, - 11609: 0xD602, - 11610: 0xD603, - 11611: 0xD605, - 11612: 0xD606, - 11613: 0xD607, - 11614: 0xD609, - 11615: 0xD60A, - 11616: 0xD60B, - 11617: 0xD60C, - 11618: 0xD60D, - 11619: 0xD60E, - 11620: 0xD60F, - 11621: 0xD612, - 11622: 0xD616, - 11623: 0xD617, - 11624: 0xD618, - 11625: 0xD619, - 11626: 0xD61A, - 11627: 0xD61B, - 11628: 0xD61D, - 11629: 0xD61E, - 11630: 0xD61F, - 11631: 0xD621, - 11632: 0xD622, - 11633: 0xD623, - 11634: 0xD625, - 11635: 0xD626, - 11636: 0xD627, - 11637: 0xD628, - 11638: 0xD629, - 11639: 0xD62A, - 11640: 0xD62B, - 11641: 0xD62C, - 11642: 0xD62E, - 11643: 0xD62F, - 11644: 0xD630, - 11645: 0xD631, - 11646: 0xD632, - 11647: 0xD633, - 11648: 0xD634, - 11649: 0xD635, - 11650: 0xD636, - 11651: 0xD637, - 11652: 0xD63A, - 11653: 0xD63B, - 11654: 0xC9D5, - 11655: 0xC9D6, - 11656: 0xC9D9, - 11657: 0xC9DA, - 11658: 0xC9DC, - 11659: 0xC9DD, - 11660: 0xC9E0, - 11661: 0xC9E2, - 11662: 0xC9E4, - 11663: 0xC9E7, - 11664: 0xC9EC, - 11665: 0xC9ED, - 11666: 0xC9EF, - 11667: 0xC9F0, - 11668: 0xC9F1, - 11669: 0xC9F8, - 11670: 0xC9F9, - 11671: 0xC9FC, - 11672: 0xCA00, - 11673: 0xCA08, - 11674: 0xCA09, - 11675: 0xCA0B, - 11676: 0xCA0C, - 11677: 0xCA0D, - 11678: 0xCA14, - 11679: 0xCA18, - 11680: 0xCA29, - 11681: 0xCA4C, - 11682: 0xCA4D, - 11683: 0xCA50, - 11684: 0xCA54, - 11685: 0xCA5C, - 11686: 0xCA5D, - 11687: 0xCA5F, - 11688: 0xCA60, - 11689: 0xCA61, - 11690: 0xCA68, - 11691: 0xCA7D, - 11692: 0xCA84, - 11693: 0xCA98, - 11694: 0xCABC, - 11695: 0xCABD, - 11696: 0xCAC0, - 11697: 0xCAC4, - 11698: 0xCACC, - 11699: 0xCACD, - 11700: 0xCACF, - 11701: 0xCAD1, - 11702: 0xCAD3, - 11703: 0xCAD8, - 11704: 0xCAD9, - 11705: 0xCAE0, - 11706: 0xCAEC, - 11707: 0xCAF4, - 11708: 0xCB08, - 11709: 0xCB10, - 11710: 0xCB14, - 11711: 0xCB18, - 11712: 0xCB20, - 11713: 0xCB21, - 11714: 0xCB41, - 11715: 0xCB48, - 11716: 0xCB49, - 11717: 0xCB4C, - 11718: 0xCB50, - 11719: 0xCB58, - 11720: 0xCB59, - 11721: 0xCB5D, - 11722: 0xCB64, - 11723: 0xCB78, - 11724: 0xCB79, - 11725: 0xCB9C, - 11726: 0xCBB8, - 11727: 0xCBD4, - 11728: 0xCBE4, - 11729: 0xCBE7, - 11730: 0xCBE9, - 11731: 0xCC0C, - 11732: 0xCC0D, - 11733: 0xCC10, - 11734: 0xCC14, - 11735: 0xCC1C, - 11736: 0xCC1D, - 11737: 0xCC21, - 11738: 0xCC22, - 11739: 0xCC27, - 11740: 0xCC28, - 11741: 0xCC29, - 11742: 0xCC2C, - 11743: 0xCC2E, - 11744: 0xCC30, - 11745: 0xCC38, - 11746: 0xCC39, - 11747: 0xCC3B, - 11748: 0xD63D, - 11749: 0xD63E, - 11750: 0xD63F, - 11751: 0xD641, - 11752: 0xD642, - 11753: 0xD643, - 11754: 0xD644, - 11755: 0xD646, - 11756: 0xD647, - 11757: 0xD64A, - 11758: 0xD64C, - 11759: 0xD64E, - 11760: 0xD64F, - 11761: 0xD650, - 11762: 0xD652, - 11763: 0xD653, - 11764: 0xD656, - 11765: 0xD657, - 11766: 0xD659, - 11767: 0xD65A, - 11768: 0xD65B, - 11769: 0xD65D, - 11770: 0xD65E, - 11771: 0xD65F, - 11772: 0xD660, - 11773: 0xD661, - 11774: 0xD662, - 11775: 0xD663, - 11776: 0xD664, - 11777: 0xD665, - 11778: 0xD666, - 11779: 0xD668, - 11780: 0xD66A, - 11781: 0xD66B, - 11782: 0xD66C, - 11783: 0xD66D, - 11784: 0xD66E, - 11785: 0xD66F, - 11786: 0xD672, - 11787: 0xD673, - 11788: 0xD675, - 11789: 0xD676, - 11790: 0xD677, - 11791: 0xD678, - 11792: 0xD679, - 11793: 0xD67A, - 11794: 0xD67B, - 11795: 0xD67C, - 11796: 0xD67D, - 11797: 0xD67E, - 11798: 0xD67F, - 11799: 0xD680, - 11800: 0xD681, - 11801: 0xD682, - 11802: 0xD684, - 11803: 0xD686, - 11804: 0xD687, - 11805: 0xD688, - 11806: 0xD689, - 11807: 0xD68A, - 11808: 0xD68B, - 11809: 0xD68E, - 11810: 0xD68F, - 11811: 0xD691, - 11812: 0xD692, - 11813: 0xD693, - 11814: 0xD695, - 11815: 0xD696, - 11816: 0xD697, - 11817: 0xD698, - 11818: 0xD699, - 11819: 0xD69A, - 11820: 0xD69B, - 11821: 0xD69C, - 11822: 0xD69E, - 11823: 0xD6A0, - 11824: 0xD6A2, - 11825: 0xD6A3, - 11826: 0xD6A4, - 11827: 0xD6A5, - 11828: 0xD6A6, - 11829: 0xD6A7, - 11830: 0xD6A9, - 11831: 0xD6AA, - 11832: 0xCC3C, - 11833: 0xCC3D, - 11834: 0xCC3E, - 11835: 0xCC44, - 11836: 0xCC45, - 11837: 0xCC48, - 11838: 0xCC4C, - 11839: 0xCC54, - 11840: 0xCC55, - 11841: 0xCC57, - 11842: 0xCC58, - 11843: 0xCC59, - 11844: 0xCC60, - 11845: 0xCC64, - 11846: 0xCC66, - 11847: 0xCC68, - 11848: 0xCC70, - 11849: 0xCC75, - 11850: 0xCC98, - 11851: 0xCC99, - 11852: 0xCC9C, - 11853: 0xCCA0, - 11854: 0xCCA8, - 11855: 0xCCA9, - 11856: 0xCCAB, - 11857: 0xCCAC, - 11858: 0xCCAD, - 11859: 0xCCB4, - 11860: 0xCCB5, - 11861: 0xCCB8, - 11862: 0xCCBC, - 11863: 0xCCC4, - 11864: 0xCCC5, - 11865: 0xCCC7, - 11866: 0xCCC9, - 11867: 0xCCD0, - 11868: 0xCCD4, - 11869: 0xCCE4, - 11870: 0xCCEC, - 11871: 0xCCF0, - 11872: 0xCD01, - 11873: 0xCD08, - 11874: 0xCD09, - 11875: 0xCD0C, - 11876: 0xCD10, - 11877: 0xCD18, - 11878: 0xCD19, - 11879: 0xCD1B, - 11880: 0xCD1D, - 11881: 0xCD24, - 11882: 0xCD28, - 11883: 0xCD2C, - 11884: 0xCD39, - 11885: 0xCD5C, - 11886: 0xCD60, - 11887: 0xCD64, - 11888: 0xCD6C, - 11889: 0xCD6D, - 11890: 0xCD6F, - 11891: 0xCD71, - 11892: 0xCD78, - 11893: 0xCD88, - 11894: 0xCD94, - 11895: 0xCD95, - 11896: 0xCD98, - 11897: 0xCD9C, - 11898: 0xCDA4, - 11899: 0xCDA5, - 11900: 0xCDA7, - 11901: 0xCDA9, - 11902: 0xCDB0, - 11903: 0xCDC4, - 11904: 0xCDCC, - 11905: 0xCDD0, - 11906: 0xCDE8, - 11907: 0xCDEC, - 11908: 0xCDF0, - 11909: 0xCDF8, - 11910: 0xCDF9, - 11911: 0xCDFB, - 11912: 0xCDFD, - 11913: 0xCE04, - 11914: 0xCE08, - 11915: 0xCE0C, - 11916: 0xCE14, - 11917: 0xCE19, - 11918: 0xCE20, - 11919: 0xCE21, - 11920: 0xCE24, - 11921: 0xCE28, - 11922: 0xCE30, - 11923: 0xCE31, - 11924: 0xCE33, - 11925: 0xCE35, - 11926: 0xD6AB, - 11927: 0xD6AD, - 11928: 0xD6AE, - 11929: 0xD6AF, - 11930: 0xD6B1, - 11931: 0xD6B2, - 11932: 0xD6B3, - 11933: 0xD6B4, - 11934: 0xD6B5, - 11935: 0xD6B6, - 11936: 0xD6B7, - 11937: 0xD6B8, - 11938: 0xD6BA, - 11939: 0xD6BC, - 11940: 0xD6BD, - 11941: 0xD6BE, - 11942: 0xD6BF, - 11943: 0xD6C0, - 11944: 0xD6C1, - 11945: 0xD6C2, - 11946: 0xD6C3, - 11947: 0xD6C6, - 11948: 0xD6C7, - 11949: 0xD6C9, - 11950: 0xD6CA, - 11951: 0xD6CB, - 11952: 0xD6CD, - 11953: 0xD6CE, - 11954: 0xD6CF, - 11955: 0xD6D0, - 11956: 0xD6D2, - 11957: 0xD6D3, - 11958: 0xD6D5, - 11959: 0xD6D6, - 11960: 0xD6D8, - 11961: 0xD6DA, - 11962: 0xD6DB, - 11963: 0xD6DC, - 11964: 0xD6DD, - 11965: 0xD6DE, - 11966: 0xD6DF, - 11967: 0xD6E1, - 11968: 0xD6E2, - 11969: 0xD6E3, - 11970: 0xD6E5, - 11971: 0xD6E6, - 11972: 0xD6E7, - 11973: 0xD6E9, - 11974: 0xD6EA, - 11975: 0xD6EB, - 11976: 0xD6EC, - 11977: 0xD6ED, - 11978: 0xD6EE, - 11979: 0xD6EF, - 11980: 0xD6F1, - 11981: 0xD6F2, - 11982: 0xD6F3, - 11983: 0xD6F4, - 11984: 0xD6F6, - 11985: 0xD6F7, - 11986: 0xD6F8, - 11987: 0xD6F9, - 11988: 0xD6FA, - 11989: 0xD6FB, - 11990: 0xD6FE, - 11991: 0xD6FF, - 11992: 0xD701, - 11993: 0xD702, - 11994: 0xD703, - 11995: 0xD705, - 11996: 0xD706, - 11997: 0xD707, - 11998: 0xD708, - 11999: 0xD709, - 12000: 0xD70A, - 12001: 0xD70B, - 12002: 0xD70C, - 12003: 0xD70D, - 12004: 0xD70E, - 12005: 0xD70F, - 12006: 0xD710, - 12007: 0xD712, - 12008: 0xD713, - 12009: 0xD714, - 12010: 0xCE58, - 12011: 0xCE59, - 12012: 0xCE5C, - 12013: 0xCE5F, - 12014: 0xCE60, - 12015: 0xCE61, - 12016: 0xCE68, - 12017: 0xCE69, - 12018: 0xCE6B, - 12019: 0xCE6D, - 12020: 0xCE74, - 12021: 0xCE75, - 12022: 0xCE78, - 12023: 0xCE7C, - 12024: 0xCE84, - 12025: 0xCE85, - 12026: 0xCE87, - 12027: 0xCE89, - 12028: 0xCE90, - 12029: 0xCE91, - 12030: 0xCE94, - 12031: 0xCE98, - 12032: 0xCEA0, - 12033: 0xCEA1, - 12034: 0xCEA3, - 12035: 0xCEA4, - 12036: 0xCEA5, - 12037: 0xCEAC, - 12038: 0xCEAD, - 12039: 0xCEC1, - 12040: 0xCEE4, - 12041: 0xCEE5, - 12042: 0xCEE8, - 12043: 0xCEEB, - 12044: 0xCEEC, - 12045: 0xCEF4, - 12046: 0xCEF5, - 12047: 0xCEF7, - 12048: 0xCEF8, - 12049: 0xCEF9, - 12050: 0xCF00, - 12051: 0xCF01, - 12052: 0xCF04, - 12053: 0xCF08, - 12054: 0xCF10, - 12055: 0xCF11, - 12056: 0xCF13, - 12057: 0xCF15, - 12058: 0xCF1C, - 12059: 0xCF20, - 12060: 0xCF24, - 12061: 0xCF2C, - 12062: 0xCF2D, - 12063: 0xCF2F, - 12064: 0xCF30, - 12065: 0xCF31, - 12066: 0xCF38, - 12067: 0xCF54, - 12068: 0xCF55, - 12069: 0xCF58, - 12070: 0xCF5C, - 12071: 0xCF64, - 12072: 0xCF65, - 12073: 0xCF67, - 12074: 0xCF69, - 12075: 0xCF70, - 12076: 0xCF71, - 12077: 0xCF74, - 12078: 0xCF78, - 12079: 0xCF80, - 12080: 0xCF85, - 12081: 0xCF8C, - 12082: 0xCFA1, - 12083: 0xCFA8, - 12084: 0xCFB0, - 12085: 0xCFC4, - 12086: 0xCFE0, - 12087: 0xCFE1, - 12088: 0xCFE4, - 12089: 0xCFE8, - 12090: 0xCFF0, - 12091: 0xCFF1, - 12092: 0xCFF3, - 12093: 0xCFF5, - 12094: 0xCFFC, - 12095: 0xD000, - 12096: 0xD004, - 12097: 0xD011, - 12098: 0xD018, - 12099: 0xD02D, - 12100: 0xD034, - 12101: 0xD035, - 12102: 0xD038, - 12103: 0xD03C, - 12104: 0xD715, - 12105: 0xD716, - 12106: 0xD717, - 12107: 0xD71A, - 12108: 0xD71B, - 12109: 0xD71D, - 12110: 0xD71E, - 12111: 0xD71F, - 12112: 0xD721, - 12113: 0xD722, - 12114: 0xD723, - 12115: 0xD724, - 12116: 0xD725, - 12117: 0xD726, - 12118: 0xD727, - 12119: 0xD72A, - 12120: 0xD72C, - 12121: 0xD72E, - 12122: 0xD72F, - 12123: 0xD730, - 12124: 0xD731, - 12125: 0xD732, - 12126: 0xD733, - 12127: 0xD736, - 12128: 0xD737, - 12129: 0xD739, - 12130: 0xD73A, - 12131: 0xD73B, - 12132: 0xD73D, - 12133: 0xD73E, - 12134: 0xD73F, - 12135: 0xD740, - 12136: 0xD741, - 12137: 0xD742, - 12138: 0xD743, - 12139: 0xD745, - 12140: 0xD746, - 12141: 0xD748, - 12142: 0xD74A, - 12143: 0xD74B, - 12144: 0xD74C, - 12145: 0xD74D, - 12146: 0xD74E, - 12147: 0xD74F, - 12148: 0xD752, - 12149: 0xD753, - 12150: 0xD755, - 12151: 0xD75A, - 12152: 0xD75B, - 12153: 0xD75C, - 12154: 0xD75D, - 12155: 0xD75E, - 12156: 0xD75F, - 12157: 0xD762, - 12158: 0xD764, - 12159: 0xD766, - 12160: 0xD767, - 12161: 0xD768, - 12162: 0xD76A, - 12163: 0xD76B, - 12164: 0xD76D, - 12165: 0xD76E, - 12166: 0xD76F, - 12167: 0xD771, - 12168: 0xD772, - 12169: 0xD773, - 12170: 0xD775, - 12171: 0xD776, - 12172: 0xD777, - 12173: 0xD778, - 12174: 0xD779, - 12175: 0xD77A, - 12176: 0xD77B, - 12177: 0xD77E, - 12178: 0xD77F, - 12179: 0xD780, - 12180: 0xD782, - 12181: 0xD783, - 12182: 0xD784, - 12183: 0xD785, - 12184: 0xD786, - 12185: 0xD787, - 12186: 0xD78A, - 12187: 0xD78B, - 12188: 0xD044, - 12189: 0xD045, - 12190: 0xD047, - 12191: 0xD049, - 12192: 0xD050, - 12193: 0xD054, - 12194: 0xD058, - 12195: 0xD060, - 12196: 0xD06C, - 12197: 0xD06D, - 12198: 0xD070, - 12199: 0xD074, - 12200: 0xD07C, - 12201: 0xD07D, - 12202: 0xD081, - 12203: 0xD0A4, - 12204: 0xD0A5, - 12205: 0xD0A8, - 12206: 0xD0AC, - 12207: 0xD0B4, - 12208: 0xD0B5, - 12209: 0xD0B7, - 12210: 0xD0B9, - 12211: 0xD0C0, - 12212: 0xD0C1, - 12213: 0xD0C4, - 12214: 0xD0C8, - 12215: 0xD0C9, - 12216: 0xD0D0, - 12217: 0xD0D1, - 12218: 0xD0D3, - 12219: 0xD0D4, - 12220: 0xD0D5, - 12221: 0xD0DC, - 12222: 0xD0DD, - 12223: 0xD0E0, - 12224: 0xD0E4, - 12225: 0xD0EC, - 12226: 0xD0ED, - 12227: 0xD0EF, - 12228: 0xD0F0, - 12229: 0xD0F1, - 12230: 0xD0F8, - 12231: 0xD10D, - 12232: 0xD130, - 12233: 0xD131, - 12234: 0xD134, - 12235: 0xD138, - 12236: 0xD13A, - 12237: 0xD140, - 12238: 0xD141, - 12239: 0xD143, - 12240: 0xD144, - 12241: 0xD145, - 12242: 0xD14C, - 12243: 0xD14D, - 12244: 0xD150, - 12245: 0xD154, - 12246: 0xD15C, - 12247: 0xD15D, - 12248: 0xD15F, - 12249: 0xD161, - 12250: 0xD168, - 12251: 0xD16C, - 12252: 0xD17C, - 12253: 0xD184, - 12254: 0xD188, - 12255: 0xD1A0, - 12256: 0xD1A1, - 12257: 0xD1A4, - 12258: 0xD1A8, - 12259: 0xD1B0, - 12260: 0xD1B1, - 12261: 0xD1B3, - 12262: 0xD1B5, - 12263: 0xD1BA, - 12264: 0xD1BC, - 12265: 0xD1C0, - 12266: 0xD1D8, - 12267: 0xD1F4, - 12268: 0xD1F8, - 12269: 0xD207, - 12270: 0xD209, - 12271: 0xD210, - 12272: 0xD22C, - 12273: 0xD22D, - 12274: 0xD230, - 12275: 0xD234, - 12276: 0xD23C, - 12277: 0xD23D, - 12278: 0xD23F, - 12279: 0xD241, - 12280: 0xD248, - 12281: 0xD25C, - 12282: 0xD78D, - 12283: 0xD78E, - 12284: 0xD78F, - 12285: 0xD791, - 12286: 0xD792, - 12287: 0xD793, - 12288: 0xD794, - 12289: 0xD795, - 12290: 0xD796, - 12291: 0xD797, - 12292: 0xD79A, - 12293: 0xD79C, - 12294: 0xD79E, - 12295: 0xD79F, - 12296: 0xD7A0, - 12297: 0xD7A1, - 12298: 0xD7A2, - 12299: 0xD7A3, - 12366: 0xD264, - 12367: 0xD280, - 12368: 0xD281, - 12369: 0xD284, - 12370: 0xD288, - 12371: 0xD290, - 12372: 0xD291, - 12373: 0xD295, - 12374: 0xD29C, - 12375: 0xD2A0, - 12376: 0xD2A4, - 12377: 0xD2AC, - 12378: 0xD2B1, - 12379: 0xD2B8, - 12380: 0xD2B9, - 12381: 0xD2BC, - 12382: 0xD2BF, - 12383: 0xD2C0, - 12384: 0xD2C2, - 12385: 0xD2C8, - 12386: 0xD2C9, - 12387: 0xD2CB, - 12388: 0xD2D4, - 12389: 0xD2D8, - 12390: 0xD2DC, - 12391: 0xD2E4, - 12392: 0xD2E5, - 12393: 0xD2F0, - 12394: 0xD2F1, - 12395: 0xD2F4, - 12396: 0xD2F8, - 12397: 0xD300, - 12398: 0xD301, - 12399: 0xD303, - 12400: 0xD305, - 12401: 0xD30C, - 12402: 0xD30D, - 12403: 0xD30E, - 12404: 0xD310, - 12405: 0xD314, - 12406: 0xD316, - 12407: 0xD31C, - 12408: 0xD31D, - 12409: 0xD31F, - 12410: 0xD320, - 12411: 0xD321, - 12412: 0xD325, - 12413: 0xD328, - 12414: 0xD329, - 12415: 0xD32C, - 12416: 0xD330, - 12417: 0xD338, - 12418: 0xD339, - 12419: 0xD33B, - 12420: 0xD33C, - 12421: 0xD33D, - 12422: 0xD344, - 12423: 0xD345, - 12424: 0xD37C, - 12425: 0xD37D, - 12426: 0xD380, - 12427: 0xD384, - 12428: 0xD38C, - 12429: 0xD38D, - 12430: 0xD38F, - 12431: 0xD390, - 12432: 0xD391, - 12433: 0xD398, - 12434: 0xD399, - 12435: 0xD39C, - 12436: 0xD3A0, - 12437: 0xD3A8, - 12438: 0xD3A9, - 12439: 0xD3AB, - 12440: 0xD3AD, - 12441: 0xD3B4, - 12442: 0xD3B8, - 12443: 0xD3BC, - 12444: 0xD3C4, - 12445: 0xD3C5, - 12446: 0xD3C8, - 12447: 0xD3C9, - 12448: 0xD3D0, - 12449: 0xD3D8, - 12450: 0xD3E1, - 12451: 0xD3E3, - 12452: 0xD3EC, - 12453: 0xD3ED, - 12454: 0xD3F0, - 12455: 0xD3F4, - 12456: 0xD3FC, - 12457: 0xD3FD, - 12458: 0xD3FF, - 12459: 0xD401, - 12460: 0xD408, - 12461: 0xD41D, - 12462: 0xD440, - 12463: 0xD444, - 12464: 0xD45C, - 12465: 0xD460, - 12466: 0xD464, - 12467: 0xD46D, - 12468: 0xD46F, - 12469: 0xD478, - 12470: 0xD479, - 12471: 0xD47C, - 12472: 0xD47F, - 12473: 0xD480, - 12474: 0xD482, - 12475: 0xD488, - 12476: 0xD489, - 12477: 0xD48B, - 12478: 0xD48D, - 12479: 0xD494, - 12480: 0xD4A9, - 12481: 0xD4CC, - 12482: 0xD4D0, - 12483: 0xD4D4, - 12484: 0xD4DC, - 12485: 0xD4DF, - 12486: 0xD4E8, - 12487: 0xD4EC, - 12488: 0xD4F0, - 12489: 0xD4F8, - 12490: 0xD4FB, - 12491: 0xD4FD, - 12492: 0xD504, - 12493: 0xD508, - 12494: 0xD50C, - 12495: 0xD514, - 12496: 0xD515, - 12497: 0xD517, - 12498: 0xD53C, - 12499: 0xD53D, - 12500: 0xD540, - 12501: 0xD544, - 12502: 0xD54C, - 12503: 0xD54D, - 12504: 0xD54F, - 12505: 0xD551, - 12506: 0xD558, - 12507: 0xD559, - 12508: 0xD55C, - 12509: 0xD560, - 12510: 0xD565, - 12511: 0xD568, - 12512: 0xD569, - 12513: 0xD56B, - 12514: 0xD56D, - 12515: 0xD574, - 12516: 0xD575, - 12517: 0xD578, - 12518: 0xD57C, - 12519: 0xD584, - 12520: 0xD585, - 12521: 0xD587, - 12522: 0xD588, - 12523: 0xD589, - 12524: 0xD590, - 12525: 0xD5A5, - 12526: 0xD5C8, - 12527: 0xD5C9, - 12528: 0xD5CC, - 12529: 0xD5D0, - 12530: 0xD5D2, - 12531: 0xD5D8, - 12532: 0xD5D9, - 12533: 0xD5DB, - 12534: 0xD5DD, - 12535: 0xD5E4, - 12536: 0xD5E5, - 12537: 0xD5E8, - 12538: 0xD5EC, - 12539: 0xD5F4, - 12540: 0xD5F5, - 12541: 0xD5F7, - 12542: 0xD5F9, - 12543: 0xD600, - 12544: 0xD601, - 12545: 0xD604, - 12546: 0xD608, - 12547: 0xD610, - 12548: 0xD611, - 12549: 0xD613, - 12550: 0xD614, - 12551: 0xD615, - 12552: 0xD61C, - 12553: 0xD620, - 12554: 0xD624, - 12555: 0xD62D, - 12556: 0xD638, - 12557: 0xD639, - 12558: 0xD63C, - 12559: 0xD640, - 12560: 0xD645, - 12561: 0xD648, - 12562: 0xD649, - 12563: 0xD64B, - 12564: 0xD64D, - 12565: 0xD651, - 12566: 0xD654, - 12567: 0xD655, - 12568: 0xD658, - 12569: 0xD65C, - 12570: 0xD667, - 12571: 0xD669, - 12572: 0xD670, - 12573: 0xD671, - 12574: 0xD674, - 12575: 0xD683, - 12576: 0xD685, - 12577: 0xD68C, - 12578: 0xD68D, - 12579: 0xD690, - 12580: 0xD694, - 12581: 0xD69D, - 12582: 0xD69F, - 12583: 0xD6A1, - 12584: 0xD6A8, - 12585: 0xD6AC, - 12586: 0xD6B0, - 12587: 0xD6B9, - 12588: 0xD6BB, - 12589: 0xD6C4, - 12590: 0xD6C5, - 12591: 0xD6C8, - 12592: 0xD6CC, - 12593: 0xD6D1, - 12594: 0xD6D4, - 12595: 0xD6D7, - 12596: 0xD6D9, - 12597: 0xD6E0, - 12598: 0xD6E4, - 12599: 0xD6E8, - 12600: 0xD6F0, - 12601: 0xD6F5, - 12602: 0xD6FC, - 12603: 0xD6FD, - 12604: 0xD700, - 12605: 0xD704, - 12606: 0xD711, - 12607: 0xD718, - 12608: 0xD719, - 12609: 0xD71C, - 12610: 0xD720, - 12611: 0xD728, - 12612: 0xD729, - 12613: 0xD72B, - 12614: 0xD72D, - 12615: 0xD734, - 12616: 0xD735, - 12617: 0xD738, - 12618: 0xD73C, - 12619: 0xD744, - 12620: 0xD747, - 12621: 0xD749, - 12622: 0xD750, - 12623: 0xD751, - 12624: 0xD754, - 12625: 0xD756, - 12626: 0xD757, - 12627: 0xD758, - 12628: 0xD759, - 12629: 0xD760, - 12630: 0xD761, - 12631: 0xD763, - 12632: 0xD765, - 12633: 0xD769, - 12634: 0xD76C, - 12635: 0xD770, - 12636: 0xD774, - 12637: 0xD77C, - 12638: 0xD77D, - 12639: 0xD781, - 12640: 0xD788, - 12641: 0xD789, - 12642: 0xD78C, - 12643: 0xD790, - 12644: 0xD798, - 12645: 0xD799, - 12646: 0xD79B, - 12647: 0xD79D, - 12742: 0x4F3D, - 12743: 0x4F73, - 12744: 0x5047, - 12745: 0x50F9, - 12746: 0x52A0, - 12747: 0x53EF, - 12748: 0x5475, - 12749: 0x54E5, - 12750: 0x5609, - 12751: 0x5AC1, - 12752: 0x5BB6, - 12753: 0x6687, - 12754: 0x67B6, - 12755: 0x67B7, - 12756: 0x67EF, - 12757: 0x6B4C, - 12758: 0x73C2, - 12759: 0x75C2, - 12760: 0x7A3C, - 12761: 0x82DB, - 12762: 0x8304, - 12763: 0x8857, - 12764: 0x8888, - 12765: 0x8A36, - 12766: 0x8CC8, - 12767: 0x8DCF, - 12768: 0x8EFB, - 12769: 0x8FE6, - 12770: 0x99D5, - 12771: 0x523B, - 12772: 0x5374, - 12773: 0x5404, - 12774: 0x606A, - 12775: 0x6164, - 12776: 0x6BBC, - 12777: 0x73CF, - 12778: 0x811A, - 12779: 0x89BA, - 12780: 0x89D2, - 12781: 0x95A3, - 12782: 0x4F83, - 12783: 0x520A, - 12784: 0x58BE, - 12785: 0x5978, - 12786: 0x59E6, - 12787: 0x5E72, - 12788: 0x5E79, - 12789: 0x61C7, - 12790: 0x63C0, - 12791: 0x6746, - 12792: 0x67EC, - 12793: 0x687F, - 12794: 0x6F97, - 12795: 0x764E, - 12796: 0x770B, - 12797: 0x78F5, - 12798: 0x7A08, - 12799: 0x7AFF, - 12800: 0x7C21, - 12801: 0x809D, - 12802: 0x826E, - 12803: 0x8271, - 12804: 0x8AEB, - 12805: 0x9593, - 12806: 0x4E6B, - 12807: 0x559D, - 12808: 0x66F7, - 12809: 0x6E34, - 12810: 0x78A3, - 12811: 0x7AED, - 12812: 0x845B, - 12813: 0x8910, - 12814: 0x874E, - 12815: 0x97A8, - 12816: 0x52D8, - 12817: 0x574E, - 12818: 0x582A, - 12819: 0x5D4C, - 12820: 0x611F, - 12821: 0x61BE, - 12822: 0x6221, - 12823: 0x6562, - 12824: 0x67D1, - 12825: 0x6A44, - 12826: 0x6E1B, - 12827: 0x7518, - 12828: 0x75B3, - 12829: 0x76E3, - 12830: 0x77B0, - 12831: 0x7D3A, - 12832: 0x90AF, - 12833: 0x9451, - 12834: 0x9452, - 12835: 0x9F95, - 12836: 0x5323, - 12837: 0x5CAC, - 12838: 0x7532, - 12839: 0x80DB, - 12840: 0x9240, - 12841: 0x9598, - 12842: 0x525B, - 12843: 0x5808, - 12844: 0x59DC, - 12845: 0x5CA1, - 12846: 0x5D17, - 12847: 0x5EB7, - 12848: 0x5F3A, - 12849: 0x5F4A, - 12850: 0x6177, - 12851: 0x6C5F, - 12852: 0x757A, - 12853: 0x7586, - 12854: 0x7CE0, - 12855: 0x7D73, - 12856: 0x7DB1, - 12857: 0x7F8C, - 12858: 0x8154, - 12859: 0x8221, - 12860: 0x8591, - 12861: 0x8941, - 12862: 0x8B1B, - 12863: 0x92FC, - 12864: 0x964D, - 12865: 0x9C47, - 12866: 0x4ECB, - 12867: 0x4EF7, - 12868: 0x500B, - 12869: 0x51F1, - 12870: 0x584F, - 12871: 0x6137, - 12872: 0x613E, - 12873: 0x6168, - 12874: 0x6539, - 12875: 0x69EA, - 12876: 0x6F11, - 12877: 0x75A5, - 12878: 0x7686, - 12879: 0x76D6, - 12880: 0x7B87, - 12881: 0x82A5, - 12882: 0x84CB, - 12883: 0xF900, - 12884: 0x93A7, - 12885: 0x958B, - 12886: 0x5580, - 12887: 0x5BA2, - 12888: 0x5751, - 12889: 0xF901, - 12890: 0x7CB3, - 12891: 0x7FB9, - 12892: 0x91B5, - 12893: 0x5028, - 12894: 0x53BB, - 12895: 0x5C45, - 12896: 0x5DE8, - 12897: 0x62D2, - 12898: 0x636E, - 12899: 0x64DA, - 12900: 0x64E7, - 12901: 0x6E20, - 12902: 0x70AC, - 12903: 0x795B, - 12904: 0x8DDD, - 12905: 0x8E1E, - 12906: 0xF902, - 12907: 0x907D, - 12908: 0x9245, - 12909: 0x92F8, - 12910: 0x4E7E, - 12911: 0x4EF6, - 12912: 0x5065, - 12913: 0x5DFE, - 12914: 0x5EFA, - 12915: 0x6106, - 12916: 0x6957, - 12917: 0x8171, - 12918: 0x8654, - 12919: 0x8E47, - 12920: 0x9375, - 12921: 0x9A2B, - 12922: 0x4E5E, - 12923: 0x5091, - 12924: 0x6770, - 12925: 0x6840, - 12926: 0x5109, - 12927: 0x528D, - 12928: 0x5292, - 12929: 0x6AA2, - 12930: 0x77BC, - 12931: 0x9210, - 12932: 0x9ED4, - 12933: 0x52AB, - 12934: 0x602F, - 12935: 0x8FF2, - 12936: 0x5048, - 12937: 0x61A9, - 12938: 0x63ED, - 12939: 0x64CA, - 12940: 0x683C, - 12941: 0x6A84, - 12942: 0x6FC0, - 12943: 0x8188, - 12944: 0x89A1, - 12945: 0x9694, - 12946: 0x5805, - 12947: 0x727D, - 12948: 0x72AC, - 12949: 0x7504, - 12950: 0x7D79, - 12951: 0x7E6D, - 12952: 0x80A9, - 12953: 0x898B, - 12954: 0x8B74, - 12955: 0x9063, - 12956: 0x9D51, - 12957: 0x6289, - 12958: 0x6C7A, - 12959: 0x6F54, - 12960: 0x7D50, - 12961: 0x7F3A, - 12962: 0x8A23, - 12963: 0x517C, - 12964: 0x614A, - 12965: 0x7B9D, - 12966: 0x8B19, - 12967: 0x9257, - 12968: 0x938C, - 12969: 0x4EAC, - 12970: 0x4FD3, - 12971: 0x501E, - 12972: 0x50BE, - 12973: 0x5106, - 12974: 0x52C1, - 12975: 0x52CD, - 12976: 0x537F, - 12977: 0x5770, - 12978: 0x5883, - 12979: 0x5E9A, - 12980: 0x5F91, - 12981: 0x6176, - 12982: 0x61AC, - 12983: 0x64CE, - 12984: 0x656C, - 12985: 0x666F, - 12986: 0x66BB, - 12987: 0x66F4, - 12988: 0x6897, - 12989: 0x6D87, - 12990: 0x7085, - 12991: 0x70F1, - 12992: 0x749F, - 12993: 0x74A5, - 12994: 0x74CA, - 12995: 0x75D9, - 12996: 0x786C, - 12997: 0x78EC, - 12998: 0x7ADF, - 12999: 0x7AF6, - 13000: 0x7D45, - 13001: 0x7D93, - 13002: 0x8015, - 13003: 0x803F, - 13004: 0x811B, - 13005: 0x8396, - 13006: 0x8B66, - 13007: 0x8F15, - 13008: 0x9015, - 13009: 0x93E1, - 13010: 0x9803, - 13011: 0x9838, - 13012: 0x9A5A, - 13013: 0x9BE8, - 13014: 0x4FC2, - 13015: 0x5553, - 13016: 0x583A, - 13017: 0x5951, - 13018: 0x5B63, - 13019: 0x5C46, - 13020: 0x60B8, - 13021: 0x6212, - 13022: 0x6842, - 13023: 0x68B0, - 13024: 0x68E8, - 13025: 0x6EAA, - 13026: 0x754C, - 13027: 0x7678, - 13028: 0x78CE, - 13029: 0x7A3D, - 13030: 0x7CFB, - 13031: 0x7E6B, - 13032: 0x7E7C, - 13033: 0x8A08, - 13034: 0x8AA1, - 13035: 0x8C3F, - 13036: 0x968E, - 13037: 0x9DC4, - 13038: 0x53E4, - 13039: 0x53E9, - 13040: 0x544A, - 13041: 0x5471, - 13042: 0x56FA, - 13043: 0x59D1, - 13044: 0x5B64, - 13045: 0x5C3B, - 13046: 0x5EAB, - 13047: 0x62F7, - 13048: 0x6537, - 13049: 0x6545, - 13050: 0x6572, - 13051: 0x66A0, - 13052: 0x67AF, - 13053: 0x69C1, - 13054: 0x6CBD, - 13055: 0x75FC, - 13056: 0x7690, - 13057: 0x777E, - 13058: 0x7A3F, - 13059: 0x7F94, - 13060: 0x8003, - 13061: 0x80A1, - 13062: 0x818F, - 13063: 0x82E6, - 13064: 0x82FD, - 13065: 0x83F0, - 13066: 0x85C1, - 13067: 0x8831, - 13068: 0x88B4, - 13069: 0x8AA5, - 13070: 0xF903, - 13071: 0x8F9C, - 13072: 0x932E, - 13073: 0x96C7, - 13074: 0x9867, - 13075: 0x9AD8, - 13076: 0x9F13, - 13077: 0x54ED, - 13078: 0x659B, - 13079: 0x66F2, - 13080: 0x688F, - 13081: 0x7A40, - 13082: 0x8C37, - 13083: 0x9D60, - 13084: 0x56F0, - 13085: 0x5764, - 13086: 0x5D11, - 13087: 0x6606, - 13088: 0x68B1, - 13089: 0x68CD, - 13090: 0x6EFE, - 13091: 0x7428, - 13092: 0x889E, - 13093: 0x9BE4, - 13094: 0x6C68, - 13095: 0xF904, - 13096: 0x9AA8, - 13097: 0x4F9B, - 13098: 0x516C, - 13099: 0x5171, - 13100: 0x529F, - 13101: 0x5B54, - 13102: 0x5DE5, - 13103: 0x6050, - 13104: 0x606D, - 13105: 0x62F1, - 13106: 0x63A7, - 13107: 0x653B, - 13108: 0x73D9, - 13109: 0x7A7A, - 13110: 0x86A3, - 13111: 0x8CA2, - 13112: 0x978F, - 13113: 0x4E32, - 13114: 0x5BE1, - 13115: 0x6208, - 13116: 0x679C, - 13117: 0x74DC, - 13118: 0x79D1, - 13119: 0x83D3, - 13120: 0x8A87, - 13121: 0x8AB2, - 13122: 0x8DE8, - 13123: 0x904E, - 13124: 0x934B, - 13125: 0x9846, - 13126: 0x5ED3, - 13127: 0x69E8, - 13128: 0x85FF, - 13129: 0x90ED, - 13130: 0xF905, - 13131: 0x51A0, - 13132: 0x5B98, - 13133: 0x5BEC, - 13134: 0x6163, - 13135: 0x68FA, - 13136: 0x6B3E, - 13137: 0x704C, - 13138: 0x742F, - 13139: 0x74D8, - 13140: 0x7BA1, - 13141: 0x7F50, - 13142: 0x83C5, - 13143: 0x89C0, - 13144: 0x8CAB, - 13145: 0x95DC, - 13146: 0x9928, - 13147: 0x522E, - 13148: 0x605D, - 13149: 0x62EC, - 13150: 0x9002, - 13151: 0x4F8A, - 13152: 0x5149, - 13153: 0x5321, - 13154: 0x58D9, - 13155: 0x5EE3, - 13156: 0x66E0, - 13157: 0x6D38, - 13158: 0x709A, - 13159: 0x72C2, - 13160: 0x73D6, - 13161: 0x7B50, - 13162: 0x80F1, - 13163: 0x945B, - 13164: 0x5366, - 13165: 0x639B, - 13166: 0x7F6B, - 13167: 0x4E56, - 13168: 0x5080, - 13169: 0x584A, - 13170: 0x58DE, - 13171: 0x602A, - 13172: 0x6127, - 13173: 0x62D0, - 13174: 0x69D0, - 13175: 0x9B41, - 13176: 0x5B8F, - 13177: 0x7D18, - 13178: 0x80B1, - 13179: 0x8F5F, - 13180: 0x4EA4, - 13181: 0x50D1, - 13182: 0x54AC, - 13183: 0x55AC, - 13184: 0x5B0C, - 13185: 0x5DA0, - 13186: 0x5DE7, - 13187: 0x652A, - 13188: 0x654E, - 13189: 0x6821, - 13190: 0x6A4B, - 13191: 0x72E1, - 13192: 0x768E, - 13193: 0x77EF, - 13194: 0x7D5E, - 13195: 0x7FF9, - 13196: 0x81A0, - 13197: 0x854E, - 13198: 0x86DF, - 13199: 0x8F03, - 13200: 0x8F4E, - 13201: 0x90CA, - 13202: 0x9903, - 13203: 0x9A55, - 13204: 0x9BAB, - 13205: 0x4E18, - 13206: 0x4E45, - 13207: 0x4E5D, - 13208: 0x4EC7, - 13209: 0x4FF1, - 13210: 0x5177, - 13211: 0x52FE, - 13212: 0x5340, - 13213: 0x53E3, - 13214: 0x53E5, - 13215: 0x548E, - 13216: 0x5614, - 13217: 0x5775, - 13218: 0x57A2, - 13219: 0x5BC7, - 13220: 0x5D87, - 13221: 0x5ED0, - 13222: 0x61FC, - 13223: 0x62D8, - 13224: 0x6551, - 13225: 0x67B8, - 13226: 0x67E9, - 13227: 0x69CB, - 13228: 0x6B50, - 13229: 0x6BC6, - 13230: 0x6BEC, - 13231: 0x6C42, - 13232: 0x6E9D, - 13233: 0x7078, - 13234: 0x72D7, - 13235: 0x7396, - 13236: 0x7403, - 13237: 0x77BF, - 13238: 0x77E9, - 13239: 0x7A76, - 13240: 0x7D7F, - 13241: 0x8009, - 13242: 0x81FC, - 13243: 0x8205, - 13244: 0x820A, - 13245: 0x82DF, - 13246: 0x8862, - 13247: 0x8B33, - 13248: 0x8CFC, - 13249: 0x8EC0, - 13250: 0x9011, - 13251: 0x90B1, - 13252: 0x9264, - 13253: 0x92B6, - 13254: 0x99D2, - 13255: 0x9A45, - 13256: 0x9CE9, - 13257: 0x9DD7, - 13258: 0x9F9C, - 13259: 0x570B, - 13260: 0x5C40, - 13261: 0x83CA, - 13262: 0x97A0, - 13263: 0x97AB, - 13264: 0x9EB4, - 13265: 0x541B, - 13266: 0x7A98, - 13267: 0x7FA4, - 13268: 0x88D9, - 13269: 0x8ECD, - 13270: 0x90E1, - 13271: 0x5800, - 13272: 0x5C48, - 13273: 0x6398, - 13274: 0x7A9F, - 13275: 0x5BAE, - 13276: 0x5F13, - 13277: 0x7A79, - 13278: 0x7AAE, - 13279: 0x828E, - 13280: 0x8EAC, - 13281: 0x5026, - 13282: 0x5238, - 13283: 0x52F8, - 13284: 0x5377, - 13285: 0x5708, - 13286: 0x62F3, - 13287: 0x6372, - 13288: 0x6B0A, - 13289: 0x6DC3, - 13290: 0x7737, - 13291: 0x53A5, - 13292: 0x7357, - 13293: 0x8568, - 13294: 0x8E76, - 13295: 0x95D5, - 13296: 0x673A, - 13297: 0x6AC3, - 13298: 0x6F70, - 13299: 0x8A6D, - 13300: 0x8ECC, - 13301: 0x994B, - 13302: 0xF906, - 13303: 0x6677, - 13304: 0x6B78, - 13305: 0x8CB4, - 13306: 0x9B3C, - 13307: 0xF907, - 13308: 0x53EB, - 13309: 0x572D, - 13310: 0x594E, - 13311: 0x63C6, - 13312: 0x69FB, - 13313: 0x73EA, - 13314: 0x7845, - 13315: 0x7ABA, - 13316: 0x7AC5, - 13317: 0x7CFE, - 13318: 0x8475, - 13319: 0x898F, - 13320: 0x8D73, - 13321: 0x9035, - 13322: 0x95A8, - 13323: 0x52FB, - 13324: 0x5747, - 13325: 0x7547, - 13326: 0x7B60, - 13327: 0x83CC, - 13328: 0x921E, - 13329: 0xF908, - 13330: 0x6A58, - 13331: 0x514B, - 13332: 0x524B, - 13333: 0x5287, - 13334: 0x621F, - 13335: 0x68D8, - 13336: 0x6975, - 13337: 0x9699, - 13338: 0x50C5, - 13339: 0x52A4, - 13340: 0x52E4, - 13341: 0x61C3, - 13342: 0x65A4, - 13343: 0x6839, - 13344: 0x69FF, - 13345: 0x747E, - 13346: 0x7B4B, - 13347: 0x82B9, - 13348: 0x83EB, - 13349: 0x89B2, - 13350: 0x8B39, - 13351: 0x8FD1, - 13352: 0x9949, - 13353: 0xF909, - 13354: 0x4ECA, - 13355: 0x5997, - 13356: 0x64D2, - 13357: 0x6611, - 13358: 0x6A8E, - 13359: 0x7434, - 13360: 0x7981, - 13361: 0x79BD, - 13362: 0x82A9, - 13363: 0x887E, - 13364: 0x887F, - 13365: 0x895F, - 13366: 0xF90A, - 13367: 0x9326, - 13368: 0x4F0B, - 13369: 0x53CA, - 13370: 0x6025, - 13371: 0x6271, - 13372: 0x6C72, - 13373: 0x7D1A, - 13374: 0x7D66, - 13375: 0x4E98, - 13376: 0x5162, - 13377: 0x77DC, - 13378: 0x80AF, - 13379: 0x4F01, - 13380: 0x4F0E, - 13381: 0x5176, - 13382: 0x5180, - 13383: 0x55DC, - 13384: 0x5668, - 13385: 0x573B, - 13386: 0x57FA, - 13387: 0x57FC, - 13388: 0x5914, - 13389: 0x5947, - 13390: 0x5993, - 13391: 0x5BC4, - 13392: 0x5C90, - 13393: 0x5D0E, - 13394: 0x5DF1, - 13395: 0x5E7E, - 13396: 0x5FCC, - 13397: 0x6280, - 13398: 0x65D7, - 13399: 0x65E3, - 13400: 0x671E, - 13401: 0x671F, - 13402: 0x675E, - 13403: 0x68CB, - 13404: 0x68C4, - 13405: 0x6A5F, - 13406: 0x6B3A, - 13407: 0x6C23, - 13408: 0x6C7D, - 13409: 0x6C82, - 13410: 0x6DC7, - 13411: 0x7398, - 13412: 0x7426, - 13413: 0x742A, - 13414: 0x7482, - 13415: 0x74A3, - 13416: 0x7578, - 13417: 0x757F, - 13418: 0x7881, - 13419: 0x78EF, - 13420: 0x7941, - 13421: 0x7947, - 13422: 0x7948, - 13423: 0x797A, - 13424: 0x7B95, - 13425: 0x7D00, - 13426: 0x7DBA, - 13427: 0x7F88, - 13428: 0x8006, - 13429: 0x802D, - 13430: 0x808C, - 13431: 0x8A18, - 13432: 0x8B4F, - 13433: 0x8C48, - 13434: 0x8D77, - 13435: 0x9321, - 13436: 0x9324, - 13437: 0x98E2, - 13438: 0x9951, - 13439: 0x9A0E, - 13440: 0x9A0F, - 13441: 0x9A65, - 13442: 0x9E92, - 13443: 0x7DCA, - 13444: 0x4F76, - 13445: 0x5409, - 13446: 0x62EE, - 13447: 0x6854, - 13448: 0x91D1, - 13449: 0x55AB, - 13450: 0x513A, - 13451: 0xF90B, - 13452: 0xF90C, - 13453: 0x5A1C, - 13454: 0x61E6, - 13455: 0xF90D, - 13456: 0x62CF, - 13457: 0x62FF, - 13458: 0xF90E, - 13459: 0xF90F, - 13460: 0xF910, - 13461: 0xF911, - 13462: 0xF912, - 13463: 0xF913, - 13464: 0x90A3, - 13465: 0xF914, - 13466: 0xF915, - 13467: 0xF916, - 13468: 0xF917, - 13469: 0xF918, - 13470: 0x8AFE, - 13471: 0xF919, - 13472: 0xF91A, - 13473: 0xF91B, - 13474: 0xF91C, - 13475: 0x6696, - 13476: 0xF91D, - 13477: 0x7156, - 13478: 0xF91E, - 13479: 0xF91F, - 13480: 0x96E3, - 13481: 0xF920, - 13482: 0x634F, - 13483: 0x637A, - 13484: 0x5357, - 13485: 0xF921, - 13486: 0x678F, - 13487: 0x6960, - 13488: 0x6E73, - 13489: 0xF922, - 13490: 0x7537, - 13491: 0xF923, - 13492: 0xF924, - 13493: 0xF925, - 13494: 0x7D0D, - 13495: 0xF926, - 13496: 0xF927, - 13497: 0x8872, - 13498: 0x56CA, - 13499: 0x5A18, - 13500: 0xF928, - 13501: 0xF929, - 13502: 0xF92A, - 13503: 0xF92B, - 13504: 0xF92C, - 13505: 0x4E43, - 13506: 0xF92D, - 13507: 0x5167, - 13508: 0x5948, - 13509: 0x67F0, - 13510: 0x8010, - 13511: 0xF92E, - 13512: 0x5973, - 13513: 0x5E74, - 13514: 0x649A, - 13515: 0x79CA, - 13516: 0x5FF5, - 13517: 0x606C, - 13518: 0x62C8, - 13519: 0x637B, - 13520: 0x5BE7, - 13521: 0x5BD7, - 13522: 0x52AA, - 13523: 0xF92F, - 13524: 0x5974, - 13525: 0x5F29, - 13526: 0x6012, - 13527: 0xF930, - 13528: 0xF931, - 13529: 0xF932, - 13530: 0x7459, - 13531: 0xF933, - 13532: 0xF934, - 13533: 0xF935, - 13534: 0xF936, - 13535: 0xF937, - 13536: 0xF938, - 13537: 0x99D1, - 13538: 0xF939, - 13539: 0xF93A, - 13540: 0xF93B, - 13541: 0xF93C, - 13542: 0xF93D, - 13543: 0xF93E, - 13544: 0xF93F, - 13545: 0xF940, - 13546: 0xF941, - 13547: 0xF942, - 13548: 0xF943, - 13549: 0x6FC3, - 13550: 0xF944, - 13551: 0xF945, - 13552: 0x81BF, - 13553: 0x8FB2, - 13554: 0x60F1, - 13555: 0xF946, - 13556: 0xF947, - 13557: 0x8166, - 13558: 0xF948, - 13559: 0xF949, - 13560: 0x5C3F, - 13561: 0xF94A, - 13562: 0xF94B, - 13563: 0xF94C, - 13564: 0xF94D, - 13565: 0xF94E, - 13566: 0xF94F, - 13567: 0xF950, - 13568: 0xF951, - 13569: 0x5AE9, - 13570: 0x8A25, - 13571: 0x677B, - 13572: 0x7D10, - 13573: 0xF952, - 13574: 0xF953, - 13575: 0xF954, - 13576: 0xF955, - 13577: 0xF956, - 13578: 0xF957, - 13579: 0x80FD, - 13580: 0xF958, - 13581: 0xF959, - 13582: 0x5C3C, - 13583: 0x6CE5, - 13584: 0x533F, - 13585: 0x6EBA, - 13586: 0x591A, - 13587: 0x8336, - 13588: 0x4E39, - 13589: 0x4EB6, - 13590: 0x4F46, - 13591: 0x55AE, - 13592: 0x5718, - 13593: 0x58C7, - 13594: 0x5F56, - 13595: 0x65B7, - 13596: 0x65E6, - 13597: 0x6A80, - 13598: 0x6BB5, - 13599: 0x6E4D, - 13600: 0x77ED, - 13601: 0x7AEF, - 13602: 0x7C1E, - 13603: 0x7DDE, - 13604: 0x86CB, - 13605: 0x8892, - 13606: 0x9132, - 13607: 0x935B, - 13608: 0x64BB, - 13609: 0x6FBE, - 13610: 0x737A, - 13611: 0x75B8, - 13612: 0x9054, - 13613: 0x5556, - 13614: 0x574D, - 13615: 0x61BA, - 13616: 0x64D4, - 13617: 0x66C7, - 13618: 0x6DE1, - 13619: 0x6E5B, - 13620: 0x6F6D, - 13621: 0x6FB9, - 13622: 0x75F0, - 13623: 0x8043, - 13624: 0x81BD, - 13625: 0x8541, - 13626: 0x8983, - 13627: 0x8AC7, - 13628: 0x8B5A, - 13629: 0x931F, - 13630: 0x6C93, - 13631: 0x7553, - 13632: 0x7B54, - 13633: 0x8E0F, - 13634: 0x905D, - 13635: 0x5510, - 13636: 0x5802, - 13637: 0x5858, - 13638: 0x5E62, - 13639: 0x6207, - 13640: 0x649E, - 13641: 0x68E0, - 13642: 0x7576, - 13643: 0x7CD6, - 13644: 0x87B3, - 13645: 0x9EE8, - 13646: 0x4EE3, - 13647: 0x5788, - 13648: 0x576E, - 13649: 0x5927, - 13650: 0x5C0D, - 13651: 0x5CB1, - 13652: 0x5E36, - 13653: 0x5F85, - 13654: 0x6234, - 13655: 0x64E1, - 13656: 0x73B3, - 13657: 0x81FA, - 13658: 0x888B, - 13659: 0x8CB8, - 13660: 0x968A, - 13661: 0x9EDB, - 13662: 0x5B85, - 13663: 0x5FB7, - 13664: 0x60B3, - 13665: 0x5012, - 13666: 0x5200, - 13667: 0x5230, - 13668: 0x5716, - 13669: 0x5835, - 13670: 0x5857, - 13671: 0x5C0E, - 13672: 0x5C60, - 13673: 0x5CF6, - 13674: 0x5D8B, - 13675: 0x5EA6, - 13676: 0x5F92, - 13677: 0x60BC, - 13678: 0x6311, - 13679: 0x6389, - 13680: 0x6417, - 13681: 0x6843, - 13682: 0x68F9, - 13683: 0x6AC2, - 13684: 0x6DD8, - 13685: 0x6E21, - 13686: 0x6ED4, - 13687: 0x6FE4, - 13688: 0x71FE, - 13689: 0x76DC, - 13690: 0x7779, - 13691: 0x79B1, - 13692: 0x7A3B, - 13693: 0x8404, - 13694: 0x89A9, - 13695: 0x8CED, - 13696: 0x8DF3, - 13697: 0x8E48, - 13698: 0x9003, - 13699: 0x9014, - 13700: 0x9053, - 13701: 0x90FD, - 13702: 0x934D, - 13703: 0x9676, - 13704: 0x97DC, - 13705: 0x6BD2, - 13706: 0x7006, - 13707: 0x7258, - 13708: 0x72A2, - 13709: 0x7368, - 13710: 0x7763, - 13711: 0x79BF, - 13712: 0x7BE4, - 13713: 0x7E9B, - 13714: 0x8B80, - 13715: 0x58A9, - 13716: 0x60C7, - 13717: 0x6566, - 13718: 0x65FD, - 13719: 0x66BE, - 13720: 0x6C8C, - 13721: 0x711E, - 13722: 0x71C9, - 13723: 0x8C5A, - 13724: 0x9813, - 13725: 0x4E6D, - 13726: 0x7A81, - 13727: 0x4EDD, - 13728: 0x51AC, - 13729: 0x51CD, - 13730: 0x52D5, - 13731: 0x540C, - 13732: 0x61A7, - 13733: 0x6771, - 13734: 0x6850, - 13735: 0x68DF, - 13736: 0x6D1E, - 13737: 0x6F7C, - 13738: 0x75BC, - 13739: 0x77B3, - 13740: 0x7AE5, - 13741: 0x80F4, - 13742: 0x8463, - 13743: 0x9285, - 13744: 0x515C, - 13745: 0x6597, - 13746: 0x675C, - 13747: 0x6793, - 13748: 0x75D8, - 13749: 0x7AC7, - 13750: 0x8373, - 13751: 0xF95A, - 13752: 0x8C46, - 13753: 0x9017, - 13754: 0x982D, - 13755: 0x5C6F, - 13756: 0x81C0, - 13757: 0x829A, - 13758: 0x9041, - 13759: 0x906F, - 13760: 0x920D, - 13761: 0x5F97, - 13762: 0x5D9D, - 13763: 0x6A59, - 13764: 0x71C8, - 13765: 0x767B, - 13766: 0x7B49, - 13767: 0x85E4, - 13768: 0x8B04, - 13769: 0x9127, - 13770: 0x9A30, - 13771: 0x5587, - 13772: 0x61F6, - 13773: 0xF95B, - 13774: 0x7669, - 13775: 0x7F85, - 13776: 0x863F, - 13777: 0x87BA, - 13778: 0x88F8, - 13779: 0x908F, - 13780: 0xF95C, - 13781: 0x6D1B, - 13782: 0x70D9, - 13783: 0x73DE, - 13784: 0x7D61, - 13785: 0x843D, - 13786: 0xF95D, - 13787: 0x916A, - 13788: 0x99F1, - 13789: 0xF95E, - 13790: 0x4E82, - 13791: 0x5375, - 13792: 0x6B04, - 13793: 0x6B12, - 13794: 0x703E, - 13795: 0x721B, - 13796: 0x862D, - 13797: 0x9E1E, - 13798: 0x524C, - 13799: 0x8FA3, - 13800: 0x5D50, - 13801: 0x64E5, - 13802: 0x652C, - 13803: 0x6B16, - 13804: 0x6FEB, - 13805: 0x7C43, - 13806: 0x7E9C, - 13807: 0x85CD, - 13808: 0x8964, - 13809: 0x89BD, - 13810: 0x62C9, - 13811: 0x81D8, - 13812: 0x881F, - 13813: 0x5ECA, - 13814: 0x6717, - 13815: 0x6D6A, - 13816: 0x72FC, - 13817: 0x7405, - 13818: 0x746F, - 13819: 0x8782, - 13820: 0x90DE, - 13821: 0x4F86, - 13822: 0x5D0D, - 13823: 0x5FA0, - 13824: 0x840A, - 13825: 0x51B7, - 13826: 0x63A0, - 13827: 0x7565, - 13828: 0x4EAE, - 13829: 0x5006, - 13830: 0x5169, - 13831: 0x51C9, - 13832: 0x6881, - 13833: 0x6A11, - 13834: 0x7CAE, - 13835: 0x7CB1, - 13836: 0x7CE7, - 13837: 0x826F, - 13838: 0x8AD2, - 13839: 0x8F1B, - 13840: 0x91CF, - 13841: 0x4FB6, - 13842: 0x5137, - 13843: 0x52F5, - 13844: 0x5442, - 13845: 0x5EEC, - 13846: 0x616E, - 13847: 0x623E, - 13848: 0x65C5, - 13849: 0x6ADA, - 13850: 0x6FFE, - 13851: 0x792A, - 13852: 0x85DC, - 13853: 0x8823, - 13854: 0x95AD, - 13855: 0x9A62, - 13856: 0x9A6A, - 13857: 0x9E97, - 13858: 0x9ECE, - 13859: 0x529B, - 13860: 0x66C6, - 13861: 0x6B77, - 13862: 0x701D, - 13863: 0x792B, - 13864: 0x8F62, - 13865: 0x9742, - 13866: 0x6190, - 13867: 0x6200, - 13868: 0x6523, - 13869: 0x6F23, - 13870: 0x7149, - 13871: 0x7489, - 13872: 0x7DF4, - 13873: 0x806F, - 13874: 0x84EE, - 13875: 0x8F26, - 13876: 0x9023, - 13877: 0x934A, - 13878: 0x51BD, - 13879: 0x5217, - 13880: 0x52A3, - 13881: 0x6D0C, - 13882: 0x70C8, - 13883: 0x88C2, - 13884: 0x5EC9, - 13885: 0x6582, - 13886: 0x6BAE, - 13887: 0x6FC2, - 13888: 0x7C3E, - 13889: 0x7375, - 13890: 0x4EE4, - 13891: 0x4F36, - 13892: 0x56F9, - 13893: 0xF95F, - 13894: 0x5CBA, - 13895: 0x5DBA, - 13896: 0x601C, - 13897: 0x73B2, - 13898: 0x7B2D, - 13899: 0x7F9A, - 13900: 0x7FCE, - 13901: 0x8046, - 13902: 0x901E, - 13903: 0x9234, - 13904: 0x96F6, - 13905: 0x9748, - 13906: 0x9818, - 13907: 0x9F61, - 13908: 0x4F8B, - 13909: 0x6FA7, - 13910: 0x79AE, - 13911: 0x91B4, - 13912: 0x96B7, - 13913: 0x52DE, - 13914: 0xF960, - 13915: 0x6488, - 13916: 0x64C4, - 13917: 0x6AD3, - 13918: 0x6F5E, - 13919: 0x7018, - 13920: 0x7210, - 13921: 0x76E7, - 13922: 0x8001, - 13923: 0x8606, - 13924: 0x865C, - 13925: 0x8DEF, - 13926: 0x8F05, - 13927: 0x9732, - 13928: 0x9B6F, - 13929: 0x9DFA, - 13930: 0x9E75, - 13931: 0x788C, - 13932: 0x797F, - 13933: 0x7DA0, - 13934: 0x83C9, - 13935: 0x9304, - 13936: 0x9E7F, - 13937: 0x9E93, - 13938: 0x8AD6, - 13939: 0x58DF, - 13940: 0x5F04, - 13941: 0x6727, - 13942: 0x7027, - 13943: 0x74CF, - 13944: 0x7C60, - 13945: 0x807E, - 13946: 0x5121, - 13947: 0x7028, - 13948: 0x7262, - 13949: 0x78CA, - 13950: 0x8CC2, - 13951: 0x8CDA, - 13952: 0x8CF4, - 13953: 0x96F7, - 13954: 0x4E86, - 13955: 0x50DA, - 13956: 0x5BEE, - 13957: 0x5ED6, - 13958: 0x6599, - 13959: 0x71CE, - 13960: 0x7642, - 13961: 0x77AD, - 13962: 0x804A, - 13963: 0x84FC, - 13964: 0x907C, - 13965: 0x9B27, - 13966: 0x9F8D, - 13967: 0x58D8, - 13968: 0x5A41, - 13969: 0x5C62, - 13970: 0x6A13, - 13971: 0x6DDA, - 13972: 0x6F0F, - 13973: 0x763B, - 13974: 0x7D2F, - 13975: 0x7E37, - 13976: 0x851E, - 13977: 0x8938, - 13978: 0x93E4, - 13979: 0x964B, - 13980: 0x5289, - 13981: 0x65D2, - 13982: 0x67F3, - 13983: 0x69B4, - 13984: 0x6D41, - 13985: 0x6E9C, - 13986: 0x700F, - 13987: 0x7409, - 13988: 0x7460, - 13989: 0x7559, - 13990: 0x7624, - 13991: 0x786B, - 13992: 0x8B2C, - 13993: 0x985E, - 13994: 0x516D, - 13995: 0x622E, - 13996: 0x9678, - 13997: 0x4F96, - 13998: 0x502B, - 13999: 0x5D19, - 14000: 0x6DEA, - 14001: 0x7DB8, - 14002: 0x8F2A, - 14003: 0x5F8B, - 14004: 0x6144, - 14005: 0x6817, - 14006: 0xF961, - 14007: 0x9686, - 14008: 0x52D2, - 14009: 0x808B, - 14010: 0x51DC, - 14011: 0x51CC, - 14012: 0x695E, - 14013: 0x7A1C, - 14014: 0x7DBE, - 14015: 0x83F1, - 14016: 0x9675, - 14017: 0x4FDA, - 14018: 0x5229, - 14019: 0x5398, - 14020: 0x540F, - 14021: 0x550E, - 14022: 0x5C65, - 14023: 0x60A7, - 14024: 0x674E, - 14025: 0x68A8, - 14026: 0x6D6C, - 14027: 0x7281, - 14028: 0x72F8, - 14029: 0x7406, - 14030: 0x7483, - 14031: 0xF962, - 14032: 0x75E2, - 14033: 0x7C6C, - 14034: 0x7F79, - 14035: 0x7FB8, - 14036: 0x8389, - 14037: 0x88CF, - 14038: 0x88E1, - 14039: 0x91CC, - 14040: 0x91D0, - 14041: 0x96E2, - 14042: 0x9BC9, - 14043: 0x541D, - 14044: 0x6F7E, - 14045: 0x71D0, - 14046: 0x7498, - 14047: 0x85FA, - 14048: 0x8EAA, - 14049: 0x96A3, - 14050: 0x9C57, - 14051: 0x9E9F, - 14052: 0x6797, - 14053: 0x6DCB, - 14054: 0x7433, - 14055: 0x81E8, - 14056: 0x9716, - 14057: 0x782C, - 14058: 0x7ACB, - 14059: 0x7B20, - 14060: 0x7C92, - 14061: 0x6469, - 14062: 0x746A, - 14063: 0x75F2, - 14064: 0x78BC, - 14065: 0x78E8, - 14066: 0x99AC, - 14067: 0x9B54, - 14068: 0x9EBB, - 14069: 0x5BDE, - 14070: 0x5E55, - 14071: 0x6F20, - 14072: 0x819C, - 14073: 0x83AB, - 14074: 0x9088, - 14075: 0x4E07, - 14076: 0x534D, - 14077: 0x5A29, - 14078: 0x5DD2, - 14079: 0x5F4E, - 14080: 0x6162, - 14081: 0x633D, - 14082: 0x6669, - 14083: 0x66FC, - 14084: 0x6EFF, - 14085: 0x6F2B, - 14086: 0x7063, - 14087: 0x779E, - 14088: 0x842C, - 14089: 0x8513, - 14090: 0x883B, - 14091: 0x8F13, - 14092: 0x9945, - 14093: 0x9C3B, - 14094: 0x551C, - 14095: 0x62B9, - 14096: 0x672B, - 14097: 0x6CAB, - 14098: 0x8309, - 14099: 0x896A, - 14100: 0x977A, - 14101: 0x4EA1, - 14102: 0x5984, - 14103: 0x5FD8, - 14104: 0x5FD9, - 14105: 0x671B, - 14106: 0x7DB2, - 14107: 0x7F54, - 14108: 0x8292, - 14109: 0x832B, - 14110: 0x83BD, - 14111: 0x8F1E, - 14112: 0x9099, - 14113: 0x57CB, - 14114: 0x59B9, - 14115: 0x5A92, - 14116: 0x5BD0, - 14117: 0x6627, - 14118: 0x679A, - 14119: 0x6885, - 14120: 0x6BCF, - 14121: 0x7164, - 14122: 0x7F75, - 14123: 0x8CB7, - 14124: 0x8CE3, - 14125: 0x9081, - 14126: 0x9B45, - 14127: 0x8108, - 14128: 0x8C8A, - 14129: 0x964C, - 14130: 0x9A40, - 14131: 0x9EA5, - 14132: 0x5B5F, - 14133: 0x6C13, - 14134: 0x731B, - 14135: 0x76F2, - 14136: 0x76DF, - 14137: 0x840C, - 14138: 0x51AA, - 14139: 0x8993, - 14140: 0x514D, - 14141: 0x5195, - 14142: 0x52C9, - 14143: 0x68C9, - 14144: 0x6C94, - 14145: 0x7704, - 14146: 0x7720, - 14147: 0x7DBF, - 14148: 0x7DEC, - 14149: 0x9762, - 14150: 0x9EB5, - 14151: 0x6EC5, - 14152: 0x8511, - 14153: 0x51A5, - 14154: 0x540D, - 14155: 0x547D, - 14156: 0x660E, - 14157: 0x669D, - 14158: 0x6927, - 14159: 0x6E9F, - 14160: 0x76BF, - 14161: 0x7791, - 14162: 0x8317, - 14163: 0x84C2, - 14164: 0x879F, - 14165: 0x9169, - 14166: 0x9298, - 14167: 0x9CF4, - 14168: 0x8882, - 14169: 0x4FAE, - 14170: 0x5192, - 14171: 0x52DF, - 14172: 0x59C6, - 14173: 0x5E3D, - 14174: 0x6155, - 14175: 0x6478, - 14176: 0x6479, - 14177: 0x66AE, - 14178: 0x67D0, - 14179: 0x6A21, - 14180: 0x6BCD, - 14181: 0x6BDB, - 14182: 0x725F, - 14183: 0x7261, - 14184: 0x7441, - 14185: 0x7738, - 14186: 0x77DB, - 14187: 0x8017, - 14188: 0x82BC, - 14189: 0x8305, - 14190: 0x8B00, - 14191: 0x8B28, - 14192: 0x8C8C, - 14193: 0x6728, - 14194: 0x6C90, - 14195: 0x7267, - 14196: 0x76EE, - 14197: 0x7766, - 14198: 0x7A46, - 14199: 0x9DA9, - 14200: 0x6B7F, - 14201: 0x6C92, - 14202: 0x5922, - 14203: 0x6726, - 14204: 0x8499, - 14205: 0x536F, - 14206: 0x5893, - 14207: 0x5999, - 14208: 0x5EDF, - 14209: 0x63CF, - 14210: 0x6634, - 14211: 0x6773, - 14212: 0x6E3A, - 14213: 0x732B, - 14214: 0x7AD7, - 14215: 0x82D7, - 14216: 0x9328, - 14217: 0x52D9, - 14218: 0x5DEB, - 14219: 0x61AE, - 14220: 0x61CB, - 14221: 0x620A, - 14222: 0x62C7, - 14223: 0x64AB, - 14224: 0x65E0, - 14225: 0x6959, - 14226: 0x6B66, - 14227: 0x6BCB, - 14228: 0x7121, - 14229: 0x73F7, - 14230: 0x755D, - 14231: 0x7E46, - 14232: 0x821E, - 14233: 0x8302, - 14234: 0x856A, - 14235: 0x8AA3, - 14236: 0x8CBF, - 14237: 0x9727, - 14238: 0x9D61, - 14239: 0x58A8, - 14240: 0x9ED8, - 14241: 0x5011, - 14242: 0x520E, - 14243: 0x543B, - 14244: 0x554F, - 14245: 0x6587, - 14246: 0x6C76, - 14247: 0x7D0A, - 14248: 0x7D0B, - 14249: 0x805E, - 14250: 0x868A, - 14251: 0x9580, - 14252: 0x96EF, - 14253: 0x52FF, - 14254: 0x6C95, - 14255: 0x7269, - 14256: 0x5473, - 14257: 0x5A9A, - 14258: 0x5C3E, - 14259: 0x5D4B, - 14260: 0x5F4C, - 14261: 0x5FAE, - 14262: 0x672A, - 14263: 0x68B6, - 14264: 0x6963, - 14265: 0x6E3C, - 14266: 0x6E44, - 14267: 0x7709, - 14268: 0x7C73, - 14269: 0x7F8E, - 14270: 0x8587, - 14271: 0x8B0E, - 14272: 0x8FF7, - 14273: 0x9761, - 14274: 0x9EF4, - 14275: 0x5CB7, - 14276: 0x60B6, - 14277: 0x610D, - 14278: 0x61AB, - 14279: 0x654F, - 14280: 0x65FB, - 14281: 0x65FC, - 14282: 0x6C11, - 14283: 0x6CEF, - 14284: 0x739F, - 14285: 0x73C9, - 14286: 0x7DE1, - 14287: 0x9594, - 14288: 0x5BC6, - 14289: 0x871C, - 14290: 0x8B10, - 14291: 0x525D, - 14292: 0x535A, - 14293: 0x62CD, - 14294: 0x640F, - 14295: 0x64B2, - 14296: 0x6734, - 14297: 0x6A38, - 14298: 0x6CCA, - 14299: 0x73C0, - 14300: 0x749E, - 14301: 0x7B94, - 14302: 0x7C95, - 14303: 0x7E1B, - 14304: 0x818A, - 14305: 0x8236, - 14306: 0x8584, - 14307: 0x8FEB, - 14308: 0x96F9, - 14309: 0x99C1, - 14310: 0x4F34, - 14311: 0x534A, - 14312: 0x53CD, - 14313: 0x53DB, - 14314: 0x62CC, - 14315: 0x642C, - 14316: 0x6500, - 14317: 0x6591, - 14318: 0x69C3, - 14319: 0x6CEE, - 14320: 0x6F58, - 14321: 0x73ED, - 14322: 0x7554, - 14323: 0x7622, - 14324: 0x76E4, - 14325: 0x76FC, - 14326: 0x78D0, - 14327: 0x78FB, - 14328: 0x792C, - 14329: 0x7D46, - 14330: 0x822C, - 14331: 0x87E0, - 14332: 0x8FD4, - 14333: 0x9812, - 14334: 0x98EF, - 14335: 0x52C3, - 14336: 0x62D4, - 14337: 0x64A5, - 14338: 0x6E24, - 14339: 0x6F51, - 14340: 0x767C, - 14341: 0x8DCB, - 14342: 0x91B1, - 14343: 0x9262, - 14344: 0x9AEE, - 14345: 0x9B43, - 14346: 0x5023, - 14347: 0x508D, - 14348: 0x574A, - 14349: 0x59A8, - 14350: 0x5C28, - 14351: 0x5E47, - 14352: 0x5F77, - 14353: 0x623F, - 14354: 0x653E, - 14355: 0x65B9, - 14356: 0x65C1, - 14357: 0x6609, - 14358: 0x678B, - 14359: 0x699C, - 14360: 0x6EC2, - 14361: 0x78C5, - 14362: 0x7D21, - 14363: 0x80AA, - 14364: 0x8180, - 14365: 0x822B, - 14366: 0x82B3, - 14367: 0x84A1, - 14368: 0x868C, - 14369: 0x8A2A, - 14370: 0x8B17, - 14371: 0x90A6, - 14372: 0x9632, - 14373: 0x9F90, - 14374: 0x500D, - 14375: 0x4FF3, - 14376: 0xF963, - 14377: 0x57F9, - 14378: 0x5F98, - 14379: 0x62DC, - 14380: 0x6392, - 14381: 0x676F, - 14382: 0x6E43, - 14383: 0x7119, - 14384: 0x76C3, - 14385: 0x80CC, - 14386: 0x80DA, - 14387: 0x88F4, - 14388: 0x88F5, - 14389: 0x8919, - 14390: 0x8CE0, - 14391: 0x8F29, - 14392: 0x914D, - 14393: 0x966A, - 14394: 0x4F2F, - 14395: 0x4F70, - 14396: 0x5E1B, - 14397: 0x67CF, - 14398: 0x6822, - 14399: 0x767D, - 14400: 0x767E, - 14401: 0x9B44, - 14402: 0x5E61, - 14403: 0x6A0A, - 14404: 0x7169, - 14405: 0x71D4, - 14406: 0x756A, - 14407: 0xF964, - 14408: 0x7E41, - 14409: 0x8543, - 14410: 0x85E9, - 14411: 0x98DC, - 14412: 0x4F10, - 14413: 0x7B4F, - 14414: 0x7F70, - 14415: 0x95A5, - 14416: 0x51E1, - 14417: 0x5E06, - 14418: 0x68B5, - 14419: 0x6C3E, - 14420: 0x6C4E, - 14421: 0x6CDB, - 14422: 0x72AF, - 14423: 0x7BC4, - 14424: 0x8303, - 14425: 0x6CD5, - 14426: 0x743A, - 14427: 0x50FB, - 14428: 0x5288, - 14429: 0x58C1, - 14430: 0x64D8, - 14431: 0x6A97, - 14432: 0x74A7, - 14433: 0x7656, - 14434: 0x78A7, - 14435: 0x8617, - 14436: 0x95E2, - 14437: 0x9739, - 14438: 0xF965, - 14439: 0x535E, - 14440: 0x5F01, - 14441: 0x8B8A, - 14442: 0x8FA8, - 14443: 0x8FAF, - 14444: 0x908A, - 14445: 0x5225, - 14446: 0x77A5, - 14447: 0x9C49, - 14448: 0x9F08, - 14449: 0x4E19, - 14450: 0x5002, - 14451: 0x5175, - 14452: 0x5C5B, - 14453: 0x5E77, - 14454: 0x661E, - 14455: 0x663A, - 14456: 0x67C4, - 14457: 0x68C5, - 14458: 0x70B3, - 14459: 0x7501, - 14460: 0x75C5, - 14461: 0x79C9, - 14462: 0x7ADD, - 14463: 0x8F27, - 14464: 0x9920, - 14465: 0x9A08, - 14466: 0x4FDD, - 14467: 0x5821, - 14468: 0x5831, - 14469: 0x5BF6, - 14470: 0x666E, - 14471: 0x6B65, - 14472: 0x6D11, - 14473: 0x6E7A, - 14474: 0x6F7D, - 14475: 0x73E4, - 14476: 0x752B, - 14477: 0x83E9, - 14478: 0x88DC, - 14479: 0x8913, - 14480: 0x8B5C, - 14481: 0x8F14, - 14482: 0x4F0F, - 14483: 0x50D5, - 14484: 0x5310, - 14485: 0x535C, - 14486: 0x5B93, - 14487: 0x5FA9, - 14488: 0x670D, - 14489: 0x798F, - 14490: 0x8179, - 14491: 0x832F, - 14492: 0x8514, - 14493: 0x8907, - 14494: 0x8986, - 14495: 0x8F39, - 14496: 0x8F3B, - 14497: 0x99A5, - 14498: 0x9C12, - 14499: 0x672C, - 14500: 0x4E76, - 14501: 0x4FF8, - 14502: 0x5949, - 14503: 0x5C01, - 14504: 0x5CEF, - 14505: 0x5CF0, - 14506: 0x6367, - 14507: 0x68D2, - 14508: 0x70FD, - 14509: 0x71A2, - 14510: 0x742B, - 14511: 0x7E2B, - 14512: 0x84EC, - 14513: 0x8702, - 14514: 0x9022, - 14515: 0x92D2, - 14516: 0x9CF3, - 14517: 0x4E0D, - 14518: 0x4ED8, - 14519: 0x4FEF, - 14520: 0x5085, - 14521: 0x5256, - 14522: 0x526F, - 14523: 0x5426, - 14524: 0x5490, - 14525: 0x57E0, - 14526: 0x592B, - 14527: 0x5A66, - 14528: 0x5B5A, - 14529: 0x5B75, - 14530: 0x5BCC, - 14531: 0x5E9C, - 14532: 0xF966, - 14533: 0x6276, - 14534: 0x6577, - 14535: 0x65A7, - 14536: 0x6D6E, - 14537: 0x6EA5, - 14538: 0x7236, - 14539: 0x7B26, - 14540: 0x7C3F, - 14541: 0x7F36, - 14542: 0x8150, - 14543: 0x8151, - 14544: 0x819A, - 14545: 0x8240, - 14546: 0x8299, - 14547: 0x83A9, - 14548: 0x8A03, - 14549: 0x8CA0, - 14550: 0x8CE6, - 14551: 0x8CFB, - 14552: 0x8D74, - 14553: 0x8DBA, - 14554: 0x90E8, - 14555: 0x91DC, - 14556: 0x961C, - 14557: 0x9644, - 14558: 0x99D9, - 14559: 0x9CE7, - 14560: 0x5317, - 14561: 0x5206, - 14562: 0x5429, - 14563: 0x5674, - 14564: 0x58B3, - 14565: 0x5954, - 14566: 0x596E, - 14567: 0x5FFF, - 14568: 0x61A4, - 14569: 0x626E, - 14570: 0x6610, - 14571: 0x6C7E, - 14572: 0x711A, - 14573: 0x76C6, - 14574: 0x7C89, - 14575: 0x7CDE, - 14576: 0x7D1B, - 14577: 0x82AC, - 14578: 0x8CC1, - 14579: 0x96F0, - 14580: 0xF967, - 14581: 0x4F5B, - 14582: 0x5F17, - 14583: 0x5F7F, - 14584: 0x62C2, - 14585: 0x5D29, - 14586: 0x670B, - 14587: 0x68DA, - 14588: 0x787C, - 14589: 0x7E43, - 14590: 0x9D6C, - 14591: 0x4E15, - 14592: 0x5099, - 14593: 0x5315, - 14594: 0x532A, - 14595: 0x5351, - 14596: 0x5983, - 14597: 0x5A62, - 14598: 0x5E87, - 14599: 0x60B2, - 14600: 0x618A, - 14601: 0x6249, - 14602: 0x6279, - 14603: 0x6590, - 14604: 0x6787, - 14605: 0x69A7, - 14606: 0x6BD4, - 14607: 0x6BD6, - 14608: 0x6BD7, - 14609: 0x6BD8, - 14610: 0x6CB8, - 14611: 0xF968, - 14612: 0x7435, - 14613: 0x75FA, - 14614: 0x7812, - 14615: 0x7891, - 14616: 0x79D5, - 14617: 0x79D8, - 14618: 0x7C83, - 14619: 0x7DCB, - 14620: 0x7FE1, - 14621: 0x80A5, - 14622: 0x813E, - 14623: 0x81C2, - 14624: 0x83F2, - 14625: 0x871A, - 14626: 0x88E8, - 14627: 0x8AB9, - 14628: 0x8B6C, - 14629: 0x8CBB, - 14630: 0x9119, - 14631: 0x975E, - 14632: 0x98DB, - 14633: 0x9F3B, - 14634: 0x56AC, - 14635: 0x5B2A, - 14636: 0x5F6C, - 14637: 0x658C, - 14638: 0x6AB3, - 14639: 0x6BAF, - 14640: 0x6D5C, - 14641: 0x6FF1, - 14642: 0x7015, - 14643: 0x725D, - 14644: 0x73AD, - 14645: 0x8CA7, - 14646: 0x8CD3, - 14647: 0x983B, - 14648: 0x6191, - 14649: 0x6C37, - 14650: 0x8058, - 14651: 0x9A01, - 14652: 0x4E4D, - 14653: 0x4E8B, - 14654: 0x4E9B, - 14655: 0x4ED5, - 14656: 0x4F3A, - 14657: 0x4F3C, - 14658: 0x4F7F, - 14659: 0x4FDF, - 14660: 0x50FF, - 14661: 0x53F2, - 14662: 0x53F8, - 14663: 0x5506, - 14664: 0x55E3, - 14665: 0x56DB, - 14666: 0x58EB, - 14667: 0x5962, - 14668: 0x5A11, - 14669: 0x5BEB, - 14670: 0x5BFA, - 14671: 0x5C04, - 14672: 0x5DF3, - 14673: 0x5E2B, - 14674: 0x5F99, - 14675: 0x601D, - 14676: 0x6368, - 14677: 0x659C, - 14678: 0x65AF, - 14679: 0x67F6, - 14680: 0x67FB, - 14681: 0x68AD, - 14682: 0x6B7B, - 14683: 0x6C99, - 14684: 0x6CD7, - 14685: 0x6E23, - 14686: 0x7009, - 14687: 0x7345, - 14688: 0x7802, - 14689: 0x793E, - 14690: 0x7940, - 14691: 0x7960, - 14692: 0x79C1, - 14693: 0x7BE9, - 14694: 0x7D17, - 14695: 0x7D72, - 14696: 0x8086, - 14697: 0x820D, - 14698: 0x838E, - 14699: 0x84D1, - 14700: 0x86C7, - 14701: 0x88DF, - 14702: 0x8A50, - 14703: 0x8A5E, - 14704: 0x8B1D, - 14705: 0x8CDC, - 14706: 0x8D66, - 14707: 0x8FAD, - 14708: 0x90AA, - 14709: 0x98FC, - 14710: 0x99DF, - 14711: 0x9E9D, - 14712: 0x524A, - 14713: 0xF969, - 14714: 0x6714, - 14715: 0xF96A, - 14716: 0x5098, - 14717: 0x522A, - 14718: 0x5C71, - 14719: 0x6563, - 14720: 0x6C55, - 14721: 0x73CA, - 14722: 0x7523, - 14723: 0x759D, - 14724: 0x7B97, - 14725: 0x849C, - 14726: 0x9178, - 14727: 0x9730, - 14728: 0x4E77, - 14729: 0x6492, - 14730: 0x6BBA, - 14731: 0x715E, - 14732: 0x85A9, - 14733: 0x4E09, - 14734: 0xF96B, - 14735: 0x6749, - 14736: 0x68EE, - 14737: 0x6E17, - 14738: 0x829F, - 14739: 0x8518, - 14740: 0x886B, - 14741: 0x63F7, - 14742: 0x6F81, - 14743: 0x9212, - 14744: 0x98AF, - 14745: 0x4E0A, - 14746: 0x50B7, - 14747: 0x50CF, - 14748: 0x511F, - 14749: 0x5546, - 14750: 0x55AA, - 14751: 0x5617, - 14752: 0x5B40, - 14753: 0x5C19, - 14754: 0x5CE0, - 14755: 0x5E38, - 14756: 0x5E8A, - 14757: 0x5EA0, - 14758: 0x5EC2, - 14759: 0x60F3, - 14760: 0x6851, - 14761: 0x6A61, - 14762: 0x6E58, - 14763: 0x723D, - 14764: 0x7240, - 14765: 0x72C0, - 14766: 0x76F8, - 14767: 0x7965, - 14768: 0x7BB1, - 14769: 0x7FD4, - 14770: 0x88F3, - 14771: 0x89F4, - 14772: 0x8A73, - 14773: 0x8C61, - 14774: 0x8CDE, - 14775: 0x971C, - 14776: 0x585E, - 14777: 0x74BD, - 14778: 0x8CFD, - 14779: 0x55C7, - 14780: 0xF96C, - 14781: 0x7A61, - 14782: 0x7D22, - 14783: 0x8272, - 14784: 0x7272, - 14785: 0x751F, - 14786: 0x7525, - 14787: 0xF96D, - 14788: 0x7B19, - 14789: 0x5885, - 14790: 0x58FB, - 14791: 0x5DBC, - 14792: 0x5E8F, - 14793: 0x5EB6, - 14794: 0x5F90, - 14795: 0x6055, - 14796: 0x6292, - 14797: 0x637F, - 14798: 0x654D, - 14799: 0x6691, - 14800: 0x66D9, - 14801: 0x66F8, - 14802: 0x6816, - 14803: 0x68F2, - 14804: 0x7280, - 14805: 0x745E, - 14806: 0x7B6E, - 14807: 0x7D6E, - 14808: 0x7DD6, - 14809: 0x7F72, - 14810: 0x80E5, - 14811: 0x8212, - 14812: 0x85AF, - 14813: 0x897F, - 14814: 0x8A93, - 14815: 0x901D, - 14816: 0x92E4, - 14817: 0x9ECD, - 14818: 0x9F20, - 14819: 0x5915, - 14820: 0x596D, - 14821: 0x5E2D, - 14822: 0x60DC, - 14823: 0x6614, - 14824: 0x6673, - 14825: 0x6790, - 14826: 0x6C50, - 14827: 0x6DC5, - 14828: 0x6F5F, - 14829: 0x77F3, - 14830: 0x78A9, - 14831: 0x84C6, - 14832: 0x91CB, - 14833: 0x932B, - 14834: 0x4ED9, - 14835: 0x50CA, - 14836: 0x5148, - 14837: 0x5584, - 14838: 0x5B0B, - 14839: 0x5BA3, - 14840: 0x6247, - 14841: 0x657E, - 14842: 0x65CB, - 14843: 0x6E32, - 14844: 0x717D, - 14845: 0x7401, - 14846: 0x7444, - 14847: 0x7487, - 14848: 0x74BF, - 14849: 0x766C, - 14850: 0x79AA, - 14851: 0x7DDA, - 14852: 0x7E55, - 14853: 0x7FA8, - 14854: 0x817A, - 14855: 0x81B3, - 14856: 0x8239, - 14857: 0x861A, - 14858: 0x87EC, - 14859: 0x8A75, - 14860: 0x8DE3, - 14861: 0x9078, - 14862: 0x9291, - 14863: 0x9425, - 14864: 0x994D, - 14865: 0x9BAE, - 14866: 0x5368, - 14867: 0x5C51, - 14868: 0x6954, - 14869: 0x6CC4, - 14870: 0x6D29, - 14871: 0x6E2B, - 14872: 0x820C, - 14873: 0x859B, - 14874: 0x893B, - 14875: 0x8A2D, - 14876: 0x8AAA, - 14877: 0x96EA, - 14878: 0x9F67, - 14879: 0x5261, - 14880: 0x66B9, - 14881: 0x6BB2, - 14882: 0x7E96, - 14883: 0x87FE, - 14884: 0x8D0D, - 14885: 0x9583, - 14886: 0x965D, - 14887: 0x651D, - 14888: 0x6D89, - 14889: 0x71EE, - 14890: 0xF96E, - 14891: 0x57CE, - 14892: 0x59D3, - 14893: 0x5BAC, - 14894: 0x6027, - 14895: 0x60FA, - 14896: 0x6210, - 14897: 0x661F, - 14898: 0x665F, - 14899: 0x7329, - 14900: 0x73F9, - 14901: 0x76DB, - 14902: 0x7701, - 14903: 0x7B6C, - 14904: 0x8056, - 14905: 0x8072, - 14906: 0x8165, - 14907: 0x8AA0, - 14908: 0x9192, - 14909: 0x4E16, - 14910: 0x52E2, - 14911: 0x6B72, - 14912: 0x6D17, - 14913: 0x7A05, - 14914: 0x7B39, - 14915: 0x7D30, - 14916: 0xF96F, - 14917: 0x8CB0, - 14918: 0x53EC, - 14919: 0x562F, - 14920: 0x5851, - 14921: 0x5BB5, - 14922: 0x5C0F, - 14923: 0x5C11, - 14924: 0x5DE2, - 14925: 0x6240, - 14926: 0x6383, - 14927: 0x6414, - 14928: 0x662D, - 14929: 0x68B3, - 14930: 0x6CBC, - 14931: 0x6D88, - 14932: 0x6EAF, - 14933: 0x701F, - 14934: 0x70A4, - 14935: 0x71D2, - 14936: 0x7526, - 14937: 0x758F, - 14938: 0x758E, - 14939: 0x7619, - 14940: 0x7B11, - 14941: 0x7BE0, - 14942: 0x7C2B, - 14943: 0x7D20, - 14944: 0x7D39, - 14945: 0x852C, - 14946: 0x856D, - 14947: 0x8607, - 14948: 0x8A34, - 14949: 0x900D, - 14950: 0x9061, - 14951: 0x90B5, - 14952: 0x92B7, - 14953: 0x97F6, - 14954: 0x9A37, - 14955: 0x4FD7, - 14956: 0x5C6C, - 14957: 0x675F, - 14958: 0x6D91, - 14959: 0x7C9F, - 14960: 0x7E8C, - 14961: 0x8B16, - 14962: 0x8D16, - 14963: 0x901F, - 14964: 0x5B6B, - 14965: 0x5DFD, - 14966: 0x640D, - 14967: 0x84C0, - 14968: 0x905C, - 14969: 0x98E1, - 14970: 0x7387, - 14971: 0x5B8B, - 14972: 0x609A, - 14973: 0x677E, - 14974: 0x6DDE, - 14975: 0x8A1F, - 14976: 0x8AA6, - 14977: 0x9001, - 14978: 0x980C, - 14979: 0x5237, - 14980: 0xF970, - 14981: 0x7051, - 14982: 0x788E, - 14983: 0x9396, - 14984: 0x8870, - 14985: 0x91D7, - 14986: 0x4FEE, - 14987: 0x53D7, - 14988: 0x55FD, - 14989: 0x56DA, - 14990: 0x5782, - 14991: 0x58FD, - 14992: 0x5AC2, - 14993: 0x5B88, - 14994: 0x5CAB, - 14995: 0x5CC0, - 14996: 0x5E25, - 14997: 0x6101, - 14998: 0x620D, - 14999: 0x624B, - 15000: 0x6388, - 15001: 0x641C, - 15002: 0x6536, - 15003: 0x6578, - 15004: 0x6A39, - 15005: 0x6B8A, - 15006: 0x6C34, - 15007: 0x6D19, - 15008: 0x6F31, - 15009: 0x71E7, - 15010: 0x72E9, - 15011: 0x7378, - 15012: 0x7407, - 15013: 0x74B2, - 15014: 0x7626, - 15015: 0x7761, - 15016: 0x79C0, - 15017: 0x7A57, - 15018: 0x7AEA, - 15019: 0x7CB9, - 15020: 0x7D8F, - 15021: 0x7DAC, - 15022: 0x7E61, - 15023: 0x7F9E, - 15024: 0x8129, - 15025: 0x8331, - 15026: 0x8490, - 15027: 0x84DA, - 15028: 0x85EA, - 15029: 0x8896, - 15030: 0x8AB0, - 15031: 0x8B90, - 15032: 0x8F38, - 15033: 0x9042, - 15034: 0x9083, - 15035: 0x916C, - 15036: 0x9296, - 15037: 0x92B9, - 15038: 0x968B, - 15039: 0x96A7, - 15040: 0x96A8, - 15041: 0x96D6, - 15042: 0x9700, - 15043: 0x9808, - 15044: 0x9996, - 15045: 0x9AD3, - 15046: 0x9B1A, - 15047: 0x53D4, - 15048: 0x587E, - 15049: 0x5919, - 15050: 0x5B70, - 15051: 0x5BBF, - 15052: 0x6DD1, - 15053: 0x6F5A, - 15054: 0x719F, - 15055: 0x7421, - 15056: 0x74B9, - 15057: 0x8085, - 15058: 0x83FD, - 15059: 0x5DE1, - 15060: 0x5F87, - 15061: 0x5FAA, - 15062: 0x6042, - 15063: 0x65EC, - 15064: 0x6812, - 15065: 0x696F, - 15066: 0x6A53, - 15067: 0x6B89, - 15068: 0x6D35, - 15069: 0x6DF3, - 15070: 0x73E3, - 15071: 0x76FE, - 15072: 0x77AC, - 15073: 0x7B4D, - 15074: 0x7D14, - 15075: 0x8123, - 15076: 0x821C, - 15077: 0x8340, - 15078: 0x84F4, - 15079: 0x8563, - 15080: 0x8A62, - 15081: 0x8AC4, - 15082: 0x9187, - 15083: 0x931E, - 15084: 0x9806, - 15085: 0x99B4, - 15086: 0x620C, - 15087: 0x8853, - 15088: 0x8FF0, - 15089: 0x9265, - 15090: 0x5D07, - 15091: 0x5D27, - 15092: 0x5D69, - 15093: 0x745F, - 15094: 0x819D, - 15095: 0x8768, - 15096: 0x6FD5, - 15097: 0x62FE, - 15098: 0x7FD2, - 15099: 0x8936, - 15100: 0x8972, - 15101: 0x4E1E, - 15102: 0x4E58, - 15103: 0x50E7, - 15104: 0x52DD, - 15105: 0x5347, - 15106: 0x627F, - 15107: 0x6607, - 15108: 0x7E69, - 15109: 0x8805, - 15110: 0x965E, - 15111: 0x4F8D, - 15112: 0x5319, - 15113: 0x5636, - 15114: 0x59CB, - 15115: 0x5AA4, - 15116: 0x5C38, - 15117: 0x5C4E, - 15118: 0x5C4D, - 15119: 0x5E02, - 15120: 0x5F11, - 15121: 0x6043, - 15122: 0x65BD, - 15123: 0x662F, - 15124: 0x6642, - 15125: 0x67BE, - 15126: 0x67F4, - 15127: 0x731C, - 15128: 0x77E2, - 15129: 0x793A, - 15130: 0x7FC5, - 15131: 0x8494, - 15132: 0x84CD, - 15133: 0x8996, - 15134: 0x8A66, - 15135: 0x8A69, - 15136: 0x8AE1, - 15137: 0x8C55, - 15138: 0x8C7A, - 15139: 0x57F4, - 15140: 0x5BD4, - 15141: 0x5F0F, - 15142: 0x606F, - 15143: 0x62ED, - 15144: 0x690D, - 15145: 0x6B96, - 15146: 0x6E5C, - 15147: 0x7184, - 15148: 0x7BD2, - 15149: 0x8755, - 15150: 0x8B58, - 15151: 0x8EFE, - 15152: 0x98DF, - 15153: 0x98FE, - 15154: 0x4F38, - 15155: 0x4F81, - 15156: 0x4FE1, - 15157: 0x547B, - 15158: 0x5A20, - 15159: 0x5BB8, - 15160: 0x613C, - 15161: 0x65B0, - 15162: 0x6668, - 15163: 0x71FC, - 15164: 0x7533, - 15165: 0x795E, - 15166: 0x7D33, - 15167: 0x814E, - 15168: 0x81E3, - 15169: 0x8398, - 15170: 0x85AA, - 15171: 0x85CE, - 15172: 0x8703, - 15173: 0x8A0A, - 15174: 0x8EAB, - 15175: 0x8F9B, - 15176: 0xF971, - 15177: 0x8FC5, - 15178: 0x5931, - 15179: 0x5BA4, - 15180: 0x5BE6, - 15181: 0x6089, - 15182: 0x5BE9, - 15183: 0x5C0B, - 15184: 0x5FC3, - 15185: 0x6C81, - 15186: 0xF972, - 15187: 0x6DF1, - 15188: 0x700B, - 15189: 0x751A, - 15190: 0x82AF, - 15191: 0x8AF6, - 15192: 0x4EC0, - 15193: 0x5341, - 15194: 0xF973, - 15195: 0x96D9, - 15196: 0x6C0F, - 15197: 0x4E9E, - 15198: 0x4FC4, - 15199: 0x5152, - 15200: 0x555E, - 15201: 0x5A25, - 15202: 0x5CE8, - 15203: 0x6211, - 15204: 0x7259, - 15205: 0x82BD, - 15206: 0x83AA, - 15207: 0x86FE, - 15208: 0x8859, - 15209: 0x8A1D, - 15210: 0x963F, - 15211: 0x96C5, - 15212: 0x9913, - 15213: 0x9D09, - 15214: 0x9D5D, - 15215: 0x580A, - 15216: 0x5CB3, - 15217: 0x5DBD, - 15218: 0x5E44, - 15219: 0x60E1, - 15220: 0x6115, - 15221: 0x63E1, - 15222: 0x6A02, - 15223: 0x6E25, - 15224: 0x9102, - 15225: 0x9354, - 15226: 0x984E, - 15227: 0x9C10, - 15228: 0x9F77, - 15229: 0x5B89, - 15230: 0x5CB8, - 15231: 0x6309, - 15232: 0x664F, - 15233: 0x6848, - 15234: 0x773C, - 15235: 0x96C1, - 15236: 0x978D, - 15237: 0x9854, - 15238: 0x9B9F, - 15239: 0x65A1, - 15240: 0x8B01, - 15241: 0x8ECB, - 15242: 0x95BC, - 15243: 0x5535, - 15244: 0x5CA9, - 15245: 0x5DD6, - 15246: 0x5EB5, - 15247: 0x6697, - 15248: 0x764C, - 15249: 0x83F4, - 15250: 0x95C7, - 15251: 0x58D3, - 15252: 0x62BC, - 15253: 0x72CE, - 15254: 0x9D28, - 15255: 0x4EF0, - 15256: 0x592E, - 15257: 0x600F, - 15258: 0x663B, - 15259: 0x6B83, - 15260: 0x79E7, - 15261: 0x9D26, - 15262: 0x5393, - 15263: 0x54C0, - 15264: 0x57C3, - 15265: 0x5D16, - 15266: 0x611B, - 15267: 0x66D6, - 15268: 0x6DAF, - 15269: 0x788D, - 15270: 0x827E, - 15271: 0x9698, - 15272: 0x9744, - 15273: 0x5384, - 15274: 0x627C, - 15275: 0x6396, - 15276: 0x6DB2, - 15277: 0x7E0A, - 15278: 0x814B, - 15279: 0x984D, - 15280: 0x6AFB, - 15281: 0x7F4C, - 15282: 0x9DAF, - 15283: 0x9E1A, - 15284: 0x4E5F, - 15285: 0x503B, - 15286: 0x51B6, - 15287: 0x591C, - 15288: 0x60F9, - 15289: 0x63F6, - 15290: 0x6930, - 15291: 0x723A, - 15292: 0x8036, - 15293: 0xF974, - 15294: 0x91CE, - 15295: 0x5F31, - 15296: 0xF975, - 15297: 0xF976, - 15298: 0x7D04, - 15299: 0x82E5, - 15300: 0x846F, - 15301: 0x84BB, - 15302: 0x85E5, - 15303: 0x8E8D, - 15304: 0xF977, - 15305: 0x4F6F, - 15306: 0xF978, - 15307: 0xF979, - 15308: 0x58E4, - 15309: 0x5B43, - 15310: 0x6059, - 15311: 0x63DA, - 15312: 0x6518, - 15313: 0x656D, - 15314: 0x6698, - 15315: 0xF97A, - 15316: 0x694A, - 15317: 0x6A23, - 15318: 0x6D0B, - 15319: 0x7001, - 15320: 0x716C, - 15321: 0x75D2, - 15322: 0x760D, - 15323: 0x79B3, - 15324: 0x7A70, - 15325: 0xF97B, - 15326: 0x7F8A, - 15327: 0xF97C, - 15328: 0x8944, - 15329: 0xF97D, - 15330: 0x8B93, - 15331: 0x91C0, - 15332: 0x967D, - 15333: 0xF97E, - 15334: 0x990A, - 15335: 0x5704, - 15336: 0x5FA1, - 15337: 0x65BC, - 15338: 0x6F01, - 15339: 0x7600, - 15340: 0x79A6, - 15341: 0x8A9E, - 15342: 0x99AD, - 15343: 0x9B5A, - 15344: 0x9F6C, - 15345: 0x5104, - 15346: 0x61B6, - 15347: 0x6291, - 15348: 0x6A8D, - 15349: 0x81C6, - 15350: 0x5043, - 15351: 0x5830, - 15352: 0x5F66, - 15353: 0x7109, - 15354: 0x8A00, - 15355: 0x8AFA, - 15356: 0x5B7C, - 15357: 0x8616, - 15358: 0x4FFA, - 15359: 0x513C, - 15360: 0x56B4, - 15361: 0x5944, - 15362: 0x63A9, - 15363: 0x6DF9, - 15364: 0x5DAA, - 15365: 0x696D, - 15366: 0x5186, - 15367: 0x4E88, - 15368: 0x4F59, - 15369: 0xF97F, - 15370: 0xF980, - 15371: 0xF981, - 15372: 0x5982, - 15373: 0xF982, - 15374: 0xF983, - 15375: 0x6B5F, - 15376: 0x6C5D, - 15377: 0xF984, - 15378: 0x74B5, - 15379: 0x7916, - 15380: 0xF985, - 15381: 0x8207, - 15382: 0x8245, - 15383: 0x8339, - 15384: 0x8F3F, - 15385: 0x8F5D, - 15386: 0xF986, - 15387: 0x9918, - 15388: 0xF987, - 15389: 0xF988, - 15390: 0xF989, - 15391: 0x4EA6, - 15392: 0xF98A, - 15393: 0x57DF, - 15394: 0x5F79, - 15395: 0x6613, - 15396: 0xF98B, - 15397: 0xF98C, - 15398: 0x75AB, - 15399: 0x7E79, - 15400: 0x8B6F, - 15401: 0xF98D, - 15402: 0x9006, - 15403: 0x9A5B, - 15404: 0x56A5, - 15405: 0x5827, - 15406: 0x59F8, - 15407: 0x5A1F, - 15408: 0x5BB4, - 15409: 0xF98E, - 15410: 0x5EF6, - 15411: 0xF98F, - 15412: 0xF990, - 15413: 0x6350, - 15414: 0x633B, - 15415: 0xF991, - 15416: 0x693D, - 15417: 0x6C87, - 15418: 0x6CBF, - 15419: 0x6D8E, - 15420: 0x6D93, - 15421: 0x6DF5, - 15422: 0x6F14, - 15423: 0xF992, - 15424: 0x70DF, - 15425: 0x7136, - 15426: 0x7159, - 15427: 0xF993, - 15428: 0x71C3, - 15429: 0x71D5, - 15430: 0xF994, - 15431: 0x784F, - 15432: 0x786F, - 15433: 0xF995, - 15434: 0x7B75, - 15435: 0x7DE3, - 15436: 0xF996, - 15437: 0x7E2F, - 15438: 0xF997, - 15439: 0x884D, - 15440: 0x8EDF, - 15441: 0xF998, - 15442: 0xF999, - 15443: 0xF99A, - 15444: 0x925B, - 15445: 0xF99B, - 15446: 0x9CF6, - 15447: 0xF99C, - 15448: 0xF99D, - 15449: 0xF99E, - 15450: 0x6085, - 15451: 0x6D85, - 15452: 0xF99F, - 15453: 0x71B1, - 15454: 0xF9A0, - 15455: 0xF9A1, - 15456: 0x95B1, - 15457: 0x53AD, - 15458: 0xF9A2, - 15459: 0xF9A3, - 15460: 0xF9A4, - 15461: 0x67D3, - 15462: 0xF9A5, - 15463: 0x708E, - 15464: 0x7130, - 15465: 0x7430, - 15466: 0x8276, - 15467: 0x82D2, - 15468: 0xF9A6, - 15469: 0x95BB, - 15470: 0x9AE5, - 15471: 0x9E7D, - 15472: 0x66C4, - 15473: 0xF9A7, - 15474: 0x71C1, - 15475: 0x8449, - 15476: 0xF9A8, - 15477: 0xF9A9, - 15478: 0x584B, - 15479: 0xF9AA, - 15480: 0xF9AB, - 15481: 0x5DB8, - 15482: 0x5F71, - 15483: 0xF9AC, - 15484: 0x6620, - 15485: 0x668E, - 15486: 0x6979, - 15487: 0x69AE, - 15488: 0x6C38, - 15489: 0x6CF3, - 15490: 0x6E36, - 15491: 0x6F41, - 15492: 0x6FDA, - 15493: 0x701B, - 15494: 0x702F, - 15495: 0x7150, - 15496: 0x71DF, - 15497: 0x7370, - 15498: 0xF9AD, - 15499: 0x745B, - 15500: 0xF9AE, - 15501: 0x74D4, - 15502: 0x76C8, - 15503: 0x7A4E, - 15504: 0x7E93, - 15505: 0xF9AF, - 15506: 0xF9B0, - 15507: 0x82F1, - 15508: 0x8A60, - 15509: 0x8FCE, - 15510: 0xF9B1, - 15511: 0x9348, - 15512: 0xF9B2, - 15513: 0x9719, - 15514: 0xF9B3, - 15515: 0xF9B4, - 15516: 0x4E42, - 15517: 0x502A, - 15518: 0xF9B5, - 15519: 0x5208, - 15520: 0x53E1, - 15521: 0x66F3, - 15522: 0x6C6D, - 15523: 0x6FCA, - 15524: 0x730A, - 15525: 0x777F, - 15526: 0x7A62, - 15527: 0x82AE, - 15528: 0x85DD, - 15529: 0x8602, - 15530: 0xF9B6, - 15531: 0x88D4, - 15532: 0x8A63, - 15533: 0x8B7D, - 15534: 0x8C6B, - 15535: 0xF9B7, - 15536: 0x92B3, - 15537: 0xF9B8, - 15538: 0x9713, - 15539: 0x9810, - 15540: 0x4E94, - 15541: 0x4F0D, - 15542: 0x4FC9, - 15543: 0x50B2, - 15544: 0x5348, - 15545: 0x543E, - 15546: 0x5433, - 15547: 0x55DA, - 15548: 0x5862, - 15549: 0x58BA, - 15550: 0x5967, - 15551: 0x5A1B, - 15552: 0x5BE4, - 15553: 0x609F, - 15554: 0xF9B9, - 15555: 0x61CA, - 15556: 0x6556, - 15557: 0x65FF, - 15558: 0x6664, - 15559: 0x68A7, - 15560: 0x6C5A, - 15561: 0x6FB3, - 15562: 0x70CF, - 15563: 0x71AC, - 15564: 0x7352, - 15565: 0x7B7D, - 15566: 0x8708, - 15567: 0x8AA4, - 15568: 0x9C32, - 15569: 0x9F07, - 15570: 0x5C4B, - 15571: 0x6C83, - 15572: 0x7344, - 15573: 0x7389, - 15574: 0x923A, - 15575: 0x6EAB, - 15576: 0x7465, - 15577: 0x761F, - 15578: 0x7A69, - 15579: 0x7E15, - 15580: 0x860A, - 15581: 0x5140, - 15582: 0x58C5, - 15583: 0x64C1, - 15584: 0x74EE, - 15585: 0x7515, - 15586: 0x7670, - 15587: 0x7FC1, - 15588: 0x9095, - 15589: 0x96CD, - 15590: 0x9954, - 15591: 0x6E26, - 15592: 0x74E6, - 15593: 0x7AA9, - 15594: 0x7AAA, - 15595: 0x81E5, - 15596: 0x86D9, - 15597: 0x8778, - 15598: 0x8A1B, - 15599: 0x5A49, - 15600: 0x5B8C, - 15601: 0x5B9B, - 15602: 0x68A1, - 15603: 0x6900, - 15604: 0x6D63, - 15605: 0x73A9, - 15606: 0x7413, - 15607: 0x742C, - 15608: 0x7897, - 15609: 0x7DE9, - 15610: 0x7FEB, - 15611: 0x8118, - 15612: 0x8155, - 15613: 0x839E, - 15614: 0x8C4C, - 15615: 0x962E, - 15616: 0x9811, - 15617: 0x66F0, - 15618: 0x5F80, - 15619: 0x65FA, - 15620: 0x6789, - 15621: 0x6C6A, - 15622: 0x738B, - 15623: 0x502D, - 15624: 0x5A03, - 15625: 0x6B6A, - 15626: 0x77EE, - 15627: 0x5916, - 15628: 0x5D6C, - 15629: 0x5DCD, - 15630: 0x7325, - 15631: 0x754F, - 15632: 0xF9BA, - 15633: 0xF9BB, - 15634: 0x50E5, - 15635: 0x51F9, - 15636: 0x582F, - 15637: 0x592D, - 15638: 0x5996, - 15639: 0x59DA, - 15640: 0x5BE5, - 15641: 0xF9BC, - 15642: 0xF9BD, - 15643: 0x5DA2, - 15644: 0x62D7, - 15645: 0x6416, - 15646: 0x6493, - 15647: 0x64FE, - 15648: 0xF9BE, - 15649: 0x66DC, - 15650: 0xF9BF, - 15651: 0x6A48, - 15652: 0xF9C0, - 15653: 0x71FF, - 15654: 0x7464, - 15655: 0xF9C1, - 15656: 0x7A88, - 15657: 0x7AAF, - 15658: 0x7E47, - 15659: 0x7E5E, - 15660: 0x8000, - 15661: 0x8170, - 15662: 0xF9C2, - 15663: 0x87EF, - 15664: 0x8981, - 15665: 0x8B20, - 15666: 0x9059, - 15667: 0xF9C3, - 15668: 0x9080, - 15669: 0x9952, - 15670: 0x617E, - 15671: 0x6B32, - 15672: 0x6D74, - 15673: 0x7E1F, - 15674: 0x8925, - 15675: 0x8FB1, - 15676: 0x4FD1, - 15677: 0x50AD, - 15678: 0x5197, - 15679: 0x52C7, - 15680: 0x57C7, - 15681: 0x5889, - 15682: 0x5BB9, - 15683: 0x5EB8, - 15684: 0x6142, - 15685: 0x6995, - 15686: 0x6D8C, - 15687: 0x6E67, - 15688: 0x6EB6, - 15689: 0x7194, - 15690: 0x7462, - 15691: 0x7528, - 15692: 0x752C, - 15693: 0x8073, - 15694: 0x8338, - 15695: 0x84C9, - 15696: 0x8E0A, - 15697: 0x9394, - 15698: 0x93DE, - 15699: 0xF9C4, - 15700: 0x4E8E, - 15701: 0x4F51, - 15702: 0x5076, - 15703: 0x512A, - 15704: 0x53C8, - 15705: 0x53CB, - 15706: 0x53F3, - 15707: 0x5B87, - 15708: 0x5BD3, - 15709: 0x5C24, - 15710: 0x611A, - 15711: 0x6182, - 15712: 0x65F4, - 15713: 0x725B, - 15714: 0x7397, - 15715: 0x7440, - 15716: 0x76C2, - 15717: 0x7950, - 15718: 0x7991, - 15719: 0x79B9, - 15720: 0x7D06, - 15721: 0x7FBD, - 15722: 0x828B, - 15723: 0x85D5, - 15724: 0x865E, - 15725: 0x8FC2, - 15726: 0x9047, - 15727: 0x90F5, - 15728: 0x91EA, - 15729: 0x9685, - 15730: 0x96E8, - 15731: 0x96E9, - 15732: 0x52D6, - 15733: 0x5F67, - 15734: 0x65ED, - 15735: 0x6631, - 15736: 0x682F, - 15737: 0x715C, - 15738: 0x7A36, - 15739: 0x90C1, - 15740: 0x980A, - 15741: 0x4E91, - 15742: 0xF9C5, - 15743: 0x6A52, - 15744: 0x6B9E, - 15745: 0x6F90, - 15746: 0x7189, - 15747: 0x8018, - 15748: 0x82B8, - 15749: 0x8553, - 15750: 0x904B, - 15751: 0x9695, - 15752: 0x96F2, - 15753: 0x97FB, - 15754: 0x851A, - 15755: 0x9B31, - 15756: 0x4E90, - 15757: 0x718A, - 15758: 0x96C4, - 15759: 0x5143, - 15760: 0x539F, - 15761: 0x54E1, - 15762: 0x5713, - 15763: 0x5712, - 15764: 0x57A3, - 15765: 0x5A9B, - 15766: 0x5AC4, - 15767: 0x5BC3, - 15768: 0x6028, - 15769: 0x613F, - 15770: 0x63F4, - 15771: 0x6C85, - 15772: 0x6D39, - 15773: 0x6E72, - 15774: 0x6E90, - 15775: 0x7230, - 15776: 0x733F, - 15777: 0x7457, - 15778: 0x82D1, - 15779: 0x8881, - 15780: 0x8F45, - 15781: 0x9060, - 15782: 0xF9C6, - 15783: 0x9662, - 15784: 0x9858, - 15785: 0x9D1B, - 15786: 0x6708, - 15787: 0x8D8A, - 15788: 0x925E, - 15789: 0x4F4D, - 15790: 0x5049, - 15791: 0x50DE, - 15792: 0x5371, - 15793: 0x570D, - 15794: 0x59D4, - 15795: 0x5A01, - 15796: 0x5C09, - 15797: 0x6170, - 15798: 0x6690, - 15799: 0x6E2D, - 15800: 0x7232, - 15801: 0x744B, - 15802: 0x7DEF, - 15803: 0x80C3, - 15804: 0x840E, - 15805: 0x8466, - 15806: 0x853F, - 15807: 0x875F, - 15808: 0x885B, - 15809: 0x8918, - 15810: 0x8B02, - 15811: 0x9055, - 15812: 0x97CB, - 15813: 0x9B4F, - 15814: 0x4E73, - 15815: 0x4F91, - 15816: 0x5112, - 15817: 0x516A, - 15818: 0xF9C7, - 15819: 0x552F, - 15820: 0x55A9, - 15821: 0x5B7A, - 15822: 0x5BA5, - 15823: 0x5E7C, - 15824: 0x5E7D, - 15825: 0x5EBE, - 15826: 0x60A0, - 15827: 0x60DF, - 15828: 0x6108, - 15829: 0x6109, - 15830: 0x63C4, - 15831: 0x6538, - 15832: 0x6709, - 15833: 0xF9C8, - 15834: 0x67D4, - 15835: 0x67DA, - 15836: 0xF9C9, - 15837: 0x6961, - 15838: 0x6962, - 15839: 0x6CB9, - 15840: 0x6D27, - 15841: 0xF9CA, - 15842: 0x6E38, - 15843: 0xF9CB, - 15844: 0x6FE1, - 15845: 0x7336, - 15846: 0x7337, - 15847: 0xF9CC, - 15848: 0x745C, - 15849: 0x7531, - 15850: 0xF9CD, - 15851: 0x7652, - 15852: 0xF9CE, - 15853: 0xF9CF, - 15854: 0x7DAD, - 15855: 0x81FE, - 15856: 0x8438, - 15857: 0x88D5, - 15858: 0x8A98, - 15859: 0x8ADB, - 15860: 0x8AED, - 15861: 0x8E30, - 15862: 0x8E42, - 15863: 0x904A, - 15864: 0x903E, - 15865: 0x907A, - 15866: 0x9149, - 15867: 0x91C9, - 15868: 0x936E, - 15869: 0xF9D0, - 15870: 0xF9D1, - 15871: 0x5809, - 15872: 0xF9D2, - 15873: 0x6BD3, - 15874: 0x8089, - 15875: 0x80B2, - 15876: 0xF9D3, - 15877: 0xF9D4, - 15878: 0x5141, - 15879: 0x596B, - 15880: 0x5C39, - 15881: 0xF9D5, - 15882: 0xF9D6, - 15883: 0x6F64, - 15884: 0x73A7, - 15885: 0x80E4, - 15886: 0x8D07, - 15887: 0xF9D7, - 15888: 0x9217, - 15889: 0x958F, - 15890: 0xF9D8, - 15891: 0xF9D9, - 15892: 0xF9DA, - 15893: 0xF9DB, - 15894: 0x807F, - 15895: 0x620E, - 15896: 0x701C, - 15897: 0x7D68, - 15898: 0x878D, - 15899: 0xF9DC, - 15900: 0x57A0, - 15901: 0x6069, - 15902: 0x6147, - 15903: 0x6BB7, - 15904: 0x8ABE, - 15905: 0x9280, - 15906: 0x96B1, - 15907: 0x4E59, - 15908: 0x541F, - 15909: 0x6DEB, - 15910: 0x852D, - 15911: 0x9670, - 15912: 0x97F3, - 15913: 0x98EE, - 15914: 0x63D6, - 15915: 0x6CE3, - 15916: 0x9091, - 15917: 0x51DD, - 15918: 0x61C9, - 15919: 0x81BA, - 15920: 0x9DF9, - 15921: 0x4F9D, - 15922: 0x501A, - 15923: 0x5100, - 15924: 0x5B9C, - 15925: 0x610F, - 15926: 0x61FF, - 15927: 0x64EC, - 15928: 0x6905, - 15929: 0x6BC5, - 15930: 0x7591, - 15931: 0x77E3, - 15932: 0x7FA9, - 15933: 0x8264, - 15934: 0x858F, - 15935: 0x87FB, - 15936: 0x8863, - 15937: 0x8ABC, - 15938: 0x8B70, - 15939: 0x91AB, - 15940: 0x4E8C, - 15941: 0x4EE5, - 15942: 0x4F0A, - 15943: 0xF9DD, - 15944: 0xF9DE, - 15945: 0x5937, - 15946: 0x59E8, - 15947: 0xF9DF, - 15948: 0x5DF2, - 15949: 0x5F1B, - 15950: 0x5F5B, - 15951: 0x6021, - 15952: 0xF9E0, - 15953: 0xF9E1, - 15954: 0xF9E2, - 15955: 0xF9E3, - 15956: 0x723E, - 15957: 0x73E5, - 15958: 0xF9E4, - 15959: 0x7570, - 15960: 0x75CD, - 15961: 0xF9E5, - 15962: 0x79FB, - 15963: 0xF9E6, - 15964: 0x800C, - 15965: 0x8033, - 15966: 0x8084, - 15967: 0x82E1, - 15968: 0x8351, - 15969: 0xF9E7, - 15970: 0xF9E8, - 15971: 0x8CBD, - 15972: 0x8CB3, - 15973: 0x9087, - 15974: 0xF9E9, - 15975: 0xF9EA, - 15976: 0x98F4, - 15977: 0x990C, - 15978: 0xF9EB, - 15979: 0xF9EC, - 15980: 0x7037, - 15981: 0x76CA, - 15982: 0x7FCA, - 15983: 0x7FCC, - 15984: 0x7FFC, - 15985: 0x8B1A, - 15986: 0x4EBA, - 15987: 0x4EC1, - 15988: 0x5203, - 15989: 0x5370, - 15990: 0xF9ED, - 15991: 0x54BD, - 15992: 0x56E0, - 15993: 0x59FB, - 15994: 0x5BC5, - 15995: 0x5F15, - 15996: 0x5FCD, - 15997: 0x6E6E, - 15998: 0xF9EE, - 15999: 0xF9EF, - 16000: 0x7D6A, - 16001: 0x8335, - 16002: 0xF9F0, - 16003: 0x8693, - 16004: 0x8A8D, - 16005: 0xF9F1, - 16006: 0x976D, - 16007: 0x9777, - 16008: 0xF9F2, - 16009: 0xF9F3, - 16010: 0x4E00, - 16011: 0x4F5A, - 16012: 0x4F7E, - 16013: 0x58F9, - 16014: 0x65E5, - 16015: 0x6EA2, - 16016: 0x9038, - 16017: 0x93B0, - 16018: 0x99B9, - 16019: 0x4EFB, - 16020: 0x58EC, - 16021: 0x598A, - 16022: 0x59D9, - 16023: 0x6041, - 16024: 0xF9F4, - 16025: 0xF9F5, - 16026: 0x7A14, - 16027: 0xF9F6, - 16028: 0x834F, - 16029: 0x8CC3, - 16030: 0x5165, - 16031: 0x5344, - 16032: 0xF9F7, - 16033: 0xF9F8, - 16034: 0xF9F9, - 16035: 0x4ECD, - 16036: 0x5269, - 16037: 0x5B55, - 16038: 0x82BF, - 16039: 0x4ED4, - 16040: 0x523A, - 16041: 0x54A8, - 16042: 0x59C9, - 16043: 0x59FF, - 16044: 0x5B50, - 16045: 0x5B57, - 16046: 0x5B5C, - 16047: 0x6063, - 16048: 0x6148, - 16049: 0x6ECB, - 16050: 0x7099, - 16051: 0x716E, - 16052: 0x7386, - 16053: 0x74F7, - 16054: 0x75B5, - 16055: 0x78C1, - 16056: 0x7D2B, - 16057: 0x8005, - 16058: 0x81EA, - 16059: 0x8328, - 16060: 0x8517, - 16061: 0x85C9, - 16062: 0x8AEE, - 16063: 0x8CC7, - 16064: 0x96CC, - 16065: 0x4F5C, - 16066: 0x52FA, - 16067: 0x56BC, - 16068: 0x65AB, - 16069: 0x6628, - 16070: 0x707C, - 16071: 0x70B8, - 16072: 0x7235, - 16073: 0x7DBD, - 16074: 0x828D, - 16075: 0x914C, - 16076: 0x96C0, - 16077: 0x9D72, - 16078: 0x5B71, - 16079: 0x68E7, - 16080: 0x6B98, - 16081: 0x6F7A, - 16082: 0x76DE, - 16083: 0x5C91, - 16084: 0x66AB, - 16085: 0x6F5B, - 16086: 0x7BB4, - 16087: 0x7C2A, - 16088: 0x8836, - 16089: 0x96DC, - 16090: 0x4E08, - 16091: 0x4ED7, - 16092: 0x5320, - 16093: 0x5834, - 16094: 0x58BB, - 16095: 0x58EF, - 16096: 0x596C, - 16097: 0x5C07, - 16098: 0x5E33, - 16099: 0x5E84, - 16100: 0x5F35, - 16101: 0x638C, - 16102: 0x66B2, - 16103: 0x6756, - 16104: 0x6A1F, - 16105: 0x6AA3, - 16106: 0x6B0C, - 16107: 0x6F3F, - 16108: 0x7246, - 16109: 0xF9FA, - 16110: 0x7350, - 16111: 0x748B, - 16112: 0x7AE0, - 16113: 0x7CA7, - 16114: 0x8178, - 16115: 0x81DF, - 16116: 0x81E7, - 16117: 0x838A, - 16118: 0x846C, - 16119: 0x8523, - 16120: 0x8594, - 16121: 0x85CF, - 16122: 0x88DD, - 16123: 0x8D13, - 16124: 0x91AC, - 16125: 0x9577, - 16126: 0x969C, - 16127: 0x518D, - 16128: 0x54C9, - 16129: 0x5728, - 16130: 0x5BB0, - 16131: 0x624D, - 16132: 0x6750, - 16133: 0x683D, - 16134: 0x6893, - 16135: 0x6E3D, - 16136: 0x6ED3, - 16137: 0x707D, - 16138: 0x7E21, - 16139: 0x88C1, - 16140: 0x8CA1, - 16141: 0x8F09, - 16142: 0x9F4B, - 16143: 0x9F4E, - 16144: 0x722D, - 16145: 0x7B8F, - 16146: 0x8ACD, - 16147: 0x931A, - 16148: 0x4F47, - 16149: 0x4F4E, - 16150: 0x5132, - 16151: 0x5480, - 16152: 0x59D0, - 16153: 0x5E95, - 16154: 0x62B5, - 16155: 0x6775, - 16156: 0x696E, - 16157: 0x6A17, - 16158: 0x6CAE, - 16159: 0x6E1A, - 16160: 0x72D9, - 16161: 0x732A, - 16162: 0x75BD, - 16163: 0x7BB8, - 16164: 0x7D35, - 16165: 0x82E7, - 16166: 0x83F9, - 16167: 0x8457, - 16168: 0x85F7, - 16169: 0x8A5B, - 16170: 0x8CAF, - 16171: 0x8E87, - 16172: 0x9019, - 16173: 0x90B8, - 16174: 0x96CE, - 16175: 0x9F5F, - 16176: 0x52E3, - 16177: 0x540A, - 16178: 0x5AE1, - 16179: 0x5BC2, - 16180: 0x6458, - 16181: 0x6575, - 16182: 0x6EF4, - 16183: 0x72C4, - 16184: 0xF9FB, - 16185: 0x7684, - 16186: 0x7A4D, - 16187: 0x7B1B, - 16188: 0x7C4D, - 16189: 0x7E3E, - 16190: 0x7FDF, - 16191: 0x837B, - 16192: 0x8B2B, - 16193: 0x8CCA, - 16194: 0x8D64, - 16195: 0x8DE1, - 16196: 0x8E5F, - 16197: 0x8FEA, - 16198: 0x8FF9, - 16199: 0x9069, - 16200: 0x93D1, - 16201: 0x4F43, - 16202: 0x4F7A, - 16203: 0x50B3, - 16204: 0x5168, - 16205: 0x5178, - 16206: 0x524D, - 16207: 0x526A, - 16208: 0x5861, - 16209: 0x587C, - 16210: 0x5960, - 16211: 0x5C08, - 16212: 0x5C55, - 16213: 0x5EDB, - 16214: 0x609B, - 16215: 0x6230, - 16216: 0x6813, - 16217: 0x6BBF, - 16218: 0x6C08, - 16219: 0x6FB1, - 16220: 0x714E, - 16221: 0x7420, - 16222: 0x7530, - 16223: 0x7538, - 16224: 0x7551, - 16225: 0x7672, - 16226: 0x7B4C, - 16227: 0x7B8B, - 16228: 0x7BAD, - 16229: 0x7BC6, - 16230: 0x7E8F, - 16231: 0x8A6E, - 16232: 0x8F3E, - 16233: 0x8F49, - 16234: 0x923F, - 16235: 0x9293, - 16236: 0x9322, - 16237: 0x942B, - 16238: 0x96FB, - 16239: 0x985A, - 16240: 0x986B, - 16241: 0x991E, - 16242: 0x5207, - 16243: 0x622A, - 16244: 0x6298, - 16245: 0x6D59, - 16246: 0x7664, - 16247: 0x7ACA, - 16248: 0x7BC0, - 16249: 0x7D76, - 16250: 0x5360, - 16251: 0x5CBE, - 16252: 0x5E97, - 16253: 0x6F38, - 16254: 0x70B9, - 16255: 0x7C98, - 16256: 0x9711, - 16257: 0x9B8E, - 16258: 0x9EDE, - 16259: 0x63A5, - 16260: 0x647A, - 16261: 0x8776, - 16262: 0x4E01, - 16263: 0x4E95, - 16264: 0x4EAD, - 16265: 0x505C, - 16266: 0x5075, - 16267: 0x5448, - 16268: 0x59C3, - 16269: 0x5B9A, - 16270: 0x5E40, - 16271: 0x5EAD, - 16272: 0x5EF7, - 16273: 0x5F81, - 16274: 0x60C5, - 16275: 0x633A, - 16276: 0x653F, - 16277: 0x6574, - 16278: 0x65CC, - 16279: 0x6676, - 16280: 0x6678, - 16281: 0x67FE, - 16282: 0x6968, - 16283: 0x6A89, - 16284: 0x6B63, - 16285: 0x6C40, - 16286: 0x6DC0, - 16287: 0x6DE8, - 16288: 0x6E1F, - 16289: 0x6E5E, - 16290: 0x701E, - 16291: 0x70A1, - 16292: 0x738E, - 16293: 0x73FD, - 16294: 0x753A, - 16295: 0x775B, - 16296: 0x7887, - 16297: 0x798E, - 16298: 0x7A0B, - 16299: 0x7A7D, - 16300: 0x7CBE, - 16301: 0x7D8E, - 16302: 0x8247, - 16303: 0x8A02, - 16304: 0x8AEA, - 16305: 0x8C9E, - 16306: 0x912D, - 16307: 0x914A, - 16308: 0x91D8, - 16309: 0x9266, - 16310: 0x92CC, - 16311: 0x9320, - 16312: 0x9706, - 16313: 0x9756, - 16314: 0x975C, - 16315: 0x9802, - 16316: 0x9F0E, - 16317: 0x5236, - 16318: 0x5291, - 16319: 0x557C, - 16320: 0x5824, - 16321: 0x5E1D, - 16322: 0x5F1F, - 16323: 0x608C, - 16324: 0x63D0, - 16325: 0x68AF, - 16326: 0x6FDF, - 16327: 0x796D, - 16328: 0x7B2C, - 16329: 0x81CD, - 16330: 0x85BA, - 16331: 0x88FD, - 16332: 0x8AF8, - 16333: 0x8E44, - 16334: 0x918D, - 16335: 0x9664, - 16336: 0x969B, - 16337: 0x973D, - 16338: 0x984C, - 16339: 0x9F4A, - 16340: 0x4FCE, - 16341: 0x5146, - 16342: 0x51CB, - 16343: 0x52A9, - 16344: 0x5632, - 16345: 0x5F14, - 16346: 0x5F6B, - 16347: 0x63AA, - 16348: 0x64CD, - 16349: 0x65E9, - 16350: 0x6641, - 16351: 0x66FA, - 16352: 0x66F9, - 16353: 0x671D, - 16354: 0x689D, - 16355: 0x68D7, - 16356: 0x69FD, - 16357: 0x6F15, - 16358: 0x6F6E, - 16359: 0x7167, - 16360: 0x71E5, - 16361: 0x722A, - 16362: 0x74AA, - 16363: 0x773A, - 16364: 0x7956, - 16365: 0x795A, - 16366: 0x79DF, - 16367: 0x7A20, - 16368: 0x7A95, - 16369: 0x7C97, - 16370: 0x7CDF, - 16371: 0x7D44, - 16372: 0x7E70, - 16373: 0x8087, - 16374: 0x85FB, - 16375: 0x86A4, - 16376: 0x8A54, - 16377: 0x8ABF, - 16378: 0x8D99, - 16379: 0x8E81, - 16380: 0x9020, - 16381: 0x906D, - 16382: 0x91E3, - 16383: 0x963B, - 16384: 0x96D5, - 16385: 0x9CE5, - 16386: 0x65CF, - 16387: 0x7C07, - 16388: 0x8DB3, - 16389: 0x93C3, - 16390: 0x5B58, - 16391: 0x5C0A, - 16392: 0x5352, - 16393: 0x62D9, - 16394: 0x731D, - 16395: 0x5027, - 16396: 0x5B97, - 16397: 0x5F9E, - 16398: 0x60B0, - 16399: 0x616B, - 16400: 0x68D5, - 16401: 0x6DD9, - 16402: 0x742E, - 16403: 0x7A2E, - 16404: 0x7D42, - 16405: 0x7D9C, - 16406: 0x7E31, - 16407: 0x816B, - 16408: 0x8E2A, - 16409: 0x8E35, - 16410: 0x937E, - 16411: 0x9418, - 16412: 0x4F50, - 16413: 0x5750, - 16414: 0x5DE6, - 16415: 0x5EA7, - 16416: 0x632B, - 16417: 0x7F6A, - 16418: 0x4E3B, - 16419: 0x4F4F, - 16420: 0x4F8F, - 16421: 0x505A, - 16422: 0x59DD, - 16423: 0x80C4, - 16424: 0x546A, - 16425: 0x5468, - 16426: 0x55FE, - 16427: 0x594F, - 16428: 0x5B99, - 16429: 0x5DDE, - 16430: 0x5EDA, - 16431: 0x665D, - 16432: 0x6731, - 16433: 0x67F1, - 16434: 0x682A, - 16435: 0x6CE8, - 16436: 0x6D32, - 16437: 0x6E4A, - 16438: 0x6F8D, - 16439: 0x70B7, - 16440: 0x73E0, - 16441: 0x7587, - 16442: 0x7C4C, - 16443: 0x7D02, - 16444: 0x7D2C, - 16445: 0x7DA2, - 16446: 0x821F, - 16447: 0x86DB, - 16448: 0x8A3B, - 16449: 0x8A85, - 16450: 0x8D70, - 16451: 0x8E8A, - 16452: 0x8F33, - 16453: 0x9031, - 16454: 0x914E, - 16455: 0x9152, - 16456: 0x9444, - 16457: 0x99D0, - 16458: 0x7AF9, - 16459: 0x7CA5, - 16460: 0x4FCA, - 16461: 0x5101, - 16462: 0x51C6, - 16463: 0x57C8, - 16464: 0x5BEF, - 16465: 0x5CFB, - 16466: 0x6659, - 16467: 0x6A3D, - 16468: 0x6D5A, - 16469: 0x6E96, - 16470: 0x6FEC, - 16471: 0x710C, - 16472: 0x756F, - 16473: 0x7AE3, - 16474: 0x8822, - 16475: 0x9021, - 16476: 0x9075, - 16477: 0x96CB, - 16478: 0x99FF, - 16479: 0x8301, - 16480: 0x4E2D, - 16481: 0x4EF2, - 16482: 0x8846, - 16483: 0x91CD, - 16484: 0x537D, - 16485: 0x6ADB, - 16486: 0x696B, - 16487: 0x6C41, - 16488: 0x847A, - 16489: 0x589E, - 16490: 0x618E, - 16491: 0x66FE, - 16492: 0x62EF, - 16493: 0x70DD, - 16494: 0x7511, - 16495: 0x75C7, - 16496: 0x7E52, - 16497: 0x84B8, - 16498: 0x8B49, - 16499: 0x8D08, - 16500: 0x4E4B, - 16501: 0x53EA, - 16502: 0x54AB, - 16503: 0x5730, - 16504: 0x5740, - 16505: 0x5FD7, - 16506: 0x6301, - 16507: 0x6307, - 16508: 0x646F, - 16509: 0x652F, - 16510: 0x65E8, - 16511: 0x667A, - 16512: 0x679D, - 16513: 0x67B3, - 16514: 0x6B62, - 16515: 0x6C60, - 16516: 0x6C9A, - 16517: 0x6F2C, - 16518: 0x77E5, - 16519: 0x7825, - 16520: 0x7949, - 16521: 0x7957, - 16522: 0x7D19, - 16523: 0x80A2, - 16524: 0x8102, - 16525: 0x81F3, - 16526: 0x829D, - 16527: 0x82B7, - 16528: 0x8718, - 16529: 0x8A8C, - 16530: 0xF9FC, - 16531: 0x8D04, - 16532: 0x8DBE, - 16533: 0x9072, - 16534: 0x76F4, - 16535: 0x7A19, - 16536: 0x7A37, - 16537: 0x7E54, - 16538: 0x8077, - 16539: 0x5507, - 16540: 0x55D4, - 16541: 0x5875, - 16542: 0x632F, - 16543: 0x6422, - 16544: 0x6649, - 16545: 0x664B, - 16546: 0x686D, - 16547: 0x699B, - 16548: 0x6B84, - 16549: 0x6D25, - 16550: 0x6EB1, - 16551: 0x73CD, - 16552: 0x7468, - 16553: 0x74A1, - 16554: 0x755B, - 16555: 0x75B9, - 16556: 0x76E1, - 16557: 0x771E, - 16558: 0x778B, - 16559: 0x79E6, - 16560: 0x7E09, - 16561: 0x7E1D, - 16562: 0x81FB, - 16563: 0x852F, - 16564: 0x8897, - 16565: 0x8A3A, - 16566: 0x8CD1, - 16567: 0x8EEB, - 16568: 0x8FB0, - 16569: 0x9032, - 16570: 0x93AD, - 16571: 0x9663, - 16572: 0x9673, - 16573: 0x9707, - 16574: 0x4F84, - 16575: 0x53F1, - 16576: 0x59EA, - 16577: 0x5AC9, - 16578: 0x5E19, - 16579: 0x684E, - 16580: 0x74C6, - 16581: 0x75BE, - 16582: 0x79E9, - 16583: 0x7A92, - 16584: 0x81A3, - 16585: 0x86ED, - 16586: 0x8CEA, - 16587: 0x8DCC, - 16588: 0x8FED, - 16589: 0x659F, - 16590: 0x6715, - 16591: 0xF9FD, - 16592: 0x57F7, - 16593: 0x6F57, - 16594: 0x7DDD, - 16595: 0x8F2F, - 16596: 0x93F6, - 16597: 0x96C6, - 16598: 0x5FB5, - 16599: 0x61F2, - 16600: 0x6F84, - 16601: 0x4E14, - 16602: 0x4F98, - 16603: 0x501F, - 16604: 0x53C9, - 16605: 0x55DF, - 16606: 0x5D6F, - 16607: 0x5DEE, - 16608: 0x6B21, - 16609: 0x6B64, - 16610: 0x78CB, - 16611: 0x7B9A, - 16612: 0xF9FE, - 16613: 0x8E49, - 16614: 0x8ECA, - 16615: 0x906E, - 16616: 0x6349, - 16617: 0x643E, - 16618: 0x7740, - 16619: 0x7A84, - 16620: 0x932F, - 16621: 0x947F, - 16622: 0x9F6A, - 16623: 0x64B0, - 16624: 0x6FAF, - 16625: 0x71E6, - 16626: 0x74A8, - 16627: 0x74DA, - 16628: 0x7AC4, - 16629: 0x7C12, - 16630: 0x7E82, - 16631: 0x7CB2, - 16632: 0x7E98, - 16633: 0x8B9A, - 16634: 0x8D0A, - 16635: 0x947D, - 16636: 0x9910, - 16637: 0x994C, - 16638: 0x5239, - 16639: 0x5BDF, - 16640: 0x64E6, - 16641: 0x672D, - 16642: 0x7D2E, - 16643: 0x50ED, - 16644: 0x53C3, - 16645: 0x5879, - 16646: 0x6158, - 16647: 0x6159, - 16648: 0x61FA, - 16649: 0x65AC, - 16650: 0x7AD9, - 16651: 0x8B92, - 16652: 0x8B96, - 16653: 0x5009, - 16654: 0x5021, - 16655: 0x5275, - 16656: 0x5531, - 16657: 0x5A3C, - 16658: 0x5EE0, - 16659: 0x5F70, - 16660: 0x6134, - 16661: 0x655E, - 16662: 0x660C, - 16663: 0x6636, - 16664: 0x66A2, - 16665: 0x69CD, - 16666: 0x6EC4, - 16667: 0x6F32, - 16668: 0x7316, - 16669: 0x7621, - 16670: 0x7A93, - 16671: 0x8139, - 16672: 0x8259, - 16673: 0x83D6, - 16674: 0x84BC, - 16675: 0x50B5, - 16676: 0x57F0, - 16677: 0x5BC0, - 16678: 0x5BE8, - 16679: 0x5F69, - 16680: 0x63A1, - 16681: 0x7826, - 16682: 0x7DB5, - 16683: 0x83DC, - 16684: 0x8521, - 16685: 0x91C7, - 16686: 0x91F5, - 16687: 0x518A, - 16688: 0x67F5, - 16689: 0x7B56, - 16690: 0x8CAC, - 16691: 0x51C4, - 16692: 0x59BB, - 16693: 0x60BD, - 16694: 0x8655, - 16695: 0x501C, - 16696: 0xF9FF, - 16697: 0x5254, - 16698: 0x5C3A, - 16699: 0x617D, - 16700: 0x621A, - 16701: 0x62D3, - 16702: 0x64F2, - 16703: 0x65A5, - 16704: 0x6ECC, - 16705: 0x7620, - 16706: 0x810A, - 16707: 0x8E60, - 16708: 0x965F, - 16709: 0x96BB, - 16710: 0x4EDF, - 16711: 0x5343, - 16712: 0x5598, - 16713: 0x5929, - 16714: 0x5DDD, - 16715: 0x64C5, - 16716: 0x6CC9, - 16717: 0x6DFA, - 16718: 0x7394, - 16719: 0x7A7F, - 16720: 0x821B, - 16721: 0x85A6, - 16722: 0x8CE4, - 16723: 0x8E10, - 16724: 0x9077, - 16725: 0x91E7, - 16726: 0x95E1, - 16727: 0x9621, - 16728: 0x97C6, - 16729: 0x51F8, - 16730: 0x54F2, - 16731: 0x5586, - 16732: 0x5FB9, - 16733: 0x64A4, - 16734: 0x6F88, - 16735: 0x7DB4, - 16736: 0x8F1F, - 16737: 0x8F4D, - 16738: 0x9435, - 16739: 0x50C9, - 16740: 0x5C16, - 16741: 0x6CBE, - 16742: 0x6DFB, - 16743: 0x751B, - 16744: 0x77BB, - 16745: 0x7C3D, - 16746: 0x7C64, - 16747: 0x8A79, - 16748: 0x8AC2, - 16749: 0x581E, - 16750: 0x59BE, - 16751: 0x5E16, - 16752: 0x6377, - 16753: 0x7252, - 16754: 0x758A, - 16755: 0x776B, - 16756: 0x8ADC, - 16757: 0x8CBC, - 16758: 0x8F12, - 16759: 0x5EF3, - 16760: 0x6674, - 16761: 0x6DF8, - 16762: 0x807D, - 16763: 0x83C1, - 16764: 0x8ACB, - 16765: 0x9751, - 16766: 0x9BD6, - 16767: 0xFA00, - 16768: 0x5243, - 16769: 0x66FF, - 16770: 0x6D95, - 16771: 0x6EEF, - 16772: 0x7DE0, - 16773: 0x8AE6, - 16774: 0x902E, - 16775: 0x905E, - 16776: 0x9AD4, - 16777: 0x521D, - 16778: 0x527F, - 16779: 0x54E8, - 16780: 0x6194, - 16781: 0x6284, - 16782: 0x62DB, - 16783: 0x68A2, - 16784: 0x6912, - 16785: 0x695A, - 16786: 0x6A35, - 16787: 0x7092, - 16788: 0x7126, - 16789: 0x785D, - 16790: 0x7901, - 16791: 0x790E, - 16792: 0x79D2, - 16793: 0x7A0D, - 16794: 0x8096, - 16795: 0x8278, - 16796: 0x82D5, - 16797: 0x8349, - 16798: 0x8549, - 16799: 0x8C82, - 16800: 0x8D85, - 16801: 0x9162, - 16802: 0x918B, - 16803: 0x91AE, - 16804: 0x4FC3, - 16805: 0x56D1, - 16806: 0x71ED, - 16807: 0x77D7, - 16808: 0x8700, - 16809: 0x89F8, - 16810: 0x5BF8, - 16811: 0x5FD6, - 16812: 0x6751, - 16813: 0x90A8, - 16814: 0x53E2, - 16815: 0x585A, - 16816: 0x5BF5, - 16817: 0x60A4, - 16818: 0x6181, - 16819: 0x6460, - 16820: 0x7E3D, - 16821: 0x8070, - 16822: 0x8525, - 16823: 0x9283, - 16824: 0x64AE, - 16825: 0x50AC, - 16826: 0x5D14, - 16827: 0x6700, - 16828: 0x589C, - 16829: 0x62BD, - 16830: 0x63A8, - 16831: 0x690E, - 16832: 0x6978, - 16833: 0x6A1E, - 16834: 0x6E6B, - 16835: 0x76BA, - 16836: 0x79CB, - 16837: 0x82BB, - 16838: 0x8429, - 16839: 0x8ACF, - 16840: 0x8DA8, - 16841: 0x8FFD, - 16842: 0x9112, - 16843: 0x914B, - 16844: 0x919C, - 16845: 0x9310, - 16846: 0x9318, - 16847: 0x939A, - 16848: 0x96DB, - 16849: 0x9A36, - 16850: 0x9C0D, - 16851: 0x4E11, - 16852: 0x755C, - 16853: 0x795D, - 16854: 0x7AFA, - 16855: 0x7B51, - 16856: 0x7BC9, - 16857: 0x7E2E, - 16858: 0x84C4, - 16859: 0x8E59, - 16860: 0x8E74, - 16861: 0x8EF8, - 16862: 0x9010, - 16863: 0x6625, - 16864: 0x693F, - 16865: 0x7443, - 16866: 0x51FA, - 16867: 0x672E, - 16868: 0x9EDC, - 16869: 0x5145, - 16870: 0x5FE0, - 16871: 0x6C96, - 16872: 0x87F2, - 16873: 0x885D, - 16874: 0x8877, - 16875: 0x60B4, - 16876: 0x81B5, - 16877: 0x8403, - 16878: 0x8D05, - 16879: 0x53D6, - 16880: 0x5439, - 16881: 0x5634, - 16882: 0x5A36, - 16883: 0x5C31, - 16884: 0x708A, - 16885: 0x7FE0, - 16886: 0x805A, - 16887: 0x8106, - 16888: 0x81ED, - 16889: 0x8DA3, - 16890: 0x9189, - 16891: 0x9A5F, - 16892: 0x9DF2, - 16893: 0x5074, - 16894: 0x4EC4, - 16895: 0x53A0, - 16896: 0x60FB, - 16897: 0x6E2C, - 16898: 0x5C64, - 16899: 0x4F88, - 16900: 0x5024, - 16901: 0x55E4, - 16902: 0x5CD9, - 16903: 0x5E5F, - 16904: 0x6065, - 16905: 0x6894, - 16906: 0x6CBB, - 16907: 0x6DC4, - 16908: 0x71BE, - 16909: 0x75D4, - 16910: 0x75F4, - 16911: 0x7661, - 16912: 0x7A1A, - 16913: 0x7A49, - 16914: 0x7DC7, - 16915: 0x7DFB, - 16916: 0x7F6E, - 16917: 0x81F4, - 16918: 0x86A9, - 16919: 0x8F1C, - 16920: 0x96C9, - 16921: 0x99B3, - 16922: 0x9F52, - 16923: 0x5247, - 16924: 0x52C5, - 16925: 0x98ED, - 16926: 0x89AA, - 16927: 0x4E03, - 16928: 0x67D2, - 16929: 0x6F06, - 16930: 0x4FB5, - 16931: 0x5BE2, - 16932: 0x6795, - 16933: 0x6C88, - 16934: 0x6D78, - 16935: 0x741B, - 16936: 0x7827, - 16937: 0x91DD, - 16938: 0x937C, - 16939: 0x87C4, - 16940: 0x79E4, - 16941: 0x7A31, - 16942: 0x5FEB, - 16943: 0x4ED6, - 16944: 0x54A4, - 16945: 0x553E, - 16946: 0x58AE, - 16947: 0x59A5, - 16948: 0x60F0, - 16949: 0x6253, - 16950: 0x62D6, - 16951: 0x6736, - 16952: 0x6955, - 16953: 0x8235, - 16954: 0x9640, - 16955: 0x99B1, - 16956: 0x99DD, - 16957: 0x502C, - 16958: 0x5353, - 16959: 0x5544, - 16960: 0x577C, - 16961: 0xFA01, - 16962: 0x6258, - 16963: 0xFA02, - 16964: 0x64E2, - 16965: 0x666B, - 16966: 0x67DD, - 16967: 0x6FC1, - 16968: 0x6FEF, - 16969: 0x7422, - 16970: 0x7438, - 16971: 0x8A17, - 16972: 0x9438, - 16973: 0x5451, - 16974: 0x5606, - 16975: 0x5766, - 16976: 0x5F48, - 16977: 0x619A, - 16978: 0x6B4E, - 16979: 0x7058, - 16980: 0x70AD, - 16981: 0x7DBB, - 16982: 0x8A95, - 16983: 0x596A, - 16984: 0x812B, - 16985: 0x63A2, - 16986: 0x7708, - 16987: 0x803D, - 16988: 0x8CAA, - 16989: 0x5854, - 16990: 0x642D, - 16991: 0x69BB, - 16992: 0x5B95, - 16993: 0x5E11, - 16994: 0x6E6F, - 16995: 0xFA03, - 16996: 0x8569, - 16997: 0x514C, - 16998: 0x53F0, - 16999: 0x592A, - 17000: 0x6020, - 17001: 0x614B, - 17002: 0x6B86, - 17003: 0x6C70, - 17004: 0x6CF0, - 17005: 0x7B1E, - 17006: 0x80CE, - 17007: 0x82D4, - 17008: 0x8DC6, - 17009: 0x90B0, - 17010: 0x98B1, - 17011: 0xFA04, - 17012: 0x64C7, - 17013: 0x6FA4, - 17014: 0x6491, - 17015: 0x6504, - 17016: 0x514E, - 17017: 0x5410, - 17018: 0x571F, - 17019: 0x8A0E, - 17020: 0x615F, - 17021: 0x6876, - 17022: 0xFA05, - 17023: 0x75DB, - 17024: 0x7B52, - 17025: 0x7D71, - 17026: 0x901A, - 17027: 0x5806, - 17028: 0x69CC, - 17029: 0x817F, - 17030: 0x892A, - 17031: 0x9000, - 17032: 0x9839, - 17033: 0x5078, - 17034: 0x5957, - 17035: 0x59AC, - 17036: 0x6295, - 17037: 0x900F, - 17038: 0x9B2A, - 17039: 0x615D, - 17040: 0x7279, - 17041: 0x95D6, - 17042: 0x5761, - 17043: 0x5A46, - 17044: 0x5DF4, - 17045: 0x628A, - 17046: 0x64AD, - 17047: 0x64FA, - 17048: 0x6777, - 17049: 0x6CE2, - 17050: 0x6D3E, - 17051: 0x722C, - 17052: 0x7436, - 17053: 0x7834, - 17054: 0x7F77, - 17055: 0x82AD, - 17056: 0x8DDB, - 17057: 0x9817, - 17058: 0x5224, - 17059: 0x5742, - 17060: 0x677F, - 17061: 0x7248, - 17062: 0x74E3, - 17063: 0x8CA9, - 17064: 0x8FA6, - 17065: 0x9211, - 17066: 0x962A, - 17067: 0x516B, - 17068: 0x53ED, - 17069: 0x634C, - 17070: 0x4F69, - 17071: 0x5504, - 17072: 0x6096, - 17073: 0x6557, - 17074: 0x6C9B, - 17075: 0x6D7F, - 17076: 0x724C, - 17077: 0x72FD, - 17078: 0x7A17, - 17079: 0x8987, - 17080: 0x8C9D, - 17081: 0x5F6D, - 17082: 0x6F8E, - 17083: 0x70F9, - 17084: 0x81A8, - 17085: 0x610E, - 17086: 0x4FBF, - 17087: 0x504F, - 17088: 0x6241, - 17089: 0x7247, - 17090: 0x7BC7, - 17091: 0x7DE8, - 17092: 0x7FE9, - 17093: 0x904D, - 17094: 0x97AD, - 17095: 0x9A19, - 17096: 0x8CB6, - 17097: 0x576A, - 17098: 0x5E73, - 17099: 0x67B0, - 17100: 0x840D, - 17101: 0x8A55, - 17102: 0x5420, - 17103: 0x5B16, - 17104: 0x5E63, - 17105: 0x5EE2, - 17106: 0x5F0A, - 17107: 0x6583, - 17108: 0x80BA, - 17109: 0x853D, - 17110: 0x9589, - 17111: 0x965B, - 17112: 0x4F48, - 17113: 0x5305, - 17114: 0x530D, - 17115: 0x530F, - 17116: 0x5486, - 17117: 0x54FA, - 17118: 0x5703, - 17119: 0x5E03, - 17120: 0x6016, - 17121: 0x629B, - 17122: 0x62B1, - 17123: 0x6355, - 17124: 0xFA06, - 17125: 0x6CE1, - 17126: 0x6D66, - 17127: 0x75B1, - 17128: 0x7832, - 17129: 0x80DE, - 17130: 0x812F, - 17131: 0x82DE, - 17132: 0x8461, - 17133: 0x84B2, - 17134: 0x888D, - 17135: 0x8912, - 17136: 0x900B, - 17137: 0x92EA, - 17138: 0x98FD, - 17139: 0x9B91, - 17140: 0x5E45, - 17141: 0x66B4, - 17142: 0x66DD, - 17143: 0x7011, - 17144: 0x7206, - 17145: 0xFA07, - 17146: 0x4FF5, - 17147: 0x527D, - 17148: 0x5F6A, - 17149: 0x6153, - 17150: 0x6753, - 17151: 0x6A19, - 17152: 0x6F02, - 17153: 0x74E2, - 17154: 0x7968, - 17155: 0x8868, - 17156: 0x8C79, - 17157: 0x98C7, - 17158: 0x98C4, - 17159: 0x9A43, - 17160: 0x54C1, - 17161: 0x7A1F, - 17162: 0x6953, - 17163: 0x8AF7, - 17164: 0x8C4A, - 17165: 0x98A8, - 17166: 0x99AE, - 17167: 0x5F7C, - 17168: 0x62AB, - 17169: 0x75B2, - 17170: 0x76AE, - 17171: 0x88AB, - 17172: 0x907F, - 17173: 0x9642, - 17174: 0x5339, - 17175: 0x5F3C, - 17176: 0x5FC5, - 17177: 0x6CCC, - 17178: 0x73CC, - 17179: 0x7562, - 17180: 0x758B, - 17181: 0x7B46, - 17182: 0x82FE, - 17183: 0x999D, - 17184: 0x4E4F, - 17185: 0x903C, - 17186: 0x4E0B, - 17187: 0x4F55, - 17188: 0x53A6, - 17189: 0x590F, - 17190: 0x5EC8, - 17191: 0x6630, - 17192: 0x6CB3, - 17193: 0x7455, - 17194: 0x8377, - 17195: 0x8766, - 17196: 0x8CC0, - 17197: 0x9050, - 17198: 0x971E, - 17199: 0x9C15, - 17200: 0x58D1, - 17201: 0x5B78, - 17202: 0x8650, - 17203: 0x8B14, - 17204: 0x9DB4, - 17205: 0x5BD2, - 17206: 0x6068, - 17207: 0x608D, - 17208: 0x65F1, - 17209: 0x6C57, - 17210: 0x6F22, - 17211: 0x6FA3, - 17212: 0x701A, - 17213: 0x7F55, - 17214: 0x7FF0, - 17215: 0x9591, - 17216: 0x9592, - 17217: 0x9650, - 17218: 0x97D3, - 17219: 0x5272, - 17220: 0x8F44, - 17221: 0x51FD, - 17222: 0x542B, - 17223: 0x54B8, - 17224: 0x5563, - 17225: 0x558A, - 17226: 0x6ABB, - 17227: 0x6DB5, - 17228: 0x7DD8, - 17229: 0x8266, - 17230: 0x929C, - 17231: 0x9677, - 17232: 0x9E79, - 17233: 0x5408, - 17234: 0x54C8, - 17235: 0x76D2, - 17236: 0x86E4, - 17237: 0x95A4, - 17238: 0x95D4, - 17239: 0x965C, - 17240: 0x4EA2, - 17241: 0x4F09, - 17242: 0x59EE, - 17243: 0x5AE6, - 17244: 0x5DF7, - 17245: 0x6052, - 17246: 0x6297, - 17247: 0x676D, - 17248: 0x6841, - 17249: 0x6C86, - 17250: 0x6E2F, - 17251: 0x7F38, - 17252: 0x809B, - 17253: 0x822A, - 17254: 0xFA08, - 17255: 0xFA09, - 17256: 0x9805, - 17257: 0x4EA5, - 17258: 0x5055, - 17259: 0x54B3, - 17260: 0x5793, - 17261: 0x595A, - 17262: 0x5B69, - 17263: 0x5BB3, - 17264: 0x61C8, - 17265: 0x6977, - 17266: 0x6D77, - 17267: 0x7023, - 17268: 0x87F9, - 17269: 0x89E3, - 17270: 0x8A72, - 17271: 0x8AE7, - 17272: 0x9082, - 17273: 0x99ED, - 17274: 0x9AB8, - 17275: 0x52BE, - 17276: 0x6838, - 17277: 0x5016, - 17278: 0x5E78, - 17279: 0x674F, - 17280: 0x8347, - 17281: 0x884C, - 17282: 0x4EAB, - 17283: 0x5411, - 17284: 0x56AE, - 17285: 0x73E6, - 17286: 0x9115, - 17287: 0x97FF, - 17288: 0x9909, - 17289: 0x9957, - 17290: 0x9999, - 17291: 0x5653, - 17292: 0x589F, - 17293: 0x865B, - 17294: 0x8A31, - 17295: 0x61B2, - 17296: 0x6AF6, - 17297: 0x737B, - 17298: 0x8ED2, - 17299: 0x6B47, - 17300: 0x96AA, - 17301: 0x9A57, - 17302: 0x5955, - 17303: 0x7200, - 17304: 0x8D6B, - 17305: 0x9769, - 17306: 0x4FD4, - 17307: 0x5CF4, - 17308: 0x5F26, - 17309: 0x61F8, - 17310: 0x665B, - 17311: 0x6CEB, - 17312: 0x70AB, - 17313: 0x7384, - 17314: 0x73B9, - 17315: 0x73FE, - 17316: 0x7729, - 17317: 0x774D, - 17318: 0x7D43, - 17319: 0x7D62, - 17320: 0x7E23, - 17321: 0x8237, - 17322: 0x8852, - 17323: 0xFA0A, - 17324: 0x8CE2, - 17325: 0x9249, - 17326: 0x986F, - 17327: 0x5B51, - 17328: 0x7A74, - 17329: 0x8840, - 17330: 0x9801, - 17331: 0x5ACC, - 17332: 0x4FE0, - 17333: 0x5354, - 17334: 0x593E, - 17335: 0x5CFD, - 17336: 0x633E, - 17337: 0x6D79, - 17338: 0x72F9, - 17339: 0x8105, - 17340: 0x8107, - 17341: 0x83A2, - 17342: 0x92CF, - 17343: 0x9830, - 17344: 0x4EA8, - 17345: 0x5144, - 17346: 0x5211, - 17347: 0x578B, - 17348: 0x5F62, - 17349: 0x6CC2, - 17350: 0x6ECE, - 17351: 0x7005, - 17352: 0x7050, - 17353: 0x70AF, - 17354: 0x7192, - 17355: 0x73E9, - 17356: 0x7469, - 17357: 0x834A, - 17358: 0x87A2, - 17359: 0x8861, - 17360: 0x9008, - 17361: 0x90A2, - 17362: 0x93A3, - 17363: 0x99A8, - 17364: 0x516E, - 17365: 0x5F57, - 17366: 0x60E0, - 17367: 0x6167, - 17368: 0x66B3, - 17369: 0x8559, - 17370: 0x8E4A, - 17371: 0x91AF, - 17372: 0x978B, - 17373: 0x4E4E, - 17374: 0x4E92, - 17375: 0x547C, - 17376: 0x58D5, - 17377: 0x58FA, - 17378: 0x597D, - 17379: 0x5CB5, - 17380: 0x5F27, - 17381: 0x6236, - 17382: 0x6248, - 17383: 0x660A, - 17384: 0x6667, - 17385: 0x6BEB, - 17386: 0x6D69, - 17387: 0x6DCF, - 17388: 0x6E56, - 17389: 0x6EF8, - 17390: 0x6F94, - 17391: 0x6FE0, - 17392: 0x6FE9, - 17393: 0x705D, - 17394: 0x72D0, - 17395: 0x7425, - 17396: 0x745A, - 17397: 0x74E0, - 17398: 0x7693, - 17399: 0x795C, - 17400: 0x7CCA, - 17401: 0x7E1E, - 17402: 0x80E1, - 17403: 0x82A6, - 17404: 0x846B, - 17405: 0x84BF, - 17406: 0x864E, - 17407: 0x865F, - 17408: 0x8774, - 17409: 0x8B77, - 17410: 0x8C6A, - 17411: 0x93AC, - 17412: 0x9800, - 17413: 0x9865, - 17414: 0x60D1, - 17415: 0x6216, - 17416: 0x9177, - 17417: 0x5A5A, - 17418: 0x660F, - 17419: 0x6DF7, - 17420: 0x6E3E, - 17421: 0x743F, - 17422: 0x9B42, - 17423: 0x5FFD, - 17424: 0x60DA, - 17425: 0x7B0F, - 17426: 0x54C4, - 17427: 0x5F18, - 17428: 0x6C5E, - 17429: 0x6CD3, - 17430: 0x6D2A, - 17431: 0x70D8, - 17432: 0x7D05, - 17433: 0x8679, - 17434: 0x8A0C, - 17435: 0x9D3B, - 17436: 0x5316, - 17437: 0x548C, - 17438: 0x5B05, - 17439: 0x6A3A, - 17440: 0x706B, - 17441: 0x7575, - 17442: 0x798D, - 17443: 0x79BE, - 17444: 0x82B1, - 17445: 0x83EF, - 17446: 0x8A71, - 17447: 0x8B41, - 17448: 0x8CA8, - 17449: 0x9774, - 17450: 0xFA0B, - 17451: 0x64F4, - 17452: 0x652B, - 17453: 0x78BA, - 17454: 0x78BB, - 17455: 0x7A6B, - 17456: 0x4E38, - 17457: 0x559A, - 17458: 0x5950, - 17459: 0x5BA6, - 17460: 0x5E7B, - 17461: 0x60A3, - 17462: 0x63DB, - 17463: 0x6B61, - 17464: 0x6665, - 17465: 0x6853, - 17466: 0x6E19, - 17467: 0x7165, - 17468: 0x74B0, - 17469: 0x7D08, - 17470: 0x9084, - 17471: 0x9A69, - 17472: 0x9C25, - 17473: 0x6D3B, - 17474: 0x6ED1, - 17475: 0x733E, - 17476: 0x8C41, - 17477: 0x95CA, - 17478: 0x51F0, - 17479: 0x5E4C, - 17480: 0x5FA8, - 17481: 0x604D, - 17482: 0x60F6, - 17483: 0x6130, - 17484: 0x614C, - 17485: 0x6643, - 17486: 0x6644, - 17487: 0x69A5, - 17488: 0x6CC1, - 17489: 0x6E5F, - 17490: 0x6EC9, - 17491: 0x6F62, - 17492: 0x714C, - 17493: 0x749C, - 17494: 0x7687, - 17495: 0x7BC1, - 17496: 0x7C27, - 17497: 0x8352, - 17498: 0x8757, - 17499: 0x9051, - 17500: 0x968D, - 17501: 0x9EC3, - 17502: 0x532F, - 17503: 0x56DE, - 17504: 0x5EFB, - 17505: 0x5F8A, - 17506: 0x6062, - 17507: 0x6094, - 17508: 0x61F7, - 17509: 0x6666, - 17510: 0x6703, - 17511: 0x6A9C, - 17512: 0x6DEE, - 17513: 0x6FAE, - 17514: 0x7070, - 17515: 0x736A, - 17516: 0x7E6A, - 17517: 0x81BE, - 17518: 0x8334, - 17519: 0x86D4, - 17520: 0x8AA8, - 17521: 0x8CC4, - 17522: 0x5283, - 17523: 0x7372, - 17524: 0x5B96, - 17525: 0x6A6B, - 17526: 0x9404, - 17527: 0x54EE, - 17528: 0x5686, - 17529: 0x5B5D, - 17530: 0x6548, - 17531: 0x6585, - 17532: 0x66C9, - 17533: 0x689F, - 17534: 0x6D8D, - 17535: 0x6DC6, - 17536: 0x723B, - 17537: 0x80B4, - 17538: 0x9175, - 17539: 0x9A4D, - 17540: 0x4FAF, - 17541: 0x5019, - 17542: 0x539A, - 17543: 0x540E, - 17544: 0x543C, - 17545: 0x5589, - 17546: 0x55C5, - 17547: 0x5E3F, - 17548: 0x5F8C, - 17549: 0x673D, - 17550: 0x7166, - 17551: 0x73DD, - 17552: 0x9005, - 17553: 0x52DB, - 17554: 0x52F3, - 17555: 0x5864, - 17556: 0x58CE, - 17557: 0x7104, - 17558: 0x718F, - 17559: 0x71FB, - 17560: 0x85B0, - 17561: 0x8A13, - 17562: 0x6688, - 17563: 0x85A8, - 17564: 0x55A7, - 17565: 0x6684, - 17566: 0x714A, - 17567: 0x8431, - 17568: 0x5349, - 17569: 0x5599, - 17570: 0x6BC1, - 17571: 0x5F59, - 17572: 0x5FBD, - 17573: 0x63EE, - 17574: 0x6689, - 17575: 0x7147, - 17576: 0x8AF1, - 17577: 0x8F1D, - 17578: 0x9EBE, - 17579: 0x4F11, - 17580: 0x643A, - 17581: 0x70CB, - 17582: 0x7566, - 17583: 0x8667, - 17584: 0x6064, - 17585: 0x8B4E, - 17586: 0x9DF8, - 17587: 0x5147, - 17588: 0x51F6, - 17589: 0x5308, - 17590: 0x6D36, - 17591: 0x80F8, - 17592: 0x9ED1, - 17593: 0x6615, - 17594: 0x6B23, - 17595: 0x7098, - 17596: 0x75D5, - 17597: 0x5403, - 17598: 0x5C79, - 17599: 0x7D07, - 17600: 0x8A16, - 17601: 0x6B20, - 17602: 0x6B3D, - 17603: 0x6B46, - 17604: 0x5438, - 17605: 0x6070, - 17606: 0x6D3D, - 17607: 0x7FD5, - 17608: 0x8208, - 17609: 0x50D6, - 17610: 0x51DE, - 17611: 0x559C, - 17612: 0x566B, - 17613: 0x56CD, - 17614: 0x59EC, - 17615: 0x5B09, - 17616: 0x5E0C, - 17617: 0x6199, - 17618: 0x6198, - 17619: 0x6231, - 17620: 0x665E, - 17621: 0x66E6, - 17622: 0x7199, - 17623: 0x71B9, - 17624: 0x71BA, - 17625: 0x72A7, - 17626: 0x79A7, - 17627: 0x7A00, - 17628: 0x7FB2, - 17629: 0x8A70, -} - -const numEncodeTables = 7 - -// encodeX are the encoding tables from Unicode to EUC-KR code, -// sorted by decreasing length. -// encode0: 20893 entries for runes in [19968, 40861). -// encode1: 11172 entries for runes in [44032, 55204). -// encode2: 1625 entries for runes in [ 8213, 9838). -// encode3: 990 entries for runes in [12288, 13278). -// encode4: 945 entries for runes in [ 161, 1106). -// encode5: 268 entries for runes in [63744, 64012). -// encode6: 230 entries for runes in [65281, 65511). - -const encode0Low, encode0High = 19968, 40861 - -var encode0 = [...]uint16{ - 19968 - 19968: 0xECE9, - 19969 - 19968: 0xEFCB, - 19971 - 19968: 0xF6D2, - 19975 - 19968: 0xD8B2, - 19976 - 19968: 0xEDDB, - 19977 - 19968: 0xDFB2, - 19978 - 19968: 0xDFBE, - 19979 - 19968: 0xF9BB, - 19981 - 19968: 0xDCF4, - 19985 - 19968: 0xF5E4, - 19988 - 19968: 0xF3A6, - 19989 - 19968: 0xDDE0, - 19990 - 19968: 0xE1A6, - 19992 - 19968: 0xCEF8, - 19993 - 19968: 0xDCB0, - 19998 - 19968: 0xE3AA, - 20013 - 19968: 0xF1E9, - 20018 - 19968: 0xCDFA, - 20024 - 19968: 0xFCAF, - 20025 - 19968: 0xD3A1, - 20027 - 19968: 0xF1AB, - 20034 - 19968: 0xE7D1, - 20035 - 19968: 0xD2AC, - 20037 - 19968: 0xCEF9, - 20043 - 19968: 0xF1FD, - 20045 - 19968: 0xDEBF, - 20046 - 19968: 0xFBBA, - 20047 - 19968: 0xF9B9, - 20054 - 19968: 0xCED2, - 20056 - 19968: 0xE3AB, - 20057 - 19968: 0xEBE0, - 20061 - 19968: 0xCEFA, - 20062 - 19968: 0xCBF7, - 20063 - 19968: 0xE5A5, - 20075 - 19968: 0xCAE1, - 20077 - 19968: 0xD4CC, - 20083 - 19968: 0xEAE1, - 20086 - 19968: 0xDCE3, - 20087 - 19968: 0xDFAD, - 20094 - 19968: 0xCBEB, - 20098 - 19968: 0xD5AF, - 20102 - 19968: 0xD6F5, - 20104 - 19968: 0xE5F8, - 20107 - 19968: 0xDEC0, - 20108 - 19968: 0xECA3, - 20110 - 19968: 0xE9CD, - 20112 - 19968: 0xEAA7, - 20113 - 19968: 0xE9F6, - 20114 - 19968: 0xFBBB, - 20116 - 19968: 0xE7E9, - 20117 - 19968: 0xEFCC, - 20120 - 19968: 0xD0E6, - 20123 - 19968: 0xDEC1, - 20126 - 19968: 0xE4AC, - 20129 - 19968: 0xD8CC, - 20130 - 19968: 0xF9F1, - 20132 - 19968: 0xCEDF, - 20133 - 19968: 0xFAA4, - 20134 - 19968: 0xE6B2, - 20136 - 19968: 0xFAFB, - 20139 - 19968: 0xFABD, - 20140 - 19968: 0xCCC8, - 20141 - 19968: 0xEFCD, - 20142 - 19968: 0xD5D5, - 20150 - 19968: 0xD3A2, - 20154 - 19968: 0xECD1, - 20160 - 19968: 0xE4A7, - 20161 - 19968: 0xECD2, - 20164 - 19968: 0xF6B1, - 20167 - 19968: 0xCEFB, - 20170 - 19968: 0xD0D1, - 20171 - 19968: 0xCBBF, - 20173 - 19968: 0xEDA4, - 20180 - 19968: 0xEDA8, - 20181 - 19968: 0xDEC2, - 20182 - 19968: 0xF6E2, - 20183 - 19968: 0xEDDC, - 20184 - 19968: 0xDCF5, - 20185 - 19968: 0xE0B9, - 20189 - 19968: 0xD4CE, - 20191 - 19968: 0xF4B5, - 20195 - 19968: 0xD3DB, - 20196 - 19968: 0xD6B5, - 20197 - 19968: 0xECA4, - 20208 - 19968: 0xE4E6, - 20210 - 19968: 0xF1EA, - 20214 - 19968: 0xCBEC, - 20215 - 19968: 0xCBC0, - 20219 - 19968: 0xECF2, - 20225 - 19968: 0xD0EA, - 20233 - 19968: 0xF9F2, - 20234 - 19968: 0xECA5, - 20235 - 19968: 0xD0DF, - 20237 - 19968: 0xE7EA, - 20238 - 19968: 0xD0EB, - 20239 - 19968: 0xDCD1, - 20240 - 19968: 0xDBE9, - 20241 - 19968: 0xFDCC, - 20271 - 19968: 0xDBD7, - 20276 - 19968: 0xDAE1, - 20278 - 19968: 0xD6B6, - 20280 - 19968: 0xE3DF, - 20282 - 19968: 0xDEC3, - 20284 - 19968: 0xDEC4, - 20285 - 19968: 0xCAA1, - 20291 - 19968: 0xEEEC, - 20294 - 19968: 0xD3A3, - 20295 - 19968: 0xEEB7, - 20296 - 19968: 0xF8CF, - 20301 - 19968: 0xEAC8, - 20302 - 19968: 0xEEB8, - 20303 - 19968: 0xF1AC, - 20304 - 19968: 0xF1A5, - 20305 - 19968: 0xE9CE, - 20309 - 19968: 0xF9BC, - 20313 - 19968: 0xE5F9, - 20314 - 19968: 0xECEA, - 20315 - 19968: 0xDDD6, - 20316 - 19968: 0xEDC2, - 20329 - 19968: 0xF8A5, - 20335 - 19968: 0xE5BA, - 20336 - 19968: 0xDBD8, - 20339 - 19968: 0xCAA2, - 20342 - 19968: 0xD1CD, - 20346 - 19968: 0xEEED, - 20350 - 19968: 0xECEB, - 20351 - 19968: 0xDEC5, - 20353 - 19968: 0xE3E0, - 20355 - 19968: 0xCAC9, - 20356 - 19968: 0xF2E9, - 20358 - 19968: 0xD5CE, - 20360 - 19968: 0xF6B6, - 20362 - 19968: 0xCEC2, - 20363 - 19968: 0xD6C7, - 20365 - 19968: 0xE3B4, - 20367 - 19968: 0xF1AD, - 20369 - 19968: 0xEAE2, - 20374 - 19968: 0xD7C2, - 20376 - 19968: 0xF3A7, - 20379 - 19968: 0xCDEA, - 20381 - 19968: 0xEBEE, - 20398 - 19968: 0xD9B2, - 20399 - 19968: 0xFDA5, - 20405 - 19968: 0xF6D5, - 20406 - 19968: 0xD5E2, - 20415 - 19968: 0xF8B5, - 20418 - 19968: 0xCCF5, - 20419 - 19968: 0xF5B5, - 20420 - 19968: 0xE4AD, - 20425 - 19968: 0xE7EB, - 20426 - 19968: 0xF1D5, - 20430 - 19968: 0xF0BB, - 20433 - 19968: 0xE9B5, - 20435 - 19968: 0xCCC9, - 20436 - 19968: 0xFAD5, - 20439 - 19968: 0xE1D4, - 20442 - 19968: 0xD7D6, - 20445 - 19968: 0xDCC1, - 20447 - 19968: 0xDEC6, - 20448 - 19968: 0xFAEF, - 20449 - 19968: 0xE3E1, - 20462 - 19968: 0xE1F3, - 20463 - 19968: 0xDCF6, - 20465 - 19968: 0xCEFC, - 20467 - 19968: 0xDBC4, - 20469 - 19968: 0xF8F1, - 20472 - 19968: 0xDCE4, - 20474 - 19968: 0xE5EF, - 20482 - 19968: 0xDCB1, - 20486 - 19968: 0xD5D6, - 20489 - 19968: 0xF3DA, - 20491 - 19968: 0xCBC1, - 20493 - 19968: 0xDBC3, - 20497 - 19968: 0xD9FA, - 20498 - 19968: 0xD3EE, - 20502 - 19968: 0xFAB8, - 20505 - 19968: 0xFDA6, - 20506 - 19968: 0xEBEF, - 20508 - 19968: 0xF4A6, - 20510 - 19968: 0xCCCA, - 20511 - 19968: 0xF3A8, - 20513 - 19968: 0xF3DB, - 20515 - 19968: 0xDBA7, - 20516 - 19968: 0xF6B7, - 20518 - 19968: 0xCFE6, - 20519 - 19968: 0xF0F2, - 20520 - 19968: 0xCBDA, - 20522 - 19968: 0xE7D2, - 20523 - 19968: 0xD7C3, - 20524 - 19968: 0xF6F0, - 20525 - 19968: 0xE8DE, - 20539 - 19968: 0xE5A6, - 20547 - 19968: 0xE5E7, - 20551 - 19968: 0xCAA3, - 20552 - 19968: 0xCCA7, - 20553 - 19968: 0xEAC9, - 20559 - 19968: 0xF8B6, - 20565 - 19968: 0xFAA5, - 20570 - 19968: 0xF1AE, - 20572 - 19968: 0xEFCE, - 20581 - 19968: 0xCBED, - 20596 - 19968: 0xF6B0, - 20597 - 19968: 0xEFCF, - 20598 - 19968: 0xE9CF, - 20600 - 19968: 0xF7DE, - 20608 - 19968: 0xCED3, - 20613 - 19968: 0xDCF7, - 20621 - 19968: 0xDBA8, - 20625 - 19968: 0xCBF8, - 20632 - 19968: 0xDFA1, - 20633 - 19968: 0xDDE1, - 20652 - 19968: 0xF5CA, - 20653 - 19968: 0xE9B6, - 20658 - 19968: 0xE7EC, - 20659 - 19968: 0xEEEE, - 20661 - 19968: 0xF3F0, - 20663 - 19968: 0xDFBF, - 20670 - 19968: 0xCCCB, - 20677 - 19968: 0xD0C1, - 20681 - 19968: 0xF4D2, - 20682 - 19968: 0xE0BA, - 20687 - 19968: 0xDFC0, - 20689 - 19968: 0xCEE0, - 20693 - 19968: 0xDCD2, - 20694 - 19968: 0xFDEA, - 20698 - 19968: 0xD6F6, - 20702 - 19968: 0xEACA, - 20709 - 19968: 0xE8E9, - 20711 - 19968: 0xE3AC, - 20717 - 19968: 0xF3D0, - 20729 - 19968: 0xCAA4, - 20731 - 19968: 0xDBF8, - 20735 - 19968: 0xDEC7, - 20736 - 19968: 0xEBF0, - 20737 - 19968: 0xF1D6, - 20740 - 19968: 0xE5E2, - 20742 - 19968: 0xCCCC, - 20745 - 19968: 0xCBFB, - 20754 - 19968: 0xEAE3, - 20767 - 19968: 0xDFC1, - 20769 - 19968: 0xD6ED, - 20778 - 19968: 0xE9D0, - 20786 - 19968: 0xEEB9, - 20791 - 19968: 0xD5E3, - 20794 - 19968: 0xD1D3, - 20796 - 19968: 0xE5F0, - 20800 - 19968: 0xE8B4, - 20801 - 19968: 0xEBC3, - 20803 - 19968: 0xEAAA, - 20804 - 19968: 0xFAFC, - 20805 - 19968: 0xF5F6, - 20806 - 19968: 0xF0BC, - 20807 - 19968: 0xFDD4, - 20808 - 19968: 0xE0BB, - 20809 - 19968: 0xCEC3, - 20811 - 19968: 0xD0BA, - 20812 - 19968: 0xF7BA, - 20813 - 19968: 0xD8F3, - 20814 - 19968: 0xF7CD, - 20818 - 19968: 0xE4AE, - 20828 - 19968: 0xD4DF, - 20834 - 19968: 0xD0E7, - 20837 - 19968: 0xECFD, - 20839 - 19968: 0xD2AE, - 20840 - 19968: 0xEEEF, - 20841 - 19968: 0xD5D7, - 20842 - 19968: 0xEAE4, - 20843 - 19968: 0xF8A2, - 20844 - 19968: 0xCDEB, - 20845 - 19968: 0xD7BF, - 20846 - 19968: 0xFBB1, - 20849 - 19968: 0xCDEC, - 20853 - 19968: 0xDCB2, - 20854 - 19968: 0xD0EC, - 20855 - 19968: 0xCEFD, - 20856 - 19968: 0xEEF0, - 20860 - 19968: 0xCCC2, - 20864 - 19968: 0xD0ED, - 20870 - 19968: 0xE5F7, - 20874 - 19968: 0xF3FC, - 20877 - 19968: 0xEEA2, - 20882 - 19968: 0xD9B3, - 20885 - 19968: 0xD8F4, - 20887 - 19968: 0xE9B7, - 20896 - 19968: 0xCEAE, - 20901 - 19968: 0xD9A2, - 20906 - 19968: 0xD8F1, - 20908 - 19968: 0xD4CF, - 20918 - 19968: 0xE5A7, - 20919 - 19968: 0xD5D2, - 20925 - 19968: 0xD6A9, - 20932 - 19968: 0xF4A2, - 20934 - 19968: 0xF1D7, - 20937 - 19968: 0xD5D8, - 20939 - 19968: 0xF0BD, - 20940 - 19968: 0xD7D0, - 20941 - 19968: 0xD4D0, - 20956 - 19968: 0xD7CF, - 20957 - 19968: 0xEBEA, - 20958 - 19968: 0xFDEB, - 20961 - 19968: 0xDBED, - 20976 - 19968: 0xFCC5, - 20977 - 19968: 0xCBC2, - 20982 - 19968: 0xFDD5, - 20984 - 19968: 0xF4C8, - 20985 - 19968: 0xE8EA, - 20986 - 19968: 0xF5F3, - 20989 - 19968: 0xF9DE, - 20992 - 19968: 0xD3EF, - 20995 - 19968: 0xECD3, - 20998 - 19968: 0xDDC2, - 20999 - 19968: 0xEFB7, - 21000 - 19968: 0xE7D4, - 21002 - 19968: 0xCACA, - 21006 - 19968: 0xD9FB, - 21009 - 19968: 0xFAFD, - 21015 - 19968: 0xD6AA, - 21021 - 19968: 0xF4F8, - 21028 - 19968: 0xF7F7, - 21029 - 19968: 0xDCAC, - 21033 - 19968: 0xD7D7, - 21034 - 19968: 0xDFA2, - 21038 - 19968: 0xCEBE, - 21040 - 19968: 0xD3F0, - 21046 - 19968: 0xF0A4, - 21047 - 19968: 0xE1EC, - 21048 - 19968: 0xCFE7, - 21049 - 19968: 0xF3CB, - 21050 - 19968: 0xEDA9, - 21051 - 19968: 0xCABE, - 21059 - 19968: 0xF4EF, - 21063 - 19968: 0xF6CE, - 21066 - 19968: 0xDEFB, - 21067 - 19968: 0xD0BB, - 21068 - 19968: 0xD5B7, - 21069 - 19968: 0xEEF1, - 21076 - 19968: 0xF4A8, - 21078 - 19968: 0xDCF8, - 21083 - 19968: 0xCBA7, - 21085 - 19968: 0xDACE, - 21089 - 19968: 0xE0E6, - 21097 - 19968: 0xEDA5, - 21098 - 19968: 0xEEF2, - 21103 - 19968: 0xDCF9, - 21106 - 19968: 0xF9DC, - 21109 - 19968: 0xF3DC, - 21117 - 19968: 0xF8F2, - 21119 - 19968: 0xF4F9, - 21123 - 19968: 0xFCF1, - 21127 - 19968: 0xD0BC, - 21128 - 19968: 0xDBF9, - 21129 - 19968: 0xD7B1, - 21133 - 19968: 0xCBFC, - 21137 - 19968: 0xF0A5, - 21138 - 19968: 0xCBFD, - 21147 - 19968: 0xD5F4, - 21151 - 19968: 0xCDED, - 21152 - 19968: 0xCAA5, - 21155 - 19968: 0xD6AB, - 21156 - 19968: 0xD0C2, - 21161 - 19968: 0xF0BE, - 21162 - 19968: 0xD2BD, - 21163 - 19968: 0xCCA4, - 21182 - 19968: 0xFAB6, - 21185 - 19968: 0xCCCD, - 21187 - 19968: 0xDAFA, - 21189 - 19968: 0xF6CF, - 21191 - 19968: 0xE9B8, - 21193 - 19968: 0xD8F5, - 21197 - 19968: 0xCCCE, - 21202 - 19968: 0xD7CD, - 21205 - 19968: 0xD4D1, - 21206 - 19968: 0xE9ED, - 21208 - 19968: 0xCAEB, - 21209 - 19968: 0xD9E2, - 21211 - 19968: 0xFDB2, - 21213 - 19968: 0xE3AD, - 21214 - 19968: 0xD6CC, - 21215 - 19968: 0xD9B4, - 21218 - 19968: 0xE1A7, - 21219 - 19968: 0xEED3, - 21220 - 19968: 0xD0C3, - 21235 - 19968: 0xFDB3, - 21237 - 19968: 0xD5E4, - 21240 - 19968: 0xCFE8, - 21242 - 19968: 0xEDC3, - 21243 - 19968: 0xD0B2, - 21246 - 19968: 0xCEFE, - 21247 - 19968: 0xDAA8, - 21253 - 19968: 0xF8D0, - 21256 - 19968: 0xFDD6, - 21261 - 19968: 0xF8D1, - 21263 - 19968: 0xF8D2, - 21264 - 19968: 0xDCD3, - 21269 - 19968: 0xDDE2, - 21270 - 19968: 0xFBF9, - 21271 - 19968: 0xDDC1, - 21273 - 19968: 0xE3B5, - 21280 - 19968: 0xEDDD, - 21281 - 19968: 0xCEC4, - 21283 - 19968: 0xCBA1, - 21290 - 19968: 0xDDE3, - 21295 - 19968: 0xFCDD, - 21305 - 19968: 0xF9AF, - 21311 - 19968: 0xD2FB, - 21312 - 19968: 0xCFA1, - 21313 - 19968: 0xE4A8, - 21315 - 19968: 0xF4B6, - 21316 - 19968: 0xECFE, - 21319 - 19968: 0xE3AE, - 21320 - 19968: 0xE7ED, - 21321 - 19968: 0xFDC1, - 21322 - 19968: 0xDAE2, - 21325 - 19968: 0xD8B3, - 21329 - 19968: 0xDDE4, - 21330 - 19968: 0xF0EF, - 21331 - 19968: 0xF6F1, - 21332 - 19968: 0xFAF0, - 21335 - 19968: 0xD1F5, - 21338 - 19968: 0xDACF, - 21340 - 19968: 0xDCD4, - 21342 - 19968: 0xDCA6, - 21344 - 19968: 0xEFBF, - 21350 - 19968: 0xCECF, - 21352 - 19968: 0xE0D9, - 21359 - 19968: 0xD9D6, - 21360 - 19968: 0xECD4, - 21361 - 19968: 0xEACB, - 21364 - 19968: 0xCABF, - 21365 - 19968: 0xD5B0, - 21367 - 19968: 0xCFE9, - 21373 - 19968: 0xF1ED, - 21375 - 19968: 0xCCCF, - 21380 - 19968: 0xE4F8, - 21395 - 19968: 0xE4ED, - 21400 - 19968: 0xD7D8, - 21402 - 19968: 0xFDA7, - 21407 - 19968: 0xEAAB, - 21408 - 19968: 0xF6B2, - 21413 - 19968: 0xCFF0, - 21414 - 19968: 0xF9BD, - 21421 - 19968: 0xE6F4, - 21435 - 19968: 0xCBDB, - 21443 - 19968: 0xF3D1, - 21448 - 19968: 0xE9D1, - 21449 - 19968: 0xF3A9, - 21450 - 19968: 0xD0E0, - 21451 - 19968: 0xE9D2, - 21453 - 19968: 0xDAE3, - 21460 - 19968: 0xE2D2, - 21462 - 19968: 0xF6A2, - 21463 - 19968: 0xE1F4, - 21467 - 19968: 0xDAE4, - 21473 - 19968: 0xE7D5, - 21474 - 19968: 0xF5BF, - 21475 - 19968: 0xCFA2, - 21476 - 19968: 0xCDAF, - 21477 - 19968: 0xCFA3, - 21481 - 19968: 0xCDB0, - 21482 - 19968: 0xF1FE, - 21483 - 19968: 0xD0A3, - 21484 - 19968: 0xE1AF, - 21485 - 19968: 0xF8A3, - 21487 - 19968: 0xCAA6, - 21488 - 19968: 0xF7BB, - 21489 - 19968: 0xF2EA, - 21490 - 19968: 0xDEC8, - 21491 - 19968: 0xE9D3, - 21496 - 19968: 0xDEC9, - 21507 - 19968: 0xFDDE, - 21508 - 19968: 0xCAC0, - 21512 - 19968: 0xF9EA, - 21513 - 19968: 0xD1CE, - 21514 - 19968: 0xEED4, - 21516 - 19968: 0xD4D2, - 21517 - 19968: 0xD9A3, - 21518 - 19968: 0xFDA8, - 21519 - 19968: 0xD7D9, - 21520 - 19968: 0xF7CE, - 21521 - 19968: 0xFABE, - 21531 - 19968: 0xCFD6, - 21533 - 19968: 0xD7F0, - 21535 - 19968: 0xEBE1, - 21536 - 19968: 0xF8C5, - 21542 - 19968: 0xDCFA, - 21545 - 19968: 0xDDC3, - 21547 - 19968: 0xF9DF, - 21555 - 19968: 0xE7EF, - 21560 - 19968: 0xFDE5, - 21561 - 19968: 0xF6A3, - 21563 - 19968: 0xD9FC, - 21564 - 19968: 0xFDA9, - 21566 - 19968: 0xE7EE, - 21570 - 19968: 0xD5E5, - 21576 - 19968: 0xEFD0, - 21578 - 19968: 0xCDB1, - 21585 - 19968: 0xF7A2, - 21608 - 19968: 0xF1B2, - 21610 - 19968: 0xF1B1, - 21617 - 19968: 0xCDB2, - 21619 - 19968: 0xDAAB, - 21621 - 19968: 0xCAA7, - 21627 - 19968: 0xE3E2, - 21628 - 19968: 0xFBBC, - 21629 - 19968: 0xD9A4, - 21632 - 19968: 0xEEBA, - 21638 - 19968: 0xF8D3, - 21644 - 19968: 0xFBFA, - 21646 - 19968: 0xCFA4, - 21648 - 19968: 0xDCFB, - 21668 - 19968: 0xF6E3, - 21672 - 19968: 0xEDAA, - 21675 - 19968: 0xF2A1, - 21676 - 19968: 0xCEE1, - 21683 - 19968: 0xFAA6, - 21688 - 19968: 0xF9E0, - 21693 - 19968: 0xECD6, - 21696 - 19968: 0xE4EE, - 21697 - 19968: 0xF9A1, - 21700 - 19968: 0xFBEF, - 21704 - 19968: 0xF9EB, - 21705 - 19968: 0xEEA3, - 21729 - 19968: 0xEAAC, - 21733 - 19968: 0xCAA8, - 21736 - 19968: 0xF4FA, - 21741 - 19968: 0xCDD6, - 21742 - 19968: 0xFCF6, - 21746 - 19968: 0xF4C9, - 21754 - 19968: 0xF8D4, - 21764 - 19968: 0xF8A6, - 21766 - 19968: 0xDECA, - 21767 - 19968: 0xF2C6, - 21774 - 19968: 0xD7DA, - 21776 - 19968: 0xD3D0, - 21788 - 19968: 0xD8C5, - 21807 - 19968: 0xEAE6, - 21809 - 19968: 0xF3DD, - 21813 - 19968: 0xE4DA, - 21822 - 19968: 0xF6E4, - 21828 - 19968: 0xF6F2, - 21830 - 19968: 0xDFC2, - 21839 - 19968: 0xD9FD, - 21843 - 19968: 0xCCF6, - 21846 - 19968: 0xD3BA, - 21854 - 19968: 0xE4AF, - 21859 - 19968: 0xF9E1, - 21884 - 19968: 0xF0A6, - 21888 - 19968: 0xCBD3, - 21892 - 19968: 0xE0BC, - 21894 - 19968: 0xF4CA, - 21895 - 19968: 0xD4FA, - 21897 - 19968: 0xFDAA, - 21898 - 19968: 0xF9E2, - 21912 - 19968: 0xF4B7, - 21913 - 19968: 0xFDC2, - 21914 - 19968: 0xFCB0, - 21916 - 19968: 0xFDEC, - 21917 - 19968: 0xCAE2, - 21927 - 19968: 0xFDBD, - 21929 - 19968: 0xEAE7, - 21930 - 19968: 0xDFC3, - 21931 - 19968: 0xD1D2, - 21932 - 19968: 0xCEE2, - 21934 - 19968: 0xD3A4, - 21957 - 19968: 0xFDAB, - 21959 - 19968: 0xDFE0, - 21972 - 19968: 0xF2C7, - 21978 - 19968: 0xE7F0, - 21980 - 19968: 0xD0EE, - 21983 - 19968: 0xF3AA, - 21987 - 19968: 0xDECB, - 21988 - 19968: 0xF6B8, - 22013 - 19968: 0xE1F5, - 22014 - 19968: 0xF1B3, - 22022 - 19968: 0xF7A3, - 22025 - 19968: 0xCAA9, - 22036 - 19968: 0xCFA5, - 22039 - 19968: 0xDFC4, - 22063 - 19968: 0xE1B0, - 22066 - 19968: 0xF0BF, - 22068 - 19968: 0xF6A4, - 22070 - 19968: 0xE3B6, - 22099 - 19968: 0xFAC6, - 22120 - 19968: 0xD0EF, - 22123 - 19968: 0xFDED, - 22132 - 19968: 0xDDC4, - 22150 - 19968: 0xFCF7, - 22181 - 19968: 0xE6BF, - 22188 - 19968: 0xDEAD, - 22190 - 19968: 0xFABF, - 22196 - 19968: 0xE5F1, - 22204 - 19968: 0xEDC4, - 22218 - 19968: 0xD2A5, - 22221 - 19968: 0xFDEE, - 22225 - 19968: 0xF5B6, - 22234 - 19968: 0xE1F6, - 22235 - 19968: 0xDECC, - 22238 - 19968: 0xFCDE, - 22240 - 19968: 0xECD7, - 22256 - 19968: 0xCDDD, - 22265 - 19968: 0xD6B7, - 22266 - 19968: 0xCDB3, - 22275 - 19968: 0xF8D5, - 22276 - 19968: 0xE5D8, - 22280 - 19968: 0xCFEA, - 22283 - 19968: 0xCFD0, - 22285 - 19968: 0xEACC, - 22290 - 19968: 0xEAAE, - 22291 - 19968: 0xEAAD, - 22294 - 19968: 0xD3F1, - 22296 - 19968: 0xD3A5, - 22303 - 19968: 0xF7CF, - 22312 - 19968: 0xEEA4, - 22317 - 19968: 0xD0A4, - 22320 - 19968: 0xF2A2, - 22331 - 19968: 0xD0F0, - 22336 - 19968: 0xF2A3, - 22338 - 19968: 0xF7F8, - 22343 - 19968: 0xD0B3, - 22346 - 19968: 0xDBA9, - 22349 - 19968: 0xD3BB, - 22350 - 19968: 0xCAEC, - 22352 - 19968: 0xF1A6, - 22353 - 19968: 0xCBD5, - 22369 - 19968: 0xF7E7, - 22372 - 19968: 0xCDDE, - 22374 - 19968: 0xF7A4, - 22378 - 19968: 0xF8C0, - 22382 - 19968: 0xD3DD, - 22384 - 19968: 0xCCD0, - 22389 - 19968: 0xCFA6, - 22396 - 19968: 0xF6F3, - 22402 - 19968: 0xE1F7, - 22408 - 19968: 0xD3DC, - 22411 - 19968: 0xFAFE, - 22419 - 19968: 0xFAA7, - 22432 - 19968: 0xEBD9, - 22434 - 19968: 0xCFA7, - 22435 - 19968: 0xEAAF, - 22467 - 19968: 0xE4EF, - 22471 - 19968: 0xE9B9, - 22472 - 19968: 0xF1D8, - 22475 - 19968: 0xD8D8, - 22478 - 19968: 0xE0F2, - 22495 - 19968: 0xE6B4, - 22496 - 19968: 0xDCFC, - 22512 - 19968: 0xF3F1, - 22516 - 19968: 0xE3D0, - 22519 - 19968: 0xF2FB, - 22521 - 19968: 0xDBC6, - 22522 - 19968: 0xD0F1, - 22524 - 19968: 0xD0F2, - 22528 - 19968: 0xCFDC, - 22530 - 19968: 0xD3D1, - 22533 - 19968: 0xCCB1, - 22534 - 19968: 0xF7D8, - 22536 - 19968: 0xCBA8, - 22537 - 19968: 0xEBBC, - 22538 - 19968: 0xE4BE, - 22558 - 19968: 0xF4DC, - 22561 - 19968: 0xDCC2, - 22564 - 19968: 0xF0A7, - 22567 - 19968: 0xE6C0, - 22570 - 19968: 0xCAED, - 22575 - 19968: 0xE8EB, - 22576 - 19968: 0xE5E8, - 22577 - 19968: 0xDCC3, - 22580 - 19968: 0xEDDE, - 22581 - 19968: 0xD3F2, - 22586 - 19968: 0xCCF7, - 22602 - 19968: 0xCED4, - 22603 - 19968: 0xE7AB, - 22607 - 19968: 0xCBC3, - 22609 - 19968: 0xE1B1, - 22612 - 19968: 0xF7B2, - 22615 - 19968: 0xD3F3, - 22616 - 19968: 0xD3D2, - 22618 - 19968: 0xF5C0, - 22622 - 19968: 0xDFDD, - 22625 - 19968: 0xEEF3, - 22626 - 19968: 0xE7F1, - 22628 - 19968: 0xFDB4, - 22645 - 19968: 0xF2C8, - 22649 - 19968: 0xF3D2, - 22652 - 19968: 0xEEF4, - 22654 - 19968: 0xE2D3, - 22659 - 19968: 0xCCD1, - 22661 - 19968: 0xDFEA, - 22665 - 19968: 0xE9BA, - 22675 - 19968: 0xD9D7, - 22684 - 19968: 0xF5CD, - 22686 - 19968: 0xF1F2, - 22687 - 19968: 0xFAC7, - 22696 - 19968: 0xD9F8, - 22697 - 19968: 0xD4C2, - 22702 - 19968: 0xF6E5, - 22707 - 19968: 0xDDC5, - 22714 - 19968: 0xE7F2, - 22715 - 19968: 0xEDDF, - 22718 - 19968: 0xCACB, - 22721 - 19968: 0xDBFA, - 22725 - 19968: 0xE8B5, - 22727 - 19968: 0xD3A6, - 22734 - 19968: 0xFDB5, - 22737 - 19968: 0xF9C9, - 22739 - 19968: 0xE4E2, - 22741 - 19968: 0xFBBD, - 22744 - 19968: 0xD7A4, - 22745 - 19968: 0xCEC5, - 22750 - 19968: 0xCED5, - 22751 - 19968: 0xD6E6, - 22756 - 19968: 0xE5BD, - 22763 - 19968: 0xDECD, - 22764 - 19968: 0xECF3, - 22767 - 19968: 0xEDE0, - 22777 - 19968: 0xECEC, - 22778 - 19968: 0xFBBE, - 22779 - 19968: 0xDFEB, - 22781 - 19968: 0xE1F8, - 22799 - 19968: 0xF9BE, - 22804 - 19968: 0xD0F3, - 22805 - 19968: 0xE0AA, - 22806 - 19968: 0xE8E2, - 22809 - 19968: 0xE2D4, - 22810 - 19968: 0xD2FD, - 22812 - 19968: 0xE5A8, - 22818 - 19968: 0xD9D3, - 22823 - 19968: 0xD3DE, - 22825 - 19968: 0xF4B8, - 22826 - 19968: 0xF7BC, - 22827 - 19968: 0xDCFD, - 22829 - 19968: 0xE8EC, - 22830 - 19968: 0xE4E7, - 22833 - 19968: 0xE3F7, - 22839 - 19968: 0xECA8, - 22846 - 19968: 0xFAF1, - 22852 - 19968: 0xE5F2, - 22855 - 19968: 0xD0F4, - 22856 - 19968: 0xD2AF, - 22857 - 19968: 0xDCE5, - 22862 - 19968: 0xD0A5, - 22863 - 19968: 0xF1B4, - 22864 - 19968: 0xFCB1, - 22865 - 19968: 0xCCF8, - 22868 - 19968: 0xDDC6, - 22869 - 19968: 0xFAD1, - 22871 - 19968: 0xF7DF, - 22874 - 19968: 0xFAA8, - 22880 - 19968: 0xEEF5, - 22882 - 19968: 0xDECE, - 22887 - 19968: 0xE7F3, - 22890 - 19968: 0xF7AC, - 22891 - 19968: 0xEBC4, - 22892 - 19968: 0xEDE1, - 22893 - 19968: 0xE0AB, - 22894 - 19968: 0xDDC7, - 22899 - 19968: 0xD2B3, - 22900 - 19968: 0xD2BF, - 22904 - 19968: 0xCACC, - 22909 - 19968: 0xFBBF, - 22914 - 19968: 0xE5FD, - 22915 - 19968: 0xDDE5, - 22916 - 19968: 0xD8CD, - 22922 - 19968: 0xECF4, - 22931 - 19968: 0xD0F5, - 22934 - 19968: 0xE8ED, - 22935 - 19968: 0xD0D2, - 22937 - 19968: 0xD9D8, - 22949 - 19968: 0xF6E6, - 22952 - 19968: 0xDBAA, - 22956 - 19968: 0xF7E0, - 22969 - 19968: 0xD8D9, - 22971 - 19968: 0xF4A3, - 22974 - 19968: 0xF4DD, - 22979 - 19968: 0xEFD1, - 22982 - 19968: 0xD9B5, - 22985 - 19968: 0xEDAB, - 22987 - 19968: 0xE3B7, - 22992 - 19968: 0xEEBB, - 22993 - 19968: 0xCDB4, - 22995 - 19968: 0xE0F3, - 22996 - 19968: 0xEACD, - 23001 - 19968: 0xECF5, - 23002 - 19968: 0xE8EE, - 23004 - 19968: 0xCBA9, - 23005 - 19968: 0xF1AF, - 23014 - 19968: 0xCACD, - 23016 - 19968: 0xECA9, - 23018 - 19968: 0xF2EB, - 23020 - 19968: 0xFDEF, - 23022 - 19968: 0xF9F3, - 23032 - 19968: 0xE6C1, - 23035 - 19968: 0xECD8, - 23039 - 19968: 0xEDAC, - 23041 - 19968: 0xEACE, - 23043 - 19968: 0xE8DF, - 23057 - 19968: 0xDECF, - 23064 - 19968: 0xD2A6, - 23067 - 19968: 0xE7F4, - 23068 - 19968: 0xD1D6, - 23071 - 19968: 0xE6C2, - 23072 - 19968: 0xE3E3, - 23077 - 19968: 0xE4B0, - 23081 - 19968: 0xD8B4, - 23094 - 19968: 0xF6A5, - 23100 - 19968: 0xF3DE, - 23105 - 19968: 0xD7A5, - 23110 - 19968: 0xF7E8, - 23113 - 19968: 0xE8C6, - 23130 - 19968: 0xFBE6, - 23138 - 19968: 0xDDE6, - 23142 - 19968: 0xDCFE, - 23186 - 19968: 0xD8DA, - 23194 - 19968: 0xDAAC, - 23195 - 19968: 0xEAB0, - 23204 - 19968: 0xE3B8, - 23233 - 19968: 0xCAAA, - 23234 - 19968: 0xE1F9, - 23236 - 19968: 0xEAB1, - 23241 - 19968: 0xF2EC, - 23244 - 19968: 0xFAEE, - 23265 - 19968: 0xEED5, - 23270 - 19968: 0xF9F4, - 23273 - 19968: 0xD2EC, - 23301 - 19968: 0xFBFB, - 23305 - 19968: 0xFDF0, - 23307 - 19968: 0xE0BD, - 23308 - 19968: 0xCEE3, - 23318 - 19968: 0xF8C6, - 23338 - 19968: 0xDEAE, - 23360 - 19968: 0xDFC5, - 23363 - 19968: 0xE5BE, - 23376 - 19968: 0xEDAD, - 23377 - 19968: 0xFAEA, - 23380 - 19968: 0xCDEE, - 23381 - 19968: 0xEDA6, - 23383 - 19968: 0xEDAE, - 23384 - 19968: 0xF0ED, - 23386 - 19968: 0xDDA1, - 23388 - 19968: 0xEDAF, - 23389 - 19968: 0xFCF8, - 23391 - 19968: 0xD8EB, - 23395 - 19968: 0xCCF9, - 23396 - 19968: 0xCDB5, - 23401 - 19968: 0xFAA9, - 23403 - 19968: 0xE1DD, - 23408 - 19968: 0xE2D5, - 23409 - 19968: 0xEDCF, - 23413 - 19968: 0xDDA2, - 23416 - 19968: 0xF9CA, - 23418 - 19968: 0xEAE8, - 23420 - 19968: 0xE5ED, - 23429 - 19968: 0xD3EB, - 23431 - 19968: 0xE9D4, - 23432 - 19968: 0xE1FA, - 23433 - 19968: 0xE4CC, - 23435 - 19968: 0xE1E4, - 23436 - 19968: 0xE8C7, - 23439 - 19968: 0xCEDB, - 23443 - 19968: 0xDCD5, - 23445 - 19968: 0xF7B5, - 23446 - 19968: 0xFCF3, - 23447 - 19968: 0xF0F3, - 23448 - 19968: 0xCEAF, - 23449 - 19968: 0xF1B5, - 23450 - 19968: 0xEFD2, - 23451 - 19968: 0xE8C8, - 23452 - 19968: 0xEBF1, - 23458 - 19968: 0xCBD4, - 23459 - 19968: 0xE0BE, - 23460 - 19968: 0xE3F8, - 23461 - 19968: 0xEAE9, - 23462 - 19968: 0xFCB2, - 23468 - 19968: 0xE0F4, - 23470 - 19968: 0xCFE0, - 23472 - 19968: 0xEEA5, - 23475 - 19968: 0xFAAA, - 23476 - 19968: 0xE6C3, - 23477 - 19968: 0xE1B2, - 23478 - 19968: 0xCAAB, - 23480 - 19968: 0xE3E4, - 23481 - 19968: 0xE9BB, - 23487 - 19968: 0xE2D6, - 23488 - 19968: 0xF3F2, - 23490 - 19968: 0xEED6, - 23491 - 19968: 0xEAB2, - 23492 - 19968: 0xD0F6, - 23493 - 19968: 0xECD9, - 23494 - 19968: 0xDACB, - 23495 - 19968: 0xCFA8, - 23500 - 19968: 0xDDA3, - 23504 - 19968: 0xD8DB, - 23506 - 19968: 0xF9CE, - 23507 - 19968: 0xE9D5, - 23508 - 19968: 0xE3D1, - 23511 - 19968: 0xD2BC, - 23518 - 19968: 0xD8AC, - 23519 - 19968: 0xF3CC, - 23521 - 19968: 0xCDFB, - 23522 - 19968: 0xF6D6, - 23524 - 19968: 0xE7F5, - 23525 - 19968: 0xE8EF, - 23526 - 19968: 0xE3F9, - 23527 - 19968: 0xD2BB, - 23528 - 19968: 0xF3F3, - 23529 - 19968: 0xE3FB, - 23531 - 19968: 0xDED0, - 23532 - 19968: 0xCEB0, - 23534 - 19968: 0xD6F7, - 23535 - 19968: 0xF1D9, - 23541 - 19968: 0xF5C1, - 23542 - 19968: 0xDCC4, - 23544 - 19968: 0xF5BB, - 23546 - 19968: 0xDED1, - 23553 - 19968: 0xDCE6, - 23556 - 19968: 0xDED2, - 23559 - 19968: 0xEDE2, - 23560 - 19968: 0xEEF6, - 23561 - 19968: 0xEACF, - 23562 - 19968: 0xF0EE, - 23563 - 19968: 0xE3FC, - 23565 - 19968: 0xD3DF, - 23566 - 19968: 0xD3F4, - 23567 - 19968: 0xE1B3, - 23569 - 19968: 0xE1B4, - 23574 - 19968: 0xF4D3, - 23577 - 19968: 0xDFC6, - 23588 - 19968: 0xE9D6, - 23592 - 19968: 0xDBAB, - 23601 - 19968: 0xF6A6, - 23608 - 19968: 0xE3B9, - 23609 - 19968: 0xEBC5, - 23610 - 19968: 0xF4A9, - 23611 - 19968: 0xCDB6, - 23612 - 19968: 0xD2F9, - 23614 - 19968: 0xDAAD, - 23615 - 19968: 0xD2E3, - 23616 - 19968: 0xCFD1, - 23621 - 19968: 0xCBDC, - 23622 - 19968: 0xCCFA, - 23624 - 19968: 0xCFDD, - 23627 - 19968: 0xE8A9, - 23629 - 19968: 0xE3BB, - 23630 - 19968: 0xE3BA, - 23633 - 19968: 0xE0DA, - 23637 - 19968: 0xEEF7, - 23643 - 19968: 0xDCB3, - 23648 - 19968: 0xD3F5, - 23650 - 19968: 0xD7A6, - 23652 - 19968: 0xF6B5, - 23653 - 19968: 0xD7DB, - 23660 - 19968: 0xE1D5, - 23663 - 19968: 0xD4EA, - 23665 - 19968: 0xDFA3, - 23673 - 19968: 0xFDDF, - 23696 - 19968: 0xD0F7, - 23697 - 19968: 0xEDD4, - 23713 - 19968: 0xCBAA, - 23721 - 19968: 0xE4DB, - 23723 - 19968: 0xE1FB, - 23724 - 19968: 0xCBA2, - 23729 - 19968: 0xD3E0, - 23731 - 19968: 0xE4BF, - 23733 - 19968: 0xFBC0, - 23735 - 19968: 0xDABE, - 23736 - 19968: 0xE4CD, - 23738 - 19968: 0xD6B9, - 23742 - 19968: 0xEFC0, - 23744 - 19968: 0xE1FC, - 23769 - 19968: 0xF6B9, - 23776 - 19968: 0xDFC7, - 23784 - 19968: 0xE4B1, - 23791 - 19968: 0xDCE7, - 23792 - 19968: 0xDCE8, - 23796 - 19968: 0xFAD6, - 23798 - 19968: 0xD3F6, - 23803 - 19968: 0xF1DA, - 23805 - 19968: 0xFAF2, - 23815 - 19968: 0xE2FD, - 23821 - 19968: 0xD5CF, - 23822 - 19968: 0xD0F8, - 23825 - 19968: 0xCDDF, - 23828 - 19968: 0xF5CB, - 23830 - 19968: 0xE4F0, - 23831 - 19968: 0xCBAB, - 23833 - 19968: 0xD7C4, - 23847 - 19968: 0xE2FE, - 23849 - 19968: 0xDDDA, - 23883 - 19968: 0xDAAE, - 23884 - 19968: 0xCAEE, - 23888 - 19968: 0xD5B9, - 23913 - 19968: 0xE3A1, - 23916 - 19968: 0xE8E3, - 23919 - 19968: 0xF3AB, - 23943 - 19968: 0xCFA9, - 23947 - 19968: 0xD3F7, - 23965 - 19968: 0xD4F1, - 23968 - 19968: 0xCEE4, - 23970 - 19968: 0xE8F2, - 23978 - 19968: 0xE5F5, - 23992 - 19968: 0xE7AE, - 23994 - 19968: 0xD6BA, - 23996 - 19968: 0xDFEC, - 23997 - 19968: 0xE4C0, - 24013 - 19968: 0xE8E4, - 24018 - 19968: 0xD8B5, - 24022 - 19968: 0xE4DC, - 24029 - 19968: 0xF4B9, - 24030 - 19968: 0xF1B6, - 24033 - 19968: 0xE2DE, - 24034 - 19968: 0xE1B5, - 24037 - 19968: 0xCDEF, - 24038 - 19968: 0xF1A7, - 24039 - 19968: 0xCEE5, - 24040 - 19968: 0xCBDD, - 24043 - 19968: 0xD9E3, - 24046 - 19968: 0xF3AC, - 24049 - 19968: 0xD0F9, - 24050 - 19968: 0xECAB, - 24051 - 19968: 0xDED3, - 24052 - 19968: 0xF7E9, - 24055 - 19968: 0xF9F5, - 24061 - 19968: 0xE1DE, - 24062 - 19968: 0xCBEE, - 24066 - 19968: 0xE3BC, - 24067 - 19968: 0xF8D6, - 24070 - 19968: 0xDBEE, - 24076 - 19968: 0xFDF1, - 24081 - 19968: 0xF7B6, - 24086 - 19968: 0xF4DE, - 24089 - 19968: 0xF2ED, - 24091 - 19968: 0xDBD9, - 24093 - 19968: 0xF0A8, - 24101 - 19968: 0xE1FD, - 24107 - 19968: 0xDED4, - 24109 - 19968: 0xE0AC, - 24115 - 19968: 0xEDE3, - 24118 - 19968: 0xD3E1, - 24120 - 19968: 0xDFC8, - 24125 - 19968: 0xD9B6, - 24127 - 19968: 0xFDAC, - 24128 - 19968: 0xEFD3, - 24132 - 19968: 0xE4C1, - 24133 - 19968: 0xF8EB, - 24135 - 19968: 0xDBAC, - 24140 - 19968: 0xFCC6, - 24149 - 19968: 0xD8AD, - 24159 - 19968: 0xF6BA, - 24161 - 19968: 0xDBDF, - 24162 - 19968: 0xD3D3, - 24163 - 19968: 0xF8C7, - 24178 - 19968: 0xCACE, - 24179 - 19968: 0xF8C1, - 24180 - 19968: 0xD2B4, - 24183 - 19968: 0xDCB4, - 24184 - 19968: 0xFAB9, - 24185 - 19968: 0xCACF, - 24187 - 19968: 0xFCB3, - 24188 - 19968: 0xEAEA, - 24189 - 19968: 0xEAEB, - 24190 - 19968: 0xD0FA, - 24196 - 19968: 0xEDE4, - 24199 - 19968: 0xDDE7, - 24202 - 19968: 0xDFC9, - 24207 - 19968: 0xDFED, - 24213 - 19968: 0xEEBC, - 24215 - 19968: 0xEFC1, - 24218 - 19968: 0xCCD2, - 24220 - 19968: 0xDDA4, - 24224 - 19968: 0xDFCA, - 24230 - 19968: 0xD3F8, - 24231 - 19968: 0xF1A8, - 24235 - 19968: 0xCDB7, - 24237 - 19968: 0xEFD4, - 24245 - 19968: 0xE4DD, - 24246 - 19968: 0xDFEE, - 24247 - 19968: 0xCBAC, - 24248 - 19968: 0xE9BC, - 24254 - 19968: 0xEAEC, - 24258 - 19968: 0xDFCB, - 24264 - 19968: 0xF9BF, - 24265 - 19968: 0xD6AF, - 24266 - 19968: 0xD5C6, - 24272 - 19968: 0xCFAA, - 24275 - 19968: 0xCEA9, - 24278 - 19968: 0xD6F8, - 24282 - 19968: 0xF1B7, - 24283 - 19968: 0xEEF8, - 24287 - 19968: 0xD9D9, - 24288 - 19968: 0xF3DF, - 24290 - 19968: 0xF8C8, - 24291 - 19968: 0xCEC6, - 24300 - 19968: 0xD5E6, - 24307 - 19968: 0xF4E6, - 24310 - 19968: 0xE6C5, - 24311 - 19968: 0xEFD5, - 24314 - 19968: 0xCBEF, - 24315 - 19968: 0xFCDF, - 24321 - 19968: 0xDCA7, - 24324 - 19968: 0xD6E7, - 24330 - 19968: 0xF8C9, - 24335 - 19968: 0xE3D2, - 24337 - 19968: 0xE3BD, - 24339 - 19968: 0xCFE1, - 24340 - 19968: 0xF0C0, - 24341 - 19968: 0xECDA, - 24343 - 19968: 0xDDD7, - 24344 - 19968: 0xFBF0, - 24347 - 19968: 0xECAC, - 24351 - 19968: 0xF0A9, - 24358 - 19968: 0xFAD7, - 24359 - 19968: 0xFBC1, - 24361 - 19968: 0xD2C0, - 24369 - 19968: 0xE5B0, - 24373 - 19968: 0xEDE5, - 24378 - 19968: 0xCBAD, - 24380 - 19968: 0xF9B0, - 24392 - 19968: 0xF7A5, - 24394 - 19968: 0xCBAE, - 24396 - 19968: 0xDAAF, - 24398 - 19968: 0xD8B6, - 24406 - 19968: 0xD3A7, - 24407 - 19968: 0xFBB2, - 24409 - 19968: 0xFDC4, - 24411 - 19968: 0xECAD, - 24418 - 19968: 0xFBA1, - 24422 - 19968: 0xE5E9, - 24423 - 19968: 0xE9EE, - 24425 - 19968: 0xF3F4, - 24426 - 19968: 0xF8F3, - 24427 - 19968: 0xF0C1, - 24428 - 19968: 0xDEAF, - 24429 - 19968: 0xF8B0, - 24432 - 19968: 0xF3E0, - 24433 - 19968: 0xE7AF, - 24439 - 19968: 0xDBAD, - 24441 - 19968: 0xE6B5, - 24444 - 19968: 0xF9A8, - 24447 - 19968: 0xDDD8, - 24448 - 19968: 0xE8D9, - 24449 - 19968: 0xEFD6, - 24453 - 19968: 0xD3E2, - 24455 - 19968: 0xE2DF, - 24458 - 19968: 0xFCE0, - 24459 - 19968: 0xD7C8, - 24460 - 19968: 0xFDAD, - 24464 - 19968: 0xDFEF, - 24465 - 19968: 0xCCD3, - 24466 - 19968: 0xD3F9, - 24471 - 19968: 0xD4F0, - 24472 - 19968: 0xDBC7, - 24473 - 19968: 0xDED5, - 24478 - 19968: 0xF0F4, - 24480 - 19968: 0xD5D0, - 24481 - 19968: 0xE5D9, - 24488 - 19968: 0xFCC7, - 24489 - 19968: 0xDCD6, - 24490 - 19968: 0xE2E0, - 24494 - 19968: 0xDAB0, - 24501 - 19968: 0xF3A3, - 24503 - 19968: 0xD3EC, - 24505 - 19968: 0xF4CB, - 24509 - 19968: 0xFDC5, - 24515 - 19968: 0xE3FD, - 24517 - 19968: 0xF9B1, - 24524 - 19968: 0xD0FB, - 24525 - 19968: 0xECDB, - 24534 - 19968: 0xF5BC, - 24535 - 19968: 0xF2A4, - 24536 - 19968: 0xD8CE, - 24537 - 19968: 0xD8CF, - 24544 - 19968: 0xF5F7, - 24555 - 19968: 0xF6E1, - 24565 - 19968: 0xD2B7, - 24573 - 19968: 0xFBEC, - 24575 - 19968: 0xDDC8, - 24591 - 19968: 0xE4E8, - 24594 - 19968: 0xD2C1, - 24598 - 19968: 0xF8D7, - 24604 - 19968: 0xD6BB, - 24605 - 19968: 0xDED6, - 24608 - 19968: 0xF7BD, - 24609 - 19968: 0xECAE, - 24613 - 19968: 0xD0E1, - 24615 - 19968: 0xE0F5, - 24616 - 19968: 0xEAB3, - 24618 - 19968: 0xCED6, - 24623 - 19968: 0xCCA5, - 24641 - 19968: 0xECF6, - 24642 - 19968: 0xE2E1, - 24643 - 19968: 0xE3BE, - 24653 - 19968: 0xFCC8, - 24656 - 19968: 0xCDF0, - 24658 - 19968: 0xF9F6, - 24661 - 19968: 0xDFF0, - 24665 - 19968: 0xE5BF, - 24669 - 19968: 0xCEBF, - 24674 - 19968: 0xFCE1, - 24675 - 19968: 0xEDB0, - 24676 - 19968: 0xFDD1, - 24677 - 19968: 0xF6BB, - 24680 - 19968: 0xF9CF, - 24681 - 19968: 0xEBDA, - 24682 - 19968: 0xCAC1, - 24684 - 19968: 0xD2B8, - 24685 - 19968: 0xCDF1, - 24687 - 19968: 0xE3D3, - 24688 - 19968: 0xFDE6, - 24709 - 19968: 0xE6ED, - 24713 - 19968: 0xE3FA, - 24716 - 19968: 0xF0AA, - 24717 - 19968: 0xF9D0, - 24724 - 19968: 0xFCE2, - 24726 - 19968: 0xF8A7, - 24730 - 19968: 0xE1E5, - 24731 - 19968: 0xEEF9, - 24735 - 19968: 0xE7F6, - 24736 - 19968: 0xEAED, - 24739 - 19968: 0xFCB4, - 24740 - 19968: 0xF5C2, - 24743 - 19968: 0xD7DC, - 24752 - 19968: 0xF0F5, - 24754 - 19968: 0xDDE8, - 24755 - 19968: 0xD3ED, - 24756 - 19968: 0xF5FC, - 24758 - 19968: 0xDABF, - 24760 - 19968: 0xCCFB, - 24764 - 19968: 0xD3FA, - 24765 - 19968: 0xF4A4, - 24773 - 19968: 0xEFD7, - 24775 - 19968: 0xD4C3, - 24785 - 19968: 0xFBE3, - 24794 - 19968: 0xFBED, - 24796 - 19968: 0xE0AD, - 24799 - 19968: 0xEAEE, - 24800 - 19968: 0xFBB3, - 24801 - 19968: 0xE4C2, - 24816 - 19968: 0xF6E7, - 24817 - 19968: 0xD2DD, - 24819 - 19968: 0xDFCC, - 24822 - 19968: 0xFCC9, - 24825 - 19968: 0xE5A9, - 24826 - 19968: 0xE0F6, - 24827 - 19968: 0xF6B3, - 24833 - 19968: 0xE1FE, - 24838 - 19968: 0xCBF0, - 24840 - 19968: 0xEAEF, - 24841 - 19968: 0xEAF0, - 24845 - 19968: 0xDAC0, - 24846 - 19968: 0xF8B4, - 24847 - 19968: 0xEBF2, - 24853 - 19968: 0xE4C3, - 24858 - 19968: 0xE9D7, - 24859 - 19968: 0xE4F1, - 24863 - 19968: 0xCAEF, - 24871 - 19968: 0xCED7, - 24880 - 19968: 0xFCCA, - 24884 - 19968: 0xF3E1, - 24887 - 19968: 0xCBC4, - 24892 - 19968: 0xE3E5, - 24894 - 19968: 0xCBC5, - 24895 - 19968: 0xEAB4, - 24898 - 19968: 0xE9BD, - 24900 - 19968: 0xD7C9, - 24903 - 19968: 0xEBDB, - 24904 - 19968: 0xEDB1, - 24906 - 19968: 0xCCC3, - 24907 - 19968: 0xF7BE, - 24908 - 19968: 0xFCCB, - 24915 - 19968: 0xF8F4, - 24917 - 19968: 0xD9B7, - 24920 - 19968: 0xF3D3, - 24921 - 19968: 0xF3D4, - 24925 - 19968: 0xF7E4, - 24927 - 19968: 0xF7D1, - 24930 - 19968: 0xD8B7, - 24931 - 19968: 0xCEB1, - 24932 - 19968: 0xCAC2, - 24935 - 19968: 0xFBB4, - 24936 - 19968: 0xCBC6, - 24939 - 19968: 0xF0F6, - 24942 - 19968: 0xD5E7, - 24944 - 19968: 0xEAD0, - 24950 - 19968: 0xCCD4, - 24951 - 19968: 0xCBAF, - 24957 - 19968: 0xF4AA, - 24958 - 19968: 0xE9AF, - 24961 - 19968: 0xF5C3, - 24962 - 19968: 0xE9D8, - 24970 - 19968: 0xDDE9, - 24974 - 19968: 0xF1F3, - 24976 - 19968: 0xD5FB, - 24977 - 19968: 0xDEBB, - 24980 - 19968: 0xF4FB, - 24984 - 19968: 0xFDF3, - 24985 - 19968: 0xFDF2, - 24986 - 19968: 0xF7A6, - 24996 - 19968: 0xDDC9, - 24999 - 19968: 0xD4D3, - 25001 - 19968: 0xCCA8, - 25003 - 19968: 0xDAC1, - 25004 - 19968: 0xCCD5, - 25006 - 19968: 0xD9E4, - 25010 - 19968: 0xFACA, - 25014 - 19968: 0xE5E3, - 25018 - 19968: 0xD3BC, - 25022 - 19968: 0xCAF0, - 25027 - 19968: 0xD0C4, - 25031 - 19968: 0xCAD0, - 25032 - 19968: 0xFAAB, - 25033 - 19968: 0xEBEB, - 25034 - 19968: 0xE7F8, - 25035 - 19968: 0xD9E5, - 25062 - 19968: 0xD1D7, - 25074 - 19968: 0xF3A4, - 25078 - 19968: 0xD4FB, - 25079 - 19968: 0xFCE3, - 25080 - 19968: 0xFAD8, - 25082 - 19968: 0xF3D5, - 25084 - 19968: 0xCFAB, - 25087 - 19968: 0xEBF3, - 25088 - 19968: 0xD5FC, - 25095 - 19968: 0xD3D4, - 25096 - 19968: 0xCDFC, - 25098 - 19968: 0xD9E6, - 25100 - 19968: 0xE2F9, - 25101 - 19968: 0xE2A1, - 25102 - 19968: 0xEBD4, - 25104 - 19968: 0xE0F7, - 25105 - 19968: 0xE4B2, - 25106 - 19968: 0xCCFC, - 25110 - 19968: 0xFBE4, - 25114 - 19968: 0xF4AB, - 25119 - 19968: 0xD0BD, - 25121 - 19968: 0xCAF1, - 25130 - 19968: 0xEFB8, - 25134 - 19968: 0xD7C0, - 25136 - 19968: 0xEEFA, - 25137 - 19968: 0xFDF4, - 25140 - 19968: 0xD3E3, - 25142 - 19968: 0xFBC2, - 25150 - 19968: 0xD5E8, - 25151 - 19968: 0xDBAE, - 25152 - 19968: 0xE1B6, - 25153 - 19968: 0xF8B7, - 25159 - 19968: 0xE0BF, - 25160 - 19968: 0xFBC3, - 25161 - 19968: 0xDDEA, - 25163 - 19968: 0xE2A2, - 25165 - 19968: 0xEEA6, - 25171 - 19968: 0xF6E8, - 25176 - 19968: 0xF6F5, - 25198 - 19968: 0xDDCA, - 25201 - 19968: 0xD0E2, - 25206 - 19968: 0xDDA6, - 25209 - 19968: 0xDDEB, - 25212 - 19968: 0xE4F9, - 25215 - 19968: 0xE3AF, - 25216 - 19968: 0xD0FC, - 25220 - 19968: 0xF4FC, - 25225 - 19968: 0xCCBC, - 25226 - 19968: 0xF7EA, - 25233 - 19968: 0xE5E4, - 25234 - 19968: 0xDFF1, - 25237 - 19968: 0xF7E1, - 25239 - 19968: 0xF9F7, - 25240 - 19968: 0xEFB9, - 25243 - 19968: 0xF8D8, - 25259 - 19968: 0xF9A9, - 25265 - 19968: 0xF8D9, - 25269 - 19968: 0xEEBD, - 25273 - 19968: 0xD8C6, - 25276 - 19968: 0xE4E3, - 25277 - 19968: 0xF5CE, - 25282 - 19968: 0xDDD9, - 25287 - 19968: 0xD9E7, - 25288 - 19968: 0xD2B9, - 25289 - 19968: 0xD5C3, - 25292 - 19968: 0xDAE5, - 25293 - 19968: 0xDAD0, - 25295 - 19968: 0xD1D9, - 25296 - 19968: 0xCED8, - 25298 - 19968: 0xCBDE, - 25299 - 19968: 0xF4AC, - 25300 - 19968: 0xDAFB, - 25302 - 19968: 0xF6E9, - 25303 - 19968: 0xE8F3, - 25304 - 19968: 0xCFAC, - 25305 - 19968: 0xF0F0, - 25307 - 19968: 0xF4FD, - 25308 - 19968: 0xDBC8, - 25324 - 19968: 0xCEC0, - 25325 - 19968: 0xE3D4, - 25326 - 19968: 0xD1CF, - 25327 - 19968: 0xF1F5, - 25329 - 19968: 0xCDF2, - 25331 - 19968: 0xCFEB, - 25335 - 19968: 0xCDB8, - 25342 - 19968: 0xE3A6, - 25343 - 19968: 0xD1DA, - 25345 - 19968: 0xF2A5, - 25351 - 19968: 0xF2A6, - 25353 - 19968: 0xE4CE, - 25361 - 19968: 0xD3FB, - 25387 - 19968: 0xF1A9, - 25391 - 19968: 0xF2C9, - 25402 - 19968: 0xEFD8, - 25403 - 19968: 0xE6C9, - 25405 - 19968: 0xD8B8, - 25406 - 19968: 0xFAF3, - 25417 - 19968: 0xF3B5, - 25420 - 19968: 0xF8A4, - 25423 - 19968: 0xD1F3, - 25424 - 19968: 0xE6C8, - 25429 - 19968: 0xF8DA, - 25447 - 19968: 0xDCE9, - 25448 - 19968: 0xDED7, - 25454 - 19968: 0xCBDF, - 25458 - 19968: 0xCFEC, - 25463 - 19968: 0xF4DF, - 25466 - 19968: 0xD1F4, - 25467 - 19968: 0xD2BA, - 25471 - 19968: 0xDFF2, - 25475 - 19968: 0xE1B7, - 25480 - 19968: 0xE2A3, - 25481 - 19968: 0xD3FC, - 25484 - 19968: 0xEDE6, - 25490 - 19968: 0xDBC9, - 25494 - 19968: 0xE4FA, - 25496 - 19968: 0xCFDE, - 25499 - 19968: 0xCED0, - 25504 - 19968: 0xD5D3, - 25505 - 19968: 0xF3F5, - 25506 - 19968: 0xF7AE, - 25509 - 19968: 0xEFC8, - 25511 - 19968: 0xCDF3, - 25512 - 19968: 0xF5CF, - 25513 - 19968: 0xE5F3, - 25514 - 19968: 0xF0C2, - 25536 - 19968: 0xCAD1, - 25540 - 19968: 0xEAF1, - 25542 - 19968: 0xD0A6, - 25551 - 19968: 0xD9DA, - 25552 - 19968: 0xF0AB, - 25558 - 19968: 0xEBE7, - 25562 - 19968: 0xE5C0, - 25563 - 19968: 0xFCB5, - 25569 - 19968: 0xE4C4, - 25581 - 19968: 0xCCA9, - 25582 - 19968: 0xFDC6, - 25588 - 19968: 0xEAB5, - 25590 - 19968: 0xE5AA, - 25591 - 19968: 0xDFBA, - 25613 - 19968: 0xE1DF, - 25615 - 19968: 0xDAD1, - 25620 - 19968: 0xE1B8, - 25622 - 19968: 0xE8F4, - 25623 - 19968: 0xD3FD, - 25628 - 19968: 0xE2A4, - 25634 - 19968: 0xF2CA, - 25644 - 19968: 0xDAE6, - 25645 - 19968: 0xF7B3, - 25658 - 19968: 0xFDCD, - 25662 - 19968: 0xF3B6, - 25688 - 19968: 0xEED7, - 25696 - 19968: 0xF5C4, - 25705 - 19968: 0xD8A4, - 25711 - 19968: 0xF2A7, - 25720 - 19968: 0xD9B8, - 25721 - 19968: 0xD9B9, - 25722 - 19968: 0xEFC9, - 25736 - 19968: 0xD6CE, - 25745 - 19968: 0xF7CB, - 25746 - 19968: 0xDFAE, - 25747 - 19968: 0xE8F5, - 25754 - 19968: 0xD2B5, - 25758 - 19968: 0xD3D5, - 25764 - 19968: 0xF4CC, - 25765 - 19968: 0xDAFC, - 25771 - 19968: 0xD9E8, - 25773 - 19968: 0xF7EB, - 25774 - 19968: 0xF5C9, - 25776 - 19968: 0xF3BC, - 25778 - 19968: 0xDAD2, - 25787 - 19968: 0xD3B5, - 25793 - 19968: 0xE8B6, - 25796 - 19968: 0xD6CF, - 25797 - 19968: 0xF4BA, - 25799 - 19968: 0xF7C9, - 25802 - 19968: 0xCCAA, - 25805 - 19968: 0xF0C3, - 25806 - 19968: 0xCCD6, - 25810 - 19968: 0xD0D3, - 25812 - 19968: 0xD3BD, - 25816 - 19968: 0xDBFB, - 25818 - 19968: 0xCBE0, - 25825 - 19968: 0xD3E4, - 25826 - 19968: 0xF6F7, - 25829 - 19968: 0xD5BA, - 25830 - 19968: 0xF3CD, - 25831 - 19968: 0xCBE1, - 25836 - 19968: 0xEBF4, - 25842 - 19968: 0xF4AD, - 25844 - 19968: 0xFCAA, - 25850 - 19968: 0xF7EC, - 25854 - 19968: 0xE8F6, - 25856 - 19968: 0xDAE7, - 25860 - 19968: 0xF7CC, - 25880 - 19968: 0xE5C1, - 25885 - 19968: 0xE0EE, - 25891 - 19968: 0xD5FD, - 25898 - 19968: 0xCEE6, - 25899 - 19968: 0xFCAB, - 25900 - 19968: 0xD5BB, - 25903 - 19968: 0xF2A8, - 25910 - 19968: 0xE2A5, - 25911 - 19968: 0xCDB9, - 25912 - 19968: 0xEAF2, - 25913 - 19968: 0xCBC7, - 25915 - 19968: 0xCDF4, - 25918 - 19968: 0xDBAF, - 25919 - 19968: 0xEFD9, - 25925 - 19968: 0xCDBA, - 25928 - 19968: 0xFCF9, - 25933 - 19968: 0xDFF3, - 25934 - 19968: 0xCEE7, - 25935 - 19968: 0xDAC2, - 25937 - 19968: 0xCFAD, - 25942 - 19968: 0xE7F9, - 25943 - 19968: 0xF8A8, - 25950 - 19968: 0xF3E2, - 25954 - 19968: 0xCAF2, - 25955 - 19968: 0xDFA4, - 25958 - 19968: 0xD4C4, - 25964 - 19968: 0xCCD7, - 25965 - 19968: 0xE5C2, - 25970 - 19968: 0xCDBB, - 25972 - 19968: 0xEFDA, - 25973 - 19968: 0xEED8, - 25975 - 19968: 0xDDA7, - 25976 - 19968: 0xE2A6, - 25982 - 19968: 0xE0C0, - 25986 - 19968: 0xD6B0, - 25987 - 19968: 0xF8CA, - 25989 - 19968: 0xFCFA, - 25991 - 19968: 0xD9FE, - 25996 - 19968: 0xDEB0, - 26000 - 19968: 0xDDEC, - 26001 - 19968: 0xDAE8, - 26007 - 19968: 0xD4E0, - 26009 - 19968: 0xD6F9, - 26011 - 19968: 0xCDD7, - 26012 - 19968: 0xDED8, - 26015 - 19968: 0xF2F8, - 26017 - 19968: 0xE4D6, - 26020 - 19968: 0xD0C5, - 26021 - 19968: 0xF4AE, - 26023 - 19968: 0xDDA8, - 26027 - 19968: 0xEDC5, - 26028 - 19968: 0xF3D6, - 26031 - 19968: 0xDED9, - 26032 - 19968: 0xE3E6, - 26039 - 19968: 0xD3A8, - 26041 - 19968: 0xDBB0, - 26044 - 19968: 0xE5DA, - 26045 - 19968: 0xE3BF, - 26049 - 19968: 0xDBB1, - 26053 - 19968: 0xD5E9, - 26059 - 19968: 0xE0C1, - 26060 - 19968: 0xEFDB, - 26063 - 19968: 0xF0E9, - 26066 - 19968: 0xD7B2, - 26071 - 19968: 0xD0FD, - 26080 - 19968: 0xD9E9, - 26083 - 19968: 0xD0FE, - 26085 - 19968: 0xECED, - 26086 - 19968: 0xD3A9, - 26088 - 19968: 0xF2A9, - 26089 - 19968: 0xF0C4, - 26092 - 19968: 0xE2E2, - 26093 - 19968: 0xE9EF, - 26097 - 19968: 0xF9D1, - 26100 - 19968: 0xE9D9, - 26106 - 19968: 0xE8DA, - 26107 - 19968: 0xDAC3, - 26108 - 19968: 0xDAC4, - 26109 - 19968: 0xD4C5, - 26111 - 19968: 0xE7FA, - 26118 - 19968: 0xCDE0, - 26119 - 19968: 0xE3B0, - 26121 - 19968: 0xDBB2, - 26122 - 19968: 0xFBC4, - 26124 - 19968: 0xF3E3, - 26126 - 19968: 0xD9A5, - 26127 - 19968: 0xFBE7, - 26128 - 19968: 0xDDCB, - 26129 - 19968: 0xD0D4, - 26131 - 19968: 0xE6B6, - 26132 - 19968: 0xE0AE, - 26133 - 19968: 0xFDDA, - 26142 - 19968: 0xDCB5, - 26143 - 19968: 0xE0F8, - 26144 - 19968: 0xE7B1, - 26149 - 19968: 0xF5F0, - 26151 - 19968: 0xD8DC, - 26152 - 19968: 0xEDC6, - 26157 - 19968: 0xE1B9, - 26159 - 19968: 0xE3C0, - 26160 - 19968: 0xF9C0, - 26161 - 19968: 0xE9F0, - 26164 - 19968: 0xD9DB, - 26166 - 19968: 0xF3E4, - 26170 - 19968: 0xDCB6, - 26171 - 19968: 0xE4E9, - 26177 - 19968: 0xF0C5, - 26178 - 19968: 0xE3C1, - 26179 - 19968: 0xFCCC, - 26180 - 19968: 0xFCCD, - 26185 - 19968: 0xF2CB, - 26187 - 19968: 0xF2CC, - 26191 - 19968: 0xE4CF, - 26201 - 19968: 0xF1DB, - 26203 - 19968: 0xFAD9, - 26205 - 19968: 0xF1B8, - 26206 - 19968: 0xFDF5, - 26207 - 19968: 0xE0F9, - 26212 - 19968: 0xE7FB, - 26213 - 19968: 0xFCB7, - 26214 - 19968: 0xFCE4, - 26215 - 19968: 0xFBC5, - 26216 - 19968: 0xE3E7, - 26217 - 19968: 0xD8B9, - 26219 - 19968: 0xF6F8, - 26222 - 19968: 0xDCC5, - 26223 - 19968: 0xCCD8, - 26227 - 19968: 0xE0AF, - 26228 - 19968: 0xF4E7, - 26230 - 19968: 0xEFDC, - 26231 - 19968: 0xCFFC, - 26232 - 19968: 0xEFDD, - 26234 - 19968: 0xF2AA, - 26244 - 19968: 0xFDBE, - 26247 - 19968: 0xCAAC, - 26248 - 19968: 0xFDBB, - 26249 - 19968: 0xFDC7, - 26254 - 19968: 0xE7B2, - 26256 - 19968: 0xEAD1, - 26257 - 19968: 0xDFF4, - 26262 - 19968: 0xD1EC, - 26263 - 19968: 0xE4DE, - 26264 - 19968: 0xE5C3, - 26269 - 19968: 0xD9A6, - 26272 - 19968: 0xCDBC, - 26274 - 19968: 0xF3E5, - 26283 - 19968: 0xEDD5, - 26286 - 19968: 0xD9BA, - 26290 - 19968: 0xEDE7, - 26291 - 19968: 0xFBB5, - 26292 - 19968: 0xF8EC, - 26297 - 19968: 0xE0E7, - 26299 - 19968: 0xCCD9, - 26302 - 19968: 0xD4C6, - 26308 - 19968: 0xE7A5, - 26310 - 19968: 0xD5F5, - 26311 - 19968: 0xD3BE, - 26313 - 19968: 0xFCFB, - 26326 - 19968: 0xE4F2, - 26329 - 19968: 0xDFF5, - 26332 - 19968: 0xE8F8, - 26333 - 19968: 0xF8ED, - 26336 - 19968: 0xCEC7, - 26342 - 19968: 0xFDF6, - 26352 - 19968: 0xE8D8, - 26354 - 19968: 0xCDD8, - 26355 - 19968: 0xE7D6, - 26356 - 19968: 0xCCDA, - 26359 - 19968: 0xCAE3, - 26360 - 19968: 0xDFF6, - 26361 - 19968: 0xF0C7, - 26362 - 19968: 0xF0C6, - 26364 - 19968: 0xD8BA, - 26366 - 19968: 0xF1F4, - 26367 - 19968: 0xF4F0, - 26368 - 19968: 0xF5CC, - 26371 - 19968: 0xFCE5, - 26376 - 19968: 0xEAC5, - 26377 - 19968: 0xEAF3, - 26379 - 19968: 0xDDDB, - 26381 - 19968: 0xDCD7, - 26388 - 19968: 0xDEFD, - 26389 - 19968: 0xF2F9, - 26391 - 19968: 0xD5C7, - 26395 - 19968: 0xD8D0, - 26397 - 19968: 0xF0C8, - 26398 - 19968: 0xD1A1, - 26399 - 19968: 0xD1A2, - 26406 - 19968: 0xD9D4, - 26407 - 19968: 0xD6E8, - 26408 - 19968: 0xD9CA, - 26410 - 19968: 0xDAB1, - 26411 - 19968: 0xD8C7, - 26412 - 19968: 0xDCE2, - 26413 - 19968: 0xF3CE, - 26414 - 19968: 0xF5F4, - 26417 - 19968: 0xF1B9, - 26420 - 19968: 0xDAD3, - 26422 - 19968: 0xF6EA, - 26426 - 19968: 0xCFF5, - 26429 - 19968: 0xFDAE, - 26438 - 19968: 0xCAD2, - 26441 - 19968: 0xDFB4, - 26446 - 19968: 0xD7DD, - 26447 - 19968: 0xFABA, - 26448 - 19968: 0xEEA7, - 26449 - 19968: 0xF5BD, - 26451 - 19968: 0xF8F5, - 26454 - 19968: 0xEDE8, - 26460 - 19968: 0xD4E1, - 26462 - 19968: 0xD1A3, - 26463 - 19968: 0xE1D6, - 26477 - 19968: 0xF9F8, - 26479 - 19968: 0xDBCA, - 26480 - 19968: 0xCBF9, - 26481 - 19968: 0xD4D4, - 26483 - 19968: 0xD9DC, - 26485 - 19968: 0xEEBE, - 26487 - 19968: 0xF7ED, - 26491 - 19968: 0xD2EE, - 26494 - 19968: 0xE1E6, - 26495 - 19968: 0xF7F9, - 26503 - 19968: 0xDDED, - 26505 - 19968: 0xE8DB, - 26507 - 19968: 0xDBB3, - 26511 - 19968: 0xD1F7, - 26512 - 19968: 0xE0B0, - 26515 - 19968: 0xD4E2, - 26517 - 19968: 0xF6D7, - 26519 - 19968: 0xD7F9, - 26522 - 19968: 0xD8DD, - 26524 - 19968: 0xCDFD, - 26525 - 19968: 0xF2AB, - 26543 - 19968: 0xCDBD, - 26544 - 19968: 0xF8C2, - 26547 - 19968: 0xF2AC, - 26550 - 19968: 0xCAAD, - 26551 - 19968: 0xCAAE, - 26552 - 19968: 0xCFAE, - 26558 - 19968: 0xE3C2, - 26564 - 19968: 0xDCB7, - 26575 - 19968: 0xDBDA, - 26576 - 19968: 0xD9BB, - 26577 - 19968: 0xCAF3, - 26578 - 19968: 0xF6D3, - 26579 - 19968: 0xE6F8, - 26580 - 19968: 0xEAF5, - 26586 - 19968: 0xEAF6, - 26589 - 19968: 0xF6F9, - 26601 - 19968: 0xCFAF, - 26604 - 19968: 0xCAD3, - 26607 - 19968: 0xCAAF, - 26608 - 19968: 0xD2B0, - 26609 - 19968: 0xF1BA, - 26611 - 19968: 0xD7B3, - 26612 - 19968: 0xE3C3, - 26613 - 19968: 0xF3FD, - 26614 - 19968: 0xDEDA, - 26619 - 19968: 0xDEDB, - 26622 - 19968: 0xEFDE, - 26642 - 19968: 0xE2E3, - 26643 - 19968: 0xEEFB, - 26646 - 19968: 0xDFF7, - 26647 - 19968: 0xD7CA, - 26657 - 19968: 0xCEE8, - 26658 - 19968: 0xDBDB, - 26666 - 19968: 0xF1BB, - 26671 - 19968: 0xE9F1, - 26680 - 19968: 0xFAB7, - 26681 - 19968: 0xD0C6, - 26684 - 19968: 0xCCAB, - 26685 - 19968: 0xEEA8, - 26688 - 19968: 0xCBFA, - 26689 - 19968: 0xF9F9, - 26690 - 19968: 0xCCFD, - 26691 - 19968: 0xD3FE, - 26696 - 19968: 0xE4D0, - 26702 - 19968: 0xF2EE, - 26704 - 19968: 0xD4D5, - 26705 - 19968: 0xDFCD, - 26707 - 19968: 0xFCB8, - 26708 - 19968: 0xD1D0, - 26733 - 19968: 0xF2CD, - 26742 - 19968: 0xF7D2, - 26751 - 19968: 0xCAD4, - 26753 - 19968: 0xD5D9, - 26757 - 19968: 0xD8DE, - 26767 - 19968: 0xCDD9, - 26771 - 19968: 0xEEA9, - 26772 - 19968: 0xF6BC, - 26775 - 19968: 0xCCDB, - 26781 - 19968: 0xF0C9, - 26783 - 19968: 0xFCFC, - 26785 - 19968: 0xE8C9, - 26786 - 19968: 0xF4FE, - 26791 - 19968: 0xE7FC, - 26792 - 19968: 0xD7DE, - 26797 - 19968: 0xDEDC, - 26799 - 19968: 0xF0AC, - 26800 - 19968: 0xCCFE, - 26801 - 19968: 0xCDE1, - 26803 - 19968: 0xE1BA, - 26805 - 19968: 0xDBEF, - 26806 - 19968: 0xDAB2, - 26820 - 19968: 0xD1A5, - 26821 - 19968: 0xDCB8, - 26825 - 19968: 0xD8F6, - 26827 - 19968: 0xD1A4, - 26829 - 19968: 0xCDE2, - 26834 - 19968: 0xDCEA, - 26837 - 19968: 0xF0F7, - 26839 - 19968: 0xF0CA, - 26840 - 19968: 0xD0BE, - 26842 - 19968: 0xDDDC, - 26847 - 19968: 0xD4D6, - 26848 - 19968: 0xD3D6, - 26855 - 19968: 0xEDD0, - 26856 - 19968: 0xCDA1, - 26862 - 19968: 0xDFB5, - 26866 - 19968: 0xDFF8, - 26873 - 19968: 0xD4A1, - 26874 - 19968: 0xCEB2, - 26880 - 19968: 0xE8CA, - 26885 - 19968: 0xEBF5, - 26893 - 19968: 0xE3D5, - 26894 - 19968: 0xF5D0, - 26898 - 19968: 0xF5A1, - 26919 - 19968: 0xD9A7, - 26928 - 19968: 0xE5AB, - 26941 - 19968: 0xE6CB, - 26943 - 19968: 0xF5F1, - 26954 - 19968: 0xE5C5, - 26963 - 19968: 0xF9A3, - 26964 - 19968: 0xE0DB, - 26965 - 19968: 0xF6EB, - 26967 - 19968: 0xCBF1, - 26969 - 19968: 0xD9EA, - 26970 - 19968: 0xF5A2, - 26974 - 19968: 0xD7D1, - 26976 - 19968: 0xD1F8, - 26977 - 19968: 0xEAF8, - 26978 - 19968: 0xEAF9, - 26979 - 19968: 0xDAB3, - 26984 - 19968: 0xEFDF, - 26987 - 19968: 0xF1EF, - 26989 - 19968: 0xE5F6, - 26990 - 19968: 0xEEBF, - 26991 - 19968: 0xE2E4, - 26997 - 19968: 0xD0BF, - 26999 - 19968: 0xFAAC, - 27000 - 19968: 0xF5D1, - 27001 - 19968: 0xE7B3, - 27029 - 19968: 0xE9BE, - 27035 - 19968: 0xF2CE, - 27036 - 19968: 0xDBB4, - 27045 - 19968: 0xFCCE, - 27047 - 19968: 0xDDEE, - 27054 - 19968: 0xE7B4, - 27060 - 19968: 0xD7B4, - 27067 - 19968: 0xF7B4, - 27073 - 19968: 0xCDBE, - 27075 - 19968: 0xDAE9, - 27083 - 19968: 0xCFB0, - 27084 - 19968: 0xF7D9, - 27085 - 19968: 0xF3E6, - 27088 - 19968: 0xCED9, - 27112 - 19968: 0xCEAA, - 27114 - 19968: 0xCBC8, - 27131 - 19968: 0xD0A7, - 27133 - 19968: 0xF0CB, - 27135 - 19968: 0xD0C7, - 27138 - 19968: 0xE4C5, - 27146 - 19968: 0xDBE0, - 27153 - 19968: 0xD5DA, - 27155 - 19968: 0xD7A7, - 27159 - 19968: 0xEEC0, - 27161 - 19968: 0xF8F6, - 27166 - 19968: 0xF5D2, - 27167 - 19968: 0xEDE9, - 27169 - 19968: 0xD9BC, - 27171 - 19968: 0xE5C6, - 27189 - 19968: 0xF5A3, - 27192 - 19968: 0xDAD4, - 27193 - 19968: 0xE2A7, - 27194 - 19968: 0xFBFC, - 27197 - 19968: 0xF1DC, - 27204 - 19968: 0xCAF4, - 27208 - 19968: 0xE8FA, - 27211 - 19968: 0xCEE9, - 27218 - 19968: 0xE9F8, - 27219 - 19968: 0xE2E5, - 27224 - 19968: 0xD0B9, - 27225 - 19968: 0xD4F2, - 27231 - 19968: 0xD1A6, - 27233 - 19968: 0xDFCE, - 27243 - 19968: 0xFCF4, - 27264 - 19968: 0xD3AA, - 27268 - 19968: 0xCCAC, - 27273 - 19968: 0xEFE0, - 27277 - 19968: 0xE5E5, - 27278 - 19968: 0xD0D5, - 27287 - 19968: 0xDBFC, - 27292 - 19968: 0xFCE6, - 27298 - 19968: 0xCBFE, - 27299 - 19968: 0xEDEA, - 27315 - 19968: 0xDEB1, - 27323 - 19968: 0xF9E3, - 27330 - 19968: 0xD4A2, - 27331 - 19968: 0xCFF6, - 27347 - 19968: 0xD6D0, - 27354 - 19968: 0xD5EA, - 27355 - 19968: 0xF1EE, - 27382 - 19968: 0xFACB, - 27387 - 19968: 0xE5A1, - 27396 - 19968: 0xD5B1, - 27402 - 19968: 0xCFED, - 27404 - 19968: 0xEDEB, - 27410 - 19968: 0xD5B2, - 27414 - 19968: 0xD5BC, - 27424 - 19968: 0xFDE2, - 27425 - 19968: 0xF3AD, - 27427 - 19968: 0xFDDB, - 27442 - 19968: 0xE9B0, - 27450 - 19968: 0xD1A7, - 27453 - 19968: 0xFDE3, - 27454 - 19968: 0xCEB3, - 27462 - 19968: 0xFDE4, - 27463 - 19968: 0xFACE, - 27468 - 19968: 0xCAB0, - 27470 - 19968: 0xF7A7, - 27472 - 19968: 0xCFB1, - 27487 - 19968: 0xE6A2, - 27489 - 19968: 0xFCB6, - 27490 - 19968: 0xF2AD, - 27491 - 19968: 0xEFE1, - 27492 - 19968: 0xF3AE, - 27493 - 19968: 0xDCC6, - 27494 - 19968: 0xD9EB, - 27498 - 19968: 0xE8E0, - 27506 - 19968: 0xE1A8, - 27511 - 19968: 0xD5F6, - 27512 - 19968: 0xCFFD, - 27515 - 19968: 0xDEDD, - 27519 - 19968: 0xD9D1, - 27523 - 19968: 0xE4EA, - 27524 - 19968: 0xF2CF, - 27526 - 19968: 0xF7BF, - 27529 - 19968: 0xE2E6, - 27530 - 19968: 0xE2A8, - 27542 - 19968: 0xE3D6, - 27544 - 19968: 0xEDD1, - 27550 - 19968: 0xE9F9, - 27566 - 19968: 0xD6B1, - 27567 - 19968: 0xDEB2, - 27570 - 19968: 0xE0E8, - 27573 - 19968: 0xD3AB, - 27575 - 19968: 0xEBDC, - 27578 - 19968: 0xDFAF, - 27580 - 19968: 0xCAC3, - 27583 - 19968: 0xEEFC, - 27585 - 19968: 0xFDC3, - 27589 - 19968: 0xEBF6, - 27590 - 19968: 0xCFB2, - 27595 - 19968: 0xD9EC, - 27597 - 19968: 0xD9BD, - 27599 - 19968: 0xD8DF, - 27602 - 19968: 0xD4B8, - 27603 - 19968: 0xEBBE, - 27604 - 19968: 0xDDEF, - 27606 - 19968: 0xDDF0, - 27607 - 19968: 0xDDF1, - 27608 - 19968: 0xDDF2, - 27611 - 19968: 0xD9BE, - 27627 - 19968: 0xFBC6, - 27628 - 19968: 0xCFB3, - 27656 - 19968: 0xEEFD, - 27663 - 19968: 0xE4AB, - 27665 - 19968: 0xDAC5, - 27667 - 19968: 0xD8EC, - 27683 - 19968: 0xD1A8, - 27700 - 19968: 0xE2A9, - 27703 - 19968: 0xDEBC, - 27704 - 19968: 0xE7B5, - 27710 - 19968: 0xDBF0, - 27712 - 19968: 0xEFE2, - 27713 - 19968: 0xF1F0, - 27714 - 19968: 0xCFB4, - 27726 - 19968: 0xDBF1, - 27728 - 19968: 0xE0B1, - 27733 - 19968: 0xDFA5, - 27735 - 19968: 0xF9D2, - 27738 - 19968: 0xE7FD, - 27741 - 19968: 0xE6A3, - 27742 - 19968: 0xFBF1, - 27743 - 19968: 0xCBB0, - 27744 - 19968: 0xF2AE, - 27752 - 19968: 0xCDE7, - 27754 - 19968: 0xE8DC, - 27757 - 19968: 0xE7D7, - 27760 - 19968: 0xF7C0, - 27762 - 19968: 0xD0E3, - 27766 - 19968: 0xDAA1, - 27770 - 19968: 0xCCBD, - 27773 - 19968: 0xD1A9, - 27774 - 19968: 0xDDCC, - 27777 - 19968: 0xE3FE, - 27778 - 19968: 0xD1AA, - 27779 - 19968: 0xE8AA, - 27781 - 19968: 0xEAB6, - 27782 - 19968: 0xF9FA, - 27783 - 19968: 0xE6CC, - 27784 - 19968: 0xF6D8, - 27788 - 19968: 0xD4C7, - 27792 - 19968: 0xD9CB, - 27794 - 19968: 0xD9D2, - 27795 - 19968: 0xD3CB, - 27796 - 19968: 0xD8F7, - 27797 - 19968: 0xDAA9, - 27798 - 19968: 0xF5F8, - 27801 - 19968: 0xDEDE, - 27802 - 19968: 0xF2AF, - 27803 - 19968: 0xF8A9, - 27819 - 19968: 0xD8C8, - 27822 - 19968: 0xEEC1, - 27827 - 19968: 0xF9C1, - 27832 - 19968: 0xDDF3, - 27833 - 19968: 0xEAFA, - 27835 - 19968: 0xF6BD, - 27836 - 19968: 0xE1BB, - 27837 - 19968: 0xCDBF, - 27838 - 19968: 0xF4D4, - 27839 - 19968: 0xE6CD, - 27841 - 19968: 0xFCCF, - 27842 - 19968: 0xFBA2, - 27844 - 19968: 0xE0DC, - 27849 - 19968: 0xF4BB, - 27850 - 19968: 0xDAD5, - 27852 - 19968: 0xF9B2, - 27859 - 19968: 0xFBF2, - 27861 - 19968: 0xDBF6, - 27863 - 19968: 0xDEDF, - 27867 - 19968: 0xDBF2, - 27873 - 19968: 0xF8DC, - 27874 - 19968: 0xF7EE, - 27875 - 19968: 0xEBE8, - 27877 - 19968: 0xD2FA, - 27880 - 19968: 0xF1BC, - 27883 - 19968: 0xFADA, - 27886 - 19968: 0xDAEA, - 27887 - 19968: 0xDAC6, - 27888 - 19968: 0xF7C1, - 27891 - 19968: 0xE7B6, - 27915 - 19968: 0xE5C7, - 27916 - 19968: 0xD6AC, - 27921 - 19968: 0xDCC7, - 27927 - 19968: 0xE1A9, - 27929 - 19968: 0xE2AA, - 27931 - 19968: 0xD5A6, - 27934 - 19968: 0xD4D7, - 27941 - 19968: 0xF2D0, - 27943 - 19968: 0xEAFB, - 27945 - 19968: 0xE0DD, - 27946 - 19968: 0xFBF3, - 27954 - 19968: 0xF1BD, - 27957 - 19968: 0xE2E7, - 27958 - 19968: 0xFDD7, - 27960 - 19968: 0xCEC8, - 27961 - 19968: 0xEAB7, - 27963 - 19968: 0xFCC0, - 27965 - 19968: 0xFDE7, - 27966 - 19968: 0xF7EF, - 27969 - 19968: 0xD7B5, - 27993 - 19968: 0xEFBA, - 27994 - 19968: 0xF1DD, - 27996 - 19968: 0xDEB3, - 28003 - 19968: 0xE8CB, - 28006 - 19968: 0xF8DD, - 28009 - 19968: 0xFBC7, - 28010 - 19968: 0xD5C8, - 28012 - 19968: 0xD7DF, - 28014 - 19968: 0xDDA9, - 28020 - 19968: 0xE9B1, - 28023 - 19968: 0xFAAD, - 28024 - 19968: 0xF6D9, - 28025 - 19968: 0xFAF4, - 28031 - 19968: 0xF8AA, - 28037 - 19968: 0xE6EE, - 28039 - 19968: 0xCCDC, - 28040 - 19968: 0xE1BC, - 28041 - 19968: 0xE0EF, - 28044 - 19968: 0xE9BF, - 28045 - 19968: 0xFCFD, - 28046 - 19968: 0xE6CE, - 28049 - 19968: 0xE1D7, - 28051 - 19968: 0xE6CF, - 28053 - 19968: 0xF4F1, - 28079 - 19968: 0xE4F3, - 28082 - 19968: 0xE4FB, - 28085 - 19968: 0xF9E4, - 28096 - 19968: 0xEFE3, - 28099 - 19968: 0xCFEE, - 28100 - 19968: 0xF6BE, - 28101 - 19968: 0xE0B2, - 28102 - 19968: 0xFCFE, - 28103 - 19968: 0xD1AB, - 28107 - 19968: 0xD7FA, - 28111 - 19968: 0xFBC8, - 28113 - 19968: 0xE2D7, - 28120 - 19968: 0xD4A3, - 28121 - 19968: 0xF0F8, - 28122 - 19968: 0xD7A8, - 28126 - 19968: 0xE1E7, - 28129 - 19968: 0xD3BF, - 28136 - 19968: 0xEFE4, - 28138 - 19968: 0xD7C5, - 28139 - 19968: 0xEBE2, - 28142 - 19968: 0xFCE7, - 28145 - 19968: 0xE4A2, - 28147 - 19968: 0xE2E8, - 28149 - 19968: 0xE6D0, - 28151 - 19968: 0xFBE8, - 28152 - 19968: 0xF4E8, - 28153 - 19968: 0xE5F4, - 28154 - 19968: 0xF4BC, - 28155 - 19968: 0xF4D5, - 28183 - 19968: 0xDFB6, - 28185 - 19968: 0xFCB9, - 28186 - 19968: 0xEEC2, - 28187 - 19968: 0xCAF5, - 28191 - 19968: 0xEFE5, - 28192 - 19968: 0xCBE2, - 28193 - 19968: 0xD4A4, - 28195 - 19968: 0xDEE0, - 28196 - 19968: 0xDAFD, - 28197 - 19968: 0xE4C6, - 28198 - 19968: 0xE8BE, - 28203 - 19968: 0xE0DE, - 28204 - 19968: 0xF6B4, - 28205 - 19968: 0xEAD2, - 28207 - 19968: 0xF9FB, - 28210 - 19968: 0xE0C2, - 28212 - 19968: 0xCAE4, - 28214 - 19968: 0xE7B7, - 28216 - 19968: 0xEAFD, - 28218 - 19968: 0xD9DD, - 28220 - 19968: 0xDAB4, - 28221 - 19968: 0xEEAA, - 28222 - 19968: 0xFBE9, - 28227 - 19968: 0xDBCB, - 28228 - 19968: 0xDAB5, - 28234 - 19968: 0xF1BE, - 28237 - 19968: 0xD3AC, - 28246 - 19968: 0xFBC9, - 28248 - 19968: 0xDFCF, - 28251 - 19968: 0xD3C0, - 28252 - 19968: 0xE3D7, - 28254 - 19968: 0xEFE6, - 28255 - 19968: 0xFCD0, - 28263 - 19968: 0xE9C0, - 28267 - 19968: 0xF5D3, - 28270 - 19968: 0xECDC, - 28271 - 19968: 0xF7B7, - 28274 - 19968: 0xEAB8, - 28275 - 19968: 0xD1F9, - 28282 - 19968: 0xDCC8, - 28304 - 19968: 0xEAB9, - 28310 - 19968: 0xF1DE, - 28316 - 19968: 0xD7B6, - 28317 - 19968: 0xCFB5, - 28319 - 19968: 0xD9A8, - 28322 - 19968: 0xECEE, - 28325 - 19968: 0xDDAA, - 28330 - 19968: 0xCDA2, - 28331 - 19968: 0xE8AE, - 28335 - 19968: 0xE1BD, - 28337 - 19968: 0xF2D1, - 28342 - 19968: 0xE9C1, - 28346 - 19968: 0xD2FC, - 28354 - 19968: 0xDBB5, - 28356 - 19968: 0xF3E7, - 28357 - 19968: 0xD8FE, - 28361 - 19968: 0xFCD1, - 28363 - 19968: 0xEDB2, - 28364 - 19968: 0xF4AF, - 28366 - 19968: 0xFBA3, - 28369 - 19968: 0xFCC1, - 28371 - 19968: 0xEEAB, - 28372 - 19968: 0xD4A5, - 28399 - 19968: 0xF4F2, - 28404 - 19968: 0xEED9, - 28408 - 19968: 0xFBCA, - 28414 - 19968: 0xCDE3, - 28415 - 19968: 0xD8BB, - 28417 - 19968: 0xE5DB, - 28418 - 19968: 0xF8F7, - 28422 - 19968: 0xF6D4, - 28431 - 19968: 0xD7A9, - 28433 - 19968: 0xCBC9, - 28436 - 19968: 0xE6D1, - 28437 - 19968: 0xF0CC, - 28448 - 19968: 0xD8AE, - 28450 - 19968: 0xF9D3, - 28451 - 19968: 0xD5FE, - 28459 - 19968: 0xD8BC, - 28460 - 19968: 0xF2B0, - 28465 - 19968: 0xE2AB, - 28466 - 19968: 0xF3E8, - 28472 - 19968: 0xEFC2, - 28479 - 19968: 0xEDEC, - 28481 - 19968: 0xE7B8, - 28497 - 19968: 0xDAFE, - 28500 - 19968: 0xCCBE, - 28503 - 19968: 0xF2FC, - 28504 - 19968: 0xDAEB, - 28506 - 19968: 0xE2D8, - 28507 - 19968: 0xEDD6, - 28510 - 19968: 0xD6D1, - 28511 - 19968: 0xE0B3, - 28514 - 19968: 0xFCD2, - 28516 - 19968: 0xEBC8, - 28525 - 19968: 0xD3C1, - 28526 - 19968: 0xF0CD, - 28528 - 19968: 0xCFF7, - 28538 - 19968: 0xEDD2, - 28540 - 19968: 0xD4D8, - 28541 - 19968: 0xDCC9, - 28542 - 19968: 0xD7F1, - 28545 - 19968: 0xDFBB, - 28548 - 19968: 0xF3A5, - 28552 - 19968: 0xF4CD, - 28557 - 19968: 0xF1BF, - 28558 - 19968: 0xF8B1, - 28560 - 19968: 0xE9FA, - 28564 - 19968: 0xFBCB, - 28567 - 19968: 0xCAD5, - 28579 - 19968: 0xF9D4, - 28580 - 19968: 0xF7CA, - 28583 - 19968: 0xD6C8, - 28590 - 19968: 0xFCE8, - 28591 - 19968: 0xF3BD, - 28593 - 19968: 0xEEFE, - 28595 - 19968: 0xE7FE, - 28601 - 19968: 0xD3C2, - 28606 - 19968: 0xD3B6, - 28608 - 19968: 0xCCAD, - 28609 - 19968: 0xF6FA, - 28610 - 19968: 0xD6B2, - 28611 - 19968: 0xD2D8, - 28618 - 19968: 0xE7D8, - 28629 - 19968: 0xE3A5, - 28634 - 19968: 0xE7B9, - 28639 - 19968: 0xF0AD, - 28640 - 19968: 0xFBCC, - 28641 - 19968: 0xEBA1, - 28644 - 19968: 0xD4A6, - 28649 - 19968: 0xFBCD, - 28651 - 19968: 0xD5BD, - 28652 - 19968: 0xF1DF, - 28655 - 19968: 0xF6FB, - 28657 - 19968: 0xDEB4, - 28670 - 19968: 0xD5EB, - 28673 - 19968: 0xE5C8, - 28677 - 19968: 0xFBA4, - 28678 - 19968: 0xD4B9, - 28681 - 19968: 0xDEE1, - 28683 - 19968: 0xE4A3, - 28687 - 19968: 0xD7B7, - 28689 - 19968: 0xF8EE, - 28693 - 19968: 0xDEB5, - 28696 - 19968: 0xD6D2, - 28698 - 19968: 0xF9D5, - 28699 - 19968: 0xE7BA, - 28700 - 19968: 0xEBD5, - 28701 - 19968: 0xD5F7, - 28702 - 19968: 0xEFE7, - 28703 - 19968: 0xE1BE, - 28707 - 19968: 0xFAAE, - 28711 - 19968: 0xD6E9, - 28712 - 19968: 0xD6EE, - 28719 - 19968: 0xE7BB, - 28727 - 19968: 0xECCB, - 28734 - 19968: 0xD5B3, - 28748 - 19968: 0xCEB4, - 28752 - 19968: 0xFBA5, - 28753 - 19968: 0xE1EE, - 28760 - 19968: 0xF7A8, - 28765 - 19968: 0xFBCE, - 28771 - 19968: 0xD8BD, - 28779 - 19968: 0xFBFD, - 28784 - 19968: 0xFCE9, - 28792 - 19968: 0xCFB6, - 28796 - 19968: 0xEDC7, - 28797 - 19968: 0xEEAC, - 28805 - 19968: 0xCCDD, - 28810 - 19968: 0xF6A7, - 28814 - 19968: 0xE6FA, - 28818 - 19968: 0xF5A4, - 28824 - 19968: 0xFDDC, - 28825 - 19968: 0xEDB3, - 28826 - 19968: 0xCEC9, - 28833 - 19968: 0xEFE8, - 28836 - 19968: 0xE1BF, - 28843 - 19968: 0xFADB, - 28844 - 19968: 0xCBE3, - 28845 - 19968: 0xF7A9, - 28847 - 19968: 0xFBA6, - 28851 - 19968: 0xDCB9, - 28855 - 19968: 0xF1C0, - 28856 - 19968: 0xEDC8, - 28857 - 19968: 0xEFC3, - 28872 - 19968: 0xD6AD, - 28875 - 19968: 0xFDCE, - 28879 - 19968: 0xE8A1, - 28888 - 19968: 0xFBF4, - 28889 - 19968: 0xD5A7, - 28893 - 19968: 0xF1F6, - 28895 - 19968: 0xE6D3, - 28913 - 19968: 0xCCDE, - 28921 - 19968: 0xF8B2, - 28925 - 19968: 0xDCEB, - 28932 - 19968: 0xFDB6, - 28937 - 19968: 0xE5EA, - 28940 - 19968: 0xF1E0, - 28953 - 19968: 0xDBCC, - 28954 - 19968: 0xDDCD, - 28958 - 19968: 0xD4C8, - 28961 - 19968: 0xD9ED, - 28966 - 19968: 0xF5A5, - 28976 - 19968: 0xE6FB, - 28982 - 19968: 0xE6D4, - 28999 - 19968: 0xFDC8, - 29001 - 19968: 0xD6A1, - 29002 - 19968: 0xFDBF, - 29004 - 19968: 0xFCD3, - 29006 - 19968: 0xEFA1, - 29008 - 19968: 0xE7BC, - 29014 - 19968: 0xD1EE, - 29017 - 19968: 0xE6D5, - 29020 - 19968: 0xE9F2, - 29022 - 19968: 0xDFB0, - 29028 - 19968: 0xD8E0, - 29029 - 19968: 0xFCBA, - 29030 - 19968: 0xFDAF, - 29031 - 19968: 0xF0CE, - 29033 - 19968: 0xDBE1, - 29036 - 19968: 0xE5C9, - 29038 - 19968: 0xEDB4, - 29053 - 19968: 0xE0C3, - 29060 - 19968: 0xE3D8, - 29065 - 19968: 0xE9FB, - 29066 - 19968: 0xEAA8, - 29071 - 19968: 0xFDB7, - 29074 - 19968: 0xFBA7, - 29076 - 19968: 0xE9C2, - 29081 - 19968: 0xFDF7, - 29087 - 19968: 0xE2D9, - 29090 - 19968: 0xDCEC, - 29100 - 19968: 0xE8A2, - 29105 - 19968: 0xE6F0, - 29113 - 19968: 0xFDF8, - 29114 - 19968: 0xFDF9, - 29118 - 19968: 0xF6BF, - 29121 - 19968: 0xE7A7, - 29123 - 19968: 0xE6D7, - 29128 - 19968: 0xD4F3, - 29129 - 19968: 0xD4C9, - 29134 - 19968: 0xD6FA, - 29136 - 19968: 0xD7F2, - 29138 - 19968: 0xE1C0, - 29140 - 19968: 0xDBE2, - 29141 - 19968: 0xE6D8, - 29151 - 19968: 0xE7BD, - 29157 - 19968: 0xF0CF, - 29158 - 19968: 0xF3BE, - 29159 - 19968: 0xE2AC, - 29165 - 19968: 0xF5B7, - 29166 - 19968: 0xE0F0, - 29179 - 19968: 0xFDB8, - 29180 - 19968: 0xE3E8, - 29182 - 19968: 0xD4A7, - 29183 - 19968: 0xE8FC, - 29184 - 19968: 0xFAD2, - 29190 - 19968: 0xF8EF, - 29200 - 19968: 0xD6D3, - 29211 - 19968: 0xD5B4, - 29226 - 19968: 0xF0D0, - 29228 - 19968: 0xF7F0, - 29229 - 19968: 0xEEB3, - 29232 - 19968: 0xEABA, - 29234 - 19968: 0xEAD3, - 29237 - 19968: 0xEDC9, - 29238 - 19968: 0xDDAB, - 29242 - 19968: 0xE5AC, - 29243 - 19968: 0xFDA1, - 29245 - 19968: 0xDFD0, - 29246 - 19968: 0xECB3, - 29248 - 19968: 0xDFD1, - 29254 - 19968: 0xEDED, - 29255 - 19968: 0xF8B8, - 29256 - 19968: 0xF7FA, - 29260 - 19968: 0xF8AB, - 29266 - 19968: 0xF4E0, - 29272 - 19968: 0xD4BA, - 29273 - 19968: 0xE4B3, - 29275 - 19968: 0xE9DA, - 29277 - 19968: 0xDEB6, - 29279 - 19968: 0xD9BF, - 29281 - 19968: 0xD9C0, - 29282 - 19968: 0xD6EF, - 29287 - 19968: 0xD9CC, - 29289 - 19968: 0xDAAA, - 29298 - 19968: 0xDFE5, - 29305 - 19968: 0xF7E5, - 29309 - 19968: 0xCCB2, - 29312 - 19968: 0xDFF9, - 29313 - 19968: 0xD7E0, - 29346 - 19968: 0xD4BB, - 29351 - 19968: 0xFDFA, - 29356 - 19968: 0xCCB3, - 29359 - 19968: 0xDBF3, - 29376 - 19968: 0xDFD2, - 29378 - 19968: 0xCECA, - 29380 - 19968: 0xEEDA, - 29390 - 19968: 0xE4E4, - 29392 - 19968: 0xFBCF, - 29399 - 19968: 0xCFB7, - 29401 - 19968: 0xEEC3, - 29409 - 19968: 0xCEEA, - 29417 - 19968: 0xE2AD, - 29432 - 19968: 0xD7E1, - 29433 - 19968: 0xFAF5, - 29436 - 19968: 0xD5C9, - 29437 - 19968: 0xF8AC, - 29450 - 19968: 0xE7D9, - 29462 - 19968: 0xF3E9, - 29467 - 19968: 0xD8ED, - 29468 - 19968: 0xE3C4, - 29469 - 19968: 0xF0F1, - 29477 - 19968: 0xE8E5, - 29481 - 19968: 0xE0FA, - 29482 - 19968: 0xEEC4, - 29483 - 19968: 0xD9DE, - 29494 - 19968: 0xEBA2, - 29495 - 19968: 0xEBA3, - 29502 - 19968: 0xFCC2, - 29503 - 19968: 0xEABB, - 29508 - 19968: 0xE8AB, - 29509 - 19968: 0xDEE2, - 29520 - 19968: 0xEDEF, - 29522 - 19968: 0xE8A3, - 29527 - 19968: 0xCFF1, - 29544 - 19968: 0xD4BC, - 29546 - 19968: 0xFCEA, - 29552 - 19968: 0xE7BE, - 29554 - 19968: 0xFCF2, - 29557 - 19968: 0xD6B4, - 29560 - 19968: 0xE2AE, - 29562 - 19968: 0xD3B7, - 29563 - 19968: 0xFACC, - 29572 - 19968: 0xFADC, - 29574 - 19968: 0xEDB5, - 29575 - 19968: 0xE1E3, - 29577 - 19968: 0xE8AC, - 29579 - 19968: 0xE8DD, - 29582 - 19968: 0xEFE9, - 29588 - 19968: 0xF4BD, - 29590 - 19968: 0xCFB8, - 29591 - 19968: 0xE9DB, - 29592 - 19968: 0xD1AC, - 29599 - 19968: 0xDAC7, - 29607 - 19968: 0xEBC9, - 29609 - 19968: 0xE8CC, - 29613 - 19968: 0xDEB7, - 29618 - 19968: 0xD6BC, - 29619 - 19968: 0xD3E5, - 29625 - 19968: 0xFADD, - 29632 - 19968: 0xDAD6, - 29634 - 19968: 0xCAB1, - 29641 - 19968: 0xDAC8, - 29642 - 19968: 0xDFA6, - 29644 - 19968: 0xF9B3, - 29645 - 19968: 0xF2D2, - 29647 - 19968: 0xCAC4, - 29654 - 19968: 0xCECB, - 29657 - 19968: 0xCDF5, - 29661 - 19968: 0xFDB0, - 29662 - 19968: 0xD5A8, - 29664 - 19968: 0xF1C1, - 29667 - 19968: 0xE2E9, - 29668 - 19968: 0xDCCA, - 29669 - 19968: 0xECB4, - 29670 - 19968: 0xFAC0, - 29673 - 19968: 0xFBA8, - 29674 - 19968: 0xD0A8, - 29677 - 19968: 0xDAEC, - 29687 - 19968: 0xD9EE, - 29689 - 19968: 0xE0FB, - 29693 - 19968: 0xEFEA, - 29694 - 19968: 0xFADE, - 29697 - 19968: 0xE0C4, - 29699 - 19968: 0xCFB9, - 29701 - 19968: 0xD5CA, - 29702 - 19968: 0xD7E2, - 29703 - 19968: 0xE2AF, - 29705 - 19968: 0xD7B8, - 29715 - 19968: 0xE8CD, - 29723 - 19968: 0xF6DA, - 29728 - 19968: 0xEFA2, - 29729 - 19968: 0xE2DA, - 29730 - 19968: 0xF6FC, - 29733 - 19968: 0xFBD0, - 29734 - 19968: 0xD1AD, - 29736 - 19968: 0xCDE4, - 29738 - 19968: 0xD1AE, - 29739 - 19968: 0xDCED, - 29740 - 19968: 0xE8CE, - 29742 - 19968: 0xF0F9, - 29743 - 19968: 0xCEB5, - 29744 - 19968: 0xE6FC, - 29747 - 19968: 0xD7FB, - 29748 - 19968: 0xD0D6, - 29749 - 19968: 0xDDF5, - 29750 - 19968: 0xF7F1, - 29752 - 19968: 0xF6FD, - 29754 - 19968: 0xDBF7, - 29759 - 19968: 0xFBEA, - 29760 - 19968: 0xE9DC, - 29761 - 19968: 0xD9C1, - 29763 - 19968: 0xF5F2, - 29764 - 19968: 0xE0C5, - 29771 - 19968: 0xEAD4, - 29781 - 19968: 0xF9C2, - 29783 - 19968: 0xEABC, - 29785 - 19968: 0xD2C5, - 29786 - 19968: 0xFBD1, - 29787 - 19968: 0xE7C0, - 29788 - 19968: 0xEBA5, - 29790 - 19968: 0xDFFA, - 29791 - 19968: 0xE3A2, - 29792 - 19968: 0xD7B9, - 29794 - 19968: 0xE9C3, - 29796 - 19968: 0xE8FD, - 29797 - 19968: 0xE8AF, - 29800 - 19968: 0xF2D3, - 29801 - 19968: 0xFBA9, - 29802 - 19968: 0xD8A5, - 29807 - 19968: 0xD5CB, - 29822 - 19968: 0xD0C8, - 29826 - 19968: 0xD1AF, - 29827 - 19968: 0xD7E3, - 29831 - 19968: 0xE0C6, - 29833 - 19968: 0xD6A2, - 29835 - 19968: 0xEDF0, - 29848 - 19968: 0xD7F3, - 29852 - 19968: 0xFCD4, - 29854 - 19968: 0xDAD7, - 29855 - 19968: 0xCCDF, - 29857 - 19968: 0xF2D4, - 29859 - 19968: 0xD1B0, - 29861 - 19968: 0xCCE0, - 29863 - 19968: 0xDBFD, - 29864 - 19968: 0xF3BF, - 29866 - 19968: 0xF0D1, - 29872 - 19968: 0xFCBB, - 29874 - 19968: 0xE2B0, - 29877 - 19968: 0xE6A5, - 29881 - 19968: 0xE2DB, - 29885 - 19968: 0xDFDE, - 29887 - 19968: 0xE0C7, - 29894 - 19968: 0xF2EF, - 29898 - 19968: 0xCCE1, - 29903 - 19968: 0xD6EA, - 29908 - 19968: 0xE7C2, - 29912 - 19968: 0xCEB6, - 29914 - 19968: 0xF3C0, - 29916 - 19968: 0xCDFE, - 29920 - 19968: 0xFBD2, - 29922 - 19968: 0xF8F8, - 29923 - 19968: 0xF7FB, - 29926 - 19968: 0xE8BF, - 29934 - 19968: 0xE8B7, - 29943 - 19968: 0xEDB6, - 29953 - 19968: 0xDCBA, - 29956 - 19968: 0xCCB4, - 29969 - 19968: 0xF1F7, - 29973 - 19968: 0xE8B8, - 29976 - 19968: 0xCAF6, - 29978 - 19968: 0xE4A4, - 29979 - 19968: 0xF4D6, - 29983 - 19968: 0xDFE6, - 29987 - 19968: 0xDFA7, - 29989 - 19968: 0xDFE7, - 29990 - 19968: 0xE1C1, - 29992 - 19968: 0xE9C4, - 29995 - 19968: 0xDCCB, - 29996 - 19968: 0xE9C5, - 30000 - 19968: 0xEFA3, - 30001 - 19968: 0xEBA6, - 30002 - 19968: 0xCBA3, - 30003 - 19968: 0xE3E9, - 30007 - 19968: 0xD1FB, - 30008 - 19968: 0xEFA4, - 30010 - 19968: 0xEFEB, - 30023 - 19968: 0xD0B4, - 30028 - 19968: 0xCDA3, - 30031 - 19968: 0xE8E6, - 30033 - 19968: 0xEFA5, - 30035 - 19968: 0xD3CC, - 30036 - 19968: 0xDAED, - 30041 - 19968: 0xD7BA, - 30043 - 19968: 0xF2D5, - 30044 - 19968: 0xF5E5, - 30045 - 19968: 0xD9EF, - 30050 - 19968: 0xF9B4, - 30053 - 19968: 0xD5D4, - 30054 - 19968: 0xFDCF, - 30058 - 19968: 0xDBE3, - 30063 - 19968: 0xF1E1, - 30064 - 19968: 0xECB6, - 30069 - 19968: 0xFBFE, - 30070 - 19968: 0xD3D7, - 30072 - 19968: 0xD1B1, - 30074 - 19968: 0xCBB1, - 30079 - 19968: 0xD1B2, - 30086 - 19968: 0xCBB2, - 30087 - 19968: 0xF1C2, - 30090 - 19968: 0xF4E1, - 30091 - 19968: 0xF9B5, - 30094 - 19968: 0xE1C3, - 30095 - 19968: 0xE1C2, - 30097 - 19968: 0xEBF7, - 30109 - 19968: 0xDFA8, - 30117 - 19968: 0xCBCA, - 30123 - 19968: 0xE6B9, - 30129 - 19968: 0xF8DE, - 30130 - 19968: 0xF9AA, - 30131 - 19968: 0xCAF7, - 30133 - 19968: 0xEDB7, - 30136 - 19968: 0xD3B8, - 30137 - 19968: 0xF2D6, - 30140 - 19968: 0xD4D9, - 30141 - 19968: 0xEEC5, - 30142 - 19968: 0xF2F0, - 30146 - 19968: 0xCAB2, - 30149 - 19968: 0xDCBB, - 30151 - 19968: 0xF1F8, - 30157 - 19968: 0xECB7, - 30162 - 19968: 0xE5CA, - 30164 - 19968: 0xF6C0, - 30165 - 19968: 0xFDDD, - 30168 - 19968: 0xD4E3, - 30169 - 19968: 0xCCE2, - 30171 - 19968: 0xF7D4, - 30178 - 19968: 0xD7E5, - 30192 - 19968: 0xD3C3, - 30194 - 19968: 0xD8A6, - 30196 - 19968: 0xF6C1, - 30202 - 19968: 0xDDF6, - 30204 - 19968: 0xCDC0, - 30208 - 19968: 0xE5DC, - 30221 - 19968: 0xE5CB, - 30233 - 19968: 0xE1C4, - 30239 - 19968: 0xE8B0, - 30240 - 19968: 0xF4B0, - 30241 - 19968: 0xF3EA, - 30242 - 19968: 0xDAEE, - 30244 - 19968: 0xD7BB, - 30246 - 19968: 0xE2B1, - 30267 - 19968: 0xD7AA, - 30274 - 19968: 0xD6FB, - 30284 - 19968: 0xE4DF, - 30286 - 19968: 0xCAD6, - 30290 - 19968: 0xEBA8, - 30294 - 19968: 0xDBFE, - 30305 - 19968: 0xF6C2, - 30308 - 19968: 0xEFBB, - 30313 - 19968: 0xD4FD, - 30316 - 19968: 0xE0C8, - 30320 - 19968: 0xE8B9, - 30322 - 19968: 0xEFA6, - 30328 - 19968: 0xCDA4, - 30331 - 19968: 0xD4F4, - 30332 - 19968: 0xDBA1, - 30333 - 19968: 0xDBDC, - 30334 - 19968: 0xDBDD, - 30340 - 19968: 0xEEDC, - 30342 - 19968: 0xCBCB, - 30343 - 19968: 0xFCD5, - 30350 - 19968: 0xCEEB, - 30352 - 19968: 0xCDC1, - 30355 - 19968: 0xFBD3, - 30382 - 19968: 0xF9AB, - 30394 - 19968: 0xF5D4, - 30399 - 19968: 0xD9A9, - 30402 - 19968: 0xE9DD, - 30403 - 19968: 0xDBCD, - 30406 - 19968: 0xDDCE, - 30408 - 19968: 0xE7C3, - 30410 - 19968: 0xECCC, - 30418 - 19968: 0xF9EC, - 30422 - 19968: 0xCBCC, - 30427 - 19968: 0xE0FC, - 30428 - 19968: 0xD4A8, - 30430 - 19968: 0xEDD3, - 30431 - 19968: 0xD8EF, - 30433 - 19968: 0xF2D7, - 30435 - 19968: 0xCAF8, - 30436 - 19968: 0xDAEF, - 30439 - 19968: 0xD6D4, - 30446 - 19968: 0xD9CD, - 30450 - 19968: 0xD8EE, - 30452 - 19968: 0xF2C1, - 30456 - 19968: 0xDFD3, - 30460 - 19968: 0xDAF0, - 30462 - 19968: 0xE2EA, - 30465 - 19968: 0xE0FD, - 30468 - 19968: 0xD8F8, - 30472 - 19968: 0xF7AF, - 30473 - 19968: 0xDAB6, - 30475 - 19968: 0xCAD7, - 30494 - 19968: 0xF2D8, - 30496 - 19968: 0xD8F9, - 30505 - 19968: 0xFADF, - 30519 - 19968: 0xCFEF, - 30520 - 19968: 0xD9C2, - 30522 - 19968: 0xF0D2, - 30524 - 19968: 0xE4D1, - 30528 - 19968: 0xF3B7, - 30541 - 19968: 0xFAE0, - 30555 - 19968: 0xEFEC, - 30561 - 19968: 0xE2B2, - 30563 - 19968: 0xD4BD, - 30566 - 19968: 0xD9CE, - 30571 - 19968: 0xF4E2, - 30585 - 19968: 0xD4A9, - 30590 - 19968: 0xCDC2, - 30591 - 19968: 0xE7DA, - 30603 - 19968: 0xF2D9, - 30609 - 19968: 0xD9AA, - 30622 - 19968: 0xD8BE, - 30629 - 19968: 0xDCAD, - 30636 - 19968: 0xE2EB, - 30637 - 19968: 0xD6FC, - 30640 - 19968: 0xCAF9, - 30643 - 19968: 0xD4DA, - 30651 - 19968: 0xF4D7, - 30652 - 19968: 0xCCA1, - 30655 - 19968: 0xCFBA, - 30679 - 19968: 0xF5B8, - 30683 - 19968: 0xD9C3, - 30684 - 19968: 0xD0E8, - 30690 - 19968: 0xE3C5, - 30691 - 19968: 0xEBF8, - 30693 - 19968: 0xF2B1, - 30697 - 19968: 0xCFBB, - 30701 - 19968: 0xD3AD, - 30702 - 19968: 0xE8E1, - 30703 - 19968: 0xCEEC, - 30707 - 19968: 0xE0B4, - 30722 - 19968: 0xDEE3, - 30738 - 19968: 0xDDF7, - 30757 - 19968: 0xF2B2, - 30758 - 19968: 0xF3F6, - 30759 - 19968: 0xF6DB, - 30764 - 19968: 0xD7FE, - 30770 - 19968: 0xF8DF, - 30772 - 19968: 0xF7F2, - 30789 - 19968: 0xD0A9, - 30799 - 19968: 0xE6DA, - 30813 - 19968: 0xF5A6, - 30827 - 19968: 0xD7BC, - 30828 - 19968: 0xCCE3, - 30831 - 19968: 0xE6DB, - 30844 - 19968: 0xDDDD, - 30849 - 19968: 0xD1B3, - 30855 - 19968: 0xEFED, - 30860 - 19968: 0xD6DE, - 30861 - 19968: 0xE4F4, - 30862 - 19968: 0xE1EF, - 30865 - 19968: 0xDDF8, - 30871 - 19968: 0xE8CF, - 30883 - 19968: 0xCAE5, - 30887 - 19968: 0xDCA1, - 30889 - 19968: 0xE0B5, - 30906 - 19968: 0xFCAC, - 30907 - 19968: 0xFCAD, - 30908 - 19968: 0xD8A7, - 30913 - 19968: 0xEDB8, - 30917 - 19968: 0xDBB6, - 30922 - 19968: 0xD6F0, - 30923 - 19968: 0xF3AF, - 30926 - 19968: 0xCDA5, - 30928 - 19968: 0xDAF1, - 30952 - 19968: 0xD8A8, - 30956 - 19968: 0xCCE4, - 30959 - 19968: 0xD1B4, - 30965 - 19968: 0xCAD8, - 30971 - 19968: 0xDAF2, - 30977 - 19968: 0xF5A7, - 30990 - 19968: 0xF5A8, - 30998 - 19968: 0xE6A6, - 31018 - 19968: 0xD5EC, - 31019 - 19968: 0xD5F8, - 31020 - 19968: 0xDAF3, - 31034 - 19968: 0xE3C6, - 31038 - 19968: 0xDEE4, - 31040 - 19968: 0xDEE5, - 31041 - 19968: 0xD1B5, - 31047 - 19968: 0xD1B6, - 31048 - 19968: 0xD1B7, - 31049 - 19968: 0xF2B3, - 31056 - 19968: 0xE9DE, - 31062 - 19968: 0xF0D3, - 31063 - 19968: 0xF2B4, - 31066 - 19968: 0xF0D4, - 31067 - 19968: 0xCBE4, - 31068 - 19968: 0xFBD4, - 31069 - 19968: 0xF5E6, - 31070 - 19968: 0xE3EA, - 31072 - 19968: 0xDEE6, - 31077 - 19968: 0xDFD4, - 31080 - 19968: 0xF8F9, - 31085 - 19968: 0xF0AE, - 31098 - 19968: 0xD1B8, - 31103 - 19968: 0xD6DF, - 31105 - 19968: 0xD0D7, - 31117 - 19968: 0xFCA1, - 31118 - 19968: 0xEFEE, - 31119 - 19968: 0xDCD8, - 31121 - 19968: 0xE9DF, - 31142 - 19968: 0xE5DD, - 31143 - 19968: 0xFDFB, - 31146 - 19968: 0xE0C9, - 31150 - 19968: 0xD6C9, - 31153 - 19968: 0xD4AA, - 31155 - 19968: 0xE5CC, - 31161 - 19968: 0xE9E0, - 31165 - 19968: 0xD0D8, - 31166 - 19968: 0xFCA2, - 31167 - 19968: 0xD4BE, - 31168 - 19968: 0xE2B3, - 31169 - 19968: 0xDEE7, - 31177 - 19968: 0xDCBC, - 31178 - 19968: 0xD2B6, - 31179 - 19968: 0xF5D5, - 31185 - 19968: 0xCEA1, - 31186 - 19968: 0xF5A9, - 31189 - 19968: 0xDDF9, - 31192 - 19968: 0xDDFA, - 31199 - 19968: 0xF0D5, - 31204 - 19968: 0xF6DF, - 31206 - 19968: 0xF2DA, - 31207 - 19968: 0xE4EB, - 31209 - 19968: 0xF2F1, - 31227 - 19968: 0xECB9, - 31232 - 19968: 0xFDFC, - 31237 - 19968: 0xE1AA, - 31240 - 19968: 0xCAD9, - 31243 - 19968: 0xEFEF, - 31245 - 19968: 0xF5AA, - 31252 - 19968: 0xECF9, - 31255 - 19968: 0xF8AD, - 31257 - 19968: 0xF2C2, - 31258 - 19968: 0xF6C3, - 31260 - 19968: 0xD7D2, - 31263 - 19968: 0xF9A2, - 31264 - 19968: 0xF0D6, - 31278 - 19968: 0xF0FA, - 31281 - 19968: 0xF6E0, - 31286 - 19968: 0xE9F3, - 31287 - 19968: 0xF2C3, - 31291 - 19968: 0xD4AB, - 31292 - 19968: 0xCAB3, - 31293 - 19968: 0xCDA6, - 31295 - 19968: 0xCDC3, - 31296 - 19968: 0xCDDA, - 31302 - 19968: 0xD9CF, - 31305 - 19968: 0xF6C4, - 31309 - 19968: 0xEEDD, - 31310 - 19968: 0xE7C4, - 31319 - 19968: 0xE2B4, - 31329 - 19968: 0xDFE2, - 31330 - 19968: 0xE7DB, - 31337 - 19968: 0xE8B1, - 31339 - 19968: 0xFCAE, - 31344 - 19968: 0xE5CD, - 31348 - 19968: 0xFAEB, - 31350 - 19968: 0xCFBC, - 31353 - 19968: 0xCFE2, - 31354 - 19968: 0xCDF6, - 31357 - 19968: 0xEFF0, - 31359 - 19968: 0xF4BE, - 31361 - 19968: 0xD4CD, - 31364 - 19968: 0xF3B8, - 31368 - 19968: 0xE9A1, - 31378 - 19968: 0xF2F2, - 31379 - 19968: 0xF3EB, - 31381 - 19968: 0xF0D7, - 31384 - 19968: 0xCFD7, - 31391 - 19968: 0xCFDF, - 31401 - 19968: 0xE8C0, - 31402 - 19968: 0xE8C1, - 31406 - 19968: 0xCFE3, - 31407 - 19968: 0xE9A2, - 31418 - 19968: 0xD0AA, - 31428 - 19968: 0xF3C1, - 31429 - 19968: 0xD0AB, - 31431 - 19968: 0xD4E4, - 31434 - 19968: 0xEFBC, - 31435 - 19968: 0xD8A1, - 31447 - 19968: 0xD9DF, - 31449 - 19968: 0xF3D7, - 31453 - 19968: 0xDCBD, - 31455 - 19968: 0xCCE5, - 31456 - 19968: 0xEDF1, - 31459 - 19968: 0xF1E2, - 31461 - 19968: 0xD4DB, - 31466 - 19968: 0xE2B5, - 31469 - 19968: 0xCAE6, - 31471 - 19968: 0xD3AE, - 31478 - 19968: 0xCCE6, - 31481 - 19968: 0xF1D3, - 31482 - 19968: 0xF5E7, - 31487 - 19968: 0xCADA, - 31503 - 19968: 0xFBEE, - 31505 - 19968: 0xE1C5, - 31513 - 19968: 0xDFE9, - 31515 - 19968: 0xEEDE, - 31518 - 19968: 0xF7C2, - 31520 - 19968: 0xD8A2, - 31526 - 19968: 0xDDAC, - 31532 - 19968: 0xF0AF, - 31533 - 19968: 0xD6BD, - 31545 - 19968: 0xE1AB, - 31558 - 19968: 0xF9B6, - 31561 - 19968: 0xD4F5, - 31563 - 19968: 0xD0C9, - 31564 - 19968: 0xEFA7, - 31565 - 19968: 0xE2EC, - 31567 - 19968: 0xDBEA, - 31568 - 19968: 0xCECC, - 31569 - 19968: 0xF5E8, - 31570 - 19968: 0xF7D5, - 31572 - 19968: 0xD3CD, - 31574 - 19968: 0xF3FE, - 31584 - 19968: 0xD0B5, - 31596 - 19968: 0xE0FE, - 31598 - 19968: 0xDFFB, - 31605 - 19968: 0xE6DD, - 31613 - 19968: 0xE8A4, - 31623 - 19968: 0xCBCD, - 31627 - 19968: 0xEFA8, - 31631 - 19968: 0xEEB4, - 31636 - 19968: 0xDAD8, - 31637 - 19968: 0xD1B9, - 31639 - 19968: 0xDFA9, - 31642 - 19968: 0xF3B0, - 31645 - 19968: 0xCCC4, - 31649 - 19968: 0xCEB7, - 31661 - 19968: 0xEFA9, - 31665 - 19968: 0xDFD5, - 31668 - 19968: 0xEDD7, - 31672 - 19968: 0xEEC6, - 31680 - 19968: 0xEFBD, - 31681 - 19968: 0xFCD6, - 31684 - 19968: 0xDBF4, - 31686 - 19968: 0xEFAA, - 31687 - 19968: 0xF8B9, - 31689 - 19968: 0xF5E9, - 31698 - 19968: 0xE3D9, - 31712 - 19968: 0xE1C6, - 31716 - 19968: 0xD4BF, - 31721 - 19968: 0xDEE8, - 31751 - 19968: 0xF0EA, - 31762 - 19968: 0xF3C2, - 31774 - 19968: 0xD3AF, - 31777 - 19968: 0xCADB, - 31783 - 19968: 0xFCD7, - 31786 - 19968: 0xEDD8, - 31787 - 19968: 0xE1C7, - 31805 - 19968: 0xF4D8, - 31806 - 19968: 0xD6B3, - 31807 - 19968: 0xDDAD, - 31811 - 19968: 0xD5BE, - 31820 - 19968: 0xF1C3, - 31821 - 19968: 0xEEDF, - 31840 - 19968: 0xD6EB, - 31844 - 19968: 0xF4D9, - 31852 - 19968: 0xD7E6, - 31859 - 19968: 0xDAB7, - 31875 - 19968: 0xDDFB, - 31881 - 19968: 0xDDCF, - 31890 - 19968: 0xD8A3, - 31893 - 19968: 0xDAD9, - 31895 - 19968: 0xF0D8, - 31896 - 19968: 0xEFC4, - 31903 - 19968: 0xE1D8, - 31909 - 19968: 0xF1D4, - 31911 - 19968: 0xEDF2, - 31918 - 19968: 0xD5DB, - 31921 - 19968: 0xD5DC, - 31922 - 19968: 0xF3C4, - 31923 - 19968: 0xCBD7, - 31929 - 19968: 0xE2B6, - 31934 - 19968: 0xEFF1, - 31946 - 19968: 0xFBD5, - 31958 - 19968: 0xD3D8, - 31966 - 19968: 0xDDD0, - 31967 - 19968: 0xF0D9, - 31968 - 19968: 0xCBB3, - 31975 - 19968: 0xD5DD, - 31995 - 19968: 0xCDA7, - 31998 - 19968: 0xD0AC, - 32000 - 19968: 0xD1BA, - 32002 - 19968: 0xF1C4, - 32004 - 19968: 0xE5B3, - 32005 - 19968: 0xFBF5, - 32006 - 19968: 0xE9E1, - 32007 - 19968: 0xFDE0, - 32008 - 19968: 0xFCBC, - 32010 - 19968: 0xDAA2, - 32011 - 19968: 0xDAA3, - 32013 - 19968: 0xD2A1, - 32016 - 19968: 0xD2EF, - 32020 - 19968: 0xE2ED, - 32023 - 19968: 0xDEE9, - 32024 - 19968: 0xCEDC, - 32025 - 19968: 0xF2B5, - 32026 - 19968: 0xD0E4, - 32027 - 19968: 0xDDD1, - 32032 - 19968: 0xE1C8, - 32033 - 19968: 0xDBB7, - 32034 - 19968: 0xDFE3, - 32043 - 19968: 0xEDB9, - 32044 - 19968: 0xF1C5, - 32046 - 19968: 0xF3CF, - 32047 - 19968: 0xD7AB, - 32048 - 19968: 0xE1AC, - 32051 - 19968: 0xE3EB, - 32053 - 19968: 0xEEC7, - 32057 - 19968: 0xE1C9, - 32058 - 19968: 0xCAFA, - 32066 - 19968: 0xF0FB, - 32067 - 19968: 0xFAE1, - 32068 - 19968: 0xF0DA, - 32069 - 19968: 0xCCE7, - 32070 - 19968: 0xDAF4, - 32080 - 19968: 0xCCBF, - 32094 - 19968: 0xCEED, - 32097 - 19968: 0xD5A9, - 32098 - 19968: 0xFAE2, - 32102 - 19968: 0xD0E5, - 32104 - 19968: 0xEBD6, - 32106 - 19968: 0xECDF, - 32110 - 19968: 0xDFFC, - 32113 - 19968: 0xF7D6, - 32114 - 19968: 0xDEEA, - 32115 - 19968: 0xCBB4, - 32118 - 19968: 0xEFBE, - 32121 - 19968: 0xCCB5, - 32127 - 19968: 0xCFBD, - 32142 - 19968: 0xEFF2, - 32143 - 19968: 0xE2B7, - 32147 - 19968: 0xCCE8, - 32156 - 19968: 0xF0FC, - 32160 - 19968: 0xD6E0, - 32162 - 19968: 0xF1C6, - 32172 - 19968: 0xE2B8, - 32173 - 19968: 0xEBAB, - 32177 - 19968: 0xCBB5, - 32178 - 19968: 0xD8D1, - 32180 - 19968: 0xF4CE, - 32181 - 19968: 0xF3F7, - 32184 - 19968: 0xD7C6, - 32186 - 19968: 0xD1BB, - 32187 - 19968: 0xF7AA, - 32189 - 19968: 0xEDCA, - 32190 - 19968: 0xD7D3, - 32191 - 19968: 0xD8FA, - 32199 - 19968: 0xF6C5, - 32202 - 19968: 0xD1CC, - 32203 - 19968: 0xDDFC, - 32214 - 19968: 0xDFFD, - 32216 - 19968: 0xF9E5, - 32218 - 19968: 0xE0CA, - 32221 - 19968: 0xF2FD, - 32222 - 19968: 0xD3B0, - 32224 - 19968: 0xF4F3, - 32225 - 19968: 0xDAC9, - 32227 - 19968: 0xE6DE, - 32232 - 19968: 0xF8BA, - 32233 - 19968: 0xE8D0, - 32236 - 19968: 0xD8FB, - 32239 - 19968: 0xEAD5, - 32244 - 19968: 0xD6A3, - 32251 - 19968: 0xF6C6, - 32265 - 19968: 0xF2DB, - 32266 - 19968: 0xE4FC, - 32277 - 19968: 0xE8B2, - 32283 - 19968: 0xDADA, - 32285 - 19968: 0xF2DC, - 32286 - 19968: 0xFBD6, - 32287 - 19968: 0xE9B2, - 32289 - 19968: 0xEEAD, - 32291 - 19968: 0xFAE3, - 32299 - 19968: 0xDCEE, - 32302 - 19968: 0xF5EA, - 32303 - 19968: 0xE6E0, - 32305 - 19968: 0xF0FD, - 32311 - 19968: 0xD7AC, - 32317 - 19968: 0xF5C5, - 32318 - 19968: 0xEEE0, - 32321 - 19968: 0xDBE5, - 32323 - 19968: 0xDDDE, - 32326 - 19968: 0xD9F0, - 32327 - 19968: 0xE9A3, - 32338 - 19968: 0xF1F9, - 32340 - 19968: 0xF2C4, - 32341 - 19968: 0xE0CB, - 32350 - 19968: 0xE9A4, - 32353 - 19968: 0xE2B9, - 32361 - 19968: 0xE3B1, - 32362 - 19968: 0xFCEB, - 32363 - 19968: 0xCDA8, - 32365 - 19968: 0xCCB6, - 32368 - 19968: 0xF0DB, - 32377 - 19968: 0xE6BA, - 32380 - 19968: 0xCDA9, - 32386 - 19968: 0xF3C3, - 32396 - 19968: 0xE1D9, - 32399 - 19968: 0xEFAB, - 32403 - 19968: 0xE7C5, - 32406 - 19968: 0xE0E9, - 32408 - 19968: 0xF3C5, - 32411 - 19968: 0xD4C0, - 32412 - 19968: 0xD5BF, - 32566 - 19968: 0xDDAE, - 32568 - 19968: 0xF9FC, - 32570 - 19968: 0xCCC0, - 32588 - 19968: 0xE5A2, - 32592 - 19968: 0xCEB8, - 32596 - 19968: 0xD8D2, - 32597 - 19968: 0xF9D6, - 32618 - 19968: 0xF1AA, - 32619 - 19968: 0xCED1, - 32622 - 19968: 0xF6C7, - 32624 - 19968: 0xDBEB, - 32626 - 19968: 0xDFFE, - 32629 - 19968: 0xD8E1, - 32631 - 19968: 0xF7F3, - 32633 - 19968: 0xD7E7, - 32645 - 19968: 0xD4FE, - 32648 - 19968: 0xD1BC, - 32650 - 19968: 0xE5CF, - 32652 - 19968: 0xCBB6, - 32654 - 19968: 0xDAB8, - 32660 - 19968: 0xCDC4, - 32666 - 19968: 0xD6BE, - 32670 - 19968: 0xE2BA, - 32676 - 19968: 0xCFD8, - 32680 - 19968: 0xE0CC, - 32681 - 19968: 0xEBF9, - 32690 - 19968: 0xFDFD, - 32696 - 19968: 0xD7E8, - 32697 - 19968: 0xCBD8, - 32701 - 19968: 0xE9E2, - 32705 - 19968: 0xE8BA, - 32709 - 19968: 0xE3C7, - 32714 - 19968: 0xECCD, - 32716 - 19968: 0xECCE, - 32718 - 19968: 0xD6BF, - 32722 - 19968: 0xE3A7, - 32724 - 19968: 0xDFD6, - 32725 - 19968: 0xFDE8, - 32735 - 19968: 0xEEE1, - 32736 - 19968: 0xF6A8, - 32737 - 19968: 0xDDFD, - 32745 - 19968: 0xF8BB, - 32747 - 19968: 0xE8D1, - 32752 - 19968: 0xF9D7, - 32761 - 19968: 0xCEEE, - 32764 - 19968: 0xECCF, - 32768 - 19968: 0xE9A5, - 32769 - 19968: 0xD6D5, - 32771 - 19968: 0xCDC5, - 32773 - 19968: 0xEDBA, - 32774 - 19968: 0xD1BD, - 32777 - 19968: 0xCFBE, - 32780 - 19968: 0xECBB, - 32784 - 19968: 0xD2B1, - 32789 - 19968: 0xCCE9, - 32791 - 19968: 0xD9C4, - 32792 - 19968: 0xE9FC, - 32813 - 19968: 0xD1BE, - 32819 - 19968: 0xECBC, - 32822 - 19968: 0xE5AD, - 32829 - 19968: 0xF7B0, - 32831 - 19968: 0xCCEA, - 32835 - 19968: 0xD3C4, - 32838 - 19968: 0xD6C0, - 32842 - 19968: 0xD6FD, - 32854 - 19968: 0xE1A1, - 32856 - 19968: 0xDEBD, - 32858 - 19968: 0xF6A9, - 32862 - 19968: 0xDAA4, - 32879 - 19968: 0xD6A4, - 32880 - 19968: 0xF5C6, - 32882 - 19968: 0xE1A2, - 32883 - 19968: 0xE9C6, - 32887 - 19968: 0xF2C5, - 32893 - 19968: 0xF4E9, - 32894 - 19968: 0xD6EC, - 32895 - 19968: 0xEBD3, - 32900 - 19968: 0xECBD, - 32901 - 19968: 0xE2DC, - 32902 - 19968: 0xDEEB, - 32903 - 19968: 0xF0DC, - 32905 - 19968: 0xEBBF, - 32907 - 19968: 0xD7CE, - 32908 - 19968: 0xD1BF, - 32918 - 19968: 0xF5AB, - 32923 - 19968: 0xF9FD, - 32925 - 19968: 0xCADC, - 32929 - 19968: 0xCDC6, - 32930 - 19968: 0xF2B6, - 32933 - 19968: 0xDDFE, - 32937 - 19968: 0xCCB7, - 32938 - 19968: 0xDBB8, - 32943 - 19968: 0xD0E9, - 32945 - 19968: 0xCEDD, - 32946 - 19968: 0xEBC0, - 32948 - 19968: 0xFDA2, - 32954 - 19968: 0xF8CB, - 32963 - 19968: 0xEAD6, - 32964 - 19968: 0xF1B0, - 32972 - 19968: 0xDBCE, - 32974 - 19968: 0xF7C3, - 32986 - 19968: 0xDBCF, - 32987 - 19968: 0xCBA4, - 32990 - 19968: 0xF8E0, - 32993 - 19968: 0xFBD7, - 32996 - 19968: 0xEBCA, - 32997 - 19968: 0xE0A1, - 33009 - 19968: 0xCECD, - 33012 - 19968: 0xD4DC, - 33016 - 19968: 0xFDD8, - 33021 - 19968: 0xD2F6, - 33026 - 19968: 0xF2B7, - 33029 - 19968: 0xFAF6, - 33030 - 19968: 0xF6AA, - 33031 - 19968: 0xFAF7, - 33032 - 19968: 0xD8E6, - 33034 - 19968: 0xF4B1, - 33048 - 19968: 0xE8D2, - 33050 - 19968: 0xCAC5, - 33051 - 19968: 0xCCEB, - 33059 - 19968: 0xE2EE, - 33065 - 19968: 0xE2BB, - 33067 - 19968: 0xF7AD, - 33071 - 19968: 0xF8E1, - 33081 - 19968: 0xF3EC, - 33086 - 19968: 0xDEA1, - 33099 - 19968: 0xE4FD, - 33102 - 19968: 0xE3EC, - 33104 - 19968: 0xDDAF, - 33105 - 19968: 0xDDB0, - 33108 - 19968: 0xCBB7, - 33109 - 19968: 0xE8D3, - 33125 - 19968: 0xE1A3, - 33126 - 19968: 0xD2E0, - 33131 - 19968: 0xF0FE, - 33136 - 19968: 0xE9A6, - 33137 - 19968: 0xCBF2, - 33144 - 19968: 0xEDF3, - 33145 - 19968: 0xDCD9, - 33146 - 19968: 0xE0CD, - 33151 - 19968: 0xF7DA, - 33152 - 19968: 0xDBB9, - 33160 - 19968: 0xCCAE, - 33162 - 19968: 0xDADB, - 33167 - 19968: 0xCDC7, - 33178 - 19968: 0xDDB1, - 33180 - 19968: 0xD8AF, - 33181 - 19968: 0xE3A3, - 33184 - 19968: 0xCEEF, - 33187 - 19968: 0xF2F3, - 33192 - 19968: 0xF8B3, - 33203 - 19968: 0xE0CE, - 33205 - 19968: 0xF5FD, - 33210 - 19968: 0xEBEC, - 33213 - 19968: 0xD3C5, - 33214 - 19968: 0xFCEC, - 33215 - 19968: 0xD2DB, - 33216 - 19968: 0xD4EB, - 33218 - 19968: 0xDEA2, - 33222 - 19968: 0xE5E6, - 33229 - 19968: 0xF0B0, - 33240 - 19968: 0xD5C4, - 33247 - 19968: 0xEDF4, - 33251 - 19968: 0xE3ED, - 33253 - 19968: 0xE8C2, - 33255 - 19968: 0xEDF5, - 33256 - 19968: 0xD7FC, - 33258 - 19968: 0xEDBB, - 33261 - 19968: 0xF6AB, - 33267 - 19968: 0xF2B8, - 33268 - 19968: 0xF6C8, - 33274 - 19968: 0xD3E6, - 33275 - 19968: 0xF2DD, - 33276 - 19968: 0xCFBF, - 33278 - 19968: 0xEBAC, - 33285 - 19968: 0xCFC0, - 33287 - 19968: 0xE6A8, - 33288 - 19968: 0xFDE9, - 33290 - 19968: 0xCFC1, - 33292 - 19968: 0xE0DF, - 33293 - 19968: 0xDEEC, - 33298 - 19968: 0xE0A2, - 33307 - 19968: 0xF4BF, - 33308 - 19968: 0xE2EF, - 33310 - 19968: 0xD9F1, - 33311 - 19968: 0xF1C7, - 33313 - 19968: 0xCBB8, - 33322 - 19968: 0xF9FE, - 33323 - 19968: 0xDBBA, - 33324 - 19968: 0xDAF5, - 33333 - 19968: 0xF6EC, - 33334 - 19968: 0xDADC, - 33335 - 19968: 0xFAE4, - 33337 - 19968: 0xE0CF, - 33344 - 19968: 0xDDB2, - 33349 - 19968: 0xE6A9, - 33351 - 19968: 0xEFF3, - 33369 - 19968: 0xF3ED, - 33380 - 19968: 0xEBFA, - 33382 - 19968: 0xF9E6, - 33390 - 19968: 0xCADD, - 33391 - 19968: 0xD5DE, - 33393 - 19968: 0xCADE, - 33394 - 19968: 0xDFE4, - 33398 - 19968: 0xE6FD, - 33400 - 19968: 0xF5AC, - 33406 - 19968: 0xE4F5, - 33419 - 19968: 0xE9E3, - 33421 - 19968: 0xEDCB, - 33422 - 19968: 0xCFE4, - 33426 - 19968: 0xD8D3, - 33433 - 19968: 0xDDB3, - 33434 - 19968: 0xD4EC, - 33437 - 19968: 0xF2B9, - 33439 - 19968: 0xDFB7, - 33445 - 19968: 0xCBCE, - 33446 - 19968: 0xFBD8, - 33449 - 19968: 0xD0D9, - 33452 - 19968: 0xDDD2, - 33453 - 19968: 0xF7F4, - 33454 - 19968: 0xE7DC, - 33455 - 19968: 0xE4A5, - 33457 - 19968: 0xFCA3, - 33459 - 19968: 0xDBBB, - 33463 - 19968: 0xF2BA, - 33464 - 19968: 0xE9FD, - 33465 - 19968: 0xD0CA, - 33467 - 19968: 0xF5D6, - 33468 - 19968: 0xD9C5, - 33469 - 19968: 0xE4B4, - 33471 - 19968: 0xEDA7, - 33489 - 19968: 0xEABD, - 33490 - 19968: 0xE6FE, - 33492 - 19968: 0xF7C4, - 33493 - 19968: 0xF5AD, - 33495 - 19968: 0xD9E0, - 33499 - 19968: 0xCAB4, - 33502 - 19968: 0xF8E2, - 33503 - 19968: 0xCFC2, - 33505 - 19968: 0xECBE, - 33509 - 19968: 0xE5B4, - 33510 - 19968: 0xCDC8, - 33511 - 19968: 0xEEC8, - 33521 - 19968: 0xE7C8, - 33533 - 19968: 0xCDC9, - 33534 - 19968: 0xF9B7, - 33537 - 19968: 0xF1E8, - 33538 - 19968: 0xD9F2, - 33539 - 19968: 0xDBF5, - 33540 - 19968: 0xCAB5, - 33541 - 19968: 0xD9C6, - 33545 - 19968: 0xD8C9, - 33559 - 19968: 0xD9AB, - 33576 - 19968: 0xEDBC, - 33579 - 19968: 0xD8D4, - 33583 - 19968: 0xDCDA, - 33585 - 19968: 0xE2BC, - 33588 - 19968: 0xFCED, - 33589 - 19968: 0xECE0, - 33590 - 19968: 0xD2FE, - 33592 - 19968: 0xE9C7, - 33593 - 19968: 0xE6AA, - 33600 - 19968: 0xE2F0, - 33607 - 19968: 0xFABB, - 33609 - 19968: 0xF5AE, - 33610 - 19968: 0xFBAA, - 33615 - 19968: 0xECFB, - 33617 - 19968: 0xECBF, - 33618 - 19968: 0xFCD8, - 33651 - 19968: 0xD4E5, - 33655 - 19968: 0xF9C3, - 33659 - 19968: 0xEEE2, - 33673 - 19968: 0xD7E9, - 33674 - 19968: 0xEDF6, - 33678 - 19968: 0xDEED, - 33686 - 19968: 0xCCEC, - 33688 - 19968: 0xE3EE, - 33694 - 19968: 0xE8D4, - 33698 - 19968: 0xFAF8, - 33705 - 19968: 0xDDB4, - 33706 - 19968: 0xE4B5, - 33707 - 19968: 0xD8B0, - 33725 - 19968: 0xD8D5, - 33729 - 19968: 0xF4EA, - 33733 - 19968: 0xCEB9, - 33737 - 19968: 0xD6E1, - 33738 - 19968: 0xCFD2, - 33740 - 19968: 0xD0B6, - 33747 - 19968: 0xCEA2, - 33750 - 19968: 0xF3EE, - 33756 - 19968: 0xF3F8, - 33769 - 19968: 0xDCCC, - 33771 - 19968: 0xD0CB, - 33775 - 19968: 0xFCA4, - 33776 - 19968: 0xCDCA, - 33777 - 19968: 0xD7D4, - 33778 - 19968: 0xDEA3, - 33780 - 19968: 0xE4E0, - 33785 - 19968: 0xEEC9, - 33789 - 19968: 0xE2DD, - 33795 - 19968: 0xF5FE, - 33796 - 19968: 0xD4AC, - 33802 - 19968: 0xD5D1, - 33804 - 19968: 0xD8F0, - 33805 - 19968: 0xF8C3, - 33806 - 19968: 0xEAD7, - 33833 - 19968: 0xF5D7, - 33836 - 19968: 0xD8BF, - 33841 - 19968: 0xFDC0, - 33848 - 19968: 0xEBAD, - 33853 - 19968: 0xD5AA, - 33865 - 19968: 0xE7A8, - 33879 - 19968: 0xEECA, - 33883 - 19968: 0xCAE7, - 33889 - 19968: 0xF8E3, - 33891 - 19968: 0xD4DD, - 33894 - 19968: 0xEAD8, - 33899 - 19968: 0xFBD9, - 33900 - 19968: 0xEDF7, - 33903 - 19968: 0xE5B5, - 33909 - 19968: 0xD0AD, - 33914 - 19968: 0xF1F1, - 33936 - 19968: 0xE2BD, - 33940 - 19968: 0xE3C8, - 33945 - 19968: 0xD9D5, - 33948 - 19968: 0xDFAA, - 33953 - 19968: 0xDBBC, - 33970 - 19968: 0xF8E4, - 33976 - 19968: 0xF1FA, - 33979 - 19968: 0xE5B6, - 33980 - 19968: 0xF3EF, - 33983 - 19968: 0xFBDA, - 33984 - 19968: 0xE1E0, - 33986 - 19968: 0xD9AC, - 33988 - 19968: 0xF5EB, - 33990 - 19968: 0xE0B6, - 33993 - 19968: 0xE9C8, - 33995 - 19968: 0xCBCF, - 33997 - 19968: 0xE3C9, - 34001 - 19968: 0xDEEE, - 34010 - 19968: 0xE2BE, - 34028 - 19968: 0xDCEF, - 34030 - 19968: 0xD6A5, - 34036 - 19968: 0xE2F1, - 34044 - 19968: 0xD6FE, - 34065 - 19968: 0xD9A1, - 34067 - 19968: 0xD8C0, - 34068 - 19968: 0xDCDB, - 34071 - 19968: 0xEDBD, - 34072 - 19968: 0xDFB8, - 34074 - 19968: 0xEAA5, - 34078 - 19968: 0xD7AD, - 34081 - 19968: 0xF3F9, - 34083 - 19968: 0xEDF8, - 34085 - 19968: 0xF5C7, - 34092 - 19968: 0xE1CA, - 34093 - 19968: 0xEBE3, - 34095 - 19968: 0xF2DE, - 34109 - 19968: 0xF8CC, - 34111 - 19968: 0xEAD9, - 34113 - 19968: 0xD3C6, - 34115 - 19968: 0xDBE6, - 34121 - 19968: 0xF5AF, - 34126 - 19968: 0xCEF0, - 34131 - 19968: 0xE9FE, - 34137 - 19968: 0xFBB6, - 34147 - 19968: 0xE2F2, - 34152 - 19968: 0xCFF2, - 34153 - 19968: 0xF7B9, - 34154 - 19968: 0xD9F3, - 34157 - 19968: 0xE1CB, - 34180 - 19968: 0xDADD, - 34183 - 19968: 0xDAB9, - 34191 - 19968: 0xEBFB, - 34193 - 19968: 0xCBB9, - 34196 - 19968: 0xEDF9, - 34203 - 19968: 0xE0E0, - 34214 - 19968: 0xF4C0, - 34216 - 19968: 0xFDBC, - 34217 - 19968: 0xDFB1, - 34218 - 19968: 0xE3EF, - 34223 - 19968: 0xE0A3, - 34224 - 19968: 0xFDB9, - 34234 - 19968: 0xF0B1, - 34241 - 19968: 0xCDCB, - 34249 - 19968: 0xEDBE, - 34253 - 19968: 0xD5C0, - 34254 - 19968: 0xE3F0, - 34255 - 19968: 0xEDFA, - 34261 - 19968: 0xE9E4, - 34268 - 19968: 0xD5ED, - 34269 - 19968: 0xE7DD, - 34276 - 19968: 0xD4F6, - 34277 - 19968: 0xE5B7, - 34281 - 19968: 0xDBE7, - 34282 - 19968: 0xE2BF, - 34295 - 19968: 0xEECB, - 34298 - 19968: 0xD7F4, - 34299 - 19968: 0xF0DD, - 34303 - 19968: 0xCEAB, - 34306 - 19968: 0xE7DE, - 34310 - 19968: 0xD6D6, - 34311 - 19968: 0xE1CC, - 34314 - 19968: 0xE8B3, - 34326 - 19968: 0xE5EE, - 34327 - 19968: 0xDCA2, - 34330 - 19968: 0xE0D0, - 34349 - 19968: 0xD5B5, - 34367 - 19968: 0xD5A1, - 34382 - 19968: 0xFBDB, - 34384 - 19968: 0xF9CB, - 34388 - 19968: 0xCBF3, - 34389 - 19968: 0xF4A5, - 34395 - 19968: 0xFAC8, - 34396 - 19968: 0xD6D7, - 34398 - 19968: 0xE9E5, - 34399 - 19968: 0xFBDC, - 34407 - 19968: 0xFDD0, - 34425 - 19968: 0xFBF6, - 34442 - 19968: 0xDAA5, - 34444 - 19968: 0xDBBD, - 34451 - 19968: 0xECE2, - 34467 - 19968: 0xCDF7, - 34468 - 19968: 0xF0DE, - 34473 - 19968: 0xF6C9, - 34503 - 19968: 0xDEEF, - 34507 - 19968: 0xD3B1, - 34516 - 19968: 0xFCEE, - 34521 - 19968: 0xE8C3, - 34523 - 19968: 0xF1C8, - 34527 - 19968: 0xCEF1, - 34532 - 19968: 0xF9ED, - 34541 - 19968: 0xF2F4, - 34558 - 19968: 0xE4B6, - 34560 - 19968: 0xF5B9, - 34562 - 19968: 0xDCF0, - 34563 - 19968: 0xE3F1, - 34568 - 19968: 0xE8A5, - 34584 - 19968: 0xF2BB, - 34586 - 19968: 0xDEA4, - 34588 - 19968: 0xDACC, - 34638 - 19968: 0xCAE9, - 34645 - 19968: 0xE3DA, - 34647 - 19968: 0xFCD9, - 34655 - 19968: 0xEADA, - 34662 - 19968: 0xF9C4, - 34664 - 19968: 0xE3A4, - 34676 - 19968: 0xFBDD, - 34678 - 19968: 0xEFCA, - 34680 - 19968: 0xE8C4, - 34690 - 19968: 0xD5CC, - 34701 - 19968: 0xEBD7, - 34719 - 19968: 0xD9AD, - 34722 - 19968: 0xFBAB, - 34739 - 19968: 0xD3D9, - 34746 - 19968: 0xD5A2, - 34756 - 19968: 0xF6DE, - 34784 - 19968: 0xDAF6, - 34796 - 19968: 0xE0D1, - 34799 - 19968: 0xE9A8, - 34802 - 19968: 0xF5F9, - 34809 - 19968: 0xFAAF, - 34811 - 19968: 0xEBFC, - 34814 - 19968: 0xE0EA, - 34821 - 19968: 0xE3B2, - 34847 - 19968: 0xD5C5, - 34850 - 19968: 0xF1E3, - 34851 - 19968: 0xD5EE, - 34865 - 19968: 0xCDCC, - 34870 - 19968: 0xEDD9, - 34875 - 19968: 0xD8C1, - 34880 - 19968: 0xFAEC, - 34886 - 19968: 0xF1EB, - 34892 - 19968: 0xFABC, - 34893 - 19968: 0xE6E2, - 34898 - 19968: 0xFAE5, - 34899 - 19968: 0xE2FA, - 34903 - 19968: 0xCAB6, - 34905 - 19968: 0xE4B7, - 34907 - 19968: 0xEADB, - 34909 - 19968: 0xF5FA, - 34913 - 19968: 0xFBAC, - 34914 - 19968: 0xCFC3, - 34915 - 19968: 0xEBFD, - 34920 - 19968: 0xF8FA, - 34923 - 19968: 0xDFB9, - 34928 - 19968: 0xE1F1, - 34930 - 19968: 0xD2A4, - 34935 - 19968: 0xF5FB, - 34942 - 19968: 0xD0DA, - 34943 - 19968: 0xD0DB, - 34945 - 19968: 0xEABE, - 34946 - 19968: 0xD9B1, - 34952 - 19968: 0xCAB7, - 34955 - 19968: 0xD3E7, - 34957 - 19968: 0xF8E5, - 34962 - 19968: 0xD3B2, - 34966 - 19968: 0xE2C0, - 34967 - 19968: 0xF2DF, - 34974 - 19968: 0xCDE5, - 34987 - 19968: 0xF9AC, - 34996 - 19968: 0xCDCD, - 35009 - 19968: 0xEEAE, - 35010 - 19968: 0xD6AE, - 35023 - 19968: 0xD7EA, - 35028 - 19968: 0xE7E0, - 35029 - 19968: 0xEBAE, - 35033 - 19968: 0xCFD9, - 35036 - 19968: 0xDCCD, - 35037 - 19968: 0xEDFB, - 35039 - 19968: 0xDEF0, - 35041 - 19968: 0xD7EB, - 35048 - 19968: 0xDEA5, - 35059 - 19968: 0xDFD7, - 35060 - 19968: 0xDBD0, - 35061 - 19968: 0xDBD1, - 35064 - 19968: 0xD5A3, - 35069 - 19968: 0xF0B2, - 35079 - 19968: 0xDCDC, - 35088 - 19968: 0xCAE8, - 35090 - 19968: 0xF8E6, - 35091 - 19968: 0xDCCE, - 35096 - 19968: 0xEADC, - 35097 - 19968: 0xDBD2, - 35109 - 19968: 0xE9B3, - 35114 - 19968: 0xF7DB, - 35126 - 19968: 0xE3A8, - 35128 - 19968: 0xD7AE, - 35131 - 19968: 0xE0E1, - 35137 - 19968: 0xCBBA, - 35140 - 19968: 0xE5D1, - 35167 - 19968: 0xD0DC, - 35172 - 19968: 0xD5C1, - 35178 - 19968: 0xD8CA, - 35186 - 19968: 0xE3A9, - 35199 - 19968: 0xE0A4, - 35201 - 19968: 0xE9A9, - 35203 - 19968: 0xD3C7, - 35206 - 19968: 0xDCDD, - 35207 - 19968: 0xF8AE, - 35211 - 19968: 0xCCB8, - 35215 - 19968: 0xD0AE, - 35219 - 19968: 0xD8F2, - 35222 - 19968: 0xE3CA, - 35233 - 19968: 0xCCAF, - 35241 - 19968: 0xD4AD, - 35242 - 19968: 0xF6D1, - 35250 - 19968: 0xD0CC, - 35258 - 19968: 0xCAC6, - 35261 - 19968: 0xD5C2, - 35264 - 19968: 0xCEBA, - 35282 - 19968: 0xCAC7, - 35299 - 19968: 0xFAB0, - 35316 - 19968: 0xDFD8, - 35320 - 19968: 0xF5BA, - 35328 - 19968: 0xE5EB, - 35330 - 19968: 0xEFF4, - 35331 - 19968: 0xDDB5, - 35336 - 19968: 0xCDAA, - 35338 - 19968: 0xE3F2, - 35340 - 19968: 0xFBF7, - 35342 - 19968: 0xF7D0, - 35347 - 19968: 0xFDBA, - 35350 - 19968: 0xFDE1, - 35351 - 19968: 0xF6FE, - 35352 - 19968: 0xD1C0, - 35355 - 19968: 0xE8C5, - 35357 - 19968: 0xE4B8, - 35359 - 19968: 0xE1E8, - 35363 - 19968: 0xCCC1, - 35365 - 19968: 0xD2ED, - 35370 - 19968: 0xDBBE, - 35373 - 19968: 0xE0E2, - 35377 - 19968: 0xFAC9, - 35380 - 19968: 0xE1CD, - 35382 - 19968: 0xCAB8, - 35386 - 19968: 0xF2E0, - 35387 - 19968: 0xF1C9, - 35408 - 19968: 0xDEF1, - 35412 - 19968: 0xF0DF, - 35413 - 19968: 0xF8C4, - 35419 - 19968: 0xEECC, - 35422 - 19968: 0xDEF2, - 35424 - 19968: 0xE7C9, - 35426 - 19968: 0xE2F3, - 35427 - 19968: 0xE7E1, - 35430 - 19968: 0xE3CB, - 35433 - 19968: 0xE3CC, - 35437 - 19968: 0xCFF8, - 35438 - 19968: 0xEFAC, - 35440 - 19968: 0xFDFE, - 35441 - 19968: 0xFCA5, - 35442 - 19968: 0xFAB1, - 35443 - 19968: 0xDFD9, - 35445 - 19968: 0xE0D2, - 35449 - 19968: 0xF4DA, - 35461 - 19968: 0xF1CA, - 35463 - 19968: 0xCEA3, - 35468 - 19968: 0xF2BC, - 35469 - 19968: 0xECE3, - 35475 - 19968: 0xE0A5, - 35477 - 19968: 0xF7AB, - 35480 - 19968: 0xEBAF, - 35486 - 19968: 0xE5DE, - 35488 - 19968: 0xE1A4, - 35489 - 19968: 0xCDAB, - 35491 - 19968: 0xD9F4, - 35492 - 19968: 0xE8A6, - 35493 - 19968: 0xCDCE, - 35494 - 19968: 0xE1E9, - 35496 - 19968: 0xFCEF, - 35498 - 19968: 0xE0E3, - 35504 - 19968: 0xE2C1, - 35506 - 19968: 0xCEA4, - 35513 - 19968: 0xDEA6, - 35516 - 19968: 0xEBFE, - 35518 - 19968: 0xEBDD, - 35519 - 19968: 0xF0E0, - 35522 - 19968: 0xF4DB, - 35524 - 19968: 0xE2F4, - 35527 - 19968: 0xD3C8, - 35531 - 19968: 0xF4EB, - 35533 - 19968: 0xEEB5, - 35535 - 19968: 0xF5D8, - 35538 - 19968: 0xD5DF, - 35542 - 19968: 0xD6E5, - 35547 - 19968: 0xEBB0, - 35548 - 19968: 0xF4E3, - 35553 - 19968: 0xE3CD, - 35558 - 19968: 0xF4F4, - 35559 - 19968: 0xFAB2, - 35562 - 19968: 0xEFF5, - 35563 - 19968: 0xCADF, - 35565 - 19968: 0xEBB1, - 35566 - 19968: 0xEDBF, - 35569 - 19968: 0xFDC9, - 35574 - 19968: 0xE4A6, - 35575 - 19968: 0xF9A4, - 35576 - 19968: 0xF0B3, - 35578 - 19968: 0xE5EC, - 35582 - 19968: 0xD1E7, - 35584 - 19968: 0xD9C7, - 35585 - 19968: 0xE4D7, - 35586 - 19968: 0xEADD, - 35588 - 19968: 0xD4F7, - 35598 - 19968: 0xDABA, - 35600 - 19968: 0xDACD, - 35604 - 19968: 0xF9CC, - 35606 - 19968: 0xE1DA, - 35607 - 19968: 0xDBBF, - 35609 - 19968: 0xCCC5, - 35610 - 19968: 0xECD0, - 35611 - 19968: 0xCBBB, - 35613 - 19968: 0xDEF3, - 35616 - 19968: 0xE9AA, - 35624 - 19968: 0xD9C8, - 35627 - 19968: 0xEEE3, - 35628 - 19968: 0xD7BD, - 35635 - 19968: 0xCFC4, - 35641 - 19968: 0xD0CD, - 35649 - 19968: 0xFCA6, - 35657 - 19968: 0xF1FB, - 35662 - 19968: 0xFDD2, - 35663 - 19968: 0xD1C1, - 35672 - 19968: 0xE3DB, - 35674 - 19968: 0xD3C9, - 35676 - 19968: 0xDCCF, - 35686 - 19968: 0xCCED, - 35692 - 19968: 0xDEA7, - 35695 - 19968: 0xE6BB, - 35696 - 19968: 0xECA1, - 35700 - 19968: 0xCCB9, - 35703 - 19968: 0xFBDE, - 35709 - 19968: 0xE7E2, - 35712 - 19968: 0xD4C1, - 35722 - 19968: 0xDCA8, - 35728 - 19968: 0xE2C2, - 35730 - 19968: 0xF3D8, - 35731 - 19968: 0xE5D3, - 35734 - 19968: 0xF3D9, - 35738 - 19968: 0xF3C6, - 35895 - 19968: 0xCDDB, - 35903 - 19968: 0xCDAC, - 35905 - 19968: 0xFCC3, - 35910 - 19968: 0xD4E7, - 35912 - 19968: 0xD1C2, - 35914 - 19968: 0xF9A5, - 35916 - 19968: 0xE8D5, - 35925 - 19968: 0xE3CE, - 35930 - 19968: 0xD4CA, - 35937 - 19968: 0xDFDA, - 35946 - 19968: 0xFBDF, - 35947 - 19968: 0xE7E3, - 35961 - 19968: 0xF8FB, - 35962 - 19968: 0xE3CF, - 35970 - 19968: 0xF5B0, - 35978 - 19968: 0xD8E7, - 35980 - 19968: 0xD9C9, - 35997 - 19968: 0xF8AF, - 35998 - 19968: 0xEFF6, - 36000 - 19968: 0xDDB6, - 36001 - 19968: 0xEEAF, - 36002 - 19968: 0xCDF8, - 36007 - 19968: 0xDEB8, - 36008 - 19968: 0xFCA7, - 36009 - 19968: 0xF7FC, - 36010 - 19968: 0xF7B1, - 36011 - 19968: 0xCEBB, - 36012 - 19968: 0xF4A1, - 36015 - 19968: 0xEECD, - 36016 - 19968: 0xE1AE, - 36019 - 19968: 0xECC3, - 36020 - 19968: 0xCFFE, - 36022 - 19968: 0xF8BF, - 36023 - 19968: 0xD8E2, - 36024 - 19968: 0xD3E8, - 36027 - 19968: 0xDEA8, - 36028 - 19968: 0xF4E4, - 36029 - 19968: 0xECC2, - 36031 - 19968: 0xD9F5, - 36032 - 19968: 0xF9C5, - 36033 - 19968: 0xDDD3, - 36034 - 19968: 0xD6F1, - 36035 - 19968: 0xECFC, - 36036 - 19968: 0xFCF0, - 36039 - 19968: 0xEDC0, - 36040 - 19968: 0xCAB9, - 36042 - 19968: 0xEEE4, - 36049 - 19968: 0xF2E1, - 36051 - 19968: 0xDEB9, - 36058 - 19968: 0xD6F2, - 36060 - 19968: 0xDEF4, - 36062 - 19968: 0xDFDB, - 36064 - 19968: 0xDBD3, - 36066 - 19968: 0xFAE7, - 36067 - 19968: 0xD8E3, - 36068 - 19968: 0xF4C1, - 36070 - 19968: 0xDDB7, - 36074 - 19968: 0xF2F5, - 36077 - 19968: 0xD4AE, - 36084 - 19968: 0xD6F3, - 36091 - 19968: 0xDDB8, - 36092 - 19968: 0xCFC5, - 36093 - 19968: 0xDFDF, - 36100 - 19968: 0xF2BE, - 36101 - 19968: 0xF6A1, - 36103 - 19968: 0xEBCB, - 36104 - 19968: 0xF1FC, - 36106 - 19968: 0xF3C7, - 36109 - 19968: 0xE0EB, - 36115 - 19968: 0xEDFC, - 36118 - 19968: 0xE1DB, - 36196 - 19968: 0xEEE5, - 36198 - 19968: 0xDEF5, - 36203 - 19968: 0xFAD3, - 36208 - 19968: 0xF1CB, - 36211 - 19968: 0xD0AF, - 36212 - 19968: 0xDDB9, - 36215 - 19968: 0xD1C3, - 36229 - 19968: 0xF5B1, - 36234 - 19968: 0xEAC6, - 36249 - 19968: 0xF0E1, - 36259 - 19968: 0xF6AC, - 36264 - 19968: 0xF5D9, - 36275 - 19968: 0xF0EB, - 36282 - 19968: 0xDDBA, - 36286 - 19968: 0xF2BF, - 36294 - 19968: 0xF7C5, - 36299 - 19968: 0xDBA2, - 36300 - 19968: 0xF2F6, - 36303 - 19968: 0xCABA, - 36315 - 19968: 0xF7F5, - 36317 - 19968: 0xCBE5, - 36321 - 19968: 0xEEE6, - 36323 - 19968: 0xE0D3, - 36328 - 19968: 0xCEA5, - 36335 - 19968: 0xD6D8, - 36339 - 19968: 0xD4AF, - 36362 - 19968: 0xE9C9, - 36367 - 19968: 0xD3CE, - 36368 - 19968: 0xF4C2, - 36382 - 19968: 0xCBE6, - 36394 - 19968: 0xF1A1, - 36400 - 19968: 0xEBB2, - 36405 - 19968: 0xF1A2, - 36418 - 19968: 0xEBB3, - 36420 - 19968: 0xF0B4, - 36423 - 19968: 0xCBF4, - 36424 - 19968: 0xD4B0, - 36425 - 19968: 0xF3B2, - 36426 - 19968: 0xFBB7, - 36441 - 19968: 0xF5EC, - 36447 - 19968: 0xEEE7, - 36448 - 19968: 0xF4B2, - 36468 - 19968: 0xF5ED, - 36470 - 19968: 0xCFF3, - 36481 - 19968: 0xF0E2, - 36487 - 19968: 0xEECE, - 36490 - 19968: 0xF1CC, - 36493 - 19968: 0xE5B8, - 36522 - 19968: 0xD7F5, - 36523 - 19968: 0xE3F3, - 36524 - 19968: 0xCFE5, - 36544 - 19968: 0xCFC6, - 36554 - 19968: 0xF3B3, - 36555 - 19968: 0xE4D8, - 36556 - 19968: 0xCFF9, - 36557 - 19968: 0xCFDA, - 36562 - 19968: 0xFACD, - 36575 - 19968: 0xE6E3, - 36587 - 19968: 0xF2E2, - 36600 - 19968: 0xF5EE, - 36603 - 19968: 0xCABB, - 36606 - 19968: 0xE3DC, - 36611 - 19968: 0xCEF2, - 36613 - 19968: 0xD6D9, - 36617 - 19968: 0xEEB0, - 36626 - 19968: 0xF4E5, - 36627 - 19968: 0xD8C2, - 36628 - 19968: 0xDCD0, - 36629 - 19968: 0xCCEE, - 36635 - 19968: 0xD5E0, - 36636 - 19968: 0xF6CA, - 36637 - 19968: 0xFDCA, - 36638 - 19968: 0xD8D6, - 36639 - 19968: 0xF4CF, - 36646 - 19968: 0xD6A6, - 36647 - 19968: 0xDCBE, - 36649 - 19968: 0xDBD4, - 36650 - 19968: 0xD7C7, - 36655 - 19968: 0xF2FE, - 36659 - 19968: 0xF1CD, - 36664 - 19968: 0xE2C3, - 36665 - 19968: 0xDCDE, - 36667 - 19968: 0xDCDF, - 36670 - 19968: 0xEFAD, - 36671 - 19968: 0xE6AB, - 36676 - 19968: 0xF9DD, - 36677 - 19968: 0xEABF, - 36681 - 19968: 0xEFAE, - 36685 - 19968: 0xF4D0, - 36686 - 19968: 0xCEF3, - 36701 - 19968: 0xE6AC, - 36703 - 19968: 0xCEDE, - 36706 - 19968: 0xD5F9, - 36763 - 19968: 0xE3F4, - 36764 - 19968: 0xCDD0, - 36771 - 19968: 0xD5B8, - 36774 - 19968: 0xF7FD, - 36776 - 19968: 0xDCA9, - 36781 - 19968: 0xDEF6, - 36783 - 19968: 0xDCAA, - 36784 - 19968: 0xF2E3, - 36785 - 19968: 0xE9B4, - 36786 - 19968: 0xD2DC, - 36802 - 19968: 0xE9E6, - 36805 - 19968: 0xE3F6, - 36814 - 19968: 0xE7CA, - 36817 - 19968: 0xD0CE, - 36820 - 19968: 0xDAF7, - 36838 - 19968: 0xCABC, - 36842 - 19968: 0xEEE8, - 36843 - 19968: 0xDADE, - 36845 - 19968: 0xF2F7, - 36848 - 19968: 0xE2FB, - 36850 - 19968: 0xCCA6, - 36855 - 19968: 0xDABB, - 36857 - 19968: 0xEEE9, - 36861 - 19968: 0xF5DA, - 36864 - 19968: 0xF7DC, - 36865 - 19968: 0xE1EA, - 36866 - 19968: 0xCEC1, - 36867 - 19968: 0xD4B1, - 36869 - 19968: 0xFDB1, - 36870 - 19968: 0xE6BD, - 36872 - 19968: 0xFBAD, - 36875 - 19968: 0xF8E7, - 36877 - 19968: 0xE1CE, - 36879 - 19968: 0xF7E2, - 36880 - 19968: 0xF5EF, - 36881 - 19968: 0xCFC7, - 36884 - 19968: 0xD4B2, - 36885 - 19968: 0xCCEF, - 36887 - 19968: 0xD4E8, - 36889 - 19968: 0xEECF, - 36890 - 19968: 0xF7D7, - 36893 - 19968: 0xE0A6, - 36894 - 19968: 0xD6C1, - 36895 - 19968: 0xE1DC, - 36896 - 19968: 0xF0E3, - 36897 - 19968: 0xF1E4, - 36898 - 19968: 0xDCF1, - 36899 - 19968: 0xD6A7, - 36910 - 19968: 0xF4F5, - 36913 - 19968: 0xF1CE, - 36914 - 19968: 0xF2E4, - 36917 - 19968: 0xD0B0, - 36920 - 19968: 0xECEF, - 36924 - 19968: 0xF9BA, - 36926 - 19968: 0xEBB5, - 36929 - 19968: 0xD4ED, - 36930 - 19968: 0xE2C4, - 36935 - 19968: 0xE9E7, - 36938 - 19968: 0xEBB4, - 36939 - 19968: 0xEAA1, - 36941 - 19968: 0xF8BC, - 36942 - 19968: 0xCEA6, - 36944 - 19968: 0xF9C6, - 36945 - 19968: 0xFCDA, - 36947 - 19968: 0xD4B3, - 36948 - 19968: 0xD3B9, - 36949 - 19968: 0xEADE, - 36953 - 19968: 0xE9AB, - 36956 - 19968: 0xE1E1, - 36957 - 19968: 0xD3CF, - 36958 - 19968: 0xF4F6, - 36960 - 19968: 0xEAC0, - 36961 - 19968: 0xE1CF, - 36963 - 19968: 0xCCBA, - 36969 - 19968: 0xEEEA, - 36973 - 19968: 0xF0E4, - 36974 - 19968: 0xF3B4, - 36975 - 19968: 0xD4EE, - 36978 - 19968: 0xF2C0, - 36981 - 19968: 0xF1E5, - 36983 - 19968: 0xF4C3, - 36984 - 19968: 0xE0D4, - 36986 - 19968: 0xEBB6, - 36988 - 19968: 0xD7A1, - 36989 - 19968: 0xCBE8, - 36991 - 19968: 0xF9AD, - 36992 - 19968: 0xE9AD, - 36993 - 19968: 0xD8E4, - 36994 - 19968: 0xFAB3, - 36995 - 19968: 0xE2C5, - 36996 - 19968: 0xFCBD, - 36999 - 19968: 0xECC4, - 37000 - 19968: 0xD8B1, - 37002 - 19968: 0xDCAB, - 37007 - 19968: 0xD5A4, - 37009 - 19968: 0xEBE9, - 37013 - 19968: 0xE8BB, - 37017 - 19968: 0xD8D7, - 37026 - 19968: 0xFBAE, - 37027 - 19968: 0xD1E1, - 37030 - 19968: 0xDBC0, - 37032 - 19968: 0xF5BE, - 37034 - 19968: 0xDEF7, - 37039 - 19968: 0xCAFB, - 37040 - 19968: 0xF7C6, - 37041 - 19968: 0xCFC8, - 37045 - 19968: 0xE1D0, - 37048 - 19968: 0xEED0, - 37057 - 19968: 0xE9F4, - 37066 - 19968: 0xCEF4, - 37086 - 19968: 0xD5CD, - 37089 - 19968: 0xCFDB, - 37096 - 19968: 0xDDBB, - 37101 - 19968: 0xCEAC, - 37109 - 19968: 0xE9E8, - 37117 - 19968: 0xD4B4, - 37122 - 19968: 0xE4C7, - 37138 - 19968: 0xF5DB, - 37141 - 19968: 0xFAC1, - 37145 - 19968: 0xDEA9, - 37159 - 19968: 0xD4F8, - 37165 - 19968: 0xEFF7, - 37170 - 19968: 0xD3B3, - 37193 - 19968: 0xEBB7, - 37194 - 19968: 0xEFF8, - 37195 - 19968: 0xF5DC, - 37196 - 19968: 0xEDCC, - 37197 - 19968: 0xDBD5, - 37198 - 19968: 0xF1CF, - 37202 - 19968: 0xF1D0, - 37218 - 19968: 0xF5B2, - 37225 - 19968: 0xD9AE, - 37226 - 19968: 0xD5AC, - 37228 - 19968: 0xE2C6, - 37237 - 19968: 0xFDA3, - 37239 - 19968: 0xFBE5, - 37240 - 19968: 0xDFAB, - 37255 - 19968: 0xE2F5, - 37257 - 19968: 0xF6AD, - 37259 - 19968: 0xF5B3, - 37261 - 19968: 0xF0B5, - 37266 - 19968: 0xE1A5, - 37276 - 19968: 0xF5DD, - 37291 - 19968: 0xECA2, - 37292 - 19968: 0xEDFD, - 37294 - 19968: 0xF5B4, - 37295 - 19968: 0xFBB8, - 37297 - 19968: 0xDBA3, - 37300 - 19968: 0xD6CA, - 37301 - 19968: 0xCBD9, - 37312 - 19968: 0xE5D4, - 37319 - 19968: 0xF3FA, - 37321 - 19968: 0xEBB8, - 37323 - 19968: 0xE0B7, - 37324 - 19968: 0xD7EC, - 37325 - 19968: 0xF1EC, - 37326 - 19968: 0xE5AF, - 37327 - 19968: 0xD5E1, - 37328 - 19968: 0xD7ED, - 37329 - 19968: 0xD1D1, - 37335 - 19968: 0xE1F2, - 37336 - 19968: 0xEFF9, - 37340 - 19968: 0xDDBC, - 37341 - 19968: 0xF6DC, - 37347 - 19968: 0xF0E5, - 37351 - 19968: 0xF4C4, - 37354 - 19968: 0xE9E9, - 37365 - 19968: 0xF3FB, - 37389 - 19968: 0xD4EF, - 37392 - 19968: 0xCCA2, - 37393 - 19968: 0xF7FE, - 37394 - 19968: 0xDFBC, - 37399 - 19968: 0xEBCD, - 37406 - 19968: 0xD0B7, - 37428 - 19968: 0xD6C2, - 37434 - 19968: 0xE8AD, - 37439 - 19968: 0xEFAF, - 37440 - 19968: 0xCBA5, - 37445 - 19968: 0xCBE9, - 37449 - 19968: 0xFAE8, - 37463 - 19968: 0xCCC6, - 37467 - 19968: 0xE6E7, - 37470 - 19968: 0xEAC7, - 37474 - 19968: 0xDBA4, - 37476 - 19968: 0xCFC9, - 37477 - 19968: 0xE2FC, - 37478 - 19968: 0xEFFA, - 37504 - 19968: 0xEBDE, - 37507 - 19968: 0xF5C8, - 37509 - 19968: 0xD4DE, - 37521 - 19968: 0xE0D5, - 37523 - 19968: 0xEFB0, - 37526 - 19968: 0xE2C7, - 37528 - 19968: 0xD9AF, - 37532 - 19968: 0xF9E7, - 37555 - 19968: 0xE7E5, - 37558 - 19968: 0xCFCA, - 37559 - 19968: 0xE1D1, - 37561 - 19968: 0xE2C8, - 37580 - 19968: 0xEFFB, - 37583 - 19968: 0xFAF9, - 37586 - 19968: 0xDCF2, - 37604 - 19968: 0xE0A7, - 37610 - 19968: 0xF8E8, - 37624 - 19968: 0xCBEA, - 37628 - 19968: 0xCBBC, - 37636 - 19968: 0xD6E2, - 37648 - 19968: 0xF5DE, - 37656 - 19968: 0xF5DF, - 37658 - 19968: 0xEEB6, - 37662 - 19968: 0xE2F6, - 37663 - 19968: 0xD3CA, - 37664 - 19968: 0xEFFC, - 37665 - 19968: 0xD1C4, - 37666 - 19968: 0xEFB1, - 37668 - 19968: 0xD1C5, - 37670 - 19968: 0xD0DE, - 37672 - 19968: 0xD9E1, - 37675 - 19968: 0xE0B8, - 37678 - 19968: 0xCDD1, - 37679 - 19968: 0xF3B9, - 37704 - 19968: 0xE7CC, - 37706 - 19968: 0xD6A8, - 37707 - 19968: 0xCEA7, - 37709 - 19968: 0xD4B5, - 37716 - 19968: 0xE4C8, - 37723 - 19968: 0xD3B4, - 37742 - 19968: 0xEBB9, - 37749 - 19968: 0xCBF5, - 37756 - 19968: 0xF6DD, - 37758 - 19968: 0xF1A3, - 37772 - 19968: 0xCCC7, - 37780 - 19968: 0xE9CA, - 37782 - 19968: 0xE1F0, - 37786 - 19968: 0xF5E0, - 37795 - 19968: 0xFBAF, - 37799 - 19968: 0xCBD1, - 37804 - 19968: 0xFBE0, - 37805 - 19968: 0xF2E5, - 37808 - 19968: 0xECF0, - 37827 - 19968: 0xF0EC, - 37841 - 19968: 0xEEEB, - 37854 - 19968: 0xE9CB, - 37857 - 19968: 0xCCF0, - 37860 - 19968: 0xD7AF, - 37878 - 19968: 0xF3A1, - 37892 - 19968: 0xFCF5, - 37912 - 19968: 0xF1A4, - 37925 - 19968: 0xE0D6, - 37931 - 19968: 0xEFB2, - 37941 - 19968: 0xF4D1, - 37944 - 19968: 0xF7A1, - 37956 - 19968: 0xF1D1, - 37969 - 19968: 0xCAFC, - 37970 - 19968: 0xCAFD, - 37979 - 19968: 0xCECE, - 38013 - 19968: 0xF3C8, - 38015 - 19968: 0xF3BA, - 38263 - 19968: 0xEDFE, - 38272 - 19968: 0xDAA6, - 38275 - 19968: 0xE0EC, - 38281 - 19968: 0xF8CD, - 38283 - 19968: 0xCBD2, - 38287 - 19968: 0xEBCE, - 38289 - 19968: 0xF9D8, - 38290 - 19968: 0xF9D9, - 38291 - 19968: 0xCAE0, - 38292 - 19968: 0xDACA, - 38296 - 19968: 0xCBA6, - 38307 - 19968: 0xCAC8, - 38308 - 19968: 0xF9EE, - 38309 - 19968: 0xDBEC, - 38312 - 19968: 0xD0B1, - 38317 - 19968: 0xD5EF, - 38321 - 19968: 0xE6F3, - 38331 - 19968: 0xE7A2, - 38332 - 19968: 0xE4D9, - 38343 - 19968: 0xE4E1, - 38346 - 19968: 0xFCC4, - 38356 - 19968: 0xF9EF, - 38357 - 19968: 0xCFF4, - 38358 - 19968: 0xF7E6, - 38364 - 19968: 0xCEBC, - 38369 - 19968: 0xF4C5, - 38370 - 19968: 0xDCA3, - 38428 - 19968: 0xDDBD, - 38433 - 19968: 0xF4C6, - 38442 - 19968: 0xF8A1, - 38446 - 19968: 0xE8D6, - 38450 - 19968: 0xDBC1, - 38459 - 19968: 0xF0E6, - 38463 - 19968: 0xE4B9, - 38464 - 19968: 0xF6ED, - 38466 - 19968: 0xF9AE, - 38468 - 19968: 0xDDBE, - 38475 - 19968: 0xD7B0, - 38476 - 19968: 0xD8E8, - 38477 - 19968: 0xCBBD, - 38480 - 19968: 0xF9DA, - 38491 - 19968: 0xF8CE, - 38492 - 19968: 0xF9F0, - 38493 - 19968: 0xE0ED, - 38494 - 19968: 0xE3B3, - 38495 - 19968: 0xF4B3, - 38498 - 19968: 0xEAC2, - 38499 - 19968: 0xF2E6, - 38500 - 19968: 0xF0B6, - 38506 - 19968: 0xDBD6, - 38512 - 19968: 0xEBE4, - 38515 - 19968: 0xF2E7, - 38517 - 19968: 0xD7D5, - 38518 - 19968: 0xD4B6, - 38519 - 19968: 0xF9E8, - 38520 - 19968: 0xD7C1, - 38525 - 19968: 0xE5D5, - 38533 - 19968: 0xE9EA, - 38534 - 19968: 0xD7CC, - 38538 - 19968: 0xD3E9, - 38539 - 19968: 0xE2C9, - 38541 - 19968: 0xFCDB, - 38542 - 19968: 0xCDAD, - 38548 - 19968: 0xCCB0, - 38549 - 19968: 0xEAA2, - 38552 - 19968: 0xE4F6, - 38553 - 19968: 0xD0C0, - 38555 - 19968: 0xF0B7, - 38556 - 19968: 0xEEA1, - 38563 - 19968: 0xD7F6, - 38567 - 19968: 0xE2CA, - 38568 - 19968: 0xE2CB, - 38570 - 19968: 0xFACF, - 38577 - 19968: 0xEBDF, - 38583 - 19968: 0xD6CB, - 38587 - 19968: 0xF4B4, - 38592 - 19968: 0xEDCD, - 38593 - 19968: 0xE4D2, - 38596 - 19968: 0xEAA9, - 38597 - 19968: 0xE4BA, - 38598 - 19968: 0xF3A2, - 38599 - 19968: 0xCDD2, - 38601 - 19968: 0xF6CB, - 38603 - 19968: 0xF1E6, - 38604 - 19968: 0xEDC1, - 38605 - 19968: 0xE8BC, - 38606 - 19968: 0xEED1, - 38613 - 19968: 0xF0E7, - 38614 - 19968: 0xE2CC, - 38617 - 19968: 0xE4AA, - 38619 - 19968: 0xF5E1, - 38620 - 19968: 0xEDDA, - 38626 - 19968: 0xD7EE, - 38627 - 19968: 0xD1F1, - 38632 - 19968: 0xE9EB, - 38633 - 19968: 0xE9EC, - 38634 - 19968: 0xE0E4, - 38639 - 19968: 0xDAA7, - 38640 - 19968: 0xDDD4, - 38642 - 19968: 0xEAA3, - 38646 - 19968: 0xD6C3, - 38647 - 19968: 0xD6F4, - 38649 - 19968: 0xDADF, - 38651 - 19968: 0xEFB3, - 38656 - 19968: 0xE2CD, - 38662 - 19968: 0xEFFD, - 38663 - 19968: 0xF2E8, - 38673 - 19968: 0xEFC5, - 38675 - 19968: 0xE7E7, - 38678 - 19968: 0xD7FD, - 38681 - 19968: 0xE7CE, - 38684 - 19968: 0xDFDC, - 38686 - 19968: 0xF9C7, - 38695 - 19968: 0xD9F6, - 38704 - 19968: 0xDFAC, - 38706 - 19968: 0xD6DA, - 38713 - 19968: 0xDCA4, - 38717 - 19968: 0xF0B8, - 38722 - 19968: 0xD5FA, - 38724 - 19968: 0xE4F7, - 38728 - 19968: 0xD6C4, - 38737 - 19968: 0xF4EC, - 38742 - 19968: 0xEFFE, - 38748 - 19968: 0xF0A1, - 38750 - 19968: 0xDEAA, - 38753 - 19968: 0xDABC, - 38754 - 19968: 0xD8FC, - 38761 - 19968: 0xFAD4, - 38765 - 19968: 0xECE5, - 38772 - 19968: 0xFCA8, - 38775 - 19968: 0xECE6, - 38778 - 19968: 0xD8CB, - 38795 - 19968: 0xFBB9, - 38797 - 19968: 0xE4D3, - 38799 - 19968: 0xCDF9, - 38816 - 19968: 0xCFD3, - 38824 - 19968: 0xCAEA, - 38827 - 19968: 0xCFD4, - 38829 - 19968: 0xF8BD, - 38854 - 19968: 0xF4C7, - 38859 - 19968: 0xEADF, - 38867 - 19968: 0xF9DB, - 38876 - 19968: 0xD4B7, - 38899 - 19968: 0xEBE5, - 38902 - 19968: 0xE1D2, - 38907 - 19968: 0xEAA4, - 38911 - 19968: 0xFAC2, - 38912 - 19968: 0xFBE1, - 38913 - 19968: 0xFAED, - 38914 - 19968: 0xF0A2, - 38915 - 19968: 0xCCF1, - 38917 - 19968: 0xFAA3, - 38918 - 19968: 0xE2F7, - 38920 - 19968: 0xE2CE, - 38922 - 19968: 0xE9F5, - 38924 - 19968: 0xE1EB, - 38928 - 19968: 0xE7E8, - 38929 - 19968: 0xE8D7, - 38930 - 19968: 0xDAF8, - 38931 - 19968: 0xD4CB, - 38935 - 19968: 0xF7F6, - 38936 - 19968: 0xD6C5, - 38957 - 19968: 0xD4E9, - 38960 - 19968: 0xFAFA, - 38968 - 19968: 0xCCF2, - 38969 - 19968: 0xF7DD, - 38971 - 19968: 0xDEBA, - 38982 - 19968: 0xCEA8, - 38988 - 19968: 0xF0B9, - 38989 - 19968: 0xE4FE, - 38990 - 19968: 0xE4C9, - 38996 - 19968: 0xE4D4, - 39000 - 19968: 0xEAC3, - 39002 - 19968: 0xEFB4, - 39006 - 19968: 0xD7BE, - 39013 - 19968: 0xFBE2, - 39015 - 19968: 0xCDD3, - 39019 - 19968: 0xEFB5, - 39023 - 19968: 0xFAE9, - 39080 - 19968: 0xF9A6, - 39087 - 19968: 0xDFBD, - 39089 - 19968: 0xF7C7, - 39108 - 19968: 0xF8FD, - 39111 - 19968: 0xF8FC, - 39131 - 19968: 0xDEAB, - 39132 - 19968: 0xDBE8, - 39135 - 19968: 0xE3DD, - 39137 - 19968: 0xE1E2, - 39138 - 19968: 0xD1C6, - 39149 - 19968: 0xF6D0, - 39150 - 19968: 0xEBE6, - 39151 - 19968: 0xDAF9, - 39156 - 19968: 0xECC7, - 39164 - 19968: 0xDEF8, - 39165 - 19968: 0xF8E9, - 39166 - 19968: 0xE3DE, - 39171 - 19968: 0xCEF5, - 39177 - 19968: 0xFAC3, - 39178 - 19968: 0xE5D7, - 39180 - 19968: 0xECC8, - 39184 - 19968: 0xF3C9, - 39187 - 19968: 0xE4BB, - 39192 - 19968: 0xE6AE, - 39198 - 19968: 0xEFB6, - 39200 - 19968: 0xDCBF, - 39208 - 19968: 0xCEBD, - 39237 - 19968: 0xD8C3, - 39241 - 19968: 0xD0CF, - 39243 - 19968: 0xCFFA, - 39244 - 19968: 0xF3CA, - 39245 - 19968: 0xE0D7, - 39249 - 19968: 0xD1C7, - 39250 - 19968: 0xE9AE, - 39252 - 19968: 0xE8BD, - 39255 - 19968: 0xFAC4, - 39318 - 19968: 0xE2CF, - 39321 - 19968: 0xFAC5, - 39325 - 19968: 0xF9B8, - 39333 - 19968: 0xDCE0, - 39336 - 19968: 0xFBB0, - 39340 - 19968: 0xD8A9, - 39341 - 19968: 0xE5DF, - 39342 - 19968: 0xF9A7, - 39345 - 19968: 0xF6EE, - 39347 - 19968: 0xF6CC, - 39348 - 19968: 0xE2F8, - 39353 - 19968: 0xECF1, - 39361 - 19968: 0xDAE0, - 39376 - 19968: 0xF1D2, - 39377 - 19968: 0xD2CC, - 39378 - 19968: 0xCFCB, - 39381 - 19968: 0xCABD, - 39385 - 19968: 0xDDBF, - 39389 - 19968: 0xF6EF, - 39391 - 19968: 0xDEF9, - 39405 - 19968: 0xFAB4, - 39409 - 19968: 0xD5AD, - 39423 - 19968: 0xF1E7, - 39425 - 19968: 0xDEBE, - 39432 - 19968: 0xDCC0, - 39438 - 19968: 0xD1C8, - 39439 - 19968: 0xD1C9, - 39449 - 19968: 0xF8BE, - 39467 - 19968: 0xCBF6, - 39472 - 19968: 0xD4F9, - 39478 - 19968: 0xF5E2, - 39479 - 19968: 0xE1D3, - 39488 - 19968: 0xD8E9, - 39491 - 19968: 0xF8FE, - 39493 - 19968: 0xCFCC, - 39501 - 19968: 0xFDA4, - 39509 - 19968: 0xCEF6, - 39511 - 19968: 0xFAD0, - 39514 - 19968: 0xCCF3, - 39515 - 19968: 0xE6BE, - 39519 - 19968: 0xF6AE, - 39522 - 19968: 0xD5F0, - 39525 - 19968: 0xD1CA, - 39529 - 19968: 0xFCBE, - 39530 - 19968: 0xD5F1, - 39592 - 19968: 0xCDE9, - 39608 - 19968: 0xFAB5, - 39635 - 19968: 0xE2D0, - 39636 - 19968: 0xF4F7, - 39640 - 19968: 0xCDD4, - 39653 - 19968: 0xE7A3, - 39662 - 19968: 0xDBA5, - 39706 - 19968: 0xE2D1, - 39719 - 19968: 0xD7A2, - 39722 - 19968: 0xF7E3, - 39729 - 19968: 0xEAA6, - 39740 - 19968: 0xD0A1, - 39745 - 19968: 0xCEDA, - 39746 - 19968: 0xFBEB, - 39747 - 19968: 0xDBA6, - 39748 - 19968: 0xDBDE, - 39749 - 19968: 0xD8E5, - 39759 - 19968: 0xEAE0, - 39764 - 19968: 0xD8AA, - 39770 - 19968: 0xE5E0, - 39791 - 19968: 0xD6DB, - 39822 - 19968: 0xEFC6, - 39825 - 19968: 0xF8EA, - 39839 - 19968: 0xE4D5, - 39851 - 19968: 0xCEF7, - 39854 - 19968: 0xE0D8, - 39881 - 19968: 0xD7EF, - 39894 - 19968: 0xF4ED, - 39908 - 19968: 0xCDE6, - 39912 - 19968: 0xCCF4, - 39949 - 19968: 0xF5E3, - 39952 - 19968: 0xE4CA, - 39954 - 19968: 0xDCE1, - 39957 - 19968: 0xF9C8, - 39973 - 19968: 0xFCBF, - 39986 - 19968: 0xE8A7, - 39995 - 19968: 0xD8C4, - 40007 - 19968: 0xCBBE, - 40009 - 19968: 0xDCAE, - 40023 - 19968: 0xD7F7, - 40165 - 19968: 0xF0E8, - 40167 - 19968: 0xDDC0, - 40169 - 19968: 0xCFCD, - 40179 - 19968: 0xDCF3, - 40180 - 19968: 0xD9B0, - 40182 - 19968: 0xE6E9, - 40201 - 19968: 0xE4BC, - 40219 - 19968: 0xEAC4, - 40230 - 19968: 0xE4EC, - 40232 - 19968: 0xE4E5, - 40251 - 19968: 0xFBF8, - 40273 - 19968: 0xCCBB, - 40285 - 19968: 0xE4BD, - 40288 - 19968: 0xCDDC, - 40289 - 19968: 0xD9F7, - 40300 - 19968: 0xDDDF, - 40306 - 19968: 0xEDCE, - 40361 - 19968: 0xD9D0, - 40367 - 19968: 0xE5A3, - 40372 - 19968: 0xF9CD, - 40388 - 19968: 0xCDAE, - 40407 - 19968: 0xCFCE, - 40434 - 19968: 0xF6AF, - 40440 - 19968: 0xFDD3, - 40441 - 19968: 0xEBED, - 40442 - 19968: 0xD6DC, - 40474 - 19968: 0xE5A4, - 40478 - 19968: 0xD5B6, - 40565 - 19968: 0xD6DD, - 40569 - 19968: 0xF9E9, - 40573 - 19968: 0xE7A4, - 40575 - 19968: 0xD6E3, - 40594 - 19968: 0xD1CB, - 40595 - 19968: 0xD6E4, - 40599 - 19968: 0xD5F2, - 40605 - 19968: 0xDEFA, - 40607 - 19968: 0xD7F8, - 40613 - 19968: 0xD8EA, - 40628 - 19968: 0xCFD5, - 40629 - 19968: 0xD8FD, - 40635 - 19968: 0xD8AB, - 40638 - 19968: 0xFDCB, - 40643 - 19968: 0xFCDC, - 40653 - 19968: 0xE0A8, - 40654 - 19968: 0xD5F3, - 40657 - 19968: 0xFDD9, - 40660 - 19968: 0xCCA3, - 40664 - 19968: 0xD9F9, - 40667 - 19968: 0xD3EA, - 40668 - 19968: 0xF5F5, - 40670 - 19968: 0xEFC7, - 40680 - 19968: 0xD3DA, - 40692 - 19968: 0xDABD, - 40711 - 19968: 0xE8A8, - 40712 - 19968: 0xDCAF, - 40718 - 19968: 0xF0A3, - 40723 - 19968: 0xCDD5, - 40736 - 19968: 0xE0A9, - 40763 - 19968: 0xDEAC, - 40778 - 19968: 0xF0BA, - 40779 - 19968: 0xEEB1, - 40782 - 19968: 0xEEB2, - 40786 - 19968: 0xF6CD, - 40799 - 19968: 0xEED2, - 40801 - 19968: 0xD6C6, - 40807 - 19968: 0xE0E5, - 40810 - 19968: 0xF3BB, - 40812 - 19968: 0xE5E1, - 40823 - 19968: 0xE4CB, - 40845 - 19968: 0xD7A3, - 40848 - 19968: 0xDBC2, - 40853 - 19968: 0xCAFE, - 40860 - 19968: 0xCFCF, -} - -const encode1Low, encode1High = 44032, 55204 - -var encode1 = [...]uint16{ - 44032 - 44032: 0xB0A1, - 44033 - 44032: 0xB0A2, - 44034 - 44032: 0x8141, - 44035 - 44032: 0x8142, - 44036 - 44032: 0xB0A3, - 44037 - 44032: 0x8143, - 44038 - 44032: 0x8144, - 44039 - 44032: 0xB0A4, - 44040 - 44032: 0xB0A5, - 44041 - 44032: 0xB0A6, - 44042 - 44032: 0xB0A7, - 44043 - 44032: 0x8145, - 44044 - 44032: 0x8146, - 44045 - 44032: 0x8147, - 44046 - 44032: 0x8148, - 44047 - 44032: 0x8149, - 44048 - 44032: 0xB0A8, - 44049 - 44032: 0xB0A9, - 44050 - 44032: 0xB0AA, - 44051 - 44032: 0xB0AB, - 44052 - 44032: 0xB0AC, - 44053 - 44032: 0xB0AD, - 44054 - 44032: 0xB0AE, - 44055 - 44032: 0xB0AF, - 44056 - 44032: 0x814A, - 44057 - 44032: 0xB0B0, - 44058 - 44032: 0xB0B1, - 44059 - 44032: 0xB0B2, - 44060 - 44032: 0xB0B3, - 44061 - 44032: 0xB0B4, - 44062 - 44032: 0x814B, - 44063 - 44032: 0x814C, - 44064 - 44032: 0xB0B5, - 44065 - 44032: 0x814D, - 44066 - 44032: 0x814E, - 44067 - 44032: 0x814F, - 44068 - 44032: 0xB0B6, - 44069 - 44032: 0x8150, - 44070 - 44032: 0x8151, - 44071 - 44032: 0x8152, - 44072 - 44032: 0x8153, - 44073 - 44032: 0x8154, - 44074 - 44032: 0x8155, - 44075 - 44032: 0x8156, - 44076 - 44032: 0xB0B7, - 44077 - 44032: 0xB0B8, - 44078 - 44032: 0x8157, - 44079 - 44032: 0xB0B9, - 44080 - 44032: 0xB0BA, - 44081 - 44032: 0xB0BB, - 44082 - 44032: 0x8158, - 44083 - 44032: 0x8159, - 44084 - 44032: 0x815A, - 44085 - 44032: 0x8161, - 44086 - 44032: 0x8162, - 44087 - 44032: 0x8163, - 44088 - 44032: 0xB0BC, - 44089 - 44032: 0xB0BD, - 44090 - 44032: 0x8164, - 44091 - 44032: 0x8165, - 44092 - 44032: 0xB0BE, - 44093 - 44032: 0x8166, - 44094 - 44032: 0x8167, - 44095 - 44032: 0x8168, - 44096 - 44032: 0xB0BF, - 44097 - 44032: 0x8169, - 44098 - 44032: 0x816A, - 44099 - 44032: 0x816B, - 44100 - 44032: 0x816C, - 44101 - 44032: 0x816D, - 44102 - 44032: 0x816E, - 44103 - 44032: 0x816F, - 44104 - 44032: 0x8170, - 44105 - 44032: 0x8171, - 44106 - 44032: 0x8172, - 44107 - 44032: 0xB0C0, - 44108 - 44032: 0x8173, - 44109 - 44032: 0xB0C1, - 44110 - 44032: 0x8174, - 44111 - 44032: 0x8175, - 44112 - 44032: 0x8176, - 44113 - 44032: 0x8177, - 44114 - 44032: 0x8178, - 44115 - 44032: 0x8179, - 44116 - 44032: 0xB0C2, - 44117 - 44032: 0x817A, - 44118 - 44032: 0x8181, - 44119 - 44032: 0x8182, - 44120 - 44032: 0xB0C3, - 44121 - 44032: 0x8183, - 44122 - 44032: 0x8184, - 44123 - 44032: 0x8185, - 44124 - 44032: 0xB0C4, - 44125 - 44032: 0x8186, - 44126 - 44032: 0x8187, - 44127 - 44032: 0x8188, - 44128 - 44032: 0x8189, - 44129 - 44032: 0x818A, - 44130 - 44032: 0x818B, - 44131 - 44032: 0x818C, - 44132 - 44032: 0x818D, - 44133 - 44032: 0x818E, - 44134 - 44032: 0x818F, - 44135 - 44032: 0x8190, - 44136 - 44032: 0x8191, - 44137 - 44032: 0x8192, - 44138 - 44032: 0x8193, - 44139 - 44032: 0x8194, - 44140 - 44032: 0x8195, - 44141 - 44032: 0x8196, - 44142 - 44032: 0x8197, - 44143 - 44032: 0x8198, - 44144 - 44032: 0xB0C5, - 44145 - 44032: 0xB0C6, - 44146 - 44032: 0x8199, - 44147 - 44032: 0x819A, - 44148 - 44032: 0xB0C7, - 44149 - 44032: 0x819B, - 44150 - 44032: 0x819C, - 44151 - 44032: 0xB0C8, - 44152 - 44032: 0xB0C9, - 44153 - 44032: 0x819D, - 44154 - 44032: 0xB0CA, - 44155 - 44032: 0x819E, - 44156 - 44032: 0x819F, - 44157 - 44032: 0x81A0, - 44158 - 44032: 0x81A1, - 44159 - 44032: 0x81A2, - 44160 - 44032: 0xB0CB, - 44161 - 44032: 0xB0CC, - 44162 - 44032: 0x81A3, - 44163 - 44032: 0xB0CD, - 44164 - 44032: 0xB0CE, - 44165 - 44032: 0xB0CF, - 44166 - 44032: 0xB0D0, - 44167 - 44032: 0x81A4, - 44168 - 44032: 0x81A5, - 44169 - 44032: 0xB0D1, - 44170 - 44032: 0xB0D2, - 44171 - 44032: 0xB0D3, - 44172 - 44032: 0xB0D4, - 44173 - 44032: 0x81A6, - 44174 - 44032: 0x81A7, - 44175 - 44032: 0x81A8, - 44176 - 44032: 0xB0D5, - 44177 - 44032: 0x81A9, - 44178 - 44032: 0x81AA, - 44179 - 44032: 0x81AB, - 44180 - 44032: 0xB0D6, - 44181 - 44032: 0x81AC, - 44182 - 44032: 0x81AD, - 44183 - 44032: 0x81AE, - 44184 - 44032: 0x81AF, - 44185 - 44032: 0x81B0, - 44186 - 44032: 0x81B1, - 44187 - 44032: 0x81B2, - 44188 - 44032: 0xB0D7, - 44189 - 44032: 0xB0D8, - 44190 - 44032: 0x81B3, - 44191 - 44032: 0xB0D9, - 44192 - 44032: 0xB0DA, - 44193 - 44032: 0xB0DB, - 44194 - 44032: 0x81B4, - 44195 - 44032: 0x81B5, - 44196 - 44032: 0x81B6, - 44197 - 44032: 0x81B7, - 44198 - 44032: 0x81B8, - 44199 - 44032: 0x81B9, - 44200 - 44032: 0xB0DC, - 44201 - 44032: 0xB0DD, - 44202 - 44032: 0xB0DE, - 44203 - 44032: 0x81BA, - 44204 - 44032: 0xB0DF, - 44205 - 44032: 0x81BB, - 44206 - 44032: 0x81BC, - 44207 - 44032: 0xB0E0, - 44208 - 44032: 0xB0E1, - 44209 - 44032: 0x81BD, - 44210 - 44032: 0x81BE, - 44211 - 44032: 0x81BF, - 44212 - 44032: 0x81C0, - 44213 - 44032: 0x81C1, - 44214 - 44032: 0x81C2, - 44215 - 44032: 0x81C3, - 44216 - 44032: 0xB0E2, - 44217 - 44032: 0xB0E3, - 44218 - 44032: 0x81C4, - 44219 - 44032: 0xB0E4, - 44220 - 44032: 0xB0E5, - 44221 - 44032: 0xB0E6, - 44222 - 44032: 0x81C5, - 44223 - 44032: 0x81C6, - 44224 - 44032: 0x81C7, - 44225 - 44032: 0xB0E7, - 44226 - 44032: 0x81C8, - 44227 - 44032: 0x81C9, - 44228 - 44032: 0xB0E8, - 44229 - 44032: 0x81CA, - 44230 - 44032: 0x81CB, - 44231 - 44032: 0x81CC, - 44232 - 44032: 0xB0E9, - 44233 - 44032: 0x81CD, - 44234 - 44032: 0x81CE, - 44235 - 44032: 0x81CF, - 44236 - 44032: 0xB0EA, - 44237 - 44032: 0x81D0, - 44238 - 44032: 0x81D1, - 44239 - 44032: 0x81D2, - 44240 - 44032: 0x81D3, - 44241 - 44032: 0x81D4, - 44242 - 44032: 0x81D5, - 44243 - 44032: 0x81D6, - 44244 - 44032: 0x81D7, - 44245 - 44032: 0xB0EB, - 44246 - 44032: 0x81D8, - 44247 - 44032: 0xB0EC, - 44248 - 44032: 0x81D9, - 44249 - 44032: 0x81DA, - 44250 - 44032: 0x81DB, - 44251 - 44032: 0x81DC, - 44252 - 44032: 0x81DD, - 44253 - 44032: 0x81DE, - 44254 - 44032: 0x81DF, - 44255 - 44032: 0x81E0, - 44256 - 44032: 0xB0ED, - 44257 - 44032: 0xB0EE, - 44258 - 44032: 0x81E1, - 44259 - 44032: 0x81E2, - 44260 - 44032: 0xB0EF, - 44261 - 44032: 0x81E3, - 44262 - 44032: 0x81E4, - 44263 - 44032: 0xB0F0, - 44264 - 44032: 0xB0F1, - 44265 - 44032: 0x81E5, - 44266 - 44032: 0xB0F2, - 44267 - 44032: 0x81E6, - 44268 - 44032: 0xB0F3, - 44269 - 44032: 0x81E7, - 44270 - 44032: 0x81E8, - 44271 - 44032: 0xB0F4, - 44272 - 44032: 0xB0F5, - 44273 - 44032: 0xB0F6, - 44274 - 44032: 0x81E9, - 44275 - 44032: 0xB0F7, - 44276 - 44032: 0x81EA, - 44277 - 44032: 0xB0F8, - 44278 - 44032: 0xB0F9, - 44279 - 44032: 0x81EB, - 44280 - 44032: 0x81EC, - 44281 - 44032: 0x81ED, - 44282 - 44032: 0x81EE, - 44283 - 44032: 0x81EF, - 44284 - 44032: 0xB0FA, - 44285 - 44032: 0xB0FB, - 44286 - 44032: 0x81F0, - 44287 - 44032: 0x81F1, - 44288 - 44032: 0xB0FC, - 44289 - 44032: 0x81F2, - 44290 - 44032: 0x81F3, - 44291 - 44032: 0x81F4, - 44292 - 44032: 0xB0FD, - 44293 - 44032: 0x81F5, - 44294 - 44032: 0xB0FE, - 44295 - 44032: 0x81F6, - 44296 - 44032: 0x81F7, - 44297 - 44032: 0x81F8, - 44298 - 44032: 0x81F9, - 44299 - 44032: 0x81FA, - 44300 - 44032: 0xB1A1, - 44301 - 44032: 0xB1A2, - 44302 - 44032: 0x81FB, - 44303 - 44032: 0xB1A3, - 44304 - 44032: 0x81FC, - 44305 - 44032: 0xB1A4, - 44306 - 44032: 0x81FD, - 44307 - 44032: 0x81FE, - 44308 - 44032: 0x8241, - 44309 - 44032: 0x8242, - 44310 - 44032: 0x8243, - 44311 - 44032: 0x8244, - 44312 - 44032: 0xB1A5, - 44313 - 44032: 0x8245, - 44314 - 44032: 0x8246, - 44315 - 44032: 0x8247, - 44316 - 44032: 0xB1A6, - 44317 - 44032: 0x8248, - 44318 - 44032: 0x8249, - 44319 - 44032: 0x824A, - 44320 - 44032: 0xB1A7, - 44321 - 44032: 0x824B, - 44322 - 44032: 0x824C, - 44323 - 44032: 0x824D, - 44324 - 44032: 0x824E, - 44325 - 44032: 0x824F, - 44326 - 44032: 0x8250, - 44327 - 44032: 0x8251, - 44328 - 44032: 0x8252, - 44329 - 44032: 0xB1A8, - 44330 - 44032: 0x8253, - 44331 - 44032: 0x8254, - 44332 - 44032: 0xB1A9, - 44333 - 44032: 0xB1AA, - 44334 - 44032: 0x8255, - 44335 - 44032: 0x8256, - 44336 - 44032: 0x8257, - 44337 - 44032: 0x8258, - 44338 - 44032: 0x8259, - 44339 - 44032: 0x825A, - 44340 - 44032: 0xB1AB, - 44341 - 44032: 0xB1AC, - 44342 - 44032: 0x8261, - 44343 - 44032: 0x8262, - 44344 - 44032: 0xB1AD, - 44345 - 44032: 0x8263, - 44346 - 44032: 0x8264, - 44347 - 44032: 0x8265, - 44348 - 44032: 0xB1AE, - 44349 - 44032: 0x8266, - 44350 - 44032: 0x8267, - 44351 - 44032: 0x8268, - 44352 - 44032: 0x8269, - 44353 - 44032: 0x826A, - 44354 - 44032: 0x826B, - 44355 - 44032: 0x826C, - 44356 - 44032: 0xB1AF, - 44357 - 44032: 0xB1B0, - 44358 - 44032: 0x826D, - 44359 - 44032: 0xB1B1, - 44360 - 44032: 0x826E, - 44361 - 44032: 0xB1B2, - 44362 - 44032: 0x826F, - 44363 - 44032: 0x8270, - 44364 - 44032: 0x8271, - 44365 - 44032: 0x8272, - 44366 - 44032: 0x8273, - 44367 - 44032: 0x8274, - 44368 - 44032: 0xB1B3, - 44369 - 44032: 0x8275, - 44370 - 44032: 0x8276, - 44371 - 44032: 0x8277, - 44372 - 44032: 0xB1B4, - 44373 - 44032: 0x8278, - 44374 - 44032: 0x8279, - 44375 - 44032: 0x827A, - 44376 - 44032: 0xB1B5, - 44377 - 44032: 0x8281, - 44378 - 44032: 0x8282, - 44379 - 44032: 0x8283, - 44380 - 44032: 0x8284, - 44381 - 44032: 0x8285, - 44382 - 44032: 0x8286, - 44383 - 44032: 0x8287, - 44384 - 44032: 0x8288, - 44385 - 44032: 0xB1B6, - 44386 - 44032: 0x8289, - 44387 - 44032: 0xB1B7, - 44388 - 44032: 0x828A, - 44389 - 44032: 0x828B, - 44390 - 44032: 0x828C, - 44391 - 44032: 0x828D, - 44392 - 44032: 0x828E, - 44393 - 44032: 0x828F, - 44394 - 44032: 0x8290, - 44395 - 44032: 0x8291, - 44396 - 44032: 0xB1B8, - 44397 - 44032: 0xB1B9, - 44398 - 44032: 0x8292, - 44399 - 44032: 0x8293, - 44400 - 44032: 0xB1BA, - 44401 - 44032: 0x8294, - 44402 - 44032: 0x8295, - 44403 - 44032: 0xB1BB, - 44404 - 44032: 0xB1BC, - 44405 - 44032: 0xB1BD, - 44406 - 44032: 0xB1BE, - 44407 - 44032: 0x8296, - 44408 - 44032: 0x8297, - 44409 - 44032: 0x8298, - 44410 - 44032: 0x8299, - 44411 - 44032: 0xB1BF, - 44412 - 44032: 0xB1C0, - 44413 - 44032: 0xB1C1, - 44414 - 44032: 0x829A, - 44415 - 44032: 0xB1C2, - 44416 - 44032: 0x829B, - 44417 - 44032: 0xB1C3, - 44418 - 44032: 0xB1C4, - 44419 - 44032: 0x829C, - 44420 - 44032: 0x829D, - 44421 - 44032: 0x829E, - 44422 - 44032: 0x829F, - 44423 - 44032: 0x82A0, - 44424 - 44032: 0xB1C5, - 44425 - 44032: 0xB1C6, - 44426 - 44032: 0x82A1, - 44427 - 44032: 0x82A2, - 44428 - 44032: 0xB1C7, - 44429 - 44032: 0x82A3, - 44430 - 44032: 0x82A4, - 44431 - 44032: 0x82A5, - 44432 - 44032: 0xB1C8, - 44433 - 44032: 0x82A6, - 44434 - 44032: 0x82A7, - 44435 - 44032: 0x82A8, - 44436 - 44032: 0x82A9, - 44437 - 44032: 0x82AA, - 44438 - 44032: 0x82AB, - 44439 - 44032: 0x82AC, - 44440 - 44032: 0x82AD, - 44441 - 44032: 0x82AE, - 44442 - 44032: 0x82AF, - 44443 - 44032: 0x82B0, - 44444 - 44032: 0xB1C9, - 44445 - 44032: 0xB1CA, - 44446 - 44032: 0x82B1, - 44447 - 44032: 0x82B2, - 44448 - 44032: 0x82B3, - 44449 - 44032: 0x82B4, - 44450 - 44032: 0x82B5, - 44451 - 44032: 0x82B6, - 44452 - 44032: 0xB1CB, - 44453 - 44032: 0x82B7, - 44454 - 44032: 0x82B8, - 44455 - 44032: 0x82B9, - 44456 - 44032: 0x82BA, - 44457 - 44032: 0x82BB, - 44458 - 44032: 0x82BC, - 44459 - 44032: 0x82BD, - 44460 - 44032: 0x82BE, - 44461 - 44032: 0x82BF, - 44462 - 44032: 0x82C0, - 44463 - 44032: 0x82C1, - 44464 - 44032: 0x82C2, - 44465 - 44032: 0x82C3, - 44466 - 44032: 0x82C4, - 44467 - 44032: 0x82C5, - 44468 - 44032: 0x82C6, - 44469 - 44032: 0x82C7, - 44470 - 44032: 0x82C8, - 44471 - 44032: 0xB1CC, - 44472 - 44032: 0x82C9, - 44473 - 44032: 0x82CA, - 44474 - 44032: 0x82CB, - 44475 - 44032: 0x82CC, - 44476 - 44032: 0x82CD, - 44477 - 44032: 0x82CE, - 44478 - 44032: 0x82CF, - 44479 - 44032: 0x82D0, - 44480 - 44032: 0xB1CD, - 44481 - 44032: 0xB1CE, - 44482 - 44032: 0x82D1, - 44483 - 44032: 0x82D2, - 44484 - 44032: 0xB1CF, - 44485 - 44032: 0x82D3, - 44486 - 44032: 0x82D4, - 44487 - 44032: 0x82D5, - 44488 - 44032: 0xB1D0, - 44489 - 44032: 0x82D6, - 44490 - 44032: 0x82D7, - 44491 - 44032: 0x82D8, - 44492 - 44032: 0x82D9, - 44493 - 44032: 0x82DA, - 44494 - 44032: 0x82DB, - 44495 - 44032: 0x82DC, - 44496 - 44032: 0xB1D1, - 44497 - 44032: 0xB1D2, - 44498 - 44032: 0x82DD, - 44499 - 44032: 0xB1D3, - 44500 - 44032: 0x82DE, - 44501 - 44032: 0x82DF, - 44502 - 44032: 0x82E0, - 44503 - 44032: 0x82E1, - 44504 - 44032: 0x82E2, - 44505 - 44032: 0x82E3, - 44506 - 44032: 0x82E4, - 44507 - 44032: 0x82E5, - 44508 - 44032: 0xB1D4, - 44509 - 44032: 0x82E6, - 44510 - 44032: 0x82E7, - 44511 - 44032: 0x82E8, - 44512 - 44032: 0xB1D5, - 44513 - 44032: 0x82E9, - 44514 - 44032: 0x82EA, - 44515 - 44032: 0x82EB, - 44516 - 44032: 0xB1D6, - 44517 - 44032: 0x82EC, - 44518 - 44032: 0x82ED, - 44519 - 44032: 0x82EE, - 44520 - 44032: 0x82EF, - 44521 - 44032: 0x82F0, - 44522 - 44032: 0x82F1, - 44523 - 44032: 0x82F2, - 44524 - 44032: 0x82F3, - 44525 - 44032: 0x82F4, - 44526 - 44032: 0x82F5, - 44527 - 44032: 0x82F6, - 44528 - 44032: 0x82F7, - 44529 - 44032: 0x82F8, - 44530 - 44032: 0x82F9, - 44531 - 44032: 0x82FA, - 44532 - 44032: 0x82FB, - 44533 - 44032: 0x82FC, - 44534 - 44032: 0x82FD, - 44535 - 44032: 0x82FE, - 44536 - 44032: 0xB1D7, - 44537 - 44032: 0xB1D8, - 44538 - 44032: 0x8341, - 44539 - 44032: 0x8342, - 44540 - 44032: 0xB1D9, - 44541 - 44032: 0x8343, - 44542 - 44032: 0x8344, - 44543 - 44032: 0xB1DA, - 44544 - 44032: 0xB1DB, - 44545 - 44032: 0xB1DC, - 44546 - 44032: 0x8345, - 44547 - 44032: 0x8346, - 44548 - 44032: 0x8347, - 44549 - 44032: 0x8348, - 44550 - 44032: 0x8349, - 44551 - 44032: 0x834A, - 44552 - 44032: 0xB1DD, - 44553 - 44032: 0xB1DE, - 44554 - 44032: 0x834B, - 44555 - 44032: 0xB1DF, - 44556 - 44032: 0x834C, - 44557 - 44032: 0xB1E0, - 44558 - 44032: 0x834D, - 44559 - 44032: 0x834E, - 44560 - 44032: 0x834F, - 44561 - 44032: 0x8350, - 44562 - 44032: 0x8351, - 44563 - 44032: 0x8352, - 44564 - 44032: 0xB1E1, - 44565 - 44032: 0x8353, - 44566 - 44032: 0x8354, - 44567 - 44032: 0x8355, - 44568 - 44032: 0x8356, - 44569 - 44032: 0x8357, - 44570 - 44032: 0x8358, - 44571 - 44032: 0x8359, - 44572 - 44032: 0x835A, - 44573 - 44032: 0x8361, - 44574 - 44032: 0x8362, - 44575 - 44032: 0x8363, - 44576 - 44032: 0x8364, - 44577 - 44032: 0x8365, - 44578 - 44032: 0x8366, - 44579 - 44032: 0x8367, - 44580 - 44032: 0x8368, - 44581 - 44032: 0x8369, - 44582 - 44032: 0x836A, - 44583 - 44032: 0x836B, - 44584 - 44032: 0x836C, - 44585 - 44032: 0x836D, - 44586 - 44032: 0x836E, - 44587 - 44032: 0x836F, - 44588 - 44032: 0x8370, - 44589 - 44032: 0x8371, - 44590 - 44032: 0x8372, - 44591 - 44032: 0x8373, - 44592 - 44032: 0xB1E2, - 44593 - 44032: 0xB1E3, - 44594 - 44032: 0x8374, - 44595 - 44032: 0x8375, - 44596 - 44032: 0xB1E4, - 44597 - 44032: 0x8376, - 44598 - 44032: 0x8377, - 44599 - 44032: 0xB1E5, - 44600 - 44032: 0xB1E6, - 44601 - 44032: 0x8378, - 44602 - 44032: 0xB1E7, - 44603 - 44032: 0x8379, - 44604 - 44032: 0x837A, - 44605 - 44032: 0x8381, - 44606 - 44032: 0x8382, - 44607 - 44032: 0x8383, - 44608 - 44032: 0xB1E8, - 44609 - 44032: 0xB1E9, - 44610 - 44032: 0x8384, - 44611 - 44032: 0xB1EA, - 44612 - 44032: 0x8385, - 44613 - 44032: 0xB1EB, - 44614 - 44032: 0xB1EC, - 44615 - 44032: 0x8386, - 44616 - 44032: 0x8387, - 44617 - 44032: 0x8388, - 44618 - 44032: 0xB1ED, - 44619 - 44032: 0x8389, - 44620 - 44032: 0xB1EE, - 44621 - 44032: 0xB1EF, - 44622 - 44032: 0xB1F0, - 44623 - 44032: 0x838A, - 44624 - 44032: 0xB1F1, - 44625 - 44032: 0x838B, - 44626 - 44032: 0x838C, - 44627 - 44032: 0x838D, - 44628 - 44032: 0xB1F2, - 44629 - 44032: 0x838E, - 44630 - 44032: 0xB1F3, - 44631 - 44032: 0x838F, - 44632 - 44032: 0x8390, - 44633 - 44032: 0x8391, - 44634 - 44032: 0x8392, - 44635 - 44032: 0x8393, - 44636 - 44032: 0xB1F4, - 44637 - 44032: 0xB1F5, - 44638 - 44032: 0x8394, - 44639 - 44032: 0xB1F6, - 44640 - 44032: 0xB1F7, - 44641 - 44032: 0xB1F8, - 44642 - 44032: 0x8395, - 44643 - 44032: 0x8396, - 44644 - 44032: 0x8397, - 44645 - 44032: 0xB1F9, - 44646 - 44032: 0x8398, - 44647 - 44032: 0x8399, - 44648 - 44032: 0xB1FA, - 44649 - 44032: 0xB1FB, - 44650 - 44032: 0x839A, - 44651 - 44032: 0x839B, - 44652 - 44032: 0xB1FC, - 44653 - 44032: 0x839C, - 44654 - 44032: 0x839D, - 44655 - 44032: 0x839E, - 44656 - 44032: 0xB1FD, - 44657 - 44032: 0x839F, - 44658 - 44032: 0x83A0, - 44659 - 44032: 0x83A1, - 44660 - 44032: 0x83A2, - 44661 - 44032: 0x83A3, - 44662 - 44032: 0x83A4, - 44663 - 44032: 0x83A5, - 44664 - 44032: 0xB1FE, - 44665 - 44032: 0xB2A1, - 44666 - 44032: 0x83A6, - 44667 - 44032: 0xB2A2, - 44668 - 44032: 0xB2A3, - 44669 - 44032: 0xB2A4, - 44670 - 44032: 0x83A7, - 44671 - 44032: 0x83A8, - 44672 - 44032: 0x83A9, - 44673 - 44032: 0x83AA, - 44674 - 44032: 0x83AB, - 44675 - 44032: 0x83AC, - 44676 - 44032: 0xB2A5, - 44677 - 44032: 0xB2A6, - 44678 - 44032: 0x83AD, - 44679 - 44032: 0x83AE, - 44680 - 44032: 0x83AF, - 44681 - 44032: 0x83B0, - 44682 - 44032: 0x83B1, - 44683 - 44032: 0x83B2, - 44684 - 44032: 0xB2A7, - 44685 - 44032: 0x83B3, - 44686 - 44032: 0x83B4, - 44687 - 44032: 0x83B5, - 44688 - 44032: 0x83B6, - 44689 - 44032: 0x83B7, - 44690 - 44032: 0x83B8, - 44691 - 44032: 0x83B9, - 44692 - 44032: 0x83BA, - 44693 - 44032: 0x83BB, - 44694 - 44032: 0x83BC, - 44695 - 44032: 0x83BD, - 44696 - 44032: 0x83BE, - 44697 - 44032: 0x83BF, - 44698 - 44032: 0x83C0, - 44699 - 44032: 0x83C1, - 44700 - 44032: 0x83C2, - 44701 - 44032: 0x83C3, - 44702 - 44032: 0x83C4, - 44703 - 44032: 0x83C5, - 44704 - 44032: 0x83C6, - 44705 - 44032: 0x83C7, - 44706 - 44032: 0x83C8, - 44707 - 44032: 0x83C9, - 44708 - 44032: 0x83CA, - 44709 - 44032: 0x83CB, - 44710 - 44032: 0x83CC, - 44711 - 44032: 0x83CD, - 44712 - 44032: 0x83CE, - 44713 - 44032: 0x83CF, - 44714 - 44032: 0x83D0, - 44715 - 44032: 0x83D1, - 44716 - 44032: 0x83D2, - 44717 - 44032: 0x83D3, - 44718 - 44032: 0x83D4, - 44719 - 44032: 0x83D5, - 44720 - 44032: 0x83D6, - 44721 - 44032: 0x83D7, - 44722 - 44032: 0x83D8, - 44723 - 44032: 0x83D9, - 44724 - 44032: 0x83DA, - 44725 - 44032: 0x83DB, - 44726 - 44032: 0x83DC, - 44727 - 44032: 0x83DD, - 44728 - 44032: 0x83DE, - 44729 - 44032: 0x83DF, - 44730 - 44032: 0x83E0, - 44731 - 44032: 0x83E1, - 44732 - 44032: 0xB2A8, - 44733 - 44032: 0xB2A9, - 44734 - 44032: 0xB2AA, - 44735 - 44032: 0x83E2, - 44736 - 44032: 0xB2AB, - 44737 - 44032: 0x83E3, - 44738 - 44032: 0x83E4, - 44739 - 44032: 0x83E5, - 44740 - 44032: 0xB2AC, - 44741 - 44032: 0x83E6, - 44742 - 44032: 0x83E7, - 44743 - 44032: 0x83E8, - 44744 - 44032: 0x83E9, - 44745 - 44032: 0x83EA, - 44746 - 44032: 0x83EB, - 44747 - 44032: 0x83EC, - 44748 - 44032: 0xB2AD, - 44749 - 44032: 0xB2AE, - 44750 - 44032: 0x83ED, - 44751 - 44032: 0xB2AF, - 44752 - 44032: 0xB2B0, - 44753 - 44032: 0xB2B1, - 44754 - 44032: 0x83EE, - 44755 - 44032: 0x83EF, - 44756 - 44032: 0x83F0, - 44757 - 44032: 0x83F1, - 44758 - 44032: 0x83F2, - 44759 - 44032: 0x83F3, - 44760 - 44032: 0xB2B2, - 44761 - 44032: 0xB2B3, - 44762 - 44032: 0x83F4, - 44763 - 44032: 0x83F5, - 44764 - 44032: 0xB2B4, - 44765 - 44032: 0x83F6, - 44766 - 44032: 0x83F7, - 44767 - 44032: 0x83F8, - 44768 - 44032: 0x83F9, - 44769 - 44032: 0x83FA, - 44770 - 44032: 0x83FB, - 44771 - 44032: 0x83FC, - 44772 - 44032: 0x83FD, - 44773 - 44032: 0x83FE, - 44774 - 44032: 0x8441, - 44775 - 44032: 0x8442, - 44776 - 44032: 0xB2B5, - 44777 - 44032: 0x8443, - 44778 - 44032: 0x8444, - 44779 - 44032: 0xB2B6, - 44780 - 44032: 0x8445, - 44781 - 44032: 0xB2B7, - 44782 - 44032: 0x8446, - 44783 - 44032: 0x8447, - 44784 - 44032: 0x8448, - 44785 - 44032: 0x8449, - 44786 - 44032: 0x844A, - 44787 - 44032: 0x844B, - 44788 - 44032: 0xB2B8, - 44789 - 44032: 0x844C, - 44790 - 44032: 0x844D, - 44791 - 44032: 0x844E, - 44792 - 44032: 0xB2B9, - 44793 - 44032: 0x844F, - 44794 - 44032: 0x8450, - 44795 - 44032: 0x8451, - 44796 - 44032: 0xB2BA, - 44797 - 44032: 0x8452, - 44798 - 44032: 0x8453, - 44799 - 44032: 0x8454, - 44800 - 44032: 0x8455, - 44801 - 44032: 0x8456, - 44802 - 44032: 0x8457, - 44803 - 44032: 0x8458, - 44804 - 44032: 0x8459, - 44805 - 44032: 0x845A, - 44806 - 44032: 0x8461, - 44807 - 44032: 0xB2BB, - 44808 - 44032: 0xB2BC, - 44809 - 44032: 0x8462, - 44810 - 44032: 0x8463, - 44811 - 44032: 0x8464, - 44812 - 44032: 0x8465, - 44813 - 44032: 0xB2BD, - 44814 - 44032: 0x8466, - 44815 - 44032: 0x8467, - 44816 - 44032: 0xB2BE, - 44817 - 44032: 0x8468, - 44818 - 44032: 0x8469, - 44819 - 44032: 0x846A, - 44820 - 44032: 0x846B, - 44821 - 44032: 0x846C, - 44822 - 44032: 0x846D, - 44823 - 44032: 0x846E, - 44824 - 44032: 0x846F, - 44825 - 44032: 0x8470, - 44826 - 44032: 0x8471, - 44827 - 44032: 0x8472, - 44828 - 44032: 0x8473, - 44829 - 44032: 0x8474, - 44830 - 44032: 0x8475, - 44831 - 44032: 0x8476, - 44832 - 44032: 0x8477, - 44833 - 44032: 0x8478, - 44834 - 44032: 0x8479, - 44835 - 44032: 0x847A, - 44836 - 44032: 0x8481, - 44837 - 44032: 0x8482, - 44838 - 44032: 0x8483, - 44839 - 44032: 0x8484, - 44840 - 44032: 0x8485, - 44841 - 44032: 0x8486, - 44842 - 44032: 0x8487, - 44843 - 44032: 0x8488, - 44844 - 44032: 0xB2BF, - 44845 - 44032: 0xB2C0, - 44846 - 44032: 0x8489, - 44847 - 44032: 0x848A, - 44848 - 44032: 0xB2C1, - 44849 - 44032: 0x848B, - 44850 - 44032: 0xB2C2, - 44851 - 44032: 0x848C, - 44852 - 44032: 0xB2C3, - 44853 - 44032: 0x848D, - 44854 - 44032: 0x848E, - 44855 - 44032: 0x848F, - 44856 - 44032: 0x8490, - 44857 - 44032: 0x8491, - 44858 - 44032: 0x8492, - 44859 - 44032: 0x8493, - 44860 - 44032: 0xB2C4, - 44861 - 44032: 0xB2C5, - 44862 - 44032: 0x8494, - 44863 - 44032: 0xB2C6, - 44864 - 44032: 0x8495, - 44865 - 44032: 0xB2C7, - 44866 - 44032: 0xB2C8, - 44867 - 44032: 0xB2C9, - 44868 - 44032: 0x8496, - 44869 - 44032: 0x8497, - 44870 - 44032: 0x8498, - 44871 - 44032: 0x8499, - 44872 - 44032: 0xB2CA, - 44873 - 44032: 0xB2CB, - 44874 - 44032: 0x849A, - 44875 - 44032: 0x849B, - 44876 - 44032: 0x849C, - 44877 - 44032: 0x849D, - 44878 - 44032: 0x849E, - 44879 - 44032: 0x849F, - 44880 - 44032: 0xB2CC, - 44881 - 44032: 0x84A0, - 44882 - 44032: 0x84A1, - 44883 - 44032: 0x84A2, - 44884 - 44032: 0x84A3, - 44885 - 44032: 0x84A4, - 44886 - 44032: 0x84A5, - 44887 - 44032: 0x84A6, - 44888 - 44032: 0x84A7, - 44889 - 44032: 0x84A8, - 44890 - 44032: 0x84A9, - 44891 - 44032: 0x84AA, - 44892 - 44032: 0xB2CD, - 44893 - 44032: 0xB2CE, - 44894 - 44032: 0x84AB, - 44895 - 44032: 0x84AC, - 44896 - 44032: 0x84AD, - 44897 - 44032: 0x84AE, - 44898 - 44032: 0x84AF, - 44899 - 44032: 0x84B0, - 44900 - 44032: 0xB2CF, - 44901 - 44032: 0xB2D0, - 44902 - 44032: 0x84B1, - 44903 - 44032: 0x84B2, - 44904 - 44032: 0x84B3, - 44905 - 44032: 0x84B4, - 44906 - 44032: 0x84B5, - 44907 - 44032: 0x84B6, - 44908 - 44032: 0x84B7, - 44909 - 44032: 0x84B8, - 44910 - 44032: 0x84B9, - 44911 - 44032: 0x84BA, - 44912 - 44032: 0x84BB, - 44913 - 44032: 0x84BC, - 44914 - 44032: 0x84BD, - 44915 - 44032: 0x84BE, - 44916 - 44032: 0x84BF, - 44917 - 44032: 0x84C0, - 44918 - 44032: 0x84C1, - 44919 - 44032: 0x84C2, - 44920 - 44032: 0x84C3, - 44921 - 44032: 0xB2D1, - 44922 - 44032: 0x84C4, - 44923 - 44032: 0x84C5, - 44924 - 44032: 0x84C6, - 44925 - 44032: 0x84C7, - 44926 - 44032: 0x84C8, - 44927 - 44032: 0x84C9, - 44928 - 44032: 0xB2D2, - 44929 - 44032: 0x84CA, - 44930 - 44032: 0x84CB, - 44931 - 44032: 0x84CC, - 44932 - 44032: 0xB2D3, - 44933 - 44032: 0x84CD, - 44934 - 44032: 0x84CE, - 44935 - 44032: 0x84CF, - 44936 - 44032: 0xB2D4, - 44937 - 44032: 0x84D0, - 44938 - 44032: 0x84D1, - 44939 - 44032: 0x84D2, - 44940 - 44032: 0x84D3, - 44941 - 44032: 0x84D4, - 44942 - 44032: 0x84D5, - 44943 - 44032: 0x84D6, - 44944 - 44032: 0xB2D5, - 44945 - 44032: 0xB2D6, - 44946 - 44032: 0x84D7, - 44947 - 44032: 0x84D8, - 44948 - 44032: 0x84D9, - 44949 - 44032: 0xB2D7, - 44950 - 44032: 0x84DA, - 44951 - 44032: 0x84DB, - 44952 - 44032: 0x84DC, - 44953 - 44032: 0x84DD, - 44954 - 44032: 0x84DE, - 44955 - 44032: 0x84DF, - 44956 - 44032: 0xB2D8, - 44957 - 44032: 0x84E0, - 44958 - 44032: 0x84E1, - 44959 - 44032: 0x84E2, - 44960 - 44032: 0x84E3, - 44961 - 44032: 0x84E4, - 44962 - 44032: 0x84E5, - 44963 - 44032: 0x84E6, - 44964 - 44032: 0x84E7, - 44965 - 44032: 0x84E8, - 44966 - 44032: 0x84E9, - 44967 - 44032: 0x84EA, - 44968 - 44032: 0x84EB, - 44969 - 44032: 0x84EC, - 44970 - 44032: 0x84ED, - 44971 - 44032: 0x84EE, - 44972 - 44032: 0x84EF, - 44973 - 44032: 0x84F0, - 44974 - 44032: 0x84F1, - 44975 - 44032: 0x84F2, - 44976 - 44032: 0x84F3, - 44977 - 44032: 0x84F4, - 44978 - 44032: 0x84F5, - 44979 - 44032: 0x84F6, - 44980 - 44032: 0x84F7, - 44981 - 44032: 0x84F8, - 44982 - 44032: 0x84F9, - 44983 - 44032: 0x84FA, - 44984 - 44032: 0xB2D9, - 44985 - 44032: 0xB2DA, - 44986 - 44032: 0x84FB, - 44987 - 44032: 0x84FC, - 44988 - 44032: 0xB2DB, - 44989 - 44032: 0x84FD, - 44990 - 44032: 0x84FE, - 44991 - 44032: 0x8541, - 44992 - 44032: 0xB2DC, - 44993 - 44032: 0x8542, - 44994 - 44032: 0x8543, - 44995 - 44032: 0x8544, - 44996 - 44032: 0x8545, - 44997 - 44032: 0x8546, - 44998 - 44032: 0x8547, - 44999 - 44032: 0xB2DD, - 45000 - 44032: 0xB2DE, - 45001 - 44032: 0xB2DF, - 45002 - 44032: 0x8548, - 45003 - 44032: 0xB2E0, - 45004 - 44032: 0x8549, - 45005 - 44032: 0xB2E1, - 45006 - 44032: 0xB2E2, - 45007 - 44032: 0x854A, - 45008 - 44032: 0x854B, - 45009 - 44032: 0x854C, - 45010 - 44032: 0x854D, - 45011 - 44032: 0x854E, - 45012 - 44032: 0xB2E3, - 45013 - 44032: 0x854F, - 45014 - 44032: 0x8550, - 45015 - 44032: 0x8551, - 45016 - 44032: 0x8552, - 45017 - 44032: 0x8553, - 45018 - 44032: 0x8554, - 45019 - 44032: 0x8555, - 45020 - 44032: 0xB2E4, - 45021 - 44032: 0x8556, - 45022 - 44032: 0x8557, - 45023 - 44032: 0x8558, - 45024 - 44032: 0x8559, - 45025 - 44032: 0x855A, - 45026 - 44032: 0x8561, - 45027 - 44032: 0x8562, - 45028 - 44032: 0x8563, - 45029 - 44032: 0x8564, - 45030 - 44032: 0x8565, - 45031 - 44032: 0x8566, - 45032 - 44032: 0xB2E5, - 45033 - 44032: 0xB2E6, - 45034 - 44032: 0x8567, - 45035 - 44032: 0x8568, - 45036 - 44032: 0x8569, - 45037 - 44032: 0x856A, - 45038 - 44032: 0x856B, - 45039 - 44032: 0x856C, - 45040 - 44032: 0xB2E7, - 45041 - 44032: 0xB2E8, - 45042 - 44032: 0x856D, - 45043 - 44032: 0x856E, - 45044 - 44032: 0xB2E9, - 45045 - 44032: 0x856F, - 45046 - 44032: 0x8570, - 45047 - 44032: 0x8571, - 45048 - 44032: 0xB2EA, - 45049 - 44032: 0x8572, - 45050 - 44032: 0x8573, - 45051 - 44032: 0x8574, - 45052 - 44032: 0x8575, - 45053 - 44032: 0x8576, - 45054 - 44032: 0x8577, - 45055 - 44032: 0x8578, - 45056 - 44032: 0xB2EB, - 45057 - 44032: 0xB2EC, - 45058 - 44032: 0x8579, - 45059 - 44032: 0x857A, - 45060 - 44032: 0xB2ED, - 45061 - 44032: 0x8581, - 45062 - 44032: 0x8582, - 45063 - 44032: 0x8583, - 45064 - 44032: 0x8584, - 45065 - 44032: 0x8585, - 45066 - 44032: 0x8586, - 45067 - 44032: 0x8587, - 45068 - 44032: 0xB2EE, - 45069 - 44032: 0x8588, - 45070 - 44032: 0x8589, - 45071 - 44032: 0x858A, - 45072 - 44032: 0xB2EF, - 45073 - 44032: 0x858B, - 45074 - 44032: 0x858C, - 45075 - 44032: 0x858D, - 45076 - 44032: 0xB2F0, - 45077 - 44032: 0x858E, - 45078 - 44032: 0x858F, - 45079 - 44032: 0x8590, - 45080 - 44032: 0x8591, - 45081 - 44032: 0x8592, - 45082 - 44032: 0x8593, - 45083 - 44032: 0x8594, - 45084 - 44032: 0xB2F1, - 45085 - 44032: 0xB2F2, - 45086 - 44032: 0x8595, - 45087 - 44032: 0x8596, - 45088 - 44032: 0x8597, - 45089 - 44032: 0x8598, - 45090 - 44032: 0x8599, - 45091 - 44032: 0x859A, - 45092 - 44032: 0x859B, - 45093 - 44032: 0x859C, - 45094 - 44032: 0x859D, - 45095 - 44032: 0x859E, - 45096 - 44032: 0xB2F3, - 45097 - 44032: 0x859F, - 45098 - 44032: 0x85A0, - 45099 - 44032: 0x85A1, - 45100 - 44032: 0x85A2, - 45101 - 44032: 0x85A3, - 45102 - 44032: 0x85A4, - 45103 - 44032: 0x85A5, - 45104 - 44032: 0x85A6, - 45105 - 44032: 0x85A7, - 45106 - 44032: 0x85A8, - 45107 - 44032: 0x85A9, - 45108 - 44032: 0x85AA, - 45109 - 44032: 0x85AB, - 45110 - 44032: 0x85AC, - 45111 - 44032: 0x85AD, - 45112 - 44032: 0x85AE, - 45113 - 44032: 0x85AF, - 45114 - 44032: 0x85B0, - 45115 - 44032: 0x85B1, - 45116 - 44032: 0x85B2, - 45117 - 44032: 0x85B3, - 45118 - 44032: 0x85B4, - 45119 - 44032: 0x85B5, - 45120 - 44032: 0x85B6, - 45121 - 44032: 0x85B7, - 45122 - 44032: 0x85B8, - 45123 - 44032: 0x85B9, - 45124 - 44032: 0xB2F4, - 45125 - 44032: 0xB2F5, - 45126 - 44032: 0x85BA, - 45127 - 44032: 0x85BB, - 45128 - 44032: 0xB2F6, - 45129 - 44032: 0x85BC, - 45130 - 44032: 0xB2F7, - 45131 - 44032: 0x85BD, - 45132 - 44032: 0xB2F8, - 45133 - 44032: 0x85BE, - 45134 - 44032: 0xB2F9, - 45135 - 44032: 0x85BF, - 45136 - 44032: 0x85C0, - 45137 - 44032: 0x85C1, - 45138 - 44032: 0x85C2, - 45139 - 44032: 0xB2FA, - 45140 - 44032: 0xB2FB, - 45141 - 44032: 0xB2FC, - 45142 - 44032: 0x85C3, - 45143 - 44032: 0xB2FD, - 45144 - 44032: 0x85C4, - 45145 - 44032: 0xB2FE, - 45146 - 44032: 0x85C5, - 45147 - 44032: 0x85C6, - 45148 - 44032: 0x85C7, - 45149 - 44032: 0xB3A1, - 45150 - 44032: 0x85C8, - 45151 - 44032: 0x85C9, - 45152 - 44032: 0x85CA, - 45153 - 44032: 0x85CB, - 45154 - 44032: 0x85CC, - 45155 - 44032: 0x85CD, - 45156 - 44032: 0x85CE, - 45157 - 44032: 0x85CF, - 45158 - 44032: 0x85D0, - 45159 - 44032: 0x85D1, - 45160 - 44032: 0x85D2, - 45161 - 44032: 0x85D3, - 45162 - 44032: 0x85D4, - 45163 - 44032: 0x85D5, - 45164 - 44032: 0x85D6, - 45165 - 44032: 0x85D7, - 45166 - 44032: 0x85D8, - 45167 - 44032: 0x85D9, - 45168 - 44032: 0x85DA, - 45169 - 44032: 0x85DB, - 45170 - 44032: 0x85DC, - 45171 - 44032: 0x85DD, - 45172 - 44032: 0x85DE, - 45173 - 44032: 0x85DF, - 45174 - 44032: 0x85E0, - 45175 - 44032: 0x85E1, - 45176 - 44032: 0x85E2, - 45177 - 44032: 0x85E3, - 45178 - 44032: 0x85E4, - 45179 - 44032: 0x85E5, - 45180 - 44032: 0xB3A2, - 45181 - 44032: 0xB3A3, - 45182 - 44032: 0x85E6, - 45183 - 44032: 0x85E7, - 45184 - 44032: 0xB3A4, - 45185 - 44032: 0x85E8, - 45186 - 44032: 0x85E9, - 45187 - 44032: 0x85EA, - 45188 - 44032: 0xB3A5, - 45189 - 44032: 0x85EB, - 45190 - 44032: 0x85EC, - 45191 - 44032: 0x85ED, - 45192 - 44032: 0x85EE, - 45193 - 44032: 0x85EF, - 45194 - 44032: 0x85F0, - 45195 - 44032: 0x85F1, - 45196 - 44032: 0xB3A6, - 45197 - 44032: 0xB3A7, - 45198 - 44032: 0x85F2, - 45199 - 44032: 0xB3A8, - 45200 - 44032: 0x85F3, - 45201 - 44032: 0xB3A9, - 45202 - 44032: 0x85F4, - 45203 - 44032: 0x85F5, - 45204 - 44032: 0x85F6, - 45205 - 44032: 0x85F7, - 45206 - 44032: 0x85F8, - 45207 - 44032: 0x85F9, - 45208 - 44032: 0xB3AA, - 45209 - 44032: 0xB3AB, - 45210 - 44032: 0xB3AC, - 45211 - 44032: 0x85FA, - 45212 - 44032: 0xB3AD, - 45213 - 44032: 0x85FB, - 45214 - 44032: 0x85FC, - 45215 - 44032: 0xB3AE, - 45216 - 44032: 0xB3AF, - 45217 - 44032: 0xB3B0, - 45218 - 44032: 0xB3B1, - 45219 - 44032: 0x85FD, - 45220 - 44032: 0x85FE, - 45221 - 44032: 0x8641, - 45222 - 44032: 0x8642, - 45223 - 44032: 0x8643, - 45224 - 44032: 0xB3B2, - 45225 - 44032: 0xB3B3, - 45226 - 44032: 0x8644, - 45227 - 44032: 0xB3B4, - 45228 - 44032: 0xB3B5, - 45229 - 44032: 0xB3B6, - 45230 - 44032: 0xB3B7, - 45231 - 44032: 0xB3B8, - 45232 - 44032: 0x8645, - 45233 - 44032: 0xB3B9, - 45234 - 44032: 0x8646, - 45235 - 44032: 0xB3BA, - 45236 - 44032: 0xB3BB, - 45237 - 44032: 0xB3BC, - 45238 - 44032: 0x8647, - 45239 - 44032: 0x8648, - 45240 - 44032: 0xB3BD, - 45241 - 44032: 0x8649, - 45242 - 44032: 0x864A, - 45243 - 44032: 0x864B, - 45244 - 44032: 0xB3BE, - 45245 - 44032: 0x864C, - 45246 - 44032: 0x864D, - 45247 - 44032: 0x864E, - 45248 - 44032: 0x864F, - 45249 - 44032: 0x8650, - 45250 - 44032: 0x8651, - 45251 - 44032: 0x8652, - 45252 - 44032: 0xB3BF, - 45253 - 44032: 0xB3C0, - 45254 - 44032: 0x8653, - 45255 - 44032: 0xB3C1, - 45256 - 44032: 0xB3C2, - 45257 - 44032: 0xB3C3, - 45258 - 44032: 0x8654, - 45259 - 44032: 0x8655, - 45260 - 44032: 0x8656, - 45261 - 44032: 0x8657, - 45262 - 44032: 0x8658, - 45263 - 44032: 0x8659, - 45264 - 44032: 0xB3C4, - 45265 - 44032: 0xB3C5, - 45266 - 44032: 0x865A, - 45267 - 44032: 0x8661, - 45268 - 44032: 0xB3C6, - 45269 - 44032: 0x8662, - 45270 - 44032: 0x8663, - 45271 - 44032: 0x8664, - 45272 - 44032: 0xB3C7, - 45273 - 44032: 0x8665, - 45274 - 44032: 0x8666, - 45275 - 44032: 0x8667, - 45276 - 44032: 0x8668, - 45277 - 44032: 0x8669, - 45278 - 44032: 0x866A, - 45279 - 44032: 0x866B, - 45280 - 44032: 0xB3C8, - 45281 - 44032: 0x866C, - 45282 - 44032: 0x866D, - 45283 - 44032: 0x866E, - 45284 - 44032: 0x866F, - 45285 - 44032: 0xB3C9, - 45286 - 44032: 0x8670, - 45287 - 44032: 0x8671, - 45288 - 44032: 0x8672, - 45289 - 44032: 0x8673, - 45290 - 44032: 0x8674, - 45291 - 44032: 0x8675, - 45292 - 44032: 0x8676, - 45293 - 44032: 0x8677, - 45294 - 44032: 0x8678, - 45295 - 44032: 0x8679, - 45296 - 44032: 0x867A, - 45297 - 44032: 0x8681, - 45298 - 44032: 0x8682, - 45299 - 44032: 0x8683, - 45300 - 44032: 0x8684, - 45301 - 44032: 0x8685, - 45302 - 44032: 0x8686, - 45303 - 44032: 0x8687, - 45304 - 44032: 0x8688, - 45305 - 44032: 0x8689, - 45306 - 44032: 0x868A, - 45307 - 44032: 0x868B, - 45308 - 44032: 0x868C, - 45309 - 44032: 0x868D, - 45310 - 44032: 0x868E, - 45311 - 44032: 0x868F, - 45312 - 44032: 0x8690, - 45313 - 44032: 0x8691, - 45314 - 44032: 0x8692, - 45315 - 44032: 0x8693, - 45316 - 44032: 0x8694, - 45317 - 44032: 0x8695, - 45318 - 44032: 0x8696, - 45319 - 44032: 0x8697, - 45320 - 44032: 0xB3CA, - 45321 - 44032: 0xB3CB, - 45322 - 44032: 0x8698, - 45323 - 44032: 0xB3CC, - 45324 - 44032: 0xB3CD, - 45325 - 44032: 0x8699, - 45326 - 44032: 0x869A, - 45327 - 44032: 0x869B, - 45328 - 44032: 0xB3CE, - 45329 - 44032: 0x869C, - 45330 - 44032: 0xB3CF, - 45331 - 44032: 0xB3D0, - 45332 - 44032: 0x869D, - 45333 - 44032: 0x869E, - 45334 - 44032: 0x869F, - 45335 - 44032: 0x86A0, - 45336 - 44032: 0xB3D1, - 45337 - 44032: 0xB3D2, - 45338 - 44032: 0x86A1, - 45339 - 44032: 0xB3D3, - 45340 - 44032: 0xB3D4, - 45341 - 44032: 0xB3D5, - 45342 - 44032: 0x86A2, - 45343 - 44032: 0x86A3, - 45344 - 44032: 0x86A4, - 45345 - 44032: 0x86A5, - 45346 - 44032: 0x86A6, - 45347 - 44032: 0xB3D6, - 45348 - 44032: 0xB3D7, - 45349 - 44032: 0xB3D8, - 45350 - 44032: 0x86A7, - 45351 - 44032: 0x86A8, - 45352 - 44032: 0xB3D9, - 45353 - 44032: 0x86A9, - 45354 - 44032: 0x86AA, - 45355 - 44032: 0x86AB, - 45356 - 44032: 0xB3DA, - 45357 - 44032: 0x86AC, - 45358 - 44032: 0x86AD, - 45359 - 44032: 0x86AE, - 45360 - 44032: 0x86AF, - 45361 - 44032: 0x86B0, - 45362 - 44032: 0x86B1, - 45363 - 44032: 0x86B2, - 45364 - 44032: 0xB3DB, - 45365 - 44032: 0xB3DC, - 45366 - 44032: 0x86B3, - 45367 - 44032: 0xB3DD, - 45368 - 44032: 0xB3DE, - 45369 - 44032: 0xB3DF, - 45370 - 44032: 0x86B4, - 45371 - 44032: 0x86B5, - 45372 - 44032: 0x86B6, - 45373 - 44032: 0x86B7, - 45374 - 44032: 0x86B8, - 45375 - 44032: 0x86B9, - 45376 - 44032: 0xB3E0, - 45377 - 44032: 0xB3E1, - 45378 - 44032: 0x86BA, - 45379 - 44032: 0x86BB, - 45380 - 44032: 0xB3E2, - 45381 - 44032: 0x86BC, - 45382 - 44032: 0x86BD, - 45383 - 44032: 0x86BE, - 45384 - 44032: 0xB3E3, - 45385 - 44032: 0x86BF, - 45386 - 44032: 0x86C0, - 45387 - 44032: 0x86C1, - 45388 - 44032: 0x86C2, - 45389 - 44032: 0x86C3, - 45390 - 44032: 0x86C4, - 45391 - 44032: 0x86C5, - 45392 - 44032: 0xB3E4, - 45393 - 44032: 0xB3E5, - 45394 - 44032: 0x86C6, - 45395 - 44032: 0x86C7, - 45396 - 44032: 0xB3E6, - 45397 - 44032: 0xB3E7, - 45398 - 44032: 0x86C8, - 45399 - 44032: 0x86C9, - 45400 - 44032: 0xB3E8, - 45401 - 44032: 0x86CA, - 45402 - 44032: 0x86CB, - 45403 - 44032: 0x86CC, - 45404 - 44032: 0xB3E9, - 45405 - 44032: 0x86CD, - 45406 - 44032: 0x86CE, - 45407 - 44032: 0x86CF, - 45408 - 44032: 0xB3EA, - 45409 - 44032: 0x86D0, - 45410 - 44032: 0x86D1, - 45411 - 44032: 0x86D2, - 45412 - 44032: 0x86D3, - 45413 - 44032: 0x86D4, - 45414 - 44032: 0x86D5, - 45415 - 44032: 0x86D6, - 45416 - 44032: 0x86D7, - 45417 - 44032: 0x86D8, - 45418 - 44032: 0x86D9, - 45419 - 44032: 0x86DA, - 45420 - 44032: 0x86DB, - 45421 - 44032: 0x86DC, - 45422 - 44032: 0x86DD, - 45423 - 44032: 0x86DE, - 45424 - 44032: 0x86DF, - 45425 - 44032: 0x86E0, - 45426 - 44032: 0x86E1, - 45427 - 44032: 0x86E2, - 45428 - 44032: 0x86E3, - 45429 - 44032: 0x86E4, - 45430 - 44032: 0x86E5, - 45431 - 44032: 0x86E6, - 45432 - 44032: 0xB3EB, - 45433 - 44032: 0xB3EC, - 45434 - 44032: 0x86E7, - 45435 - 44032: 0x86E8, - 45436 - 44032: 0xB3ED, - 45437 - 44032: 0x86E9, - 45438 - 44032: 0x86EA, - 45439 - 44032: 0x86EB, - 45440 - 44032: 0xB3EE, - 45441 - 44032: 0x86EC, - 45442 - 44032: 0xB3EF, - 45443 - 44032: 0x86ED, - 45444 - 44032: 0x86EE, - 45445 - 44032: 0x86EF, - 45446 - 44032: 0x86F0, - 45447 - 44032: 0x86F1, - 45448 - 44032: 0xB3F0, - 45449 - 44032: 0xB3F1, - 45450 - 44032: 0x86F2, - 45451 - 44032: 0xB3F2, - 45452 - 44032: 0x86F3, - 45453 - 44032: 0xB3F3, - 45454 - 44032: 0x86F4, - 45455 - 44032: 0x86F5, - 45456 - 44032: 0x86F6, - 45457 - 44032: 0x86F7, - 45458 - 44032: 0xB3F4, - 45459 - 44032: 0xB3F5, - 45460 - 44032: 0xB3F6, - 45461 - 44032: 0x86F8, - 45462 - 44032: 0x86F9, - 45463 - 44032: 0x86FA, - 45464 - 44032: 0xB3F7, - 45465 - 44032: 0x86FB, - 45466 - 44032: 0x86FC, - 45467 - 44032: 0x86FD, - 45468 - 44032: 0xB3F8, - 45469 - 44032: 0x86FE, - 45470 - 44032: 0x8741, - 45471 - 44032: 0x8742, - 45472 - 44032: 0x8743, - 45473 - 44032: 0x8744, - 45474 - 44032: 0x8745, - 45475 - 44032: 0x8746, - 45476 - 44032: 0x8747, - 45477 - 44032: 0x8748, - 45478 - 44032: 0x8749, - 45479 - 44032: 0x874A, - 45480 - 44032: 0xB3F9, - 45481 - 44032: 0x874B, - 45482 - 44032: 0x874C, - 45483 - 44032: 0x874D, - 45484 - 44032: 0x874E, - 45485 - 44032: 0x874F, - 45486 - 44032: 0x8750, - 45487 - 44032: 0x8751, - 45488 - 44032: 0x8752, - 45489 - 44032: 0x8753, - 45490 - 44032: 0x8754, - 45491 - 44032: 0x8755, - 45492 - 44032: 0x8756, - 45493 - 44032: 0x8757, - 45494 - 44032: 0x8758, - 45495 - 44032: 0x8759, - 45496 - 44032: 0x875A, - 45497 - 44032: 0x8761, - 45498 - 44032: 0x8762, - 45499 - 44032: 0x8763, - 45500 - 44032: 0x8764, - 45501 - 44032: 0x8765, - 45502 - 44032: 0x8766, - 45503 - 44032: 0x8767, - 45504 - 44032: 0x8768, - 45505 - 44032: 0x8769, - 45506 - 44032: 0x876A, - 45507 - 44032: 0x876B, - 45508 - 44032: 0x876C, - 45509 - 44032: 0x876D, - 45510 - 44032: 0x876E, - 45511 - 44032: 0x876F, - 45512 - 44032: 0x8770, - 45513 - 44032: 0x8771, - 45514 - 44032: 0x8772, - 45515 - 44032: 0x8773, - 45516 - 44032: 0xB3FA, - 45517 - 44032: 0x8774, - 45518 - 44032: 0x8775, - 45519 - 44032: 0x8776, - 45520 - 44032: 0xB3FB, - 45521 - 44032: 0x8777, - 45522 - 44032: 0x8778, - 45523 - 44032: 0x8779, - 45524 - 44032: 0xB3FC, - 45525 - 44032: 0x877A, - 45526 - 44032: 0x8781, - 45527 - 44032: 0x8782, - 45528 - 44032: 0x8783, - 45529 - 44032: 0x8784, - 45530 - 44032: 0x8785, - 45531 - 44032: 0x8786, - 45532 - 44032: 0xB3FD, - 45533 - 44032: 0xB3FE, - 45534 - 44032: 0x8787, - 45535 - 44032: 0xB4A1, - 45536 - 44032: 0x8788, - 45537 - 44032: 0x8789, - 45538 - 44032: 0x878A, - 45539 - 44032: 0x878B, - 45540 - 44032: 0x878C, - 45541 - 44032: 0x878D, - 45542 - 44032: 0x878E, - 45543 - 44032: 0x878F, - 45544 - 44032: 0xB4A2, - 45545 - 44032: 0xB4A3, - 45546 - 44032: 0x8790, - 45547 - 44032: 0x8791, - 45548 - 44032: 0xB4A4, - 45549 - 44032: 0x8792, - 45550 - 44032: 0x8793, - 45551 - 44032: 0x8794, - 45552 - 44032: 0xB4A5, - 45553 - 44032: 0x8795, - 45554 - 44032: 0x8796, - 45555 - 44032: 0x8797, - 45556 - 44032: 0x8798, - 45557 - 44032: 0x8799, - 45558 - 44032: 0x879A, - 45559 - 44032: 0x879B, - 45560 - 44032: 0x879C, - 45561 - 44032: 0xB4A6, - 45562 - 44032: 0x879D, - 45563 - 44032: 0xB4A7, - 45564 - 44032: 0x879E, - 45565 - 44032: 0xB4A8, - 45566 - 44032: 0x879F, - 45567 - 44032: 0x87A0, - 45568 - 44032: 0x87A1, - 45569 - 44032: 0x87A2, - 45570 - 44032: 0x87A3, - 45571 - 44032: 0x87A4, - 45572 - 44032: 0xB4A9, - 45573 - 44032: 0xB4AA, - 45574 - 44032: 0x87A5, - 45575 - 44032: 0x87A6, - 45576 - 44032: 0xB4AB, - 45577 - 44032: 0x87A7, - 45578 - 44032: 0x87A8, - 45579 - 44032: 0xB4AC, - 45580 - 44032: 0xB4AD, - 45581 - 44032: 0x87A9, - 45582 - 44032: 0x87AA, - 45583 - 44032: 0x87AB, - 45584 - 44032: 0x87AC, - 45585 - 44032: 0x87AD, - 45586 - 44032: 0x87AE, - 45587 - 44032: 0x87AF, - 45588 - 44032: 0xB4AE, - 45589 - 44032: 0xB4AF, - 45590 - 44032: 0x87B0, - 45591 - 44032: 0xB4B0, - 45592 - 44032: 0x87B1, - 45593 - 44032: 0xB4B1, - 45594 - 44032: 0x87B2, - 45595 - 44032: 0x87B3, - 45596 - 44032: 0x87B4, - 45597 - 44032: 0x87B5, - 45598 - 44032: 0x87B6, - 45599 - 44032: 0x87B7, - 45600 - 44032: 0xB4B2, - 45601 - 44032: 0x87B8, - 45602 - 44032: 0x87B9, - 45603 - 44032: 0x87BA, - 45604 - 44032: 0x87BB, - 45605 - 44032: 0x87BC, - 45606 - 44032: 0x87BD, - 45607 - 44032: 0x87BE, - 45608 - 44032: 0x87BF, - 45609 - 44032: 0x87C0, - 45610 - 44032: 0x87C1, - 45611 - 44032: 0x87C2, - 45612 - 44032: 0x87C3, - 45613 - 44032: 0x87C4, - 45614 - 44032: 0x87C5, - 45615 - 44032: 0x87C6, - 45616 - 44032: 0x87C7, - 45617 - 44032: 0x87C8, - 45618 - 44032: 0x87C9, - 45619 - 44032: 0x87CA, - 45620 - 44032: 0xB4B3, - 45621 - 44032: 0x87CB, - 45622 - 44032: 0x87CC, - 45623 - 44032: 0x87CD, - 45624 - 44032: 0x87CE, - 45625 - 44032: 0x87CF, - 45626 - 44032: 0x87D0, - 45627 - 44032: 0x87D1, - 45628 - 44032: 0xB4B4, - 45629 - 44032: 0x87D2, - 45630 - 44032: 0x87D3, - 45631 - 44032: 0x87D4, - 45632 - 44032: 0x87D5, - 45633 - 44032: 0x87D6, - 45634 - 44032: 0x87D7, - 45635 - 44032: 0x87D8, - 45636 - 44032: 0x87D9, - 45637 - 44032: 0x87DA, - 45638 - 44032: 0x87DB, - 45639 - 44032: 0x87DC, - 45640 - 44032: 0x87DD, - 45641 - 44032: 0x87DE, - 45642 - 44032: 0x87DF, - 45643 - 44032: 0x87E0, - 45644 - 44032: 0x87E1, - 45645 - 44032: 0x87E2, - 45646 - 44032: 0x87E3, - 45647 - 44032: 0x87E4, - 45648 - 44032: 0x87E5, - 45649 - 44032: 0x87E6, - 45650 - 44032: 0x87E7, - 45651 - 44032: 0x87E8, - 45652 - 44032: 0x87E9, - 45653 - 44032: 0x87EA, - 45654 - 44032: 0x87EB, - 45655 - 44032: 0x87EC, - 45656 - 44032: 0xB4B5, - 45657 - 44032: 0x87ED, - 45658 - 44032: 0x87EE, - 45659 - 44032: 0x87EF, - 45660 - 44032: 0xB4B6, - 45661 - 44032: 0x87F0, - 45662 - 44032: 0x87F1, - 45663 - 44032: 0x87F2, - 45664 - 44032: 0xB4B7, - 45665 - 44032: 0x87F3, - 45666 - 44032: 0x87F4, - 45667 - 44032: 0x87F5, - 45668 - 44032: 0x87F6, - 45669 - 44032: 0x87F7, - 45670 - 44032: 0x87F8, - 45671 - 44032: 0x87F9, - 45672 - 44032: 0xB4B8, - 45673 - 44032: 0xB4B9, - 45674 - 44032: 0x87FA, - 45675 - 44032: 0x87FB, - 45676 - 44032: 0x87FC, - 45677 - 44032: 0x87FD, - 45678 - 44032: 0x87FE, - 45679 - 44032: 0x8841, - 45680 - 44032: 0x8842, - 45681 - 44032: 0x8843, - 45682 - 44032: 0x8844, - 45683 - 44032: 0x8845, - 45684 - 44032: 0xB4BA, - 45685 - 44032: 0xB4BB, - 45686 - 44032: 0x8846, - 45687 - 44032: 0x8847, - 45688 - 44032: 0x8848, - 45689 - 44032: 0x8849, - 45690 - 44032: 0x884A, - 45691 - 44032: 0x884B, - 45692 - 44032: 0xB4BC, - 45693 - 44032: 0x884C, - 45694 - 44032: 0x884D, - 45695 - 44032: 0x884E, - 45696 - 44032: 0x884F, - 45697 - 44032: 0x8850, - 45698 - 44032: 0x8851, - 45699 - 44032: 0x8852, - 45700 - 44032: 0xB4BD, - 45701 - 44032: 0xB4BE, - 45702 - 44032: 0x8853, - 45703 - 44032: 0x8854, - 45704 - 44032: 0x8855, - 45705 - 44032: 0xB4BF, - 45706 - 44032: 0x8856, - 45707 - 44032: 0x8857, - 45708 - 44032: 0x8858, - 45709 - 44032: 0x8859, - 45710 - 44032: 0x885A, - 45711 - 44032: 0x8861, - 45712 - 44032: 0xB4C0, - 45713 - 44032: 0xB4C1, - 45714 - 44032: 0x8862, - 45715 - 44032: 0x8863, - 45716 - 44032: 0xB4C2, - 45717 - 44032: 0x8864, - 45718 - 44032: 0x8865, - 45719 - 44032: 0x8866, - 45720 - 44032: 0xB4C3, - 45721 - 44032: 0xB4C4, - 45722 - 44032: 0xB4C5, - 45723 - 44032: 0x8867, - 45724 - 44032: 0x8868, - 45725 - 44032: 0x8869, - 45726 - 44032: 0x886A, - 45727 - 44032: 0x886B, - 45728 - 44032: 0xB4C6, - 45729 - 44032: 0xB4C7, - 45730 - 44032: 0x886C, - 45731 - 44032: 0xB4C8, - 45732 - 44032: 0x886D, - 45733 - 44032: 0xB4C9, - 45734 - 44032: 0xB4CA, - 45735 - 44032: 0x886E, - 45736 - 44032: 0x886F, - 45737 - 44032: 0x8870, - 45738 - 44032: 0xB4CB, - 45739 - 44032: 0x8871, - 45740 - 44032: 0xB4CC, - 45741 - 44032: 0x8872, - 45742 - 44032: 0x8873, - 45743 - 44032: 0x8874, - 45744 - 44032: 0xB4CD, - 45745 - 44032: 0x8875, - 45746 - 44032: 0x8876, - 45747 - 44032: 0x8877, - 45748 - 44032: 0xB4CE, - 45749 - 44032: 0x8878, - 45750 - 44032: 0x8879, - 45751 - 44032: 0x887A, - 45752 - 44032: 0x8881, - 45753 - 44032: 0x8882, - 45754 - 44032: 0x8883, - 45755 - 44032: 0x8884, - 45756 - 44032: 0x8885, - 45757 - 44032: 0x8886, - 45758 - 44032: 0x8887, - 45759 - 44032: 0x8888, - 45760 - 44032: 0x8889, - 45761 - 44032: 0x888A, - 45762 - 44032: 0x888B, - 45763 - 44032: 0x888C, - 45764 - 44032: 0x888D, - 45765 - 44032: 0x888E, - 45766 - 44032: 0x888F, - 45767 - 44032: 0x8890, - 45768 - 44032: 0xB4CF, - 45769 - 44032: 0xB4D0, - 45770 - 44032: 0x8891, - 45771 - 44032: 0x8892, - 45772 - 44032: 0xB4D1, - 45773 - 44032: 0x8893, - 45774 - 44032: 0x8894, - 45775 - 44032: 0x8895, - 45776 - 44032: 0xB4D2, - 45777 - 44032: 0x8896, - 45778 - 44032: 0xB4D3, - 45779 - 44032: 0x8897, - 45780 - 44032: 0x8898, - 45781 - 44032: 0x8899, - 45782 - 44032: 0x889A, - 45783 - 44032: 0x889B, - 45784 - 44032: 0xB4D4, - 45785 - 44032: 0xB4D5, - 45786 - 44032: 0x889C, - 45787 - 44032: 0xB4D6, - 45788 - 44032: 0x889D, - 45789 - 44032: 0xB4D7, - 45790 - 44032: 0x889E, - 45791 - 44032: 0x889F, - 45792 - 44032: 0x88A0, - 45793 - 44032: 0x88A1, - 45794 - 44032: 0xB4D8, - 45795 - 44032: 0x88A2, - 45796 - 44032: 0xB4D9, - 45797 - 44032: 0xB4DA, - 45798 - 44032: 0xB4DB, - 45799 - 44032: 0x88A3, - 45800 - 44032: 0xB4DC, - 45801 - 44032: 0x88A4, - 45802 - 44032: 0x88A5, - 45803 - 44032: 0xB4DD, - 45804 - 44032: 0xB4DE, - 45805 - 44032: 0xB4DF, - 45806 - 44032: 0xB4E0, - 45807 - 44032: 0xB4E1, - 45808 - 44032: 0x88A6, - 45809 - 44032: 0x88A7, - 45810 - 44032: 0x88A8, - 45811 - 44032: 0xB4E2, - 45812 - 44032: 0xB4E3, - 45813 - 44032: 0xB4E4, - 45814 - 44032: 0x88A9, - 45815 - 44032: 0xB4E5, - 45816 - 44032: 0xB4E6, - 45817 - 44032: 0xB4E7, - 45818 - 44032: 0xB4E8, - 45819 - 44032: 0xB4E9, - 45820 - 44032: 0x88AA, - 45821 - 44032: 0x88AB, - 45822 - 44032: 0x88AC, - 45823 - 44032: 0xB4EA, - 45824 - 44032: 0xB4EB, - 45825 - 44032: 0xB4EC, - 45826 - 44032: 0x88AD, - 45827 - 44032: 0x88AE, - 45828 - 44032: 0xB4ED, - 45829 - 44032: 0x88AF, - 45830 - 44032: 0x88B0, - 45831 - 44032: 0x88B1, - 45832 - 44032: 0xB4EE, - 45833 - 44032: 0x88B2, - 45834 - 44032: 0x88B3, - 45835 - 44032: 0x88B4, - 45836 - 44032: 0x88B5, - 45837 - 44032: 0x88B6, - 45838 - 44032: 0x88B7, - 45839 - 44032: 0x88B8, - 45840 - 44032: 0xB4EF, - 45841 - 44032: 0xB4F0, - 45842 - 44032: 0x88B9, - 45843 - 44032: 0xB4F1, - 45844 - 44032: 0xB4F2, - 45845 - 44032: 0xB4F3, - 45846 - 44032: 0x88BA, - 45847 - 44032: 0x88BB, - 45848 - 44032: 0x88BC, - 45849 - 44032: 0x88BD, - 45850 - 44032: 0x88BE, - 45851 - 44032: 0x88BF, - 45852 - 44032: 0xB4F4, - 45853 - 44032: 0x88C0, - 45854 - 44032: 0x88C1, - 45855 - 44032: 0x88C2, - 45856 - 44032: 0x88C3, - 45857 - 44032: 0x88C4, - 45858 - 44032: 0x88C5, - 45859 - 44032: 0x88C6, - 45860 - 44032: 0x88C7, - 45861 - 44032: 0x88C8, - 45862 - 44032: 0x88C9, - 45863 - 44032: 0x88CA, - 45864 - 44032: 0x88CB, - 45865 - 44032: 0x88CC, - 45866 - 44032: 0x88CD, - 45867 - 44032: 0x88CE, - 45868 - 44032: 0x88CF, - 45869 - 44032: 0x88D0, - 45870 - 44032: 0x88D1, - 45871 - 44032: 0x88D2, - 45872 - 44032: 0x88D3, - 45873 - 44032: 0x88D4, - 45874 - 44032: 0x88D5, - 45875 - 44032: 0x88D6, - 45876 - 44032: 0x88D7, - 45877 - 44032: 0x88D8, - 45878 - 44032: 0x88D9, - 45879 - 44032: 0x88DA, - 45880 - 44032: 0x88DB, - 45881 - 44032: 0x88DC, - 45882 - 44032: 0x88DD, - 45883 - 44032: 0x88DE, - 45884 - 44032: 0x88DF, - 45885 - 44032: 0x88E0, - 45886 - 44032: 0x88E1, - 45887 - 44032: 0x88E2, - 45888 - 44032: 0x88E3, - 45889 - 44032: 0x88E4, - 45890 - 44032: 0x88E5, - 45891 - 44032: 0x88E6, - 45892 - 44032: 0x88E7, - 45893 - 44032: 0x88E8, - 45894 - 44032: 0x88E9, - 45895 - 44032: 0x88EA, - 45896 - 44032: 0x88EB, - 45897 - 44032: 0x88EC, - 45898 - 44032: 0x88ED, - 45899 - 44032: 0x88EE, - 45900 - 44032: 0x88EF, - 45901 - 44032: 0x88F0, - 45902 - 44032: 0x88F1, - 45903 - 44032: 0x88F2, - 45904 - 44032: 0x88F3, - 45905 - 44032: 0x88F4, - 45906 - 44032: 0x88F5, - 45907 - 44032: 0x88F6, - 45908 - 44032: 0xB4F5, - 45909 - 44032: 0xB4F6, - 45910 - 44032: 0xB4F7, - 45911 - 44032: 0x88F7, - 45912 - 44032: 0xB4F8, - 45913 - 44032: 0x88F8, - 45914 - 44032: 0x88F9, - 45915 - 44032: 0xB4F9, - 45916 - 44032: 0xB4FA, - 45917 - 44032: 0x88FA, - 45918 - 44032: 0xB4FB, - 45919 - 44032: 0xB4FC, - 45920 - 44032: 0x88FB, - 45921 - 44032: 0x88FC, - 45922 - 44032: 0x88FD, - 45923 - 44032: 0x88FE, - 45924 - 44032: 0xB4FD, - 45925 - 44032: 0xB4FE, - 45926 - 44032: 0x8941, - 45927 - 44032: 0xB5A1, - 45928 - 44032: 0x8942, - 45929 - 44032: 0xB5A2, - 45930 - 44032: 0x8943, - 45931 - 44032: 0xB5A3, - 45932 - 44032: 0x8944, - 45933 - 44032: 0x8945, - 45934 - 44032: 0xB5A4, - 45935 - 44032: 0x8946, - 45936 - 44032: 0xB5A5, - 45937 - 44032: 0xB5A6, - 45938 - 44032: 0x8947, - 45939 - 44032: 0x8948, - 45940 - 44032: 0xB5A7, - 45941 - 44032: 0x8949, - 45942 - 44032: 0x894A, - 45943 - 44032: 0x894B, - 45944 - 44032: 0xB5A8, - 45945 - 44032: 0x894C, - 45946 - 44032: 0x894D, - 45947 - 44032: 0x894E, - 45948 - 44032: 0x894F, - 45949 - 44032: 0x8950, - 45950 - 44032: 0x8951, - 45951 - 44032: 0x8952, - 45952 - 44032: 0xB5A9, - 45953 - 44032: 0xB5AA, - 45954 - 44032: 0x8953, - 45955 - 44032: 0xB5AB, - 45956 - 44032: 0xB5AC, - 45957 - 44032: 0xB5AD, - 45958 - 44032: 0x8954, - 45959 - 44032: 0x8955, - 45960 - 44032: 0x8956, - 45961 - 44032: 0x8957, - 45962 - 44032: 0x8958, - 45963 - 44032: 0x8959, - 45964 - 44032: 0xB5AE, - 45965 - 44032: 0x895A, - 45966 - 44032: 0x8961, - 45967 - 44032: 0x8962, - 45968 - 44032: 0xB5AF, - 45969 - 44032: 0x8963, - 45970 - 44032: 0x8964, - 45971 - 44032: 0x8965, - 45972 - 44032: 0xB5B0, - 45973 - 44032: 0x8966, - 45974 - 44032: 0x8967, - 45975 - 44032: 0x8968, - 45976 - 44032: 0x8969, - 45977 - 44032: 0x896A, - 45978 - 44032: 0x896B, - 45979 - 44032: 0x896C, - 45980 - 44032: 0x896D, - 45981 - 44032: 0x896E, - 45982 - 44032: 0x896F, - 45983 - 44032: 0x8970, - 45984 - 44032: 0xB5B1, - 45985 - 44032: 0xB5B2, - 45986 - 44032: 0x8971, - 45987 - 44032: 0x8972, - 45988 - 44032: 0x8973, - 45989 - 44032: 0x8974, - 45990 - 44032: 0x8975, - 45991 - 44032: 0x8976, - 45992 - 44032: 0xB5B3, - 45993 - 44032: 0x8977, - 45994 - 44032: 0x8978, - 45995 - 44032: 0x8979, - 45996 - 44032: 0xB5B4, - 45997 - 44032: 0x897A, - 45998 - 44032: 0x8981, - 45999 - 44032: 0x8982, - 46000 - 44032: 0x8983, - 46001 - 44032: 0x8984, - 46002 - 44032: 0x8985, - 46003 - 44032: 0x8986, - 46004 - 44032: 0x8987, - 46005 - 44032: 0x8988, - 46006 - 44032: 0x8989, - 46007 - 44032: 0x898A, - 46008 - 44032: 0x898B, - 46009 - 44032: 0x898C, - 46010 - 44032: 0x898D, - 46011 - 44032: 0x898E, - 46012 - 44032: 0x898F, - 46013 - 44032: 0x8990, - 46014 - 44032: 0x8991, - 46015 - 44032: 0x8992, - 46016 - 44032: 0x8993, - 46017 - 44032: 0x8994, - 46018 - 44032: 0x8995, - 46019 - 44032: 0x8996, - 46020 - 44032: 0xB5B5, - 46021 - 44032: 0xB5B6, - 46022 - 44032: 0x8997, - 46023 - 44032: 0x8998, - 46024 - 44032: 0xB5B7, - 46025 - 44032: 0x8999, - 46026 - 44032: 0x899A, - 46027 - 44032: 0xB5B8, - 46028 - 44032: 0xB5B9, - 46029 - 44032: 0x899B, - 46030 - 44032: 0xB5BA, - 46031 - 44032: 0x899C, - 46032 - 44032: 0xB5BB, - 46033 - 44032: 0x899D, - 46034 - 44032: 0x899E, - 46035 - 44032: 0x899F, - 46036 - 44032: 0xB5BC, - 46037 - 44032: 0xB5BD, - 46038 - 44032: 0x89A0, - 46039 - 44032: 0xB5BE, - 46040 - 44032: 0x89A1, - 46041 - 44032: 0xB5BF, - 46042 - 44032: 0x89A2, - 46043 - 44032: 0xB5C0, - 46044 - 44032: 0x89A3, - 46045 - 44032: 0xB5C1, - 46046 - 44032: 0x89A4, - 46047 - 44032: 0x89A5, - 46048 - 44032: 0xB5C2, - 46049 - 44032: 0x89A6, - 46050 - 44032: 0x89A7, - 46051 - 44032: 0x89A8, - 46052 - 44032: 0xB5C3, - 46053 - 44032: 0x89A9, - 46054 - 44032: 0x89AA, - 46055 - 44032: 0x89AB, - 46056 - 44032: 0xB5C4, - 46057 - 44032: 0x89AC, - 46058 - 44032: 0x89AD, - 46059 - 44032: 0x89AE, - 46060 - 44032: 0x89AF, - 46061 - 44032: 0x89B0, - 46062 - 44032: 0x89B1, - 46063 - 44032: 0x89B2, - 46064 - 44032: 0x89B3, - 46065 - 44032: 0x89B4, - 46066 - 44032: 0x89B5, - 46067 - 44032: 0x89B6, - 46068 - 44032: 0x89B7, - 46069 - 44032: 0x89B8, - 46070 - 44032: 0x89B9, - 46071 - 44032: 0x89BA, - 46072 - 44032: 0x89BB, - 46073 - 44032: 0x89BC, - 46074 - 44032: 0x89BD, - 46075 - 44032: 0x89BE, - 46076 - 44032: 0xB5C5, - 46077 - 44032: 0x89BF, - 46078 - 44032: 0x89C0, - 46079 - 44032: 0x89C1, - 46080 - 44032: 0x89C2, - 46081 - 44032: 0x89C3, - 46082 - 44032: 0x89C4, - 46083 - 44032: 0x89C5, - 46084 - 44032: 0x89C6, - 46085 - 44032: 0x89C7, - 46086 - 44032: 0x89C8, - 46087 - 44032: 0x89C9, - 46088 - 44032: 0x89CA, - 46089 - 44032: 0x89CB, - 46090 - 44032: 0x89CC, - 46091 - 44032: 0x89CD, - 46092 - 44032: 0x89CE, - 46093 - 44032: 0x89CF, - 46094 - 44032: 0x89D0, - 46095 - 44032: 0x89D1, - 46096 - 44032: 0xB5C6, - 46097 - 44032: 0x89D2, - 46098 - 44032: 0x89D3, - 46099 - 44032: 0x89D4, - 46100 - 44032: 0x89D5, - 46101 - 44032: 0x89D6, - 46102 - 44032: 0x89D7, - 46103 - 44032: 0x89D8, - 46104 - 44032: 0xB5C7, - 46105 - 44032: 0x89D9, - 46106 - 44032: 0x89DA, - 46107 - 44032: 0x89DB, - 46108 - 44032: 0xB5C8, - 46109 - 44032: 0x89DC, - 46110 - 44032: 0x89DD, - 46111 - 44032: 0x89DE, - 46112 - 44032: 0xB5C9, - 46113 - 44032: 0x89DF, - 46114 - 44032: 0x89E0, - 46115 - 44032: 0x89E1, - 46116 - 44032: 0x89E2, - 46117 - 44032: 0x89E3, - 46118 - 44032: 0x89E4, - 46119 - 44032: 0x89E5, - 46120 - 44032: 0xB5CA, - 46121 - 44032: 0xB5CB, - 46122 - 44032: 0x89E6, - 46123 - 44032: 0xB5CC, - 46124 - 44032: 0x89E7, - 46125 - 44032: 0x89E8, - 46126 - 44032: 0x89E9, - 46127 - 44032: 0x89EA, - 46128 - 44032: 0x89EB, - 46129 - 44032: 0x89EC, - 46130 - 44032: 0x89ED, - 46131 - 44032: 0x89EE, - 46132 - 44032: 0xB5CD, - 46133 - 44032: 0x89EF, - 46134 - 44032: 0x89F0, - 46135 - 44032: 0x89F1, - 46136 - 44032: 0x89F2, - 46137 - 44032: 0x89F3, - 46138 - 44032: 0x89F4, - 46139 - 44032: 0x89F5, - 46140 - 44032: 0x89F6, - 46141 - 44032: 0x89F7, - 46142 - 44032: 0x89F8, - 46143 - 44032: 0x89F9, - 46144 - 44032: 0x89FA, - 46145 - 44032: 0x89FB, - 46146 - 44032: 0x89FC, - 46147 - 44032: 0x89FD, - 46148 - 44032: 0x89FE, - 46149 - 44032: 0x8A41, - 46150 - 44032: 0x8A42, - 46151 - 44032: 0x8A43, - 46152 - 44032: 0x8A44, - 46153 - 44032: 0x8A45, - 46154 - 44032: 0x8A46, - 46155 - 44032: 0x8A47, - 46156 - 44032: 0x8A48, - 46157 - 44032: 0x8A49, - 46158 - 44032: 0x8A4A, - 46159 - 44032: 0x8A4B, - 46160 - 44032: 0xB5CE, - 46161 - 44032: 0xB5CF, - 46162 - 44032: 0x8A4C, - 46163 - 44032: 0x8A4D, - 46164 - 44032: 0xB5D0, - 46165 - 44032: 0x8A4E, - 46166 - 44032: 0x8A4F, - 46167 - 44032: 0x8A50, - 46168 - 44032: 0xB5D1, - 46169 - 44032: 0x8A51, - 46170 - 44032: 0x8A52, - 46171 - 44032: 0x8A53, - 46172 - 44032: 0x8A54, - 46173 - 44032: 0x8A55, - 46174 - 44032: 0x8A56, - 46175 - 44032: 0x8A57, - 46176 - 44032: 0xB5D2, - 46177 - 44032: 0xB5D3, - 46178 - 44032: 0x8A58, - 46179 - 44032: 0xB5D4, - 46180 - 44032: 0x8A59, - 46181 - 44032: 0xB5D5, - 46182 - 44032: 0x8A5A, - 46183 - 44032: 0x8A61, - 46184 - 44032: 0x8A62, - 46185 - 44032: 0x8A63, - 46186 - 44032: 0x8A64, - 46187 - 44032: 0x8A65, - 46188 - 44032: 0xB5D6, - 46189 - 44032: 0x8A66, - 46190 - 44032: 0x8A67, - 46191 - 44032: 0x8A68, - 46192 - 44032: 0x8A69, - 46193 - 44032: 0x8A6A, - 46194 - 44032: 0x8A6B, - 46195 - 44032: 0x8A6C, - 46196 - 44032: 0x8A6D, - 46197 - 44032: 0x8A6E, - 46198 - 44032: 0x8A6F, - 46199 - 44032: 0x8A70, - 46200 - 44032: 0x8A71, - 46201 - 44032: 0x8A72, - 46202 - 44032: 0x8A73, - 46203 - 44032: 0x8A74, - 46204 - 44032: 0x8A75, - 46205 - 44032: 0x8A76, - 46206 - 44032: 0x8A77, - 46207 - 44032: 0x8A78, - 46208 - 44032: 0xB5D7, - 46209 - 44032: 0x8A79, - 46210 - 44032: 0x8A7A, - 46211 - 44032: 0x8A81, - 46212 - 44032: 0x8A82, - 46213 - 44032: 0x8A83, - 46214 - 44032: 0x8A84, - 46215 - 44032: 0x8A85, - 46216 - 44032: 0xB5D8, - 46217 - 44032: 0x8A86, - 46218 - 44032: 0x8A87, - 46219 - 44032: 0x8A88, - 46220 - 44032: 0x8A89, - 46221 - 44032: 0x8A8A, - 46222 - 44032: 0x8A8B, - 46223 - 44032: 0x8A8C, - 46224 - 44032: 0x8A8D, - 46225 - 44032: 0x8A8E, - 46226 - 44032: 0x8A8F, - 46227 - 44032: 0x8A90, - 46228 - 44032: 0x8A91, - 46229 - 44032: 0x8A92, - 46230 - 44032: 0x8A93, - 46231 - 44032: 0x8A94, - 46232 - 44032: 0x8A95, - 46233 - 44032: 0x8A96, - 46234 - 44032: 0x8A97, - 46235 - 44032: 0x8A98, - 46236 - 44032: 0x8A99, - 46237 - 44032: 0xB5D9, - 46238 - 44032: 0x8A9A, - 46239 - 44032: 0x8A9B, - 46240 - 44032: 0x8A9C, - 46241 - 44032: 0x8A9D, - 46242 - 44032: 0x8A9E, - 46243 - 44032: 0x8A9F, - 46244 - 44032: 0xB5DA, - 46245 - 44032: 0x8AA0, - 46246 - 44032: 0x8AA1, - 46247 - 44032: 0x8AA2, - 46248 - 44032: 0xB5DB, - 46249 - 44032: 0x8AA3, - 46250 - 44032: 0x8AA4, - 46251 - 44032: 0x8AA5, - 46252 - 44032: 0xB5DC, - 46253 - 44032: 0x8AA6, - 46254 - 44032: 0x8AA7, - 46255 - 44032: 0x8AA8, - 46256 - 44032: 0x8AA9, - 46257 - 44032: 0x8AAA, - 46258 - 44032: 0x8AAB, - 46259 - 44032: 0x8AAC, - 46260 - 44032: 0x8AAD, - 46261 - 44032: 0xB5DD, - 46262 - 44032: 0x8AAE, - 46263 - 44032: 0xB5DE, - 46264 - 44032: 0x8AAF, - 46265 - 44032: 0xB5DF, - 46266 - 44032: 0x8AB0, - 46267 - 44032: 0x8AB1, - 46268 - 44032: 0x8AB2, - 46269 - 44032: 0x8AB3, - 46270 - 44032: 0x8AB4, - 46271 - 44032: 0x8AB5, - 46272 - 44032: 0xB5E0, - 46273 - 44032: 0x8AB6, - 46274 - 44032: 0x8AB7, - 46275 - 44032: 0x8AB8, - 46276 - 44032: 0xB5E1, - 46277 - 44032: 0x8AB9, - 46278 - 44032: 0x8ABA, - 46279 - 44032: 0x8ABB, - 46280 - 44032: 0xB5E2, - 46281 - 44032: 0x8ABC, - 46282 - 44032: 0x8ABD, - 46283 - 44032: 0x8ABE, - 46284 - 44032: 0x8ABF, - 46285 - 44032: 0x8AC0, - 46286 - 44032: 0x8AC1, - 46287 - 44032: 0x8AC2, - 46288 - 44032: 0xB5E3, - 46289 - 44032: 0x8AC3, - 46290 - 44032: 0x8AC4, - 46291 - 44032: 0x8AC5, - 46292 - 44032: 0x8AC6, - 46293 - 44032: 0xB5E4, - 46294 - 44032: 0x8AC7, - 46295 - 44032: 0x8AC8, - 46296 - 44032: 0x8AC9, - 46297 - 44032: 0x8ACA, - 46298 - 44032: 0x8ACB, - 46299 - 44032: 0x8ACC, - 46300 - 44032: 0xB5E5, - 46301 - 44032: 0xB5E6, - 46302 - 44032: 0x8ACD, - 46303 - 44032: 0x8ACE, - 46304 - 44032: 0xB5E7, - 46305 - 44032: 0x8ACF, - 46306 - 44032: 0x8AD0, - 46307 - 44032: 0xB5E8, - 46308 - 44032: 0xB5E9, - 46309 - 44032: 0x8AD1, - 46310 - 44032: 0xB5EA, - 46311 - 44032: 0x8AD2, - 46312 - 44032: 0x8AD3, - 46313 - 44032: 0x8AD4, - 46314 - 44032: 0x8AD5, - 46315 - 44032: 0x8AD6, - 46316 - 44032: 0xB5EB, - 46317 - 44032: 0xB5EC, - 46318 - 44032: 0x8AD7, - 46319 - 44032: 0xB5ED, - 46320 - 44032: 0x8AD8, - 46321 - 44032: 0xB5EE, - 46322 - 44032: 0x8AD9, - 46323 - 44032: 0x8ADA, - 46324 - 44032: 0x8ADB, - 46325 - 44032: 0x8ADC, - 46326 - 44032: 0x8ADD, - 46327 - 44032: 0x8ADE, - 46328 - 44032: 0xB5EF, - 46329 - 44032: 0x8ADF, - 46330 - 44032: 0x8AE0, - 46331 - 44032: 0x8AE1, - 46332 - 44032: 0x8AE2, - 46333 - 44032: 0x8AE3, - 46334 - 44032: 0x8AE4, - 46335 - 44032: 0x8AE5, - 46336 - 44032: 0x8AE6, - 46337 - 44032: 0x8AE7, - 46338 - 44032: 0x8AE8, - 46339 - 44032: 0x8AE9, - 46340 - 44032: 0x8AEA, - 46341 - 44032: 0x8AEB, - 46342 - 44032: 0x8AEC, - 46343 - 44032: 0x8AED, - 46344 - 44032: 0x8AEE, - 46345 - 44032: 0x8AEF, - 46346 - 44032: 0x8AF0, - 46347 - 44032: 0x8AF1, - 46348 - 44032: 0x8AF2, - 46349 - 44032: 0x8AF3, - 46350 - 44032: 0x8AF4, - 46351 - 44032: 0x8AF5, - 46352 - 44032: 0x8AF6, - 46353 - 44032: 0x8AF7, - 46354 - 44032: 0x8AF8, - 46355 - 44032: 0x8AF9, - 46356 - 44032: 0xB5F0, - 46357 - 44032: 0xB5F1, - 46358 - 44032: 0x8AFA, - 46359 - 44032: 0x8AFB, - 46360 - 44032: 0xB5F2, - 46361 - 44032: 0x8AFC, - 46362 - 44032: 0x8AFD, - 46363 - 44032: 0xB5F3, - 46364 - 44032: 0xB5F4, - 46365 - 44032: 0x8AFE, - 46366 - 44032: 0x8B41, - 46367 - 44032: 0x8B42, - 46368 - 44032: 0x8B43, - 46369 - 44032: 0x8B44, - 46370 - 44032: 0x8B45, - 46371 - 44032: 0x8B46, - 46372 - 44032: 0xB5F5, - 46373 - 44032: 0xB5F6, - 46374 - 44032: 0x8B47, - 46375 - 44032: 0xB5F7, - 46376 - 44032: 0xB5F8, - 46377 - 44032: 0xB5F9, - 46378 - 44032: 0xB5FA, - 46379 - 44032: 0x8B48, - 46380 - 44032: 0x8B49, - 46381 - 44032: 0x8B4A, - 46382 - 44032: 0x8B4B, - 46383 - 44032: 0x8B4C, - 46384 - 44032: 0xB5FB, - 46385 - 44032: 0xB5FC, - 46386 - 44032: 0x8B4D, - 46387 - 44032: 0x8B4E, - 46388 - 44032: 0xB5FD, - 46389 - 44032: 0x8B4F, - 46390 - 44032: 0x8B50, - 46391 - 44032: 0x8B51, - 46392 - 44032: 0xB5FE, - 46393 - 44032: 0x8B52, - 46394 - 44032: 0x8B53, - 46395 - 44032: 0x8B54, - 46396 - 44032: 0x8B55, - 46397 - 44032: 0x8B56, - 46398 - 44032: 0x8B57, - 46399 - 44032: 0x8B58, - 46400 - 44032: 0xB6A1, - 46401 - 44032: 0xB6A2, - 46402 - 44032: 0x8B59, - 46403 - 44032: 0xB6A3, - 46404 - 44032: 0xB6A4, - 46405 - 44032: 0xB6A5, - 46406 - 44032: 0x8B5A, - 46407 - 44032: 0x8B61, - 46408 - 44032: 0x8B62, - 46409 - 44032: 0x8B63, - 46410 - 44032: 0x8B64, - 46411 - 44032: 0xB6A6, - 46412 - 44032: 0xB6A7, - 46413 - 44032: 0xB6A8, - 46414 - 44032: 0x8B65, - 46415 - 44032: 0x8B66, - 46416 - 44032: 0xB6A9, - 46417 - 44032: 0x8B67, - 46418 - 44032: 0x8B68, - 46419 - 44032: 0x8B69, - 46420 - 44032: 0xB6AA, - 46421 - 44032: 0x8B6A, - 46422 - 44032: 0x8B6B, - 46423 - 44032: 0x8B6C, - 46424 - 44032: 0x8B6D, - 46425 - 44032: 0x8B6E, - 46426 - 44032: 0x8B6F, - 46427 - 44032: 0x8B70, - 46428 - 44032: 0xB6AB, - 46429 - 44032: 0xB6AC, - 46430 - 44032: 0x8B71, - 46431 - 44032: 0xB6AD, - 46432 - 44032: 0xB6AE, - 46433 - 44032: 0xB6AF, - 46434 - 44032: 0x8B72, - 46435 - 44032: 0x8B73, - 46436 - 44032: 0x8B74, - 46437 - 44032: 0x8B75, - 46438 - 44032: 0x8B76, - 46439 - 44032: 0x8B77, - 46440 - 44032: 0x8B78, - 46441 - 44032: 0x8B79, - 46442 - 44032: 0x8B7A, - 46443 - 44032: 0x8B81, - 46444 - 44032: 0x8B82, - 46445 - 44032: 0x8B83, - 46446 - 44032: 0x8B84, - 46447 - 44032: 0x8B85, - 46448 - 44032: 0x8B86, - 46449 - 44032: 0x8B87, - 46450 - 44032: 0x8B88, - 46451 - 44032: 0x8B89, - 46452 - 44032: 0x8B8A, - 46453 - 44032: 0x8B8B, - 46454 - 44032: 0x8B8C, - 46455 - 44032: 0x8B8D, - 46456 - 44032: 0x8B8E, - 46457 - 44032: 0x8B8F, - 46458 - 44032: 0x8B90, - 46459 - 44032: 0x8B91, - 46460 - 44032: 0x8B92, - 46461 - 44032: 0x8B93, - 46462 - 44032: 0x8B94, - 46463 - 44032: 0x8B95, - 46464 - 44032: 0x8B96, - 46465 - 44032: 0x8B97, - 46466 - 44032: 0x8B98, - 46467 - 44032: 0x8B99, - 46468 - 44032: 0x8B9A, - 46469 - 44032: 0x8B9B, - 46470 - 44032: 0x8B9C, - 46471 - 44032: 0x8B9D, - 46472 - 44032: 0x8B9E, - 46473 - 44032: 0x8B9F, - 46474 - 44032: 0x8BA0, - 46475 - 44032: 0x8BA1, - 46476 - 44032: 0x8BA2, - 46477 - 44032: 0x8BA3, - 46478 - 44032: 0x8BA4, - 46479 - 44032: 0x8BA5, - 46480 - 44032: 0x8BA6, - 46481 - 44032: 0x8BA7, - 46482 - 44032: 0x8BA8, - 46483 - 44032: 0x8BA9, - 46484 - 44032: 0x8BAA, - 46485 - 44032: 0x8BAB, - 46486 - 44032: 0x8BAC, - 46487 - 44032: 0x8BAD, - 46488 - 44032: 0x8BAE, - 46489 - 44032: 0x8BAF, - 46490 - 44032: 0x8BB0, - 46491 - 44032: 0x8BB1, - 46492 - 44032: 0x8BB2, - 46493 - 44032: 0x8BB3, - 46494 - 44032: 0x8BB4, - 46495 - 44032: 0x8BB5, - 46496 - 44032: 0xB6B0, - 46497 - 44032: 0xB6B1, - 46498 - 44032: 0x8BB6, - 46499 - 44032: 0x8BB7, - 46500 - 44032: 0xB6B2, - 46501 - 44032: 0x8BB8, - 46502 - 44032: 0x8BB9, - 46503 - 44032: 0x8BBA, - 46504 - 44032: 0xB6B3, - 46505 - 44032: 0x8BBB, - 46506 - 44032: 0xB6B4, - 46507 - 44032: 0xB6B5, - 46508 - 44032: 0x8BBC, - 46509 - 44032: 0x8BBD, - 46510 - 44032: 0x8BBE, - 46511 - 44032: 0x8BBF, - 46512 - 44032: 0xB6B6, - 46513 - 44032: 0xB6B7, - 46514 - 44032: 0x8BC0, - 46515 - 44032: 0xB6B8, - 46516 - 44032: 0xB6B9, - 46517 - 44032: 0xB6BA, - 46518 - 44032: 0x8BC1, - 46519 - 44032: 0x8BC2, - 46520 - 44032: 0x8BC3, - 46521 - 44032: 0x8BC4, - 46522 - 44032: 0x8BC5, - 46523 - 44032: 0xB6BB, - 46524 - 44032: 0xB6BC, - 46525 - 44032: 0xB6BD, - 46526 - 44032: 0x8BC6, - 46527 - 44032: 0x8BC7, - 46528 - 44032: 0xB6BE, - 46529 - 44032: 0x8BC8, - 46530 - 44032: 0x8BC9, - 46531 - 44032: 0x8BCA, - 46532 - 44032: 0xB6BF, - 46533 - 44032: 0x8BCB, - 46534 - 44032: 0x8BCC, - 46535 - 44032: 0x8BCD, - 46536 - 44032: 0x8BCE, - 46537 - 44032: 0x8BCF, - 46538 - 44032: 0x8BD0, - 46539 - 44032: 0x8BD1, - 46540 - 44032: 0xB6C0, - 46541 - 44032: 0xB6C1, - 46542 - 44032: 0x8BD2, - 46543 - 44032: 0xB6C2, - 46544 - 44032: 0xB6C3, - 46545 - 44032: 0xB6C4, - 46546 - 44032: 0x8BD3, - 46547 - 44032: 0x8BD4, - 46548 - 44032: 0x8BD5, - 46549 - 44032: 0x8BD6, - 46550 - 44032: 0x8BD7, - 46551 - 44032: 0x8BD8, - 46552 - 44032: 0xB6C5, - 46553 - 44032: 0x8BD9, - 46554 - 44032: 0x8BDA, - 46555 - 44032: 0x8BDB, - 46556 - 44032: 0x8BDC, - 46557 - 44032: 0x8BDD, - 46558 - 44032: 0x8BDE, - 46559 - 44032: 0x8BDF, - 46560 - 44032: 0x8BE0, - 46561 - 44032: 0x8BE1, - 46562 - 44032: 0x8BE2, - 46563 - 44032: 0x8BE3, - 46564 - 44032: 0x8BE4, - 46565 - 44032: 0x8BE5, - 46566 - 44032: 0x8BE6, - 46567 - 44032: 0x8BE7, - 46568 - 44032: 0x8BE8, - 46569 - 44032: 0x8BE9, - 46570 - 44032: 0x8BEA, - 46571 - 44032: 0x8BEB, - 46572 - 44032: 0xB6C6, - 46573 - 44032: 0x8BEC, - 46574 - 44032: 0x8BED, - 46575 - 44032: 0x8BEE, - 46576 - 44032: 0x8BEF, - 46577 - 44032: 0x8BF0, - 46578 - 44032: 0x8BF1, - 46579 - 44032: 0x8BF2, - 46580 - 44032: 0x8BF3, - 46581 - 44032: 0x8BF4, - 46582 - 44032: 0x8BF5, - 46583 - 44032: 0x8BF6, - 46584 - 44032: 0x8BF7, - 46585 - 44032: 0x8BF8, - 46586 - 44032: 0x8BF9, - 46587 - 44032: 0x8BFA, - 46588 - 44032: 0x8BFB, - 46589 - 44032: 0x8BFC, - 46590 - 44032: 0x8BFD, - 46591 - 44032: 0x8BFE, - 46592 - 44032: 0x8C41, - 46593 - 44032: 0x8C42, - 46594 - 44032: 0x8C43, - 46595 - 44032: 0x8C44, - 46596 - 44032: 0x8C45, - 46597 - 44032: 0x8C46, - 46598 - 44032: 0x8C47, - 46599 - 44032: 0x8C48, - 46600 - 44032: 0x8C49, - 46601 - 44032: 0x8C4A, - 46602 - 44032: 0x8C4B, - 46603 - 44032: 0x8C4C, - 46604 - 44032: 0x8C4D, - 46605 - 44032: 0x8C4E, - 46606 - 44032: 0x8C4F, - 46607 - 44032: 0x8C50, - 46608 - 44032: 0xB6C7, - 46609 - 44032: 0xB6C8, - 46610 - 44032: 0x8C51, - 46611 - 44032: 0x8C52, - 46612 - 44032: 0xB6C9, - 46613 - 44032: 0x8C53, - 46614 - 44032: 0x8C54, - 46615 - 44032: 0x8C55, - 46616 - 44032: 0xB6CA, - 46617 - 44032: 0x8C56, - 46618 - 44032: 0x8C57, - 46619 - 44032: 0x8C58, - 46620 - 44032: 0x8C59, - 46621 - 44032: 0x8C5A, - 46622 - 44032: 0x8C61, - 46623 - 44032: 0x8C62, - 46624 - 44032: 0x8C63, - 46625 - 44032: 0x8C64, - 46626 - 44032: 0x8C65, - 46627 - 44032: 0x8C66, - 46628 - 44032: 0x8C67, - 46629 - 44032: 0xB6CB, - 46630 - 44032: 0x8C68, - 46631 - 44032: 0x8C69, - 46632 - 44032: 0x8C6A, - 46633 - 44032: 0x8C6B, - 46634 - 44032: 0x8C6C, - 46635 - 44032: 0x8C6D, - 46636 - 44032: 0xB6CC, - 46637 - 44032: 0x8C6E, - 46638 - 44032: 0x8C6F, - 46639 - 44032: 0x8C70, - 46640 - 44032: 0x8C71, - 46641 - 44032: 0x8C72, - 46642 - 44032: 0x8C73, - 46643 - 44032: 0x8C74, - 46644 - 44032: 0xB6CD, - 46645 - 44032: 0x8C75, - 46646 - 44032: 0x8C76, - 46647 - 44032: 0x8C77, - 46648 - 44032: 0x8C78, - 46649 - 44032: 0x8C79, - 46650 - 44032: 0x8C7A, - 46651 - 44032: 0x8C81, - 46652 - 44032: 0x8C82, - 46653 - 44032: 0x8C83, - 46654 - 44032: 0x8C84, - 46655 - 44032: 0x8C85, - 46656 - 44032: 0x8C86, - 46657 - 44032: 0x8C87, - 46658 - 44032: 0x8C88, - 46659 - 44032: 0x8C89, - 46660 - 44032: 0x8C8A, - 46661 - 44032: 0x8C8B, - 46662 - 44032: 0x8C8C, - 46663 - 44032: 0x8C8D, - 46664 - 44032: 0xB6CE, - 46665 - 44032: 0x8C8E, - 46666 - 44032: 0x8C8F, - 46667 - 44032: 0x8C90, - 46668 - 44032: 0x8C91, - 46669 - 44032: 0x8C92, - 46670 - 44032: 0x8C93, - 46671 - 44032: 0x8C94, - 46672 - 44032: 0x8C95, - 46673 - 44032: 0x8C96, - 46674 - 44032: 0x8C97, - 46675 - 44032: 0x8C98, - 46676 - 44032: 0x8C99, - 46677 - 44032: 0x8C9A, - 46678 - 44032: 0x8C9B, - 46679 - 44032: 0x8C9C, - 46680 - 44032: 0x8C9D, - 46681 - 44032: 0x8C9E, - 46682 - 44032: 0x8C9F, - 46683 - 44032: 0x8CA0, - 46684 - 44032: 0x8CA1, - 46685 - 44032: 0x8CA2, - 46686 - 44032: 0x8CA3, - 46687 - 44032: 0x8CA4, - 46688 - 44032: 0x8CA5, - 46689 - 44032: 0x8CA6, - 46690 - 44032: 0x8CA7, - 46691 - 44032: 0x8CA8, - 46692 - 44032: 0xB6CF, - 46693 - 44032: 0x8CA9, - 46694 - 44032: 0x8CAA, - 46695 - 44032: 0x8CAB, - 46696 - 44032: 0xB6D0, - 46697 - 44032: 0x8CAC, - 46698 - 44032: 0x8CAD, - 46699 - 44032: 0x8CAE, - 46700 - 44032: 0x8CAF, - 46701 - 44032: 0x8CB0, - 46702 - 44032: 0x8CB1, - 46703 - 44032: 0x8CB2, - 46704 - 44032: 0x8CB3, - 46705 - 44032: 0x8CB4, - 46706 - 44032: 0x8CB5, - 46707 - 44032: 0x8CB6, - 46708 - 44032: 0x8CB7, - 46709 - 44032: 0x8CB8, - 46710 - 44032: 0x8CB9, - 46711 - 44032: 0x8CBA, - 46712 - 44032: 0x8CBB, - 46713 - 44032: 0x8CBC, - 46714 - 44032: 0x8CBD, - 46715 - 44032: 0x8CBE, - 46716 - 44032: 0x8CBF, - 46717 - 44032: 0x8CC0, - 46718 - 44032: 0x8CC1, - 46719 - 44032: 0x8CC2, - 46720 - 44032: 0x8CC3, - 46721 - 44032: 0x8CC4, - 46722 - 44032: 0x8CC5, - 46723 - 44032: 0x8CC6, - 46724 - 44032: 0x8CC7, - 46725 - 44032: 0x8CC8, - 46726 - 44032: 0x8CC9, - 46727 - 44032: 0x8CCA, - 46728 - 44032: 0x8CCB, - 46729 - 44032: 0x8CCC, - 46730 - 44032: 0x8CCD, - 46731 - 44032: 0x8CCE, - 46732 - 44032: 0x8CCF, - 46733 - 44032: 0x8CD0, - 46734 - 44032: 0x8CD1, - 46735 - 44032: 0x8CD2, - 46736 - 44032: 0x8CD3, - 46737 - 44032: 0x8CD4, - 46738 - 44032: 0x8CD5, - 46739 - 44032: 0x8CD6, - 46740 - 44032: 0x8CD7, - 46741 - 44032: 0x8CD8, - 46742 - 44032: 0x8CD9, - 46743 - 44032: 0x8CDA, - 46744 - 44032: 0x8CDB, - 46745 - 44032: 0x8CDC, - 46746 - 44032: 0x8CDD, - 46747 - 44032: 0x8CDE, - 46748 - 44032: 0xB6D1, - 46749 - 44032: 0xB6D2, - 46750 - 44032: 0x8CDF, - 46751 - 44032: 0x8CE0, - 46752 - 44032: 0xB6D3, - 46753 - 44032: 0x8CE1, - 46754 - 44032: 0x8CE2, - 46755 - 44032: 0x8CE3, - 46756 - 44032: 0xB6D4, - 46757 - 44032: 0x8CE4, - 46758 - 44032: 0x8CE5, - 46759 - 44032: 0x8CE6, - 46760 - 44032: 0x8CE7, - 46761 - 44032: 0x8CE8, - 46762 - 44032: 0x8CE9, - 46763 - 44032: 0xB6D5, - 46764 - 44032: 0xB6D6, - 46765 - 44032: 0x8CEA, - 46766 - 44032: 0x8CEB, - 46767 - 44032: 0x8CEC, - 46768 - 44032: 0x8CED, - 46769 - 44032: 0xB6D7, - 46770 - 44032: 0x8CEE, - 46771 - 44032: 0x8CEF, - 46772 - 44032: 0x8CF0, - 46773 - 44032: 0x8CF1, - 46774 - 44032: 0x8CF2, - 46775 - 44032: 0x8CF3, - 46776 - 44032: 0x8CF4, - 46777 - 44032: 0x8CF5, - 46778 - 44032: 0x8CF6, - 46779 - 44032: 0x8CF7, - 46780 - 44032: 0x8CF8, - 46781 - 44032: 0x8CF9, - 46782 - 44032: 0x8CFA, - 46783 - 44032: 0x8CFB, - 46784 - 44032: 0x8CFC, - 46785 - 44032: 0x8CFD, - 46786 - 44032: 0x8CFE, - 46787 - 44032: 0x8D41, - 46788 - 44032: 0x8D42, - 46789 - 44032: 0x8D43, - 46790 - 44032: 0x8D44, - 46791 - 44032: 0x8D45, - 46792 - 44032: 0x8D46, - 46793 - 44032: 0x8D47, - 46794 - 44032: 0x8D48, - 46795 - 44032: 0x8D49, - 46796 - 44032: 0x8D4A, - 46797 - 44032: 0x8D4B, - 46798 - 44032: 0x8D4C, - 46799 - 44032: 0x8D4D, - 46800 - 44032: 0x8D4E, - 46801 - 44032: 0x8D4F, - 46802 - 44032: 0x8D50, - 46803 - 44032: 0x8D51, - 46804 - 44032: 0xB6D8, - 46805 - 44032: 0x8D52, - 46806 - 44032: 0x8D53, - 46807 - 44032: 0x8D54, - 46808 - 44032: 0x8D55, - 46809 - 44032: 0x8D56, - 46810 - 44032: 0x8D57, - 46811 - 44032: 0x8D58, - 46812 - 44032: 0x8D59, - 46813 - 44032: 0x8D5A, - 46814 - 44032: 0x8D61, - 46815 - 44032: 0x8D62, - 46816 - 44032: 0x8D63, - 46817 - 44032: 0x8D64, - 46818 - 44032: 0x8D65, - 46819 - 44032: 0x8D66, - 46820 - 44032: 0x8D67, - 46821 - 44032: 0x8D68, - 46822 - 44032: 0x8D69, - 46823 - 44032: 0x8D6A, - 46824 - 44032: 0x8D6B, - 46825 - 44032: 0x8D6C, - 46826 - 44032: 0x8D6D, - 46827 - 44032: 0x8D6E, - 46828 - 44032: 0x8D6F, - 46829 - 44032: 0x8D70, - 46830 - 44032: 0x8D71, - 46831 - 44032: 0x8D72, - 46832 - 44032: 0xB6D9, - 46833 - 44032: 0x8D73, - 46834 - 44032: 0x8D74, - 46835 - 44032: 0x8D75, - 46836 - 44032: 0xB6DA, - 46837 - 44032: 0x8D76, - 46838 - 44032: 0x8D77, - 46839 - 44032: 0x8D78, - 46840 - 44032: 0xB6DB, - 46841 - 44032: 0x8D79, - 46842 - 44032: 0x8D7A, - 46843 - 44032: 0x8D81, - 46844 - 44032: 0x8D82, - 46845 - 44032: 0x8D83, - 46846 - 44032: 0x8D84, - 46847 - 44032: 0x8D85, - 46848 - 44032: 0xB6DC, - 46849 - 44032: 0xB6DD, - 46850 - 44032: 0x8D86, - 46851 - 44032: 0x8D87, - 46852 - 44032: 0x8D88, - 46853 - 44032: 0xB6DE, - 46854 - 44032: 0x8D89, - 46855 - 44032: 0x8D8A, - 46856 - 44032: 0x8D8B, - 46857 - 44032: 0x8D8C, - 46858 - 44032: 0x8D8D, - 46859 - 44032: 0x8D8E, - 46860 - 44032: 0x8D8F, - 46861 - 44032: 0x8D90, - 46862 - 44032: 0x8D91, - 46863 - 44032: 0x8D92, - 46864 - 44032: 0x8D93, - 46865 - 44032: 0x8D94, - 46866 - 44032: 0x8D95, - 46867 - 44032: 0x8D96, - 46868 - 44032: 0x8D97, - 46869 - 44032: 0x8D98, - 46870 - 44032: 0x8D99, - 46871 - 44032: 0x8D9A, - 46872 - 44032: 0x8D9B, - 46873 - 44032: 0x8D9C, - 46874 - 44032: 0x8D9D, - 46875 - 44032: 0x8D9E, - 46876 - 44032: 0x8D9F, - 46877 - 44032: 0x8DA0, - 46878 - 44032: 0x8DA1, - 46879 - 44032: 0x8DA2, - 46880 - 44032: 0x8DA3, - 46881 - 44032: 0x8DA4, - 46882 - 44032: 0x8DA5, - 46883 - 44032: 0x8DA6, - 46884 - 44032: 0x8DA7, - 46885 - 44032: 0x8DA8, - 46886 - 44032: 0x8DA9, - 46887 - 44032: 0x8DAA, - 46888 - 44032: 0xB6DF, - 46889 - 44032: 0xB6E0, - 46890 - 44032: 0x8DAB, - 46891 - 44032: 0x8DAC, - 46892 - 44032: 0xB6E1, - 46893 - 44032: 0x8DAD, - 46894 - 44032: 0x8DAE, - 46895 - 44032: 0xB6E2, - 46896 - 44032: 0xB6E3, - 46897 - 44032: 0x8DAF, - 46898 - 44032: 0x8DB0, - 46899 - 44032: 0x8DB1, - 46900 - 44032: 0x8DB2, - 46901 - 44032: 0x8DB3, - 46902 - 44032: 0x8DB4, - 46903 - 44032: 0x8DB5, - 46904 - 44032: 0xB6E4, - 46905 - 44032: 0xB6E5, - 46906 - 44032: 0x8DB6, - 46907 - 44032: 0xB6E6, - 46908 - 44032: 0x8DB7, - 46909 - 44032: 0x8DB8, - 46910 - 44032: 0x8DB9, - 46911 - 44032: 0x8DBA, - 46912 - 44032: 0x8DBB, - 46913 - 44032: 0x8DBC, - 46914 - 44032: 0x8DBD, - 46915 - 44032: 0x8DBE, - 46916 - 44032: 0xB6E7, - 46917 - 44032: 0x8DBF, - 46918 - 44032: 0x8DC0, - 46919 - 44032: 0x8DC1, - 46920 - 44032: 0xB6E8, - 46921 - 44032: 0x8DC2, - 46922 - 44032: 0x8DC3, - 46923 - 44032: 0x8DC4, - 46924 - 44032: 0xB6E9, - 46925 - 44032: 0x8DC5, - 46926 - 44032: 0x8DC6, - 46927 - 44032: 0x8DC7, - 46928 - 44032: 0x8DC8, - 46929 - 44032: 0x8DC9, - 46930 - 44032: 0x8DCA, - 46931 - 44032: 0x8DCB, - 46932 - 44032: 0xB6EA, - 46933 - 44032: 0xB6EB, - 46934 - 44032: 0x8DCC, - 46935 - 44032: 0x8DCD, - 46936 - 44032: 0x8DCE, - 46937 - 44032: 0x8DCF, - 46938 - 44032: 0x8DD0, - 46939 - 44032: 0x8DD1, - 46940 - 44032: 0x8DD2, - 46941 - 44032: 0x8DD3, - 46942 - 44032: 0x8DD4, - 46943 - 44032: 0x8DD5, - 46944 - 44032: 0xB6EC, - 46945 - 44032: 0x8DD6, - 46946 - 44032: 0x8DD7, - 46947 - 44032: 0x8DD8, - 46948 - 44032: 0xB6ED, - 46949 - 44032: 0x8DD9, - 46950 - 44032: 0x8DDA, - 46951 - 44032: 0x8DDB, - 46952 - 44032: 0xB6EE, - 46953 - 44032: 0x8DDC, - 46954 - 44032: 0x8DDD, - 46955 - 44032: 0x8DDE, - 46956 - 44032: 0x8DDF, - 46957 - 44032: 0x8DE0, - 46958 - 44032: 0x8DE1, - 46959 - 44032: 0x8DE2, - 46960 - 44032: 0xB6EF, - 46961 - 44032: 0xB6F0, - 46962 - 44032: 0x8DE3, - 46963 - 44032: 0xB6F1, - 46964 - 44032: 0x8DE4, - 46965 - 44032: 0xB6F2, - 46966 - 44032: 0x8DE5, - 46967 - 44032: 0x8DE6, - 46968 - 44032: 0x8DE7, - 46969 - 44032: 0x8DE8, - 46970 - 44032: 0x8DE9, - 46971 - 44032: 0x8DEA, - 46972 - 44032: 0xB6F3, - 46973 - 44032: 0xB6F4, - 46974 - 44032: 0x8DEB, - 46975 - 44032: 0x8DEC, - 46976 - 44032: 0xB6F5, - 46977 - 44032: 0x8DED, - 46978 - 44032: 0x8DEE, - 46979 - 44032: 0x8DEF, - 46980 - 44032: 0xB6F6, - 46981 - 44032: 0x8DF0, - 46982 - 44032: 0x8DF1, - 46983 - 44032: 0x8DF2, - 46984 - 44032: 0x8DF3, - 46985 - 44032: 0x8DF4, - 46986 - 44032: 0x8DF5, - 46987 - 44032: 0x8DF6, - 46988 - 44032: 0xB6F7, - 46989 - 44032: 0xB6F8, - 46990 - 44032: 0x8DF7, - 46991 - 44032: 0xB6F9, - 46992 - 44032: 0xB6FA, - 46993 - 44032: 0xB6FB, - 46994 - 44032: 0xB6FC, - 46995 - 44032: 0x8DF8, - 46996 - 44032: 0x8DF9, - 46997 - 44032: 0x8DFA, - 46998 - 44032: 0xB6FD, - 46999 - 44032: 0xB6FE, - 47000 - 44032: 0xB7A1, - 47001 - 44032: 0xB7A2, - 47002 - 44032: 0x8DFB, - 47003 - 44032: 0x8DFC, - 47004 - 44032: 0xB7A3, - 47005 - 44032: 0x8DFD, - 47006 - 44032: 0x8DFE, - 47007 - 44032: 0x8E41, - 47008 - 44032: 0xB7A4, - 47009 - 44032: 0x8E42, - 47010 - 44032: 0x8E43, - 47011 - 44032: 0x8E44, - 47012 - 44032: 0x8E45, - 47013 - 44032: 0x8E46, - 47014 - 44032: 0x8E47, - 47015 - 44032: 0x8E48, - 47016 - 44032: 0xB7A5, - 47017 - 44032: 0xB7A6, - 47018 - 44032: 0x8E49, - 47019 - 44032: 0xB7A7, - 47020 - 44032: 0xB7A8, - 47021 - 44032: 0xB7A9, - 47022 - 44032: 0x8E4A, - 47023 - 44032: 0x8E4B, - 47024 - 44032: 0x8E4C, - 47025 - 44032: 0x8E4D, - 47026 - 44032: 0x8E4E, - 47027 - 44032: 0x8E4F, - 47028 - 44032: 0xB7AA, - 47029 - 44032: 0xB7AB, - 47030 - 44032: 0x8E50, - 47031 - 44032: 0x8E51, - 47032 - 44032: 0xB7AC, - 47033 - 44032: 0x8E52, - 47034 - 44032: 0x8E53, - 47035 - 44032: 0x8E54, - 47036 - 44032: 0x8E55, - 47037 - 44032: 0x8E56, - 47038 - 44032: 0x8E57, - 47039 - 44032: 0x8E58, - 47040 - 44032: 0x8E59, - 47041 - 44032: 0x8E5A, - 47042 - 44032: 0x8E61, - 47043 - 44032: 0x8E62, - 47044 - 44032: 0x8E63, - 47045 - 44032: 0x8E64, - 47046 - 44032: 0x8E65, - 47047 - 44032: 0xB7AD, - 47048 - 44032: 0x8E66, - 47049 - 44032: 0xB7AE, - 47050 - 44032: 0x8E67, - 47051 - 44032: 0x8E68, - 47052 - 44032: 0x8E69, - 47053 - 44032: 0x8E6A, - 47054 - 44032: 0x8E6B, - 47055 - 44032: 0x8E6C, - 47056 - 44032: 0x8E6D, - 47057 - 44032: 0x8E6E, - 47058 - 44032: 0x8E6F, - 47059 - 44032: 0x8E70, - 47060 - 44032: 0x8E71, - 47061 - 44032: 0x8E72, - 47062 - 44032: 0x8E73, - 47063 - 44032: 0x8E74, - 47064 - 44032: 0x8E75, - 47065 - 44032: 0x8E76, - 47066 - 44032: 0x8E77, - 47067 - 44032: 0x8E78, - 47068 - 44032: 0x8E79, - 47069 - 44032: 0x8E7A, - 47070 - 44032: 0x8E81, - 47071 - 44032: 0x8E82, - 47072 - 44032: 0x8E83, - 47073 - 44032: 0x8E84, - 47074 - 44032: 0x8E85, - 47075 - 44032: 0x8E86, - 47076 - 44032: 0x8E87, - 47077 - 44032: 0x8E88, - 47078 - 44032: 0x8E89, - 47079 - 44032: 0x8E8A, - 47080 - 44032: 0x8E8B, - 47081 - 44032: 0x8E8C, - 47082 - 44032: 0x8E8D, - 47083 - 44032: 0x8E8E, - 47084 - 44032: 0xB7AF, - 47085 - 44032: 0xB7B0, - 47086 - 44032: 0x8E8F, - 47087 - 44032: 0x8E90, - 47088 - 44032: 0xB7B1, - 47089 - 44032: 0x8E91, - 47090 - 44032: 0x8E92, - 47091 - 44032: 0x8E93, - 47092 - 44032: 0xB7B2, - 47093 - 44032: 0x8E94, - 47094 - 44032: 0x8E95, - 47095 - 44032: 0x8E96, - 47096 - 44032: 0x8E97, - 47097 - 44032: 0x8E98, - 47098 - 44032: 0x8E99, - 47099 - 44032: 0x8E9A, - 47100 - 44032: 0xB7B3, - 47101 - 44032: 0xB7B4, - 47102 - 44032: 0x8E9B, - 47103 - 44032: 0xB7B5, - 47104 - 44032: 0xB7B6, - 47105 - 44032: 0xB7B7, - 47106 - 44032: 0x8E9C, - 47107 - 44032: 0x8E9D, - 47108 - 44032: 0x8E9E, - 47109 - 44032: 0x8E9F, - 47110 - 44032: 0x8EA0, - 47111 - 44032: 0xB7B8, - 47112 - 44032: 0xB7B9, - 47113 - 44032: 0xB7BA, - 47114 - 44032: 0x8EA1, - 47115 - 44032: 0x8EA2, - 47116 - 44032: 0xB7BB, - 47117 - 44032: 0x8EA3, - 47118 - 44032: 0x8EA4, - 47119 - 44032: 0x8EA5, - 47120 - 44032: 0xB7BC, - 47121 - 44032: 0x8EA6, - 47122 - 44032: 0x8EA7, - 47123 - 44032: 0x8EA8, - 47124 - 44032: 0x8EA9, - 47125 - 44032: 0x8EAA, - 47126 - 44032: 0x8EAB, - 47127 - 44032: 0x8EAC, - 47128 - 44032: 0xB7BD, - 47129 - 44032: 0xB7BE, - 47130 - 44032: 0x8EAD, - 47131 - 44032: 0xB7BF, - 47132 - 44032: 0x8EAE, - 47133 - 44032: 0xB7C0, - 47134 - 44032: 0x8EAF, - 47135 - 44032: 0x8EB0, - 47136 - 44032: 0x8EB1, - 47137 - 44032: 0x8EB2, - 47138 - 44032: 0x8EB3, - 47139 - 44032: 0x8EB4, - 47140 - 44032: 0xB7C1, - 47141 - 44032: 0xB7C2, - 47142 - 44032: 0x8EB5, - 47143 - 44032: 0x8EB6, - 47144 - 44032: 0xB7C3, - 47145 - 44032: 0x8EB7, - 47146 - 44032: 0x8EB8, - 47147 - 44032: 0x8EB9, - 47148 - 44032: 0xB7C4, - 47149 - 44032: 0x8EBA, - 47150 - 44032: 0x8EBB, - 47151 - 44032: 0x8EBC, - 47152 - 44032: 0x8EBD, - 47153 - 44032: 0x8EBE, - 47154 - 44032: 0x8EBF, - 47155 - 44032: 0x8EC0, - 47156 - 44032: 0xB7C5, - 47157 - 44032: 0xB7C6, - 47158 - 44032: 0x8EC1, - 47159 - 44032: 0xB7C7, - 47160 - 44032: 0xB7C8, - 47161 - 44032: 0xB7C9, - 47162 - 44032: 0x8EC2, - 47163 - 44032: 0x8EC3, - 47164 - 44032: 0x8EC4, - 47165 - 44032: 0x8EC5, - 47166 - 44032: 0x8EC6, - 47167 - 44032: 0x8EC7, - 47168 - 44032: 0xB7CA, - 47169 - 44032: 0x8EC8, - 47170 - 44032: 0x8EC9, - 47171 - 44032: 0x8ECA, - 47172 - 44032: 0xB7CB, - 47173 - 44032: 0x8ECB, - 47174 - 44032: 0x8ECC, - 47175 - 44032: 0x8ECD, - 47176 - 44032: 0x8ECE, - 47177 - 44032: 0x8ECF, - 47178 - 44032: 0x8ED0, - 47179 - 44032: 0x8ED1, - 47180 - 44032: 0x8ED2, - 47181 - 44032: 0x8ED3, - 47182 - 44032: 0x8ED4, - 47183 - 44032: 0x8ED5, - 47184 - 44032: 0x8ED6, - 47185 - 44032: 0xB7CC, - 47186 - 44032: 0x8ED7, - 47187 - 44032: 0xB7CD, - 47188 - 44032: 0x8ED8, - 47189 - 44032: 0x8ED9, - 47190 - 44032: 0x8EDA, - 47191 - 44032: 0x8EDB, - 47192 - 44032: 0x8EDC, - 47193 - 44032: 0x8EDD, - 47194 - 44032: 0x8EDE, - 47195 - 44032: 0x8EDF, - 47196 - 44032: 0xB7CE, - 47197 - 44032: 0xB7CF, - 47198 - 44032: 0x8EE0, - 47199 - 44032: 0x8EE1, - 47200 - 44032: 0xB7D0, - 47201 - 44032: 0x8EE2, - 47202 - 44032: 0x8EE3, - 47203 - 44032: 0x8EE4, - 47204 - 44032: 0xB7D1, - 47205 - 44032: 0x8EE5, - 47206 - 44032: 0x8EE6, - 47207 - 44032: 0x8EE7, - 47208 - 44032: 0x8EE8, - 47209 - 44032: 0x8EE9, - 47210 - 44032: 0x8EEA, - 47211 - 44032: 0x8EEB, - 47212 - 44032: 0xB7D2, - 47213 - 44032: 0xB7D3, - 47214 - 44032: 0x8EEC, - 47215 - 44032: 0xB7D4, - 47216 - 44032: 0x8EED, - 47217 - 44032: 0xB7D5, - 47218 - 44032: 0x8EEE, - 47219 - 44032: 0x8EEF, - 47220 - 44032: 0x8EF0, - 47221 - 44032: 0x8EF1, - 47222 - 44032: 0x8EF2, - 47223 - 44032: 0x8EF3, - 47224 - 44032: 0xB7D6, - 47225 - 44032: 0x8EF4, - 47226 - 44032: 0x8EF5, - 47227 - 44032: 0x8EF6, - 47228 - 44032: 0xB7D7, - 47229 - 44032: 0x8EF7, - 47230 - 44032: 0x8EF8, - 47231 - 44032: 0x8EF9, - 47232 - 44032: 0x8EFA, - 47233 - 44032: 0x8EFB, - 47234 - 44032: 0x8EFC, - 47235 - 44032: 0x8EFD, - 47236 - 44032: 0x8EFE, - 47237 - 44032: 0x8F41, - 47238 - 44032: 0x8F42, - 47239 - 44032: 0x8F43, - 47240 - 44032: 0x8F44, - 47241 - 44032: 0x8F45, - 47242 - 44032: 0x8F46, - 47243 - 44032: 0x8F47, - 47244 - 44032: 0x8F48, - 47245 - 44032: 0xB7D8, - 47246 - 44032: 0x8F49, - 47247 - 44032: 0x8F4A, - 47248 - 44032: 0x8F4B, - 47249 - 44032: 0x8F4C, - 47250 - 44032: 0x8F4D, - 47251 - 44032: 0x8F4E, - 47252 - 44032: 0x8F4F, - 47253 - 44032: 0x8F50, - 47254 - 44032: 0x8F51, - 47255 - 44032: 0x8F52, - 47256 - 44032: 0x8F53, - 47257 - 44032: 0x8F54, - 47258 - 44032: 0x8F55, - 47259 - 44032: 0x8F56, - 47260 - 44032: 0x8F57, - 47261 - 44032: 0x8F58, - 47262 - 44032: 0x8F59, - 47263 - 44032: 0x8F5A, - 47264 - 44032: 0x8F61, - 47265 - 44032: 0x8F62, - 47266 - 44032: 0x8F63, - 47267 - 44032: 0x8F64, - 47268 - 44032: 0x8F65, - 47269 - 44032: 0x8F66, - 47270 - 44032: 0x8F67, - 47271 - 44032: 0x8F68, - 47272 - 44032: 0xB7D9, - 47273 - 44032: 0x8F69, - 47274 - 44032: 0x8F6A, - 47275 - 44032: 0x8F6B, - 47276 - 44032: 0x8F6C, - 47277 - 44032: 0x8F6D, - 47278 - 44032: 0x8F6E, - 47279 - 44032: 0x8F6F, - 47280 - 44032: 0xB7DA, - 47281 - 44032: 0x8F70, - 47282 - 44032: 0x8F71, - 47283 - 44032: 0x8F72, - 47284 - 44032: 0xB7DB, - 47285 - 44032: 0x8F73, - 47286 - 44032: 0x8F74, - 47287 - 44032: 0x8F75, - 47288 - 44032: 0xB7DC, - 47289 - 44032: 0x8F76, - 47290 - 44032: 0x8F77, - 47291 - 44032: 0x8F78, - 47292 - 44032: 0x8F79, - 47293 - 44032: 0x8F7A, - 47294 - 44032: 0x8F81, - 47295 - 44032: 0x8F82, - 47296 - 44032: 0xB7DD, - 47297 - 44032: 0xB7DE, - 47298 - 44032: 0x8F83, - 47299 - 44032: 0xB7DF, - 47300 - 44032: 0x8F84, - 47301 - 44032: 0xB7E0, - 47302 - 44032: 0x8F85, - 47303 - 44032: 0x8F86, - 47304 - 44032: 0x8F87, - 47305 - 44032: 0x8F88, - 47306 - 44032: 0x8F89, - 47307 - 44032: 0x8F8A, - 47308 - 44032: 0xB7E1, - 47309 - 44032: 0x8F8B, - 47310 - 44032: 0x8F8C, - 47311 - 44032: 0x8F8D, - 47312 - 44032: 0xB7E2, - 47313 - 44032: 0x8F8E, - 47314 - 44032: 0x8F8F, - 47315 - 44032: 0x8F90, - 47316 - 44032: 0xB7E3, - 47317 - 44032: 0x8F91, - 47318 - 44032: 0x8F92, - 47319 - 44032: 0x8F93, - 47320 - 44032: 0x8F94, - 47321 - 44032: 0x8F95, - 47322 - 44032: 0x8F96, - 47323 - 44032: 0x8F97, - 47324 - 44032: 0x8F98, - 47325 - 44032: 0xB7E4, - 47326 - 44032: 0x8F99, - 47327 - 44032: 0xB7E5, - 47328 - 44032: 0x8F9A, - 47329 - 44032: 0xB7E6, - 47330 - 44032: 0x8F9B, - 47331 - 44032: 0x8F9C, - 47332 - 44032: 0x8F9D, - 47333 - 44032: 0x8F9E, - 47334 - 44032: 0x8F9F, - 47335 - 44032: 0x8FA0, - 47336 - 44032: 0xB7E7, - 47337 - 44032: 0xB7E8, - 47338 - 44032: 0x8FA1, - 47339 - 44032: 0x8FA2, - 47340 - 44032: 0xB7E9, - 47341 - 44032: 0x8FA3, - 47342 - 44032: 0x8FA4, - 47343 - 44032: 0x8FA5, - 47344 - 44032: 0xB7EA, - 47345 - 44032: 0x8FA6, - 47346 - 44032: 0x8FA7, - 47347 - 44032: 0x8FA8, - 47348 - 44032: 0x8FA9, - 47349 - 44032: 0x8FAA, - 47350 - 44032: 0x8FAB, - 47351 - 44032: 0x8FAC, - 47352 - 44032: 0xB7EB, - 47353 - 44032: 0xB7EC, - 47354 - 44032: 0x8FAD, - 47355 - 44032: 0xB7ED, - 47356 - 44032: 0x8FAE, - 47357 - 44032: 0xB7EE, - 47358 - 44032: 0x8FAF, - 47359 - 44032: 0x8FB0, - 47360 - 44032: 0x8FB1, - 47361 - 44032: 0x8FB2, - 47362 - 44032: 0x8FB3, - 47363 - 44032: 0x8FB4, - 47364 - 44032: 0xB7EF, - 47365 - 44032: 0x8FB5, - 47366 - 44032: 0x8FB6, - 47367 - 44032: 0x8FB7, - 47368 - 44032: 0x8FB8, - 47369 - 44032: 0x8FB9, - 47370 - 44032: 0x8FBA, - 47371 - 44032: 0x8FBB, - 47372 - 44032: 0x8FBC, - 47373 - 44032: 0x8FBD, - 47374 - 44032: 0x8FBE, - 47375 - 44032: 0x8FBF, - 47376 - 44032: 0x8FC0, - 47377 - 44032: 0x8FC1, - 47378 - 44032: 0x8FC2, - 47379 - 44032: 0x8FC3, - 47380 - 44032: 0x8FC4, - 47381 - 44032: 0x8FC5, - 47382 - 44032: 0x8FC6, - 47383 - 44032: 0x8FC7, - 47384 - 44032: 0xB7F0, - 47385 - 44032: 0x8FC8, - 47386 - 44032: 0x8FC9, - 47387 - 44032: 0x8FCA, - 47388 - 44032: 0x8FCB, - 47389 - 44032: 0x8FCC, - 47390 - 44032: 0x8FCD, - 47391 - 44032: 0x8FCE, - 47392 - 44032: 0xB7F1, - 47393 - 44032: 0x8FCF, - 47394 - 44032: 0x8FD0, - 47395 - 44032: 0x8FD1, - 47396 - 44032: 0x8FD2, - 47397 - 44032: 0x8FD3, - 47398 - 44032: 0x8FD4, - 47399 - 44032: 0x8FD5, - 47400 - 44032: 0x8FD6, - 47401 - 44032: 0x8FD7, - 47402 - 44032: 0x8FD8, - 47403 - 44032: 0x8FD9, - 47404 - 44032: 0x8FDA, - 47405 - 44032: 0x8FDB, - 47406 - 44032: 0x8FDC, - 47407 - 44032: 0x8FDD, - 47408 - 44032: 0x8FDE, - 47409 - 44032: 0x8FDF, - 47410 - 44032: 0x8FE0, - 47411 - 44032: 0x8FE1, - 47412 - 44032: 0x8FE2, - 47413 - 44032: 0x8FE3, - 47414 - 44032: 0x8FE4, - 47415 - 44032: 0x8FE5, - 47416 - 44032: 0x8FE6, - 47417 - 44032: 0x8FE7, - 47418 - 44032: 0x8FE8, - 47419 - 44032: 0x8FE9, - 47420 - 44032: 0xB7F2, - 47421 - 44032: 0xB7F3, - 47422 - 44032: 0x8FEA, - 47423 - 44032: 0x8FEB, - 47424 - 44032: 0xB7F4, - 47425 - 44032: 0x8FEC, - 47426 - 44032: 0x8FED, - 47427 - 44032: 0x8FEE, - 47428 - 44032: 0xB7F5, - 47429 - 44032: 0x8FEF, - 47430 - 44032: 0x8FF0, - 47431 - 44032: 0x8FF1, - 47432 - 44032: 0x8FF2, - 47433 - 44032: 0x8FF3, - 47434 - 44032: 0x8FF4, - 47435 - 44032: 0x8FF5, - 47436 - 44032: 0xB7F6, - 47437 - 44032: 0x8FF6, - 47438 - 44032: 0x8FF7, - 47439 - 44032: 0xB7F7, - 47440 - 44032: 0x8FF8, - 47441 - 44032: 0xB7F8, - 47442 - 44032: 0x8FF9, - 47443 - 44032: 0x8FFA, - 47444 - 44032: 0x8FFB, - 47445 - 44032: 0x8FFC, - 47446 - 44032: 0x8FFD, - 47447 - 44032: 0x8FFE, - 47448 - 44032: 0xB7F9, - 47449 - 44032: 0xB7FA, - 47450 - 44032: 0x9041, - 47451 - 44032: 0x9042, - 47452 - 44032: 0xB7FB, - 47453 - 44032: 0x9043, - 47454 - 44032: 0x9044, - 47455 - 44032: 0x9045, - 47456 - 44032: 0xB7FC, - 47457 - 44032: 0x9046, - 47458 - 44032: 0x9047, - 47459 - 44032: 0x9048, - 47460 - 44032: 0x9049, - 47461 - 44032: 0x904A, - 47462 - 44032: 0x904B, - 47463 - 44032: 0x904C, - 47464 - 44032: 0xB7FD, - 47465 - 44032: 0xB7FE, - 47466 - 44032: 0x904D, - 47467 - 44032: 0xB8A1, - 47468 - 44032: 0x904E, - 47469 - 44032: 0xB8A2, - 47470 - 44032: 0x904F, - 47471 - 44032: 0x9050, - 47472 - 44032: 0x9051, - 47473 - 44032: 0x9052, - 47474 - 44032: 0x9053, - 47475 - 44032: 0x9054, - 47476 - 44032: 0xB8A3, - 47477 - 44032: 0xB8A4, - 47478 - 44032: 0x9055, - 47479 - 44032: 0x9056, - 47480 - 44032: 0xB8A5, - 47481 - 44032: 0x9057, - 47482 - 44032: 0x9058, - 47483 - 44032: 0x9059, - 47484 - 44032: 0xB8A6, - 47485 - 44032: 0x905A, - 47486 - 44032: 0x9061, - 47487 - 44032: 0x9062, - 47488 - 44032: 0x9063, - 47489 - 44032: 0x9064, - 47490 - 44032: 0x9065, - 47491 - 44032: 0x9066, - 47492 - 44032: 0xB8A7, - 47493 - 44032: 0xB8A8, - 47494 - 44032: 0x9067, - 47495 - 44032: 0xB8A9, - 47496 - 44032: 0x9068, - 47497 - 44032: 0xB8AA, - 47498 - 44032: 0xB8AB, - 47499 - 44032: 0x9069, - 47500 - 44032: 0x906A, - 47501 - 44032: 0xB8AC, - 47502 - 44032: 0xB8AD, - 47503 - 44032: 0x906B, - 47504 - 44032: 0x906C, - 47505 - 44032: 0x906D, - 47506 - 44032: 0x906E, - 47507 - 44032: 0x906F, - 47508 - 44032: 0x9070, - 47509 - 44032: 0x9071, - 47510 - 44032: 0x9072, - 47511 - 44032: 0x9073, - 47512 - 44032: 0x9074, - 47513 - 44032: 0x9075, - 47514 - 44032: 0x9076, - 47515 - 44032: 0x9077, - 47516 - 44032: 0x9078, - 47517 - 44032: 0x9079, - 47518 - 44032: 0x907A, - 47519 - 44032: 0x9081, - 47520 - 44032: 0x9082, - 47521 - 44032: 0x9083, - 47522 - 44032: 0x9084, - 47523 - 44032: 0x9085, - 47524 - 44032: 0x9086, - 47525 - 44032: 0x9087, - 47526 - 44032: 0x9088, - 47527 - 44032: 0x9089, - 47528 - 44032: 0x908A, - 47529 - 44032: 0x908B, - 47530 - 44032: 0x908C, - 47531 - 44032: 0x908D, - 47532 - 44032: 0xB8AE, - 47533 - 44032: 0xB8AF, - 47534 - 44032: 0x908E, - 47535 - 44032: 0x908F, - 47536 - 44032: 0xB8B0, - 47537 - 44032: 0x9090, - 47538 - 44032: 0x9091, - 47539 - 44032: 0x9092, - 47540 - 44032: 0xB8B1, - 47541 - 44032: 0x9093, - 47542 - 44032: 0x9094, - 47543 - 44032: 0x9095, - 47544 - 44032: 0x9096, - 47545 - 44032: 0x9097, - 47546 - 44032: 0x9098, - 47547 - 44032: 0x9099, - 47548 - 44032: 0xB8B2, - 47549 - 44032: 0xB8B3, - 47550 - 44032: 0x909A, - 47551 - 44032: 0xB8B4, - 47552 - 44032: 0x909B, - 47553 - 44032: 0xB8B5, - 47554 - 44032: 0x909C, - 47555 - 44032: 0x909D, - 47556 - 44032: 0x909E, - 47557 - 44032: 0x909F, - 47558 - 44032: 0x90A0, - 47559 - 44032: 0x90A1, - 47560 - 44032: 0xB8B6, - 47561 - 44032: 0xB8B7, - 47562 - 44032: 0x90A2, - 47563 - 44032: 0x90A3, - 47564 - 44032: 0xB8B8, - 47565 - 44032: 0x90A4, - 47566 - 44032: 0xB8B9, - 47567 - 44032: 0xB8BA, - 47568 - 44032: 0xB8BB, - 47569 - 44032: 0xB8BC, - 47570 - 44032: 0xB8BD, - 47571 - 44032: 0x90A5, - 47572 - 44032: 0x90A6, - 47573 - 44032: 0x90A7, - 47574 - 44032: 0x90A8, - 47575 - 44032: 0x90A9, - 47576 - 44032: 0xB8BE, - 47577 - 44032: 0xB8BF, - 47578 - 44032: 0x90AA, - 47579 - 44032: 0xB8C0, - 47580 - 44032: 0x90AB, - 47581 - 44032: 0xB8C1, - 47582 - 44032: 0xB8C2, - 47583 - 44032: 0x90AC, - 47584 - 44032: 0x90AD, - 47585 - 44032: 0xB8C3, - 47586 - 44032: 0x90AE, - 47587 - 44032: 0xB8C4, - 47588 - 44032: 0xB8C5, - 47589 - 44032: 0xB8C6, - 47590 - 44032: 0x90AF, - 47591 - 44032: 0x90B0, - 47592 - 44032: 0xB8C7, - 47593 - 44032: 0x90B1, - 47594 - 44032: 0x90B2, - 47595 - 44032: 0x90B3, - 47596 - 44032: 0xB8C8, - 47597 - 44032: 0x90B4, - 47598 - 44032: 0x90B5, - 47599 - 44032: 0x90B6, - 47600 - 44032: 0x90B7, - 47601 - 44032: 0x90B8, - 47602 - 44032: 0x90B9, - 47603 - 44032: 0x90BA, - 47604 - 44032: 0xB8C9, - 47605 - 44032: 0xB8CA, - 47606 - 44032: 0x90BB, - 47607 - 44032: 0xB8CB, - 47608 - 44032: 0xB8CC, - 47609 - 44032: 0xB8CD, - 47610 - 44032: 0xB8CE, - 47611 - 44032: 0x90BC, - 47612 - 44032: 0x90BD, - 47613 - 44032: 0x90BE, - 47614 - 44032: 0x90BF, - 47615 - 44032: 0x90C0, - 47616 - 44032: 0xB8CF, - 47617 - 44032: 0xB8D0, - 47618 - 44032: 0x90C1, - 47619 - 44032: 0x90C2, - 47620 - 44032: 0x90C3, - 47621 - 44032: 0x90C4, - 47622 - 44032: 0x90C5, - 47623 - 44032: 0x90C6, - 47624 - 44032: 0xB8D1, - 47625 - 44032: 0x90C7, - 47626 - 44032: 0x90C8, - 47627 - 44032: 0x90C9, - 47628 - 44032: 0x90CA, - 47629 - 44032: 0x90CB, - 47630 - 44032: 0x90CC, - 47631 - 44032: 0x90CD, - 47632 - 44032: 0x90CE, - 47633 - 44032: 0x90CF, - 47634 - 44032: 0x90D0, - 47635 - 44032: 0x90D1, - 47636 - 44032: 0x90D2, - 47637 - 44032: 0xB8D2, - 47638 - 44032: 0x90D3, - 47639 - 44032: 0x90D4, - 47640 - 44032: 0x90D5, - 47641 - 44032: 0x90D6, - 47642 - 44032: 0x90D7, - 47643 - 44032: 0x90D8, - 47644 - 44032: 0x90D9, - 47645 - 44032: 0x90DA, - 47646 - 44032: 0x90DB, - 47647 - 44032: 0x90DC, - 47648 - 44032: 0x90DD, - 47649 - 44032: 0x90DE, - 47650 - 44032: 0x90DF, - 47651 - 44032: 0x90E0, - 47652 - 44032: 0x90E1, - 47653 - 44032: 0x90E2, - 47654 - 44032: 0x90E3, - 47655 - 44032: 0x90E4, - 47656 - 44032: 0x90E5, - 47657 - 44032: 0x90E6, - 47658 - 44032: 0x90E7, - 47659 - 44032: 0x90E8, - 47660 - 44032: 0x90E9, - 47661 - 44032: 0x90EA, - 47662 - 44032: 0x90EB, - 47663 - 44032: 0x90EC, - 47664 - 44032: 0x90ED, - 47665 - 44032: 0x90EE, - 47666 - 44032: 0x90EF, - 47667 - 44032: 0x90F0, - 47668 - 44032: 0x90F1, - 47669 - 44032: 0x90F2, - 47670 - 44032: 0x90F3, - 47671 - 44032: 0x90F4, - 47672 - 44032: 0xB8D3, - 47673 - 44032: 0xB8D4, - 47674 - 44032: 0x90F5, - 47675 - 44032: 0x90F6, - 47676 - 44032: 0xB8D5, - 47677 - 44032: 0x90F7, - 47678 - 44032: 0x90F8, - 47679 - 44032: 0x90F9, - 47680 - 44032: 0xB8D6, - 47681 - 44032: 0x90FA, - 47682 - 44032: 0xB8D7, - 47683 - 44032: 0x90FB, - 47684 - 44032: 0x90FC, - 47685 - 44032: 0x90FD, - 47686 - 44032: 0x90FE, - 47687 - 44032: 0x9141, - 47688 - 44032: 0xB8D8, - 47689 - 44032: 0xB8D9, - 47690 - 44032: 0x9142, - 47691 - 44032: 0xB8DA, - 47692 - 44032: 0x9143, - 47693 - 44032: 0xB8DB, - 47694 - 44032: 0xB8DC, - 47695 - 44032: 0x9144, - 47696 - 44032: 0x9145, - 47697 - 44032: 0x9146, - 47698 - 44032: 0x9147, - 47699 - 44032: 0xB8DD, - 47700 - 44032: 0xB8DE, - 47701 - 44032: 0xB8DF, - 47702 - 44032: 0x9148, - 47703 - 44032: 0x9149, - 47704 - 44032: 0xB8E0, - 47705 - 44032: 0x914A, - 47706 - 44032: 0x914B, - 47707 - 44032: 0x914C, - 47708 - 44032: 0xB8E1, - 47709 - 44032: 0x914D, - 47710 - 44032: 0x914E, - 47711 - 44032: 0x914F, - 47712 - 44032: 0x9150, - 47713 - 44032: 0x9151, - 47714 - 44032: 0x9152, - 47715 - 44032: 0x9153, - 47716 - 44032: 0xB8E2, - 47717 - 44032: 0xB8E3, - 47718 - 44032: 0x9154, - 47719 - 44032: 0xB8E4, - 47720 - 44032: 0xB8E5, - 47721 - 44032: 0xB8E6, - 47722 - 44032: 0x9155, - 47723 - 44032: 0x9156, - 47724 - 44032: 0x9157, - 47725 - 44032: 0x9158, - 47726 - 44032: 0x9159, - 47727 - 44032: 0x915A, - 47728 - 44032: 0xB8E7, - 47729 - 44032: 0xB8E8, - 47730 - 44032: 0x9161, - 47731 - 44032: 0x9162, - 47732 - 44032: 0xB8E9, - 47733 - 44032: 0x9163, - 47734 - 44032: 0x9164, - 47735 - 44032: 0x9165, - 47736 - 44032: 0xB8EA, - 47737 - 44032: 0x9166, - 47738 - 44032: 0x9167, - 47739 - 44032: 0x9168, - 47740 - 44032: 0x9169, - 47741 - 44032: 0x916A, - 47742 - 44032: 0x916B, - 47743 - 44032: 0x916C, - 47744 - 44032: 0x916D, - 47745 - 44032: 0x916E, - 47746 - 44032: 0x916F, - 47747 - 44032: 0xB8EB, - 47748 - 44032: 0xB8EC, - 47749 - 44032: 0xB8ED, - 47750 - 44032: 0x9170, - 47751 - 44032: 0xB8EE, - 47752 - 44032: 0x9171, - 47753 - 44032: 0x9172, - 47754 - 44032: 0x9173, - 47755 - 44032: 0x9174, - 47756 - 44032: 0xB8EF, - 47757 - 44032: 0x9175, - 47758 - 44032: 0x9176, - 47759 - 44032: 0x9177, - 47760 - 44032: 0x9178, - 47761 - 44032: 0x9179, - 47762 - 44032: 0x917A, - 47763 - 44032: 0x9181, - 47764 - 44032: 0x9182, - 47765 - 44032: 0x9183, - 47766 - 44032: 0x9184, - 47767 - 44032: 0x9185, - 47768 - 44032: 0x9186, - 47769 - 44032: 0x9187, - 47770 - 44032: 0x9188, - 47771 - 44032: 0x9189, - 47772 - 44032: 0x918A, - 47773 - 44032: 0x918B, - 47774 - 44032: 0x918C, - 47775 - 44032: 0x918D, - 47776 - 44032: 0x918E, - 47777 - 44032: 0x918F, - 47778 - 44032: 0x9190, - 47779 - 44032: 0x9191, - 47780 - 44032: 0x9192, - 47781 - 44032: 0x9193, - 47782 - 44032: 0x9194, - 47783 - 44032: 0x9195, - 47784 - 44032: 0xB8F0, - 47785 - 44032: 0xB8F1, - 47786 - 44032: 0x9196, - 47787 - 44032: 0xB8F2, - 47788 - 44032: 0xB8F3, - 47789 - 44032: 0x9197, - 47790 - 44032: 0x9198, - 47791 - 44032: 0x9199, - 47792 - 44032: 0xB8F4, - 47793 - 44032: 0x919A, - 47794 - 44032: 0xB8F5, - 47795 - 44032: 0x919B, - 47796 - 44032: 0x919C, - 47797 - 44032: 0x919D, - 47798 - 44032: 0x919E, - 47799 - 44032: 0x919F, - 47800 - 44032: 0xB8F6, - 47801 - 44032: 0xB8F7, - 47802 - 44032: 0x91A0, - 47803 - 44032: 0xB8F8, - 47804 - 44032: 0x91A1, - 47805 - 44032: 0xB8F9, - 47806 - 44032: 0x91A2, - 47807 - 44032: 0x91A3, - 47808 - 44032: 0x91A4, - 47809 - 44032: 0x91A5, - 47810 - 44032: 0x91A6, - 47811 - 44032: 0x91A7, - 47812 - 44032: 0xB8FA, - 47813 - 44032: 0x91A8, - 47814 - 44032: 0x91A9, - 47815 - 44032: 0x91AA, - 47816 - 44032: 0xB8FB, - 47817 - 44032: 0x91AB, - 47818 - 44032: 0x91AC, - 47819 - 44032: 0x91AD, - 47820 - 44032: 0x91AE, - 47821 - 44032: 0x91AF, - 47822 - 44032: 0x91B0, - 47823 - 44032: 0x91B1, - 47824 - 44032: 0x91B2, - 47825 - 44032: 0x91B3, - 47826 - 44032: 0x91B4, - 47827 - 44032: 0x91B5, - 47828 - 44032: 0x91B6, - 47829 - 44032: 0x91B7, - 47830 - 44032: 0x91B8, - 47831 - 44032: 0x91B9, - 47832 - 44032: 0xB8FC, - 47833 - 44032: 0xB8FD, - 47834 - 44032: 0x91BA, - 47835 - 44032: 0x91BB, - 47836 - 44032: 0x91BC, - 47837 - 44032: 0x91BD, - 47838 - 44032: 0x91BE, - 47839 - 44032: 0x91BF, - 47840 - 44032: 0x91C0, - 47841 - 44032: 0x91C1, - 47842 - 44032: 0x91C2, - 47843 - 44032: 0x91C3, - 47844 - 44032: 0x91C4, - 47845 - 44032: 0x91C5, - 47846 - 44032: 0x91C6, - 47847 - 44032: 0x91C7, - 47848 - 44032: 0x91C8, - 47849 - 44032: 0x91C9, - 47850 - 44032: 0x91CA, - 47851 - 44032: 0x91CB, - 47852 - 44032: 0x91CC, - 47853 - 44032: 0x91CD, - 47854 - 44032: 0x91CE, - 47855 - 44032: 0x91CF, - 47856 - 44032: 0x91D0, - 47857 - 44032: 0x91D1, - 47858 - 44032: 0x91D2, - 47859 - 44032: 0x91D3, - 47860 - 44032: 0x91D4, - 47861 - 44032: 0x91D5, - 47862 - 44032: 0x91D6, - 47863 - 44032: 0x91D7, - 47864 - 44032: 0x91D8, - 47865 - 44032: 0x91D9, - 47866 - 44032: 0x91DA, - 47867 - 44032: 0x91DB, - 47868 - 44032: 0xB8FE, - 47869 - 44032: 0x91DC, - 47870 - 44032: 0x91DD, - 47871 - 44032: 0x91DE, - 47872 - 44032: 0xB9A1, - 47873 - 44032: 0x91DF, - 47874 - 44032: 0x91E0, - 47875 - 44032: 0x91E1, - 47876 - 44032: 0xB9A2, - 47877 - 44032: 0x91E2, - 47878 - 44032: 0x91E3, - 47879 - 44032: 0x91E4, - 47880 - 44032: 0x91E5, - 47881 - 44032: 0x91E6, - 47882 - 44032: 0x91E7, - 47883 - 44032: 0x91E8, - 47884 - 44032: 0x91E9, - 47885 - 44032: 0xB9A3, - 47886 - 44032: 0x91EA, - 47887 - 44032: 0xB9A4, - 47888 - 44032: 0x91EB, - 47889 - 44032: 0xB9A5, - 47890 - 44032: 0x91EC, - 47891 - 44032: 0x91ED, - 47892 - 44032: 0x91EE, - 47893 - 44032: 0x91EF, - 47894 - 44032: 0x91F0, - 47895 - 44032: 0x91F1, - 47896 - 44032: 0xB9A6, - 47897 - 44032: 0x91F2, - 47898 - 44032: 0x91F3, - 47899 - 44032: 0x91F4, - 47900 - 44032: 0xB9A7, - 47901 - 44032: 0x91F5, - 47902 - 44032: 0x91F6, - 47903 - 44032: 0x91F7, - 47904 - 44032: 0xB9A8, - 47905 - 44032: 0x91F8, - 47906 - 44032: 0x91F9, - 47907 - 44032: 0x91FA, - 47908 - 44032: 0x91FB, - 47909 - 44032: 0x91FC, - 47910 - 44032: 0x91FD, - 47911 - 44032: 0x91FE, - 47912 - 44032: 0x9241, - 47913 - 44032: 0xB9A9, - 47914 - 44032: 0x9242, - 47915 - 44032: 0xB9AA, - 47916 - 44032: 0x9243, - 47917 - 44032: 0x9244, - 47918 - 44032: 0x9245, - 47919 - 44032: 0x9246, - 47920 - 44032: 0x9247, - 47921 - 44032: 0x9248, - 47922 - 44032: 0x9249, - 47923 - 44032: 0x924A, - 47924 - 44032: 0xB9AB, - 47925 - 44032: 0xB9AC, - 47926 - 44032: 0xB9AD, - 47927 - 44032: 0x924B, - 47928 - 44032: 0xB9AE, - 47929 - 44032: 0x924C, - 47930 - 44032: 0x924D, - 47931 - 44032: 0xB9AF, - 47932 - 44032: 0xB9B0, - 47933 - 44032: 0xB9B1, - 47934 - 44032: 0xB9B2, - 47935 - 44032: 0x924E, - 47936 - 44032: 0x924F, - 47937 - 44032: 0x9250, - 47938 - 44032: 0x9251, - 47939 - 44032: 0x9252, - 47940 - 44032: 0xB9B3, - 47941 - 44032: 0xB9B4, - 47942 - 44032: 0x9253, - 47943 - 44032: 0xB9B5, - 47944 - 44032: 0x9254, - 47945 - 44032: 0xB9B6, - 47946 - 44032: 0x9255, - 47947 - 44032: 0x9256, - 47948 - 44032: 0x9257, - 47949 - 44032: 0xB9B7, - 47950 - 44032: 0x9258, - 47951 - 44032: 0xB9B8, - 47952 - 44032: 0xB9B9, - 47953 - 44032: 0x9259, - 47954 - 44032: 0x925A, - 47955 - 44032: 0x9261, - 47956 - 44032: 0xB9BA, - 47957 - 44032: 0x9262, - 47958 - 44032: 0x9263, - 47959 - 44032: 0x9264, - 47960 - 44032: 0xB9BB, - 47961 - 44032: 0x9265, - 47962 - 44032: 0x9266, - 47963 - 44032: 0x9267, - 47964 - 44032: 0x9268, - 47965 - 44032: 0x9269, - 47966 - 44032: 0x926A, - 47967 - 44032: 0x926B, - 47968 - 44032: 0x926C, - 47969 - 44032: 0xB9BC, - 47970 - 44032: 0x926D, - 47971 - 44032: 0xB9BD, - 47972 - 44032: 0x926E, - 47973 - 44032: 0x926F, - 47974 - 44032: 0x9270, - 47975 - 44032: 0x9271, - 47976 - 44032: 0x9272, - 47977 - 44032: 0x9273, - 47978 - 44032: 0x9274, - 47979 - 44032: 0x9275, - 47980 - 44032: 0xB9BE, - 47981 - 44032: 0x9276, - 47982 - 44032: 0x9277, - 47983 - 44032: 0x9278, - 47984 - 44032: 0x9279, - 47985 - 44032: 0x927A, - 47986 - 44032: 0x9281, - 47987 - 44032: 0x9282, - 47988 - 44032: 0x9283, - 47989 - 44032: 0x9284, - 47990 - 44032: 0x9285, - 47991 - 44032: 0x9286, - 47992 - 44032: 0x9287, - 47993 - 44032: 0x9288, - 47994 - 44032: 0x9289, - 47995 - 44032: 0x928A, - 47996 - 44032: 0x928B, - 47997 - 44032: 0x928C, - 47998 - 44032: 0x928D, - 47999 - 44032: 0x928E, - 48000 - 44032: 0x928F, - 48001 - 44032: 0x9290, - 48002 - 44032: 0x9291, - 48003 - 44032: 0x9292, - 48004 - 44032: 0x9293, - 48005 - 44032: 0x9294, - 48006 - 44032: 0x9295, - 48007 - 44032: 0x9296, - 48008 - 44032: 0xB9BF, - 48009 - 44032: 0x9297, - 48010 - 44032: 0x9298, - 48011 - 44032: 0x9299, - 48012 - 44032: 0xB9C0, - 48013 - 44032: 0x929A, - 48014 - 44032: 0x929B, - 48015 - 44032: 0x929C, - 48016 - 44032: 0xB9C1, - 48017 - 44032: 0x929D, - 48018 - 44032: 0x929E, - 48019 - 44032: 0x929F, - 48020 - 44032: 0x92A0, - 48021 - 44032: 0x92A1, - 48022 - 44032: 0x92A2, - 48023 - 44032: 0x92A3, - 48024 - 44032: 0x92A4, - 48025 - 44032: 0x92A5, - 48026 - 44032: 0x92A6, - 48027 - 44032: 0x92A7, - 48028 - 44032: 0x92A8, - 48029 - 44032: 0x92A9, - 48030 - 44032: 0x92AA, - 48031 - 44032: 0x92AB, - 48032 - 44032: 0x92AC, - 48033 - 44032: 0x92AD, - 48034 - 44032: 0x92AE, - 48035 - 44032: 0x92AF, - 48036 - 44032: 0xB9C2, - 48037 - 44032: 0x92B0, - 48038 - 44032: 0x92B1, - 48039 - 44032: 0x92B2, - 48040 - 44032: 0xB9C3, - 48041 - 44032: 0x92B3, - 48042 - 44032: 0x92B4, - 48043 - 44032: 0x92B5, - 48044 - 44032: 0xB9C4, - 48045 - 44032: 0x92B6, - 48046 - 44032: 0x92B7, - 48047 - 44032: 0x92B8, - 48048 - 44032: 0x92B9, - 48049 - 44032: 0x92BA, - 48050 - 44032: 0x92BB, - 48051 - 44032: 0x92BC, - 48052 - 44032: 0xB9C5, - 48053 - 44032: 0x92BD, - 48054 - 44032: 0x92BE, - 48055 - 44032: 0xB9C6, - 48056 - 44032: 0x92BF, - 48057 - 44032: 0x92C0, - 48058 - 44032: 0x92C1, - 48059 - 44032: 0x92C2, - 48060 - 44032: 0x92C3, - 48061 - 44032: 0x92C4, - 48062 - 44032: 0x92C5, - 48063 - 44032: 0x92C6, - 48064 - 44032: 0xB9C7, - 48065 - 44032: 0x92C7, - 48066 - 44032: 0x92C8, - 48067 - 44032: 0x92C9, - 48068 - 44032: 0xB9C8, - 48069 - 44032: 0x92CA, - 48070 - 44032: 0x92CB, - 48071 - 44032: 0x92CC, - 48072 - 44032: 0xB9C9, - 48073 - 44032: 0x92CD, - 48074 - 44032: 0x92CE, - 48075 - 44032: 0x92CF, - 48076 - 44032: 0x92D0, - 48077 - 44032: 0x92D1, - 48078 - 44032: 0x92D2, - 48079 - 44032: 0x92D3, - 48080 - 44032: 0xB9CA, - 48081 - 44032: 0x92D4, - 48082 - 44032: 0x92D5, - 48083 - 44032: 0xB9CB, - 48084 - 44032: 0x92D6, - 48085 - 44032: 0x92D7, - 48086 - 44032: 0x92D8, - 48087 - 44032: 0x92D9, - 48088 - 44032: 0x92DA, - 48089 - 44032: 0x92DB, - 48090 - 44032: 0x92DC, - 48091 - 44032: 0x92DD, - 48092 - 44032: 0x92DE, - 48093 - 44032: 0x92DF, - 48094 - 44032: 0x92E0, - 48095 - 44032: 0x92E1, - 48096 - 44032: 0x92E2, - 48097 - 44032: 0x92E3, - 48098 - 44032: 0x92E4, - 48099 - 44032: 0x92E5, - 48100 - 44032: 0x92E6, - 48101 - 44032: 0x92E7, - 48102 - 44032: 0x92E8, - 48103 - 44032: 0x92E9, - 48104 - 44032: 0x92EA, - 48105 - 44032: 0x92EB, - 48106 - 44032: 0x92EC, - 48107 - 44032: 0x92ED, - 48108 - 44032: 0x92EE, - 48109 - 44032: 0x92EF, - 48110 - 44032: 0x92F0, - 48111 - 44032: 0x92F1, - 48112 - 44032: 0x92F2, - 48113 - 44032: 0x92F3, - 48114 - 44032: 0x92F4, - 48115 - 44032: 0x92F5, - 48116 - 44032: 0x92F6, - 48117 - 44032: 0x92F7, - 48118 - 44032: 0x92F8, - 48119 - 44032: 0x92F9, - 48120 - 44032: 0xB9CC, - 48121 - 44032: 0xB9CD, - 48122 - 44032: 0x92FA, - 48123 - 44032: 0x92FB, - 48124 - 44032: 0xB9CE, - 48125 - 44032: 0x92FC, - 48126 - 44032: 0x92FD, - 48127 - 44032: 0xB9CF, - 48128 - 44032: 0xB9D0, - 48129 - 44032: 0x92FE, - 48130 - 44032: 0xB9D1, - 48131 - 44032: 0x9341, - 48132 - 44032: 0x9342, - 48133 - 44032: 0x9343, - 48134 - 44032: 0x9344, - 48135 - 44032: 0x9345, - 48136 - 44032: 0xB9D2, - 48137 - 44032: 0xB9D3, - 48138 - 44032: 0x9346, - 48139 - 44032: 0xB9D4, - 48140 - 44032: 0xB9D5, - 48141 - 44032: 0xB9D6, - 48142 - 44032: 0x9347, - 48143 - 44032: 0xB9D7, - 48144 - 44032: 0x9348, - 48145 - 44032: 0xB9D8, - 48146 - 44032: 0x9349, - 48147 - 44032: 0x934A, - 48148 - 44032: 0xB9D9, - 48149 - 44032: 0xB9DA, - 48150 - 44032: 0xB9DB, - 48151 - 44032: 0xB9DC, - 48152 - 44032: 0xB9DD, - 48153 - 44032: 0x934B, - 48154 - 44032: 0x934C, - 48155 - 44032: 0xB9DE, - 48156 - 44032: 0xB9DF, - 48157 - 44032: 0xB9E0, - 48158 - 44032: 0xB9E1, - 48159 - 44032: 0xB9E2, - 48160 - 44032: 0x934D, - 48161 - 44032: 0x934E, - 48162 - 44032: 0x934F, - 48163 - 44032: 0x9350, - 48164 - 44032: 0xB9E3, - 48165 - 44032: 0xB9E4, - 48166 - 44032: 0x9351, - 48167 - 44032: 0xB9E5, - 48168 - 44032: 0x9352, - 48169 - 44032: 0xB9E6, - 48170 - 44032: 0x9353, - 48171 - 44032: 0x9354, - 48172 - 44032: 0x9355, - 48173 - 44032: 0xB9E7, - 48174 - 44032: 0x9356, - 48175 - 44032: 0x9357, - 48176 - 44032: 0xB9E8, - 48177 - 44032: 0xB9E9, - 48178 - 44032: 0x9358, - 48179 - 44032: 0x9359, - 48180 - 44032: 0xB9EA, - 48181 - 44032: 0x935A, - 48182 - 44032: 0x9361, - 48183 - 44032: 0x9362, - 48184 - 44032: 0xB9EB, - 48185 - 44032: 0x9363, - 48186 - 44032: 0x9364, - 48187 - 44032: 0x9365, - 48188 - 44032: 0x9366, - 48189 - 44032: 0x9367, - 48190 - 44032: 0x9368, - 48191 - 44032: 0x9369, - 48192 - 44032: 0xB9EC, - 48193 - 44032: 0xB9ED, - 48194 - 44032: 0x936A, - 48195 - 44032: 0xB9EE, - 48196 - 44032: 0xB9EF, - 48197 - 44032: 0xB9F0, - 48198 - 44032: 0x936B, - 48199 - 44032: 0x936C, - 48200 - 44032: 0x936D, - 48201 - 44032: 0xB9F1, - 48202 - 44032: 0x936E, - 48203 - 44032: 0x936F, - 48204 - 44032: 0xB9F2, - 48205 - 44032: 0xB9F3, - 48206 - 44032: 0x9370, - 48207 - 44032: 0x9371, - 48208 - 44032: 0xB9F4, - 48209 - 44032: 0x9372, - 48210 - 44032: 0x9373, - 48211 - 44032: 0x9374, - 48212 - 44032: 0x9375, - 48213 - 44032: 0x9376, - 48214 - 44032: 0x9377, - 48215 - 44032: 0x9378, - 48216 - 44032: 0x9379, - 48217 - 44032: 0x937A, - 48218 - 44032: 0x9381, - 48219 - 44032: 0x9382, - 48220 - 44032: 0x9383, - 48221 - 44032: 0xB9F5, - 48222 - 44032: 0x9384, - 48223 - 44032: 0x9385, - 48224 - 44032: 0x9386, - 48225 - 44032: 0x9387, - 48226 - 44032: 0x9388, - 48227 - 44032: 0x9389, - 48228 - 44032: 0x938A, - 48229 - 44032: 0x938B, - 48230 - 44032: 0x938C, - 48231 - 44032: 0x938D, - 48232 - 44032: 0x938E, - 48233 - 44032: 0x938F, - 48234 - 44032: 0x9390, - 48235 - 44032: 0x9391, - 48236 - 44032: 0x9392, - 48237 - 44032: 0x9393, - 48238 - 44032: 0x9394, - 48239 - 44032: 0x9395, - 48240 - 44032: 0x9396, - 48241 - 44032: 0x9397, - 48242 - 44032: 0x9398, - 48243 - 44032: 0x9399, - 48244 - 44032: 0x939A, - 48245 - 44032: 0x939B, - 48246 - 44032: 0x939C, - 48247 - 44032: 0x939D, - 48248 - 44032: 0x939E, - 48249 - 44032: 0x939F, - 48250 - 44032: 0x93A0, - 48251 - 44032: 0x93A1, - 48252 - 44032: 0x93A2, - 48253 - 44032: 0x93A3, - 48254 - 44032: 0x93A4, - 48255 - 44032: 0x93A5, - 48256 - 44032: 0x93A6, - 48257 - 44032: 0x93A7, - 48258 - 44032: 0x93A8, - 48259 - 44032: 0x93A9, - 48260 - 44032: 0xB9F6, - 48261 - 44032: 0xB9F7, - 48262 - 44032: 0x93AA, - 48263 - 44032: 0x93AB, - 48264 - 44032: 0xB9F8, - 48265 - 44032: 0x93AC, - 48266 - 44032: 0x93AD, - 48267 - 44032: 0xB9F9, - 48268 - 44032: 0xB9FA, - 48269 - 44032: 0x93AE, - 48270 - 44032: 0xB9FB, - 48271 - 44032: 0x93AF, - 48272 - 44032: 0x93B0, - 48273 - 44032: 0x93B1, - 48274 - 44032: 0x93B2, - 48275 - 44032: 0x93B3, - 48276 - 44032: 0xB9FC, - 48277 - 44032: 0xB9FD, - 48278 - 44032: 0x93B4, - 48279 - 44032: 0xB9FE, - 48280 - 44032: 0x93B5, - 48281 - 44032: 0xBAA1, - 48282 - 44032: 0xBAA2, - 48283 - 44032: 0x93B6, - 48284 - 44032: 0x93B7, - 48285 - 44032: 0x93B8, - 48286 - 44032: 0x93B9, - 48287 - 44032: 0x93BA, - 48288 - 44032: 0xBAA3, - 48289 - 44032: 0xBAA4, - 48290 - 44032: 0x93BB, - 48291 - 44032: 0x93BC, - 48292 - 44032: 0xBAA5, - 48293 - 44032: 0x93BD, - 48294 - 44032: 0x93BE, - 48295 - 44032: 0xBAA6, - 48296 - 44032: 0xBAA7, - 48297 - 44032: 0x93BF, - 48298 - 44032: 0x93C0, - 48299 - 44032: 0x93C1, - 48300 - 44032: 0x93C2, - 48301 - 44032: 0x93C3, - 48302 - 44032: 0x93C4, - 48303 - 44032: 0x93C5, - 48304 - 44032: 0xBAA8, - 48305 - 44032: 0xBAA9, - 48306 - 44032: 0x93C6, - 48307 - 44032: 0xBAAA, - 48308 - 44032: 0xBAAB, - 48309 - 44032: 0xBAAC, - 48310 - 44032: 0x93C7, - 48311 - 44032: 0x93C8, - 48312 - 44032: 0x93C9, - 48313 - 44032: 0x93CA, - 48314 - 44032: 0x93CB, - 48315 - 44032: 0x93CC, - 48316 - 44032: 0xBAAD, - 48317 - 44032: 0xBAAE, - 48318 - 44032: 0x93CD, - 48319 - 44032: 0x93CE, - 48320 - 44032: 0xBAAF, - 48321 - 44032: 0x93CF, - 48322 - 44032: 0x93D0, - 48323 - 44032: 0x93D1, - 48324 - 44032: 0xBAB0, - 48325 - 44032: 0x93D2, - 48326 - 44032: 0x93D3, - 48327 - 44032: 0x93D4, - 48328 - 44032: 0x93D5, - 48329 - 44032: 0x93D6, - 48330 - 44032: 0x93D7, - 48331 - 44032: 0x93D8, - 48332 - 44032: 0x93D9, - 48333 - 44032: 0xBAB1, - 48334 - 44032: 0x93DA, - 48335 - 44032: 0xBAB2, - 48336 - 44032: 0xBAB3, - 48337 - 44032: 0xBAB4, - 48338 - 44032: 0x93DB, - 48339 - 44032: 0x93DC, - 48340 - 44032: 0x93DD, - 48341 - 44032: 0xBAB5, - 48342 - 44032: 0x93DE, - 48343 - 44032: 0x93DF, - 48344 - 44032: 0xBAB6, - 48345 - 44032: 0x93E0, - 48346 - 44032: 0x93E1, - 48347 - 44032: 0x93E2, - 48348 - 44032: 0xBAB7, - 48349 - 44032: 0x93E3, - 48350 - 44032: 0x93E4, - 48351 - 44032: 0x93E5, - 48352 - 44032: 0x93E6, - 48353 - 44032: 0x93E7, - 48354 - 44032: 0x93E8, - 48355 - 44032: 0x93E9, - 48356 - 44032: 0x93EA, - 48357 - 44032: 0x93EB, - 48358 - 44032: 0x93EC, - 48359 - 44032: 0x93ED, - 48360 - 44032: 0x93EE, - 48361 - 44032: 0x93EF, - 48362 - 44032: 0x93F0, - 48363 - 44032: 0x93F1, - 48364 - 44032: 0x93F2, - 48365 - 44032: 0x93F3, - 48366 - 44032: 0x93F4, - 48367 - 44032: 0x93F5, - 48368 - 44032: 0x93F6, - 48369 - 44032: 0x93F7, - 48370 - 44032: 0x93F8, - 48371 - 44032: 0x93F9, - 48372 - 44032: 0xBAB8, - 48373 - 44032: 0xBAB9, - 48374 - 44032: 0xBABA, - 48375 - 44032: 0x93FA, - 48376 - 44032: 0xBABB, - 48377 - 44032: 0x93FB, - 48378 - 44032: 0x93FC, - 48379 - 44032: 0x93FD, - 48380 - 44032: 0xBABC, - 48381 - 44032: 0x93FE, - 48382 - 44032: 0x9441, - 48383 - 44032: 0x9442, - 48384 - 44032: 0x9443, - 48385 - 44032: 0x9444, - 48386 - 44032: 0x9445, - 48387 - 44032: 0x9446, - 48388 - 44032: 0xBABD, - 48389 - 44032: 0xBABE, - 48390 - 44032: 0x9447, - 48391 - 44032: 0xBABF, - 48392 - 44032: 0x9448, - 48393 - 44032: 0xBAC0, - 48394 - 44032: 0x9449, - 48395 - 44032: 0x944A, - 48396 - 44032: 0x944B, - 48397 - 44032: 0x944C, - 48398 - 44032: 0x944D, - 48399 - 44032: 0x944E, - 48400 - 44032: 0xBAC1, - 48401 - 44032: 0x944F, - 48402 - 44032: 0x9450, - 48403 - 44032: 0x9451, - 48404 - 44032: 0xBAC2, - 48405 - 44032: 0x9452, - 48406 - 44032: 0x9453, - 48407 - 44032: 0x9454, - 48408 - 44032: 0x9455, - 48409 - 44032: 0x9456, - 48410 - 44032: 0x9457, - 48411 - 44032: 0x9458, - 48412 - 44032: 0x9459, - 48413 - 44032: 0x945A, - 48414 - 44032: 0x9461, - 48415 - 44032: 0x9462, - 48416 - 44032: 0x9463, - 48417 - 44032: 0x9464, - 48418 - 44032: 0x9465, - 48419 - 44032: 0x9466, - 48420 - 44032: 0xBAC3, - 48421 - 44032: 0x9467, - 48422 - 44032: 0x9468, - 48423 - 44032: 0x9469, - 48424 - 44032: 0x946A, - 48425 - 44032: 0x946B, - 48426 - 44032: 0x946C, - 48427 - 44032: 0x946D, - 48428 - 44032: 0xBAC4, - 48429 - 44032: 0x946E, - 48430 - 44032: 0x946F, - 48431 - 44032: 0x9470, - 48432 - 44032: 0x9471, - 48433 - 44032: 0x9472, - 48434 - 44032: 0x9473, - 48435 - 44032: 0x9474, - 48436 - 44032: 0x9475, - 48437 - 44032: 0x9476, - 48438 - 44032: 0x9477, - 48439 - 44032: 0x9478, - 48440 - 44032: 0x9479, - 48441 - 44032: 0x947A, - 48442 - 44032: 0x9481, - 48443 - 44032: 0x9482, - 48444 - 44032: 0x9483, - 48445 - 44032: 0x9484, - 48446 - 44032: 0x9485, - 48447 - 44032: 0x9486, - 48448 - 44032: 0xBAC5, - 48449 - 44032: 0x9487, - 48450 - 44032: 0x9488, - 48451 - 44032: 0x9489, - 48452 - 44032: 0x948A, - 48453 - 44032: 0x948B, - 48454 - 44032: 0x948C, - 48455 - 44032: 0x948D, - 48456 - 44032: 0xBAC6, - 48457 - 44032: 0xBAC7, - 48458 - 44032: 0x948E, - 48459 - 44032: 0x948F, - 48460 - 44032: 0xBAC8, - 48461 - 44032: 0x9490, - 48462 - 44032: 0x9491, - 48463 - 44032: 0x9492, - 48464 - 44032: 0xBAC9, - 48465 - 44032: 0x9493, - 48466 - 44032: 0x9494, - 48467 - 44032: 0x9495, - 48468 - 44032: 0x9496, - 48469 - 44032: 0x9497, - 48470 - 44032: 0x9498, - 48471 - 44032: 0x9499, - 48472 - 44032: 0xBACA, - 48473 - 44032: 0xBACB, - 48474 - 44032: 0x949A, - 48475 - 44032: 0x949B, - 48476 - 44032: 0x949C, - 48477 - 44032: 0x949D, - 48478 - 44032: 0x949E, - 48479 - 44032: 0x949F, - 48480 - 44032: 0x94A0, - 48481 - 44032: 0x94A1, - 48482 - 44032: 0x94A2, - 48483 - 44032: 0x94A3, - 48484 - 44032: 0xBACC, - 48485 - 44032: 0x94A4, - 48486 - 44032: 0x94A5, - 48487 - 44032: 0x94A6, - 48488 - 44032: 0xBACD, - 48489 - 44032: 0x94A7, - 48490 - 44032: 0x94A8, - 48491 - 44032: 0x94A9, - 48492 - 44032: 0x94AA, - 48493 - 44032: 0x94AB, - 48494 - 44032: 0x94AC, - 48495 - 44032: 0x94AD, - 48496 - 44032: 0x94AE, - 48497 - 44032: 0x94AF, - 48498 - 44032: 0x94B0, - 48499 - 44032: 0x94B1, - 48500 - 44032: 0x94B2, - 48501 - 44032: 0x94B3, - 48502 - 44032: 0x94B4, - 48503 - 44032: 0x94B5, - 48504 - 44032: 0x94B6, - 48505 - 44032: 0x94B7, - 48506 - 44032: 0x94B8, - 48507 - 44032: 0x94B9, - 48508 - 44032: 0x94BA, - 48509 - 44032: 0x94BB, - 48510 - 44032: 0x94BC, - 48511 - 44032: 0x94BD, - 48512 - 44032: 0xBACE, - 48513 - 44032: 0xBACF, - 48514 - 44032: 0x94BE, - 48515 - 44032: 0x94BF, - 48516 - 44032: 0xBAD0, - 48517 - 44032: 0x94C0, - 48518 - 44032: 0x94C1, - 48519 - 44032: 0xBAD1, - 48520 - 44032: 0xBAD2, - 48521 - 44032: 0xBAD3, - 48522 - 44032: 0xBAD4, - 48523 - 44032: 0x94C2, - 48524 - 44032: 0x94C3, - 48525 - 44032: 0x94C4, - 48526 - 44032: 0x94C5, - 48527 - 44032: 0x94C6, - 48528 - 44032: 0xBAD5, - 48529 - 44032: 0xBAD6, - 48530 - 44032: 0x94C7, - 48531 - 44032: 0xBAD7, - 48532 - 44032: 0x94C8, - 48533 - 44032: 0xBAD8, - 48534 - 44032: 0x94C9, - 48535 - 44032: 0x94CA, - 48536 - 44032: 0x94CB, - 48537 - 44032: 0xBAD9, - 48538 - 44032: 0xBADA, - 48539 - 44032: 0x94CC, - 48540 - 44032: 0xBADB, - 48541 - 44032: 0x94CD, - 48542 - 44032: 0x94CE, - 48543 - 44032: 0x94CF, - 48544 - 44032: 0x94D0, - 48545 - 44032: 0x94D1, - 48546 - 44032: 0x94D2, - 48547 - 44032: 0x94D3, - 48548 - 44032: 0xBADC, - 48549 - 44032: 0x94D4, - 48550 - 44032: 0x94D5, - 48551 - 44032: 0x94D6, - 48552 - 44032: 0x94D7, - 48553 - 44032: 0x94D8, - 48554 - 44032: 0x94D9, - 48555 - 44032: 0x94DA, - 48556 - 44032: 0x94DB, - 48557 - 44032: 0x94DC, - 48558 - 44032: 0x94DD, - 48559 - 44032: 0x94DE, - 48560 - 44032: 0xBADD, - 48561 - 44032: 0x94DF, - 48562 - 44032: 0x94E0, - 48563 - 44032: 0x94E1, - 48564 - 44032: 0x94E2, - 48565 - 44032: 0x94E3, - 48566 - 44032: 0x94E4, - 48567 - 44032: 0x94E5, - 48568 - 44032: 0xBADE, - 48569 - 44032: 0x94E6, - 48570 - 44032: 0x94E7, - 48571 - 44032: 0x94E8, - 48572 - 44032: 0x94E9, - 48573 - 44032: 0x94EA, - 48574 - 44032: 0x94EB, - 48575 - 44032: 0x94EC, - 48576 - 44032: 0x94ED, - 48577 - 44032: 0x94EE, - 48578 - 44032: 0x94EF, - 48579 - 44032: 0x94F0, - 48580 - 44032: 0x94F1, - 48581 - 44032: 0x94F2, - 48582 - 44032: 0x94F3, - 48583 - 44032: 0x94F4, - 48584 - 44032: 0x94F5, - 48585 - 44032: 0x94F6, - 48586 - 44032: 0x94F7, - 48587 - 44032: 0x94F8, - 48588 - 44032: 0x94F9, - 48589 - 44032: 0x94FA, - 48590 - 44032: 0x94FB, - 48591 - 44032: 0x94FC, - 48592 - 44032: 0x94FD, - 48593 - 44032: 0x94FE, - 48594 - 44032: 0x9541, - 48595 - 44032: 0x9542, - 48596 - 44032: 0xBADF, - 48597 - 44032: 0xBAE0, - 48598 - 44032: 0x9543, - 48599 - 44032: 0x9544, - 48600 - 44032: 0xBAE1, - 48601 - 44032: 0x9545, - 48602 - 44032: 0x9546, - 48603 - 44032: 0x9547, - 48604 - 44032: 0xBAE2, - 48605 - 44032: 0x9548, - 48606 - 44032: 0x9549, - 48607 - 44032: 0x954A, - 48608 - 44032: 0x954B, - 48609 - 44032: 0x954C, - 48610 - 44032: 0x954D, - 48611 - 44032: 0x954E, - 48612 - 44032: 0x954F, - 48613 - 44032: 0x9550, - 48614 - 44032: 0x9551, - 48615 - 44032: 0x9552, - 48616 - 44032: 0x9553, - 48617 - 44032: 0xBAE3, - 48618 - 44032: 0x9554, - 48619 - 44032: 0x9555, - 48620 - 44032: 0x9556, - 48621 - 44032: 0x9557, - 48622 - 44032: 0x9558, - 48623 - 44032: 0x9559, - 48624 - 44032: 0xBAE4, - 48625 - 44032: 0x955A, - 48626 - 44032: 0x9561, - 48627 - 44032: 0x9562, - 48628 - 44032: 0xBAE5, - 48629 - 44032: 0x9563, - 48630 - 44032: 0x9564, - 48631 - 44032: 0x9565, - 48632 - 44032: 0xBAE6, - 48633 - 44032: 0x9566, - 48634 - 44032: 0x9567, - 48635 - 44032: 0x9568, - 48636 - 44032: 0x9569, - 48637 - 44032: 0x956A, - 48638 - 44032: 0x956B, - 48639 - 44032: 0x956C, - 48640 - 44032: 0xBAE7, - 48641 - 44032: 0x956D, - 48642 - 44032: 0x956E, - 48643 - 44032: 0xBAE8, - 48644 - 44032: 0x956F, - 48645 - 44032: 0xBAE9, - 48646 - 44032: 0x9570, - 48647 - 44032: 0x9571, - 48648 - 44032: 0x9572, - 48649 - 44032: 0x9573, - 48650 - 44032: 0x9574, - 48651 - 44032: 0x9575, - 48652 - 44032: 0xBAEA, - 48653 - 44032: 0xBAEB, - 48654 - 44032: 0x9576, - 48655 - 44032: 0x9577, - 48656 - 44032: 0xBAEC, - 48657 - 44032: 0x9578, - 48658 - 44032: 0x9579, - 48659 - 44032: 0x957A, - 48660 - 44032: 0xBAED, - 48661 - 44032: 0x9581, - 48662 - 44032: 0x9582, - 48663 - 44032: 0x9583, - 48664 - 44032: 0x9584, - 48665 - 44032: 0x9585, - 48666 - 44032: 0x9586, - 48667 - 44032: 0x9587, - 48668 - 44032: 0xBAEE, - 48669 - 44032: 0xBAEF, - 48670 - 44032: 0x9588, - 48671 - 44032: 0xBAF0, - 48672 - 44032: 0x9589, - 48673 - 44032: 0x958A, - 48674 - 44032: 0x958B, - 48675 - 44032: 0x958C, - 48676 - 44032: 0x958D, - 48677 - 44032: 0x958E, - 48678 - 44032: 0x958F, - 48679 - 44032: 0x9590, - 48680 - 44032: 0x9591, - 48681 - 44032: 0x9592, - 48682 - 44032: 0x9593, - 48683 - 44032: 0x9594, - 48684 - 44032: 0x9595, - 48685 - 44032: 0x9596, - 48686 - 44032: 0x9597, - 48687 - 44032: 0x9598, - 48688 - 44032: 0x9599, - 48689 - 44032: 0x959A, - 48690 - 44032: 0x959B, - 48691 - 44032: 0x959C, - 48692 - 44032: 0x959D, - 48693 - 44032: 0x959E, - 48694 - 44032: 0x959F, - 48695 - 44032: 0x95A0, - 48696 - 44032: 0x95A1, - 48697 - 44032: 0x95A2, - 48698 - 44032: 0x95A3, - 48699 - 44032: 0x95A4, - 48700 - 44032: 0x95A5, - 48701 - 44032: 0x95A6, - 48702 - 44032: 0x95A7, - 48703 - 44032: 0x95A8, - 48704 - 44032: 0x95A9, - 48705 - 44032: 0x95AA, - 48706 - 44032: 0x95AB, - 48707 - 44032: 0x95AC, - 48708 - 44032: 0xBAF1, - 48709 - 44032: 0xBAF2, - 48710 - 44032: 0x95AD, - 48711 - 44032: 0x95AE, - 48712 - 44032: 0xBAF3, - 48713 - 44032: 0x95AF, - 48714 - 44032: 0x95B0, - 48715 - 44032: 0x95B1, - 48716 - 44032: 0xBAF4, - 48717 - 44032: 0x95B2, - 48718 - 44032: 0xBAF5, - 48719 - 44032: 0x95B3, - 48720 - 44032: 0x95B4, - 48721 - 44032: 0x95B5, - 48722 - 44032: 0x95B6, - 48723 - 44032: 0x95B7, - 48724 - 44032: 0xBAF6, - 48725 - 44032: 0xBAF7, - 48726 - 44032: 0x95B8, - 48727 - 44032: 0xBAF8, - 48728 - 44032: 0x95B9, - 48729 - 44032: 0xBAF9, - 48730 - 44032: 0xBAFA, - 48731 - 44032: 0xBAFB, - 48732 - 44032: 0x95BA, - 48733 - 44032: 0x95BB, - 48734 - 44032: 0x95BC, - 48735 - 44032: 0x95BD, - 48736 - 44032: 0xBAFC, - 48737 - 44032: 0xBAFD, - 48738 - 44032: 0x95BE, - 48739 - 44032: 0x95BF, - 48740 - 44032: 0xBAFE, - 48741 - 44032: 0x95C0, - 48742 - 44032: 0x95C1, - 48743 - 44032: 0x95C2, - 48744 - 44032: 0xBBA1, - 48745 - 44032: 0x95C3, - 48746 - 44032: 0xBBA2, - 48747 - 44032: 0x95C4, - 48748 - 44032: 0x95C5, - 48749 - 44032: 0x95C6, - 48750 - 44032: 0x95C7, - 48751 - 44032: 0x95C8, - 48752 - 44032: 0xBBA3, - 48753 - 44032: 0xBBA4, - 48754 - 44032: 0x95C9, - 48755 - 44032: 0xBBA5, - 48756 - 44032: 0xBBA6, - 48757 - 44032: 0xBBA7, - 48758 - 44032: 0x95CA, - 48759 - 44032: 0x95CB, - 48760 - 44032: 0x95CC, - 48761 - 44032: 0x95CD, - 48762 - 44032: 0x95CE, - 48763 - 44032: 0xBBA8, - 48764 - 44032: 0xBBA9, - 48765 - 44032: 0xBBAA, - 48766 - 44032: 0x95CF, - 48767 - 44032: 0x95D0, - 48768 - 44032: 0xBBAB, - 48769 - 44032: 0x95D1, - 48770 - 44032: 0x95D2, - 48771 - 44032: 0x95D3, - 48772 - 44032: 0xBBAC, - 48773 - 44032: 0x95D4, - 48774 - 44032: 0x95D5, - 48775 - 44032: 0x95D6, - 48776 - 44032: 0x95D7, - 48777 - 44032: 0x95D8, - 48778 - 44032: 0x95D9, - 48779 - 44032: 0x95DA, - 48780 - 44032: 0xBBAD, - 48781 - 44032: 0xBBAE, - 48782 - 44032: 0x95DB, - 48783 - 44032: 0xBBAF, - 48784 - 44032: 0xBBB0, - 48785 - 44032: 0xBBB1, - 48786 - 44032: 0x95DC, - 48787 - 44032: 0x95DD, - 48788 - 44032: 0x95DE, - 48789 - 44032: 0x95DF, - 48790 - 44032: 0x95E0, - 48791 - 44032: 0x95E1, - 48792 - 44032: 0xBBB2, - 48793 - 44032: 0xBBB3, - 48794 - 44032: 0x95E2, - 48795 - 44032: 0x95E3, - 48796 - 44032: 0x95E4, - 48797 - 44032: 0x95E5, - 48798 - 44032: 0x95E6, - 48799 - 44032: 0x95E7, - 48800 - 44032: 0x95E8, - 48801 - 44032: 0x95E9, - 48802 - 44032: 0x95EA, - 48803 - 44032: 0x95EB, - 48804 - 44032: 0x95EC, - 48805 - 44032: 0x95ED, - 48806 - 44032: 0x95EE, - 48807 - 44032: 0x95EF, - 48808 - 44032: 0xBBB4, - 48809 - 44032: 0x95F0, - 48810 - 44032: 0x95F1, - 48811 - 44032: 0x95F2, - 48812 - 44032: 0x95F3, - 48813 - 44032: 0x95F4, - 48814 - 44032: 0x95F5, - 48815 - 44032: 0x95F6, - 48816 - 44032: 0x95F7, - 48817 - 44032: 0x95F8, - 48818 - 44032: 0x95F9, - 48819 - 44032: 0x95FA, - 48820 - 44032: 0x95FB, - 48821 - 44032: 0x95FC, - 48822 - 44032: 0x95FD, - 48823 - 44032: 0x95FE, - 48824 - 44032: 0x9641, - 48825 - 44032: 0x9642, - 48826 - 44032: 0x9643, - 48827 - 44032: 0x9644, - 48828 - 44032: 0x9645, - 48829 - 44032: 0x9646, - 48830 - 44032: 0x9647, - 48831 - 44032: 0x9648, - 48832 - 44032: 0x9649, - 48833 - 44032: 0x964A, - 48834 - 44032: 0x964B, - 48835 - 44032: 0x964C, - 48836 - 44032: 0x964D, - 48837 - 44032: 0x964E, - 48838 - 44032: 0x964F, - 48839 - 44032: 0x9650, - 48840 - 44032: 0x9651, - 48841 - 44032: 0x9652, - 48842 - 44032: 0x9653, - 48843 - 44032: 0x9654, - 48844 - 44032: 0x9655, - 48845 - 44032: 0x9656, - 48846 - 44032: 0x9657, - 48847 - 44032: 0x9658, - 48848 - 44032: 0xBBB5, - 48849 - 44032: 0xBBB6, - 48850 - 44032: 0x9659, - 48851 - 44032: 0x965A, - 48852 - 44032: 0xBBB7, - 48853 - 44032: 0x9661, - 48854 - 44032: 0x9662, - 48855 - 44032: 0xBBB8, - 48856 - 44032: 0xBBB9, - 48857 - 44032: 0x9663, - 48858 - 44032: 0x9664, - 48859 - 44032: 0x9665, - 48860 - 44032: 0x9666, - 48861 - 44032: 0x9667, - 48862 - 44032: 0x9668, - 48863 - 44032: 0x9669, - 48864 - 44032: 0xBBBA, - 48865 - 44032: 0x966A, - 48866 - 44032: 0x966B, - 48867 - 44032: 0xBBBB, - 48868 - 44032: 0xBBBC, - 48869 - 44032: 0xBBBD, - 48870 - 44032: 0x966C, - 48871 - 44032: 0x966D, - 48872 - 44032: 0x966E, - 48873 - 44032: 0x966F, - 48874 - 44032: 0x9670, - 48875 - 44032: 0x9671, - 48876 - 44032: 0xBBBE, - 48877 - 44032: 0x9672, - 48878 - 44032: 0x9673, - 48879 - 44032: 0x9674, - 48880 - 44032: 0x9675, - 48881 - 44032: 0x9676, - 48882 - 44032: 0x9677, - 48883 - 44032: 0x9678, - 48884 - 44032: 0x9679, - 48885 - 44032: 0x967A, - 48886 - 44032: 0x9681, - 48887 - 44032: 0x9682, - 48888 - 44032: 0x9683, - 48889 - 44032: 0x9684, - 48890 - 44032: 0x9685, - 48891 - 44032: 0x9686, - 48892 - 44032: 0x9687, - 48893 - 44032: 0x9688, - 48894 - 44032: 0x9689, - 48895 - 44032: 0x968A, - 48896 - 44032: 0x968B, - 48897 - 44032: 0xBBBF, - 48898 - 44032: 0x968C, - 48899 - 44032: 0x968D, - 48900 - 44032: 0x968E, - 48901 - 44032: 0x968F, - 48902 - 44032: 0x9690, - 48903 - 44032: 0x9691, - 48904 - 44032: 0xBBC0, - 48905 - 44032: 0xBBC1, - 48906 - 44032: 0x9692, - 48907 - 44032: 0x9693, - 48908 - 44032: 0x9694, - 48909 - 44032: 0x9695, - 48910 - 44032: 0x9696, - 48911 - 44032: 0x9697, - 48912 - 44032: 0x9698, - 48913 - 44032: 0x9699, - 48914 - 44032: 0x969A, - 48915 - 44032: 0x969B, - 48916 - 44032: 0x969C, - 48917 - 44032: 0x969D, - 48918 - 44032: 0x969E, - 48919 - 44032: 0x969F, - 48920 - 44032: 0xBBC2, - 48921 - 44032: 0xBBC3, - 48922 - 44032: 0x96A0, - 48923 - 44032: 0xBBC4, - 48924 - 44032: 0xBBC5, - 48925 - 44032: 0xBBC6, - 48926 - 44032: 0x96A1, - 48927 - 44032: 0x96A2, - 48928 - 44032: 0x96A3, - 48929 - 44032: 0x96A4, - 48930 - 44032: 0x96A5, - 48931 - 44032: 0x96A6, - 48932 - 44032: 0x96A7, - 48933 - 44032: 0x96A8, - 48934 - 44032: 0x96A9, - 48935 - 44032: 0x96AA, - 48936 - 44032: 0x96AB, - 48937 - 44032: 0x96AC, - 48938 - 44032: 0x96AD, - 48939 - 44032: 0x96AE, - 48940 - 44032: 0x96AF, - 48941 - 44032: 0x96B0, - 48942 - 44032: 0x96B1, - 48943 - 44032: 0x96B2, - 48944 - 44032: 0x96B3, - 48945 - 44032: 0x96B4, - 48946 - 44032: 0x96B5, - 48947 - 44032: 0x96B6, - 48948 - 44032: 0x96B7, - 48949 - 44032: 0x96B8, - 48950 - 44032: 0x96B9, - 48951 - 44032: 0x96BA, - 48952 - 44032: 0x96BB, - 48953 - 44032: 0x96BC, - 48954 - 44032: 0x96BD, - 48955 - 44032: 0x96BE, - 48956 - 44032: 0x96BF, - 48957 - 44032: 0x96C0, - 48958 - 44032: 0x96C1, - 48959 - 44032: 0x96C2, - 48960 - 44032: 0xBBC7, - 48961 - 44032: 0xBBC8, - 48962 - 44032: 0x96C3, - 48963 - 44032: 0x96C4, - 48964 - 44032: 0xBBC9, - 48965 - 44032: 0x96C5, - 48966 - 44032: 0x96C6, - 48967 - 44032: 0x96C7, - 48968 - 44032: 0xBBCA, - 48969 - 44032: 0x96C8, - 48970 - 44032: 0x96C9, - 48971 - 44032: 0x96CA, - 48972 - 44032: 0x96CB, - 48973 - 44032: 0x96CC, - 48974 - 44032: 0x96CD, - 48975 - 44032: 0x96CE, - 48976 - 44032: 0xBBCB, - 48977 - 44032: 0xBBCC, - 48978 - 44032: 0x96CF, - 48979 - 44032: 0x96D0, - 48980 - 44032: 0x96D1, - 48981 - 44032: 0xBBCD, - 48982 - 44032: 0x96D2, - 48983 - 44032: 0x96D3, - 48984 - 44032: 0x96D4, - 48985 - 44032: 0x96D5, - 48986 - 44032: 0x96D6, - 48987 - 44032: 0x96D7, - 48988 - 44032: 0x96D8, - 48989 - 44032: 0x96D9, - 48990 - 44032: 0x96DA, - 48991 - 44032: 0x96DB, - 48992 - 44032: 0x96DC, - 48993 - 44032: 0x96DD, - 48994 - 44032: 0x96DE, - 48995 - 44032: 0x96DF, - 48996 - 44032: 0x96E0, - 48997 - 44032: 0x96E1, - 48998 - 44032: 0x96E2, - 48999 - 44032: 0x96E3, - 49000 - 44032: 0x96E4, - 49001 - 44032: 0x96E5, - 49002 - 44032: 0x96E6, - 49003 - 44032: 0x96E7, - 49004 - 44032: 0x96E8, - 49005 - 44032: 0x96E9, - 49006 - 44032: 0x96EA, - 49007 - 44032: 0x96EB, - 49008 - 44032: 0x96EC, - 49009 - 44032: 0x96ED, - 49010 - 44032: 0x96EE, - 49011 - 44032: 0x96EF, - 49012 - 44032: 0x96F0, - 49013 - 44032: 0x96F1, - 49014 - 44032: 0x96F2, - 49015 - 44032: 0x96F3, - 49016 - 44032: 0x96F4, - 49017 - 44032: 0x96F5, - 49018 - 44032: 0x96F6, - 49019 - 44032: 0x96F7, - 49020 - 44032: 0x96F8, - 49021 - 44032: 0x96F9, - 49022 - 44032: 0x96FA, - 49023 - 44032: 0x96FB, - 49024 - 44032: 0x96FC, - 49025 - 44032: 0x96FD, - 49026 - 44032: 0x96FE, - 49027 - 44032: 0x9741, - 49028 - 44032: 0x9742, - 49029 - 44032: 0x9743, - 49030 - 44032: 0x9744, - 49031 - 44032: 0x9745, - 49032 - 44032: 0x9746, - 49033 - 44032: 0x9747, - 49034 - 44032: 0x9748, - 49035 - 44032: 0x9749, - 49036 - 44032: 0x974A, - 49037 - 44032: 0x974B, - 49038 - 44032: 0x974C, - 49039 - 44032: 0x974D, - 49040 - 44032: 0x974E, - 49041 - 44032: 0x974F, - 49042 - 44032: 0x9750, - 49043 - 44032: 0x9751, - 49044 - 44032: 0xBBCE, - 49045 - 44032: 0x9752, - 49046 - 44032: 0x9753, - 49047 - 44032: 0x9754, - 49048 - 44032: 0x9755, - 49049 - 44032: 0x9756, - 49050 - 44032: 0x9757, - 49051 - 44032: 0x9758, - 49052 - 44032: 0x9759, - 49053 - 44032: 0x975A, - 49054 - 44032: 0x9761, - 49055 - 44032: 0x9762, - 49056 - 44032: 0x9763, - 49057 - 44032: 0x9764, - 49058 - 44032: 0x9765, - 49059 - 44032: 0x9766, - 49060 - 44032: 0x9767, - 49061 - 44032: 0x9768, - 49062 - 44032: 0x9769, - 49063 - 44032: 0x976A, - 49064 - 44032: 0x976B, - 49065 - 44032: 0x976C, - 49066 - 44032: 0x976D, - 49067 - 44032: 0x976E, - 49068 - 44032: 0x976F, - 49069 - 44032: 0x9770, - 49070 - 44032: 0x9771, - 49071 - 44032: 0x9772, - 49072 - 44032: 0xBBCF, - 49073 - 44032: 0x9773, - 49074 - 44032: 0x9774, - 49075 - 44032: 0x9775, - 49076 - 44032: 0x9776, - 49077 - 44032: 0x9777, - 49078 - 44032: 0x9778, - 49079 - 44032: 0x9779, - 49080 - 44032: 0x977A, - 49081 - 44032: 0x9781, - 49082 - 44032: 0x9782, - 49083 - 44032: 0x9783, - 49084 - 44032: 0x9784, - 49085 - 44032: 0x9785, - 49086 - 44032: 0x9786, - 49087 - 44032: 0x9787, - 49088 - 44032: 0x9788, - 49089 - 44032: 0x9789, - 49090 - 44032: 0x978A, - 49091 - 44032: 0x978B, - 49092 - 44032: 0x978C, - 49093 - 44032: 0xBBD0, - 49094 - 44032: 0x978D, - 49095 - 44032: 0x978E, - 49096 - 44032: 0x978F, - 49097 - 44032: 0x9790, - 49098 - 44032: 0x9791, - 49099 - 44032: 0x9792, - 49100 - 44032: 0xBBD1, - 49101 - 44032: 0xBBD2, - 49102 - 44032: 0x9793, - 49103 - 44032: 0x9794, - 49104 - 44032: 0xBBD3, - 49105 - 44032: 0x9795, - 49106 - 44032: 0x9796, - 49107 - 44032: 0x9797, - 49108 - 44032: 0xBBD4, - 49109 - 44032: 0x9798, - 49110 - 44032: 0x9799, - 49111 - 44032: 0x979A, - 49112 - 44032: 0x979B, - 49113 - 44032: 0x979C, - 49114 - 44032: 0x979D, - 49115 - 44032: 0x979E, - 49116 - 44032: 0xBBD5, - 49117 - 44032: 0x979F, - 49118 - 44032: 0x97A0, - 49119 - 44032: 0xBBD6, - 49120 - 44032: 0x97A1, - 49121 - 44032: 0xBBD7, - 49122 - 44032: 0x97A2, - 49123 - 44032: 0x97A3, - 49124 - 44032: 0x97A4, - 49125 - 44032: 0x97A5, - 49126 - 44032: 0x97A6, - 49127 - 44032: 0x97A7, - 49128 - 44032: 0x97A8, - 49129 - 44032: 0x97A9, - 49130 - 44032: 0x97AA, - 49131 - 44032: 0x97AB, - 49132 - 44032: 0x97AC, - 49133 - 44032: 0x97AD, - 49134 - 44032: 0x97AE, - 49135 - 44032: 0x97AF, - 49136 - 44032: 0x97B0, - 49137 - 44032: 0x97B1, - 49138 - 44032: 0x97B2, - 49139 - 44032: 0x97B3, - 49140 - 44032: 0x97B4, - 49141 - 44032: 0x97B5, - 49142 - 44032: 0x97B6, - 49143 - 44032: 0x97B7, - 49144 - 44032: 0x97B8, - 49145 - 44032: 0x97B9, - 49146 - 44032: 0x97BA, - 49147 - 44032: 0x97BB, - 49148 - 44032: 0x97BC, - 49149 - 44032: 0x97BD, - 49150 - 44032: 0x97BE, - 49151 - 44032: 0x97BF, - 49152 - 44032: 0x97C0, - 49153 - 44032: 0x97C1, - 49154 - 44032: 0x97C2, - 49155 - 44032: 0x97C3, - 49156 - 44032: 0x97C4, - 49157 - 44032: 0x97C5, - 49158 - 44032: 0x97C6, - 49159 - 44032: 0x97C7, - 49160 - 44032: 0x97C8, - 49161 - 44032: 0x97C9, - 49162 - 44032: 0x97CA, - 49163 - 44032: 0x97CB, - 49164 - 44032: 0x97CC, - 49165 - 44032: 0x97CD, - 49166 - 44032: 0x97CE, - 49167 - 44032: 0x97CF, - 49168 - 44032: 0x97D0, - 49169 - 44032: 0x97D1, - 49170 - 44032: 0x97D2, - 49171 - 44032: 0x97D3, - 49172 - 44032: 0x97D4, - 49173 - 44032: 0x97D5, - 49174 - 44032: 0x97D6, - 49175 - 44032: 0x97D7, - 49176 - 44032: 0x97D8, - 49177 - 44032: 0x97D9, - 49178 - 44032: 0x97DA, - 49179 - 44032: 0x97DB, - 49180 - 44032: 0x97DC, - 49181 - 44032: 0x97DD, - 49182 - 44032: 0x97DE, - 49183 - 44032: 0x97DF, - 49184 - 44032: 0x97E0, - 49185 - 44032: 0x97E1, - 49186 - 44032: 0x97E2, - 49187 - 44032: 0x97E3, - 49188 - 44032: 0x97E4, - 49189 - 44032: 0x97E5, - 49190 - 44032: 0x97E6, - 49191 - 44032: 0x97E7, - 49192 - 44032: 0x97E8, - 49193 - 44032: 0x97E9, - 49194 - 44032: 0x97EA, - 49195 - 44032: 0x97EB, - 49196 - 44032: 0x97EC, - 49197 - 44032: 0x97ED, - 49198 - 44032: 0x97EE, - 49199 - 44032: 0x97EF, - 49200 - 44032: 0x97F0, - 49201 - 44032: 0x97F1, - 49202 - 44032: 0x97F2, - 49203 - 44032: 0x97F3, - 49204 - 44032: 0x97F4, - 49205 - 44032: 0x97F5, - 49206 - 44032: 0x97F6, - 49207 - 44032: 0x97F7, - 49208 - 44032: 0x97F8, - 49209 - 44032: 0x97F9, - 49210 - 44032: 0x97FA, - 49211 - 44032: 0x97FB, - 49212 - 44032: 0xBBD8, - 49213 - 44032: 0x97FC, - 49214 - 44032: 0x97FD, - 49215 - 44032: 0x97FE, - 49216 - 44032: 0x9841, - 49217 - 44032: 0x9842, - 49218 - 44032: 0x9843, - 49219 - 44032: 0x9844, - 49220 - 44032: 0x9845, - 49221 - 44032: 0x9846, - 49222 - 44032: 0x9847, - 49223 - 44032: 0x9848, - 49224 - 44032: 0x9849, - 49225 - 44032: 0x984A, - 49226 - 44032: 0x984B, - 49227 - 44032: 0x984C, - 49228 - 44032: 0x984D, - 49229 - 44032: 0x984E, - 49230 - 44032: 0x984F, - 49231 - 44032: 0x9850, - 49232 - 44032: 0x9851, - 49233 - 44032: 0xBBD9, - 49234 - 44032: 0x9852, - 49235 - 44032: 0x9853, - 49236 - 44032: 0x9854, - 49237 - 44032: 0x9855, - 49238 - 44032: 0x9856, - 49239 - 44032: 0x9857, - 49240 - 44032: 0xBBDA, - 49241 - 44032: 0x9858, - 49242 - 44032: 0x9859, - 49243 - 44032: 0x985A, - 49244 - 44032: 0xBBDB, - 49245 - 44032: 0x9861, - 49246 - 44032: 0x9862, - 49247 - 44032: 0x9863, - 49248 - 44032: 0xBBDC, - 49249 - 44032: 0x9864, - 49250 - 44032: 0x9865, - 49251 - 44032: 0x9866, - 49252 - 44032: 0x9867, - 49253 - 44032: 0x9868, - 49254 - 44032: 0x9869, - 49255 - 44032: 0x986A, - 49256 - 44032: 0xBBDD, - 49257 - 44032: 0xBBDE, - 49258 - 44032: 0x986B, - 49259 - 44032: 0x986C, - 49260 - 44032: 0x986D, - 49261 - 44032: 0x986E, - 49262 - 44032: 0x986F, - 49263 - 44032: 0x9870, - 49264 - 44032: 0x9871, - 49265 - 44032: 0x9872, - 49266 - 44032: 0x9873, - 49267 - 44032: 0x9874, - 49268 - 44032: 0x9875, - 49269 - 44032: 0x9876, - 49270 - 44032: 0x9877, - 49271 - 44032: 0x9878, - 49272 - 44032: 0x9879, - 49273 - 44032: 0x987A, - 49274 - 44032: 0x9881, - 49275 - 44032: 0x9882, - 49276 - 44032: 0x9883, - 49277 - 44032: 0x9884, - 49278 - 44032: 0x9885, - 49279 - 44032: 0x9886, - 49280 - 44032: 0x9887, - 49281 - 44032: 0x9888, - 49282 - 44032: 0x9889, - 49283 - 44032: 0x988A, - 49284 - 44032: 0x988B, - 49285 - 44032: 0x988C, - 49286 - 44032: 0x988D, - 49287 - 44032: 0x988E, - 49288 - 44032: 0x988F, - 49289 - 44032: 0x9890, - 49290 - 44032: 0x9891, - 49291 - 44032: 0x9892, - 49292 - 44032: 0x9893, - 49293 - 44032: 0x9894, - 49294 - 44032: 0x9895, - 49295 - 44032: 0x9896, - 49296 - 44032: 0xBBDF, - 49297 - 44032: 0xBBE0, - 49298 - 44032: 0x9897, - 49299 - 44032: 0x9898, - 49300 - 44032: 0xBBE1, - 49301 - 44032: 0x9899, - 49302 - 44032: 0x989A, - 49303 - 44032: 0x989B, - 49304 - 44032: 0xBBE2, - 49305 - 44032: 0x989C, - 49306 - 44032: 0x989D, - 49307 - 44032: 0x989E, - 49308 - 44032: 0x989F, - 49309 - 44032: 0x98A0, - 49310 - 44032: 0x98A1, - 49311 - 44032: 0x98A2, - 49312 - 44032: 0xBBE3, - 49313 - 44032: 0xBBE4, - 49314 - 44032: 0x98A3, - 49315 - 44032: 0xBBE5, - 49316 - 44032: 0x98A4, - 49317 - 44032: 0xBBE6, - 49318 - 44032: 0x98A5, - 49319 - 44032: 0x98A6, - 49320 - 44032: 0x98A7, - 49321 - 44032: 0x98A8, - 49322 - 44032: 0x98A9, - 49323 - 44032: 0x98AA, - 49324 - 44032: 0xBBE7, - 49325 - 44032: 0xBBE8, - 49326 - 44032: 0x98AB, - 49327 - 44032: 0xBBE9, - 49328 - 44032: 0xBBEA, - 49329 - 44032: 0x98AC, - 49330 - 44032: 0x98AD, - 49331 - 44032: 0xBBEB, - 49332 - 44032: 0xBBEC, - 49333 - 44032: 0xBBED, - 49334 - 44032: 0xBBEE, - 49335 - 44032: 0x98AE, - 49336 - 44032: 0x98AF, - 49337 - 44032: 0x98B0, - 49338 - 44032: 0x98B1, - 49339 - 44032: 0x98B2, - 49340 - 44032: 0xBBEF, - 49341 - 44032: 0xBBF0, - 49342 - 44032: 0x98B3, - 49343 - 44032: 0xBBF1, - 49344 - 44032: 0xBBF2, - 49345 - 44032: 0xBBF3, - 49346 - 44032: 0x98B4, - 49347 - 44032: 0x98B5, - 49348 - 44032: 0x98B6, - 49349 - 44032: 0xBBF4, - 49350 - 44032: 0x98B7, - 49351 - 44032: 0x98B8, - 49352 - 44032: 0xBBF5, - 49353 - 44032: 0xBBF6, - 49354 - 44032: 0x98B9, - 49355 - 44032: 0x98BA, - 49356 - 44032: 0xBBF7, - 49357 - 44032: 0x98BB, - 49358 - 44032: 0x98BC, - 49359 - 44032: 0x98BD, - 49360 - 44032: 0xBBF8, - 49361 - 44032: 0x98BE, - 49362 - 44032: 0x98BF, - 49363 - 44032: 0x98C0, - 49364 - 44032: 0x98C1, - 49365 - 44032: 0x98C2, - 49366 - 44032: 0x98C3, - 49367 - 44032: 0x98C4, - 49368 - 44032: 0xBBF9, - 49369 - 44032: 0xBBFA, - 49370 - 44032: 0x98C5, - 49371 - 44032: 0xBBFB, - 49372 - 44032: 0xBBFC, - 49373 - 44032: 0xBBFD, - 49374 - 44032: 0x98C6, - 49375 - 44032: 0x98C7, - 49376 - 44032: 0x98C8, - 49377 - 44032: 0x98C9, - 49378 - 44032: 0x98CA, - 49379 - 44032: 0x98CB, - 49380 - 44032: 0xBBFE, - 49381 - 44032: 0xBCA1, - 49382 - 44032: 0x98CC, - 49383 - 44032: 0x98CD, - 49384 - 44032: 0xBCA2, - 49385 - 44032: 0x98CE, - 49386 - 44032: 0x98CF, - 49387 - 44032: 0x98D0, - 49388 - 44032: 0xBCA3, - 49389 - 44032: 0x98D1, - 49390 - 44032: 0x98D2, - 49391 - 44032: 0x98D3, - 49392 - 44032: 0x98D4, - 49393 - 44032: 0x98D5, - 49394 - 44032: 0x98D6, - 49395 - 44032: 0x98D7, - 49396 - 44032: 0xBCA4, - 49397 - 44032: 0xBCA5, - 49398 - 44032: 0x98D8, - 49399 - 44032: 0xBCA6, - 49400 - 44032: 0x98D9, - 49401 - 44032: 0xBCA7, - 49402 - 44032: 0x98DA, - 49403 - 44032: 0x98DB, - 49404 - 44032: 0x98DC, - 49405 - 44032: 0x98DD, - 49406 - 44032: 0x98DE, - 49407 - 44032: 0x98DF, - 49408 - 44032: 0xBCA8, - 49409 - 44032: 0x98E0, - 49410 - 44032: 0x98E1, - 49411 - 44032: 0x98E2, - 49412 - 44032: 0xBCA9, - 49413 - 44032: 0x98E3, - 49414 - 44032: 0x98E4, - 49415 - 44032: 0x98E5, - 49416 - 44032: 0xBCAA, - 49417 - 44032: 0x98E6, - 49418 - 44032: 0x98E7, - 49419 - 44032: 0x98E8, - 49420 - 44032: 0x98E9, - 49421 - 44032: 0x98EA, - 49422 - 44032: 0x98EB, - 49423 - 44032: 0x98EC, - 49424 - 44032: 0xBCAB, - 49425 - 44032: 0x98ED, - 49426 - 44032: 0x98EE, - 49427 - 44032: 0x98EF, - 49428 - 44032: 0x98F0, - 49429 - 44032: 0xBCAC, - 49430 - 44032: 0x98F1, - 49431 - 44032: 0x98F2, - 49432 - 44032: 0x98F3, - 49433 - 44032: 0x98F4, - 49434 - 44032: 0x98F5, - 49435 - 44032: 0x98F6, - 49436 - 44032: 0xBCAD, - 49437 - 44032: 0xBCAE, - 49438 - 44032: 0xBCAF, - 49439 - 44032: 0xBCB0, - 49440 - 44032: 0xBCB1, - 49441 - 44032: 0x98F7, - 49442 - 44032: 0x98F8, - 49443 - 44032: 0xBCB2, - 49444 - 44032: 0xBCB3, - 49445 - 44032: 0x98F9, - 49446 - 44032: 0xBCB4, - 49447 - 44032: 0xBCB5, - 49448 - 44032: 0x98FA, - 49449 - 44032: 0x98FB, - 49450 - 44032: 0x98FC, - 49451 - 44032: 0x98FD, - 49452 - 44032: 0xBCB6, - 49453 - 44032: 0xBCB7, - 49454 - 44032: 0x98FE, - 49455 - 44032: 0xBCB8, - 49456 - 44032: 0xBCB9, - 49457 - 44032: 0xBCBA, - 49458 - 44032: 0x9941, - 49459 - 44032: 0x9942, - 49460 - 44032: 0x9943, - 49461 - 44032: 0x9944, - 49462 - 44032: 0xBCBB, - 49463 - 44032: 0x9945, - 49464 - 44032: 0xBCBC, - 49465 - 44032: 0xBCBD, - 49466 - 44032: 0x9946, - 49467 - 44032: 0x9947, - 49468 - 44032: 0xBCBE, - 49469 - 44032: 0x9948, - 49470 - 44032: 0x9949, - 49471 - 44032: 0x994A, - 49472 - 44032: 0xBCBF, - 49473 - 44032: 0x994B, - 49474 - 44032: 0x994C, - 49475 - 44032: 0x994D, - 49476 - 44032: 0x994E, - 49477 - 44032: 0x994F, - 49478 - 44032: 0x9950, - 49479 - 44032: 0x9951, - 49480 - 44032: 0xBCC0, - 49481 - 44032: 0xBCC1, - 49482 - 44032: 0x9952, - 49483 - 44032: 0xBCC2, - 49484 - 44032: 0xBCC3, - 49485 - 44032: 0xBCC4, - 49486 - 44032: 0x9953, - 49487 - 44032: 0x9954, - 49488 - 44032: 0x9955, - 49489 - 44032: 0x9956, - 49490 - 44032: 0x9957, - 49491 - 44032: 0x9958, - 49492 - 44032: 0xBCC5, - 49493 - 44032: 0xBCC6, - 49494 - 44032: 0x9959, - 49495 - 44032: 0x995A, - 49496 - 44032: 0xBCC7, - 49497 - 44032: 0x9961, - 49498 - 44032: 0x9962, - 49499 - 44032: 0x9963, - 49500 - 44032: 0xBCC8, - 49501 - 44032: 0x9964, - 49502 - 44032: 0x9965, - 49503 - 44032: 0x9966, - 49504 - 44032: 0x9967, - 49505 - 44032: 0x9968, - 49506 - 44032: 0x9969, - 49507 - 44032: 0x996A, - 49508 - 44032: 0xBCC9, - 49509 - 44032: 0xBCCA, - 49510 - 44032: 0x996B, - 49511 - 44032: 0xBCCB, - 49512 - 44032: 0xBCCC, - 49513 - 44032: 0xBCCD, - 49514 - 44032: 0x996C, - 49515 - 44032: 0x996D, - 49516 - 44032: 0x996E, - 49517 - 44032: 0x996F, - 49518 - 44032: 0x9970, - 49519 - 44032: 0x9971, - 49520 - 44032: 0xBCCE, - 49521 - 44032: 0x9972, - 49522 - 44032: 0x9973, - 49523 - 44032: 0x9974, - 49524 - 44032: 0xBCCF, - 49525 - 44032: 0x9975, - 49526 - 44032: 0x9976, - 49527 - 44032: 0x9977, - 49528 - 44032: 0xBCD0, - 49529 - 44032: 0x9978, - 49530 - 44032: 0x9979, - 49531 - 44032: 0x997A, - 49532 - 44032: 0x9981, - 49533 - 44032: 0x9982, - 49534 - 44032: 0x9983, - 49535 - 44032: 0x9984, - 49536 - 44032: 0x9985, - 49537 - 44032: 0x9986, - 49538 - 44032: 0x9987, - 49539 - 44032: 0x9988, - 49540 - 44032: 0x9989, - 49541 - 44032: 0xBCD1, - 49542 - 44032: 0x998A, - 49543 - 44032: 0x998B, - 49544 - 44032: 0x998C, - 49545 - 44032: 0x998D, - 49546 - 44032: 0x998E, - 49547 - 44032: 0x998F, - 49548 - 44032: 0xBCD2, - 49549 - 44032: 0xBCD3, - 49550 - 44032: 0xBCD4, - 49551 - 44032: 0x9990, - 49552 - 44032: 0xBCD5, - 49553 - 44032: 0x9991, - 49554 - 44032: 0x9992, - 49555 - 44032: 0x9993, - 49556 - 44032: 0xBCD6, - 49557 - 44032: 0x9994, - 49558 - 44032: 0xBCD7, - 49559 - 44032: 0x9995, - 49560 - 44032: 0x9996, - 49561 - 44032: 0x9997, - 49562 - 44032: 0x9998, - 49563 - 44032: 0x9999, - 49564 - 44032: 0xBCD8, - 49565 - 44032: 0xBCD9, - 49566 - 44032: 0x999A, - 49567 - 44032: 0xBCDA, - 49568 - 44032: 0x999B, - 49569 - 44032: 0xBCDB, - 49570 - 44032: 0x999C, - 49571 - 44032: 0x999D, - 49572 - 44032: 0x999E, - 49573 - 44032: 0xBCDC, - 49574 - 44032: 0x999F, - 49575 - 44032: 0x99A0, - 49576 - 44032: 0xBCDD, - 49577 - 44032: 0xBCDE, - 49578 - 44032: 0x99A1, - 49579 - 44032: 0x99A2, - 49580 - 44032: 0xBCDF, - 49581 - 44032: 0x99A3, - 49582 - 44032: 0x99A4, - 49583 - 44032: 0x99A5, - 49584 - 44032: 0xBCE0, - 49585 - 44032: 0x99A6, - 49586 - 44032: 0x99A7, - 49587 - 44032: 0x99A8, - 49588 - 44032: 0x99A9, - 49589 - 44032: 0x99AA, - 49590 - 44032: 0x99AB, - 49591 - 44032: 0x99AC, - 49592 - 44032: 0x99AD, - 49593 - 44032: 0x99AE, - 49594 - 44032: 0x99AF, - 49595 - 44032: 0x99B0, - 49596 - 44032: 0x99B1, - 49597 - 44032: 0xBCE1, - 49598 - 44032: 0x99B2, - 49599 - 44032: 0x99B3, - 49600 - 44032: 0x99B4, - 49601 - 44032: 0x99B5, - 49602 - 44032: 0x99B6, - 49603 - 44032: 0x99B7, - 49604 - 44032: 0xBCE2, - 49605 - 44032: 0x99B8, - 49606 - 44032: 0x99B9, - 49607 - 44032: 0x99BA, - 49608 - 44032: 0xBCE3, - 49609 - 44032: 0x99BB, - 49610 - 44032: 0x99BC, - 49611 - 44032: 0x99BD, - 49612 - 44032: 0xBCE4, - 49613 - 44032: 0x99BE, - 49614 - 44032: 0x99BF, - 49615 - 44032: 0x99C0, - 49616 - 44032: 0x99C1, - 49617 - 44032: 0x99C2, - 49618 - 44032: 0x99C3, - 49619 - 44032: 0x99C4, - 49620 - 44032: 0xBCE5, - 49621 - 44032: 0x99C5, - 49622 - 44032: 0x99C6, - 49623 - 44032: 0xBCE6, - 49624 - 44032: 0xBCE7, - 49625 - 44032: 0x99C7, - 49626 - 44032: 0x99C8, - 49627 - 44032: 0x99C9, - 49628 - 44032: 0x99CA, - 49629 - 44032: 0x99CB, - 49630 - 44032: 0x99CC, - 49631 - 44032: 0x99CD, - 49632 - 44032: 0xBCE8, - 49633 - 44032: 0x99CE, - 49634 - 44032: 0x99CF, - 49635 - 44032: 0x99D0, - 49636 - 44032: 0xBCE9, - 49637 - 44032: 0x99D1, - 49638 - 44032: 0x99D2, - 49639 - 44032: 0x99D3, - 49640 - 44032: 0xBCEA, - 49641 - 44032: 0x99D4, - 49642 - 44032: 0x99D5, - 49643 - 44032: 0x99D6, - 49644 - 44032: 0x99D7, - 49645 - 44032: 0x99D8, - 49646 - 44032: 0x99D9, - 49647 - 44032: 0x99DA, - 49648 - 44032: 0xBCEB, - 49649 - 44032: 0xBCEC, - 49650 - 44032: 0x99DB, - 49651 - 44032: 0xBCED, - 49652 - 44032: 0x99DC, - 49653 - 44032: 0x99DD, - 49654 - 44032: 0x99DE, - 49655 - 44032: 0x99DF, - 49656 - 44032: 0x99E0, - 49657 - 44032: 0x99E1, - 49658 - 44032: 0x99E2, - 49659 - 44032: 0x99E3, - 49660 - 44032: 0xBCEE, - 49661 - 44032: 0xBCEF, - 49662 - 44032: 0x99E4, - 49663 - 44032: 0x99E5, - 49664 - 44032: 0xBCF0, - 49665 - 44032: 0x99E6, - 49666 - 44032: 0x99E7, - 49667 - 44032: 0x99E8, - 49668 - 44032: 0xBCF1, - 49669 - 44032: 0x99E9, - 49670 - 44032: 0x99EA, - 49671 - 44032: 0x99EB, - 49672 - 44032: 0x99EC, - 49673 - 44032: 0x99ED, - 49674 - 44032: 0x99EE, - 49675 - 44032: 0x99EF, - 49676 - 44032: 0xBCF2, - 49677 - 44032: 0xBCF3, - 49678 - 44032: 0x99F0, - 49679 - 44032: 0xBCF4, - 49680 - 44032: 0x99F1, - 49681 - 44032: 0xBCF5, - 49682 - 44032: 0x99F2, - 49683 - 44032: 0x99F3, - 49684 - 44032: 0x99F4, - 49685 - 44032: 0x99F5, - 49686 - 44032: 0x99F6, - 49687 - 44032: 0x99F7, - 49688 - 44032: 0xBCF6, - 49689 - 44032: 0xBCF7, - 49690 - 44032: 0x99F8, - 49691 - 44032: 0x99F9, - 49692 - 44032: 0xBCF8, - 49693 - 44032: 0x99FA, - 49694 - 44032: 0x99FB, - 49695 - 44032: 0xBCF9, - 49696 - 44032: 0xBCFA, - 49697 - 44032: 0x99FC, - 49698 - 44032: 0x99FD, - 49699 - 44032: 0x99FE, - 49700 - 44032: 0x9A41, - 49701 - 44032: 0x9A42, - 49702 - 44032: 0x9A43, - 49703 - 44032: 0x9A44, - 49704 - 44032: 0xBCFB, - 49705 - 44032: 0xBCFC, - 49706 - 44032: 0x9A45, - 49707 - 44032: 0xBCFD, - 49708 - 44032: 0x9A46, - 49709 - 44032: 0xBCFE, - 49710 - 44032: 0x9A47, - 49711 - 44032: 0xBDA1, - 49712 - 44032: 0x9A48, - 49713 - 44032: 0xBDA2, - 49714 - 44032: 0xBDA3, - 49715 - 44032: 0x9A49, - 49716 - 44032: 0xBDA4, - 49717 - 44032: 0x9A4A, - 49718 - 44032: 0x9A4B, - 49719 - 44032: 0x9A4C, - 49720 - 44032: 0x9A4D, - 49721 - 44032: 0x9A4E, - 49722 - 44032: 0x9A4F, - 49723 - 44032: 0x9A50, - 49724 - 44032: 0x9A51, - 49725 - 44032: 0x9A52, - 49726 - 44032: 0x9A53, - 49727 - 44032: 0x9A54, - 49728 - 44032: 0x9A55, - 49729 - 44032: 0x9A56, - 49730 - 44032: 0x9A57, - 49731 - 44032: 0x9A58, - 49732 - 44032: 0x9A59, - 49733 - 44032: 0x9A5A, - 49734 - 44032: 0x9A61, - 49735 - 44032: 0x9A62, - 49736 - 44032: 0xBDA5, - 49737 - 44032: 0x9A63, - 49738 - 44032: 0x9A64, - 49739 - 44032: 0x9A65, - 49740 - 44032: 0x9A66, - 49741 - 44032: 0x9A67, - 49742 - 44032: 0x9A68, - 49743 - 44032: 0x9A69, - 49744 - 44032: 0xBDA6, - 49745 - 44032: 0xBDA7, - 49746 - 44032: 0x9A6A, - 49747 - 44032: 0x9A6B, - 49748 - 44032: 0xBDA8, - 49749 - 44032: 0x9A6C, - 49750 - 44032: 0x9A6D, - 49751 - 44032: 0x9A6E, - 49752 - 44032: 0xBDA9, - 49753 - 44032: 0x9A6F, - 49754 - 44032: 0x9A70, - 49755 - 44032: 0x9A71, - 49756 - 44032: 0x9A72, - 49757 - 44032: 0x9A73, - 49758 - 44032: 0x9A74, - 49759 - 44032: 0x9A75, - 49760 - 44032: 0xBDAA, - 49761 - 44032: 0x9A76, - 49762 - 44032: 0x9A77, - 49763 - 44032: 0x9A78, - 49764 - 44032: 0x9A79, - 49765 - 44032: 0xBDAB, - 49766 - 44032: 0x9A7A, - 49767 - 44032: 0x9A81, - 49768 - 44032: 0x9A82, - 49769 - 44032: 0x9A83, - 49770 - 44032: 0x9A84, - 49771 - 44032: 0x9A85, - 49772 - 44032: 0xBDAC, - 49773 - 44032: 0xBDAD, - 49774 - 44032: 0x9A86, - 49775 - 44032: 0x9A87, - 49776 - 44032: 0xBDAE, - 49777 - 44032: 0x9A88, - 49778 - 44032: 0x9A89, - 49779 - 44032: 0x9A8A, - 49780 - 44032: 0xBDAF, - 49781 - 44032: 0x9A8B, - 49782 - 44032: 0x9A8C, - 49783 - 44032: 0x9A8D, - 49784 - 44032: 0x9A8E, - 49785 - 44032: 0x9A8F, - 49786 - 44032: 0x9A90, - 49787 - 44032: 0x9A91, - 49788 - 44032: 0xBDB0, - 49789 - 44032: 0xBDB1, - 49790 - 44032: 0x9A92, - 49791 - 44032: 0xBDB2, - 49792 - 44032: 0x9A93, - 49793 - 44032: 0xBDB3, - 49794 - 44032: 0x9A94, - 49795 - 44032: 0x9A95, - 49796 - 44032: 0x9A96, - 49797 - 44032: 0x9A97, - 49798 - 44032: 0x9A98, - 49799 - 44032: 0x9A99, - 49800 - 44032: 0xBDB4, - 49801 - 44032: 0xBDB5, - 49802 - 44032: 0x9A9A, - 49803 - 44032: 0x9A9B, - 49804 - 44032: 0x9A9C, - 49805 - 44032: 0x9A9D, - 49806 - 44032: 0x9A9E, - 49807 - 44032: 0x9A9F, - 49808 - 44032: 0xBDB6, - 49809 - 44032: 0x9AA0, - 49810 - 44032: 0x9AA1, - 49811 - 44032: 0x9AA2, - 49812 - 44032: 0x9AA3, - 49813 - 44032: 0x9AA4, - 49814 - 44032: 0x9AA5, - 49815 - 44032: 0x9AA6, - 49816 - 44032: 0xBDB7, - 49817 - 44032: 0x9AA7, - 49818 - 44032: 0x9AA8, - 49819 - 44032: 0xBDB8, - 49820 - 44032: 0x9AA9, - 49821 - 44032: 0xBDB9, - 49822 - 44032: 0x9AAA, - 49823 - 44032: 0x9AAB, - 49824 - 44032: 0x9AAC, - 49825 - 44032: 0x9AAD, - 49826 - 44032: 0x9AAE, - 49827 - 44032: 0x9AAF, - 49828 - 44032: 0xBDBA, - 49829 - 44032: 0xBDBB, - 49830 - 44032: 0x9AB0, - 49831 - 44032: 0x9AB1, - 49832 - 44032: 0xBDBC, - 49833 - 44032: 0x9AB2, - 49834 - 44032: 0x9AB3, - 49835 - 44032: 0x9AB4, - 49836 - 44032: 0xBDBD, - 49837 - 44032: 0xBDBE, - 49838 - 44032: 0x9AB5, - 49839 - 44032: 0x9AB6, - 49840 - 44032: 0x9AB7, - 49841 - 44032: 0x9AB8, - 49842 - 44032: 0x9AB9, - 49843 - 44032: 0x9ABA, - 49844 - 44032: 0xBDBF, - 49845 - 44032: 0xBDC0, - 49846 - 44032: 0x9ABB, - 49847 - 44032: 0xBDC1, - 49848 - 44032: 0x9ABC, - 49849 - 44032: 0xBDC2, - 49850 - 44032: 0x9ABD, - 49851 - 44032: 0x9ABE, - 49852 - 44032: 0x9ABF, - 49853 - 44032: 0x9AC0, - 49854 - 44032: 0x9AC1, - 49855 - 44032: 0x9AC2, - 49856 - 44032: 0x9AC3, - 49857 - 44032: 0x9AC4, - 49858 - 44032: 0x9AC5, - 49859 - 44032: 0x9AC6, - 49860 - 44032: 0x9AC7, - 49861 - 44032: 0x9AC8, - 49862 - 44032: 0x9AC9, - 49863 - 44032: 0x9ACA, - 49864 - 44032: 0x9ACB, - 49865 - 44032: 0x9ACC, - 49866 - 44032: 0x9ACD, - 49867 - 44032: 0x9ACE, - 49868 - 44032: 0x9ACF, - 49869 - 44032: 0x9AD0, - 49870 - 44032: 0x9AD1, - 49871 - 44032: 0x9AD2, - 49872 - 44032: 0x9AD3, - 49873 - 44032: 0x9AD4, - 49874 - 44032: 0x9AD5, - 49875 - 44032: 0x9AD6, - 49876 - 44032: 0x9AD7, - 49877 - 44032: 0x9AD8, - 49878 - 44032: 0x9AD9, - 49879 - 44032: 0x9ADA, - 49880 - 44032: 0x9ADB, - 49881 - 44032: 0x9ADC, - 49882 - 44032: 0x9ADD, - 49883 - 44032: 0x9ADE, - 49884 - 44032: 0xBDC3, - 49885 - 44032: 0xBDC4, - 49886 - 44032: 0x9ADF, - 49887 - 44032: 0x9AE0, - 49888 - 44032: 0xBDC5, - 49889 - 44032: 0x9AE1, - 49890 - 44032: 0x9AE2, - 49891 - 44032: 0xBDC6, - 49892 - 44032: 0xBDC7, - 49893 - 44032: 0x9AE3, - 49894 - 44032: 0x9AE4, - 49895 - 44032: 0x9AE5, - 49896 - 44032: 0x9AE6, - 49897 - 44032: 0x9AE7, - 49898 - 44032: 0x9AE8, - 49899 - 44032: 0xBDC8, - 49900 - 44032: 0xBDC9, - 49901 - 44032: 0xBDCA, - 49902 - 44032: 0x9AE9, - 49903 - 44032: 0xBDCB, - 49904 - 44032: 0x9AEA, - 49905 - 44032: 0xBDCC, - 49906 - 44032: 0x9AEB, - 49907 - 44032: 0x9AEC, - 49908 - 44032: 0x9AED, - 49909 - 44032: 0x9AEE, - 49910 - 44032: 0xBDCD, - 49911 - 44032: 0x9AEF, - 49912 - 44032: 0xBDCE, - 49913 - 44032: 0xBDCF, - 49914 - 44032: 0x9AF0, - 49915 - 44032: 0xBDD0, - 49916 - 44032: 0xBDD1, - 49917 - 44032: 0x9AF1, - 49918 - 44032: 0x9AF2, - 49919 - 44032: 0x9AF3, - 49920 - 44032: 0xBDD2, - 49921 - 44032: 0x9AF4, - 49922 - 44032: 0x9AF5, - 49923 - 44032: 0x9AF6, - 49924 - 44032: 0x9AF7, - 49925 - 44032: 0x9AF8, - 49926 - 44032: 0x9AF9, - 49927 - 44032: 0x9AFA, - 49928 - 44032: 0xBDD3, - 49929 - 44032: 0xBDD4, - 49930 - 44032: 0x9AFB, - 49931 - 44032: 0x9AFC, - 49932 - 44032: 0xBDD5, - 49933 - 44032: 0xBDD6, - 49934 - 44032: 0x9AFD, - 49935 - 44032: 0x9AFE, - 49936 - 44032: 0x9B41, - 49937 - 44032: 0x9B42, - 49938 - 44032: 0x9B43, - 49939 - 44032: 0xBDD7, - 49940 - 44032: 0xBDD8, - 49941 - 44032: 0xBDD9, - 49942 - 44032: 0x9B44, - 49943 - 44032: 0x9B45, - 49944 - 44032: 0xBDDA, - 49945 - 44032: 0x9B46, - 49946 - 44032: 0x9B47, - 49947 - 44032: 0x9B48, - 49948 - 44032: 0xBDDB, - 49949 - 44032: 0x9B49, - 49950 - 44032: 0x9B4A, - 49951 - 44032: 0x9B4B, - 49952 - 44032: 0x9B4C, - 49953 - 44032: 0x9B4D, - 49954 - 44032: 0x9B4E, - 49955 - 44032: 0x9B4F, - 49956 - 44032: 0xBDDC, - 49957 - 44032: 0xBDDD, - 49958 - 44032: 0x9B50, - 49959 - 44032: 0x9B51, - 49960 - 44032: 0xBDDE, - 49961 - 44032: 0xBDDF, - 49962 - 44032: 0x9B52, - 49963 - 44032: 0x9B53, - 49964 - 44032: 0x9B54, - 49965 - 44032: 0x9B55, - 49966 - 44032: 0x9B56, - 49967 - 44032: 0x9B57, - 49968 - 44032: 0x9B58, - 49969 - 44032: 0x9B59, - 49970 - 44032: 0x9B5A, - 49971 - 44032: 0x9B61, - 49972 - 44032: 0x9B62, - 49973 - 44032: 0x9B63, - 49974 - 44032: 0x9B64, - 49975 - 44032: 0x9B65, - 49976 - 44032: 0x9B66, - 49977 - 44032: 0x9B67, - 49978 - 44032: 0x9B68, - 49979 - 44032: 0x9B69, - 49980 - 44032: 0x9B6A, - 49981 - 44032: 0x9B6B, - 49982 - 44032: 0x9B6C, - 49983 - 44032: 0x9B6D, - 49984 - 44032: 0x9B6E, - 49985 - 44032: 0x9B6F, - 49986 - 44032: 0x9B70, - 49987 - 44032: 0x9B71, - 49988 - 44032: 0x9B72, - 49989 - 44032: 0xBDE0, - 49990 - 44032: 0x9B73, - 49991 - 44032: 0x9B74, - 49992 - 44032: 0x9B75, - 49993 - 44032: 0x9B76, - 49994 - 44032: 0x9B77, - 49995 - 44032: 0x9B78, - 49996 - 44032: 0x9B79, - 49997 - 44032: 0x9B7A, - 49998 - 44032: 0x9B81, - 49999 - 44032: 0x9B82, - 50000 - 44032: 0x9B83, - 50001 - 44032: 0x9B84, - 50002 - 44032: 0x9B85, - 50003 - 44032: 0x9B86, - 50004 - 44032: 0x9B87, - 50005 - 44032: 0x9B88, - 50006 - 44032: 0x9B89, - 50007 - 44032: 0x9B8A, - 50008 - 44032: 0x9B8B, - 50009 - 44032: 0x9B8C, - 50010 - 44032: 0x9B8D, - 50011 - 44032: 0x9B8E, - 50012 - 44032: 0x9B8F, - 50013 - 44032: 0x9B90, - 50014 - 44032: 0x9B91, - 50015 - 44032: 0x9B92, - 50016 - 44032: 0x9B93, - 50017 - 44032: 0x9B94, - 50018 - 44032: 0x9B95, - 50019 - 44032: 0x9B96, - 50020 - 44032: 0x9B97, - 50021 - 44032: 0x9B98, - 50022 - 44032: 0x9B99, - 50023 - 44032: 0x9B9A, - 50024 - 44032: 0xBDE1, - 50025 - 44032: 0xBDE2, - 50026 - 44032: 0x9B9B, - 50027 - 44032: 0x9B9C, - 50028 - 44032: 0xBDE3, - 50029 - 44032: 0x9B9D, - 50030 - 44032: 0x9B9E, - 50031 - 44032: 0x9B9F, - 50032 - 44032: 0xBDE4, - 50033 - 44032: 0x9BA0, - 50034 - 44032: 0xBDE5, - 50035 - 44032: 0x9BA1, - 50036 - 44032: 0x9BA2, - 50037 - 44032: 0x9BA3, - 50038 - 44032: 0x9BA4, - 50039 - 44032: 0x9BA5, - 50040 - 44032: 0xBDE6, - 50041 - 44032: 0xBDE7, - 50042 - 44032: 0x9BA6, - 50043 - 44032: 0x9BA7, - 50044 - 44032: 0xBDE8, - 50045 - 44032: 0xBDE9, - 50046 - 44032: 0x9BA8, - 50047 - 44032: 0x9BA9, - 50048 - 44032: 0x9BAA, - 50049 - 44032: 0x9BAB, - 50050 - 44032: 0x9BAC, - 50051 - 44032: 0x9BAD, - 50052 - 44032: 0xBDEA, - 50053 - 44032: 0x9BAE, - 50054 - 44032: 0x9BAF, - 50055 - 44032: 0x9BB0, - 50056 - 44032: 0xBDEB, - 50057 - 44032: 0x9BB1, - 50058 - 44032: 0x9BB2, - 50059 - 44032: 0x9BB3, - 50060 - 44032: 0xBDEC, - 50061 - 44032: 0x9BB4, - 50062 - 44032: 0x9BB5, - 50063 - 44032: 0x9BB6, - 50064 - 44032: 0x9BB7, - 50065 - 44032: 0x9BB8, - 50066 - 44032: 0x9BB9, - 50067 - 44032: 0x9BBA, - 50068 - 44032: 0x9BBB, - 50069 - 44032: 0x9BBC, - 50070 - 44032: 0x9BBD, - 50071 - 44032: 0x9BBE, - 50072 - 44032: 0x9BBF, - 50073 - 44032: 0x9BC0, - 50074 - 44032: 0x9BC1, - 50075 - 44032: 0x9BC2, - 50076 - 44032: 0x9BC3, - 50077 - 44032: 0x9BC4, - 50078 - 44032: 0x9BC5, - 50079 - 44032: 0x9BC6, - 50080 - 44032: 0x9BC7, - 50081 - 44032: 0x9BC8, - 50082 - 44032: 0x9BC9, - 50083 - 44032: 0x9BCA, - 50084 - 44032: 0x9BCB, - 50085 - 44032: 0x9BCC, - 50086 - 44032: 0x9BCD, - 50087 - 44032: 0x9BCE, - 50088 - 44032: 0x9BCF, - 50089 - 44032: 0x9BD0, - 50090 - 44032: 0x9BD1, - 50091 - 44032: 0x9BD2, - 50092 - 44032: 0x9BD3, - 50093 - 44032: 0x9BD4, - 50094 - 44032: 0x9BD5, - 50095 - 44032: 0x9BD6, - 50096 - 44032: 0x9BD7, - 50097 - 44032: 0x9BD8, - 50098 - 44032: 0x9BD9, - 50099 - 44032: 0x9BDA, - 50100 - 44032: 0x9BDB, - 50101 - 44032: 0x9BDC, - 50102 - 44032: 0x9BDD, - 50103 - 44032: 0x9BDE, - 50104 - 44032: 0x9BDF, - 50105 - 44032: 0x9BE0, - 50106 - 44032: 0x9BE1, - 50107 - 44032: 0x9BE2, - 50108 - 44032: 0x9BE3, - 50109 - 44032: 0x9BE4, - 50110 - 44032: 0x9BE5, - 50111 - 44032: 0x9BE6, - 50112 - 44032: 0xBDED, - 50113 - 44032: 0x9BE7, - 50114 - 44032: 0x9BE8, - 50115 - 44032: 0x9BE9, - 50116 - 44032: 0x9BEA, - 50117 - 44032: 0x9BEB, - 50118 - 44032: 0x9BEC, - 50119 - 44032: 0x9BED, - 50120 - 44032: 0x9BEE, - 50121 - 44032: 0x9BEF, - 50122 - 44032: 0x9BF0, - 50123 - 44032: 0x9BF1, - 50124 - 44032: 0x9BF2, - 50125 - 44032: 0x9BF3, - 50126 - 44032: 0x9BF4, - 50127 - 44032: 0x9BF5, - 50128 - 44032: 0x9BF6, - 50129 - 44032: 0x9BF7, - 50130 - 44032: 0x9BF8, - 50131 - 44032: 0x9BF9, - 50132 - 44032: 0x9BFA, - 50133 - 44032: 0x9BFB, - 50134 - 44032: 0x9BFC, - 50135 - 44032: 0x9BFD, - 50136 - 44032: 0xBDEE, - 50137 - 44032: 0xBDEF, - 50138 - 44032: 0x9BFE, - 50139 - 44032: 0x9C41, - 50140 - 44032: 0xBDF0, - 50141 - 44032: 0x9C42, - 50142 - 44032: 0x9C43, - 50143 - 44032: 0xBDF1, - 50144 - 44032: 0xBDF2, - 50145 - 44032: 0x9C44, - 50146 - 44032: 0xBDF3, - 50147 - 44032: 0x9C45, - 50148 - 44032: 0x9C46, - 50149 - 44032: 0x9C47, - 50150 - 44032: 0x9C48, - 50151 - 44032: 0x9C49, - 50152 - 44032: 0xBDF4, - 50153 - 44032: 0xBDF5, - 50154 - 44032: 0x9C4A, - 50155 - 44032: 0x9C4B, - 50156 - 44032: 0x9C4C, - 50157 - 44032: 0xBDF6, - 50158 - 44032: 0x9C4D, - 50159 - 44032: 0x9C4E, - 50160 - 44032: 0x9C4F, - 50161 - 44032: 0x9C50, - 50162 - 44032: 0x9C51, - 50163 - 44032: 0x9C52, - 50164 - 44032: 0xBDF7, - 50165 - 44032: 0xBDF8, - 50166 - 44032: 0x9C53, - 50167 - 44032: 0x9C54, - 50168 - 44032: 0xBDF9, - 50169 - 44032: 0x9C55, - 50170 - 44032: 0x9C56, - 50171 - 44032: 0x9C57, - 50172 - 44032: 0x9C58, - 50173 - 44032: 0x9C59, - 50174 - 44032: 0x9C5A, - 50175 - 44032: 0x9C61, - 50176 - 44032: 0x9C62, - 50177 - 44032: 0x9C63, - 50178 - 44032: 0x9C64, - 50179 - 44032: 0x9C65, - 50180 - 44032: 0x9C66, - 50181 - 44032: 0x9C67, - 50182 - 44032: 0x9C68, - 50183 - 44032: 0x9C69, - 50184 - 44032: 0xBDFA, - 50185 - 44032: 0x9C6A, - 50186 - 44032: 0x9C6B, - 50187 - 44032: 0x9C6C, - 50188 - 44032: 0x9C6D, - 50189 - 44032: 0x9C6E, - 50190 - 44032: 0x9C6F, - 50191 - 44032: 0x9C70, - 50192 - 44032: 0xBDFB, - 50193 - 44032: 0x9C71, - 50194 - 44032: 0x9C72, - 50195 - 44032: 0x9C73, - 50196 - 44032: 0x9C74, - 50197 - 44032: 0x9C75, - 50198 - 44032: 0x9C76, - 50199 - 44032: 0x9C77, - 50200 - 44032: 0x9C78, - 50201 - 44032: 0x9C79, - 50202 - 44032: 0x9C7A, - 50203 - 44032: 0x9C81, - 50204 - 44032: 0x9C82, - 50205 - 44032: 0x9C83, - 50206 - 44032: 0x9C84, - 50207 - 44032: 0x9C85, - 50208 - 44032: 0x9C86, - 50209 - 44032: 0x9C87, - 50210 - 44032: 0x9C88, - 50211 - 44032: 0x9C89, - 50212 - 44032: 0xBDFC, - 50213 - 44032: 0x9C8A, - 50214 - 44032: 0x9C8B, - 50215 - 44032: 0x9C8C, - 50216 - 44032: 0x9C8D, - 50217 - 44032: 0x9C8E, - 50218 - 44032: 0x9C8F, - 50219 - 44032: 0x9C90, - 50220 - 44032: 0xBDFD, - 50221 - 44032: 0x9C91, - 50222 - 44032: 0x9C92, - 50223 - 44032: 0x9C93, - 50224 - 44032: 0xBDFE, - 50225 - 44032: 0x9C94, - 50226 - 44032: 0x9C95, - 50227 - 44032: 0x9C96, - 50228 - 44032: 0xBEA1, - 50229 - 44032: 0x9C97, - 50230 - 44032: 0x9C98, - 50231 - 44032: 0x9C99, - 50232 - 44032: 0x9C9A, - 50233 - 44032: 0x9C9B, - 50234 - 44032: 0x9C9C, - 50235 - 44032: 0x9C9D, - 50236 - 44032: 0xBEA2, - 50237 - 44032: 0xBEA3, - 50238 - 44032: 0x9C9E, - 50239 - 44032: 0x9C9F, - 50240 - 44032: 0x9CA0, - 50241 - 44032: 0x9CA1, - 50242 - 44032: 0x9CA2, - 50243 - 44032: 0x9CA3, - 50244 - 44032: 0x9CA4, - 50245 - 44032: 0x9CA5, - 50246 - 44032: 0x9CA6, - 50247 - 44032: 0x9CA7, - 50248 - 44032: 0xBEA4, - 50249 - 44032: 0x9CA8, - 50250 - 44032: 0x9CA9, - 50251 - 44032: 0x9CAA, - 50252 - 44032: 0x9CAB, - 50253 - 44032: 0x9CAC, - 50254 - 44032: 0x9CAD, - 50255 - 44032: 0x9CAE, - 50256 - 44032: 0x9CAF, - 50257 - 44032: 0x9CB0, - 50258 - 44032: 0x9CB1, - 50259 - 44032: 0x9CB2, - 50260 - 44032: 0x9CB3, - 50261 - 44032: 0x9CB4, - 50262 - 44032: 0x9CB5, - 50263 - 44032: 0x9CB6, - 50264 - 44032: 0x9CB7, - 50265 - 44032: 0x9CB8, - 50266 - 44032: 0x9CB9, - 50267 - 44032: 0x9CBA, - 50268 - 44032: 0x9CBB, - 50269 - 44032: 0x9CBC, - 50270 - 44032: 0x9CBD, - 50271 - 44032: 0x9CBE, - 50272 - 44032: 0x9CBF, - 50273 - 44032: 0x9CC0, - 50274 - 44032: 0x9CC1, - 50275 - 44032: 0x9CC2, - 50276 - 44032: 0xBEA5, - 50277 - 44032: 0xBEA6, - 50278 - 44032: 0x9CC3, - 50279 - 44032: 0x9CC4, - 50280 - 44032: 0xBEA7, - 50281 - 44032: 0x9CC5, - 50282 - 44032: 0x9CC6, - 50283 - 44032: 0x9CC7, - 50284 - 44032: 0xBEA8, - 50285 - 44032: 0x9CC8, - 50286 - 44032: 0x9CC9, - 50287 - 44032: 0x9CCA, - 50288 - 44032: 0x9CCB, - 50289 - 44032: 0x9CCC, - 50290 - 44032: 0x9CCD, - 50291 - 44032: 0x9CCE, - 50292 - 44032: 0xBEA9, - 50293 - 44032: 0xBEAA, - 50294 - 44032: 0x9CCF, - 50295 - 44032: 0x9CD0, - 50296 - 44032: 0x9CD1, - 50297 - 44032: 0xBEAB, - 50298 - 44032: 0x9CD2, - 50299 - 44032: 0x9CD3, - 50300 - 44032: 0x9CD4, - 50301 - 44032: 0x9CD5, - 50302 - 44032: 0x9CD6, - 50303 - 44032: 0x9CD7, - 50304 - 44032: 0xBEAC, - 50305 - 44032: 0x9CD8, - 50306 - 44032: 0x9CD9, - 50307 - 44032: 0x9CDA, - 50308 - 44032: 0x9CDB, - 50309 - 44032: 0x9CDC, - 50310 - 44032: 0x9CDD, - 50311 - 44032: 0x9CDE, - 50312 - 44032: 0x9CDF, - 50313 - 44032: 0x9CE0, - 50314 - 44032: 0x9CE1, - 50315 - 44032: 0x9CE2, - 50316 - 44032: 0x9CE3, - 50317 - 44032: 0x9CE4, - 50318 - 44032: 0x9CE5, - 50319 - 44032: 0x9CE6, - 50320 - 44032: 0x9CE7, - 50321 - 44032: 0x9CE8, - 50322 - 44032: 0x9CE9, - 50323 - 44032: 0x9CEA, - 50324 - 44032: 0xBEAD, - 50325 - 44032: 0x9CEB, - 50326 - 44032: 0x9CEC, - 50327 - 44032: 0x9CED, - 50328 - 44032: 0x9CEE, - 50329 - 44032: 0x9CEF, - 50330 - 44032: 0x9CF0, - 50331 - 44032: 0x9CF1, - 50332 - 44032: 0xBEAE, - 50333 - 44032: 0x9CF2, - 50334 - 44032: 0x9CF3, - 50335 - 44032: 0x9CF4, - 50336 - 44032: 0x9CF5, - 50337 - 44032: 0x9CF6, - 50338 - 44032: 0x9CF7, - 50339 - 44032: 0x9CF8, - 50340 - 44032: 0x9CF9, - 50341 - 44032: 0x9CFA, - 50342 - 44032: 0x9CFB, - 50343 - 44032: 0x9CFC, - 50344 - 44032: 0x9CFD, - 50345 - 44032: 0x9CFE, - 50346 - 44032: 0x9D41, - 50347 - 44032: 0x9D42, - 50348 - 44032: 0x9D43, - 50349 - 44032: 0x9D44, - 50350 - 44032: 0x9D45, - 50351 - 44032: 0x9D46, - 50352 - 44032: 0x9D47, - 50353 - 44032: 0x9D48, - 50354 - 44032: 0x9D49, - 50355 - 44032: 0x9D4A, - 50356 - 44032: 0x9D4B, - 50357 - 44032: 0x9D4C, - 50358 - 44032: 0x9D4D, - 50359 - 44032: 0x9D4E, - 50360 - 44032: 0xBEAF, - 50361 - 44032: 0x9D4F, - 50362 - 44032: 0x9D50, - 50363 - 44032: 0x9D51, - 50364 - 44032: 0xBEB0, - 50365 - 44032: 0x9D52, - 50366 - 44032: 0x9D53, - 50367 - 44032: 0x9D54, - 50368 - 44032: 0x9D55, - 50369 - 44032: 0x9D56, - 50370 - 44032: 0x9D57, - 50371 - 44032: 0x9D58, - 50372 - 44032: 0x9D59, - 50373 - 44032: 0x9D5A, - 50374 - 44032: 0x9D61, - 50375 - 44032: 0x9D62, - 50376 - 44032: 0x9D63, - 50377 - 44032: 0x9D64, - 50378 - 44032: 0x9D65, - 50379 - 44032: 0x9D66, - 50380 - 44032: 0x9D67, - 50381 - 44032: 0x9D68, - 50382 - 44032: 0x9D69, - 50383 - 44032: 0x9D6A, - 50384 - 44032: 0x9D6B, - 50385 - 44032: 0x9D6C, - 50386 - 44032: 0x9D6D, - 50387 - 44032: 0x9D6E, - 50388 - 44032: 0x9D6F, - 50389 - 44032: 0x9D70, - 50390 - 44032: 0x9D71, - 50391 - 44032: 0x9D72, - 50392 - 44032: 0x9D73, - 50393 - 44032: 0x9D74, - 50394 - 44032: 0x9D75, - 50395 - 44032: 0x9D76, - 50396 - 44032: 0x9D77, - 50397 - 44032: 0x9D78, - 50398 - 44032: 0x9D79, - 50399 - 44032: 0x9D7A, - 50400 - 44032: 0x9D81, - 50401 - 44032: 0x9D82, - 50402 - 44032: 0x9D83, - 50403 - 44032: 0x9D84, - 50404 - 44032: 0x9D85, - 50405 - 44032: 0x9D86, - 50406 - 44032: 0x9D87, - 50407 - 44032: 0x9D88, - 50408 - 44032: 0x9D89, - 50409 - 44032: 0xBEB1, - 50410 - 44032: 0x9D8A, - 50411 - 44032: 0x9D8B, - 50412 - 44032: 0x9D8C, - 50413 - 44032: 0x9D8D, - 50414 - 44032: 0x9D8E, - 50415 - 44032: 0x9D8F, - 50416 - 44032: 0xBEB2, - 50417 - 44032: 0xBEB3, - 50418 - 44032: 0x9D90, - 50419 - 44032: 0x9D91, - 50420 - 44032: 0xBEB4, - 50421 - 44032: 0x9D92, - 50422 - 44032: 0x9D93, - 50423 - 44032: 0x9D94, - 50424 - 44032: 0xBEB5, - 50425 - 44032: 0x9D95, - 50426 - 44032: 0xBEB6, - 50427 - 44032: 0x9D96, - 50428 - 44032: 0x9D97, - 50429 - 44032: 0x9D98, - 50430 - 44032: 0x9D99, - 50431 - 44032: 0xBEB7, - 50432 - 44032: 0xBEB8, - 50433 - 44032: 0xBEB9, - 50434 - 44032: 0x9D9A, - 50435 - 44032: 0x9D9B, - 50436 - 44032: 0x9D9C, - 50437 - 44032: 0x9D9D, - 50438 - 44032: 0x9D9E, - 50439 - 44032: 0x9D9F, - 50440 - 44032: 0x9DA0, - 50441 - 44032: 0x9DA1, - 50442 - 44032: 0x9DA2, - 50443 - 44032: 0x9DA3, - 50444 - 44032: 0xBEBA, - 50445 - 44032: 0x9DA4, - 50446 - 44032: 0x9DA5, - 50447 - 44032: 0x9DA6, - 50448 - 44032: 0xBEBB, - 50449 - 44032: 0x9DA7, - 50450 - 44032: 0x9DA8, - 50451 - 44032: 0x9DA9, - 50452 - 44032: 0xBEBC, - 50453 - 44032: 0x9DAA, - 50454 - 44032: 0x9DAB, - 50455 - 44032: 0x9DAC, - 50456 - 44032: 0x9DAD, - 50457 - 44032: 0x9DAE, - 50458 - 44032: 0x9DAF, - 50459 - 44032: 0x9DB0, - 50460 - 44032: 0xBEBD, - 50461 - 44032: 0x9DB1, - 50462 - 44032: 0x9DB2, - 50463 - 44032: 0x9DB3, - 50464 - 44032: 0x9DB4, - 50465 - 44032: 0x9DB5, - 50466 - 44032: 0x9DB6, - 50467 - 44032: 0x9DB7, - 50468 - 44032: 0x9DB8, - 50469 - 44032: 0x9DB9, - 50470 - 44032: 0x9DBA, - 50471 - 44032: 0x9DBB, - 50472 - 44032: 0xBEBE, - 50473 - 44032: 0xBEBF, - 50474 - 44032: 0x9DBC, - 50475 - 44032: 0x9DBD, - 50476 - 44032: 0xBEC0, - 50477 - 44032: 0x9DBE, - 50478 - 44032: 0x9DBF, - 50479 - 44032: 0x9DC0, - 50480 - 44032: 0xBEC1, - 50481 - 44032: 0x9DC1, - 50482 - 44032: 0x9DC2, - 50483 - 44032: 0x9DC3, - 50484 - 44032: 0x9DC4, - 50485 - 44032: 0x9DC5, - 50486 - 44032: 0x9DC6, - 50487 - 44032: 0x9DC7, - 50488 - 44032: 0xBEC2, - 50489 - 44032: 0xBEC3, - 50490 - 44032: 0x9DC8, - 50491 - 44032: 0xBEC4, - 50492 - 44032: 0x9DC9, - 50493 - 44032: 0xBEC5, - 50494 - 44032: 0x9DCA, - 50495 - 44032: 0x9DCB, - 50496 - 44032: 0x9DCC, - 50497 - 44032: 0x9DCD, - 50498 - 44032: 0x9DCE, - 50499 - 44032: 0x9DCF, - 50500 - 44032: 0xBEC6, - 50501 - 44032: 0xBEC7, - 50502 - 44032: 0x9DD0, - 50503 - 44032: 0x9DD1, - 50504 - 44032: 0xBEC8, - 50505 - 44032: 0xBEC9, - 50506 - 44032: 0xBECA, - 50507 - 44032: 0x9DD2, - 50508 - 44032: 0xBECB, - 50509 - 44032: 0xBECC, - 50510 - 44032: 0xBECD, - 50511 - 44032: 0x9DD3, - 50512 - 44032: 0x9DD4, - 50513 - 44032: 0x9DD5, - 50514 - 44032: 0x9DD6, - 50515 - 44032: 0xBECE, - 50516 - 44032: 0xBECF, - 50517 - 44032: 0xBED0, - 50518 - 44032: 0x9DD7, - 50519 - 44032: 0xBED1, - 50520 - 44032: 0xBED2, - 50521 - 44032: 0xBED3, - 50522 - 44032: 0x9DD8, - 50523 - 44032: 0x9DD9, - 50524 - 44032: 0x9DDA, - 50525 - 44032: 0xBED4, - 50526 - 44032: 0xBED5, - 50527 - 44032: 0x9DDB, - 50528 - 44032: 0xBED6, - 50529 - 44032: 0xBED7, - 50530 - 44032: 0x9DDC, - 50531 - 44032: 0x9DDD, - 50532 - 44032: 0xBED8, - 50533 - 44032: 0x9DDE, - 50534 - 44032: 0x9DDF, - 50535 - 44032: 0x9DE0, - 50536 - 44032: 0xBED9, - 50537 - 44032: 0x9DE1, - 50538 - 44032: 0x9DE2, - 50539 - 44032: 0x9DE3, - 50540 - 44032: 0x9DE4, - 50541 - 44032: 0x9DE5, - 50542 - 44032: 0x9DE6, - 50543 - 44032: 0x9DE7, - 50544 - 44032: 0xBEDA, - 50545 - 44032: 0xBEDB, - 50546 - 44032: 0x9DE8, - 50547 - 44032: 0xBEDC, - 50548 - 44032: 0xBEDD, - 50549 - 44032: 0xBEDE, - 50550 - 44032: 0x9DE9, - 50551 - 44032: 0x9DEA, - 50552 - 44032: 0x9DEB, - 50553 - 44032: 0x9DEC, - 50554 - 44032: 0x9DED, - 50555 - 44032: 0x9DEE, - 50556 - 44032: 0xBEDF, - 50557 - 44032: 0xBEE0, - 50558 - 44032: 0x9DEF, - 50559 - 44032: 0x9DF0, - 50560 - 44032: 0xBEE1, - 50561 - 44032: 0x9DF1, - 50562 - 44032: 0x9DF2, - 50563 - 44032: 0x9DF3, - 50564 - 44032: 0xBEE2, - 50565 - 44032: 0x9DF4, - 50566 - 44032: 0x9DF5, - 50567 - 44032: 0xBEE3, - 50568 - 44032: 0x9DF6, - 50569 - 44032: 0x9DF7, - 50570 - 44032: 0x9DF8, - 50571 - 44032: 0x9DF9, - 50572 - 44032: 0xBEE4, - 50573 - 44032: 0xBEE5, - 50574 - 44032: 0x9DFA, - 50575 - 44032: 0xBEE6, - 50576 - 44032: 0x9DFB, - 50577 - 44032: 0xBEE7, - 50578 - 44032: 0x9DFC, - 50579 - 44032: 0x9DFD, - 50580 - 44032: 0x9DFE, - 50581 - 44032: 0xBEE8, - 50582 - 44032: 0x9E41, - 50583 - 44032: 0xBEE9, - 50584 - 44032: 0xBEEA, - 50585 - 44032: 0x9E42, - 50586 - 44032: 0x9E43, - 50587 - 44032: 0x9E44, - 50588 - 44032: 0xBEEB, - 50589 - 44032: 0x9E45, - 50590 - 44032: 0x9E46, - 50591 - 44032: 0x9E47, - 50592 - 44032: 0xBEEC, - 50593 - 44032: 0x9E48, - 50594 - 44032: 0x9E49, - 50595 - 44032: 0x9E4A, - 50596 - 44032: 0x9E4B, - 50597 - 44032: 0x9E4C, - 50598 - 44032: 0x9E4D, - 50599 - 44032: 0x9E4E, - 50600 - 44032: 0x9E4F, - 50601 - 44032: 0xBEED, - 50602 - 44032: 0x9E50, - 50603 - 44032: 0x9E51, - 50604 - 44032: 0x9E52, - 50605 - 44032: 0x9E53, - 50606 - 44032: 0x9E54, - 50607 - 44032: 0x9E55, - 50608 - 44032: 0x9E56, - 50609 - 44032: 0x9E57, - 50610 - 44032: 0x9E58, - 50611 - 44032: 0x9E59, - 50612 - 44032: 0xBEEE, - 50613 - 44032: 0xBEEF, - 50614 - 44032: 0x9E5A, - 50615 - 44032: 0x9E61, - 50616 - 44032: 0xBEF0, - 50617 - 44032: 0xBEF1, - 50618 - 44032: 0x9E62, - 50619 - 44032: 0xBEF2, - 50620 - 44032: 0xBEF3, - 50621 - 44032: 0xBEF4, - 50622 - 44032: 0xBEF5, - 50623 - 44032: 0x9E63, - 50624 - 44032: 0x9E64, - 50625 - 44032: 0x9E65, - 50626 - 44032: 0x9E66, - 50627 - 44032: 0x9E67, - 50628 - 44032: 0xBEF6, - 50629 - 44032: 0xBEF7, - 50630 - 44032: 0xBEF8, - 50631 - 44032: 0xBEF9, - 50632 - 44032: 0xBEFA, - 50633 - 44032: 0xBEFB, - 50634 - 44032: 0xBEFC, - 50635 - 44032: 0x9E68, - 50636 - 44032: 0xBEFD, - 50637 - 44032: 0x9E69, - 50638 - 44032: 0xBEFE, - 50639 - 44032: 0x9E6A, - 50640 - 44032: 0xBFA1, - 50641 - 44032: 0xBFA2, - 50642 - 44032: 0x9E6B, - 50643 - 44032: 0x9E6C, - 50644 - 44032: 0xBFA3, - 50645 - 44032: 0x9E6D, - 50646 - 44032: 0x9E6E, - 50647 - 44032: 0x9E6F, - 50648 - 44032: 0xBFA4, - 50649 - 44032: 0x9E70, - 50650 - 44032: 0x9E71, - 50651 - 44032: 0x9E72, - 50652 - 44032: 0x9E73, - 50653 - 44032: 0x9E74, - 50654 - 44032: 0x9E75, - 50655 - 44032: 0x9E76, - 50656 - 44032: 0xBFA5, - 50657 - 44032: 0xBFA6, - 50658 - 44032: 0x9E77, - 50659 - 44032: 0xBFA7, - 50660 - 44032: 0x9E78, - 50661 - 44032: 0xBFA8, - 50662 - 44032: 0x9E79, - 50663 - 44032: 0x9E7A, - 50664 - 44032: 0x9E81, - 50665 - 44032: 0x9E82, - 50666 - 44032: 0x9E83, - 50667 - 44032: 0x9E84, - 50668 - 44032: 0xBFA9, - 50669 - 44032: 0xBFAA, - 50670 - 44032: 0xBFAB, - 50671 - 44032: 0x9E85, - 50672 - 44032: 0xBFAC, - 50673 - 44032: 0x9E86, - 50674 - 44032: 0x9E87, - 50675 - 44032: 0x9E88, - 50676 - 44032: 0xBFAD, - 50677 - 44032: 0x9E89, - 50678 - 44032: 0xBFAE, - 50679 - 44032: 0xBFAF, - 50680 - 44032: 0x9E8A, - 50681 - 44032: 0x9E8B, - 50682 - 44032: 0x9E8C, - 50683 - 44032: 0x9E8D, - 50684 - 44032: 0xBFB0, - 50685 - 44032: 0xBFB1, - 50686 - 44032: 0xBFB2, - 50687 - 44032: 0xBFB3, - 50688 - 44032: 0xBFB4, - 50689 - 44032: 0xBFB5, - 50690 - 44032: 0x9E8E, - 50691 - 44032: 0x9E8F, - 50692 - 44032: 0x9E90, - 50693 - 44032: 0xBFB6, - 50694 - 44032: 0xBFB7, - 50695 - 44032: 0xBFB8, - 50696 - 44032: 0xBFB9, - 50697 - 44032: 0x9E91, - 50698 - 44032: 0x9E92, - 50699 - 44032: 0x9E93, - 50700 - 44032: 0xBFBA, - 50701 - 44032: 0x9E94, - 50702 - 44032: 0x9E95, - 50703 - 44032: 0x9E96, - 50704 - 44032: 0xBFBB, - 50705 - 44032: 0x9E97, - 50706 - 44032: 0x9E98, - 50707 - 44032: 0x9E99, - 50708 - 44032: 0x9E9A, - 50709 - 44032: 0x9E9B, - 50710 - 44032: 0x9E9C, - 50711 - 44032: 0x9E9D, - 50712 - 44032: 0xBFBC, - 50713 - 44032: 0xBFBD, - 50714 - 44032: 0x9E9E, - 50715 - 44032: 0xBFBE, - 50716 - 44032: 0xBFBF, - 50717 - 44032: 0x9E9F, - 50718 - 44032: 0x9EA0, - 50719 - 44032: 0x9EA1, - 50720 - 44032: 0x9EA2, - 50721 - 44032: 0x9EA3, - 50722 - 44032: 0x9EA4, - 50723 - 44032: 0x9EA5, - 50724 - 44032: 0xBFC0, - 50725 - 44032: 0xBFC1, - 50726 - 44032: 0x9EA6, - 50727 - 44032: 0x9EA7, - 50728 - 44032: 0xBFC2, - 50729 - 44032: 0x9EA8, - 50730 - 44032: 0x9EA9, - 50731 - 44032: 0x9EAA, - 50732 - 44032: 0xBFC3, - 50733 - 44032: 0xBFC4, - 50734 - 44032: 0xBFC5, - 50735 - 44032: 0x9EAB, - 50736 - 44032: 0xBFC6, - 50737 - 44032: 0x9EAC, - 50738 - 44032: 0x9EAD, - 50739 - 44032: 0xBFC7, - 50740 - 44032: 0xBFC8, - 50741 - 44032: 0xBFC9, - 50742 - 44032: 0x9EAE, - 50743 - 44032: 0xBFCA, - 50744 - 44032: 0x9EAF, - 50745 - 44032: 0xBFCB, - 50746 - 44032: 0x9EB0, - 50747 - 44032: 0xBFCC, - 50748 - 44032: 0x9EB1, - 50749 - 44032: 0x9EB2, - 50750 - 44032: 0x9EB3, - 50751 - 44032: 0x9EB4, - 50752 - 44032: 0xBFCD, - 50753 - 44032: 0xBFCE, - 50754 - 44032: 0x9EB5, - 50755 - 44032: 0x9EB6, - 50756 - 44032: 0xBFCF, - 50757 - 44032: 0x9EB7, - 50758 - 44032: 0x9EB8, - 50759 - 44032: 0x9EB9, - 50760 - 44032: 0xBFD0, - 50761 - 44032: 0x9EBA, - 50762 - 44032: 0x9EBB, - 50763 - 44032: 0x9EBC, - 50764 - 44032: 0x9EBD, - 50765 - 44032: 0x9EBE, - 50766 - 44032: 0x9EBF, - 50767 - 44032: 0x9EC0, - 50768 - 44032: 0xBFD1, - 50769 - 44032: 0xBFD2, - 50770 - 44032: 0x9EC1, - 50771 - 44032: 0xBFD3, - 50772 - 44032: 0xBFD4, - 50773 - 44032: 0xBFD5, - 50774 - 44032: 0x9EC2, - 50775 - 44032: 0x9EC3, - 50776 - 44032: 0x9EC4, - 50777 - 44032: 0x9EC5, - 50778 - 44032: 0x9EC6, - 50779 - 44032: 0x9EC7, - 50780 - 44032: 0xBFD6, - 50781 - 44032: 0xBFD7, - 50782 - 44032: 0x9EC8, - 50783 - 44032: 0x9EC9, - 50784 - 44032: 0xBFD8, - 50785 - 44032: 0x9ECA, - 50786 - 44032: 0x9ECB, - 50787 - 44032: 0x9ECC, - 50788 - 44032: 0x9ECD, - 50789 - 44032: 0x9ECE, - 50790 - 44032: 0x9ECF, - 50791 - 44032: 0x9ED0, - 50792 - 44032: 0x9ED1, - 50793 - 44032: 0x9ED2, - 50794 - 44032: 0x9ED3, - 50795 - 44032: 0x9ED4, - 50796 - 44032: 0xBFD9, - 50797 - 44032: 0x9ED5, - 50798 - 44032: 0x9ED6, - 50799 - 44032: 0xBFDA, - 50800 - 44032: 0x9ED7, - 50801 - 44032: 0xBFDB, - 50802 - 44032: 0x9ED8, - 50803 - 44032: 0x9ED9, - 50804 - 44032: 0x9EDA, - 50805 - 44032: 0x9EDB, - 50806 - 44032: 0x9EDC, - 50807 - 44032: 0x9EDD, - 50808 - 44032: 0xBFDC, - 50809 - 44032: 0xBFDD, - 50810 - 44032: 0x9EDE, - 50811 - 44032: 0x9EDF, - 50812 - 44032: 0xBFDE, - 50813 - 44032: 0x9EE0, - 50814 - 44032: 0x9EE1, - 50815 - 44032: 0x9EE2, - 50816 - 44032: 0xBFDF, - 50817 - 44032: 0x9EE3, - 50818 - 44032: 0x9EE4, - 50819 - 44032: 0x9EE5, - 50820 - 44032: 0x9EE6, - 50821 - 44032: 0x9EE7, - 50822 - 44032: 0x9EE8, - 50823 - 44032: 0x9EE9, - 50824 - 44032: 0xBFE0, - 50825 - 44032: 0xBFE1, - 50826 - 44032: 0x9EEA, - 50827 - 44032: 0xBFE2, - 50828 - 44032: 0x9EEB, - 50829 - 44032: 0xBFE3, - 50830 - 44032: 0x9EEC, - 50831 - 44032: 0x9EED, - 50832 - 44032: 0x9EEE, - 50833 - 44032: 0x9EEF, - 50834 - 44032: 0x9EF0, - 50835 - 44032: 0x9EF1, - 50836 - 44032: 0xBFE4, - 50837 - 44032: 0xBFE5, - 50838 - 44032: 0x9EF2, - 50839 - 44032: 0x9EF3, - 50840 - 44032: 0xBFE6, - 50841 - 44032: 0x9EF4, - 50842 - 44032: 0x9EF5, - 50843 - 44032: 0x9EF6, - 50844 - 44032: 0xBFE7, - 50845 - 44032: 0x9EF7, - 50846 - 44032: 0x9EF8, - 50847 - 44032: 0x9EF9, - 50848 - 44032: 0x9EFA, - 50849 - 44032: 0x9EFB, - 50850 - 44032: 0x9EFC, - 50851 - 44032: 0x9EFD, - 50852 - 44032: 0xBFE8, - 50853 - 44032: 0xBFE9, - 50854 - 44032: 0x9EFE, - 50855 - 44032: 0xBFEA, - 50856 - 44032: 0x9F41, - 50857 - 44032: 0xBFEB, - 50858 - 44032: 0x9F42, - 50859 - 44032: 0x9F43, - 50860 - 44032: 0x9F44, - 50861 - 44032: 0x9F45, - 50862 - 44032: 0x9F46, - 50863 - 44032: 0x9F47, - 50864 - 44032: 0xBFEC, - 50865 - 44032: 0xBFED, - 50866 - 44032: 0x9F48, - 50867 - 44032: 0x9F49, - 50868 - 44032: 0xBFEE, - 50869 - 44032: 0x9F4A, - 50870 - 44032: 0x9F4B, - 50871 - 44032: 0x9F4C, - 50872 - 44032: 0xBFEF, - 50873 - 44032: 0xBFF0, - 50874 - 44032: 0xBFF1, - 50875 - 44032: 0x9F4D, - 50876 - 44032: 0x9F4E, - 50877 - 44032: 0x9F4F, - 50878 - 44032: 0x9F50, - 50879 - 44032: 0x9F51, - 50880 - 44032: 0xBFF2, - 50881 - 44032: 0xBFF3, - 50882 - 44032: 0x9F52, - 50883 - 44032: 0xBFF4, - 50884 - 44032: 0x9F53, - 50885 - 44032: 0xBFF5, - 50886 - 44032: 0x9F54, - 50887 - 44032: 0x9F55, - 50888 - 44032: 0x9F56, - 50889 - 44032: 0x9F57, - 50890 - 44032: 0x9F58, - 50891 - 44032: 0x9F59, - 50892 - 44032: 0xBFF6, - 50893 - 44032: 0xBFF7, - 50894 - 44032: 0x9F5A, - 50895 - 44032: 0x9F61, - 50896 - 44032: 0xBFF8, - 50897 - 44032: 0x9F62, - 50898 - 44032: 0x9F63, - 50899 - 44032: 0x9F64, - 50900 - 44032: 0xBFF9, - 50901 - 44032: 0x9F65, - 50902 - 44032: 0x9F66, - 50903 - 44032: 0x9F67, - 50904 - 44032: 0x9F68, - 50905 - 44032: 0x9F69, - 50906 - 44032: 0x9F6A, - 50907 - 44032: 0x9F6B, - 50908 - 44032: 0xBFFA, - 50909 - 44032: 0xBFFB, - 50910 - 44032: 0x9F6C, - 50911 - 44032: 0x9F6D, - 50912 - 44032: 0xBFFC, - 50913 - 44032: 0xBFFD, - 50914 - 44032: 0x9F6E, - 50915 - 44032: 0x9F6F, - 50916 - 44032: 0x9F70, - 50917 - 44032: 0x9F71, - 50918 - 44032: 0x9F72, - 50919 - 44032: 0x9F73, - 50920 - 44032: 0xBFFE, - 50921 - 44032: 0xC0A1, - 50922 - 44032: 0x9F74, - 50923 - 44032: 0x9F75, - 50924 - 44032: 0xC0A2, - 50925 - 44032: 0x9F76, - 50926 - 44032: 0x9F77, - 50927 - 44032: 0x9F78, - 50928 - 44032: 0xC0A3, - 50929 - 44032: 0x9F79, - 50930 - 44032: 0x9F7A, - 50931 - 44032: 0x9F81, - 50932 - 44032: 0x9F82, - 50933 - 44032: 0x9F83, - 50934 - 44032: 0x9F84, - 50935 - 44032: 0x9F85, - 50936 - 44032: 0xC0A4, - 50937 - 44032: 0xC0A5, - 50938 - 44032: 0x9F86, - 50939 - 44032: 0x9F87, - 50940 - 44032: 0x9F88, - 50941 - 44032: 0xC0A6, - 50942 - 44032: 0x9F89, - 50943 - 44032: 0x9F8A, - 50944 - 44032: 0x9F8B, - 50945 - 44032: 0x9F8C, - 50946 - 44032: 0x9F8D, - 50947 - 44032: 0x9F8E, - 50948 - 44032: 0xC0A7, - 50949 - 44032: 0xC0A8, - 50950 - 44032: 0x9F8F, - 50951 - 44032: 0x9F90, - 50952 - 44032: 0xC0A9, - 50953 - 44032: 0x9F91, - 50954 - 44032: 0x9F92, - 50955 - 44032: 0x9F93, - 50956 - 44032: 0xC0AA, - 50957 - 44032: 0x9F94, - 50958 - 44032: 0x9F95, - 50959 - 44032: 0x9F96, - 50960 - 44032: 0x9F97, - 50961 - 44032: 0x9F98, - 50962 - 44032: 0x9F99, - 50963 - 44032: 0x9F9A, - 50964 - 44032: 0xC0AB, - 50965 - 44032: 0xC0AC, - 50966 - 44032: 0x9F9B, - 50967 - 44032: 0xC0AD, - 50968 - 44032: 0x9F9C, - 50969 - 44032: 0xC0AE, - 50970 - 44032: 0x9F9D, - 50971 - 44032: 0x9F9E, - 50972 - 44032: 0x9F9F, - 50973 - 44032: 0x9FA0, - 50974 - 44032: 0x9FA1, - 50975 - 44032: 0x9FA2, - 50976 - 44032: 0xC0AF, - 50977 - 44032: 0xC0B0, - 50978 - 44032: 0x9FA3, - 50979 - 44032: 0x9FA4, - 50980 - 44032: 0xC0B1, - 50981 - 44032: 0x9FA5, - 50982 - 44032: 0x9FA6, - 50983 - 44032: 0x9FA7, - 50984 - 44032: 0xC0B2, - 50985 - 44032: 0x9FA8, - 50986 - 44032: 0x9FA9, - 50987 - 44032: 0x9FAA, - 50988 - 44032: 0x9FAB, - 50989 - 44032: 0x9FAC, - 50990 - 44032: 0x9FAD, - 50991 - 44032: 0x9FAE, - 50992 - 44032: 0xC0B3, - 50993 - 44032: 0xC0B4, - 50994 - 44032: 0x9FAF, - 50995 - 44032: 0xC0B5, - 50996 - 44032: 0x9FB0, - 50997 - 44032: 0xC0B6, - 50998 - 44032: 0x9FB1, - 50999 - 44032: 0xC0B7, - 51000 - 44032: 0x9FB2, - 51001 - 44032: 0x9FB3, - 51002 - 44032: 0x9FB4, - 51003 - 44032: 0x9FB5, - 51004 - 44032: 0xC0B8, - 51005 - 44032: 0xC0B9, - 51006 - 44032: 0x9FB6, - 51007 - 44032: 0x9FB7, - 51008 - 44032: 0xC0BA, - 51009 - 44032: 0x9FB8, - 51010 - 44032: 0x9FB9, - 51011 - 44032: 0x9FBA, - 51012 - 44032: 0xC0BB, - 51013 - 44032: 0x9FBB, - 51014 - 44032: 0x9FBC, - 51015 - 44032: 0x9FBD, - 51016 - 44032: 0x9FBE, - 51017 - 44032: 0x9FBF, - 51018 - 44032: 0xC0BC, - 51019 - 44032: 0x9FC0, - 51020 - 44032: 0xC0BD, - 51021 - 44032: 0xC0BE, - 51022 - 44032: 0x9FC1, - 51023 - 44032: 0xC0BF, - 51024 - 44032: 0x9FC2, - 51025 - 44032: 0xC0C0, - 51026 - 44032: 0xC0C1, - 51027 - 44032: 0xC0C2, - 51028 - 44032: 0xC0C3, - 51029 - 44032: 0xC0C4, - 51030 - 44032: 0xC0C5, - 51031 - 44032: 0xC0C6, - 51032 - 44032: 0xC0C7, - 51033 - 44032: 0x9FC3, - 51034 - 44032: 0x9FC4, - 51035 - 44032: 0x9FC5, - 51036 - 44032: 0xC0C8, - 51037 - 44032: 0x9FC6, - 51038 - 44032: 0x9FC7, - 51039 - 44032: 0x9FC8, - 51040 - 44032: 0xC0C9, - 51041 - 44032: 0x9FC9, - 51042 - 44032: 0x9FCA, - 51043 - 44032: 0x9FCB, - 51044 - 44032: 0x9FCC, - 51045 - 44032: 0x9FCD, - 51046 - 44032: 0x9FCE, - 51047 - 44032: 0x9FCF, - 51048 - 44032: 0xC0CA, - 51049 - 44032: 0x9FD0, - 51050 - 44032: 0x9FD1, - 51051 - 44032: 0xC0CB, - 51052 - 44032: 0x9FD2, - 51053 - 44032: 0x9FD3, - 51054 - 44032: 0x9FD4, - 51055 - 44032: 0x9FD5, - 51056 - 44032: 0x9FD6, - 51057 - 44032: 0x9FD7, - 51058 - 44032: 0x9FD8, - 51059 - 44032: 0x9FD9, - 51060 - 44032: 0xC0CC, - 51061 - 44032: 0xC0CD, - 51062 - 44032: 0x9FDA, - 51063 - 44032: 0x9FDB, - 51064 - 44032: 0xC0CE, - 51065 - 44032: 0x9FDC, - 51066 - 44032: 0x9FDD, - 51067 - 44032: 0x9FDE, - 51068 - 44032: 0xC0CF, - 51069 - 44032: 0xC0D0, - 51070 - 44032: 0xC0D1, - 51071 - 44032: 0x9FDF, - 51072 - 44032: 0x9FE0, - 51073 - 44032: 0x9FE1, - 51074 - 44032: 0x9FE2, - 51075 - 44032: 0xC0D2, - 51076 - 44032: 0xC0D3, - 51077 - 44032: 0xC0D4, - 51078 - 44032: 0x9FE3, - 51079 - 44032: 0xC0D5, - 51080 - 44032: 0xC0D6, - 51081 - 44032: 0xC0D7, - 51082 - 44032: 0xC0D8, - 51083 - 44032: 0x9FE4, - 51084 - 44032: 0x9FE5, - 51085 - 44032: 0x9FE6, - 51086 - 44032: 0xC0D9, - 51087 - 44032: 0x9FE7, - 51088 - 44032: 0xC0DA, - 51089 - 44032: 0xC0DB, - 51090 - 44032: 0x9FE8, - 51091 - 44032: 0x9FE9, - 51092 - 44032: 0xC0DC, - 51093 - 44032: 0x9FEA, - 51094 - 44032: 0xC0DD, - 51095 - 44032: 0xC0DE, - 51096 - 44032: 0xC0DF, - 51097 - 44032: 0x9FEB, - 51098 - 44032: 0xC0E0, - 51099 - 44032: 0x9FEC, - 51100 - 44032: 0x9FED, - 51101 - 44032: 0x9FEE, - 51102 - 44032: 0x9FEF, - 51103 - 44032: 0x9FF0, - 51104 - 44032: 0xC0E1, - 51105 - 44032: 0xC0E2, - 51106 - 44032: 0x9FF1, - 51107 - 44032: 0xC0E3, - 51108 - 44032: 0xC0E4, - 51109 - 44032: 0xC0E5, - 51110 - 44032: 0xC0E6, - 51111 - 44032: 0x9FF2, - 51112 - 44032: 0x9FF3, - 51113 - 44032: 0x9FF4, - 51114 - 44032: 0x9FF5, - 51115 - 44032: 0x9FF6, - 51116 - 44032: 0xC0E7, - 51117 - 44032: 0xC0E8, - 51118 - 44032: 0x9FF7, - 51119 - 44032: 0x9FF8, - 51120 - 44032: 0xC0E9, - 51121 - 44032: 0x9FF9, - 51122 - 44032: 0x9FFA, - 51123 - 44032: 0x9FFB, - 51124 - 44032: 0xC0EA, - 51125 - 44032: 0x9FFC, - 51126 - 44032: 0x9FFD, - 51127 - 44032: 0x9FFE, - 51128 - 44032: 0xA041, - 51129 - 44032: 0xA042, - 51130 - 44032: 0xA043, - 51131 - 44032: 0xA044, - 51132 - 44032: 0xC0EB, - 51133 - 44032: 0xC0EC, - 51134 - 44032: 0xA045, - 51135 - 44032: 0xC0ED, - 51136 - 44032: 0xC0EE, - 51137 - 44032: 0xC0EF, - 51138 - 44032: 0xA046, - 51139 - 44032: 0xA047, - 51140 - 44032: 0xA048, - 51141 - 44032: 0xA049, - 51142 - 44032: 0xA04A, - 51143 - 44032: 0xA04B, - 51144 - 44032: 0xC0F0, - 51145 - 44032: 0xC0F1, - 51146 - 44032: 0xA04C, - 51147 - 44032: 0xA04D, - 51148 - 44032: 0xC0F2, - 51149 - 44032: 0xA04E, - 51150 - 44032: 0xC0F3, - 51151 - 44032: 0xA04F, - 51152 - 44032: 0xC0F4, - 51153 - 44032: 0xA050, - 51154 - 44032: 0xA051, - 51155 - 44032: 0xA052, - 51156 - 44032: 0xA053, - 51157 - 44032: 0xA054, - 51158 - 44032: 0xA055, - 51159 - 44032: 0xA056, - 51160 - 44032: 0xC0F5, - 51161 - 44032: 0xA057, - 51162 - 44032: 0xA058, - 51163 - 44032: 0xA059, - 51164 - 44032: 0xA05A, - 51165 - 44032: 0xC0F6, - 51166 - 44032: 0xA061, - 51167 - 44032: 0xA062, - 51168 - 44032: 0xA063, - 51169 - 44032: 0xA064, - 51170 - 44032: 0xA065, - 51171 - 44032: 0xA066, - 51172 - 44032: 0xC0F7, - 51173 - 44032: 0xA067, - 51174 - 44032: 0xA068, - 51175 - 44032: 0xA069, - 51176 - 44032: 0xC0F8, - 51177 - 44032: 0xA06A, - 51178 - 44032: 0xA06B, - 51179 - 44032: 0xA06C, - 51180 - 44032: 0xC0F9, - 51181 - 44032: 0xA06D, - 51182 - 44032: 0xA06E, - 51183 - 44032: 0xA06F, - 51184 - 44032: 0xA070, - 51185 - 44032: 0xA071, - 51186 - 44032: 0xA072, - 51187 - 44032: 0xA073, - 51188 - 44032: 0xA074, - 51189 - 44032: 0xA075, - 51190 - 44032: 0xA076, - 51191 - 44032: 0xA077, - 51192 - 44032: 0xA078, - 51193 - 44032: 0xA079, - 51194 - 44032: 0xA07A, - 51195 - 44032: 0xA081, - 51196 - 44032: 0xA082, - 51197 - 44032: 0xA083, - 51198 - 44032: 0xA084, - 51199 - 44032: 0xA085, - 51200 - 44032: 0xC0FA, - 51201 - 44032: 0xC0FB, - 51202 - 44032: 0xA086, - 51203 - 44032: 0xA087, - 51204 - 44032: 0xC0FC, - 51205 - 44032: 0xA088, - 51206 - 44032: 0xA089, - 51207 - 44032: 0xA08A, - 51208 - 44032: 0xC0FD, - 51209 - 44032: 0xA08B, - 51210 - 44032: 0xC0FE, - 51211 - 44032: 0xA08C, - 51212 - 44032: 0xA08D, - 51213 - 44032: 0xA08E, - 51214 - 44032: 0xA08F, - 51215 - 44032: 0xA090, - 51216 - 44032: 0xC1A1, - 51217 - 44032: 0xC1A2, - 51218 - 44032: 0xA091, - 51219 - 44032: 0xC1A3, - 51220 - 44032: 0xA092, - 51221 - 44032: 0xC1A4, - 51222 - 44032: 0xC1A5, - 51223 - 44032: 0xA093, - 51224 - 44032: 0xA094, - 51225 - 44032: 0xA095, - 51226 - 44032: 0xA096, - 51227 - 44032: 0xA097, - 51228 - 44032: 0xC1A6, - 51229 - 44032: 0xC1A7, - 51230 - 44032: 0xA098, - 51231 - 44032: 0xA099, - 51232 - 44032: 0xC1A8, - 51233 - 44032: 0xA09A, - 51234 - 44032: 0xA09B, - 51235 - 44032: 0xA09C, - 51236 - 44032: 0xC1A9, - 51237 - 44032: 0xA09D, - 51238 - 44032: 0xA09E, - 51239 - 44032: 0xA09F, - 51240 - 44032: 0xA0A0, - 51241 - 44032: 0xA0A1, - 51242 - 44032: 0xA0A2, - 51243 - 44032: 0xA0A3, - 51244 - 44032: 0xC1AA, - 51245 - 44032: 0xC1AB, - 51246 - 44032: 0xA0A4, - 51247 - 44032: 0xC1AC, - 51248 - 44032: 0xA0A5, - 51249 - 44032: 0xC1AD, - 51250 - 44032: 0xA0A6, - 51251 - 44032: 0xA0A7, - 51252 - 44032: 0xA0A8, - 51253 - 44032: 0xA0A9, - 51254 - 44032: 0xA0AA, - 51255 - 44032: 0xA0AB, - 51256 - 44032: 0xC1AE, - 51257 - 44032: 0xA0AC, - 51258 - 44032: 0xA0AD, - 51259 - 44032: 0xA0AE, - 51260 - 44032: 0xC1AF, - 51261 - 44032: 0xA0AF, - 51262 - 44032: 0xA0B0, - 51263 - 44032: 0xA0B1, - 51264 - 44032: 0xC1B0, - 51265 - 44032: 0xA0B2, - 51266 - 44032: 0xA0B3, - 51267 - 44032: 0xA0B4, - 51268 - 44032: 0xA0B5, - 51269 - 44032: 0xA0B6, - 51270 - 44032: 0xA0B7, - 51271 - 44032: 0xA0B8, - 51272 - 44032: 0xC1B1, - 51273 - 44032: 0xC1B2, - 51274 - 44032: 0xA0B9, - 51275 - 44032: 0xA0BA, - 51276 - 44032: 0xC1B3, - 51277 - 44032: 0xC1B4, - 51278 - 44032: 0xA0BB, - 51279 - 44032: 0xA0BC, - 51280 - 44032: 0xA0BD, - 51281 - 44032: 0xA0BE, - 51282 - 44032: 0xA0BF, - 51283 - 44032: 0xA0C0, - 51284 - 44032: 0xC1B5, - 51285 - 44032: 0xA0C1, - 51286 - 44032: 0xA0C2, - 51287 - 44032: 0xA0C3, - 51288 - 44032: 0xA0C4, - 51289 - 44032: 0xA0C5, - 51290 - 44032: 0xA0C6, - 51291 - 44032: 0xA0C7, - 51292 - 44032: 0xA0C8, - 51293 - 44032: 0xA0C9, - 51294 - 44032: 0xA0CA, - 51295 - 44032: 0xA0CB, - 51296 - 44032: 0xA0CC, - 51297 - 44032: 0xA0CD, - 51298 - 44032: 0xA0CE, - 51299 - 44032: 0xA0CF, - 51300 - 44032: 0xA0D0, - 51301 - 44032: 0xA0D1, - 51302 - 44032: 0xA0D2, - 51303 - 44032: 0xA0D3, - 51304 - 44032: 0xA0D4, - 51305 - 44032: 0xA0D5, - 51306 - 44032: 0xA0D6, - 51307 - 44032: 0xA0D7, - 51308 - 44032: 0xA0D8, - 51309 - 44032: 0xA0D9, - 51310 - 44032: 0xA0DA, - 51311 - 44032: 0xA0DB, - 51312 - 44032: 0xC1B6, - 51313 - 44032: 0xC1B7, - 51314 - 44032: 0xA0DC, - 51315 - 44032: 0xA0DD, - 51316 - 44032: 0xC1B8, - 51317 - 44032: 0xA0DE, - 51318 - 44032: 0xA0DF, - 51319 - 44032: 0xA0E0, - 51320 - 44032: 0xC1B9, - 51321 - 44032: 0xA0E1, - 51322 - 44032: 0xC1BA, - 51323 - 44032: 0xA0E2, - 51324 - 44032: 0xA0E3, - 51325 - 44032: 0xA0E4, - 51326 - 44032: 0xA0E5, - 51327 - 44032: 0xA0E6, - 51328 - 44032: 0xC1BB, - 51329 - 44032: 0xC1BC, - 51330 - 44032: 0xA0E7, - 51331 - 44032: 0xC1BD, - 51332 - 44032: 0xA0E8, - 51333 - 44032: 0xC1BE, - 51334 - 44032: 0xC1BF, - 51335 - 44032: 0xC1C0, - 51336 - 44032: 0xA0E9, - 51337 - 44032: 0xA0EA, - 51338 - 44032: 0xA0EB, - 51339 - 44032: 0xC1C1, - 51340 - 44032: 0xC1C2, - 51341 - 44032: 0xC1C3, - 51342 - 44032: 0xA0EC, - 51343 - 44032: 0xA0ED, - 51344 - 44032: 0xA0EE, - 51345 - 44032: 0xA0EF, - 51346 - 44032: 0xA0F0, - 51347 - 44032: 0xA0F1, - 51348 - 44032: 0xC1C4, - 51349 - 44032: 0xA0F2, - 51350 - 44032: 0xA0F3, - 51351 - 44032: 0xA0F4, - 51352 - 44032: 0xA0F5, - 51353 - 44032: 0xA0F6, - 51354 - 44032: 0xA0F7, - 51355 - 44032: 0xA0F8, - 51356 - 44032: 0xA0F9, - 51357 - 44032: 0xC1C5, - 51358 - 44032: 0xA0FA, - 51359 - 44032: 0xC1C6, - 51360 - 44032: 0xA0FB, - 51361 - 44032: 0xC1C7, - 51362 - 44032: 0xA0FC, - 51363 - 44032: 0xA0FD, - 51364 - 44032: 0xA0FE, - 51365 - 44032: 0xA141, - 51366 - 44032: 0xA142, - 51367 - 44032: 0xA143, - 51368 - 44032: 0xC1C8, - 51369 - 44032: 0xA144, - 51370 - 44032: 0xA145, - 51371 - 44032: 0xA146, - 51372 - 44032: 0xA147, - 51373 - 44032: 0xA148, - 51374 - 44032: 0xA149, - 51375 - 44032: 0xA14A, - 51376 - 44032: 0xA14B, - 51377 - 44032: 0xA14C, - 51378 - 44032: 0xA14D, - 51379 - 44032: 0xA14E, - 51380 - 44032: 0xA14F, - 51381 - 44032: 0xA150, - 51382 - 44032: 0xA151, - 51383 - 44032: 0xA152, - 51384 - 44032: 0xA153, - 51385 - 44032: 0xA154, - 51386 - 44032: 0xA155, - 51387 - 44032: 0xA156, - 51388 - 44032: 0xC1C9, - 51389 - 44032: 0xC1CA, - 51390 - 44032: 0xA157, - 51391 - 44032: 0xA158, - 51392 - 44032: 0xA159, - 51393 - 44032: 0xA15A, - 51394 - 44032: 0xA161, - 51395 - 44032: 0xA162, - 51396 - 44032: 0xC1CB, - 51397 - 44032: 0xA163, - 51398 - 44032: 0xA164, - 51399 - 44032: 0xA165, - 51400 - 44032: 0xC1CC, - 51401 - 44032: 0xA166, - 51402 - 44032: 0xA167, - 51403 - 44032: 0xA168, - 51404 - 44032: 0xC1CD, - 51405 - 44032: 0xA169, - 51406 - 44032: 0xA16A, - 51407 - 44032: 0xA16B, - 51408 - 44032: 0xA16C, - 51409 - 44032: 0xA16D, - 51410 - 44032: 0xA16E, - 51411 - 44032: 0xA16F, - 51412 - 44032: 0xC1CE, - 51413 - 44032: 0xC1CF, - 51414 - 44032: 0xA170, - 51415 - 44032: 0xC1D0, - 51416 - 44032: 0xA171, - 51417 - 44032: 0xC1D1, - 51418 - 44032: 0xA172, - 51419 - 44032: 0xA173, - 51420 - 44032: 0xA174, - 51421 - 44032: 0xA175, - 51422 - 44032: 0xA176, - 51423 - 44032: 0xA177, - 51424 - 44032: 0xC1D2, - 51425 - 44032: 0xC1D3, - 51426 - 44032: 0xA178, - 51427 - 44032: 0xA179, - 51428 - 44032: 0xC1D4, - 51429 - 44032: 0xA17A, - 51430 - 44032: 0xA181, - 51431 - 44032: 0xA182, - 51432 - 44032: 0xA183, - 51433 - 44032: 0xA184, - 51434 - 44032: 0xA185, - 51435 - 44032: 0xA186, - 51436 - 44032: 0xA187, - 51437 - 44032: 0xA188, - 51438 - 44032: 0xA189, - 51439 - 44032: 0xA18A, - 51440 - 44032: 0xA18B, - 51441 - 44032: 0xA18C, - 51442 - 44032: 0xA18D, - 51443 - 44032: 0xA18E, - 51444 - 44032: 0xA18F, - 51445 - 44032: 0xC1D5, - 51446 - 44032: 0xA190, - 51447 - 44032: 0xA191, - 51448 - 44032: 0xA192, - 51449 - 44032: 0xA193, - 51450 - 44032: 0xA194, - 51451 - 44032: 0xA195, - 51452 - 44032: 0xC1D6, - 51453 - 44032: 0xC1D7, - 51454 - 44032: 0xA196, - 51455 - 44032: 0xA197, - 51456 - 44032: 0xC1D8, - 51457 - 44032: 0xA198, - 51458 - 44032: 0xA199, - 51459 - 44032: 0xA19A, - 51460 - 44032: 0xC1D9, - 51461 - 44032: 0xC1DA, - 51462 - 44032: 0xC1DB, - 51463 - 44032: 0xA19B, - 51464 - 44032: 0xA19C, - 51465 - 44032: 0xA19D, - 51466 - 44032: 0xA19E, - 51467 - 44032: 0xA19F, - 51468 - 44032: 0xC1DC, - 51469 - 44032: 0xC1DD, - 51470 - 44032: 0xA1A0, - 51471 - 44032: 0xC1DE, - 51472 - 44032: 0xA241, - 51473 - 44032: 0xC1DF, - 51474 - 44032: 0xA242, - 51475 - 44032: 0xA243, - 51476 - 44032: 0xA244, - 51477 - 44032: 0xA245, - 51478 - 44032: 0xA246, - 51479 - 44032: 0xA247, - 51480 - 44032: 0xC1E0, - 51481 - 44032: 0xA248, - 51482 - 44032: 0xA249, - 51483 - 44032: 0xA24A, - 51484 - 44032: 0xA24B, - 51485 - 44032: 0xA24C, - 51486 - 44032: 0xA24D, - 51487 - 44032: 0xA24E, - 51488 - 44032: 0xA24F, - 51489 - 44032: 0xA250, - 51490 - 44032: 0xA251, - 51491 - 44032: 0xA252, - 51492 - 44032: 0xA253, - 51493 - 44032: 0xA254, - 51494 - 44032: 0xA255, - 51495 - 44032: 0xA256, - 51496 - 44032: 0xA257, - 51497 - 44032: 0xA258, - 51498 - 44032: 0xA259, - 51499 - 44032: 0xA25A, - 51500 - 44032: 0xC1E1, - 51501 - 44032: 0xA261, - 51502 - 44032: 0xA262, - 51503 - 44032: 0xA263, - 51504 - 44032: 0xA264, - 51505 - 44032: 0xA265, - 51506 - 44032: 0xA266, - 51507 - 44032: 0xA267, - 51508 - 44032: 0xC1E2, - 51509 - 44032: 0xA268, - 51510 - 44032: 0xA269, - 51511 - 44032: 0xA26A, - 51512 - 44032: 0xA26B, - 51513 - 44032: 0xA26C, - 51514 - 44032: 0xA26D, - 51515 - 44032: 0xA26E, - 51516 - 44032: 0xA26F, - 51517 - 44032: 0xA270, - 51518 - 44032: 0xA271, - 51519 - 44032: 0xA272, - 51520 - 44032: 0xA273, - 51521 - 44032: 0xA274, - 51522 - 44032: 0xA275, - 51523 - 44032: 0xA276, - 51524 - 44032: 0xA277, - 51525 - 44032: 0xA278, - 51526 - 44032: 0xA279, - 51527 - 44032: 0xA27A, - 51528 - 44032: 0xA281, - 51529 - 44032: 0xA282, - 51530 - 44032: 0xA283, - 51531 - 44032: 0xA284, - 51532 - 44032: 0xA285, - 51533 - 44032: 0xA286, - 51534 - 44032: 0xA287, - 51535 - 44032: 0xA288, - 51536 - 44032: 0xC1E3, - 51537 - 44032: 0xC1E4, - 51538 - 44032: 0xA289, - 51539 - 44032: 0xA28A, - 51540 - 44032: 0xC1E5, - 51541 - 44032: 0xA28B, - 51542 - 44032: 0xA28C, - 51543 - 44032: 0xA28D, - 51544 - 44032: 0xC1E6, - 51545 - 44032: 0xA28E, - 51546 - 44032: 0xA28F, - 51547 - 44032: 0xA290, - 51548 - 44032: 0xA291, - 51549 - 44032: 0xA292, - 51550 - 44032: 0xA293, - 51551 - 44032: 0xA294, - 51552 - 44032: 0xC1E7, - 51553 - 44032: 0xC1E8, - 51554 - 44032: 0xA295, - 51555 - 44032: 0xC1E9, - 51556 - 44032: 0xA296, - 51557 - 44032: 0xA297, - 51558 - 44032: 0xA298, - 51559 - 44032: 0xA299, - 51560 - 44032: 0xA29A, - 51561 - 44032: 0xA29B, - 51562 - 44032: 0xA29C, - 51563 - 44032: 0xA29D, - 51564 - 44032: 0xC1EA, - 51565 - 44032: 0xA29E, - 51566 - 44032: 0xA29F, - 51567 - 44032: 0xA2A0, - 51568 - 44032: 0xC1EB, - 51569 - 44032: 0xA341, - 51570 - 44032: 0xA342, - 51571 - 44032: 0xA343, - 51572 - 44032: 0xC1EC, - 51573 - 44032: 0xA344, - 51574 - 44032: 0xA345, - 51575 - 44032: 0xA346, - 51576 - 44032: 0xA347, - 51577 - 44032: 0xA348, - 51578 - 44032: 0xA349, - 51579 - 44032: 0xA34A, - 51580 - 44032: 0xC1ED, - 51581 - 44032: 0xA34B, - 51582 - 44032: 0xA34C, - 51583 - 44032: 0xA34D, - 51584 - 44032: 0xA34E, - 51585 - 44032: 0xA34F, - 51586 - 44032: 0xA350, - 51587 - 44032: 0xA351, - 51588 - 44032: 0xA352, - 51589 - 44032: 0xA353, - 51590 - 44032: 0xA354, - 51591 - 44032: 0xA355, - 51592 - 44032: 0xC1EE, - 51593 - 44032: 0xC1EF, - 51594 - 44032: 0xA356, - 51595 - 44032: 0xA357, - 51596 - 44032: 0xC1F0, - 51597 - 44032: 0xA358, - 51598 - 44032: 0xA359, - 51599 - 44032: 0xA35A, - 51600 - 44032: 0xC1F1, - 51601 - 44032: 0xA361, - 51602 - 44032: 0xA362, - 51603 - 44032: 0xA363, - 51604 - 44032: 0xA364, - 51605 - 44032: 0xA365, - 51606 - 44032: 0xA366, - 51607 - 44032: 0xA367, - 51608 - 44032: 0xC1F2, - 51609 - 44032: 0xC1F3, - 51610 - 44032: 0xA368, - 51611 - 44032: 0xC1F4, - 51612 - 44032: 0xA369, - 51613 - 44032: 0xC1F5, - 51614 - 44032: 0xA36A, - 51615 - 44032: 0xA36B, - 51616 - 44032: 0xA36C, - 51617 - 44032: 0xA36D, - 51618 - 44032: 0xA36E, - 51619 - 44032: 0xA36F, - 51620 - 44032: 0xA370, - 51621 - 44032: 0xA371, - 51622 - 44032: 0xA372, - 51623 - 44032: 0xA373, - 51624 - 44032: 0xA374, - 51625 - 44032: 0xA375, - 51626 - 44032: 0xA376, - 51627 - 44032: 0xA377, - 51628 - 44032: 0xA378, - 51629 - 44032: 0xA379, - 51630 - 44032: 0xA37A, - 51631 - 44032: 0xA381, - 51632 - 44032: 0xA382, - 51633 - 44032: 0xA383, - 51634 - 44032: 0xA384, - 51635 - 44032: 0xA385, - 51636 - 44032: 0xA386, - 51637 - 44032: 0xA387, - 51638 - 44032: 0xA388, - 51639 - 44032: 0xA389, - 51640 - 44032: 0xA38A, - 51641 - 44032: 0xA38B, - 51642 - 44032: 0xA38C, - 51643 - 44032: 0xA38D, - 51644 - 44032: 0xA38E, - 51645 - 44032: 0xA38F, - 51646 - 44032: 0xA390, - 51647 - 44032: 0xA391, - 51648 - 44032: 0xC1F6, - 51649 - 44032: 0xC1F7, - 51650 - 44032: 0xA392, - 51651 - 44032: 0xA393, - 51652 - 44032: 0xC1F8, - 51653 - 44032: 0xA394, - 51654 - 44032: 0xA395, - 51655 - 44032: 0xC1F9, - 51656 - 44032: 0xC1FA, - 51657 - 44032: 0xA396, - 51658 - 44032: 0xC1FB, - 51659 - 44032: 0xA397, - 51660 - 44032: 0xA398, - 51661 - 44032: 0xA399, - 51662 - 44032: 0xA39A, - 51663 - 44032: 0xA39B, - 51664 - 44032: 0xC1FC, - 51665 - 44032: 0xC1FD, - 51666 - 44032: 0xA39C, - 51667 - 44032: 0xC1FE, - 51668 - 44032: 0xA39D, - 51669 - 44032: 0xC2A1, - 51670 - 44032: 0xC2A2, - 51671 - 44032: 0xA39E, - 51672 - 44032: 0xA39F, - 51673 - 44032: 0xC2A3, - 51674 - 44032: 0xC2A4, - 51675 - 44032: 0xA3A0, - 51676 - 44032: 0xC2A5, - 51677 - 44032: 0xC2A6, - 51678 - 44032: 0xA441, - 51679 - 44032: 0xA442, - 51680 - 44032: 0xC2A7, - 51681 - 44032: 0xA443, - 51682 - 44032: 0xC2A8, - 51683 - 44032: 0xA444, - 51684 - 44032: 0xC2A9, - 51685 - 44032: 0xA445, - 51686 - 44032: 0xA446, - 51687 - 44032: 0xC2AA, - 51688 - 44032: 0xA447, - 51689 - 44032: 0xA448, - 51690 - 44032: 0xA449, - 51691 - 44032: 0xA44A, - 51692 - 44032: 0xC2AB, - 51693 - 44032: 0xC2AC, - 51694 - 44032: 0xA44B, - 51695 - 44032: 0xC2AD, - 51696 - 44032: 0xC2AE, - 51697 - 44032: 0xC2AF, - 51698 - 44032: 0xA44C, - 51699 - 44032: 0xA44D, - 51700 - 44032: 0xA44E, - 51701 - 44032: 0xA44F, - 51702 - 44032: 0xA450, - 51703 - 44032: 0xA451, - 51704 - 44032: 0xC2B0, - 51705 - 44032: 0xC2B1, - 51706 - 44032: 0xA452, - 51707 - 44032: 0xA453, - 51708 - 44032: 0xC2B2, - 51709 - 44032: 0xA454, - 51710 - 44032: 0xA455, - 51711 - 44032: 0xA456, - 51712 - 44032: 0xC2B3, - 51713 - 44032: 0xA457, - 51714 - 44032: 0xA458, - 51715 - 44032: 0xA459, - 51716 - 44032: 0xA45A, - 51717 - 44032: 0xA461, - 51718 - 44032: 0xA462, - 51719 - 44032: 0xA463, - 51720 - 44032: 0xC2B4, - 51721 - 44032: 0xC2B5, - 51722 - 44032: 0xA464, - 51723 - 44032: 0xC2B6, - 51724 - 44032: 0xC2B7, - 51725 - 44032: 0xC2B8, - 51726 - 44032: 0xA465, - 51727 - 44032: 0xA466, - 51728 - 44032: 0xA467, - 51729 - 44032: 0xA468, - 51730 - 44032: 0xA469, - 51731 - 44032: 0xA46A, - 51732 - 44032: 0xC2B9, - 51733 - 44032: 0xA46B, - 51734 - 44032: 0xA46C, - 51735 - 44032: 0xA46D, - 51736 - 44032: 0xC2BA, - 51737 - 44032: 0xA46E, - 51738 - 44032: 0xA46F, - 51739 - 44032: 0xA470, - 51740 - 44032: 0xA471, - 51741 - 44032: 0xA472, - 51742 - 44032: 0xA473, - 51743 - 44032: 0xA474, - 51744 - 44032: 0xA475, - 51745 - 44032: 0xA476, - 51746 - 44032: 0xA477, - 51747 - 44032: 0xA478, - 51748 - 44032: 0xA479, - 51749 - 44032: 0xA47A, - 51750 - 44032: 0xA481, - 51751 - 44032: 0xA482, - 51752 - 44032: 0xA483, - 51753 - 44032: 0xC2BB, - 51754 - 44032: 0xA484, - 51755 - 44032: 0xA485, - 51756 - 44032: 0xA486, - 51757 - 44032: 0xA487, - 51758 - 44032: 0xA488, - 51759 - 44032: 0xA489, - 51760 - 44032: 0xA48A, - 51761 - 44032: 0xA48B, - 51762 - 44032: 0xA48C, - 51763 - 44032: 0xA48D, - 51764 - 44032: 0xA48E, - 51765 - 44032: 0xA48F, - 51766 - 44032: 0xA490, - 51767 - 44032: 0xA491, - 51768 - 44032: 0xA492, - 51769 - 44032: 0xA493, - 51770 - 44032: 0xA494, - 51771 - 44032: 0xA495, - 51772 - 44032: 0xA496, - 51773 - 44032: 0xA497, - 51774 - 44032: 0xA498, - 51775 - 44032: 0xA499, - 51776 - 44032: 0xA49A, - 51777 - 44032: 0xA49B, - 51778 - 44032: 0xA49C, - 51779 - 44032: 0xA49D, - 51780 - 44032: 0xA49E, - 51781 - 44032: 0xA49F, - 51782 - 44032: 0xA4A0, - 51783 - 44032: 0xA541, - 51784 - 44032: 0xA542, - 51785 - 44032: 0xA543, - 51786 - 44032: 0xA544, - 51787 - 44032: 0xA545, - 51788 - 44032: 0xC2BC, - 51789 - 44032: 0xC2BD, - 51790 - 44032: 0xA546, - 51791 - 44032: 0xA547, - 51792 - 44032: 0xC2BE, - 51793 - 44032: 0xA548, - 51794 - 44032: 0xA549, - 51795 - 44032: 0xA54A, - 51796 - 44032: 0xC2BF, - 51797 - 44032: 0xA54B, - 51798 - 44032: 0xA54C, - 51799 - 44032: 0xA54D, - 51800 - 44032: 0xA54E, - 51801 - 44032: 0xA54F, - 51802 - 44032: 0xA550, - 51803 - 44032: 0xA551, - 51804 - 44032: 0xC2C0, - 51805 - 44032: 0xC2C1, - 51806 - 44032: 0xA552, - 51807 - 44032: 0xC2C2, - 51808 - 44032: 0xC2C3, - 51809 - 44032: 0xC2C4, - 51810 - 44032: 0xA553, - 51811 - 44032: 0xA554, - 51812 - 44032: 0xA555, - 51813 - 44032: 0xA556, - 51814 - 44032: 0xA557, - 51815 - 44032: 0xA558, - 51816 - 44032: 0xC2C5, - 51817 - 44032: 0xA559, - 51818 - 44032: 0xA55A, - 51819 - 44032: 0xA561, - 51820 - 44032: 0xA562, - 51821 - 44032: 0xA563, - 51822 - 44032: 0xA564, - 51823 - 44032: 0xA565, - 51824 - 44032: 0xA566, - 51825 - 44032: 0xA567, - 51826 - 44032: 0xA568, - 51827 - 44032: 0xA569, - 51828 - 44032: 0xA56A, - 51829 - 44032: 0xA56B, - 51830 - 44032: 0xA56C, - 51831 - 44032: 0xA56D, - 51832 - 44032: 0xA56E, - 51833 - 44032: 0xA56F, - 51834 - 44032: 0xA570, - 51835 - 44032: 0xA571, - 51836 - 44032: 0xA572, - 51837 - 44032: 0xC2C6, - 51838 - 44032: 0xA573, - 51839 - 44032: 0xA574, - 51840 - 44032: 0xA575, - 51841 - 44032: 0xA576, - 51842 - 44032: 0xA577, - 51843 - 44032: 0xA578, - 51844 - 44032: 0xC2C7, - 51845 - 44032: 0xA579, - 51846 - 44032: 0xA57A, - 51847 - 44032: 0xA581, - 51848 - 44032: 0xA582, - 51849 - 44032: 0xA583, - 51850 - 44032: 0xA584, - 51851 - 44032: 0xA585, - 51852 - 44032: 0xA586, - 51853 - 44032: 0xA587, - 51854 - 44032: 0xA588, - 51855 - 44032: 0xA589, - 51856 - 44032: 0xA58A, - 51857 - 44032: 0xA58B, - 51858 - 44032: 0xA58C, - 51859 - 44032: 0xA58D, - 51860 - 44032: 0xA58E, - 51861 - 44032: 0xA58F, - 51862 - 44032: 0xA590, - 51863 - 44032: 0xA591, - 51864 - 44032: 0xC2C8, - 51865 - 44032: 0xA592, - 51866 - 44032: 0xA593, - 51867 - 44032: 0xA594, - 51868 - 44032: 0xA595, - 51869 - 44032: 0xA596, - 51870 - 44032: 0xA597, - 51871 - 44032: 0xA598, - 51872 - 44032: 0xA599, - 51873 - 44032: 0xA59A, - 51874 - 44032: 0xA59B, - 51875 - 44032: 0xA59C, - 51876 - 44032: 0xA59D, - 51877 - 44032: 0xA59E, - 51878 - 44032: 0xA59F, - 51879 - 44032: 0xA5A0, - 51880 - 44032: 0xA641, - 51881 - 44032: 0xA642, - 51882 - 44032: 0xA643, - 51883 - 44032: 0xA644, - 51884 - 44032: 0xA645, - 51885 - 44032: 0xA646, - 51886 - 44032: 0xA647, - 51887 - 44032: 0xA648, - 51888 - 44032: 0xA649, - 51889 - 44032: 0xA64A, - 51890 - 44032: 0xA64B, - 51891 - 44032: 0xA64C, - 51892 - 44032: 0xA64D, - 51893 - 44032: 0xA64E, - 51894 - 44032: 0xA64F, - 51895 - 44032: 0xA650, - 51896 - 44032: 0xA651, - 51897 - 44032: 0xA652, - 51898 - 44032: 0xA653, - 51899 - 44032: 0xA654, - 51900 - 44032: 0xC2C9, - 51901 - 44032: 0xC2CA, - 51902 - 44032: 0xA655, - 51903 - 44032: 0xA656, - 51904 - 44032: 0xC2CB, - 51905 - 44032: 0xA657, - 51906 - 44032: 0xA658, - 51907 - 44032: 0xA659, - 51908 - 44032: 0xC2CC, - 51909 - 44032: 0xA65A, - 51910 - 44032: 0xA661, - 51911 - 44032: 0xA662, - 51912 - 44032: 0xA663, - 51913 - 44032: 0xA664, - 51914 - 44032: 0xA665, - 51915 - 44032: 0xA666, - 51916 - 44032: 0xC2CD, - 51917 - 44032: 0xC2CE, - 51918 - 44032: 0xA667, - 51919 - 44032: 0xC2CF, - 51920 - 44032: 0xA668, - 51921 - 44032: 0xC2D0, - 51922 - 44032: 0xA669, - 51923 - 44032: 0xC2D1, - 51924 - 44032: 0xA66A, - 51925 - 44032: 0xA66B, - 51926 - 44032: 0xA66C, - 51927 - 44032: 0xA66D, - 51928 - 44032: 0xC2D2, - 51929 - 44032: 0xC2D3, - 51930 - 44032: 0xA66E, - 51931 - 44032: 0xA66F, - 51932 - 44032: 0xA670, - 51933 - 44032: 0xA671, - 51934 - 44032: 0xA672, - 51935 - 44032: 0xA673, - 51936 - 44032: 0xC2D4, - 51937 - 44032: 0xA674, - 51938 - 44032: 0xA675, - 51939 - 44032: 0xA676, - 51940 - 44032: 0xA677, - 51941 - 44032: 0xA678, - 51942 - 44032: 0xA679, - 51943 - 44032: 0xA67A, - 51944 - 44032: 0xA681, - 51945 - 44032: 0xA682, - 51946 - 44032: 0xA683, - 51947 - 44032: 0xA684, - 51948 - 44032: 0xC2D5, - 51949 - 44032: 0xA685, - 51950 - 44032: 0xA686, - 51951 - 44032: 0xA687, - 51952 - 44032: 0xA688, - 51953 - 44032: 0xA689, - 51954 - 44032: 0xA68A, - 51955 - 44032: 0xA68B, - 51956 - 44032: 0xC2D6, - 51957 - 44032: 0xA68C, - 51958 - 44032: 0xA68D, - 51959 - 44032: 0xA68E, - 51960 - 44032: 0xA68F, - 51961 - 44032: 0xA690, - 51962 - 44032: 0xA691, - 51963 - 44032: 0xA692, - 51964 - 44032: 0xA693, - 51965 - 44032: 0xA694, - 51966 - 44032: 0xA695, - 51967 - 44032: 0xA696, - 51968 - 44032: 0xA697, - 51969 - 44032: 0xA698, - 51970 - 44032: 0xA699, - 51971 - 44032: 0xA69A, - 51972 - 44032: 0xA69B, - 51973 - 44032: 0xA69C, - 51974 - 44032: 0xA69D, - 51975 - 44032: 0xA69E, - 51976 - 44032: 0xC2D7, - 51977 - 44032: 0xA69F, - 51978 - 44032: 0xA6A0, - 51979 - 44032: 0xA741, - 51980 - 44032: 0xA742, - 51981 - 44032: 0xA743, - 51982 - 44032: 0xA744, - 51983 - 44032: 0xA745, - 51984 - 44032: 0xC2D8, - 51985 - 44032: 0xA746, - 51986 - 44032: 0xA747, - 51987 - 44032: 0xA748, - 51988 - 44032: 0xC2D9, - 51989 - 44032: 0xA749, - 51990 - 44032: 0xA74A, - 51991 - 44032: 0xA74B, - 51992 - 44032: 0xC2DA, - 51993 - 44032: 0xA74C, - 51994 - 44032: 0xA74D, - 51995 - 44032: 0xA74E, - 51996 - 44032: 0xA74F, - 51997 - 44032: 0xA750, - 51998 - 44032: 0xA751, - 51999 - 44032: 0xA752, - 52000 - 44032: 0xC2DB, - 52001 - 44032: 0xC2DC, - 52002 - 44032: 0xA753, - 52003 - 44032: 0xA754, - 52004 - 44032: 0xA755, - 52005 - 44032: 0xA756, - 52006 - 44032: 0xA757, - 52007 - 44032: 0xA758, - 52008 - 44032: 0xA759, - 52009 - 44032: 0xA75A, - 52010 - 44032: 0xA761, - 52011 - 44032: 0xA762, - 52012 - 44032: 0xA763, - 52013 - 44032: 0xA764, - 52014 - 44032: 0xA765, - 52015 - 44032: 0xA766, - 52016 - 44032: 0xA767, - 52017 - 44032: 0xA768, - 52018 - 44032: 0xA769, - 52019 - 44032: 0xA76A, - 52020 - 44032: 0xA76B, - 52021 - 44032: 0xA76C, - 52022 - 44032: 0xA76D, - 52023 - 44032: 0xA76E, - 52024 - 44032: 0xA76F, - 52025 - 44032: 0xA770, - 52026 - 44032: 0xA771, - 52027 - 44032: 0xA772, - 52028 - 44032: 0xA773, - 52029 - 44032: 0xA774, - 52030 - 44032: 0xA775, - 52031 - 44032: 0xA776, - 52032 - 44032: 0xA777, - 52033 - 44032: 0xC2DD, - 52034 - 44032: 0xA778, - 52035 - 44032: 0xA779, - 52036 - 44032: 0xA77A, - 52037 - 44032: 0xA781, - 52038 - 44032: 0xA782, - 52039 - 44032: 0xA783, - 52040 - 44032: 0xC2DE, - 52041 - 44032: 0xC2DF, - 52042 - 44032: 0xA784, - 52043 - 44032: 0xA785, - 52044 - 44032: 0xC2E0, - 52045 - 44032: 0xA786, - 52046 - 44032: 0xA787, - 52047 - 44032: 0xA788, - 52048 - 44032: 0xC2E1, - 52049 - 44032: 0xA789, - 52050 - 44032: 0xA78A, - 52051 - 44032: 0xA78B, - 52052 - 44032: 0xA78C, - 52053 - 44032: 0xA78D, - 52054 - 44032: 0xA78E, - 52055 - 44032: 0xA78F, - 52056 - 44032: 0xC2E2, - 52057 - 44032: 0xC2E3, - 52058 - 44032: 0xA790, - 52059 - 44032: 0xA791, - 52060 - 44032: 0xA792, - 52061 - 44032: 0xC2E4, - 52062 - 44032: 0xA793, - 52063 - 44032: 0xA794, - 52064 - 44032: 0xA795, - 52065 - 44032: 0xA796, - 52066 - 44032: 0xA797, - 52067 - 44032: 0xA798, - 52068 - 44032: 0xC2E5, - 52069 - 44032: 0xA799, - 52070 - 44032: 0xA79A, - 52071 - 44032: 0xA79B, - 52072 - 44032: 0xA79C, - 52073 - 44032: 0xA79D, - 52074 - 44032: 0xA79E, - 52075 - 44032: 0xA79F, - 52076 - 44032: 0xA7A0, - 52077 - 44032: 0xA841, - 52078 - 44032: 0xA842, - 52079 - 44032: 0xA843, - 52080 - 44032: 0xA844, - 52081 - 44032: 0xA845, - 52082 - 44032: 0xA846, - 52083 - 44032: 0xA847, - 52084 - 44032: 0xA848, - 52085 - 44032: 0xA849, - 52086 - 44032: 0xA84A, - 52087 - 44032: 0xA84B, - 52088 - 44032: 0xC2E6, - 52089 - 44032: 0xC2E7, - 52090 - 44032: 0xA84C, - 52091 - 44032: 0xA84D, - 52092 - 44032: 0xA84E, - 52093 - 44032: 0xA84F, - 52094 - 44032: 0xA850, - 52095 - 44032: 0xA851, - 52096 - 44032: 0xA852, - 52097 - 44032: 0xA853, - 52098 - 44032: 0xA854, - 52099 - 44032: 0xA855, - 52100 - 44032: 0xA856, - 52101 - 44032: 0xA857, - 52102 - 44032: 0xA858, - 52103 - 44032: 0xA859, - 52104 - 44032: 0xA85A, - 52105 - 44032: 0xA861, - 52106 - 44032: 0xA862, - 52107 - 44032: 0xA863, - 52108 - 44032: 0xA864, - 52109 - 44032: 0xA865, - 52110 - 44032: 0xA866, - 52111 - 44032: 0xA867, - 52112 - 44032: 0xA868, - 52113 - 44032: 0xA869, - 52114 - 44032: 0xA86A, - 52115 - 44032: 0xA86B, - 52116 - 44032: 0xA86C, - 52117 - 44032: 0xA86D, - 52118 - 44032: 0xA86E, - 52119 - 44032: 0xA86F, - 52120 - 44032: 0xA870, - 52121 - 44032: 0xA871, - 52122 - 44032: 0xA872, - 52123 - 44032: 0xA873, - 52124 - 44032: 0xC2E8, - 52125 - 44032: 0xA874, - 52126 - 44032: 0xA875, - 52127 - 44032: 0xA876, - 52128 - 44032: 0xA877, - 52129 - 44032: 0xA878, - 52130 - 44032: 0xA879, - 52131 - 44032: 0xA87A, - 52132 - 44032: 0xA881, - 52133 - 44032: 0xA882, - 52134 - 44032: 0xA883, - 52135 - 44032: 0xA884, - 52136 - 44032: 0xA885, - 52137 - 44032: 0xA886, - 52138 - 44032: 0xA887, - 52139 - 44032: 0xA888, - 52140 - 44032: 0xA889, - 52141 - 44032: 0xA88A, - 52142 - 44032: 0xA88B, - 52143 - 44032: 0xA88C, - 52144 - 44032: 0xA88D, - 52145 - 44032: 0xA88E, - 52146 - 44032: 0xA88F, - 52147 - 44032: 0xA890, - 52148 - 44032: 0xA891, - 52149 - 44032: 0xA892, - 52150 - 44032: 0xA893, - 52151 - 44032: 0xA894, - 52152 - 44032: 0xC2E9, - 52153 - 44032: 0xA895, - 52154 - 44032: 0xA896, - 52155 - 44032: 0xA897, - 52156 - 44032: 0xA898, - 52157 - 44032: 0xA899, - 52158 - 44032: 0xA89A, - 52159 - 44032: 0xA89B, - 52160 - 44032: 0xA89C, - 52161 - 44032: 0xA89D, - 52162 - 44032: 0xA89E, - 52163 - 44032: 0xA89F, - 52164 - 44032: 0xA8A0, - 52165 - 44032: 0xA941, - 52166 - 44032: 0xA942, - 52167 - 44032: 0xA943, - 52168 - 44032: 0xA944, - 52169 - 44032: 0xA945, - 52170 - 44032: 0xA946, - 52171 - 44032: 0xA947, - 52172 - 44032: 0xA948, - 52173 - 44032: 0xA949, - 52174 - 44032: 0xA94A, - 52175 - 44032: 0xA94B, - 52176 - 44032: 0xA94C, - 52177 - 44032: 0xA94D, - 52178 - 44032: 0xA94E, - 52179 - 44032: 0xA94F, - 52180 - 44032: 0xC2EA, - 52181 - 44032: 0xA950, - 52182 - 44032: 0xA951, - 52183 - 44032: 0xA952, - 52184 - 44032: 0xA953, - 52185 - 44032: 0xA954, - 52186 - 44032: 0xA955, - 52187 - 44032: 0xA956, - 52188 - 44032: 0xA957, - 52189 - 44032: 0xA958, - 52190 - 44032: 0xA959, - 52191 - 44032: 0xA95A, - 52192 - 44032: 0xA961, - 52193 - 44032: 0xA962, - 52194 - 44032: 0xA963, - 52195 - 44032: 0xA964, - 52196 - 44032: 0xC2EB, - 52197 - 44032: 0xA965, - 52198 - 44032: 0xA966, - 52199 - 44032: 0xC2EC, - 52200 - 44032: 0xA967, - 52201 - 44032: 0xC2ED, - 52202 - 44032: 0xA968, - 52203 - 44032: 0xA969, - 52204 - 44032: 0xA96A, - 52205 - 44032: 0xA96B, - 52206 - 44032: 0xA96C, - 52207 - 44032: 0xA96D, - 52208 - 44032: 0xA96E, - 52209 - 44032: 0xA96F, - 52210 - 44032: 0xA970, - 52211 - 44032: 0xA971, - 52212 - 44032: 0xA972, - 52213 - 44032: 0xA973, - 52214 - 44032: 0xA974, - 52215 - 44032: 0xA975, - 52216 - 44032: 0xA976, - 52217 - 44032: 0xA977, - 52218 - 44032: 0xA978, - 52219 - 44032: 0xA979, - 52220 - 44032: 0xA97A, - 52221 - 44032: 0xA981, - 52222 - 44032: 0xA982, - 52223 - 44032: 0xA983, - 52224 - 44032: 0xA984, - 52225 - 44032: 0xA985, - 52226 - 44032: 0xA986, - 52227 - 44032: 0xA987, - 52228 - 44032: 0xA988, - 52229 - 44032: 0xA989, - 52230 - 44032: 0xA98A, - 52231 - 44032: 0xA98B, - 52232 - 44032: 0xA98C, - 52233 - 44032: 0xA98D, - 52234 - 44032: 0xA98E, - 52235 - 44032: 0xA98F, - 52236 - 44032: 0xC2EE, - 52237 - 44032: 0xC2EF, - 52238 - 44032: 0xA990, - 52239 - 44032: 0xA991, - 52240 - 44032: 0xC2F0, - 52241 - 44032: 0xA992, - 52242 - 44032: 0xA993, - 52243 - 44032: 0xA994, - 52244 - 44032: 0xC2F1, - 52245 - 44032: 0xA995, - 52246 - 44032: 0xA996, - 52247 - 44032: 0xA997, - 52248 - 44032: 0xA998, - 52249 - 44032: 0xA999, - 52250 - 44032: 0xA99A, - 52251 - 44032: 0xA99B, - 52252 - 44032: 0xC2F2, - 52253 - 44032: 0xC2F3, - 52254 - 44032: 0xA99C, - 52255 - 44032: 0xA99D, - 52256 - 44032: 0xA99E, - 52257 - 44032: 0xC2F4, - 52258 - 44032: 0xC2F5, - 52259 - 44032: 0xA99F, - 52260 - 44032: 0xA9A0, - 52261 - 44032: 0xAA41, - 52262 - 44032: 0xAA42, - 52263 - 44032: 0xC2F6, - 52264 - 44032: 0xC2F7, - 52265 - 44032: 0xC2F8, - 52266 - 44032: 0xAA43, - 52267 - 44032: 0xAA44, - 52268 - 44032: 0xC2F9, - 52269 - 44032: 0xAA45, - 52270 - 44032: 0xC2FA, - 52271 - 44032: 0xAA46, - 52272 - 44032: 0xC2FB, - 52273 - 44032: 0xAA47, - 52274 - 44032: 0xAA48, - 52275 - 44032: 0xAA49, - 52276 - 44032: 0xAA4A, - 52277 - 44032: 0xAA4B, - 52278 - 44032: 0xAA4C, - 52279 - 44032: 0xAA4D, - 52280 - 44032: 0xC2FC, - 52281 - 44032: 0xC2FD, - 52282 - 44032: 0xAA4E, - 52283 - 44032: 0xC2FE, - 52284 - 44032: 0xC3A1, - 52285 - 44032: 0xC3A2, - 52286 - 44032: 0xC3A3, - 52287 - 44032: 0xAA4F, - 52288 - 44032: 0xAA50, - 52289 - 44032: 0xAA51, - 52290 - 44032: 0xAA52, - 52291 - 44032: 0xAA53, - 52292 - 44032: 0xC3A4, - 52293 - 44032: 0xC3A5, - 52294 - 44032: 0xAA54, - 52295 - 44032: 0xAA55, - 52296 - 44032: 0xC3A6, - 52297 - 44032: 0xAA56, - 52298 - 44032: 0xAA57, - 52299 - 44032: 0xAA58, - 52300 - 44032: 0xC3A7, - 52301 - 44032: 0xAA59, - 52302 - 44032: 0xAA5A, - 52303 - 44032: 0xAA61, - 52304 - 44032: 0xAA62, - 52305 - 44032: 0xAA63, - 52306 - 44032: 0xAA64, - 52307 - 44032: 0xAA65, - 52308 - 44032: 0xC3A8, - 52309 - 44032: 0xC3A9, - 52310 - 44032: 0xAA66, - 52311 - 44032: 0xC3AA, - 52312 - 44032: 0xC3AB, - 52313 - 44032: 0xC3AC, - 52314 - 44032: 0xAA67, - 52315 - 44032: 0xAA68, - 52316 - 44032: 0xAA69, - 52317 - 44032: 0xAA6A, - 52318 - 44032: 0xAA6B, - 52319 - 44032: 0xAA6C, - 52320 - 44032: 0xC3AD, - 52321 - 44032: 0xAA6D, - 52322 - 44032: 0xAA6E, - 52323 - 44032: 0xAA6F, - 52324 - 44032: 0xC3AE, - 52325 - 44032: 0xAA70, - 52326 - 44032: 0xC3AF, - 52327 - 44032: 0xAA71, - 52328 - 44032: 0xC3B0, - 52329 - 44032: 0xAA72, - 52330 - 44032: 0xAA73, - 52331 - 44032: 0xAA74, - 52332 - 44032: 0xAA75, - 52333 - 44032: 0xAA76, - 52334 - 44032: 0xAA77, - 52335 - 44032: 0xAA78, - 52336 - 44032: 0xC3B1, - 52337 - 44032: 0xAA79, - 52338 - 44032: 0xAA7A, - 52339 - 44032: 0xAA81, - 52340 - 44032: 0xAA82, - 52341 - 44032: 0xC3B2, - 52342 - 44032: 0xAA83, - 52343 - 44032: 0xAA84, - 52344 - 44032: 0xAA85, - 52345 - 44032: 0xAA86, - 52346 - 44032: 0xAA87, - 52347 - 44032: 0xAA88, - 52348 - 44032: 0xAA89, - 52349 - 44032: 0xAA8A, - 52350 - 44032: 0xAA8B, - 52351 - 44032: 0xAA8C, - 52352 - 44032: 0xAA8D, - 52353 - 44032: 0xAA8E, - 52354 - 44032: 0xAA8F, - 52355 - 44032: 0xAA90, - 52356 - 44032: 0xAA91, - 52357 - 44032: 0xAA92, - 52358 - 44032: 0xAA93, - 52359 - 44032: 0xAA94, - 52360 - 44032: 0xAA95, - 52361 - 44032: 0xAA96, - 52362 - 44032: 0xAA97, - 52363 - 44032: 0xAA98, - 52364 - 44032: 0xAA99, - 52365 - 44032: 0xAA9A, - 52366 - 44032: 0xAA9B, - 52367 - 44032: 0xAA9C, - 52368 - 44032: 0xAA9D, - 52369 - 44032: 0xAA9E, - 52370 - 44032: 0xAA9F, - 52371 - 44032: 0xAAA0, - 52372 - 44032: 0xAB41, - 52373 - 44032: 0xAB42, - 52374 - 44032: 0xAB43, - 52375 - 44032: 0xAB44, - 52376 - 44032: 0xC3B3, - 52377 - 44032: 0xC3B4, - 52378 - 44032: 0xAB45, - 52379 - 44032: 0xAB46, - 52380 - 44032: 0xC3B5, - 52381 - 44032: 0xAB47, - 52382 - 44032: 0xAB48, - 52383 - 44032: 0xAB49, - 52384 - 44032: 0xC3B6, - 52385 - 44032: 0xAB4A, - 52386 - 44032: 0xAB4B, - 52387 - 44032: 0xAB4C, - 52388 - 44032: 0xAB4D, - 52389 - 44032: 0xAB4E, - 52390 - 44032: 0xAB4F, - 52391 - 44032: 0xAB50, - 52392 - 44032: 0xC3B7, - 52393 - 44032: 0xC3B8, - 52394 - 44032: 0xAB51, - 52395 - 44032: 0xC3B9, - 52396 - 44032: 0xC3BA, - 52397 - 44032: 0xC3BB, - 52398 - 44032: 0xAB52, - 52399 - 44032: 0xAB53, - 52400 - 44032: 0xAB54, - 52401 - 44032: 0xAB55, - 52402 - 44032: 0xAB56, - 52403 - 44032: 0xAB57, - 52404 - 44032: 0xC3BC, - 52405 - 44032: 0xC3BD, - 52406 - 44032: 0xAB58, - 52407 - 44032: 0xAB59, - 52408 - 44032: 0xC3BE, - 52409 - 44032: 0xAB5A, - 52410 - 44032: 0xAB61, - 52411 - 44032: 0xAB62, - 52412 - 44032: 0xC3BF, - 52413 - 44032: 0xAB63, - 52414 - 44032: 0xAB64, - 52415 - 44032: 0xAB65, - 52416 - 44032: 0xAB66, - 52417 - 44032: 0xAB67, - 52418 - 44032: 0xAB68, - 52419 - 44032: 0xAB69, - 52420 - 44032: 0xC3C0, - 52421 - 44032: 0xC3C1, - 52422 - 44032: 0xAB6A, - 52423 - 44032: 0xC3C2, - 52424 - 44032: 0xAB6B, - 52425 - 44032: 0xC3C3, - 52426 - 44032: 0xAB6C, - 52427 - 44032: 0xAB6D, - 52428 - 44032: 0xAB6E, - 52429 - 44032: 0xAB6F, - 52430 - 44032: 0xAB70, - 52431 - 44032: 0xAB71, - 52432 - 44032: 0xC3C4, - 52433 - 44032: 0xAB72, - 52434 - 44032: 0xAB73, - 52435 - 44032: 0xAB74, - 52436 - 44032: 0xC3C5, - 52437 - 44032: 0xAB75, - 52438 - 44032: 0xAB76, - 52439 - 44032: 0xAB77, - 52440 - 44032: 0xAB78, - 52441 - 44032: 0xAB79, - 52442 - 44032: 0xAB7A, - 52443 - 44032: 0xAB81, - 52444 - 44032: 0xAB82, - 52445 - 44032: 0xAB83, - 52446 - 44032: 0xAB84, - 52447 - 44032: 0xAB85, - 52448 - 44032: 0xAB86, - 52449 - 44032: 0xAB87, - 52450 - 44032: 0xAB88, - 52451 - 44032: 0xAB89, - 52452 - 44032: 0xC3C6, - 52453 - 44032: 0xAB8A, - 52454 - 44032: 0xAB8B, - 52455 - 44032: 0xAB8C, - 52456 - 44032: 0xAB8D, - 52457 - 44032: 0xAB8E, - 52458 - 44032: 0xAB8F, - 52459 - 44032: 0xAB90, - 52460 - 44032: 0xC3C7, - 52461 - 44032: 0xAB91, - 52462 - 44032: 0xAB92, - 52463 - 44032: 0xAB93, - 52464 - 44032: 0xC3C8, - 52465 - 44032: 0xAB94, - 52466 - 44032: 0xAB95, - 52467 - 44032: 0xAB96, - 52468 - 44032: 0xAB97, - 52469 - 44032: 0xAB98, - 52470 - 44032: 0xAB99, - 52471 - 44032: 0xAB9A, - 52472 - 44032: 0xAB9B, - 52473 - 44032: 0xAB9C, - 52474 - 44032: 0xAB9D, - 52475 - 44032: 0xAB9E, - 52476 - 44032: 0xAB9F, - 52477 - 44032: 0xABA0, - 52478 - 44032: 0xAC41, - 52479 - 44032: 0xAC42, - 52480 - 44032: 0xAC43, - 52481 - 44032: 0xC3C9, - 52482 - 44032: 0xAC44, - 52483 - 44032: 0xAC45, - 52484 - 44032: 0xAC46, - 52485 - 44032: 0xAC47, - 52486 - 44032: 0xAC48, - 52487 - 44032: 0xAC49, - 52488 - 44032: 0xC3CA, - 52489 - 44032: 0xC3CB, - 52490 - 44032: 0xAC4A, - 52491 - 44032: 0xAC4B, - 52492 - 44032: 0xC3CC, - 52493 - 44032: 0xAC4C, - 52494 - 44032: 0xAC4D, - 52495 - 44032: 0xAC4E, - 52496 - 44032: 0xC3CD, - 52497 - 44032: 0xAC4F, - 52498 - 44032: 0xAC50, - 52499 - 44032: 0xAC51, - 52500 - 44032: 0xAC52, - 52501 - 44032: 0xAC53, - 52502 - 44032: 0xAC54, - 52503 - 44032: 0xAC55, - 52504 - 44032: 0xC3CE, - 52505 - 44032: 0xC3CF, - 52506 - 44032: 0xAC56, - 52507 - 44032: 0xC3D0, - 52508 - 44032: 0xAC57, - 52509 - 44032: 0xC3D1, - 52510 - 44032: 0xAC58, - 52511 - 44032: 0xAC59, - 52512 - 44032: 0xAC5A, - 52513 - 44032: 0xAC61, - 52514 - 44032: 0xAC62, - 52515 - 44032: 0xAC63, - 52516 - 44032: 0xC3D2, - 52517 - 44032: 0xAC64, - 52518 - 44032: 0xAC65, - 52519 - 44032: 0xAC66, - 52520 - 44032: 0xC3D3, - 52521 - 44032: 0xAC67, - 52522 - 44032: 0xAC68, - 52523 - 44032: 0xAC69, - 52524 - 44032: 0xC3D4, - 52525 - 44032: 0xAC6A, - 52526 - 44032: 0xAC6B, - 52527 - 44032: 0xAC6C, - 52528 - 44032: 0xAC6D, - 52529 - 44032: 0xAC6E, - 52530 - 44032: 0xAC6F, - 52531 - 44032: 0xAC70, - 52532 - 44032: 0xAC71, - 52533 - 44032: 0xAC72, - 52534 - 44032: 0xAC73, - 52535 - 44032: 0xAC74, - 52536 - 44032: 0xAC75, - 52537 - 44032: 0xC3D5, - 52538 - 44032: 0xAC76, - 52539 - 44032: 0xAC77, - 52540 - 44032: 0xAC78, - 52541 - 44032: 0xAC79, - 52542 - 44032: 0xAC7A, - 52543 - 44032: 0xAC81, - 52544 - 44032: 0xAC82, - 52545 - 44032: 0xAC83, - 52546 - 44032: 0xAC84, - 52547 - 44032: 0xAC85, - 52548 - 44032: 0xAC86, - 52549 - 44032: 0xAC87, - 52550 - 44032: 0xAC88, - 52551 - 44032: 0xAC89, - 52552 - 44032: 0xAC8A, - 52553 - 44032: 0xAC8B, - 52554 - 44032: 0xAC8C, - 52555 - 44032: 0xAC8D, - 52556 - 44032: 0xAC8E, - 52557 - 44032: 0xAC8F, - 52558 - 44032: 0xAC90, - 52559 - 44032: 0xAC91, - 52560 - 44032: 0xAC92, - 52561 - 44032: 0xAC93, - 52562 - 44032: 0xAC94, - 52563 - 44032: 0xAC95, - 52564 - 44032: 0xAC96, - 52565 - 44032: 0xAC97, - 52566 - 44032: 0xAC98, - 52567 - 44032: 0xAC99, - 52568 - 44032: 0xAC9A, - 52569 - 44032: 0xAC9B, - 52570 - 44032: 0xAC9C, - 52571 - 44032: 0xAC9D, - 52572 - 44032: 0xC3D6, - 52573 - 44032: 0xAC9E, - 52574 - 44032: 0xAC9F, - 52575 - 44032: 0xACA0, - 52576 - 44032: 0xC3D7, - 52577 - 44032: 0xAD41, - 52578 - 44032: 0xAD42, - 52579 - 44032: 0xAD43, - 52580 - 44032: 0xC3D8, - 52581 - 44032: 0xAD44, - 52582 - 44032: 0xAD45, - 52583 - 44032: 0xAD46, - 52584 - 44032: 0xAD47, - 52585 - 44032: 0xAD48, - 52586 - 44032: 0xAD49, - 52587 - 44032: 0xAD4A, - 52588 - 44032: 0xC3D9, - 52589 - 44032: 0xC3DA, - 52590 - 44032: 0xAD4B, - 52591 - 44032: 0xC3DB, - 52592 - 44032: 0xAD4C, - 52593 - 44032: 0xC3DC, - 52594 - 44032: 0xAD4D, - 52595 - 44032: 0xAD4E, - 52596 - 44032: 0xAD4F, - 52597 - 44032: 0xAD50, - 52598 - 44032: 0xAD51, - 52599 - 44032: 0xAD52, - 52600 - 44032: 0xC3DD, - 52601 - 44032: 0xAD53, - 52602 - 44032: 0xAD54, - 52603 - 44032: 0xAD55, - 52604 - 44032: 0xAD56, - 52605 - 44032: 0xAD57, - 52606 - 44032: 0xAD58, - 52607 - 44032: 0xAD59, - 52608 - 44032: 0xAD5A, - 52609 - 44032: 0xAD61, - 52610 - 44032: 0xAD62, - 52611 - 44032: 0xAD63, - 52612 - 44032: 0xAD64, - 52613 - 44032: 0xAD65, - 52614 - 44032: 0xAD66, - 52615 - 44032: 0xAD67, - 52616 - 44032: 0xC3DE, - 52617 - 44032: 0xAD68, - 52618 - 44032: 0xAD69, - 52619 - 44032: 0xAD6A, - 52620 - 44032: 0xAD6B, - 52621 - 44032: 0xAD6C, - 52622 - 44032: 0xAD6D, - 52623 - 44032: 0xAD6E, - 52624 - 44032: 0xAD6F, - 52625 - 44032: 0xAD70, - 52626 - 44032: 0xAD71, - 52627 - 44032: 0xAD72, - 52628 - 44032: 0xC3DF, - 52629 - 44032: 0xC3E0, - 52630 - 44032: 0xAD73, - 52631 - 44032: 0xAD74, - 52632 - 44032: 0xC3E1, - 52633 - 44032: 0xAD75, - 52634 - 44032: 0xAD76, - 52635 - 44032: 0xAD77, - 52636 - 44032: 0xC3E2, - 52637 - 44032: 0xAD78, - 52638 - 44032: 0xAD79, - 52639 - 44032: 0xAD7A, - 52640 - 44032: 0xAD81, - 52641 - 44032: 0xAD82, - 52642 - 44032: 0xAD83, - 52643 - 44032: 0xAD84, - 52644 - 44032: 0xC3E3, - 52645 - 44032: 0xC3E4, - 52646 - 44032: 0xAD85, - 52647 - 44032: 0xC3E5, - 52648 - 44032: 0xAD86, - 52649 - 44032: 0xC3E6, - 52650 - 44032: 0xAD87, - 52651 - 44032: 0xAD88, - 52652 - 44032: 0xAD89, - 52653 - 44032: 0xAD8A, - 52654 - 44032: 0xAD8B, - 52655 - 44032: 0xAD8C, - 52656 - 44032: 0xC3E7, - 52657 - 44032: 0xAD8D, - 52658 - 44032: 0xAD8E, - 52659 - 44032: 0xAD8F, - 52660 - 44032: 0xAD90, - 52661 - 44032: 0xAD91, - 52662 - 44032: 0xAD92, - 52663 - 44032: 0xAD93, - 52664 - 44032: 0xAD94, - 52665 - 44032: 0xAD95, - 52666 - 44032: 0xAD96, - 52667 - 44032: 0xAD97, - 52668 - 44032: 0xAD98, - 52669 - 44032: 0xAD99, - 52670 - 44032: 0xAD9A, - 52671 - 44032: 0xAD9B, - 52672 - 44032: 0xAD9C, - 52673 - 44032: 0xAD9D, - 52674 - 44032: 0xAD9E, - 52675 - 44032: 0xAD9F, - 52676 - 44032: 0xC3E8, - 52677 - 44032: 0xADA0, - 52678 - 44032: 0xAE41, - 52679 - 44032: 0xAE42, - 52680 - 44032: 0xAE43, - 52681 - 44032: 0xAE44, - 52682 - 44032: 0xAE45, - 52683 - 44032: 0xAE46, - 52684 - 44032: 0xC3E9, - 52685 - 44032: 0xAE47, - 52686 - 44032: 0xAE48, - 52687 - 44032: 0xAE49, - 52688 - 44032: 0xC3EA, - 52689 - 44032: 0xAE4A, - 52690 - 44032: 0xAE4B, - 52691 - 44032: 0xAE4C, - 52692 - 44032: 0xAE4D, - 52693 - 44032: 0xAE4E, - 52694 - 44032: 0xAE4F, - 52695 - 44032: 0xAE50, - 52696 - 44032: 0xAE51, - 52697 - 44032: 0xAE52, - 52698 - 44032: 0xAE53, - 52699 - 44032: 0xAE54, - 52700 - 44032: 0xAE55, - 52701 - 44032: 0xAE56, - 52702 - 44032: 0xAE57, - 52703 - 44032: 0xAE58, - 52704 - 44032: 0xAE59, - 52705 - 44032: 0xAE5A, - 52706 - 44032: 0xAE61, - 52707 - 44032: 0xAE62, - 52708 - 44032: 0xAE63, - 52709 - 44032: 0xAE64, - 52710 - 44032: 0xAE65, - 52711 - 44032: 0xAE66, - 52712 - 44032: 0xC3EB, - 52713 - 44032: 0xAE67, - 52714 - 44032: 0xAE68, - 52715 - 44032: 0xAE69, - 52716 - 44032: 0xC3EC, - 52717 - 44032: 0xAE6A, - 52718 - 44032: 0xAE6B, - 52719 - 44032: 0xAE6C, - 52720 - 44032: 0xC3ED, - 52721 - 44032: 0xAE6D, - 52722 - 44032: 0xAE6E, - 52723 - 44032: 0xAE6F, - 52724 - 44032: 0xAE70, - 52725 - 44032: 0xAE71, - 52726 - 44032: 0xAE72, - 52727 - 44032: 0xAE73, - 52728 - 44032: 0xC3EE, - 52729 - 44032: 0xC3EF, - 52730 - 44032: 0xAE74, - 52731 - 44032: 0xC3F0, - 52732 - 44032: 0xAE75, - 52733 - 44032: 0xC3F1, - 52734 - 44032: 0xAE76, - 52735 - 44032: 0xAE77, - 52736 - 44032: 0xAE78, - 52737 - 44032: 0xAE79, - 52738 - 44032: 0xAE7A, - 52739 - 44032: 0xAE81, - 52740 - 44032: 0xC3F2, - 52741 - 44032: 0xAE82, - 52742 - 44032: 0xAE83, - 52743 - 44032: 0xAE84, - 52744 - 44032: 0xC3F3, - 52745 - 44032: 0xAE85, - 52746 - 44032: 0xAE86, - 52747 - 44032: 0xAE87, - 52748 - 44032: 0xC3F4, - 52749 - 44032: 0xAE88, - 52750 - 44032: 0xAE89, - 52751 - 44032: 0xAE8A, - 52752 - 44032: 0xAE8B, - 52753 - 44032: 0xAE8C, - 52754 - 44032: 0xAE8D, - 52755 - 44032: 0xAE8E, - 52756 - 44032: 0xC3F5, - 52757 - 44032: 0xAE8F, - 52758 - 44032: 0xAE90, - 52759 - 44032: 0xAE91, - 52760 - 44032: 0xAE92, - 52761 - 44032: 0xC3F6, - 52762 - 44032: 0xAE93, - 52763 - 44032: 0xAE94, - 52764 - 44032: 0xAE95, - 52765 - 44032: 0xAE96, - 52766 - 44032: 0xAE97, - 52767 - 44032: 0xAE98, - 52768 - 44032: 0xC3F7, - 52769 - 44032: 0xC3F8, - 52770 - 44032: 0xAE99, - 52771 - 44032: 0xAE9A, - 52772 - 44032: 0xC3F9, - 52773 - 44032: 0xAE9B, - 52774 - 44032: 0xAE9C, - 52775 - 44032: 0xAE9D, - 52776 - 44032: 0xC3FA, - 52777 - 44032: 0xAE9E, - 52778 - 44032: 0xAE9F, - 52779 - 44032: 0xAEA0, - 52780 - 44032: 0xAF41, - 52781 - 44032: 0xAF42, - 52782 - 44032: 0xAF43, - 52783 - 44032: 0xAF44, - 52784 - 44032: 0xC3FB, - 52785 - 44032: 0xC3FC, - 52786 - 44032: 0xAF45, - 52787 - 44032: 0xC3FD, - 52788 - 44032: 0xAF46, - 52789 - 44032: 0xC3FE, - 52790 - 44032: 0xAF47, - 52791 - 44032: 0xAF48, - 52792 - 44032: 0xAF49, - 52793 - 44032: 0xAF4A, - 52794 - 44032: 0xAF4B, - 52795 - 44032: 0xAF4C, - 52796 - 44032: 0xAF4D, - 52797 - 44032: 0xAF4E, - 52798 - 44032: 0xAF4F, - 52799 - 44032: 0xAF50, - 52800 - 44032: 0xAF51, - 52801 - 44032: 0xAF52, - 52802 - 44032: 0xAF53, - 52803 - 44032: 0xAF54, - 52804 - 44032: 0xAF55, - 52805 - 44032: 0xAF56, - 52806 - 44032: 0xAF57, - 52807 - 44032: 0xAF58, - 52808 - 44032: 0xAF59, - 52809 - 44032: 0xAF5A, - 52810 - 44032: 0xAF61, - 52811 - 44032: 0xAF62, - 52812 - 44032: 0xAF63, - 52813 - 44032: 0xAF64, - 52814 - 44032: 0xAF65, - 52815 - 44032: 0xAF66, - 52816 - 44032: 0xAF67, - 52817 - 44032: 0xAF68, - 52818 - 44032: 0xAF69, - 52819 - 44032: 0xAF6A, - 52820 - 44032: 0xAF6B, - 52821 - 44032: 0xAF6C, - 52822 - 44032: 0xAF6D, - 52823 - 44032: 0xAF6E, - 52824 - 44032: 0xC4A1, - 52825 - 44032: 0xC4A2, - 52826 - 44032: 0xAF6F, - 52827 - 44032: 0xAF70, - 52828 - 44032: 0xC4A3, - 52829 - 44032: 0xAF71, - 52830 - 44032: 0xAF72, - 52831 - 44032: 0xC4A4, - 52832 - 44032: 0xC4A5, - 52833 - 44032: 0xC4A6, - 52834 - 44032: 0xAF73, - 52835 - 44032: 0xAF74, - 52836 - 44032: 0xAF75, - 52837 - 44032: 0xAF76, - 52838 - 44032: 0xAF77, - 52839 - 44032: 0xAF78, - 52840 - 44032: 0xC4A7, - 52841 - 44032: 0xC4A8, - 52842 - 44032: 0xAF79, - 52843 - 44032: 0xC4A9, - 52844 - 44032: 0xAF7A, - 52845 - 44032: 0xC4AA, - 52846 - 44032: 0xAF81, - 52847 - 44032: 0xAF82, - 52848 - 44032: 0xAF83, - 52849 - 44032: 0xAF84, - 52850 - 44032: 0xAF85, - 52851 - 44032: 0xAF86, - 52852 - 44032: 0xC4AB, - 52853 - 44032: 0xC4AC, - 52854 - 44032: 0xAF87, - 52855 - 44032: 0xAF88, - 52856 - 44032: 0xC4AD, - 52857 - 44032: 0xAF89, - 52858 - 44032: 0xAF8A, - 52859 - 44032: 0xAF8B, - 52860 - 44032: 0xC4AE, - 52861 - 44032: 0xAF8C, - 52862 - 44032: 0xAF8D, - 52863 - 44032: 0xAF8E, - 52864 - 44032: 0xAF8F, - 52865 - 44032: 0xAF90, - 52866 - 44032: 0xAF91, - 52867 - 44032: 0xAF92, - 52868 - 44032: 0xC4AF, - 52869 - 44032: 0xC4B0, - 52870 - 44032: 0xAF93, - 52871 - 44032: 0xC4B1, - 52872 - 44032: 0xAF94, - 52873 - 44032: 0xC4B2, - 52874 - 44032: 0xAF95, - 52875 - 44032: 0xAF96, - 52876 - 44032: 0xAF97, - 52877 - 44032: 0xAF98, - 52878 - 44032: 0xAF99, - 52879 - 44032: 0xAF9A, - 52880 - 44032: 0xC4B3, - 52881 - 44032: 0xC4B4, - 52882 - 44032: 0xAF9B, - 52883 - 44032: 0xAF9C, - 52884 - 44032: 0xC4B5, - 52885 - 44032: 0xAF9D, - 52886 - 44032: 0xAF9E, - 52887 - 44032: 0xAF9F, - 52888 - 44032: 0xC4B6, - 52889 - 44032: 0xAFA0, - 52890 - 44032: 0xB041, - 52891 - 44032: 0xB042, - 52892 - 44032: 0xB043, - 52893 - 44032: 0xB044, - 52894 - 44032: 0xB045, - 52895 - 44032: 0xB046, - 52896 - 44032: 0xC4B7, - 52897 - 44032: 0xC4B8, - 52898 - 44032: 0xB047, - 52899 - 44032: 0xC4B9, - 52900 - 44032: 0xC4BA, - 52901 - 44032: 0xC4BB, - 52902 - 44032: 0xB048, - 52903 - 44032: 0xB049, - 52904 - 44032: 0xB04A, - 52905 - 44032: 0xB04B, - 52906 - 44032: 0xB04C, - 52907 - 44032: 0xB04D, - 52908 - 44032: 0xC4BC, - 52909 - 44032: 0xC4BD, - 52910 - 44032: 0xB04E, - 52911 - 44032: 0xB04F, - 52912 - 44032: 0xB050, - 52913 - 44032: 0xB051, - 52914 - 44032: 0xB052, - 52915 - 44032: 0xB053, - 52916 - 44032: 0xB054, - 52917 - 44032: 0xB055, - 52918 - 44032: 0xB056, - 52919 - 44032: 0xB057, - 52920 - 44032: 0xB058, - 52921 - 44032: 0xB059, - 52922 - 44032: 0xB05A, - 52923 - 44032: 0xB061, - 52924 - 44032: 0xB062, - 52925 - 44032: 0xB063, - 52926 - 44032: 0xB064, - 52927 - 44032: 0xB065, - 52928 - 44032: 0xB066, - 52929 - 44032: 0xC4BE, - 52930 - 44032: 0xB067, - 52931 - 44032: 0xB068, - 52932 - 44032: 0xB069, - 52933 - 44032: 0xB06A, - 52934 - 44032: 0xB06B, - 52935 - 44032: 0xB06C, - 52936 - 44032: 0xB06D, - 52937 - 44032: 0xB06E, - 52938 - 44032: 0xB06F, - 52939 - 44032: 0xB070, - 52940 - 44032: 0xB071, - 52941 - 44032: 0xB072, - 52942 - 44032: 0xB073, - 52943 - 44032: 0xB074, - 52944 - 44032: 0xB075, - 52945 - 44032: 0xB076, - 52946 - 44032: 0xB077, - 52947 - 44032: 0xB078, - 52948 - 44032: 0xB079, - 52949 - 44032: 0xB07A, - 52950 - 44032: 0xB081, - 52951 - 44032: 0xB082, - 52952 - 44032: 0xB083, - 52953 - 44032: 0xB084, - 52954 - 44032: 0xB085, - 52955 - 44032: 0xB086, - 52956 - 44032: 0xB087, - 52957 - 44032: 0xB088, - 52958 - 44032: 0xB089, - 52959 - 44032: 0xB08A, - 52960 - 44032: 0xB08B, - 52961 - 44032: 0xB08C, - 52962 - 44032: 0xB08D, - 52963 - 44032: 0xB08E, - 52964 - 44032: 0xC4BF, - 52965 - 44032: 0xC4C0, - 52966 - 44032: 0xB08F, - 52967 - 44032: 0xB090, - 52968 - 44032: 0xC4C1, - 52969 - 44032: 0xB091, - 52970 - 44032: 0xB092, - 52971 - 44032: 0xC4C2, - 52972 - 44032: 0xC4C3, - 52973 - 44032: 0xB093, - 52974 - 44032: 0xB094, - 52975 - 44032: 0xB095, - 52976 - 44032: 0xB096, - 52977 - 44032: 0xB097, - 52978 - 44032: 0xB098, - 52979 - 44032: 0xB099, - 52980 - 44032: 0xC4C4, - 52981 - 44032: 0xC4C5, - 52982 - 44032: 0xB09A, - 52983 - 44032: 0xC4C6, - 52984 - 44032: 0xC4C7, - 52985 - 44032: 0xC4C8, - 52986 - 44032: 0xB09B, - 52987 - 44032: 0xB09C, - 52988 - 44032: 0xB09D, - 52989 - 44032: 0xB09E, - 52990 - 44032: 0xB09F, - 52991 - 44032: 0xB0A0, - 52992 - 44032: 0xC4C9, - 52993 - 44032: 0xC4CA, - 52994 - 44032: 0xB141, - 52995 - 44032: 0xB142, - 52996 - 44032: 0xC4CB, - 52997 - 44032: 0xB143, - 52998 - 44032: 0xB144, - 52999 - 44032: 0xB145, - 53000 - 44032: 0xC4CC, - 53001 - 44032: 0xB146, - 53002 - 44032: 0xB147, - 53003 - 44032: 0xB148, - 53004 - 44032: 0xB149, - 53005 - 44032: 0xB14A, - 53006 - 44032: 0xB14B, - 53007 - 44032: 0xB14C, - 53008 - 44032: 0xC4CD, - 53009 - 44032: 0xC4CE, - 53010 - 44032: 0xB14D, - 53011 - 44032: 0xC4CF, - 53012 - 44032: 0xB14E, - 53013 - 44032: 0xC4D0, - 53014 - 44032: 0xB14F, - 53015 - 44032: 0xB150, - 53016 - 44032: 0xB151, - 53017 - 44032: 0xB152, - 53018 - 44032: 0xB153, - 53019 - 44032: 0xB154, - 53020 - 44032: 0xC4D1, - 53021 - 44032: 0xB155, - 53022 - 44032: 0xB156, - 53023 - 44032: 0xB157, - 53024 - 44032: 0xC4D2, - 53025 - 44032: 0xB158, - 53026 - 44032: 0xB159, - 53027 - 44032: 0xB15A, - 53028 - 44032: 0xC4D3, - 53029 - 44032: 0xB161, - 53030 - 44032: 0xB162, - 53031 - 44032: 0xB163, - 53032 - 44032: 0xB164, - 53033 - 44032: 0xB165, - 53034 - 44032: 0xB166, - 53035 - 44032: 0xB167, - 53036 - 44032: 0xC4D4, - 53037 - 44032: 0xC4D5, - 53038 - 44032: 0xB168, - 53039 - 44032: 0xC4D6, - 53040 - 44032: 0xC4D7, - 53041 - 44032: 0xC4D8, - 53042 - 44032: 0xB169, - 53043 - 44032: 0xB16A, - 53044 - 44032: 0xB16B, - 53045 - 44032: 0xB16C, - 53046 - 44032: 0xB16D, - 53047 - 44032: 0xB16E, - 53048 - 44032: 0xC4D9, - 53049 - 44032: 0xB16F, - 53050 - 44032: 0xB170, - 53051 - 44032: 0xB171, - 53052 - 44032: 0xB172, - 53053 - 44032: 0xB173, - 53054 - 44032: 0xB174, - 53055 - 44032: 0xB175, - 53056 - 44032: 0xB176, - 53057 - 44032: 0xB177, - 53058 - 44032: 0xB178, - 53059 - 44032: 0xB179, - 53060 - 44032: 0xB17A, - 53061 - 44032: 0xB181, - 53062 - 44032: 0xB182, - 53063 - 44032: 0xB183, - 53064 - 44032: 0xB184, - 53065 - 44032: 0xB185, - 53066 - 44032: 0xB186, - 53067 - 44032: 0xB187, - 53068 - 44032: 0xB188, - 53069 - 44032: 0xB189, - 53070 - 44032: 0xB18A, - 53071 - 44032: 0xB18B, - 53072 - 44032: 0xB18C, - 53073 - 44032: 0xB18D, - 53074 - 44032: 0xB18E, - 53075 - 44032: 0xB18F, - 53076 - 44032: 0xC4DA, - 53077 - 44032: 0xC4DB, - 53078 - 44032: 0xB190, - 53079 - 44032: 0xB191, - 53080 - 44032: 0xC4DC, - 53081 - 44032: 0xB192, - 53082 - 44032: 0xB193, - 53083 - 44032: 0xB194, - 53084 - 44032: 0xC4DD, - 53085 - 44032: 0xB195, - 53086 - 44032: 0xB196, - 53087 - 44032: 0xB197, - 53088 - 44032: 0xB198, - 53089 - 44032: 0xB199, - 53090 - 44032: 0xB19A, - 53091 - 44032: 0xB19B, - 53092 - 44032: 0xC4DE, - 53093 - 44032: 0xC4DF, - 53094 - 44032: 0xB19C, - 53095 - 44032: 0xC4E0, - 53096 - 44032: 0xB19D, - 53097 - 44032: 0xC4E1, - 53098 - 44032: 0xB19E, - 53099 - 44032: 0xB19F, - 53100 - 44032: 0xB1A0, - 53101 - 44032: 0xB241, - 53102 - 44032: 0xB242, - 53103 - 44032: 0xB243, - 53104 - 44032: 0xC4E2, - 53105 - 44032: 0xC4E3, - 53106 - 44032: 0xB244, - 53107 - 44032: 0xB245, - 53108 - 44032: 0xC4E4, - 53109 - 44032: 0xB246, - 53110 - 44032: 0xB247, - 53111 - 44032: 0xB248, - 53112 - 44032: 0xC4E5, - 53113 - 44032: 0xB249, - 53114 - 44032: 0xB24A, - 53115 - 44032: 0xB24B, - 53116 - 44032: 0xB24C, - 53117 - 44032: 0xB24D, - 53118 - 44032: 0xB24E, - 53119 - 44032: 0xB24F, - 53120 - 44032: 0xC4E6, - 53121 - 44032: 0xB250, - 53122 - 44032: 0xB251, - 53123 - 44032: 0xB252, - 53124 - 44032: 0xB253, - 53125 - 44032: 0xC4E7, - 53126 - 44032: 0xB254, - 53127 - 44032: 0xB255, - 53128 - 44032: 0xB256, - 53129 - 44032: 0xB257, - 53130 - 44032: 0xB258, - 53131 - 44032: 0xB259, - 53132 - 44032: 0xC4E8, - 53133 - 44032: 0xB25A, - 53134 - 44032: 0xB261, - 53135 - 44032: 0xB262, - 53136 - 44032: 0xB263, - 53137 - 44032: 0xB264, - 53138 - 44032: 0xB265, - 53139 - 44032: 0xB266, - 53140 - 44032: 0xB267, - 53141 - 44032: 0xB268, - 53142 - 44032: 0xB269, - 53143 - 44032: 0xB26A, - 53144 - 44032: 0xB26B, - 53145 - 44032: 0xB26C, - 53146 - 44032: 0xB26D, - 53147 - 44032: 0xB26E, - 53148 - 44032: 0xB26F, - 53149 - 44032: 0xB270, - 53150 - 44032: 0xB271, - 53151 - 44032: 0xB272, - 53152 - 44032: 0xB273, - 53153 - 44032: 0xC4E9, - 53154 - 44032: 0xB274, - 53155 - 44032: 0xB275, - 53156 - 44032: 0xB276, - 53157 - 44032: 0xB277, - 53158 - 44032: 0xB278, - 53159 - 44032: 0xB279, - 53160 - 44032: 0xC4EA, - 53161 - 44032: 0xB27A, - 53162 - 44032: 0xB281, - 53163 - 44032: 0xB282, - 53164 - 44032: 0xB283, - 53165 - 44032: 0xB284, - 53166 - 44032: 0xB285, - 53167 - 44032: 0xB286, - 53168 - 44032: 0xC4EB, - 53169 - 44032: 0xB287, - 53170 - 44032: 0xB288, - 53171 - 44032: 0xB289, - 53172 - 44032: 0xB28A, - 53173 - 44032: 0xB28B, - 53174 - 44032: 0xB28C, - 53175 - 44032: 0xB28D, - 53176 - 44032: 0xB28E, - 53177 - 44032: 0xB28F, - 53178 - 44032: 0xB290, - 53179 - 44032: 0xB291, - 53180 - 44032: 0xB292, - 53181 - 44032: 0xB293, - 53182 - 44032: 0xB294, - 53183 - 44032: 0xB295, - 53184 - 44032: 0xB296, - 53185 - 44032: 0xB297, - 53186 - 44032: 0xB298, - 53187 - 44032: 0xB299, - 53188 - 44032: 0xC4EC, - 53189 - 44032: 0xB29A, - 53190 - 44032: 0xB29B, - 53191 - 44032: 0xB29C, - 53192 - 44032: 0xB29D, - 53193 - 44032: 0xB29E, - 53194 - 44032: 0xB29F, - 53195 - 44032: 0xB2A0, - 53196 - 44032: 0xB341, - 53197 - 44032: 0xB342, - 53198 - 44032: 0xB343, - 53199 - 44032: 0xB344, - 53200 - 44032: 0xB345, - 53201 - 44032: 0xB346, - 53202 - 44032: 0xB347, - 53203 - 44032: 0xB348, - 53204 - 44032: 0xB349, - 53205 - 44032: 0xB34A, - 53206 - 44032: 0xB34B, - 53207 - 44032: 0xB34C, - 53208 - 44032: 0xB34D, - 53209 - 44032: 0xB34E, - 53210 - 44032: 0xB34F, - 53211 - 44032: 0xB350, - 53212 - 44032: 0xB351, - 53213 - 44032: 0xB352, - 53214 - 44032: 0xB353, - 53215 - 44032: 0xB354, - 53216 - 44032: 0xC4ED, - 53217 - 44032: 0xC4EE, - 53218 - 44032: 0xB355, - 53219 - 44032: 0xB356, - 53220 - 44032: 0xC4EF, - 53221 - 44032: 0xB357, - 53222 - 44032: 0xB358, - 53223 - 44032: 0xB359, - 53224 - 44032: 0xC4F0, - 53225 - 44032: 0xB35A, - 53226 - 44032: 0xB361, - 53227 - 44032: 0xB362, - 53228 - 44032: 0xB363, - 53229 - 44032: 0xB364, - 53230 - 44032: 0xB365, - 53231 - 44032: 0xB366, - 53232 - 44032: 0xC4F1, - 53233 - 44032: 0xC4F2, - 53234 - 44032: 0xB367, - 53235 - 44032: 0xC4F3, - 53236 - 44032: 0xB368, - 53237 - 44032: 0xC4F4, - 53238 - 44032: 0xB369, - 53239 - 44032: 0xB36A, - 53240 - 44032: 0xB36B, - 53241 - 44032: 0xB36C, - 53242 - 44032: 0xB36D, - 53243 - 44032: 0xB36E, - 53244 - 44032: 0xC4F5, - 53245 - 44032: 0xB36F, - 53246 - 44032: 0xB370, - 53247 - 44032: 0xB371, - 53248 - 44032: 0xC4F6, - 53249 - 44032: 0xB372, - 53250 - 44032: 0xB373, - 53251 - 44032: 0xB374, - 53252 - 44032: 0xC4F7, - 53253 - 44032: 0xB375, - 53254 - 44032: 0xB376, - 53255 - 44032: 0xB377, - 53256 - 44032: 0xB378, - 53257 - 44032: 0xB379, - 53258 - 44032: 0xB37A, - 53259 - 44032: 0xB381, - 53260 - 44032: 0xB382, - 53261 - 44032: 0xB383, - 53262 - 44032: 0xB384, - 53263 - 44032: 0xB385, - 53264 - 44032: 0xB386, - 53265 - 44032: 0xC4F8, - 53266 - 44032: 0xB387, - 53267 - 44032: 0xB388, - 53268 - 44032: 0xB389, - 53269 - 44032: 0xB38A, - 53270 - 44032: 0xB38B, - 53271 - 44032: 0xB38C, - 53272 - 44032: 0xC4F9, - 53273 - 44032: 0xB38D, - 53274 - 44032: 0xB38E, - 53275 - 44032: 0xB38F, - 53276 - 44032: 0xB390, - 53277 - 44032: 0xB391, - 53278 - 44032: 0xB392, - 53279 - 44032: 0xB393, - 53280 - 44032: 0xB394, - 53281 - 44032: 0xB395, - 53282 - 44032: 0xB396, - 53283 - 44032: 0xB397, - 53284 - 44032: 0xB398, - 53285 - 44032: 0xB399, - 53286 - 44032: 0xB39A, - 53287 - 44032: 0xB39B, - 53288 - 44032: 0xB39C, - 53289 - 44032: 0xB39D, - 53290 - 44032: 0xB39E, - 53291 - 44032: 0xB39F, - 53292 - 44032: 0xB3A0, - 53293 - 44032: 0xC4FA, - 53294 - 44032: 0xB441, - 53295 - 44032: 0xB442, - 53296 - 44032: 0xB443, - 53297 - 44032: 0xB444, - 53298 - 44032: 0xB445, - 53299 - 44032: 0xB446, - 53300 - 44032: 0xC4FB, - 53301 - 44032: 0xC4FC, - 53302 - 44032: 0xB447, - 53303 - 44032: 0xB448, - 53304 - 44032: 0xC4FD, - 53305 - 44032: 0xB449, - 53306 - 44032: 0xB44A, - 53307 - 44032: 0xB44B, - 53308 - 44032: 0xC4FE, - 53309 - 44032: 0xB44C, - 53310 - 44032: 0xB44D, - 53311 - 44032: 0xB44E, - 53312 - 44032: 0xB44F, - 53313 - 44032: 0xB450, - 53314 - 44032: 0xB451, - 53315 - 44032: 0xB452, - 53316 - 44032: 0xC5A1, - 53317 - 44032: 0xC5A2, - 53318 - 44032: 0xB453, - 53319 - 44032: 0xC5A3, - 53320 - 44032: 0xB454, - 53321 - 44032: 0xC5A4, - 53322 - 44032: 0xB455, - 53323 - 44032: 0xB456, - 53324 - 44032: 0xB457, - 53325 - 44032: 0xB458, - 53326 - 44032: 0xB459, - 53327 - 44032: 0xB45A, - 53328 - 44032: 0xC5A5, - 53329 - 44032: 0xB461, - 53330 - 44032: 0xB462, - 53331 - 44032: 0xB463, - 53332 - 44032: 0xC5A6, - 53333 - 44032: 0xB464, - 53334 - 44032: 0xB465, - 53335 - 44032: 0xB466, - 53336 - 44032: 0xC5A7, - 53337 - 44032: 0xB467, - 53338 - 44032: 0xB468, - 53339 - 44032: 0xB469, - 53340 - 44032: 0xB46A, - 53341 - 44032: 0xB46B, - 53342 - 44032: 0xB46C, - 53343 - 44032: 0xB46D, - 53344 - 44032: 0xC5A8, - 53345 - 44032: 0xB46E, - 53346 - 44032: 0xB46F, - 53347 - 44032: 0xB470, - 53348 - 44032: 0xB471, - 53349 - 44032: 0xB472, - 53350 - 44032: 0xB473, - 53351 - 44032: 0xB474, - 53352 - 44032: 0xB475, - 53353 - 44032: 0xB476, - 53354 - 44032: 0xB477, - 53355 - 44032: 0xB478, - 53356 - 44032: 0xC5A9, - 53357 - 44032: 0xC5AA, - 53358 - 44032: 0xB479, - 53359 - 44032: 0xB47A, - 53360 - 44032: 0xC5AB, - 53361 - 44032: 0xB481, - 53362 - 44032: 0xB482, - 53363 - 44032: 0xB483, - 53364 - 44032: 0xC5AC, - 53365 - 44032: 0xB484, - 53366 - 44032: 0xB485, - 53367 - 44032: 0xB486, - 53368 - 44032: 0xB487, - 53369 - 44032: 0xB488, - 53370 - 44032: 0xB489, - 53371 - 44032: 0xB48A, - 53372 - 44032: 0xC5AD, - 53373 - 44032: 0xC5AE, - 53374 - 44032: 0xB48B, - 53375 - 44032: 0xB48C, - 53376 - 44032: 0xB48D, - 53377 - 44032: 0xC5AF, - 53378 - 44032: 0xB48E, - 53379 - 44032: 0xB48F, - 53380 - 44032: 0xB490, - 53381 - 44032: 0xB491, - 53382 - 44032: 0xB492, - 53383 - 44032: 0xB493, - 53384 - 44032: 0xB494, - 53385 - 44032: 0xB495, - 53386 - 44032: 0xB496, - 53387 - 44032: 0xB497, - 53388 - 44032: 0xB498, - 53389 - 44032: 0xB499, - 53390 - 44032: 0xB49A, - 53391 - 44032: 0xB49B, - 53392 - 44032: 0xB49C, - 53393 - 44032: 0xB49D, - 53394 - 44032: 0xB49E, - 53395 - 44032: 0xB49F, - 53396 - 44032: 0xB4A0, - 53397 - 44032: 0xB541, - 53398 - 44032: 0xB542, - 53399 - 44032: 0xB543, - 53400 - 44032: 0xB544, - 53401 - 44032: 0xB545, - 53402 - 44032: 0xB546, - 53403 - 44032: 0xB547, - 53404 - 44032: 0xB548, - 53405 - 44032: 0xB549, - 53406 - 44032: 0xB54A, - 53407 - 44032: 0xB54B, - 53408 - 44032: 0xB54C, - 53409 - 44032: 0xB54D, - 53410 - 44032: 0xB54E, - 53411 - 44032: 0xB54F, - 53412 - 44032: 0xC5B0, - 53413 - 44032: 0xC5B1, - 53414 - 44032: 0xB550, - 53415 - 44032: 0xB551, - 53416 - 44032: 0xC5B2, - 53417 - 44032: 0xB552, - 53418 - 44032: 0xB553, - 53419 - 44032: 0xB554, - 53420 - 44032: 0xC5B3, - 53421 - 44032: 0xB555, - 53422 - 44032: 0xB556, - 53423 - 44032: 0xB557, - 53424 - 44032: 0xB558, - 53425 - 44032: 0xB559, - 53426 - 44032: 0xB55A, - 53427 - 44032: 0xB561, - 53428 - 44032: 0xC5B4, - 53429 - 44032: 0xC5B5, - 53430 - 44032: 0xB562, - 53431 - 44032: 0xC5B6, - 53432 - 44032: 0xB563, - 53433 - 44032: 0xC5B7, - 53434 - 44032: 0xB564, - 53435 - 44032: 0xB565, - 53436 - 44032: 0xB566, - 53437 - 44032: 0xB567, - 53438 - 44032: 0xB568, - 53439 - 44032: 0xB569, - 53440 - 44032: 0xC5B8, - 53441 - 44032: 0xC5B9, - 53442 - 44032: 0xB56A, - 53443 - 44032: 0xB56B, - 53444 - 44032: 0xC5BA, - 53445 - 44032: 0xB56C, - 53446 - 44032: 0xB56D, - 53447 - 44032: 0xB56E, - 53448 - 44032: 0xC5BB, - 53449 - 44032: 0xC5BC, - 53450 - 44032: 0xB56F, - 53451 - 44032: 0xB570, - 53452 - 44032: 0xB571, - 53453 - 44032: 0xB572, - 53454 - 44032: 0xB573, - 53455 - 44032: 0xB574, - 53456 - 44032: 0xC5BD, - 53457 - 44032: 0xC5BE, - 53458 - 44032: 0xB575, - 53459 - 44032: 0xC5BF, - 53460 - 44032: 0xC5C0, - 53461 - 44032: 0xC5C1, - 53462 - 44032: 0xB576, - 53463 - 44032: 0xB577, - 53464 - 44032: 0xB578, - 53465 - 44032: 0xB579, - 53466 - 44032: 0xB57A, - 53467 - 44032: 0xB581, - 53468 - 44032: 0xC5C2, - 53469 - 44032: 0xC5C3, - 53470 - 44032: 0xB582, - 53471 - 44032: 0xB583, - 53472 - 44032: 0xC5C4, - 53473 - 44032: 0xB584, - 53474 - 44032: 0xB585, - 53475 - 44032: 0xB586, - 53476 - 44032: 0xC5C5, - 53477 - 44032: 0xB587, - 53478 - 44032: 0xB588, - 53479 - 44032: 0xB589, - 53480 - 44032: 0xB58A, - 53481 - 44032: 0xB58B, - 53482 - 44032: 0xB58C, - 53483 - 44032: 0xB58D, - 53484 - 44032: 0xC5C6, - 53485 - 44032: 0xC5C7, - 53486 - 44032: 0xB58E, - 53487 - 44032: 0xC5C8, - 53488 - 44032: 0xC5C9, - 53489 - 44032: 0xC5CA, - 53490 - 44032: 0xB58F, - 53491 - 44032: 0xB590, - 53492 - 44032: 0xB591, - 53493 - 44032: 0xB592, - 53494 - 44032: 0xB593, - 53495 - 44032: 0xB594, - 53496 - 44032: 0xC5CB, - 53497 - 44032: 0xB595, - 53498 - 44032: 0xB596, - 53499 - 44032: 0xB597, - 53500 - 44032: 0xB598, - 53501 - 44032: 0xB599, - 53502 - 44032: 0xB59A, - 53503 - 44032: 0xB59B, - 53504 - 44032: 0xB59C, - 53505 - 44032: 0xB59D, - 53506 - 44032: 0xB59E, - 53507 - 44032: 0xB59F, - 53508 - 44032: 0xB5A0, - 53509 - 44032: 0xB641, - 53510 - 44032: 0xB642, - 53511 - 44032: 0xB643, - 53512 - 44032: 0xB644, - 53513 - 44032: 0xB645, - 53514 - 44032: 0xB646, - 53515 - 44032: 0xB647, - 53516 - 44032: 0xB648, - 53517 - 44032: 0xC5CC, - 53518 - 44032: 0xB649, - 53519 - 44032: 0xB64A, - 53520 - 44032: 0xB64B, - 53521 - 44032: 0xB64C, - 53522 - 44032: 0xB64D, - 53523 - 44032: 0xB64E, - 53524 - 44032: 0xB64F, - 53525 - 44032: 0xB650, - 53526 - 44032: 0xB651, - 53527 - 44032: 0xB652, - 53528 - 44032: 0xB653, - 53529 - 44032: 0xB654, - 53530 - 44032: 0xB655, - 53531 - 44032: 0xB656, - 53532 - 44032: 0xB657, - 53533 - 44032: 0xB658, - 53534 - 44032: 0xB659, - 53535 - 44032: 0xB65A, - 53536 - 44032: 0xB661, - 53537 - 44032: 0xB662, - 53538 - 44032: 0xB663, - 53539 - 44032: 0xB664, - 53540 - 44032: 0xB665, - 53541 - 44032: 0xB666, - 53542 - 44032: 0xB667, - 53543 - 44032: 0xB668, - 53544 - 44032: 0xB669, - 53545 - 44032: 0xB66A, - 53546 - 44032: 0xB66B, - 53547 - 44032: 0xB66C, - 53548 - 44032: 0xB66D, - 53549 - 44032: 0xB66E, - 53550 - 44032: 0xB66F, - 53551 - 44032: 0xB670, - 53552 - 44032: 0xC5CD, - 53553 - 44032: 0xC5CE, - 53554 - 44032: 0xB671, - 53555 - 44032: 0xB672, - 53556 - 44032: 0xC5CF, - 53557 - 44032: 0xB673, - 53558 - 44032: 0xB674, - 53559 - 44032: 0xB675, - 53560 - 44032: 0xC5D0, - 53561 - 44032: 0xB676, - 53562 - 44032: 0xC5D1, - 53563 - 44032: 0xB677, - 53564 - 44032: 0xB678, - 53565 - 44032: 0xB679, - 53566 - 44032: 0xB67A, - 53567 - 44032: 0xB681, - 53568 - 44032: 0xC5D2, - 53569 - 44032: 0xC5D3, - 53570 - 44032: 0xB682, - 53571 - 44032: 0xC5D4, - 53572 - 44032: 0xC5D5, - 53573 - 44032: 0xC5D6, - 53574 - 44032: 0xB683, - 53575 - 44032: 0xB684, - 53576 - 44032: 0xB685, - 53577 - 44032: 0xB686, - 53578 - 44032: 0xB687, - 53579 - 44032: 0xB688, - 53580 - 44032: 0xC5D7, - 53581 - 44032: 0xC5D8, - 53582 - 44032: 0xB689, - 53583 - 44032: 0xB68A, - 53584 - 44032: 0xC5D9, - 53585 - 44032: 0xB68B, - 53586 - 44032: 0xB68C, - 53587 - 44032: 0xB68D, - 53588 - 44032: 0xC5DA, - 53589 - 44032: 0xB68E, - 53590 - 44032: 0xB68F, - 53591 - 44032: 0xB690, - 53592 - 44032: 0xB691, - 53593 - 44032: 0xB692, - 53594 - 44032: 0xB693, - 53595 - 44032: 0xB694, - 53596 - 44032: 0xC5DB, - 53597 - 44032: 0xC5DC, - 53598 - 44032: 0xB695, - 53599 - 44032: 0xC5DD, - 53600 - 44032: 0xB696, - 53601 - 44032: 0xC5DE, - 53602 - 44032: 0xB697, - 53603 - 44032: 0xB698, - 53604 - 44032: 0xB699, - 53605 - 44032: 0xB69A, - 53606 - 44032: 0xB69B, - 53607 - 44032: 0xB69C, - 53608 - 44032: 0xC5DF, - 53609 - 44032: 0xB69D, - 53610 - 44032: 0xB69E, - 53611 - 44032: 0xB69F, - 53612 - 44032: 0xC5E0, - 53613 - 44032: 0xB6A0, - 53614 - 44032: 0xB741, - 53615 - 44032: 0xB742, - 53616 - 44032: 0xB743, - 53617 - 44032: 0xB744, - 53618 - 44032: 0xB745, - 53619 - 44032: 0xB746, - 53620 - 44032: 0xB747, - 53621 - 44032: 0xB748, - 53622 - 44032: 0xB749, - 53623 - 44032: 0xB74A, - 53624 - 44032: 0xB74B, - 53625 - 44032: 0xB74C, - 53626 - 44032: 0xB74D, - 53627 - 44032: 0xB74E, - 53628 - 44032: 0xC5E1, - 53629 - 44032: 0xB74F, - 53630 - 44032: 0xB750, - 53631 - 44032: 0xB751, - 53632 - 44032: 0xB752, - 53633 - 44032: 0xB753, - 53634 - 44032: 0xB754, - 53635 - 44032: 0xB755, - 53636 - 44032: 0xC5E2, - 53637 - 44032: 0xB756, - 53638 - 44032: 0xB757, - 53639 - 44032: 0xB758, - 53640 - 44032: 0xC5E3, - 53641 - 44032: 0xB759, - 53642 - 44032: 0xB75A, - 53643 - 44032: 0xB761, - 53644 - 44032: 0xB762, - 53645 - 44032: 0xB763, - 53646 - 44032: 0xB764, - 53647 - 44032: 0xB765, - 53648 - 44032: 0xB766, - 53649 - 44032: 0xB767, - 53650 - 44032: 0xB768, - 53651 - 44032: 0xB769, - 53652 - 44032: 0xB76A, - 53653 - 44032: 0xB76B, - 53654 - 44032: 0xB76C, - 53655 - 44032: 0xB76D, - 53656 - 44032: 0xB76E, - 53657 - 44032: 0xB76F, - 53658 - 44032: 0xB770, - 53659 - 44032: 0xB771, - 53660 - 44032: 0xB772, - 53661 - 44032: 0xB773, - 53662 - 44032: 0xB774, - 53663 - 44032: 0xB775, - 53664 - 44032: 0xC5E4, - 53665 - 44032: 0xC5E5, - 53666 - 44032: 0xB776, - 53667 - 44032: 0xB777, - 53668 - 44032: 0xC5E6, - 53669 - 44032: 0xB778, - 53670 - 44032: 0xB779, - 53671 - 44032: 0xB77A, - 53672 - 44032: 0xC5E7, - 53673 - 44032: 0xB781, - 53674 - 44032: 0xB782, - 53675 - 44032: 0xB783, - 53676 - 44032: 0xB784, - 53677 - 44032: 0xB785, - 53678 - 44032: 0xB786, - 53679 - 44032: 0xB787, - 53680 - 44032: 0xC5E8, - 53681 - 44032: 0xC5E9, - 53682 - 44032: 0xB788, - 53683 - 44032: 0xC5EA, - 53684 - 44032: 0xB789, - 53685 - 44032: 0xC5EB, - 53686 - 44032: 0xB78A, - 53687 - 44032: 0xB78B, - 53688 - 44032: 0xB78C, - 53689 - 44032: 0xB78D, - 53690 - 44032: 0xC5EC, - 53691 - 44032: 0xB78E, - 53692 - 44032: 0xC5ED, - 53693 - 44032: 0xB78F, - 53694 - 44032: 0xB790, - 53695 - 44032: 0xB791, - 53696 - 44032: 0xC5EE, - 53697 - 44032: 0xB792, - 53698 - 44032: 0xB793, - 53699 - 44032: 0xB794, - 53700 - 44032: 0xB795, - 53701 - 44032: 0xB796, - 53702 - 44032: 0xB797, - 53703 - 44032: 0xB798, - 53704 - 44032: 0xB799, - 53705 - 44032: 0xB79A, - 53706 - 44032: 0xB79B, - 53707 - 44032: 0xB79C, - 53708 - 44032: 0xB79D, - 53709 - 44032: 0xB79E, - 53710 - 44032: 0xB79F, - 53711 - 44032: 0xB7A0, - 53712 - 44032: 0xB841, - 53713 - 44032: 0xB842, - 53714 - 44032: 0xB843, - 53715 - 44032: 0xB844, - 53716 - 44032: 0xB845, - 53717 - 44032: 0xB846, - 53718 - 44032: 0xB847, - 53719 - 44032: 0xB848, - 53720 - 44032: 0xC5EF, - 53721 - 44032: 0xB849, - 53722 - 44032: 0xB84A, - 53723 - 44032: 0xB84B, - 53724 - 44032: 0xB84C, - 53725 - 44032: 0xB84D, - 53726 - 44032: 0xB84E, - 53727 - 44032: 0xB84F, - 53728 - 44032: 0xB850, - 53729 - 44032: 0xB851, - 53730 - 44032: 0xB852, - 53731 - 44032: 0xB853, - 53732 - 44032: 0xB854, - 53733 - 44032: 0xB855, - 53734 - 44032: 0xB856, - 53735 - 44032: 0xB857, - 53736 - 44032: 0xB858, - 53737 - 44032: 0xB859, - 53738 - 44032: 0xB85A, - 53739 - 44032: 0xB861, - 53740 - 44032: 0xB862, - 53741 - 44032: 0xB863, - 53742 - 44032: 0xB864, - 53743 - 44032: 0xB865, - 53744 - 44032: 0xB866, - 53745 - 44032: 0xB867, - 53746 - 44032: 0xB868, - 53747 - 44032: 0xB869, - 53748 - 44032: 0xC5F0, - 53749 - 44032: 0xB86A, - 53750 - 44032: 0xB86B, - 53751 - 44032: 0xB86C, - 53752 - 44032: 0xC5F1, - 53753 - 44032: 0xB86D, - 53754 - 44032: 0xB86E, - 53755 - 44032: 0xB86F, - 53756 - 44032: 0xB870, - 53757 - 44032: 0xB871, - 53758 - 44032: 0xB872, - 53759 - 44032: 0xB873, - 53760 - 44032: 0xB874, - 53761 - 44032: 0xB875, - 53762 - 44032: 0xB876, - 53763 - 44032: 0xB877, - 53764 - 44032: 0xB878, - 53765 - 44032: 0xB879, - 53766 - 44032: 0xB87A, - 53767 - 44032: 0xC5F2, - 53768 - 44032: 0xB881, - 53769 - 44032: 0xC5F3, - 53770 - 44032: 0xB882, - 53771 - 44032: 0xB883, - 53772 - 44032: 0xB884, - 53773 - 44032: 0xB885, - 53774 - 44032: 0xB886, - 53775 - 44032: 0xB887, - 53776 - 44032: 0xC5F4, - 53777 - 44032: 0xB888, - 53778 - 44032: 0xB889, - 53779 - 44032: 0xB88A, - 53780 - 44032: 0xB88B, - 53781 - 44032: 0xB88C, - 53782 - 44032: 0xB88D, - 53783 - 44032: 0xB88E, - 53784 - 44032: 0xB88F, - 53785 - 44032: 0xB890, - 53786 - 44032: 0xB891, - 53787 - 44032: 0xB892, - 53788 - 44032: 0xB893, - 53789 - 44032: 0xB894, - 53790 - 44032: 0xB895, - 53791 - 44032: 0xB896, - 53792 - 44032: 0xB897, - 53793 - 44032: 0xB898, - 53794 - 44032: 0xB899, - 53795 - 44032: 0xB89A, - 53796 - 44032: 0xB89B, - 53797 - 44032: 0xB89C, - 53798 - 44032: 0xB89D, - 53799 - 44032: 0xB89E, - 53800 - 44032: 0xB89F, - 53801 - 44032: 0xB8A0, - 53802 - 44032: 0xB941, - 53803 - 44032: 0xB942, - 53804 - 44032: 0xC5F5, - 53805 - 44032: 0xC5F6, - 53806 - 44032: 0xB943, - 53807 - 44032: 0xB944, - 53808 - 44032: 0xC5F7, - 53809 - 44032: 0xB945, - 53810 - 44032: 0xB946, - 53811 - 44032: 0xB947, - 53812 - 44032: 0xC5F8, - 53813 - 44032: 0xB948, - 53814 - 44032: 0xB949, - 53815 - 44032: 0xB94A, - 53816 - 44032: 0xB94B, - 53817 - 44032: 0xB94C, - 53818 - 44032: 0xB94D, - 53819 - 44032: 0xB94E, - 53820 - 44032: 0xC5F9, - 53821 - 44032: 0xC5FA, - 53822 - 44032: 0xB94F, - 53823 - 44032: 0xC5FB, - 53824 - 44032: 0xB950, - 53825 - 44032: 0xC5FC, - 53826 - 44032: 0xB951, - 53827 - 44032: 0xB952, - 53828 - 44032: 0xB953, - 53829 - 44032: 0xB954, - 53830 - 44032: 0xB955, - 53831 - 44032: 0xB956, - 53832 - 44032: 0xC5FD, - 53833 - 44032: 0xB957, - 53834 - 44032: 0xB958, - 53835 - 44032: 0xB959, - 53836 - 44032: 0xB95A, - 53837 - 44032: 0xB961, - 53838 - 44032: 0xB962, - 53839 - 44032: 0xB963, - 53840 - 44032: 0xB964, - 53841 - 44032: 0xB965, - 53842 - 44032: 0xB966, - 53843 - 44032: 0xB967, - 53844 - 44032: 0xB968, - 53845 - 44032: 0xB969, - 53846 - 44032: 0xB96A, - 53847 - 44032: 0xB96B, - 53848 - 44032: 0xB96C, - 53849 - 44032: 0xB96D, - 53850 - 44032: 0xB96E, - 53851 - 44032: 0xB96F, - 53852 - 44032: 0xC5FE, - 53853 - 44032: 0xB970, - 53854 - 44032: 0xB971, - 53855 - 44032: 0xB972, - 53856 - 44032: 0xB973, - 53857 - 44032: 0xB974, - 53858 - 44032: 0xB975, - 53859 - 44032: 0xB976, - 53860 - 44032: 0xC6A1, - 53861 - 44032: 0xB977, - 53862 - 44032: 0xB978, - 53863 - 44032: 0xB979, - 53864 - 44032: 0xB97A, - 53865 - 44032: 0xB981, - 53866 - 44032: 0xB982, - 53867 - 44032: 0xB983, - 53868 - 44032: 0xB984, - 53869 - 44032: 0xB985, - 53870 - 44032: 0xB986, - 53871 - 44032: 0xB987, - 53872 - 44032: 0xB988, - 53873 - 44032: 0xB989, - 53874 - 44032: 0xB98A, - 53875 - 44032: 0xB98B, - 53876 - 44032: 0xB98C, - 53877 - 44032: 0xB98D, - 53878 - 44032: 0xB98E, - 53879 - 44032: 0xB98F, - 53880 - 44032: 0xB990, - 53881 - 44032: 0xB991, - 53882 - 44032: 0xB992, - 53883 - 44032: 0xB993, - 53884 - 44032: 0xB994, - 53885 - 44032: 0xB995, - 53886 - 44032: 0xB996, - 53887 - 44032: 0xB997, - 53888 - 44032: 0xC6A2, - 53889 - 44032: 0xC6A3, - 53890 - 44032: 0xB998, - 53891 - 44032: 0xB999, - 53892 - 44032: 0xC6A4, - 53893 - 44032: 0xB99A, - 53894 - 44032: 0xB99B, - 53895 - 44032: 0xB99C, - 53896 - 44032: 0xC6A5, - 53897 - 44032: 0xB99D, - 53898 - 44032: 0xB99E, - 53899 - 44032: 0xB99F, - 53900 - 44032: 0xB9A0, - 53901 - 44032: 0xBA41, - 53902 - 44032: 0xBA42, - 53903 - 44032: 0xBA43, - 53904 - 44032: 0xC6A6, - 53905 - 44032: 0xC6A7, - 53906 - 44032: 0xBA44, - 53907 - 44032: 0xBA45, - 53908 - 44032: 0xBA46, - 53909 - 44032: 0xC6A8, - 53910 - 44032: 0xBA47, - 53911 - 44032: 0xBA48, - 53912 - 44032: 0xBA49, - 53913 - 44032: 0xBA4A, - 53914 - 44032: 0xBA4B, - 53915 - 44032: 0xBA4C, - 53916 - 44032: 0xC6A9, - 53917 - 44032: 0xBA4D, - 53918 - 44032: 0xBA4E, - 53919 - 44032: 0xBA4F, - 53920 - 44032: 0xC6AA, - 53921 - 44032: 0xBA50, - 53922 - 44032: 0xBA51, - 53923 - 44032: 0xBA52, - 53924 - 44032: 0xC6AB, - 53925 - 44032: 0xBA53, - 53926 - 44032: 0xBA54, - 53927 - 44032: 0xBA55, - 53928 - 44032: 0xBA56, - 53929 - 44032: 0xBA57, - 53930 - 44032: 0xBA58, - 53931 - 44032: 0xBA59, - 53932 - 44032: 0xC6AC, - 53933 - 44032: 0xBA5A, - 53934 - 44032: 0xBA61, - 53935 - 44032: 0xBA62, - 53936 - 44032: 0xBA63, - 53937 - 44032: 0xC6AD, - 53938 - 44032: 0xBA64, - 53939 - 44032: 0xBA65, - 53940 - 44032: 0xBA66, - 53941 - 44032: 0xBA67, - 53942 - 44032: 0xBA68, - 53943 - 44032: 0xBA69, - 53944 - 44032: 0xC6AE, - 53945 - 44032: 0xC6AF, - 53946 - 44032: 0xBA6A, - 53947 - 44032: 0xBA6B, - 53948 - 44032: 0xC6B0, - 53949 - 44032: 0xBA6C, - 53950 - 44032: 0xBA6D, - 53951 - 44032: 0xC6B1, - 53952 - 44032: 0xC6B2, - 53953 - 44032: 0xBA6E, - 53954 - 44032: 0xC6B3, - 53955 - 44032: 0xBA6F, - 53956 - 44032: 0xBA70, - 53957 - 44032: 0xBA71, - 53958 - 44032: 0xBA72, - 53959 - 44032: 0xBA73, - 53960 - 44032: 0xC6B4, - 53961 - 44032: 0xC6B5, - 53962 - 44032: 0xBA74, - 53963 - 44032: 0xC6B6, - 53964 - 44032: 0xBA75, - 53965 - 44032: 0xBA76, - 53966 - 44032: 0xBA77, - 53967 - 44032: 0xBA78, - 53968 - 44032: 0xBA79, - 53969 - 44032: 0xBA7A, - 53970 - 44032: 0xBA81, - 53971 - 44032: 0xBA82, - 53972 - 44032: 0xC6B7, - 53973 - 44032: 0xBA83, - 53974 - 44032: 0xBA84, - 53975 - 44032: 0xBA85, - 53976 - 44032: 0xC6B8, - 53977 - 44032: 0xBA86, - 53978 - 44032: 0xBA87, - 53979 - 44032: 0xBA88, - 53980 - 44032: 0xC6B9, - 53981 - 44032: 0xBA89, - 53982 - 44032: 0xBA8A, - 53983 - 44032: 0xBA8B, - 53984 - 44032: 0xBA8C, - 53985 - 44032: 0xBA8D, - 53986 - 44032: 0xBA8E, - 53987 - 44032: 0xBA8F, - 53988 - 44032: 0xC6BA, - 53989 - 44032: 0xC6BB, - 53990 - 44032: 0xBA90, - 53991 - 44032: 0xBA91, - 53992 - 44032: 0xBA92, - 53993 - 44032: 0xBA93, - 53994 - 44032: 0xBA94, - 53995 - 44032: 0xBA95, - 53996 - 44032: 0xBA96, - 53997 - 44032: 0xBA97, - 53998 - 44032: 0xBA98, - 53999 - 44032: 0xBA99, - 54000 - 44032: 0xC6BC, - 54001 - 44032: 0xC6BD, - 54002 - 44032: 0xBA9A, - 54003 - 44032: 0xBA9B, - 54004 - 44032: 0xC6BE, - 54005 - 44032: 0xBA9C, - 54006 - 44032: 0xBA9D, - 54007 - 44032: 0xBA9E, - 54008 - 44032: 0xC6BF, - 54009 - 44032: 0xBA9F, - 54010 - 44032: 0xBAA0, - 54011 - 44032: 0xBB41, - 54012 - 44032: 0xBB42, - 54013 - 44032: 0xBB43, - 54014 - 44032: 0xBB44, - 54015 - 44032: 0xBB45, - 54016 - 44032: 0xC6C0, - 54017 - 44032: 0xC6C1, - 54018 - 44032: 0xBB46, - 54019 - 44032: 0xC6C2, - 54020 - 44032: 0xBB47, - 54021 - 44032: 0xC6C3, - 54022 - 44032: 0xBB48, - 54023 - 44032: 0xBB49, - 54024 - 44032: 0xBB4A, - 54025 - 44032: 0xBB4B, - 54026 - 44032: 0xBB4C, - 54027 - 44032: 0xBB4D, - 54028 - 44032: 0xC6C4, - 54029 - 44032: 0xC6C5, - 54030 - 44032: 0xC6C6, - 54031 - 44032: 0xBB4E, - 54032 - 44032: 0xC6C7, - 54033 - 44032: 0xBB4F, - 54034 - 44032: 0xBB50, - 54035 - 44032: 0xBB51, - 54036 - 44032: 0xC6C8, - 54037 - 44032: 0xBB52, - 54038 - 44032: 0xC6C9, - 54039 - 44032: 0xBB53, - 54040 - 44032: 0xBB54, - 54041 - 44032: 0xBB55, - 54042 - 44032: 0xBB56, - 54043 - 44032: 0xBB57, - 54044 - 44032: 0xC6CA, - 54045 - 44032: 0xC6CB, - 54046 - 44032: 0xBB58, - 54047 - 44032: 0xC6CC, - 54048 - 44032: 0xC6CD, - 54049 - 44032: 0xC6CE, - 54050 - 44032: 0xBB59, - 54051 - 44032: 0xBB5A, - 54052 - 44032: 0xBB61, - 54053 - 44032: 0xC6CF, - 54054 - 44032: 0xBB62, - 54055 - 44032: 0xBB63, - 54056 - 44032: 0xC6D0, - 54057 - 44032: 0xC6D1, - 54058 - 44032: 0xBB64, - 54059 - 44032: 0xBB65, - 54060 - 44032: 0xC6D2, - 54061 - 44032: 0xBB66, - 54062 - 44032: 0xBB67, - 54063 - 44032: 0xBB68, - 54064 - 44032: 0xC6D3, - 54065 - 44032: 0xBB69, - 54066 - 44032: 0xBB6A, - 54067 - 44032: 0xBB6B, - 54068 - 44032: 0xBB6C, - 54069 - 44032: 0xBB6D, - 54070 - 44032: 0xBB6E, - 54071 - 44032: 0xBB6F, - 54072 - 44032: 0xC6D4, - 54073 - 44032: 0xC6D5, - 54074 - 44032: 0xBB70, - 54075 - 44032: 0xC6D6, - 54076 - 44032: 0xC6D7, - 54077 - 44032: 0xC6D8, - 54078 - 44032: 0xBB71, - 54079 - 44032: 0xBB72, - 54080 - 44032: 0xBB73, - 54081 - 44032: 0xBB74, - 54082 - 44032: 0xBB75, - 54083 - 44032: 0xBB76, - 54084 - 44032: 0xC6D9, - 54085 - 44032: 0xC6DA, - 54086 - 44032: 0xBB77, - 54087 - 44032: 0xBB78, - 54088 - 44032: 0xBB79, - 54089 - 44032: 0xBB7A, - 54090 - 44032: 0xBB81, - 54091 - 44032: 0xBB82, - 54092 - 44032: 0xBB83, - 54093 - 44032: 0xBB84, - 54094 - 44032: 0xBB85, - 54095 - 44032: 0xBB86, - 54096 - 44032: 0xBB87, - 54097 - 44032: 0xBB88, - 54098 - 44032: 0xBB89, - 54099 - 44032: 0xBB8A, - 54100 - 44032: 0xBB8B, - 54101 - 44032: 0xBB8C, - 54102 - 44032: 0xBB8D, - 54103 - 44032: 0xBB8E, - 54104 - 44032: 0xBB8F, - 54105 - 44032: 0xBB90, - 54106 - 44032: 0xBB91, - 54107 - 44032: 0xBB92, - 54108 - 44032: 0xBB93, - 54109 - 44032: 0xBB94, - 54110 - 44032: 0xBB95, - 54111 - 44032: 0xBB96, - 54112 - 44032: 0xBB97, - 54113 - 44032: 0xBB98, - 54114 - 44032: 0xBB99, - 54115 - 44032: 0xBB9A, - 54116 - 44032: 0xBB9B, - 54117 - 44032: 0xBB9C, - 54118 - 44032: 0xBB9D, - 54119 - 44032: 0xBB9E, - 54120 - 44032: 0xBB9F, - 54121 - 44032: 0xBBA0, - 54122 - 44032: 0xBC41, - 54123 - 44032: 0xBC42, - 54124 - 44032: 0xBC43, - 54125 - 44032: 0xBC44, - 54126 - 44032: 0xBC45, - 54127 - 44032: 0xBC46, - 54128 - 44032: 0xBC47, - 54129 - 44032: 0xBC48, - 54130 - 44032: 0xBC49, - 54131 - 44032: 0xBC4A, - 54132 - 44032: 0xBC4B, - 54133 - 44032: 0xBC4C, - 54134 - 44032: 0xBC4D, - 54135 - 44032: 0xBC4E, - 54136 - 44032: 0xBC4F, - 54137 - 44032: 0xBC50, - 54138 - 44032: 0xBC51, - 54139 - 44032: 0xBC52, - 54140 - 44032: 0xC6DB, - 54141 - 44032: 0xC6DC, - 54142 - 44032: 0xBC53, - 54143 - 44032: 0xBC54, - 54144 - 44032: 0xC6DD, - 54145 - 44032: 0xBC55, - 54146 - 44032: 0xBC56, - 54147 - 44032: 0xBC57, - 54148 - 44032: 0xC6DE, - 54149 - 44032: 0xBC58, - 54150 - 44032: 0xBC59, - 54151 - 44032: 0xBC5A, - 54152 - 44032: 0xBC61, - 54153 - 44032: 0xBC62, - 54154 - 44032: 0xBC63, - 54155 - 44032: 0xBC64, - 54156 - 44032: 0xC6DF, - 54157 - 44032: 0xC6E0, - 54158 - 44032: 0xBC65, - 54159 - 44032: 0xC6E1, - 54160 - 44032: 0xC6E2, - 54161 - 44032: 0xC6E3, - 54162 - 44032: 0xBC66, - 54163 - 44032: 0xBC67, - 54164 - 44032: 0xBC68, - 54165 - 44032: 0xBC69, - 54166 - 44032: 0xBC6A, - 54167 - 44032: 0xBC6B, - 54168 - 44032: 0xC6E4, - 54169 - 44032: 0xC6E5, - 54170 - 44032: 0xBC6C, - 54171 - 44032: 0xBC6D, - 54172 - 44032: 0xC6E6, - 54173 - 44032: 0xBC6E, - 54174 - 44032: 0xBC6F, - 54175 - 44032: 0xBC70, - 54176 - 44032: 0xC6E7, - 54177 - 44032: 0xBC71, - 54178 - 44032: 0xBC72, - 54179 - 44032: 0xBC73, - 54180 - 44032: 0xBC74, - 54181 - 44032: 0xBC75, - 54182 - 44032: 0xBC76, - 54183 - 44032: 0xBC77, - 54184 - 44032: 0xC6E8, - 54185 - 44032: 0xC6E9, - 54186 - 44032: 0xBC78, - 54187 - 44032: 0xC6EA, - 54188 - 44032: 0xBC79, - 54189 - 44032: 0xC6EB, - 54190 - 44032: 0xBC7A, - 54191 - 44032: 0xBC81, - 54192 - 44032: 0xBC82, - 54193 - 44032: 0xBC83, - 54194 - 44032: 0xBC84, - 54195 - 44032: 0xBC85, - 54196 - 44032: 0xC6EC, - 54197 - 44032: 0xBC86, - 54198 - 44032: 0xBC87, - 54199 - 44032: 0xBC88, - 54200 - 44032: 0xC6ED, - 54201 - 44032: 0xBC89, - 54202 - 44032: 0xBC8A, - 54203 - 44032: 0xBC8B, - 54204 - 44032: 0xC6EE, - 54205 - 44032: 0xBC8C, - 54206 - 44032: 0xBC8D, - 54207 - 44032: 0xBC8E, - 54208 - 44032: 0xBC8F, - 54209 - 44032: 0xBC90, - 54210 - 44032: 0xBC91, - 54211 - 44032: 0xBC92, - 54212 - 44032: 0xC6EF, - 54213 - 44032: 0xC6F0, - 54214 - 44032: 0xBC93, - 54215 - 44032: 0xBC94, - 54216 - 44032: 0xC6F1, - 54217 - 44032: 0xC6F2, - 54218 - 44032: 0xBC95, - 54219 - 44032: 0xBC96, - 54220 - 44032: 0xBC97, - 54221 - 44032: 0xBC98, - 54222 - 44032: 0xBC99, - 54223 - 44032: 0xBC9A, - 54224 - 44032: 0xC6F3, - 54225 - 44032: 0xBC9B, - 54226 - 44032: 0xBC9C, - 54227 - 44032: 0xBC9D, - 54228 - 44032: 0xBC9E, - 54229 - 44032: 0xBC9F, - 54230 - 44032: 0xBCA0, - 54231 - 44032: 0xBD41, - 54232 - 44032: 0xC6F4, - 54233 - 44032: 0xBD42, - 54234 - 44032: 0xBD43, - 54235 - 44032: 0xBD44, - 54236 - 44032: 0xBD45, - 54237 - 44032: 0xBD46, - 54238 - 44032: 0xBD47, - 54239 - 44032: 0xBD48, - 54240 - 44032: 0xBD49, - 54241 - 44032: 0xC6F5, - 54242 - 44032: 0xBD4A, - 54243 - 44032: 0xC6F6, - 54244 - 44032: 0xBD4B, - 54245 - 44032: 0xBD4C, - 54246 - 44032: 0xBD4D, - 54247 - 44032: 0xBD4E, - 54248 - 44032: 0xBD4F, - 54249 - 44032: 0xBD50, - 54250 - 44032: 0xBD51, - 54251 - 44032: 0xBD52, - 54252 - 44032: 0xC6F7, - 54253 - 44032: 0xC6F8, - 54254 - 44032: 0xBD53, - 54255 - 44032: 0xBD54, - 54256 - 44032: 0xC6F9, - 54257 - 44032: 0xBD55, - 54258 - 44032: 0xBD56, - 54259 - 44032: 0xBD57, - 54260 - 44032: 0xC6FA, - 54261 - 44032: 0xBD58, - 54262 - 44032: 0xBD59, - 54263 - 44032: 0xBD5A, - 54264 - 44032: 0xBD61, - 54265 - 44032: 0xBD62, - 54266 - 44032: 0xBD63, - 54267 - 44032: 0xBD64, - 54268 - 44032: 0xC6FB, - 54269 - 44032: 0xC6FC, - 54270 - 44032: 0xBD65, - 54271 - 44032: 0xC6FD, - 54272 - 44032: 0xBD66, - 54273 - 44032: 0xC6FE, - 54274 - 44032: 0xBD67, - 54275 - 44032: 0xBD68, - 54276 - 44032: 0xBD69, - 54277 - 44032: 0xBD6A, - 54278 - 44032: 0xBD6B, - 54279 - 44032: 0xBD6C, - 54280 - 44032: 0xC7A1, - 54281 - 44032: 0xBD6D, - 54282 - 44032: 0xBD6E, - 54283 - 44032: 0xBD6F, - 54284 - 44032: 0xBD70, - 54285 - 44032: 0xBD71, - 54286 - 44032: 0xBD72, - 54287 - 44032: 0xBD73, - 54288 - 44032: 0xBD74, - 54289 - 44032: 0xBD75, - 54290 - 44032: 0xBD76, - 54291 - 44032: 0xBD77, - 54292 - 44032: 0xBD78, - 54293 - 44032: 0xBD79, - 54294 - 44032: 0xBD7A, - 54295 - 44032: 0xBD81, - 54296 - 44032: 0xBD82, - 54297 - 44032: 0xBD83, - 54298 - 44032: 0xBD84, - 54299 - 44032: 0xBD85, - 54300 - 44032: 0xBD86, - 54301 - 44032: 0xC7A2, - 54302 - 44032: 0xBD87, - 54303 - 44032: 0xBD88, - 54304 - 44032: 0xBD89, - 54305 - 44032: 0xBD8A, - 54306 - 44032: 0xBD8B, - 54307 - 44032: 0xBD8C, - 54308 - 44032: 0xBD8D, - 54309 - 44032: 0xBD8E, - 54310 - 44032: 0xBD8F, - 54311 - 44032: 0xBD90, - 54312 - 44032: 0xBD91, - 54313 - 44032: 0xBD92, - 54314 - 44032: 0xBD93, - 54315 - 44032: 0xBD94, - 54316 - 44032: 0xBD95, - 54317 - 44032: 0xBD96, - 54318 - 44032: 0xBD97, - 54319 - 44032: 0xBD98, - 54320 - 44032: 0xBD99, - 54321 - 44032: 0xBD9A, - 54322 - 44032: 0xBD9B, - 54323 - 44032: 0xBD9C, - 54324 - 44032: 0xBD9D, - 54325 - 44032: 0xBD9E, - 54326 - 44032: 0xBD9F, - 54327 - 44032: 0xBDA0, - 54328 - 44032: 0xBE41, - 54329 - 44032: 0xBE42, - 54330 - 44032: 0xBE43, - 54331 - 44032: 0xBE44, - 54332 - 44032: 0xBE45, - 54333 - 44032: 0xBE46, - 54334 - 44032: 0xBE47, - 54335 - 44032: 0xBE48, - 54336 - 44032: 0xC7A3, - 54337 - 44032: 0xBE49, - 54338 - 44032: 0xBE4A, - 54339 - 44032: 0xBE4B, - 54340 - 44032: 0xC7A4, - 54341 - 44032: 0xBE4C, - 54342 - 44032: 0xBE4D, - 54343 - 44032: 0xBE4E, - 54344 - 44032: 0xBE4F, - 54345 - 44032: 0xBE50, - 54346 - 44032: 0xBE51, - 54347 - 44032: 0xBE52, - 54348 - 44032: 0xBE53, - 54349 - 44032: 0xBE54, - 54350 - 44032: 0xBE55, - 54351 - 44032: 0xBE56, - 54352 - 44032: 0xBE57, - 54353 - 44032: 0xBE58, - 54354 - 44032: 0xBE59, - 54355 - 44032: 0xBE5A, - 54356 - 44032: 0xBE61, - 54357 - 44032: 0xBE62, - 54358 - 44032: 0xBE63, - 54359 - 44032: 0xBE64, - 54360 - 44032: 0xBE65, - 54361 - 44032: 0xBE66, - 54362 - 44032: 0xBE67, - 54363 - 44032: 0xBE68, - 54364 - 44032: 0xC7A5, - 54365 - 44032: 0xBE69, - 54366 - 44032: 0xBE6A, - 54367 - 44032: 0xBE6B, - 54368 - 44032: 0xC7A6, - 54369 - 44032: 0xBE6C, - 54370 - 44032: 0xBE6D, - 54371 - 44032: 0xBE6E, - 54372 - 44032: 0xC7A7, - 54373 - 44032: 0xBE6F, - 54374 - 44032: 0xBE70, - 54375 - 44032: 0xBE71, - 54376 - 44032: 0xBE72, - 54377 - 44032: 0xBE73, - 54378 - 44032: 0xBE74, - 54379 - 44032: 0xBE75, - 54380 - 44032: 0xBE76, - 54381 - 44032: 0xC7A8, - 54382 - 44032: 0xBE77, - 54383 - 44032: 0xC7A9, - 54384 - 44032: 0xBE78, - 54385 - 44032: 0xBE79, - 54386 - 44032: 0xBE7A, - 54387 - 44032: 0xBE81, - 54388 - 44032: 0xBE82, - 54389 - 44032: 0xBE83, - 54390 - 44032: 0xBE84, - 54391 - 44032: 0xBE85, - 54392 - 44032: 0xC7AA, - 54393 - 44032: 0xC7AB, - 54394 - 44032: 0xBE86, - 54395 - 44032: 0xBE87, - 54396 - 44032: 0xC7AC, - 54397 - 44032: 0xBE88, - 54398 - 44032: 0xBE89, - 54399 - 44032: 0xC7AD, - 54400 - 44032: 0xC7AE, - 54401 - 44032: 0xBE8A, - 54402 - 44032: 0xC7AF, - 54403 - 44032: 0xBE8B, - 54404 - 44032: 0xBE8C, - 54405 - 44032: 0xBE8D, - 54406 - 44032: 0xBE8E, - 54407 - 44032: 0xBE8F, - 54408 - 44032: 0xC7B0, - 54409 - 44032: 0xC7B1, - 54410 - 44032: 0xBE90, - 54411 - 44032: 0xC7B2, - 54412 - 44032: 0xBE91, - 54413 - 44032: 0xC7B3, - 54414 - 44032: 0xBE92, - 54415 - 44032: 0xBE93, - 54416 - 44032: 0xBE94, - 54417 - 44032: 0xBE95, - 54418 - 44032: 0xBE96, - 54419 - 44032: 0xBE97, - 54420 - 44032: 0xC7B4, - 54421 - 44032: 0xBE98, - 54422 - 44032: 0xBE99, - 54423 - 44032: 0xBE9A, - 54424 - 44032: 0xBE9B, - 54425 - 44032: 0xBE9C, - 54426 - 44032: 0xBE9D, - 54427 - 44032: 0xBE9E, - 54428 - 44032: 0xBE9F, - 54429 - 44032: 0xBEA0, - 54430 - 44032: 0xBF41, - 54431 - 44032: 0xBF42, - 54432 - 44032: 0xBF43, - 54433 - 44032: 0xBF44, - 54434 - 44032: 0xBF45, - 54435 - 44032: 0xBF46, - 54436 - 44032: 0xBF47, - 54437 - 44032: 0xBF48, - 54438 - 44032: 0xBF49, - 54439 - 44032: 0xBF4A, - 54440 - 44032: 0xBF4B, - 54441 - 44032: 0xC7B5, - 54442 - 44032: 0xBF4C, - 54443 - 44032: 0xBF4D, - 54444 - 44032: 0xBF4E, - 54445 - 44032: 0xBF4F, - 54446 - 44032: 0xBF50, - 54447 - 44032: 0xBF51, - 54448 - 44032: 0xBF52, - 54449 - 44032: 0xBF53, - 54450 - 44032: 0xBF54, - 54451 - 44032: 0xBF55, - 54452 - 44032: 0xBF56, - 54453 - 44032: 0xBF57, - 54454 - 44032: 0xBF58, - 54455 - 44032: 0xBF59, - 54456 - 44032: 0xBF5A, - 54457 - 44032: 0xBF61, - 54458 - 44032: 0xBF62, - 54459 - 44032: 0xBF63, - 54460 - 44032: 0xBF64, - 54461 - 44032: 0xBF65, - 54462 - 44032: 0xBF66, - 54463 - 44032: 0xBF67, - 54464 - 44032: 0xBF68, - 54465 - 44032: 0xBF69, - 54466 - 44032: 0xBF6A, - 54467 - 44032: 0xBF6B, - 54468 - 44032: 0xBF6C, - 54469 - 44032: 0xBF6D, - 54470 - 44032: 0xBF6E, - 54471 - 44032: 0xBF6F, - 54472 - 44032: 0xBF70, - 54473 - 44032: 0xBF71, - 54474 - 44032: 0xBF72, - 54475 - 44032: 0xBF73, - 54476 - 44032: 0xC7B6, - 54477 - 44032: 0xBF74, - 54478 - 44032: 0xBF75, - 54479 - 44032: 0xBF76, - 54480 - 44032: 0xC7B7, - 54481 - 44032: 0xBF77, - 54482 - 44032: 0xBF78, - 54483 - 44032: 0xBF79, - 54484 - 44032: 0xC7B8, - 54485 - 44032: 0xBF7A, - 54486 - 44032: 0xBF81, - 54487 - 44032: 0xBF82, - 54488 - 44032: 0xBF83, - 54489 - 44032: 0xBF84, - 54490 - 44032: 0xBF85, - 54491 - 44032: 0xBF86, - 54492 - 44032: 0xC7B9, - 54493 - 44032: 0xBF87, - 54494 - 44032: 0xBF88, - 54495 - 44032: 0xC7BA, - 54496 - 44032: 0xBF89, - 54497 - 44032: 0xBF8A, - 54498 - 44032: 0xBF8B, - 54499 - 44032: 0xBF8C, - 54500 - 44032: 0xBF8D, - 54501 - 44032: 0xBF8E, - 54502 - 44032: 0xBF8F, - 54503 - 44032: 0xBF90, - 54504 - 44032: 0xC7BB, - 54505 - 44032: 0xBF91, - 54506 - 44032: 0xBF92, - 54507 - 44032: 0xBF93, - 54508 - 44032: 0xC7BC, - 54509 - 44032: 0xBF94, - 54510 - 44032: 0xBF95, - 54511 - 44032: 0xBF96, - 54512 - 44032: 0xC7BD, - 54513 - 44032: 0xBF97, - 54514 - 44032: 0xBF98, - 54515 - 44032: 0xBF99, - 54516 - 44032: 0xBF9A, - 54517 - 44032: 0xBF9B, - 54518 - 44032: 0xBF9C, - 54519 - 44032: 0xBF9D, - 54520 - 44032: 0xC7BE, - 54521 - 44032: 0xBF9E, - 54522 - 44032: 0xBF9F, - 54523 - 44032: 0xC7BF, - 54524 - 44032: 0xBFA0, - 54525 - 44032: 0xC7C0, - 54526 - 44032: 0xC041, - 54527 - 44032: 0xC042, - 54528 - 44032: 0xC043, - 54529 - 44032: 0xC044, - 54530 - 44032: 0xC045, - 54531 - 44032: 0xC046, - 54532 - 44032: 0xC7C1, - 54533 - 44032: 0xC047, - 54534 - 44032: 0xC048, - 54535 - 44032: 0xC049, - 54536 - 44032: 0xC7C2, - 54537 - 44032: 0xC04A, - 54538 - 44032: 0xC04B, - 54539 - 44032: 0xC04C, - 54540 - 44032: 0xC7C3, - 54541 - 44032: 0xC04D, - 54542 - 44032: 0xC04E, - 54543 - 44032: 0xC04F, - 54544 - 44032: 0xC050, - 54545 - 44032: 0xC051, - 54546 - 44032: 0xC052, - 54547 - 44032: 0xC053, - 54548 - 44032: 0xC7C4, - 54549 - 44032: 0xC7C5, - 54550 - 44032: 0xC054, - 54551 - 44032: 0xC7C6, - 54552 - 44032: 0xC055, - 54553 - 44032: 0xC056, - 54554 - 44032: 0xC057, - 54555 - 44032: 0xC058, - 54556 - 44032: 0xC059, - 54557 - 44032: 0xC05A, - 54558 - 44032: 0xC061, - 54559 - 44032: 0xC062, - 54560 - 44032: 0xC063, - 54561 - 44032: 0xC064, - 54562 - 44032: 0xC065, - 54563 - 44032: 0xC066, - 54564 - 44032: 0xC067, - 54565 - 44032: 0xC068, - 54566 - 44032: 0xC069, - 54567 - 44032: 0xC06A, - 54568 - 44032: 0xC06B, - 54569 - 44032: 0xC06C, - 54570 - 44032: 0xC06D, - 54571 - 44032: 0xC06E, - 54572 - 44032: 0xC06F, - 54573 - 44032: 0xC070, - 54574 - 44032: 0xC071, - 54575 - 44032: 0xC072, - 54576 - 44032: 0xC073, - 54577 - 44032: 0xC074, - 54578 - 44032: 0xC075, - 54579 - 44032: 0xC076, - 54580 - 44032: 0xC077, - 54581 - 44032: 0xC078, - 54582 - 44032: 0xC079, - 54583 - 44032: 0xC07A, - 54584 - 44032: 0xC081, - 54585 - 44032: 0xC082, - 54586 - 44032: 0xC083, - 54587 - 44032: 0xC084, - 54588 - 44032: 0xC7C7, - 54589 - 44032: 0xC7C8, - 54590 - 44032: 0xC085, - 54591 - 44032: 0xC086, - 54592 - 44032: 0xC7C9, - 54593 - 44032: 0xC087, - 54594 - 44032: 0xC088, - 54595 - 44032: 0xC089, - 54596 - 44032: 0xC7CA, - 54597 - 44032: 0xC08A, - 54598 - 44032: 0xC08B, - 54599 - 44032: 0xC08C, - 54600 - 44032: 0xC08D, - 54601 - 44032: 0xC08E, - 54602 - 44032: 0xC08F, - 54603 - 44032: 0xC090, - 54604 - 44032: 0xC7CB, - 54605 - 44032: 0xC7CC, - 54606 - 44032: 0xC091, - 54607 - 44032: 0xC7CD, - 54608 - 44032: 0xC092, - 54609 - 44032: 0xC7CE, - 54610 - 44032: 0xC093, - 54611 - 44032: 0xC094, - 54612 - 44032: 0xC095, - 54613 - 44032: 0xC096, - 54614 - 44032: 0xC097, - 54615 - 44032: 0xC098, - 54616 - 44032: 0xC7CF, - 54617 - 44032: 0xC7D0, - 54618 - 44032: 0xC099, - 54619 - 44032: 0xC09A, - 54620 - 44032: 0xC7D1, - 54621 - 44032: 0xC09B, - 54622 - 44032: 0xC09C, - 54623 - 44032: 0xC09D, - 54624 - 44032: 0xC7D2, - 54625 - 44032: 0xC09E, - 54626 - 44032: 0xC09F, - 54627 - 44032: 0xC0A0, - 54628 - 44032: 0xC141, - 54629 - 44032: 0xC7D3, - 54630 - 44032: 0xC142, - 54631 - 44032: 0xC143, - 54632 - 44032: 0xC7D4, - 54633 - 44032: 0xC7D5, - 54634 - 44032: 0xC144, - 54635 - 44032: 0xC7D6, - 54636 - 44032: 0xC145, - 54637 - 44032: 0xC7D7, - 54638 - 44032: 0xC146, - 54639 - 44032: 0xC147, - 54640 - 44032: 0xC148, - 54641 - 44032: 0xC149, - 54642 - 44032: 0xC14A, - 54643 - 44032: 0xC14B, - 54644 - 44032: 0xC7D8, - 54645 - 44032: 0xC7D9, - 54646 - 44032: 0xC14C, - 54647 - 44032: 0xC14D, - 54648 - 44032: 0xC7DA, - 54649 - 44032: 0xC14E, - 54650 - 44032: 0xC14F, - 54651 - 44032: 0xC150, - 54652 - 44032: 0xC7DB, - 54653 - 44032: 0xC151, - 54654 - 44032: 0xC152, - 54655 - 44032: 0xC153, - 54656 - 44032: 0xC154, - 54657 - 44032: 0xC155, - 54658 - 44032: 0xC156, - 54659 - 44032: 0xC157, - 54660 - 44032: 0xC7DC, - 54661 - 44032: 0xC7DD, - 54662 - 44032: 0xC158, - 54663 - 44032: 0xC7DE, - 54664 - 44032: 0xC7DF, - 54665 - 44032: 0xC7E0, - 54666 - 44032: 0xC159, - 54667 - 44032: 0xC15A, - 54668 - 44032: 0xC161, - 54669 - 44032: 0xC162, - 54670 - 44032: 0xC163, - 54671 - 44032: 0xC164, - 54672 - 44032: 0xC7E1, - 54673 - 44032: 0xC165, - 54674 - 44032: 0xC166, - 54675 - 44032: 0xC167, - 54676 - 44032: 0xC168, - 54677 - 44032: 0xC169, - 54678 - 44032: 0xC16A, - 54679 - 44032: 0xC16B, - 54680 - 44032: 0xC16C, - 54681 - 44032: 0xC16D, - 54682 - 44032: 0xC16E, - 54683 - 44032: 0xC16F, - 54684 - 44032: 0xC170, - 54685 - 44032: 0xC171, - 54686 - 44032: 0xC172, - 54687 - 44032: 0xC173, - 54688 - 44032: 0xC174, - 54689 - 44032: 0xC175, - 54690 - 44032: 0xC176, - 54691 - 44032: 0xC177, - 54692 - 44032: 0xC178, - 54693 - 44032: 0xC7E2, - 54694 - 44032: 0xC179, - 54695 - 44032: 0xC17A, - 54696 - 44032: 0xC181, - 54697 - 44032: 0xC182, - 54698 - 44032: 0xC183, - 54699 - 44032: 0xC184, - 54700 - 44032: 0xC185, - 54701 - 44032: 0xC186, - 54702 - 44032: 0xC187, - 54703 - 44032: 0xC188, - 54704 - 44032: 0xC189, - 54705 - 44032: 0xC18A, - 54706 - 44032: 0xC18B, - 54707 - 44032: 0xC18C, - 54708 - 44032: 0xC18D, - 54709 - 44032: 0xC18E, - 54710 - 44032: 0xC18F, - 54711 - 44032: 0xC190, - 54712 - 44032: 0xC191, - 54713 - 44032: 0xC192, - 54714 - 44032: 0xC193, - 54715 - 44032: 0xC194, - 54716 - 44032: 0xC195, - 54717 - 44032: 0xC196, - 54718 - 44032: 0xC197, - 54719 - 44032: 0xC198, - 54720 - 44032: 0xC199, - 54721 - 44032: 0xC19A, - 54722 - 44032: 0xC19B, - 54723 - 44032: 0xC19C, - 54724 - 44032: 0xC19D, - 54725 - 44032: 0xC19E, - 54726 - 44032: 0xC19F, - 54727 - 44032: 0xC1A0, - 54728 - 44032: 0xC7E3, - 54729 - 44032: 0xC7E4, - 54730 - 44032: 0xC241, - 54731 - 44032: 0xC242, - 54732 - 44032: 0xC7E5, - 54733 - 44032: 0xC243, - 54734 - 44032: 0xC244, - 54735 - 44032: 0xC245, - 54736 - 44032: 0xC7E6, - 54737 - 44032: 0xC246, - 54738 - 44032: 0xC7E7, - 54739 - 44032: 0xC247, - 54740 - 44032: 0xC248, - 54741 - 44032: 0xC249, - 54742 - 44032: 0xC24A, - 54743 - 44032: 0xC24B, - 54744 - 44032: 0xC7E8, - 54745 - 44032: 0xC7E9, - 54746 - 44032: 0xC24C, - 54747 - 44032: 0xC7EA, - 54748 - 44032: 0xC24D, - 54749 - 44032: 0xC7EB, - 54750 - 44032: 0xC24E, - 54751 - 44032: 0xC24F, - 54752 - 44032: 0xC250, - 54753 - 44032: 0xC251, - 54754 - 44032: 0xC252, - 54755 - 44032: 0xC253, - 54756 - 44032: 0xC7EC, - 54757 - 44032: 0xC7ED, - 54758 - 44032: 0xC254, - 54759 - 44032: 0xC255, - 54760 - 44032: 0xC7EE, - 54761 - 44032: 0xC256, - 54762 - 44032: 0xC257, - 54763 - 44032: 0xC258, - 54764 - 44032: 0xC7EF, - 54765 - 44032: 0xC259, - 54766 - 44032: 0xC25A, - 54767 - 44032: 0xC261, - 54768 - 44032: 0xC262, - 54769 - 44032: 0xC263, - 54770 - 44032: 0xC264, - 54771 - 44032: 0xC265, - 54772 - 44032: 0xC7F0, - 54773 - 44032: 0xC7F1, - 54774 - 44032: 0xC266, - 54775 - 44032: 0xC7F2, - 54776 - 44032: 0xC267, - 54777 - 44032: 0xC7F3, - 54778 - 44032: 0xC268, - 54779 - 44032: 0xC269, - 54780 - 44032: 0xC26A, - 54781 - 44032: 0xC26B, - 54782 - 44032: 0xC26C, - 54783 - 44032: 0xC26D, - 54784 - 44032: 0xC7F4, - 54785 - 44032: 0xC7F5, - 54786 - 44032: 0xC26E, - 54787 - 44032: 0xC26F, - 54788 - 44032: 0xC7F6, - 54789 - 44032: 0xC270, - 54790 - 44032: 0xC271, - 54791 - 44032: 0xC272, - 54792 - 44032: 0xC7F7, - 54793 - 44032: 0xC273, - 54794 - 44032: 0xC274, - 54795 - 44032: 0xC275, - 54796 - 44032: 0xC276, - 54797 - 44032: 0xC277, - 54798 - 44032: 0xC278, - 54799 - 44032: 0xC279, - 54800 - 44032: 0xC7F8, - 54801 - 44032: 0xC7F9, - 54802 - 44032: 0xC27A, - 54803 - 44032: 0xC7FA, - 54804 - 44032: 0xC7FB, - 54805 - 44032: 0xC7FC, - 54806 - 44032: 0xC281, - 54807 - 44032: 0xC282, - 54808 - 44032: 0xC283, - 54809 - 44032: 0xC284, - 54810 - 44032: 0xC285, - 54811 - 44032: 0xC286, - 54812 - 44032: 0xC7FD, - 54813 - 44032: 0xC287, - 54814 - 44032: 0xC288, - 54815 - 44032: 0xC289, - 54816 - 44032: 0xC7FE, - 54817 - 44032: 0xC28A, - 54818 - 44032: 0xC28B, - 54819 - 44032: 0xC28C, - 54820 - 44032: 0xC8A1, - 54821 - 44032: 0xC28D, - 54822 - 44032: 0xC28E, - 54823 - 44032: 0xC28F, - 54824 - 44032: 0xC290, - 54825 - 44032: 0xC291, - 54826 - 44032: 0xC292, - 54827 - 44032: 0xC293, - 54828 - 44032: 0xC294, - 54829 - 44032: 0xC8A2, - 54830 - 44032: 0xC295, - 54831 - 44032: 0xC296, - 54832 - 44032: 0xC297, - 54833 - 44032: 0xC298, - 54834 - 44032: 0xC299, - 54835 - 44032: 0xC29A, - 54836 - 44032: 0xC29B, - 54837 - 44032: 0xC29C, - 54838 - 44032: 0xC29D, - 54839 - 44032: 0xC29E, - 54840 - 44032: 0xC8A3, - 54841 - 44032: 0xC8A4, - 54842 - 44032: 0xC29F, - 54843 - 44032: 0xC2A0, - 54844 - 44032: 0xC8A5, - 54845 - 44032: 0xC341, - 54846 - 44032: 0xC342, - 54847 - 44032: 0xC343, - 54848 - 44032: 0xC8A6, - 54849 - 44032: 0xC344, - 54850 - 44032: 0xC345, - 54851 - 44032: 0xC346, - 54852 - 44032: 0xC347, - 54853 - 44032: 0xC8A7, - 54854 - 44032: 0xC348, - 54855 - 44032: 0xC349, - 54856 - 44032: 0xC8A8, - 54857 - 44032: 0xC8A9, - 54858 - 44032: 0xC34A, - 54859 - 44032: 0xC8AA, - 54860 - 44032: 0xC34B, - 54861 - 44032: 0xC8AB, - 54862 - 44032: 0xC34C, - 54863 - 44032: 0xC34D, - 54864 - 44032: 0xC34E, - 54865 - 44032: 0xC8AC, - 54866 - 44032: 0xC34F, - 54867 - 44032: 0xC350, - 54868 - 44032: 0xC8AD, - 54869 - 44032: 0xC8AE, - 54870 - 44032: 0xC351, - 54871 - 44032: 0xC352, - 54872 - 44032: 0xC8AF, - 54873 - 44032: 0xC353, - 54874 - 44032: 0xC354, - 54875 - 44032: 0xC355, - 54876 - 44032: 0xC8B0, - 54877 - 44032: 0xC356, - 54878 - 44032: 0xC357, - 54879 - 44032: 0xC358, - 54880 - 44032: 0xC359, - 54881 - 44032: 0xC35A, - 54882 - 44032: 0xC361, - 54883 - 44032: 0xC362, - 54884 - 44032: 0xC363, - 54885 - 44032: 0xC364, - 54886 - 44032: 0xC365, - 54887 - 44032: 0xC8B1, - 54888 - 44032: 0xC366, - 54889 - 44032: 0xC8B2, - 54890 - 44032: 0xC367, - 54891 - 44032: 0xC368, - 54892 - 44032: 0xC369, - 54893 - 44032: 0xC36A, - 54894 - 44032: 0xC36B, - 54895 - 44032: 0xC36C, - 54896 - 44032: 0xC8B3, - 54897 - 44032: 0xC8B4, - 54898 - 44032: 0xC36D, - 54899 - 44032: 0xC36E, - 54900 - 44032: 0xC8B5, - 54901 - 44032: 0xC36F, - 54902 - 44032: 0xC370, - 54903 - 44032: 0xC371, - 54904 - 44032: 0xC372, - 54905 - 44032: 0xC373, - 54906 - 44032: 0xC374, - 54907 - 44032: 0xC375, - 54908 - 44032: 0xC376, - 54909 - 44032: 0xC377, - 54910 - 44032: 0xC378, - 54911 - 44032: 0xC379, - 54912 - 44032: 0xC37A, - 54913 - 44032: 0xC381, - 54914 - 44032: 0xC382, - 54915 - 44032: 0xC8B6, - 54916 - 44032: 0xC383, - 54917 - 44032: 0xC8B7, - 54918 - 44032: 0xC384, - 54919 - 44032: 0xC385, - 54920 - 44032: 0xC386, - 54921 - 44032: 0xC387, - 54922 - 44032: 0xC388, - 54923 - 44032: 0xC389, - 54924 - 44032: 0xC8B8, - 54925 - 44032: 0xC8B9, - 54926 - 44032: 0xC38A, - 54927 - 44032: 0xC38B, - 54928 - 44032: 0xC8BA, - 54929 - 44032: 0xC38C, - 54930 - 44032: 0xC38D, - 54931 - 44032: 0xC38E, - 54932 - 44032: 0xC8BB, - 54933 - 44032: 0xC38F, - 54934 - 44032: 0xC390, - 54935 - 44032: 0xC391, - 54936 - 44032: 0xC392, - 54937 - 44032: 0xC393, - 54938 - 44032: 0xC394, - 54939 - 44032: 0xC395, - 54940 - 44032: 0xC396, - 54941 - 44032: 0xC8BC, - 54942 - 44032: 0xC397, - 54943 - 44032: 0xC8BD, - 54944 - 44032: 0xC398, - 54945 - 44032: 0xC8BE, - 54946 - 44032: 0xC399, - 54947 - 44032: 0xC39A, - 54948 - 44032: 0xC39B, - 54949 - 44032: 0xC39C, - 54950 - 44032: 0xC39D, - 54951 - 44032: 0xC39E, - 54952 - 44032: 0xC8BF, - 54953 - 44032: 0xC39F, - 54954 - 44032: 0xC3A0, - 54955 - 44032: 0xC441, - 54956 - 44032: 0xC8C0, - 54957 - 44032: 0xC442, - 54958 - 44032: 0xC443, - 54959 - 44032: 0xC444, - 54960 - 44032: 0xC8C1, - 54961 - 44032: 0xC445, - 54962 - 44032: 0xC446, - 54963 - 44032: 0xC447, - 54964 - 44032: 0xC448, - 54965 - 44032: 0xC449, - 54966 - 44032: 0xC44A, - 54967 - 44032: 0xC44B, - 54968 - 44032: 0xC44C, - 54969 - 44032: 0xC8C2, - 54970 - 44032: 0xC44D, - 54971 - 44032: 0xC8C3, - 54972 - 44032: 0xC44E, - 54973 - 44032: 0xC44F, - 54974 - 44032: 0xC450, - 54975 - 44032: 0xC451, - 54976 - 44032: 0xC452, - 54977 - 44032: 0xC453, - 54978 - 44032: 0xC454, - 54979 - 44032: 0xC455, - 54980 - 44032: 0xC8C4, - 54981 - 44032: 0xC8C5, - 54982 - 44032: 0xC456, - 54983 - 44032: 0xC457, - 54984 - 44032: 0xC8C6, - 54985 - 44032: 0xC458, - 54986 - 44032: 0xC459, - 54987 - 44032: 0xC45A, - 54988 - 44032: 0xC8C7, - 54989 - 44032: 0xC461, - 54990 - 44032: 0xC462, - 54991 - 44032: 0xC463, - 54992 - 44032: 0xC464, - 54993 - 44032: 0xC8C8, - 54994 - 44032: 0xC465, - 54995 - 44032: 0xC466, - 54996 - 44032: 0xC8C9, - 54997 - 44032: 0xC467, - 54998 - 44032: 0xC468, - 54999 - 44032: 0xC8CA, - 55000 - 44032: 0xC469, - 55001 - 44032: 0xC8CB, - 55002 - 44032: 0xC46A, - 55003 - 44032: 0xC46B, - 55004 - 44032: 0xC46C, - 55005 - 44032: 0xC46D, - 55006 - 44032: 0xC46E, - 55007 - 44032: 0xC46F, - 55008 - 44032: 0xC8CC, - 55009 - 44032: 0xC470, - 55010 - 44032: 0xC471, - 55011 - 44032: 0xC472, - 55012 - 44032: 0xC8CD, - 55013 - 44032: 0xC473, - 55014 - 44032: 0xC474, - 55015 - 44032: 0xC475, - 55016 - 44032: 0xC8CE, - 55017 - 44032: 0xC476, - 55018 - 44032: 0xC477, - 55019 - 44032: 0xC478, - 55020 - 44032: 0xC479, - 55021 - 44032: 0xC47A, - 55022 - 44032: 0xC481, - 55023 - 44032: 0xC482, - 55024 - 44032: 0xC8CF, - 55025 - 44032: 0xC483, - 55026 - 44032: 0xC484, - 55027 - 44032: 0xC485, - 55028 - 44032: 0xC486, - 55029 - 44032: 0xC8D0, - 55030 - 44032: 0xC487, - 55031 - 44032: 0xC488, - 55032 - 44032: 0xC489, - 55033 - 44032: 0xC48A, - 55034 - 44032: 0xC48B, - 55035 - 44032: 0xC48C, - 55036 - 44032: 0xC8D1, - 55037 - 44032: 0xC8D2, - 55038 - 44032: 0xC48D, - 55039 - 44032: 0xC48E, - 55040 - 44032: 0xC8D3, - 55041 - 44032: 0xC48F, - 55042 - 44032: 0xC490, - 55043 - 44032: 0xC491, - 55044 - 44032: 0xC8D4, - 55045 - 44032: 0xC492, - 55046 - 44032: 0xC493, - 55047 - 44032: 0xC494, - 55048 - 44032: 0xC495, - 55049 - 44032: 0xC496, - 55050 - 44032: 0xC497, - 55051 - 44032: 0xC498, - 55052 - 44032: 0xC499, - 55053 - 44032: 0xC49A, - 55054 - 44032: 0xC49B, - 55055 - 44032: 0xC49C, - 55056 - 44032: 0xC49D, - 55057 - 44032: 0xC8D5, - 55058 - 44032: 0xC49E, - 55059 - 44032: 0xC49F, - 55060 - 44032: 0xC4A0, - 55061 - 44032: 0xC541, - 55062 - 44032: 0xC542, - 55063 - 44032: 0xC543, - 55064 - 44032: 0xC8D6, - 55065 - 44032: 0xC8D7, - 55066 - 44032: 0xC544, - 55067 - 44032: 0xC545, - 55068 - 44032: 0xC8D8, - 55069 - 44032: 0xC546, - 55070 - 44032: 0xC547, - 55071 - 44032: 0xC548, - 55072 - 44032: 0xC8D9, - 55073 - 44032: 0xC549, - 55074 - 44032: 0xC54A, - 55075 - 44032: 0xC54B, - 55076 - 44032: 0xC54C, - 55077 - 44032: 0xC54D, - 55078 - 44032: 0xC54E, - 55079 - 44032: 0xC54F, - 55080 - 44032: 0xC8DA, - 55081 - 44032: 0xC8DB, - 55082 - 44032: 0xC550, - 55083 - 44032: 0xC8DC, - 55084 - 44032: 0xC551, - 55085 - 44032: 0xC8DD, - 55086 - 44032: 0xC552, - 55087 - 44032: 0xC553, - 55088 - 44032: 0xC554, - 55089 - 44032: 0xC555, - 55090 - 44032: 0xC556, - 55091 - 44032: 0xC557, - 55092 - 44032: 0xC8DE, - 55093 - 44032: 0xC8DF, - 55094 - 44032: 0xC558, - 55095 - 44032: 0xC559, - 55096 - 44032: 0xC8E0, - 55097 - 44032: 0xC55A, - 55098 - 44032: 0xC561, - 55099 - 44032: 0xC562, - 55100 - 44032: 0xC8E1, - 55101 - 44032: 0xC563, - 55102 - 44032: 0xC564, - 55103 - 44032: 0xC565, - 55104 - 44032: 0xC566, - 55105 - 44032: 0xC567, - 55106 - 44032: 0xC568, - 55107 - 44032: 0xC569, - 55108 - 44032: 0xC8E2, - 55109 - 44032: 0xC56A, - 55110 - 44032: 0xC56B, - 55111 - 44032: 0xC8E3, - 55112 - 44032: 0xC56C, - 55113 - 44032: 0xC8E4, - 55114 - 44032: 0xC56D, - 55115 - 44032: 0xC56E, - 55116 - 44032: 0xC56F, - 55117 - 44032: 0xC570, - 55118 - 44032: 0xC571, - 55119 - 44032: 0xC572, - 55120 - 44032: 0xC8E5, - 55121 - 44032: 0xC8E6, - 55122 - 44032: 0xC573, - 55123 - 44032: 0xC574, - 55124 - 44032: 0xC8E7, - 55125 - 44032: 0xC575, - 55126 - 44032: 0xC8E8, - 55127 - 44032: 0xC8E9, - 55128 - 44032: 0xC8EA, - 55129 - 44032: 0xC8EB, - 55130 - 44032: 0xC576, - 55131 - 44032: 0xC577, - 55132 - 44032: 0xC578, - 55133 - 44032: 0xC579, - 55134 - 44032: 0xC57A, - 55135 - 44032: 0xC581, - 55136 - 44032: 0xC8EC, - 55137 - 44032: 0xC8ED, - 55138 - 44032: 0xC582, - 55139 - 44032: 0xC8EE, - 55140 - 44032: 0xC583, - 55141 - 44032: 0xC8EF, - 55142 - 44032: 0xC584, - 55143 - 44032: 0xC585, - 55144 - 44032: 0xC586, - 55145 - 44032: 0xC8F0, - 55146 - 44032: 0xC587, - 55147 - 44032: 0xC588, - 55148 - 44032: 0xC8F1, - 55149 - 44032: 0xC589, - 55150 - 44032: 0xC58A, - 55151 - 44032: 0xC58B, - 55152 - 44032: 0xC8F2, - 55153 - 44032: 0xC58C, - 55154 - 44032: 0xC58D, - 55155 - 44032: 0xC58E, - 55156 - 44032: 0xC8F3, - 55157 - 44032: 0xC58F, - 55158 - 44032: 0xC590, - 55159 - 44032: 0xC591, - 55160 - 44032: 0xC592, - 55161 - 44032: 0xC593, - 55162 - 44032: 0xC594, - 55163 - 44032: 0xC595, - 55164 - 44032: 0xC8F4, - 55165 - 44032: 0xC8F5, - 55166 - 44032: 0xC596, - 55167 - 44032: 0xC597, - 55168 - 44032: 0xC598, - 55169 - 44032: 0xC8F6, - 55170 - 44032: 0xC599, - 55171 - 44032: 0xC59A, - 55172 - 44032: 0xC59B, - 55173 - 44032: 0xC59C, - 55174 - 44032: 0xC59D, - 55175 - 44032: 0xC59E, - 55176 - 44032: 0xC8F7, - 55177 - 44032: 0xC8F8, - 55178 - 44032: 0xC59F, - 55179 - 44032: 0xC5A0, - 55180 - 44032: 0xC8F9, - 55181 - 44032: 0xC641, - 55182 - 44032: 0xC642, - 55183 - 44032: 0xC643, - 55184 - 44032: 0xC8FA, - 55185 - 44032: 0xC644, - 55186 - 44032: 0xC645, - 55187 - 44032: 0xC646, - 55188 - 44032: 0xC647, - 55189 - 44032: 0xC648, - 55190 - 44032: 0xC649, - 55191 - 44032: 0xC64A, - 55192 - 44032: 0xC8FB, - 55193 - 44032: 0xC8FC, - 55194 - 44032: 0xC64B, - 55195 - 44032: 0xC8FD, - 55196 - 44032: 0xC64C, - 55197 - 44032: 0xC8FE, - 55198 - 44032: 0xC64D, - 55199 - 44032: 0xC64E, - 55200 - 44032: 0xC64F, - 55201 - 44032: 0xC650, - 55202 - 44032: 0xC651, - 55203 - 44032: 0xC652, -} - -const encode2Low, encode2High = 8213, 9838 - -var encode2 = [...]uint16{ - 8213 - 8213: 0xA1AA, - 8216 - 8213: 0xA1AE, - 8217 - 8213: 0xA1AF, - 8220 - 8213: 0xA1B0, - 8221 - 8213: 0xA1B1, - 8224 - 8213: 0xA2D3, - 8225 - 8213: 0xA2D4, - 8229 - 8213: 0xA1A5, - 8230 - 8213: 0xA1A6, - 8240 - 8213: 0xA2B6, - 8242 - 8213: 0xA1C7, - 8243 - 8213: 0xA1C8, - 8251 - 8213: 0xA1D8, - 8308 - 8213: 0xA9F9, - 8319 - 8213: 0xA9FA, - 8321 - 8213: 0xA9FB, - 8322 - 8213: 0xA9FC, - 8323 - 8213: 0xA9FD, - 8324 - 8213: 0xA9FE, - 8364 - 8213: 0xA2E6, - 8451 - 8213: 0xA1C9, - 8457 - 8213: 0xA2B5, - 8467 - 8213: 0xA7A4, - 8470 - 8213: 0xA2E0, - 8481 - 8213: 0xA2E5, - 8482 - 8213: 0xA2E2, - 8486 - 8213: 0xA7D9, - 8491 - 8213: 0xA1CA, - 8531 - 8213: 0xA8F7, - 8532 - 8213: 0xA8F8, - 8539 - 8213: 0xA8FB, - 8540 - 8213: 0xA8FC, - 8541 - 8213: 0xA8FD, - 8542 - 8213: 0xA8FE, - 8544 - 8213: 0xA5B0, - 8545 - 8213: 0xA5B1, - 8546 - 8213: 0xA5B2, - 8547 - 8213: 0xA5B3, - 8548 - 8213: 0xA5B4, - 8549 - 8213: 0xA5B5, - 8550 - 8213: 0xA5B6, - 8551 - 8213: 0xA5B7, - 8552 - 8213: 0xA5B8, - 8553 - 8213: 0xA5B9, - 8560 - 8213: 0xA5A1, - 8561 - 8213: 0xA5A2, - 8562 - 8213: 0xA5A3, - 8563 - 8213: 0xA5A4, - 8564 - 8213: 0xA5A5, - 8565 - 8213: 0xA5A6, - 8566 - 8213: 0xA5A7, - 8567 - 8213: 0xA5A8, - 8568 - 8213: 0xA5A9, - 8569 - 8213: 0xA5AA, - 8592 - 8213: 0xA1E7, - 8593 - 8213: 0xA1E8, - 8594 - 8213: 0xA1E6, - 8595 - 8213: 0xA1E9, - 8596 - 8213: 0xA1EA, - 8597 - 8213: 0xA2D5, - 8598 - 8213: 0xA2D8, - 8599 - 8213: 0xA2D6, - 8600 - 8213: 0xA2D9, - 8601 - 8213: 0xA2D7, - 8658 - 8213: 0xA2A1, - 8660 - 8213: 0xA2A2, - 8704 - 8213: 0xA2A3, - 8706 - 8213: 0xA1D3, - 8707 - 8213: 0xA2A4, - 8711 - 8213: 0xA1D4, - 8712 - 8213: 0xA1F4, - 8715 - 8213: 0xA1F5, - 8719 - 8213: 0xA2B3, - 8721 - 8213: 0xA2B2, - 8730 - 8213: 0xA1EE, - 8733 - 8213: 0xA1F0, - 8734 - 8213: 0xA1C4, - 8736 - 8213: 0xA1D0, - 8741 - 8213: 0xA1AB, - 8743 - 8213: 0xA1FC, - 8744 - 8213: 0xA1FD, - 8745 - 8213: 0xA1FB, - 8746 - 8213: 0xA1FA, - 8747 - 8213: 0xA1F2, - 8748 - 8213: 0xA1F3, - 8750 - 8213: 0xA2B1, - 8756 - 8213: 0xA1C5, - 8757 - 8213: 0xA1F1, - 8764 - 8213: 0xA1AD, - 8765 - 8213: 0xA1EF, - 8786 - 8213: 0xA1D6, - 8800 - 8213: 0xA1C1, - 8801 - 8213: 0xA1D5, - 8804 - 8213: 0xA1C2, - 8805 - 8213: 0xA1C3, - 8810 - 8213: 0xA1EC, - 8811 - 8213: 0xA1ED, - 8834 - 8213: 0xA1F8, - 8835 - 8213: 0xA1F9, - 8838 - 8213: 0xA1F6, - 8839 - 8213: 0xA1F7, - 8857 - 8213: 0xA2C1, - 8869 - 8213: 0xA1D1, - 8978 - 8213: 0xA1D2, - 9312 - 8213: 0xA8E7, - 9313 - 8213: 0xA8E8, - 9314 - 8213: 0xA8E9, - 9315 - 8213: 0xA8EA, - 9316 - 8213: 0xA8EB, - 9317 - 8213: 0xA8EC, - 9318 - 8213: 0xA8ED, - 9319 - 8213: 0xA8EE, - 9320 - 8213: 0xA8EF, - 9321 - 8213: 0xA8F0, - 9322 - 8213: 0xA8F1, - 9323 - 8213: 0xA8F2, - 9324 - 8213: 0xA8F3, - 9325 - 8213: 0xA8F4, - 9326 - 8213: 0xA8F5, - 9332 - 8213: 0xA9E7, - 9333 - 8213: 0xA9E8, - 9334 - 8213: 0xA9E9, - 9335 - 8213: 0xA9EA, - 9336 - 8213: 0xA9EB, - 9337 - 8213: 0xA9EC, - 9338 - 8213: 0xA9ED, - 9339 - 8213: 0xA9EE, - 9340 - 8213: 0xA9EF, - 9341 - 8213: 0xA9F0, - 9342 - 8213: 0xA9F1, - 9343 - 8213: 0xA9F2, - 9344 - 8213: 0xA9F3, - 9345 - 8213: 0xA9F4, - 9346 - 8213: 0xA9F5, - 9372 - 8213: 0xA9CD, - 9373 - 8213: 0xA9CE, - 9374 - 8213: 0xA9CF, - 9375 - 8213: 0xA9D0, - 9376 - 8213: 0xA9D1, - 9377 - 8213: 0xA9D2, - 9378 - 8213: 0xA9D3, - 9379 - 8213: 0xA9D4, - 9380 - 8213: 0xA9D5, - 9381 - 8213: 0xA9D6, - 9382 - 8213: 0xA9D7, - 9383 - 8213: 0xA9D8, - 9384 - 8213: 0xA9D9, - 9385 - 8213: 0xA9DA, - 9386 - 8213: 0xA9DB, - 9387 - 8213: 0xA9DC, - 9388 - 8213: 0xA9DD, - 9389 - 8213: 0xA9DE, - 9390 - 8213: 0xA9DF, - 9391 - 8213: 0xA9E0, - 9392 - 8213: 0xA9E1, - 9393 - 8213: 0xA9E2, - 9394 - 8213: 0xA9E3, - 9395 - 8213: 0xA9E4, - 9396 - 8213: 0xA9E5, - 9397 - 8213: 0xA9E6, - 9424 - 8213: 0xA8CD, - 9425 - 8213: 0xA8CE, - 9426 - 8213: 0xA8CF, - 9427 - 8213: 0xA8D0, - 9428 - 8213: 0xA8D1, - 9429 - 8213: 0xA8D2, - 9430 - 8213: 0xA8D3, - 9431 - 8213: 0xA8D4, - 9432 - 8213: 0xA8D5, - 9433 - 8213: 0xA8D6, - 9434 - 8213: 0xA8D7, - 9435 - 8213: 0xA8D8, - 9436 - 8213: 0xA8D9, - 9437 - 8213: 0xA8DA, - 9438 - 8213: 0xA8DB, - 9439 - 8213: 0xA8DC, - 9440 - 8213: 0xA8DD, - 9441 - 8213: 0xA8DE, - 9442 - 8213: 0xA8DF, - 9443 - 8213: 0xA8E0, - 9444 - 8213: 0xA8E1, - 9445 - 8213: 0xA8E2, - 9446 - 8213: 0xA8E3, - 9447 - 8213: 0xA8E4, - 9448 - 8213: 0xA8E5, - 9449 - 8213: 0xA8E6, - 9472 - 8213: 0xA6A1, - 9473 - 8213: 0xA6AC, - 9474 - 8213: 0xA6A2, - 9475 - 8213: 0xA6AD, - 9484 - 8213: 0xA6A3, - 9485 - 8213: 0xA6C8, - 9486 - 8213: 0xA6C7, - 9487 - 8213: 0xA6AE, - 9488 - 8213: 0xA6A4, - 9489 - 8213: 0xA6C2, - 9490 - 8213: 0xA6C1, - 9491 - 8213: 0xA6AF, - 9492 - 8213: 0xA6A6, - 9493 - 8213: 0xA6C6, - 9494 - 8213: 0xA6C5, - 9495 - 8213: 0xA6B1, - 9496 - 8213: 0xA6A5, - 9497 - 8213: 0xA6C4, - 9498 - 8213: 0xA6C3, - 9499 - 8213: 0xA6B0, - 9500 - 8213: 0xA6A7, - 9501 - 8213: 0xA6BC, - 9502 - 8213: 0xA6C9, - 9503 - 8213: 0xA6CA, - 9504 - 8213: 0xA6B7, - 9505 - 8213: 0xA6CB, - 9506 - 8213: 0xA6CC, - 9507 - 8213: 0xA6B2, - 9508 - 8213: 0xA6A9, - 9509 - 8213: 0xA6BE, - 9510 - 8213: 0xA6CD, - 9511 - 8213: 0xA6CE, - 9512 - 8213: 0xA6B9, - 9513 - 8213: 0xA6CF, - 9514 - 8213: 0xA6D0, - 9515 - 8213: 0xA6B4, - 9516 - 8213: 0xA6A8, - 9517 - 8213: 0xA6D1, - 9518 - 8213: 0xA6D2, - 9519 - 8213: 0xA6B8, - 9520 - 8213: 0xA6BD, - 9521 - 8213: 0xA6D3, - 9522 - 8213: 0xA6D4, - 9523 - 8213: 0xA6B3, - 9524 - 8213: 0xA6AA, - 9525 - 8213: 0xA6D5, - 9526 - 8213: 0xA6D6, - 9527 - 8213: 0xA6BA, - 9528 - 8213: 0xA6BF, - 9529 - 8213: 0xA6D7, - 9530 - 8213: 0xA6D8, - 9531 - 8213: 0xA6B5, - 9532 - 8213: 0xA6AB, - 9533 - 8213: 0xA6D9, - 9534 - 8213: 0xA6DA, - 9535 - 8213: 0xA6BB, - 9536 - 8213: 0xA6DB, - 9537 - 8213: 0xA6DC, - 9538 - 8213: 0xA6C0, - 9539 - 8213: 0xA6DD, - 9540 - 8213: 0xA6DE, - 9541 - 8213: 0xA6DF, - 9542 - 8213: 0xA6E0, - 9543 - 8213: 0xA6E1, - 9544 - 8213: 0xA6E2, - 9545 - 8213: 0xA6E3, - 9546 - 8213: 0xA6E4, - 9547 - 8213: 0xA6B6, - 9618 - 8213: 0xA2C6, - 9632 - 8213: 0xA1E1, - 9633 - 8213: 0xA1E0, - 9635 - 8213: 0xA2C3, - 9636 - 8213: 0xA2C7, - 9637 - 8213: 0xA2C8, - 9638 - 8213: 0xA2CB, - 9639 - 8213: 0xA2CA, - 9640 - 8213: 0xA2C9, - 9641 - 8213: 0xA2CC, - 9650 - 8213: 0xA1E3, - 9651 - 8213: 0xA1E2, - 9654 - 8213: 0xA2BA, - 9655 - 8213: 0xA2B9, - 9660 - 8213: 0xA1E5, - 9661 - 8213: 0xA1E4, - 9664 - 8213: 0xA2B8, - 9665 - 8213: 0xA2B7, - 9670 - 8213: 0xA1DF, - 9671 - 8213: 0xA1DE, - 9672 - 8213: 0xA2C2, - 9675 - 8213: 0xA1DB, - 9678 - 8213: 0xA1DD, - 9679 - 8213: 0xA1DC, - 9680 - 8213: 0xA2C4, - 9681 - 8213: 0xA2C5, - 9733 - 8213: 0xA1DA, - 9734 - 8213: 0xA1D9, - 9742 - 8213: 0xA2CF, - 9743 - 8213: 0xA2CE, - 9756 - 8213: 0xA2D0, - 9758 - 8213: 0xA2D1, - 9792 - 8213: 0xA1CF, - 9794 - 8213: 0xA1CE, - 9824 - 8213: 0xA2BC, - 9825 - 8213: 0xA2BD, - 9827 - 8213: 0xA2C0, - 9828 - 8213: 0xA2BB, - 9829 - 8213: 0xA2BE, - 9831 - 8213: 0xA2BF, - 9832 - 8213: 0xA2CD, - 9833 - 8213: 0xA2DB, - 9834 - 8213: 0xA2DC, - 9836 - 8213: 0xA2DD, - 9837 - 8213: 0xA2DA, -} - -const encode3Low, encode3High = 12288, 13278 - -var encode3 = [...]uint16{ - 12288 - 12288: 0xA1A1, - 12289 - 12288: 0xA1A2, - 12290 - 12288: 0xA1A3, - 12291 - 12288: 0xA1A8, - 12296 - 12288: 0xA1B4, - 12297 - 12288: 0xA1B5, - 12298 - 12288: 0xA1B6, - 12299 - 12288: 0xA1B7, - 12300 - 12288: 0xA1B8, - 12301 - 12288: 0xA1B9, - 12302 - 12288: 0xA1BA, - 12303 - 12288: 0xA1BB, - 12304 - 12288: 0xA1BC, - 12305 - 12288: 0xA1BD, - 12307 - 12288: 0xA1EB, - 12308 - 12288: 0xA1B2, - 12309 - 12288: 0xA1B3, - 12353 - 12288: 0xAAA1, - 12354 - 12288: 0xAAA2, - 12355 - 12288: 0xAAA3, - 12356 - 12288: 0xAAA4, - 12357 - 12288: 0xAAA5, - 12358 - 12288: 0xAAA6, - 12359 - 12288: 0xAAA7, - 12360 - 12288: 0xAAA8, - 12361 - 12288: 0xAAA9, - 12362 - 12288: 0xAAAA, - 12363 - 12288: 0xAAAB, - 12364 - 12288: 0xAAAC, - 12365 - 12288: 0xAAAD, - 12366 - 12288: 0xAAAE, - 12367 - 12288: 0xAAAF, - 12368 - 12288: 0xAAB0, - 12369 - 12288: 0xAAB1, - 12370 - 12288: 0xAAB2, - 12371 - 12288: 0xAAB3, - 12372 - 12288: 0xAAB4, - 12373 - 12288: 0xAAB5, - 12374 - 12288: 0xAAB6, - 12375 - 12288: 0xAAB7, - 12376 - 12288: 0xAAB8, - 12377 - 12288: 0xAAB9, - 12378 - 12288: 0xAABA, - 12379 - 12288: 0xAABB, - 12380 - 12288: 0xAABC, - 12381 - 12288: 0xAABD, - 12382 - 12288: 0xAABE, - 12383 - 12288: 0xAABF, - 12384 - 12288: 0xAAC0, - 12385 - 12288: 0xAAC1, - 12386 - 12288: 0xAAC2, - 12387 - 12288: 0xAAC3, - 12388 - 12288: 0xAAC4, - 12389 - 12288: 0xAAC5, - 12390 - 12288: 0xAAC6, - 12391 - 12288: 0xAAC7, - 12392 - 12288: 0xAAC8, - 12393 - 12288: 0xAAC9, - 12394 - 12288: 0xAACA, - 12395 - 12288: 0xAACB, - 12396 - 12288: 0xAACC, - 12397 - 12288: 0xAACD, - 12398 - 12288: 0xAACE, - 12399 - 12288: 0xAACF, - 12400 - 12288: 0xAAD0, - 12401 - 12288: 0xAAD1, - 12402 - 12288: 0xAAD2, - 12403 - 12288: 0xAAD3, - 12404 - 12288: 0xAAD4, - 12405 - 12288: 0xAAD5, - 12406 - 12288: 0xAAD6, - 12407 - 12288: 0xAAD7, - 12408 - 12288: 0xAAD8, - 12409 - 12288: 0xAAD9, - 12410 - 12288: 0xAADA, - 12411 - 12288: 0xAADB, - 12412 - 12288: 0xAADC, - 12413 - 12288: 0xAADD, - 12414 - 12288: 0xAADE, - 12415 - 12288: 0xAADF, - 12416 - 12288: 0xAAE0, - 12417 - 12288: 0xAAE1, - 12418 - 12288: 0xAAE2, - 12419 - 12288: 0xAAE3, - 12420 - 12288: 0xAAE4, - 12421 - 12288: 0xAAE5, - 12422 - 12288: 0xAAE6, - 12423 - 12288: 0xAAE7, - 12424 - 12288: 0xAAE8, - 12425 - 12288: 0xAAE9, - 12426 - 12288: 0xAAEA, - 12427 - 12288: 0xAAEB, - 12428 - 12288: 0xAAEC, - 12429 - 12288: 0xAAED, - 12430 - 12288: 0xAAEE, - 12431 - 12288: 0xAAEF, - 12432 - 12288: 0xAAF0, - 12433 - 12288: 0xAAF1, - 12434 - 12288: 0xAAF2, - 12435 - 12288: 0xAAF3, - 12449 - 12288: 0xABA1, - 12450 - 12288: 0xABA2, - 12451 - 12288: 0xABA3, - 12452 - 12288: 0xABA4, - 12453 - 12288: 0xABA5, - 12454 - 12288: 0xABA6, - 12455 - 12288: 0xABA7, - 12456 - 12288: 0xABA8, - 12457 - 12288: 0xABA9, - 12458 - 12288: 0xABAA, - 12459 - 12288: 0xABAB, - 12460 - 12288: 0xABAC, - 12461 - 12288: 0xABAD, - 12462 - 12288: 0xABAE, - 12463 - 12288: 0xABAF, - 12464 - 12288: 0xABB0, - 12465 - 12288: 0xABB1, - 12466 - 12288: 0xABB2, - 12467 - 12288: 0xABB3, - 12468 - 12288: 0xABB4, - 12469 - 12288: 0xABB5, - 12470 - 12288: 0xABB6, - 12471 - 12288: 0xABB7, - 12472 - 12288: 0xABB8, - 12473 - 12288: 0xABB9, - 12474 - 12288: 0xABBA, - 12475 - 12288: 0xABBB, - 12476 - 12288: 0xABBC, - 12477 - 12288: 0xABBD, - 12478 - 12288: 0xABBE, - 12479 - 12288: 0xABBF, - 12480 - 12288: 0xABC0, - 12481 - 12288: 0xABC1, - 12482 - 12288: 0xABC2, - 12483 - 12288: 0xABC3, - 12484 - 12288: 0xABC4, - 12485 - 12288: 0xABC5, - 12486 - 12288: 0xABC6, - 12487 - 12288: 0xABC7, - 12488 - 12288: 0xABC8, - 12489 - 12288: 0xABC9, - 12490 - 12288: 0xABCA, - 12491 - 12288: 0xABCB, - 12492 - 12288: 0xABCC, - 12493 - 12288: 0xABCD, - 12494 - 12288: 0xABCE, - 12495 - 12288: 0xABCF, - 12496 - 12288: 0xABD0, - 12497 - 12288: 0xABD1, - 12498 - 12288: 0xABD2, - 12499 - 12288: 0xABD3, - 12500 - 12288: 0xABD4, - 12501 - 12288: 0xABD5, - 12502 - 12288: 0xABD6, - 12503 - 12288: 0xABD7, - 12504 - 12288: 0xABD8, - 12505 - 12288: 0xABD9, - 12506 - 12288: 0xABDA, - 12507 - 12288: 0xABDB, - 12508 - 12288: 0xABDC, - 12509 - 12288: 0xABDD, - 12510 - 12288: 0xABDE, - 12511 - 12288: 0xABDF, - 12512 - 12288: 0xABE0, - 12513 - 12288: 0xABE1, - 12514 - 12288: 0xABE2, - 12515 - 12288: 0xABE3, - 12516 - 12288: 0xABE4, - 12517 - 12288: 0xABE5, - 12518 - 12288: 0xABE6, - 12519 - 12288: 0xABE7, - 12520 - 12288: 0xABE8, - 12521 - 12288: 0xABE9, - 12522 - 12288: 0xABEA, - 12523 - 12288: 0xABEB, - 12524 - 12288: 0xABEC, - 12525 - 12288: 0xABED, - 12526 - 12288: 0xABEE, - 12527 - 12288: 0xABEF, - 12528 - 12288: 0xABF0, - 12529 - 12288: 0xABF1, - 12530 - 12288: 0xABF2, - 12531 - 12288: 0xABF3, - 12532 - 12288: 0xABF4, - 12533 - 12288: 0xABF5, - 12534 - 12288: 0xABF6, - 12593 - 12288: 0xA4A1, - 12594 - 12288: 0xA4A2, - 12595 - 12288: 0xA4A3, - 12596 - 12288: 0xA4A4, - 12597 - 12288: 0xA4A5, - 12598 - 12288: 0xA4A6, - 12599 - 12288: 0xA4A7, - 12600 - 12288: 0xA4A8, - 12601 - 12288: 0xA4A9, - 12602 - 12288: 0xA4AA, - 12603 - 12288: 0xA4AB, - 12604 - 12288: 0xA4AC, - 12605 - 12288: 0xA4AD, - 12606 - 12288: 0xA4AE, - 12607 - 12288: 0xA4AF, - 12608 - 12288: 0xA4B0, - 12609 - 12288: 0xA4B1, - 12610 - 12288: 0xA4B2, - 12611 - 12288: 0xA4B3, - 12612 - 12288: 0xA4B4, - 12613 - 12288: 0xA4B5, - 12614 - 12288: 0xA4B6, - 12615 - 12288: 0xA4B7, - 12616 - 12288: 0xA4B8, - 12617 - 12288: 0xA4B9, - 12618 - 12288: 0xA4BA, - 12619 - 12288: 0xA4BB, - 12620 - 12288: 0xA4BC, - 12621 - 12288: 0xA4BD, - 12622 - 12288: 0xA4BE, - 12623 - 12288: 0xA4BF, - 12624 - 12288: 0xA4C0, - 12625 - 12288: 0xA4C1, - 12626 - 12288: 0xA4C2, - 12627 - 12288: 0xA4C3, - 12628 - 12288: 0xA4C4, - 12629 - 12288: 0xA4C5, - 12630 - 12288: 0xA4C6, - 12631 - 12288: 0xA4C7, - 12632 - 12288: 0xA4C8, - 12633 - 12288: 0xA4C9, - 12634 - 12288: 0xA4CA, - 12635 - 12288: 0xA4CB, - 12636 - 12288: 0xA4CC, - 12637 - 12288: 0xA4CD, - 12638 - 12288: 0xA4CE, - 12639 - 12288: 0xA4CF, - 12640 - 12288: 0xA4D0, - 12641 - 12288: 0xA4D1, - 12642 - 12288: 0xA4D2, - 12643 - 12288: 0xA4D3, - 12644 - 12288: 0xA4D4, - 12645 - 12288: 0xA4D5, - 12646 - 12288: 0xA4D6, - 12647 - 12288: 0xA4D7, - 12648 - 12288: 0xA4D8, - 12649 - 12288: 0xA4D9, - 12650 - 12288: 0xA4DA, - 12651 - 12288: 0xA4DB, - 12652 - 12288: 0xA4DC, - 12653 - 12288: 0xA4DD, - 12654 - 12288: 0xA4DE, - 12655 - 12288: 0xA4DF, - 12656 - 12288: 0xA4E0, - 12657 - 12288: 0xA4E1, - 12658 - 12288: 0xA4E2, - 12659 - 12288: 0xA4E3, - 12660 - 12288: 0xA4E4, - 12661 - 12288: 0xA4E5, - 12662 - 12288: 0xA4E6, - 12663 - 12288: 0xA4E7, - 12664 - 12288: 0xA4E8, - 12665 - 12288: 0xA4E9, - 12666 - 12288: 0xA4EA, - 12667 - 12288: 0xA4EB, - 12668 - 12288: 0xA4EC, - 12669 - 12288: 0xA4ED, - 12670 - 12288: 0xA4EE, - 12671 - 12288: 0xA4EF, - 12672 - 12288: 0xA4F0, - 12673 - 12288: 0xA4F1, - 12674 - 12288: 0xA4F2, - 12675 - 12288: 0xA4F3, - 12676 - 12288: 0xA4F4, - 12677 - 12288: 0xA4F5, - 12678 - 12288: 0xA4F6, - 12679 - 12288: 0xA4F7, - 12680 - 12288: 0xA4F8, - 12681 - 12288: 0xA4F9, - 12682 - 12288: 0xA4FA, - 12683 - 12288: 0xA4FB, - 12684 - 12288: 0xA4FC, - 12685 - 12288: 0xA4FD, - 12686 - 12288: 0xA4FE, - 12800 - 12288: 0xA9B1, - 12801 - 12288: 0xA9B2, - 12802 - 12288: 0xA9B3, - 12803 - 12288: 0xA9B4, - 12804 - 12288: 0xA9B5, - 12805 - 12288: 0xA9B6, - 12806 - 12288: 0xA9B7, - 12807 - 12288: 0xA9B8, - 12808 - 12288: 0xA9B9, - 12809 - 12288: 0xA9BA, - 12810 - 12288: 0xA9BB, - 12811 - 12288: 0xA9BC, - 12812 - 12288: 0xA9BD, - 12813 - 12288: 0xA9BE, - 12814 - 12288: 0xA9BF, - 12815 - 12288: 0xA9C0, - 12816 - 12288: 0xA9C1, - 12817 - 12288: 0xA9C2, - 12818 - 12288: 0xA9C3, - 12819 - 12288: 0xA9C4, - 12820 - 12288: 0xA9C5, - 12821 - 12288: 0xA9C6, - 12822 - 12288: 0xA9C7, - 12823 - 12288: 0xA9C8, - 12824 - 12288: 0xA9C9, - 12825 - 12288: 0xA9CA, - 12826 - 12288: 0xA9CB, - 12827 - 12288: 0xA9CC, - 12828 - 12288: 0xA2DF, - 12896 - 12288: 0xA8B1, - 12897 - 12288: 0xA8B2, - 12898 - 12288: 0xA8B3, - 12899 - 12288: 0xA8B4, - 12900 - 12288: 0xA8B5, - 12901 - 12288: 0xA8B6, - 12902 - 12288: 0xA8B7, - 12903 - 12288: 0xA8B8, - 12904 - 12288: 0xA8B9, - 12905 - 12288: 0xA8BA, - 12906 - 12288: 0xA8BB, - 12907 - 12288: 0xA8BC, - 12908 - 12288: 0xA8BD, - 12909 - 12288: 0xA8BE, - 12910 - 12288: 0xA8BF, - 12911 - 12288: 0xA8C0, - 12912 - 12288: 0xA8C1, - 12913 - 12288: 0xA8C2, - 12914 - 12288: 0xA8C3, - 12915 - 12288: 0xA8C4, - 12916 - 12288: 0xA8C5, - 12917 - 12288: 0xA8C6, - 12918 - 12288: 0xA8C7, - 12919 - 12288: 0xA8C8, - 12920 - 12288: 0xA8C9, - 12921 - 12288: 0xA8CA, - 12922 - 12288: 0xA8CB, - 12923 - 12288: 0xA8CC, - 12927 - 12288: 0xA2DE, - 13184 - 12288: 0xA7C9, - 13185 - 12288: 0xA7CA, - 13186 - 12288: 0xA7CB, - 13187 - 12288: 0xA7CC, - 13188 - 12288: 0xA7CD, - 13192 - 12288: 0xA7BA, - 13193 - 12288: 0xA7BB, - 13194 - 12288: 0xA7DC, - 13195 - 12288: 0xA7DD, - 13196 - 12288: 0xA7DE, - 13197 - 12288: 0xA7B6, - 13198 - 12288: 0xA7B7, - 13199 - 12288: 0xA7B8, - 13200 - 12288: 0xA7D4, - 13201 - 12288: 0xA7D5, - 13202 - 12288: 0xA7D6, - 13203 - 12288: 0xA7D7, - 13204 - 12288: 0xA7D8, - 13205 - 12288: 0xA7A1, - 13206 - 12288: 0xA7A2, - 13207 - 12288: 0xA7A3, - 13208 - 12288: 0xA7A5, - 13209 - 12288: 0xA7AB, - 13210 - 12288: 0xA7AC, - 13211 - 12288: 0xA7AD, - 13212 - 12288: 0xA7AE, - 13213 - 12288: 0xA7AF, - 13214 - 12288: 0xA7B0, - 13215 - 12288: 0xA7B1, - 13216 - 12288: 0xA7B2, - 13217 - 12288: 0xA7B3, - 13218 - 12288: 0xA7B4, - 13219 - 12288: 0xA7A7, - 13220 - 12288: 0xA7A8, - 13221 - 12288: 0xA7A9, - 13222 - 12288: 0xA7AA, - 13223 - 12288: 0xA7BD, - 13224 - 12288: 0xA7BE, - 13225 - 12288: 0xA7E5, - 13226 - 12288: 0xA7E6, - 13227 - 12288: 0xA7E7, - 13228 - 12288: 0xA7E8, - 13229 - 12288: 0xA7E1, - 13230 - 12288: 0xA7E2, - 13231 - 12288: 0xA7E3, - 13232 - 12288: 0xA7BF, - 13233 - 12288: 0xA7C0, - 13234 - 12288: 0xA7C1, - 13235 - 12288: 0xA7C2, - 13236 - 12288: 0xA7C3, - 13237 - 12288: 0xA7C4, - 13238 - 12288: 0xA7C5, - 13239 - 12288: 0xA7C6, - 13240 - 12288: 0xA7C7, - 13241 - 12288: 0xA7C8, - 13242 - 12288: 0xA7CE, - 13243 - 12288: 0xA7CF, - 13244 - 12288: 0xA7D0, - 13245 - 12288: 0xA7D1, - 13246 - 12288: 0xA7D2, - 13247 - 12288: 0xA7D3, - 13248 - 12288: 0xA7DA, - 13249 - 12288: 0xA7DB, - 13250 - 12288: 0xA2E3, - 13251 - 12288: 0xA7EC, - 13252 - 12288: 0xA7A6, - 13253 - 12288: 0xA7E0, - 13254 - 12288: 0xA7EF, - 13255 - 12288: 0xA2E1, - 13256 - 12288: 0xA7BC, - 13257 - 12288: 0xA7ED, - 13258 - 12288: 0xA7B5, - 13263 - 12288: 0xA7B9, - 13264 - 12288: 0xA7EA, - 13267 - 12288: 0xA7EB, - 13270 - 12288: 0xA7DF, - 13272 - 12288: 0xA2E4, - 13275 - 12288: 0xA7E4, - 13276 - 12288: 0xA7EE, - 13277 - 12288: 0xA7E9, -} - -const encode4Low, encode4High = 161, 1106 - -var encode4 = [...]uint16{ - 161 - 161: 0xA2AE, - 164 - 161: 0xA2B4, - 167 - 161: 0xA1D7, - 168 - 161: 0xA1A7, - 170 - 161: 0xA8A3, - 173 - 161: 0xA1A9, - 174 - 161: 0xA2E7, - 176 - 161: 0xA1C6, - 177 - 161: 0xA1BE, - 178 - 161: 0xA9F7, - 179 - 161: 0xA9F8, - 180 - 161: 0xA2A5, - 182 - 161: 0xA2D2, - 183 - 161: 0xA1A4, - 184 - 161: 0xA2AC, - 185 - 161: 0xA9F6, - 186 - 161: 0xA8AC, - 188 - 161: 0xA8F9, - 189 - 161: 0xA8F6, - 190 - 161: 0xA8FA, - 191 - 161: 0xA2AF, - 198 - 161: 0xA8A1, - 208 - 161: 0xA8A2, - 215 - 161: 0xA1BF, - 216 - 161: 0xA8AA, - 222 - 161: 0xA8AD, - 223 - 161: 0xA9AC, - 230 - 161: 0xA9A1, - 240 - 161: 0xA9A3, - 247 - 161: 0xA1C0, - 248 - 161: 0xA9AA, - 254 - 161: 0xA9AD, - 273 - 161: 0xA9A2, - 294 - 161: 0xA8A4, - 295 - 161: 0xA9A4, - 305 - 161: 0xA9A5, - 306 - 161: 0xA8A6, - 307 - 161: 0xA9A6, - 312 - 161: 0xA9A7, - 319 - 161: 0xA8A8, - 320 - 161: 0xA9A8, - 321 - 161: 0xA8A9, - 322 - 161: 0xA9A9, - 329 - 161: 0xA9B0, - 330 - 161: 0xA8AF, - 331 - 161: 0xA9AF, - 338 - 161: 0xA8AB, - 339 - 161: 0xA9AB, - 358 - 161: 0xA8AE, - 359 - 161: 0xA9AE, - 711 - 161: 0xA2A7, - 720 - 161: 0xA2B0, - 728 - 161: 0xA2A8, - 729 - 161: 0xA2AB, - 730 - 161: 0xA2AA, - 731 - 161: 0xA2AD, - 733 - 161: 0xA2A9, - 913 - 161: 0xA5C1, - 914 - 161: 0xA5C2, - 915 - 161: 0xA5C3, - 916 - 161: 0xA5C4, - 917 - 161: 0xA5C5, - 918 - 161: 0xA5C6, - 919 - 161: 0xA5C7, - 920 - 161: 0xA5C8, - 921 - 161: 0xA5C9, - 922 - 161: 0xA5CA, - 923 - 161: 0xA5CB, - 924 - 161: 0xA5CC, - 925 - 161: 0xA5CD, - 926 - 161: 0xA5CE, - 927 - 161: 0xA5CF, - 928 - 161: 0xA5D0, - 929 - 161: 0xA5D1, - 931 - 161: 0xA5D2, - 932 - 161: 0xA5D3, - 933 - 161: 0xA5D4, - 934 - 161: 0xA5D5, - 935 - 161: 0xA5D6, - 936 - 161: 0xA5D7, - 937 - 161: 0xA5D8, - 945 - 161: 0xA5E1, - 946 - 161: 0xA5E2, - 947 - 161: 0xA5E3, - 948 - 161: 0xA5E4, - 949 - 161: 0xA5E5, - 950 - 161: 0xA5E6, - 951 - 161: 0xA5E7, - 952 - 161: 0xA5E8, - 953 - 161: 0xA5E9, - 954 - 161: 0xA5EA, - 955 - 161: 0xA5EB, - 956 - 161: 0xA5EC, - 957 - 161: 0xA5ED, - 958 - 161: 0xA5EE, - 959 - 161: 0xA5EF, - 960 - 161: 0xA5F0, - 961 - 161: 0xA5F1, - 963 - 161: 0xA5F2, - 964 - 161: 0xA5F3, - 965 - 161: 0xA5F4, - 966 - 161: 0xA5F5, - 967 - 161: 0xA5F6, - 968 - 161: 0xA5F7, - 969 - 161: 0xA5F8, - 1025 - 161: 0xACA7, - 1040 - 161: 0xACA1, - 1041 - 161: 0xACA2, - 1042 - 161: 0xACA3, - 1043 - 161: 0xACA4, - 1044 - 161: 0xACA5, - 1045 - 161: 0xACA6, - 1046 - 161: 0xACA8, - 1047 - 161: 0xACA9, - 1048 - 161: 0xACAA, - 1049 - 161: 0xACAB, - 1050 - 161: 0xACAC, - 1051 - 161: 0xACAD, - 1052 - 161: 0xACAE, - 1053 - 161: 0xACAF, - 1054 - 161: 0xACB0, - 1055 - 161: 0xACB1, - 1056 - 161: 0xACB2, - 1057 - 161: 0xACB3, - 1058 - 161: 0xACB4, - 1059 - 161: 0xACB5, - 1060 - 161: 0xACB6, - 1061 - 161: 0xACB7, - 1062 - 161: 0xACB8, - 1063 - 161: 0xACB9, - 1064 - 161: 0xACBA, - 1065 - 161: 0xACBB, - 1066 - 161: 0xACBC, - 1067 - 161: 0xACBD, - 1068 - 161: 0xACBE, - 1069 - 161: 0xACBF, - 1070 - 161: 0xACC0, - 1071 - 161: 0xACC1, - 1072 - 161: 0xACD1, - 1073 - 161: 0xACD2, - 1074 - 161: 0xACD3, - 1075 - 161: 0xACD4, - 1076 - 161: 0xACD5, - 1077 - 161: 0xACD6, - 1078 - 161: 0xACD8, - 1079 - 161: 0xACD9, - 1080 - 161: 0xACDA, - 1081 - 161: 0xACDB, - 1082 - 161: 0xACDC, - 1083 - 161: 0xACDD, - 1084 - 161: 0xACDE, - 1085 - 161: 0xACDF, - 1086 - 161: 0xACE0, - 1087 - 161: 0xACE1, - 1088 - 161: 0xACE2, - 1089 - 161: 0xACE3, - 1090 - 161: 0xACE4, - 1091 - 161: 0xACE5, - 1092 - 161: 0xACE6, - 1093 - 161: 0xACE7, - 1094 - 161: 0xACE8, - 1095 - 161: 0xACE9, - 1096 - 161: 0xACEA, - 1097 - 161: 0xACEB, - 1098 - 161: 0xACEC, - 1099 - 161: 0xACED, - 1100 - 161: 0xACEE, - 1101 - 161: 0xACEF, - 1102 - 161: 0xACF0, - 1103 - 161: 0xACF1, - 1105 - 161: 0xACD7, -} - -const encode5Low, encode5High = 63744, 64012 - -var encode5 = [...]uint16{ - 63744 - 63744: 0xCBD0, - 63745 - 63744: 0xCBD6, - 63746 - 63744: 0xCBE7, - 63747 - 63744: 0xCDCF, - 63748 - 63744: 0xCDE8, - 63749 - 63744: 0xCEAD, - 63750 - 63744: 0xCFFB, - 63751 - 63744: 0xD0A2, - 63752 - 63744: 0xD0B8, - 63753 - 63744: 0xD0D0, - 63754 - 63744: 0xD0DD, - 63755 - 63744: 0xD1D4, - 63756 - 63744: 0xD1D5, - 63757 - 63744: 0xD1D8, - 63758 - 63744: 0xD1DB, - 63759 - 63744: 0xD1DC, - 63760 - 63744: 0xD1DD, - 63761 - 63744: 0xD1DE, - 63762 - 63744: 0xD1DF, - 63763 - 63744: 0xD1E0, - 63764 - 63744: 0xD1E2, - 63765 - 63744: 0xD1E3, - 63766 - 63744: 0xD1E4, - 63767 - 63744: 0xD1E5, - 63768 - 63744: 0xD1E6, - 63769 - 63744: 0xD1E8, - 63770 - 63744: 0xD1E9, - 63771 - 63744: 0xD1EA, - 63772 - 63744: 0xD1EB, - 63773 - 63744: 0xD1ED, - 63774 - 63744: 0xD1EF, - 63775 - 63744: 0xD1F0, - 63776 - 63744: 0xD1F2, - 63777 - 63744: 0xD1F6, - 63778 - 63744: 0xD1FA, - 63779 - 63744: 0xD1FC, - 63780 - 63744: 0xD1FD, - 63781 - 63744: 0xD1FE, - 63782 - 63744: 0xD2A2, - 63783 - 63744: 0xD2A3, - 63784 - 63744: 0xD2A7, - 63785 - 63744: 0xD2A8, - 63786 - 63744: 0xD2A9, - 63787 - 63744: 0xD2AA, - 63788 - 63744: 0xD2AB, - 63789 - 63744: 0xD2AD, - 63790 - 63744: 0xD2B2, - 63791 - 63744: 0xD2BE, - 63792 - 63744: 0xD2C2, - 63793 - 63744: 0xD2C3, - 63794 - 63744: 0xD2C4, - 63795 - 63744: 0xD2C6, - 63796 - 63744: 0xD2C7, - 63797 - 63744: 0xD2C8, - 63798 - 63744: 0xD2C9, - 63799 - 63744: 0xD2CA, - 63800 - 63744: 0xD2CB, - 63801 - 63744: 0xD2CD, - 63802 - 63744: 0xD2CE, - 63803 - 63744: 0xD2CF, - 63804 - 63744: 0xD2D0, - 63805 - 63744: 0xD2D1, - 63806 - 63744: 0xD2D2, - 63807 - 63744: 0xD2D3, - 63808 - 63744: 0xD2D4, - 63809 - 63744: 0xD2D5, - 63810 - 63744: 0xD2D6, - 63811 - 63744: 0xD2D7, - 63812 - 63744: 0xD2D9, - 63813 - 63744: 0xD2DA, - 63814 - 63744: 0xD2DE, - 63815 - 63744: 0xD2DF, - 63816 - 63744: 0xD2E1, - 63817 - 63744: 0xD2E2, - 63818 - 63744: 0xD2E4, - 63819 - 63744: 0xD2E5, - 63820 - 63744: 0xD2E6, - 63821 - 63744: 0xD2E7, - 63822 - 63744: 0xD2E8, - 63823 - 63744: 0xD2E9, - 63824 - 63744: 0xD2EA, - 63825 - 63744: 0xD2EB, - 63826 - 63744: 0xD2F0, - 63827 - 63744: 0xD2F1, - 63828 - 63744: 0xD2F2, - 63829 - 63744: 0xD2F3, - 63830 - 63744: 0xD2F4, - 63831 - 63744: 0xD2F5, - 63832 - 63744: 0xD2F7, - 63833 - 63744: 0xD2F8, - 63834 - 63744: 0xD4E6, - 63835 - 63744: 0xD4FC, - 63836 - 63744: 0xD5A5, - 63837 - 63744: 0xD5AB, - 63838 - 63744: 0xD5AE, - 63839 - 63744: 0xD6B8, - 63840 - 63744: 0xD6CD, - 63841 - 63744: 0xD7CB, - 63842 - 63744: 0xD7E4, - 63843 - 63744: 0xDBC5, - 63844 - 63744: 0xDBE4, - 63845 - 63744: 0xDCA5, - 63846 - 63744: 0xDDA5, - 63847 - 63744: 0xDDD5, - 63848 - 63744: 0xDDF4, - 63849 - 63744: 0xDEFC, - 63850 - 63744: 0xDEFE, - 63851 - 63744: 0xDFB3, - 63852 - 63744: 0xDFE1, - 63853 - 63744: 0xDFE8, - 63854 - 63744: 0xE0F1, - 63855 - 63744: 0xE1AD, - 63856 - 63744: 0xE1ED, - 63857 - 63744: 0xE3F5, - 63858 - 63744: 0xE4A1, - 63859 - 63744: 0xE4A9, - 63860 - 63744: 0xE5AE, - 63861 - 63744: 0xE5B1, - 63862 - 63744: 0xE5B2, - 63863 - 63744: 0xE5B9, - 63864 - 63744: 0xE5BB, - 63865 - 63744: 0xE5BC, - 63866 - 63744: 0xE5C4, - 63867 - 63744: 0xE5CE, - 63868 - 63744: 0xE5D0, - 63869 - 63744: 0xE5D2, - 63870 - 63744: 0xE5D6, - 63871 - 63744: 0xE5FA, - 63872 - 63744: 0xE5FB, - 63873 - 63744: 0xE5FC, - 63874 - 63744: 0xE5FE, - 63875 - 63744: 0xE6A1, - 63876 - 63744: 0xE6A4, - 63877 - 63744: 0xE6A7, - 63878 - 63744: 0xE6AD, - 63879 - 63744: 0xE6AF, - 63880 - 63744: 0xE6B0, - 63881 - 63744: 0xE6B1, - 63882 - 63744: 0xE6B3, - 63883 - 63744: 0xE6B7, - 63884 - 63744: 0xE6B8, - 63885 - 63744: 0xE6BC, - 63886 - 63744: 0xE6C4, - 63887 - 63744: 0xE6C6, - 63888 - 63744: 0xE6C7, - 63889 - 63744: 0xE6CA, - 63890 - 63744: 0xE6D2, - 63891 - 63744: 0xE6D6, - 63892 - 63744: 0xE6D9, - 63893 - 63744: 0xE6DC, - 63894 - 63744: 0xE6DF, - 63895 - 63744: 0xE6E1, - 63896 - 63744: 0xE6E4, - 63897 - 63744: 0xE6E5, - 63898 - 63744: 0xE6E6, - 63899 - 63744: 0xE6E8, - 63900 - 63744: 0xE6EA, - 63901 - 63744: 0xE6EB, - 63902 - 63744: 0xE6EC, - 63903 - 63744: 0xE6EF, - 63904 - 63744: 0xE6F1, - 63905 - 63744: 0xE6F2, - 63906 - 63744: 0xE6F5, - 63907 - 63744: 0xE6F6, - 63908 - 63744: 0xE6F7, - 63909 - 63744: 0xE6F9, - 63910 - 63744: 0xE7A1, - 63911 - 63744: 0xE7A6, - 63912 - 63744: 0xE7A9, - 63913 - 63744: 0xE7AA, - 63914 - 63744: 0xE7AC, - 63915 - 63744: 0xE7AD, - 63916 - 63744: 0xE7B0, - 63917 - 63744: 0xE7BF, - 63918 - 63744: 0xE7C1, - 63919 - 63744: 0xE7C6, - 63920 - 63744: 0xE7C7, - 63921 - 63744: 0xE7CB, - 63922 - 63744: 0xE7CD, - 63923 - 63744: 0xE7CF, - 63924 - 63744: 0xE7D0, - 63925 - 63744: 0xE7D3, - 63926 - 63744: 0xE7DF, - 63927 - 63744: 0xE7E4, - 63928 - 63744: 0xE7E6, - 63929 - 63744: 0xE7F7, - 63930 - 63744: 0xE8E7, - 63931 - 63744: 0xE8E8, - 63932 - 63744: 0xE8F0, - 63933 - 63744: 0xE8F1, - 63934 - 63744: 0xE8F7, - 63935 - 63744: 0xE8F9, - 63936 - 63744: 0xE8FB, - 63937 - 63744: 0xE8FE, - 63938 - 63744: 0xE9A7, - 63939 - 63744: 0xE9AC, - 63940 - 63744: 0xE9CC, - 63941 - 63744: 0xE9F7, - 63942 - 63744: 0xEAC1, - 63943 - 63744: 0xEAE5, - 63944 - 63744: 0xEAF4, - 63945 - 63744: 0xEAF7, - 63946 - 63744: 0xEAFC, - 63947 - 63744: 0xEAFE, - 63948 - 63744: 0xEBA4, - 63949 - 63744: 0xEBA7, - 63950 - 63744: 0xEBA9, - 63951 - 63744: 0xEBAA, - 63952 - 63744: 0xEBBA, - 63953 - 63744: 0xEBBB, - 63954 - 63744: 0xEBBD, - 63955 - 63744: 0xEBC1, - 63956 - 63744: 0xEBC2, - 63957 - 63744: 0xEBC6, - 63958 - 63744: 0xEBC7, - 63959 - 63744: 0xEBCC, - 63960 - 63744: 0xEBCF, - 63961 - 63744: 0xEBD0, - 63962 - 63744: 0xEBD1, - 63963 - 63744: 0xEBD2, - 63964 - 63744: 0xEBD8, - 63965 - 63744: 0xECA6, - 63966 - 63744: 0xECA7, - 63967 - 63744: 0xECAA, - 63968 - 63744: 0xECAF, - 63969 - 63744: 0xECB0, - 63970 - 63744: 0xECB1, - 63971 - 63744: 0xECB2, - 63972 - 63744: 0xECB5, - 63973 - 63744: 0xECB8, - 63974 - 63744: 0xECBA, - 63975 - 63744: 0xECC0, - 63976 - 63744: 0xECC1, - 63977 - 63744: 0xECC5, - 63978 - 63744: 0xECC6, - 63979 - 63744: 0xECC9, - 63980 - 63744: 0xECCA, - 63981 - 63744: 0xECD5, - 63982 - 63744: 0xECDD, - 63983 - 63744: 0xECDE, - 63984 - 63744: 0xECE1, - 63985 - 63744: 0xECE4, - 63986 - 63744: 0xECE7, - 63987 - 63744: 0xECE8, - 63988 - 63744: 0xECF7, - 63989 - 63744: 0xECF8, - 63990 - 63744: 0xECFA, - 63991 - 63744: 0xEDA1, - 63992 - 63744: 0xEDA2, - 63993 - 63744: 0xEDA3, - 63994 - 63744: 0xEDEE, - 63995 - 63744: 0xEEDB, - 63996 - 63744: 0xF2BD, - 63997 - 63744: 0xF2FA, - 63998 - 63744: 0xF3B1, - 63999 - 63744: 0xF4A7, - 64000 - 63744: 0xF4EE, - 64001 - 63744: 0xF6F4, - 64002 - 63744: 0xF6F6, - 64003 - 63744: 0xF7B8, - 64004 - 63744: 0xF7C8, - 64005 - 63744: 0xF7D3, - 64006 - 63744: 0xF8DB, - 64007 - 63744: 0xF8F0, - 64008 - 63744: 0xFAA1, - 64009 - 63744: 0xFAA2, - 64010 - 63744: 0xFAE6, - 64011 - 63744: 0xFCA9, -} - -const encode6Low, encode6High = 65281, 65511 - -var encode6 = [...]uint16{ - 65281 - 65281: 0xA3A1, - 65282 - 65281: 0xA3A2, - 65283 - 65281: 0xA3A3, - 65284 - 65281: 0xA3A4, - 65285 - 65281: 0xA3A5, - 65286 - 65281: 0xA3A6, - 65287 - 65281: 0xA3A7, - 65288 - 65281: 0xA3A8, - 65289 - 65281: 0xA3A9, - 65290 - 65281: 0xA3AA, - 65291 - 65281: 0xA3AB, - 65292 - 65281: 0xA3AC, - 65293 - 65281: 0xA3AD, - 65294 - 65281: 0xA3AE, - 65295 - 65281: 0xA3AF, - 65296 - 65281: 0xA3B0, - 65297 - 65281: 0xA3B1, - 65298 - 65281: 0xA3B2, - 65299 - 65281: 0xA3B3, - 65300 - 65281: 0xA3B4, - 65301 - 65281: 0xA3B5, - 65302 - 65281: 0xA3B6, - 65303 - 65281: 0xA3B7, - 65304 - 65281: 0xA3B8, - 65305 - 65281: 0xA3B9, - 65306 - 65281: 0xA3BA, - 65307 - 65281: 0xA3BB, - 65308 - 65281: 0xA3BC, - 65309 - 65281: 0xA3BD, - 65310 - 65281: 0xA3BE, - 65311 - 65281: 0xA3BF, - 65312 - 65281: 0xA3C0, - 65313 - 65281: 0xA3C1, - 65314 - 65281: 0xA3C2, - 65315 - 65281: 0xA3C3, - 65316 - 65281: 0xA3C4, - 65317 - 65281: 0xA3C5, - 65318 - 65281: 0xA3C6, - 65319 - 65281: 0xA3C7, - 65320 - 65281: 0xA3C8, - 65321 - 65281: 0xA3C9, - 65322 - 65281: 0xA3CA, - 65323 - 65281: 0xA3CB, - 65324 - 65281: 0xA3CC, - 65325 - 65281: 0xA3CD, - 65326 - 65281: 0xA3CE, - 65327 - 65281: 0xA3CF, - 65328 - 65281: 0xA3D0, - 65329 - 65281: 0xA3D1, - 65330 - 65281: 0xA3D2, - 65331 - 65281: 0xA3D3, - 65332 - 65281: 0xA3D4, - 65333 - 65281: 0xA3D5, - 65334 - 65281: 0xA3D6, - 65335 - 65281: 0xA3D7, - 65336 - 65281: 0xA3D8, - 65337 - 65281: 0xA3D9, - 65338 - 65281: 0xA3DA, - 65339 - 65281: 0xA3DB, - 65340 - 65281: 0xA1AC, - 65341 - 65281: 0xA3DD, - 65342 - 65281: 0xA3DE, - 65343 - 65281: 0xA3DF, - 65344 - 65281: 0xA3E0, - 65345 - 65281: 0xA3E1, - 65346 - 65281: 0xA3E2, - 65347 - 65281: 0xA3E3, - 65348 - 65281: 0xA3E4, - 65349 - 65281: 0xA3E5, - 65350 - 65281: 0xA3E6, - 65351 - 65281: 0xA3E7, - 65352 - 65281: 0xA3E8, - 65353 - 65281: 0xA3E9, - 65354 - 65281: 0xA3EA, - 65355 - 65281: 0xA3EB, - 65356 - 65281: 0xA3EC, - 65357 - 65281: 0xA3ED, - 65358 - 65281: 0xA3EE, - 65359 - 65281: 0xA3EF, - 65360 - 65281: 0xA3F0, - 65361 - 65281: 0xA3F1, - 65362 - 65281: 0xA3F2, - 65363 - 65281: 0xA3F3, - 65364 - 65281: 0xA3F4, - 65365 - 65281: 0xA3F5, - 65366 - 65281: 0xA3F6, - 65367 - 65281: 0xA3F7, - 65368 - 65281: 0xA3F8, - 65369 - 65281: 0xA3F9, - 65370 - 65281: 0xA3FA, - 65371 - 65281: 0xA3FB, - 65372 - 65281: 0xA3FC, - 65373 - 65281: 0xA3FD, - 65374 - 65281: 0xA2A6, - 65504 - 65281: 0xA1CB, - 65505 - 65281: 0xA1CC, - 65506 - 65281: 0xA1FE, - 65507 - 65281: 0xA3FE, - 65509 - 65281: 0xA1CD, - 65510 - 65281: 0xA3DC, -} diff --git a/vendor/golang.org/x/text/encoding/simplifiedchinese/all.go b/vendor/golang.org/x/text/encoding/simplifiedchinese/all.go deleted file mode 100644 index 5ecc526..0000000 --- a/vendor/golang.org/x/text/encoding/simplifiedchinese/all.go +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package simplifiedchinese - -import ( - "golang.org/x/text/encoding" -) - -// All is a list of all defined encodings in this package. -var All = []encoding.Encoding{GB18030, GBK, HZGB2312} diff --git a/vendor/golang.org/x/text/encoding/simplifiedchinese/gbk.go b/vendor/golang.org/x/text/encoding/simplifiedchinese/gbk.go deleted file mode 100644 index b89c45b..0000000 --- a/vendor/golang.org/x/text/encoding/simplifiedchinese/gbk.go +++ /dev/null @@ -1,269 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package simplifiedchinese - -import ( - "unicode/utf8" - - "golang.org/x/text/encoding" - "golang.org/x/text/encoding/internal" - "golang.org/x/text/encoding/internal/identifier" - "golang.org/x/text/transform" -) - -var ( - // GB18030 is the GB18030 encoding. - GB18030 encoding.Encoding = &gbk18030 - // GBK is the GBK encoding. It encodes an extension of the GB2312 character set - // and is also known as Code Page 936. - GBK encoding.Encoding = &gbk -) - -var gbk = internal.Encoding{ - &internal.SimpleEncoding{ - gbkDecoder{gb18030: false}, - gbkEncoder{gb18030: false}, - }, - "GBK", - identifier.GBK, -} - -var gbk18030 = internal.Encoding{ - &internal.SimpleEncoding{ - gbkDecoder{gb18030: true}, - gbkEncoder{gb18030: true}, - }, - "GB18030", - identifier.GB18030, -} - -type gbkDecoder struct { - transform.NopResetter - gb18030 bool -} - -func (d gbkDecoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { - r, size := rune(0), 0 -loop: - for ; nSrc < len(src); nSrc += size { - switch c0 := src[nSrc]; { - case c0 < utf8.RuneSelf: - r, size = rune(c0), 1 - - // Microsoft's Code Page 936 extends GBK 1.0 to encode the euro sign U+20AC - // as 0x80. The HTML5 specification at http://encoding.spec.whatwg.org/#gbk - // says to treat "gbk" as Code Page 936. - case c0 == 0x80: - r, size = '€', 1 - - case c0 < 0xff: - if nSrc+1 >= len(src) { - if !atEOF { - err = transform.ErrShortSrc - break loop - } - r, size = utf8.RuneError, 1 - goto write - } - c1 := src[nSrc+1] - switch { - case 0x40 <= c1 && c1 < 0x7f: - c1 -= 0x40 - case 0x80 <= c1 && c1 < 0xff: - c1 -= 0x41 - case d.gb18030 && 0x30 <= c1 && c1 < 0x40: - if nSrc+3 >= len(src) { - if !atEOF { - err = transform.ErrShortSrc - break loop - } - // The second byte here is always ASCII, so we can set size - // to 1 in all cases. - r, size = utf8.RuneError, 1 - goto write - } - c2 := src[nSrc+2] - if c2 < 0x81 || 0xff <= c2 { - r, size = utf8.RuneError, 1 - goto write - } - c3 := src[nSrc+3] - if c3 < 0x30 || 0x3a <= c3 { - r, size = utf8.RuneError, 1 - goto write - } - size = 4 - r = ((rune(c0-0x81)*10+rune(c1-0x30))*126+rune(c2-0x81))*10 + rune(c3-0x30) - if r < 39420 { - i, j := 0, len(gb18030) - for i < j { - h := i + (j-i)/2 - if r >= rune(gb18030[h][0]) { - i = h + 1 - } else { - j = h - } - } - dec := &gb18030[i-1] - r += rune(dec[1]) - rune(dec[0]) - goto write - } - r -= 189000 - if 0 <= r && r < 0x100000 { - r += 0x10000 - } else { - r, size = utf8.RuneError, 1 - } - goto write - default: - r, size = utf8.RuneError, 1 - goto write - } - r, size = '\ufffd', 2 - if i := int(c0-0x81)*190 + int(c1); i < len(decode) { - r = rune(decode[i]) - if r == 0 { - r = '\ufffd' - } - } - - default: - r, size = utf8.RuneError, 1 - } - - write: - if nDst+utf8.RuneLen(r) > len(dst) { - err = transform.ErrShortDst - break loop - } - nDst += utf8.EncodeRune(dst[nDst:], r) - } - return nDst, nSrc, err -} - -type gbkEncoder struct { - transform.NopResetter - gb18030 bool -} - -func (e gbkEncoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { - r, r2, size := rune(0), rune(0), 0 - for ; nSrc < len(src); nSrc += size { - r = rune(src[nSrc]) - - // Decode a 1-byte rune. - if r < utf8.RuneSelf { - size = 1 - - } else { - // Decode a multi-byte rune. - r, size = utf8.DecodeRune(src[nSrc:]) - if size == 1 { - // All valid runes of size 1 (those below utf8.RuneSelf) were - // handled above. We have invalid UTF-8 or we haven't seen the - // full character yet. - if !atEOF && !utf8.FullRune(src[nSrc:]) { - err = transform.ErrShortSrc - break - } - } - - // func init checks that the switch covers all tables. - switch { - case encode0Low <= r && r < encode0High: - if r2 = rune(encode0[r-encode0Low]); r2 != 0 { - goto write2 - } - case encode1Low <= r && r < encode1High: - // Microsoft's Code Page 936 extends GBK 1.0 to encode the euro sign U+20AC - // as 0x80. The HTML5 specification at http://encoding.spec.whatwg.org/#gbk - // says to treat "gbk" as Code Page 936. - if r == '€' { - r = 0x80 - goto write1 - } - if r2 = rune(encode1[r-encode1Low]); r2 != 0 { - goto write2 - } - case encode2Low <= r && r < encode2High: - if r2 = rune(encode2[r-encode2Low]); r2 != 0 { - goto write2 - } - case encode3Low <= r && r < encode3High: - if r2 = rune(encode3[r-encode3Low]); r2 != 0 { - goto write2 - } - case encode4Low <= r && r < encode4High: - if r2 = rune(encode4[r-encode4Low]); r2 != 0 { - goto write2 - } - } - - if e.gb18030 { - if r < 0x10000 { - i, j := 0, len(gb18030) - for i < j { - h := i + (j-i)/2 - if r >= rune(gb18030[h][1]) { - i = h + 1 - } else { - j = h - } - } - dec := &gb18030[i-1] - r += rune(dec[0]) - rune(dec[1]) - goto write4 - } else if r < 0x110000 { - r += 189000 - 0x10000 - goto write4 - } - } - err = internal.ErrASCIIReplacement - break - } - - write1: - if nDst >= len(dst) { - err = transform.ErrShortDst - break - } - dst[nDst] = uint8(r) - nDst++ - continue - - write2: - if nDst+2 > len(dst) { - err = transform.ErrShortDst - break - } - dst[nDst+0] = uint8(r2 >> 8) - dst[nDst+1] = uint8(r2) - nDst += 2 - continue - - write4: - if nDst+4 > len(dst) { - err = transform.ErrShortDst - break - } - dst[nDst+3] = uint8(r%10 + 0x30) - r /= 10 - dst[nDst+2] = uint8(r%126 + 0x81) - r /= 126 - dst[nDst+1] = uint8(r%10 + 0x30) - r /= 10 - dst[nDst+0] = uint8(r + 0x81) - nDst += 4 - continue - } - return nDst, nSrc, err -} - -func init() { - // Check that the hard-coded encode switch covers all tables. - if numEncodeTables != 5 { - panic("bad numEncodeTables") - } -} diff --git a/vendor/golang.org/x/text/encoding/simplifiedchinese/hzgb2312.go b/vendor/golang.org/x/text/encoding/simplifiedchinese/hzgb2312.go deleted file mode 100644 index e15b7bf..0000000 --- a/vendor/golang.org/x/text/encoding/simplifiedchinese/hzgb2312.go +++ /dev/null @@ -1,245 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package simplifiedchinese - -import ( - "unicode/utf8" - - "golang.org/x/text/encoding" - "golang.org/x/text/encoding/internal" - "golang.org/x/text/encoding/internal/identifier" - "golang.org/x/text/transform" -) - -// HZGB2312 is the HZ-GB2312 encoding. -var HZGB2312 encoding.Encoding = &hzGB2312 - -var hzGB2312 = internal.Encoding{ - internal.FuncEncoding{hzGB2312NewDecoder, hzGB2312NewEncoder}, - "HZ-GB2312", - identifier.HZGB2312, -} - -func hzGB2312NewDecoder() transform.Transformer { - return new(hzGB2312Decoder) -} - -func hzGB2312NewEncoder() transform.Transformer { - return new(hzGB2312Encoder) -} - -const ( - asciiState = iota - gbState -) - -type hzGB2312Decoder int - -func (d *hzGB2312Decoder) Reset() { - *d = asciiState -} - -func (d *hzGB2312Decoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { - r, size := rune(0), 0 -loop: - for ; nSrc < len(src); nSrc += size { - c0 := src[nSrc] - if c0 >= utf8.RuneSelf { - r, size = utf8.RuneError, 1 - goto write - } - - if c0 == '~' { - if nSrc+1 >= len(src) { - if !atEOF { - err = transform.ErrShortSrc - break loop - } - r, size = utf8.RuneError, 1 - goto write - } - size = 2 - switch src[nSrc+1] { - case '{': - *d = gbState - continue - case '}': - *d = asciiState - continue - case '~': - if nDst >= len(dst) { - err = transform.ErrShortDst - break loop - } - dst[nDst] = '~' - nDst++ - continue - case '\n': - continue - default: - r = utf8.RuneError - goto write - } - } - - if *d == asciiState { - r, size = rune(c0), 1 - } else { - if nSrc+1 >= len(src) { - if !atEOF { - err = transform.ErrShortSrc - break loop - } - r, size = utf8.RuneError, 1 - goto write - } - size = 2 - c1 := src[nSrc+1] - if c0 < 0x21 || 0x7e <= c0 || c1 < 0x21 || 0x7f <= c1 { - // error - } else if i := int(c0-0x01)*190 + int(c1+0x3f); i < len(decode) { - r = rune(decode[i]) - if r != 0 { - goto write - } - } - if c1 > utf8.RuneSelf { - // Be consistent and always treat non-ASCII as a single error. - size = 1 - } - r = utf8.RuneError - } - - write: - if nDst+utf8.RuneLen(r) > len(dst) { - err = transform.ErrShortDst - break loop - } - nDst += utf8.EncodeRune(dst[nDst:], r) - } - return nDst, nSrc, err -} - -type hzGB2312Encoder int - -func (d *hzGB2312Encoder) Reset() { - *d = asciiState -} - -func (e *hzGB2312Encoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { - r, size := rune(0), 0 - for ; nSrc < len(src); nSrc += size { - r = rune(src[nSrc]) - - // Decode a 1-byte rune. - if r < utf8.RuneSelf { - size = 1 - if r == '~' { - if nDst+2 > len(dst) { - err = transform.ErrShortDst - break - } - dst[nDst+0] = '~' - dst[nDst+1] = '~' - nDst += 2 - continue - } else if *e != asciiState { - if nDst+3 > len(dst) { - err = transform.ErrShortDst - break - } - *e = asciiState - dst[nDst+0] = '~' - dst[nDst+1] = '}' - nDst += 2 - } else if nDst >= len(dst) { - err = transform.ErrShortDst - break - } - dst[nDst] = uint8(r) - nDst += 1 - continue - - } - - // Decode a multi-byte rune. - r, size = utf8.DecodeRune(src[nSrc:]) - if size == 1 { - // All valid runes of size 1 (those below utf8.RuneSelf) were - // handled above. We have invalid UTF-8 or we haven't seen the - // full character yet. - if !atEOF && !utf8.FullRune(src[nSrc:]) { - err = transform.ErrShortSrc - break - } - } - - // func init checks that the switch covers all tables. - switch { - case encode0Low <= r && r < encode0High: - if r = rune(encode0[r-encode0Low]); r != 0 { - goto writeGB - } - case encode1Low <= r && r < encode1High: - if r = rune(encode1[r-encode1Low]); r != 0 { - goto writeGB - } - case encode2Low <= r && r < encode2High: - if r = rune(encode2[r-encode2Low]); r != 0 { - goto writeGB - } - case encode3Low <= r && r < encode3High: - if r = rune(encode3[r-encode3Low]); r != 0 { - goto writeGB - } - case encode4Low <= r && r < encode4High: - if r = rune(encode4[r-encode4Low]); r != 0 { - goto writeGB - } - } - - terminateInASCIIState: - // Switch back to ASCII state in case of error so that an ASCII - // replacement character can be written in the correct state. - if *e != asciiState { - if nDst+2 > len(dst) { - err = transform.ErrShortDst - break - } - dst[nDst+0] = '~' - dst[nDst+1] = '}' - nDst += 2 - } - err = internal.ErrASCIIReplacement - break - - writeGB: - c0 := uint8(r>>8) - 0x80 - c1 := uint8(r) - 0x80 - if c0 < 0x21 || 0x7e <= c0 || c1 < 0x21 || 0x7f <= c1 { - goto terminateInASCIIState - } - if *e == asciiState { - if nDst+4 > len(dst) { - err = transform.ErrShortDst - break - } - *e = gbState - dst[nDst+0] = '~' - dst[nDst+1] = '{' - nDst += 2 - } else if nDst+2 > len(dst) { - err = transform.ErrShortDst - break - } - dst[nDst+0] = c0 - dst[nDst+1] = c1 - nDst += 2 - continue - } - // TODO: should one always terminate in ASCII state to make it safe to - // concatenate two HZ-GB2312-encoded strings? - return nDst, nSrc, err -} diff --git a/vendor/golang.org/x/text/encoding/simplifiedchinese/tables.go b/vendor/golang.org/x/text/encoding/simplifiedchinese/tables.go deleted file mode 100644 index 415f52a..0000000 --- a/vendor/golang.org/x/text/encoding/simplifiedchinese/tables.go +++ /dev/null @@ -1,43999 +0,0 @@ -// generated by go run maketables.go; DO NOT EDIT - -// Package simplifiedchinese provides Simplified Chinese encodings such as GBK. -package simplifiedchinese // import "golang.org/x/text/encoding/simplifiedchinese" - -// gb18030 is the table from http://encoding.spec.whatwg.org/index-gb18030.txt -var gb18030 = [...][2]uint16{ - {0x0000, 0x0080}, - {0x0024, 0x00a5}, - {0x0026, 0x00a9}, - {0x002d, 0x00b2}, - {0x0032, 0x00b8}, - {0x0051, 0x00d8}, - {0x0059, 0x00e2}, - {0x005f, 0x00eb}, - {0x0060, 0x00ee}, - {0x0064, 0x00f4}, - {0x0067, 0x00f8}, - {0x0068, 0x00fb}, - {0x0069, 0x00fd}, - {0x006d, 0x0102}, - {0x007e, 0x0114}, - {0x0085, 0x011c}, - {0x0094, 0x012c}, - {0x00ac, 0x0145}, - {0x00af, 0x0149}, - {0x00b3, 0x014e}, - {0x00d0, 0x016c}, - {0x0132, 0x01cf}, - {0x0133, 0x01d1}, - {0x0134, 0x01d3}, - {0x0135, 0x01d5}, - {0x0136, 0x01d7}, - {0x0137, 0x01d9}, - {0x0138, 0x01db}, - {0x0139, 0x01dd}, - {0x0155, 0x01fa}, - {0x01ac, 0x0252}, - {0x01bb, 0x0262}, - {0x0220, 0x02c8}, - {0x0221, 0x02cc}, - {0x022e, 0x02da}, - {0x02e5, 0x03a2}, - {0x02e6, 0x03aa}, - {0x02ed, 0x03c2}, - {0x02ee, 0x03ca}, - {0x0325, 0x0402}, - {0x0333, 0x0450}, - {0x0334, 0x0452}, - {0x1ef2, 0x2011}, - {0x1ef4, 0x2017}, - {0x1ef5, 0x201a}, - {0x1ef7, 0x201e}, - {0x1efe, 0x2027}, - {0x1f07, 0x2031}, - {0x1f08, 0x2034}, - {0x1f09, 0x2036}, - {0x1f0e, 0x203c}, - {0x1f7e, 0x20ad}, - {0x1fd4, 0x2104}, - {0x1fd5, 0x2106}, - {0x1fd8, 0x210a}, - {0x1fe4, 0x2117}, - {0x1fee, 0x2122}, - {0x202c, 0x216c}, - {0x2030, 0x217a}, - {0x2046, 0x2194}, - {0x2048, 0x219a}, - {0x20b6, 0x2209}, - {0x20bc, 0x2210}, - {0x20bd, 0x2212}, - {0x20c0, 0x2216}, - {0x20c4, 0x221b}, - {0x20c6, 0x2221}, - {0x20c8, 0x2224}, - {0x20c9, 0x2226}, - {0x20ca, 0x222c}, - {0x20cc, 0x222f}, - {0x20d1, 0x2238}, - {0x20d6, 0x223e}, - {0x20e0, 0x2249}, - {0x20e3, 0x224d}, - {0x20e8, 0x2253}, - {0x20f5, 0x2262}, - {0x20f7, 0x2268}, - {0x20fd, 0x2270}, - {0x2122, 0x2296}, - {0x2125, 0x229a}, - {0x2130, 0x22a6}, - {0x2149, 0x22c0}, - {0x219b, 0x2313}, - {0x22e8, 0x246a}, - {0x22f2, 0x249c}, - {0x2356, 0x254c}, - {0x235a, 0x2574}, - {0x2367, 0x2590}, - {0x236a, 0x2596}, - {0x2374, 0x25a2}, - {0x2384, 0x25b4}, - {0x238c, 0x25be}, - {0x2394, 0x25c8}, - {0x2397, 0x25cc}, - {0x2399, 0x25d0}, - {0x23ab, 0x25e6}, - {0x23ca, 0x2607}, - {0x23cc, 0x260a}, - {0x2402, 0x2641}, - {0x2403, 0x2643}, - {0x2c41, 0x2e82}, - {0x2c43, 0x2e85}, - {0x2c46, 0x2e89}, - {0x2c48, 0x2e8d}, - {0x2c52, 0x2e98}, - {0x2c61, 0x2ea8}, - {0x2c63, 0x2eab}, - {0x2c66, 0x2eaf}, - {0x2c6a, 0x2eb4}, - {0x2c6c, 0x2eb8}, - {0x2c6f, 0x2ebc}, - {0x2c7d, 0x2ecb}, - {0x2da2, 0x2ffc}, - {0x2da6, 0x3004}, - {0x2da7, 0x3018}, - {0x2dac, 0x301f}, - {0x2dae, 0x302a}, - {0x2dc2, 0x303f}, - {0x2dc4, 0x3094}, - {0x2dcb, 0x309f}, - {0x2dcd, 0x30f7}, - {0x2dd2, 0x30ff}, - {0x2dd8, 0x312a}, - {0x2ece, 0x322a}, - {0x2ed5, 0x3232}, - {0x2f46, 0x32a4}, - {0x3030, 0x3390}, - {0x303c, 0x339f}, - {0x303e, 0x33a2}, - {0x3060, 0x33c5}, - {0x3069, 0x33cf}, - {0x306b, 0x33d3}, - {0x306d, 0x33d6}, - {0x30de, 0x3448}, - {0x3109, 0x3474}, - {0x3233, 0x359f}, - {0x32a2, 0x360f}, - {0x32ad, 0x361b}, - {0x35aa, 0x3919}, - {0x35ff, 0x396f}, - {0x365f, 0x39d1}, - {0x366d, 0x39e0}, - {0x3700, 0x3a74}, - {0x37da, 0x3b4f}, - {0x38f9, 0x3c6f}, - {0x396a, 0x3ce1}, - {0x3cdf, 0x4057}, - {0x3de7, 0x4160}, - {0x3fbe, 0x4338}, - {0x4032, 0x43ad}, - {0x4036, 0x43b2}, - {0x4061, 0x43de}, - {0x4159, 0x44d7}, - {0x42ce, 0x464d}, - {0x42e2, 0x4662}, - {0x43a3, 0x4724}, - {0x43a8, 0x472a}, - {0x43fa, 0x477d}, - {0x440a, 0x478e}, - {0x45c3, 0x4948}, - {0x45f5, 0x497b}, - {0x45f7, 0x497e}, - {0x45fb, 0x4984}, - {0x45fc, 0x4987}, - {0x4610, 0x499c}, - {0x4613, 0x49a0}, - {0x4629, 0x49b8}, - {0x48e8, 0x4c78}, - {0x490f, 0x4ca4}, - {0x497e, 0x4d1a}, - {0x4a12, 0x4daf}, - {0x4a63, 0x9fa6}, - {0x82bd, 0xe76c}, - {0x82be, 0xe7c8}, - {0x82bf, 0xe7e7}, - {0x82cc, 0xe815}, - {0x82cd, 0xe819}, - {0x82d2, 0xe81f}, - {0x82d9, 0xe827}, - {0x82dd, 0xe82d}, - {0x82e1, 0xe833}, - {0x82e9, 0xe83c}, - {0x82f0, 0xe844}, - {0x8300, 0xe856}, - {0x830e, 0xe865}, - {0x93d5, 0xf92d}, - {0x9421, 0xf97a}, - {0x943c, 0xf996}, - {0x948d, 0xf9e8}, - {0x9496, 0xf9f2}, - {0x94b0, 0xfa10}, - {0x94b1, 0xfa12}, - {0x94b2, 0xfa15}, - {0x94b5, 0xfa19}, - {0x94bb, 0xfa22}, - {0x94bc, 0xfa25}, - {0x94be, 0xfa2a}, - {0x98c4, 0xfe32}, - {0x98c5, 0xfe45}, - {0x98c9, 0xfe53}, - {0x98ca, 0xfe58}, - {0x98cb, 0xfe67}, - {0x98cc, 0xfe6c}, - {0x9961, 0xff5f}, - {0x99e2, 0xffe6}, -} - -// decode is the decoding table from GBK code to Unicode. -// It is defined at http://encoding.spec.whatwg.org/index-gbk.txt -var decode = [...]uint16{ - 0: 0x4E02, - 1: 0x4E04, - 2: 0x4E05, - 3: 0x4E06, - 4: 0x4E0F, - 5: 0x4E12, - 6: 0x4E17, - 7: 0x4E1F, - 8: 0x4E20, - 9: 0x4E21, - 10: 0x4E23, - 11: 0x4E26, - 12: 0x4E29, - 13: 0x4E2E, - 14: 0x4E2F, - 15: 0x4E31, - 16: 0x4E33, - 17: 0x4E35, - 18: 0x4E37, - 19: 0x4E3C, - 20: 0x4E40, - 21: 0x4E41, - 22: 0x4E42, - 23: 0x4E44, - 24: 0x4E46, - 25: 0x4E4A, - 26: 0x4E51, - 27: 0x4E55, - 28: 0x4E57, - 29: 0x4E5A, - 30: 0x4E5B, - 31: 0x4E62, - 32: 0x4E63, - 33: 0x4E64, - 34: 0x4E65, - 35: 0x4E67, - 36: 0x4E68, - 37: 0x4E6A, - 38: 0x4E6B, - 39: 0x4E6C, - 40: 0x4E6D, - 41: 0x4E6E, - 42: 0x4E6F, - 43: 0x4E72, - 44: 0x4E74, - 45: 0x4E75, - 46: 0x4E76, - 47: 0x4E77, - 48: 0x4E78, - 49: 0x4E79, - 50: 0x4E7A, - 51: 0x4E7B, - 52: 0x4E7C, - 53: 0x4E7D, - 54: 0x4E7F, - 55: 0x4E80, - 56: 0x4E81, - 57: 0x4E82, - 58: 0x4E83, - 59: 0x4E84, - 60: 0x4E85, - 61: 0x4E87, - 62: 0x4E8A, - 63: 0x4E90, - 64: 0x4E96, - 65: 0x4E97, - 66: 0x4E99, - 67: 0x4E9C, - 68: 0x4E9D, - 69: 0x4E9E, - 70: 0x4EA3, - 71: 0x4EAA, - 72: 0x4EAF, - 73: 0x4EB0, - 74: 0x4EB1, - 75: 0x4EB4, - 76: 0x4EB6, - 77: 0x4EB7, - 78: 0x4EB8, - 79: 0x4EB9, - 80: 0x4EBC, - 81: 0x4EBD, - 82: 0x4EBE, - 83: 0x4EC8, - 84: 0x4ECC, - 85: 0x4ECF, - 86: 0x4ED0, - 87: 0x4ED2, - 88: 0x4EDA, - 89: 0x4EDB, - 90: 0x4EDC, - 91: 0x4EE0, - 92: 0x4EE2, - 93: 0x4EE6, - 94: 0x4EE7, - 95: 0x4EE9, - 96: 0x4EED, - 97: 0x4EEE, - 98: 0x4EEF, - 99: 0x4EF1, - 100: 0x4EF4, - 101: 0x4EF8, - 102: 0x4EF9, - 103: 0x4EFA, - 104: 0x4EFC, - 105: 0x4EFE, - 106: 0x4F00, - 107: 0x4F02, - 108: 0x4F03, - 109: 0x4F04, - 110: 0x4F05, - 111: 0x4F06, - 112: 0x4F07, - 113: 0x4F08, - 114: 0x4F0B, - 115: 0x4F0C, - 116: 0x4F12, - 117: 0x4F13, - 118: 0x4F14, - 119: 0x4F15, - 120: 0x4F16, - 121: 0x4F1C, - 122: 0x4F1D, - 123: 0x4F21, - 124: 0x4F23, - 125: 0x4F28, - 126: 0x4F29, - 127: 0x4F2C, - 128: 0x4F2D, - 129: 0x4F2E, - 130: 0x4F31, - 131: 0x4F33, - 132: 0x4F35, - 133: 0x4F37, - 134: 0x4F39, - 135: 0x4F3B, - 136: 0x4F3E, - 137: 0x4F3F, - 138: 0x4F40, - 139: 0x4F41, - 140: 0x4F42, - 141: 0x4F44, - 142: 0x4F45, - 143: 0x4F47, - 144: 0x4F48, - 145: 0x4F49, - 146: 0x4F4A, - 147: 0x4F4B, - 148: 0x4F4C, - 149: 0x4F52, - 150: 0x4F54, - 151: 0x4F56, - 152: 0x4F61, - 153: 0x4F62, - 154: 0x4F66, - 155: 0x4F68, - 156: 0x4F6A, - 157: 0x4F6B, - 158: 0x4F6D, - 159: 0x4F6E, - 160: 0x4F71, - 161: 0x4F72, - 162: 0x4F75, - 163: 0x4F77, - 164: 0x4F78, - 165: 0x4F79, - 166: 0x4F7A, - 167: 0x4F7D, - 168: 0x4F80, - 169: 0x4F81, - 170: 0x4F82, - 171: 0x4F85, - 172: 0x4F86, - 173: 0x4F87, - 174: 0x4F8A, - 175: 0x4F8C, - 176: 0x4F8E, - 177: 0x4F90, - 178: 0x4F92, - 179: 0x4F93, - 180: 0x4F95, - 181: 0x4F96, - 182: 0x4F98, - 183: 0x4F99, - 184: 0x4F9A, - 185: 0x4F9C, - 186: 0x4F9E, - 187: 0x4F9F, - 188: 0x4FA1, - 189: 0x4FA2, - 190: 0x4FA4, - 191: 0x4FAB, - 192: 0x4FAD, - 193: 0x4FB0, - 194: 0x4FB1, - 195: 0x4FB2, - 196: 0x4FB3, - 197: 0x4FB4, - 198: 0x4FB6, - 199: 0x4FB7, - 200: 0x4FB8, - 201: 0x4FB9, - 202: 0x4FBA, - 203: 0x4FBB, - 204: 0x4FBC, - 205: 0x4FBD, - 206: 0x4FBE, - 207: 0x4FC0, - 208: 0x4FC1, - 209: 0x4FC2, - 210: 0x4FC6, - 211: 0x4FC7, - 212: 0x4FC8, - 213: 0x4FC9, - 214: 0x4FCB, - 215: 0x4FCC, - 216: 0x4FCD, - 217: 0x4FD2, - 218: 0x4FD3, - 219: 0x4FD4, - 220: 0x4FD5, - 221: 0x4FD6, - 222: 0x4FD9, - 223: 0x4FDB, - 224: 0x4FE0, - 225: 0x4FE2, - 226: 0x4FE4, - 227: 0x4FE5, - 228: 0x4FE7, - 229: 0x4FEB, - 230: 0x4FEC, - 231: 0x4FF0, - 232: 0x4FF2, - 233: 0x4FF4, - 234: 0x4FF5, - 235: 0x4FF6, - 236: 0x4FF7, - 237: 0x4FF9, - 238: 0x4FFB, - 239: 0x4FFC, - 240: 0x4FFD, - 241: 0x4FFF, - 242: 0x5000, - 243: 0x5001, - 244: 0x5002, - 245: 0x5003, - 246: 0x5004, - 247: 0x5005, - 248: 0x5006, - 249: 0x5007, - 250: 0x5008, - 251: 0x5009, - 252: 0x500A, - 253: 0x500B, - 254: 0x500E, - 255: 0x5010, - 256: 0x5011, - 257: 0x5013, - 258: 0x5015, - 259: 0x5016, - 260: 0x5017, - 261: 0x501B, - 262: 0x501D, - 263: 0x501E, - 264: 0x5020, - 265: 0x5022, - 266: 0x5023, - 267: 0x5024, - 268: 0x5027, - 269: 0x502B, - 270: 0x502F, - 271: 0x5030, - 272: 0x5031, - 273: 0x5032, - 274: 0x5033, - 275: 0x5034, - 276: 0x5035, - 277: 0x5036, - 278: 0x5037, - 279: 0x5038, - 280: 0x5039, - 281: 0x503B, - 282: 0x503D, - 283: 0x503F, - 284: 0x5040, - 285: 0x5041, - 286: 0x5042, - 287: 0x5044, - 288: 0x5045, - 289: 0x5046, - 290: 0x5049, - 291: 0x504A, - 292: 0x504B, - 293: 0x504D, - 294: 0x5050, - 295: 0x5051, - 296: 0x5052, - 297: 0x5053, - 298: 0x5054, - 299: 0x5056, - 300: 0x5057, - 301: 0x5058, - 302: 0x5059, - 303: 0x505B, - 304: 0x505D, - 305: 0x505E, - 306: 0x505F, - 307: 0x5060, - 308: 0x5061, - 309: 0x5062, - 310: 0x5063, - 311: 0x5064, - 312: 0x5066, - 313: 0x5067, - 314: 0x5068, - 315: 0x5069, - 316: 0x506A, - 317: 0x506B, - 318: 0x506D, - 319: 0x506E, - 320: 0x506F, - 321: 0x5070, - 322: 0x5071, - 323: 0x5072, - 324: 0x5073, - 325: 0x5074, - 326: 0x5075, - 327: 0x5078, - 328: 0x5079, - 329: 0x507A, - 330: 0x507C, - 331: 0x507D, - 332: 0x5081, - 333: 0x5082, - 334: 0x5083, - 335: 0x5084, - 336: 0x5086, - 337: 0x5087, - 338: 0x5089, - 339: 0x508A, - 340: 0x508B, - 341: 0x508C, - 342: 0x508E, - 343: 0x508F, - 344: 0x5090, - 345: 0x5091, - 346: 0x5092, - 347: 0x5093, - 348: 0x5094, - 349: 0x5095, - 350: 0x5096, - 351: 0x5097, - 352: 0x5098, - 353: 0x5099, - 354: 0x509A, - 355: 0x509B, - 356: 0x509C, - 357: 0x509D, - 358: 0x509E, - 359: 0x509F, - 360: 0x50A0, - 361: 0x50A1, - 362: 0x50A2, - 363: 0x50A4, - 364: 0x50A6, - 365: 0x50AA, - 366: 0x50AB, - 367: 0x50AD, - 368: 0x50AE, - 369: 0x50AF, - 370: 0x50B0, - 371: 0x50B1, - 372: 0x50B3, - 373: 0x50B4, - 374: 0x50B5, - 375: 0x50B6, - 376: 0x50B7, - 377: 0x50B8, - 378: 0x50B9, - 379: 0x50BC, - 380: 0x50BD, - 381: 0x50BE, - 382: 0x50BF, - 383: 0x50C0, - 384: 0x50C1, - 385: 0x50C2, - 386: 0x50C3, - 387: 0x50C4, - 388: 0x50C5, - 389: 0x50C6, - 390: 0x50C7, - 391: 0x50C8, - 392: 0x50C9, - 393: 0x50CA, - 394: 0x50CB, - 395: 0x50CC, - 396: 0x50CD, - 397: 0x50CE, - 398: 0x50D0, - 399: 0x50D1, - 400: 0x50D2, - 401: 0x50D3, - 402: 0x50D4, - 403: 0x50D5, - 404: 0x50D7, - 405: 0x50D8, - 406: 0x50D9, - 407: 0x50DB, - 408: 0x50DC, - 409: 0x50DD, - 410: 0x50DE, - 411: 0x50DF, - 412: 0x50E0, - 413: 0x50E1, - 414: 0x50E2, - 415: 0x50E3, - 416: 0x50E4, - 417: 0x50E5, - 418: 0x50E8, - 419: 0x50E9, - 420: 0x50EA, - 421: 0x50EB, - 422: 0x50EF, - 423: 0x50F0, - 424: 0x50F1, - 425: 0x50F2, - 426: 0x50F4, - 427: 0x50F6, - 428: 0x50F7, - 429: 0x50F8, - 430: 0x50F9, - 431: 0x50FA, - 432: 0x50FC, - 433: 0x50FD, - 434: 0x50FE, - 435: 0x50FF, - 436: 0x5100, - 437: 0x5101, - 438: 0x5102, - 439: 0x5103, - 440: 0x5104, - 441: 0x5105, - 442: 0x5108, - 443: 0x5109, - 444: 0x510A, - 445: 0x510C, - 446: 0x510D, - 447: 0x510E, - 448: 0x510F, - 449: 0x5110, - 450: 0x5111, - 451: 0x5113, - 452: 0x5114, - 453: 0x5115, - 454: 0x5116, - 455: 0x5117, - 456: 0x5118, - 457: 0x5119, - 458: 0x511A, - 459: 0x511B, - 460: 0x511C, - 461: 0x511D, - 462: 0x511E, - 463: 0x511F, - 464: 0x5120, - 465: 0x5122, - 466: 0x5123, - 467: 0x5124, - 468: 0x5125, - 469: 0x5126, - 470: 0x5127, - 471: 0x5128, - 472: 0x5129, - 473: 0x512A, - 474: 0x512B, - 475: 0x512C, - 476: 0x512D, - 477: 0x512E, - 478: 0x512F, - 479: 0x5130, - 480: 0x5131, - 481: 0x5132, - 482: 0x5133, - 483: 0x5134, - 484: 0x5135, - 485: 0x5136, - 486: 0x5137, - 487: 0x5138, - 488: 0x5139, - 489: 0x513A, - 490: 0x513B, - 491: 0x513C, - 492: 0x513D, - 493: 0x513E, - 494: 0x5142, - 495: 0x5147, - 496: 0x514A, - 497: 0x514C, - 498: 0x514E, - 499: 0x514F, - 500: 0x5150, - 501: 0x5152, - 502: 0x5153, - 503: 0x5157, - 504: 0x5158, - 505: 0x5159, - 506: 0x515B, - 507: 0x515D, - 508: 0x515E, - 509: 0x515F, - 510: 0x5160, - 511: 0x5161, - 512: 0x5163, - 513: 0x5164, - 514: 0x5166, - 515: 0x5167, - 516: 0x5169, - 517: 0x516A, - 518: 0x516F, - 519: 0x5172, - 520: 0x517A, - 521: 0x517E, - 522: 0x517F, - 523: 0x5183, - 524: 0x5184, - 525: 0x5186, - 526: 0x5187, - 527: 0x518A, - 528: 0x518B, - 529: 0x518E, - 530: 0x518F, - 531: 0x5190, - 532: 0x5191, - 533: 0x5193, - 534: 0x5194, - 535: 0x5198, - 536: 0x519A, - 537: 0x519D, - 538: 0x519E, - 539: 0x519F, - 540: 0x51A1, - 541: 0x51A3, - 542: 0x51A6, - 543: 0x51A7, - 544: 0x51A8, - 545: 0x51A9, - 546: 0x51AA, - 547: 0x51AD, - 548: 0x51AE, - 549: 0x51B4, - 550: 0x51B8, - 551: 0x51B9, - 552: 0x51BA, - 553: 0x51BE, - 554: 0x51BF, - 555: 0x51C1, - 556: 0x51C2, - 557: 0x51C3, - 558: 0x51C5, - 559: 0x51C8, - 560: 0x51CA, - 561: 0x51CD, - 562: 0x51CE, - 563: 0x51D0, - 564: 0x51D2, - 565: 0x51D3, - 566: 0x51D4, - 567: 0x51D5, - 568: 0x51D6, - 569: 0x51D7, - 570: 0x51D8, - 571: 0x51D9, - 572: 0x51DA, - 573: 0x51DC, - 574: 0x51DE, - 575: 0x51DF, - 576: 0x51E2, - 577: 0x51E3, - 578: 0x51E5, - 579: 0x51E6, - 580: 0x51E7, - 581: 0x51E8, - 582: 0x51E9, - 583: 0x51EA, - 584: 0x51EC, - 585: 0x51EE, - 586: 0x51F1, - 587: 0x51F2, - 588: 0x51F4, - 589: 0x51F7, - 590: 0x51FE, - 591: 0x5204, - 592: 0x5205, - 593: 0x5209, - 594: 0x520B, - 595: 0x520C, - 596: 0x520F, - 597: 0x5210, - 598: 0x5213, - 599: 0x5214, - 600: 0x5215, - 601: 0x521C, - 602: 0x521E, - 603: 0x521F, - 604: 0x5221, - 605: 0x5222, - 606: 0x5223, - 607: 0x5225, - 608: 0x5226, - 609: 0x5227, - 610: 0x522A, - 611: 0x522C, - 612: 0x522F, - 613: 0x5231, - 614: 0x5232, - 615: 0x5234, - 616: 0x5235, - 617: 0x523C, - 618: 0x523E, - 619: 0x5244, - 620: 0x5245, - 621: 0x5246, - 622: 0x5247, - 623: 0x5248, - 624: 0x5249, - 625: 0x524B, - 626: 0x524E, - 627: 0x524F, - 628: 0x5252, - 629: 0x5253, - 630: 0x5255, - 631: 0x5257, - 632: 0x5258, - 633: 0x5259, - 634: 0x525A, - 635: 0x525B, - 636: 0x525D, - 637: 0x525F, - 638: 0x5260, - 639: 0x5262, - 640: 0x5263, - 641: 0x5264, - 642: 0x5266, - 643: 0x5268, - 644: 0x526B, - 645: 0x526C, - 646: 0x526D, - 647: 0x526E, - 648: 0x5270, - 649: 0x5271, - 650: 0x5273, - 651: 0x5274, - 652: 0x5275, - 653: 0x5276, - 654: 0x5277, - 655: 0x5278, - 656: 0x5279, - 657: 0x527A, - 658: 0x527B, - 659: 0x527C, - 660: 0x527E, - 661: 0x5280, - 662: 0x5283, - 663: 0x5284, - 664: 0x5285, - 665: 0x5286, - 666: 0x5287, - 667: 0x5289, - 668: 0x528A, - 669: 0x528B, - 670: 0x528C, - 671: 0x528D, - 672: 0x528E, - 673: 0x528F, - 674: 0x5291, - 675: 0x5292, - 676: 0x5294, - 677: 0x5295, - 678: 0x5296, - 679: 0x5297, - 680: 0x5298, - 681: 0x5299, - 682: 0x529A, - 683: 0x529C, - 684: 0x52A4, - 685: 0x52A5, - 686: 0x52A6, - 687: 0x52A7, - 688: 0x52AE, - 689: 0x52AF, - 690: 0x52B0, - 691: 0x52B4, - 692: 0x52B5, - 693: 0x52B6, - 694: 0x52B7, - 695: 0x52B8, - 696: 0x52B9, - 697: 0x52BA, - 698: 0x52BB, - 699: 0x52BC, - 700: 0x52BD, - 701: 0x52C0, - 702: 0x52C1, - 703: 0x52C2, - 704: 0x52C4, - 705: 0x52C5, - 706: 0x52C6, - 707: 0x52C8, - 708: 0x52CA, - 709: 0x52CC, - 710: 0x52CD, - 711: 0x52CE, - 712: 0x52CF, - 713: 0x52D1, - 714: 0x52D3, - 715: 0x52D4, - 716: 0x52D5, - 717: 0x52D7, - 718: 0x52D9, - 719: 0x52DA, - 720: 0x52DB, - 721: 0x52DC, - 722: 0x52DD, - 723: 0x52DE, - 724: 0x52E0, - 725: 0x52E1, - 726: 0x52E2, - 727: 0x52E3, - 728: 0x52E5, - 729: 0x52E6, - 730: 0x52E7, - 731: 0x52E8, - 732: 0x52E9, - 733: 0x52EA, - 734: 0x52EB, - 735: 0x52EC, - 736: 0x52ED, - 737: 0x52EE, - 738: 0x52EF, - 739: 0x52F1, - 740: 0x52F2, - 741: 0x52F3, - 742: 0x52F4, - 743: 0x52F5, - 744: 0x52F6, - 745: 0x52F7, - 746: 0x52F8, - 747: 0x52FB, - 748: 0x52FC, - 749: 0x52FD, - 750: 0x5301, - 751: 0x5302, - 752: 0x5303, - 753: 0x5304, - 754: 0x5307, - 755: 0x5309, - 756: 0x530A, - 757: 0x530B, - 758: 0x530C, - 759: 0x530E, - 760: 0x5311, - 761: 0x5312, - 762: 0x5313, - 763: 0x5314, - 764: 0x5318, - 765: 0x531B, - 766: 0x531C, - 767: 0x531E, - 768: 0x531F, - 769: 0x5322, - 770: 0x5324, - 771: 0x5325, - 772: 0x5327, - 773: 0x5328, - 774: 0x5329, - 775: 0x532B, - 776: 0x532C, - 777: 0x532D, - 778: 0x532F, - 779: 0x5330, - 780: 0x5331, - 781: 0x5332, - 782: 0x5333, - 783: 0x5334, - 784: 0x5335, - 785: 0x5336, - 786: 0x5337, - 787: 0x5338, - 788: 0x533C, - 789: 0x533D, - 790: 0x5340, - 791: 0x5342, - 792: 0x5344, - 793: 0x5346, - 794: 0x534B, - 795: 0x534C, - 796: 0x534D, - 797: 0x5350, - 798: 0x5354, - 799: 0x5358, - 800: 0x5359, - 801: 0x535B, - 802: 0x535D, - 803: 0x5365, - 804: 0x5368, - 805: 0x536A, - 806: 0x536C, - 807: 0x536D, - 808: 0x5372, - 809: 0x5376, - 810: 0x5379, - 811: 0x537B, - 812: 0x537C, - 813: 0x537D, - 814: 0x537E, - 815: 0x5380, - 816: 0x5381, - 817: 0x5383, - 818: 0x5387, - 819: 0x5388, - 820: 0x538A, - 821: 0x538E, - 822: 0x538F, - 823: 0x5390, - 824: 0x5391, - 825: 0x5392, - 826: 0x5393, - 827: 0x5394, - 828: 0x5396, - 829: 0x5397, - 830: 0x5399, - 831: 0x539B, - 832: 0x539C, - 833: 0x539E, - 834: 0x53A0, - 835: 0x53A1, - 836: 0x53A4, - 837: 0x53A7, - 838: 0x53AA, - 839: 0x53AB, - 840: 0x53AC, - 841: 0x53AD, - 842: 0x53AF, - 843: 0x53B0, - 844: 0x53B1, - 845: 0x53B2, - 846: 0x53B3, - 847: 0x53B4, - 848: 0x53B5, - 849: 0x53B7, - 850: 0x53B8, - 851: 0x53B9, - 852: 0x53BA, - 853: 0x53BC, - 854: 0x53BD, - 855: 0x53BE, - 856: 0x53C0, - 857: 0x53C3, - 858: 0x53C4, - 859: 0x53C5, - 860: 0x53C6, - 861: 0x53C7, - 862: 0x53CE, - 863: 0x53CF, - 864: 0x53D0, - 865: 0x53D2, - 866: 0x53D3, - 867: 0x53D5, - 868: 0x53DA, - 869: 0x53DC, - 870: 0x53DD, - 871: 0x53DE, - 872: 0x53E1, - 873: 0x53E2, - 874: 0x53E7, - 875: 0x53F4, - 876: 0x53FA, - 877: 0x53FE, - 878: 0x53FF, - 879: 0x5400, - 880: 0x5402, - 881: 0x5405, - 882: 0x5407, - 883: 0x540B, - 884: 0x5414, - 885: 0x5418, - 886: 0x5419, - 887: 0x541A, - 888: 0x541C, - 889: 0x5422, - 890: 0x5424, - 891: 0x5425, - 892: 0x542A, - 893: 0x5430, - 894: 0x5433, - 895: 0x5436, - 896: 0x5437, - 897: 0x543A, - 898: 0x543D, - 899: 0x543F, - 900: 0x5441, - 901: 0x5442, - 902: 0x5444, - 903: 0x5445, - 904: 0x5447, - 905: 0x5449, - 906: 0x544C, - 907: 0x544D, - 908: 0x544E, - 909: 0x544F, - 910: 0x5451, - 911: 0x545A, - 912: 0x545D, - 913: 0x545E, - 914: 0x545F, - 915: 0x5460, - 916: 0x5461, - 917: 0x5463, - 918: 0x5465, - 919: 0x5467, - 920: 0x5469, - 921: 0x546A, - 922: 0x546B, - 923: 0x546C, - 924: 0x546D, - 925: 0x546E, - 926: 0x546F, - 927: 0x5470, - 928: 0x5474, - 929: 0x5479, - 930: 0x547A, - 931: 0x547E, - 932: 0x547F, - 933: 0x5481, - 934: 0x5483, - 935: 0x5485, - 936: 0x5487, - 937: 0x5488, - 938: 0x5489, - 939: 0x548A, - 940: 0x548D, - 941: 0x5491, - 942: 0x5493, - 943: 0x5497, - 944: 0x5498, - 945: 0x549C, - 946: 0x549E, - 947: 0x549F, - 948: 0x54A0, - 949: 0x54A1, - 950: 0x54A2, - 951: 0x54A5, - 952: 0x54AE, - 953: 0x54B0, - 954: 0x54B2, - 955: 0x54B5, - 956: 0x54B6, - 957: 0x54B7, - 958: 0x54B9, - 959: 0x54BA, - 960: 0x54BC, - 961: 0x54BE, - 962: 0x54C3, - 963: 0x54C5, - 964: 0x54CA, - 965: 0x54CB, - 966: 0x54D6, - 967: 0x54D8, - 968: 0x54DB, - 969: 0x54E0, - 970: 0x54E1, - 971: 0x54E2, - 972: 0x54E3, - 973: 0x54E4, - 974: 0x54EB, - 975: 0x54EC, - 976: 0x54EF, - 977: 0x54F0, - 978: 0x54F1, - 979: 0x54F4, - 980: 0x54F5, - 981: 0x54F6, - 982: 0x54F7, - 983: 0x54F8, - 984: 0x54F9, - 985: 0x54FB, - 986: 0x54FE, - 987: 0x5500, - 988: 0x5502, - 989: 0x5503, - 990: 0x5504, - 991: 0x5505, - 992: 0x5508, - 993: 0x550A, - 994: 0x550B, - 995: 0x550C, - 996: 0x550D, - 997: 0x550E, - 998: 0x5512, - 999: 0x5513, - 1000: 0x5515, - 1001: 0x5516, - 1002: 0x5517, - 1003: 0x5518, - 1004: 0x5519, - 1005: 0x551A, - 1006: 0x551C, - 1007: 0x551D, - 1008: 0x551E, - 1009: 0x551F, - 1010: 0x5521, - 1011: 0x5525, - 1012: 0x5526, - 1013: 0x5528, - 1014: 0x5529, - 1015: 0x552B, - 1016: 0x552D, - 1017: 0x5532, - 1018: 0x5534, - 1019: 0x5535, - 1020: 0x5536, - 1021: 0x5538, - 1022: 0x5539, - 1023: 0x553A, - 1024: 0x553B, - 1025: 0x553D, - 1026: 0x5540, - 1027: 0x5542, - 1028: 0x5545, - 1029: 0x5547, - 1030: 0x5548, - 1031: 0x554B, - 1032: 0x554C, - 1033: 0x554D, - 1034: 0x554E, - 1035: 0x554F, - 1036: 0x5551, - 1037: 0x5552, - 1038: 0x5553, - 1039: 0x5554, - 1040: 0x5557, - 1041: 0x5558, - 1042: 0x5559, - 1043: 0x555A, - 1044: 0x555B, - 1045: 0x555D, - 1046: 0x555E, - 1047: 0x555F, - 1048: 0x5560, - 1049: 0x5562, - 1050: 0x5563, - 1051: 0x5568, - 1052: 0x5569, - 1053: 0x556B, - 1054: 0x556F, - 1055: 0x5570, - 1056: 0x5571, - 1057: 0x5572, - 1058: 0x5573, - 1059: 0x5574, - 1060: 0x5579, - 1061: 0x557A, - 1062: 0x557D, - 1063: 0x557F, - 1064: 0x5585, - 1065: 0x5586, - 1066: 0x558C, - 1067: 0x558D, - 1068: 0x558E, - 1069: 0x5590, - 1070: 0x5592, - 1071: 0x5593, - 1072: 0x5595, - 1073: 0x5596, - 1074: 0x5597, - 1075: 0x559A, - 1076: 0x559B, - 1077: 0x559E, - 1078: 0x55A0, - 1079: 0x55A1, - 1080: 0x55A2, - 1081: 0x55A3, - 1082: 0x55A4, - 1083: 0x55A5, - 1084: 0x55A6, - 1085: 0x55A8, - 1086: 0x55A9, - 1087: 0x55AA, - 1088: 0x55AB, - 1089: 0x55AC, - 1090: 0x55AD, - 1091: 0x55AE, - 1092: 0x55AF, - 1093: 0x55B0, - 1094: 0x55B2, - 1095: 0x55B4, - 1096: 0x55B6, - 1097: 0x55B8, - 1098: 0x55BA, - 1099: 0x55BC, - 1100: 0x55BF, - 1101: 0x55C0, - 1102: 0x55C1, - 1103: 0x55C2, - 1104: 0x55C3, - 1105: 0x55C6, - 1106: 0x55C7, - 1107: 0x55C8, - 1108: 0x55CA, - 1109: 0x55CB, - 1110: 0x55CE, - 1111: 0x55CF, - 1112: 0x55D0, - 1113: 0x55D5, - 1114: 0x55D7, - 1115: 0x55D8, - 1116: 0x55D9, - 1117: 0x55DA, - 1118: 0x55DB, - 1119: 0x55DE, - 1120: 0x55E0, - 1121: 0x55E2, - 1122: 0x55E7, - 1123: 0x55E9, - 1124: 0x55ED, - 1125: 0x55EE, - 1126: 0x55F0, - 1127: 0x55F1, - 1128: 0x55F4, - 1129: 0x55F6, - 1130: 0x55F8, - 1131: 0x55F9, - 1132: 0x55FA, - 1133: 0x55FB, - 1134: 0x55FC, - 1135: 0x55FF, - 1136: 0x5602, - 1137: 0x5603, - 1138: 0x5604, - 1139: 0x5605, - 1140: 0x5606, - 1141: 0x5607, - 1142: 0x560A, - 1143: 0x560B, - 1144: 0x560D, - 1145: 0x5610, - 1146: 0x5611, - 1147: 0x5612, - 1148: 0x5613, - 1149: 0x5614, - 1150: 0x5615, - 1151: 0x5616, - 1152: 0x5617, - 1153: 0x5619, - 1154: 0x561A, - 1155: 0x561C, - 1156: 0x561D, - 1157: 0x5620, - 1158: 0x5621, - 1159: 0x5622, - 1160: 0x5625, - 1161: 0x5626, - 1162: 0x5628, - 1163: 0x5629, - 1164: 0x562A, - 1165: 0x562B, - 1166: 0x562E, - 1167: 0x562F, - 1168: 0x5630, - 1169: 0x5633, - 1170: 0x5635, - 1171: 0x5637, - 1172: 0x5638, - 1173: 0x563A, - 1174: 0x563C, - 1175: 0x563D, - 1176: 0x563E, - 1177: 0x5640, - 1178: 0x5641, - 1179: 0x5642, - 1180: 0x5643, - 1181: 0x5644, - 1182: 0x5645, - 1183: 0x5646, - 1184: 0x5647, - 1185: 0x5648, - 1186: 0x5649, - 1187: 0x564A, - 1188: 0x564B, - 1189: 0x564F, - 1190: 0x5650, - 1191: 0x5651, - 1192: 0x5652, - 1193: 0x5653, - 1194: 0x5655, - 1195: 0x5656, - 1196: 0x565A, - 1197: 0x565B, - 1198: 0x565D, - 1199: 0x565E, - 1200: 0x565F, - 1201: 0x5660, - 1202: 0x5661, - 1203: 0x5663, - 1204: 0x5665, - 1205: 0x5666, - 1206: 0x5667, - 1207: 0x566D, - 1208: 0x566E, - 1209: 0x566F, - 1210: 0x5670, - 1211: 0x5672, - 1212: 0x5673, - 1213: 0x5674, - 1214: 0x5675, - 1215: 0x5677, - 1216: 0x5678, - 1217: 0x5679, - 1218: 0x567A, - 1219: 0x567D, - 1220: 0x567E, - 1221: 0x567F, - 1222: 0x5680, - 1223: 0x5681, - 1224: 0x5682, - 1225: 0x5683, - 1226: 0x5684, - 1227: 0x5687, - 1228: 0x5688, - 1229: 0x5689, - 1230: 0x568A, - 1231: 0x568B, - 1232: 0x568C, - 1233: 0x568D, - 1234: 0x5690, - 1235: 0x5691, - 1236: 0x5692, - 1237: 0x5694, - 1238: 0x5695, - 1239: 0x5696, - 1240: 0x5697, - 1241: 0x5698, - 1242: 0x5699, - 1243: 0x569A, - 1244: 0x569B, - 1245: 0x569C, - 1246: 0x569D, - 1247: 0x569E, - 1248: 0x569F, - 1249: 0x56A0, - 1250: 0x56A1, - 1251: 0x56A2, - 1252: 0x56A4, - 1253: 0x56A5, - 1254: 0x56A6, - 1255: 0x56A7, - 1256: 0x56A8, - 1257: 0x56A9, - 1258: 0x56AA, - 1259: 0x56AB, - 1260: 0x56AC, - 1261: 0x56AD, - 1262: 0x56AE, - 1263: 0x56B0, - 1264: 0x56B1, - 1265: 0x56B2, - 1266: 0x56B3, - 1267: 0x56B4, - 1268: 0x56B5, - 1269: 0x56B6, - 1270: 0x56B8, - 1271: 0x56B9, - 1272: 0x56BA, - 1273: 0x56BB, - 1274: 0x56BD, - 1275: 0x56BE, - 1276: 0x56BF, - 1277: 0x56C0, - 1278: 0x56C1, - 1279: 0x56C2, - 1280: 0x56C3, - 1281: 0x56C4, - 1282: 0x56C5, - 1283: 0x56C6, - 1284: 0x56C7, - 1285: 0x56C8, - 1286: 0x56C9, - 1287: 0x56CB, - 1288: 0x56CC, - 1289: 0x56CD, - 1290: 0x56CE, - 1291: 0x56CF, - 1292: 0x56D0, - 1293: 0x56D1, - 1294: 0x56D2, - 1295: 0x56D3, - 1296: 0x56D5, - 1297: 0x56D6, - 1298: 0x56D8, - 1299: 0x56D9, - 1300: 0x56DC, - 1301: 0x56E3, - 1302: 0x56E5, - 1303: 0x56E6, - 1304: 0x56E7, - 1305: 0x56E8, - 1306: 0x56E9, - 1307: 0x56EA, - 1308: 0x56EC, - 1309: 0x56EE, - 1310: 0x56EF, - 1311: 0x56F2, - 1312: 0x56F3, - 1313: 0x56F6, - 1314: 0x56F7, - 1315: 0x56F8, - 1316: 0x56FB, - 1317: 0x56FC, - 1318: 0x5700, - 1319: 0x5701, - 1320: 0x5702, - 1321: 0x5705, - 1322: 0x5707, - 1323: 0x570B, - 1324: 0x570C, - 1325: 0x570D, - 1326: 0x570E, - 1327: 0x570F, - 1328: 0x5710, - 1329: 0x5711, - 1330: 0x5712, - 1331: 0x5713, - 1332: 0x5714, - 1333: 0x5715, - 1334: 0x5716, - 1335: 0x5717, - 1336: 0x5718, - 1337: 0x5719, - 1338: 0x571A, - 1339: 0x571B, - 1340: 0x571D, - 1341: 0x571E, - 1342: 0x5720, - 1343: 0x5721, - 1344: 0x5722, - 1345: 0x5724, - 1346: 0x5725, - 1347: 0x5726, - 1348: 0x5727, - 1349: 0x572B, - 1350: 0x5731, - 1351: 0x5732, - 1352: 0x5734, - 1353: 0x5735, - 1354: 0x5736, - 1355: 0x5737, - 1356: 0x5738, - 1357: 0x573C, - 1358: 0x573D, - 1359: 0x573F, - 1360: 0x5741, - 1361: 0x5743, - 1362: 0x5744, - 1363: 0x5745, - 1364: 0x5746, - 1365: 0x5748, - 1366: 0x5749, - 1367: 0x574B, - 1368: 0x5752, - 1369: 0x5753, - 1370: 0x5754, - 1371: 0x5755, - 1372: 0x5756, - 1373: 0x5758, - 1374: 0x5759, - 1375: 0x5762, - 1376: 0x5763, - 1377: 0x5765, - 1378: 0x5767, - 1379: 0x576C, - 1380: 0x576E, - 1381: 0x5770, - 1382: 0x5771, - 1383: 0x5772, - 1384: 0x5774, - 1385: 0x5775, - 1386: 0x5778, - 1387: 0x5779, - 1388: 0x577A, - 1389: 0x577D, - 1390: 0x577E, - 1391: 0x577F, - 1392: 0x5780, - 1393: 0x5781, - 1394: 0x5787, - 1395: 0x5788, - 1396: 0x5789, - 1397: 0x578A, - 1398: 0x578D, - 1399: 0x578E, - 1400: 0x578F, - 1401: 0x5790, - 1402: 0x5791, - 1403: 0x5794, - 1404: 0x5795, - 1405: 0x5796, - 1406: 0x5797, - 1407: 0x5798, - 1408: 0x5799, - 1409: 0x579A, - 1410: 0x579C, - 1411: 0x579D, - 1412: 0x579E, - 1413: 0x579F, - 1414: 0x57A5, - 1415: 0x57A8, - 1416: 0x57AA, - 1417: 0x57AC, - 1418: 0x57AF, - 1419: 0x57B0, - 1420: 0x57B1, - 1421: 0x57B3, - 1422: 0x57B5, - 1423: 0x57B6, - 1424: 0x57B7, - 1425: 0x57B9, - 1426: 0x57BA, - 1427: 0x57BB, - 1428: 0x57BC, - 1429: 0x57BD, - 1430: 0x57BE, - 1431: 0x57BF, - 1432: 0x57C0, - 1433: 0x57C1, - 1434: 0x57C4, - 1435: 0x57C5, - 1436: 0x57C6, - 1437: 0x57C7, - 1438: 0x57C8, - 1439: 0x57C9, - 1440: 0x57CA, - 1441: 0x57CC, - 1442: 0x57CD, - 1443: 0x57D0, - 1444: 0x57D1, - 1445: 0x57D3, - 1446: 0x57D6, - 1447: 0x57D7, - 1448: 0x57DB, - 1449: 0x57DC, - 1450: 0x57DE, - 1451: 0x57E1, - 1452: 0x57E2, - 1453: 0x57E3, - 1454: 0x57E5, - 1455: 0x57E6, - 1456: 0x57E7, - 1457: 0x57E8, - 1458: 0x57E9, - 1459: 0x57EA, - 1460: 0x57EB, - 1461: 0x57EC, - 1462: 0x57EE, - 1463: 0x57F0, - 1464: 0x57F1, - 1465: 0x57F2, - 1466: 0x57F3, - 1467: 0x57F5, - 1468: 0x57F6, - 1469: 0x57F7, - 1470: 0x57FB, - 1471: 0x57FC, - 1472: 0x57FE, - 1473: 0x57FF, - 1474: 0x5801, - 1475: 0x5803, - 1476: 0x5804, - 1477: 0x5805, - 1478: 0x5808, - 1479: 0x5809, - 1480: 0x580A, - 1481: 0x580C, - 1482: 0x580E, - 1483: 0x580F, - 1484: 0x5810, - 1485: 0x5812, - 1486: 0x5813, - 1487: 0x5814, - 1488: 0x5816, - 1489: 0x5817, - 1490: 0x5818, - 1491: 0x581A, - 1492: 0x581B, - 1493: 0x581C, - 1494: 0x581D, - 1495: 0x581F, - 1496: 0x5822, - 1497: 0x5823, - 1498: 0x5825, - 1499: 0x5826, - 1500: 0x5827, - 1501: 0x5828, - 1502: 0x5829, - 1503: 0x582B, - 1504: 0x582C, - 1505: 0x582D, - 1506: 0x582E, - 1507: 0x582F, - 1508: 0x5831, - 1509: 0x5832, - 1510: 0x5833, - 1511: 0x5834, - 1512: 0x5836, - 1513: 0x5837, - 1514: 0x5838, - 1515: 0x5839, - 1516: 0x583A, - 1517: 0x583B, - 1518: 0x583C, - 1519: 0x583D, - 1520: 0x583E, - 1521: 0x583F, - 1522: 0x5840, - 1523: 0x5841, - 1524: 0x5842, - 1525: 0x5843, - 1526: 0x5845, - 1527: 0x5846, - 1528: 0x5847, - 1529: 0x5848, - 1530: 0x5849, - 1531: 0x584A, - 1532: 0x584B, - 1533: 0x584E, - 1534: 0x584F, - 1535: 0x5850, - 1536: 0x5852, - 1537: 0x5853, - 1538: 0x5855, - 1539: 0x5856, - 1540: 0x5857, - 1541: 0x5859, - 1542: 0x585A, - 1543: 0x585B, - 1544: 0x585C, - 1545: 0x585D, - 1546: 0x585F, - 1547: 0x5860, - 1548: 0x5861, - 1549: 0x5862, - 1550: 0x5863, - 1551: 0x5864, - 1552: 0x5866, - 1553: 0x5867, - 1554: 0x5868, - 1555: 0x5869, - 1556: 0x586A, - 1557: 0x586D, - 1558: 0x586E, - 1559: 0x586F, - 1560: 0x5870, - 1561: 0x5871, - 1562: 0x5872, - 1563: 0x5873, - 1564: 0x5874, - 1565: 0x5875, - 1566: 0x5876, - 1567: 0x5877, - 1568: 0x5878, - 1569: 0x5879, - 1570: 0x587A, - 1571: 0x587B, - 1572: 0x587C, - 1573: 0x587D, - 1574: 0x587F, - 1575: 0x5882, - 1576: 0x5884, - 1577: 0x5886, - 1578: 0x5887, - 1579: 0x5888, - 1580: 0x588A, - 1581: 0x588B, - 1582: 0x588C, - 1583: 0x588D, - 1584: 0x588E, - 1585: 0x588F, - 1586: 0x5890, - 1587: 0x5891, - 1588: 0x5894, - 1589: 0x5895, - 1590: 0x5896, - 1591: 0x5897, - 1592: 0x5898, - 1593: 0x589B, - 1594: 0x589C, - 1595: 0x589D, - 1596: 0x58A0, - 1597: 0x58A1, - 1598: 0x58A2, - 1599: 0x58A3, - 1600: 0x58A4, - 1601: 0x58A5, - 1602: 0x58A6, - 1603: 0x58A7, - 1604: 0x58AA, - 1605: 0x58AB, - 1606: 0x58AC, - 1607: 0x58AD, - 1608: 0x58AE, - 1609: 0x58AF, - 1610: 0x58B0, - 1611: 0x58B1, - 1612: 0x58B2, - 1613: 0x58B3, - 1614: 0x58B4, - 1615: 0x58B5, - 1616: 0x58B6, - 1617: 0x58B7, - 1618: 0x58B8, - 1619: 0x58B9, - 1620: 0x58BA, - 1621: 0x58BB, - 1622: 0x58BD, - 1623: 0x58BE, - 1624: 0x58BF, - 1625: 0x58C0, - 1626: 0x58C2, - 1627: 0x58C3, - 1628: 0x58C4, - 1629: 0x58C6, - 1630: 0x58C7, - 1631: 0x58C8, - 1632: 0x58C9, - 1633: 0x58CA, - 1634: 0x58CB, - 1635: 0x58CC, - 1636: 0x58CD, - 1637: 0x58CE, - 1638: 0x58CF, - 1639: 0x58D0, - 1640: 0x58D2, - 1641: 0x58D3, - 1642: 0x58D4, - 1643: 0x58D6, - 1644: 0x58D7, - 1645: 0x58D8, - 1646: 0x58D9, - 1647: 0x58DA, - 1648: 0x58DB, - 1649: 0x58DC, - 1650: 0x58DD, - 1651: 0x58DE, - 1652: 0x58DF, - 1653: 0x58E0, - 1654: 0x58E1, - 1655: 0x58E2, - 1656: 0x58E3, - 1657: 0x58E5, - 1658: 0x58E6, - 1659: 0x58E7, - 1660: 0x58E8, - 1661: 0x58E9, - 1662: 0x58EA, - 1663: 0x58ED, - 1664: 0x58EF, - 1665: 0x58F1, - 1666: 0x58F2, - 1667: 0x58F4, - 1668: 0x58F5, - 1669: 0x58F7, - 1670: 0x58F8, - 1671: 0x58FA, - 1672: 0x58FB, - 1673: 0x58FC, - 1674: 0x58FD, - 1675: 0x58FE, - 1676: 0x58FF, - 1677: 0x5900, - 1678: 0x5901, - 1679: 0x5903, - 1680: 0x5905, - 1681: 0x5906, - 1682: 0x5908, - 1683: 0x5909, - 1684: 0x590A, - 1685: 0x590B, - 1686: 0x590C, - 1687: 0x590E, - 1688: 0x5910, - 1689: 0x5911, - 1690: 0x5912, - 1691: 0x5913, - 1692: 0x5917, - 1693: 0x5918, - 1694: 0x591B, - 1695: 0x591D, - 1696: 0x591E, - 1697: 0x5920, - 1698: 0x5921, - 1699: 0x5922, - 1700: 0x5923, - 1701: 0x5926, - 1702: 0x5928, - 1703: 0x592C, - 1704: 0x5930, - 1705: 0x5932, - 1706: 0x5933, - 1707: 0x5935, - 1708: 0x5936, - 1709: 0x593B, - 1710: 0x593D, - 1711: 0x593E, - 1712: 0x593F, - 1713: 0x5940, - 1714: 0x5943, - 1715: 0x5945, - 1716: 0x5946, - 1717: 0x594A, - 1718: 0x594C, - 1719: 0x594D, - 1720: 0x5950, - 1721: 0x5952, - 1722: 0x5953, - 1723: 0x5959, - 1724: 0x595B, - 1725: 0x595C, - 1726: 0x595D, - 1727: 0x595E, - 1728: 0x595F, - 1729: 0x5961, - 1730: 0x5963, - 1731: 0x5964, - 1732: 0x5966, - 1733: 0x5967, - 1734: 0x5968, - 1735: 0x5969, - 1736: 0x596A, - 1737: 0x596B, - 1738: 0x596C, - 1739: 0x596D, - 1740: 0x596E, - 1741: 0x596F, - 1742: 0x5970, - 1743: 0x5971, - 1744: 0x5972, - 1745: 0x5975, - 1746: 0x5977, - 1747: 0x597A, - 1748: 0x597B, - 1749: 0x597C, - 1750: 0x597E, - 1751: 0x597F, - 1752: 0x5980, - 1753: 0x5985, - 1754: 0x5989, - 1755: 0x598B, - 1756: 0x598C, - 1757: 0x598E, - 1758: 0x598F, - 1759: 0x5990, - 1760: 0x5991, - 1761: 0x5994, - 1762: 0x5995, - 1763: 0x5998, - 1764: 0x599A, - 1765: 0x599B, - 1766: 0x599C, - 1767: 0x599D, - 1768: 0x599F, - 1769: 0x59A0, - 1770: 0x59A1, - 1771: 0x59A2, - 1772: 0x59A6, - 1773: 0x59A7, - 1774: 0x59AC, - 1775: 0x59AD, - 1776: 0x59B0, - 1777: 0x59B1, - 1778: 0x59B3, - 1779: 0x59B4, - 1780: 0x59B5, - 1781: 0x59B6, - 1782: 0x59B7, - 1783: 0x59B8, - 1784: 0x59BA, - 1785: 0x59BC, - 1786: 0x59BD, - 1787: 0x59BF, - 1788: 0x59C0, - 1789: 0x59C1, - 1790: 0x59C2, - 1791: 0x59C3, - 1792: 0x59C4, - 1793: 0x59C5, - 1794: 0x59C7, - 1795: 0x59C8, - 1796: 0x59C9, - 1797: 0x59CC, - 1798: 0x59CD, - 1799: 0x59CE, - 1800: 0x59CF, - 1801: 0x59D5, - 1802: 0x59D6, - 1803: 0x59D9, - 1804: 0x59DB, - 1805: 0x59DE, - 1806: 0x59DF, - 1807: 0x59E0, - 1808: 0x59E1, - 1809: 0x59E2, - 1810: 0x59E4, - 1811: 0x59E6, - 1812: 0x59E7, - 1813: 0x59E9, - 1814: 0x59EA, - 1815: 0x59EB, - 1816: 0x59ED, - 1817: 0x59EE, - 1818: 0x59EF, - 1819: 0x59F0, - 1820: 0x59F1, - 1821: 0x59F2, - 1822: 0x59F3, - 1823: 0x59F4, - 1824: 0x59F5, - 1825: 0x59F6, - 1826: 0x59F7, - 1827: 0x59F8, - 1828: 0x59FA, - 1829: 0x59FC, - 1830: 0x59FD, - 1831: 0x59FE, - 1832: 0x5A00, - 1833: 0x5A02, - 1834: 0x5A0A, - 1835: 0x5A0B, - 1836: 0x5A0D, - 1837: 0x5A0E, - 1838: 0x5A0F, - 1839: 0x5A10, - 1840: 0x5A12, - 1841: 0x5A14, - 1842: 0x5A15, - 1843: 0x5A16, - 1844: 0x5A17, - 1845: 0x5A19, - 1846: 0x5A1A, - 1847: 0x5A1B, - 1848: 0x5A1D, - 1849: 0x5A1E, - 1850: 0x5A21, - 1851: 0x5A22, - 1852: 0x5A24, - 1853: 0x5A26, - 1854: 0x5A27, - 1855: 0x5A28, - 1856: 0x5A2A, - 1857: 0x5A2B, - 1858: 0x5A2C, - 1859: 0x5A2D, - 1860: 0x5A2E, - 1861: 0x5A2F, - 1862: 0x5A30, - 1863: 0x5A33, - 1864: 0x5A35, - 1865: 0x5A37, - 1866: 0x5A38, - 1867: 0x5A39, - 1868: 0x5A3A, - 1869: 0x5A3B, - 1870: 0x5A3D, - 1871: 0x5A3E, - 1872: 0x5A3F, - 1873: 0x5A41, - 1874: 0x5A42, - 1875: 0x5A43, - 1876: 0x5A44, - 1877: 0x5A45, - 1878: 0x5A47, - 1879: 0x5A48, - 1880: 0x5A4B, - 1881: 0x5A4C, - 1882: 0x5A4D, - 1883: 0x5A4E, - 1884: 0x5A4F, - 1885: 0x5A50, - 1886: 0x5A51, - 1887: 0x5A52, - 1888: 0x5A53, - 1889: 0x5A54, - 1890: 0x5A56, - 1891: 0x5A57, - 1892: 0x5A58, - 1893: 0x5A59, - 1894: 0x5A5B, - 1895: 0x5A5C, - 1896: 0x5A5D, - 1897: 0x5A5E, - 1898: 0x5A5F, - 1899: 0x5A60, - 1900: 0x5A61, - 1901: 0x5A63, - 1902: 0x5A64, - 1903: 0x5A65, - 1904: 0x5A66, - 1905: 0x5A68, - 1906: 0x5A69, - 1907: 0x5A6B, - 1908: 0x5A6C, - 1909: 0x5A6D, - 1910: 0x5A6E, - 1911: 0x5A6F, - 1912: 0x5A70, - 1913: 0x5A71, - 1914: 0x5A72, - 1915: 0x5A73, - 1916: 0x5A78, - 1917: 0x5A79, - 1918: 0x5A7B, - 1919: 0x5A7C, - 1920: 0x5A7D, - 1921: 0x5A7E, - 1922: 0x5A80, - 1923: 0x5A81, - 1924: 0x5A82, - 1925: 0x5A83, - 1926: 0x5A84, - 1927: 0x5A85, - 1928: 0x5A86, - 1929: 0x5A87, - 1930: 0x5A88, - 1931: 0x5A89, - 1932: 0x5A8A, - 1933: 0x5A8B, - 1934: 0x5A8C, - 1935: 0x5A8D, - 1936: 0x5A8E, - 1937: 0x5A8F, - 1938: 0x5A90, - 1939: 0x5A91, - 1940: 0x5A93, - 1941: 0x5A94, - 1942: 0x5A95, - 1943: 0x5A96, - 1944: 0x5A97, - 1945: 0x5A98, - 1946: 0x5A99, - 1947: 0x5A9C, - 1948: 0x5A9D, - 1949: 0x5A9E, - 1950: 0x5A9F, - 1951: 0x5AA0, - 1952: 0x5AA1, - 1953: 0x5AA2, - 1954: 0x5AA3, - 1955: 0x5AA4, - 1956: 0x5AA5, - 1957: 0x5AA6, - 1958: 0x5AA7, - 1959: 0x5AA8, - 1960: 0x5AA9, - 1961: 0x5AAB, - 1962: 0x5AAC, - 1963: 0x5AAD, - 1964: 0x5AAE, - 1965: 0x5AAF, - 1966: 0x5AB0, - 1967: 0x5AB1, - 1968: 0x5AB4, - 1969: 0x5AB6, - 1970: 0x5AB7, - 1971: 0x5AB9, - 1972: 0x5ABA, - 1973: 0x5ABB, - 1974: 0x5ABC, - 1975: 0x5ABD, - 1976: 0x5ABF, - 1977: 0x5AC0, - 1978: 0x5AC3, - 1979: 0x5AC4, - 1980: 0x5AC5, - 1981: 0x5AC6, - 1982: 0x5AC7, - 1983: 0x5AC8, - 1984: 0x5ACA, - 1985: 0x5ACB, - 1986: 0x5ACD, - 1987: 0x5ACE, - 1988: 0x5ACF, - 1989: 0x5AD0, - 1990: 0x5AD1, - 1991: 0x5AD3, - 1992: 0x5AD5, - 1993: 0x5AD7, - 1994: 0x5AD9, - 1995: 0x5ADA, - 1996: 0x5ADB, - 1997: 0x5ADD, - 1998: 0x5ADE, - 1999: 0x5ADF, - 2000: 0x5AE2, - 2001: 0x5AE4, - 2002: 0x5AE5, - 2003: 0x5AE7, - 2004: 0x5AE8, - 2005: 0x5AEA, - 2006: 0x5AEC, - 2007: 0x5AED, - 2008: 0x5AEE, - 2009: 0x5AEF, - 2010: 0x5AF0, - 2011: 0x5AF2, - 2012: 0x5AF3, - 2013: 0x5AF4, - 2014: 0x5AF5, - 2015: 0x5AF6, - 2016: 0x5AF7, - 2017: 0x5AF8, - 2018: 0x5AF9, - 2019: 0x5AFA, - 2020: 0x5AFB, - 2021: 0x5AFC, - 2022: 0x5AFD, - 2023: 0x5AFE, - 2024: 0x5AFF, - 2025: 0x5B00, - 2026: 0x5B01, - 2027: 0x5B02, - 2028: 0x5B03, - 2029: 0x5B04, - 2030: 0x5B05, - 2031: 0x5B06, - 2032: 0x5B07, - 2033: 0x5B08, - 2034: 0x5B0A, - 2035: 0x5B0B, - 2036: 0x5B0C, - 2037: 0x5B0D, - 2038: 0x5B0E, - 2039: 0x5B0F, - 2040: 0x5B10, - 2041: 0x5B11, - 2042: 0x5B12, - 2043: 0x5B13, - 2044: 0x5B14, - 2045: 0x5B15, - 2046: 0x5B18, - 2047: 0x5B19, - 2048: 0x5B1A, - 2049: 0x5B1B, - 2050: 0x5B1C, - 2051: 0x5B1D, - 2052: 0x5B1E, - 2053: 0x5B1F, - 2054: 0x5B20, - 2055: 0x5B21, - 2056: 0x5B22, - 2057: 0x5B23, - 2058: 0x5B24, - 2059: 0x5B25, - 2060: 0x5B26, - 2061: 0x5B27, - 2062: 0x5B28, - 2063: 0x5B29, - 2064: 0x5B2A, - 2065: 0x5B2B, - 2066: 0x5B2C, - 2067: 0x5B2D, - 2068: 0x5B2E, - 2069: 0x5B2F, - 2070: 0x5B30, - 2071: 0x5B31, - 2072: 0x5B33, - 2073: 0x5B35, - 2074: 0x5B36, - 2075: 0x5B38, - 2076: 0x5B39, - 2077: 0x5B3A, - 2078: 0x5B3B, - 2079: 0x5B3C, - 2080: 0x5B3D, - 2081: 0x5B3E, - 2082: 0x5B3F, - 2083: 0x5B41, - 2084: 0x5B42, - 2085: 0x5B43, - 2086: 0x5B44, - 2087: 0x5B45, - 2088: 0x5B46, - 2089: 0x5B47, - 2090: 0x5B48, - 2091: 0x5B49, - 2092: 0x5B4A, - 2093: 0x5B4B, - 2094: 0x5B4C, - 2095: 0x5B4D, - 2096: 0x5B4E, - 2097: 0x5B4F, - 2098: 0x5B52, - 2099: 0x5B56, - 2100: 0x5B5E, - 2101: 0x5B60, - 2102: 0x5B61, - 2103: 0x5B67, - 2104: 0x5B68, - 2105: 0x5B6B, - 2106: 0x5B6D, - 2107: 0x5B6E, - 2108: 0x5B6F, - 2109: 0x5B72, - 2110: 0x5B74, - 2111: 0x5B76, - 2112: 0x5B77, - 2113: 0x5B78, - 2114: 0x5B79, - 2115: 0x5B7B, - 2116: 0x5B7C, - 2117: 0x5B7E, - 2118: 0x5B7F, - 2119: 0x5B82, - 2120: 0x5B86, - 2121: 0x5B8A, - 2122: 0x5B8D, - 2123: 0x5B8E, - 2124: 0x5B90, - 2125: 0x5B91, - 2126: 0x5B92, - 2127: 0x5B94, - 2128: 0x5B96, - 2129: 0x5B9F, - 2130: 0x5BA7, - 2131: 0x5BA8, - 2132: 0x5BA9, - 2133: 0x5BAC, - 2134: 0x5BAD, - 2135: 0x5BAE, - 2136: 0x5BAF, - 2137: 0x5BB1, - 2138: 0x5BB2, - 2139: 0x5BB7, - 2140: 0x5BBA, - 2141: 0x5BBB, - 2142: 0x5BBC, - 2143: 0x5BC0, - 2144: 0x5BC1, - 2145: 0x5BC3, - 2146: 0x5BC8, - 2147: 0x5BC9, - 2148: 0x5BCA, - 2149: 0x5BCB, - 2150: 0x5BCD, - 2151: 0x5BCE, - 2152: 0x5BCF, - 2153: 0x5BD1, - 2154: 0x5BD4, - 2155: 0x5BD5, - 2156: 0x5BD6, - 2157: 0x5BD7, - 2158: 0x5BD8, - 2159: 0x5BD9, - 2160: 0x5BDA, - 2161: 0x5BDB, - 2162: 0x5BDC, - 2163: 0x5BE0, - 2164: 0x5BE2, - 2165: 0x5BE3, - 2166: 0x5BE6, - 2167: 0x5BE7, - 2168: 0x5BE9, - 2169: 0x5BEA, - 2170: 0x5BEB, - 2171: 0x5BEC, - 2172: 0x5BED, - 2173: 0x5BEF, - 2174: 0x5BF1, - 2175: 0x5BF2, - 2176: 0x5BF3, - 2177: 0x5BF4, - 2178: 0x5BF5, - 2179: 0x5BF6, - 2180: 0x5BF7, - 2181: 0x5BFD, - 2182: 0x5BFE, - 2183: 0x5C00, - 2184: 0x5C02, - 2185: 0x5C03, - 2186: 0x5C05, - 2187: 0x5C07, - 2188: 0x5C08, - 2189: 0x5C0B, - 2190: 0x5C0C, - 2191: 0x5C0D, - 2192: 0x5C0E, - 2193: 0x5C10, - 2194: 0x5C12, - 2195: 0x5C13, - 2196: 0x5C17, - 2197: 0x5C19, - 2198: 0x5C1B, - 2199: 0x5C1E, - 2200: 0x5C1F, - 2201: 0x5C20, - 2202: 0x5C21, - 2203: 0x5C23, - 2204: 0x5C26, - 2205: 0x5C28, - 2206: 0x5C29, - 2207: 0x5C2A, - 2208: 0x5C2B, - 2209: 0x5C2D, - 2210: 0x5C2E, - 2211: 0x5C2F, - 2212: 0x5C30, - 2213: 0x5C32, - 2214: 0x5C33, - 2215: 0x5C35, - 2216: 0x5C36, - 2217: 0x5C37, - 2218: 0x5C43, - 2219: 0x5C44, - 2220: 0x5C46, - 2221: 0x5C47, - 2222: 0x5C4C, - 2223: 0x5C4D, - 2224: 0x5C52, - 2225: 0x5C53, - 2226: 0x5C54, - 2227: 0x5C56, - 2228: 0x5C57, - 2229: 0x5C58, - 2230: 0x5C5A, - 2231: 0x5C5B, - 2232: 0x5C5C, - 2233: 0x5C5D, - 2234: 0x5C5F, - 2235: 0x5C62, - 2236: 0x5C64, - 2237: 0x5C67, - 2238: 0x5C68, - 2239: 0x5C69, - 2240: 0x5C6A, - 2241: 0x5C6B, - 2242: 0x5C6C, - 2243: 0x5C6D, - 2244: 0x5C70, - 2245: 0x5C72, - 2246: 0x5C73, - 2247: 0x5C74, - 2248: 0x5C75, - 2249: 0x5C76, - 2250: 0x5C77, - 2251: 0x5C78, - 2252: 0x5C7B, - 2253: 0x5C7C, - 2254: 0x5C7D, - 2255: 0x5C7E, - 2256: 0x5C80, - 2257: 0x5C83, - 2258: 0x5C84, - 2259: 0x5C85, - 2260: 0x5C86, - 2261: 0x5C87, - 2262: 0x5C89, - 2263: 0x5C8A, - 2264: 0x5C8B, - 2265: 0x5C8E, - 2266: 0x5C8F, - 2267: 0x5C92, - 2268: 0x5C93, - 2269: 0x5C95, - 2270: 0x5C9D, - 2271: 0x5C9E, - 2272: 0x5C9F, - 2273: 0x5CA0, - 2274: 0x5CA1, - 2275: 0x5CA4, - 2276: 0x5CA5, - 2277: 0x5CA6, - 2278: 0x5CA7, - 2279: 0x5CA8, - 2280: 0x5CAA, - 2281: 0x5CAE, - 2282: 0x5CAF, - 2283: 0x5CB0, - 2284: 0x5CB2, - 2285: 0x5CB4, - 2286: 0x5CB6, - 2287: 0x5CB9, - 2288: 0x5CBA, - 2289: 0x5CBB, - 2290: 0x5CBC, - 2291: 0x5CBE, - 2292: 0x5CC0, - 2293: 0x5CC2, - 2294: 0x5CC3, - 2295: 0x5CC5, - 2296: 0x5CC6, - 2297: 0x5CC7, - 2298: 0x5CC8, - 2299: 0x5CC9, - 2300: 0x5CCA, - 2301: 0x5CCC, - 2302: 0x5CCD, - 2303: 0x5CCE, - 2304: 0x5CCF, - 2305: 0x5CD0, - 2306: 0x5CD1, - 2307: 0x5CD3, - 2308: 0x5CD4, - 2309: 0x5CD5, - 2310: 0x5CD6, - 2311: 0x5CD7, - 2312: 0x5CD8, - 2313: 0x5CDA, - 2314: 0x5CDB, - 2315: 0x5CDC, - 2316: 0x5CDD, - 2317: 0x5CDE, - 2318: 0x5CDF, - 2319: 0x5CE0, - 2320: 0x5CE2, - 2321: 0x5CE3, - 2322: 0x5CE7, - 2323: 0x5CE9, - 2324: 0x5CEB, - 2325: 0x5CEC, - 2326: 0x5CEE, - 2327: 0x5CEF, - 2328: 0x5CF1, - 2329: 0x5CF2, - 2330: 0x5CF3, - 2331: 0x5CF4, - 2332: 0x5CF5, - 2333: 0x5CF6, - 2334: 0x5CF7, - 2335: 0x5CF8, - 2336: 0x5CF9, - 2337: 0x5CFA, - 2338: 0x5CFC, - 2339: 0x5CFD, - 2340: 0x5CFE, - 2341: 0x5CFF, - 2342: 0x5D00, - 2343: 0x5D01, - 2344: 0x5D04, - 2345: 0x5D05, - 2346: 0x5D08, - 2347: 0x5D09, - 2348: 0x5D0A, - 2349: 0x5D0B, - 2350: 0x5D0C, - 2351: 0x5D0D, - 2352: 0x5D0F, - 2353: 0x5D10, - 2354: 0x5D11, - 2355: 0x5D12, - 2356: 0x5D13, - 2357: 0x5D15, - 2358: 0x5D17, - 2359: 0x5D18, - 2360: 0x5D19, - 2361: 0x5D1A, - 2362: 0x5D1C, - 2363: 0x5D1D, - 2364: 0x5D1F, - 2365: 0x5D20, - 2366: 0x5D21, - 2367: 0x5D22, - 2368: 0x5D23, - 2369: 0x5D25, - 2370: 0x5D28, - 2371: 0x5D2A, - 2372: 0x5D2B, - 2373: 0x5D2C, - 2374: 0x5D2F, - 2375: 0x5D30, - 2376: 0x5D31, - 2377: 0x5D32, - 2378: 0x5D33, - 2379: 0x5D35, - 2380: 0x5D36, - 2381: 0x5D37, - 2382: 0x5D38, - 2383: 0x5D39, - 2384: 0x5D3A, - 2385: 0x5D3B, - 2386: 0x5D3C, - 2387: 0x5D3F, - 2388: 0x5D40, - 2389: 0x5D41, - 2390: 0x5D42, - 2391: 0x5D43, - 2392: 0x5D44, - 2393: 0x5D45, - 2394: 0x5D46, - 2395: 0x5D48, - 2396: 0x5D49, - 2397: 0x5D4D, - 2398: 0x5D4E, - 2399: 0x5D4F, - 2400: 0x5D50, - 2401: 0x5D51, - 2402: 0x5D52, - 2403: 0x5D53, - 2404: 0x5D54, - 2405: 0x5D55, - 2406: 0x5D56, - 2407: 0x5D57, - 2408: 0x5D59, - 2409: 0x5D5A, - 2410: 0x5D5C, - 2411: 0x5D5E, - 2412: 0x5D5F, - 2413: 0x5D60, - 2414: 0x5D61, - 2415: 0x5D62, - 2416: 0x5D63, - 2417: 0x5D64, - 2418: 0x5D65, - 2419: 0x5D66, - 2420: 0x5D67, - 2421: 0x5D68, - 2422: 0x5D6A, - 2423: 0x5D6D, - 2424: 0x5D6E, - 2425: 0x5D70, - 2426: 0x5D71, - 2427: 0x5D72, - 2428: 0x5D73, - 2429: 0x5D75, - 2430: 0x5D76, - 2431: 0x5D77, - 2432: 0x5D78, - 2433: 0x5D79, - 2434: 0x5D7A, - 2435: 0x5D7B, - 2436: 0x5D7C, - 2437: 0x5D7D, - 2438: 0x5D7E, - 2439: 0x5D7F, - 2440: 0x5D80, - 2441: 0x5D81, - 2442: 0x5D83, - 2443: 0x5D84, - 2444: 0x5D85, - 2445: 0x5D86, - 2446: 0x5D87, - 2447: 0x5D88, - 2448: 0x5D89, - 2449: 0x5D8A, - 2450: 0x5D8B, - 2451: 0x5D8C, - 2452: 0x5D8D, - 2453: 0x5D8E, - 2454: 0x5D8F, - 2455: 0x5D90, - 2456: 0x5D91, - 2457: 0x5D92, - 2458: 0x5D93, - 2459: 0x5D94, - 2460: 0x5D95, - 2461: 0x5D96, - 2462: 0x5D97, - 2463: 0x5D98, - 2464: 0x5D9A, - 2465: 0x5D9B, - 2466: 0x5D9C, - 2467: 0x5D9E, - 2468: 0x5D9F, - 2469: 0x5DA0, - 2470: 0x5DA1, - 2471: 0x5DA2, - 2472: 0x5DA3, - 2473: 0x5DA4, - 2474: 0x5DA5, - 2475: 0x5DA6, - 2476: 0x5DA7, - 2477: 0x5DA8, - 2478: 0x5DA9, - 2479: 0x5DAA, - 2480: 0x5DAB, - 2481: 0x5DAC, - 2482: 0x5DAD, - 2483: 0x5DAE, - 2484: 0x5DAF, - 2485: 0x5DB0, - 2486: 0x5DB1, - 2487: 0x5DB2, - 2488: 0x5DB3, - 2489: 0x5DB4, - 2490: 0x5DB5, - 2491: 0x5DB6, - 2492: 0x5DB8, - 2493: 0x5DB9, - 2494: 0x5DBA, - 2495: 0x5DBB, - 2496: 0x5DBC, - 2497: 0x5DBD, - 2498: 0x5DBE, - 2499: 0x5DBF, - 2500: 0x5DC0, - 2501: 0x5DC1, - 2502: 0x5DC2, - 2503: 0x5DC3, - 2504: 0x5DC4, - 2505: 0x5DC6, - 2506: 0x5DC7, - 2507: 0x5DC8, - 2508: 0x5DC9, - 2509: 0x5DCA, - 2510: 0x5DCB, - 2511: 0x5DCC, - 2512: 0x5DCE, - 2513: 0x5DCF, - 2514: 0x5DD0, - 2515: 0x5DD1, - 2516: 0x5DD2, - 2517: 0x5DD3, - 2518: 0x5DD4, - 2519: 0x5DD5, - 2520: 0x5DD6, - 2521: 0x5DD7, - 2522: 0x5DD8, - 2523: 0x5DD9, - 2524: 0x5DDA, - 2525: 0x5DDC, - 2526: 0x5DDF, - 2527: 0x5DE0, - 2528: 0x5DE3, - 2529: 0x5DE4, - 2530: 0x5DEA, - 2531: 0x5DEC, - 2532: 0x5DED, - 2533: 0x5DF0, - 2534: 0x5DF5, - 2535: 0x5DF6, - 2536: 0x5DF8, - 2537: 0x5DF9, - 2538: 0x5DFA, - 2539: 0x5DFB, - 2540: 0x5DFC, - 2541: 0x5DFF, - 2542: 0x5E00, - 2543: 0x5E04, - 2544: 0x5E07, - 2545: 0x5E09, - 2546: 0x5E0A, - 2547: 0x5E0B, - 2548: 0x5E0D, - 2549: 0x5E0E, - 2550: 0x5E12, - 2551: 0x5E13, - 2552: 0x5E17, - 2553: 0x5E1E, - 2554: 0x5E1F, - 2555: 0x5E20, - 2556: 0x5E21, - 2557: 0x5E22, - 2558: 0x5E23, - 2559: 0x5E24, - 2560: 0x5E25, - 2561: 0x5E28, - 2562: 0x5E29, - 2563: 0x5E2A, - 2564: 0x5E2B, - 2565: 0x5E2C, - 2566: 0x5E2F, - 2567: 0x5E30, - 2568: 0x5E32, - 2569: 0x5E33, - 2570: 0x5E34, - 2571: 0x5E35, - 2572: 0x5E36, - 2573: 0x5E39, - 2574: 0x5E3A, - 2575: 0x5E3E, - 2576: 0x5E3F, - 2577: 0x5E40, - 2578: 0x5E41, - 2579: 0x5E43, - 2580: 0x5E46, - 2581: 0x5E47, - 2582: 0x5E48, - 2583: 0x5E49, - 2584: 0x5E4A, - 2585: 0x5E4B, - 2586: 0x5E4D, - 2587: 0x5E4E, - 2588: 0x5E4F, - 2589: 0x5E50, - 2590: 0x5E51, - 2591: 0x5E52, - 2592: 0x5E53, - 2593: 0x5E56, - 2594: 0x5E57, - 2595: 0x5E58, - 2596: 0x5E59, - 2597: 0x5E5A, - 2598: 0x5E5C, - 2599: 0x5E5D, - 2600: 0x5E5F, - 2601: 0x5E60, - 2602: 0x5E63, - 2603: 0x5E64, - 2604: 0x5E65, - 2605: 0x5E66, - 2606: 0x5E67, - 2607: 0x5E68, - 2608: 0x5E69, - 2609: 0x5E6A, - 2610: 0x5E6B, - 2611: 0x5E6C, - 2612: 0x5E6D, - 2613: 0x5E6E, - 2614: 0x5E6F, - 2615: 0x5E70, - 2616: 0x5E71, - 2617: 0x5E75, - 2618: 0x5E77, - 2619: 0x5E79, - 2620: 0x5E7E, - 2621: 0x5E81, - 2622: 0x5E82, - 2623: 0x5E83, - 2624: 0x5E85, - 2625: 0x5E88, - 2626: 0x5E89, - 2627: 0x5E8C, - 2628: 0x5E8D, - 2629: 0x5E8E, - 2630: 0x5E92, - 2631: 0x5E98, - 2632: 0x5E9B, - 2633: 0x5E9D, - 2634: 0x5EA1, - 2635: 0x5EA2, - 2636: 0x5EA3, - 2637: 0x5EA4, - 2638: 0x5EA8, - 2639: 0x5EA9, - 2640: 0x5EAA, - 2641: 0x5EAB, - 2642: 0x5EAC, - 2643: 0x5EAE, - 2644: 0x5EAF, - 2645: 0x5EB0, - 2646: 0x5EB1, - 2647: 0x5EB2, - 2648: 0x5EB4, - 2649: 0x5EBA, - 2650: 0x5EBB, - 2651: 0x5EBC, - 2652: 0x5EBD, - 2653: 0x5EBF, - 2654: 0x5EC0, - 2655: 0x5EC1, - 2656: 0x5EC2, - 2657: 0x5EC3, - 2658: 0x5EC4, - 2659: 0x5EC5, - 2660: 0x5EC6, - 2661: 0x5EC7, - 2662: 0x5EC8, - 2663: 0x5ECB, - 2664: 0x5ECC, - 2665: 0x5ECD, - 2666: 0x5ECE, - 2667: 0x5ECF, - 2668: 0x5ED0, - 2669: 0x5ED4, - 2670: 0x5ED5, - 2671: 0x5ED7, - 2672: 0x5ED8, - 2673: 0x5ED9, - 2674: 0x5EDA, - 2675: 0x5EDC, - 2676: 0x5EDD, - 2677: 0x5EDE, - 2678: 0x5EDF, - 2679: 0x5EE0, - 2680: 0x5EE1, - 2681: 0x5EE2, - 2682: 0x5EE3, - 2683: 0x5EE4, - 2684: 0x5EE5, - 2685: 0x5EE6, - 2686: 0x5EE7, - 2687: 0x5EE9, - 2688: 0x5EEB, - 2689: 0x5EEC, - 2690: 0x5EED, - 2691: 0x5EEE, - 2692: 0x5EEF, - 2693: 0x5EF0, - 2694: 0x5EF1, - 2695: 0x5EF2, - 2696: 0x5EF3, - 2697: 0x5EF5, - 2698: 0x5EF8, - 2699: 0x5EF9, - 2700: 0x5EFB, - 2701: 0x5EFC, - 2702: 0x5EFD, - 2703: 0x5F05, - 2704: 0x5F06, - 2705: 0x5F07, - 2706: 0x5F09, - 2707: 0x5F0C, - 2708: 0x5F0D, - 2709: 0x5F0E, - 2710: 0x5F10, - 2711: 0x5F12, - 2712: 0x5F14, - 2713: 0x5F16, - 2714: 0x5F19, - 2715: 0x5F1A, - 2716: 0x5F1C, - 2717: 0x5F1D, - 2718: 0x5F1E, - 2719: 0x5F21, - 2720: 0x5F22, - 2721: 0x5F23, - 2722: 0x5F24, - 2723: 0x5F28, - 2724: 0x5F2B, - 2725: 0x5F2C, - 2726: 0x5F2E, - 2727: 0x5F30, - 2728: 0x5F32, - 2729: 0x5F33, - 2730: 0x5F34, - 2731: 0x5F35, - 2732: 0x5F36, - 2733: 0x5F37, - 2734: 0x5F38, - 2735: 0x5F3B, - 2736: 0x5F3D, - 2737: 0x5F3E, - 2738: 0x5F3F, - 2739: 0x5F41, - 2740: 0x5F42, - 2741: 0x5F43, - 2742: 0x5F44, - 2743: 0x5F45, - 2744: 0x5F46, - 2745: 0x5F47, - 2746: 0x5F48, - 2747: 0x5F49, - 2748: 0x5F4A, - 2749: 0x5F4B, - 2750: 0x5F4C, - 2751: 0x5F4D, - 2752: 0x5F4E, - 2753: 0x5F4F, - 2754: 0x5F51, - 2755: 0x5F54, - 2756: 0x5F59, - 2757: 0x5F5A, - 2758: 0x5F5B, - 2759: 0x5F5C, - 2760: 0x5F5E, - 2761: 0x5F5F, - 2762: 0x5F60, - 2763: 0x5F63, - 2764: 0x5F65, - 2765: 0x5F67, - 2766: 0x5F68, - 2767: 0x5F6B, - 2768: 0x5F6E, - 2769: 0x5F6F, - 2770: 0x5F72, - 2771: 0x5F74, - 2772: 0x5F75, - 2773: 0x5F76, - 2774: 0x5F78, - 2775: 0x5F7A, - 2776: 0x5F7D, - 2777: 0x5F7E, - 2778: 0x5F7F, - 2779: 0x5F83, - 2780: 0x5F86, - 2781: 0x5F8D, - 2782: 0x5F8E, - 2783: 0x5F8F, - 2784: 0x5F91, - 2785: 0x5F93, - 2786: 0x5F94, - 2787: 0x5F96, - 2788: 0x5F9A, - 2789: 0x5F9B, - 2790: 0x5F9D, - 2791: 0x5F9E, - 2792: 0x5F9F, - 2793: 0x5FA0, - 2794: 0x5FA2, - 2795: 0x5FA3, - 2796: 0x5FA4, - 2797: 0x5FA5, - 2798: 0x5FA6, - 2799: 0x5FA7, - 2800: 0x5FA9, - 2801: 0x5FAB, - 2802: 0x5FAC, - 2803: 0x5FAF, - 2804: 0x5FB0, - 2805: 0x5FB1, - 2806: 0x5FB2, - 2807: 0x5FB3, - 2808: 0x5FB4, - 2809: 0x5FB6, - 2810: 0x5FB8, - 2811: 0x5FB9, - 2812: 0x5FBA, - 2813: 0x5FBB, - 2814: 0x5FBE, - 2815: 0x5FBF, - 2816: 0x5FC0, - 2817: 0x5FC1, - 2818: 0x5FC2, - 2819: 0x5FC7, - 2820: 0x5FC8, - 2821: 0x5FCA, - 2822: 0x5FCB, - 2823: 0x5FCE, - 2824: 0x5FD3, - 2825: 0x5FD4, - 2826: 0x5FD5, - 2827: 0x5FDA, - 2828: 0x5FDB, - 2829: 0x5FDC, - 2830: 0x5FDE, - 2831: 0x5FDF, - 2832: 0x5FE2, - 2833: 0x5FE3, - 2834: 0x5FE5, - 2835: 0x5FE6, - 2836: 0x5FE8, - 2837: 0x5FE9, - 2838: 0x5FEC, - 2839: 0x5FEF, - 2840: 0x5FF0, - 2841: 0x5FF2, - 2842: 0x5FF3, - 2843: 0x5FF4, - 2844: 0x5FF6, - 2845: 0x5FF7, - 2846: 0x5FF9, - 2847: 0x5FFA, - 2848: 0x5FFC, - 2849: 0x6007, - 2850: 0x6008, - 2851: 0x6009, - 2852: 0x600B, - 2853: 0x600C, - 2854: 0x6010, - 2855: 0x6011, - 2856: 0x6013, - 2857: 0x6017, - 2858: 0x6018, - 2859: 0x601A, - 2860: 0x601E, - 2861: 0x601F, - 2862: 0x6022, - 2863: 0x6023, - 2864: 0x6024, - 2865: 0x602C, - 2866: 0x602D, - 2867: 0x602E, - 2868: 0x6030, - 2869: 0x6031, - 2870: 0x6032, - 2871: 0x6033, - 2872: 0x6034, - 2873: 0x6036, - 2874: 0x6037, - 2875: 0x6038, - 2876: 0x6039, - 2877: 0x603A, - 2878: 0x603D, - 2879: 0x603E, - 2880: 0x6040, - 2881: 0x6044, - 2882: 0x6045, - 2883: 0x6046, - 2884: 0x6047, - 2885: 0x6048, - 2886: 0x6049, - 2887: 0x604A, - 2888: 0x604C, - 2889: 0x604E, - 2890: 0x604F, - 2891: 0x6051, - 2892: 0x6053, - 2893: 0x6054, - 2894: 0x6056, - 2895: 0x6057, - 2896: 0x6058, - 2897: 0x605B, - 2898: 0x605C, - 2899: 0x605E, - 2900: 0x605F, - 2901: 0x6060, - 2902: 0x6061, - 2903: 0x6065, - 2904: 0x6066, - 2905: 0x606E, - 2906: 0x6071, - 2907: 0x6072, - 2908: 0x6074, - 2909: 0x6075, - 2910: 0x6077, - 2911: 0x607E, - 2912: 0x6080, - 2913: 0x6081, - 2914: 0x6082, - 2915: 0x6085, - 2916: 0x6086, - 2917: 0x6087, - 2918: 0x6088, - 2919: 0x608A, - 2920: 0x608B, - 2921: 0x608E, - 2922: 0x608F, - 2923: 0x6090, - 2924: 0x6091, - 2925: 0x6093, - 2926: 0x6095, - 2927: 0x6097, - 2928: 0x6098, - 2929: 0x6099, - 2930: 0x609C, - 2931: 0x609E, - 2932: 0x60A1, - 2933: 0x60A2, - 2934: 0x60A4, - 2935: 0x60A5, - 2936: 0x60A7, - 2937: 0x60A9, - 2938: 0x60AA, - 2939: 0x60AE, - 2940: 0x60B0, - 2941: 0x60B3, - 2942: 0x60B5, - 2943: 0x60B6, - 2944: 0x60B7, - 2945: 0x60B9, - 2946: 0x60BA, - 2947: 0x60BD, - 2948: 0x60BE, - 2949: 0x60BF, - 2950: 0x60C0, - 2951: 0x60C1, - 2952: 0x60C2, - 2953: 0x60C3, - 2954: 0x60C4, - 2955: 0x60C7, - 2956: 0x60C8, - 2957: 0x60C9, - 2958: 0x60CC, - 2959: 0x60CD, - 2960: 0x60CE, - 2961: 0x60CF, - 2962: 0x60D0, - 2963: 0x60D2, - 2964: 0x60D3, - 2965: 0x60D4, - 2966: 0x60D6, - 2967: 0x60D7, - 2968: 0x60D9, - 2969: 0x60DB, - 2970: 0x60DE, - 2971: 0x60E1, - 2972: 0x60E2, - 2973: 0x60E3, - 2974: 0x60E4, - 2975: 0x60E5, - 2976: 0x60EA, - 2977: 0x60F1, - 2978: 0x60F2, - 2979: 0x60F5, - 2980: 0x60F7, - 2981: 0x60F8, - 2982: 0x60FB, - 2983: 0x60FC, - 2984: 0x60FD, - 2985: 0x60FE, - 2986: 0x60FF, - 2987: 0x6102, - 2988: 0x6103, - 2989: 0x6104, - 2990: 0x6105, - 2991: 0x6107, - 2992: 0x610A, - 2993: 0x610B, - 2994: 0x610C, - 2995: 0x6110, - 2996: 0x6111, - 2997: 0x6112, - 2998: 0x6113, - 2999: 0x6114, - 3000: 0x6116, - 3001: 0x6117, - 3002: 0x6118, - 3003: 0x6119, - 3004: 0x611B, - 3005: 0x611C, - 3006: 0x611D, - 3007: 0x611E, - 3008: 0x6121, - 3009: 0x6122, - 3010: 0x6125, - 3011: 0x6128, - 3012: 0x6129, - 3013: 0x612A, - 3014: 0x612C, - 3015: 0x612D, - 3016: 0x612E, - 3017: 0x612F, - 3018: 0x6130, - 3019: 0x6131, - 3020: 0x6132, - 3021: 0x6133, - 3022: 0x6134, - 3023: 0x6135, - 3024: 0x6136, - 3025: 0x6137, - 3026: 0x6138, - 3027: 0x6139, - 3028: 0x613A, - 3029: 0x613B, - 3030: 0x613C, - 3031: 0x613D, - 3032: 0x613E, - 3033: 0x6140, - 3034: 0x6141, - 3035: 0x6142, - 3036: 0x6143, - 3037: 0x6144, - 3038: 0x6145, - 3039: 0x6146, - 3040: 0x6147, - 3041: 0x6149, - 3042: 0x614B, - 3043: 0x614D, - 3044: 0x614F, - 3045: 0x6150, - 3046: 0x6152, - 3047: 0x6153, - 3048: 0x6154, - 3049: 0x6156, - 3050: 0x6157, - 3051: 0x6158, - 3052: 0x6159, - 3053: 0x615A, - 3054: 0x615B, - 3055: 0x615C, - 3056: 0x615E, - 3057: 0x615F, - 3058: 0x6160, - 3059: 0x6161, - 3060: 0x6163, - 3061: 0x6164, - 3062: 0x6165, - 3063: 0x6166, - 3064: 0x6169, - 3065: 0x616A, - 3066: 0x616B, - 3067: 0x616C, - 3068: 0x616D, - 3069: 0x616E, - 3070: 0x616F, - 3071: 0x6171, - 3072: 0x6172, - 3073: 0x6173, - 3074: 0x6174, - 3075: 0x6176, - 3076: 0x6178, - 3077: 0x6179, - 3078: 0x617A, - 3079: 0x617B, - 3080: 0x617C, - 3081: 0x617D, - 3082: 0x617E, - 3083: 0x617F, - 3084: 0x6180, - 3085: 0x6181, - 3086: 0x6182, - 3087: 0x6183, - 3088: 0x6184, - 3089: 0x6185, - 3090: 0x6186, - 3091: 0x6187, - 3092: 0x6188, - 3093: 0x6189, - 3094: 0x618A, - 3095: 0x618C, - 3096: 0x618D, - 3097: 0x618F, - 3098: 0x6190, - 3099: 0x6191, - 3100: 0x6192, - 3101: 0x6193, - 3102: 0x6195, - 3103: 0x6196, - 3104: 0x6197, - 3105: 0x6198, - 3106: 0x6199, - 3107: 0x619A, - 3108: 0x619B, - 3109: 0x619C, - 3110: 0x619E, - 3111: 0x619F, - 3112: 0x61A0, - 3113: 0x61A1, - 3114: 0x61A2, - 3115: 0x61A3, - 3116: 0x61A4, - 3117: 0x61A5, - 3118: 0x61A6, - 3119: 0x61AA, - 3120: 0x61AB, - 3121: 0x61AD, - 3122: 0x61AE, - 3123: 0x61AF, - 3124: 0x61B0, - 3125: 0x61B1, - 3126: 0x61B2, - 3127: 0x61B3, - 3128: 0x61B4, - 3129: 0x61B5, - 3130: 0x61B6, - 3131: 0x61B8, - 3132: 0x61B9, - 3133: 0x61BA, - 3134: 0x61BB, - 3135: 0x61BC, - 3136: 0x61BD, - 3137: 0x61BF, - 3138: 0x61C0, - 3139: 0x61C1, - 3140: 0x61C3, - 3141: 0x61C4, - 3142: 0x61C5, - 3143: 0x61C6, - 3144: 0x61C7, - 3145: 0x61C9, - 3146: 0x61CC, - 3147: 0x61CD, - 3148: 0x61CE, - 3149: 0x61CF, - 3150: 0x61D0, - 3151: 0x61D3, - 3152: 0x61D5, - 3153: 0x61D6, - 3154: 0x61D7, - 3155: 0x61D8, - 3156: 0x61D9, - 3157: 0x61DA, - 3158: 0x61DB, - 3159: 0x61DC, - 3160: 0x61DD, - 3161: 0x61DE, - 3162: 0x61DF, - 3163: 0x61E0, - 3164: 0x61E1, - 3165: 0x61E2, - 3166: 0x61E3, - 3167: 0x61E4, - 3168: 0x61E5, - 3169: 0x61E7, - 3170: 0x61E8, - 3171: 0x61E9, - 3172: 0x61EA, - 3173: 0x61EB, - 3174: 0x61EC, - 3175: 0x61ED, - 3176: 0x61EE, - 3177: 0x61EF, - 3178: 0x61F0, - 3179: 0x61F1, - 3180: 0x61F2, - 3181: 0x61F3, - 3182: 0x61F4, - 3183: 0x61F6, - 3184: 0x61F7, - 3185: 0x61F8, - 3186: 0x61F9, - 3187: 0x61FA, - 3188: 0x61FB, - 3189: 0x61FC, - 3190: 0x61FD, - 3191: 0x61FE, - 3192: 0x6200, - 3193: 0x6201, - 3194: 0x6202, - 3195: 0x6203, - 3196: 0x6204, - 3197: 0x6205, - 3198: 0x6207, - 3199: 0x6209, - 3200: 0x6213, - 3201: 0x6214, - 3202: 0x6219, - 3203: 0x621C, - 3204: 0x621D, - 3205: 0x621E, - 3206: 0x6220, - 3207: 0x6223, - 3208: 0x6226, - 3209: 0x6227, - 3210: 0x6228, - 3211: 0x6229, - 3212: 0x622B, - 3213: 0x622D, - 3214: 0x622F, - 3215: 0x6230, - 3216: 0x6231, - 3217: 0x6232, - 3218: 0x6235, - 3219: 0x6236, - 3220: 0x6238, - 3221: 0x6239, - 3222: 0x623A, - 3223: 0x623B, - 3224: 0x623C, - 3225: 0x6242, - 3226: 0x6244, - 3227: 0x6245, - 3228: 0x6246, - 3229: 0x624A, - 3230: 0x624F, - 3231: 0x6250, - 3232: 0x6255, - 3233: 0x6256, - 3234: 0x6257, - 3235: 0x6259, - 3236: 0x625A, - 3237: 0x625C, - 3238: 0x625D, - 3239: 0x625E, - 3240: 0x625F, - 3241: 0x6260, - 3242: 0x6261, - 3243: 0x6262, - 3244: 0x6264, - 3245: 0x6265, - 3246: 0x6268, - 3247: 0x6271, - 3248: 0x6272, - 3249: 0x6274, - 3250: 0x6275, - 3251: 0x6277, - 3252: 0x6278, - 3253: 0x627A, - 3254: 0x627B, - 3255: 0x627D, - 3256: 0x6281, - 3257: 0x6282, - 3258: 0x6283, - 3259: 0x6285, - 3260: 0x6286, - 3261: 0x6287, - 3262: 0x6288, - 3263: 0x628B, - 3264: 0x628C, - 3265: 0x628D, - 3266: 0x628E, - 3267: 0x628F, - 3268: 0x6290, - 3269: 0x6294, - 3270: 0x6299, - 3271: 0x629C, - 3272: 0x629D, - 3273: 0x629E, - 3274: 0x62A3, - 3275: 0x62A6, - 3276: 0x62A7, - 3277: 0x62A9, - 3278: 0x62AA, - 3279: 0x62AD, - 3280: 0x62AE, - 3281: 0x62AF, - 3282: 0x62B0, - 3283: 0x62B2, - 3284: 0x62B3, - 3285: 0x62B4, - 3286: 0x62B6, - 3287: 0x62B7, - 3288: 0x62B8, - 3289: 0x62BA, - 3290: 0x62BE, - 3291: 0x62C0, - 3292: 0x62C1, - 3293: 0x62C3, - 3294: 0x62CB, - 3295: 0x62CF, - 3296: 0x62D1, - 3297: 0x62D5, - 3298: 0x62DD, - 3299: 0x62DE, - 3300: 0x62E0, - 3301: 0x62E1, - 3302: 0x62E4, - 3303: 0x62EA, - 3304: 0x62EB, - 3305: 0x62F0, - 3306: 0x62F2, - 3307: 0x62F5, - 3308: 0x62F8, - 3309: 0x62F9, - 3310: 0x62FA, - 3311: 0x62FB, - 3312: 0x6300, - 3313: 0x6303, - 3314: 0x6304, - 3315: 0x6305, - 3316: 0x6306, - 3317: 0x630A, - 3318: 0x630B, - 3319: 0x630C, - 3320: 0x630D, - 3321: 0x630F, - 3322: 0x6310, - 3323: 0x6312, - 3324: 0x6313, - 3325: 0x6314, - 3326: 0x6315, - 3327: 0x6317, - 3328: 0x6318, - 3329: 0x6319, - 3330: 0x631C, - 3331: 0x6326, - 3332: 0x6327, - 3333: 0x6329, - 3334: 0x632C, - 3335: 0x632D, - 3336: 0x632E, - 3337: 0x6330, - 3338: 0x6331, - 3339: 0x6333, - 3340: 0x6334, - 3341: 0x6335, - 3342: 0x6336, - 3343: 0x6337, - 3344: 0x6338, - 3345: 0x633B, - 3346: 0x633C, - 3347: 0x633E, - 3348: 0x633F, - 3349: 0x6340, - 3350: 0x6341, - 3351: 0x6344, - 3352: 0x6347, - 3353: 0x6348, - 3354: 0x634A, - 3355: 0x6351, - 3356: 0x6352, - 3357: 0x6353, - 3358: 0x6354, - 3359: 0x6356, - 3360: 0x6357, - 3361: 0x6358, - 3362: 0x6359, - 3363: 0x635A, - 3364: 0x635B, - 3365: 0x635C, - 3366: 0x635D, - 3367: 0x6360, - 3368: 0x6364, - 3369: 0x6365, - 3370: 0x6366, - 3371: 0x6368, - 3372: 0x636A, - 3373: 0x636B, - 3374: 0x636C, - 3375: 0x636F, - 3376: 0x6370, - 3377: 0x6372, - 3378: 0x6373, - 3379: 0x6374, - 3380: 0x6375, - 3381: 0x6378, - 3382: 0x6379, - 3383: 0x637C, - 3384: 0x637D, - 3385: 0x637E, - 3386: 0x637F, - 3387: 0x6381, - 3388: 0x6383, - 3389: 0x6384, - 3390: 0x6385, - 3391: 0x6386, - 3392: 0x638B, - 3393: 0x638D, - 3394: 0x6391, - 3395: 0x6393, - 3396: 0x6394, - 3397: 0x6395, - 3398: 0x6397, - 3399: 0x6399, - 3400: 0x639A, - 3401: 0x639B, - 3402: 0x639C, - 3403: 0x639D, - 3404: 0x639E, - 3405: 0x639F, - 3406: 0x63A1, - 3407: 0x63A4, - 3408: 0x63A6, - 3409: 0x63AB, - 3410: 0x63AF, - 3411: 0x63B1, - 3412: 0x63B2, - 3413: 0x63B5, - 3414: 0x63B6, - 3415: 0x63B9, - 3416: 0x63BB, - 3417: 0x63BD, - 3418: 0x63BF, - 3419: 0x63C0, - 3420: 0x63C1, - 3421: 0x63C2, - 3422: 0x63C3, - 3423: 0x63C5, - 3424: 0x63C7, - 3425: 0x63C8, - 3426: 0x63CA, - 3427: 0x63CB, - 3428: 0x63CC, - 3429: 0x63D1, - 3430: 0x63D3, - 3431: 0x63D4, - 3432: 0x63D5, - 3433: 0x63D7, - 3434: 0x63D8, - 3435: 0x63D9, - 3436: 0x63DA, - 3437: 0x63DB, - 3438: 0x63DC, - 3439: 0x63DD, - 3440: 0x63DF, - 3441: 0x63E2, - 3442: 0x63E4, - 3443: 0x63E5, - 3444: 0x63E6, - 3445: 0x63E7, - 3446: 0x63E8, - 3447: 0x63EB, - 3448: 0x63EC, - 3449: 0x63EE, - 3450: 0x63EF, - 3451: 0x63F0, - 3452: 0x63F1, - 3453: 0x63F3, - 3454: 0x63F5, - 3455: 0x63F7, - 3456: 0x63F9, - 3457: 0x63FA, - 3458: 0x63FB, - 3459: 0x63FC, - 3460: 0x63FE, - 3461: 0x6403, - 3462: 0x6404, - 3463: 0x6406, - 3464: 0x6407, - 3465: 0x6408, - 3466: 0x6409, - 3467: 0x640A, - 3468: 0x640D, - 3469: 0x640E, - 3470: 0x6411, - 3471: 0x6412, - 3472: 0x6415, - 3473: 0x6416, - 3474: 0x6417, - 3475: 0x6418, - 3476: 0x6419, - 3477: 0x641A, - 3478: 0x641D, - 3479: 0x641F, - 3480: 0x6422, - 3481: 0x6423, - 3482: 0x6424, - 3483: 0x6425, - 3484: 0x6427, - 3485: 0x6428, - 3486: 0x6429, - 3487: 0x642B, - 3488: 0x642E, - 3489: 0x642F, - 3490: 0x6430, - 3491: 0x6431, - 3492: 0x6432, - 3493: 0x6433, - 3494: 0x6435, - 3495: 0x6436, - 3496: 0x6437, - 3497: 0x6438, - 3498: 0x6439, - 3499: 0x643B, - 3500: 0x643C, - 3501: 0x643E, - 3502: 0x6440, - 3503: 0x6442, - 3504: 0x6443, - 3505: 0x6449, - 3506: 0x644B, - 3507: 0x644C, - 3508: 0x644D, - 3509: 0x644E, - 3510: 0x644F, - 3511: 0x6450, - 3512: 0x6451, - 3513: 0x6453, - 3514: 0x6455, - 3515: 0x6456, - 3516: 0x6457, - 3517: 0x6459, - 3518: 0x645A, - 3519: 0x645B, - 3520: 0x645C, - 3521: 0x645D, - 3522: 0x645F, - 3523: 0x6460, - 3524: 0x6461, - 3525: 0x6462, - 3526: 0x6463, - 3527: 0x6464, - 3528: 0x6465, - 3529: 0x6466, - 3530: 0x6468, - 3531: 0x646A, - 3532: 0x646B, - 3533: 0x646C, - 3534: 0x646E, - 3535: 0x646F, - 3536: 0x6470, - 3537: 0x6471, - 3538: 0x6472, - 3539: 0x6473, - 3540: 0x6474, - 3541: 0x6475, - 3542: 0x6476, - 3543: 0x6477, - 3544: 0x647B, - 3545: 0x647C, - 3546: 0x647D, - 3547: 0x647E, - 3548: 0x647F, - 3549: 0x6480, - 3550: 0x6481, - 3551: 0x6483, - 3552: 0x6486, - 3553: 0x6488, - 3554: 0x6489, - 3555: 0x648A, - 3556: 0x648B, - 3557: 0x648C, - 3558: 0x648D, - 3559: 0x648E, - 3560: 0x648F, - 3561: 0x6490, - 3562: 0x6493, - 3563: 0x6494, - 3564: 0x6497, - 3565: 0x6498, - 3566: 0x649A, - 3567: 0x649B, - 3568: 0x649C, - 3569: 0x649D, - 3570: 0x649F, - 3571: 0x64A0, - 3572: 0x64A1, - 3573: 0x64A2, - 3574: 0x64A3, - 3575: 0x64A5, - 3576: 0x64A6, - 3577: 0x64A7, - 3578: 0x64A8, - 3579: 0x64AA, - 3580: 0x64AB, - 3581: 0x64AF, - 3582: 0x64B1, - 3583: 0x64B2, - 3584: 0x64B3, - 3585: 0x64B4, - 3586: 0x64B6, - 3587: 0x64B9, - 3588: 0x64BB, - 3589: 0x64BD, - 3590: 0x64BE, - 3591: 0x64BF, - 3592: 0x64C1, - 3593: 0x64C3, - 3594: 0x64C4, - 3595: 0x64C6, - 3596: 0x64C7, - 3597: 0x64C8, - 3598: 0x64C9, - 3599: 0x64CA, - 3600: 0x64CB, - 3601: 0x64CC, - 3602: 0x64CF, - 3603: 0x64D1, - 3604: 0x64D3, - 3605: 0x64D4, - 3606: 0x64D5, - 3607: 0x64D6, - 3608: 0x64D9, - 3609: 0x64DA, - 3610: 0x64DB, - 3611: 0x64DC, - 3612: 0x64DD, - 3613: 0x64DF, - 3614: 0x64E0, - 3615: 0x64E1, - 3616: 0x64E3, - 3617: 0x64E5, - 3618: 0x64E7, - 3619: 0x64E8, - 3620: 0x64E9, - 3621: 0x64EA, - 3622: 0x64EB, - 3623: 0x64EC, - 3624: 0x64ED, - 3625: 0x64EE, - 3626: 0x64EF, - 3627: 0x64F0, - 3628: 0x64F1, - 3629: 0x64F2, - 3630: 0x64F3, - 3631: 0x64F4, - 3632: 0x64F5, - 3633: 0x64F6, - 3634: 0x64F7, - 3635: 0x64F8, - 3636: 0x64F9, - 3637: 0x64FA, - 3638: 0x64FB, - 3639: 0x64FC, - 3640: 0x64FD, - 3641: 0x64FE, - 3642: 0x64FF, - 3643: 0x6501, - 3644: 0x6502, - 3645: 0x6503, - 3646: 0x6504, - 3647: 0x6505, - 3648: 0x6506, - 3649: 0x6507, - 3650: 0x6508, - 3651: 0x650A, - 3652: 0x650B, - 3653: 0x650C, - 3654: 0x650D, - 3655: 0x650E, - 3656: 0x650F, - 3657: 0x6510, - 3658: 0x6511, - 3659: 0x6513, - 3660: 0x6514, - 3661: 0x6515, - 3662: 0x6516, - 3663: 0x6517, - 3664: 0x6519, - 3665: 0x651A, - 3666: 0x651B, - 3667: 0x651C, - 3668: 0x651D, - 3669: 0x651E, - 3670: 0x651F, - 3671: 0x6520, - 3672: 0x6521, - 3673: 0x6522, - 3674: 0x6523, - 3675: 0x6524, - 3676: 0x6526, - 3677: 0x6527, - 3678: 0x6528, - 3679: 0x6529, - 3680: 0x652A, - 3681: 0x652C, - 3682: 0x652D, - 3683: 0x6530, - 3684: 0x6531, - 3685: 0x6532, - 3686: 0x6533, - 3687: 0x6537, - 3688: 0x653A, - 3689: 0x653C, - 3690: 0x653D, - 3691: 0x6540, - 3692: 0x6541, - 3693: 0x6542, - 3694: 0x6543, - 3695: 0x6544, - 3696: 0x6546, - 3697: 0x6547, - 3698: 0x654A, - 3699: 0x654B, - 3700: 0x654D, - 3701: 0x654E, - 3702: 0x6550, - 3703: 0x6552, - 3704: 0x6553, - 3705: 0x6554, - 3706: 0x6557, - 3707: 0x6558, - 3708: 0x655A, - 3709: 0x655C, - 3710: 0x655F, - 3711: 0x6560, - 3712: 0x6561, - 3713: 0x6564, - 3714: 0x6565, - 3715: 0x6567, - 3716: 0x6568, - 3717: 0x6569, - 3718: 0x656A, - 3719: 0x656D, - 3720: 0x656E, - 3721: 0x656F, - 3722: 0x6571, - 3723: 0x6573, - 3724: 0x6575, - 3725: 0x6576, - 3726: 0x6578, - 3727: 0x6579, - 3728: 0x657A, - 3729: 0x657B, - 3730: 0x657C, - 3731: 0x657D, - 3732: 0x657E, - 3733: 0x657F, - 3734: 0x6580, - 3735: 0x6581, - 3736: 0x6582, - 3737: 0x6583, - 3738: 0x6584, - 3739: 0x6585, - 3740: 0x6586, - 3741: 0x6588, - 3742: 0x6589, - 3743: 0x658A, - 3744: 0x658D, - 3745: 0x658E, - 3746: 0x658F, - 3747: 0x6592, - 3748: 0x6594, - 3749: 0x6595, - 3750: 0x6596, - 3751: 0x6598, - 3752: 0x659A, - 3753: 0x659D, - 3754: 0x659E, - 3755: 0x65A0, - 3756: 0x65A2, - 3757: 0x65A3, - 3758: 0x65A6, - 3759: 0x65A8, - 3760: 0x65AA, - 3761: 0x65AC, - 3762: 0x65AE, - 3763: 0x65B1, - 3764: 0x65B2, - 3765: 0x65B3, - 3766: 0x65B4, - 3767: 0x65B5, - 3768: 0x65B6, - 3769: 0x65B7, - 3770: 0x65B8, - 3771: 0x65BA, - 3772: 0x65BB, - 3773: 0x65BE, - 3774: 0x65BF, - 3775: 0x65C0, - 3776: 0x65C2, - 3777: 0x65C7, - 3778: 0x65C8, - 3779: 0x65C9, - 3780: 0x65CA, - 3781: 0x65CD, - 3782: 0x65D0, - 3783: 0x65D1, - 3784: 0x65D3, - 3785: 0x65D4, - 3786: 0x65D5, - 3787: 0x65D8, - 3788: 0x65D9, - 3789: 0x65DA, - 3790: 0x65DB, - 3791: 0x65DC, - 3792: 0x65DD, - 3793: 0x65DE, - 3794: 0x65DF, - 3795: 0x65E1, - 3796: 0x65E3, - 3797: 0x65E4, - 3798: 0x65EA, - 3799: 0x65EB, - 3800: 0x65F2, - 3801: 0x65F3, - 3802: 0x65F4, - 3803: 0x65F5, - 3804: 0x65F8, - 3805: 0x65F9, - 3806: 0x65FB, - 3807: 0x65FC, - 3808: 0x65FD, - 3809: 0x65FE, - 3810: 0x65FF, - 3811: 0x6601, - 3812: 0x6604, - 3813: 0x6605, - 3814: 0x6607, - 3815: 0x6608, - 3816: 0x6609, - 3817: 0x660B, - 3818: 0x660D, - 3819: 0x6610, - 3820: 0x6611, - 3821: 0x6612, - 3822: 0x6616, - 3823: 0x6617, - 3824: 0x6618, - 3825: 0x661A, - 3826: 0x661B, - 3827: 0x661C, - 3828: 0x661E, - 3829: 0x6621, - 3830: 0x6622, - 3831: 0x6623, - 3832: 0x6624, - 3833: 0x6626, - 3834: 0x6629, - 3835: 0x662A, - 3836: 0x662B, - 3837: 0x662C, - 3838: 0x662E, - 3839: 0x6630, - 3840: 0x6632, - 3841: 0x6633, - 3842: 0x6637, - 3843: 0x6638, - 3844: 0x6639, - 3845: 0x663A, - 3846: 0x663B, - 3847: 0x663D, - 3848: 0x663F, - 3849: 0x6640, - 3850: 0x6642, - 3851: 0x6644, - 3852: 0x6645, - 3853: 0x6646, - 3854: 0x6647, - 3855: 0x6648, - 3856: 0x6649, - 3857: 0x664A, - 3858: 0x664D, - 3859: 0x664E, - 3860: 0x6650, - 3861: 0x6651, - 3862: 0x6658, - 3863: 0x6659, - 3864: 0x665B, - 3865: 0x665C, - 3866: 0x665D, - 3867: 0x665E, - 3868: 0x6660, - 3869: 0x6662, - 3870: 0x6663, - 3871: 0x6665, - 3872: 0x6667, - 3873: 0x6669, - 3874: 0x666A, - 3875: 0x666B, - 3876: 0x666C, - 3877: 0x666D, - 3878: 0x6671, - 3879: 0x6672, - 3880: 0x6673, - 3881: 0x6675, - 3882: 0x6678, - 3883: 0x6679, - 3884: 0x667B, - 3885: 0x667C, - 3886: 0x667D, - 3887: 0x667F, - 3888: 0x6680, - 3889: 0x6681, - 3890: 0x6683, - 3891: 0x6685, - 3892: 0x6686, - 3893: 0x6688, - 3894: 0x6689, - 3895: 0x668A, - 3896: 0x668B, - 3897: 0x668D, - 3898: 0x668E, - 3899: 0x668F, - 3900: 0x6690, - 3901: 0x6692, - 3902: 0x6693, - 3903: 0x6694, - 3904: 0x6695, - 3905: 0x6698, - 3906: 0x6699, - 3907: 0x669A, - 3908: 0x669B, - 3909: 0x669C, - 3910: 0x669E, - 3911: 0x669F, - 3912: 0x66A0, - 3913: 0x66A1, - 3914: 0x66A2, - 3915: 0x66A3, - 3916: 0x66A4, - 3917: 0x66A5, - 3918: 0x66A6, - 3919: 0x66A9, - 3920: 0x66AA, - 3921: 0x66AB, - 3922: 0x66AC, - 3923: 0x66AD, - 3924: 0x66AF, - 3925: 0x66B0, - 3926: 0x66B1, - 3927: 0x66B2, - 3928: 0x66B3, - 3929: 0x66B5, - 3930: 0x66B6, - 3931: 0x66B7, - 3932: 0x66B8, - 3933: 0x66BA, - 3934: 0x66BB, - 3935: 0x66BC, - 3936: 0x66BD, - 3937: 0x66BF, - 3938: 0x66C0, - 3939: 0x66C1, - 3940: 0x66C2, - 3941: 0x66C3, - 3942: 0x66C4, - 3943: 0x66C5, - 3944: 0x66C6, - 3945: 0x66C7, - 3946: 0x66C8, - 3947: 0x66C9, - 3948: 0x66CA, - 3949: 0x66CB, - 3950: 0x66CC, - 3951: 0x66CD, - 3952: 0x66CE, - 3953: 0x66CF, - 3954: 0x66D0, - 3955: 0x66D1, - 3956: 0x66D2, - 3957: 0x66D3, - 3958: 0x66D4, - 3959: 0x66D5, - 3960: 0x66D6, - 3961: 0x66D7, - 3962: 0x66D8, - 3963: 0x66DA, - 3964: 0x66DE, - 3965: 0x66DF, - 3966: 0x66E0, - 3967: 0x66E1, - 3968: 0x66E2, - 3969: 0x66E3, - 3970: 0x66E4, - 3971: 0x66E5, - 3972: 0x66E7, - 3973: 0x66E8, - 3974: 0x66EA, - 3975: 0x66EB, - 3976: 0x66EC, - 3977: 0x66ED, - 3978: 0x66EE, - 3979: 0x66EF, - 3980: 0x66F1, - 3981: 0x66F5, - 3982: 0x66F6, - 3983: 0x66F8, - 3984: 0x66FA, - 3985: 0x66FB, - 3986: 0x66FD, - 3987: 0x6701, - 3988: 0x6702, - 3989: 0x6703, - 3990: 0x6704, - 3991: 0x6705, - 3992: 0x6706, - 3993: 0x6707, - 3994: 0x670C, - 3995: 0x670E, - 3996: 0x670F, - 3997: 0x6711, - 3998: 0x6712, - 3999: 0x6713, - 4000: 0x6716, - 4001: 0x6718, - 4002: 0x6719, - 4003: 0x671A, - 4004: 0x671C, - 4005: 0x671E, - 4006: 0x6720, - 4007: 0x6721, - 4008: 0x6722, - 4009: 0x6723, - 4010: 0x6724, - 4011: 0x6725, - 4012: 0x6727, - 4013: 0x6729, - 4014: 0x672E, - 4015: 0x6730, - 4016: 0x6732, - 4017: 0x6733, - 4018: 0x6736, - 4019: 0x6737, - 4020: 0x6738, - 4021: 0x6739, - 4022: 0x673B, - 4023: 0x673C, - 4024: 0x673E, - 4025: 0x673F, - 4026: 0x6741, - 4027: 0x6744, - 4028: 0x6745, - 4029: 0x6747, - 4030: 0x674A, - 4031: 0x674B, - 4032: 0x674D, - 4033: 0x6752, - 4034: 0x6754, - 4035: 0x6755, - 4036: 0x6757, - 4037: 0x6758, - 4038: 0x6759, - 4039: 0x675A, - 4040: 0x675B, - 4041: 0x675D, - 4042: 0x6762, - 4043: 0x6763, - 4044: 0x6764, - 4045: 0x6766, - 4046: 0x6767, - 4047: 0x676B, - 4048: 0x676C, - 4049: 0x676E, - 4050: 0x6771, - 4051: 0x6774, - 4052: 0x6776, - 4053: 0x6778, - 4054: 0x6779, - 4055: 0x677A, - 4056: 0x677B, - 4057: 0x677D, - 4058: 0x6780, - 4059: 0x6782, - 4060: 0x6783, - 4061: 0x6785, - 4062: 0x6786, - 4063: 0x6788, - 4064: 0x678A, - 4065: 0x678C, - 4066: 0x678D, - 4067: 0x678E, - 4068: 0x678F, - 4069: 0x6791, - 4070: 0x6792, - 4071: 0x6793, - 4072: 0x6794, - 4073: 0x6796, - 4074: 0x6799, - 4075: 0x679B, - 4076: 0x679F, - 4077: 0x67A0, - 4078: 0x67A1, - 4079: 0x67A4, - 4080: 0x67A6, - 4081: 0x67A9, - 4082: 0x67AC, - 4083: 0x67AE, - 4084: 0x67B1, - 4085: 0x67B2, - 4086: 0x67B4, - 4087: 0x67B9, - 4088: 0x67BA, - 4089: 0x67BB, - 4090: 0x67BC, - 4091: 0x67BD, - 4092: 0x67BE, - 4093: 0x67BF, - 4094: 0x67C0, - 4095: 0x67C2, - 4096: 0x67C5, - 4097: 0x67C6, - 4098: 0x67C7, - 4099: 0x67C8, - 4100: 0x67C9, - 4101: 0x67CA, - 4102: 0x67CB, - 4103: 0x67CC, - 4104: 0x67CD, - 4105: 0x67CE, - 4106: 0x67D5, - 4107: 0x67D6, - 4108: 0x67D7, - 4109: 0x67DB, - 4110: 0x67DF, - 4111: 0x67E1, - 4112: 0x67E3, - 4113: 0x67E4, - 4114: 0x67E6, - 4115: 0x67E7, - 4116: 0x67E8, - 4117: 0x67EA, - 4118: 0x67EB, - 4119: 0x67ED, - 4120: 0x67EE, - 4121: 0x67F2, - 4122: 0x67F5, - 4123: 0x67F6, - 4124: 0x67F7, - 4125: 0x67F8, - 4126: 0x67F9, - 4127: 0x67FA, - 4128: 0x67FB, - 4129: 0x67FC, - 4130: 0x67FE, - 4131: 0x6801, - 4132: 0x6802, - 4133: 0x6803, - 4134: 0x6804, - 4135: 0x6806, - 4136: 0x680D, - 4137: 0x6810, - 4138: 0x6812, - 4139: 0x6814, - 4140: 0x6815, - 4141: 0x6818, - 4142: 0x6819, - 4143: 0x681A, - 4144: 0x681B, - 4145: 0x681C, - 4146: 0x681E, - 4147: 0x681F, - 4148: 0x6820, - 4149: 0x6822, - 4150: 0x6823, - 4151: 0x6824, - 4152: 0x6825, - 4153: 0x6826, - 4154: 0x6827, - 4155: 0x6828, - 4156: 0x682B, - 4157: 0x682C, - 4158: 0x682D, - 4159: 0x682E, - 4160: 0x682F, - 4161: 0x6830, - 4162: 0x6831, - 4163: 0x6834, - 4164: 0x6835, - 4165: 0x6836, - 4166: 0x683A, - 4167: 0x683B, - 4168: 0x683F, - 4169: 0x6847, - 4170: 0x684B, - 4171: 0x684D, - 4172: 0x684F, - 4173: 0x6852, - 4174: 0x6856, - 4175: 0x6857, - 4176: 0x6858, - 4177: 0x6859, - 4178: 0x685A, - 4179: 0x685B, - 4180: 0x685C, - 4181: 0x685D, - 4182: 0x685E, - 4183: 0x685F, - 4184: 0x686A, - 4185: 0x686C, - 4186: 0x686D, - 4187: 0x686E, - 4188: 0x686F, - 4189: 0x6870, - 4190: 0x6871, - 4191: 0x6872, - 4192: 0x6873, - 4193: 0x6875, - 4194: 0x6878, - 4195: 0x6879, - 4196: 0x687A, - 4197: 0x687B, - 4198: 0x687C, - 4199: 0x687D, - 4200: 0x687E, - 4201: 0x687F, - 4202: 0x6880, - 4203: 0x6882, - 4204: 0x6884, - 4205: 0x6887, - 4206: 0x6888, - 4207: 0x6889, - 4208: 0x688A, - 4209: 0x688B, - 4210: 0x688C, - 4211: 0x688D, - 4212: 0x688E, - 4213: 0x6890, - 4214: 0x6891, - 4215: 0x6892, - 4216: 0x6894, - 4217: 0x6895, - 4218: 0x6896, - 4219: 0x6898, - 4220: 0x6899, - 4221: 0x689A, - 4222: 0x689B, - 4223: 0x689C, - 4224: 0x689D, - 4225: 0x689E, - 4226: 0x689F, - 4227: 0x68A0, - 4228: 0x68A1, - 4229: 0x68A3, - 4230: 0x68A4, - 4231: 0x68A5, - 4232: 0x68A9, - 4233: 0x68AA, - 4234: 0x68AB, - 4235: 0x68AC, - 4236: 0x68AE, - 4237: 0x68B1, - 4238: 0x68B2, - 4239: 0x68B4, - 4240: 0x68B6, - 4241: 0x68B7, - 4242: 0x68B8, - 4243: 0x68B9, - 4244: 0x68BA, - 4245: 0x68BB, - 4246: 0x68BC, - 4247: 0x68BD, - 4248: 0x68BE, - 4249: 0x68BF, - 4250: 0x68C1, - 4251: 0x68C3, - 4252: 0x68C4, - 4253: 0x68C5, - 4254: 0x68C6, - 4255: 0x68C7, - 4256: 0x68C8, - 4257: 0x68CA, - 4258: 0x68CC, - 4259: 0x68CE, - 4260: 0x68CF, - 4261: 0x68D0, - 4262: 0x68D1, - 4263: 0x68D3, - 4264: 0x68D4, - 4265: 0x68D6, - 4266: 0x68D7, - 4267: 0x68D9, - 4268: 0x68DB, - 4269: 0x68DC, - 4270: 0x68DD, - 4271: 0x68DE, - 4272: 0x68DF, - 4273: 0x68E1, - 4274: 0x68E2, - 4275: 0x68E4, - 4276: 0x68E5, - 4277: 0x68E6, - 4278: 0x68E7, - 4279: 0x68E8, - 4280: 0x68E9, - 4281: 0x68EA, - 4282: 0x68EB, - 4283: 0x68EC, - 4284: 0x68ED, - 4285: 0x68EF, - 4286: 0x68F2, - 4287: 0x68F3, - 4288: 0x68F4, - 4289: 0x68F6, - 4290: 0x68F7, - 4291: 0x68F8, - 4292: 0x68FB, - 4293: 0x68FD, - 4294: 0x68FE, - 4295: 0x68FF, - 4296: 0x6900, - 4297: 0x6902, - 4298: 0x6903, - 4299: 0x6904, - 4300: 0x6906, - 4301: 0x6907, - 4302: 0x6908, - 4303: 0x6909, - 4304: 0x690A, - 4305: 0x690C, - 4306: 0x690F, - 4307: 0x6911, - 4308: 0x6913, - 4309: 0x6914, - 4310: 0x6915, - 4311: 0x6916, - 4312: 0x6917, - 4313: 0x6918, - 4314: 0x6919, - 4315: 0x691A, - 4316: 0x691B, - 4317: 0x691C, - 4318: 0x691D, - 4319: 0x691E, - 4320: 0x6921, - 4321: 0x6922, - 4322: 0x6923, - 4323: 0x6925, - 4324: 0x6926, - 4325: 0x6927, - 4326: 0x6928, - 4327: 0x6929, - 4328: 0x692A, - 4329: 0x692B, - 4330: 0x692C, - 4331: 0x692E, - 4332: 0x692F, - 4333: 0x6931, - 4334: 0x6932, - 4335: 0x6933, - 4336: 0x6935, - 4337: 0x6936, - 4338: 0x6937, - 4339: 0x6938, - 4340: 0x693A, - 4341: 0x693B, - 4342: 0x693C, - 4343: 0x693E, - 4344: 0x6940, - 4345: 0x6941, - 4346: 0x6943, - 4347: 0x6944, - 4348: 0x6945, - 4349: 0x6946, - 4350: 0x6947, - 4351: 0x6948, - 4352: 0x6949, - 4353: 0x694A, - 4354: 0x694B, - 4355: 0x694C, - 4356: 0x694D, - 4357: 0x694E, - 4358: 0x694F, - 4359: 0x6950, - 4360: 0x6951, - 4361: 0x6952, - 4362: 0x6953, - 4363: 0x6955, - 4364: 0x6956, - 4365: 0x6958, - 4366: 0x6959, - 4367: 0x695B, - 4368: 0x695C, - 4369: 0x695F, - 4370: 0x6961, - 4371: 0x6962, - 4372: 0x6964, - 4373: 0x6965, - 4374: 0x6967, - 4375: 0x6968, - 4376: 0x6969, - 4377: 0x696A, - 4378: 0x696C, - 4379: 0x696D, - 4380: 0x696F, - 4381: 0x6970, - 4382: 0x6972, - 4383: 0x6973, - 4384: 0x6974, - 4385: 0x6975, - 4386: 0x6976, - 4387: 0x697A, - 4388: 0x697B, - 4389: 0x697D, - 4390: 0x697E, - 4391: 0x697F, - 4392: 0x6981, - 4393: 0x6983, - 4394: 0x6985, - 4395: 0x698A, - 4396: 0x698B, - 4397: 0x698C, - 4398: 0x698E, - 4399: 0x698F, - 4400: 0x6990, - 4401: 0x6991, - 4402: 0x6992, - 4403: 0x6993, - 4404: 0x6996, - 4405: 0x6997, - 4406: 0x6999, - 4407: 0x699A, - 4408: 0x699D, - 4409: 0x699E, - 4410: 0x699F, - 4411: 0x69A0, - 4412: 0x69A1, - 4413: 0x69A2, - 4414: 0x69A3, - 4415: 0x69A4, - 4416: 0x69A5, - 4417: 0x69A6, - 4418: 0x69A9, - 4419: 0x69AA, - 4420: 0x69AC, - 4421: 0x69AE, - 4422: 0x69AF, - 4423: 0x69B0, - 4424: 0x69B2, - 4425: 0x69B3, - 4426: 0x69B5, - 4427: 0x69B6, - 4428: 0x69B8, - 4429: 0x69B9, - 4430: 0x69BA, - 4431: 0x69BC, - 4432: 0x69BD, - 4433: 0x69BE, - 4434: 0x69BF, - 4435: 0x69C0, - 4436: 0x69C2, - 4437: 0x69C3, - 4438: 0x69C4, - 4439: 0x69C5, - 4440: 0x69C6, - 4441: 0x69C7, - 4442: 0x69C8, - 4443: 0x69C9, - 4444: 0x69CB, - 4445: 0x69CD, - 4446: 0x69CF, - 4447: 0x69D1, - 4448: 0x69D2, - 4449: 0x69D3, - 4450: 0x69D5, - 4451: 0x69D6, - 4452: 0x69D7, - 4453: 0x69D8, - 4454: 0x69D9, - 4455: 0x69DA, - 4456: 0x69DC, - 4457: 0x69DD, - 4458: 0x69DE, - 4459: 0x69E1, - 4460: 0x69E2, - 4461: 0x69E3, - 4462: 0x69E4, - 4463: 0x69E5, - 4464: 0x69E6, - 4465: 0x69E7, - 4466: 0x69E8, - 4467: 0x69E9, - 4468: 0x69EA, - 4469: 0x69EB, - 4470: 0x69EC, - 4471: 0x69EE, - 4472: 0x69EF, - 4473: 0x69F0, - 4474: 0x69F1, - 4475: 0x69F3, - 4476: 0x69F4, - 4477: 0x69F5, - 4478: 0x69F6, - 4479: 0x69F7, - 4480: 0x69F8, - 4481: 0x69F9, - 4482: 0x69FA, - 4483: 0x69FB, - 4484: 0x69FC, - 4485: 0x69FE, - 4486: 0x6A00, - 4487: 0x6A01, - 4488: 0x6A02, - 4489: 0x6A03, - 4490: 0x6A04, - 4491: 0x6A05, - 4492: 0x6A06, - 4493: 0x6A07, - 4494: 0x6A08, - 4495: 0x6A09, - 4496: 0x6A0B, - 4497: 0x6A0C, - 4498: 0x6A0D, - 4499: 0x6A0E, - 4500: 0x6A0F, - 4501: 0x6A10, - 4502: 0x6A11, - 4503: 0x6A12, - 4504: 0x6A13, - 4505: 0x6A14, - 4506: 0x6A15, - 4507: 0x6A16, - 4508: 0x6A19, - 4509: 0x6A1A, - 4510: 0x6A1B, - 4511: 0x6A1C, - 4512: 0x6A1D, - 4513: 0x6A1E, - 4514: 0x6A20, - 4515: 0x6A22, - 4516: 0x6A23, - 4517: 0x6A24, - 4518: 0x6A25, - 4519: 0x6A26, - 4520: 0x6A27, - 4521: 0x6A29, - 4522: 0x6A2B, - 4523: 0x6A2C, - 4524: 0x6A2D, - 4525: 0x6A2E, - 4526: 0x6A30, - 4527: 0x6A32, - 4528: 0x6A33, - 4529: 0x6A34, - 4530: 0x6A36, - 4531: 0x6A37, - 4532: 0x6A38, - 4533: 0x6A39, - 4534: 0x6A3A, - 4535: 0x6A3B, - 4536: 0x6A3C, - 4537: 0x6A3F, - 4538: 0x6A40, - 4539: 0x6A41, - 4540: 0x6A42, - 4541: 0x6A43, - 4542: 0x6A45, - 4543: 0x6A46, - 4544: 0x6A48, - 4545: 0x6A49, - 4546: 0x6A4A, - 4547: 0x6A4B, - 4548: 0x6A4C, - 4549: 0x6A4D, - 4550: 0x6A4E, - 4551: 0x6A4F, - 4552: 0x6A51, - 4553: 0x6A52, - 4554: 0x6A53, - 4555: 0x6A54, - 4556: 0x6A55, - 4557: 0x6A56, - 4558: 0x6A57, - 4559: 0x6A5A, - 4560: 0x6A5C, - 4561: 0x6A5D, - 4562: 0x6A5E, - 4563: 0x6A5F, - 4564: 0x6A60, - 4565: 0x6A62, - 4566: 0x6A63, - 4567: 0x6A64, - 4568: 0x6A66, - 4569: 0x6A67, - 4570: 0x6A68, - 4571: 0x6A69, - 4572: 0x6A6A, - 4573: 0x6A6B, - 4574: 0x6A6C, - 4575: 0x6A6D, - 4576: 0x6A6E, - 4577: 0x6A6F, - 4578: 0x6A70, - 4579: 0x6A72, - 4580: 0x6A73, - 4581: 0x6A74, - 4582: 0x6A75, - 4583: 0x6A76, - 4584: 0x6A77, - 4585: 0x6A78, - 4586: 0x6A7A, - 4587: 0x6A7B, - 4588: 0x6A7D, - 4589: 0x6A7E, - 4590: 0x6A7F, - 4591: 0x6A81, - 4592: 0x6A82, - 4593: 0x6A83, - 4594: 0x6A85, - 4595: 0x6A86, - 4596: 0x6A87, - 4597: 0x6A88, - 4598: 0x6A89, - 4599: 0x6A8A, - 4600: 0x6A8B, - 4601: 0x6A8C, - 4602: 0x6A8D, - 4603: 0x6A8F, - 4604: 0x6A92, - 4605: 0x6A93, - 4606: 0x6A94, - 4607: 0x6A95, - 4608: 0x6A96, - 4609: 0x6A98, - 4610: 0x6A99, - 4611: 0x6A9A, - 4612: 0x6A9B, - 4613: 0x6A9C, - 4614: 0x6A9D, - 4615: 0x6A9E, - 4616: 0x6A9F, - 4617: 0x6AA1, - 4618: 0x6AA2, - 4619: 0x6AA3, - 4620: 0x6AA4, - 4621: 0x6AA5, - 4622: 0x6AA6, - 4623: 0x6AA7, - 4624: 0x6AA8, - 4625: 0x6AAA, - 4626: 0x6AAD, - 4627: 0x6AAE, - 4628: 0x6AAF, - 4629: 0x6AB0, - 4630: 0x6AB1, - 4631: 0x6AB2, - 4632: 0x6AB3, - 4633: 0x6AB4, - 4634: 0x6AB5, - 4635: 0x6AB6, - 4636: 0x6AB7, - 4637: 0x6AB8, - 4638: 0x6AB9, - 4639: 0x6ABA, - 4640: 0x6ABB, - 4641: 0x6ABC, - 4642: 0x6ABD, - 4643: 0x6ABE, - 4644: 0x6ABF, - 4645: 0x6AC0, - 4646: 0x6AC1, - 4647: 0x6AC2, - 4648: 0x6AC3, - 4649: 0x6AC4, - 4650: 0x6AC5, - 4651: 0x6AC6, - 4652: 0x6AC7, - 4653: 0x6AC8, - 4654: 0x6AC9, - 4655: 0x6ACA, - 4656: 0x6ACB, - 4657: 0x6ACC, - 4658: 0x6ACD, - 4659: 0x6ACE, - 4660: 0x6ACF, - 4661: 0x6AD0, - 4662: 0x6AD1, - 4663: 0x6AD2, - 4664: 0x6AD3, - 4665: 0x6AD4, - 4666: 0x6AD5, - 4667: 0x6AD6, - 4668: 0x6AD7, - 4669: 0x6AD8, - 4670: 0x6AD9, - 4671: 0x6ADA, - 4672: 0x6ADB, - 4673: 0x6ADC, - 4674: 0x6ADD, - 4675: 0x6ADE, - 4676: 0x6ADF, - 4677: 0x6AE0, - 4678: 0x6AE1, - 4679: 0x6AE2, - 4680: 0x6AE3, - 4681: 0x6AE4, - 4682: 0x6AE5, - 4683: 0x6AE6, - 4684: 0x6AE7, - 4685: 0x6AE8, - 4686: 0x6AE9, - 4687: 0x6AEA, - 4688: 0x6AEB, - 4689: 0x6AEC, - 4690: 0x6AED, - 4691: 0x6AEE, - 4692: 0x6AEF, - 4693: 0x6AF0, - 4694: 0x6AF1, - 4695: 0x6AF2, - 4696: 0x6AF3, - 4697: 0x6AF4, - 4698: 0x6AF5, - 4699: 0x6AF6, - 4700: 0x6AF7, - 4701: 0x6AF8, - 4702: 0x6AF9, - 4703: 0x6AFA, - 4704: 0x6AFB, - 4705: 0x6AFC, - 4706: 0x6AFD, - 4707: 0x6AFE, - 4708: 0x6AFF, - 4709: 0x6B00, - 4710: 0x6B01, - 4711: 0x6B02, - 4712: 0x6B03, - 4713: 0x6B04, - 4714: 0x6B05, - 4715: 0x6B06, - 4716: 0x6B07, - 4717: 0x6B08, - 4718: 0x6B09, - 4719: 0x6B0A, - 4720: 0x6B0B, - 4721: 0x6B0C, - 4722: 0x6B0D, - 4723: 0x6B0E, - 4724: 0x6B0F, - 4725: 0x6B10, - 4726: 0x6B11, - 4727: 0x6B12, - 4728: 0x6B13, - 4729: 0x6B14, - 4730: 0x6B15, - 4731: 0x6B16, - 4732: 0x6B17, - 4733: 0x6B18, - 4734: 0x6B19, - 4735: 0x6B1A, - 4736: 0x6B1B, - 4737: 0x6B1C, - 4738: 0x6B1D, - 4739: 0x6B1E, - 4740: 0x6B1F, - 4741: 0x6B25, - 4742: 0x6B26, - 4743: 0x6B28, - 4744: 0x6B29, - 4745: 0x6B2A, - 4746: 0x6B2B, - 4747: 0x6B2C, - 4748: 0x6B2D, - 4749: 0x6B2E, - 4750: 0x6B2F, - 4751: 0x6B30, - 4752: 0x6B31, - 4753: 0x6B33, - 4754: 0x6B34, - 4755: 0x6B35, - 4756: 0x6B36, - 4757: 0x6B38, - 4758: 0x6B3B, - 4759: 0x6B3C, - 4760: 0x6B3D, - 4761: 0x6B3F, - 4762: 0x6B40, - 4763: 0x6B41, - 4764: 0x6B42, - 4765: 0x6B44, - 4766: 0x6B45, - 4767: 0x6B48, - 4768: 0x6B4A, - 4769: 0x6B4B, - 4770: 0x6B4D, - 4771: 0x6B4E, - 4772: 0x6B4F, - 4773: 0x6B50, - 4774: 0x6B51, - 4775: 0x6B52, - 4776: 0x6B53, - 4777: 0x6B54, - 4778: 0x6B55, - 4779: 0x6B56, - 4780: 0x6B57, - 4781: 0x6B58, - 4782: 0x6B5A, - 4783: 0x6B5B, - 4784: 0x6B5C, - 4785: 0x6B5D, - 4786: 0x6B5E, - 4787: 0x6B5F, - 4788: 0x6B60, - 4789: 0x6B61, - 4790: 0x6B68, - 4791: 0x6B69, - 4792: 0x6B6B, - 4793: 0x6B6C, - 4794: 0x6B6D, - 4795: 0x6B6E, - 4796: 0x6B6F, - 4797: 0x6B70, - 4798: 0x6B71, - 4799: 0x6B72, - 4800: 0x6B73, - 4801: 0x6B74, - 4802: 0x6B75, - 4803: 0x6B76, - 4804: 0x6B77, - 4805: 0x6B78, - 4806: 0x6B7A, - 4807: 0x6B7D, - 4808: 0x6B7E, - 4809: 0x6B7F, - 4810: 0x6B80, - 4811: 0x6B85, - 4812: 0x6B88, - 4813: 0x6B8C, - 4814: 0x6B8E, - 4815: 0x6B8F, - 4816: 0x6B90, - 4817: 0x6B91, - 4818: 0x6B94, - 4819: 0x6B95, - 4820: 0x6B97, - 4821: 0x6B98, - 4822: 0x6B99, - 4823: 0x6B9C, - 4824: 0x6B9D, - 4825: 0x6B9E, - 4826: 0x6B9F, - 4827: 0x6BA0, - 4828: 0x6BA2, - 4829: 0x6BA3, - 4830: 0x6BA4, - 4831: 0x6BA5, - 4832: 0x6BA6, - 4833: 0x6BA7, - 4834: 0x6BA8, - 4835: 0x6BA9, - 4836: 0x6BAB, - 4837: 0x6BAC, - 4838: 0x6BAD, - 4839: 0x6BAE, - 4840: 0x6BAF, - 4841: 0x6BB0, - 4842: 0x6BB1, - 4843: 0x6BB2, - 4844: 0x6BB6, - 4845: 0x6BB8, - 4846: 0x6BB9, - 4847: 0x6BBA, - 4848: 0x6BBB, - 4849: 0x6BBC, - 4850: 0x6BBD, - 4851: 0x6BBE, - 4852: 0x6BC0, - 4853: 0x6BC3, - 4854: 0x6BC4, - 4855: 0x6BC6, - 4856: 0x6BC7, - 4857: 0x6BC8, - 4858: 0x6BC9, - 4859: 0x6BCA, - 4860: 0x6BCC, - 4861: 0x6BCE, - 4862: 0x6BD0, - 4863: 0x6BD1, - 4864: 0x6BD8, - 4865: 0x6BDA, - 4866: 0x6BDC, - 4867: 0x6BDD, - 4868: 0x6BDE, - 4869: 0x6BDF, - 4870: 0x6BE0, - 4871: 0x6BE2, - 4872: 0x6BE3, - 4873: 0x6BE4, - 4874: 0x6BE5, - 4875: 0x6BE6, - 4876: 0x6BE7, - 4877: 0x6BE8, - 4878: 0x6BE9, - 4879: 0x6BEC, - 4880: 0x6BED, - 4881: 0x6BEE, - 4882: 0x6BF0, - 4883: 0x6BF1, - 4884: 0x6BF2, - 4885: 0x6BF4, - 4886: 0x6BF6, - 4887: 0x6BF7, - 4888: 0x6BF8, - 4889: 0x6BFA, - 4890: 0x6BFB, - 4891: 0x6BFC, - 4892: 0x6BFE, - 4893: 0x6BFF, - 4894: 0x6C00, - 4895: 0x6C01, - 4896: 0x6C02, - 4897: 0x6C03, - 4898: 0x6C04, - 4899: 0x6C08, - 4900: 0x6C09, - 4901: 0x6C0A, - 4902: 0x6C0B, - 4903: 0x6C0C, - 4904: 0x6C0E, - 4905: 0x6C12, - 4906: 0x6C17, - 4907: 0x6C1C, - 4908: 0x6C1D, - 4909: 0x6C1E, - 4910: 0x6C20, - 4911: 0x6C23, - 4912: 0x6C25, - 4913: 0x6C2B, - 4914: 0x6C2C, - 4915: 0x6C2D, - 4916: 0x6C31, - 4917: 0x6C33, - 4918: 0x6C36, - 4919: 0x6C37, - 4920: 0x6C39, - 4921: 0x6C3A, - 4922: 0x6C3B, - 4923: 0x6C3C, - 4924: 0x6C3E, - 4925: 0x6C3F, - 4926: 0x6C43, - 4927: 0x6C44, - 4928: 0x6C45, - 4929: 0x6C48, - 4930: 0x6C4B, - 4931: 0x6C4C, - 4932: 0x6C4D, - 4933: 0x6C4E, - 4934: 0x6C4F, - 4935: 0x6C51, - 4936: 0x6C52, - 4937: 0x6C53, - 4938: 0x6C56, - 4939: 0x6C58, - 4940: 0x6C59, - 4941: 0x6C5A, - 4942: 0x6C62, - 4943: 0x6C63, - 4944: 0x6C65, - 4945: 0x6C66, - 4946: 0x6C67, - 4947: 0x6C6B, - 4948: 0x6C6C, - 4949: 0x6C6D, - 4950: 0x6C6E, - 4951: 0x6C6F, - 4952: 0x6C71, - 4953: 0x6C73, - 4954: 0x6C75, - 4955: 0x6C77, - 4956: 0x6C78, - 4957: 0x6C7A, - 4958: 0x6C7B, - 4959: 0x6C7C, - 4960: 0x6C7F, - 4961: 0x6C80, - 4962: 0x6C84, - 4963: 0x6C87, - 4964: 0x6C8A, - 4965: 0x6C8B, - 4966: 0x6C8D, - 4967: 0x6C8E, - 4968: 0x6C91, - 4969: 0x6C92, - 4970: 0x6C95, - 4971: 0x6C96, - 4972: 0x6C97, - 4973: 0x6C98, - 4974: 0x6C9A, - 4975: 0x6C9C, - 4976: 0x6C9D, - 4977: 0x6C9E, - 4978: 0x6CA0, - 4979: 0x6CA2, - 4980: 0x6CA8, - 4981: 0x6CAC, - 4982: 0x6CAF, - 4983: 0x6CB0, - 4984: 0x6CB4, - 4985: 0x6CB5, - 4986: 0x6CB6, - 4987: 0x6CB7, - 4988: 0x6CBA, - 4989: 0x6CC0, - 4990: 0x6CC1, - 4991: 0x6CC2, - 4992: 0x6CC3, - 4993: 0x6CC6, - 4994: 0x6CC7, - 4995: 0x6CC8, - 4996: 0x6CCB, - 4997: 0x6CCD, - 4998: 0x6CCE, - 4999: 0x6CCF, - 5000: 0x6CD1, - 5001: 0x6CD2, - 5002: 0x6CD8, - 5003: 0x6CD9, - 5004: 0x6CDA, - 5005: 0x6CDC, - 5006: 0x6CDD, - 5007: 0x6CDF, - 5008: 0x6CE4, - 5009: 0x6CE6, - 5010: 0x6CE7, - 5011: 0x6CE9, - 5012: 0x6CEC, - 5013: 0x6CED, - 5014: 0x6CF2, - 5015: 0x6CF4, - 5016: 0x6CF9, - 5017: 0x6CFF, - 5018: 0x6D00, - 5019: 0x6D02, - 5020: 0x6D03, - 5021: 0x6D05, - 5022: 0x6D06, - 5023: 0x6D08, - 5024: 0x6D09, - 5025: 0x6D0A, - 5026: 0x6D0D, - 5027: 0x6D0F, - 5028: 0x6D10, - 5029: 0x6D11, - 5030: 0x6D13, - 5031: 0x6D14, - 5032: 0x6D15, - 5033: 0x6D16, - 5034: 0x6D18, - 5035: 0x6D1C, - 5036: 0x6D1D, - 5037: 0x6D1F, - 5038: 0x6D20, - 5039: 0x6D21, - 5040: 0x6D22, - 5041: 0x6D23, - 5042: 0x6D24, - 5043: 0x6D26, - 5044: 0x6D28, - 5045: 0x6D29, - 5046: 0x6D2C, - 5047: 0x6D2D, - 5048: 0x6D2F, - 5049: 0x6D30, - 5050: 0x6D34, - 5051: 0x6D36, - 5052: 0x6D37, - 5053: 0x6D38, - 5054: 0x6D3A, - 5055: 0x6D3F, - 5056: 0x6D40, - 5057: 0x6D42, - 5058: 0x6D44, - 5059: 0x6D49, - 5060: 0x6D4C, - 5061: 0x6D50, - 5062: 0x6D55, - 5063: 0x6D56, - 5064: 0x6D57, - 5065: 0x6D58, - 5066: 0x6D5B, - 5067: 0x6D5D, - 5068: 0x6D5F, - 5069: 0x6D61, - 5070: 0x6D62, - 5071: 0x6D64, - 5072: 0x6D65, - 5073: 0x6D67, - 5074: 0x6D68, - 5075: 0x6D6B, - 5076: 0x6D6C, - 5077: 0x6D6D, - 5078: 0x6D70, - 5079: 0x6D71, - 5080: 0x6D72, - 5081: 0x6D73, - 5082: 0x6D75, - 5083: 0x6D76, - 5084: 0x6D79, - 5085: 0x6D7A, - 5086: 0x6D7B, - 5087: 0x6D7D, - 5088: 0x6D7E, - 5089: 0x6D7F, - 5090: 0x6D80, - 5091: 0x6D81, - 5092: 0x6D83, - 5093: 0x6D84, - 5094: 0x6D86, - 5095: 0x6D87, - 5096: 0x6D8A, - 5097: 0x6D8B, - 5098: 0x6D8D, - 5099: 0x6D8F, - 5100: 0x6D90, - 5101: 0x6D92, - 5102: 0x6D96, - 5103: 0x6D97, - 5104: 0x6D98, - 5105: 0x6D99, - 5106: 0x6D9A, - 5107: 0x6D9C, - 5108: 0x6DA2, - 5109: 0x6DA5, - 5110: 0x6DAC, - 5111: 0x6DAD, - 5112: 0x6DB0, - 5113: 0x6DB1, - 5114: 0x6DB3, - 5115: 0x6DB4, - 5116: 0x6DB6, - 5117: 0x6DB7, - 5118: 0x6DB9, - 5119: 0x6DBA, - 5120: 0x6DBB, - 5121: 0x6DBC, - 5122: 0x6DBD, - 5123: 0x6DBE, - 5124: 0x6DC1, - 5125: 0x6DC2, - 5126: 0x6DC3, - 5127: 0x6DC8, - 5128: 0x6DC9, - 5129: 0x6DCA, - 5130: 0x6DCD, - 5131: 0x6DCE, - 5132: 0x6DCF, - 5133: 0x6DD0, - 5134: 0x6DD2, - 5135: 0x6DD3, - 5136: 0x6DD4, - 5137: 0x6DD5, - 5138: 0x6DD7, - 5139: 0x6DDA, - 5140: 0x6DDB, - 5141: 0x6DDC, - 5142: 0x6DDF, - 5143: 0x6DE2, - 5144: 0x6DE3, - 5145: 0x6DE5, - 5146: 0x6DE7, - 5147: 0x6DE8, - 5148: 0x6DE9, - 5149: 0x6DEA, - 5150: 0x6DED, - 5151: 0x6DEF, - 5152: 0x6DF0, - 5153: 0x6DF2, - 5154: 0x6DF4, - 5155: 0x6DF5, - 5156: 0x6DF6, - 5157: 0x6DF8, - 5158: 0x6DFA, - 5159: 0x6DFD, - 5160: 0x6DFE, - 5161: 0x6DFF, - 5162: 0x6E00, - 5163: 0x6E01, - 5164: 0x6E02, - 5165: 0x6E03, - 5166: 0x6E04, - 5167: 0x6E06, - 5168: 0x6E07, - 5169: 0x6E08, - 5170: 0x6E09, - 5171: 0x6E0B, - 5172: 0x6E0F, - 5173: 0x6E12, - 5174: 0x6E13, - 5175: 0x6E15, - 5176: 0x6E18, - 5177: 0x6E19, - 5178: 0x6E1B, - 5179: 0x6E1C, - 5180: 0x6E1E, - 5181: 0x6E1F, - 5182: 0x6E22, - 5183: 0x6E26, - 5184: 0x6E27, - 5185: 0x6E28, - 5186: 0x6E2A, - 5187: 0x6E2C, - 5188: 0x6E2E, - 5189: 0x6E30, - 5190: 0x6E31, - 5191: 0x6E33, - 5192: 0x6E35, - 5193: 0x6E36, - 5194: 0x6E37, - 5195: 0x6E39, - 5196: 0x6E3B, - 5197: 0x6E3C, - 5198: 0x6E3D, - 5199: 0x6E3E, - 5200: 0x6E3F, - 5201: 0x6E40, - 5202: 0x6E41, - 5203: 0x6E42, - 5204: 0x6E45, - 5205: 0x6E46, - 5206: 0x6E47, - 5207: 0x6E48, - 5208: 0x6E49, - 5209: 0x6E4A, - 5210: 0x6E4B, - 5211: 0x6E4C, - 5212: 0x6E4F, - 5213: 0x6E50, - 5214: 0x6E51, - 5215: 0x6E52, - 5216: 0x6E55, - 5217: 0x6E57, - 5218: 0x6E59, - 5219: 0x6E5A, - 5220: 0x6E5C, - 5221: 0x6E5D, - 5222: 0x6E5E, - 5223: 0x6E60, - 5224: 0x6E61, - 5225: 0x6E62, - 5226: 0x6E63, - 5227: 0x6E64, - 5228: 0x6E65, - 5229: 0x6E66, - 5230: 0x6E67, - 5231: 0x6E68, - 5232: 0x6E69, - 5233: 0x6E6A, - 5234: 0x6E6C, - 5235: 0x6E6D, - 5236: 0x6E6F, - 5237: 0x6E70, - 5238: 0x6E71, - 5239: 0x6E72, - 5240: 0x6E73, - 5241: 0x6E74, - 5242: 0x6E75, - 5243: 0x6E76, - 5244: 0x6E77, - 5245: 0x6E78, - 5246: 0x6E79, - 5247: 0x6E7A, - 5248: 0x6E7B, - 5249: 0x6E7C, - 5250: 0x6E7D, - 5251: 0x6E80, - 5252: 0x6E81, - 5253: 0x6E82, - 5254: 0x6E84, - 5255: 0x6E87, - 5256: 0x6E88, - 5257: 0x6E8A, - 5258: 0x6E8B, - 5259: 0x6E8C, - 5260: 0x6E8D, - 5261: 0x6E8E, - 5262: 0x6E91, - 5263: 0x6E92, - 5264: 0x6E93, - 5265: 0x6E94, - 5266: 0x6E95, - 5267: 0x6E96, - 5268: 0x6E97, - 5269: 0x6E99, - 5270: 0x6E9A, - 5271: 0x6E9B, - 5272: 0x6E9D, - 5273: 0x6E9E, - 5274: 0x6EA0, - 5275: 0x6EA1, - 5276: 0x6EA3, - 5277: 0x6EA4, - 5278: 0x6EA6, - 5279: 0x6EA8, - 5280: 0x6EA9, - 5281: 0x6EAB, - 5282: 0x6EAC, - 5283: 0x6EAD, - 5284: 0x6EAE, - 5285: 0x6EB0, - 5286: 0x6EB3, - 5287: 0x6EB5, - 5288: 0x6EB8, - 5289: 0x6EB9, - 5290: 0x6EBC, - 5291: 0x6EBE, - 5292: 0x6EBF, - 5293: 0x6EC0, - 5294: 0x6EC3, - 5295: 0x6EC4, - 5296: 0x6EC5, - 5297: 0x6EC6, - 5298: 0x6EC8, - 5299: 0x6EC9, - 5300: 0x6ECA, - 5301: 0x6ECC, - 5302: 0x6ECD, - 5303: 0x6ECE, - 5304: 0x6ED0, - 5305: 0x6ED2, - 5306: 0x6ED6, - 5307: 0x6ED8, - 5308: 0x6ED9, - 5309: 0x6EDB, - 5310: 0x6EDC, - 5311: 0x6EDD, - 5312: 0x6EE3, - 5313: 0x6EE7, - 5314: 0x6EEA, - 5315: 0x6EEB, - 5316: 0x6EEC, - 5317: 0x6EED, - 5318: 0x6EEE, - 5319: 0x6EEF, - 5320: 0x6EF0, - 5321: 0x6EF1, - 5322: 0x6EF2, - 5323: 0x6EF3, - 5324: 0x6EF5, - 5325: 0x6EF6, - 5326: 0x6EF7, - 5327: 0x6EF8, - 5328: 0x6EFA, - 5329: 0x6EFB, - 5330: 0x6EFC, - 5331: 0x6EFD, - 5332: 0x6EFE, - 5333: 0x6EFF, - 5334: 0x6F00, - 5335: 0x6F01, - 5336: 0x6F03, - 5337: 0x6F04, - 5338: 0x6F05, - 5339: 0x6F07, - 5340: 0x6F08, - 5341: 0x6F0A, - 5342: 0x6F0B, - 5343: 0x6F0C, - 5344: 0x6F0D, - 5345: 0x6F0E, - 5346: 0x6F10, - 5347: 0x6F11, - 5348: 0x6F12, - 5349: 0x6F16, - 5350: 0x6F17, - 5351: 0x6F18, - 5352: 0x6F19, - 5353: 0x6F1A, - 5354: 0x6F1B, - 5355: 0x6F1C, - 5356: 0x6F1D, - 5357: 0x6F1E, - 5358: 0x6F1F, - 5359: 0x6F21, - 5360: 0x6F22, - 5361: 0x6F23, - 5362: 0x6F25, - 5363: 0x6F26, - 5364: 0x6F27, - 5365: 0x6F28, - 5366: 0x6F2C, - 5367: 0x6F2E, - 5368: 0x6F30, - 5369: 0x6F32, - 5370: 0x6F34, - 5371: 0x6F35, - 5372: 0x6F37, - 5373: 0x6F38, - 5374: 0x6F39, - 5375: 0x6F3A, - 5376: 0x6F3B, - 5377: 0x6F3C, - 5378: 0x6F3D, - 5379: 0x6F3F, - 5380: 0x6F40, - 5381: 0x6F41, - 5382: 0x6F42, - 5383: 0x6F43, - 5384: 0x6F44, - 5385: 0x6F45, - 5386: 0x6F48, - 5387: 0x6F49, - 5388: 0x6F4A, - 5389: 0x6F4C, - 5390: 0x6F4E, - 5391: 0x6F4F, - 5392: 0x6F50, - 5393: 0x6F51, - 5394: 0x6F52, - 5395: 0x6F53, - 5396: 0x6F54, - 5397: 0x6F55, - 5398: 0x6F56, - 5399: 0x6F57, - 5400: 0x6F59, - 5401: 0x6F5A, - 5402: 0x6F5B, - 5403: 0x6F5D, - 5404: 0x6F5F, - 5405: 0x6F60, - 5406: 0x6F61, - 5407: 0x6F63, - 5408: 0x6F64, - 5409: 0x6F65, - 5410: 0x6F67, - 5411: 0x6F68, - 5412: 0x6F69, - 5413: 0x6F6A, - 5414: 0x6F6B, - 5415: 0x6F6C, - 5416: 0x6F6F, - 5417: 0x6F70, - 5418: 0x6F71, - 5419: 0x6F73, - 5420: 0x6F75, - 5421: 0x6F76, - 5422: 0x6F77, - 5423: 0x6F79, - 5424: 0x6F7B, - 5425: 0x6F7D, - 5426: 0x6F7E, - 5427: 0x6F7F, - 5428: 0x6F80, - 5429: 0x6F81, - 5430: 0x6F82, - 5431: 0x6F83, - 5432: 0x6F85, - 5433: 0x6F86, - 5434: 0x6F87, - 5435: 0x6F8A, - 5436: 0x6F8B, - 5437: 0x6F8F, - 5438: 0x6F90, - 5439: 0x6F91, - 5440: 0x6F92, - 5441: 0x6F93, - 5442: 0x6F94, - 5443: 0x6F95, - 5444: 0x6F96, - 5445: 0x6F97, - 5446: 0x6F98, - 5447: 0x6F99, - 5448: 0x6F9A, - 5449: 0x6F9B, - 5450: 0x6F9D, - 5451: 0x6F9E, - 5452: 0x6F9F, - 5453: 0x6FA0, - 5454: 0x6FA2, - 5455: 0x6FA3, - 5456: 0x6FA4, - 5457: 0x6FA5, - 5458: 0x6FA6, - 5459: 0x6FA8, - 5460: 0x6FA9, - 5461: 0x6FAA, - 5462: 0x6FAB, - 5463: 0x6FAC, - 5464: 0x6FAD, - 5465: 0x6FAE, - 5466: 0x6FAF, - 5467: 0x6FB0, - 5468: 0x6FB1, - 5469: 0x6FB2, - 5470: 0x6FB4, - 5471: 0x6FB5, - 5472: 0x6FB7, - 5473: 0x6FB8, - 5474: 0x6FBA, - 5475: 0x6FBB, - 5476: 0x6FBC, - 5477: 0x6FBD, - 5478: 0x6FBE, - 5479: 0x6FBF, - 5480: 0x6FC1, - 5481: 0x6FC3, - 5482: 0x6FC4, - 5483: 0x6FC5, - 5484: 0x6FC6, - 5485: 0x6FC7, - 5486: 0x6FC8, - 5487: 0x6FCA, - 5488: 0x6FCB, - 5489: 0x6FCC, - 5490: 0x6FCD, - 5491: 0x6FCE, - 5492: 0x6FCF, - 5493: 0x6FD0, - 5494: 0x6FD3, - 5495: 0x6FD4, - 5496: 0x6FD5, - 5497: 0x6FD6, - 5498: 0x6FD7, - 5499: 0x6FD8, - 5500: 0x6FD9, - 5501: 0x6FDA, - 5502: 0x6FDB, - 5503: 0x6FDC, - 5504: 0x6FDD, - 5505: 0x6FDF, - 5506: 0x6FE2, - 5507: 0x6FE3, - 5508: 0x6FE4, - 5509: 0x6FE5, - 5510: 0x6FE6, - 5511: 0x6FE7, - 5512: 0x6FE8, - 5513: 0x6FE9, - 5514: 0x6FEA, - 5515: 0x6FEB, - 5516: 0x6FEC, - 5517: 0x6FED, - 5518: 0x6FF0, - 5519: 0x6FF1, - 5520: 0x6FF2, - 5521: 0x6FF3, - 5522: 0x6FF4, - 5523: 0x6FF5, - 5524: 0x6FF6, - 5525: 0x6FF7, - 5526: 0x6FF8, - 5527: 0x6FF9, - 5528: 0x6FFA, - 5529: 0x6FFB, - 5530: 0x6FFC, - 5531: 0x6FFD, - 5532: 0x6FFE, - 5533: 0x6FFF, - 5534: 0x7000, - 5535: 0x7001, - 5536: 0x7002, - 5537: 0x7003, - 5538: 0x7004, - 5539: 0x7005, - 5540: 0x7006, - 5541: 0x7007, - 5542: 0x7008, - 5543: 0x7009, - 5544: 0x700A, - 5545: 0x700B, - 5546: 0x700C, - 5547: 0x700D, - 5548: 0x700E, - 5549: 0x700F, - 5550: 0x7010, - 5551: 0x7012, - 5552: 0x7013, - 5553: 0x7014, - 5554: 0x7015, - 5555: 0x7016, - 5556: 0x7017, - 5557: 0x7018, - 5558: 0x7019, - 5559: 0x701C, - 5560: 0x701D, - 5561: 0x701E, - 5562: 0x701F, - 5563: 0x7020, - 5564: 0x7021, - 5565: 0x7022, - 5566: 0x7024, - 5567: 0x7025, - 5568: 0x7026, - 5569: 0x7027, - 5570: 0x7028, - 5571: 0x7029, - 5572: 0x702A, - 5573: 0x702B, - 5574: 0x702C, - 5575: 0x702D, - 5576: 0x702E, - 5577: 0x702F, - 5578: 0x7030, - 5579: 0x7031, - 5580: 0x7032, - 5581: 0x7033, - 5582: 0x7034, - 5583: 0x7036, - 5584: 0x7037, - 5585: 0x7038, - 5586: 0x703A, - 5587: 0x703B, - 5588: 0x703C, - 5589: 0x703D, - 5590: 0x703E, - 5591: 0x703F, - 5592: 0x7040, - 5593: 0x7041, - 5594: 0x7042, - 5595: 0x7043, - 5596: 0x7044, - 5597: 0x7045, - 5598: 0x7046, - 5599: 0x7047, - 5600: 0x7048, - 5601: 0x7049, - 5602: 0x704A, - 5603: 0x704B, - 5604: 0x704D, - 5605: 0x704E, - 5606: 0x7050, - 5607: 0x7051, - 5608: 0x7052, - 5609: 0x7053, - 5610: 0x7054, - 5611: 0x7055, - 5612: 0x7056, - 5613: 0x7057, - 5614: 0x7058, - 5615: 0x7059, - 5616: 0x705A, - 5617: 0x705B, - 5618: 0x705C, - 5619: 0x705D, - 5620: 0x705F, - 5621: 0x7060, - 5622: 0x7061, - 5623: 0x7062, - 5624: 0x7063, - 5625: 0x7064, - 5626: 0x7065, - 5627: 0x7066, - 5628: 0x7067, - 5629: 0x7068, - 5630: 0x7069, - 5631: 0x706A, - 5632: 0x706E, - 5633: 0x7071, - 5634: 0x7072, - 5635: 0x7073, - 5636: 0x7074, - 5637: 0x7077, - 5638: 0x7079, - 5639: 0x707A, - 5640: 0x707B, - 5641: 0x707D, - 5642: 0x7081, - 5643: 0x7082, - 5644: 0x7083, - 5645: 0x7084, - 5646: 0x7086, - 5647: 0x7087, - 5648: 0x7088, - 5649: 0x708B, - 5650: 0x708C, - 5651: 0x708D, - 5652: 0x708F, - 5653: 0x7090, - 5654: 0x7091, - 5655: 0x7093, - 5656: 0x7097, - 5657: 0x7098, - 5658: 0x709A, - 5659: 0x709B, - 5660: 0x709E, - 5661: 0x709F, - 5662: 0x70A0, - 5663: 0x70A1, - 5664: 0x70A2, - 5665: 0x70A3, - 5666: 0x70A4, - 5667: 0x70A5, - 5668: 0x70A6, - 5669: 0x70A7, - 5670: 0x70A8, - 5671: 0x70A9, - 5672: 0x70AA, - 5673: 0x70B0, - 5674: 0x70B2, - 5675: 0x70B4, - 5676: 0x70B5, - 5677: 0x70B6, - 5678: 0x70BA, - 5679: 0x70BE, - 5680: 0x70BF, - 5681: 0x70C4, - 5682: 0x70C5, - 5683: 0x70C6, - 5684: 0x70C7, - 5685: 0x70C9, - 5686: 0x70CB, - 5687: 0x70CC, - 5688: 0x70CD, - 5689: 0x70CE, - 5690: 0x70CF, - 5691: 0x70D0, - 5692: 0x70D1, - 5693: 0x70D2, - 5694: 0x70D3, - 5695: 0x70D4, - 5696: 0x70D5, - 5697: 0x70D6, - 5698: 0x70D7, - 5699: 0x70DA, - 5700: 0x70DC, - 5701: 0x70DD, - 5702: 0x70DE, - 5703: 0x70E0, - 5704: 0x70E1, - 5705: 0x70E2, - 5706: 0x70E3, - 5707: 0x70E5, - 5708: 0x70EA, - 5709: 0x70EE, - 5710: 0x70F0, - 5711: 0x70F1, - 5712: 0x70F2, - 5713: 0x70F3, - 5714: 0x70F4, - 5715: 0x70F5, - 5716: 0x70F6, - 5717: 0x70F8, - 5718: 0x70FA, - 5719: 0x70FB, - 5720: 0x70FC, - 5721: 0x70FE, - 5722: 0x70FF, - 5723: 0x7100, - 5724: 0x7101, - 5725: 0x7102, - 5726: 0x7103, - 5727: 0x7104, - 5728: 0x7105, - 5729: 0x7106, - 5730: 0x7107, - 5731: 0x7108, - 5732: 0x710B, - 5733: 0x710C, - 5734: 0x710D, - 5735: 0x710E, - 5736: 0x710F, - 5737: 0x7111, - 5738: 0x7112, - 5739: 0x7114, - 5740: 0x7117, - 5741: 0x711B, - 5742: 0x711C, - 5743: 0x711D, - 5744: 0x711E, - 5745: 0x711F, - 5746: 0x7120, - 5747: 0x7121, - 5748: 0x7122, - 5749: 0x7123, - 5750: 0x7124, - 5751: 0x7125, - 5752: 0x7127, - 5753: 0x7128, - 5754: 0x7129, - 5755: 0x712A, - 5756: 0x712B, - 5757: 0x712C, - 5758: 0x712D, - 5759: 0x712E, - 5760: 0x7132, - 5761: 0x7133, - 5762: 0x7134, - 5763: 0x7135, - 5764: 0x7137, - 5765: 0x7138, - 5766: 0x7139, - 5767: 0x713A, - 5768: 0x713B, - 5769: 0x713C, - 5770: 0x713D, - 5771: 0x713E, - 5772: 0x713F, - 5773: 0x7140, - 5774: 0x7141, - 5775: 0x7142, - 5776: 0x7143, - 5777: 0x7144, - 5778: 0x7146, - 5779: 0x7147, - 5780: 0x7148, - 5781: 0x7149, - 5782: 0x714B, - 5783: 0x714D, - 5784: 0x714F, - 5785: 0x7150, - 5786: 0x7151, - 5787: 0x7152, - 5788: 0x7153, - 5789: 0x7154, - 5790: 0x7155, - 5791: 0x7156, - 5792: 0x7157, - 5793: 0x7158, - 5794: 0x7159, - 5795: 0x715A, - 5796: 0x715B, - 5797: 0x715D, - 5798: 0x715F, - 5799: 0x7160, - 5800: 0x7161, - 5801: 0x7162, - 5802: 0x7163, - 5803: 0x7165, - 5804: 0x7169, - 5805: 0x716A, - 5806: 0x716B, - 5807: 0x716C, - 5808: 0x716D, - 5809: 0x716F, - 5810: 0x7170, - 5811: 0x7171, - 5812: 0x7174, - 5813: 0x7175, - 5814: 0x7176, - 5815: 0x7177, - 5816: 0x7179, - 5817: 0x717B, - 5818: 0x717C, - 5819: 0x717E, - 5820: 0x717F, - 5821: 0x7180, - 5822: 0x7181, - 5823: 0x7182, - 5824: 0x7183, - 5825: 0x7185, - 5826: 0x7186, - 5827: 0x7187, - 5828: 0x7188, - 5829: 0x7189, - 5830: 0x718B, - 5831: 0x718C, - 5832: 0x718D, - 5833: 0x718E, - 5834: 0x7190, - 5835: 0x7191, - 5836: 0x7192, - 5837: 0x7193, - 5838: 0x7195, - 5839: 0x7196, - 5840: 0x7197, - 5841: 0x719A, - 5842: 0x719B, - 5843: 0x719C, - 5844: 0x719D, - 5845: 0x719E, - 5846: 0x71A1, - 5847: 0x71A2, - 5848: 0x71A3, - 5849: 0x71A4, - 5850: 0x71A5, - 5851: 0x71A6, - 5852: 0x71A7, - 5853: 0x71A9, - 5854: 0x71AA, - 5855: 0x71AB, - 5856: 0x71AD, - 5857: 0x71AE, - 5858: 0x71AF, - 5859: 0x71B0, - 5860: 0x71B1, - 5861: 0x71B2, - 5862: 0x71B4, - 5863: 0x71B6, - 5864: 0x71B7, - 5865: 0x71B8, - 5866: 0x71BA, - 5867: 0x71BB, - 5868: 0x71BC, - 5869: 0x71BD, - 5870: 0x71BE, - 5871: 0x71BF, - 5872: 0x71C0, - 5873: 0x71C1, - 5874: 0x71C2, - 5875: 0x71C4, - 5876: 0x71C5, - 5877: 0x71C6, - 5878: 0x71C7, - 5879: 0x71C8, - 5880: 0x71C9, - 5881: 0x71CA, - 5882: 0x71CB, - 5883: 0x71CC, - 5884: 0x71CD, - 5885: 0x71CF, - 5886: 0x71D0, - 5887: 0x71D1, - 5888: 0x71D2, - 5889: 0x71D3, - 5890: 0x71D6, - 5891: 0x71D7, - 5892: 0x71D8, - 5893: 0x71D9, - 5894: 0x71DA, - 5895: 0x71DB, - 5896: 0x71DC, - 5897: 0x71DD, - 5898: 0x71DE, - 5899: 0x71DF, - 5900: 0x71E1, - 5901: 0x71E2, - 5902: 0x71E3, - 5903: 0x71E4, - 5904: 0x71E6, - 5905: 0x71E8, - 5906: 0x71E9, - 5907: 0x71EA, - 5908: 0x71EB, - 5909: 0x71EC, - 5910: 0x71ED, - 5911: 0x71EF, - 5912: 0x71F0, - 5913: 0x71F1, - 5914: 0x71F2, - 5915: 0x71F3, - 5916: 0x71F4, - 5917: 0x71F5, - 5918: 0x71F6, - 5919: 0x71F7, - 5920: 0x71F8, - 5921: 0x71FA, - 5922: 0x71FB, - 5923: 0x71FC, - 5924: 0x71FD, - 5925: 0x71FE, - 5926: 0x71FF, - 5927: 0x7200, - 5928: 0x7201, - 5929: 0x7202, - 5930: 0x7203, - 5931: 0x7204, - 5932: 0x7205, - 5933: 0x7207, - 5934: 0x7208, - 5935: 0x7209, - 5936: 0x720A, - 5937: 0x720B, - 5938: 0x720C, - 5939: 0x720D, - 5940: 0x720E, - 5941: 0x720F, - 5942: 0x7210, - 5943: 0x7211, - 5944: 0x7212, - 5945: 0x7213, - 5946: 0x7214, - 5947: 0x7215, - 5948: 0x7216, - 5949: 0x7217, - 5950: 0x7218, - 5951: 0x7219, - 5952: 0x721A, - 5953: 0x721B, - 5954: 0x721C, - 5955: 0x721E, - 5956: 0x721F, - 5957: 0x7220, - 5958: 0x7221, - 5959: 0x7222, - 5960: 0x7223, - 5961: 0x7224, - 5962: 0x7225, - 5963: 0x7226, - 5964: 0x7227, - 5965: 0x7229, - 5966: 0x722B, - 5967: 0x722D, - 5968: 0x722E, - 5969: 0x722F, - 5970: 0x7232, - 5971: 0x7233, - 5972: 0x7234, - 5973: 0x723A, - 5974: 0x723C, - 5975: 0x723E, - 5976: 0x7240, - 5977: 0x7241, - 5978: 0x7242, - 5979: 0x7243, - 5980: 0x7244, - 5981: 0x7245, - 5982: 0x7246, - 5983: 0x7249, - 5984: 0x724A, - 5985: 0x724B, - 5986: 0x724E, - 5987: 0x724F, - 5988: 0x7250, - 5989: 0x7251, - 5990: 0x7253, - 5991: 0x7254, - 5992: 0x7255, - 5993: 0x7257, - 5994: 0x7258, - 5995: 0x725A, - 5996: 0x725C, - 5997: 0x725E, - 5998: 0x7260, - 5999: 0x7263, - 6000: 0x7264, - 6001: 0x7265, - 6002: 0x7268, - 6003: 0x726A, - 6004: 0x726B, - 6005: 0x726C, - 6006: 0x726D, - 6007: 0x7270, - 6008: 0x7271, - 6009: 0x7273, - 6010: 0x7274, - 6011: 0x7276, - 6012: 0x7277, - 6013: 0x7278, - 6014: 0x727B, - 6015: 0x727C, - 6016: 0x727D, - 6017: 0x7282, - 6018: 0x7283, - 6019: 0x7285, - 6020: 0x7286, - 6021: 0x7287, - 6022: 0x7288, - 6023: 0x7289, - 6024: 0x728C, - 6025: 0x728E, - 6026: 0x7290, - 6027: 0x7291, - 6028: 0x7293, - 6029: 0x7294, - 6030: 0x7295, - 6031: 0x7296, - 6032: 0x7297, - 6033: 0x7298, - 6034: 0x7299, - 6035: 0x729A, - 6036: 0x729B, - 6037: 0x729C, - 6038: 0x729D, - 6039: 0x729E, - 6040: 0x72A0, - 6041: 0x72A1, - 6042: 0x72A2, - 6043: 0x72A3, - 6044: 0x72A4, - 6045: 0x72A5, - 6046: 0x72A6, - 6047: 0x72A7, - 6048: 0x72A8, - 6049: 0x72A9, - 6050: 0x72AA, - 6051: 0x72AB, - 6052: 0x72AE, - 6053: 0x72B1, - 6054: 0x72B2, - 6055: 0x72B3, - 6056: 0x72B5, - 6057: 0x72BA, - 6058: 0x72BB, - 6059: 0x72BC, - 6060: 0x72BD, - 6061: 0x72BE, - 6062: 0x72BF, - 6063: 0x72C0, - 6064: 0x72C5, - 6065: 0x72C6, - 6066: 0x72C7, - 6067: 0x72C9, - 6068: 0x72CA, - 6069: 0x72CB, - 6070: 0x72CC, - 6071: 0x72CF, - 6072: 0x72D1, - 6073: 0x72D3, - 6074: 0x72D4, - 6075: 0x72D5, - 6076: 0x72D6, - 6077: 0x72D8, - 6078: 0x72DA, - 6079: 0x72DB, - 6176: 0x3000, - 6177: 0x3001, - 6178: 0x3002, - 6179: 0x00B7, - 6180: 0x02C9, - 6181: 0x02C7, - 6182: 0x00A8, - 6183: 0x3003, - 6184: 0x3005, - 6185: 0x2014, - 6186: 0xFF5E, - 6187: 0x2016, - 6188: 0x2026, - 6189: 0x2018, - 6190: 0x2019, - 6191: 0x201C, - 6192: 0x201D, - 6193: 0x3014, - 6194: 0x3015, - 6195: 0x3008, - 6196: 0x3009, - 6197: 0x300A, - 6198: 0x300B, - 6199: 0x300C, - 6200: 0x300D, - 6201: 0x300E, - 6202: 0x300F, - 6203: 0x3016, - 6204: 0x3017, - 6205: 0x3010, - 6206: 0x3011, - 6207: 0x00B1, - 6208: 0x00D7, - 6209: 0x00F7, - 6210: 0x2236, - 6211: 0x2227, - 6212: 0x2228, - 6213: 0x2211, - 6214: 0x220F, - 6215: 0x222A, - 6216: 0x2229, - 6217: 0x2208, - 6218: 0x2237, - 6219: 0x221A, - 6220: 0x22A5, - 6221: 0x2225, - 6222: 0x2220, - 6223: 0x2312, - 6224: 0x2299, - 6225: 0x222B, - 6226: 0x222E, - 6227: 0x2261, - 6228: 0x224C, - 6229: 0x2248, - 6230: 0x223D, - 6231: 0x221D, - 6232: 0x2260, - 6233: 0x226E, - 6234: 0x226F, - 6235: 0x2264, - 6236: 0x2265, - 6237: 0x221E, - 6238: 0x2235, - 6239: 0x2234, - 6240: 0x2642, - 6241: 0x2640, - 6242: 0x00B0, - 6243: 0x2032, - 6244: 0x2033, - 6245: 0x2103, - 6246: 0xFF04, - 6247: 0x00A4, - 6248: 0xFFE0, - 6249: 0xFFE1, - 6250: 0x2030, - 6251: 0x00A7, - 6252: 0x2116, - 6253: 0x2606, - 6254: 0x2605, - 6255: 0x25CB, - 6256: 0x25CF, - 6257: 0x25CE, - 6258: 0x25C7, - 6259: 0x25C6, - 6260: 0x25A1, - 6261: 0x25A0, - 6262: 0x25B3, - 6263: 0x25B2, - 6264: 0x203B, - 6265: 0x2192, - 6266: 0x2190, - 6267: 0x2191, - 6268: 0x2193, - 6269: 0x3013, - 6366: 0x2170, - 6367: 0x2171, - 6368: 0x2172, - 6369: 0x2173, - 6370: 0x2174, - 6371: 0x2175, - 6372: 0x2176, - 6373: 0x2177, - 6374: 0x2178, - 6375: 0x2179, - 6382: 0x2488, - 6383: 0x2489, - 6384: 0x248A, - 6385: 0x248B, - 6386: 0x248C, - 6387: 0x248D, - 6388: 0x248E, - 6389: 0x248F, - 6390: 0x2490, - 6391: 0x2491, - 6392: 0x2492, - 6393: 0x2493, - 6394: 0x2494, - 6395: 0x2495, - 6396: 0x2496, - 6397: 0x2497, - 6398: 0x2498, - 6399: 0x2499, - 6400: 0x249A, - 6401: 0x249B, - 6402: 0x2474, - 6403: 0x2475, - 6404: 0x2476, - 6405: 0x2477, - 6406: 0x2478, - 6407: 0x2479, - 6408: 0x247A, - 6409: 0x247B, - 6410: 0x247C, - 6411: 0x247D, - 6412: 0x247E, - 6413: 0x247F, - 6414: 0x2480, - 6415: 0x2481, - 6416: 0x2482, - 6417: 0x2483, - 6418: 0x2484, - 6419: 0x2485, - 6420: 0x2486, - 6421: 0x2487, - 6422: 0x2460, - 6423: 0x2461, - 6424: 0x2462, - 6425: 0x2463, - 6426: 0x2464, - 6427: 0x2465, - 6428: 0x2466, - 6429: 0x2467, - 6430: 0x2468, - 6431: 0x2469, - 6432: 0x20AC, - 6434: 0x3220, - 6435: 0x3221, - 6436: 0x3222, - 6437: 0x3223, - 6438: 0x3224, - 6439: 0x3225, - 6440: 0x3226, - 6441: 0x3227, - 6442: 0x3228, - 6443: 0x3229, - 6446: 0x2160, - 6447: 0x2161, - 6448: 0x2162, - 6449: 0x2163, - 6450: 0x2164, - 6451: 0x2165, - 6452: 0x2166, - 6453: 0x2167, - 6454: 0x2168, - 6455: 0x2169, - 6456: 0x216A, - 6457: 0x216B, - 6555: 0x3000, - 6556: 0xFF01, - 6557: 0xFF02, - 6558: 0xFF03, - 6559: 0xFFE5, - 6560: 0xFF05, - 6561: 0xFF06, - 6562: 0xFF07, - 6563: 0xFF08, - 6564: 0xFF09, - 6565: 0xFF0A, - 6566: 0xFF0B, - 6567: 0xFF0C, - 6568: 0xFF0D, - 6569: 0xFF0E, - 6570: 0xFF0F, - 6571: 0xFF10, - 6572: 0xFF11, - 6573: 0xFF12, - 6574: 0xFF13, - 6575: 0xFF14, - 6576: 0xFF15, - 6577: 0xFF16, - 6578: 0xFF17, - 6579: 0xFF18, - 6580: 0xFF19, - 6581: 0xFF1A, - 6582: 0xFF1B, - 6583: 0xFF1C, - 6584: 0xFF1D, - 6585: 0xFF1E, - 6586: 0xFF1F, - 6587: 0xFF20, - 6588: 0xFF21, - 6589: 0xFF22, - 6590: 0xFF23, - 6591: 0xFF24, - 6592: 0xFF25, - 6593: 0xFF26, - 6594: 0xFF27, - 6595: 0xFF28, - 6596: 0xFF29, - 6597: 0xFF2A, - 6598: 0xFF2B, - 6599: 0xFF2C, - 6600: 0xFF2D, - 6601: 0xFF2E, - 6602: 0xFF2F, - 6603: 0xFF30, - 6604: 0xFF31, - 6605: 0xFF32, - 6606: 0xFF33, - 6607: 0xFF34, - 6608: 0xFF35, - 6609: 0xFF36, - 6610: 0xFF37, - 6611: 0xFF38, - 6612: 0xFF39, - 6613: 0xFF3A, - 6614: 0xFF3B, - 6615: 0xFF3C, - 6616: 0xFF3D, - 6617: 0xFF3E, - 6618: 0xFF3F, - 6619: 0xFF40, - 6620: 0xFF41, - 6621: 0xFF42, - 6622: 0xFF43, - 6623: 0xFF44, - 6624: 0xFF45, - 6625: 0xFF46, - 6626: 0xFF47, - 6627: 0xFF48, - 6628: 0xFF49, - 6629: 0xFF4A, - 6630: 0xFF4B, - 6631: 0xFF4C, - 6632: 0xFF4D, - 6633: 0xFF4E, - 6634: 0xFF4F, - 6635: 0xFF50, - 6636: 0xFF51, - 6637: 0xFF52, - 6638: 0xFF53, - 6639: 0xFF54, - 6640: 0xFF55, - 6641: 0xFF56, - 6642: 0xFF57, - 6643: 0xFF58, - 6644: 0xFF59, - 6645: 0xFF5A, - 6646: 0xFF5B, - 6647: 0xFF5C, - 6648: 0xFF5D, - 6649: 0xFFE3, - 6746: 0x3041, - 6747: 0x3042, - 6748: 0x3043, - 6749: 0x3044, - 6750: 0x3045, - 6751: 0x3046, - 6752: 0x3047, - 6753: 0x3048, - 6754: 0x3049, - 6755: 0x304A, - 6756: 0x304B, - 6757: 0x304C, - 6758: 0x304D, - 6759: 0x304E, - 6760: 0x304F, - 6761: 0x3050, - 6762: 0x3051, - 6763: 0x3052, - 6764: 0x3053, - 6765: 0x3054, - 6766: 0x3055, - 6767: 0x3056, - 6768: 0x3057, - 6769: 0x3058, - 6770: 0x3059, - 6771: 0x305A, - 6772: 0x305B, - 6773: 0x305C, - 6774: 0x305D, - 6775: 0x305E, - 6776: 0x305F, - 6777: 0x3060, - 6778: 0x3061, - 6779: 0x3062, - 6780: 0x3063, - 6781: 0x3064, - 6782: 0x3065, - 6783: 0x3066, - 6784: 0x3067, - 6785: 0x3068, - 6786: 0x3069, - 6787: 0x306A, - 6788: 0x306B, - 6789: 0x306C, - 6790: 0x306D, - 6791: 0x306E, - 6792: 0x306F, - 6793: 0x3070, - 6794: 0x3071, - 6795: 0x3072, - 6796: 0x3073, - 6797: 0x3074, - 6798: 0x3075, - 6799: 0x3076, - 6800: 0x3077, - 6801: 0x3078, - 6802: 0x3079, - 6803: 0x307A, - 6804: 0x307B, - 6805: 0x307C, - 6806: 0x307D, - 6807: 0x307E, - 6808: 0x307F, - 6809: 0x3080, - 6810: 0x3081, - 6811: 0x3082, - 6812: 0x3083, - 6813: 0x3084, - 6814: 0x3085, - 6815: 0x3086, - 6816: 0x3087, - 6817: 0x3088, - 6818: 0x3089, - 6819: 0x308A, - 6820: 0x308B, - 6821: 0x308C, - 6822: 0x308D, - 6823: 0x308E, - 6824: 0x308F, - 6825: 0x3090, - 6826: 0x3091, - 6827: 0x3092, - 6828: 0x3093, - 6936: 0x30A1, - 6937: 0x30A2, - 6938: 0x30A3, - 6939: 0x30A4, - 6940: 0x30A5, - 6941: 0x30A6, - 6942: 0x30A7, - 6943: 0x30A8, - 6944: 0x30A9, - 6945: 0x30AA, - 6946: 0x30AB, - 6947: 0x30AC, - 6948: 0x30AD, - 6949: 0x30AE, - 6950: 0x30AF, - 6951: 0x30B0, - 6952: 0x30B1, - 6953: 0x30B2, - 6954: 0x30B3, - 6955: 0x30B4, - 6956: 0x30B5, - 6957: 0x30B6, - 6958: 0x30B7, - 6959: 0x30B8, - 6960: 0x30B9, - 6961: 0x30BA, - 6962: 0x30BB, - 6963: 0x30BC, - 6964: 0x30BD, - 6965: 0x30BE, - 6966: 0x30BF, - 6967: 0x30C0, - 6968: 0x30C1, - 6969: 0x30C2, - 6970: 0x30C3, - 6971: 0x30C4, - 6972: 0x30C5, - 6973: 0x30C6, - 6974: 0x30C7, - 6975: 0x30C8, - 6976: 0x30C9, - 6977: 0x30CA, - 6978: 0x30CB, - 6979: 0x30CC, - 6980: 0x30CD, - 6981: 0x30CE, - 6982: 0x30CF, - 6983: 0x30D0, - 6984: 0x30D1, - 6985: 0x30D2, - 6986: 0x30D3, - 6987: 0x30D4, - 6988: 0x30D5, - 6989: 0x30D6, - 6990: 0x30D7, - 6991: 0x30D8, - 6992: 0x30D9, - 6993: 0x30DA, - 6994: 0x30DB, - 6995: 0x30DC, - 6996: 0x30DD, - 6997: 0x30DE, - 6998: 0x30DF, - 6999: 0x30E0, - 7000: 0x30E1, - 7001: 0x30E2, - 7002: 0x30E3, - 7003: 0x30E4, - 7004: 0x30E5, - 7005: 0x30E6, - 7006: 0x30E7, - 7007: 0x30E8, - 7008: 0x30E9, - 7009: 0x30EA, - 7010: 0x30EB, - 7011: 0x30EC, - 7012: 0x30ED, - 7013: 0x30EE, - 7014: 0x30EF, - 7015: 0x30F0, - 7016: 0x30F1, - 7017: 0x30F2, - 7018: 0x30F3, - 7019: 0x30F4, - 7020: 0x30F5, - 7021: 0x30F6, - 7126: 0x0391, - 7127: 0x0392, - 7128: 0x0393, - 7129: 0x0394, - 7130: 0x0395, - 7131: 0x0396, - 7132: 0x0397, - 7133: 0x0398, - 7134: 0x0399, - 7135: 0x039A, - 7136: 0x039B, - 7137: 0x039C, - 7138: 0x039D, - 7139: 0x039E, - 7140: 0x039F, - 7141: 0x03A0, - 7142: 0x03A1, - 7143: 0x03A3, - 7144: 0x03A4, - 7145: 0x03A5, - 7146: 0x03A6, - 7147: 0x03A7, - 7148: 0x03A8, - 7149: 0x03A9, - 7158: 0x03B1, - 7159: 0x03B2, - 7160: 0x03B3, - 7161: 0x03B4, - 7162: 0x03B5, - 7163: 0x03B6, - 7164: 0x03B7, - 7165: 0x03B8, - 7166: 0x03B9, - 7167: 0x03BA, - 7168: 0x03BB, - 7169: 0x03BC, - 7170: 0x03BD, - 7171: 0x03BE, - 7172: 0x03BF, - 7173: 0x03C0, - 7174: 0x03C1, - 7175: 0x03C3, - 7176: 0x03C4, - 7177: 0x03C5, - 7178: 0x03C6, - 7179: 0x03C7, - 7180: 0x03C8, - 7181: 0x03C9, - 7189: 0xFE35, - 7190: 0xFE36, - 7191: 0xFE39, - 7192: 0xFE3A, - 7193: 0xFE3F, - 7194: 0xFE40, - 7195: 0xFE3D, - 7196: 0xFE3E, - 7197: 0xFE41, - 7198: 0xFE42, - 7199: 0xFE43, - 7200: 0xFE44, - 7203: 0xFE3B, - 7204: 0xFE3C, - 7205: 0xFE37, - 7206: 0xFE38, - 7207: 0xFE31, - 7209: 0xFE33, - 7210: 0xFE34, - 7316: 0x0410, - 7317: 0x0411, - 7318: 0x0412, - 7319: 0x0413, - 7320: 0x0414, - 7321: 0x0415, - 7322: 0x0401, - 7323: 0x0416, - 7324: 0x0417, - 7325: 0x0418, - 7326: 0x0419, - 7327: 0x041A, - 7328: 0x041B, - 7329: 0x041C, - 7330: 0x041D, - 7331: 0x041E, - 7332: 0x041F, - 7333: 0x0420, - 7334: 0x0421, - 7335: 0x0422, - 7336: 0x0423, - 7337: 0x0424, - 7338: 0x0425, - 7339: 0x0426, - 7340: 0x0427, - 7341: 0x0428, - 7342: 0x0429, - 7343: 0x042A, - 7344: 0x042B, - 7345: 0x042C, - 7346: 0x042D, - 7347: 0x042E, - 7348: 0x042F, - 7364: 0x0430, - 7365: 0x0431, - 7366: 0x0432, - 7367: 0x0433, - 7368: 0x0434, - 7369: 0x0435, - 7370: 0x0451, - 7371: 0x0436, - 7372: 0x0437, - 7373: 0x0438, - 7374: 0x0439, - 7375: 0x043A, - 7376: 0x043B, - 7377: 0x043C, - 7378: 0x043D, - 7379: 0x043E, - 7380: 0x043F, - 7381: 0x0440, - 7382: 0x0441, - 7383: 0x0442, - 7384: 0x0443, - 7385: 0x0444, - 7386: 0x0445, - 7387: 0x0446, - 7388: 0x0447, - 7389: 0x0448, - 7390: 0x0449, - 7391: 0x044A, - 7392: 0x044B, - 7393: 0x044C, - 7394: 0x044D, - 7395: 0x044E, - 7396: 0x044F, - 7410: 0x02CA, - 7411: 0x02CB, - 7412: 0x02D9, - 7413: 0x2013, - 7414: 0x2015, - 7415: 0x2025, - 7416: 0x2035, - 7417: 0x2105, - 7418: 0x2109, - 7419: 0x2196, - 7420: 0x2197, - 7421: 0x2198, - 7422: 0x2199, - 7423: 0x2215, - 7424: 0x221F, - 7425: 0x2223, - 7426: 0x2252, - 7427: 0x2266, - 7428: 0x2267, - 7429: 0x22BF, - 7430: 0x2550, - 7431: 0x2551, - 7432: 0x2552, - 7433: 0x2553, - 7434: 0x2554, - 7435: 0x2555, - 7436: 0x2556, - 7437: 0x2557, - 7438: 0x2558, - 7439: 0x2559, - 7440: 0x255A, - 7441: 0x255B, - 7442: 0x255C, - 7443: 0x255D, - 7444: 0x255E, - 7445: 0x255F, - 7446: 0x2560, - 7447: 0x2561, - 7448: 0x2562, - 7449: 0x2563, - 7450: 0x2564, - 7451: 0x2565, - 7452: 0x2566, - 7453: 0x2567, - 7454: 0x2568, - 7455: 0x2569, - 7456: 0x256A, - 7457: 0x256B, - 7458: 0x256C, - 7459: 0x256D, - 7460: 0x256E, - 7461: 0x256F, - 7462: 0x2570, - 7463: 0x2571, - 7464: 0x2572, - 7465: 0x2573, - 7466: 0x2581, - 7467: 0x2582, - 7468: 0x2583, - 7469: 0x2584, - 7470: 0x2585, - 7471: 0x2586, - 7472: 0x2587, - 7473: 0x2588, - 7474: 0x2589, - 7475: 0x258A, - 7476: 0x258B, - 7477: 0x258C, - 7478: 0x258D, - 7479: 0x258E, - 7480: 0x258F, - 7481: 0x2593, - 7482: 0x2594, - 7483: 0x2595, - 7484: 0x25BC, - 7485: 0x25BD, - 7486: 0x25E2, - 7487: 0x25E3, - 7488: 0x25E4, - 7489: 0x25E5, - 7490: 0x2609, - 7491: 0x2295, - 7492: 0x3012, - 7493: 0x301D, - 7494: 0x301E, - 7506: 0x0101, - 7507: 0x00E1, - 7508: 0x01CE, - 7509: 0x00E0, - 7510: 0x0113, - 7511: 0x00E9, - 7512: 0x011B, - 7513: 0x00E8, - 7514: 0x012B, - 7515: 0x00ED, - 7516: 0x01D0, - 7517: 0x00EC, - 7518: 0x014D, - 7519: 0x00F3, - 7520: 0x01D2, - 7521: 0x00F2, - 7522: 0x016B, - 7523: 0x00FA, - 7524: 0x01D4, - 7525: 0x00F9, - 7526: 0x01D6, - 7527: 0x01D8, - 7528: 0x01DA, - 7529: 0x01DC, - 7530: 0x00FC, - 7531: 0x00EA, - 7532: 0x0251, - 7534: 0x0144, - 7535: 0x0148, - 7536: 0x01F9, - 7537: 0x0261, - 7542: 0x3105, - 7543: 0x3106, - 7544: 0x3107, - 7545: 0x3108, - 7546: 0x3109, - 7547: 0x310A, - 7548: 0x310B, - 7549: 0x310C, - 7550: 0x310D, - 7551: 0x310E, - 7552: 0x310F, - 7553: 0x3110, - 7554: 0x3111, - 7555: 0x3112, - 7556: 0x3113, - 7557: 0x3114, - 7558: 0x3115, - 7559: 0x3116, - 7560: 0x3117, - 7561: 0x3118, - 7562: 0x3119, - 7563: 0x311A, - 7564: 0x311B, - 7565: 0x311C, - 7566: 0x311D, - 7567: 0x311E, - 7568: 0x311F, - 7569: 0x3120, - 7570: 0x3121, - 7571: 0x3122, - 7572: 0x3123, - 7573: 0x3124, - 7574: 0x3125, - 7575: 0x3126, - 7576: 0x3127, - 7577: 0x3128, - 7578: 0x3129, - 7600: 0x3021, - 7601: 0x3022, - 7602: 0x3023, - 7603: 0x3024, - 7604: 0x3025, - 7605: 0x3026, - 7606: 0x3027, - 7607: 0x3028, - 7608: 0x3029, - 7609: 0x32A3, - 7610: 0x338E, - 7611: 0x338F, - 7612: 0x339C, - 7613: 0x339D, - 7614: 0x339E, - 7615: 0x33A1, - 7616: 0x33C4, - 7617: 0x33CE, - 7618: 0x33D1, - 7619: 0x33D2, - 7620: 0x33D5, - 7621: 0xFE30, - 7622: 0xFFE2, - 7623: 0xFFE4, - 7625: 0x2121, - 7626: 0x3231, - 7628: 0x2010, - 7632: 0x30FC, - 7633: 0x309B, - 7634: 0x309C, - 7635: 0x30FD, - 7636: 0x30FE, - 7637: 0x3006, - 7638: 0x309D, - 7639: 0x309E, - 7640: 0xFE49, - 7641: 0xFE4A, - 7642: 0xFE4B, - 7643: 0xFE4C, - 7644: 0xFE4D, - 7645: 0xFE4E, - 7646: 0xFE4F, - 7647: 0xFE50, - 7648: 0xFE51, - 7649: 0xFE52, - 7650: 0xFE54, - 7651: 0xFE55, - 7652: 0xFE56, - 7653: 0xFE57, - 7654: 0xFE59, - 7655: 0xFE5A, - 7656: 0xFE5B, - 7657: 0xFE5C, - 7658: 0xFE5D, - 7659: 0xFE5E, - 7660: 0xFE5F, - 7661: 0xFE60, - 7662: 0xFE61, - 7663: 0xFE62, - 7664: 0xFE63, - 7665: 0xFE64, - 7666: 0xFE65, - 7667: 0xFE66, - 7668: 0xFE68, - 7669: 0xFE69, - 7670: 0xFE6A, - 7671: 0xFE6B, - 7672: 0x303E, - 7673: 0x2FF0, - 7674: 0x2FF1, - 7675: 0x2FF2, - 7676: 0x2FF3, - 7677: 0x2FF4, - 7678: 0x2FF5, - 7679: 0x2FF6, - 7680: 0x2FF7, - 7681: 0x2FF8, - 7682: 0x2FF9, - 7683: 0x2FFA, - 7684: 0x2FFB, - 7685: 0x3007, - 7699: 0x2500, - 7700: 0x2501, - 7701: 0x2502, - 7702: 0x2503, - 7703: 0x2504, - 7704: 0x2505, - 7705: 0x2506, - 7706: 0x2507, - 7707: 0x2508, - 7708: 0x2509, - 7709: 0x250A, - 7710: 0x250B, - 7711: 0x250C, - 7712: 0x250D, - 7713: 0x250E, - 7714: 0x250F, - 7715: 0x2510, - 7716: 0x2511, - 7717: 0x2512, - 7718: 0x2513, - 7719: 0x2514, - 7720: 0x2515, - 7721: 0x2516, - 7722: 0x2517, - 7723: 0x2518, - 7724: 0x2519, - 7725: 0x251A, - 7726: 0x251B, - 7727: 0x251C, - 7728: 0x251D, - 7729: 0x251E, - 7730: 0x251F, - 7731: 0x2520, - 7732: 0x2521, - 7733: 0x2522, - 7734: 0x2523, - 7735: 0x2524, - 7736: 0x2525, - 7737: 0x2526, - 7738: 0x2527, - 7739: 0x2528, - 7740: 0x2529, - 7741: 0x252A, - 7742: 0x252B, - 7743: 0x252C, - 7744: 0x252D, - 7745: 0x252E, - 7746: 0x252F, - 7747: 0x2530, - 7748: 0x2531, - 7749: 0x2532, - 7750: 0x2533, - 7751: 0x2534, - 7752: 0x2535, - 7753: 0x2536, - 7754: 0x2537, - 7755: 0x2538, - 7756: 0x2539, - 7757: 0x253A, - 7758: 0x253B, - 7759: 0x253C, - 7760: 0x253D, - 7761: 0x253E, - 7762: 0x253F, - 7763: 0x2540, - 7764: 0x2541, - 7765: 0x2542, - 7766: 0x2543, - 7767: 0x2544, - 7768: 0x2545, - 7769: 0x2546, - 7770: 0x2547, - 7771: 0x2548, - 7772: 0x2549, - 7773: 0x254A, - 7774: 0x254B, - 7790: 0x72DC, - 7791: 0x72DD, - 7792: 0x72DF, - 7793: 0x72E2, - 7794: 0x72E3, - 7795: 0x72E4, - 7796: 0x72E5, - 7797: 0x72E6, - 7798: 0x72E7, - 7799: 0x72EA, - 7800: 0x72EB, - 7801: 0x72F5, - 7802: 0x72F6, - 7803: 0x72F9, - 7804: 0x72FD, - 7805: 0x72FE, - 7806: 0x72FF, - 7807: 0x7300, - 7808: 0x7302, - 7809: 0x7304, - 7810: 0x7305, - 7811: 0x7306, - 7812: 0x7307, - 7813: 0x7308, - 7814: 0x7309, - 7815: 0x730B, - 7816: 0x730C, - 7817: 0x730D, - 7818: 0x730F, - 7819: 0x7310, - 7820: 0x7311, - 7821: 0x7312, - 7822: 0x7314, - 7823: 0x7318, - 7824: 0x7319, - 7825: 0x731A, - 7826: 0x731F, - 7827: 0x7320, - 7828: 0x7323, - 7829: 0x7324, - 7830: 0x7326, - 7831: 0x7327, - 7832: 0x7328, - 7833: 0x732D, - 7834: 0x732F, - 7835: 0x7330, - 7836: 0x7332, - 7837: 0x7333, - 7838: 0x7335, - 7839: 0x7336, - 7840: 0x733A, - 7841: 0x733B, - 7842: 0x733C, - 7843: 0x733D, - 7844: 0x7340, - 7845: 0x7341, - 7846: 0x7342, - 7847: 0x7343, - 7848: 0x7344, - 7849: 0x7345, - 7850: 0x7346, - 7851: 0x7347, - 7852: 0x7348, - 7853: 0x7349, - 7854: 0x734A, - 7855: 0x734B, - 7856: 0x734C, - 7857: 0x734E, - 7858: 0x734F, - 7859: 0x7351, - 7860: 0x7353, - 7861: 0x7354, - 7862: 0x7355, - 7863: 0x7356, - 7864: 0x7358, - 7865: 0x7359, - 7866: 0x735A, - 7867: 0x735B, - 7868: 0x735C, - 7869: 0x735D, - 7870: 0x735E, - 7871: 0x735F, - 7872: 0x7361, - 7873: 0x7362, - 7874: 0x7363, - 7875: 0x7364, - 7876: 0x7365, - 7877: 0x7366, - 7878: 0x7367, - 7879: 0x7368, - 7880: 0x7369, - 7881: 0x736A, - 7882: 0x736B, - 7883: 0x736E, - 7884: 0x7370, - 7885: 0x7371, - 7980: 0x7372, - 7981: 0x7373, - 7982: 0x7374, - 7983: 0x7375, - 7984: 0x7376, - 7985: 0x7377, - 7986: 0x7378, - 7987: 0x7379, - 7988: 0x737A, - 7989: 0x737B, - 7990: 0x737C, - 7991: 0x737D, - 7992: 0x737F, - 7993: 0x7380, - 7994: 0x7381, - 7995: 0x7382, - 7996: 0x7383, - 7997: 0x7385, - 7998: 0x7386, - 7999: 0x7388, - 8000: 0x738A, - 8001: 0x738C, - 8002: 0x738D, - 8003: 0x738F, - 8004: 0x7390, - 8005: 0x7392, - 8006: 0x7393, - 8007: 0x7394, - 8008: 0x7395, - 8009: 0x7397, - 8010: 0x7398, - 8011: 0x7399, - 8012: 0x739A, - 8013: 0x739C, - 8014: 0x739D, - 8015: 0x739E, - 8016: 0x73A0, - 8017: 0x73A1, - 8018: 0x73A3, - 8019: 0x73A4, - 8020: 0x73A5, - 8021: 0x73A6, - 8022: 0x73A7, - 8023: 0x73A8, - 8024: 0x73AA, - 8025: 0x73AC, - 8026: 0x73AD, - 8027: 0x73B1, - 8028: 0x73B4, - 8029: 0x73B5, - 8030: 0x73B6, - 8031: 0x73B8, - 8032: 0x73B9, - 8033: 0x73BC, - 8034: 0x73BD, - 8035: 0x73BE, - 8036: 0x73BF, - 8037: 0x73C1, - 8038: 0x73C3, - 8039: 0x73C4, - 8040: 0x73C5, - 8041: 0x73C6, - 8042: 0x73C7, - 8043: 0x73CB, - 8044: 0x73CC, - 8045: 0x73CE, - 8046: 0x73D2, - 8047: 0x73D3, - 8048: 0x73D4, - 8049: 0x73D5, - 8050: 0x73D6, - 8051: 0x73D7, - 8052: 0x73D8, - 8053: 0x73DA, - 8054: 0x73DB, - 8055: 0x73DC, - 8056: 0x73DD, - 8057: 0x73DF, - 8058: 0x73E1, - 8059: 0x73E2, - 8060: 0x73E3, - 8061: 0x73E4, - 8062: 0x73E6, - 8063: 0x73E8, - 8064: 0x73EA, - 8065: 0x73EB, - 8066: 0x73EC, - 8067: 0x73EE, - 8068: 0x73EF, - 8069: 0x73F0, - 8070: 0x73F1, - 8071: 0x73F3, - 8072: 0x73F4, - 8073: 0x73F5, - 8074: 0x73F6, - 8075: 0x73F7, - 8170: 0x73F8, - 8171: 0x73F9, - 8172: 0x73FA, - 8173: 0x73FB, - 8174: 0x73FC, - 8175: 0x73FD, - 8176: 0x73FE, - 8177: 0x73FF, - 8178: 0x7400, - 8179: 0x7401, - 8180: 0x7402, - 8181: 0x7404, - 8182: 0x7407, - 8183: 0x7408, - 8184: 0x740B, - 8185: 0x740C, - 8186: 0x740D, - 8187: 0x740E, - 8188: 0x7411, - 8189: 0x7412, - 8190: 0x7413, - 8191: 0x7414, - 8192: 0x7415, - 8193: 0x7416, - 8194: 0x7417, - 8195: 0x7418, - 8196: 0x7419, - 8197: 0x741C, - 8198: 0x741D, - 8199: 0x741E, - 8200: 0x741F, - 8201: 0x7420, - 8202: 0x7421, - 8203: 0x7423, - 8204: 0x7424, - 8205: 0x7427, - 8206: 0x7429, - 8207: 0x742B, - 8208: 0x742D, - 8209: 0x742F, - 8210: 0x7431, - 8211: 0x7432, - 8212: 0x7437, - 8213: 0x7438, - 8214: 0x7439, - 8215: 0x743A, - 8216: 0x743B, - 8217: 0x743D, - 8218: 0x743E, - 8219: 0x743F, - 8220: 0x7440, - 8221: 0x7442, - 8222: 0x7443, - 8223: 0x7444, - 8224: 0x7445, - 8225: 0x7446, - 8226: 0x7447, - 8227: 0x7448, - 8228: 0x7449, - 8229: 0x744A, - 8230: 0x744B, - 8231: 0x744C, - 8232: 0x744D, - 8233: 0x744E, - 8234: 0x744F, - 8235: 0x7450, - 8236: 0x7451, - 8237: 0x7452, - 8238: 0x7453, - 8239: 0x7454, - 8240: 0x7456, - 8241: 0x7458, - 8242: 0x745D, - 8243: 0x7460, - 8244: 0x7461, - 8245: 0x7462, - 8246: 0x7463, - 8247: 0x7464, - 8248: 0x7465, - 8249: 0x7466, - 8250: 0x7467, - 8251: 0x7468, - 8252: 0x7469, - 8253: 0x746A, - 8254: 0x746B, - 8255: 0x746C, - 8256: 0x746E, - 8257: 0x746F, - 8258: 0x7471, - 8259: 0x7472, - 8260: 0x7473, - 8261: 0x7474, - 8262: 0x7475, - 8263: 0x7478, - 8264: 0x7479, - 8265: 0x747A, - 8360: 0x747B, - 8361: 0x747C, - 8362: 0x747D, - 8363: 0x747F, - 8364: 0x7482, - 8365: 0x7484, - 8366: 0x7485, - 8367: 0x7486, - 8368: 0x7488, - 8369: 0x7489, - 8370: 0x748A, - 8371: 0x748C, - 8372: 0x748D, - 8373: 0x748F, - 8374: 0x7491, - 8375: 0x7492, - 8376: 0x7493, - 8377: 0x7494, - 8378: 0x7495, - 8379: 0x7496, - 8380: 0x7497, - 8381: 0x7498, - 8382: 0x7499, - 8383: 0x749A, - 8384: 0x749B, - 8385: 0x749D, - 8386: 0x749F, - 8387: 0x74A0, - 8388: 0x74A1, - 8389: 0x74A2, - 8390: 0x74A3, - 8391: 0x74A4, - 8392: 0x74A5, - 8393: 0x74A6, - 8394: 0x74AA, - 8395: 0x74AB, - 8396: 0x74AC, - 8397: 0x74AD, - 8398: 0x74AE, - 8399: 0x74AF, - 8400: 0x74B0, - 8401: 0x74B1, - 8402: 0x74B2, - 8403: 0x74B3, - 8404: 0x74B4, - 8405: 0x74B5, - 8406: 0x74B6, - 8407: 0x74B7, - 8408: 0x74B8, - 8409: 0x74B9, - 8410: 0x74BB, - 8411: 0x74BC, - 8412: 0x74BD, - 8413: 0x74BE, - 8414: 0x74BF, - 8415: 0x74C0, - 8416: 0x74C1, - 8417: 0x74C2, - 8418: 0x74C3, - 8419: 0x74C4, - 8420: 0x74C5, - 8421: 0x74C6, - 8422: 0x74C7, - 8423: 0x74C8, - 8424: 0x74C9, - 8425: 0x74CA, - 8426: 0x74CB, - 8427: 0x74CC, - 8428: 0x74CD, - 8429: 0x74CE, - 8430: 0x74CF, - 8431: 0x74D0, - 8432: 0x74D1, - 8433: 0x74D3, - 8434: 0x74D4, - 8435: 0x74D5, - 8436: 0x74D6, - 8437: 0x74D7, - 8438: 0x74D8, - 8439: 0x74D9, - 8440: 0x74DA, - 8441: 0x74DB, - 8442: 0x74DD, - 8443: 0x74DF, - 8444: 0x74E1, - 8445: 0x74E5, - 8446: 0x74E7, - 8447: 0x74E8, - 8448: 0x74E9, - 8449: 0x74EA, - 8450: 0x74EB, - 8451: 0x74EC, - 8452: 0x74ED, - 8453: 0x74F0, - 8454: 0x74F1, - 8455: 0x74F2, - 8550: 0x74F3, - 8551: 0x74F5, - 8552: 0x74F8, - 8553: 0x74F9, - 8554: 0x74FA, - 8555: 0x74FB, - 8556: 0x74FC, - 8557: 0x74FD, - 8558: 0x74FE, - 8559: 0x7500, - 8560: 0x7501, - 8561: 0x7502, - 8562: 0x7503, - 8563: 0x7505, - 8564: 0x7506, - 8565: 0x7507, - 8566: 0x7508, - 8567: 0x7509, - 8568: 0x750A, - 8569: 0x750B, - 8570: 0x750C, - 8571: 0x750E, - 8572: 0x7510, - 8573: 0x7512, - 8574: 0x7514, - 8575: 0x7515, - 8576: 0x7516, - 8577: 0x7517, - 8578: 0x751B, - 8579: 0x751D, - 8580: 0x751E, - 8581: 0x7520, - 8582: 0x7521, - 8583: 0x7522, - 8584: 0x7523, - 8585: 0x7524, - 8586: 0x7526, - 8587: 0x7527, - 8588: 0x752A, - 8589: 0x752E, - 8590: 0x7534, - 8591: 0x7536, - 8592: 0x7539, - 8593: 0x753C, - 8594: 0x753D, - 8595: 0x753F, - 8596: 0x7541, - 8597: 0x7542, - 8598: 0x7543, - 8599: 0x7544, - 8600: 0x7546, - 8601: 0x7547, - 8602: 0x7549, - 8603: 0x754A, - 8604: 0x754D, - 8605: 0x7550, - 8606: 0x7551, - 8607: 0x7552, - 8608: 0x7553, - 8609: 0x7555, - 8610: 0x7556, - 8611: 0x7557, - 8612: 0x7558, - 8613: 0x755D, - 8614: 0x755E, - 8615: 0x755F, - 8616: 0x7560, - 8617: 0x7561, - 8618: 0x7562, - 8619: 0x7563, - 8620: 0x7564, - 8621: 0x7567, - 8622: 0x7568, - 8623: 0x7569, - 8624: 0x756B, - 8625: 0x756C, - 8626: 0x756D, - 8627: 0x756E, - 8628: 0x756F, - 8629: 0x7570, - 8630: 0x7571, - 8631: 0x7573, - 8632: 0x7575, - 8633: 0x7576, - 8634: 0x7577, - 8635: 0x757A, - 8636: 0x757B, - 8637: 0x757C, - 8638: 0x757D, - 8639: 0x757E, - 8640: 0x7580, - 8641: 0x7581, - 8642: 0x7582, - 8643: 0x7584, - 8644: 0x7585, - 8645: 0x7587, - 8740: 0x7588, - 8741: 0x7589, - 8742: 0x758A, - 8743: 0x758C, - 8744: 0x758D, - 8745: 0x758E, - 8746: 0x7590, - 8747: 0x7593, - 8748: 0x7595, - 8749: 0x7598, - 8750: 0x759B, - 8751: 0x759C, - 8752: 0x759E, - 8753: 0x75A2, - 8754: 0x75A6, - 8755: 0x75A7, - 8756: 0x75A8, - 8757: 0x75A9, - 8758: 0x75AA, - 8759: 0x75AD, - 8760: 0x75B6, - 8761: 0x75B7, - 8762: 0x75BA, - 8763: 0x75BB, - 8764: 0x75BF, - 8765: 0x75C0, - 8766: 0x75C1, - 8767: 0x75C6, - 8768: 0x75CB, - 8769: 0x75CC, - 8770: 0x75CE, - 8771: 0x75CF, - 8772: 0x75D0, - 8773: 0x75D1, - 8774: 0x75D3, - 8775: 0x75D7, - 8776: 0x75D9, - 8777: 0x75DA, - 8778: 0x75DC, - 8779: 0x75DD, - 8780: 0x75DF, - 8781: 0x75E0, - 8782: 0x75E1, - 8783: 0x75E5, - 8784: 0x75E9, - 8785: 0x75EC, - 8786: 0x75ED, - 8787: 0x75EE, - 8788: 0x75EF, - 8789: 0x75F2, - 8790: 0x75F3, - 8791: 0x75F5, - 8792: 0x75F6, - 8793: 0x75F7, - 8794: 0x75F8, - 8795: 0x75FA, - 8796: 0x75FB, - 8797: 0x75FD, - 8798: 0x75FE, - 8799: 0x7602, - 8800: 0x7604, - 8801: 0x7606, - 8802: 0x7607, - 8803: 0x7608, - 8804: 0x7609, - 8805: 0x760B, - 8806: 0x760D, - 8807: 0x760E, - 8808: 0x760F, - 8809: 0x7611, - 8810: 0x7612, - 8811: 0x7613, - 8812: 0x7614, - 8813: 0x7616, - 8814: 0x761A, - 8815: 0x761C, - 8816: 0x761D, - 8817: 0x761E, - 8818: 0x7621, - 8819: 0x7623, - 8820: 0x7627, - 8821: 0x7628, - 8822: 0x762C, - 8823: 0x762E, - 8824: 0x762F, - 8825: 0x7631, - 8826: 0x7632, - 8827: 0x7636, - 8828: 0x7637, - 8829: 0x7639, - 8830: 0x763A, - 8831: 0x763B, - 8832: 0x763D, - 8833: 0x7641, - 8834: 0x7642, - 8835: 0x7644, - 8930: 0x7645, - 8931: 0x7646, - 8932: 0x7647, - 8933: 0x7648, - 8934: 0x7649, - 8935: 0x764A, - 8936: 0x764B, - 8937: 0x764E, - 8938: 0x764F, - 8939: 0x7650, - 8940: 0x7651, - 8941: 0x7652, - 8942: 0x7653, - 8943: 0x7655, - 8944: 0x7657, - 8945: 0x7658, - 8946: 0x7659, - 8947: 0x765A, - 8948: 0x765B, - 8949: 0x765D, - 8950: 0x765F, - 8951: 0x7660, - 8952: 0x7661, - 8953: 0x7662, - 8954: 0x7664, - 8955: 0x7665, - 8956: 0x7666, - 8957: 0x7667, - 8958: 0x7668, - 8959: 0x7669, - 8960: 0x766A, - 8961: 0x766C, - 8962: 0x766D, - 8963: 0x766E, - 8964: 0x7670, - 8965: 0x7671, - 8966: 0x7672, - 8967: 0x7673, - 8968: 0x7674, - 8969: 0x7675, - 8970: 0x7676, - 8971: 0x7677, - 8972: 0x7679, - 8973: 0x767A, - 8974: 0x767C, - 8975: 0x767F, - 8976: 0x7680, - 8977: 0x7681, - 8978: 0x7683, - 8979: 0x7685, - 8980: 0x7689, - 8981: 0x768A, - 8982: 0x768C, - 8983: 0x768D, - 8984: 0x768F, - 8985: 0x7690, - 8986: 0x7692, - 8987: 0x7694, - 8988: 0x7695, - 8989: 0x7697, - 8990: 0x7698, - 8991: 0x769A, - 8992: 0x769B, - 8993: 0x769C, - 8994: 0x769D, - 8995: 0x769E, - 8996: 0x769F, - 8997: 0x76A0, - 8998: 0x76A1, - 8999: 0x76A2, - 9000: 0x76A3, - 9001: 0x76A5, - 9002: 0x76A6, - 9003: 0x76A7, - 9004: 0x76A8, - 9005: 0x76A9, - 9006: 0x76AA, - 9007: 0x76AB, - 9008: 0x76AC, - 9009: 0x76AD, - 9010: 0x76AF, - 9011: 0x76B0, - 9012: 0x76B3, - 9013: 0x76B5, - 9014: 0x76B6, - 9015: 0x76B7, - 9016: 0x76B8, - 9017: 0x76B9, - 9018: 0x76BA, - 9019: 0x76BB, - 9020: 0x76BC, - 9021: 0x76BD, - 9022: 0x76BE, - 9023: 0x76C0, - 9024: 0x76C1, - 9025: 0x76C3, - 9026: 0x554A, - 9027: 0x963F, - 9028: 0x57C3, - 9029: 0x6328, - 9030: 0x54CE, - 9031: 0x5509, - 9032: 0x54C0, - 9033: 0x7691, - 9034: 0x764C, - 9035: 0x853C, - 9036: 0x77EE, - 9037: 0x827E, - 9038: 0x788D, - 9039: 0x7231, - 9040: 0x9698, - 9041: 0x978D, - 9042: 0x6C28, - 9043: 0x5B89, - 9044: 0x4FFA, - 9045: 0x6309, - 9046: 0x6697, - 9047: 0x5CB8, - 9048: 0x80FA, - 9049: 0x6848, - 9050: 0x80AE, - 9051: 0x6602, - 9052: 0x76CE, - 9053: 0x51F9, - 9054: 0x6556, - 9055: 0x71AC, - 9056: 0x7FF1, - 9057: 0x8884, - 9058: 0x50B2, - 9059: 0x5965, - 9060: 0x61CA, - 9061: 0x6FB3, - 9062: 0x82AD, - 9063: 0x634C, - 9064: 0x6252, - 9065: 0x53ED, - 9066: 0x5427, - 9067: 0x7B06, - 9068: 0x516B, - 9069: 0x75A4, - 9070: 0x5DF4, - 9071: 0x62D4, - 9072: 0x8DCB, - 9073: 0x9776, - 9074: 0x628A, - 9075: 0x8019, - 9076: 0x575D, - 9077: 0x9738, - 9078: 0x7F62, - 9079: 0x7238, - 9080: 0x767D, - 9081: 0x67CF, - 9082: 0x767E, - 9083: 0x6446, - 9084: 0x4F70, - 9085: 0x8D25, - 9086: 0x62DC, - 9087: 0x7A17, - 9088: 0x6591, - 9089: 0x73ED, - 9090: 0x642C, - 9091: 0x6273, - 9092: 0x822C, - 9093: 0x9881, - 9094: 0x677F, - 9095: 0x7248, - 9096: 0x626E, - 9097: 0x62CC, - 9098: 0x4F34, - 9099: 0x74E3, - 9100: 0x534A, - 9101: 0x529E, - 9102: 0x7ECA, - 9103: 0x90A6, - 9104: 0x5E2E, - 9105: 0x6886, - 9106: 0x699C, - 9107: 0x8180, - 9108: 0x7ED1, - 9109: 0x68D2, - 9110: 0x78C5, - 9111: 0x868C, - 9112: 0x9551, - 9113: 0x508D, - 9114: 0x8C24, - 9115: 0x82DE, - 9116: 0x80DE, - 9117: 0x5305, - 9118: 0x8912, - 9119: 0x5265, - 9120: 0x76C4, - 9121: 0x76C7, - 9122: 0x76C9, - 9123: 0x76CB, - 9124: 0x76CC, - 9125: 0x76D3, - 9126: 0x76D5, - 9127: 0x76D9, - 9128: 0x76DA, - 9129: 0x76DC, - 9130: 0x76DD, - 9131: 0x76DE, - 9132: 0x76E0, - 9133: 0x76E1, - 9134: 0x76E2, - 9135: 0x76E3, - 9136: 0x76E4, - 9137: 0x76E6, - 9138: 0x76E7, - 9139: 0x76E8, - 9140: 0x76E9, - 9141: 0x76EA, - 9142: 0x76EB, - 9143: 0x76EC, - 9144: 0x76ED, - 9145: 0x76F0, - 9146: 0x76F3, - 9147: 0x76F5, - 9148: 0x76F6, - 9149: 0x76F7, - 9150: 0x76FA, - 9151: 0x76FB, - 9152: 0x76FD, - 9153: 0x76FF, - 9154: 0x7700, - 9155: 0x7702, - 9156: 0x7703, - 9157: 0x7705, - 9158: 0x7706, - 9159: 0x770A, - 9160: 0x770C, - 9161: 0x770E, - 9162: 0x770F, - 9163: 0x7710, - 9164: 0x7711, - 9165: 0x7712, - 9166: 0x7713, - 9167: 0x7714, - 9168: 0x7715, - 9169: 0x7716, - 9170: 0x7717, - 9171: 0x7718, - 9172: 0x771B, - 9173: 0x771C, - 9174: 0x771D, - 9175: 0x771E, - 9176: 0x7721, - 9177: 0x7723, - 9178: 0x7724, - 9179: 0x7725, - 9180: 0x7727, - 9181: 0x772A, - 9182: 0x772B, - 9183: 0x772C, - 9184: 0x772E, - 9185: 0x7730, - 9186: 0x7731, - 9187: 0x7732, - 9188: 0x7733, - 9189: 0x7734, - 9190: 0x7739, - 9191: 0x773B, - 9192: 0x773D, - 9193: 0x773E, - 9194: 0x773F, - 9195: 0x7742, - 9196: 0x7744, - 9197: 0x7745, - 9198: 0x7746, - 9199: 0x7748, - 9200: 0x7749, - 9201: 0x774A, - 9202: 0x774B, - 9203: 0x774C, - 9204: 0x774D, - 9205: 0x774E, - 9206: 0x774F, - 9207: 0x7752, - 9208: 0x7753, - 9209: 0x7754, - 9210: 0x7755, - 9211: 0x7756, - 9212: 0x7757, - 9213: 0x7758, - 9214: 0x7759, - 9215: 0x775C, - 9216: 0x8584, - 9217: 0x96F9, - 9218: 0x4FDD, - 9219: 0x5821, - 9220: 0x9971, - 9221: 0x5B9D, - 9222: 0x62B1, - 9223: 0x62A5, - 9224: 0x66B4, - 9225: 0x8C79, - 9226: 0x9C8D, - 9227: 0x7206, - 9228: 0x676F, - 9229: 0x7891, - 9230: 0x60B2, - 9231: 0x5351, - 9232: 0x5317, - 9233: 0x8F88, - 9234: 0x80CC, - 9235: 0x8D1D, - 9236: 0x94A1, - 9237: 0x500D, - 9238: 0x72C8, - 9239: 0x5907, - 9240: 0x60EB, - 9241: 0x7119, - 9242: 0x88AB, - 9243: 0x5954, - 9244: 0x82EF, - 9245: 0x672C, - 9246: 0x7B28, - 9247: 0x5D29, - 9248: 0x7EF7, - 9249: 0x752D, - 9250: 0x6CF5, - 9251: 0x8E66, - 9252: 0x8FF8, - 9253: 0x903C, - 9254: 0x9F3B, - 9255: 0x6BD4, - 9256: 0x9119, - 9257: 0x7B14, - 9258: 0x5F7C, - 9259: 0x78A7, - 9260: 0x84D6, - 9261: 0x853D, - 9262: 0x6BD5, - 9263: 0x6BD9, - 9264: 0x6BD6, - 9265: 0x5E01, - 9266: 0x5E87, - 9267: 0x75F9, - 9268: 0x95ED, - 9269: 0x655D, - 9270: 0x5F0A, - 9271: 0x5FC5, - 9272: 0x8F9F, - 9273: 0x58C1, - 9274: 0x81C2, - 9275: 0x907F, - 9276: 0x965B, - 9277: 0x97AD, - 9278: 0x8FB9, - 9279: 0x7F16, - 9280: 0x8D2C, - 9281: 0x6241, - 9282: 0x4FBF, - 9283: 0x53D8, - 9284: 0x535E, - 9285: 0x8FA8, - 9286: 0x8FA9, - 9287: 0x8FAB, - 9288: 0x904D, - 9289: 0x6807, - 9290: 0x5F6A, - 9291: 0x8198, - 9292: 0x8868, - 9293: 0x9CD6, - 9294: 0x618B, - 9295: 0x522B, - 9296: 0x762A, - 9297: 0x5F6C, - 9298: 0x658C, - 9299: 0x6FD2, - 9300: 0x6EE8, - 9301: 0x5BBE, - 9302: 0x6448, - 9303: 0x5175, - 9304: 0x51B0, - 9305: 0x67C4, - 9306: 0x4E19, - 9307: 0x79C9, - 9308: 0x997C, - 9309: 0x70B3, - 9310: 0x775D, - 9311: 0x775E, - 9312: 0x775F, - 9313: 0x7760, - 9314: 0x7764, - 9315: 0x7767, - 9316: 0x7769, - 9317: 0x776A, - 9318: 0x776D, - 9319: 0x776E, - 9320: 0x776F, - 9321: 0x7770, - 9322: 0x7771, - 9323: 0x7772, - 9324: 0x7773, - 9325: 0x7774, - 9326: 0x7775, - 9327: 0x7776, - 9328: 0x7777, - 9329: 0x7778, - 9330: 0x777A, - 9331: 0x777B, - 9332: 0x777C, - 9333: 0x7781, - 9334: 0x7782, - 9335: 0x7783, - 9336: 0x7786, - 9337: 0x7787, - 9338: 0x7788, - 9339: 0x7789, - 9340: 0x778A, - 9341: 0x778B, - 9342: 0x778F, - 9343: 0x7790, - 9344: 0x7793, - 9345: 0x7794, - 9346: 0x7795, - 9347: 0x7796, - 9348: 0x7797, - 9349: 0x7798, - 9350: 0x7799, - 9351: 0x779A, - 9352: 0x779B, - 9353: 0x779C, - 9354: 0x779D, - 9355: 0x779E, - 9356: 0x77A1, - 9357: 0x77A3, - 9358: 0x77A4, - 9359: 0x77A6, - 9360: 0x77A8, - 9361: 0x77AB, - 9362: 0x77AD, - 9363: 0x77AE, - 9364: 0x77AF, - 9365: 0x77B1, - 9366: 0x77B2, - 9367: 0x77B4, - 9368: 0x77B6, - 9369: 0x77B7, - 9370: 0x77B8, - 9371: 0x77B9, - 9372: 0x77BA, - 9373: 0x77BC, - 9374: 0x77BE, - 9375: 0x77C0, - 9376: 0x77C1, - 9377: 0x77C2, - 9378: 0x77C3, - 9379: 0x77C4, - 9380: 0x77C5, - 9381: 0x77C6, - 9382: 0x77C7, - 9383: 0x77C8, - 9384: 0x77C9, - 9385: 0x77CA, - 9386: 0x77CB, - 9387: 0x77CC, - 9388: 0x77CE, - 9389: 0x77CF, - 9390: 0x77D0, - 9391: 0x77D1, - 9392: 0x77D2, - 9393: 0x77D3, - 9394: 0x77D4, - 9395: 0x77D5, - 9396: 0x77D6, - 9397: 0x77D8, - 9398: 0x77D9, - 9399: 0x77DA, - 9400: 0x77DD, - 9401: 0x77DE, - 9402: 0x77DF, - 9403: 0x77E0, - 9404: 0x77E1, - 9405: 0x77E4, - 9406: 0x75C5, - 9407: 0x5E76, - 9408: 0x73BB, - 9409: 0x83E0, - 9410: 0x64AD, - 9411: 0x62E8, - 9412: 0x94B5, - 9413: 0x6CE2, - 9414: 0x535A, - 9415: 0x52C3, - 9416: 0x640F, - 9417: 0x94C2, - 9418: 0x7B94, - 9419: 0x4F2F, - 9420: 0x5E1B, - 9421: 0x8236, - 9422: 0x8116, - 9423: 0x818A, - 9424: 0x6E24, - 9425: 0x6CCA, - 9426: 0x9A73, - 9427: 0x6355, - 9428: 0x535C, - 9429: 0x54FA, - 9430: 0x8865, - 9431: 0x57E0, - 9432: 0x4E0D, - 9433: 0x5E03, - 9434: 0x6B65, - 9435: 0x7C3F, - 9436: 0x90E8, - 9437: 0x6016, - 9438: 0x64E6, - 9439: 0x731C, - 9440: 0x88C1, - 9441: 0x6750, - 9442: 0x624D, - 9443: 0x8D22, - 9444: 0x776C, - 9445: 0x8E29, - 9446: 0x91C7, - 9447: 0x5F69, - 9448: 0x83DC, - 9449: 0x8521, - 9450: 0x9910, - 9451: 0x53C2, - 9452: 0x8695, - 9453: 0x6B8B, - 9454: 0x60ED, - 9455: 0x60E8, - 9456: 0x707F, - 9457: 0x82CD, - 9458: 0x8231, - 9459: 0x4ED3, - 9460: 0x6CA7, - 9461: 0x85CF, - 9462: 0x64CD, - 9463: 0x7CD9, - 9464: 0x69FD, - 9465: 0x66F9, - 9466: 0x8349, - 9467: 0x5395, - 9468: 0x7B56, - 9469: 0x4FA7, - 9470: 0x518C, - 9471: 0x6D4B, - 9472: 0x5C42, - 9473: 0x8E6D, - 9474: 0x63D2, - 9475: 0x53C9, - 9476: 0x832C, - 9477: 0x8336, - 9478: 0x67E5, - 9479: 0x78B4, - 9480: 0x643D, - 9481: 0x5BDF, - 9482: 0x5C94, - 9483: 0x5DEE, - 9484: 0x8BE7, - 9485: 0x62C6, - 9486: 0x67F4, - 9487: 0x8C7A, - 9488: 0x6400, - 9489: 0x63BA, - 9490: 0x8749, - 9491: 0x998B, - 9492: 0x8C17, - 9493: 0x7F20, - 9494: 0x94F2, - 9495: 0x4EA7, - 9496: 0x9610, - 9497: 0x98A4, - 9498: 0x660C, - 9499: 0x7316, - 9500: 0x77E6, - 9501: 0x77E8, - 9502: 0x77EA, - 9503: 0x77EF, - 9504: 0x77F0, - 9505: 0x77F1, - 9506: 0x77F2, - 9507: 0x77F4, - 9508: 0x77F5, - 9509: 0x77F7, - 9510: 0x77F9, - 9511: 0x77FA, - 9512: 0x77FB, - 9513: 0x77FC, - 9514: 0x7803, - 9515: 0x7804, - 9516: 0x7805, - 9517: 0x7806, - 9518: 0x7807, - 9519: 0x7808, - 9520: 0x780A, - 9521: 0x780B, - 9522: 0x780E, - 9523: 0x780F, - 9524: 0x7810, - 9525: 0x7813, - 9526: 0x7815, - 9527: 0x7819, - 9528: 0x781B, - 9529: 0x781E, - 9530: 0x7820, - 9531: 0x7821, - 9532: 0x7822, - 9533: 0x7824, - 9534: 0x7828, - 9535: 0x782A, - 9536: 0x782B, - 9537: 0x782E, - 9538: 0x782F, - 9539: 0x7831, - 9540: 0x7832, - 9541: 0x7833, - 9542: 0x7835, - 9543: 0x7836, - 9544: 0x783D, - 9545: 0x783F, - 9546: 0x7841, - 9547: 0x7842, - 9548: 0x7843, - 9549: 0x7844, - 9550: 0x7846, - 9551: 0x7848, - 9552: 0x7849, - 9553: 0x784A, - 9554: 0x784B, - 9555: 0x784D, - 9556: 0x784F, - 9557: 0x7851, - 9558: 0x7853, - 9559: 0x7854, - 9560: 0x7858, - 9561: 0x7859, - 9562: 0x785A, - 9563: 0x785B, - 9564: 0x785C, - 9565: 0x785E, - 9566: 0x785F, - 9567: 0x7860, - 9568: 0x7861, - 9569: 0x7862, - 9570: 0x7863, - 9571: 0x7864, - 9572: 0x7865, - 9573: 0x7866, - 9574: 0x7867, - 9575: 0x7868, - 9576: 0x7869, - 9577: 0x786F, - 9578: 0x7870, - 9579: 0x7871, - 9580: 0x7872, - 9581: 0x7873, - 9582: 0x7874, - 9583: 0x7875, - 9584: 0x7876, - 9585: 0x7878, - 9586: 0x7879, - 9587: 0x787A, - 9588: 0x787B, - 9589: 0x787D, - 9590: 0x787E, - 9591: 0x787F, - 9592: 0x7880, - 9593: 0x7881, - 9594: 0x7882, - 9595: 0x7883, - 9596: 0x573A, - 9597: 0x5C1D, - 9598: 0x5E38, - 9599: 0x957F, - 9600: 0x507F, - 9601: 0x80A0, - 9602: 0x5382, - 9603: 0x655E, - 9604: 0x7545, - 9605: 0x5531, - 9606: 0x5021, - 9607: 0x8D85, - 9608: 0x6284, - 9609: 0x949E, - 9610: 0x671D, - 9611: 0x5632, - 9612: 0x6F6E, - 9613: 0x5DE2, - 9614: 0x5435, - 9615: 0x7092, - 9616: 0x8F66, - 9617: 0x626F, - 9618: 0x64A4, - 9619: 0x63A3, - 9620: 0x5F7B, - 9621: 0x6F88, - 9622: 0x90F4, - 9623: 0x81E3, - 9624: 0x8FB0, - 9625: 0x5C18, - 9626: 0x6668, - 9627: 0x5FF1, - 9628: 0x6C89, - 9629: 0x9648, - 9630: 0x8D81, - 9631: 0x886C, - 9632: 0x6491, - 9633: 0x79F0, - 9634: 0x57CE, - 9635: 0x6A59, - 9636: 0x6210, - 9637: 0x5448, - 9638: 0x4E58, - 9639: 0x7A0B, - 9640: 0x60E9, - 9641: 0x6F84, - 9642: 0x8BDA, - 9643: 0x627F, - 9644: 0x901E, - 9645: 0x9A8B, - 9646: 0x79E4, - 9647: 0x5403, - 9648: 0x75F4, - 9649: 0x6301, - 9650: 0x5319, - 9651: 0x6C60, - 9652: 0x8FDF, - 9653: 0x5F1B, - 9654: 0x9A70, - 9655: 0x803B, - 9656: 0x9F7F, - 9657: 0x4F88, - 9658: 0x5C3A, - 9659: 0x8D64, - 9660: 0x7FC5, - 9661: 0x65A5, - 9662: 0x70BD, - 9663: 0x5145, - 9664: 0x51B2, - 9665: 0x866B, - 9666: 0x5D07, - 9667: 0x5BA0, - 9668: 0x62BD, - 9669: 0x916C, - 9670: 0x7574, - 9671: 0x8E0C, - 9672: 0x7A20, - 9673: 0x6101, - 9674: 0x7B79, - 9675: 0x4EC7, - 9676: 0x7EF8, - 9677: 0x7785, - 9678: 0x4E11, - 9679: 0x81ED, - 9680: 0x521D, - 9681: 0x51FA, - 9682: 0x6A71, - 9683: 0x53A8, - 9684: 0x8E87, - 9685: 0x9504, - 9686: 0x96CF, - 9687: 0x6EC1, - 9688: 0x9664, - 9689: 0x695A, - 9690: 0x7884, - 9691: 0x7885, - 9692: 0x7886, - 9693: 0x7888, - 9694: 0x788A, - 9695: 0x788B, - 9696: 0x788F, - 9697: 0x7890, - 9698: 0x7892, - 9699: 0x7894, - 9700: 0x7895, - 9701: 0x7896, - 9702: 0x7899, - 9703: 0x789D, - 9704: 0x789E, - 9705: 0x78A0, - 9706: 0x78A2, - 9707: 0x78A4, - 9708: 0x78A6, - 9709: 0x78A8, - 9710: 0x78A9, - 9711: 0x78AA, - 9712: 0x78AB, - 9713: 0x78AC, - 9714: 0x78AD, - 9715: 0x78AE, - 9716: 0x78AF, - 9717: 0x78B5, - 9718: 0x78B6, - 9719: 0x78B7, - 9720: 0x78B8, - 9721: 0x78BA, - 9722: 0x78BB, - 9723: 0x78BC, - 9724: 0x78BD, - 9725: 0x78BF, - 9726: 0x78C0, - 9727: 0x78C2, - 9728: 0x78C3, - 9729: 0x78C4, - 9730: 0x78C6, - 9731: 0x78C7, - 9732: 0x78C8, - 9733: 0x78CC, - 9734: 0x78CD, - 9735: 0x78CE, - 9736: 0x78CF, - 9737: 0x78D1, - 9738: 0x78D2, - 9739: 0x78D3, - 9740: 0x78D6, - 9741: 0x78D7, - 9742: 0x78D8, - 9743: 0x78DA, - 9744: 0x78DB, - 9745: 0x78DC, - 9746: 0x78DD, - 9747: 0x78DE, - 9748: 0x78DF, - 9749: 0x78E0, - 9750: 0x78E1, - 9751: 0x78E2, - 9752: 0x78E3, - 9753: 0x78E4, - 9754: 0x78E5, - 9755: 0x78E6, - 9756: 0x78E7, - 9757: 0x78E9, - 9758: 0x78EA, - 9759: 0x78EB, - 9760: 0x78ED, - 9761: 0x78EE, - 9762: 0x78EF, - 9763: 0x78F0, - 9764: 0x78F1, - 9765: 0x78F3, - 9766: 0x78F5, - 9767: 0x78F6, - 9768: 0x78F8, - 9769: 0x78F9, - 9770: 0x78FB, - 9771: 0x78FC, - 9772: 0x78FD, - 9773: 0x78FE, - 9774: 0x78FF, - 9775: 0x7900, - 9776: 0x7902, - 9777: 0x7903, - 9778: 0x7904, - 9779: 0x7906, - 9780: 0x7907, - 9781: 0x7908, - 9782: 0x7909, - 9783: 0x790A, - 9784: 0x790B, - 9785: 0x790C, - 9786: 0x7840, - 9787: 0x50A8, - 9788: 0x77D7, - 9789: 0x6410, - 9790: 0x89E6, - 9791: 0x5904, - 9792: 0x63E3, - 9793: 0x5DDD, - 9794: 0x7A7F, - 9795: 0x693D, - 9796: 0x4F20, - 9797: 0x8239, - 9798: 0x5598, - 9799: 0x4E32, - 9800: 0x75AE, - 9801: 0x7A97, - 9802: 0x5E62, - 9803: 0x5E8A, - 9804: 0x95EF, - 9805: 0x521B, - 9806: 0x5439, - 9807: 0x708A, - 9808: 0x6376, - 9809: 0x9524, - 9810: 0x5782, - 9811: 0x6625, - 9812: 0x693F, - 9813: 0x9187, - 9814: 0x5507, - 9815: 0x6DF3, - 9816: 0x7EAF, - 9817: 0x8822, - 9818: 0x6233, - 9819: 0x7EF0, - 9820: 0x75B5, - 9821: 0x8328, - 9822: 0x78C1, - 9823: 0x96CC, - 9824: 0x8F9E, - 9825: 0x6148, - 9826: 0x74F7, - 9827: 0x8BCD, - 9828: 0x6B64, - 9829: 0x523A, - 9830: 0x8D50, - 9831: 0x6B21, - 9832: 0x806A, - 9833: 0x8471, - 9834: 0x56F1, - 9835: 0x5306, - 9836: 0x4ECE, - 9837: 0x4E1B, - 9838: 0x51D1, - 9839: 0x7C97, - 9840: 0x918B, - 9841: 0x7C07, - 9842: 0x4FC3, - 9843: 0x8E7F, - 9844: 0x7BE1, - 9845: 0x7A9C, - 9846: 0x6467, - 9847: 0x5D14, - 9848: 0x50AC, - 9849: 0x8106, - 9850: 0x7601, - 9851: 0x7CB9, - 9852: 0x6DEC, - 9853: 0x7FE0, - 9854: 0x6751, - 9855: 0x5B58, - 9856: 0x5BF8, - 9857: 0x78CB, - 9858: 0x64AE, - 9859: 0x6413, - 9860: 0x63AA, - 9861: 0x632B, - 9862: 0x9519, - 9863: 0x642D, - 9864: 0x8FBE, - 9865: 0x7B54, - 9866: 0x7629, - 9867: 0x6253, - 9868: 0x5927, - 9869: 0x5446, - 9870: 0x6B79, - 9871: 0x50A3, - 9872: 0x6234, - 9873: 0x5E26, - 9874: 0x6B86, - 9875: 0x4EE3, - 9876: 0x8D37, - 9877: 0x888B, - 9878: 0x5F85, - 9879: 0x902E, - 9880: 0x790D, - 9881: 0x790E, - 9882: 0x790F, - 9883: 0x7910, - 9884: 0x7911, - 9885: 0x7912, - 9886: 0x7914, - 9887: 0x7915, - 9888: 0x7916, - 9889: 0x7917, - 9890: 0x7918, - 9891: 0x7919, - 9892: 0x791A, - 9893: 0x791B, - 9894: 0x791C, - 9895: 0x791D, - 9896: 0x791F, - 9897: 0x7920, - 9898: 0x7921, - 9899: 0x7922, - 9900: 0x7923, - 9901: 0x7925, - 9902: 0x7926, - 9903: 0x7927, - 9904: 0x7928, - 9905: 0x7929, - 9906: 0x792A, - 9907: 0x792B, - 9908: 0x792C, - 9909: 0x792D, - 9910: 0x792E, - 9911: 0x792F, - 9912: 0x7930, - 9913: 0x7931, - 9914: 0x7932, - 9915: 0x7933, - 9916: 0x7935, - 9917: 0x7936, - 9918: 0x7937, - 9919: 0x7938, - 9920: 0x7939, - 9921: 0x793D, - 9922: 0x793F, - 9923: 0x7942, - 9924: 0x7943, - 9925: 0x7944, - 9926: 0x7945, - 9927: 0x7947, - 9928: 0x794A, - 9929: 0x794B, - 9930: 0x794C, - 9931: 0x794D, - 9932: 0x794E, - 9933: 0x794F, - 9934: 0x7950, - 9935: 0x7951, - 9936: 0x7952, - 9937: 0x7954, - 9938: 0x7955, - 9939: 0x7958, - 9940: 0x7959, - 9941: 0x7961, - 9942: 0x7963, - 9943: 0x7964, - 9944: 0x7966, - 9945: 0x7969, - 9946: 0x796A, - 9947: 0x796B, - 9948: 0x796C, - 9949: 0x796E, - 9950: 0x7970, - 9951: 0x7971, - 9952: 0x7972, - 9953: 0x7973, - 9954: 0x7974, - 9955: 0x7975, - 9956: 0x7976, - 9957: 0x7979, - 9958: 0x797B, - 9959: 0x797C, - 9960: 0x797D, - 9961: 0x797E, - 9962: 0x797F, - 9963: 0x7982, - 9964: 0x7983, - 9965: 0x7986, - 9966: 0x7987, - 9967: 0x7988, - 9968: 0x7989, - 9969: 0x798B, - 9970: 0x798C, - 9971: 0x798D, - 9972: 0x798E, - 9973: 0x7990, - 9974: 0x7991, - 9975: 0x7992, - 9976: 0x6020, - 9977: 0x803D, - 9978: 0x62C5, - 9979: 0x4E39, - 9980: 0x5355, - 9981: 0x90F8, - 9982: 0x63B8, - 9983: 0x80C6, - 9984: 0x65E6, - 9985: 0x6C2E, - 9986: 0x4F46, - 9987: 0x60EE, - 9988: 0x6DE1, - 9989: 0x8BDE, - 9990: 0x5F39, - 9991: 0x86CB, - 9992: 0x5F53, - 9993: 0x6321, - 9994: 0x515A, - 9995: 0x8361, - 9996: 0x6863, - 9997: 0x5200, - 9998: 0x6363, - 9999: 0x8E48, - 10000: 0x5012, - 10001: 0x5C9B, - 10002: 0x7977, - 10003: 0x5BFC, - 10004: 0x5230, - 10005: 0x7A3B, - 10006: 0x60BC, - 10007: 0x9053, - 10008: 0x76D7, - 10009: 0x5FB7, - 10010: 0x5F97, - 10011: 0x7684, - 10012: 0x8E6C, - 10013: 0x706F, - 10014: 0x767B, - 10015: 0x7B49, - 10016: 0x77AA, - 10017: 0x51F3, - 10018: 0x9093, - 10019: 0x5824, - 10020: 0x4F4E, - 10021: 0x6EF4, - 10022: 0x8FEA, - 10023: 0x654C, - 10024: 0x7B1B, - 10025: 0x72C4, - 10026: 0x6DA4, - 10027: 0x7FDF, - 10028: 0x5AE1, - 10029: 0x62B5, - 10030: 0x5E95, - 10031: 0x5730, - 10032: 0x8482, - 10033: 0x7B2C, - 10034: 0x5E1D, - 10035: 0x5F1F, - 10036: 0x9012, - 10037: 0x7F14, - 10038: 0x98A0, - 10039: 0x6382, - 10040: 0x6EC7, - 10041: 0x7898, - 10042: 0x70B9, - 10043: 0x5178, - 10044: 0x975B, - 10045: 0x57AB, - 10046: 0x7535, - 10047: 0x4F43, - 10048: 0x7538, - 10049: 0x5E97, - 10050: 0x60E6, - 10051: 0x5960, - 10052: 0x6DC0, - 10053: 0x6BBF, - 10054: 0x7889, - 10055: 0x53FC, - 10056: 0x96D5, - 10057: 0x51CB, - 10058: 0x5201, - 10059: 0x6389, - 10060: 0x540A, - 10061: 0x9493, - 10062: 0x8C03, - 10063: 0x8DCC, - 10064: 0x7239, - 10065: 0x789F, - 10066: 0x8776, - 10067: 0x8FED, - 10068: 0x8C0D, - 10069: 0x53E0, - 10070: 0x7993, - 10071: 0x7994, - 10072: 0x7995, - 10073: 0x7996, - 10074: 0x7997, - 10075: 0x7998, - 10076: 0x7999, - 10077: 0x799B, - 10078: 0x799C, - 10079: 0x799D, - 10080: 0x799E, - 10081: 0x799F, - 10082: 0x79A0, - 10083: 0x79A1, - 10084: 0x79A2, - 10085: 0x79A3, - 10086: 0x79A4, - 10087: 0x79A5, - 10088: 0x79A6, - 10089: 0x79A8, - 10090: 0x79A9, - 10091: 0x79AA, - 10092: 0x79AB, - 10093: 0x79AC, - 10094: 0x79AD, - 10095: 0x79AE, - 10096: 0x79AF, - 10097: 0x79B0, - 10098: 0x79B1, - 10099: 0x79B2, - 10100: 0x79B4, - 10101: 0x79B5, - 10102: 0x79B6, - 10103: 0x79B7, - 10104: 0x79B8, - 10105: 0x79BC, - 10106: 0x79BF, - 10107: 0x79C2, - 10108: 0x79C4, - 10109: 0x79C5, - 10110: 0x79C7, - 10111: 0x79C8, - 10112: 0x79CA, - 10113: 0x79CC, - 10114: 0x79CE, - 10115: 0x79CF, - 10116: 0x79D0, - 10117: 0x79D3, - 10118: 0x79D4, - 10119: 0x79D6, - 10120: 0x79D7, - 10121: 0x79D9, - 10122: 0x79DA, - 10123: 0x79DB, - 10124: 0x79DC, - 10125: 0x79DD, - 10126: 0x79DE, - 10127: 0x79E0, - 10128: 0x79E1, - 10129: 0x79E2, - 10130: 0x79E5, - 10131: 0x79E8, - 10132: 0x79EA, - 10133: 0x79EC, - 10134: 0x79EE, - 10135: 0x79F1, - 10136: 0x79F2, - 10137: 0x79F3, - 10138: 0x79F4, - 10139: 0x79F5, - 10140: 0x79F6, - 10141: 0x79F7, - 10142: 0x79F9, - 10143: 0x79FA, - 10144: 0x79FC, - 10145: 0x79FE, - 10146: 0x79FF, - 10147: 0x7A01, - 10148: 0x7A04, - 10149: 0x7A05, - 10150: 0x7A07, - 10151: 0x7A08, - 10152: 0x7A09, - 10153: 0x7A0A, - 10154: 0x7A0C, - 10155: 0x7A0F, - 10156: 0x7A10, - 10157: 0x7A11, - 10158: 0x7A12, - 10159: 0x7A13, - 10160: 0x7A15, - 10161: 0x7A16, - 10162: 0x7A18, - 10163: 0x7A19, - 10164: 0x7A1B, - 10165: 0x7A1C, - 10166: 0x4E01, - 10167: 0x76EF, - 10168: 0x53EE, - 10169: 0x9489, - 10170: 0x9876, - 10171: 0x9F0E, - 10172: 0x952D, - 10173: 0x5B9A, - 10174: 0x8BA2, - 10175: 0x4E22, - 10176: 0x4E1C, - 10177: 0x51AC, - 10178: 0x8463, - 10179: 0x61C2, - 10180: 0x52A8, - 10181: 0x680B, - 10182: 0x4F97, - 10183: 0x606B, - 10184: 0x51BB, - 10185: 0x6D1E, - 10186: 0x515C, - 10187: 0x6296, - 10188: 0x6597, - 10189: 0x9661, - 10190: 0x8C46, - 10191: 0x9017, - 10192: 0x75D8, - 10193: 0x90FD, - 10194: 0x7763, - 10195: 0x6BD2, - 10196: 0x728A, - 10197: 0x72EC, - 10198: 0x8BFB, - 10199: 0x5835, - 10200: 0x7779, - 10201: 0x8D4C, - 10202: 0x675C, - 10203: 0x9540, - 10204: 0x809A, - 10205: 0x5EA6, - 10206: 0x6E21, - 10207: 0x5992, - 10208: 0x7AEF, - 10209: 0x77ED, - 10210: 0x953B, - 10211: 0x6BB5, - 10212: 0x65AD, - 10213: 0x7F0E, - 10214: 0x5806, - 10215: 0x5151, - 10216: 0x961F, - 10217: 0x5BF9, - 10218: 0x58A9, - 10219: 0x5428, - 10220: 0x8E72, - 10221: 0x6566, - 10222: 0x987F, - 10223: 0x56E4, - 10224: 0x949D, - 10225: 0x76FE, - 10226: 0x9041, - 10227: 0x6387, - 10228: 0x54C6, - 10229: 0x591A, - 10230: 0x593A, - 10231: 0x579B, - 10232: 0x8EB2, - 10233: 0x6735, - 10234: 0x8DFA, - 10235: 0x8235, - 10236: 0x5241, - 10237: 0x60F0, - 10238: 0x5815, - 10239: 0x86FE, - 10240: 0x5CE8, - 10241: 0x9E45, - 10242: 0x4FC4, - 10243: 0x989D, - 10244: 0x8BB9, - 10245: 0x5A25, - 10246: 0x6076, - 10247: 0x5384, - 10248: 0x627C, - 10249: 0x904F, - 10250: 0x9102, - 10251: 0x997F, - 10252: 0x6069, - 10253: 0x800C, - 10254: 0x513F, - 10255: 0x8033, - 10256: 0x5C14, - 10257: 0x9975, - 10258: 0x6D31, - 10259: 0x4E8C, - 10260: 0x7A1D, - 10261: 0x7A1F, - 10262: 0x7A21, - 10263: 0x7A22, - 10264: 0x7A24, - 10265: 0x7A25, - 10266: 0x7A26, - 10267: 0x7A27, - 10268: 0x7A28, - 10269: 0x7A29, - 10270: 0x7A2A, - 10271: 0x7A2B, - 10272: 0x7A2C, - 10273: 0x7A2D, - 10274: 0x7A2E, - 10275: 0x7A2F, - 10276: 0x7A30, - 10277: 0x7A31, - 10278: 0x7A32, - 10279: 0x7A34, - 10280: 0x7A35, - 10281: 0x7A36, - 10282: 0x7A38, - 10283: 0x7A3A, - 10284: 0x7A3E, - 10285: 0x7A40, - 10286: 0x7A41, - 10287: 0x7A42, - 10288: 0x7A43, - 10289: 0x7A44, - 10290: 0x7A45, - 10291: 0x7A47, - 10292: 0x7A48, - 10293: 0x7A49, - 10294: 0x7A4A, - 10295: 0x7A4B, - 10296: 0x7A4C, - 10297: 0x7A4D, - 10298: 0x7A4E, - 10299: 0x7A4F, - 10300: 0x7A50, - 10301: 0x7A52, - 10302: 0x7A53, - 10303: 0x7A54, - 10304: 0x7A55, - 10305: 0x7A56, - 10306: 0x7A58, - 10307: 0x7A59, - 10308: 0x7A5A, - 10309: 0x7A5B, - 10310: 0x7A5C, - 10311: 0x7A5D, - 10312: 0x7A5E, - 10313: 0x7A5F, - 10314: 0x7A60, - 10315: 0x7A61, - 10316: 0x7A62, - 10317: 0x7A63, - 10318: 0x7A64, - 10319: 0x7A65, - 10320: 0x7A66, - 10321: 0x7A67, - 10322: 0x7A68, - 10323: 0x7A69, - 10324: 0x7A6A, - 10325: 0x7A6B, - 10326: 0x7A6C, - 10327: 0x7A6D, - 10328: 0x7A6E, - 10329: 0x7A6F, - 10330: 0x7A71, - 10331: 0x7A72, - 10332: 0x7A73, - 10333: 0x7A75, - 10334: 0x7A7B, - 10335: 0x7A7C, - 10336: 0x7A7D, - 10337: 0x7A7E, - 10338: 0x7A82, - 10339: 0x7A85, - 10340: 0x7A87, - 10341: 0x7A89, - 10342: 0x7A8A, - 10343: 0x7A8B, - 10344: 0x7A8C, - 10345: 0x7A8E, - 10346: 0x7A8F, - 10347: 0x7A90, - 10348: 0x7A93, - 10349: 0x7A94, - 10350: 0x7A99, - 10351: 0x7A9A, - 10352: 0x7A9B, - 10353: 0x7A9E, - 10354: 0x7AA1, - 10355: 0x7AA2, - 10356: 0x8D30, - 10357: 0x53D1, - 10358: 0x7F5A, - 10359: 0x7B4F, - 10360: 0x4F10, - 10361: 0x4E4F, - 10362: 0x9600, - 10363: 0x6CD5, - 10364: 0x73D0, - 10365: 0x85E9, - 10366: 0x5E06, - 10367: 0x756A, - 10368: 0x7FFB, - 10369: 0x6A0A, - 10370: 0x77FE, - 10371: 0x9492, - 10372: 0x7E41, - 10373: 0x51E1, - 10374: 0x70E6, - 10375: 0x53CD, - 10376: 0x8FD4, - 10377: 0x8303, - 10378: 0x8D29, - 10379: 0x72AF, - 10380: 0x996D, - 10381: 0x6CDB, - 10382: 0x574A, - 10383: 0x82B3, - 10384: 0x65B9, - 10385: 0x80AA, - 10386: 0x623F, - 10387: 0x9632, - 10388: 0x59A8, - 10389: 0x4EFF, - 10390: 0x8BBF, - 10391: 0x7EBA, - 10392: 0x653E, - 10393: 0x83F2, - 10394: 0x975E, - 10395: 0x5561, - 10396: 0x98DE, - 10397: 0x80A5, - 10398: 0x532A, - 10399: 0x8BFD, - 10400: 0x5420, - 10401: 0x80BA, - 10402: 0x5E9F, - 10403: 0x6CB8, - 10404: 0x8D39, - 10405: 0x82AC, - 10406: 0x915A, - 10407: 0x5429, - 10408: 0x6C1B, - 10409: 0x5206, - 10410: 0x7EB7, - 10411: 0x575F, - 10412: 0x711A, - 10413: 0x6C7E, - 10414: 0x7C89, - 10415: 0x594B, - 10416: 0x4EFD, - 10417: 0x5FFF, - 10418: 0x6124, - 10419: 0x7CAA, - 10420: 0x4E30, - 10421: 0x5C01, - 10422: 0x67AB, - 10423: 0x8702, - 10424: 0x5CF0, - 10425: 0x950B, - 10426: 0x98CE, - 10427: 0x75AF, - 10428: 0x70FD, - 10429: 0x9022, - 10430: 0x51AF, - 10431: 0x7F1D, - 10432: 0x8BBD, - 10433: 0x5949, - 10434: 0x51E4, - 10435: 0x4F5B, - 10436: 0x5426, - 10437: 0x592B, - 10438: 0x6577, - 10439: 0x80A4, - 10440: 0x5B75, - 10441: 0x6276, - 10442: 0x62C2, - 10443: 0x8F90, - 10444: 0x5E45, - 10445: 0x6C1F, - 10446: 0x7B26, - 10447: 0x4F0F, - 10448: 0x4FD8, - 10449: 0x670D, - 10450: 0x7AA3, - 10451: 0x7AA4, - 10452: 0x7AA7, - 10453: 0x7AA9, - 10454: 0x7AAA, - 10455: 0x7AAB, - 10456: 0x7AAE, - 10457: 0x7AAF, - 10458: 0x7AB0, - 10459: 0x7AB1, - 10460: 0x7AB2, - 10461: 0x7AB4, - 10462: 0x7AB5, - 10463: 0x7AB6, - 10464: 0x7AB7, - 10465: 0x7AB8, - 10466: 0x7AB9, - 10467: 0x7ABA, - 10468: 0x7ABB, - 10469: 0x7ABC, - 10470: 0x7ABD, - 10471: 0x7ABE, - 10472: 0x7AC0, - 10473: 0x7AC1, - 10474: 0x7AC2, - 10475: 0x7AC3, - 10476: 0x7AC4, - 10477: 0x7AC5, - 10478: 0x7AC6, - 10479: 0x7AC7, - 10480: 0x7AC8, - 10481: 0x7AC9, - 10482: 0x7ACA, - 10483: 0x7ACC, - 10484: 0x7ACD, - 10485: 0x7ACE, - 10486: 0x7ACF, - 10487: 0x7AD0, - 10488: 0x7AD1, - 10489: 0x7AD2, - 10490: 0x7AD3, - 10491: 0x7AD4, - 10492: 0x7AD5, - 10493: 0x7AD7, - 10494: 0x7AD8, - 10495: 0x7ADA, - 10496: 0x7ADB, - 10497: 0x7ADC, - 10498: 0x7ADD, - 10499: 0x7AE1, - 10500: 0x7AE2, - 10501: 0x7AE4, - 10502: 0x7AE7, - 10503: 0x7AE8, - 10504: 0x7AE9, - 10505: 0x7AEA, - 10506: 0x7AEB, - 10507: 0x7AEC, - 10508: 0x7AEE, - 10509: 0x7AF0, - 10510: 0x7AF1, - 10511: 0x7AF2, - 10512: 0x7AF3, - 10513: 0x7AF4, - 10514: 0x7AF5, - 10515: 0x7AF6, - 10516: 0x7AF7, - 10517: 0x7AF8, - 10518: 0x7AFB, - 10519: 0x7AFC, - 10520: 0x7AFE, - 10521: 0x7B00, - 10522: 0x7B01, - 10523: 0x7B02, - 10524: 0x7B05, - 10525: 0x7B07, - 10526: 0x7B09, - 10527: 0x7B0C, - 10528: 0x7B0D, - 10529: 0x7B0E, - 10530: 0x7B10, - 10531: 0x7B12, - 10532: 0x7B13, - 10533: 0x7B16, - 10534: 0x7B17, - 10535: 0x7B18, - 10536: 0x7B1A, - 10537: 0x7B1C, - 10538: 0x7B1D, - 10539: 0x7B1F, - 10540: 0x7B21, - 10541: 0x7B22, - 10542: 0x7B23, - 10543: 0x7B27, - 10544: 0x7B29, - 10545: 0x7B2D, - 10546: 0x6D6E, - 10547: 0x6DAA, - 10548: 0x798F, - 10549: 0x88B1, - 10550: 0x5F17, - 10551: 0x752B, - 10552: 0x629A, - 10553: 0x8F85, - 10554: 0x4FEF, - 10555: 0x91DC, - 10556: 0x65A7, - 10557: 0x812F, - 10558: 0x8151, - 10559: 0x5E9C, - 10560: 0x8150, - 10561: 0x8D74, - 10562: 0x526F, - 10563: 0x8986, - 10564: 0x8D4B, - 10565: 0x590D, - 10566: 0x5085, - 10567: 0x4ED8, - 10568: 0x961C, - 10569: 0x7236, - 10570: 0x8179, - 10571: 0x8D1F, - 10572: 0x5BCC, - 10573: 0x8BA3, - 10574: 0x9644, - 10575: 0x5987, - 10576: 0x7F1A, - 10577: 0x5490, - 10578: 0x5676, - 10579: 0x560E, - 10580: 0x8BE5, - 10581: 0x6539, - 10582: 0x6982, - 10583: 0x9499, - 10584: 0x76D6, - 10585: 0x6E89, - 10586: 0x5E72, - 10587: 0x7518, - 10588: 0x6746, - 10589: 0x67D1, - 10590: 0x7AFF, - 10591: 0x809D, - 10592: 0x8D76, - 10593: 0x611F, - 10594: 0x79C6, - 10595: 0x6562, - 10596: 0x8D63, - 10597: 0x5188, - 10598: 0x521A, - 10599: 0x94A2, - 10600: 0x7F38, - 10601: 0x809B, - 10602: 0x7EB2, - 10603: 0x5C97, - 10604: 0x6E2F, - 10605: 0x6760, - 10606: 0x7BD9, - 10607: 0x768B, - 10608: 0x9AD8, - 10609: 0x818F, - 10610: 0x7F94, - 10611: 0x7CD5, - 10612: 0x641E, - 10613: 0x9550, - 10614: 0x7A3F, - 10615: 0x544A, - 10616: 0x54E5, - 10617: 0x6B4C, - 10618: 0x6401, - 10619: 0x6208, - 10620: 0x9E3D, - 10621: 0x80F3, - 10622: 0x7599, - 10623: 0x5272, - 10624: 0x9769, - 10625: 0x845B, - 10626: 0x683C, - 10627: 0x86E4, - 10628: 0x9601, - 10629: 0x9694, - 10630: 0x94EC, - 10631: 0x4E2A, - 10632: 0x5404, - 10633: 0x7ED9, - 10634: 0x6839, - 10635: 0x8DDF, - 10636: 0x8015, - 10637: 0x66F4, - 10638: 0x5E9A, - 10639: 0x7FB9, - 10640: 0x7B2F, - 10641: 0x7B30, - 10642: 0x7B32, - 10643: 0x7B34, - 10644: 0x7B35, - 10645: 0x7B36, - 10646: 0x7B37, - 10647: 0x7B39, - 10648: 0x7B3B, - 10649: 0x7B3D, - 10650: 0x7B3F, - 10651: 0x7B40, - 10652: 0x7B41, - 10653: 0x7B42, - 10654: 0x7B43, - 10655: 0x7B44, - 10656: 0x7B46, - 10657: 0x7B48, - 10658: 0x7B4A, - 10659: 0x7B4D, - 10660: 0x7B4E, - 10661: 0x7B53, - 10662: 0x7B55, - 10663: 0x7B57, - 10664: 0x7B59, - 10665: 0x7B5C, - 10666: 0x7B5E, - 10667: 0x7B5F, - 10668: 0x7B61, - 10669: 0x7B63, - 10670: 0x7B64, - 10671: 0x7B65, - 10672: 0x7B66, - 10673: 0x7B67, - 10674: 0x7B68, - 10675: 0x7B69, - 10676: 0x7B6A, - 10677: 0x7B6B, - 10678: 0x7B6C, - 10679: 0x7B6D, - 10680: 0x7B6F, - 10681: 0x7B70, - 10682: 0x7B73, - 10683: 0x7B74, - 10684: 0x7B76, - 10685: 0x7B78, - 10686: 0x7B7A, - 10687: 0x7B7C, - 10688: 0x7B7D, - 10689: 0x7B7F, - 10690: 0x7B81, - 10691: 0x7B82, - 10692: 0x7B83, - 10693: 0x7B84, - 10694: 0x7B86, - 10695: 0x7B87, - 10696: 0x7B88, - 10697: 0x7B89, - 10698: 0x7B8A, - 10699: 0x7B8B, - 10700: 0x7B8C, - 10701: 0x7B8E, - 10702: 0x7B8F, - 10703: 0x7B91, - 10704: 0x7B92, - 10705: 0x7B93, - 10706: 0x7B96, - 10707: 0x7B98, - 10708: 0x7B99, - 10709: 0x7B9A, - 10710: 0x7B9B, - 10711: 0x7B9E, - 10712: 0x7B9F, - 10713: 0x7BA0, - 10714: 0x7BA3, - 10715: 0x7BA4, - 10716: 0x7BA5, - 10717: 0x7BAE, - 10718: 0x7BAF, - 10719: 0x7BB0, - 10720: 0x7BB2, - 10721: 0x7BB3, - 10722: 0x7BB5, - 10723: 0x7BB6, - 10724: 0x7BB7, - 10725: 0x7BB9, - 10726: 0x7BBA, - 10727: 0x7BBB, - 10728: 0x7BBC, - 10729: 0x7BBD, - 10730: 0x7BBE, - 10731: 0x7BBF, - 10732: 0x7BC0, - 10733: 0x7BC2, - 10734: 0x7BC3, - 10735: 0x7BC4, - 10736: 0x57C2, - 10737: 0x803F, - 10738: 0x6897, - 10739: 0x5DE5, - 10740: 0x653B, - 10741: 0x529F, - 10742: 0x606D, - 10743: 0x9F9A, - 10744: 0x4F9B, - 10745: 0x8EAC, - 10746: 0x516C, - 10747: 0x5BAB, - 10748: 0x5F13, - 10749: 0x5DE9, - 10750: 0x6C5E, - 10751: 0x62F1, - 10752: 0x8D21, - 10753: 0x5171, - 10754: 0x94A9, - 10755: 0x52FE, - 10756: 0x6C9F, - 10757: 0x82DF, - 10758: 0x72D7, - 10759: 0x57A2, - 10760: 0x6784, - 10761: 0x8D2D, - 10762: 0x591F, - 10763: 0x8F9C, - 10764: 0x83C7, - 10765: 0x5495, - 10766: 0x7B8D, - 10767: 0x4F30, - 10768: 0x6CBD, - 10769: 0x5B64, - 10770: 0x59D1, - 10771: 0x9F13, - 10772: 0x53E4, - 10773: 0x86CA, - 10774: 0x9AA8, - 10775: 0x8C37, - 10776: 0x80A1, - 10777: 0x6545, - 10778: 0x987E, - 10779: 0x56FA, - 10780: 0x96C7, - 10781: 0x522E, - 10782: 0x74DC, - 10783: 0x5250, - 10784: 0x5BE1, - 10785: 0x6302, - 10786: 0x8902, - 10787: 0x4E56, - 10788: 0x62D0, - 10789: 0x602A, - 10790: 0x68FA, - 10791: 0x5173, - 10792: 0x5B98, - 10793: 0x51A0, - 10794: 0x89C2, - 10795: 0x7BA1, - 10796: 0x9986, - 10797: 0x7F50, - 10798: 0x60EF, - 10799: 0x704C, - 10800: 0x8D2F, - 10801: 0x5149, - 10802: 0x5E7F, - 10803: 0x901B, - 10804: 0x7470, - 10805: 0x89C4, - 10806: 0x572D, - 10807: 0x7845, - 10808: 0x5F52, - 10809: 0x9F9F, - 10810: 0x95FA, - 10811: 0x8F68, - 10812: 0x9B3C, - 10813: 0x8BE1, - 10814: 0x7678, - 10815: 0x6842, - 10816: 0x67DC, - 10817: 0x8DEA, - 10818: 0x8D35, - 10819: 0x523D, - 10820: 0x8F8A, - 10821: 0x6EDA, - 10822: 0x68CD, - 10823: 0x9505, - 10824: 0x90ED, - 10825: 0x56FD, - 10826: 0x679C, - 10827: 0x88F9, - 10828: 0x8FC7, - 10829: 0x54C8, - 10830: 0x7BC5, - 10831: 0x7BC8, - 10832: 0x7BC9, - 10833: 0x7BCA, - 10834: 0x7BCB, - 10835: 0x7BCD, - 10836: 0x7BCE, - 10837: 0x7BCF, - 10838: 0x7BD0, - 10839: 0x7BD2, - 10840: 0x7BD4, - 10841: 0x7BD5, - 10842: 0x7BD6, - 10843: 0x7BD7, - 10844: 0x7BD8, - 10845: 0x7BDB, - 10846: 0x7BDC, - 10847: 0x7BDE, - 10848: 0x7BDF, - 10849: 0x7BE0, - 10850: 0x7BE2, - 10851: 0x7BE3, - 10852: 0x7BE4, - 10853: 0x7BE7, - 10854: 0x7BE8, - 10855: 0x7BE9, - 10856: 0x7BEB, - 10857: 0x7BEC, - 10858: 0x7BED, - 10859: 0x7BEF, - 10860: 0x7BF0, - 10861: 0x7BF2, - 10862: 0x7BF3, - 10863: 0x7BF4, - 10864: 0x7BF5, - 10865: 0x7BF6, - 10866: 0x7BF8, - 10867: 0x7BF9, - 10868: 0x7BFA, - 10869: 0x7BFB, - 10870: 0x7BFD, - 10871: 0x7BFF, - 10872: 0x7C00, - 10873: 0x7C01, - 10874: 0x7C02, - 10875: 0x7C03, - 10876: 0x7C04, - 10877: 0x7C05, - 10878: 0x7C06, - 10879: 0x7C08, - 10880: 0x7C09, - 10881: 0x7C0A, - 10882: 0x7C0D, - 10883: 0x7C0E, - 10884: 0x7C10, - 10885: 0x7C11, - 10886: 0x7C12, - 10887: 0x7C13, - 10888: 0x7C14, - 10889: 0x7C15, - 10890: 0x7C17, - 10891: 0x7C18, - 10892: 0x7C19, - 10893: 0x7C1A, - 10894: 0x7C1B, - 10895: 0x7C1C, - 10896: 0x7C1D, - 10897: 0x7C1E, - 10898: 0x7C20, - 10899: 0x7C21, - 10900: 0x7C22, - 10901: 0x7C23, - 10902: 0x7C24, - 10903: 0x7C25, - 10904: 0x7C28, - 10905: 0x7C29, - 10906: 0x7C2B, - 10907: 0x7C2C, - 10908: 0x7C2D, - 10909: 0x7C2E, - 10910: 0x7C2F, - 10911: 0x7C30, - 10912: 0x7C31, - 10913: 0x7C32, - 10914: 0x7C33, - 10915: 0x7C34, - 10916: 0x7C35, - 10917: 0x7C36, - 10918: 0x7C37, - 10919: 0x7C39, - 10920: 0x7C3A, - 10921: 0x7C3B, - 10922: 0x7C3C, - 10923: 0x7C3D, - 10924: 0x7C3E, - 10925: 0x7C42, - 10926: 0x9AB8, - 10927: 0x5B69, - 10928: 0x6D77, - 10929: 0x6C26, - 10930: 0x4EA5, - 10931: 0x5BB3, - 10932: 0x9A87, - 10933: 0x9163, - 10934: 0x61A8, - 10935: 0x90AF, - 10936: 0x97E9, - 10937: 0x542B, - 10938: 0x6DB5, - 10939: 0x5BD2, - 10940: 0x51FD, - 10941: 0x558A, - 10942: 0x7F55, - 10943: 0x7FF0, - 10944: 0x64BC, - 10945: 0x634D, - 10946: 0x65F1, - 10947: 0x61BE, - 10948: 0x608D, - 10949: 0x710A, - 10950: 0x6C57, - 10951: 0x6C49, - 10952: 0x592F, - 10953: 0x676D, - 10954: 0x822A, - 10955: 0x58D5, - 10956: 0x568E, - 10957: 0x8C6A, - 10958: 0x6BEB, - 10959: 0x90DD, - 10960: 0x597D, - 10961: 0x8017, - 10962: 0x53F7, - 10963: 0x6D69, - 10964: 0x5475, - 10965: 0x559D, - 10966: 0x8377, - 10967: 0x83CF, - 10968: 0x6838, - 10969: 0x79BE, - 10970: 0x548C, - 10971: 0x4F55, - 10972: 0x5408, - 10973: 0x76D2, - 10974: 0x8C89, - 10975: 0x9602, - 10976: 0x6CB3, - 10977: 0x6DB8, - 10978: 0x8D6B, - 10979: 0x8910, - 10980: 0x9E64, - 10981: 0x8D3A, - 10982: 0x563F, - 10983: 0x9ED1, - 10984: 0x75D5, - 10985: 0x5F88, - 10986: 0x72E0, - 10987: 0x6068, - 10988: 0x54FC, - 10989: 0x4EA8, - 10990: 0x6A2A, - 10991: 0x8861, - 10992: 0x6052, - 10993: 0x8F70, - 10994: 0x54C4, - 10995: 0x70D8, - 10996: 0x8679, - 10997: 0x9E3F, - 10998: 0x6D2A, - 10999: 0x5B8F, - 11000: 0x5F18, - 11001: 0x7EA2, - 11002: 0x5589, - 11003: 0x4FAF, - 11004: 0x7334, - 11005: 0x543C, - 11006: 0x539A, - 11007: 0x5019, - 11008: 0x540E, - 11009: 0x547C, - 11010: 0x4E4E, - 11011: 0x5FFD, - 11012: 0x745A, - 11013: 0x58F6, - 11014: 0x846B, - 11015: 0x80E1, - 11016: 0x8774, - 11017: 0x72D0, - 11018: 0x7CCA, - 11019: 0x6E56, - 11020: 0x7C43, - 11021: 0x7C44, - 11022: 0x7C45, - 11023: 0x7C46, - 11024: 0x7C47, - 11025: 0x7C48, - 11026: 0x7C49, - 11027: 0x7C4A, - 11028: 0x7C4B, - 11029: 0x7C4C, - 11030: 0x7C4E, - 11031: 0x7C4F, - 11032: 0x7C50, - 11033: 0x7C51, - 11034: 0x7C52, - 11035: 0x7C53, - 11036: 0x7C54, - 11037: 0x7C55, - 11038: 0x7C56, - 11039: 0x7C57, - 11040: 0x7C58, - 11041: 0x7C59, - 11042: 0x7C5A, - 11043: 0x7C5B, - 11044: 0x7C5C, - 11045: 0x7C5D, - 11046: 0x7C5E, - 11047: 0x7C5F, - 11048: 0x7C60, - 11049: 0x7C61, - 11050: 0x7C62, - 11051: 0x7C63, - 11052: 0x7C64, - 11053: 0x7C65, - 11054: 0x7C66, - 11055: 0x7C67, - 11056: 0x7C68, - 11057: 0x7C69, - 11058: 0x7C6A, - 11059: 0x7C6B, - 11060: 0x7C6C, - 11061: 0x7C6D, - 11062: 0x7C6E, - 11063: 0x7C6F, - 11064: 0x7C70, - 11065: 0x7C71, - 11066: 0x7C72, - 11067: 0x7C75, - 11068: 0x7C76, - 11069: 0x7C77, - 11070: 0x7C78, - 11071: 0x7C79, - 11072: 0x7C7A, - 11073: 0x7C7E, - 11074: 0x7C7F, - 11075: 0x7C80, - 11076: 0x7C81, - 11077: 0x7C82, - 11078: 0x7C83, - 11079: 0x7C84, - 11080: 0x7C85, - 11081: 0x7C86, - 11082: 0x7C87, - 11083: 0x7C88, - 11084: 0x7C8A, - 11085: 0x7C8B, - 11086: 0x7C8C, - 11087: 0x7C8D, - 11088: 0x7C8E, - 11089: 0x7C8F, - 11090: 0x7C90, - 11091: 0x7C93, - 11092: 0x7C94, - 11093: 0x7C96, - 11094: 0x7C99, - 11095: 0x7C9A, - 11096: 0x7C9B, - 11097: 0x7CA0, - 11098: 0x7CA1, - 11099: 0x7CA3, - 11100: 0x7CA6, - 11101: 0x7CA7, - 11102: 0x7CA8, - 11103: 0x7CA9, - 11104: 0x7CAB, - 11105: 0x7CAC, - 11106: 0x7CAD, - 11107: 0x7CAF, - 11108: 0x7CB0, - 11109: 0x7CB4, - 11110: 0x7CB5, - 11111: 0x7CB6, - 11112: 0x7CB7, - 11113: 0x7CB8, - 11114: 0x7CBA, - 11115: 0x7CBB, - 11116: 0x5F27, - 11117: 0x864E, - 11118: 0x552C, - 11119: 0x62A4, - 11120: 0x4E92, - 11121: 0x6CAA, - 11122: 0x6237, - 11123: 0x82B1, - 11124: 0x54D7, - 11125: 0x534E, - 11126: 0x733E, - 11127: 0x6ED1, - 11128: 0x753B, - 11129: 0x5212, - 11130: 0x5316, - 11131: 0x8BDD, - 11132: 0x69D0, - 11133: 0x5F8A, - 11134: 0x6000, - 11135: 0x6DEE, - 11136: 0x574F, - 11137: 0x6B22, - 11138: 0x73AF, - 11139: 0x6853, - 11140: 0x8FD8, - 11141: 0x7F13, - 11142: 0x6362, - 11143: 0x60A3, - 11144: 0x5524, - 11145: 0x75EA, - 11146: 0x8C62, - 11147: 0x7115, - 11148: 0x6DA3, - 11149: 0x5BA6, - 11150: 0x5E7B, - 11151: 0x8352, - 11152: 0x614C, - 11153: 0x9EC4, - 11154: 0x78FA, - 11155: 0x8757, - 11156: 0x7C27, - 11157: 0x7687, - 11158: 0x51F0, - 11159: 0x60F6, - 11160: 0x714C, - 11161: 0x6643, - 11162: 0x5E4C, - 11163: 0x604D, - 11164: 0x8C0E, - 11165: 0x7070, - 11166: 0x6325, - 11167: 0x8F89, - 11168: 0x5FBD, - 11169: 0x6062, - 11170: 0x86D4, - 11171: 0x56DE, - 11172: 0x6BC1, - 11173: 0x6094, - 11174: 0x6167, - 11175: 0x5349, - 11176: 0x60E0, - 11177: 0x6666, - 11178: 0x8D3F, - 11179: 0x79FD, - 11180: 0x4F1A, - 11181: 0x70E9, - 11182: 0x6C47, - 11183: 0x8BB3, - 11184: 0x8BF2, - 11185: 0x7ED8, - 11186: 0x8364, - 11187: 0x660F, - 11188: 0x5A5A, - 11189: 0x9B42, - 11190: 0x6D51, - 11191: 0x6DF7, - 11192: 0x8C41, - 11193: 0x6D3B, - 11194: 0x4F19, - 11195: 0x706B, - 11196: 0x83B7, - 11197: 0x6216, - 11198: 0x60D1, - 11199: 0x970D, - 11200: 0x8D27, - 11201: 0x7978, - 11202: 0x51FB, - 11203: 0x573E, - 11204: 0x57FA, - 11205: 0x673A, - 11206: 0x7578, - 11207: 0x7A3D, - 11208: 0x79EF, - 11209: 0x7B95, - 11210: 0x7CBF, - 11211: 0x7CC0, - 11212: 0x7CC2, - 11213: 0x7CC3, - 11214: 0x7CC4, - 11215: 0x7CC6, - 11216: 0x7CC9, - 11217: 0x7CCB, - 11218: 0x7CCE, - 11219: 0x7CCF, - 11220: 0x7CD0, - 11221: 0x7CD1, - 11222: 0x7CD2, - 11223: 0x7CD3, - 11224: 0x7CD4, - 11225: 0x7CD8, - 11226: 0x7CDA, - 11227: 0x7CDB, - 11228: 0x7CDD, - 11229: 0x7CDE, - 11230: 0x7CE1, - 11231: 0x7CE2, - 11232: 0x7CE3, - 11233: 0x7CE4, - 11234: 0x7CE5, - 11235: 0x7CE6, - 11236: 0x7CE7, - 11237: 0x7CE9, - 11238: 0x7CEA, - 11239: 0x7CEB, - 11240: 0x7CEC, - 11241: 0x7CED, - 11242: 0x7CEE, - 11243: 0x7CF0, - 11244: 0x7CF1, - 11245: 0x7CF2, - 11246: 0x7CF3, - 11247: 0x7CF4, - 11248: 0x7CF5, - 11249: 0x7CF6, - 11250: 0x7CF7, - 11251: 0x7CF9, - 11252: 0x7CFA, - 11253: 0x7CFC, - 11254: 0x7CFD, - 11255: 0x7CFE, - 11256: 0x7CFF, - 11257: 0x7D00, - 11258: 0x7D01, - 11259: 0x7D02, - 11260: 0x7D03, - 11261: 0x7D04, - 11262: 0x7D05, - 11263: 0x7D06, - 11264: 0x7D07, - 11265: 0x7D08, - 11266: 0x7D09, - 11267: 0x7D0B, - 11268: 0x7D0C, - 11269: 0x7D0D, - 11270: 0x7D0E, - 11271: 0x7D0F, - 11272: 0x7D10, - 11273: 0x7D11, - 11274: 0x7D12, - 11275: 0x7D13, - 11276: 0x7D14, - 11277: 0x7D15, - 11278: 0x7D16, - 11279: 0x7D17, - 11280: 0x7D18, - 11281: 0x7D19, - 11282: 0x7D1A, - 11283: 0x7D1B, - 11284: 0x7D1C, - 11285: 0x7D1D, - 11286: 0x7D1E, - 11287: 0x7D1F, - 11288: 0x7D21, - 11289: 0x7D23, - 11290: 0x7D24, - 11291: 0x7D25, - 11292: 0x7D26, - 11293: 0x7D28, - 11294: 0x7D29, - 11295: 0x7D2A, - 11296: 0x7D2C, - 11297: 0x7D2D, - 11298: 0x7D2E, - 11299: 0x7D30, - 11300: 0x7D31, - 11301: 0x7D32, - 11302: 0x7D33, - 11303: 0x7D34, - 11304: 0x7D35, - 11305: 0x7D36, - 11306: 0x808C, - 11307: 0x9965, - 11308: 0x8FF9, - 11309: 0x6FC0, - 11310: 0x8BA5, - 11311: 0x9E21, - 11312: 0x59EC, - 11313: 0x7EE9, - 11314: 0x7F09, - 11315: 0x5409, - 11316: 0x6781, - 11317: 0x68D8, - 11318: 0x8F91, - 11319: 0x7C4D, - 11320: 0x96C6, - 11321: 0x53CA, - 11322: 0x6025, - 11323: 0x75BE, - 11324: 0x6C72, - 11325: 0x5373, - 11326: 0x5AC9, - 11327: 0x7EA7, - 11328: 0x6324, - 11329: 0x51E0, - 11330: 0x810A, - 11331: 0x5DF1, - 11332: 0x84DF, - 11333: 0x6280, - 11334: 0x5180, - 11335: 0x5B63, - 11336: 0x4F0E, - 11337: 0x796D, - 11338: 0x5242, - 11339: 0x60B8, - 11340: 0x6D4E, - 11341: 0x5BC4, - 11342: 0x5BC2, - 11343: 0x8BA1, - 11344: 0x8BB0, - 11345: 0x65E2, - 11346: 0x5FCC, - 11347: 0x9645, - 11348: 0x5993, - 11349: 0x7EE7, - 11350: 0x7EAA, - 11351: 0x5609, - 11352: 0x67B7, - 11353: 0x5939, - 11354: 0x4F73, - 11355: 0x5BB6, - 11356: 0x52A0, - 11357: 0x835A, - 11358: 0x988A, - 11359: 0x8D3E, - 11360: 0x7532, - 11361: 0x94BE, - 11362: 0x5047, - 11363: 0x7A3C, - 11364: 0x4EF7, - 11365: 0x67B6, - 11366: 0x9A7E, - 11367: 0x5AC1, - 11368: 0x6B7C, - 11369: 0x76D1, - 11370: 0x575A, - 11371: 0x5C16, - 11372: 0x7B3A, - 11373: 0x95F4, - 11374: 0x714E, - 11375: 0x517C, - 11376: 0x80A9, - 11377: 0x8270, - 11378: 0x5978, - 11379: 0x7F04, - 11380: 0x8327, - 11381: 0x68C0, - 11382: 0x67EC, - 11383: 0x78B1, - 11384: 0x7877, - 11385: 0x62E3, - 11386: 0x6361, - 11387: 0x7B80, - 11388: 0x4FED, - 11389: 0x526A, - 11390: 0x51CF, - 11391: 0x8350, - 11392: 0x69DB, - 11393: 0x9274, - 11394: 0x8DF5, - 11395: 0x8D31, - 11396: 0x89C1, - 11397: 0x952E, - 11398: 0x7BAD, - 11399: 0x4EF6, - 11400: 0x7D37, - 11401: 0x7D38, - 11402: 0x7D39, - 11403: 0x7D3A, - 11404: 0x7D3B, - 11405: 0x7D3C, - 11406: 0x7D3D, - 11407: 0x7D3E, - 11408: 0x7D3F, - 11409: 0x7D40, - 11410: 0x7D41, - 11411: 0x7D42, - 11412: 0x7D43, - 11413: 0x7D44, - 11414: 0x7D45, - 11415: 0x7D46, - 11416: 0x7D47, - 11417: 0x7D48, - 11418: 0x7D49, - 11419: 0x7D4A, - 11420: 0x7D4B, - 11421: 0x7D4C, - 11422: 0x7D4D, - 11423: 0x7D4E, - 11424: 0x7D4F, - 11425: 0x7D50, - 11426: 0x7D51, - 11427: 0x7D52, - 11428: 0x7D53, - 11429: 0x7D54, - 11430: 0x7D55, - 11431: 0x7D56, - 11432: 0x7D57, - 11433: 0x7D58, - 11434: 0x7D59, - 11435: 0x7D5A, - 11436: 0x7D5B, - 11437: 0x7D5C, - 11438: 0x7D5D, - 11439: 0x7D5E, - 11440: 0x7D5F, - 11441: 0x7D60, - 11442: 0x7D61, - 11443: 0x7D62, - 11444: 0x7D63, - 11445: 0x7D64, - 11446: 0x7D65, - 11447: 0x7D66, - 11448: 0x7D67, - 11449: 0x7D68, - 11450: 0x7D69, - 11451: 0x7D6A, - 11452: 0x7D6B, - 11453: 0x7D6C, - 11454: 0x7D6D, - 11455: 0x7D6F, - 11456: 0x7D70, - 11457: 0x7D71, - 11458: 0x7D72, - 11459: 0x7D73, - 11460: 0x7D74, - 11461: 0x7D75, - 11462: 0x7D76, - 11463: 0x7D78, - 11464: 0x7D79, - 11465: 0x7D7A, - 11466: 0x7D7B, - 11467: 0x7D7C, - 11468: 0x7D7D, - 11469: 0x7D7E, - 11470: 0x7D7F, - 11471: 0x7D80, - 11472: 0x7D81, - 11473: 0x7D82, - 11474: 0x7D83, - 11475: 0x7D84, - 11476: 0x7D85, - 11477: 0x7D86, - 11478: 0x7D87, - 11479: 0x7D88, - 11480: 0x7D89, - 11481: 0x7D8A, - 11482: 0x7D8B, - 11483: 0x7D8C, - 11484: 0x7D8D, - 11485: 0x7D8E, - 11486: 0x7D8F, - 11487: 0x7D90, - 11488: 0x7D91, - 11489: 0x7D92, - 11490: 0x7D93, - 11491: 0x7D94, - 11492: 0x7D95, - 11493: 0x7D96, - 11494: 0x7D97, - 11495: 0x7D98, - 11496: 0x5065, - 11497: 0x8230, - 11498: 0x5251, - 11499: 0x996F, - 11500: 0x6E10, - 11501: 0x6E85, - 11502: 0x6DA7, - 11503: 0x5EFA, - 11504: 0x50F5, - 11505: 0x59DC, - 11506: 0x5C06, - 11507: 0x6D46, - 11508: 0x6C5F, - 11509: 0x7586, - 11510: 0x848B, - 11511: 0x6868, - 11512: 0x5956, - 11513: 0x8BB2, - 11514: 0x5320, - 11515: 0x9171, - 11516: 0x964D, - 11517: 0x8549, - 11518: 0x6912, - 11519: 0x7901, - 11520: 0x7126, - 11521: 0x80F6, - 11522: 0x4EA4, - 11523: 0x90CA, - 11524: 0x6D47, - 11525: 0x9A84, - 11526: 0x5A07, - 11527: 0x56BC, - 11528: 0x6405, - 11529: 0x94F0, - 11530: 0x77EB, - 11531: 0x4FA5, - 11532: 0x811A, - 11533: 0x72E1, - 11534: 0x89D2, - 11535: 0x997A, - 11536: 0x7F34, - 11537: 0x7EDE, - 11538: 0x527F, - 11539: 0x6559, - 11540: 0x9175, - 11541: 0x8F7F, - 11542: 0x8F83, - 11543: 0x53EB, - 11544: 0x7A96, - 11545: 0x63ED, - 11546: 0x63A5, - 11547: 0x7686, - 11548: 0x79F8, - 11549: 0x8857, - 11550: 0x9636, - 11551: 0x622A, - 11552: 0x52AB, - 11553: 0x8282, - 11554: 0x6854, - 11555: 0x6770, - 11556: 0x6377, - 11557: 0x776B, - 11558: 0x7AED, - 11559: 0x6D01, - 11560: 0x7ED3, - 11561: 0x89E3, - 11562: 0x59D0, - 11563: 0x6212, - 11564: 0x85C9, - 11565: 0x82A5, - 11566: 0x754C, - 11567: 0x501F, - 11568: 0x4ECB, - 11569: 0x75A5, - 11570: 0x8BEB, - 11571: 0x5C4A, - 11572: 0x5DFE, - 11573: 0x7B4B, - 11574: 0x65A4, - 11575: 0x91D1, - 11576: 0x4ECA, - 11577: 0x6D25, - 11578: 0x895F, - 11579: 0x7D27, - 11580: 0x9526, - 11581: 0x4EC5, - 11582: 0x8C28, - 11583: 0x8FDB, - 11584: 0x9773, - 11585: 0x664B, - 11586: 0x7981, - 11587: 0x8FD1, - 11588: 0x70EC, - 11589: 0x6D78, - 11590: 0x7D99, - 11591: 0x7D9A, - 11592: 0x7D9B, - 11593: 0x7D9C, - 11594: 0x7D9D, - 11595: 0x7D9E, - 11596: 0x7D9F, - 11597: 0x7DA0, - 11598: 0x7DA1, - 11599: 0x7DA2, - 11600: 0x7DA3, - 11601: 0x7DA4, - 11602: 0x7DA5, - 11603: 0x7DA7, - 11604: 0x7DA8, - 11605: 0x7DA9, - 11606: 0x7DAA, - 11607: 0x7DAB, - 11608: 0x7DAC, - 11609: 0x7DAD, - 11610: 0x7DAF, - 11611: 0x7DB0, - 11612: 0x7DB1, - 11613: 0x7DB2, - 11614: 0x7DB3, - 11615: 0x7DB4, - 11616: 0x7DB5, - 11617: 0x7DB6, - 11618: 0x7DB7, - 11619: 0x7DB8, - 11620: 0x7DB9, - 11621: 0x7DBA, - 11622: 0x7DBB, - 11623: 0x7DBC, - 11624: 0x7DBD, - 11625: 0x7DBE, - 11626: 0x7DBF, - 11627: 0x7DC0, - 11628: 0x7DC1, - 11629: 0x7DC2, - 11630: 0x7DC3, - 11631: 0x7DC4, - 11632: 0x7DC5, - 11633: 0x7DC6, - 11634: 0x7DC7, - 11635: 0x7DC8, - 11636: 0x7DC9, - 11637: 0x7DCA, - 11638: 0x7DCB, - 11639: 0x7DCC, - 11640: 0x7DCD, - 11641: 0x7DCE, - 11642: 0x7DCF, - 11643: 0x7DD0, - 11644: 0x7DD1, - 11645: 0x7DD2, - 11646: 0x7DD3, - 11647: 0x7DD4, - 11648: 0x7DD5, - 11649: 0x7DD6, - 11650: 0x7DD7, - 11651: 0x7DD8, - 11652: 0x7DD9, - 11653: 0x7DDA, - 11654: 0x7DDB, - 11655: 0x7DDC, - 11656: 0x7DDD, - 11657: 0x7DDE, - 11658: 0x7DDF, - 11659: 0x7DE0, - 11660: 0x7DE1, - 11661: 0x7DE2, - 11662: 0x7DE3, - 11663: 0x7DE4, - 11664: 0x7DE5, - 11665: 0x7DE6, - 11666: 0x7DE7, - 11667: 0x7DE8, - 11668: 0x7DE9, - 11669: 0x7DEA, - 11670: 0x7DEB, - 11671: 0x7DEC, - 11672: 0x7DED, - 11673: 0x7DEE, - 11674: 0x7DEF, - 11675: 0x7DF0, - 11676: 0x7DF1, - 11677: 0x7DF2, - 11678: 0x7DF3, - 11679: 0x7DF4, - 11680: 0x7DF5, - 11681: 0x7DF6, - 11682: 0x7DF7, - 11683: 0x7DF8, - 11684: 0x7DF9, - 11685: 0x7DFA, - 11686: 0x5C3D, - 11687: 0x52B2, - 11688: 0x8346, - 11689: 0x5162, - 11690: 0x830E, - 11691: 0x775B, - 11692: 0x6676, - 11693: 0x9CB8, - 11694: 0x4EAC, - 11695: 0x60CA, - 11696: 0x7CBE, - 11697: 0x7CB3, - 11698: 0x7ECF, - 11699: 0x4E95, - 11700: 0x8B66, - 11701: 0x666F, - 11702: 0x9888, - 11703: 0x9759, - 11704: 0x5883, - 11705: 0x656C, - 11706: 0x955C, - 11707: 0x5F84, - 11708: 0x75C9, - 11709: 0x9756, - 11710: 0x7ADF, - 11711: 0x7ADE, - 11712: 0x51C0, - 11713: 0x70AF, - 11714: 0x7A98, - 11715: 0x63EA, - 11716: 0x7A76, - 11717: 0x7EA0, - 11718: 0x7396, - 11719: 0x97ED, - 11720: 0x4E45, - 11721: 0x7078, - 11722: 0x4E5D, - 11723: 0x9152, - 11724: 0x53A9, - 11725: 0x6551, - 11726: 0x65E7, - 11727: 0x81FC, - 11728: 0x8205, - 11729: 0x548E, - 11730: 0x5C31, - 11731: 0x759A, - 11732: 0x97A0, - 11733: 0x62D8, - 11734: 0x72D9, - 11735: 0x75BD, - 11736: 0x5C45, - 11737: 0x9A79, - 11738: 0x83CA, - 11739: 0x5C40, - 11740: 0x5480, - 11741: 0x77E9, - 11742: 0x4E3E, - 11743: 0x6CAE, - 11744: 0x805A, - 11745: 0x62D2, - 11746: 0x636E, - 11747: 0x5DE8, - 11748: 0x5177, - 11749: 0x8DDD, - 11750: 0x8E1E, - 11751: 0x952F, - 11752: 0x4FF1, - 11753: 0x53E5, - 11754: 0x60E7, - 11755: 0x70AC, - 11756: 0x5267, - 11757: 0x6350, - 11758: 0x9E43, - 11759: 0x5A1F, - 11760: 0x5026, - 11761: 0x7737, - 11762: 0x5377, - 11763: 0x7EE2, - 11764: 0x6485, - 11765: 0x652B, - 11766: 0x6289, - 11767: 0x6398, - 11768: 0x5014, - 11769: 0x7235, - 11770: 0x89C9, - 11771: 0x51B3, - 11772: 0x8BC0, - 11773: 0x7EDD, - 11774: 0x5747, - 11775: 0x83CC, - 11776: 0x94A7, - 11777: 0x519B, - 11778: 0x541B, - 11779: 0x5CFB, - 11780: 0x7DFB, - 11781: 0x7DFC, - 11782: 0x7DFD, - 11783: 0x7DFE, - 11784: 0x7DFF, - 11785: 0x7E00, - 11786: 0x7E01, - 11787: 0x7E02, - 11788: 0x7E03, - 11789: 0x7E04, - 11790: 0x7E05, - 11791: 0x7E06, - 11792: 0x7E07, - 11793: 0x7E08, - 11794: 0x7E09, - 11795: 0x7E0A, - 11796: 0x7E0B, - 11797: 0x7E0C, - 11798: 0x7E0D, - 11799: 0x7E0E, - 11800: 0x7E0F, - 11801: 0x7E10, - 11802: 0x7E11, - 11803: 0x7E12, - 11804: 0x7E13, - 11805: 0x7E14, - 11806: 0x7E15, - 11807: 0x7E16, - 11808: 0x7E17, - 11809: 0x7E18, - 11810: 0x7E19, - 11811: 0x7E1A, - 11812: 0x7E1B, - 11813: 0x7E1C, - 11814: 0x7E1D, - 11815: 0x7E1E, - 11816: 0x7E1F, - 11817: 0x7E20, - 11818: 0x7E21, - 11819: 0x7E22, - 11820: 0x7E23, - 11821: 0x7E24, - 11822: 0x7E25, - 11823: 0x7E26, - 11824: 0x7E27, - 11825: 0x7E28, - 11826: 0x7E29, - 11827: 0x7E2A, - 11828: 0x7E2B, - 11829: 0x7E2C, - 11830: 0x7E2D, - 11831: 0x7E2E, - 11832: 0x7E2F, - 11833: 0x7E30, - 11834: 0x7E31, - 11835: 0x7E32, - 11836: 0x7E33, - 11837: 0x7E34, - 11838: 0x7E35, - 11839: 0x7E36, - 11840: 0x7E37, - 11841: 0x7E38, - 11842: 0x7E39, - 11843: 0x7E3A, - 11844: 0x7E3C, - 11845: 0x7E3D, - 11846: 0x7E3E, - 11847: 0x7E3F, - 11848: 0x7E40, - 11849: 0x7E42, - 11850: 0x7E43, - 11851: 0x7E44, - 11852: 0x7E45, - 11853: 0x7E46, - 11854: 0x7E48, - 11855: 0x7E49, - 11856: 0x7E4A, - 11857: 0x7E4B, - 11858: 0x7E4C, - 11859: 0x7E4D, - 11860: 0x7E4E, - 11861: 0x7E4F, - 11862: 0x7E50, - 11863: 0x7E51, - 11864: 0x7E52, - 11865: 0x7E53, - 11866: 0x7E54, - 11867: 0x7E55, - 11868: 0x7E56, - 11869: 0x7E57, - 11870: 0x7E58, - 11871: 0x7E59, - 11872: 0x7E5A, - 11873: 0x7E5B, - 11874: 0x7E5C, - 11875: 0x7E5D, - 11876: 0x4FCA, - 11877: 0x7AE3, - 11878: 0x6D5A, - 11879: 0x90E1, - 11880: 0x9A8F, - 11881: 0x5580, - 11882: 0x5496, - 11883: 0x5361, - 11884: 0x54AF, - 11885: 0x5F00, - 11886: 0x63E9, - 11887: 0x6977, - 11888: 0x51EF, - 11889: 0x6168, - 11890: 0x520A, - 11891: 0x582A, - 11892: 0x52D8, - 11893: 0x574E, - 11894: 0x780D, - 11895: 0x770B, - 11896: 0x5EB7, - 11897: 0x6177, - 11898: 0x7CE0, - 11899: 0x625B, - 11900: 0x6297, - 11901: 0x4EA2, - 11902: 0x7095, - 11903: 0x8003, - 11904: 0x62F7, - 11905: 0x70E4, - 11906: 0x9760, - 11907: 0x5777, - 11908: 0x82DB, - 11909: 0x67EF, - 11910: 0x68F5, - 11911: 0x78D5, - 11912: 0x9897, - 11913: 0x79D1, - 11914: 0x58F3, - 11915: 0x54B3, - 11916: 0x53EF, - 11917: 0x6E34, - 11918: 0x514B, - 11919: 0x523B, - 11920: 0x5BA2, - 11921: 0x8BFE, - 11922: 0x80AF, - 11923: 0x5543, - 11924: 0x57A6, - 11925: 0x6073, - 11926: 0x5751, - 11927: 0x542D, - 11928: 0x7A7A, - 11929: 0x6050, - 11930: 0x5B54, - 11931: 0x63A7, - 11932: 0x62A0, - 11933: 0x53E3, - 11934: 0x6263, - 11935: 0x5BC7, - 11936: 0x67AF, - 11937: 0x54ED, - 11938: 0x7A9F, - 11939: 0x82E6, - 11940: 0x9177, - 11941: 0x5E93, - 11942: 0x88E4, - 11943: 0x5938, - 11944: 0x57AE, - 11945: 0x630E, - 11946: 0x8DE8, - 11947: 0x80EF, - 11948: 0x5757, - 11949: 0x7B77, - 11950: 0x4FA9, - 11951: 0x5FEB, - 11952: 0x5BBD, - 11953: 0x6B3E, - 11954: 0x5321, - 11955: 0x7B50, - 11956: 0x72C2, - 11957: 0x6846, - 11958: 0x77FF, - 11959: 0x7736, - 11960: 0x65F7, - 11961: 0x51B5, - 11962: 0x4E8F, - 11963: 0x76D4, - 11964: 0x5CBF, - 11965: 0x7AA5, - 11966: 0x8475, - 11967: 0x594E, - 11968: 0x9B41, - 11969: 0x5080, - 11970: 0x7E5E, - 11971: 0x7E5F, - 11972: 0x7E60, - 11973: 0x7E61, - 11974: 0x7E62, - 11975: 0x7E63, - 11976: 0x7E64, - 11977: 0x7E65, - 11978: 0x7E66, - 11979: 0x7E67, - 11980: 0x7E68, - 11981: 0x7E69, - 11982: 0x7E6A, - 11983: 0x7E6B, - 11984: 0x7E6C, - 11985: 0x7E6D, - 11986: 0x7E6E, - 11987: 0x7E6F, - 11988: 0x7E70, - 11989: 0x7E71, - 11990: 0x7E72, - 11991: 0x7E73, - 11992: 0x7E74, - 11993: 0x7E75, - 11994: 0x7E76, - 11995: 0x7E77, - 11996: 0x7E78, - 11997: 0x7E79, - 11998: 0x7E7A, - 11999: 0x7E7B, - 12000: 0x7E7C, - 12001: 0x7E7D, - 12002: 0x7E7E, - 12003: 0x7E7F, - 12004: 0x7E80, - 12005: 0x7E81, - 12006: 0x7E83, - 12007: 0x7E84, - 12008: 0x7E85, - 12009: 0x7E86, - 12010: 0x7E87, - 12011: 0x7E88, - 12012: 0x7E89, - 12013: 0x7E8A, - 12014: 0x7E8B, - 12015: 0x7E8C, - 12016: 0x7E8D, - 12017: 0x7E8E, - 12018: 0x7E8F, - 12019: 0x7E90, - 12020: 0x7E91, - 12021: 0x7E92, - 12022: 0x7E93, - 12023: 0x7E94, - 12024: 0x7E95, - 12025: 0x7E96, - 12026: 0x7E97, - 12027: 0x7E98, - 12028: 0x7E99, - 12029: 0x7E9A, - 12030: 0x7E9C, - 12031: 0x7E9D, - 12032: 0x7E9E, - 12033: 0x7EAE, - 12034: 0x7EB4, - 12035: 0x7EBB, - 12036: 0x7EBC, - 12037: 0x7ED6, - 12038: 0x7EE4, - 12039: 0x7EEC, - 12040: 0x7EF9, - 12041: 0x7F0A, - 12042: 0x7F10, - 12043: 0x7F1E, - 12044: 0x7F37, - 12045: 0x7F39, - 12046: 0x7F3B, - 12047: 0x7F3C, - 12048: 0x7F3D, - 12049: 0x7F3E, - 12050: 0x7F3F, - 12051: 0x7F40, - 12052: 0x7F41, - 12053: 0x7F43, - 12054: 0x7F46, - 12055: 0x7F47, - 12056: 0x7F48, - 12057: 0x7F49, - 12058: 0x7F4A, - 12059: 0x7F4B, - 12060: 0x7F4C, - 12061: 0x7F4D, - 12062: 0x7F4E, - 12063: 0x7F4F, - 12064: 0x7F52, - 12065: 0x7F53, - 12066: 0x9988, - 12067: 0x6127, - 12068: 0x6E83, - 12069: 0x5764, - 12070: 0x6606, - 12071: 0x6346, - 12072: 0x56F0, - 12073: 0x62EC, - 12074: 0x6269, - 12075: 0x5ED3, - 12076: 0x9614, - 12077: 0x5783, - 12078: 0x62C9, - 12079: 0x5587, - 12080: 0x8721, - 12081: 0x814A, - 12082: 0x8FA3, - 12083: 0x5566, - 12084: 0x83B1, - 12085: 0x6765, - 12086: 0x8D56, - 12087: 0x84DD, - 12088: 0x5A6A, - 12089: 0x680F, - 12090: 0x62E6, - 12091: 0x7BEE, - 12092: 0x9611, - 12093: 0x5170, - 12094: 0x6F9C, - 12095: 0x8C30, - 12096: 0x63FD, - 12097: 0x89C8, - 12098: 0x61D2, - 12099: 0x7F06, - 12100: 0x70C2, - 12101: 0x6EE5, - 12102: 0x7405, - 12103: 0x6994, - 12104: 0x72FC, - 12105: 0x5ECA, - 12106: 0x90CE, - 12107: 0x6717, - 12108: 0x6D6A, - 12109: 0x635E, - 12110: 0x52B3, - 12111: 0x7262, - 12112: 0x8001, - 12113: 0x4F6C, - 12114: 0x59E5, - 12115: 0x916A, - 12116: 0x70D9, - 12117: 0x6D9D, - 12118: 0x52D2, - 12119: 0x4E50, - 12120: 0x96F7, - 12121: 0x956D, - 12122: 0x857E, - 12123: 0x78CA, - 12124: 0x7D2F, - 12125: 0x5121, - 12126: 0x5792, - 12127: 0x64C2, - 12128: 0x808B, - 12129: 0x7C7B, - 12130: 0x6CEA, - 12131: 0x68F1, - 12132: 0x695E, - 12133: 0x51B7, - 12134: 0x5398, - 12135: 0x68A8, - 12136: 0x7281, - 12137: 0x9ECE, - 12138: 0x7BF1, - 12139: 0x72F8, - 12140: 0x79BB, - 12141: 0x6F13, - 12142: 0x7406, - 12143: 0x674E, - 12144: 0x91CC, - 12145: 0x9CA4, - 12146: 0x793C, - 12147: 0x8389, - 12148: 0x8354, - 12149: 0x540F, - 12150: 0x6817, - 12151: 0x4E3D, - 12152: 0x5389, - 12153: 0x52B1, - 12154: 0x783E, - 12155: 0x5386, - 12156: 0x5229, - 12157: 0x5088, - 12158: 0x4F8B, - 12159: 0x4FD0, - 12160: 0x7F56, - 12161: 0x7F59, - 12162: 0x7F5B, - 12163: 0x7F5C, - 12164: 0x7F5D, - 12165: 0x7F5E, - 12166: 0x7F60, - 12167: 0x7F63, - 12168: 0x7F64, - 12169: 0x7F65, - 12170: 0x7F66, - 12171: 0x7F67, - 12172: 0x7F6B, - 12173: 0x7F6C, - 12174: 0x7F6D, - 12175: 0x7F6F, - 12176: 0x7F70, - 12177: 0x7F73, - 12178: 0x7F75, - 12179: 0x7F76, - 12180: 0x7F77, - 12181: 0x7F78, - 12182: 0x7F7A, - 12183: 0x7F7B, - 12184: 0x7F7C, - 12185: 0x7F7D, - 12186: 0x7F7F, - 12187: 0x7F80, - 12188: 0x7F82, - 12189: 0x7F83, - 12190: 0x7F84, - 12191: 0x7F85, - 12192: 0x7F86, - 12193: 0x7F87, - 12194: 0x7F88, - 12195: 0x7F89, - 12196: 0x7F8B, - 12197: 0x7F8D, - 12198: 0x7F8F, - 12199: 0x7F90, - 12200: 0x7F91, - 12201: 0x7F92, - 12202: 0x7F93, - 12203: 0x7F95, - 12204: 0x7F96, - 12205: 0x7F97, - 12206: 0x7F98, - 12207: 0x7F99, - 12208: 0x7F9B, - 12209: 0x7F9C, - 12210: 0x7FA0, - 12211: 0x7FA2, - 12212: 0x7FA3, - 12213: 0x7FA5, - 12214: 0x7FA6, - 12215: 0x7FA8, - 12216: 0x7FA9, - 12217: 0x7FAA, - 12218: 0x7FAB, - 12219: 0x7FAC, - 12220: 0x7FAD, - 12221: 0x7FAE, - 12222: 0x7FB1, - 12223: 0x7FB3, - 12224: 0x7FB4, - 12225: 0x7FB5, - 12226: 0x7FB6, - 12227: 0x7FB7, - 12228: 0x7FBA, - 12229: 0x7FBB, - 12230: 0x7FBE, - 12231: 0x7FC0, - 12232: 0x7FC2, - 12233: 0x7FC3, - 12234: 0x7FC4, - 12235: 0x7FC6, - 12236: 0x7FC7, - 12237: 0x7FC8, - 12238: 0x7FC9, - 12239: 0x7FCB, - 12240: 0x7FCD, - 12241: 0x7FCF, - 12242: 0x7FD0, - 12243: 0x7FD1, - 12244: 0x7FD2, - 12245: 0x7FD3, - 12246: 0x7FD6, - 12247: 0x7FD7, - 12248: 0x7FD9, - 12249: 0x7FDA, - 12250: 0x7FDB, - 12251: 0x7FDC, - 12252: 0x7FDD, - 12253: 0x7FDE, - 12254: 0x7FE2, - 12255: 0x7FE3, - 12256: 0x75E2, - 12257: 0x7ACB, - 12258: 0x7C92, - 12259: 0x6CA5, - 12260: 0x96B6, - 12261: 0x529B, - 12262: 0x7483, - 12263: 0x54E9, - 12264: 0x4FE9, - 12265: 0x8054, - 12266: 0x83B2, - 12267: 0x8FDE, - 12268: 0x9570, - 12269: 0x5EC9, - 12270: 0x601C, - 12271: 0x6D9F, - 12272: 0x5E18, - 12273: 0x655B, - 12274: 0x8138, - 12275: 0x94FE, - 12276: 0x604B, - 12277: 0x70BC, - 12278: 0x7EC3, - 12279: 0x7CAE, - 12280: 0x51C9, - 12281: 0x6881, - 12282: 0x7CB1, - 12283: 0x826F, - 12284: 0x4E24, - 12285: 0x8F86, - 12286: 0x91CF, - 12287: 0x667E, - 12288: 0x4EAE, - 12289: 0x8C05, - 12290: 0x64A9, - 12291: 0x804A, - 12292: 0x50DA, - 12293: 0x7597, - 12294: 0x71CE, - 12295: 0x5BE5, - 12296: 0x8FBD, - 12297: 0x6F66, - 12298: 0x4E86, - 12299: 0x6482, - 12300: 0x9563, - 12301: 0x5ED6, - 12302: 0x6599, - 12303: 0x5217, - 12304: 0x88C2, - 12305: 0x70C8, - 12306: 0x52A3, - 12307: 0x730E, - 12308: 0x7433, - 12309: 0x6797, - 12310: 0x78F7, - 12311: 0x9716, - 12312: 0x4E34, - 12313: 0x90BB, - 12314: 0x9CDE, - 12315: 0x6DCB, - 12316: 0x51DB, - 12317: 0x8D41, - 12318: 0x541D, - 12319: 0x62CE, - 12320: 0x73B2, - 12321: 0x83F1, - 12322: 0x96F6, - 12323: 0x9F84, - 12324: 0x94C3, - 12325: 0x4F36, - 12326: 0x7F9A, - 12327: 0x51CC, - 12328: 0x7075, - 12329: 0x9675, - 12330: 0x5CAD, - 12331: 0x9886, - 12332: 0x53E6, - 12333: 0x4EE4, - 12334: 0x6E9C, - 12335: 0x7409, - 12336: 0x69B4, - 12337: 0x786B, - 12338: 0x998F, - 12339: 0x7559, - 12340: 0x5218, - 12341: 0x7624, - 12342: 0x6D41, - 12343: 0x67F3, - 12344: 0x516D, - 12345: 0x9F99, - 12346: 0x804B, - 12347: 0x5499, - 12348: 0x7B3C, - 12349: 0x7ABF, - 12350: 0x7FE4, - 12351: 0x7FE7, - 12352: 0x7FE8, - 12353: 0x7FEA, - 12354: 0x7FEB, - 12355: 0x7FEC, - 12356: 0x7FED, - 12357: 0x7FEF, - 12358: 0x7FF2, - 12359: 0x7FF4, - 12360: 0x7FF5, - 12361: 0x7FF6, - 12362: 0x7FF7, - 12363: 0x7FF8, - 12364: 0x7FF9, - 12365: 0x7FFA, - 12366: 0x7FFD, - 12367: 0x7FFE, - 12368: 0x7FFF, - 12369: 0x8002, - 12370: 0x8007, - 12371: 0x8008, - 12372: 0x8009, - 12373: 0x800A, - 12374: 0x800E, - 12375: 0x800F, - 12376: 0x8011, - 12377: 0x8013, - 12378: 0x801A, - 12379: 0x801B, - 12380: 0x801D, - 12381: 0x801E, - 12382: 0x801F, - 12383: 0x8021, - 12384: 0x8023, - 12385: 0x8024, - 12386: 0x802B, - 12387: 0x802C, - 12388: 0x802D, - 12389: 0x802E, - 12390: 0x802F, - 12391: 0x8030, - 12392: 0x8032, - 12393: 0x8034, - 12394: 0x8039, - 12395: 0x803A, - 12396: 0x803C, - 12397: 0x803E, - 12398: 0x8040, - 12399: 0x8041, - 12400: 0x8044, - 12401: 0x8045, - 12402: 0x8047, - 12403: 0x8048, - 12404: 0x8049, - 12405: 0x804E, - 12406: 0x804F, - 12407: 0x8050, - 12408: 0x8051, - 12409: 0x8053, - 12410: 0x8055, - 12411: 0x8056, - 12412: 0x8057, - 12413: 0x8059, - 12414: 0x805B, - 12415: 0x805C, - 12416: 0x805D, - 12417: 0x805E, - 12418: 0x805F, - 12419: 0x8060, - 12420: 0x8061, - 12421: 0x8062, - 12422: 0x8063, - 12423: 0x8064, - 12424: 0x8065, - 12425: 0x8066, - 12426: 0x8067, - 12427: 0x8068, - 12428: 0x806B, - 12429: 0x806C, - 12430: 0x806D, - 12431: 0x806E, - 12432: 0x806F, - 12433: 0x8070, - 12434: 0x8072, - 12435: 0x8073, - 12436: 0x8074, - 12437: 0x8075, - 12438: 0x8076, - 12439: 0x8077, - 12440: 0x8078, - 12441: 0x8079, - 12442: 0x807A, - 12443: 0x807B, - 12444: 0x807C, - 12445: 0x807D, - 12446: 0x9686, - 12447: 0x5784, - 12448: 0x62E2, - 12449: 0x9647, - 12450: 0x697C, - 12451: 0x5A04, - 12452: 0x6402, - 12453: 0x7BD3, - 12454: 0x6F0F, - 12455: 0x964B, - 12456: 0x82A6, - 12457: 0x5362, - 12458: 0x9885, - 12459: 0x5E90, - 12460: 0x7089, - 12461: 0x63B3, - 12462: 0x5364, - 12463: 0x864F, - 12464: 0x9C81, - 12465: 0x9E93, - 12466: 0x788C, - 12467: 0x9732, - 12468: 0x8DEF, - 12469: 0x8D42, - 12470: 0x9E7F, - 12471: 0x6F5E, - 12472: 0x7984, - 12473: 0x5F55, - 12474: 0x9646, - 12475: 0x622E, - 12476: 0x9A74, - 12477: 0x5415, - 12478: 0x94DD, - 12479: 0x4FA3, - 12480: 0x65C5, - 12481: 0x5C65, - 12482: 0x5C61, - 12483: 0x7F15, - 12484: 0x8651, - 12485: 0x6C2F, - 12486: 0x5F8B, - 12487: 0x7387, - 12488: 0x6EE4, - 12489: 0x7EFF, - 12490: 0x5CE6, - 12491: 0x631B, - 12492: 0x5B6A, - 12493: 0x6EE6, - 12494: 0x5375, - 12495: 0x4E71, - 12496: 0x63A0, - 12497: 0x7565, - 12498: 0x62A1, - 12499: 0x8F6E, - 12500: 0x4F26, - 12501: 0x4ED1, - 12502: 0x6CA6, - 12503: 0x7EB6, - 12504: 0x8BBA, - 12505: 0x841D, - 12506: 0x87BA, - 12507: 0x7F57, - 12508: 0x903B, - 12509: 0x9523, - 12510: 0x7BA9, - 12511: 0x9AA1, - 12512: 0x88F8, - 12513: 0x843D, - 12514: 0x6D1B, - 12515: 0x9A86, - 12516: 0x7EDC, - 12517: 0x5988, - 12518: 0x9EBB, - 12519: 0x739B, - 12520: 0x7801, - 12521: 0x8682, - 12522: 0x9A6C, - 12523: 0x9A82, - 12524: 0x561B, - 12525: 0x5417, - 12526: 0x57CB, - 12527: 0x4E70, - 12528: 0x9EA6, - 12529: 0x5356, - 12530: 0x8FC8, - 12531: 0x8109, - 12532: 0x7792, - 12533: 0x9992, - 12534: 0x86EE, - 12535: 0x6EE1, - 12536: 0x8513, - 12537: 0x66FC, - 12538: 0x6162, - 12539: 0x6F2B, - 12540: 0x807E, - 12541: 0x8081, - 12542: 0x8082, - 12543: 0x8085, - 12544: 0x8088, - 12545: 0x808A, - 12546: 0x808D, - 12547: 0x808E, - 12548: 0x808F, - 12549: 0x8090, - 12550: 0x8091, - 12551: 0x8092, - 12552: 0x8094, - 12553: 0x8095, - 12554: 0x8097, - 12555: 0x8099, - 12556: 0x809E, - 12557: 0x80A3, - 12558: 0x80A6, - 12559: 0x80A7, - 12560: 0x80A8, - 12561: 0x80AC, - 12562: 0x80B0, - 12563: 0x80B3, - 12564: 0x80B5, - 12565: 0x80B6, - 12566: 0x80B8, - 12567: 0x80B9, - 12568: 0x80BB, - 12569: 0x80C5, - 12570: 0x80C7, - 12571: 0x80C8, - 12572: 0x80C9, - 12573: 0x80CA, - 12574: 0x80CB, - 12575: 0x80CF, - 12576: 0x80D0, - 12577: 0x80D1, - 12578: 0x80D2, - 12579: 0x80D3, - 12580: 0x80D4, - 12581: 0x80D5, - 12582: 0x80D8, - 12583: 0x80DF, - 12584: 0x80E0, - 12585: 0x80E2, - 12586: 0x80E3, - 12587: 0x80E6, - 12588: 0x80EE, - 12589: 0x80F5, - 12590: 0x80F7, - 12591: 0x80F9, - 12592: 0x80FB, - 12593: 0x80FE, - 12594: 0x80FF, - 12595: 0x8100, - 12596: 0x8101, - 12597: 0x8103, - 12598: 0x8104, - 12599: 0x8105, - 12600: 0x8107, - 12601: 0x8108, - 12602: 0x810B, - 12603: 0x810C, - 12604: 0x8115, - 12605: 0x8117, - 12606: 0x8119, - 12607: 0x811B, - 12608: 0x811C, - 12609: 0x811D, - 12610: 0x811F, - 12611: 0x8120, - 12612: 0x8121, - 12613: 0x8122, - 12614: 0x8123, - 12615: 0x8124, - 12616: 0x8125, - 12617: 0x8126, - 12618: 0x8127, - 12619: 0x8128, - 12620: 0x8129, - 12621: 0x812A, - 12622: 0x812B, - 12623: 0x812D, - 12624: 0x812E, - 12625: 0x8130, - 12626: 0x8133, - 12627: 0x8134, - 12628: 0x8135, - 12629: 0x8137, - 12630: 0x8139, - 12631: 0x813A, - 12632: 0x813B, - 12633: 0x813C, - 12634: 0x813D, - 12635: 0x813F, - 12636: 0x8C29, - 12637: 0x8292, - 12638: 0x832B, - 12639: 0x76F2, - 12640: 0x6C13, - 12641: 0x5FD9, - 12642: 0x83BD, - 12643: 0x732B, - 12644: 0x8305, - 12645: 0x951A, - 12646: 0x6BDB, - 12647: 0x77DB, - 12648: 0x94C6, - 12649: 0x536F, - 12650: 0x8302, - 12651: 0x5192, - 12652: 0x5E3D, - 12653: 0x8C8C, - 12654: 0x8D38, - 12655: 0x4E48, - 12656: 0x73AB, - 12657: 0x679A, - 12658: 0x6885, - 12659: 0x9176, - 12660: 0x9709, - 12661: 0x7164, - 12662: 0x6CA1, - 12663: 0x7709, - 12664: 0x5A92, - 12665: 0x9541, - 12666: 0x6BCF, - 12667: 0x7F8E, - 12668: 0x6627, - 12669: 0x5BD0, - 12670: 0x59B9, - 12671: 0x5A9A, - 12672: 0x95E8, - 12673: 0x95F7, - 12674: 0x4EEC, - 12675: 0x840C, - 12676: 0x8499, - 12677: 0x6AAC, - 12678: 0x76DF, - 12679: 0x9530, - 12680: 0x731B, - 12681: 0x68A6, - 12682: 0x5B5F, - 12683: 0x772F, - 12684: 0x919A, - 12685: 0x9761, - 12686: 0x7CDC, - 12687: 0x8FF7, - 12688: 0x8C1C, - 12689: 0x5F25, - 12690: 0x7C73, - 12691: 0x79D8, - 12692: 0x89C5, - 12693: 0x6CCC, - 12694: 0x871C, - 12695: 0x5BC6, - 12696: 0x5E42, - 12697: 0x68C9, - 12698: 0x7720, - 12699: 0x7EF5, - 12700: 0x5195, - 12701: 0x514D, - 12702: 0x52C9, - 12703: 0x5A29, - 12704: 0x7F05, - 12705: 0x9762, - 12706: 0x82D7, - 12707: 0x63CF, - 12708: 0x7784, - 12709: 0x85D0, - 12710: 0x79D2, - 12711: 0x6E3A, - 12712: 0x5E99, - 12713: 0x5999, - 12714: 0x8511, - 12715: 0x706D, - 12716: 0x6C11, - 12717: 0x62BF, - 12718: 0x76BF, - 12719: 0x654F, - 12720: 0x60AF, - 12721: 0x95FD, - 12722: 0x660E, - 12723: 0x879F, - 12724: 0x9E23, - 12725: 0x94ED, - 12726: 0x540D, - 12727: 0x547D, - 12728: 0x8C2C, - 12729: 0x6478, - 12730: 0x8140, - 12731: 0x8141, - 12732: 0x8142, - 12733: 0x8143, - 12734: 0x8144, - 12735: 0x8145, - 12736: 0x8147, - 12737: 0x8149, - 12738: 0x814D, - 12739: 0x814E, - 12740: 0x814F, - 12741: 0x8152, - 12742: 0x8156, - 12743: 0x8157, - 12744: 0x8158, - 12745: 0x815B, - 12746: 0x815C, - 12747: 0x815D, - 12748: 0x815E, - 12749: 0x815F, - 12750: 0x8161, - 12751: 0x8162, - 12752: 0x8163, - 12753: 0x8164, - 12754: 0x8166, - 12755: 0x8168, - 12756: 0x816A, - 12757: 0x816B, - 12758: 0x816C, - 12759: 0x816F, - 12760: 0x8172, - 12761: 0x8173, - 12762: 0x8175, - 12763: 0x8176, - 12764: 0x8177, - 12765: 0x8178, - 12766: 0x8181, - 12767: 0x8183, - 12768: 0x8184, - 12769: 0x8185, - 12770: 0x8186, - 12771: 0x8187, - 12772: 0x8189, - 12773: 0x818B, - 12774: 0x818C, - 12775: 0x818D, - 12776: 0x818E, - 12777: 0x8190, - 12778: 0x8192, - 12779: 0x8193, - 12780: 0x8194, - 12781: 0x8195, - 12782: 0x8196, - 12783: 0x8197, - 12784: 0x8199, - 12785: 0x819A, - 12786: 0x819E, - 12787: 0x819F, - 12788: 0x81A0, - 12789: 0x81A1, - 12790: 0x81A2, - 12791: 0x81A4, - 12792: 0x81A5, - 12793: 0x81A7, - 12794: 0x81A9, - 12795: 0x81AB, - 12796: 0x81AC, - 12797: 0x81AD, - 12798: 0x81AE, - 12799: 0x81AF, - 12800: 0x81B0, - 12801: 0x81B1, - 12802: 0x81B2, - 12803: 0x81B4, - 12804: 0x81B5, - 12805: 0x81B6, - 12806: 0x81B7, - 12807: 0x81B8, - 12808: 0x81B9, - 12809: 0x81BC, - 12810: 0x81BD, - 12811: 0x81BE, - 12812: 0x81BF, - 12813: 0x81C4, - 12814: 0x81C5, - 12815: 0x81C7, - 12816: 0x81C8, - 12817: 0x81C9, - 12818: 0x81CB, - 12819: 0x81CD, - 12820: 0x81CE, - 12821: 0x81CF, - 12822: 0x81D0, - 12823: 0x81D1, - 12824: 0x81D2, - 12825: 0x81D3, - 12826: 0x6479, - 12827: 0x8611, - 12828: 0x6A21, - 12829: 0x819C, - 12830: 0x78E8, - 12831: 0x6469, - 12832: 0x9B54, - 12833: 0x62B9, - 12834: 0x672B, - 12835: 0x83AB, - 12836: 0x58A8, - 12837: 0x9ED8, - 12838: 0x6CAB, - 12839: 0x6F20, - 12840: 0x5BDE, - 12841: 0x964C, - 12842: 0x8C0B, - 12843: 0x725F, - 12844: 0x67D0, - 12845: 0x62C7, - 12846: 0x7261, - 12847: 0x4EA9, - 12848: 0x59C6, - 12849: 0x6BCD, - 12850: 0x5893, - 12851: 0x66AE, - 12852: 0x5E55, - 12853: 0x52DF, - 12854: 0x6155, - 12855: 0x6728, - 12856: 0x76EE, - 12857: 0x7766, - 12858: 0x7267, - 12859: 0x7A46, - 12860: 0x62FF, - 12861: 0x54EA, - 12862: 0x5450, - 12863: 0x94A0, - 12864: 0x90A3, - 12865: 0x5A1C, - 12866: 0x7EB3, - 12867: 0x6C16, - 12868: 0x4E43, - 12869: 0x5976, - 12870: 0x8010, - 12871: 0x5948, - 12872: 0x5357, - 12873: 0x7537, - 12874: 0x96BE, - 12875: 0x56CA, - 12876: 0x6320, - 12877: 0x8111, - 12878: 0x607C, - 12879: 0x95F9, - 12880: 0x6DD6, - 12881: 0x5462, - 12882: 0x9981, - 12883: 0x5185, - 12884: 0x5AE9, - 12885: 0x80FD, - 12886: 0x59AE, - 12887: 0x9713, - 12888: 0x502A, - 12889: 0x6CE5, - 12890: 0x5C3C, - 12891: 0x62DF, - 12892: 0x4F60, - 12893: 0x533F, - 12894: 0x817B, - 12895: 0x9006, - 12896: 0x6EBA, - 12897: 0x852B, - 12898: 0x62C8, - 12899: 0x5E74, - 12900: 0x78BE, - 12901: 0x64B5, - 12902: 0x637B, - 12903: 0x5FF5, - 12904: 0x5A18, - 12905: 0x917F, - 12906: 0x9E1F, - 12907: 0x5C3F, - 12908: 0x634F, - 12909: 0x8042, - 12910: 0x5B7D, - 12911: 0x556E, - 12912: 0x954A, - 12913: 0x954D, - 12914: 0x6D85, - 12915: 0x60A8, - 12916: 0x67E0, - 12917: 0x72DE, - 12918: 0x51DD, - 12919: 0x5B81, - 12920: 0x81D4, - 12921: 0x81D5, - 12922: 0x81D6, - 12923: 0x81D7, - 12924: 0x81D8, - 12925: 0x81D9, - 12926: 0x81DA, - 12927: 0x81DB, - 12928: 0x81DC, - 12929: 0x81DD, - 12930: 0x81DE, - 12931: 0x81DF, - 12932: 0x81E0, - 12933: 0x81E1, - 12934: 0x81E2, - 12935: 0x81E4, - 12936: 0x81E5, - 12937: 0x81E6, - 12938: 0x81E8, - 12939: 0x81E9, - 12940: 0x81EB, - 12941: 0x81EE, - 12942: 0x81EF, - 12943: 0x81F0, - 12944: 0x81F1, - 12945: 0x81F2, - 12946: 0x81F5, - 12947: 0x81F6, - 12948: 0x81F7, - 12949: 0x81F8, - 12950: 0x81F9, - 12951: 0x81FA, - 12952: 0x81FD, - 12953: 0x81FF, - 12954: 0x8203, - 12955: 0x8207, - 12956: 0x8208, - 12957: 0x8209, - 12958: 0x820A, - 12959: 0x820B, - 12960: 0x820E, - 12961: 0x820F, - 12962: 0x8211, - 12963: 0x8213, - 12964: 0x8215, - 12965: 0x8216, - 12966: 0x8217, - 12967: 0x8218, - 12968: 0x8219, - 12969: 0x821A, - 12970: 0x821D, - 12971: 0x8220, - 12972: 0x8224, - 12973: 0x8225, - 12974: 0x8226, - 12975: 0x8227, - 12976: 0x8229, - 12977: 0x822E, - 12978: 0x8232, - 12979: 0x823A, - 12980: 0x823C, - 12981: 0x823D, - 12982: 0x823F, - 12983: 0x8240, - 12984: 0x8241, - 12985: 0x8242, - 12986: 0x8243, - 12987: 0x8245, - 12988: 0x8246, - 12989: 0x8248, - 12990: 0x824A, - 12991: 0x824C, - 12992: 0x824D, - 12993: 0x824E, - 12994: 0x8250, - 12995: 0x8251, - 12996: 0x8252, - 12997: 0x8253, - 12998: 0x8254, - 12999: 0x8255, - 13000: 0x8256, - 13001: 0x8257, - 13002: 0x8259, - 13003: 0x825B, - 13004: 0x825C, - 13005: 0x825D, - 13006: 0x825E, - 13007: 0x8260, - 13008: 0x8261, - 13009: 0x8262, - 13010: 0x8263, - 13011: 0x8264, - 13012: 0x8265, - 13013: 0x8266, - 13014: 0x8267, - 13015: 0x8269, - 13016: 0x62E7, - 13017: 0x6CDE, - 13018: 0x725B, - 13019: 0x626D, - 13020: 0x94AE, - 13021: 0x7EBD, - 13022: 0x8113, - 13023: 0x6D53, - 13024: 0x519C, - 13025: 0x5F04, - 13026: 0x5974, - 13027: 0x52AA, - 13028: 0x6012, - 13029: 0x5973, - 13030: 0x6696, - 13031: 0x8650, - 13032: 0x759F, - 13033: 0x632A, - 13034: 0x61E6, - 13035: 0x7CEF, - 13036: 0x8BFA, - 13037: 0x54E6, - 13038: 0x6B27, - 13039: 0x9E25, - 13040: 0x6BB4, - 13041: 0x85D5, - 13042: 0x5455, - 13043: 0x5076, - 13044: 0x6CA4, - 13045: 0x556A, - 13046: 0x8DB4, - 13047: 0x722C, - 13048: 0x5E15, - 13049: 0x6015, - 13050: 0x7436, - 13051: 0x62CD, - 13052: 0x6392, - 13053: 0x724C, - 13054: 0x5F98, - 13055: 0x6E43, - 13056: 0x6D3E, - 13057: 0x6500, - 13058: 0x6F58, - 13059: 0x76D8, - 13060: 0x78D0, - 13061: 0x76FC, - 13062: 0x7554, - 13063: 0x5224, - 13064: 0x53DB, - 13065: 0x4E53, - 13066: 0x5E9E, - 13067: 0x65C1, - 13068: 0x802A, - 13069: 0x80D6, - 13070: 0x629B, - 13071: 0x5486, - 13072: 0x5228, - 13073: 0x70AE, - 13074: 0x888D, - 13075: 0x8DD1, - 13076: 0x6CE1, - 13077: 0x5478, - 13078: 0x80DA, - 13079: 0x57F9, - 13080: 0x88F4, - 13081: 0x8D54, - 13082: 0x966A, - 13083: 0x914D, - 13084: 0x4F69, - 13085: 0x6C9B, - 13086: 0x55B7, - 13087: 0x76C6, - 13088: 0x7830, - 13089: 0x62A8, - 13090: 0x70F9, - 13091: 0x6F8E, - 13092: 0x5F6D, - 13093: 0x84EC, - 13094: 0x68DA, - 13095: 0x787C, - 13096: 0x7BF7, - 13097: 0x81A8, - 13098: 0x670B, - 13099: 0x9E4F, - 13100: 0x6367, - 13101: 0x78B0, - 13102: 0x576F, - 13103: 0x7812, - 13104: 0x9739, - 13105: 0x6279, - 13106: 0x62AB, - 13107: 0x5288, - 13108: 0x7435, - 13109: 0x6BD7, - 13110: 0x826A, - 13111: 0x826B, - 13112: 0x826C, - 13113: 0x826D, - 13114: 0x8271, - 13115: 0x8275, - 13116: 0x8276, - 13117: 0x8277, - 13118: 0x8278, - 13119: 0x827B, - 13120: 0x827C, - 13121: 0x8280, - 13122: 0x8281, - 13123: 0x8283, - 13124: 0x8285, - 13125: 0x8286, - 13126: 0x8287, - 13127: 0x8289, - 13128: 0x828C, - 13129: 0x8290, - 13130: 0x8293, - 13131: 0x8294, - 13132: 0x8295, - 13133: 0x8296, - 13134: 0x829A, - 13135: 0x829B, - 13136: 0x829E, - 13137: 0x82A0, - 13138: 0x82A2, - 13139: 0x82A3, - 13140: 0x82A7, - 13141: 0x82B2, - 13142: 0x82B5, - 13143: 0x82B6, - 13144: 0x82BA, - 13145: 0x82BB, - 13146: 0x82BC, - 13147: 0x82BF, - 13148: 0x82C0, - 13149: 0x82C2, - 13150: 0x82C3, - 13151: 0x82C5, - 13152: 0x82C6, - 13153: 0x82C9, - 13154: 0x82D0, - 13155: 0x82D6, - 13156: 0x82D9, - 13157: 0x82DA, - 13158: 0x82DD, - 13159: 0x82E2, - 13160: 0x82E7, - 13161: 0x82E8, - 13162: 0x82E9, - 13163: 0x82EA, - 13164: 0x82EC, - 13165: 0x82ED, - 13166: 0x82EE, - 13167: 0x82F0, - 13168: 0x82F2, - 13169: 0x82F3, - 13170: 0x82F5, - 13171: 0x82F6, - 13172: 0x82F8, - 13173: 0x82FA, - 13174: 0x82FC, - 13175: 0x82FD, - 13176: 0x82FE, - 13177: 0x82FF, - 13178: 0x8300, - 13179: 0x830A, - 13180: 0x830B, - 13181: 0x830D, - 13182: 0x8310, - 13183: 0x8312, - 13184: 0x8313, - 13185: 0x8316, - 13186: 0x8318, - 13187: 0x8319, - 13188: 0x831D, - 13189: 0x831E, - 13190: 0x831F, - 13191: 0x8320, - 13192: 0x8321, - 13193: 0x8322, - 13194: 0x8323, - 13195: 0x8324, - 13196: 0x8325, - 13197: 0x8326, - 13198: 0x8329, - 13199: 0x832A, - 13200: 0x832E, - 13201: 0x8330, - 13202: 0x8332, - 13203: 0x8337, - 13204: 0x833B, - 13205: 0x833D, - 13206: 0x5564, - 13207: 0x813E, - 13208: 0x75B2, - 13209: 0x76AE, - 13210: 0x5339, - 13211: 0x75DE, - 13212: 0x50FB, - 13213: 0x5C41, - 13214: 0x8B6C, - 13215: 0x7BC7, - 13216: 0x504F, - 13217: 0x7247, - 13218: 0x9A97, - 13219: 0x98D8, - 13220: 0x6F02, - 13221: 0x74E2, - 13222: 0x7968, - 13223: 0x6487, - 13224: 0x77A5, - 13225: 0x62FC, - 13226: 0x9891, - 13227: 0x8D2B, - 13228: 0x54C1, - 13229: 0x8058, - 13230: 0x4E52, - 13231: 0x576A, - 13232: 0x82F9, - 13233: 0x840D, - 13234: 0x5E73, - 13235: 0x51ED, - 13236: 0x74F6, - 13237: 0x8BC4, - 13238: 0x5C4F, - 13239: 0x5761, - 13240: 0x6CFC, - 13241: 0x9887, - 13242: 0x5A46, - 13243: 0x7834, - 13244: 0x9B44, - 13245: 0x8FEB, - 13246: 0x7C95, - 13247: 0x5256, - 13248: 0x6251, - 13249: 0x94FA, - 13250: 0x4EC6, - 13251: 0x8386, - 13252: 0x8461, - 13253: 0x83E9, - 13254: 0x84B2, - 13255: 0x57D4, - 13256: 0x6734, - 13257: 0x5703, - 13258: 0x666E, - 13259: 0x6D66, - 13260: 0x8C31, - 13261: 0x66DD, - 13262: 0x7011, - 13263: 0x671F, - 13264: 0x6B3A, - 13265: 0x6816, - 13266: 0x621A, - 13267: 0x59BB, - 13268: 0x4E03, - 13269: 0x51C4, - 13270: 0x6F06, - 13271: 0x67D2, - 13272: 0x6C8F, - 13273: 0x5176, - 13274: 0x68CB, - 13275: 0x5947, - 13276: 0x6B67, - 13277: 0x7566, - 13278: 0x5D0E, - 13279: 0x8110, - 13280: 0x9F50, - 13281: 0x65D7, - 13282: 0x7948, - 13283: 0x7941, - 13284: 0x9A91, - 13285: 0x8D77, - 13286: 0x5C82, - 13287: 0x4E5E, - 13288: 0x4F01, - 13289: 0x542F, - 13290: 0x5951, - 13291: 0x780C, - 13292: 0x5668, - 13293: 0x6C14, - 13294: 0x8FC4, - 13295: 0x5F03, - 13296: 0x6C7D, - 13297: 0x6CE3, - 13298: 0x8BAB, - 13299: 0x6390, - 13300: 0x833E, - 13301: 0x833F, - 13302: 0x8341, - 13303: 0x8342, - 13304: 0x8344, - 13305: 0x8345, - 13306: 0x8348, - 13307: 0x834A, - 13308: 0x834B, - 13309: 0x834C, - 13310: 0x834D, - 13311: 0x834E, - 13312: 0x8353, - 13313: 0x8355, - 13314: 0x8356, - 13315: 0x8357, - 13316: 0x8358, - 13317: 0x8359, - 13318: 0x835D, - 13319: 0x8362, - 13320: 0x8370, - 13321: 0x8371, - 13322: 0x8372, - 13323: 0x8373, - 13324: 0x8374, - 13325: 0x8375, - 13326: 0x8376, - 13327: 0x8379, - 13328: 0x837A, - 13329: 0x837E, - 13330: 0x837F, - 13331: 0x8380, - 13332: 0x8381, - 13333: 0x8382, - 13334: 0x8383, - 13335: 0x8384, - 13336: 0x8387, - 13337: 0x8388, - 13338: 0x838A, - 13339: 0x838B, - 13340: 0x838C, - 13341: 0x838D, - 13342: 0x838F, - 13343: 0x8390, - 13344: 0x8391, - 13345: 0x8394, - 13346: 0x8395, - 13347: 0x8396, - 13348: 0x8397, - 13349: 0x8399, - 13350: 0x839A, - 13351: 0x839D, - 13352: 0x839F, - 13353: 0x83A1, - 13354: 0x83A2, - 13355: 0x83A3, - 13356: 0x83A4, - 13357: 0x83A5, - 13358: 0x83A6, - 13359: 0x83A7, - 13360: 0x83AC, - 13361: 0x83AD, - 13362: 0x83AE, - 13363: 0x83AF, - 13364: 0x83B5, - 13365: 0x83BB, - 13366: 0x83BE, - 13367: 0x83BF, - 13368: 0x83C2, - 13369: 0x83C3, - 13370: 0x83C4, - 13371: 0x83C6, - 13372: 0x83C8, - 13373: 0x83C9, - 13374: 0x83CB, - 13375: 0x83CD, - 13376: 0x83CE, - 13377: 0x83D0, - 13378: 0x83D1, - 13379: 0x83D2, - 13380: 0x83D3, - 13381: 0x83D5, - 13382: 0x83D7, - 13383: 0x83D9, - 13384: 0x83DA, - 13385: 0x83DB, - 13386: 0x83DE, - 13387: 0x83E2, - 13388: 0x83E3, - 13389: 0x83E4, - 13390: 0x83E6, - 13391: 0x83E7, - 13392: 0x83E8, - 13393: 0x83EB, - 13394: 0x83EC, - 13395: 0x83ED, - 13396: 0x6070, - 13397: 0x6D3D, - 13398: 0x7275, - 13399: 0x6266, - 13400: 0x948E, - 13401: 0x94C5, - 13402: 0x5343, - 13403: 0x8FC1, - 13404: 0x7B7E, - 13405: 0x4EDF, - 13406: 0x8C26, - 13407: 0x4E7E, - 13408: 0x9ED4, - 13409: 0x94B1, - 13410: 0x94B3, - 13411: 0x524D, - 13412: 0x6F5C, - 13413: 0x9063, - 13414: 0x6D45, - 13415: 0x8C34, - 13416: 0x5811, - 13417: 0x5D4C, - 13418: 0x6B20, - 13419: 0x6B49, - 13420: 0x67AA, - 13421: 0x545B, - 13422: 0x8154, - 13423: 0x7F8C, - 13424: 0x5899, - 13425: 0x8537, - 13426: 0x5F3A, - 13427: 0x62A2, - 13428: 0x6A47, - 13429: 0x9539, - 13430: 0x6572, - 13431: 0x6084, - 13432: 0x6865, - 13433: 0x77A7, - 13434: 0x4E54, - 13435: 0x4FA8, - 13436: 0x5DE7, - 13437: 0x9798, - 13438: 0x64AC, - 13439: 0x7FD8, - 13440: 0x5CED, - 13441: 0x4FCF, - 13442: 0x7A8D, - 13443: 0x5207, - 13444: 0x8304, - 13445: 0x4E14, - 13446: 0x602F, - 13447: 0x7A83, - 13448: 0x94A6, - 13449: 0x4FB5, - 13450: 0x4EB2, - 13451: 0x79E6, - 13452: 0x7434, - 13453: 0x52E4, - 13454: 0x82B9, - 13455: 0x64D2, - 13456: 0x79BD, - 13457: 0x5BDD, - 13458: 0x6C81, - 13459: 0x9752, - 13460: 0x8F7B, - 13461: 0x6C22, - 13462: 0x503E, - 13463: 0x537F, - 13464: 0x6E05, - 13465: 0x64CE, - 13466: 0x6674, - 13467: 0x6C30, - 13468: 0x60C5, - 13469: 0x9877, - 13470: 0x8BF7, - 13471: 0x5E86, - 13472: 0x743C, - 13473: 0x7A77, - 13474: 0x79CB, - 13475: 0x4E18, - 13476: 0x90B1, - 13477: 0x7403, - 13478: 0x6C42, - 13479: 0x56DA, - 13480: 0x914B, - 13481: 0x6CC5, - 13482: 0x8D8B, - 13483: 0x533A, - 13484: 0x86C6, - 13485: 0x66F2, - 13486: 0x8EAF, - 13487: 0x5C48, - 13488: 0x9A71, - 13489: 0x6E20, - 13490: 0x83EE, - 13491: 0x83EF, - 13492: 0x83F3, - 13493: 0x83F4, - 13494: 0x83F5, - 13495: 0x83F6, - 13496: 0x83F7, - 13497: 0x83FA, - 13498: 0x83FB, - 13499: 0x83FC, - 13500: 0x83FE, - 13501: 0x83FF, - 13502: 0x8400, - 13503: 0x8402, - 13504: 0x8405, - 13505: 0x8407, - 13506: 0x8408, - 13507: 0x8409, - 13508: 0x840A, - 13509: 0x8410, - 13510: 0x8412, - 13511: 0x8413, - 13512: 0x8414, - 13513: 0x8415, - 13514: 0x8416, - 13515: 0x8417, - 13516: 0x8419, - 13517: 0x841A, - 13518: 0x841B, - 13519: 0x841E, - 13520: 0x841F, - 13521: 0x8420, - 13522: 0x8421, - 13523: 0x8422, - 13524: 0x8423, - 13525: 0x8429, - 13526: 0x842A, - 13527: 0x842B, - 13528: 0x842C, - 13529: 0x842D, - 13530: 0x842E, - 13531: 0x842F, - 13532: 0x8430, - 13533: 0x8432, - 13534: 0x8433, - 13535: 0x8434, - 13536: 0x8435, - 13537: 0x8436, - 13538: 0x8437, - 13539: 0x8439, - 13540: 0x843A, - 13541: 0x843B, - 13542: 0x843E, - 13543: 0x843F, - 13544: 0x8440, - 13545: 0x8441, - 13546: 0x8442, - 13547: 0x8443, - 13548: 0x8444, - 13549: 0x8445, - 13550: 0x8447, - 13551: 0x8448, - 13552: 0x8449, - 13553: 0x844A, - 13554: 0x844B, - 13555: 0x844C, - 13556: 0x844D, - 13557: 0x844E, - 13558: 0x844F, - 13559: 0x8450, - 13560: 0x8452, - 13561: 0x8453, - 13562: 0x8454, - 13563: 0x8455, - 13564: 0x8456, - 13565: 0x8458, - 13566: 0x845D, - 13567: 0x845E, - 13568: 0x845F, - 13569: 0x8460, - 13570: 0x8462, - 13571: 0x8464, - 13572: 0x8465, - 13573: 0x8466, - 13574: 0x8467, - 13575: 0x8468, - 13576: 0x846A, - 13577: 0x846E, - 13578: 0x846F, - 13579: 0x8470, - 13580: 0x8472, - 13581: 0x8474, - 13582: 0x8477, - 13583: 0x8479, - 13584: 0x847B, - 13585: 0x847C, - 13586: 0x53D6, - 13587: 0x5A36, - 13588: 0x9F8B, - 13589: 0x8DA3, - 13590: 0x53BB, - 13591: 0x5708, - 13592: 0x98A7, - 13593: 0x6743, - 13594: 0x919B, - 13595: 0x6CC9, - 13596: 0x5168, - 13597: 0x75CA, - 13598: 0x62F3, - 13599: 0x72AC, - 13600: 0x5238, - 13601: 0x529D, - 13602: 0x7F3A, - 13603: 0x7094, - 13604: 0x7638, - 13605: 0x5374, - 13606: 0x9E4A, - 13607: 0x69B7, - 13608: 0x786E, - 13609: 0x96C0, - 13610: 0x88D9, - 13611: 0x7FA4, - 13612: 0x7136, - 13613: 0x71C3, - 13614: 0x5189, - 13615: 0x67D3, - 13616: 0x74E4, - 13617: 0x58E4, - 13618: 0x6518, - 13619: 0x56B7, - 13620: 0x8BA9, - 13621: 0x9976, - 13622: 0x6270, - 13623: 0x7ED5, - 13624: 0x60F9, - 13625: 0x70ED, - 13626: 0x58EC, - 13627: 0x4EC1, - 13628: 0x4EBA, - 13629: 0x5FCD, - 13630: 0x97E7, - 13631: 0x4EFB, - 13632: 0x8BA4, - 13633: 0x5203, - 13634: 0x598A, - 13635: 0x7EAB, - 13636: 0x6254, - 13637: 0x4ECD, - 13638: 0x65E5, - 13639: 0x620E, - 13640: 0x8338, - 13641: 0x84C9, - 13642: 0x8363, - 13643: 0x878D, - 13644: 0x7194, - 13645: 0x6EB6, - 13646: 0x5BB9, - 13647: 0x7ED2, - 13648: 0x5197, - 13649: 0x63C9, - 13650: 0x67D4, - 13651: 0x8089, - 13652: 0x8339, - 13653: 0x8815, - 13654: 0x5112, - 13655: 0x5B7A, - 13656: 0x5982, - 13657: 0x8FB1, - 13658: 0x4E73, - 13659: 0x6C5D, - 13660: 0x5165, - 13661: 0x8925, - 13662: 0x8F6F, - 13663: 0x962E, - 13664: 0x854A, - 13665: 0x745E, - 13666: 0x9510, - 13667: 0x95F0, - 13668: 0x6DA6, - 13669: 0x82E5, - 13670: 0x5F31, - 13671: 0x6492, - 13672: 0x6D12, - 13673: 0x8428, - 13674: 0x816E, - 13675: 0x9CC3, - 13676: 0x585E, - 13677: 0x8D5B, - 13678: 0x4E09, - 13679: 0x53C1, - 13680: 0x847D, - 13681: 0x847E, - 13682: 0x847F, - 13683: 0x8480, - 13684: 0x8481, - 13685: 0x8483, - 13686: 0x8484, - 13687: 0x8485, - 13688: 0x8486, - 13689: 0x848A, - 13690: 0x848D, - 13691: 0x848F, - 13692: 0x8490, - 13693: 0x8491, - 13694: 0x8492, - 13695: 0x8493, - 13696: 0x8494, - 13697: 0x8495, - 13698: 0x8496, - 13699: 0x8498, - 13700: 0x849A, - 13701: 0x849B, - 13702: 0x849D, - 13703: 0x849E, - 13704: 0x849F, - 13705: 0x84A0, - 13706: 0x84A2, - 13707: 0x84A3, - 13708: 0x84A4, - 13709: 0x84A5, - 13710: 0x84A6, - 13711: 0x84A7, - 13712: 0x84A8, - 13713: 0x84A9, - 13714: 0x84AA, - 13715: 0x84AB, - 13716: 0x84AC, - 13717: 0x84AD, - 13718: 0x84AE, - 13719: 0x84B0, - 13720: 0x84B1, - 13721: 0x84B3, - 13722: 0x84B5, - 13723: 0x84B6, - 13724: 0x84B7, - 13725: 0x84BB, - 13726: 0x84BC, - 13727: 0x84BE, - 13728: 0x84C0, - 13729: 0x84C2, - 13730: 0x84C3, - 13731: 0x84C5, - 13732: 0x84C6, - 13733: 0x84C7, - 13734: 0x84C8, - 13735: 0x84CB, - 13736: 0x84CC, - 13737: 0x84CE, - 13738: 0x84CF, - 13739: 0x84D2, - 13740: 0x84D4, - 13741: 0x84D5, - 13742: 0x84D7, - 13743: 0x84D8, - 13744: 0x84D9, - 13745: 0x84DA, - 13746: 0x84DB, - 13747: 0x84DC, - 13748: 0x84DE, - 13749: 0x84E1, - 13750: 0x84E2, - 13751: 0x84E4, - 13752: 0x84E7, - 13753: 0x84E8, - 13754: 0x84E9, - 13755: 0x84EA, - 13756: 0x84EB, - 13757: 0x84ED, - 13758: 0x84EE, - 13759: 0x84EF, - 13760: 0x84F1, - 13761: 0x84F2, - 13762: 0x84F3, - 13763: 0x84F4, - 13764: 0x84F5, - 13765: 0x84F6, - 13766: 0x84F7, - 13767: 0x84F8, - 13768: 0x84F9, - 13769: 0x84FA, - 13770: 0x84FB, - 13771: 0x84FD, - 13772: 0x84FE, - 13773: 0x8500, - 13774: 0x8501, - 13775: 0x8502, - 13776: 0x4F1E, - 13777: 0x6563, - 13778: 0x6851, - 13779: 0x55D3, - 13780: 0x4E27, - 13781: 0x6414, - 13782: 0x9A9A, - 13783: 0x626B, - 13784: 0x5AC2, - 13785: 0x745F, - 13786: 0x8272, - 13787: 0x6DA9, - 13788: 0x68EE, - 13789: 0x50E7, - 13790: 0x838E, - 13791: 0x7802, - 13792: 0x6740, - 13793: 0x5239, - 13794: 0x6C99, - 13795: 0x7EB1, - 13796: 0x50BB, - 13797: 0x5565, - 13798: 0x715E, - 13799: 0x7B5B, - 13800: 0x6652, - 13801: 0x73CA, - 13802: 0x82EB, - 13803: 0x6749, - 13804: 0x5C71, - 13805: 0x5220, - 13806: 0x717D, - 13807: 0x886B, - 13808: 0x95EA, - 13809: 0x9655, - 13810: 0x64C5, - 13811: 0x8D61, - 13812: 0x81B3, - 13813: 0x5584, - 13814: 0x6C55, - 13815: 0x6247, - 13816: 0x7F2E, - 13817: 0x5892, - 13818: 0x4F24, - 13819: 0x5546, - 13820: 0x8D4F, - 13821: 0x664C, - 13822: 0x4E0A, - 13823: 0x5C1A, - 13824: 0x88F3, - 13825: 0x68A2, - 13826: 0x634E, - 13827: 0x7A0D, - 13828: 0x70E7, - 13829: 0x828D, - 13830: 0x52FA, - 13831: 0x97F6, - 13832: 0x5C11, - 13833: 0x54E8, - 13834: 0x90B5, - 13835: 0x7ECD, - 13836: 0x5962, - 13837: 0x8D4A, - 13838: 0x86C7, - 13839: 0x820C, - 13840: 0x820D, - 13841: 0x8D66, - 13842: 0x6444, - 13843: 0x5C04, - 13844: 0x6151, - 13845: 0x6D89, - 13846: 0x793E, - 13847: 0x8BBE, - 13848: 0x7837, - 13849: 0x7533, - 13850: 0x547B, - 13851: 0x4F38, - 13852: 0x8EAB, - 13853: 0x6DF1, - 13854: 0x5A20, - 13855: 0x7EC5, - 13856: 0x795E, - 13857: 0x6C88, - 13858: 0x5BA1, - 13859: 0x5A76, - 13860: 0x751A, - 13861: 0x80BE, - 13862: 0x614E, - 13863: 0x6E17, - 13864: 0x58F0, - 13865: 0x751F, - 13866: 0x7525, - 13867: 0x7272, - 13868: 0x5347, - 13869: 0x7EF3, - 13870: 0x8503, - 13871: 0x8504, - 13872: 0x8505, - 13873: 0x8506, - 13874: 0x8507, - 13875: 0x8508, - 13876: 0x8509, - 13877: 0x850A, - 13878: 0x850B, - 13879: 0x850D, - 13880: 0x850E, - 13881: 0x850F, - 13882: 0x8510, - 13883: 0x8512, - 13884: 0x8514, - 13885: 0x8515, - 13886: 0x8516, - 13887: 0x8518, - 13888: 0x8519, - 13889: 0x851B, - 13890: 0x851C, - 13891: 0x851D, - 13892: 0x851E, - 13893: 0x8520, - 13894: 0x8522, - 13895: 0x8523, - 13896: 0x8524, - 13897: 0x8525, - 13898: 0x8526, - 13899: 0x8527, - 13900: 0x8528, - 13901: 0x8529, - 13902: 0x852A, - 13903: 0x852D, - 13904: 0x852E, - 13905: 0x852F, - 13906: 0x8530, - 13907: 0x8531, - 13908: 0x8532, - 13909: 0x8533, - 13910: 0x8534, - 13911: 0x8535, - 13912: 0x8536, - 13913: 0x853E, - 13914: 0x853F, - 13915: 0x8540, - 13916: 0x8541, - 13917: 0x8542, - 13918: 0x8544, - 13919: 0x8545, - 13920: 0x8546, - 13921: 0x8547, - 13922: 0x854B, - 13923: 0x854C, - 13924: 0x854D, - 13925: 0x854E, - 13926: 0x854F, - 13927: 0x8550, - 13928: 0x8551, - 13929: 0x8552, - 13930: 0x8553, - 13931: 0x8554, - 13932: 0x8555, - 13933: 0x8557, - 13934: 0x8558, - 13935: 0x855A, - 13936: 0x855B, - 13937: 0x855C, - 13938: 0x855D, - 13939: 0x855F, - 13940: 0x8560, - 13941: 0x8561, - 13942: 0x8562, - 13943: 0x8563, - 13944: 0x8565, - 13945: 0x8566, - 13946: 0x8567, - 13947: 0x8569, - 13948: 0x856A, - 13949: 0x856B, - 13950: 0x856C, - 13951: 0x856D, - 13952: 0x856E, - 13953: 0x856F, - 13954: 0x8570, - 13955: 0x8571, - 13956: 0x8573, - 13957: 0x8575, - 13958: 0x8576, - 13959: 0x8577, - 13960: 0x8578, - 13961: 0x857C, - 13962: 0x857D, - 13963: 0x857F, - 13964: 0x8580, - 13965: 0x8581, - 13966: 0x7701, - 13967: 0x76DB, - 13968: 0x5269, - 13969: 0x80DC, - 13970: 0x5723, - 13971: 0x5E08, - 13972: 0x5931, - 13973: 0x72EE, - 13974: 0x65BD, - 13975: 0x6E7F, - 13976: 0x8BD7, - 13977: 0x5C38, - 13978: 0x8671, - 13979: 0x5341, - 13980: 0x77F3, - 13981: 0x62FE, - 13982: 0x65F6, - 13983: 0x4EC0, - 13984: 0x98DF, - 13985: 0x8680, - 13986: 0x5B9E, - 13987: 0x8BC6, - 13988: 0x53F2, - 13989: 0x77E2, - 13990: 0x4F7F, - 13991: 0x5C4E, - 13992: 0x9A76, - 13993: 0x59CB, - 13994: 0x5F0F, - 13995: 0x793A, - 13996: 0x58EB, - 13997: 0x4E16, - 13998: 0x67FF, - 13999: 0x4E8B, - 14000: 0x62ED, - 14001: 0x8A93, - 14002: 0x901D, - 14003: 0x52BF, - 14004: 0x662F, - 14005: 0x55DC, - 14006: 0x566C, - 14007: 0x9002, - 14008: 0x4ED5, - 14009: 0x4F8D, - 14010: 0x91CA, - 14011: 0x9970, - 14012: 0x6C0F, - 14013: 0x5E02, - 14014: 0x6043, - 14015: 0x5BA4, - 14016: 0x89C6, - 14017: 0x8BD5, - 14018: 0x6536, - 14019: 0x624B, - 14020: 0x9996, - 14021: 0x5B88, - 14022: 0x5BFF, - 14023: 0x6388, - 14024: 0x552E, - 14025: 0x53D7, - 14026: 0x7626, - 14027: 0x517D, - 14028: 0x852C, - 14029: 0x67A2, - 14030: 0x68B3, - 14031: 0x6B8A, - 14032: 0x6292, - 14033: 0x8F93, - 14034: 0x53D4, - 14035: 0x8212, - 14036: 0x6DD1, - 14037: 0x758F, - 14038: 0x4E66, - 14039: 0x8D4E, - 14040: 0x5B70, - 14041: 0x719F, - 14042: 0x85AF, - 14043: 0x6691, - 14044: 0x66D9, - 14045: 0x7F72, - 14046: 0x8700, - 14047: 0x9ECD, - 14048: 0x9F20, - 14049: 0x5C5E, - 14050: 0x672F, - 14051: 0x8FF0, - 14052: 0x6811, - 14053: 0x675F, - 14054: 0x620D, - 14055: 0x7AD6, - 14056: 0x5885, - 14057: 0x5EB6, - 14058: 0x6570, - 14059: 0x6F31, - 14060: 0x8582, - 14061: 0x8583, - 14062: 0x8586, - 14063: 0x8588, - 14064: 0x8589, - 14065: 0x858A, - 14066: 0x858B, - 14067: 0x858C, - 14068: 0x858D, - 14069: 0x858E, - 14070: 0x8590, - 14071: 0x8591, - 14072: 0x8592, - 14073: 0x8593, - 14074: 0x8594, - 14075: 0x8595, - 14076: 0x8596, - 14077: 0x8597, - 14078: 0x8598, - 14079: 0x8599, - 14080: 0x859A, - 14081: 0x859D, - 14082: 0x859E, - 14083: 0x859F, - 14084: 0x85A0, - 14085: 0x85A1, - 14086: 0x85A2, - 14087: 0x85A3, - 14088: 0x85A5, - 14089: 0x85A6, - 14090: 0x85A7, - 14091: 0x85A9, - 14092: 0x85AB, - 14093: 0x85AC, - 14094: 0x85AD, - 14095: 0x85B1, - 14096: 0x85B2, - 14097: 0x85B3, - 14098: 0x85B4, - 14099: 0x85B5, - 14100: 0x85B6, - 14101: 0x85B8, - 14102: 0x85BA, - 14103: 0x85BB, - 14104: 0x85BC, - 14105: 0x85BD, - 14106: 0x85BE, - 14107: 0x85BF, - 14108: 0x85C0, - 14109: 0x85C2, - 14110: 0x85C3, - 14111: 0x85C4, - 14112: 0x85C5, - 14113: 0x85C6, - 14114: 0x85C7, - 14115: 0x85C8, - 14116: 0x85CA, - 14117: 0x85CB, - 14118: 0x85CC, - 14119: 0x85CD, - 14120: 0x85CE, - 14121: 0x85D1, - 14122: 0x85D2, - 14123: 0x85D4, - 14124: 0x85D6, - 14125: 0x85D7, - 14126: 0x85D8, - 14127: 0x85D9, - 14128: 0x85DA, - 14129: 0x85DB, - 14130: 0x85DD, - 14131: 0x85DE, - 14132: 0x85DF, - 14133: 0x85E0, - 14134: 0x85E1, - 14135: 0x85E2, - 14136: 0x85E3, - 14137: 0x85E5, - 14138: 0x85E6, - 14139: 0x85E7, - 14140: 0x85E8, - 14141: 0x85EA, - 14142: 0x85EB, - 14143: 0x85EC, - 14144: 0x85ED, - 14145: 0x85EE, - 14146: 0x85EF, - 14147: 0x85F0, - 14148: 0x85F1, - 14149: 0x85F2, - 14150: 0x85F3, - 14151: 0x85F4, - 14152: 0x85F5, - 14153: 0x85F6, - 14154: 0x85F7, - 14155: 0x85F8, - 14156: 0x6055, - 14157: 0x5237, - 14158: 0x800D, - 14159: 0x6454, - 14160: 0x8870, - 14161: 0x7529, - 14162: 0x5E05, - 14163: 0x6813, - 14164: 0x62F4, - 14165: 0x971C, - 14166: 0x53CC, - 14167: 0x723D, - 14168: 0x8C01, - 14169: 0x6C34, - 14170: 0x7761, - 14171: 0x7A0E, - 14172: 0x542E, - 14173: 0x77AC, - 14174: 0x987A, - 14175: 0x821C, - 14176: 0x8BF4, - 14177: 0x7855, - 14178: 0x6714, - 14179: 0x70C1, - 14180: 0x65AF, - 14181: 0x6495, - 14182: 0x5636, - 14183: 0x601D, - 14184: 0x79C1, - 14185: 0x53F8, - 14186: 0x4E1D, - 14187: 0x6B7B, - 14188: 0x8086, - 14189: 0x5BFA, - 14190: 0x55E3, - 14191: 0x56DB, - 14192: 0x4F3A, - 14193: 0x4F3C, - 14194: 0x9972, - 14195: 0x5DF3, - 14196: 0x677E, - 14197: 0x8038, - 14198: 0x6002, - 14199: 0x9882, - 14200: 0x9001, - 14201: 0x5B8B, - 14202: 0x8BBC, - 14203: 0x8BF5, - 14204: 0x641C, - 14205: 0x8258, - 14206: 0x64DE, - 14207: 0x55FD, - 14208: 0x82CF, - 14209: 0x9165, - 14210: 0x4FD7, - 14211: 0x7D20, - 14212: 0x901F, - 14213: 0x7C9F, - 14214: 0x50F3, - 14215: 0x5851, - 14216: 0x6EAF, - 14217: 0x5BBF, - 14218: 0x8BC9, - 14219: 0x8083, - 14220: 0x9178, - 14221: 0x849C, - 14222: 0x7B97, - 14223: 0x867D, - 14224: 0x968B, - 14225: 0x968F, - 14226: 0x7EE5, - 14227: 0x9AD3, - 14228: 0x788E, - 14229: 0x5C81, - 14230: 0x7A57, - 14231: 0x9042, - 14232: 0x96A7, - 14233: 0x795F, - 14234: 0x5B59, - 14235: 0x635F, - 14236: 0x7B0B, - 14237: 0x84D1, - 14238: 0x68AD, - 14239: 0x5506, - 14240: 0x7F29, - 14241: 0x7410, - 14242: 0x7D22, - 14243: 0x9501, - 14244: 0x6240, - 14245: 0x584C, - 14246: 0x4ED6, - 14247: 0x5B83, - 14248: 0x5979, - 14249: 0x5854, - 14250: 0x85F9, - 14251: 0x85FA, - 14252: 0x85FC, - 14253: 0x85FD, - 14254: 0x85FE, - 14255: 0x8600, - 14256: 0x8601, - 14257: 0x8602, - 14258: 0x8603, - 14259: 0x8604, - 14260: 0x8606, - 14261: 0x8607, - 14262: 0x8608, - 14263: 0x8609, - 14264: 0x860A, - 14265: 0x860B, - 14266: 0x860C, - 14267: 0x860D, - 14268: 0x860E, - 14269: 0x860F, - 14270: 0x8610, - 14271: 0x8612, - 14272: 0x8613, - 14273: 0x8614, - 14274: 0x8615, - 14275: 0x8617, - 14276: 0x8618, - 14277: 0x8619, - 14278: 0x861A, - 14279: 0x861B, - 14280: 0x861C, - 14281: 0x861D, - 14282: 0x861E, - 14283: 0x861F, - 14284: 0x8620, - 14285: 0x8621, - 14286: 0x8622, - 14287: 0x8623, - 14288: 0x8624, - 14289: 0x8625, - 14290: 0x8626, - 14291: 0x8628, - 14292: 0x862A, - 14293: 0x862B, - 14294: 0x862C, - 14295: 0x862D, - 14296: 0x862E, - 14297: 0x862F, - 14298: 0x8630, - 14299: 0x8631, - 14300: 0x8632, - 14301: 0x8633, - 14302: 0x8634, - 14303: 0x8635, - 14304: 0x8636, - 14305: 0x8637, - 14306: 0x8639, - 14307: 0x863A, - 14308: 0x863B, - 14309: 0x863D, - 14310: 0x863E, - 14311: 0x863F, - 14312: 0x8640, - 14313: 0x8641, - 14314: 0x8642, - 14315: 0x8643, - 14316: 0x8644, - 14317: 0x8645, - 14318: 0x8646, - 14319: 0x8647, - 14320: 0x8648, - 14321: 0x8649, - 14322: 0x864A, - 14323: 0x864B, - 14324: 0x864C, - 14325: 0x8652, - 14326: 0x8653, - 14327: 0x8655, - 14328: 0x8656, - 14329: 0x8657, - 14330: 0x8658, - 14331: 0x8659, - 14332: 0x865B, - 14333: 0x865C, - 14334: 0x865D, - 14335: 0x865F, - 14336: 0x8660, - 14337: 0x8661, - 14338: 0x8663, - 14339: 0x8664, - 14340: 0x8665, - 14341: 0x8666, - 14342: 0x8667, - 14343: 0x8668, - 14344: 0x8669, - 14345: 0x866A, - 14346: 0x736D, - 14347: 0x631E, - 14348: 0x8E4B, - 14349: 0x8E0F, - 14350: 0x80CE, - 14351: 0x82D4, - 14352: 0x62AC, - 14353: 0x53F0, - 14354: 0x6CF0, - 14355: 0x915E, - 14356: 0x592A, - 14357: 0x6001, - 14358: 0x6C70, - 14359: 0x574D, - 14360: 0x644A, - 14361: 0x8D2A, - 14362: 0x762B, - 14363: 0x6EE9, - 14364: 0x575B, - 14365: 0x6A80, - 14366: 0x75F0, - 14367: 0x6F6D, - 14368: 0x8C2D, - 14369: 0x8C08, - 14370: 0x5766, - 14371: 0x6BEF, - 14372: 0x8892, - 14373: 0x78B3, - 14374: 0x63A2, - 14375: 0x53F9, - 14376: 0x70AD, - 14377: 0x6C64, - 14378: 0x5858, - 14379: 0x642A, - 14380: 0x5802, - 14381: 0x68E0, - 14382: 0x819B, - 14383: 0x5510, - 14384: 0x7CD6, - 14385: 0x5018, - 14386: 0x8EBA, - 14387: 0x6DCC, - 14388: 0x8D9F, - 14389: 0x70EB, - 14390: 0x638F, - 14391: 0x6D9B, - 14392: 0x6ED4, - 14393: 0x7EE6, - 14394: 0x8404, - 14395: 0x6843, - 14396: 0x9003, - 14397: 0x6DD8, - 14398: 0x9676, - 14399: 0x8BA8, - 14400: 0x5957, - 14401: 0x7279, - 14402: 0x85E4, - 14403: 0x817E, - 14404: 0x75BC, - 14405: 0x8A8A, - 14406: 0x68AF, - 14407: 0x5254, - 14408: 0x8E22, - 14409: 0x9511, - 14410: 0x63D0, - 14411: 0x9898, - 14412: 0x8E44, - 14413: 0x557C, - 14414: 0x4F53, - 14415: 0x66FF, - 14416: 0x568F, - 14417: 0x60D5, - 14418: 0x6D95, - 14419: 0x5243, - 14420: 0x5C49, - 14421: 0x5929, - 14422: 0x6DFB, - 14423: 0x586B, - 14424: 0x7530, - 14425: 0x751C, - 14426: 0x606C, - 14427: 0x8214, - 14428: 0x8146, - 14429: 0x6311, - 14430: 0x6761, - 14431: 0x8FE2, - 14432: 0x773A, - 14433: 0x8DF3, - 14434: 0x8D34, - 14435: 0x94C1, - 14436: 0x5E16, - 14437: 0x5385, - 14438: 0x542C, - 14439: 0x70C3, - 14440: 0x866D, - 14441: 0x866F, - 14442: 0x8670, - 14443: 0x8672, - 14444: 0x8673, - 14445: 0x8674, - 14446: 0x8675, - 14447: 0x8676, - 14448: 0x8677, - 14449: 0x8678, - 14450: 0x8683, - 14451: 0x8684, - 14452: 0x8685, - 14453: 0x8686, - 14454: 0x8687, - 14455: 0x8688, - 14456: 0x8689, - 14457: 0x868E, - 14458: 0x868F, - 14459: 0x8690, - 14460: 0x8691, - 14461: 0x8692, - 14462: 0x8694, - 14463: 0x8696, - 14464: 0x8697, - 14465: 0x8698, - 14466: 0x8699, - 14467: 0x869A, - 14468: 0x869B, - 14469: 0x869E, - 14470: 0x869F, - 14471: 0x86A0, - 14472: 0x86A1, - 14473: 0x86A2, - 14474: 0x86A5, - 14475: 0x86A6, - 14476: 0x86AB, - 14477: 0x86AD, - 14478: 0x86AE, - 14479: 0x86B2, - 14480: 0x86B3, - 14481: 0x86B7, - 14482: 0x86B8, - 14483: 0x86B9, - 14484: 0x86BB, - 14485: 0x86BC, - 14486: 0x86BD, - 14487: 0x86BE, - 14488: 0x86BF, - 14489: 0x86C1, - 14490: 0x86C2, - 14491: 0x86C3, - 14492: 0x86C5, - 14493: 0x86C8, - 14494: 0x86CC, - 14495: 0x86CD, - 14496: 0x86D2, - 14497: 0x86D3, - 14498: 0x86D5, - 14499: 0x86D6, - 14500: 0x86D7, - 14501: 0x86DA, - 14502: 0x86DC, - 14503: 0x86DD, - 14504: 0x86E0, - 14505: 0x86E1, - 14506: 0x86E2, - 14507: 0x86E3, - 14508: 0x86E5, - 14509: 0x86E6, - 14510: 0x86E7, - 14511: 0x86E8, - 14512: 0x86EA, - 14513: 0x86EB, - 14514: 0x86EC, - 14515: 0x86EF, - 14516: 0x86F5, - 14517: 0x86F6, - 14518: 0x86F7, - 14519: 0x86FA, - 14520: 0x86FB, - 14521: 0x86FC, - 14522: 0x86FD, - 14523: 0x86FF, - 14524: 0x8701, - 14525: 0x8704, - 14526: 0x8705, - 14527: 0x8706, - 14528: 0x870B, - 14529: 0x870C, - 14530: 0x870E, - 14531: 0x870F, - 14532: 0x8710, - 14533: 0x8711, - 14534: 0x8714, - 14535: 0x8716, - 14536: 0x6C40, - 14537: 0x5EF7, - 14538: 0x505C, - 14539: 0x4EAD, - 14540: 0x5EAD, - 14541: 0x633A, - 14542: 0x8247, - 14543: 0x901A, - 14544: 0x6850, - 14545: 0x916E, - 14546: 0x77B3, - 14547: 0x540C, - 14548: 0x94DC, - 14549: 0x5F64, - 14550: 0x7AE5, - 14551: 0x6876, - 14552: 0x6345, - 14553: 0x7B52, - 14554: 0x7EDF, - 14555: 0x75DB, - 14556: 0x5077, - 14557: 0x6295, - 14558: 0x5934, - 14559: 0x900F, - 14560: 0x51F8, - 14561: 0x79C3, - 14562: 0x7A81, - 14563: 0x56FE, - 14564: 0x5F92, - 14565: 0x9014, - 14566: 0x6D82, - 14567: 0x5C60, - 14568: 0x571F, - 14569: 0x5410, - 14570: 0x5154, - 14571: 0x6E4D, - 14572: 0x56E2, - 14573: 0x63A8, - 14574: 0x9893, - 14575: 0x817F, - 14576: 0x8715, - 14577: 0x892A, - 14578: 0x9000, - 14579: 0x541E, - 14580: 0x5C6F, - 14581: 0x81C0, - 14582: 0x62D6, - 14583: 0x6258, - 14584: 0x8131, - 14585: 0x9E35, - 14586: 0x9640, - 14587: 0x9A6E, - 14588: 0x9A7C, - 14589: 0x692D, - 14590: 0x59A5, - 14591: 0x62D3, - 14592: 0x553E, - 14593: 0x6316, - 14594: 0x54C7, - 14595: 0x86D9, - 14596: 0x6D3C, - 14597: 0x5A03, - 14598: 0x74E6, - 14599: 0x889C, - 14600: 0x6B6A, - 14601: 0x5916, - 14602: 0x8C4C, - 14603: 0x5F2F, - 14604: 0x6E7E, - 14605: 0x73A9, - 14606: 0x987D, - 14607: 0x4E38, - 14608: 0x70F7, - 14609: 0x5B8C, - 14610: 0x7897, - 14611: 0x633D, - 14612: 0x665A, - 14613: 0x7696, - 14614: 0x60CB, - 14615: 0x5B9B, - 14616: 0x5A49, - 14617: 0x4E07, - 14618: 0x8155, - 14619: 0x6C6A, - 14620: 0x738B, - 14621: 0x4EA1, - 14622: 0x6789, - 14623: 0x7F51, - 14624: 0x5F80, - 14625: 0x65FA, - 14626: 0x671B, - 14627: 0x5FD8, - 14628: 0x5984, - 14629: 0x5A01, - 14630: 0x8719, - 14631: 0x871B, - 14632: 0x871D, - 14633: 0x871F, - 14634: 0x8720, - 14635: 0x8724, - 14636: 0x8726, - 14637: 0x8727, - 14638: 0x8728, - 14639: 0x872A, - 14640: 0x872B, - 14641: 0x872C, - 14642: 0x872D, - 14643: 0x872F, - 14644: 0x8730, - 14645: 0x8732, - 14646: 0x8733, - 14647: 0x8735, - 14648: 0x8736, - 14649: 0x8738, - 14650: 0x8739, - 14651: 0x873A, - 14652: 0x873C, - 14653: 0x873D, - 14654: 0x8740, - 14655: 0x8741, - 14656: 0x8742, - 14657: 0x8743, - 14658: 0x8744, - 14659: 0x8745, - 14660: 0x8746, - 14661: 0x874A, - 14662: 0x874B, - 14663: 0x874D, - 14664: 0x874F, - 14665: 0x8750, - 14666: 0x8751, - 14667: 0x8752, - 14668: 0x8754, - 14669: 0x8755, - 14670: 0x8756, - 14671: 0x8758, - 14672: 0x875A, - 14673: 0x875B, - 14674: 0x875C, - 14675: 0x875D, - 14676: 0x875E, - 14677: 0x875F, - 14678: 0x8761, - 14679: 0x8762, - 14680: 0x8766, - 14681: 0x8767, - 14682: 0x8768, - 14683: 0x8769, - 14684: 0x876A, - 14685: 0x876B, - 14686: 0x876C, - 14687: 0x876D, - 14688: 0x876F, - 14689: 0x8771, - 14690: 0x8772, - 14691: 0x8773, - 14692: 0x8775, - 14693: 0x8777, - 14694: 0x8778, - 14695: 0x8779, - 14696: 0x877A, - 14697: 0x877F, - 14698: 0x8780, - 14699: 0x8781, - 14700: 0x8784, - 14701: 0x8786, - 14702: 0x8787, - 14703: 0x8789, - 14704: 0x878A, - 14705: 0x878C, - 14706: 0x878E, - 14707: 0x878F, - 14708: 0x8790, - 14709: 0x8791, - 14710: 0x8792, - 14711: 0x8794, - 14712: 0x8795, - 14713: 0x8796, - 14714: 0x8798, - 14715: 0x8799, - 14716: 0x879A, - 14717: 0x879B, - 14718: 0x879C, - 14719: 0x879D, - 14720: 0x879E, - 14721: 0x87A0, - 14722: 0x87A1, - 14723: 0x87A2, - 14724: 0x87A3, - 14725: 0x87A4, - 14726: 0x5DCD, - 14727: 0x5FAE, - 14728: 0x5371, - 14729: 0x97E6, - 14730: 0x8FDD, - 14731: 0x6845, - 14732: 0x56F4, - 14733: 0x552F, - 14734: 0x60DF, - 14735: 0x4E3A, - 14736: 0x6F4D, - 14737: 0x7EF4, - 14738: 0x82C7, - 14739: 0x840E, - 14740: 0x59D4, - 14741: 0x4F1F, - 14742: 0x4F2A, - 14743: 0x5C3E, - 14744: 0x7EAC, - 14745: 0x672A, - 14746: 0x851A, - 14747: 0x5473, - 14748: 0x754F, - 14749: 0x80C3, - 14750: 0x5582, - 14751: 0x9B4F, - 14752: 0x4F4D, - 14753: 0x6E2D, - 14754: 0x8C13, - 14755: 0x5C09, - 14756: 0x6170, - 14757: 0x536B, - 14758: 0x761F, - 14759: 0x6E29, - 14760: 0x868A, - 14761: 0x6587, - 14762: 0x95FB, - 14763: 0x7EB9, - 14764: 0x543B, - 14765: 0x7A33, - 14766: 0x7D0A, - 14767: 0x95EE, - 14768: 0x55E1, - 14769: 0x7FC1, - 14770: 0x74EE, - 14771: 0x631D, - 14772: 0x8717, - 14773: 0x6DA1, - 14774: 0x7A9D, - 14775: 0x6211, - 14776: 0x65A1, - 14777: 0x5367, - 14778: 0x63E1, - 14779: 0x6C83, - 14780: 0x5DEB, - 14781: 0x545C, - 14782: 0x94A8, - 14783: 0x4E4C, - 14784: 0x6C61, - 14785: 0x8BEC, - 14786: 0x5C4B, - 14787: 0x65E0, - 14788: 0x829C, - 14789: 0x68A7, - 14790: 0x543E, - 14791: 0x5434, - 14792: 0x6BCB, - 14793: 0x6B66, - 14794: 0x4E94, - 14795: 0x6342, - 14796: 0x5348, - 14797: 0x821E, - 14798: 0x4F0D, - 14799: 0x4FAE, - 14800: 0x575E, - 14801: 0x620A, - 14802: 0x96FE, - 14803: 0x6664, - 14804: 0x7269, - 14805: 0x52FF, - 14806: 0x52A1, - 14807: 0x609F, - 14808: 0x8BEF, - 14809: 0x6614, - 14810: 0x7199, - 14811: 0x6790, - 14812: 0x897F, - 14813: 0x7852, - 14814: 0x77FD, - 14815: 0x6670, - 14816: 0x563B, - 14817: 0x5438, - 14818: 0x9521, - 14819: 0x727A, - 14820: 0x87A5, - 14821: 0x87A6, - 14822: 0x87A7, - 14823: 0x87A9, - 14824: 0x87AA, - 14825: 0x87AE, - 14826: 0x87B0, - 14827: 0x87B1, - 14828: 0x87B2, - 14829: 0x87B4, - 14830: 0x87B6, - 14831: 0x87B7, - 14832: 0x87B8, - 14833: 0x87B9, - 14834: 0x87BB, - 14835: 0x87BC, - 14836: 0x87BE, - 14837: 0x87BF, - 14838: 0x87C1, - 14839: 0x87C2, - 14840: 0x87C3, - 14841: 0x87C4, - 14842: 0x87C5, - 14843: 0x87C7, - 14844: 0x87C8, - 14845: 0x87C9, - 14846: 0x87CC, - 14847: 0x87CD, - 14848: 0x87CE, - 14849: 0x87CF, - 14850: 0x87D0, - 14851: 0x87D4, - 14852: 0x87D5, - 14853: 0x87D6, - 14854: 0x87D7, - 14855: 0x87D8, - 14856: 0x87D9, - 14857: 0x87DA, - 14858: 0x87DC, - 14859: 0x87DD, - 14860: 0x87DE, - 14861: 0x87DF, - 14862: 0x87E1, - 14863: 0x87E2, - 14864: 0x87E3, - 14865: 0x87E4, - 14866: 0x87E6, - 14867: 0x87E7, - 14868: 0x87E8, - 14869: 0x87E9, - 14870: 0x87EB, - 14871: 0x87EC, - 14872: 0x87ED, - 14873: 0x87EF, - 14874: 0x87F0, - 14875: 0x87F1, - 14876: 0x87F2, - 14877: 0x87F3, - 14878: 0x87F4, - 14879: 0x87F5, - 14880: 0x87F6, - 14881: 0x87F7, - 14882: 0x87F8, - 14883: 0x87FA, - 14884: 0x87FB, - 14885: 0x87FC, - 14886: 0x87FD, - 14887: 0x87FF, - 14888: 0x8800, - 14889: 0x8801, - 14890: 0x8802, - 14891: 0x8804, - 14892: 0x8805, - 14893: 0x8806, - 14894: 0x8807, - 14895: 0x8808, - 14896: 0x8809, - 14897: 0x880B, - 14898: 0x880C, - 14899: 0x880D, - 14900: 0x880E, - 14901: 0x880F, - 14902: 0x8810, - 14903: 0x8811, - 14904: 0x8812, - 14905: 0x8814, - 14906: 0x8817, - 14907: 0x8818, - 14908: 0x8819, - 14909: 0x881A, - 14910: 0x881C, - 14911: 0x881D, - 14912: 0x881E, - 14913: 0x881F, - 14914: 0x8820, - 14915: 0x8823, - 14916: 0x7A00, - 14917: 0x606F, - 14918: 0x5E0C, - 14919: 0x6089, - 14920: 0x819D, - 14921: 0x5915, - 14922: 0x60DC, - 14923: 0x7184, - 14924: 0x70EF, - 14925: 0x6EAA, - 14926: 0x6C50, - 14927: 0x7280, - 14928: 0x6A84, - 14929: 0x88AD, - 14930: 0x5E2D, - 14931: 0x4E60, - 14932: 0x5AB3, - 14933: 0x559C, - 14934: 0x94E3, - 14935: 0x6D17, - 14936: 0x7CFB, - 14937: 0x9699, - 14938: 0x620F, - 14939: 0x7EC6, - 14940: 0x778E, - 14941: 0x867E, - 14942: 0x5323, - 14943: 0x971E, - 14944: 0x8F96, - 14945: 0x6687, - 14946: 0x5CE1, - 14947: 0x4FA0, - 14948: 0x72ED, - 14949: 0x4E0B, - 14950: 0x53A6, - 14951: 0x590F, - 14952: 0x5413, - 14953: 0x6380, - 14954: 0x9528, - 14955: 0x5148, - 14956: 0x4ED9, - 14957: 0x9C9C, - 14958: 0x7EA4, - 14959: 0x54B8, - 14960: 0x8D24, - 14961: 0x8854, - 14962: 0x8237, - 14963: 0x95F2, - 14964: 0x6D8E, - 14965: 0x5F26, - 14966: 0x5ACC, - 14967: 0x663E, - 14968: 0x9669, - 14969: 0x73B0, - 14970: 0x732E, - 14971: 0x53BF, - 14972: 0x817A, - 14973: 0x9985, - 14974: 0x7FA1, - 14975: 0x5BAA, - 14976: 0x9677, - 14977: 0x9650, - 14978: 0x7EBF, - 14979: 0x76F8, - 14980: 0x53A2, - 14981: 0x9576, - 14982: 0x9999, - 14983: 0x7BB1, - 14984: 0x8944, - 14985: 0x6E58, - 14986: 0x4E61, - 14987: 0x7FD4, - 14988: 0x7965, - 14989: 0x8BE6, - 14990: 0x60F3, - 14991: 0x54CD, - 14992: 0x4EAB, - 14993: 0x9879, - 14994: 0x5DF7, - 14995: 0x6A61, - 14996: 0x50CF, - 14997: 0x5411, - 14998: 0x8C61, - 14999: 0x8427, - 15000: 0x785D, - 15001: 0x9704, - 15002: 0x524A, - 15003: 0x54EE, - 15004: 0x56A3, - 15005: 0x9500, - 15006: 0x6D88, - 15007: 0x5BB5, - 15008: 0x6DC6, - 15009: 0x6653, - 15010: 0x8824, - 15011: 0x8825, - 15012: 0x8826, - 15013: 0x8827, - 15014: 0x8828, - 15015: 0x8829, - 15016: 0x882A, - 15017: 0x882B, - 15018: 0x882C, - 15019: 0x882D, - 15020: 0x882E, - 15021: 0x882F, - 15022: 0x8830, - 15023: 0x8831, - 15024: 0x8833, - 15025: 0x8834, - 15026: 0x8835, - 15027: 0x8836, - 15028: 0x8837, - 15029: 0x8838, - 15030: 0x883A, - 15031: 0x883B, - 15032: 0x883D, - 15033: 0x883E, - 15034: 0x883F, - 15035: 0x8841, - 15036: 0x8842, - 15037: 0x8843, - 15038: 0x8846, - 15039: 0x8847, - 15040: 0x8848, - 15041: 0x8849, - 15042: 0x884A, - 15043: 0x884B, - 15044: 0x884E, - 15045: 0x884F, - 15046: 0x8850, - 15047: 0x8851, - 15048: 0x8852, - 15049: 0x8853, - 15050: 0x8855, - 15051: 0x8856, - 15052: 0x8858, - 15053: 0x885A, - 15054: 0x885B, - 15055: 0x885C, - 15056: 0x885D, - 15057: 0x885E, - 15058: 0x885F, - 15059: 0x8860, - 15060: 0x8866, - 15061: 0x8867, - 15062: 0x886A, - 15063: 0x886D, - 15064: 0x886F, - 15065: 0x8871, - 15066: 0x8873, - 15067: 0x8874, - 15068: 0x8875, - 15069: 0x8876, - 15070: 0x8878, - 15071: 0x8879, - 15072: 0x887A, - 15073: 0x887B, - 15074: 0x887C, - 15075: 0x8880, - 15076: 0x8883, - 15077: 0x8886, - 15078: 0x8887, - 15079: 0x8889, - 15080: 0x888A, - 15081: 0x888C, - 15082: 0x888E, - 15083: 0x888F, - 15084: 0x8890, - 15085: 0x8891, - 15086: 0x8893, - 15087: 0x8894, - 15088: 0x8895, - 15089: 0x8897, - 15090: 0x8898, - 15091: 0x8899, - 15092: 0x889A, - 15093: 0x889B, - 15094: 0x889D, - 15095: 0x889E, - 15096: 0x889F, - 15097: 0x88A0, - 15098: 0x88A1, - 15099: 0x88A3, - 15100: 0x88A5, - 15101: 0x88A6, - 15102: 0x88A7, - 15103: 0x88A8, - 15104: 0x88A9, - 15105: 0x88AA, - 15106: 0x5C0F, - 15107: 0x5B5D, - 15108: 0x6821, - 15109: 0x8096, - 15110: 0x5578, - 15111: 0x7B11, - 15112: 0x6548, - 15113: 0x6954, - 15114: 0x4E9B, - 15115: 0x6B47, - 15116: 0x874E, - 15117: 0x978B, - 15118: 0x534F, - 15119: 0x631F, - 15120: 0x643A, - 15121: 0x90AA, - 15122: 0x659C, - 15123: 0x80C1, - 15124: 0x8C10, - 15125: 0x5199, - 15126: 0x68B0, - 15127: 0x5378, - 15128: 0x87F9, - 15129: 0x61C8, - 15130: 0x6CC4, - 15131: 0x6CFB, - 15132: 0x8C22, - 15133: 0x5C51, - 15134: 0x85AA, - 15135: 0x82AF, - 15136: 0x950C, - 15137: 0x6B23, - 15138: 0x8F9B, - 15139: 0x65B0, - 15140: 0x5FFB, - 15141: 0x5FC3, - 15142: 0x4FE1, - 15143: 0x8845, - 15144: 0x661F, - 15145: 0x8165, - 15146: 0x7329, - 15147: 0x60FA, - 15148: 0x5174, - 15149: 0x5211, - 15150: 0x578B, - 15151: 0x5F62, - 15152: 0x90A2, - 15153: 0x884C, - 15154: 0x9192, - 15155: 0x5E78, - 15156: 0x674F, - 15157: 0x6027, - 15158: 0x59D3, - 15159: 0x5144, - 15160: 0x51F6, - 15161: 0x80F8, - 15162: 0x5308, - 15163: 0x6C79, - 15164: 0x96C4, - 15165: 0x718A, - 15166: 0x4F11, - 15167: 0x4FEE, - 15168: 0x7F9E, - 15169: 0x673D, - 15170: 0x55C5, - 15171: 0x9508, - 15172: 0x79C0, - 15173: 0x8896, - 15174: 0x7EE3, - 15175: 0x589F, - 15176: 0x620C, - 15177: 0x9700, - 15178: 0x865A, - 15179: 0x5618, - 15180: 0x987B, - 15181: 0x5F90, - 15182: 0x8BB8, - 15183: 0x84C4, - 15184: 0x9157, - 15185: 0x53D9, - 15186: 0x65ED, - 15187: 0x5E8F, - 15188: 0x755C, - 15189: 0x6064, - 15190: 0x7D6E, - 15191: 0x5A7F, - 15192: 0x7EEA, - 15193: 0x7EED, - 15194: 0x8F69, - 15195: 0x55A7, - 15196: 0x5BA3, - 15197: 0x60AC, - 15198: 0x65CB, - 15199: 0x7384, - 15200: 0x88AC, - 15201: 0x88AE, - 15202: 0x88AF, - 15203: 0x88B0, - 15204: 0x88B2, - 15205: 0x88B3, - 15206: 0x88B4, - 15207: 0x88B5, - 15208: 0x88B6, - 15209: 0x88B8, - 15210: 0x88B9, - 15211: 0x88BA, - 15212: 0x88BB, - 15213: 0x88BD, - 15214: 0x88BE, - 15215: 0x88BF, - 15216: 0x88C0, - 15217: 0x88C3, - 15218: 0x88C4, - 15219: 0x88C7, - 15220: 0x88C8, - 15221: 0x88CA, - 15222: 0x88CB, - 15223: 0x88CC, - 15224: 0x88CD, - 15225: 0x88CF, - 15226: 0x88D0, - 15227: 0x88D1, - 15228: 0x88D3, - 15229: 0x88D6, - 15230: 0x88D7, - 15231: 0x88DA, - 15232: 0x88DB, - 15233: 0x88DC, - 15234: 0x88DD, - 15235: 0x88DE, - 15236: 0x88E0, - 15237: 0x88E1, - 15238: 0x88E6, - 15239: 0x88E7, - 15240: 0x88E9, - 15241: 0x88EA, - 15242: 0x88EB, - 15243: 0x88EC, - 15244: 0x88ED, - 15245: 0x88EE, - 15246: 0x88EF, - 15247: 0x88F2, - 15248: 0x88F5, - 15249: 0x88F6, - 15250: 0x88F7, - 15251: 0x88FA, - 15252: 0x88FB, - 15253: 0x88FD, - 15254: 0x88FF, - 15255: 0x8900, - 15256: 0x8901, - 15257: 0x8903, - 15258: 0x8904, - 15259: 0x8905, - 15260: 0x8906, - 15261: 0x8907, - 15262: 0x8908, - 15263: 0x8909, - 15264: 0x890B, - 15265: 0x890C, - 15266: 0x890D, - 15267: 0x890E, - 15268: 0x890F, - 15269: 0x8911, - 15270: 0x8914, - 15271: 0x8915, - 15272: 0x8916, - 15273: 0x8917, - 15274: 0x8918, - 15275: 0x891C, - 15276: 0x891D, - 15277: 0x891E, - 15278: 0x891F, - 15279: 0x8920, - 15280: 0x8922, - 15281: 0x8923, - 15282: 0x8924, - 15283: 0x8926, - 15284: 0x8927, - 15285: 0x8928, - 15286: 0x8929, - 15287: 0x892C, - 15288: 0x892D, - 15289: 0x892E, - 15290: 0x892F, - 15291: 0x8931, - 15292: 0x8932, - 15293: 0x8933, - 15294: 0x8935, - 15295: 0x8937, - 15296: 0x9009, - 15297: 0x7663, - 15298: 0x7729, - 15299: 0x7EDA, - 15300: 0x9774, - 15301: 0x859B, - 15302: 0x5B66, - 15303: 0x7A74, - 15304: 0x96EA, - 15305: 0x8840, - 15306: 0x52CB, - 15307: 0x718F, - 15308: 0x5FAA, - 15309: 0x65EC, - 15310: 0x8BE2, - 15311: 0x5BFB, - 15312: 0x9A6F, - 15313: 0x5DE1, - 15314: 0x6B89, - 15315: 0x6C5B, - 15316: 0x8BAD, - 15317: 0x8BAF, - 15318: 0x900A, - 15319: 0x8FC5, - 15320: 0x538B, - 15321: 0x62BC, - 15322: 0x9E26, - 15323: 0x9E2D, - 15324: 0x5440, - 15325: 0x4E2B, - 15326: 0x82BD, - 15327: 0x7259, - 15328: 0x869C, - 15329: 0x5D16, - 15330: 0x8859, - 15331: 0x6DAF, - 15332: 0x96C5, - 15333: 0x54D1, - 15334: 0x4E9A, - 15335: 0x8BB6, - 15336: 0x7109, - 15337: 0x54BD, - 15338: 0x9609, - 15339: 0x70DF, - 15340: 0x6DF9, - 15341: 0x76D0, - 15342: 0x4E25, - 15343: 0x7814, - 15344: 0x8712, - 15345: 0x5CA9, - 15346: 0x5EF6, - 15347: 0x8A00, - 15348: 0x989C, - 15349: 0x960E, - 15350: 0x708E, - 15351: 0x6CBF, - 15352: 0x5944, - 15353: 0x63A9, - 15354: 0x773C, - 15355: 0x884D, - 15356: 0x6F14, - 15357: 0x8273, - 15358: 0x5830, - 15359: 0x71D5, - 15360: 0x538C, - 15361: 0x781A, - 15362: 0x96C1, - 15363: 0x5501, - 15364: 0x5F66, - 15365: 0x7130, - 15366: 0x5BB4, - 15367: 0x8C1A, - 15368: 0x9A8C, - 15369: 0x6B83, - 15370: 0x592E, - 15371: 0x9E2F, - 15372: 0x79E7, - 15373: 0x6768, - 15374: 0x626C, - 15375: 0x4F6F, - 15376: 0x75A1, - 15377: 0x7F8A, - 15378: 0x6D0B, - 15379: 0x9633, - 15380: 0x6C27, - 15381: 0x4EF0, - 15382: 0x75D2, - 15383: 0x517B, - 15384: 0x6837, - 15385: 0x6F3E, - 15386: 0x9080, - 15387: 0x8170, - 15388: 0x5996, - 15389: 0x7476, - 15390: 0x8938, - 15391: 0x8939, - 15392: 0x893A, - 15393: 0x893B, - 15394: 0x893C, - 15395: 0x893D, - 15396: 0x893E, - 15397: 0x893F, - 15398: 0x8940, - 15399: 0x8942, - 15400: 0x8943, - 15401: 0x8945, - 15402: 0x8946, - 15403: 0x8947, - 15404: 0x8948, - 15405: 0x8949, - 15406: 0x894A, - 15407: 0x894B, - 15408: 0x894C, - 15409: 0x894D, - 15410: 0x894E, - 15411: 0x894F, - 15412: 0x8950, - 15413: 0x8951, - 15414: 0x8952, - 15415: 0x8953, - 15416: 0x8954, - 15417: 0x8955, - 15418: 0x8956, - 15419: 0x8957, - 15420: 0x8958, - 15421: 0x8959, - 15422: 0x895A, - 15423: 0x895B, - 15424: 0x895C, - 15425: 0x895D, - 15426: 0x8960, - 15427: 0x8961, - 15428: 0x8962, - 15429: 0x8963, - 15430: 0x8964, - 15431: 0x8965, - 15432: 0x8967, - 15433: 0x8968, - 15434: 0x8969, - 15435: 0x896A, - 15436: 0x896B, - 15437: 0x896C, - 15438: 0x896D, - 15439: 0x896E, - 15440: 0x896F, - 15441: 0x8970, - 15442: 0x8971, - 15443: 0x8972, - 15444: 0x8973, - 15445: 0x8974, - 15446: 0x8975, - 15447: 0x8976, - 15448: 0x8977, - 15449: 0x8978, - 15450: 0x8979, - 15451: 0x897A, - 15452: 0x897C, - 15453: 0x897D, - 15454: 0x897E, - 15455: 0x8980, - 15456: 0x8982, - 15457: 0x8984, - 15458: 0x8985, - 15459: 0x8987, - 15460: 0x8988, - 15461: 0x8989, - 15462: 0x898A, - 15463: 0x898B, - 15464: 0x898C, - 15465: 0x898D, - 15466: 0x898E, - 15467: 0x898F, - 15468: 0x8990, - 15469: 0x8991, - 15470: 0x8992, - 15471: 0x8993, - 15472: 0x8994, - 15473: 0x8995, - 15474: 0x8996, - 15475: 0x8997, - 15476: 0x8998, - 15477: 0x8999, - 15478: 0x899A, - 15479: 0x899B, - 15480: 0x899C, - 15481: 0x899D, - 15482: 0x899E, - 15483: 0x899F, - 15484: 0x89A0, - 15485: 0x89A1, - 15486: 0x6447, - 15487: 0x5C27, - 15488: 0x9065, - 15489: 0x7A91, - 15490: 0x8C23, - 15491: 0x59DA, - 15492: 0x54AC, - 15493: 0x8200, - 15494: 0x836F, - 15495: 0x8981, - 15496: 0x8000, - 15497: 0x6930, - 15498: 0x564E, - 15499: 0x8036, - 15500: 0x7237, - 15501: 0x91CE, - 15502: 0x51B6, - 15503: 0x4E5F, - 15504: 0x9875, - 15505: 0x6396, - 15506: 0x4E1A, - 15507: 0x53F6, - 15508: 0x66F3, - 15509: 0x814B, - 15510: 0x591C, - 15511: 0x6DB2, - 15512: 0x4E00, - 15513: 0x58F9, - 15514: 0x533B, - 15515: 0x63D6, - 15516: 0x94F1, - 15517: 0x4F9D, - 15518: 0x4F0A, - 15519: 0x8863, - 15520: 0x9890, - 15521: 0x5937, - 15522: 0x9057, - 15523: 0x79FB, - 15524: 0x4EEA, - 15525: 0x80F0, - 15526: 0x7591, - 15527: 0x6C82, - 15528: 0x5B9C, - 15529: 0x59E8, - 15530: 0x5F5D, - 15531: 0x6905, - 15532: 0x8681, - 15533: 0x501A, - 15534: 0x5DF2, - 15535: 0x4E59, - 15536: 0x77E3, - 15537: 0x4EE5, - 15538: 0x827A, - 15539: 0x6291, - 15540: 0x6613, - 15541: 0x9091, - 15542: 0x5C79, - 15543: 0x4EBF, - 15544: 0x5F79, - 15545: 0x81C6, - 15546: 0x9038, - 15547: 0x8084, - 15548: 0x75AB, - 15549: 0x4EA6, - 15550: 0x88D4, - 15551: 0x610F, - 15552: 0x6BC5, - 15553: 0x5FC6, - 15554: 0x4E49, - 15555: 0x76CA, - 15556: 0x6EA2, - 15557: 0x8BE3, - 15558: 0x8BAE, - 15559: 0x8C0A, - 15560: 0x8BD1, - 15561: 0x5F02, - 15562: 0x7FFC, - 15563: 0x7FCC, - 15564: 0x7ECE, - 15565: 0x8335, - 15566: 0x836B, - 15567: 0x56E0, - 15568: 0x6BB7, - 15569: 0x97F3, - 15570: 0x9634, - 15571: 0x59FB, - 15572: 0x541F, - 15573: 0x94F6, - 15574: 0x6DEB, - 15575: 0x5BC5, - 15576: 0x996E, - 15577: 0x5C39, - 15578: 0x5F15, - 15579: 0x9690, - 15580: 0x89A2, - 15581: 0x89A3, - 15582: 0x89A4, - 15583: 0x89A5, - 15584: 0x89A6, - 15585: 0x89A7, - 15586: 0x89A8, - 15587: 0x89A9, - 15588: 0x89AA, - 15589: 0x89AB, - 15590: 0x89AC, - 15591: 0x89AD, - 15592: 0x89AE, - 15593: 0x89AF, - 15594: 0x89B0, - 15595: 0x89B1, - 15596: 0x89B2, - 15597: 0x89B3, - 15598: 0x89B4, - 15599: 0x89B5, - 15600: 0x89B6, - 15601: 0x89B7, - 15602: 0x89B8, - 15603: 0x89B9, - 15604: 0x89BA, - 15605: 0x89BB, - 15606: 0x89BC, - 15607: 0x89BD, - 15608: 0x89BE, - 15609: 0x89BF, - 15610: 0x89C0, - 15611: 0x89C3, - 15612: 0x89CD, - 15613: 0x89D3, - 15614: 0x89D4, - 15615: 0x89D5, - 15616: 0x89D7, - 15617: 0x89D8, - 15618: 0x89D9, - 15619: 0x89DB, - 15620: 0x89DD, - 15621: 0x89DF, - 15622: 0x89E0, - 15623: 0x89E1, - 15624: 0x89E2, - 15625: 0x89E4, - 15626: 0x89E7, - 15627: 0x89E8, - 15628: 0x89E9, - 15629: 0x89EA, - 15630: 0x89EC, - 15631: 0x89ED, - 15632: 0x89EE, - 15633: 0x89F0, - 15634: 0x89F1, - 15635: 0x89F2, - 15636: 0x89F4, - 15637: 0x89F5, - 15638: 0x89F6, - 15639: 0x89F7, - 15640: 0x89F8, - 15641: 0x89F9, - 15642: 0x89FA, - 15643: 0x89FB, - 15644: 0x89FC, - 15645: 0x89FD, - 15646: 0x89FE, - 15647: 0x89FF, - 15648: 0x8A01, - 15649: 0x8A02, - 15650: 0x8A03, - 15651: 0x8A04, - 15652: 0x8A05, - 15653: 0x8A06, - 15654: 0x8A08, - 15655: 0x8A09, - 15656: 0x8A0A, - 15657: 0x8A0B, - 15658: 0x8A0C, - 15659: 0x8A0D, - 15660: 0x8A0E, - 15661: 0x8A0F, - 15662: 0x8A10, - 15663: 0x8A11, - 15664: 0x8A12, - 15665: 0x8A13, - 15666: 0x8A14, - 15667: 0x8A15, - 15668: 0x8A16, - 15669: 0x8A17, - 15670: 0x8A18, - 15671: 0x8A19, - 15672: 0x8A1A, - 15673: 0x8A1B, - 15674: 0x8A1C, - 15675: 0x8A1D, - 15676: 0x5370, - 15677: 0x82F1, - 15678: 0x6A31, - 15679: 0x5A74, - 15680: 0x9E70, - 15681: 0x5E94, - 15682: 0x7F28, - 15683: 0x83B9, - 15684: 0x8424, - 15685: 0x8425, - 15686: 0x8367, - 15687: 0x8747, - 15688: 0x8FCE, - 15689: 0x8D62, - 15690: 0x76C8, - 15691: 0x5F71, - 15692: 0x9896, - 15693: 0x786C, - 15694: 0x6620, - 15695: 0x54DF, - 15696: 0x62E5, - 15697: 0x4F63, - 15698: 0x81C3, - 15699: 0x75C8, - 15700: 0x5EB8, - 15701: 0x96CD, - 15702: 0x8E0A, - 15703: 0x86F9, - 15704: 0x548F, - 15705: 0x6CF3, - 15706: 0x6D8C, - 15707: 0x6C38, - 15708: 0x607F, - 15709: 0x52C7, - 15710: 0x7528, - 15711: 0x5E7D, - 15712: 0x4F18, - 15713: 0x60A0, - 15714: 0x5FE7, - 15715: 0x5C24, - 15716: 0x7531, - 15717: 0x90AE, - 15718: 0x94C0, - 15719: 0x72B9, - 15720: 0x6CB9, - 15721: 0x6E38, - 15722: 0x9149, - 15723: 0x6709, - 15724: 0x53CB, - 15725: 0x53F3, - 15726: 0x4F51, - 15727: 0x91C9, - 15728: 0x8BF1, - 15729: 0x53C8, - 15730: 0x5E7C, - 15731: 0x8FC2, - 15732: 0x6DE4, - 15733: 0x4E8E, - 15734: 0x76C2, - 15735: 0x6986, - 15736: 0x865E, - 15737: 0x611A, - 15738: 0x8206, - 15739: 0x4F59, - 15740: 0x4FDE, - 15741: 0x903E, - 15742: 0x9C7C, - 15743: 0x6109, - 15744: 0x6E1D, - 15745: 0x6E14, - 15746: 0x9685, - 15747: 0x4E88, - 15748: 0x5A31, - 15749: 0x96E8, - 15750: 0x4E0E, - 15751: 0x5C7F, - 15752: 0x79B9, - 15753: 0x5B87, - 15754: 0x8BED, - 15755: 0x7FBD, - 15756: 0x7389, - 15757: 0x57DF, - 15758: 0x828B, - 15759: 0x90C1, - 15760: 0x5401, - 15761: 0x9047, - 15762: 0x55BB, - 15763: 0x5CEA, - 15764: 0x5FA1, - 15765: 0x6108, - 15766: 0x6B32, - 15767: 0x72F1, - 15768: 0x80B2, - 15769: 0x8A89, - 15770: 0x8A1E, - 15771: 0x8A1F, - 15772: 0x8A20, - 15773: 0x8A21, - 15774: 0x8A22, - 15775: 0x8A23, - 15776: 0x8A24, - 15777: 0x8A25, - 15778: 0x8A26, - 15779: 0x8A27, - 15780: 0x8A28, - 15781: 0x8A29, - 15782: 0x8A2A, - 15783: 0x8A2B, - 15784: 0x8A2C, - 15785: 0x8A2D, - 15786: 0x8A2E, - 15787: 0x8A2F, - 15788: 0x8A30, - 15789: 0x8A31, - 15790: 0x8A32, - 15791: 0x8A33, - 15792: 0x8A34, - 15793: 0x8A35, - 15794: 0x8A36, - 15795: 0x8A37, - 15796: 0x8A38, - 15797: 0x8A39, - 15798: 0x8A3A, - 15799: 0x8A3B, - 15800: 0x8A3C, - 15801: 0x8A3D, - 15802: 0x8A3F, - 15803: 0x8A40, - 15804: 0x8A41, - 15805: 0x8A42, - 15806: 0x8A43, - 15807: 0x8A44, - 15808: 0x8A45, - 15809: 0x8A46, - 15810: 0x8A47, - 15811: 0x8A49, - 15812: 0x8A4A, - 15813: 0x8A4B, - 15814: 0x8A4C, - 15815: 0x8A4D, - 15816: 0x8A4E, - 15817: 0x8A4F, - 15818: 0x8A50, - 15819: 0x8A51, - 15820: 0x8A52, - 15821: 0x8A53, - 15822: 0x8A54, - 15823: 0x8A55, - 15824: 0x8A56, - 15825: 0x8A57, - 15826: 0x8A58, - 15827: 0x8A59, - 15828: 0x8A5A, - 15829: 0x8A5B, - 15830: 0x8A5C, - 15831: 0x8A5D, - 15832: 0x8A5E, - 15833: 0x8A5F, - 15834: 0x8A60, - 15835: 0x8A61, - 15836: 0x8A62, - 15837: 0x8A63, - 15838: 0x8A64, - 15839: 0x8A65, - 15840: 0x8A66, - 15841: 0x8A67, - 15842: 0x8A68, - 15843: 0x8A69, - 15844: 0x8A6A, - 15845: 0x8A6B, - 15846: 0x8A6C, - 15847: 0x8A6D, - 15848: 0x8A6E, - 15849: 0x8A6F, - 15850: 0x8A70, - 15851: 0x8A71, - 15852: 0x8A72, - 15853: 0x8A73, - 15854: 0x8A74, - 15855: 0x8A75, - 15856: 0x8A76, - 15857: 0x8A77, - 15858: 0x8A78, - 15859: 0x8A7A, - 15860: 0x8A7B, - 15861: 0x8A7C, - 15862: 0x8A7D, - 15863: 0x8A7E, - 15864: 0x8A7F, - 15865: 0x8A80, - 15866: 0x6D74, - 15867: 0x5BD3, - 15868: 0x88D5, - 15869: 0x9884, - 15870: 0x8C6B, - 15871: 0x9A6D, - 15872: 0x9E33, - 15873: 0x6E0A, - 15874: 0x51A4, - 15875: 0x5143, - 15876: 0x57A3, - 15877: 0x8881, - 15878: 0x539F, - 15879: 0x63F4, - 15880: 0x8F95, - 15881: 0x56ED, - 15882: 0x5458, - 15883: 0x5706, - 15884: 0x733F, - 15885: 0x6E90, - 15886: 0x7F18, - 15887: 0x8FDC, - 15888: 0x82D1, - 15889: 0x613F, - 15890: 0x6028, - 15891: 0x9662, - 15892: 0x66F0, - 15893: 0x7EA6, - 15894: 0x8D8A, - 15895: 0x8DC3, - 15896: 0x94A5, - 15897: 0x5CB3, - 15898: 0x7CA4, - 15899: 0x6708, - 15900: 0x60A6, - 15901: 0x9605, - 15902: 0x8018, - 15903: 0x4E91, - 15904: 0x90E7, - 15905: 0x5300, - 15906: 0x9668, - 15907: 0x5141, - 15908: 0x8FD0, - 15909: 0x8574, - 15910: 0x915D, - 15911: 0x6655, - 15912: 0x97F5, - 15913: 0x5B55, - 15914: 0x531D, - 15915: 0x7838, - 15916: 0x6742, - 15917: 0x683D, - 15918: 0x54C9, - 15919: 0x707E, - 15920: 0x5BB0, - 15921: 0x8F7D, - 15922: 0x518D, - 15923: 0x5728, - 15924: 0x54B1, - 15925: 0x6512, - 15926: 0x6682, - 15927: 0x8D5E, - 15928: 0x8D43, - 15929: 0x810F, - 15930: 0x846C, - 15931: 0x906D, - 15932: 0x7CDF, - 15933: 0x51FF, - 15934: 0x85FB, - 15935: 0x67A3, - 15936: 0x65E9, - 15937: 0x6FA1, - 15938: 0x86A4, - 15939: 0x8E81, - 15940: 0x566A, - 15941: 0x9020, - 15942: 0x7682, - 15943: 0x7076, - 15944: 0x71E5, - 15945: 0x8D23, - 15946: 0x62E9, - 15947: 0x5219, - 15948: 0x6CFD, - 15949: 0x8D3C, - 15950: 0x600E, - 15951: 0x589E, - 15952: 0x618E, - 15953: 0x66FE, - 15954: 0x8D60, - 15955: 0x624E, - 15956: 0x55B3, - 15957: 0x6E23, - 15958: 0x672D, - 15959: 0x8F67, - 15960: 0x8A81, - 15961: 0x8A82, - 15962: 0x8A83, - 15963: 0x8A84, - 15964: 0x8A85, - 15965: 0x8A86, - 15966: 0x8A87, - 15967: 0x8A88, - 15968: 0x8A8B, - 15969: 0x8A8C, - 15970: 0x8A8D, - 15971: 0x8A8E, - 15972: 0x8A8F, - 15973: 0x8A90, - 15974: 0x8A91, - 15975: 0x8A92, - 15976: 0x8A94, - 15977: 0x8A95, - 15978: 0x8A96, - 15979: 0x8A97, - 15980: 0x8A98, - 15981: 0x8A99, - 15982: 0x8A9A, - 15983: 0x8A9B, - 15984: 0x8A9C, - 15985: 0x8A9D, - 15986: 0x8A9E, - 15987: 0x8A9F, - 15988: 0x8AA0, - 15989: 0x8AA1, - 15990: 0x8AA2, - 15991: 0x8AA3, - 15992: 0x8AA4, - 15993: 0x8AA5, - 15994: 0x8AA6, - 15995: 0x8AA7, - 15996: 0x8AA8, - 15997: 0x8AA9, - 15998: 0x8AAA, - 15999: 0x8AAB, - 16000: 0x8AAC, - 16001: 0x8AAD, - 16002: 0x8AAE, - 16003: 0x8AAF, - 16004: 0x8AB0, - 16005: 0x8AB1, - 16006: 0x8AB2, - 16007: 0x8AB3, - 16008: 0x8AB4, - 16009: 0x8AB5, - 16010: 0x8AB6, - 16011: 0x8AB7, - 16012: 0x8AB8, - 16013: 0x8AB9, - 16014: 0x8ABA, - 16015: 0x8ABB, - 16016: 0x8ABC, - 16017: 0x8ABD, - 16018: 0x8ABE, - 16019: 0x8ABF, - 16020: 0x8AC0, - 16021: 0x8AC1, - 16022: 0x8AC2, - 16023: 0x8AC3, - 16024: 0x8AC4, - 16025: 0x8AC5, - 16026: 0x8AC6, - 16027: 0x8AC7, - 16028: 0x8AC8, - 16029: 0x8AC9, - 16030: 0x8ACA, - 16031: 0x8ACB, - 16032: 0x8ACC, - 16033: 0x8ACD, - 16034: 0x8ACE, - 16035: 0x8ACF, - 16036: 0x8AD0, - 16037: 0x8AD1, - 16038: 0x8AD2, - 16039: 0x8AD3, - 16040: 0x8AD4, - 16041: 0x8AD5, - 16042: 0x8AD6, - 16043: 0x8AD7, - 16044: 0x8AD8, - 16045: 0x8AD9, - 16046: 0x8ADA, - 16047: 0x8ADB, - 16048: 0x8ADC, - 16049: 0x8ADD, - 16050: 0x8ADE, - 16051: 0x8ADF, - 16052: 0x8AE0, - 16053: 0x8AE1, - 16054: 0x8AE2, - 16055: 0x8AE3, - 16056: 0x94E1, - 16057: 0x95F8, - 16058: 0x7728, - 16059: 0x6805, - 16060: 0x69A8, - 16061: 0x548B, - 16062: 0x4E4D, - 16063: 0x70B8, - 16064: 0x8BC8, - 16065: 0x6458, - 16066: 0x658B, - 16067: 0x5B85, - 16068: 0x7A84, - 16069: 0x503A, - 16070: 0x5BE8, - 16071: 0x77BB, - 16072: 0x6BE1, - 16073: 0x8A79, - 16074: 0x7C98, - 16075: 0x6CBE, - 16076: 0x76CF, - 16077: 0x65A9, - 16078: 0x8F97, - 16079: 0x5D2D, - 16080: 0x5C55, - 16081: 0x8638, - 16082: 0x6808, - 16083: 0x5360, - 16084: 0x6218, - 16085: 0x7AD9, - 16086: 0x6E5B, - 16087: 0x7EFD, - 16088: 0x6A1F, - 16089: 0x7AE0, - 16090: 0x5F70, - 16091: 0x6F33, - 16092: 0x5F20, - 16093: 0x638C, - 16094: 0x6DA8, - 16095: 0x6756, - 16096: 0x4E08, - 16097: 0x5E10, - 16098: 0x8D26, - 16099: 0x4ED7, - 16100: 0x80C0, - 16101: 0x7634, - 16102: 0x969C, - 16103: 0x62DB, - 16104: 0x662D, - 16105: 0x627E, - 16106: 0x6CBC, - 16107: 0x8D75, - 16108: 0x7167, - 16109: 0x7F69, - 16110: 0x5146, - 16111: 0x8087, - 16112: 0x53EC, - 16113: 0x906E, - 16114: 0x6298, - 16115: 0x54F2, - 16116: 0x86F0, - 16117: 0x8F99, - 16118: 0x8005, - 16119: 0x9517, - 16120: 0x8517, - 16121: 0x8FD9, - 16122: 0x6D59, - 16123: 0x73CD, - 16124: 0x659F, - 16125: 0x771F, - 16126: 0x7504, - 16127: 0x7827, - 16128: 0x81FB, - 16129: 0x8D1E, - 16130: 0x9488, - 16131: 0x4FA6, - 16132: 0x6795, - 16133: 0x75B9, - 16134: 0x8BCA, - 16135: 0x9707, - 16136: 0x632F, - 16137: 0x9547, - 16138: 0x9635, - 16139: 0x84B8, - 16140: 0x6323, - 16141: 0x7741, - 16142: 0x5F81, - 16143: 0x72F0, - 16144: 0x4E89, - 16145: 0x6014, - 16146: 0x6574, - 16147: 0x62EF, - 16148: 0x6B63, - 16149: 0x653F, - 16150: 0x8AE4, - 16151: 0x8AE5, - 16152: 0x8AE6, - 16153: 0x8AE7, - 16154: 0x8AE8, - 16155: 0x8AE9, - 16156: 0x8AEA, - 16157: 0x8AEB, - 16158: 0x8AEC, - 16159: 0x8AED, - 16160: 0x8AEE, - 16161: 0x8AEF, - 16162: 0x8AF0, - 16163: 0x8AF1, - 16164: 0x8AF2, - 16165: 0x8AF3, - 16166: 0x8AF4, - 16167: 0x8AF5, - 16168: 0x8AF6, - 16169: 0x8AF7, - 16170: 0x8AF8, - 16171: 0x8AF9, - 16172: 0x8AFA, - 16173: 0x8AFB, - 16174: 0x8AFC, - 16175: 0x8AFD, - 16176: 0x8AFE, - 16177: 0x8AFF, - 16178: 0x8B00, - 16179: 0x8B01, - 16180: 0x8B02, - 16181: 0x8B03, - 16182: 0x8B04, - 16183: 0x8B05, - 16184: 0x8B06, - 16185: 0x8B08, - 16186: 0x8B09, - 16187: 0x8B0A, - 16188: 0x8B0B, - 16189: 0x8B0C, - 16190: 0x8B0D, - 16191: 0x8B0E, - 16192: 0x8B0F, - 16193: 0x8B10, - 16194: 0x8B11, - 16195: 0x8B12, - 16196: 0x8B13, - 16197: 0x8B14, - 16198: 0x8B15, - 16199: 0x8B16, - 16200: 0x8B17, - 16201: 0x8B18, - 16202: 0x8B19, - 16203: 0x8B1A, - 16204: 0x8B1B, - 16205: 0x8B1C, - 16206: 0x8B1D, - 16207: 0x8B1E, - 16208: 0x8B1F, - 16209: 0x8B20, - 16210: 0x8B21, - 16211: 0x8B22, - 16212: 0x8B23, - 16213: 0x8B24, - 16214: 0x8B25, - 16215: 0x8B27, - 16216: 0x8B28, - 16217: 0x8B29, - 16218: 0x8B2A, - 16219: 0x8B2B, - 16220: 0x8B2C, - 16221: 0x8B2D, - 16222: 0x8B2E, - 16223: 0x8B2F, - 16224: 0x8B30, - 16225: 0x8B31, - 16226: 0x8B32, - 16227: 0x8B33, - 16228: 0x8B34, - 16229: 0x8B35, - 16230: 0x8B36, - 16231: 0x8B37, - 16232: 0x8B38, - 16233: 0x8B39, - 16234: 0x8B3A, - 16235: 0x8B3B, - 16236: 0x8B3C, - 16237: 0x8B3D, - 16238: 0x8B3E, - 16239: 0x8B3F, - 16240: 0x8B40, - 16241: 0x8B41, - 16242: 0x8B42, - 16243: 0x8B43, - 16244: 0x8B44, - 16245: 0x8B45, - 16246: 0x5E27, - 16247: 0x75C7, - 16248: 0x90D1, - 16249: 0x8BC1, - 16250: 0x829D, - 16251: 0x679D, - 16252: 0x652F, - 16253: 0x5431, - 16254: 0x8718, - 16255: 0x77E5, - 16256: 0x80A2, - 16257: 0x8102, - 16258: 0x6C41, - 16259: 0x4E4B, - 16260: 0x7EC7, - 16261: 0x804C, - 16262: 0x76F4, - 16263: 0x690D, - 16264: 0x6B96, - 16265: 0x6267, - 16266: 0x503C, - 16267: 0x4F84, - 16268: 0x5740, - 16269: 0x6307, - 16270: 0x6B62, - 16271: 0x8DBE, - 16272: 0x53EA, - 16273: 0x65E8, - 16274: 0x7EB8, - 16275: 0x5FD7, - 16276: 0x631A, - 16277: 0x63B7, - 16278: 0x81F3, - 16279: 0x81F4, - 16280: 0x7F6E, - 16281: 0x5E1C, - 16282: 0x5CD9, - 16283: 0x5236, - 16284: 0x667A, - 16285: 0x79E9, - 16286: 0x7A1A, - 16287: 0x8D28, - 16288: 0x7099, - 16289: 0x75D4, - 16290: 0x6EDE, - 16291: 0x6CBB, - 16292: 0x7A92, - 16293: 0x4E2D, - 16294: 0x76C5, - 16295: 0x5FE0, - 16296: 0x949F, - 16297: 0x8877, - 16298: 0x7EC8, - 16299: 0x79CD, - 16300: 0x80BF, - 16301: 0x91CD, - 16302: 0x4EF2, - 16303: 0x4F17, - 16304: 0x821F, - 16305: 0x5468, - 16306: 0x5DDE, - 16307: 0x6D32, - 16308: 0x8BCC, - 16309: 0x7CA5, - 16310: 0x8F74, - 16311: 0x8098, - 16312: 0x5E1A, - 16313: 0x5492, - 16314: 0x76B1, - 16315: 0x5B99, - 16316: 0x663C, - 16317: 0x9AA4, - 16318: 0x73E0, - 16319: 0x682A, - 16320: 0x86DB, - 16321: 0x6731, - 16322: 0x732A, - 16323: 0x8BF8, - 16324: 0x8BDB, - 16325: 0x9010, - 16326: 0x7AF9, - 16327: 0x70DB, - 16328: 0x716E, - 16329: 0x62C4, - 16330: 0x77A9, - 16331: 0x5631, - 16332: 0x4E3B, - 16333: 0x8457, - 16334: 0x67F1, - 16335: 0x52A9, - 16336: 0x86C0, - 16337: 0x8D2E, - 16338: 0x94F8, - 16339: 0x7B51, - 16340: 0x8B46, - 16341: 0x8B47, - 16342: 0x8B48, - 16343: 0x8B49, - 16344: 0x8B4A, - 16345: 0x8B4B, - 16346: 0x8B4C, - 16347: 0x8B4D, - 16348: 0x8B4E, - 16349: 0x8B4F, - 16350: 0x8B50, - 16351: 0x8B51, - 16352: 0x8B52, - 16353: 0x8B53, - 16354: 0x8B54, - 16355: 0x8B55, - 16356: 0x8B56, - 16357: 0x8B57, - 16358: 0x8B58, - 16359: 0x8B59, - 16360: 0x8B5A, - 16361: 0x8B5B, - 16362: 0x8B5C, - 16363: 0x8B5D, - 16364: 0x8B5E, - 16365: 0x8B5F, - 16366: 0x8B60, - 16367: 0x8B61, - 16368: 0x8B62, - 16369: 0x8B63, - 16370: 0x8B64, - 16371: 0x8B65, - 16372: 0x8B67, - 16373: 0x8B68, - 16374: 0x8B69, - 16375: 0x8B6A, - 16376: 0x8B6B, - 16377: 0x8B6D, - 16378: 0x8B6E, - 16379: 0x8B6F, - 16380: 0x8B70, - 16381: 0x8B71, - 16382: 0x8B72, - 16383: 0x8B73, - 16384: 0x8B74, - 16385: 0x8B75, - 16386: 0x8B76, - 16387: 0x8B77, - 16388: 0x8B78, - 16389: 0x8B79, - 16390: 0x8B7A, - 16391: 0x8B7B, - 16392: 0x8B7C, - 16393: 0x8B7D, - 16394: 0x8B7E, - 16395: 0x8B7F, - 16396: 0x8B80, - 16397: 0x8B81, - 16398: 0x8B82, - 16399: 0x8B83, - 16400: 0x8B84, - 16401: 0x8B85, - 16402: 0x8B86, - 16403: 0x8B87, - 16404: 0x8B88, - 16405: 0x8B89, - 16406: 0x8B8A, - 16407: 0x8B8B, - 16408: 0x8B8C, - 16409: 0x8B8D, - 16410: 0x8B8E, - 16411: 0x8B8F, - 16412: 0x8B90, - 16413: 0x8B91, - 16414: 0x8B92, - 16415: 0x8B93, - 16416: 0x8B94, - 16417: 0x8B95, - 16418: 0x8B96, - 16419: 0x8B97, - 16420: 0x8B98, - 16421: 0x8B99, - 16422: 0x8B9A, - 16423: 0x8B9B, - 16424: 0x8B9C, - 16425: 0x8B9D, - 16426: 0x8B9E, - 16427: 0x8B9F, - 16428: 0x8BAC, - 16429: 0x8BB1, - 16430: 0x8BBB, - 16431: 0x8BC7, - 16432: 0x8BD0, - 16433: 0x8BEA, - 16434: 0x8C09, - 16435: 0x8C1E, - 16436: 0x4F4F, - 16437: 0x6CE8, - 16438: 0x795D, - 16439: 0x9A7B, - 16440: 0x6293, - 16441: 0x722A, - 16442: 0x62FD, - 16443: 0x4E13, - 16444: 0x7816, - 16445: 0x8F6C, - 16446: 0x64B0, - 16447: 0x8D5A, - 16448: 0x7BC6, - 16449: 0x6869, - 16450: 0x5E84, - 16451: 0x88C5, - 16452: 0x5986, - 16453: 0x649E, - 16454: 0x58EE, - 16455: 0x72B6, - 16456: 0x690E, - 16457: 0x9525, - 16458: 0x8FFD, - 16459: 0x8D58, - 16460: 0x5760, - 16461: 0x7F00, - 16462: 0x8C06, - 16463: 0x51C6, - 16464: 0x6349, - 16465: 0x62D9, - 16466: 0x5353, - 16467: 0x684C, - 16468: 0x7422, - 16469: 0x8301, - 16470: 0x914C, - 16471: 0x5544, - 16472: 0x7740, - 16473: 0x707C, - 16474: 0x6D4A, - 16475: 0x5179, - 16476: 0x54A8, - 16477: 0x8D44, - 16478: 0x59FF, - 16479: 0x6ECB, - 16480: 0x6DC4, - 16481: 0x5B5C, - 16482: 0x7D2B, - 16483: 0x4ED4, - 16484: 0x7C7D, - 16485: 0x6ED3, - 16486: 0x5B50, - 16487: 0x81EA, - 16488: 0x6E0D, - 16489: 0x5B57, - 16490: 0x9B03, - 16491: 0x68D5, - 16492: 0x8E2A, - 16493: 0x5B97, - 16494: 0x7EFC, - 16495: 0x603B, - 16496: 0x7EB5, - 16497: 0x90B9, - 16498: 0x8D70, - 16499: 0x594F, - 16500: 0x63CD, - 16501: 0x79DF, - 16502: 0x8DB3, - 16503: 0x5352, - 16504: 0x65CF, - 16505: 0x7956, - 16506: 0x8BC5, - 16507: 0x963B, - 16508: 0x7EC4, - 16509: 0x94BB, - 16510: 0x7E82, - 16511: 0x5634, - 16512: 0x9189, - 16513: 0x6700, - 16514: 0x7F6A, - 16515: 0x5C0A, - 16516: 0x9075, - 16517: 0x6628, - 16518: 0x5DE6, - 16519: 0x4F50, - 16520: 0x67DE, - 16521: 0x505A, - 16522: 0x4F5C, - 16523: 0x5750, - 16524: 0x5EA7, - 16530: 0x8C38, - 16531: 0x8C39, - 16532: 0x8C3A, - 16533: 0x8C3B, - 16534: 0x8C3C, - 16535: 0x8C3D, - 16536: 0x8C3E, - 16537: 0x8C3F, - 16538: 0x8C40, - 16539: 0x8C42, - 16540: 0x8C43, - 16541: 0x8C44, - 16542: 0x8C45, - 16543: 0x8C48, - 16544: 0x8C4A, - 16545: 0x8C4B, - 16546: 0x8C4D, - 16547: 0x8C4E, - 16548: 0x8C4F, - 16549: 0x8C50, - 16550: 0x8C51, - 16551: 0x8C52, - 16552: 0x8C53, - 16553: 0x8C54, - 16554: 0x8C56, - 16555: 0x8C57, - 16556: 0x8C58, - 16557: 0x8C59, - 16558: 0x8C5B, - 16559: 0x8C5C, - 16560: 0x8C5D, - 16561: 0x8C5E, - 16562: 0x8C5F, - 16563: 0x8C60, - 16564: 0x8C63, - 16565: 0x8C64, - 16566: 0x8C65, - 16567: 0x8C66, - 16568: 0x8C67, - 16569: 0x8C68, - 16570: 0x8C69, - 16571: 0x8C6C, - 16572: 0x8C6D, - 16573: 0x8C6E, - 16574: 0x8C6F, - 16575: 0x8C70, - 16576: 0x8C71, - 16577: 0x8C72, - 16578: 0x8C74, - 16579: 0x8C75, - 16580: 0x8C76, - 16581: 0x8C77, - 16582: 0x8C7B, - 16583: 0x8C7C, - 16584: 0x8C7D, - 16585: 0x8C7E, - 16586: 0x8C7F, - 16587: 0x8C80, - 16588: 0x8C81, - 16589: 0x8C83, - 16590: 0x8C84, - 16591: 0x8C86, - 16592: 0x8C87, - 16593: 0x8C88, - 16594: 0x8C8B, - 16595: 0x8C8D, - 16596: 0x8C8E, - 16597: 0x8C8F, - 16598: 0x8C90, - 16599: 0x8C91, - 16600: 0x8C92, - 16601: 0x8C93, - 16602: 0x8C95, - 16603: 0x8C96, - 16604: 0x8C97, - 16605: 0x8C99, - 16606: 0x8C9A, - 16607: 0x8C9B, - 16608: 0x8C9C, - 16609: 0x8C9D, - 16610: 0x8C9E, - 16611: 0x8C9F, - 16612: 0x8CA0, - 16613: 0x8CA1, - 16614: 0x8CA2, - 16615: 0x8CA3, - 16616: 0x8CA4, - 16617: 0x8CA5, - 16618: 0x8CA6, - 16619: 0x8CA7, - 16620: 0x8CA8, - 16621: 0x8CA9, - 16622: 0x8CAA, - 16623: 0x8CAB, - 16624: 0x8CAC, - 16625: 0x8CAD, - 16626: 0x4E8D, - 16627: 0x4E0C, - 16628: 0x5140, - 16629: 0x4E10, - 16630: 0x5EFF, - 16631: 0x5345, - 16632: 0x4E15, - 16633: 0x4E98, - 16634: 0x4E1E, - 16635: 0x9B32, - 16636: 0x5B6C, - 16637: 0x5669, - 16638: 0x4E28, - 16639: 0x79BA, - 16640: 0x4E3F, - 16641: 0x5315, - 16642: 0x4E47, - 16643: 0x592D, - 16644: 0x723B, - 16645: 0x536E, - 16646: 0x6C10, - 16647: 0x56DF, - 16648: 0x80E4, - 16649: 0x9997, - 16650: 0x6BD3, - 16651: 0x777E, - 16652: 0x9F17, - 16653: 0x4E36, - 16654: 0x4E9F, - 16655: 0x9F10, - 16656: 0x4E5C, - 16657: 0x4E69, - 16658: 0x4E93, - 16659: 0x8288, - 16660: 0x5B5B, - 16661: 0x556C, - 16662: 0x560F, - 16663: 0x4EC4, - 16664: 0x538D, - 16665: 0x539D, - 16666: 0x53A3, - 16667: 0x53A5, - 16668: 0x53AE, - 16669: 0x9765, - 16670: 0x8D5D, - 16671: 0x531A, - 16672: 0x53F5, - 16673: 0x5326, - 16674: 0x532E, - 16675: 0x533E, - 16676: 0x8D5C, - 16677: 0x5366, - 16678: 0x5363, - 16679: 0x5202, - 16680: 0x5208, - 16681: 0x520E, - 16682: 0x522D, - 16683: 0x5233, - 16684: 0x523F, - 16685: 0x5240, - 16686: 0x524C, - 16687: 0x525E, - 16688: 0x5261, - 16689: 0x525C, - 16690: 0x84AF, - 16691: 0x527D, - 16692: 0x5282, - 16693: 0x5281, - 16694: 0x5290, - 16695: 0x5293, - 16696: 0x5182, - 16697: 0x7F54, - 16698: 0x4EBB, - 16699: 0x4EC3, - 16700: 0x4EC9, - 16701: 0x4EC2, - 16702: 0x4EE8, - 16703: 0x4EE1, - 16704: 0x4EEB, - 16705: 0x4EDE, - 16706: 0x4F1B, - 16707: 0x4EF3, - 16708: 0x4F22, - 16709: 0x4F64, - 16710: 0x4EF5, - 16711: 0x4F25, - 16712: 0x4F27, - 16713: 0x4F09, - 16714: 0x4F2B, - 16715: 0x4F5E, - 16716: 0x4F67, - 16717: 0x6538, - 16718: 0x4F5A, - 16719: 0x4F5D, - 16720: 0x8CAE, - 16721: 0x8CAF, - 16722: 0x8CB0, - 16723: 0x8CB1, - 16724: 0x8CB2, - 16725: 0x8CB3, - 16726: 0x8CB4, - 16727: 0x8CB5, - 16728: 0x8CB6, - 16729: 0x8CB7, - 16730: 0x8CB8, - 16731: 0x8CB9, - 16732: 0x8CBA, - 16733: 0x8CBB, - 16734: 0x8CBC, - 16735: 0x8CBD, - 16736: 0x8CBE, - 16737: 0x8CBF, - 16738: 0x8CC0, - 16739: 0x8CC1, - 16740: 0x8CC2, - 16741: 0x8CC3, - 16742: 0x8CC4, - 16743: 0x8CC5, - 16744: 0x8CC6, - 16745: 0x8CC7, - 16746: 0x8CC8, - 16747: 0x8CC9, - 16748: 0x8CCA, - 16749: 0x8CCB, - 16750: 0x8CCC, - 16751: 0x8CCD, - 16752: 0x8CCE, - 16753: 0x8CCF, - 16754: 0x8CD0, - 16755: 0x8CD1, - 16756: 0x8CD2, - 16757: 0x8CD3, - 16758: 0x8CD4, - 16759: 0x8CD5, - 16760: 0x8CD6, - 16761: 0x8CD7, - 16762: 0x8CD8, - 16763: 0x8CD9, - 16764: 0x8CDA, - 16765: 0x8CDB, - 16766: 0x8CDC, - 16767: 0x8CDD, - 16768: 0x8CDE, - 16769: 0x8CDF, - 16770: 0x8CE0, - 16771: 0x8CE1, - 16772: 0x8CE2, - 16773: 0x8CE3, - 16774: 0x8CE4, - 16775: 0x8CE5, - 16776: 0x8CE6, - 16777: 0x8CE7, - 16778: 0x8CE8, - 16779: 0x8CE9, - 16780: 0x8CEA, - 16781: 0x8CEB, - 16782: 0x8CEC, - 16783: 0x8CED, - 16784: 0x8CEE, - 16785: 0x8CEF, - 16786: 0x8CF0, - 16787: 0x8CF1, - 16788: 0x8CF2, - 16789: 0x8CF3, - 16790: 0x8CF4, - 16791: 0x8CF5, - 16792: 0x8CF6, - 16793: 0x8CF7, - 16794: 0x8CF8, - 16795: 0x8CF9, - 16796: 0x8CFA, - 16797: 0x8CFB, - 16798: 0x8CFC, - 16799: 0x8CFD, - 16800: 0x8CFE, - 16801: 0x8CFF, - 16802: 0x8D00, - 16803: 0x8D01, - 16804: 0x8D02, - 16805: 0x8D03, - 16806: 0x8D04, - 16807: 0x8D05, - 16808: 0x8D06, - 16809: 0x8D07, - 16810: 0x8D08, - 16811: 0x8D09, - 16812: 0x8D0A, - 16813: 0x8D0B, - 16814: 0x8D0C, - 16815: 0x8D0D, - 16816: 0x4F5F, - 16817: 0x4F57, - 16818: 0x4F32, - 16819: 0x4F3D, - 16820: 0x4F76, - 16821: 0x4F74, - 16822: 0x4F91, - 16823: 0x4F89, - 16824: 0x4F83, - 16825: 0x4F8F, - 16826: 0x4F7E, - 16827: 0x4F7B, - 16828: 0x4FAA, - 16829: 0x4F7C, - 16830: 0x4FAC, - 16831: 0x4F94, - 16832: 0x4FE6, - 16833: 0x4FE8, - 16834: 0x4FEA, - 16835: 0x4FC5, - 16836: 0x4FDA, - 16837: 0x4FE3, - 16838: 0x4FDC, - 16839: 0x4FD1, - 16840: 0x4FDF, - 16841: 0x4FF8, - 16842: 0x5029, - 16843: 0x504C, - 16844: 0x4FF3, - 16845: 0x502C, - 16846: 0x500F, - 16847: 0x502E, - 16848: 0x502D, - 16849: 0x4FFE, - 16850: 0x501C, - 16851: 0x500C, - 16852: 0x5025, - 16853: 0x5028, - 16854: 0x507E, - 16855: 0x5043, - 16856: 0x5055, - 16857: 0x5048, - 16858: 0x504E, - 16859: 0x506C, - 16860: 0x507B, - 16861: 0x50A5, - 16862: 0x50A7, - 16863: 0x50A9, - 16864: 0x50BA, - 16865: 0x50D6, - 16866: 0x5106, - 16867: 0x50ED, - 16868: 0x50EC, - 16869: 0x50E6, - 16870: 0x50EE, - 16871: 0x5107, - 16872: 0x510B, - 16873: 0x4EDD, - 16874: 0x6C3D, - 16875: 0x4F58, - 16876: 0x4F65, - 16877: 0x4FCE, - 16878: 0x9FA0, - 16879: 0x6C46, - 16880: 0x7C74, - 16881: 0x516E, - 16882: 0x5DFD, - 16883: 0x9EC9, - 16884: 0x9998, - 16885: 0x5181, - 16886: 0x5914, - 16887: 0x52F9, - 16888: 0x530D, - 16889: 0x8A07, - 16890: 0x5310, - 16891: 0x51EB, - 16892: 0x5919, - 16893: 0x5155, - 16894: 0x4EA0, - 16895: 0x5156, - 16896: 0x4EB3, - 16897: 0x886E, - 16898: 0x88A4, - 16899: 0x4EB5, - 16900: 0x8114, - 16901: 0x88D2, - 16902: 0x7980, - 16903: 0x5B34, - 16904: 0x8803, - 16905: 0x7FB8, - 16906: 0x51AB, - 16907: 0x51B1, - 16908: 0x51BD, - 16909: 0x51BC, - 16910: 0x8D0E, - 16911: 0x8D0F, - 16912: 0x8D10, - 16913: 0x8D11, - 16914: 0x8D12, - 16915: 0x8D13, - 16916: 0x8D14, - 16917: 0x8D15, - 16918: 0x8D16, - 16919: 0x8D17, - 16920: 0x8D18, - 16921: 0x8D19, - 16922: 0x8D1A, - 16923: 0x8D1B, - 16924: 0x8D1C, - 16925: 0x8D20, - 16926: 0x8D51, - 16927: 0x8D52, - 16928: 0x8D57, - 16929: 0x8D5F, - 16930: 0x8D65, - 16931: 0x8D68, - 16932: 0x8D69, - 16933: 0x8D6A, - 16934: 0x8D6C, - 16935: 0x8D6E, - 16936: 0x8D6F, - 16937: 0x8D71, - 16938: 0x8D72, - 16939: 0x8D78, - 16940: 0x8D79, - 16941: 0x8D7A, - 16942: 0x8D7B, - 16943: 0x8D7C, - 16944: 0x8D7D, - 16945: 0x8D7E, - 16946: 0x8D7F, - 16947: 0x8D80, - 16948: 0x8D82, - 16949: 0x8D83, - 16950: 0x8D86, - 16951: 0x8D87, - 16952: 0x8D88, - 16953: 0x8D89, - 16954: 0x8D8C, - 16955: 0x8D8D, - 16956: 0x8D8E, - 16957: 0x8D8F, - 16958: 0x8D90, - 16959: 0x8D92, - 16960: 0x8D93, - 16961: 0x8D95, - 16962: 0x8D96, - 16963: 0x8D97, - 16964: 0x8D98, - 16965: 0x8D99, - 16966: 0x8D9A, - 16967: 0x8D9B, - 16968: 0x8D9C, - 16969: 0x8D9D, - 16970: 0x8D9E, - 16971: 0x8DA0, - 16972: 0x8DA1, - 16973: 0x8DA2, - 16974: 0x8DA4, - 16975: 0x8DA5, - 16976: 0x8DA6, - 16977: 0x8DA7, - 16978: 0x8DA8, - 16979: 0x8DA9, - 16980: 0x8DAA, - 16981: 0x8DAB, - 16982: 0x8DAC, - 16983: 0x8DAD, - 16984: 0x8DAE, - 16985: 0x8DAF, - 16986: 0x8DB0, - 16987: 0x8DB2, - 16988: 0x8DB6, - 16989: 0x8DB7, - 16990: 0x8DB9, - 16991: 0x8DBB, - 16992: 0x8DBD, - 16993: 0x8DC0, - 16994: 0x8DC1, - 16995: 0x8DC2, - 16996: 0x8DC5, - 16997: 0x8DC7, - 16998: 0x8DC8, - 16999: 0x8DC9, - 17000: 0x8DCA, - 17001: 0x8DCD, - 17002: 0x8DD0, - 17003: 0x8DD2, - 17004: 0x8DD3, - 17005: 0x8DD4, - 17006: 0x51C7, - 17007: 0x5196, - 17008: 0x51A2, - 17009: 0x51A5, - 17010: 0x8BA0, - 17011: 0x8BA6, - 17012: 0x8BA7, - 17013: 0x8BAA, - 17014: 0x8BB4, - 17015: 0x8BB5, - 17016: 0x8BB7, - 17017: 0x8BC2, - 17018: 0x8BC3, - 17019: 0x8BCB, - 17020: 0x8BCF, - 17021: 0x8BCE, - 17022: 0x8BD2, - 17023: 0x8BD3, - 17024: 0x8BD4, - 17025: 0x8BD6, - 17026: 0x8BD8, - 17027: 0x8BD9, - 17028: 0x8BDC, - 17029: 0x8BDF, - 17030: 0x8BE0, - 17031: 0x8BE4, - 17032: 0x8BE8, - 17033: 0x8BE9, - 17034: 0x8BEE, - 17035: 0x8BF0, - 17036: 0x8BF3, - 17037: 0x8BF6, - 17038: 0x8BF9, - 17039: 0x8BFC, - 17040: 0x8BFF, - 17041: 0x8C00, - 17042: 0x8C02, - 17043: 0x8C04, - 17044: 0x8C07, - 17045: 0x8C0C, - 17046: 0x8C0F, - 17047: 0x8C11, - 17048: 0x8C12, - 17049: 0x8C14, - 17050: 0x8C15, - 17051: 0x8C16, - 17052: 0x8C19, - 17053: 0x8C1B, - 17054: 0x8C18, - 17055: 0x8C1D, - 17056: 0x8C1F, - 17057: 0x8C20, - 17058: 0x8C21, - 17059: 0x8C25, - 17060: 0x8C27, - 17061: 0x8C2A, - 17062: 0x8C2B, - 17063: 0x8C2E, - 17064: 0x8C2F, - 17065: 0x8C32, - 17066: 0x8C33, - 17067: 0x8C35, - 17068: 0x8C36, - 17069: 0x5369, - 17070: 0x537A, - 17071: 0x961D, - 17072: 0x9622, - 17073: 0x9621, - 17074: 0x9631, - 17075: 0x962A, - 17076: 0x963D, - 17077: 0x963C, - 17078: 0x9642, - 17079: 0x9649, - 17080: 0x9654, - 17081: 0x965F, - 17082: 0x9667, - 17083: 0x966C, - 17084: 0x9672, - 17085: 0x9674, - 17086: 0x9688, - 17087: 0x968D, - 17088: 0x9697, - 17089: 0x96B0, - 17090: 0x9097, - 17091: 0x909B, - 17092: 0x909D, - 17093: 0x9099, - 17094: 0x90AC, - 17095: 0x90A1, - 17096: 0x90B4, - 17097: 0x90B3, - 17098: 0x90B6, - 17099: 0x90BA, - 17100: 0x8DD5, - 17101: 0x8DD8, - 17102: 0x8DD9, - 17103: 0x8DDC, - 17104: 0x8DE0, - 17105: 0x8DE1, - 17106: 0x8DE2, - 17107: 0x8DE5, - 17108: 0x8DE6, - 17109: 0x8DE7, - 17110: 0x8DE9, - 17111: 0x8DED, - 17112: 0x8DEE, - 17113: 0x8DF0, - 17114: 0x8DF1, - 17115: 0x8DF2, - 17116: 0x8DF4, - 17117: 0x8DF6, - 17118: 0x8DFC, - 17119: 0x8DFE, - 17120: 0x8DFF, - 17121: 0x8E00, - 17122: 0x8E01, - 17123: 0x8E02, - 17124: 0x8E03, - 17125: 0x8E04, - 17126: 0x8E06, - 17127: 0x8E07, - 17128: 0x8E08, - 17129: 0x8E0B, - 17130: 0x8E0D, - 17131: 0x8E0E, - 17132: 0x8E10, - 17133: 0x8E11, - 17134: 0x8E12, - 17135: 0x8E13, - 17136: 0x8E15, - 17137: 0x8E16, - 17138: 0x8E17, - 17139: 0x8E18, - 17140: 0x8E19, - 17141: 0x8E1A, - 17142: 0x8E1B, - 17143: 0x8E1C, - 17144: 0x8E20, - 17145: 0x8E21, - 17146: 0x8E24, - 17147: 0x8E25, - 17148: 0x8E26, - 17149: 0x8E27, - 17150: 0x8E28, - 17151: 0x8E2B, - 17152: 0x8E2D, - 17153: 0x8E30, - 17154: 0x8E32, - 17155: 0x8E33, - 17156: 0x8E34, - 17157: 0x8E36, - 17158: 0x8E37, - 17159: 0x8E38, - 17160: 0x8E3B, - 17161: 0x8E3C, - 17162: 0x8E3E, - 17163: 0x8E3F, - 17164: 0x8E43, - 17165: 0x8E45, - 17166: 0x8E46, - 17167: 0x8E4C, - 17168: 0x8E4D, - 17169: 0x8E4E, - 17170: 0x8E4F, - 17171: 0x8E50, - 17172: 0x8E53, - 17173: 0x8E54, - 17174: 0x8E55, - 17175: 0x8E56, - 17176: 0x8E57, - 17177: 0x8E58, - 17178: 0x8E5A, - 17179: 0x8E5B, - 17180: 0x8E5C, - 17181: 0x8E5D, - 17182: 0x8E5E, - 17183: 0x8E5F, - 17184: 0x8E60, - 17185: 0x8E61, - 17186: 0x8E62, - 17187: 0x8E63, - 17188: 0x8E64, - 17189: 0x8E65, - 17190: 0x8E67, - 17191: 0x8E68, - 17192: 0x8E6A, - 17193: 0x8E6B, - 17194: 0x8E6E, - 17195: 0x8E71, - 17196: 0x90B8, - 17197: 0x90B0, - 17198: 0x90CF, - 17199: 0x90C5, - 17200: 0x90BE, - 17201: 0x90D0, - 17202: 0x90C4, - 17203: 0x90C7, - 17204: 0x90D3, - 17205: 0x90E6, - 17206: 0x90E2, - 17207: 0x90DC, - 17208: 0x90D7, - 17209: 0x90DB, - 17210: 0x90EB, - 17211: 0x90EF, - 17212: 0x90FE, - 17213: 0x9104, - 17214: 0x9122, - 17215: 0x911E, - 17216: 0x9123, - 17217: 0x9131, - 17218: 0x912F, - 17219: 0x9139, - 17220: 0x9143, - 17221: 0x9146, - 17222: 0x520D, - 17223: 0x5942, - 17224: 0x52A2, - 17225: 0x52AC, - 17226: 0x52AD, - 17227: 0x52BE, - 17228: 0x54FF, - 17229: 0x52D0, - 17230: 0x52D6, - 17231: 0x52F0, - 17232: 0x53DF, - 17233: 0x71EE, - 17234: 0x77CD, - 17235: 0x5EF4, - 17236: 0x51F5, - 17237: 0x51FC, - 17238: 0x9B2F, - 17239: 0x53B6, - 17240: 0x5F01, - 17241: 0x755A, - 17242: 0x5DEF, - 17243: 0x574C, - 17244: 0x57A9, - 17245: 0x57A1, - 17246: 0x587E, - 17247: 0x58BC, - 17248: 0x58C5, - 17249: 0x58D1, - 17250: 0x5729, - 17251: 0x572C, - 17252: 0x572A, - 17253: 0x5733, - 17254: 0x5739, - 17255: 0x572E, - 17256: 0x572F, - 17257: 0x575C, - 17258: 0x573B, - 17259: 0x5742, - 17260: 0x5769, - 17261: 0x5785, - 17262: 0x576B, - 17263: 0x5786, - 17264: 0x577C, - 17265: 0x577B, - 17266: 0x5768, - 17267: 0x576D, - 17268: 0x5776, - 17269: 0x5773, - 17270: 0x57AD, - 17271: 0x57A4, - 17272: 0x578C, - 17273: 0x57B2, - 17274: 0x57CF, - 17275: 0x57A7, - 17276: 0x57B4, - 17277: 0x5793, - 17278: 0x57A0, - 17279: 0x57D5, - 17280: 0x57D8, - 17281: 0x57DA, - 17282: 0x57D9, - 17283: 0x57D2, - 17284: 0x57B8, - 17285: 0x57F4, - 17286: 0x57EF, - 17287: 0x57F8, - 17288: 0x57E4, - 17289: 0x57DD, - 17290: 0x8E73, - 17291: 0x8E75, - 17292: 0x8E77, - 17293: 0x8E78, - 17294: 0x8E79, - 17295: 0x8E7A, - 17296: 0x8E7B, - 17297: 0x8E7D, - 17298: 0x8E7E, - 17299: 0x8E80, - 17300: 0x8E82, - 17301: 0x8E83, - 17302: 0x8E84, - 17303: 0x8E86, - 17304: 0x8E88, - 17305: 0x8E89, - 17306: 0x8E8A, - 17307: 0x8E8B, - 17308: 0x8E8C, - 17309: 0x8E8D, - 17310: 0x8E8E, - 17311: 0x8E91, - 17312: 0x8E92, - 17313: 0x8E93, - 17314: 0x8E95, - 17315: 0x8E96, - 17316: 0x8E97, - 17317: 0x8E98, - 17318: 0x8E99, - 17319: 0x8E9A, - 17320: 0x8E9B, - 17321: 0x8E9D, - 17322: 0x8E9F, - 17323: 0x8EA0, - 17324: 0x8EA1, - 17325: 0x8EA2, - 17326: 0x8EA3, - 17327: 0x8EA4, - 17328: 0x8EA5, - 17329: 0x8EA6, - 17330: 0x8EA7, - 17331: 0x8EA8, - 17332: 0x8EA9, - 17333: 0x8EAA, - 17334: 0x8EAD, - 17335: 0x8EAE, - 17336: 0x8EB0, - 17337: 0x8EB1, - 17338: 0x8EB3, - 17339: 0x8EB4, - 17340: 0x8EB5, - 17341: 0x8EB6, - 17342: 0x8EB7, - 17343: 0x8EB8, - 17344: 0x8EB9, - 17345: 0x8EBB, - 17346: 0x8EBC, - 17347: 0x8EBD, - 17348: 0x8EBE, - 17349: 0x8EBF, - 17350: 0x8EC0, - 17351: 0x8EC1, - 17352: 0x8EC2, - 17353: 0x8EC3, - 17354: 0x8EC4, - 17355: 0x8EC5, - 17356: 0x8EC6, - 17357: 0x8EC7, - 17358: 0x8EC8, - 17359: 0x8EC9, - 17360: 0x8ECA, - 17361: 0x8ECB, - 17362: 0x8ECC, - 17363: 0x8ECD, - 17364: 0x8ECF, - 17365: 0x8ED0, - 17366: 0x8ED1, - 17367: 0x8ED2, - 17368: 0x8ED3, - 17369: 0x8ED4, - 17370: 0x8ED5, - 17371: 0x8ED6, - 17372: 0x8ED7, - 17373: 0x8ED8, - 17374: 0x8ED9, - 17375: 0x8EDA, - 17376: 0x8EDB, - 17377: 0x8EDC, - 17378: 0x8EDD, - 17379: 0x8EDE, - 17380: 0x8EDF, - 17381: 0x8EE0, - 17382: 0x8EE1, - 17383: 0x8EE2, - 17384: 0x8EE3, - 17385: 0x8EE4, - 17386: 0x580B, - 17387: 0x580D, - 17388: 0x57FD, - 17389: 0x57ED, - 17390: 0x5800, - 17391: 0x581E, - 17392: 0x5819, - 17393: 0x5844, - 17394: 0x5820, - 17395: 0x5865, - 17396: 0x586C, - 17397: 0x5881, - 17398: 0x5889, - 17399: 0x589A, - 17400: 0x5880, - 17401: 0x99A8, - 17402: 0x9F19, - 17403: 0x61FF, - 17404: 0x8279, - 17405: 0x827D, - 17406: 0x827F, - 17407: 0x828F, - 17408: 0x828A, - 17409: 0x82A8, - 17410: 0x8284, - 17411: 0x828E, - 17412: 0x8291, - 17413: 0x8297, - 17414: 0x8299, - 17415: 0x82AB, - 17416: 0x82B8, - 17417: 0x82BE, - 17418: 0x82B0, - 17419: 0x82C8, - 17420: 0x82CA, - 17421: 0x82E3, - 17422: 0x8298, - 17423: 0x82B7, - 17424: 0x82AE, - 17425: 0x82CB, - 17426: 0x82CC, - 17427: 0x82C1, - 17428: 0x82A9, - 17429: 0x82B4, - 17430: 0x82A1, - 17431: 0x82AA, - 17432: 0x829F, - 17433: 0x82C4, - 17434: 0x82CE, - 17435: 0x82A4, - 17436: 0x82E1, - 17437: 0x8309, - 17438: 0x82F7, - 17439: 0x82E4, - 17440: 0x830F, - 17441: 0x8307, - 17442: 0x82DC, - 17443: 0x82F4, - 17444: 0x82D2, - 17445: 0x82D8, - 17446: 0x830C, - 17447: 0x82FB, - 17448: 0x82D3, - 17449: 0x8311, - 17450: 0x831A, - 17451: 0x8306, - 17452: 0x8314, - 17453: 0x8315, - 17454: 0x82E0, - 17455: 0x82D5, - 17456: 0x831C, - 17457: 0x8351, - 17458: 0x835B, - 17459: 0x835C, - 17460: 0x8308, - 17461: 0x8392, - 17462: 0x833C, - 17463: 0x8334, - 17464: 0x8331, - 17465: 0x839B, - 17466: 0x835E, - 17467: 0x832F, - 17468: 0x834F, - 17469: 0x8347, - 17470: 0x8343, - 17471: 0x835F, - 17472: 0x8340, - 17473: 0x8317, - 17474: 0x8360, - 17475: 0x832D, - 17476: 0x833A, - 17477: 0x8333, - 17478: 0x8366, - 17479: 0x8365, - 17480: 0x8EE5, - 17481: 0x8EE6, - 17482: 0x8EE7, - 17483: 0x8EE8, - 17484: 0x8EE9, - 17485: 0x8EEA, - 17486: 0x8EEB, - 17487: 0x8EEC, - 17488: 0x8EED, - 17489: 0x8EEE, - 17490: 0x8EEF, - 17491: 0x8EF0, - 17492: 0x8EF1, - 17493: 0x8EF2, - 17494: 0x8EF3, - 17495: 0x8EF4, - 17496: 0x8EF5, - 17497: 0x8EF6, - 17498: 0x8EF7, - 17499: 0x8EF8, - 17500: 0x8EF9, - 17501: 0x8EFA, - 17502: 0x8EFB, - 17503: 0x8EFC, - 17504: 0x8EFD, - 17505: 0x8EFE, - 17506: 0x8EFF, - 17507: 0x8F00, - 17508: 0x8F01, - 17509: 0x8F02, - 17510: 0x8F03, - 17511: 0x8F04, - 17512: 0x8F05, - 17513: 0x8F06, - 17514: 0x8F07, - 17515: 0x8F08, - 17516: 0x8F09, - 17517: 0x8F0A, - 17518: 0x8F0B, - 17519: 0x8F0C, - 17520: 0x8F0D, - 17521: 0x8F0E, - 17522: 0x8F0F, - 17523: 0x8F10, - 17524: 0x8F11, - 17525: 0x8F12, - 17526: 0x8F13, - 17527: 0x8F14, - 17528: 0x8F15, - 17529: 0x8F16, - 17530: 0x8F17, - 17531: 0x8F18, - 17532: 0x8F19, - 17533: 0x8F1A, - 17534: 0x8F1B, - 17535: 0x8F1C, - 17536: 0x8F1D, - 17537: 0x8F1E, - 17538: 0x8F1F, - 17539: 0x8F20, - 17540: 0x8F21, - 17541: 0x8F22, - 17542: 0x8F23, - 17543: 0x8F24, - 17544: 0x8F25, - 17545: 0x8F26, - 17546: 0x8F27, - 17547: 0x8F28, - 17548: 0x8F29, - 17549: 0x8F2A, - 17550: 0x8F2B, - 17551: 0x8F2C, - 17552: 0x8F2D, - 17553: 0x8F2E, - 17554: 0x8F2F, - 17555: 0x8F30, - 17556: 0x8F31, - 17557: 0x8F32, - 17558: 0x8F33, - 17559: 0x8F34, - 17560: 0x8F35, - 17561: 0x8F36, - 17562: 0x8F37, - 17563: 0x8F38, - 17564: 0x8F39, - 17565: 0x8F3A, - 17566: 0x8F3B, - 17567: 0x8F3C, - 17568: 0x8F3D, - 17569: 0x8F3E, - 17570: 0x8F3F, - 17571: 0x8F40, - 17572: 0x8F41, - 17573: 0x8F42, - 17574: 0x8F43, - 17575: 0x8F44, - 17576: 0x8368, - 17577: 0x831B, - 17578: 0x8369, - 17579: 0x836C, - 17580: 0x836A, - 17581: 0x836D, - 17582: 0x836E, - 17583: 0x83B0, - 17584: 0x8378, - 17585: 0x83B3, - 17586: 0x83B4, - 17587: 0x83A0, - 17588: 0x83AA, - 17589: 0x8393, - 17590: 0x839C, - 17591: 0x8385, - 17592: 0x837C, - 17593: 0x83B6, - 17594: 0x83A9, - 17595: 0x837D, - 17596: 0x83B8, - 17597: 0x837B, - 17598: 0x8398, - 17599: 0x839E, - 17600: 0x83A8, - 17601: 0x83BA, - 17602: 0x83BC, - 17603: 0x83C1, - 17604: 0x8401, - 17605: 0x83E5, - 17606: 0x83D8, - 17607: 0x5807, - 17608: 0x8418, - 17609: 0x840B, - 17610: 0x83DD, - 17611: 0x83FD, - 17612: 0x83D6, - 17613: 0x841C, - 17614: 0x8438, - 17615: 0x8411, - 17616: 0x8406, - 17617: 0x83D4, - 17618: 0x83DF, - 17619: 0x840F, - 17620: 0x8403, - 17621: 0x83F8, - 17622: 0x83F9, - 17623: 0x83EA, - 17624: 0x83C5, - 17625: 0x83C0, - 17626: 0x8426, - 17627: 0x83F0, - 17628: 0x83E1, - 17629: 0x845C, - 17630: 0x8451, - 17631: 0x845A, - 17632: 0x8459, - 17633: 0x8473, - 17634: 0x8487, - 17635: 0x8488, - 17636: 0x847A, - 17637: 0x8489, - 17638: 0x8478, - 17639: 0x843C, - 17640: 0x8446, - 17641: 0x8469, - 17642: 0x8476, - 17643: 0x848C, - 17644: 0x848E, - 17645: 0x8431, - 17646: 0x846D, - 17647: 0x84C1, - 17648: 0x84CD, - 17649: 0x84D0, - 17650: 0x84E6, - 17651: 0x84BD, - 17652: 0x84D3, - 17653: 0x84CA, - 17654: 0x84BF, - 17655: 0x84BA, - 17656: 0x84E0, - 17657: 0x84A1, - 17658: 0x84B9, - 17659: 0x84B4, - 17660: 0x8497, - 17661: 0x84E5, - 17662: 0x84E3, - 17663: 0x850C, - 17664: 0x750D, - 17665: 0x8538, - 17666: 0x84F0, - 17667: 0x8539, - 17668: 0x851F, - 17669: 0x853A, - 17670: 0x8F45, - 17671: 0x8F46, - 17672: 0x8F47, - 17673: 0x8F48, - 17674: 0x8F49, - 17675: 0x8F4A, - 17676: 0x8F4B, - 17677: 0x8F4C, - 17678: 0x8F4D, - 17679: 0x8F4E, - 17680: 0x8F4F, - 17681: 0x8F50, - 17682: 0x8F51, - 17683: 0x8F52, - 17684: 0x8F53, - 17685: 0x8F54, - 17686: 0x8F55, - 17687: 0x8F56, - 17688: 0x8F57, - 17689: 0x8F58, - 17690: 0x8F59, - 17691: 0x8F5A, - 17692: 0x8F5B, - 17693: 0x8F5C, - 17694: 0x8F5D, - 17695: 0x8F5E, - 17696: 0x8F5F, - 17697: 0x8F60, - 17698: 0x8F61, - 17699: 0x8F62, - 17700: 0x8F63, - 17701: 0x8F64, - 17702: 0x8F65, - 17703: 0x8F6A, - 17704: 0x8F80, - 17705: 0x8F8C, - 17706: 0x8F92, - 17707: 0x8F9D, - 17708: 0x8FA0, - 17709: 0x8FA1, - 17710: 0x8FA2, - 17711: 0x8FA4, - 17712: 0x8FA5, - 17713: 0x8FA6, - 17714: 0x8FA7, - 17715: 0x8FAA, - 17716: 0x8FAC, - 17717: 0x8FAD, - 17718: 0x8FAE, - 17719: 0x8FAF, - 17720: 0x8FB2, - 17721: 0x8FB3, - 17722: 0x8FB4, - 17723: 0x8FB5, - 17724: 0x8FB7, - 17725: 0x8FB8, - 17726: 0x8FBA, - 17727: 0x8FBB, - 17728: 0x8FBC, - 17729: 0x8FBF, - 17730: 0x8FC0, - 17731: 0x8FC3, - 17732: 0x8FC6, - 17733: 0x8FC9, - 17734: 0x8FCA, - 17735: 0x8FCB, - 17736: 0x8FCC, - 17737: 0x8FCD, - 17738: 0x8FCF, - 17739: 0x8FD2, - 17740: 0x8FD6, - 17741: 0x8FD7, - 17742: 0x8FDA, - 17743: 0x8FE0, - 17744: 0x8FE1, - 17745: 0x8FE3, - 17746: 0x8FE7, - 17747: 0x8FEC, - 17748: 0x8FEF, - 17749: 0x8FF1, - 17750: 0x8FF2, - 17751: 0x8FF4, - 17752: 0x8FF5, - 17753: 0x8FF6, - 17754: 0x8FFA, - 17755: 0x8FFB, - 17756: 0x8FFC, - 17757: 0x8FFE, - 17758: 0x8FFF, - 17759: 0x9007, - 17760: 0x9008, - 17761: 0x900C, - 17762: 0x900E, - 17763: 0x9013, - 17764: 0x9015, - 17765: 0x9018, - 17766: 0x8556, - 17767: 0x853B, - 17768: 0x84FF, - 17769: 0x84FC, - 17770: 0x8559, - 17771: 0x8548, - 17772: 0x8568, - 17773: 0x8564, - 17774: 0x855E, - 17775: 0x857A, - 17776: 0x77A2, - 17777: 0x8543, - 17778: 0x8572, - 17779: 0x857B, - 17780: 0x85A4, - 17781: 0x85A8, - 17782: 0x8587, - 17783: 0x858F, - 17784: 0x8579, - 17785: 0x85AE, - 17786: 0x859C, - 17787: 0x8585, - 17788: 0x85B9, - 17789: 0x85B7, - 17790: 0x85B0, - 17791: 0x85D3, - 17792: 0x85C1, - 17793: 0x85DC, - 17794: 0x85FF, - 17795: 0x8627, - 17796: 0x8605, - 17797: 0x8629, - 17798: 0x8616, - 17799: 0x863C, - 17800: 0x5EFE, - 17801: 0x5F08, - 17802: 0x593C, - 17803: 0x5941, - 17804: 0x8037, - 17805: 0x5955, - 17806: 0x595A, - 17807: 0x5958, - 17808: 0x530F, - 17809: 0x5C22, - 17810: 0x5C25, - 17811: 0x5C2C, - 17812: 0x5C34, - 17813: 0x624C, - 17814: 0x626A, - 17815: 0x629F, - 17816: 0x62BB, - 17817: 0x62CA, - 17818: 0x62DA, - 17819: 0x62D7, - 17820: 0x62EE, - 17821: 0x6322, - 17822: 0x62F6, - 17823: 0x6339, - 17824: 0x634B, - 17825: 0x6343, - 17826: 0x63AD, - 17827: 0x63F6, - 17828: 0x6371, - 17829: 0x637A, - 17830: 0x638E, - 17831: 0x63B4, - 17832: 0x636D, - 17833: 0x63AC, - 17834: 0x638A, - 17835: 0x6369, - 17836: 0x63AE, - 17837: 0x63BC, - 17838: 0x63F2, - 17839: 0x63F8, - 17840: 0x63E0, - 17841: 0x63FF, - 17842: 0x63C4, - 17843: 0x63DE, - 17844: 0x63CE, - 17845: 0x6452, - 17846: 0x63C6, - 17847: 0x63BE, - 17848: 0x6445, - 17849: 0x6441, - 17850: 0x640B, - 17851: 0x641B, - 17852: 0x6420, - 17853: 0x640C, - 17854: 0x6426, - 17855: 0x6421, - 17856: 0x645E, - 17857: 0x6484, - 17858: 0x646D, - 17859: 0x6496, - 17860: 0x9019, - 17861: 0x901C, - 17862: 0x9023, - 17863: 0x9024, - 17864: 0x9025, - 17865: 0x9027, - 17866: 0x9028, - 17867: 0x9029, - 17868: 0x902A, - 17869: 0x902B, - 17870: 0x902C, - 17871: 0x9030, - 17872: 0x9031, - 17873: 0x9032, - 17874: 0x9033, - 17875: 0x9034, - 17876: 0x9037, - 17877: 0x9039, - 17878: 0x903A, - 17879: 0x903D, - 17880: 0x903F, - 17881: 0x9040, - 17882: 0x9043, - 17883: 0x9045, - 17884: 0x9046, - 17885: 0x9048, - 17886: 0x9049, - 17887: 0x904A, - 17888: 0x904B, - 17889: 0x904C, - 17890: 0x904E, - 17891: 0x9054, - 17892: 0x9055, - 17893: 0x9056, - 17894: 0x9059, - 17895: 0x905A, - 17896: 0x905C, - 17897: 0x905D, - 17898: 0x905E, - 17899: 0x905F, - 17900: 0x9060, - 17901: 0x9061, - 17902: 0x9064, - 17903: 0x9066, - 17904: 0x9067, - 17905: 0x9069, - 17906: 0x906A, - 17907: 0x906B, - 17908: 0x906C, - 17909: 0x906F, - 17910: 0x9070, - 17911: 0x9071, - 17912: 0x9072, - 17913: 0x9073, - 17914: 0x9076, - 17915: 0x9077, - 17916: 0x9078, - 17917: 0x9079, - 17918: 0x907A, - 17919: 0x907B, - 17920: 0x907C, - 17921: 0x907E, - 17922: 0x9081, - 17923: 0x9084, - 17924: 0x9085, - 17925: 0x9086, - 17926: 0x9087, - 17927: 0x9089, - 17928: 0x908A, - 17929: 0x908C, - 17930: 0x908D, - 17931: 0x908E, - 17932: 0x908F, - 17933: 0x9090, - 17934: 0x9092, - 17935: 0x9094, - 17936: 0x9096, - 17937: 0x9098, - 17938: 0x909A, - 17939: 0x909C, - 17940: 0x909E, - 17941: 0x909F, - 17942: 0x90A0, - 17943: 0x90A4, - 17944: 0x90A5, - 17945: 0x90A7, - 17946: 0x90A8, - 17947: 0x90A9, - 17948: 0x90AB, - 17949: 0x90AD, - 17950: 0x90B2, - 17951: 0x90B7, - 17952: 0x90BC, - 17953: 0x90BD, - 17954: 0x90BF, - 17955: 0x90C0, - 17956: 0x647A, - 17957: 0x64B7, - 17958: 0x64B8, - 17959: 0x6499, - 17960: 0x64BA, - 17961: 0x64C0, - 17962: 0x64D0, - 17963: 0x64D7, - 17964: 0x64E4, - 17965: 0x64E2, - 17966: 0x6509, - 17967: 0x6525, - 17968: 0x652E, - 17969: 0x5F0B, - 17970: 0x5FD2, - 17971: 0x7519, - 17972: 0x5F11, - 17973: 0x535F, - 17974: 0x53F1, - 17975: 0x53FD, - 17976: 0x53E9, - 17977: 0x53E8, - 17978: 0x53FB, - 17979: 0x5412, - 17980: 0x5416, - 17981: 0x5406, - 17982: 0x544B, - 17983: 0x5452, - 17984: 0x5453, - 17985: 0x5454, - 17986: 0x5456, - 17987: 0x5443, - 17988: 0x5421, - 17989: 0x5457, - 17990: 0x5459, - 17991: 0x5423, - 17992: 0x5432, - 17993: 0x5482, - 17994: 0x5494, - 17995: 0x5477, - 17996: 0x5471, - 17997: 0x5464, - 17998: 0x549A, - 17999: 0x549B, - 18000: 0x5484, - 18001: 0x5476, - 18002: 0x5466, - 18003: 0x549D, - 18004: 0x54D0, - 18005: 0x54AD, - 18006: 0x54C2, - 18007: 0x54B4, - 18008: 0x54D2, - 18009: 0x54A7, - 18010: 0x54A6, - 18011: 0x54D3, - 18012: 0x54D4, - 18013: 0x5472, - 18014: 0x54A3, - 18015: 0x54D5, - 18016: 0x54BB, - 18017: 0x54BF, - 18018: 0x54CC, - 18019: 0x54D9, - 18020: 0x54DA, - 18021: 0x54DC, - 18022: 0x54A9, - 18023: 0x54AA, - 18024: 0x54A4, - 18025: 0x54DD, - 18026: 0x54CF, - 18027: 0x54DE, - 18028: 0x551B, - 18029: 0x54E7, - 18030: 0x5520, - 18031: 0x54FD, - 18032: 0x5514, - 18033: 0x54F3, - 18034: 0x5522, - 18035: 0x5523, - 18036: 0x550F, - 18037: 0x5511, - 18038: 0x5527, - 18039: 0x552A, - 18040: 0x5567, - 18041: 0x558F, - 18042: 0x55B5, - 18043: 0x5549, - 18044: 0x556D, - 18045: 0x5541, - 18046: 0x5555, - 18047: 0x553F, - 18048: 0x5550, - 18049: 0x553C, - 18050: 0x90C2, - 18051: 0x90C3, - 18052: 0x90C6, - 18053: 0x90C8, - 18054: 0x90C9, - 18055: 0x90CB, - 18056: 0x90CC, - 18057: 0x90CD, - 18058: 0x90D2, - 18059: 0x90D4, - 18060: 0x90D5, - 18061: 0x90D6, - 18062: 0x90D8, - 18063: 0x90D9, - 18064: 0x90DA, - 18065: 0x90DE, - 18066: 0x90DF, - 18067: 0x90E0, - 18068: 0x90E3, - 18069: 0x90E4, - 18070: 0x90E5, - 18071: 0x90E9, - 18072: 0x90EA, - 18073: 0x90EC, - 18074: 0x90EE, - 18075: 0x90F0, - 18076: 0x90F1, - 18077: 0x90F2, - 18078: 0x90F3, - 18079: 0x90F5, - 18080: 0x90F6, - 18081: 0x90F7, - 18082: 0x90F9, - 18083: 0x90FA, - 18084: 0x90FB, - 18085: 0x90FC, - 18086: 0x90FF, - 18087: 0x9100, - 18088: 0x9101, - 18089: 0x9103, - 18090: 0x9105, - 18091: 0x9106, - 18092: 0x9107, - 18093: 0x9108, - 18094: 0x9109, - 18095: 0x910A, - 18096: 0x910B, - 18097: 0x910C, - 18098: 0x910D, - 18099: 0x910E, - 18100: 0x910F, - 18101: 0x9110, - 18102: 0x9111, - 18103: 0x9112, - 18104: 0x9113, - 18105: 0x9114, - 18106: 0x9115, - 18107: 0x9116, - 18108: 0x9117, - 18109: 0x9118, - 18110: 0x911A, - 18111: 0x911B, - 18112: 0x911C, - 18113: 0x911D, - 18114: 0x911F, - 18115: 0x9120, - 18116: 0x9121, - 18117: 0x9124, - 18118: 0x9125, - 18119: 0x9126, - 18120: 0x9127, - 18121: 0x9128, - 18122: 0x9129, - 18123: 0x912A, - 18124: 0x912B, - 18125: 0x912C, - 18126: 0x912D, - 18127: 0x912E, - 18128: 0x9130, - 18129: 0x9132, - 18130: 0x9133, - 18131: 0x9134, - 18132: 0x9135, - 18133: 0x9136, - 18134: 0x9137, - 18135: 0x9138, - 18136: 0x913A, - 18137: 0x913B, - 18138: 0x913C, - 18139: 0x913D, - 18140: 0x913E, - 18141: 0x913F, - 18142: 0x9140, - 18143: 0x9141, - 18144: 0x9142, - 18145: 0x9144, - 18146: 0x5537, - 18147: 0x5556, - 18148: 0x5575, - 18149: 0x5576, - 18150: 0x5577, - 18151: 0x5533, - 18152: 0x5530, - 18153: 0x555C, - 18154: 0x558B, - 18155: 0x55D2, - 18156: 0x5583, - 18157: 0x55B1, - 18158: 0x55B9, - 18159: 0x5588, - 18160: 0x5581, - 18161: 0x559F, - 18162: 0x557E, - 18163: 0x55D6, - 18164: 0x5591, - 18165: 0x557B, - 18166: 0x55DF, - 18167: 0x55BD, - 18168: 0x55BE, - 18169: 0x5594, - 18170: 0x5599, - 18171: 0x55EA, - 18172: 0x55F7, - 18173: 0x55C9, - 18174: 0x561F, - 18175: 0x55D1, - 18176: 0x55EB, - 18177: 0x55EC, - 18178: 0x55D4, - 18179: 0x55E6, - 18180: 0x55DD, - 18181: 0x55C4, - 18182: 0x55EF, - 18183: 0x55E5, - 18184: 0x55F2, - 18185: 0x55F3, - 18186: 0x55CC, - 18187: 0x55CD, - 18188: 0x55E8, - 18189: 0x55F5, - 18190: 0x55E4, - 18191: 0x8F94, - 18192: 0x561E, - 18193: 0x5608, - 18194: 0x560C, - 18195: 0x5601, - 18196: 0x5624, - 18197: 0x5623, - 18198: 0x55FE, - 18199: 0x5600, - 18200: 0x5627, - 18201: 0x562D, - 18202: 0x5658, - 18203: 0x5639, - 18204: 0x5657, - 18205: 0x562C, - 18206: 0x564D, - 18207: 0x5662, - 18208: 0x5659, - 18209: 0x565C, - 18210: 0x564C, - 18211: 0x5654, - 18212: 0x5686, - 18213: 0x5664, - 18214: 0x5671, - 18215: 0x566B, - 18216: 0x567B, - 18217: 0x567C, - 18218: 0x5685, - 18219: 0x5693, - 18220: 0x56AF, - 18221: 0x56D4, - 18222: 0x56D7, - 18223: 0x56DD, - 18224: 0x56E1, - 18225: 0x56F5, - 18226: 0x56EB, - 18227: 0x56F9, - 18228: 0x56FF, - 18229: 0x5704, - 18230: 0x570A, - 18231: 0x5709, - 18232: 0x571C, - 18233: 0x5E0F, - 18234: 0x5E19, - 18235: 0x5E14, - 18236: 0x5E11, - 18237: 0x5E31, - 18238: 0x5E3B, - 18239: 0x5E3C, - 18240: 0x9145, - 18241: 0x9147, - 18242: 0x9148, - 18243: 0x9151, - 18244: 0x9153, - 18245: 0x9154, - 18246: 0x9155, - 18247: 0x9156, - 18248: 0x9158, - 18249: 0x9159, - 18250: 0x915B, - 18251: 0x915C, - 18252: 0x915F, - 18253: 0x9160, - 18254: 0x9166, - 18255: 0x9167, - 18256: 0x9168, - 18257: 0x916B, - 18258: 0x916D, - 18259: 0x9173, - 18260: 0x917A, - 18261: 0x917B, - 18262: 0x917C, - 18263: 0x9180, - 18264: 0x9181, - 18265: 0x9182, - 18266: 0x9183, - 18267: 0x9184, - 18268: 0x9186, - 18269: 0x9188, - 18270: 0x918A, - 18271: 0x918E, - 18272: 0x918F, - 18273: 0x9193, - 18274: 0x9194, - 18275: 0x9195, - 18276: 0x9196, - 18277: 0x9197, - 18278: 0x9198, - 18279: 0x9199, - 18280: 0x919C, - 18281: 0x919D, - 18282: 0x919E, - 18283: 0x919F, - 18284: 0x91A0, - 18285: 0x91A1, - 18286: 0x91A4, - 18287: 0x91A5, - 18288: 0x91A6, - 18289: 0x91A7, - 18290: 0x91A8, - 18291: 0x91A9, - 18292: 0x91AB, - 18293: 0x91AC, - 18294: 0x91B0, - 18295: 0x91B1, - 18296: 0x91B2, - 18297: 0x91B3, - 18298: 0x91B6, - 18299: 0x91B7, - 18300: 0x91B8, - 18301: 0x91B9, - 18302: 0x91BB, - 18303: 0x91BC, - 18304: 0x91BD, - 18305: 0x91BE, - 18306: 0x91BF, - 18307: 0x91C0, - 18308: 0x91C1, - 18309: 0x91C2, - 18310: 0x91C3, - 18311: 0x91C4, - 18312: 0x91C5, - 18313: 0x91C6, - 18314: 0x91C8, - 18315: 0x91CB, - 18316: 0x91D0, - 18317: 0x91D2, - 18318: 0x91D3, - 18319: 0x91D4, - 18320: 0x91D5, - 18321: 0x91D6, - 18322: 0x91D7, - 18323: 0x91D8, - 18324: 0x91D9, - 18325: 0x91DA, - 18326: 0x91DB, - 18327: 0x91DD, - 18328: 0x91DE, - 18329: 0x91DF, - 18330: 0x91E0, - 18331: 0x91E1, - 18332: 0x91E2, - 18333: 0x91E3, - 18334: 0x91E4, - 18335: 0x91E5, - 18336: 0x5E37, - 18337: 0x5E44, - 18338: 0x5E54, - 18339: 0x5E5B, - 18340: 0x5E5E, - 18341: 0x5E61, - 18342: 0x5C8C, - 18343: 0x5C7A, - 18344: 0x5C8D, - 18345: 0x5C90, - 18346: 0x5C96, - 18347: 0x5C88, - 18348: 0x5C98, - 18349: 0x5C99, - 18350: 0x5C91, - 18351: 0x5C9A, - 18352: 0x5C9C, - 18353: 0x5CB5, - 18354: 0x5CA2, - 18355: 0x5CBD, - 18356: 0x5CAC, - 18357: 0x5CAB, - 18358: 0x5CB1, - 18359: 0x5CA3, - 18360: 0x5CC1, - 18361: 0x5CB7, - 18362: 0x5CC4, - 18363: 0x5CD2, - 18364: 0x5CE4, - 18365: 0x5CCB, - 18366: 0x5CE5, - 18367: 0x5D02, - 18368: 0x5D03, - 18369: 0x5D27, - 18370: 0x5D26, - 18371: 0x5D2E, - 18372: 0x5D24, - 18373: 0x5D1E, - 18374: 0x5D06, - 18375: 0x5D1B, - 18376: 0x5D58, - 18377: 0x5D3E, - 18378: 0x5D34, - 18379: 0x5D3D, - 18380: 0x5D6C, - 18381: 0x5D5B, - 18382: 0x5D6F, - 18383: 0x5D5D, - 18384: 0x5D6B, - 18385: 0x5D4B, - 18386: 0x5D4A, - 18387: 0x5D69, - 18388: 0x5D74, - 18389: 0x5D82, - 18390: 0x5D99, - 18391: 0x5D9D, - 18392: 0x8C73, - 18393: 0x5DB7, - 18394: 0x5DC5, - 18395: 0x5F73, - 18396: 0x5F77, - 18397: 0x5F82, - 18398: 0x5F87, - 18399: 0x5F89, - 18400: 0x5F8C, - 18401: 0x5F95, - 18402: 0x5F99, - 18403: 0x5F9C, - 18404: 0x5FA8, - 18405: 0x5FAD, - 18406: 0x5FB5, - 18407: 0x5FBC, - 18408: 0x8862, - 18409: 0x5F61, - 18410: 0x72AD, - 18411: 0x72B0, - 18412: 0x72B4, - 18413: 0x72B7, - 18414: 0x72B8, - 18415: 0x72C3, - 18416: 0x72C1, - 18417: 0x72CE, - 18418: 0x72CD, - 18419: 0x72D2, - 18420: 0x72E8, - 18421: 0x72EF, - 18422: 0x72E9, - 18423: 0x72F2, - 18424: 0x72F4, - 18425: 0x72F7, - 18426: 0x7301, - 18427: 0x72F3, - 18428: 0x7303, - 18429: 0x72FA, - 18430: 0x91E6, - 18431: 0x91E7, - 18432: 0x91E8, - 18433: 0x91E9, - 18434: 0x91EA, - 18435: 0x91EB, - 18436: 0x91EC, - 18437: 0x91ED, - 18438: 0x91EE, - 18439: 0x91EF, - 18440: 0x91F0, - 18441: 0x91F1, - 18442: 0x91F2, - 18443: 0x91F3, - 18444: 0x91F4, - 18445: 0x91F5, - 18446: 0x91F6, - 18447: 0x91F7, - 18448: 0x91F8, - 18449: 0x91F9, - 18450: 0x91FA, - 18451: 0x91FB, - 18452: 0x91FC, - 18453: 0x91FD, - 18454: 0x91FE, - 18455: 0x91FF, - 18456: 0x9200, - 18457: 0x9201, - 18458: 0x9202, - 18459: 0x9203, - 18460: 0x9204, - 18461: 0x9205, - 18462: 0x9206, - 18463: 0x9207, - 18464: 0x9208, - 18465: 0x9209, - 18466: 0x920A, - 18467: 0x920B, - 18468: 0x920C, - 18469: 0x920D, - 18470: 0x920E, - 18471: 0x920F, - 18472: 0x9210, - 18473: 0x9211, - 18474: 0x9212, - 18475: 0x9213, - 18476: 0x9214, - 18477: 0x9215, - 18478: 0x9216, - 18479: 0x9217, - 18480: 0x9218, - 18481: 0x9219, - 18482: 0x921A, - 18483: 0x921B, - 18484: 0x921C, - 18485: 0x921D, - 18486: 0x921E, - 18487: 0x921F, - 18488: 0x9220, - 18489: 0x9221, - 18490: 0x9222, - 18491: 0x9223, - 18492: 0x9224, - 18493: 0x9225, - 18494: 0x9226, - 18495: 0x9227, - 18496: 0x9228, - 18497: 0x9229, - 18498: 0x922A, - 18499: 0x922B, - 18500: 0x922C, - 18501: 0x922D, - 18502: 0x922E, - 18503: 0x922F, - 18504: 0x9230, - 18505: 0x9231, - 18506: 0x9232, - 18507: 0x9233, - 18508: 0x9234, - 18509: 0x9235, - 18510: 0x9236, - 18511: 0x9237, - 18512: 0x9238, - 18513: 0x9239, - 18514: 0x923A, - 18515: 0x923B, - 18516: 0x923C, - 18517: 0x923D, - 18518: 0x923E, - 18519: 0x923F, - 18520: 0x9240, - 18521: 0x9241, - 18522: 0x9242, - 18523: 0x9243, - 18524: 0x9244, - 18525: 0x9245, - 18526: 0x72FB, - 18527: 0x7317, - 18528: 0x7313, - 18529: 0x7321, - 18530: 0x730A, - 18531: 0x731E, - 18532: 0x731D, - 18533: 0x7315, - 18534: 0x7322, - 18535: 0x7339, - 18536: 0x7325, - 18537: 0x732C, - 18538: 0x7338, - 18539: 0x7331, - 18540: 0x7350, - 18541: 0x734D, - 18542: 0x7357, - 18543: 0x7360, - 18544: 0x736C, - 18545: 0x736F, - 18546: 0x737E, - 18547: 0x821B, - 18548: 0x5925, - 18549: 0x98E7, - 18550: 0x5924, - 18551: 0x5902, - 18552: 0x9963, - 18553: 0x9967, - 18554: 0x9968, - 18555: 0x9969, - 18556: 0x996A, - 18557: 0x996B, - 18558: 0x996C, - 18559: 0x9974, - 18560: 0x9977, - 18561: 0x997D, - 18562: 0x9980, - 18563: 0x9984, - 18564: 0x9987, - 18565: 0x998A, - 18566: 0x998D, - 18567: 0x9990, - 18568: 0x9991, - 18569: 0x9993, - 18570: 0x9994, - 18571: 0x9995, - 18572: 0x5E80, - 18573: 0x5E91, - 18574: 0x5E8B, - 18575: 0x5E96, - 18576: 0x5EA5, - 18577: 0x5EA0, - 18578: 0x5EB9, - 18579: 0x5EB5, - 18580: 0x5EBE, - 18581: 0x5EB3, - 18582: 0x8D53, - 18583: 0x5ED2, - 18584: 0x5ED1, - 18585: 0x5EDB, - 18586: 0x5EE8, - 18587: 0x5EEA, - 18588: 0x81BA, - 18589: 0x5FC4, - 18590: 0x5FC9, - 18591: 0x5FD6, - 18592: 0x5FCF, - 18593: 0x6003, - 18594: 0x5FEE, - 18595: 0x6004, - 18596: 0x5FE1, - 18597: 0x5FE4, - 18598: 0x5FFE, - 18599: 0x6005, - 18600: 0x6006, - 18601: 0x5FEA, - 18602: 0x5FED, - 18603: 0x5FF8, - 18604: 0x6019, - 18605: 0x6035, - 18606: 0x6026, - 18607: 0x601B, - 18608: 0x600F, - 18609: 0x600D, - 18610: 0x6029, - 18611: 0x602B, - 18612: 0x600A, - 18613: 0x603F, - 18614: 0x6021, - 18615: 0x6078, - 18616: 0x6079, - 18617: 0x607B, - 18618: 0x607A, - 18619: 0x6042, - 18620: 0x9246, - 18621: 0x9247, - 18622: 0x9248, - 18623: 0x9249, - 18624: 0x924A, - 18625: 0x924B, - 18626: 0x924C, - 18627: 0x924D, - 18628: 0x924E, - 18629: 0x924F, - 18630: 0x9250, - 18631: 0x9251, - 18632: 0x9252, - 18633: 0x9253, - 18634: 0x9254, - 18635: 0x9255, - 18636: 0x9256, - 18637: 0x9257, - 18638: 0x9258, - 18639: 0x9259, - 18640: 0x925A, - 18641: 0x925B, - 18642: 0x925C, - 18643: 0x925D, - 18644: 0x925E, - 18645: 0x925F, - 18646: 0x9260, - 18647: 0x9261, - 18648: 0x9262, - 18649: 0x9263, - 18650: 0x9264, - 18651: 0x9265, - 18652: 0x9266, - 18653: 0x9267, - 18654: 0x9268, - 18655: 0x9269, - 18656: 0x926A, - 18657: 0x926B, - 18658: 0x926C, - 18659: 0x926D, - 18660: 0x926E, - 18661: 0x926F, - 18662: 0x9270, - 18663: 0x9271, - 18664: 0x9272, - 18665: 0x9273, - 18666: 0x9275, - 18667: 0x9276, - 18668: 0x9277, - 18669: 0x9278, - 18670: 0x9279, - 18671: 0x927A, - 18672: 0x927B, - 18673: 0x927C, - 18674: 0x927D, - 18675: 0x927E, - 18676: 0x927F, - 18677: 0x9280, - 18678: 0x9281, - 18679: 0x9282, - 18680: 0x9283, - 18681: 0x9284, - 18682: 0x9285, - 18683: 0x9286, - 18684: 0x9287, - 18685: 0x9288, - 18686: 0x9289, - 18687: 0x928A, - 18688: 0x928B, - 18689: 0x928C, - 18690: 0x928D, - 18691: 0x928F, - 18692: 0x9290, - 18693: 0x9291, - 18694: 0x9292, - 18695: 0x9293, - 18696: 0x9294, - 18697: 0x9295, - 18698: 0x9296, - 18699: 0x9297, - 18700: 0x9298, - 18701: 0x9299, - 18702: 0x929A, - 18703: 0x929B, - 18704: 0x929C, - 18705: 0x929D, - 18706: 0x929E, - 18707: 0x929F, - 18708: 0x92A0, - 18709: 0x92A1, - 18710: 0x92A2, - 18711: 0x92A3, - 18712: 0x92A4, - 18713: 0x92A5, - 18714: 0x92A6, - 18715: 0x92A7, - 18716: 0x606A, - 18717: 0x607D, - 18718: 0x6096, - 18719: 0x609A, - 18720: 0x60AD, - 18721: 0x609D, - 18722: 0x6083, - 18723: 0x6092, - 18724: 0x608C, - 18725: 0x609B, - 18726: 0x60EC, - 18727: 0x60BB, - 18728: 0x60B1, - 18729: 0x60DD, - 18730: 0x60D8, - 18731: 0x60C6, - 18732: 0x60DA, - 18733: 0x60B4, - 18734: 0x6120, - 18735: 0x6126, - 18736: 0x6115, - 18737: 0x6123, - 18738: 0x60F4, - 18739: 0x6100, - 18740: 0x610E, - 18741: 0x612B, - 18742: 0x614A, - 18743: 0x6175, - 18744: 0x61AC, - 18745: 0x6194, - 18746: 0x61A7, - 18747: 0x61B7, - 18748: 0x61D4, - 18749: 0x61F5, - 18750: 0x5FDD, - 18751: 0x96B3, - 18752: 0x95E9, - 18753: 0x95EB, - 18754: 0x95F1, - 18755: 0x95F3, - 18756: 0x95F5, - 18757: 0x95F6, - 18758: 0x95FC, - 18759: 0x95FE, - 18760: 0x9603, - 18761: 0x9604, - 18762: 0x9606, - 18763: 0x9608, - 18764: 0x960A, - 18765: 0x960B, - 18766: 0x960C, - 18767: 0x960D, - 18768: 0x960F, - 18769: 0x9612, - 18770: 0x9615, - 18771: 0x9616, - 18772: 0x9617, - 18773: 0x9619, - 18774: 0x961A, - 18775: 0x4E2C, - 18776: 0x723F, - 18777: 0x6215, - 18778: 0x6C35, - 18779: 0x6C54, - 18780: 0x6C5C, - 18781: 0x6C4A, - 18782: 0x6CA3, - 18783: 0x6C85, - 18784: 0x6C90, - 18785: 0x6C94, - 18786: 0x6C8C, - 18787: 0x6C68, - 18788: 0x6C69, - 18789: 0x6C74, - 18790: 0x6C76, - 18791: 0x6C86, - 18792: 0x6CA9, - 18793: 0x6CD0, - 18794: 0x6CD4, - 18795: 0x6CAD, - 18796: 0x6CF7, - 18797: 0x6CF8, - 18798: 0x6CF1, - 18799: 0x6CD7, - 18800: 0x6CB2, - 18801: 0x6CE0, - 18802: 0x6CD6, - 18803: 0x6CFA, - 18804: 0x6CEB, - 18805: 0x6CEE, - 18806: 0x6CB1, - 18807: 0x6CD3, - 18808: 0x6CEF, - 18809: 0x6CFE, - 18810: 0x92A8, - 18811: 0x92A9, - 18812: 0x92AA, - 18813: 0x92AB, - 18814: 0x92AC, - 18815: 0x92AD, - 18816: 0x92AF, - 18817: 0x92B0, - 18818: 0x92B1, - 18819: 0x92B2, - 18820: 0x92B3, - 18821: 0x92B4, - 18822: 0x92B5, - 18823: 0x92B6, - 18824: 0x92B7, - 18825: 0x92B8, - 18826: 0x92B9, - 18827: 0x92BA, - 18828: 0x92BB, - 18829: 0x92BC, - 18830: 0x92BD, - 18831: 0x92BE, - 18832: 0x92BF, - 18833: 0x92C0, - 18834: 0x92C1, - 18835: 0x92C2, - 18836: 0x92C3, - 18837: 0x92C4, - 18838: 0x92C5, - 18839: 0x92C6, - 18840: 0x92C7, - 18841: 0x92C9, - 18842: 0x92CA, - 18843: 0x92CB, - 18844: 0x92CC, - 18845: 0x92CD, - 18846: 0x92CE, - 18847: 0x92CF, - 18848: 0x92D0, - 18849: 0x92D1, - 18850: 0x92D2, - 18851: 0x92D3, - 18852: 0x92D4, - 18853: 0x92D5, - 18854: 0x92D6, - 18855: 0x92D7, - 18856: 0x92D8, - 18857: 0x92D9, - 18858: 0x92DA, - 18859: 0x92DB, - 18860: 0x92DC, - 18861: 0x92DD, - 18862: 0x92DE, - 18863: 0x92DF, - 18864: 0x92E0, - 18865: 0x92E1, - 18866: 0x92E2, - 18867: 0x92E3, - 18868: 0x92E4, - 18869: 0x92E5, - 18870: 0x92E6, - 18871: 0x92E7, - 18872: 0x92E8, - 18873: 0x92E9, - 18874: 0x92EA, - 18875: 0x92EB, - 18876: 0x92EC, - 18877: 0x92ED, - 18878: 0x92EE, - 18879: 0x92EF, - 18880: 0x92F0, - 18881: 0x92F1, - 18882: 0x92F2, - 18883: 0x92F3, - 18884: 0x92F4, - 18885: 0x92F5, - 18886: 0x92F6, - 18887: 0x92F7, - 18888: 0x92F8, - 18889: 0x92F9, - 18890: 0x92FA, - 18891: 0x92FB, - 18892: 0x92FC, - 18893: 0x92FD, - 18894: 0x92FE, - 18895: 0x92FF, - 18896: 0x9300, - 18897: 0x9301, - 18898: 0x9302, - 18899: 0x9303, - 18900: 0x9304, - 18901: 0x9305, - 18902: 0x9306, - 18903: 0x9307, - 18904: 0x9308, - 18905: 0x9309, - 18906: 0x6D39, - 18907: 0x6D27, - 18908: 0x6D0C, - 18909: 0x6D43, - 18910: 0x6D48, - 18911: 0x6D07, - 18912: 0x6D04, - 18913: 0x6D19, - 18914: 0x6D0E, - 18915: 0x6D2B, - 18916: 0x6D4D, - 18917: 0x6D2E, - 18918: 0x6D35, - 18919: 0x6D1A, - 18920: 0x6D4F, - 18921: 0x6D52, - 18922: 0x6D54, - 18923: 0x6D33, - 18924: 0x6D91, - 18925: 0x6D6F, - 18926: 0x6D9E, - 18927: 0x6DA0, - 18928: 0x6D5E, - 18929: 0x6D93, - 18930: 0x6D94, - 18931: 0x6D5C, - 18932: 0x6D60, - 18933: 0x6D7C, - 18934: 0x6D63, - 18935: 0x6E1A, - 18936: 0x6DC7, - 18937: 0x6DC5, - 18938: 0x6DDE, - 18939: 0x6E0E, - 18940: 0x6DBF, - 18941: 0x6DE0, - 18942: 0x6E11, - 18943: 0x6DE6, - 18944: 0x6DDD, - 18945: 0x6DD9, - 18946: 0x6E16, - 18947: 0x6DAB, - 18948: 0x6E0C, - 18949: 0x6DAE, - 18950: 0x6E2B, - 18951: 0x6E6E, - 18952: 0x6E4E, - 18953: 0x6E6B, - 18954: 0x6EB2, - 18955: 0x6E5F, - 18956: 0x6E86, - 18957: 0x6E53, - 18958: 0x6E54, - 18959: 0x6E32, - 18960: 0x6E25, - 18961: 0x6E44, - 18962: 0x6EDF, - 18963: 0x6EB1, - 18964: 0x6E98, - 18965: 0x6EE0, - 18966: 0x6F2D, - 18967: 0x6EE2, - 18968: 0x6EA5, - 18969: 0x6EA7, - 18970: 0x6EBD, - 18971: 0x6EBB, - 18972: 0x6EB7, - 18973: 0x6ED7, - 18974: 0x6EB4, - 18975: 0x6ECF, - 18976: 0x6E8F, - 18977: 0x6EC2, - 18978: 0x6E9F, - 18979: 0x6F62, - 18980: 0x6F46, - 18981: 0x6F47, - 18982: 0x6F24, - 18983: 0x6F15, - 18984: 0x6EF9, - 18985: 0x6F2F, - 18986: 0x6F36, - 18987: 0x6F4B, - 18988: 0x6F74, - 18989: 0x6F2A, - 18990: 0x6F09, - 18991: 0x6F29, - 18992: 0x6F89, - 18993: 0x6F8D, - 18994: 0x6F8C, - 18995: 0x6F78, - 18996: 0x6F72, - 18997: 0x6F7C, - 18998: 0x6F7A, - 18999: 0x6FD1, - 19000: 0x930A, - 19001: 0x930B, - 19002: 0x930C, - 19003: 0x930D, - 19004: 0x930E, - 19005: 0x930F, - 19006: 0x9310, - 19007: 0x9311, - 19008: 0x9312, - 19009: 0x9313, - 19010: 0x9314, - 19011: 0x9315, - 19012: 0x9316, - 19013: 0x9317, - 19014: 0x9318, - 19015: 0x9319, - 19016: 0x931A, - 19017: 0x931B, - 19018: 0x931C, - 19019: 0x931D, - 19020: 0x931E, - 19021: 0x931F, - 19022: 0x9320, - 19023: 0x9321, - 19024: 0x9322, - 19025: 0x9323, - 19026: 0x9324, - 19027: 0x9325, - 19028: 0x9326, - 19029: 0x9327, - 19030: 0x9328, - 19031: 0x9329, - 19032: 0x932A, - 19033: 0x932B, - 19034: 0x932C, - 19035: 0x932D, - 19036: 0x932E, - 19037: 0x932F, - 19038: 0x9330, - 19039: 0x9331, - 19040: 0x9332, - 19041: 0x9333, - 19042: 0x9334, - 19043: 0x9335, - 19044: 0x9336, - 19045: 0x9337, - 19046: 0x9338, - 19047: 0x9339, - 19048: 0x933A, - 19049: 0x933B, - 19050: 0x933C, - 19051: 0x933D, - 19052: 0x933F, - 19053: 0x9340, - 19054: 0x9341, - 19055: 0x9342, - 19056: 0x9343, - 19057: 0x9344, - 19058: 0x9345, - 19059: 0x9346, - 19060: 0x9347, - 19061: 0x9348, - 19062: 0x9349, - 19063: 0x934A, - 19064: 0x934B, - 19065: 0x934C, - 19066: 0x934D, - 19067: 0x934E, - 19068: 0x934F, - 19069: 0x9350, - 19070: 0x9351, - 19071: 0x9352, - 19072: 0x9353, - 19073: 0x9354, - 19074: 0x9355, - 19075: 0x9356, - 19076: 0x9357, - 19077: 0x9358, - 19078: 0x9359, - 19079: 0x935A, - 19080: 0x935B, - 19081: 0x935C, - 19082: 0x935D, - 19083: 0x935E, - 19084: 0x935F, - 19085: 0x9360, - 19086: 0x9361, - 19087: 0x9362, - 19088: 0x9363, - 19089: 0x9364, - 19090: 0x9365, - 19091: 0x9366, - 19092: 0x9367, - 19093: 0x9368, - 19094: 0x9369, - 19095: 0x936B, - 19096: 0x6FC9, - 19097: 0x6FA7, - 19098: 0x6FB9, - 19099: 0x6FB6, - 19100: 0x6FC2, - 19101: 0x6FE1, - 19102: 0x6FEE, - 19103: 0x6FDE, - 19104: 0x6FE0, - 19105: 0x6FEF, - 19106: 0x701A, - 19107: 0x7023, - 19108: 0x701B, - 19109: 0x7039, - 19110: 0x7035, - 19111: 0x704F, - 19112: 0x705E, - 19113: 0x5B80, - 19114: 0x5B84, - 19115: 0x5B95, - 19116: 0x5B93, - 19117: 0x5BA5, - 19118: 0x5BB8, - 19119: 0x752F, - 19120: 0x9A9E, - 19121: 0x6434, - 19122: 0x5BE4, - 19123: 0x5BEE, - 19124: 0x8930, - 19125: 0x5BF0, - 19126: 0x8E47, - 19127: 0x8B07, - 19128: 0x8FB6, - 19129: 0x8FD3, - 19130: 0x8FD5, - 19131: 0x8FE5, - 19132: 0x8FEE, - 19133: 0x8FE4, - 19134: 0x8FE9, - 19135: 0x8FE6, - 19136: 0x8FF3, - 19137: 0x8FE8, - 19138: 0x9005, - 19139: 0x9004, - 19140: 0x900B, - 19141: 0x9026, - 19142: 0x9011, - 19143: 0x900D, - 19144: 0x9016, - 19145: 0x9021, - 19146: 0x9035, - 19147: 0x9036, - 19148: 0x902D, - 19149: 0x902F, - 19150: 0x9044, - 19151: 0x9051, - 19152: 0x9052, - 19153: 0x9050, - 19154: 0x9068, - 19155: 0x9058, - 19156: 0x9062, - 19157: 0x905B, - 19158: 0x66B9, - 19159: 0x9074, - 19160: 0x907D, - 19161: 0x9082, - 19162: 0x9088, - 19163: 0x9083, - 19164: 0x908B, - 19165: 0x5F50, - 19166: 0x5F57, - 19167: 0x5F56, - 19168: 0x5F58, - 19169: 0x5C3B, - 19170: 0x54AB, - 19171: 0x5C50, - 19172: 0x5C59, - 19173: 0x5B71, - 19174: 0x5C63, - 19175: 0x5C66, - 19176: 0x7FBC, - 19177: 0x5F2A, - 19178: 0x5F29, - 19179: 0x5F2D, - 19180: 0x8274, - 19181: 0x5F3C, - 19182: 0x9B3B, - 19183: 0x5C6E, - 19184: 0x5981, - 19185: 0x5983, - 19186: 0x598D, - 19187: 0x59A9, - 19188: 0x59AA, - 19189: 0x59A3, - 19190: 0x936C, - 19191: 0x936D, - 19192: 0x936E, - 19193: 0x936F, - 19194: 0x9370, - 19195: 0x9371, - 19196: 0x9372, - 19197: 0x9373, - 19198: 0x9374, - 19199: 0x9375, - 19200: 0x9376, - 19201: 0x9377, - 19202: 0x9378, - 19203: 0x9379, - 19204: 0x937A, - 19205: 0x937B, - 19206: 0x937C, - 19207: 0x937D, - 19208: 0x937E, - 19209: 0x937F, - 19210: 0x9380, - 19211: 0x9381, - 19212: 0x9382, - 19213: 0x9383, - 19214: 0x9384, - 19215: 0x9385, - 19216: 0x9386, - 19217: 0x9387, - 19218: 0x9388, - 19219: 0x9389, - 19220: 0x938A, - 19221: 0x938B, - 19222: 0x938C, - 19223: 0x938D, - 19224: 0x938E, - 19225: 0x9390, - 19226: 0x9391, - 19227: 0x9392, - 19228: 0x9393, - 19229: 0x9394, - 19230: 0x9395, - 19231: 0x9396, - 19232: 0x9397, - 19233: 0x9398, - 19234: 0x9399, - 19235: 0x939A, - 19236: 0x939B, - 19237: 0x939C, - 19238: 0x939D, - 19239: 0x939E, - 19240: 0x939F, - 19241: 0x93A0, - 19242: 0x93A1, - 19243: 0x93A2, - 19244: 0x93A3, - 19245: 0x93A4, - 19246: 0x93A5, - 19247: 0x93A6, - 19248: 0x93A7, - 19249: 0x93A8, - 19250: 0x93A9, - 19251: 0x93AA, - 19252: 0x93AB, - 19253: 0x93AC, - 19254: 0x93AD, - 19255: 0x93AE, - 19256: 0x93AF, - 19257: 0x93B0, - 19258: 0x93B1, - 19259: 0x93B2, - 19260: 0x93B3, - 19261: 0x93B4, - 19262: 0x93B5, - 19263: 0x93B6, - 19264: 0x93B7, - 19265: 0x93B8, - 19266: 0x93B9, - 19267: 0x93BA, - 19268: 0x93BB, - 19269: 0x93BC, - 19270: 0x93BD, - 19271: 0x93BE, - 19272: 0x93BF, - 19273: 0x93C0, - 19274: 0x93C1, - 19275: 0x93C2, - 19276: 0x93C3, - 19277: 0x93C4, - 19278: 0x93C5, - 19279: 0x93C6, - 19280: 0x93C7, - 19281: 0x93C8, - 19282: 0x93C9, - 19283: 0x93CB, - 19284: 0x93CC, - 19285: 0x93CD, - 19286: 0x5997, - 19287: 0x59CA, - 19288: 0x59AB, - 19289: 0x599E, - 19290: 0x59A4, - 19291: 0x59D2, - 19292: 0x59B2, - 19293: 0x59AF, - 19294: 0x59D7, - 19295: 0x59BE, - 19296: 0x5A05, - 19297: 0x5A06, - 19298: 0x59DD, - 19299: 0x5A08, - 19300: 0x59E3, - 19301: 0x59D8, - 19302: 0x59F9, - 19303: 0x5A0C, - 19304: 0x5A09, - 19305: 0x5A32, - 19306: 0x5A34, - 19307: 0x5A11, - 19308: 0x5A23, - 19309: 0x5A13, - 19310: 0x5A40, - 19311: 0x5A67, - 19312: 0x5A4A, - 19313: 0x5A55, - 19314: 0x5A3C, - 19315: 0x5A62, - 19316: 0x5A75, - 19317: 0x80EC, - 19318: 0x5AAA, - 19319: 0x5A9B, - 19320: 0x5A77, - 19321: 0x5A7A, - 19322: 0x5ABE, - 19323: 0x5AEB, - 19324: 0x5AB2, - 19325: 0x5AD2, - 19326: 0x5AD4, - 19327: 0x5AB8, - 19328: 0x5AE0, - 19329: 0x5AE3, - 19330: 0x5AF1, - 19331: 0x5AD6, - 19332: 0x5AE6, - 19333: 0x5AD8, - 19334: 0x5ADC, - 19335: 0x5B09, - 19336: 0x5B17, - 19337: 0x5B16, - 19338: 0x5B32, - 19339: 0x5B37, - 19340: 0x5B40, - 19341: 0x5C15, - 19342: 0x5C1C, - 19343: 0x5B5A, - 19344: 0x5B65, - 19345: 0x5B73, - 19346: 0x5B51, - 19347: 0x5B53, - 19348: 0x5B62, - 19349: 0x9A75, - 19350: 0x9A77, - 19351: 0x9A78, - 19352: 0x9A7A, - 19353: 0x9A7F, - 19354: 0x9A7D, - 19355: 0x9A80, - 19356: 0x9A81, - 19357: 0x9A85, - 19358: 0x9A88, - 19359: 0x9A8A, - 19360: 0x9A90, - 19361: 0x9A92, - 19362: 0x9A93, - 19363: 0x9A96, - 19364: 0x9A98, - 19365: 0x9A9B, - 19366: 0x9A9C, - 19367: 0x9A9D, - 19368: 0x9A9F, - 19369: 0x9AA0, - 19370: 0x9AA2, - 19371: 0x9AA3, - 19372: 0x9AA5, - 19373: 0x9AA7, - 19374: 0x7E9F, - 19375: 0x7EA1, - 19376: 0x7EA3, - 19377: 0x7EA5, - 19378: 0x7EA8, - 19379: 0x7EA9, - 19380: 0x93CE, - 19381: 0x93CF, - 19382: 0x93D0, - 19383: 0x93D1, - 19384: 0x93D2, - 19385: 0x93D3, - 19386: 0x93D4, - 19387: 0x93D5, - 19388: 0x93D7, - 19389: 0x93D8, - 19390: 0x93D9, - 19391: 0x93DA, - 19392: 0x93DB, - 19393: 0x93DC, - 19394: 0x93DD, - 19395: 0x93DE, - 19396: 0x93DF, - 19397: 0x93E0, - 19398: 0x93E1, - 19399: 0x93E2, - 19400: 0x93E3, - 19401: 0x93E4, - 19402: 0x93E5, - 19403: 0x93E6, - 19404: 0x93E7, - 19405: 0x93E8, - 19406: 0x93E9, - 19407: 0x93EA, - 19408: 0x93EB, - 19409: 0x93EC, - 19410: 0x93ED, - 19411: 0x93EE, - 19412: 0x93EF, - 19413: 0x93F0, - 19414: 0x93F1, - 19415: 0x93F2, - 19416: 0x93F3, - 19417: 0x93F4, - 19418: 0x93F5, - 19419: 0x93F6, - 19420: 0x93F7, - 19421: 0x93F8, - 19422: 0x93F9, - 19423: 0x93FA, - 19424: 0x93FB, - 19425: 0x93FC, - 19426: 0x93FD, - 19427: 0x93FE, - 19428: 0x93FF, - 19429: 0x9400, - 19430: 0x9401, - 19431: 0x9402, - 19432: 0x9403, - 19433: 0x9404, - 19434: 0x9405, - 19435: 0x9406, - 19436: 0x9407, - 19437: 0x9408, - 19438: 0x9409, - 19439: 0x940A, - 19440: 0x940B, - 19441: 0x940C, - 19442: 0x940D, - 19443: 0x940E, - 19444: 0x940F, - 19445: 0x9410, - 19446: 0x9411, - 19447: 0x9412, - 19448: 0x9413, - 19449: 0x9414, - 19450: 0x9415, - 19451: 0x9416, - 19452: 0x9417, - 19453: 0x9418, - 19454: 0x9419, - 19455: 0x941A, - 19456: 0x941B, - 19457: 0x941C, - 19458: 0x941D, - 19459: 0x941E, - 19460: 0x941F, - 19461: 0x9420, - 19462: 0x9421, - 19463: 0x9422, - 19464: 0x9423, - 19465: 0x9424, - 19466: 0x9425, - 19467: 0x9426, - 19468: 0x9427, - 19469: 0x9428, - 19470: 0x9429, - 19471: 0x942A, - 19472: 0x942B, - 19473: 0x942C, - 19474: 0x942D, - 19475: 0x942E, - 19476: 0x7EAD, - 19477: 0x7EB0, - 19478: 0x7EBE, - 19479: 0x7EC0, - 19480: 0x7EC1, - 19481: 0x7EC2, - 19482: 0x7EC9, - 19483: 0x7ECB, - 19484: 0x7ECC, - 19485: 0x7ED0, - 19486: 0x7ED4, - 19487: 0x7ED7, - 19488: 0x7EDB, - 19489: 0x7EE0, - 19490: 0x7EE1, - 19491: 0x7EE8, - 19492: 0x7EEB, - 19493: 0x7EEE, - 19494: 0x7EEF, - 19495: 0x7EF1, - 19496: 0x7EF2, - 19497: 0x7F0D, - 19498: 0x7EF6, - 19499: 0x7EFA, - 19500: 0x7EFB, - 19501: 0x7EFE, - 19502: 0x7F01, - 19503: 0x7F02, - 19504: 0x7F03, - 19505: 0x7F07, - 19506: 0x7F08, - 19507: 0x7F0B, - 19508: 0x7F0C, - 19509: 0x7F0F, - 19510: 0x7F11, - 19511: 0x7F12, - 19512: 0x7F17, - 19513: 0x7F19, - 19514: 0x7F1C, - 19515: 0x7F1B, - 19516: 0x7F1F, - 19517: 0x7F21, - 19518: 0x7F22, - 19519: 0x7F23, - 19520: 0x7F24, - 19521: 0x7F25, - 19522: 0x7F26, - 19523: 0x7F27, - 19524: 0x7F2A, - 19525: 0x7F2B, - 19526: 0x7F2C, - 19527: 0x7F2D, - 19528: 0x7F2F, - 19529: 0x7F30, - 19530: 0x7F31, - 19531: 0x7F32, - 19532: 0x7F33, - 19533: 0x7F35, - 19534: 0x5E7A, - 19535: 0x757F, - 19536: 0x5DDB, - 19537: 0x753E, - 19538: 0x9095, - 19539: 0x738E, - 19540: 0x7391, - 19541: 0x73AE, - 19542: 0x73A2, - 19543: 0x739F, - 19544: 0x73CF, - 19545: 0x73C2, - 19546: 0x73D1, - 19547: 0x73B7, - 19548: 0x73B3, - 19549: 0x73C0, - 19550: 0x73C9, - 19551: 0x73C8, - 19552: 0x73E5, - 19553: 0x73D9, - 19554: 0x987C, - 19555: 0x740A, - 19556: 0x73E9, - 19557: 0x73E7, - 19558: 0x73DE, - 19559: 0x73BA, - 19560: 0x73F2, - 19561: 0x740F, - 19562: 0x742A, - 19563: 0x745B, - 19564: 0x7426, - 19565: 0x7425, - 19566: 0x7428, - 19567: 0x7430, - 19568: 0x742E, - 19569: 0x742C, - 19570: 0x942F, - 19571: 0x9430, - 19572: 0x9431, - 19573: 0x9432, - 19574: 0x9433, - 19575: 0x9434, - 19576: 0x9435, - 19577: 0x9436, - 19578: 0x9437, - 19579: 0x9438, - 19580: 0x9439, - 19581: 0x943A, - 19582: 0x943B, - 19583: 0x943C, - 19584: 0x943D, - 19585: 0x943F, - 19586: 0x9440, - 19587: 0x9441, - 19588: 0x9442, - 19589: 0x9443, - 19590: 0x9444, - 19591: 0x9445, - 19592: 0x9446, - 19593: 0x9447, - 19594: 0x9448, - 19595: 0x9449, - 19596: 0x944A, - 19597: 0x944B, - 19598: 0x944C, - 19599: 0x944D, - 19600: 0x944E, - 19601: 0x944F, - 19602: 0x9450, - 19603: 0x9451, - 19604: 0x9452, - 19605: 0x9453, - 19606: 0x9454, - 19607: 0x9455, - 19608: 0x9456, - 19609: 0x9457, - 19610: 0x9458, - 19611: 0x9459, - 19612: 0x945A, - 19613: 0x945B, - 19614: 0x945C, - 19615: 0x945D, - 19616: 0x945E, - 19617: 0x945F, - 19618: 0x9460, - 19619: 0x9461, - 19620: 0x9462, - 19621: 0x9463, - 19622: 0x9464, - 19623: 0x9465, - 19624: 0x9466, - 19625: 0x9467, - 19626: 0x9468, - 19627: 0x9469, - 19628: 0x946A, - 19629: 0x946C, - 19630: 0x946D, - 19631: 0x946E, - 19632: 0x946F, - 19633: 0x9470, - 19634: 0x9471, - 19635: 0x9472, - 19636: 0x9473, - 19637: 0x9474, - 19638: 0x9475, - 19639: 0x9476, - 19640: 0x9477, - 19641: 0x9478, - 19642: 0x9479, - 19643: 0x947A, - 19644: 0x947B, - 19645: 0x947C, - 19646: 0x947D, - 19647: 0x947E, - 19648: 0x947F, - 19649: 0x9480, - 19650: 0x9481, - 19651: 0x9482, - 19652: 0x9483, - 19653: 0x9484, - 19654: 0x9491, - 19655: 0x9496, - 19656: 0x9498, - 19657: 0x94C7, - 19658: 0x94CF, - 19659: 0x94D3, - 19660: 0x94D4, - 19661: 0x94DA, - 19662: 0x94E6, - 19663: 0x94FB, - 19664: 0x951C, - 19665: 0x9520, - 19666: 0x741B, - 19667: 0x741A, - 19668: 0x7441, - 19669: 0x745C, - 19670: 0x7457, - 19671: 0x7455, - 19672: 0x7459, - 19673: 0x7477, - 19674: 0x746D, - 19675: 0x747E, - 19676: 0x749C, - 19677: 0x748E, - 19678: 0x7480, - 19679: 0x7481, - 19680: 0x7487, - 19681: 0x748B, - 19682: 0x749E, - 19683: 0x74A8, - 19684: 0x74A9, - 19685: 0x7490, - 19686: 0x74A7, - 19687: 0x74D2, - 19688: 0x74BA, - 19689: 0x97EA, - 19690: 0x97EB, - 19691: 0x97EC, - 19692: 0x674C, - 19693: 0x6753, - 19694: 0x675E, - 19695: 0x6748, - 19696: 0x6769, - 19697: 0x67A5, - 19698: 0x6787, - 19699: 0x676A, - 19700: 0x6773, - 19701: 0x6798, - 19702: 0x67A7, - 19703: 0x6775, - 19704: 0x67A8, - 19705: 0x679E, - 19706: 0x67AD, - 19707: 0x678B, - 19708: 0x6777, - 19709: 0x677C, - 19710: 0x67F0, - 19711: 0x6809, - 19712: 0x67D8, - 19713: 0x680A, - 19714: 0x67E9, - 19715: 0x67B0, - 19716: 0x680C, - 19717: 0x67D9, - 19718: 0x67B5, - 19719: 0x67DA, - 19720: 0x67B3, - 19721: 0x67DD, - 19722: 0x6800, - 19723: 0x67C3, - 19724: 0x67B8, - 19725: 0x67E2, - 19726: 0x680E, - 19727: 0x67C1, - 19728: 0x67FD, - 19729: 0x6832, - 19730: 0x6833, - 19731: 0x6860, - 19732: 0x6861, - 19733: 0x684E, - 19734: 0x6862, - 19735: 0x6844, - 19736: 0x6864, - 19737: 0x6883, - 19738: 0x681D, - 19739: 0x6855, - 19740: 0x6866, - 19741: 0x6841, - 19742: 0x6867, - 19743: 0x6840, - 19744: 0x683E, - 19745: 0x684A, - 19746: 0x6849, - 19747: 0x6829, - 19748: 0x68B5, - 19749: 0x688F, - 19750: 0x6874, - 19751: 0x6877, - 19752: 0x6893, - 19753: 0x686B, - 19754: 0x68C2, - 19755: 0x696E, - 19756: 0x68FC, - 19757: 0x691F, - 19758: 0x6920, - 19759: 0x68F9, - 19760: 0x9527, - 19761: 0x9533, - 19762: 0x953D, - 19763: 0x9543, - 19764: 0x9548, - 19765: 0x954B, - 19766: 0x9555, - 19767: 0x955A, - 19768: 0x9560, - 19769: 0x956E, - 19770: 0x9574, - 19771: 0x9575, - 19772: 0x9577, - 19773: 0x9578, - 19774: 0x9579, - 19775: 0x957A, - 19776: 0x957B, - 19777: 0x957C, - 19778: 0x957D, - 19779: 0x957E, - 19780: 0x9580, - 19781: 0x9581, - 19782: 0x9582, - 19783: 0x9583, - 19784: 0x9584, - 19785: 0x9585, - 19786: 0x9586, - 19787: 0x9587, - 19788: 0x9588, - 19789: 0x9589, - 19790: 0x958A, - 19791: 0x958B, - 19792: 0x958C, - 19793: 0x958D, - 19794: 0x958E, - 19795: 0x958F, - 19796: 0x9590, - 19797: 0x9591, - 19798: 0x9592, - 19799: 0x9593, - 19800: 0x9594, - 19801: 0x9595, - 19802: 0x9596, - 19803: 0x9597, - 19804: 0x9598, - 19805: 0x9599, - 19806: 0x959A, - 19807: 0x959B, - 19808: 0x959C, - 19809: 0x959D, - 19810: 0x959E, - 19811: 0x959F, - 19812: 0x95A0, - 19813: 0x95A1, - 19814: 0x95A2, - 19815: 0x95A3, - 19816: 0x95A4, - 19817: 0x95A5, - 19818: 0x95A6, - 19819: 0x95A7, - 19820: 0x95A8, - 19821: 0x95A9, - 19822: 0x95AA, - 19823: 0x95AB, - 19824: 0x95AC, - 19825: 0x95AD, - 19826: 0x95AE, - 19827: 0x95AF, - 19828: 0x95B0, - 19829: 0x95B1, - 19830: 0x95B2, - 19831: 0x95B3, - 19832: 0x95B4, - 19833: 0x95B5, - 19834: 0x95B6, - 19835: 0x95B7, - 19836: 0x95B8, - 19837: 0x95B9, - 19838: 0x95BA, - 19839: 0x95BB, - 19840: 0x95BC, - 19841: 0x95BD, - 19842: 0x95BE, - 19843: 0x95BF, - 19844: 0x95C0, - 19845: 0x95C1, - 19846: 0x95C2, - 19847: 0x95C3, - 19848: 0x95C4, - 19849: 0x95C5, - 19850: 0x95C6, - 19851: 0x95C7, - 19852: 0x95C8, - 19853: 0x95C9, - 19854: 0x95CA, - 19855: 0x95CB, - 19856: 0x6924, - 19857: 0x68F0, - 19858: 0x690B, - 19859: 0x6901, - 19860: 0x6957, - 19861: 0x68E3, - 19862: 0x6910, - 19863: 0x6971, - 19864: 0x6939, - 19865: 0x6960, - 19866: 0x6942, - 19867: 0x695D, - 19868: 0x6984, - 19869: 0x696B, - 19870: 0x6980, - 19871: 0x6998, - 19872: 0x6978, - 19873: 0x6934, - 19874: 0x69CC, - 19875: 0x6987, - 19876: 0x6988, - 19877: 0x69CE, - 19878: 0x6989, - 19879: 0x6966, - 19880: 0x6963, - 19881: 0x6979, - 19882: 0x699B, - 19883: 0x69A7, - 19884: 0x69BB, - 19885: 0x69AB, - 19886: 0x69AD, - 19887: 0x69D4, - 19888: 0x69B1, - 19889: 0x69C1, - 19890: 0x69CA, - 19891: 0x69DF, - 19892: 0x6995, - 19893: 0x69E0, - 19894: 0x698D, - 19895: 0x69FF, - 19896: 0x6A2F, - 19897: 0x69ED, - 19898: 0x6A17, - 19899: 0x6A18, - 19900: 0x6A65, - 19901: 0x69F2, - 19902: 0x6A44, - 19903: 0x6A3E, - 19904: 0x6AA0, - 19905: 0x6A50, - 19906: 0x6A5B, - 19907: 0x6A35, - 19908: 0x6A8E, - 19909: 0x6A79, - 19910: 0x6A3D, - 19911: 0x6A28, - 19912: 0x6A58, - 19913: 0x6A7C, - 19914: 0x6A91, - 19915: 0x6A90, - 19916: 0x6AA9, - 19917: 0x6A97, - 19918: 0x6AAB, - 19919: 0x7337, - 19920: 0x7352, - 19921: 0x6B81, - 19922: 0x6B82, - 19923: 0x6B87, - 19924: 0x6B84, - 19925: 0x6B92, - 19926: 0x6B93, - 19927: 0x6B8D, - 19928: 0x6B9A, - 19929: 0x6B9B, - 19930: 0x6BA1, - 19931: 0x6BAA, - 19932: 0x8F6B, - 19933: 0x8F6D, - 19934: 0x8F71, - 19935: 0x8F72, - 19936: 0x8F73, - 19937: 0x8F75, - 19938: 0x8F76, - 19939: 0x8F78, - 19940: 0x8F77, - 19941: 0x8F79, - 19942: 0x8F7A, - 19943: 0x8F7C, - 19944: 0x8F7E, - 19945: 0x8F81, - 19946: 0x8F82, - 19947: 0x8F84, - 19948: 0x8F87, - 19949: 0x8F8B, - 19950: 0x95CC, - 19951: 0x95CD, - 19952: 0x95CE, - 19953: 0x95CF, - 19954: 0x95D0, - 19955: 0x95D1, - 19956: 0x95D2, - 19957: 0x95D3, - 19958: 0x95D4, - 19959: 0x95D5, - 19960: 0x95D6, - 19961: 0x95D7, - 19962: 0x95D8, - 19963: 0x95D9, - 19964: 0x95DA, - 19965: 0x95DB, - 19966: 0x95DC, - 19967: 0x95DD, - 19968: 0x95DE, - 19969: 0x95DF, - 19970: 0x95E0, - 19971: 0x95E1, - 19972: 0x95E2, - 19973: 0x95E3, - 19974: 0x95E4, - 19975: 0x95E5, - 19976: 0x95E6, - 19977: 0x95E7, - 19978: 0x95EC, - 19979: 0x95FF, - 19980: 0x9607, - 19981: 0x9613, - 19982: 0x9618, - 19983: 0x961B, - 19984: 0x961E, - 19985: 0x9620, - 19986: 0x9623, - 19987: 0x9624, - 19988: 0x9625, - 19989: 0x9626, - 19990: 0x9627, - 19991: 0x9628, - 19992: 0x9629, - 19993: 0x962B, - 19994: 0x962C, - 19995: 0x962D, - 19996: 0x962F, - 19997: 0x9630, - 19998: 0x9637, - 19999: 0x9638, - 20000: 0x9639, - 20001: 0x963A, - 20002: 0x963E, - 20003: 0x9641, - 20004: 0x9643, - 20005: 0x964A, - 20006: 0x964E, - 20007: 0x964F, - 20008: 0x9651, - 20009: 0x9652, - 20010: 0x9653, - 20011: 0x9656, - 20012: 0x9657, - 20013: 0x9658, - 20014: 0x9659, - 20015: 0x965A, - 20016: 0x965C, - 20017: 0x965D, - 20018: 0x965E, - 20019: 0x9660, - 20020: 0x9663, - 20021: 0x9665, - 20022: 0x9666, - 20023: 0x966B, - 20024: 0x966D, - 20025: 0x966E, - 20026: 0x966F, - 20027: 0x9670, - 20028: 0x9671, - 20029: 0x9673, - 20030: 0x9678, - 20031: 0x9679, - 20032: 0x967A, - 20033: 0x967B, - 20034: 0x967C, - 20035: 0x967D, - 20036: 0x967E, - 20037: 0x967F, - 20038: 0x9680, - 20039: 0x9681, - 20040: 0x9682, - 20041: 0x9683, - 20042: 0x9684, - 20043: 0x9687, - 20044: 0x9689, - 20045: 0x968A, - 20046: 0x8F8D, - 20047: 0x8F8E, - 20048: 0x8F8F, - 20049: 0x8F98, - 20050: 0x8F9A, - 20051: 0x8ECE, - 20052: 0x620B, - 20053: 0x6217, - 20054: 0x621B, - 20055: 0x621F, - 20056: 0x6222, - 20057: 0x6221, - 20058: 0x6225, - 20059: 0x6224, - 20060: 0x622C, - 20061: 0x81E7, - 20062: 0x74EF, - 20063: 0x74F4, - 20064: 0x74FF, - 20065: 0x750F, - 20066: 0x7511, - 20067: 0x7513, - 20068: 0x6534, - 20069: 0x65EE, - 20070: 0x65EF, - 20071: 0x65F0, - 20072: 0x660A, - 20073: 0x6619, - 20074: 0x6772, - 20075: 0x6603, - 20076: 0x6615, - 20077: 0x6600, - 20078: 0x7085, - 20079: 0x66F7, - 20080: 0x661D, - 20081: 0x6634, - 20082: 0x6631, - 20083: 0x6636, - 20084: 0x6635, - 20085: 0x8006, - 20086: 0x665F, - 20087: 0x6654, - 20088: 0x6641, - 20089: 0x664F, - 20090: 0x6656, - 20091: 0x6661, - 20092: 0x6657, - 20093: 0x6677, - 20094: 0x6684, - 20095: 0x668C, - 20096: 0x66A7, - 20097: 0x669D, - 20098: 0x66BE, - 20099: 0x66DB, - 20100: 0x66DC, - 20101: 0x66E6, - 20102: 0x66E9, - 20103: 0x8D32, - 20104: 0x8D33, - 20105: 0x8D36, - 20106: 0x8D3B, - 20107: 0x8D3D, - 20108: 0x8D40, - 20109: 0x8D45, - 20110: 0x8D46, - 20111: 0x8D48, - 20112: 0x8D49, - 20113: 0x8D47, - 20114: 0x8D4D, - 20115: 0x8D55, - 20116: 0x8D59, - 20117: 0x89C7, - 20118: 0x89CA, - 20119: 0x89CB, - 20120: 0x89CC, - 20121: 0x89CE, - 20122: 0x89CF, - 20123: 0x89D0, - 20124: 0x89D1, - 20125: 0x726E, - 20126: 0x729F, - 20127: 0x725D, - 20128: 0x7266, - 20129: 0x726F, - 20130: 0x727E, - 20131: 0x727F, - 20132: 0x7284, - 20133: 0x728B, - 20134: 0x728D, - 20135: 0x728F, - 20136: 0x7292, - 20137: 0x6308, - 20138: 0x6332, - 20139: 0x63B0, - 20140: 0x968C, - 20141: 0x968E, - 20142: 0x9691, - 20143: 0x9692, - 20144: 0x9693, - 20145: 0x9695, - 20146: 0x9696, - 20147: 0x969A, - 20148: 0x969B, - 20149: 0x969D, - 20150: 0x969E, - 20151: 0x969F, - 20152: 0x96A0, - 20153: 0x96A1, - 20154: 0x96A2, - 20155: 0x96A3, - 20156: 0x96A4, - 20157: 0x96A5, - 20158: 0x96A6, - 20159: 0x96A8, - 20160: 0x96A9, - 20161: 0x96AA, - 20162: 0x96AB, - 20163: 0x96AC, - 20164: 0x96AD, - 20165: 0x96AE, - 20166: 0x96AF, - 20167: 0x96B1, - 20168: 0x96B2, - 20169: 0x96B4, - 20170: 0x96B5, - 20171: 0x96B7, - 20172: 0x96B8, - 20173: 0x96BA, - 20174: 0x96BB, - 20175: 0x96BF, - 20176: 0x96C2, - 20177: 0x96C3, - 20178: 0x96C8, - 20179: 0x96CA, - 20180: 0x96CB, - 20181: 0x96D0, - 20182: 0x96D1, - 20183: 0x96D3, - 20184: 0x96D4, - 20185: 0x96D6, - 20186: 0x96D7, - 20187: 0x96D8, - 20188: 0x96D9, - 20189: 0x96DA, - 20190: 0x96DB, - 20191: 0x96DC, - 20192: 0x96DD, - 20193: 0x96DE, - 20194: 0x96DF, - 20195: 0x96E1, - 20196: 0x96E2, - 20197: 0x96E3, - 20198: 0x96E4, - 20199: 0x96E5, - 20200: 0x96E6, - 20201: 0x96E7, - 20202: 0x96EB, - 20203: 0x96EC, - 20204: 0x96ED, - 20205: 0x96EE, - 20206: 0x96F0, - 20207: 0x96F1, - 20208: 0x96F2, - 20209: 0x96F4, - 20210: 0x96F5, - 20211: 0x96F8, - 20212: 0x96FA, - 20213: 0x96FB, - 20214: 0x96FC, - 20215: 0x96FD, - 20216: 0x96FF, - 20217: 0x9702, - 20218: 0x9703, - 20219: 0x9705, - 20220: 0x970A, - 20221: 0x970B, - 20222: 0x970C, - 20223: 0x9710, - 20224: 0x9711, - 20225: 0x9712, - 20226: 0x9714, - 20227: 0x9715, - 20228: 0x9717, - 20229: 0x9718, - 20230: 0x9719, - 20231: 0x971A, - 20232: 0x971B, - 20233: 0x971D, - 20234: 0x971F, - 20235: 0x9720, - 20236: 0x643F, - 20237: 0x64D8, - 20238: 0x8004, - 20239: 0x6BEA, - 20240: 0x6BF3, - 20241: 0x6BFD, - 20242: 0x6BF5, - 20243: 0x6BF9, - 20244: 0x6C05, - 20245: 0x6C07, - 20246: 0x6C06, - 20247: 0x6C0D, - 20248: 0x6C15, - 20249: 0x6C18, - 20250: 0x6C19, - 20251: 0x6C1A, - 20252: 0x6C21, - 20253: 0x6C29, - 20254: 0x6C24, - 20255: 0x6C2A, - 20256: 0x6C32, - 20257: 0x6535, - 20258: 0x6555, - 20259: 0x656B, - 20260: 0x724D, - 20261: 0x7252, - 20262: 0x7256, - 20263: 0x7230, - 20264: 0x8662, - 20265: 0x5216, - 20266: 0x809F, - 20267: 0x809C, - 20268: 0x8093, - 20269: 0x80BC, - 20270: 0x670A, - 20271: 0x80BD, - 20272: 0x80B1, - 20273: 0x80AB, - 20274: 0x80AD, - 20275: 0x80B4, - 20276: 0x80B7, - 20277: 0x80E7, - 20278: 0x80E8, - 20279: 0x80E9, - 20280: 0x80EA, - 20281: 0x80DB, - 20282: 0x80C2, - 20283: 0x80C4, - 20284: 0x80D9, - 20285: 0x80CD, - 20286: 0x80D7, - 20287: 0x6710, - 20288: 0x80DD, - 20289: 0x80EB, - 20290: 0x80F1, - 20291: 0x80F4, - 20292: 0x80ED, - 20293: 0x810D, - 20294: 0x810E, - 20295: 0x80F2, - 20296: 0x80FC, - 20297: 0x6715, - 20298: 0x8112, - 20299: 0x8C5A, - 20300: 0x8136, - 20301: 0x811E, - 20302: 0x812C, - 20303: 0x8118, - 20304: 0x8132, - 20305: 0x8148, - 20306: 0x814C, - 20307: 0x8153, - 20308: 0x8174, - 20309: 0x8159, - 20310: 0x815A, - 20311: 0x8171, - 20312: 0x8160, - 20313: 0x8169, - 20314: 0x817C, - 20315: 0x817D, - 20316: 0x816D, - 20317: 0x8167, - 20318: 0x584D, - 20319: 0x5AB5, - 20320: 0x8188, - 20321: 0x8182, - 20322: 0x8191, - 20323: 0x6ED5, - 20324: 0x81A3, - 20325: 0x81AA, - 20326: 0x81CC, - 20327: 0x6726, - 20328: 0x81CA, - 20329: 0x81BB, - 20330: 0x9721, - 20331: 0x9722, - 20332: 0x9723, - 20333: 0x9724, - 20334: 0x9725, - 20335: 0x9726, - 20336: 0x9727, - 20337: 0x9728, - 20338: 0x9729, - 20339: 0x972B, - 20340: 0x972C, - 20341: 0x972E, - 20342: 0x972F, - 20343: 0x9731, - 20344: 0x9733, - 20345: 0x9734, - 20346: 0x9735, - 20347: 0x9736, - 20348: 0x9737, - 20349: 0x973A, - 20350: 0x973B, - 20351: 0x973C, - 20352: 0x973D, - 20353: 0x973F, - 20354: 0x9740, - 20355: 0x9741, - 20356: 0x9742, - 20357: 0x9743, - 20358: 0x9744, - 20359: 0x9745, - 20360: 0x9746, - 20361: 0x9747, - 20362: 0x9748, - 20363: 0x9749, - 20364: 0x974A, - 20365: 0x974B, - 20366: 0x974C, - 20367: 0x974D, - 20368: 0x974E, - 20369: 0x974F, - 20370: 0x9750, - 20371: 0x9751, - 20372: 0x9754, - 20373: 0x9755, - 20374: 0x9757, - 20375: 0x9758, - 20376: 0x975A, - 20377: 0x975C, - 20378: 0x975D, - 20379: 0x975F, - 20380: 0x9763, - 20381: 0x9764, - 20382: 0x9766, - 20383: 0x9767, - 20384: 0x9768, - 20385: 0x976A, - 20386: 0x976B, - 20387: 0x976C, - 20388: 0x976D, - 20389: 0x976E, - 20390: 0x976F, - 20391: 0x9770, - 20392: 0x9771, - 20393: 0x9772, - 20394: 0x9775, - 20395: 0x9777, - 20396: 0x9778, - 20397: 0x9779, - 20398: 0x977A, - 20399: 0x977B, - 20400: 0x977D, - 20401: 0x977E, - 20402: 0x977F, - 20403: 0x9780, - 20404: 0x9781, - 20405: 0x9782, - 20406: 0x9783, - 20407: 0x9784, - 20408: 0x9786, - 20409: 0x9787, - 20410: 0x9788, - 20411: 0x9789, - 20412: 0x978A, - 20413: 0x978C, - 20414: 0x978E, - 20415: 0x978F, - 20416: 0x9790, - 20417: 0x9793, - 20418: 0x9795, - 20419: 0x9796, - 20420: 0x9797, - 20421: 0x9799, - 20422: 0x979A, - 20423: 0x979B, - 20424: 0x979C, - 20425: 0x979D, - 20426: 0x81C1, - 20427: 0x81A6, - 20428: 0x6B24, - 20429: 0x6B37, - 20430: 0x6B39, - 20431: 0x6B43, - 20432: 0x6B46, - 20433: 0x6B59, - 20434: 0x98D1, - 20435: 0x98D2, - 20436: 0x98D3, - 20437: 0x98D5, - 20438: 0x98D9, - 20439: 0x98DA, - 20440: 0x6BB3, - 20441: 0x5F40, - 20442: 0x6BC2, - 20443: 0x89F3, - 20444: 0x6590, - 20445: 0x9F51, - 20446: 0x6593, - 20447: 0x65BC, - 20448: 0x65C6, - 20449: 0x65C4, - 20450: 0x65C3, - 20451: 0x65CC, - 20452: 0x65CE, - 20453: 0x65D2, - 20454: 0x65D6, - 20455: 0x7080, - 20456: 0x709C, - 20457: 0x7096, - 20458: 0x709D, - 20459: 0x70BB, - 20460: 0x70C0, - 20461: 0x70B7, - 20462: 0x70AB, - 20463: 0x70B1, - 20464: 0x70E8, - 20465: 0x70CA, - 20466: 0x7110, - 20467: 0x7113, - 20468: 0x7116, - 20469: 0x712F, - 20470: 0x7131, - 20471: 0x7173, - 20472: 0x715C, - 20473: 0x7168, - 20474: 0x7145, - 20475: 0x7172, - 20476: 0x714A, - 20477: 0x7178, - 20478: 0x717A, - 20479: 0x7198, - 20480: 0x71B3, - 20481: 0x71B5, - 20482: 0x71A8, - 20483: 0x71A0, - 20484: 0x71E0, - 20485: 0x71D4, - 20486: 0x71E7, - 20487: 0x71F9, - 20488: 0x721D, - 20489: 0x7228, - 20490: 0x706C, - 20491: 0x7118, - 20492: 0x7166, - 20493: 0x71B9, - 20494: 0x623E, - 20495: 0x623D, - 20496: 0x6243, - 20497: 0x6248, - 20498: 0x6249, - 20499: 0x793B, - 20500: 0x7940, - 20501: 0x7946, - 20502: 0x7949, - 20503: 0x795B, - 20504: 0x795C, - 20505: 0x7953, - 20506: 0x795A, - 20507: 0x7962, - 20508: 0x7957, - 20509: 0x7960, - 20510: 0x796F, - 20511: 0x7967, - 20512: 0x797A, - 20513: 0x7985, - 20514: 0x798A, - 20515: 0x799A, - 20516: 0x79A7, - 20517: 0x79B3, - 20518: 0x5FD1, - 20519: 0x5FD0, - 20520: 0x979E, - 20521: 0x979F, - 20522: 0x97A1, - 20523: 0x97A2, - 20524: 0x97A4, - 20525: 0x97A5, - 20526: 0x97A6, - 20527: 0x97A7, - 20528: 0x97A8, - 20529: 0x97A9, - 20530: 0x97AA, - 20531: 0x97AC, - 20532: 0x97AE, - 20533: 0x97B0, - 20534: 0x97B1, - 20535: 0x97B3, - 20536: 0x97B5, - 20537: 0x97B6, - 20538: 0x97B7, - 20539: 0x97B8, - 20540: 0x97B9, - 20541: 0x97BA, - 20542: 0x97BB, - 20543: 0x97BC, - 20544: 0x97BD, - 20545: 0x97BE, - 20546: 0x97BF, - 20547: 0x97C0, - 20548: 0x97C1, - 20549: 0x97C2, - 20550: 0x97C3, - 20551: 0x97C4, - 20552: 0x97C5, - 20553: 0x97C6, - 20554: 0x97C7, - 20555: 0x97C8, - 20556: 0x97C9, - 20557: 0x97CA, - 20558: 0x97CB, - 20559: 0x97CC, - 20560: 0x97CD, - 20561: 0x97CE, - 20562: 0x97CF, - 20563: 0x97D0, - 20564: 0x97D1, - 20565: 0x97D2, - 20566: 0x97D3, - 20567: 0x97D4, - 20568: 0x97D5, - 20569: 0x97D6, - 20570: 0x97D7, - 20571: 0x97D8, - 20572: 0x97D9, - 20573: 0x97DA, - 20574: 0x97DB, - 20575: 0x97DC, - 20576: 0x97DD, - 20577: 0x97DE, - 20578: 0x97DF, - 20579: 0x97E0, - 20580: 0x97E1, - 20581: 0x97E2, - 20582: 0x97E3, - 20583: 0x97E4, - 20584: 0x97E5, - 20585: 0x97E8, - 20586: 0x97EE, - 20587: 0x97EF, - 20588: 0x97F0, - 20589: 0x97F1, - 20590: 0x97F2, - 20591: 0x97F4, - 20592: 0x97F7, - 20593: 0x97F8, - 20594: 0x97F9, - 20595: 0x97FA, - 20596: 0x97FB, - 20597: 0x97FC, - 20598: 0x97FD, - 20599: 0x97FE, - 20600: 0x97FF, - 20601: 0x9800, - 20602: 0x9801, - 20603: 0x9802, - 20604: 0x9803, - 20605: 0x9804, - 20606: 0x9805, - 20607: 0x9806, - 20608: 0x9807, - 20609: 0x9808, - 20610: 0x9809, - 20611: 0x980A, - 20612: 0x980B, - 20613: 0x980C, - 20614: 0x980D, - 20615: 0x980E, - 20616: 0x603C, - 20617: 0x605D, - 20618: 0x605A, - 20619: 0x6067, - 20620: 0x6041, - 20621: 0x6059, - 20622: 0x6063, - 20623: 0x60AB, - 20624: 0x6106, - 20625: 0x610D, - 20626: 0x615D, - 20627: 0x61A9, - 20628: 0x619D, - 20629: 0x61CB, - 20630: 0x61D1, - 20631: 0x6206, - 20632: 0x8080, - 20633: 0x807F, - 20634: 0x6C93, - 20635: 0x6CF6, - 20636: 0x6DFC, - 20637: 0x77F6, - 20638: 0x77F8, - 20639: 0x7800, - 20640: 0x7809, - 20641: 0x7817, - 20642: 0x7818, - 20643: 0x7811, - 20644: 0x65AB, - 20645: 0x782D, - 20646: 0x781C, - 20647: 0x781D, - 20648: 0x7839, - 20649: 0x783A, - 20650: 0x783B, - 20651: 0x781F, - 20652: 0x783C, - 20653: 0x7825, - 20654: 0x782C, - 20655: 0x7823, - 20656: 0x7829, - 20657: 0x784E, - 20658: 0x786D, - 20659: 0x7856, - 20660: 0x7857, - 20661: 0x7826, - 20662: 0x7850, - 20663: 0x7847, - 20664: 0x784C, - 20665: 0x786A, - 20666: 0x789B, - 20667: 0x7893, - 20668: 0x789A, - 20669: 0x7887, - 20670: 0x789C, - 20671: 0x78A1, - 20672: 0x78A3, - 20673: 0x78B2, - 20674: 0x78B9, - 20675: 0x78A5, - 20676: 0x78D4, - 20677: 0x78D9, - 20678: 0x78C9, - 20679: 0x78EC, - 20680: 0x78F2, - 20681: 0x7905, - 20682: 0x78F4, - 20683: 0x7913, - 20684: 0x7924, - 20685: 0x791E, - 20686: 0x7934, - 20687: 0x9F9B, - 20688: 0x9EF9, - 20689: 0x9EFB, - 20690: 0x9EFC, - 20691: 0x76F1, - 20692: 0x7704, - 20693: 0x770D, - 20694: 0x76F9, - 20695: 0x7707, - 20696: 0x7708, - 20697: 0x771A, - 20698: 0x7722, - 20699: 0x7719, - 20700: 0x772D, - 20701: 0x7726, - 20702: 0x7735, - 20703: 0x7738, - 20704: 0x7750, - 20705: 0x7751, - 20706: 0x7747, - 20707: 0x7743, - 20708: 0x775A, - 20709: 0x7768, - 20710: 0x980F, - 20711: 0x9810, - 20712: 0x9811, - 20713: 0x9812, - 20714: 0x9813, - 20715: 0x9814, - 20716: 0x9815, - 20717: 0x9816, - 20718: 0x9817, - 20719: 0x9818, - 20720: 0x9819, - 20721: 0x981A, - 20722: 0x981B, - 20723: 0x981C, - 20724: 0x981D, - 20725: 0x981E, - 20726: 0x981F, - 20727: 0x9820, - 20728: 0x9821, - 20729: 0x9822, - 20730: 0x9823, - 20731: 0x9824, - 20732: 0x9825, - 20733: 0x9826, - 20734: 0x9827, - 20735: 0x9828, - 20736: 0x9829, - 20737: 0x982A, - 20738: 0x982B, - 20739: 0x982C, - 20740: 0x982D, - 20741: 0x982E, - 20742: 0x982F, - 20743: 0x9830, - 20744: 0x9831, - 20745: 0x9832, - 20746: 0x9833, - 20747: 0x9834, - 20748: 0x9835, - 20749: 0x9836, - 20750: 0x9837, - 20751: 0x9838, - 20752: 0x9839, - 20753: 0x983A, - 20754: 0x983B, - 20755: 0x983C, - 20756: 0x983D, - 20757: 0x983E, - 20758: 0x983F, - 20759: 0x9840, - 20760: 0x9841, - 20761: 0x9842, - 20762: 0x9843, - 20763: 0x9844, - 20764: 0x9845, - 20765: 0x9846, - 20766: 0x9847, - 20767: 0x9848, - 20768: 0x9849, - 20769: 0x984A, - 20770: 0x984B, - 20771: 0x984C, - 20772: 0x984D, - 20773: 0x984E, - 20774: 0x984F, - 20775: 0x9850, - 20776: 0x9851, - 20777: 0x9852, - 20778: 0x9853, - 20779: 0x9854, - 20780: 0x9855, - 20781: 0x9856, - 20782: 0x9857, - 20783: 0x9858, - 20784: 0x9859, - 20785: 0x985A, - 20786: 0x985B, - 20787: 0x985C, - 20788: 0x985D, - 20789: 0x985E, - 20790: 0x985F, - 20791: 0x9860, - 20792: 0x9861, - 20793: 0x9862, - 20794: 0x9863, - 20795: 0x9864, - 20796: 0x9865, - 20797: 0x9866, - 20798: 0x9867, - 20799: 0x9868, - 20800: 0x9869, - 20801: 0x986A, - 20802: 0x986B, - 20803: 0x986C, - 20804: 0x986D, - 20805: 0x986E, - 20806: 0x7762, - 20807: 0x7765, - 20808: 0x777F, - 20809: 0x778D, - 20810: 0x777D, - 20811: 0x7780, - 20812: 0x778C, - 20813: 0x7791, - 20814: 0x779F, - 20815: 0x77A0, - 20816: 0x77B0, - 20817: 0x77B5, - 20818: 0x77BD, - 20819: 0x753A, - 20820: 0x7540, - 20821: 0x754E, - 20822: 0x754B, - 20823: 0x7548, - 20824: 0x755B, - 20825: 0x7572, - 20826: 0x7579, - 20827: 0x7583, - 20828: 0x7F58, - 20829: 0x7F61, - 20830: 0x7F5F, - 20831: 0x8A48, - 20832: 0x7F68, - 20833: 0x7F74, - 20834: 0x7F71, - 20835: 0x7F79, - 20836: 0x7F81, - 20837: 0x7F7E, - 20838: 0x76CD, - 20839: 0x76E5, - 20840: 0x8832, - 20841: 0x9485, - 20842: 0x9486, - 20843: 0x9487, - 20844: 0x948B, - 20845: 0x948A, - 20846: 0x948C, - 20847: 0x948D, - 20848: 0x948F, - 20849: 0x9490, - 20850: 0x9494, - 20851: 0x9497, - 20852: 0x9495, - 20853: 0x949A, - 20854: 0x949B, - 20855: 0x949C, - 20856: 0x94A3, - 20857: 0x94A4, - 20858: 0x94AB, - 20859: 0x94AA, - 20860: 0x94AD, - 20861: 0x94AC, - 20862: 0x94AF, - 20863: 0x94B0, - 20864: 0x94B2, - 20865: 0x94B4, - 20866: 0x94B6, - 20867: 0x94B7, - 20868: 0x94B8, - 20869: 0x94B9, - 20870: 0x94BA, - 20871: 0x94BC, - 20872: 0x94BD, - 20873: 0x94BF, - 20874: 0x94C4, - 20875: 0x94C8, - 20876: 0x94C9, - 20877: 0x94CA, - 20878: 0x94CB, - 20879: 0x94CC, - 20880: 0x94CD, - 20881: 0x94CE, - 20882: 0x94D0, - 20883: 0x94D1, - 20884: 0x94D2, - 20885: 0x94D5, - 20886: 0x94D6, - 20887: 0x94D7, - 20888: 0x94D9, - 20889: 0x94D8, - 20890: 0x94DB, - 20891: 0x94DE, - 20892: 0x94DF, - 20893: 0x94E0, - 20894: 0x94E2, - 20895: 0x94E4, - 20896: 0x94E5, - 20897: 0x94E7, - 20898: 0x94E8, - 20899: 0x94EA, - 20900: 0x986F, - 20901: 0x9870, - 20902: 0x9871, - 20903: 0x9872, - 20904: 0x9873, - 20905: 0x9874, - 20906: 0x988B, - 20907: 0x988E, - 20908: 0x9892, - 20909: 0x9895, - 20910: 0x9899, - 20911: 0x98A3, - 20912: 0x98A8, - 20913: 0x98A9, - 20914: 0x98AA, - 20915: 0x98AB, - 20916: 0x98AC, - 20917: 0x98AD, - 20918: 0x98AE, - 20919: 0x98AF, - 20920: 0x98B0, - 20921: 0x98B1, - 20922: 0x98B2, - 20923: 0x98B3, - 20924: 0x98B4, - 20925: 0x98B5, - 20926: 0x98B6, - 20927: 0x98B7, - 20928: 0x98B8, - 20929: 0x98B9, - 20930: 0x98BA, - 20931: 0x98BB, - 20932: 0x98BC, - 20933: 0x98BD, - 20934: 0x98BE, - 20935: 0x98BF, - 20936: 0x98C0, - 20937: 0x98C1, - 20938: 0x98C2, - 20939: 0x98C3, - 20940: 0x98C4, - 20941: 0x98C5, - 20942: 0x98C6, - 20943: 0x98C7, - 20944: 0x98C8, - 20945: 0x98C9, - 20946: 0x98CA, - 20947: 0x98CB, - 20948: 0x98CC, - 20949: 0x98CD, - 20950: 0x98CF, - 20951: 0x98D0, - 20952: 0x98D4, - 20953: 0x98D6, - 20954: 0x98D7, - 20955: 0x98DB, - 20956: 0x98DC, - 20957: 0x98DD, - 20958: 0x98E0, - 20959: 0x98E1, - 20960: 0x98E2, - 20961: 0x98E3, - 20962: 0x98E4, - 20963: 0x98E5, - 20964: 0x98E6, - 20965: 0x98E9, - 20966: 0x98EA, - 20967: 0x98EB, - 20968: 0x98EC, - 20969: 0x98ED, - 20970: 0x98EE, - 20971: 0x98EF, - 20972: 0x98F0, - 20973: 0x98F1, - 20974: 0x98F2, - 20975: 0x98F3, - 20976: 0x98F4, - 20977: 0x98F5, - 20978: 0x98F6, - 20979: 0x98F7, - 20980: 0x98F8, - 20981: 0x98F9, - 20982: 0x98FA, - 20983: 0x98FB, - 20984: 0x98FC, - 20985: 0x98FD, - 20986: 0x98FE, - 20987: 0x98FF, - 20988: 0x9900, - 20989: 0x9901, - 20990: 0x9902, - 20991: 0x9903, - 20992: 0x9904, - 20993: 0x9905, - 20994: 0x9906, - 20995: 0x9907, - 20996: 0x94E9, - 20997: 0x94EB, - 20998: 0x94EE, - 20999: 0x94EF, - 21000: 0x94F3, - 21001: 0x94F4, - 21002: 0x94F5, - 21003: 0x94F7, - 21004: 0x94F9, - 21005: 0x94FC, - 21006: 0x94FD, - 21007: 0x94FF, - 21008: 0x9503, - 21009: 0x9502, - 21010: 0x9506, - 21011: 0x9507, - 21012: 0x9509, - 21013: 0x950A, - 21014: 0x950D, - 21015: 0x950E, - 21016: 0x950F, - 21017: 0x9512, - 21018: 0x9513, - 21019: 0x9514, - 21020: 0x9515, - 21021: 0x9516, - 21022: 0x9518, - 21023: 0x951B, - 21024: 0x951D, - 21025: 0x951E, - 21026: 0x951F, - 21027: 0x9522, - 21028: 0x952A, - 21029: 0x952B, - 21030: 0x9529, - 21031: 0x952C, - 21032: 0x9531, - 21033: 0x9532, - 21034: 0x9534, - 21035: 0x9536, - 21036: 0x9537, - 21037: 0x9538, - 21038: 0x953C, - 21039: 0x953E, - 21040: 0x953F, - 21041: 0x9542, - 21042: 0x9535, - 21043: 0x9544, - 21044: 0x9545, - 21045: 0x9546, - 21046: 0x9549, - 21047: 0x954C, - 21048: 0x954E, - 21049: 0x954F, - 21050: 0x9552, - 21051: 0x9553, - 21052: 0x9554, - 21053: 0x9556, - 21054: 0x9557, - 21055: 0x9558, - 21056: 0x9559, - 21057: 0x955B, - 21058: 0x955E, - 21059: 0x955F, - 21060: 0x955D, - 21061: 0x9561, - 21062: 0x9562, - 21063: 0x9564, - 21064: 0x9565, - 21065: 0x9566, - 21066: 0x9567, - 21067: 0x9568, - 21068: 0x9569, - 21069: 0x956A, - 21070: 0x956B, - 21071: 0x956C, - 21072: 0x956F, - 21073: 0x9571, - 21074: 0x9572, - 21075: 0x9573, - 21076: 0x953A, - 21077: 0x77E7, - 21078: 0x77EC, - 21079: 0x96C9, - 21080: 0x79D5, - 21081: 0x79ED, - 21082: 0x79E3, - 21083: 0x79EB, - 21084: 0x7A06, - 21085: 0x5D47, - 21086: 0x7A03, - 21087: 0x7A02, - 21088: 0x7A1E, - 21089: 0x7A14, - 21090: 0x9908, - 21091: 0x9909, - 21092: 0x990A, - 21093: 0x990B, - 21094: 0x990C, - 21095: 0x990E, - 21096: 0x990F, - 21097: 0x9911, - 21098: 0x9912, - 21099: 0x9913, - 21100: 0x9914, - 21101: 0x9915, - 21102: 0x9916, - 21103: 0x9917, - 21104: 0x9918, - 21105: 0x9919, - 21106: 0x991A, - 21107: 0x991B, - 21108: 0x991C, - 21109: 0x991D, - 21110: 0x991E, - 21111: 0x991F, - 21112: 0x9920, - 21113: 0x9921, - 21114: 0x9922, - 21115: 0x9923, - 21116: 0x9924, - 21117: 0x9925, - 21118: 0x9926, - 21119: 0x9927, - 21120: 0x9928, - 21121: 0x9929, - 21122: 0x992A, - 21123: 0x992B, - 21124: 0x992C, - 21125: 0x992D, - 21126: 0x992F, - 21127: 0x9930, - 21128: 0x9931, - 21129: 0x9932, - 21130: 0x9933, - 21131: 0x9934, - 21132: 0x9935, - 21133: 0x9936, - 21134: 0x9937, - 21135: 0x9938, - 21136: 0x9939, - 21137: 0x993A, - 21138: 0x993B, - 21139: 0x993C, - 21140: 0x993D, - 21141: 0x993E, - 21142: 0x993F, - 21143: 0x9940, - 21144: 0x9941, - 21145: 0x9942, - 21146: 0x9943, - 21147: 0x9944, - 21148: 0x9945, - 21149: 0x9946, - 21150: 0x9947, - 21151: 0x9948, - 21152: 0x9949, - 21153: 0x994A, - 21154: 0x994B, - 21155: 0x994C, - 21156: 0x994D, - 21157: 0x994E, - 21158: 0x994F, - 21159: 0x9950, - 21160: 0x9951, - 21161: 0x9952, - 21162: 0x9953, - 21163: 0x9956, - 21164: 0x9957, - 21165: 0x9958, - 21166: 0x9959, - 21167: 0x995A, - 21168: 0x995B, - 21169: 0x995C, - 21170: 0x995D, - 21171: 0x995E, - 21172: 0x995F, - 21173: 0x9960, - 21174: 0x9961, - 21175: 0x9962, - 21176: 0x9964, - 21177: 0x9966, - 21178: 0x9973, - 21179: 0x9978, - 21180: 0x9979, - 21181: 0x997B, - 21182: 0x997E, - 21183: 0x9982, - 21184: 0x9983, - 21185: 0x9989, - 21186: 0x7A39, - 21187: 0x7A37, - 21188: 0x7A51, - 21189: 0x9ECF, - 21190: 0x99A5, - 21191: 0x7A70, - 21192: 0x7688, - 21193: 0x768E, - 21194: 0x7693, - 21195: 0x7699, - 21196: 0x76A4, - 21197: 0x74DE, - 21198: 0x74E0, - 21199: 0x752C, - 21200: 0x9E20, - 21201: 0x9E22, - 21202: 0x9E28, - 21203: 0x9E29, - 21204: 0x9E2A, - 21205: 0x9E2B, - 21206: 0x9E2C, - 21207: 0x9E32, - 21208: 0x9E31, - 21209: 0x9E36, - 21210: 0x9E38, - 21211: 0x9E37, - 21212: 0x9E39, - 21213: 0x9E3A, - 21214: 0x9E3E, - 21215: 0x9E41, - 21216: 0x9E42, - 21217: 0x9E44, - 21218: 0x9E46, - 21219: 0x9E47, - 21220: 0x9E48, - 21221: 0x9E49, - 21222: 0x9E4B, - 21223: 0x9E4C, - 21224: 0x9E4E, - 21225: 0x9E51, - 21226: 0x9E55, - 21227: 0x9E57, - 21228: 0x9E5A, - 21229: 0x9E5B, - 21230: 0x9E5C, - 21231: 0x9E5E, - 21232: 0x9E63, - 21233: 0x9E66, - 21234: 0x9E67, - 21235: 0x9E68, - 21236: 0x9E69, - 21237: 0x9E6A, - 21238: 0x9E6B, - 21239: 0x9E6C, - 21240: 0x9E71, - 21241: 0x9E6D, - 21242: 0x9E73, - 21243: 0x7592, - 21244: 0x7594, - 21245: 0x7596, - 21246: 0x75A0, - 21247: 0x759D, - 21248: 0x75AC, - 21249: 0x75A3, - 21250: 0x75B3, - 21251: 0x75B4, - 21252: 0x75B8, - 21253: 0x75C4, - 21254: 0x75B1, - 21255: 0x75B0, - 21256: 0x75C3, - 21257: 0x75C2, - 21258: 0x75D6, - 21259: 0x75CD, - 21260: 0x75E3, - 21261: 0x75E8, - 21262: 0x75E6, - 21263: 0x75E4, - 21264: 0x75EB, - 21265: 0x75E7, - 21266: 0x7603, - 21267: 0x75F1, - 21268: 0x75FC, - 21269: 0x75FF, - 21270: 0x7610, - 21271: 0x7600, - 21272: 0x7605, - 21273: 0x760C, - 21274: 0x7617, - 21275: 0x760A, - 21276: 0x7625, - 21277: 0x7618, - 21278: 0x7615, - 21279: 0x7619, - 21280: 0x998C, - 21281: 0x998E, - 21282: 0x999A, - 21283: 0x999B, - 21284: 0x999C, - 21285: 0x999D, - 21286: 0x999E, - 21287: 0x999F, - 21288: 0x99A0, - 21289: 0x99A1, - 21290: 0x99A2, - 21291: 0x99A3, - 21292: 0x99A4, - 21293: 0x99A6, - 21294: 0x99A7, - 21295: 0x99A9, - 21296: 0x99AA, - 21297: 0x99AB, - 21298: 0x99AC, - 21299: 0x99AD, - 21300: 0x99AE, - 21301: 0x99AF, - 21302: 0x99B0, - 21303: 0x99B1, - 21304: 0x99B2, - 21305: 0x99B3, - 21306: 0x99B4, - 21307: 0x99B5, - 21308: 0x99B6, - 21309: 0x99B7, - 21310: 0x99B8, - 21311: 0x99B9, - 21312: 0x99BA, - 21313: 0x99BB, - 21314: 0x99BC, - 21315: 0x99BD, - 21316: 0x99BE, - 21317: 0x99BF, - 21318: 0x99C0, - 21319: 0x99C1, - 21320: 0x99C2, - 21321: 0x99C3, - 21322: 0x99C4, - 21323: 0x99C5, - 21324: 0x99C6, - 21325: 0x99C7, - 21326: 0x99C8, - 21327: 0x99C9, - 21328: 0x99CA, - 21329: 0x99CB, - 21330: 0x99CC, - 21331: 0x99CD, - 21332: 0x99CE, - 21333: 0x99CF, - 21334: 0x99D0, - 21335: 0x99D1, - 21336: 0x99D2, - 21337: 0x99D3, - 21338: 0x99D4, - 21339: 0x99D5, - 21340: 0x99D6, - 21341: 0x99D7, - 21342: 0x99D8, - 21343: 0x99D9, - 21344: 0x99DA, - 21345: 0x99DB, - 21346: 0x99DC, - 21347: 0x99DD, - 21348: 0x99DE, - 21349: 0x99DF, - 21350: 0x99E0, - 21351: 0x99E1, - 21352: 0x99E2, - 21353: 0x99E3, - 21354: 0x99E4, - 21355: 0x99E5, - 21356: 0x99E6, - 21357: 0x99E7, - 21358: 0x99E8, - 21359: 0x99E9, - 21360: 0x99EA, - 21361: 0x99EB, - 21362: 0x99EC, - 21363: 0x99ED, - 21364: 0x99EE, - 21365: 0x99EF, - 21366: 0x99F0, - 21367: 0x99F1, - 21368: 0x99F2, - 21369: 0x99F3, - 21370: 0x99F4, - 21371: 0x99F5, - 21372: 0x99F6, - 21373: 0x99F7, - 21374: 0x99F8, - 21375: 0x99F9, - 21376: 0x761B, - 21377: 0x763C, - 21378: 0x7622, - 21379: 0x7620, - 21380: 0x7640, - 21381: 0x762D, - 21382: 0x7630, - 21383: 0x763F, - 21384: 0x7635, - 21385: 0x7643, - 21386: 0x763E, - 21387: 0x7633, - 21388: 0x764D, - 21389: 0x765E, - 21390: 0x7654, - 21391: 0x765C, - 21392: 0x7656, - 21393: 0x766B, - 21394: 0x766F, - 21395: 0x7FCA, - 21396: 0x7AE6, - 21397: 0x7A78, - 21398: 0x7A79, - 21399: 0x7A80, - 21400: 0x7A86, - 21401: 0x7A88, - 21402: 0x7A95, - 21403: 0x7AA6, - 21404: 0x7AA0, - 21405: 0x7AAC, - 21406: 0x7AA8, - 21407: 0x7AAD, - 21408: 0x7AB3, - 21409: 0x8864, - 21410: 0x8869, - 21411: 0x8872, - 21412: 0x887D, - 21413: 0x887F, - 21414: 0x8882, - 21415: 0x88A2, - 21416: 0x88C6, - 21417: 0x88B7, - 21418: 0x88BC, - 21419: 0x88C9, - 21420: 0x88E2, - 21421: 0x88CE, - 21422: 0x88E3, - 21423: 0x88E5, - 21424: 0x88F1, - 21425: 0x891A, - 21426: 0x88FC, - 21427: 0x88E8, - 21428: 0x88FE, - 21429: 0x88F0, - 21430: 0x8921, - 21431: 0x8919, - 21432: 0x8913, - 21433: 0x891B, - 21434: 0x890A, - 21435: 0x8934, - 21436: 0x892B, - 21437: 0x8936, - 21438: 0x8941, - 21439: 0x8966, - 21440: 0x897B, - 21441: 0x758B, - 21442: 0x80E5, - 21443: 0x76B2, - 21444: 0x76B4, - 21445: 0x77DC, - 21446: 0x8012, - 21447: 0x8014, - 21448: 0x8016, - 21449: 0x801C, - 21450: 0x8020, - 21451: 0x8022, - 21452: 0x8025, - 21453: 0x8026, - 21454: 0x8027, - 21455: 0x8029, - 21456: 0x8028, - 21457: 0x8031, - 21458: 0x800B, - 21459: 0x8035, - 21460: 0x8043, - 21461: 0x8046, - 21462: 0x804D, - 21463: 0x8052, - 21464: 0x8069, - 21465: 0x8071, - 21466: 0x8983, - 21467: 0x9878, - 21468: 0x9880, - 21469: 0x9883, - 21470: 0x99FA, - 21471: 0x99FB, - 21472: 0x99FC, - 21473: 0x99FD, - 21474: 0x99FE, - 21475: 0x99FF, - 21476: 0x9A00, - 21477: 0x9A01, - 21478: 0x9A02, - 21479: 0x9A03, - 21480: 0x9A04, - 21481: 0x9A05, - 21482: 0x9A06, - 21483: 0x9A07, - 21484: 0x9A08, - 21485: 0x9A09, - 21486: 0x9A0A, - 21487: 0x9A0B, - 21488: 0x9A0C, - 21489: 0x9A0D, - 21490: 0x9A0E, - 21491: 0x9A0F, - 21492: 0x9A10, - 21493: 0x9A11, - 21494: 0x9A12, - 21495: 0x9A13, - 21496: 0x9A14, - 21497: 0x9A15, - 21498: 0x9A16, - 21499: 0x9A17, - 21500: 0x9A18, - 21501: 0x9A19, - 21502: 0x9A1A, - 21503: 0x9A1B, - 21504: 0x9A1C, - 21505: 0x9A1D, - 21506: 0x9A1E, - 21507: 0x9A1F, - 21508: 0x9A20, - 21509: 0x9A21, - 21510: 0x9A22, - 21511: 0x9A23, - 21512: 0x9A24, - 21513: 0x9A25, - 21514: 0x9A26, - 21515: 0x9A27, - 21516: 0x9A28, - 21517: 0x9A29, - 21518: 0x9A2A, - 21519: 0x9A2B, - 21520: 0x9A2C, - 21521: 0x9A2D, - 21522: 0x9A2E, - 21523: 0x9A2F, - 21524: 0x9A30, - 21525: 0x9A31, - 21526: 0x9A32, - 21527: 0x9A33, - 21528: 0x9A34, - 21529: 0x9A35, - 21530: 0x9A36, - 21531: 0x9A37, - 21532: 0x9A38, - 21533: 0x9A39, - 21534: 0x9A3A, - 21535: 0x9A3B, - 21536: 0x9A3C, - 21537: 0x9A3D, - 21538: 0x9A3E, - 21539: 0x9A3F, - 21540: 0x9A40, - 21541: 0x9A41, - 21542: 0x9A42, - 21543: 0x9A43, - 21544: 0x9A44, - 21545: 0x9A45, - 21546: 0x9A46, - 21547: 0x9A47, - 21548: 0x9A48, - 21549: 0x9A49, - 21550: 0x9A4A, - 21551: 0x9A4B, - 21552: 0x9A4C, - 21553: 0x9A4D, - 21554: 0x9A4E, - 21555: 0x9A4F, - 21556: 0x9A50, - 21557: 0x9A51, - 21558: 0x9A52, - 21559: 0x9A53, - 21560: 0x9A54, - 21561: 0x9A55, - 21562: 0x9A56, - 21563: 0x9A57, - 21564: 0x9A58, - 21565: 0x9A59, - 21566: 0x9889, - 21567: 0x988C, - 21568: 0x988D, - 21569: 0x988F, - 21570: 0x9894, - 21571: 0x989A, - 21572: 0x989B, - 21573: 0x989E, - 21574: 0x989F, - 21575: 0x98A1, - 21576: 0x98A2, - 21577: 0x98A5, - 21578: 0x98A6, - 21579: 0x864D, - 21580: 0x8654, - 21581: 0x866C, - 21582: 0x866E, - 21583: 0x867F, - 21584: 0x867A, - 21585: 0x867C, - 21586: 0x867B, - 21587: 0x86A8, - 21588: 0x868D, - 21589: 0x868B, - 21590: 0x86AC, - 21591: 0x869D, - 21592: 0x86A7, - 21593: 0x86A3, - 21594: 0x86AA, - 21595: 0x8693, - 21596: 0x86A9, - 21597: 0x86B6, - 21598: 0x86C4, - 21599: 0x86B5, - 21600: 0x86CE, - 21601: 0x86B0, - 21602: 0x86BA, - 21603: 0x86B1, - 21604: 0x86AF, - 21605: 0x86C9, - 21606: 0x86CF, - 21607: 0x86B4, - 21608: 0x86E9, - 21609: 0x86F1, - 21610: 0x86F2, - 21611: 0x86ED, - 21612: 0x86F3, - 21613: 0x86D0, - 21614: 0x8713, - 21615: 0x86DE, - 21616: 0x86F4, - 21617: 0x86DF, - 21618: 0x86D8, - 21619: 0x86D1, - 21620: 0x8703, - 21621: 0x8707, - 21622: 0x86F8, - 21623: 0x8708, - 21624: 0x870A, - 21625: 0x870D, - 21626: 0x8709, - 21627: 0x8723, - 21628: 0x873B, - 21629: 0x871E, - 21630: 0x8725, - 21631: 0x872E, - 21632: 0x871A, - 21633: 0x873E, - 21634: 0x8748, - 21635: 0x8734, - 21636: 0x8731, - 21637: 0x8729, - 21638: 0x8737, - 21639: 0x873F, - 21640: 0x8782, - 21641: 0x8722, - 21642: 0x877D, - 21643: 0x877E, - 21644: 0x877B, - 21645: 0x8760, - 21646: 0x8770, - 21647: 0x874C, - 21648: 0x876E, - 21649: 0x878B, - 21650: 0x8753, - 21651: 0x8763, - 21652: 0x877C, - 21653: 0x8764, - 21654: 0x8759, - 21655: 0x8765, - 21656: 0x8793, - 21657: 0x87AF, - 21658: 0x87A8, - 21659: 0x87D2, - 21660: 0x9A5A, - 21661: 0x9A5B, - 21662: 0x9A5C, - 21663: 0x9A5D, - 21664: 0x9A5E, - 21665: 0x9A5F, - 21666: 0x9A60, - 21667: 0x9A61, - 21668: 0x9A62, - 21669: 0x9A63, - 21670: 0x9A64, - 21671: 0x9A65, - 21672: 0x9A66, - 21673: 0x9A67, - 21674: 0x9A68, - 21675: 0x9A69, - 21676: 0x9A6A, - 21677: 0x9A6B, - 21678: 0x9A72, - 21679: 0x9A83, - 21680: 0x9A89, - 21681: 0x9A8D, - 21682: 0x9A8E, - 21683: 0x9A94, - 21684: 0x9A95, - 21685: 0x9A99, - 21686: 0x9AA6, - 21687: 0x9AA9, - 21688: 0x9AAA, - 21689: 0x9AAB, - 21690: 0x9AAC, - 21691: 0x9AAD, - 21692: 0x9AAE, - 21693: 0x9AAF, - 21694: 0x9AB2, - 21695: 0x9AB3, - 21696: 0x9AB4, - 21697: 0x9AB5, - 21698: 0x9AB9, - 21699: 0x9ABB, - 21700: 0x9ABD, - 21701: 0x9ABE, - 21702: 0x9ABF, - 21703: 0x9AC3, - 21704: 0x9AC4, - 21705: 0x9AC6, - 21706: 0x9AC7, - 21707: 0x9AC8, - 21708: 0x9AC9, - 21709: 0x9ACA, - 21710: 0x9ACD, - 21711: 0x9ACE, - 21712: 0x9ACF, - 21713: 0x9AD0, - 21714: 0x9AD2, - 21715: 0x9AD4, - 21716: 0x9AD5, - 21717: 0x9AD6, - 21718: 0x9AD7, - 21719: 0x9AD9, - 21720: 0x9ADA, - 21721: 0x9ADB, - 21722: 0x9ADC, - 21723: 0x9ADD, - 21724: 0x9ADE, - 21725: 0x9AE0, - 21726: 0x9AE2, - 21727: 0x9AE3, - 21728: 0x9AE4, - 21729: 0x9AE5, - 21730: 0x9AE7, - 21731: 0x9AE8, - 21732: 0x9AE9, - 21733: 0x9AEA, - 21734: 0x9AEC, - 21735: 0x9AEE, - 21736: 0x9AF0, - 21737: 0x9AF1, - 21738: 0x9AF2, - 21739: 0x9AF3, - 21740: 0x9AF4, - 21741: 0x9AF5, - 21742: 0x9AF6, - 21743: 0x9AF7, - 21744: 0x9AF8, - 21745: 0x9AFA, - 21746: 0x9AFC, - 21747: 0x9AFD, - 21748: 0x9AFE, - 21749: 0x9AFF, - 21750: 0x9B00, - 21751: 0x9B01, - 21752: 0x9B02, - 21753: 0x9B04, - 21754: 0x9B05, - 21755: 0x9B06, - 21756: 0x87C6, - 21757: 0x8788, - 21758: 0x8785, - 21759: 0x87AD, - 21760: 0x8797, - 21761: 0x8783, - 21762: 0x87AB, - 21763: 0x87E5, - 21764: 0x87AC, - 21765: 0x87B5, - 21766: 0x87B3, - 21767: 0x87CB, - 21768: 0x87D3, - 21769: 0x87BD, - 21770: 0x87D1, - 21771: 0x87C0, - 21772: 0x87CA, - 21773: 0x87DB, - 21774: 0x87EA, - 21775: 0x87E0, - 21776: 0x87EE, - 21777: 0x8816, - 21778: 0x8813, - 21779: 0x87FE, - 21780: 0x880A, - 21781: 0x881B, - 21782: 0x8821, - 21783: 0x8839, - 21784: 0x883C, - 21785: 0x7F36, - 21786: 0x7F42, - 21787: 0x7F44, - 21788: 0x7F45, - 21789: 0x8210, - 21790: 0x7AFA, - 21791: 0x7AFD, - 21792: 0x7B08, - 21793: 0x7B03, - 21794: 0x7B04, - 21795: 0x7B15, - 21796: 0x7B0A, - 21797: 0x7B2B, - 21798: 0x7B0F, - 21799: 0x7B47, - 21800: 0x7B38, - 21801: 0x7B2A, - 21802: 0x7B19, - 21803: 0x7B2E, - 21804: 0x7B31, - 21805: 0x7B20, - 21806: 0x7B25, - 21807: 0x7B24, - 21808: 0x7B33, - 21809: 0x7B3E, - 21810: 0x7B1E, - 21811: 0x7B58, - 21812: 0x7B5A, - 21813: 0x7B45, - 21814: 0x7B75, - 21815: 0x7B4C, - 21816: 0x7B5D, - 21817: 0x7B60, - 21818: 0x7B6E, - 21819: 0x7B7B, - 21820: 0x7B62, - 21821: 0x7B72, - 21822: 0x7B71, - 21823: 0x7B90, - 21824: 0x7BA6, - 21825: 0x7BA7, - 21826: 0x7BB8, - 21827: 0x7BAC, - 21828: 0x7B9D, - 21829: 0x7BA8, - 21830: 0x7B85, - 21831: 0x7BAA, - 21832: 0x7B9C, - 21833: 0x7BA2, - 21834: 0x7BAB, - 21835: 0x7BB4, - 21836: 0x7BD1, - 21837: 0x7BC1, - 21838: 0x7BCC, - 21839: 0x7BDD, - 21840: 0x7BDA, - 21841: 0x7BE5, - 21842: 0x7BE6, - 21843: 0x7BEA, - 21844: 0x7C0C, - 21845: 0x7BFE, - 21846: 0x7BFC, - 21847: 0x7C0F, - 21848: 0x7C16, - 21849: 0x7C0B, - 21850: 0x9B07, - 21851: 0x9B09, - 21852: 0x9B0A, - 21853: 0x9B0B, - 21854: 0x9B0C, - 21855: 0x9B0D, - 21856: 0x9B0E, - 21857: 0x9B10, - 21858: 0x9B11, - 21859: 0x9B12, - 21860: 0x9B14, - 21861: 0x9B15, - 21862: 0x9B16, - 21863: 0x9B17, - 21864: 0x9B18, - 21865: 0x9B19, - 21866: 0x9B1A, - 21867: 0x9B1B, - 21868: 0x9B1C, - 21869: 0x9B1D, - 21870: 0x9B1E, - 21871: 0x9B20, - 21872: 0x9B21, - 21873: 0x9B22, - 21874: 0x9B24, - 21875: 0x9B25, - 21876: 0x9B26, - 21877: 0x9B27, - 21878: 0x9B28, - 21879: 0x9B29, - 21880: 0x9B2A, - 21881: 0x9B2B, - 21882: 0x9B2C, - 21883: 0x9B2D, - 21884: 0x9B2E, - 21885: 0x9B30, - 21886: 0x9B31, - 21887: 0x9B33, - 21888: 0x9B34, - 21889: 0x9B35, - 21890: 0x9B36, - 21891: 0x9B37, - 21892: 0x9B38, - 21893: 0x9B39, - 21894: 0x9B3A, - 21895: 0x9B3D, - 21896: 0x9B3E, - 21897: 0x9B3F, - 21898: 0x9B40, - 21899: 0x9B46, - 21900: 0x9B4A, - 21901: 0x9B4B, - 21902: 0x9B4C, - 21903: 0x9B4E, - 21904: 0x9B50, - 21905: 0x9B52, - 21906: 0x9B53, - 21907: 0x9B55, - 21908: 0x9B56, - 21909: 0x9B57, - 21910: 0x9B58, - 21911: 0x9B59, - 21912: 0x9B5A, - 21913: 0x9B5B, - 21914: 0x9B5C, - 21915: 0x9B5D, - 21916: 0x9B5E, - 21917: 0x9B5F, - 21918: 0x9B60, - 21919: 0x9B61, - 21920: 0x9B62, - 21921: 0x9B63, - 21922: 0x9B64, - 21923: 0x9B65, - 21924: 0x9B66, - 21925: 0x9B67, - 21926: 0x9B68, - 21927: 0x9B69, - 21928: 0x9B6A, - 21929: 0x9B6B, - 21930: 0x9B6C, - 21931: 0x9B6D, - 21932: 0x9B6E, - 21933: 0x9B6F, - 21934: 0x9B70, - 21935: 0x9B71, - 21936: 0x9B72, - 21937: 0x9B73, - 21938: 0x9B74, - 21939: 0x9B75, - 21940: 0x9B76, - 21941: 0x9B77, - 21942: 0x9B78, - 21943: 0x9B79, - 21944: 0x9B7A, - 21945: 0x9B7B, - 21946: 0x7C1F, - 21947: 0x7C2A, - 21948: 0x7C26, - 21949: 0x7C38, - 21950: 0x7C41, - 21951: 0x7C40, - 21952: 0x81FE, - 21953: 0x8201, - 21954: 0x8202, - 21955: 0x8204, - 21956: 0x81EC, - 21957: 0x8844, - 21958: 0x8221, - 21959: 0x8222, - 21960: 0x8223, - 21961: 0x822D, - 21962: 0x822F, - 21963: 0x8228, - 21964: 0x822B, - 21965: 0x8238, - 21966: 0x823B, - 21967: 0x8233, - 21968: 0x8234, - 21969: 0x823E, - 21970: 0x8244, - 21971: 0x8249, - 21972: 0x824B, - 21973: 0x824F, - 21974: 0x825A, - 21975: 0x825F, - 21976: 0x8268, - 21977: 0x887E, - 21978: 0x8885, - 21979: 0x8888, - 21980: 0x88D8, - 21981: 0x88DF, - 21982: 0x895E, - 21983: 0x7F9D, - 21984: 0x7F9F, - 21985: 0x7FA7, - 21986: 0x7FAF, - 21987: 0x7FB0, - 21988: 0x7FB2, - 21989: 0x7C7C, - 21990: 0x6549, - 21991: 0x7C91, - 21992: 0x7C9D, - 21993: 0x7C9C, - 21994: 0x7C9E, - 21995: 0x7CA2, - 21996: 0x7CB2, - 21997: 0x7CBC, - 21998: 0x7CBD, - 21999: 0x7CC1, - 22000: 0x7CC7, - 22001: 0x7CCC, - 22002: 0x7CCD, - 22003: 0x7CC8, - 22004: 0x7CC5, - 22005: 0x7CD7, - 22006: 0x7CE8, - 22007: 0x826E, - 22008: 0x66A8, - 22009: 0x7FBF, - 22010: 0x7FCE, - 22011: 0x7FD5, - 22012: 0x7FE5, - 22013: 0x7FE1, - 22014: 0x7FE6, - 22015: 0x7FE9, - 22016: 0x7FEE, - 22017: 0x7FF3, - 22018: 0x7CF8, - 22019: 0x7D77, - 22020: 0x7DA6, - 22021: 0x7DAE, - 22022: 0x7E47, - 22023: 0x7E9B, - 22024: 0x9EB8, - 22025: 0x9EB4, - 22026: 0x8D73, - 22027: 0x8D84, - 22028: 0x8D94, - 22029: 0x8D91, - 22030: 0x8DB1, - 22031: 0x8D67, - 22032: 0x8D6D, - 22033: 0x8C47, - 22034: 0x8C49, - 22035: 0x914A, - 22036: 0x9150, - 22037: 0x914E, - 22038: 0x914F, - 22039: 0x9164, - 22040: 0x9B7C, - 22041: 0x9B7D, - 22042: 0x9B7E, - 22043: 0x9B7F, - 22044: 0x9B80, - 22045: 0x9B81, - 22046: 0x9B82, - 22047: 0x9B83, - 22048: 0x9B84, - 22049: 0x9B85, - 22050: 0x9B86, - 22051: 0x9B87, - 22052: 0x9B88, - 22053: 0x9B89, - 22054: 0x9B8A, - 22055: 0x9B8B, - 22056: 0x9B8C, - 22057: 0x9B8D, - 22058: 0x9B8E, - 22059: 0x9B8F, - 22060: 0x9B90, - 22061: 0x9B91, - 22062: 0x9B92, - 22063: 0x9B93, - 22064: 0x9B94, - 22065: 0x9B95, - 22066: 0x9B96, - 22067: 0x9B97, - 22068: 0x9B98, - 22069: 0x9B99, - 22070: 0x9B9A, - 22071: 0x9B9B, - 22072: 0x9B9C, - 22073: 0x9B9D, - 22074: 0x9B9E, - 22075: 0x9B9F, - 22076: 0x9BA0, - 22077: 0x9BA1, - 22078: 0x9BA2, - 22079: 0x9BA3, - 22080: 0x9BA4, - 22081: 0x9BA5, - 22082: 0x9BA6, - 22083: 0x9BA7, - 22084: 0x9BA8, - 22085: 0x9BA9, - 22086: 0x9BAA, - 22087: 0x9BAB, - 22088: 0x9BAC, - 22089: 0x9BAD, - 22090: 0x9BAE, - 22091: 0x9BAF, - 22092: 0x9BB0, - 22093: 0x9BB1, - 22094: 0x9BB2, - 22095: 0x9BB3, - 22096: 0x9BB4, - 22097: 0x9BB5, - 22098: 0x9BB6, - 22099: 0x9BB7, - 22100: 0x9BB8, - 22101: 0x9BB9, - 22102: 0x9BBA, - 22103: 0x9BBB, - 22104: 0x9BBC, - 22105: 0x9BBD, - 22106: 0x9BBE, - 22107: 0x9BBF, - 22108: 0x9BC0, - 22109: 0x9BC1, - 22110: 0x9BC2, - 22111: 0x9BC3, - 22112: 0x9BC4, - 22113: 0x9BC5, - 22114: 0x9BC6, - 22115: 0x9BC7, - 22116: 0x9BC8, - 22117: 0x9BC9, - 22118: 0x9BCA, - 22119: 0x9BCB, - 22120: 0x9BCC, - 22121: 0x9BCD, - 22122: 0x9BCE, - 22123: 0x9BCF, - 22124: 0x9BD0, - 22125: 0x9BD1, - 22126: 0x9BD2, - 22127: 0x9BD3, - 22128: 0x9BD4, - 22129: 0x9BD5, - 22130: 0x9BD6, - 22131: 0x9BD7, - 22132: 0x9BD8, - 22133: 0x9BD9, - 22134: 0x9BDA, - 22135: 0x9BDB, - 22136: 0x9162, - 22137: 0x9161, - 22138: 0x9170, - 22139: 0x9169, - 22140: 0x916F, - 22141: 0x917D, - 22142: 0x917E, - 22143: 0x9172, - 22144: 0x9174, - 22145: 0x9179, - 22146: 0x918C, - 22147: 0x9185, - 22148: 0x9190, - 22149: 0x918D, - 22150: 0x9191, - 22151: 0x91A2, - 22152: 0x91A3, - 22153: 0x91AA, - 22154: 0x91AD, - 22155: 0x91AE, - 22156: 0x91AF, - 22157: 0x91B5, - 22158: 0x91B4, - 22159: 0x91BA, - 22160: 0x8C55, - 22161: 0x9E7E, - 22162: 0x8DB8, - 22163: 0x8DEB, - 22164: 0x8E05, - 22165: 0x8E59, - 22166: 0x8E69, - 22167: 0x8DB5, - 22168: 0x8DBF, - 22169: 0x8DBC, - 22170: 0x8DBA, - 22171: 0x8DC4, - 22172: 0x8DD6, - 22173: 0x8DD7, - 22174: 0x8DDA, - 22175: 0x8DDE, - 22176: 0x8DCE, - 22177: 0x8DCF, - 22178: 0x8DDB, - 22179: 0x8DC6, - 22180: 0x8DEC, - 22181: 0x8DF7, - 22182: 0x8DF8, - 22183: 0x8DE3, - 22184: 0x8DF9, - 22185: 0x8DFB, - 22186: 0x8DE4, - 22187: 0x8E09, - 22188: 0x8DFD, - 22189: 0x8E14, - 22190: 0x8E1D, - 22191: 0x8E1F, - 22192: 0x8E2C, - 22193: 0x8E2E, - 22194: 0x8E23, - 22195: 0x8E2F, - 22196: 0x8E3A, - 22197: 0x8E40, - 22198: 0x8E39, - 22199: 0x8E35, - 22200: 0x8E3D, - 22201: 0x8E31, - 22202: 0x8E49, - 22203: 0x8E41, - 22204: 0x8E42, - 22205: 0x8E51, - 22206: 0x8E52, - 22207: 0x8E4A, - 22208: 0x8E70, - 22209: 0x8E76, - 22210: 0x8E7C, - 22211: 0x8E6F, - 22212: 0x8E74, - 22213: 0x8E85, - 22214: 0x8E8F, - 22215: 0x8E94, - 22216: 0x8E90, - 22217: 0x8E9C, - 22218: 0x8E9E, - 22219: 0x8C78, - 22220: 0x8C82, - 22221: 0x8C8A, - 22222: 0x8C85, - 22223: 0x8C98, - 22224: 0x8C94, - 22225: 0x659B, - 22226: 0x89D6, - 22227: 0x89DE, - 22228: 0x89DA, - 22229: 0x89DC, - 22230: 0x9BDC, - 22231: 0x9BDD, - 22232: 0x9BDE, - 22233: 0x9BDF, - 22234: 0x9BE0, - 22235: 0x9BE1, - 22236: 0x9BE2, - 22237: 0x9BE3, - 22238: 0x9BE4, - 22239: 0x9BE5, - 22240: 0x9BE6, - 22241: 0x9BE7, - 22242: 0x9BE8, - 22243: 0x9BE9, - 22244: 0x9BEA, - 22245: 0x9BEB, - 22246: 0x9BEC, - 22247: 0x9BED, - 22248: 0x9BEE, - 22249: 0x9BEF, - 22250: 0x9BF0, - 22251: 0x9BF1, - 22252: 0x9BF2, - 22253: 0x9BF3, - 22254: 0x9BF4, - 22255: 0x9BF5, - 22256: 0x9BF6, - 22257: 0x9BF7, - 22258: 0x9BF8, - 22259: 0x9BF9, - 22260: 0x9BFA, - 22261: 0x9BFB, - 22262: 0x9BFC, - 22263: 0x9BFD, - 22264: 0x9BFE, - 22265: 0x9BFF, - 22266: 0x9C00, - 22267: 0x9C01, - 22268: 0x9C02, - 22269: 0x9C03, - 22270: 0x9C04, - 22271: 0x9C05, - 22272: 0x9C06, - 22273: 0x9C07, - 22274: 0x9C08, - 22275: 0x9C09, - 22276: 0x9C0A, - 22277: 0x9C0B, - 22278: 0x9C0C, - 22279: 0x9C0D, - 22280: 0x9C0E, - 22281: 0x9C0F, - 22282: 0x9C10, - 22283: 0x9C11, - 22284: 0x9C12, - 22285: 0x9C13, - 22286: 0x9C14, - 22287: 0x9C15, - 22288: 0x9C16, - 22289: 0x9C17, - 22290: 0x9C18, - 22291: 0x9C19, - 22292: 0x9C1A, - 22293: 0x9C1B, - 22294: 0x9C1C, - 22295: 0x9C1D, - 22296: 0x9C1E, - 22297: 0x9C1F, - 22298: 0x9C20, - 22299: 0x9C21, - 22300: 0x9C22, - 22301: 0x9C23, - 22302: 0x9C24, - 22303: 0x9C25, - 22304: 0x9C26, - 22305: 0x9C27, - 22306: 0x9C28, - 22307: 0x9C29, - 22308: 0x9C2A, - 22309: 0x9C2B, - 22310: 0x9C2C, - 22311: 0x9C2D, - 22312: 0x9C2E, - 22313: 0x9C2F, - 22314: 0x9C30, - 22315: 0x9C31, - 22316: 0x9C32, - 22317: 0x9C33, - 22318: 0x9C34, - 22319: 0x9C35, - 22320: 0x9C36, - 22321: 0x9C37, - 22322: 0x9C38, - 22323: 0x9C39, - 22324: 0x9C3A, - 22325: 0x9C3B, - 22326: 0x89E5, - 22327: 0x89EB, - 22328: 0x89EF, - 22329: 0x8A3E, - 22330: 0x8B26, - 22331: 0x9753, - 22332: 0x96E9, - 22333: 0x96F3, - 22334: 0x96EF, - 22335: 0x9706, - 22336: 0x9701, - 22337: 0x9708, - 22338: 0x970F, - 22339: 0x970E, - 22340: 0x972A, - 22341: 0x972D, - 22342: 0x9730, - 22343: 0x973E, - 22344: 0x9F80, - 22345: 0x9F83, - 22346: 0x9F85, - 22347: 0x9F86, - 22348: 0x9F87, - 22349: 0x9F88, - 22350: 0x9F89, - 22351: 0x9F8A, - 22352: 0x9F8C, - 22353: 0x9EFE, - 22354: 0x9F0B, - 22355: 0x9F0D, - 22356: 0x96B9, - 22357: 0x96BC, - 22358: 0x96BD, - 22359: 0x96CE, - 22360: 0x96D2, - 22361: 0x77BF, - 22362: 0x96E0, - 22363: 0x928E, - 22364: 0x92AE, - 22365: 0x92C8, - 22366: 0x933E, - 22367: 0x936A, - 22368: 0x93CA, - 22369: 0x938F, - 22370: 0x943E, - 22371: 0x946B, - 22372: 0x9C7F, - 22373: 0x9C82, - 22374: 0x9C85, - 22375: 0x9C86, - 22376: 0x9C87, - 22377: 0x9C88, - 22378: 0x7A23, - 22379: 0x9C8B, - 22380: 0x9C8E, - 22381: 0x9C90, - 22382: 0x9C91, - 22383: 0x9C92, - 22384: 0x9C94, - 22385: 0x9C95, - 22386: 0x9C9A, - 22387: 0x9C9B, - 22388: 0x9C9E, - 22389: 0x9C9F, - 22390: 0x9CA0, - 22391: 0x9CA1, - 22392: 0x9CA2, - 22393: 0x9CA3, - 22394: 0x9CA5, - 22395: 0x9CA6, - 22396: 0x9CA7, - 22397: 0x9CA8, - 22398: 0x9CA9, - 22399: 0x9CAB, - 22400: 0x9CAD, - 22401: 0x9CAE, - 22402: 0x9CB0, - 22403: 0x9CB1, - 22404: 0x9CB2, - 22405: 0x9CB3, - 22406: 0x9CB4, - 22407: 0x9CB5, - 22408: 0x9CB6, - 22409: 0x9CB7, - 22410: 0x9CBA, - 22411: 0x9CBB, - 22412: 0x9CBC, - 22413: 0x9CBD, - 22414: 0x9CC4, - 22415: 0x9CC5, - 22416: 0x9CC6, - 22417: 0x9CC7, - 22418: 0x9CCA, - 22419: 0x9CCB, - 22420: 0x9C3C, - 22421: 0x9C3D, - 22422: 0x9C3E, - 22423: 0x9C3F, - 22424: 0x9C40, - 22425: 0x9C41, - 22426: 0x9C42, - 22427: 0x9C43, - 22428: 0x9C44, - 22429: 0x9C45, - 22430: 0x9C46, - 22431: 0x9C47, - 22432: 0x9C48, - 22433: 0x9C49, - 22434: 0x9C4A, - 22435: 0x9C4B, - 22436: 0x9C4C, - 22437: 0x9C4D, - 22438: 0x9C4E, - 22439: 0x9C4F, - 22440: 0x9C50, - 22441: 0x9C51, - 22442: 0x9C52, - 22443: 0x9C53, - 22444: 0x9C54, - 22445: 0x9C55, - 22446: 0x9C56, - 22447: 0x9C57, - 22448: 0x9C58, - 22449: 0x9C59, - 22450: 0x9C5A, - 22451: 0x9C5B, - 22452: 0x9C5C, - 22453: 0x9C5D, - 22454: 0x9C5E, - 22455: 0x9C5F, - 22456: 0x9C60, - 22457: 0x9C61, - 22458: 0x9C62, - 22459: 0x9C63, - 22460: 0x9C64, - 22461: 0x9C65, - 22462: 0x9C66, - 22463: 0x9C67, - 22464: 0x9C68, - 22465: 0x9C69, - 22466: 0x9C6A, - 22467: 0x9C6B, - 22468: 0x9C6C, - 22469: 0x9C6D, - 22470: 0x9C6E, - 22471: 0x9C6F, - 22472: 0x9C70, - 22473: 0x9C71, - 22474: 0x9C72, - 22475: 0x9C73, - 22476: 0x9C74, - 22477: 0x9C75, - 22478: 0x9C76, - 22479: 0x9C77, - 22480: 0x9C78, - 22481: 0x9C79, - 22482: 0x9C7A, - 22483: 0x9C7B, - 22484: 0x9C7D, - 22485: 0x9C7E, - 22486: 0x9C80, - 22487: 0x9C83, - 22488: 0x9C84, - 22489: 0x9C89, - 22490: 0x9C8A, - 22491: 0x9C8C, - 22492: 0x9C8F, - 22493: 0x9C93, - 22494: 0x9C96, - 22495: 0x9C97, - 22496: 0x9C98, - 22497: 0x9C99, - 22498: 0x9C9D, - 22499: 0x9CAA, - 22500: 0x9CAC, - 22501: 0x9CAF, - 22502: 0x9CB9, - 22503: 0x9CBE, - 22504: 0x9CBF, - 22505: 0x9CC0, - 22506: 0x9CC1, - 22507: 0x9CC2, - 22508: 0x9CC8, - 22509: 0x9CC9, - 22510: 0x9CD1, - 22511: 0x9CD2, - 22512: 0x9CDA, - 22513: 0x9CDB, - 22514: 0x9CE0, - 22515: 0x9CE1, - 22516: 0x9CCC, - 22517: 0x9CCD, - 22518: 0x9CCE, - 22519: 0x9CCF, - 22520: 0x9CD0, - 22521: 0x9CD3, - 22522: 0x9CD4, - 22523: 0x9CD5, - 22524: 0x9CD7, - 22525: 0x9CD8, - 22526: 0x9CD9, - 22527: 0x9CDC, - 22528: 0x9CDD, - 22529: 0x9CDF, - 22530: 0x9CE2, - 22531: 0x977C, - 22532: 0x9785, - 22533: 0x9791, - 22534: 0x9792, - 22535: 0x9794, - 22536: 0x97AF, - 22537: 0x97AB, - 22538: 0x97A3, - 22539: 0x97B2, - 22540: 0x97B4, - 22541: 0x9AB1, - 22542: 0x9AB0, - 22543: 0x9AB7, - 22544: 0x9E58, - 22545: 0x9AB6, - 22546: 0x9ABA, - 22547: 0x9ABC, - 22548: 0x9AC1, - 22549: 0x9AC0, - 22550: 0x9AC5, - 22551: 0x9AC2, - 22552: 0x9ACB, - 22553: 0x9ACC, - 22554: 0x9AD1, - 22555: 0x9B45, - 22556: 0x9B43, - 22557: 0x9B47, - 22558: 0x9B49, - 22559: 0x9B48, - 22560: 0x9B4D, - 22561: 0x9B51, - 22562: 0x98E8, - 22563: 0x990D, - 22564: 0x992E, - 22565: 0x9955, - 22566: 0x9954, - 22567: 0x9ADF, - 22568: 0x9AE1, - 22569: 0x9AE6, - 22570: 0x9AEF, - 22571: 0x9AEB, - 22572: 0x9AFB, - 22573: 0x9AED, - 22574: 0x9AF9, - 22575: 0x9B08, - 22576: 0x9B0F, - 22577: 0x9B13, - 22578: 0x9B1F, - 22579: 0x9B23, - 22580: 0x9EBD, - 22581: 0x9EBE, - 22582: 0x7E3B, - 22583: 0x9E82, - 22584: 0x9E87, - 22585: 0x9E88, - 22586: 0x9E8B, - 22587: 0x9E92, - 22588: 0x93D6, - 22589: 0x9E9D, - 22590: 0x9E9F, - 22591: 0x9EDB, - 22592: 0x9EDC, - 22593: 0x9EDD, - 22594: 0x9EE0, - 22595: 0x9EDF, - 22596: 0x9EE2, - 22597: 0x9EE9, - 22598: 0x9EE7, - 22599: 0x9EE5, - 22600: 0x9EEA, - 22601: 0x9EEF, - 22602: 0x9F22, - 22603: 0x9F2C, - 22604: 0x9F2F, - 22605: 0x9F39, - 22606: 0x9F37, - 22607: 0x9F3D, - 22608: 0x9F3E, - 22609: 0x9F44, - 22610: 0x9CE3, - 22611: 0x9CE4, - 22612: 0x9CE5, - 22613: 0x9CE6, - 22614: 0x9CE7, - 22615: 0x9CE8, - 22616: 0x9CE9, - 22617: 0x9CEA, - 22618: 0x9CEB, - 22619: 0x9CEC, - 22620: 0x9CED, - 22621: 0x9CEE, - 22622: 0x9CEF, - 22623: 0x9CF0, - 22624: 0x9CF1, - 22625: 0x9CF2, - 22626: 0x9CF3, - 22627: 0x9CF4, - 22628: 0x9CF5, - 22629: 0x9CF6, - 22630: 0x9CF7, - 22631: 0x9CF8, - 22632: 0x9CF9, - 22633: 0x9CFA, - 22634: 0x9CFB, - 22635: 0x9CFC, - 22636: 0x9CFD, - 22637: 0x9CFE, - 22638: 0x9CFF, - 22639: 0x9D00, - 22640: 0x9D01, - 22641: 0x9D02, - 22642: 0x9D03, - 22643: 0x9D04, - 22644: 0x9D05, - 22645: 0x9D06, - 22646: 0x9D07, - 22647: 0x9D08, - 22648: 0x9D09, - 22649: 0x9D0A, - 22650: 0x9D0B, - 22651: 0x9D0C, - 22652: 0x9D0D, - 22653: 0x9D0E, - 22654: 0x9D0F, - 22655: 0x9D10, - 22656: 0x9D11, - 22657: 0x9D12, - 22658: 0x9D13, - 22659: 0x9D14, - 22660: 0x9D15, - 22661: 0x9D16, - 22662: 0x9D17, - 22663: 0x9D18, - 22664: 0x9D19, - 22665: 0x9D1A, - 22666: 0x9D1B, - 22667: 0x9D1C, - 22668: 0x9D1D, - 22669: 0x9D1E, - 22670: 0x9D1F, - 22671: 0x9D20, - 22672: 0x9D21, - 22673: 0x9D22, - 22674: 0x9D23, - 22675: 0x9D24, - 22676: 0x9D25, - 22677: 0x9D26, - 22678: 0x9D27, - 22679: 0x9D28, - 22680: 0x9D29, - 22681: 0x9D2A, - 22682: 0x9D2B, - 22683: 0x9D2C, - 22684: 0x9D2D, - 22685: 0x9D2E, - 22686: 0x9D2F, - 22687: 0x9D30, - 22688: 0x9D31, - 22689: 0x9D32, - 22690: 0x9D33, - 22691: 0x9D34, - 22692: 0x9D35, - 22693: 0x9D36, - 22694: 0x9D37, - 22695: 0x9D38, - 22696: 0x9D39, - 22697: 0x9D3A, - 22698: 0x9D3B, - 22699: 0x9D3C, - 22700: 0x9D3D, - 22701: 0x9D3E, - 22702: 0x9D3F, - 22703: 0x9D40, - 22704: 0x9D41, - 22705: 0x9D42, - 22800: 0x9D43, - 22801: 0x9D44, - 22802: 0x9D45, - 22803: 0x9D46, - 22804: 0x9D47, - 22805: 0x9D48, - 22806: 0x9D49, - 22807: 0x9D4A, - 22808: 0x9D4B, - 22809: 0x9D4C, - 22810: 0x9D4D, - 22811: 0x9D4E, - 22812: 0x9D4F, - 22813: 0x9D50, - 22814: 0x9D51, - 22815: 0x9D52, - 22816: 0x9D53, - 22817: 0x9D54, - 22818: 0x9D55, - 22819: 0x9D56, - 22820: 0x9D57, - 22821: 0x9D58, - 22822: 0x9D59, - 22823: 0x9D5A, - 22824: 0x9D5B, - 22825: 0x9D5C, - 22826: 0x9D5D, - 22827: 0x9D5E, - 22828: 0x9D5F, - 22829: 0x9D60, - 22830: 0x9D61, - 22831: 0x9D62, - 22832: 0x9D63, - 22833: 0x9D64, - 22834: 0x9D65, - 22835: 0x9D66, - 22836: 0x9D67, - 22837: 0x9D68, - 22838: 0x9D69, - 22839: 0x9D6A, - 22840: 0x9D6B, - 22841: 0x9D6C, - 22842: 0x9D6D, - 22843: 0x9D6E, - 22844: 0x9D6F, - 22845: 0x9D70, - 22846: 0x9D71, - 22847: 0x9D72, - 22848: 0x9D73, - 22849: 0x9D74, - 22850: 0x9D75, - 22851: 0x9D76, - 22852: 0x9D77, - 22853: 0x9D78, - 22854: 0x9D79, - 22855: 0x9D7A, - 22856: 0x9D7B, - 22857: 0x9D7C, - 22858: 0x9D7D, - 22859: 0x9D7E, - 22860: 0x9D7F, - 22861: 0x9D80, - 22862: 0x9D81, - 22863: 0x9D82, - 22864: 0x9D83, - 22865: 0x9D84, - 22866: 0x9D85, - 22867: 0x9D86, - 22868: 0x9D87, - 22869: 0x9D88, - 22870: 0x9D89, - 22871: 0x9D8A, - 22872: 0x9D8B, - 22873: 0x9D8C, - 22874: 0x9D8D, - 22875: 0x9D8E, - 22876: 0x9D8F, - 22877: 0x9D90, - 22878: 0x9D91, - 22879: 0x9D92, - 22880: 0x9D93, - 22881: 0x9D94, - 22882: 0x9D95, - 22883: 0x9D96, - 22884: 0x9D97, - 22885: 0x9D98, - 22886: 0x9D99, - 22887: 0x9D9A, - 22888: 0x9D9B, - 22889: 0x9D9C, - 22890: 0x9D9D, - 22891: 0x9D9E, - 22892: 0x9D9F, - 22893: 0x9DA0, - 22894: 0x9DA1, - 22895: 0x9DA2, - 22990: 0x9DA3, - 22991: 0x9DA4, - 22992: 0x9DA5, - 22993: 0x9DA6, - 22994: 0x9DA7, - 22995: 0x9DA8, - 22996: 0x9DA9, - 22997: 0x9DAA, - 22998: 0x9DAB, - 22999: 0x9DAC, - 23000: 0x9DAD, - 23001: 0x9DAE, - 23002: 0x9DAF, - 23003: 0x9DB0, - 23004: 0x9DB1, - 23005: 0x9DB2, - 23006: 0x9DB3, - 23007: 0x9DB4, - 23008: 0x9DB5, - 23009: 0x9DB6, - 23010: 0x9DB7, - 23011: 0x9DB8, - 23012: 0x9DB9, - 23013: 0x9DBA, - 23014: 0x9DBB, - 23015: 0x9DBC, - 23016: 0x9DBD, - 23017: 0x9DBE, - 23018: 0x9DBF, - 23019: 0x9DC0, - 23020: 0x9DC1, - 23021: 0x9DC2, - 23022: 0x9DC3, - 23023: 0x9DC4, - 23024: 0x9DC5, - 23025: 0x9DC6, - 23026: 0x9DC7, - 23027: 0x9DC8, - 23028: 0x9DC9, - 23029: 0x9DCA, - 23030: 0x9DCB, - 23031: 0x9DCC, - 23032: 0x9DCD, - 23033: 0x9DCE, - 23034: 0x9DCF, - 23035: 0x9DD0, - 23036: 0x9DD1, - 23037: 0x9DD2, - 23038: 0x9DD3, - 23039: 0x9DD4, - 23040: 0x9DD5, - 23041: 0x9DD6, - 23042: 0x9DD7, - 23043: 0x9DD8, - 23044: 0x9DD9, - 23045: 0x9DDA, - 23046: 0x9DDB, - 23047: 0x9DDC, - 23048: 0x9DDD, - 23049: 0x9DDE, - 23050: 0x9DDF, - 23051: 0x9DE0, - 23052: 0x9DE1, - 23053: 0x9DE2, - 23054: 0x9DE3, - 23055: 0x9DE4, - 23056: 0x9DE5, - 23057: 0x9DE6, - 23058: 0x9DE7, - 23059: 0x9DE8, - 23060: 0x9DE9, - 23061: 0x9DEA, - 23062: 0x9DEB, - 23063: 0x9DEC, - 23064: 0x9DED, - 23065: 0x9DEE, - 23066: 0x9DEF, - 23067: 0x9DF0, - 23068: 0x9DF1, - 23069: 0x9DF2, - 23070: 0x9DF3, - 23071: 0x9DF4, - 23072: 0x9DF5, - 23073: 0x9DF6, - 23074: 0x9DF7, - 23075: 0x9DF8, - 23076: 0x9DF9, - 23077: 0x9DFA, - 23078: 0x9DFB, - 23079: 0x9DFC, - 23080: 0x9DFD, - 23081: 0x9DFE, - 23082: 0x9DFF, - 23083: 0x9E00, - 23084: 0x9E01, - 23085: 0x9E02, - 23180: 0x9E03, - 23181: 0x9E04, - 23182: 0x9E05, - 23183: 0x9E06, - 23184: 0x9E07, - 23185: 0x9E08, - 23186: 0x9E09, - 23187: 0x9E0A, - 23188: 0x9E0B, - 23189: 0x9E0C, - 23190: 0x9E0D, - 23191: 0x9E0E, - 23192: 0x9E0F, - 23193: 0x9E10, - 23194: 0x9E11, - 23195: 0x9E12, - 23196: 0x9E13, - 23197: 0x9E14, - 23198: 0x9E15, - 23199: 0x9E16, - 23200: 0x9E17, - 23201: 0x9E18, - 23202: 0x9E19, - 23203: 0x9E1A, - 23204: 0x9E1B, - 23205: 0x9E1C, - 23206: 0x9E1D, - 23207: 0x9E1E, - 23208: 0x9E24, - 23209: 0x9E27, - 23210: 0x9E2E, - 23211: 0x9E30, - 23212: 0x9E34, - 23213: 0x9E3B, - 23214: 0x9E3C, - 23215: 0x9E40, - 23216: 0x9E4D, - 23217: 0x9E50, - 23218: 0x9E52, - 23219: 0x9E53, - 23220: 0x9E54, - 23221: 0x9E56, - 23222: 0x9E59, - 23223: 0x9E5D, - 23224: 0x9E5F, - 23225: 0x9E60, - 23226: 0x9E61, - 23227: 0x9E62, - 23228: 0x9E65, - 23229: 0x9E6E, - 23230: 0x9E6F, - 23231: 0x9E72, - 23232: 0x9E74, - 23233: 0x9E75, - 23234: 0x9E76, - 23235: 0x9E77, - 23236: 0x9E78, - 23237: 0x9E79, - 23238: 0x9E7A, - 23239: 0x9E7B, - 23240: 0x9E7C, - 23241: 0x9E7D, - 23242: 0x9E80, - 23243: 0x9E81, - 23244: 0x9E83, - 23245: 0x9E84, - 23246: 0x9E85, - 23247: 0x9E86, - 23248: 0x9E89, - 23249: 0x9E8A, - 23250: 0x9E8C, - 23251: 0x9E8D, - 23252: 0x9E8E, - 23253: 0x9E8F, - 23254: 0x9E90, - 23255: 0x9E91, - 23256: 0x9E94, - 23257: 0x9E95, - 23258: 0x9E96, - 23259: 0x9E97, - 23260: 0x9E98, - 23261: 0x9E99, - 23262: 0x9E9A, - 23263: 0x9E9B, - 23264: 0x9E9C, - 23265: 0x9E9E, - 23266: 0x9EA0, - 23267: 0x9EA1, - 23268: 0x9EA2, - 23269: 0x9EA3, - 23270: 0x9EA4, - 23271: 0x9EA5, - 23272: 0x9EA7, - 23273: 0x9EA8, - 23274: 0x9EA9, - 23275: 0x9EAA, - 23370: 0x9EAB, - 23371: 0x9EAC, - 23372: 0x9EAD, - 23373: 0x9EAE, - 23374: 0x9EAF, - 23375: 0x9EB0, - 23376: 0x9EB1, - 23377: 0x9EB2, - 23378: 0x9EB3, - 23379: 0x9EB5, - 23380: 0x9EB6, - 23381: 0x9EB7, - 23382: 0x9EB9, - 23383: 0x9EBA, - 23384: 0x9EBC, - 23385: 0x9EBF, - 23386: 0x9EC0, - 23387: 0x9EC1, - 23388: 0x9EC2, - 23389: 0x9EC3, - 23390: 0x9EC5, - 23391: 0x9EC6, - 23392: 0x9EC7, - 23393: 0x9EC8, - 23394: 0x9ECA, - 23395: 0x9ECB, - 23396: 0x9ECC, - 23397: 0x9ED0, - 23398: 0x9ED2, - 23399: 0x9ED3, - 23400: 0x9ED5, - 23401: 0x9ED6, - 23402: 0x9ED7, - 23403: 0x9ED9, - 23404: 0x9EDA, - 23405: 0x9EDE, - 23406: 0x9EE1, - 23407: 0x9EE3, - 23408: 0x9EE4, - 23409: 0x9EE6, - 23410: 0x9EE8, - 23411: 0x9EEB, - 23412: 0x9EEC, - 23413: 0x9EED, - 23414: 0x9EEE, - 23415: 0x9EF0, - 23416: 0x9EF1, - 23417: 0x9EF2, - 23418: 0x9EF3, - 23419: 0x9EF4, - 23420: 0x9EF5, - 23421: 0x9EF6, - 23422: 0x9EF7, - 23423: 0x9EF8, - 23424: 0x9EFA, - 23425: 0x9EFD, - 23426: 0x9EFF, - 23427: 0x9F00, - 23428: 0x9F01, - 23429: 0x9F02, - 23430: 0x9F03, - 23431: 0x9F04, - 23432: 0x9F05, - 23433: 0x9F06, - 23434: 0x9F07, - 23435: 0x9F08, - 23436: 0x9F09, - 23437: 0x9F0A, - 23438: 0x9F0C, - 23439: 0x9F0F, - 23440: 0x9F11, - 23441: 0x9F12, - 23442: 0x9F14, - 23443: 0x9F15, - 23444: 0x9F16, - 23445: 0x9F18, - 23446: 0x9F1A, - 23447: 0x9F1B, - 23448: 0x9F1C, - 23449: 0x9F1D, - 23450: 0x9F1E, - 23451: 0x9F1F, - 23452: 0x9F21, - 23453: 0x9F23, - 23454: 0x9F24, - 23455: 0x9F25, - 23456: 0x9F26, - 23457: 0x9F27, - 23458: 0x9F28, - 23459: 0x9F29, - 23460: 0x9F2A, - 23461: 0x9F2B, - 23462: 0x9F2D, - 23463: 0x9F2E, - 23464: 0x9F30, - 23465: 0x9F31, - 23560: 0x9F32, - 23561: 0x9F33, - 23562: 0x9F34, - 23563: 0x9F35, - 23564: 0x9F36, - 23565: 0x9F38, - 23566: 0x9F3A, - 23567: 0x9F3C, - 23568: 0x9F3F, - 23569: 0x9F40, - 23570: 0x9F41, - 23571: 0x9F42, - 23572: 0x9F43, - 23573: 0x9F45, - 23574: 0x9F46, - 23575: 0x9F47, - 23576: 0x9F48, - 23577: 0x9F49, - 23578: 0x9F4A, - 23579: 0x9F4B, - 23580: 0x9F4C, - 23581: 0x9F4D, - 23582: 0x9F4E, - 23583: 0x9F4F, - 23584: 0x9F52, - 23585: 0x9F53, - 23586: 0x9F54, - 23587: 0x9F55, - 23588: 0x9F56, - 23589: 0x9F57, - 23590: 0x9F58, - 23591: 0x9F59, - 23592: 0x9F5A, - 23593: 0x9F5B, - 23594: 0x9F5C, - 23595: 0x9F5D, - 23596: 0x9F5E, - 23597: 0x9F5F, - 23598: 0x9F60, - 23599: 0x9F61, - 23600: 0x9F62, - 23601: 0x9F63, - 23602: 0x9F64, - 23603: 0x9F65, - 23604: 0x9F66, - 23605: 0x9F67, - 23606: 0x9F68, - 23607: 0x9F69, - 23608: 0x9F6A, - 23609: 0x9F6B, - 23610: 0x9F6C, - 23611: 0x9F6D, - 23612: 0x9F6E, - 23613: 0x9F6F, - 23614: 0x9F70, - 23615: 0x9F71, - 23616: 0x9F72, - 23617: 0x9F73, - 23618: 0x9F74, - 23619: 0x9F75, - 23620: 0x9F76, - 23621: 0x9F77, - 23622: 0x9F78, - 23623: 0x9F79, - 23624: 0x9F7A, - 23625: 0x9F7B, - 23626: 0x9F7C, - 23627: 0x9F7D, - 23628: 0x9F7E, - 23629: 0x9F81, - 23630: 0x9F82, - 23631: 0x9F8D, - 23632: 0x9F8E, - 23633: 0x9F8F, - 23634: 0x9F90, - 23635: 0x9F91, - 23636: 0x9F92, - 23637: 0x9F93, - 23638: 0x9F94, - 23639: 0x9F95, - 23640: 0x9F96, - 23641: 0x9F97, - 23642: 0x9F98, - 23643: 0x9F9C, - 23644: 0x9F9D, - 23645: 0x9F9E, - 23646: 0x9FA1, - 23647: 0x9FA2, - 23648: 0x9FA3, - 23649: 0x9FA4, - 23650: 0x9FA5, - 23651: 0xF92C, - 23652: 0xF979, - 23653: 0xF995, - 23654: 0xF9E7, - 23655: 0xF9F1, - 23750: 0xFA0C, - 23751: 0xFA0D, - 23752: 0xFA0E, - 23753: 0xFA0F, - 23754: 0xFA11, - 23755: 0xFA13, - 23756: 0xFA14, - 23757: 0xFA18, - 23758: 0xFA1F, - 23759: 0xFA20, - 23760: 0xFA21, - 23761: 0xFA23, - 23762: 0xFA24, - 23763: 0xFA27, - 23764: 0xFA28, - 23765: 0xFA29, - 23766: 0x2E81, - 23770: 0x2E84, - 23771: 0x3473, - 23772: 0x3447, - 23773: 0x2E88, - 23774: 0x2E8B, - 23776: 0x359E, - 23777: 0x361A, - 23778: 0x360E, - 23779: 0x2E8C, - 23780: 0x2E97, - 23781: 0x396E, - 23782: 0x3918, - 23784: 0x39CF, - 23785: 0x39DF, - 23786: 0x3A73, - 23787: 0x39D0, - 23790: 0x3B4E, - 23791: 0x3C6E, - 23792: 0x3CE0, - 23793: 0x2EA7, - 23796: 0x2EAA, - 23797: 0x4056, - 23798: 0x415F, - 23799: 0x2EAE, - 23800: 0x4337, - 23801: 0x2EB3, - 23802: 0x2EB6, - 23803: 0x2EB7, - 23805: 0x43B1, - 23806: 0x43AC, - 23807: 0x2EBB, - 23808: 0x43DD, - 23809: 0x44D6, - 23810: 0x4661, - 23811: 0x464C, - 23813: 0x4723, - 23814: 0x4729, - 23815: 0x477C, - 23816: 0x478D, - 23817: 0x2ECA, - 23818: 0x4947, - 23819: 0x497A, - 23820: 0x497D, - 23821: 0x4982, - 23822: 0x4983, - 23823: 0x4985, - 23824: 0x4986, - 23825: 0x499F, - 23826: 0x499B, - 23827: 0x49B7, - 23828: 0x49B6, - 23831: 0x4CA3, - 23832: 0x4C9F, - 23833: 0x4CA0, - 23834: 0x4CA1, - 23835: 0x4C77, - 23836: 0x4CA2, - 23837: 0x4D13, - 23838: 0x4D14, - 23839: 0x4D15, - 23840: 0x4D16, - 23841: 0x4D17, - 23842: 0x4D18, - 23843: 0x4D19, - 23844: 0x4DAE, -} - -const numEncodeTables = 5 - -// encodeX are the encoding tables from Unicode to GBK code, -// sorted by decreasing length. -// encode0: 28965 entries for runes in [11905, 40870). -// encode1: 1587 entries for runes in [ 8208, 9795). -// encode2: 942 entries for runes in [ 164, 1106). -// encode3: 438 entries for runes in [65072, 65510). -// encode4: 254 entries for runes in [63788, 64042). - -const encode0Low, encode0High = 11905, 40870 - -var encode0 = [...]uint16{ - 11905 - 11905: 0xFE50, - 11908 - 11905: 0xFE54, - 11912 - 11905: 0xFE57, - 11915 - 11905: 0xFE58, - 11916 - 11905: 0xFE5D, - 11927 - 11905: 0xFE5E, - 11943 - 11905: 0xFE6B, - 11946 - 11905: 0xFE6E, - 11950 - 11905: 0xFE71, - 11955 - 11905: 0xFE73, - 11958 - 11905: 0xFE74, - 11959 - 11905: 0xFE75, - 11963 - 11905: 0xFE79, - 11978 - 11905: 0xFE84, - 12272 - 11905: 0xA98A, - 12273 - 11905: 0xA98B, - 12274 - 11905: 0xA98C, - 12275 - 11905: 0xA98D, - 12276 - 11905: 0xA98E, - 12277 - 11905: 0xA98F, - 12278 - 11905: 0xA990, - 12279 - 11905: 0xA991, - 12280 - 11905: 0xA992, - 12281 - 11905: 0xA993, - 12282 - 11905: 0xA994, - 12283 - 11905: 0xA995, - 12288 - 11905: 0xA1A1, - 12289 - 11905: 0xA1A2, - 12290 - 11905: 0xA1A3, - 12291 - 11905: 0xA1A8, - 12293 - 11905: 0xA1A9, - 12294 - 11905: 0xA965, - 12295 - 11905: 0xA996, - 12296 - 11905: 0xA1B4, - 12297 - 11905: 0xA1B5, - 12298 - 11905: 0xA1B6, - 12299 - 11905: 0xA1B7, - 12300 - 11905: 0xA1B8, - 12301 - 11905: 0xA1B9, - 12302 - 11905: 0xA1BA, - 12303 - 11905: 0xA1BB, - 12304 - 11905: 0xA1BE, - 12305 - 11905: 0xA1BF, - 12306 - 11905: 0xA893, - 12307 - 11905: 0xA1FE, - 12308 - 11905: 0xA1B2, - 12309 - 11905: 0xA1B3, - 12310 - 11905: 0xA1BC, - 12311 - 11905: 0xA1BD, - 12317 - 11905: 0xA894, - 12318 - 11905: 0xA895, - 12321 - 11905: 0xA940, - 12322 - 11905: 0xA941, - 12323 - 11905: 0xA942, - 12324 - 11905: 0xA943, - 12325 - 11905: 0xA944, - 12326 - 11905: 0xA945, - 12327 - 11905: 0xA946, - 12328 - 11905: 0xA947, - 12329 - 11905: 0xA948, - 12350 - 11905: 0xA989, - 12353 - 11905: 0xA4A1, - 12354 - 11905: 0xA4A2, - 12355 - 11905: 0xA4A3, - 12356 - 11905: 0xA4A4, - 12357 - 11905: 0xA4A5, - 12358 - 11905: 0xA4A6, - 12359 - 11905: 0xA4A7, - 12360 - 11905: 0xA4A8, - 12361 - 11905: 0xA4A9, - 12362 - 11905: 0xA4AA, - 12363 - 11905: 0xA4AB, - 12364 - 11905: 0xA4AC, - 12365 - 11905: 0xA4AD, - 12366 - 11905: 0xA4AE, - 12367 - 11905: 0xA4AF, - 12368 - 11905: 0xA4B0, - 12369 - 11905: 0xA4B1, - 12370 - 11905: 0xA4B2, - 12371 - 11905: 0xA4B3, - 12372 - 11905: 0xA4B4, - 12373 - 11905: 0xA4B5, - 12374 - 11905: 0xA4B6, - 12375 - 11905: 0xA4B7, - 12376 - 11905: 0xA4B8, - 12377 - 11905: 0xA4B9, - 12378 - 11905: 0xA4BA, - 12379 - 11905: 0xA4BB, - 12380 - 11905: 0xA4BC, - 12381 - 11905: 0xA4BD, - 12382 - 11905: 0xA4BE, - 12383 - 11905: 0xA4BF, - 12384 - 11905: 0xA4C0, - 12385 - 11905: 0xA4C1, - 12386 - 11905: 0xA4C2, - 12387 - 11905: 0xA4C3, - 12388 - 11905: 0xA4C4, - 12389 - 11905: 0xA4C5, - 12390 - 11905: 0xA4C6, - 12391 - 11905: 0xA4C7, - 12392 - 11905: 0xA4C8, - 12393 - 11905: 0xA4C9, - 12394 - 11905: 0xA4CA, - 12395 - 11905: 0xA4CB, - 12396 - 11905: 0xA4CC, - 12397 - 11905: 0xA4CD, - 12398 - 11905: 0xA4CE, - 12399 - 11905: 0xA4CF, - 12400 - 11905: 0xA4D0, - 12401 - 11905: 0xA4D1, - 12402 - 11905: 0xA4D2, - 12403 - 11905: 0xA4D3, - 12404 - 11905: 0xA4D4, - 12405 - 11905: 0xA4D5, - 12406 - 11905: 0xA4D6, - 12407 - 11905: 0xA4D7, - 12408 - 11905: 0xA4D8, - 12409 - 11905: 0xA4D9, - 12410 - 11905: 0xA4DA, - 12411 - 11905: 0xA4DB, - 12412 - 11905: 0xA4DC, - 12413 - 11905: 0xA4DD, - 12414 - 11905: 0xA4DE, - 12415 - 11905: 0xA4DF, - 12416 - 11905: 0xA4E0, - 12417 - 11905: 0xA4E1, - 12418 - 11905: 0xA4E2, - 12419 - 11905: 0xA4E3, - 12420 - 11905: 0xA4E4, - 12421 - 11905: 0xA4E5, - 12422 - 11905: 0xA4E6, - 12423 - 11905: 0xA4E7, - 12424 - 11905: 0xA4E8, - 12425 - 11905: 0xA4E9, - 12426 - 11905: 0xA4EA, - 12427 - 11905: 0xA4EB, - 12428 - 11905: 0xA4EC, - 12429 - 11905: 0xA4ED, - 12430 - 11905: 0xA4EE, - 12431 - 11905: 0xA4EF, - 12432 - 11905: 0xA4F0, - 12433 - 11905: 0xA4F1, - 12434 - 11905: 0xA4F2, - 12435 - 11905: 0xA4F3, - 12443 - 11905: 0xA961, - 12444 - 11905: 0xA962, - 12445 - 11905: 0xA966, - 12446 - 11905: 0xA967, - 12449 - 11905: 0xA5A1, - 12450 - 11905: 0xA5A2, - 12451 - 11905: 0xA5A3, - 12452 - 11905: 0xA5A4, - 12453 - 11905: 0xA5A5, - 12454 - 11905: 0xA5A6, - 12455 - 11905: 0xA5A7, - 12456 - 11905: 0xA5A8, - 12457 - 11905: 0xA5A9, - 12458 - 11905: 0xA5AA, - 12459 - 11905: 0xA5AB, - 12460 - 11905: 0xA5AC, - 12461 - 11905: 0xA5AD, - 12462 - 11905: 0xA5AE, - 12463 - 11905: 0xA5AF, - 12464 - 11905: 0xA5B0, - 12465 - 11905: 0xA5B1, - 12466 - 11905: 0xA5B2, - 12467 - 11905: 0xA5B3, - 12468 - 11905: 0xA5B4, - 12469 - 11905: 0xA5B5, - 12470 - 11905: 0xA5B6, - 12471 - 11905: 0xA5B7, - 12472 - 11905: 0xA5B8, - 12473 - 11905: 0xA5B9, - 12474 - 11905: 0xA5BA, - 12475 - 11905: 0xA5BB, - 12476 - 11905: 0xA5BC, - 12477 - 11905: 0xA5BD, - 12478 - 11905: 0xA5BE, - 12479 - 11905: 0xA5BF, - 12480 - 11905: 0xA5C0, - 12481 - 11905: 0xA5C1, - 12482 - 11905: 0xA5C2, - 12483 - 11905: 0xA5C3, - 12484 - 11905: 0xA5C4, - 12485 - 11905: 0xA5C5, - 12486 - 11905: 0xA5C6, - 12487 - 11905: 0xA5C7, - 12488 - 11905: 0xA5C8, - 12489 - 11905: 0xA5C9, - 12490 - 11905: 0xA5CA, - 12491 - 11905: 0xA5CB, - 12492 - 11905: 0xA5CC, - 12493 - 11905: 0xA5CD, - 12494 - 11905: 0xA5CE, - 12495 - 11905: 0xA5CF, - 12496 - 11905: 0xA5D0, - 12497 - 11905: 0xA5D1, - 12498 - 11905: 0xA5D2, - 12499 - 11905: 0xA5D3, - 12500 - 11905: 0xA5D4, - 12501 - 11905: 0xA5D5, - 12502 - 11905: 0xA5D6, - 12503 - 11905: 0xA5D7, - 12504 - 11905: 0xA5D8, - 12505 - 11905: 0xA5D9, - 12506 - 11905: 0xA5DA, - 12507 - 11905: 0xA5DB, - 12508 - 11905: 0xA5DC, - 12509 - 11905: 0xA5DD, - 12510 - 11905: 0xA5DE, - 12511 - 11905: 0xA5DF, - 12512 - 11905: 0xA5E0, - 12513 - 11905: 0xA5E1, - 12514 - 11905: 0xA5E2, - 12515 - 11905: 0xA5E3, - 12516 - 11905: 0xA5E4, - 12517 - 11905: 0xA5E5, - 12518 - 11905: 0xA5E6, - 12519 - 11905: 0xA5E7, - 12520 - 11905: 0xA5E8, - 12521 - 11905: 0xA5E9, - 12522 - 11905: 0xA5EA, - 12523 - 11905: 0xA5EB, - 12524 - 11905: 0xA5EC, - 12525 - 11905: 0xA5ED, - 12526 - 11905: 0xA5EE, - 12527 - 11905: 0xA5EF, - 12528 - 11905: 0xA5F0, - 12529 - 11905: 0xA5F1, - 12530 - 11905: 0xA5F2, - 12531 - 11905: 0xA5F3, - 12532 - 11905: 0xA5F4, - 12533 - 11905: 0xA5F5, - 12534 - 11905: 0xA5F6, - 12540 - 11905: 0xA960, - 12541 - 11905: 0xA963, - 12542 - 11905: 0xA964, - 12549 - 11905: 0xA8C5, - 12550 - 11905: 0xA8C6, - 12551 - 11905: 0xA8C7, - 12552 - 11905: 0xA8C8, - 12553 - 11905: 0xA8C9, - 12554 - 11905: 0xA8CA, - 12555 - 11905: 0xA8CB, - 12556 - 11905: 0xA8CC, - 12557 - 11905: 0xA8CD, - 12558 - 11905: 0xA8CE, - 12559 - 11905: 0xA8CF, - 12560 - 11905: 0xA8D0, - 12561 - 11905: 0xA8D1, - 12562 - 11905: 0xA8D2, - 12563 - 11905: 0xA8D3, - 12564 - 11905: 0xA8D4, - 12565 - 11905: 0xA8D5, - 12566 - 11905: 0xA8D6, - 12567 - 11905: 0xA8D7, - 12568 - 11905: 0xA8D8, - 12569 - 11905: 0xA8D9, - 12570 - 11905: 0xA8DA, - 12571 - 11905: 0xA8DB, - 12572 - 11905: 0xA8DC, - 12573 - 11905: 0xA8DD, - 12574 - 11905: 0xA8DE, - 12575 - 11905: 0xA8DF, - 12576 - 11905: 0xA8E0, - 12577 - 11905: 0xA8E1, - 12578 - 11905: 0xA8E2, - 12579 - 11905: 0xA8E3, - 12580 - 11905: 0xA8E4, - 12581 - 11905: 0xA8E5, - 12582 - 11905: 0xA8E6, - 12583 - 11905: 0xA8E7, - 12584 - 11905: 0xA8E8, - 12585 - 11905: 0xA8E9, - 12832 - 11905: 0xA2E5, - 12833 - 11905: 0xA2E6, - 12834 - 11905: 0xA2E7, - 12835 - 11905: 0xA2E8, - 12836 - 11905: 0xA2E9, - 12837 - 11905: 0xA2EA, - 12838 - 11905: 0xA2EB, - 12839 - 11905: 0xA2EC, - 12840 - 11905: 0xA2ED, - 12841 - 11905: 0xA2EE, - 12849 - 11905: 0xA95A, - 12963 - 11905: 0xA949, - 13198 - 11905: 0xA94A, - 13199 - 11905: 0xA94B, - 13212 - 11905: 0xA94C, - 13213 - 11905: 0xA94D, - 13214 - 11905: 0xA94E, - 13217 - 11905: 0xA94F, - 13252 - 11905: 0xA950, - 13262 - 11905: 0xA951, - 13265 - 11905: 0xA952, - 13266 - 11905: 0xA953, - 13269 - 11905: 0xA954, - 13383 - 11905: 0xFE56, - 13427 - 11905: 0xFE55, - 13726 - 11905: 0xFE5A, - 13838 - 11905: 0xFE5C, - 13850 - 11905: 0xFE5B, - 14616 - 11905: 0xFE60, - 14702 - 11905: 0xFE5F, - 14799 - 11905: 0xFE62, - 14800 - 11905: 0xFE65, - 14815 - 11905: 0xFE63, - 14963 - 11905: 0xFE64, - 15182 - 11905: 0xFE68, - 15470 - 11905: 0xFE69, - 15584 - 11905: 0xFE6A, - 16470 - 11905: 0xFE6F, - 16735 - 11905: 0xFE70, - 17207 - 11905: 0xFE72, - 17324 - 11905: 0xFE78, - 17329 - 11905: 0xFE77, - 17373 - 11905: 0xFE7A, - 17622 - 11905: 0xFE7B, - 17996 - 11905: 0xFE7D, - 18017 - 11905: 0xFE7C, - 18211 - 11905: 0xFE80, - 18217 - 11905: 0xFE81, - 18300 - 11905: 0xFE82, - 18317 - 11905: 0xFE83, - 18759 - 11905: 0xFE85, - 18810 - 11905: 0xFE86, - 18813 - 11905: 0xFE87, - 18818 - 11905: 0xFE88, - 18819 - 11905: 0xFE89, - 18821 - 11905: 0xFE8A, - 18822 - 11905: 0xFE8B, - 18843 - 11905: 0xFE8D, - 18847 - 11905: 0xFE8C, - 18870 - 11905: 0xFE8F, - 18871 - 11905: 0xFE8E, - 19575 - 11905: 0xFE96, - 19615 - 11905: 0xFE93, - 19616 - 11905: 0xFE94, - 19617 - 11905: 0xFE95, - 19618 - 11905: 0xFE97, - 19619 - 11905: 0xFE92, - 19731 - 11905: 0xFE98, - 19732 - 11905: 0xFE99, - 19733 - 11905: 0xFE9A, - 19734 - 11905: 0xFE9B, - 19735 - 11905: 0xFE9C, - 19736 - 11905: 0xFE9D, - 19737 - 11905: 0xFE9E, - 19886 - 11905: 0xFE9F, - 19968 - 11905: 0xD2BB, - 19969 - 11905: 0xB6A1, - 19970 - 11905: 0x8140, - 19971 - 11905: 0xC6DF, - 19972 - 11905: 0x8141, - 19973 - 11905: 0x8142, - 19974 - 11905: 0x8143, - 19975 - 11905: 0xCDF2, - 19976 - 11905: 0xD5C9, - 19977 - 11905: 0xC8FD, - 19978 - 11905: 0xC9CF, - 19979 - 11905: 0xCFC2, - 19980 - 11905: 0xD8A2, - 19981 - 11905: 0xB2BB, - 19982 - 11905: 0xD3EB, - 19983 - 11905: 0x8144, - 19984 - 11905: 0xD8A4, - 19985 - 11905: 0xB3F3, - 19986 - 11905: 0x8145, - 19987 - 11905: 0xD7A8, - 19988 - 11905: 0xC7D2, - 19989 - 11905: 0xD8A7, - 19990 - 11905: 0xCAC0, - 19991 - 11905: 0x8146, - 19992 - 11905: 0xC7F0, - 19993 - 11905: 0xB1FB, - 19994 - 11905: 0xD2B5, - 19995 - 11905: 0xB4D4, - 19996 - 11905: 0xB6AB, - 19997 - 11905: 0xCBBF, - 19998 - 11905: 0xD8A9, - 19999 - 11905: 0x8147, - 20000 - 11905: 0x8148, - 20001 - 11905: 0x8149, - 20002 - 11905: 0xB6AA, - 20003 - 11905: 0x814A, - 20004 - 11905: 0xC1BD, - 20005 - 11905: 0xD1CF, - 20006 - 11905: 0x814B, - 20007 - 11905: 0xC9A5, - 20008 - 11905: 0xD8AD, - 20009 - 11905: 0x814C, - 20010 - 11905: 0xB8F6, - 20011 - 11905: 0xD1BE, - 20012 - 11905: 0xE3DC, - 20013 - 11905: 0xD6D0, - 20014 - 11905: 0x814D, - 20015 - 11905: 0x814E, - 20016 - 11905: 0xB7E1, - 20017 - 11905: 0x814F, - 20018 - 11905: 0xB4AE, - 20019 - 11905: 0x8150, - 20020 - 11905: 0xC1D9, - 20021 - 11905: 0x8151, - 20022 - 11905: 0xD8BC, - 20023 - 11905: 0x8152, - 20024 - 11905: 0xCDE8, - 20025 - 11905: 0xB5A4, - 20026 - 11905: 0xCEAA, - 20027 - 11905: 0xD6F7, - 20028 - 11905: 0x8153, - 20029 - 11905: 0xC0F6, - 20030 - 11905: 0xBED9, - 20031 - 11905: 0xD8AF, - 20032 - 11905: 0x8154, - 20033 - 11905: 0x8155, - 20034 - 11905: 0x8156, - 20035 - 11905: 0xC4CB, - 20036 - 11905: 0x8157, - 20037 - 11905: 0xBEC3, - 20038 - 11905: 0x8158, - 20039 - 11905: 0xD8B1, - 20040 - 11905: 0xC3B4, - 20041 - 11905: 0xD2E5, - 20042 - 11905: 0x8159, - 20043 - 11905: 0xD6AE, - 20044 - 11905: 0xCEDA, - 20045 - 11905: 0xD5A7, - 20046 - 11905: 0xBAF5, - 20047 - 11905: 0xB7A6, - 20048 - 11905: 0xC0D6, - 20049 - 11905: 0x815A, - 20050 - 11905: 0xC6B9, - 20051 - 11905: 0xC5D2, - 20052 - 11905: 0xC7C7, - 20053 - 11905: 0x815B, - 20054 - 11905: 0xB9D4, - 20055 - 11905: 0x815C, - 20056 - 11905: 0xB3CB, - 20057 - 11905: 0xD2D2, - 20058 - 11905: 0x815D, - 20059 - 11905: 0x815E, - 20060 - 11905: 0xD8BF, - 20061 - 11905: 0xBEC5, - 20062 - 11905: 0xC6F2, - 20063 - 11905: 0xD2B2, - 20064 - 11905: 0xCFB0, - 20065 - 11905: 0xCFE7, - 20066 - 11905: 0x815F, - 20067 - 11905: 0x8160, - 20068 - 11905: 0x8161, - 20069 - 11905: 0x8162, - 20070 - 11905: 0xCAE9, - 20071 - 11905: 0x8163, - 20072 - 11905: 0x8164, - 20073 - 11905: 0xD8C0, - 20074 - 11905: 0x8165, - 20075 - 11905: 0x8166, - 20076 - 11905: 0x8167, - 20077 - 11905: 0x8168, - 20078 - 11905: 0x8169, - 20079 - 11905: 0x816A, - 20080 - 11905: 0xC2F2, - 20081 - 11905: 0xC2D2, - 20082 - 11905: 0x816B, - 20083 - 11905: 0xC8E9, - 20084 - 11905: 0x816C, - 20085 - 11905: 0x816D, - 20086 - 11905: 0x816E, - 20087 - 11905: 0x816F, - 20088 - 11905: 0x8170, - 20089 - 11905: 0x8171, - 20090 - 11905: 0x8172, - 20091 - 11905: 0x8173, - 20092 - 11905: 0x8174, - 20093 - 11905: 0x8175, - 20094 - 11905: 0xC7AC, - 20095 - 11905: 0x8176, - 20096 - 11905: 0x8177, - 20097 - 11905: 0x8178, - 20098 - 11905: 0x8179, - 20099 - 11905: 0x817A, - 20100 - 11905: 0x817B, - 20101 - 11905: 0x817C, - 20102 - 11905: 0xC1CB, - 20103 - 11905: 0x817D, - 20104 - 11905: 0xD3E8, - 20105 - 11905: 0xD5F9, - 20106 - 11905: 0x817E, - 20107 - 11905: 0xCAC2, - 20108 - 11905: 0xB6FE, - 20109 - 11905: 0xD8A1, - 20110 - 11905: 0xD3DA, - 20111 - 11905: 0xBFF7, - 20112 - 11905: 0x8180, - 20113 - 11905: 0xD4C6, - 20114 - 11905: 0xBBA5, - 20115 - 11905: 0xD8C1, - 20116 - 11905: 0xCEE5, - 20117 - 11905: 0xBEAE, - 20118 - 11905: 0x8181, - 20119 - 11905: 0x8182, - 20120 - 11905: 0xD8A8, - 20121 - 11905: 0x8183, - 20122 - 11905: 0xD1C7, - 20123 - 11905: 0xD0A9, - 20124 - 11905: 0x8184, - 20125 - 11905: 0x8185, - 20126 - 11905: 0x8186, - 20127 - 11905: 0xD8BD, - 20128 - 11905: 0xD9EF, - 20129 - 11905: 0xCDF6, - 20130 - 11905: 0xBFBA, - 20131 - 11905: 0x8187, - 20132 - 11905: 0xBDBB, - 20133 - 11905: 0xBAA5, - 20134 - 11905: 0xD2E0, - 20135 - 11905: 0xB2FA, - 20136 - 11905: 0xBAE0, - 20137 - 11905: 0xC4B6, - 20138 - 11905: 0x8188, - 20139 - 11905: 0xCFED, - 20140 - 11905: 0xBEA9, - 20141 - 11905: 0xCDA4, - 20142 - 11905: 0xC1C1, - 20143 - 11905: 0x8189, - 20144 - 11905: 0x818A, - 20145 - 11905: 0x818B, - 20146 - 11905: 0xC7D7, - 20147 - 11905: 0xD9F1, - 20148 - 11905: 0x818C, - 20149 - 11905: 0xD9F4, - 20150 - 11905: 0x818D, - 20151 - 11905: 0x818E, - 20152 - 11905: 0x818F, - 20153 - 11905: 0x8190, - 20154 - 11905: 0xC8CB, - 20155 - 11905: 0xD8E9, - 20156 - 11905: 0x8191, - 20157 - 11905: 0x8192, - 20158 - 11905: 0x8193, - 20159 - 11905: 0xD2DA, - 20160 - 11905: 0xCAB2, - 20161 - 11905: 0xC8CA, - 20162 - 11905: 0xD8EC, - 20163 - 11905: 0xD8EA, - 20164 - 11905: 0xD8C6, - 20165 - 11905: 0xBDF6, - 20166 - 11905: 0xC6CD, - 20167 - 11905: 0xB3F0, - 20168 - 11905: 0x8194, - 20169 - 11905: 0xD8EB, - 20170 - 11905: 0xBDF1, - 20171 - 11905: 0xBDE9, - 20172 - 11905: 0x8195, - 20173 - 11905: 0xC8D4, - 20174 - 11905: 0xB4D3, - 20175 - 11905: 0x8196, - 20176 - 11905: 0x8197, - 20177 - 11905: 0xC2D8, - 20178 - 11905: 0x8198, - 20179 - 11905: 0xB2D6, - 20180 - 11905: 0xD7D0, - 20181 - 11905: 0xCACB, - 20182 - 11905: 0xCBFB, - 20183 - 11905: 0xD5CC, - 20184 - 11905: 0xB8B6, - 20185 - 11905: 0xCFC9, - 20186 - 11905: 0x8199, - 20187 - 11905: 0x819A, - 20188 - 11905: 0x819B, - 20189 - 11905: 0xD9DA, - 20190 - 11905: 0xD8F0, - 20191 - 11905: 0xC7AA, - 20192 - 11905: 0x819C, - 20193 - 11905: 0xD8EE, - 20194 - 11905: 0x819D, - 20195 - 11905: 0xB4FA, - 20196 - 11905: 0xC1EE, - 20197 - 11905: 0xD2D4, - 20198 - 11905: 0x819E, - 20199 - 11905: 0x819F, - 20200 - 11905: 0xD8ED, - 20201 - 11905: 0x81A0, - 20202 - 11905: 0xD2C7, - 20203 - 11905: 0xD8EF, - 20204 - 11905: 0xC3C7, - 20205 - 11905: 0x81A1, - 20206 - 11905: 0x81A2, - 20207 - 11905: 0x81A3, - 20208 - 11905: 0xD1F6, - 20209 - 11905: 0x81A4, - 20210 - 11905: 0xD6D9, - 20211 - 11905: 0xD8F2, - 20212 - 11905: 0x81A5, - 20213 - 11905: 0xD8F5, - 20214 - 11905: 0xBCFE, - 20215 - 11905: 0xBCDB, - 20216 - 11905: 0x81A6, - 20217 - 11905: 0x81A7, - 20218 - 11905: 0x81A8, - 20219 - 11905: 0xC8CE, - 20220 - 11905: 0x81A9, - 20221 - 11905: 0xB7DD, - 20222 - 11905: 0x81AA, - 20223 - 11905: 0xB7C2, - 20224 - 11905: 0x81AB, - 20225 - 11905: 0xC6F3, - 20226 - 11905: 0x81AC, - 20227 - 11905: 0x81AD, - 20228 - 11905: 0x81AE, - 20229 - 11905: 0x81AF, - 20230 - 11905: 0x81B0, - 20231 - 11905: 0x81B1, - 20232 - 11905: 0x81B2, - 20233 - 11905: 0xD8F8, - 20234 - 11905: 0xD2C1, - 20235 - 11905: 0x81B3, - 20236 - 11905: 0x81B4, - 20237 - 11905: 0xCEE9, - 20238 - 11905: 0xBCBF, - 20239 - 11905: 0xB7FC, - 20240 - 11905: 0xB7A5, - 20241 - 11905: 0xD0DD, - 20242 - 11905: 0x81B5, - 20243 - 11905: 0x81B6, - 20244 - 11905: 0x81B7, - 20245 - 11905: 0x81B8, - 20246 - 11905: 0x81B9, - 20247 - 11905: 0xD6DA, - 20248 - 11905: 0xD3C5, - 20249 - 11905: 0xBBEF, - 20250 - 11905: 0xBBE1, - 20251 - 11905: 0xD8F1, - 20252 - 11905: 0x81BA, - 20253 - 11905: 0x81BB, - 20254 - 11905: 0xC9A1, - 20255 - 11905: 0xCEB0, - 20256 - 11905: 0xB4AB, - 20257 - 11905: 0x81BC, - 20258 - 11905: 0xD8F3, - 20259 - 11905: 0x81BD, - 20260 - 11905: 0xC9CB, - 20261 - 11905: 0xD8F6, - 20262 - 11905: 0xC2D7, - 20263 - 11905: 0xD8F7, - 20264 - 11905: 0x81BE, - 20265 - 11905: 0x81BF, - 20266 - 11905: 0xCEB1, - 20267 - 11905: 0xD8F9, - 20268 - 11905: 0x81C0, - 20269 - 11905: 0x81C1, - 20270 - 11905: 0x81C2, - 20271 - 11905: 0xB2AE, - 20272 - 11905: 0xB9C0, - 20273 - 11905: 0x81C3, - 20274 - 11905: 0xD9A3, - 20275 - 11905: 0x81C4, - 20276 - 11905: 0xB0E9, - 20277 - 11905: 0x81C5, - 20278 - 11905: 0xC1E6, - 20279 - 11905: 0x81C6, - 20280 - 11905: 0xC9EC, - 20281 - 11905: 0x81C7, - 20282 - 11905: 0xCBC5, - 20283 - 11905: 0x81C8, - 20284 - 11905: 0xCBC6, - 20285 - 11905: 0xD9A4, - 20286 - 11905: 0x81C9, - 20287 - 11905: 0x81CA, - 20288 - 11905: 0x81CB, - 20289 - 11905: 0x81CC, - 20290 - 11905: 0x81CD, - 20291 - 11905: 0xB5E8, - 20292 - 11905: 0x81CE, - 20293 - 11905: 0x81CF, - 20294 - 11905: 0xB5AB, - 20295 - 11905: 0x81D0, - 20296 - 11905: 0x81D1, - 20297 - 11905: 0x81D2, - 20298 - 11905: 0x81D3, - 20299 - 11905: 0x81D4, - 20300 - 11905: 0x81D5, - 20301 - 11905: 0xCEBB, - 20302 - 11905: 0xB5CD, - 20303 - 11905: 0xD7A1, - 20304 - 11905: 0xD7F4, - 20305 - 11905: 0xD3D3, - 20306 - 11905: 0x81D6, - 20307 - 11905: 0xCCE5, - 20308 - 11905: 0x81D7, - 20309 - 11905: 0xBACE, - 20310 - 11905: 0x81D8, - 20311 - 11905: 0xD9A2, - 20312 - 11905: 0xD9DC, - 20313 - 11905: 0xD3E0, - 20314 - 11905: 0xD8FD, - 20315 - 11905: 0xB7F0, - 20316 - 11905: 0xD7F7, - 20317 - 11905: 0xD8FE, - 20318 - 11905: 0xD8FA, - 20319 - 11905: 0xD9A1, - 20320 - 11905: 0xC4E3, - 20321 - 11905: 0x81D9, - 20322 - 11905: 0x81DA, - 20323 - 11905: 0xD3B6, - 20324 - 11905: 0xD8F4, - 20325 - 11905: 0xD9DD, - 20326 - 11905: 0x81DB, - 20327 - 11905: 0xD8FB, - 20328 - 11905: 0x81DC, - 20329 - 11905: 0xC5E5, - 20330 - 11905: 0x81DD, - 20331 - 11905: 0x81DE, - 20332 - 11905: 0xC0D0, - 20333 - 11905: 0x81DF, - 20334 - 11905: 0x81E0, - 20335 - 11905: 0xD1F0, - 20336 - 11905: 0xB0DB, - 20337 - 11905: 0x81E1, - 20338 - 11905: 0x81E2, - 20339 - 11905: 0xBCD1, - 20340 - 11905: 0xD9A6, - 20341 - 11905: 0x81E3, - 20342 - 11905: 0xD9A5, - 20343 - 11905: 0x81E4, - 20344 - 11905: 0x81E5, - 20345 - 11905: 0x81E6, - 20346 - 11905: 0x81E7, - 20347 - 11905: 0xD9AC, - 20348 - 11905: 0xD9AE, - 20349 - 11905: 0x81E8, - 20350 - 11905: 0xD9AB, - 20351 - 11905: 0xCAB9, - 20352 - 11905: 0x81E9, - 20353 - 11905: 0x81EA, - 20354 - 11905: 0x81EB, - 20355 - 11905: 0xD9A9, - 20356 - 11905: 0xD6B6, - 20357 - 11905: 0x81EC, - 20358 - 11905: 0x81ED, - 20359 - 11905: 0x81EE, - 20360 - 11905: 0xB3DE, - 20361 - 11905: 0xD9A8, - 20362 - 11905: 0x81EF, - 20363 - 11905: 0xC0FD, - 20364 - 11905: 0x81F0, - 20365 - 11905: 0xCACC, - 20366 - 11905: 0x81F1, - 20367 - 11905: 0xD9AA, - 20368 - 11905: 0x81F2, - 20369 - 11905: 0xD9A7, - 20370 - 11905: 0x81F3, - 20371 - 11905: 0x81F4, - 20372 - 11905: 0xD9B0, - 20373 - 11905: 0x81F5, - 20374 - 11905: 0x81F6, - 20375 - 11905: 0xB6B1, - 20376 - 11905: 0x81F7, - 20377 - 11905: 0x81F8, - 20378 - 11905: 0x81F9, - 20379 - 11905: 0xB9A9, - 20380 - 11905: 0x81FA, - 20381 - 11905: 0xD2C0, - 20382 - 11905: 0x81FB, - 20383 - 11905: 0x81FC, - 20384 - 11905: 0xCFC0, - 20385 - 11905: 0x81FD, - 20386 - 11905: 0x81FE, - 20387 - 11905: 0xC2C2, - 20388 - 11905: 0x8240, - 20389 - 11905: 0xBDC4, - 20390 - 11905: 0xD5EC, - 20391 - 11905: 0xB2E0, - 20392 - 11905: 0xC7C8, - 20393 - 11905: 0xBFEB, - 20394 - 11905: 0xD9AD, - 20395 - 11905: 0x8241, - 20396 - 11905: 0xD9AF, - 20397 - 11905: 0x8242, - 20398 - 11905: 0xCEEA, - 20399 - 11905: 0xBAEE, - 20400 - 11905: 0x8243, - 20401 - 11905: 0x8244, - 20402 - 11905: 0x8245, - 20403 - 11905: 0x8246, - 20404 - 11905: 0x8247, - 20405 - 11905: 0xC7D6, - 20406 - 11905: 0x8248, - 20407 - 11905: 0x8249, - 20408 - 11905: 0x824A, - 20409 - 11905: 0x824B, - 20410 - 11905: 0x824C, - 20411 - 11905: 0x824D, - 20412 - 11905: 0x824E, - 20413 - 11905: 0x824F, - 20414 - 11905: 0x8250, - 20415 - 11905: 0xB1E3, - 20416 - 11905: 0x8251, - 20417 - 11905: 0x8252, - 20418 - 11905: 0x8253, - 20419 - 11905: 0xB4D9, - 20420 - 11905: 0xB6ED, - 20421 - 11905: 0xD9B4, - 20422 - 11905: 0x8254, - 20423 - 11905: 0x8255, - 20424 - 11905: 0x8256, - 20425 - 11905: 0x8257, - 20426 - 11905: 0xBFA1, - 20427 - 11905: 0x8258, - 20428 - 11905: 0x8259, - 20429 - 11905: 0x825A, - 20430 - 11905: 0xD9DE, - 20431 - 11905: 0xC7CE, - 20432 - 11905: 0xC0FE, - 20433 - 11905: 0xD9B8, - 20434 - 11905: 0x825B, - 20435 - 11905: 0x825C, - 20436 - 11905: 0x825D, - 20437 - 11905: 0x825E, - 20438 - 11905: 0x825F, - 20439 - 11905: 0xCBD7, - 20440 - 11905: 0xB7FD, - 20441 - 11905: 0x8260, - 20442 - 11905: 0xD9B5, - 20443 - 11905: 0x8261, - 20444 - 11905: 0xD9B7, - 20445 - 11905: 0xB1A3, - 20446 - 11905: 0xD3E1, - 20447 - 11905: 0xD9B9, - 20448 - 11905: 0x8262, - 20449 - 11905: 0xD0C5, - 20450 - 11905: 0x8263, - 20451 - 11905: 0xD9B6, - 20452 - 11905: 0x8264, - 20453 - 11905: 0x8265, - 20454 - 11905: 0xD9B1, - 20455 - 11905: 0x8266, - 20456 - 11905: 0xD9B2, - 20457 - 11905: 0xC1A9, - 20458 - 11905: 0xD9B3, - 20459 - 11905: 0x8267, - 20460 - 11905: 0x8268, - 20461 - 11905: 0xBCF3, - 20462 - 11905: 0xD0DE, - 20463 - 11905: 0xB8A9, - 20464 - 11905: 0x8269, - 20465 - 11905: 0xBEE3, - 20466 - 11905: 0x826A, - 20467 - 11905: 0xD9BD, - 20468 - 11905: 0x826B, - 20469 - 11905: 0x826C, - 20470 - 11905: 0x826D, - 20471 - 11905: 0x826E, - 20472 - 11905: 0xD9BA, - 20473 - 11905: 0x826F, - 20474 - 11905: 0xB0B3, - 20475 - 11905: 0x8270, - 20476 - 11905: 0x8271, - 20477 - 11905: 0x8272, - 20478 - 11905: 0xD9C2, - 20479 - 11905: 0x8273, - 20480 - 11905: 0x8274, - 20481 - 11905: 0x8275, - 20482 - 11905: 0x8276, - 20483 - 11905: 0x8277, - 20484 - 11905: 0x8278, - 20485 - 11905: 0x8279, - 20486 - 11905: 0x827A, - 20487 - 11905: 0x827B, - 20488 - 11905: 0x827C, - 20489 - 11905: 0x827D, - 20490 - 11905: 0x827E, - 20491 - 11905: 0x8280, - 20492 - 11905: 0xD9C4, - 20493 - 11905: 0xB1B6, - 20494 - 11905: 0x8281, - 20495 - 11905: 0xD9BF, - 20496 - 11905: 0x8282, - 20497 - 11905: 0x8283, - 20498 - 11905: 0xB5B9, - 20499 - 11905: 0x8284, - 20500 - 11905: 0xBEF3, - 20501 - 11905: 0x8285, - 20502 - 11905: 0x8286, - 20503 - 11905: 0x8287, - 20504 - 11905: 0xCCC8, - 20505 - 11905: 0xBAF2, - 20506 - 11905: 0xD2D0, - 20507 - 11905: 0x8288, - 20508 - 11905: 0xD9C3, - 20509 - 11905: 0x8289, - 20510 - 11905: 0x828A, - 20511 - 11905: 0xBDE8, - 20512 - 11905: 0x828B, - 20513 - 11905: 0xB3AB, - 20514 - 11905: 0x828C, - 20515 - 11905: 0x828D, - 20516 - 11905: 0x828E, - 20517 - 11905: 0xD9C5, - 20518 - 11905: 0xBEEB, - 20519 - 11905: 0x828F, - 20520 - 11905: 0xD9C6, - 20521 - 11905: 0xD9BB, - 20522 - 11905: 0xC4DF, - 20523 - 11905: 0x8290, - 20524 - 11905: 0xD9BE, - 20525 - 11905: 0xD9C1, - 20526 - 11905: 0xD9C0, - 20527 - 11905: 0x8291, - 20528 - 11905: 0x8292, - 20529 - 11905: 0x8293, - 20530 - 11905: 0x8294, - 20531 - 11905: 0x8295, - 20532 - 11905: 0x8296, - 20533 - 11905: 0x8297, - 20534 - 11905: 0x8298, - 20535 - 11905: 0x8299, - 20536 - 11905: 0x829A, - 20537 - 11905: 0x829B, - 20538 - 11905: 0xD5AE, - 20539 - 11905: 0x829C, - 20540 - 11905: 0xD6B5, - 20541 - 11905: 0x829D, - 20542 - 11905: 0xC7E3, - 20543 - 11905: 0x829E, - 20544 - 11905: 0x829F, - 20545 - 11905: 0x82A0, - 20546 - 11905: 0x82A1, - 20547 - 11905: 0xD9C8, - 20548 - 11905: 0x82A2, - 20549 - 11905: 0x82A3, - 20550 - 11905: 0x82A4, - 20551 - 11905: 0xBCD9, - 20552 - 11905: 0xD9CA, - 20553 - 11905: 0x82A5, - 20554 - 11905: 0x82A6, - 20555 - 11905: 0x82A7, - 20556 - 11905: 0xD9BC, - 20557 - 11905: 0x82A8, - 20558 - 11905: 0xD9CB, - 20559 - 11905: 0xC6AB, - 20560 - 11905: 0x82A9, - 20561 - 11905: 0x82AA, - 20562 - 11905: 0x82AB, - 20563 - 11905: 0x82AC, - 20564 - 11905: 0x82AD, - 20565 - 11905: 0xD9C9, - 20566 - 11905: 0x82AE, - 20567 - 11905: 0x82AF, - 20568 - 11905: 0x82B0, - 20569 - 11905: 0x82B1, - 20570 - 11905: 0xD7F6, - 20571 - 11905: 0x82B2, - 20572 - 11905: 0xCDA3, - 20573 - 11905: 0x82B3, - 20574 - 11905: 0x82B4, - 20575 - 11905: 0x82B5, - 20576 - 11905: 0x82B6, - 20577 - 11905: 0x82B7, - 20578 - 11905: 0x82B8, - 20579 - 11905: 0x82B9, - 20580 - 11905: 0x82BA, - 20581 - 11905: 0xBDA1, - 20582 - 11905: 0x82BB, - 20583 - 11905: 0x82BC, - 20584 - 11905: 0x82BD, - 20585 - 11905: 0x82BE, - 20586 - 11905: 0x82BF, - 20587 - 11905: 0x82C0, - 20588 - 11905: 0xD9CC, - 20589 - 11905: 0x82C1, - 20590 - 11905: 0x82C2, - 20591 - 11905: 0x82C3, - 20592 - 11905: 0x82C4, - 20593 - 11905: 0x82C5, - 20594 - 11905: 0x82C6, - 20595 - 11905: 0x82C7, - 20596 - 11905: 0x82C8, - 20597 - 11905: 0x82C9, - 20598 - 11905: 0xC5BC, - 20599 - 11905: 0xCDB5, - 20600 - 11905: 0x82CA, - 20601 - 11905: 0x82CB, - 20602 - 11905: 0x82CC, - 20603 - 11905: 0xD9CD, - 20604 - 11905: 0x82CD, - 20605 - 11905: 0x82CE, - 20606 - 11905: 0xD9C7, - 20607 - 11905: 0xB3A5, - 20608 - 11905: 0xBFFE, - 20609 - 11905: 0x82CF, - 20610 - 11905: 0x82D0, - 20611 - 11905: 0x82D1, - 20612 - 11905: 0x82D2, - 20613 - 11905: 0xB8B5, - 20614 - 11905: 0x82D3, - 20615 - 11905: 0x82D4, - 20616 - 11905: 0xC0FC, - 20617 - 11905: 0x82D5, - 20618 - 11905: 0x82D6, - 20619 - 11905: 0x82D7, - 20620 - 11905: 0x82D8, - 20621 - 11905: 0xB0F8, - 20622 - 11905: 0x82D9, - 20623 - 11905: 0x82DA, - 20624 - 11905: 0x82DB, - 20625 - 11905: 0x82DC, - 20626 - 11905: 0x82DD, - 20627 - 11905: 0x82DE, - 20628 - 11905: 0x82DF, - 20629 - 11905: 0x82E0, - 20630 - 11905: 0x82E1, - 20631 - 11905: 0x82E2, - 20632 - 11905: 0x82E3, - 20633 - 11905: 0x82E4, - 20634 - 11905: 0x82E5, - 20635 - 11905: 0x82E6, - 20636 - 11905: 0x82E7, - 20637 - 11905: 0x82E8, - 20638 - 11905: 0x82E9, - 20639 - 11905: 0x82EA, - 20640 - 11905: 0x82EB, - 20641 - 11905: 0x82EC, - 20642 - 11905: 0x82ED, - 20643 - 11905: 0xB4F6, - 20644 - 11905: 0x82EE, - 20645 - 11905: 0xD9CE, - 20646 - 11905: 0x82EF, - 20647 - 11905: 0xD9CF, - 20648 - 11905: 0xB4A2, - 20649 - 11905: 0xD9D0, - 20650 - 11905: 0x82F0, - 20651 - 11905: 0x82F1, - 20652 - 11905: 0xB4DF, - 20653 - 11905: 0x82F2, - 20654 - 11905: 0x82F3, - 20655 - 11905: 0x82F4, - 20656 - 11905: 0x82F5, - 20657 - 11905: 0x82F6, - 20658 - 11905: 0xB0C1, - 20659 - 11905: 0x82F7, - 20660 - 11905: 0x82F8, - 20661 - 11905: 0x82F9, - 20662 - 11905: 0x82FA, - 20663 - 11905: 0x82FB, - 20664 - 11905: 0x82FC, - 20665 - 11905: 0x82FD, - 20666 - 11905: 0xD9D1, - 20667 - 11905: 0xC9B5, - 20668 - 11905: 0x82FE, - 20669 - 11905: 0x8340, - 20670 - 11905: 0x8341, - 20671 - 11905: 0x8342, - 20672 - 11905: 0x8343, - 20673 - 11905: 0x8344, - 20674 - 11905: 0x8345, - 20675 - 11905: 0x8346, - 20676 - 11905: 0x8347, - 20677 - 11905: 0x8348, - 20678 - 11905: 0x8349, - 20679 - 11905: 0x834A, - 20680 - 11905: 0x834B, - 20681 - 11905: 0x834C, - 20682 - 11905: 0x834D, - 20683 - 11905: 0x834E, - 20684 - 11905: 0x834F, - 20685 - 11905: 0x8350, - 20686 - 11905: 0x8351, - 20687 - 11905: 0xCFF1, - 20688 - 11905: 0x8352, - 20689 - 11905: 0x8353, - 20690 - 11905: 0x8354, - 20691 - 11905: 0x8355, - 20692 - 11905: 0x8356, - 20693 - 11905: 0x8357, - 20694 - 11905: 0xD9D2, - 20695 - 11905: 0x8358, - 20696 - 11905: 0x8359, - 20697 - 11905: 0x835A, - 20698 - 11905: 0xC1C5, - 20699 - 11905: 0x835B, - 20700 - 11905: 0x835C, - 20701 - 11905: 0x835D, - 20702 - 11905: 0x835E, - 20703 - 11905: 0x835F, - 20704 - 11905: 0x8360, - 20705 - 11905: 0x8361, - 20706 - 11905: 0x8362, - 20707 - 11905: 0x8363, - 20708 - 11905: 0x8364, - 20709 - 11905: 0x8365, - 20710 - 11905: 0xD9D6, - 20711 - 11905: 0xC9AE, - 20712 - 11905: 0x8366, - 20713 - 11905: 0x8367, - 20714 - 11905: 0x8368, - 20715 - 11905: 0x8369, - 20716 - 11905: 0xD9D5, - 20717 - 11905: 0xD9D4, - 20718 - 11905: 0xD9D7, - 20719 - 11905: 0x836A, - 20720 - 11905: 0x836B, - 20721 - 11905: 0x836C, - 20722 - 11905: 0x836D, - 20723 - 11905: 0xCBDB, - 20724 - 11905: 0x836E, - 20725 - 11905: 0xBDA9, - 20726 - 11905: 0x836F, - 20727 - 11905: 0x8370, - 20728 - 11905: 0x8371, - 20729 - 11905: 0x8372, - 20730 - 11905: 0x8373, - 20731 - 11905: 0xC6A7, - 20732 - 11905: 0x8374, - 20733 - 11905: 0x8375, - 20734 - 11905: 0x8376, - 20735 - 11905: 0x8377, - 20736 - 11905: 0x8378, - 20737 - 11905: 0x8379, - 20738 - 11905: 0x837A, - 20739 - 11905: 0x837B, - 20740 - 11905: 0x837C, - 20741 - 11905: 0x837D, - 20742 - 11905: 0xD9D3, - 20743 - 11905: 0xD9D8, - 20744 - 11905: 0x837E, - 20745 - 11905: 0x8380, - 20746 - 11905: 0x8381, - 20747 - 11905: 0xD9D9, - 20748 - 11905: 0x8382, - 20749 - 11905: 0x8383, - 20750 - 11905: 0x8384, - 20751 - 11905: 0x8385, - 20752 - 11905: 0x8386, - 20753 - 11905: 0x8387, - 20754 - 11905: 0xC8E5, - 20755 - 11905: 0x8388, - 20756 - 11905: 0x8389, - 20757 - 11905: 0x838A, - 20758 - 11905: 0x838B, - 20759 - 11905: 0x838C, - 20760 - 11905: 0x838D, - 20761 - 11905: 0x838E, - 20762 - 11905: 0x838F, - 20763 - 11905: 0x8390, - 20764 - 11905: 0x8391, - 20765 - 11905: 0x8392, - 20766 - 11905: 0x8393, - 20767 - 11905: 0x8394, - 20768 - 11905: 0x8395, - 20769 - 11905: 0xC0DC, - 20770 - 11905: 0x8396, - 20771 - 11905: 0x8397, - 20772 - 11905: 0x8398, - 20773 - 11905: 0x8399, - 20774 - 11905: 0x839A, - 20775 - 11905: 0x839B, - 20776 - 11905: 0x839C, - 20777 - 11905: 0x839D, - 20778 - 11905: 0x839E, - 20779 - 11905: 0x839F, - 20780 - 11905: 0x83A0, - 20781 - 11905: 0x83A1, - 20782 - 11905: 0x83A2, - 20783 - 11905: 0x83A3, - 20784 - 11905: 0x83A4, - 20785 - 11905: 0x83A5, - 20786 - 11905: 0x83A6, - 20787 - 11905: 0x83A7, - 20788 - 11905: 0x83A8, - 20789 - 11905: 0x83A9, - 20790 - 11905: 0x83AA, - 20791 - 11905: 0x83AB, - 20792 - 11905: 0x83AC, - 20793 - 11905: 0x83AD, - 20794 - 11905: 0x83AE, - 20795 - 11905: 0x83AF, - 20796 - 11905: 0x83B0, - 20797 - 11905: 0x83B1, - 20798 - 11905: 0x83B2, - 20799 - 11905: 0xB6F9, - 20800 - 11905: 0xD8A3, - 20801 - 11905: 0xD4CA, - 20802 - 11905: 0x83B3, - 20803 - 11905: 0xD4AA, - 20804 - 11905: 0xD0D6, - 20805 - 11905: 0xB3E4, - 20806 - 11905: 0xD5D7, - 20807 - 11905: 0x83B4, - 20808 - 11905: 0xCFC8, - 20809 - 11905: 0xB9E2, - 20810 - 11905: 0x83B5, - 20811 - 11905: 0xBFCB, - 20812 - 11905: 0x83B6, - 20813 - 11905: 0xC3E2, - 20814 - 11905: 0x83B7, - 20815 - 11905: 0x83B8, - 20816 - 11905: 0x83B9, - 20817 - 11905: 0xB6D2, - 20818 - 11905: 0x83BA, - 20819 - 11905: 0x83BB, - 20820 - 11905: 0xCDC3, - 20821 - 11905: 0xD9EE, - 20822 - 11905: 0xD9F0, - 20823 - 11905: 0x83BC, - 20824 - 11905: 0x83BD, - 20825 - 11905: 0x83BE, - 20826 - 11905: 0xB5B3, - 20827 - 11905: 0x83BF, - 20828 - 11905: 0xB6B5, - 20829 - 11905: 0x83C0, - 20830 - 11905: 0x83C1, - 20831 - 11905: 0x83C2, - 20832 - 11905: 0x83C3, - 20833 - 11905: 0x83C4, - 20834 - 11905: 0xBEA4, - 20835 - 11905: 0x83C5, - 20836 - 11905: 0x83C6, - 20837 - 11905: 0xC8EB, - 20838 - 11905: 0x83C7, - 20839 - 11905: 0x83C8, - 20840 - 11905: 0xC8AB, - 20841 - 11905: 0x83C9, - 20842 - 11905: 0x83CA, - 20843 - 11905: 0xB0CB, - 20844 - 11905: 0xB9AB, - 20845 - 11905: 0xC1F9, - 20846 - 11905: 0xD9E2, - 20847 - 11905: 0x83CB, - 20848 - 11905: 0xC0BC, - 20849 - 11905: 0xB9B2, - 20850 - 11905: 0x83CC, - 20851 - 11905: 0xB9D8, - 20852 - 11905: 0xD0CB, - 20853 - 11905: 0xB1F8, - 20854 - 11905: 0xC6E4, - 20855 - 11905: 0xBEDF, - 20856 - 11905: 0xB5E4, - 20857 - 11905: 0xD7C8, - 20858 - 11905: 0x83CD, - 20859 - 11905: 0xD1F8, - 20860 - 11905: 0xBCE6, - 20861 - 11905: 0xCADE, - 20862 - 11905: 0x83CE, - 20863 - 11905: 0x83CF, - 20864 - 11905: 0xBCBD, - 20865 - 11905: 0xD9E6, - 20866 - 11905: 0xD8E7, - 20867 - 11905: 0x83D0, - 20868 - 11905: 0x83D1, - 20869 - 11905: 0xC4DA, - 20870 - 11905: 0x83D2, - 20871 - 11905: 0x83D3, - 20872 - 11905: 0xB8D4, - 20873 - 11905: 0xC8BD, - 20874 - 11905: 0x83D4, - 20875 - 11905: 0x83D5, - 20876 - 11905: 0xB2E1, - 20877 - 11905: 0xD4D9, - 20878 - 11905: 0x83D6, - 20879 - 11905: 0x83D7, - 20880 - 11905: 0x83D8, - 20881 - 11905: 0x83D9, - 20882 - 11905: 0xC3B0, - 20883 - 11905: 0x83DA, - 20884 - 11905: 0x83DB, - 20885 - 11905: 0xC3E1, - 20886 - 11905: 0xDAA2, - 20887 - 11905: 0xC8DF, - 20888 - 11905: 0x83DC, - 20889 - 11905: 0xD0B4, - 20890 - 11905: 0x83DD, - 20891 - 11905: 0xBEFC, - 20892 - 11905: 0xC5A9, - 20893 - 11905: 0x83DE, - 20894 - 11905: 0x83DF, - 20895 - 11905: 0x83E0, - 20896 - 11905: 0xB9DA, - 20897 - 11905: 0x83E1, - 20898 - 11905: 0xDAA3, - 20899 - 11905: 0x83E2, - 20900 - 11905: 0xD4A9, - 20901 - 11905: 0xDAA4, - 20902 - 11905: 0x83E3, - 20903 - 11905: 0x83E4, - 20904 - 11905: 0x83E5, - 20905 - 11905: 0x83E6, - 20906 - 11905: 0x83E7, - 20907 - 11905: 0xD9FB, - 20908 - 11905: 0xB6AC, - 20909 - 11905: 0x83E8, - 20910 - 11905: 0x83E9, - 20911 - 11905: 0xB7EB, - 20912 - 11905: 0xB1F9, - 20913 - 11905: 0xD9FC, - 20914 - 11905: 0xB3E5, - 20915 - 11905: 0xBEF6, - 20916 - 11905: 0x83EA, - 20917 - 11905: 0xBFF6, - 20918 - 11905: 0xD2B1, - 20919 - 11905: 0xC0E4, - 20920 - 11905: 0x83EB, - 20921 - 11905: 0x83EC, - 20922 - 11905: 0x83ED, - 20923 - 11905: 0xB6B3, - 20924 - 11905: 0xD9FE, - 20925 - 11905: 0xD9FD, - 20926 - 11905: 0x83EE, - 20927 - 11905: 0x83EF, - 20928 - 11905: 0xBEBB, - 20929 - 11905: 0x83F0, - 20930 - 11905: 0x83F1, - 20931 - 11905: 0x83F2, - 20932 - 11905: 0xC6E0, - 20933 - 11905: 0x83F3, - 20934 - 11905: 0xD7BC, - 20935 - 11905: 0xDAA1, - 20936 - 11905: 0x83F4, - 20937 - 11905: 0xC1B9, - 20938 - 11905: 0x83F5, - 20939 - 11905: 0xB5F2, - 20940 - 11905: 0xC1E8, - 20941 - 11905: 0x83F6, - 20942 - 11905: 0x83F7, - 20943 - 11905: 0xBCF5, - 20944 - 11905: 0x83F8, - 20945 - 11905: 0xB4D5, - 20946 - 11905: 0x83F9, - 20947 - 11905: 0x83FA, - 20948 - 11905: 0x83FB, - 20949 - 11905: 0x83FC, - 20950 - 11905: 0x83FD, - 20951 - 11905: 0x83FE, - 20952 - 11905: 0x8440, - 20953 - 11905: 0x8441, - 20954 - 11905: 0x8442, - 20955 - 11905: 0xC1DD, - 20956 - 11905: 0x8443, - 20957 - 11905: 0xC4FD, - 20958 - 11905: 0x8444, - 20959 - 11905: 0x8445, - 20960 - 11905: 0xBCB8, - 20961 - 11905: 0xB7B2, - 20962 - 11905: 0x8446, - 20963 - 11905: 0x8447, - 20964 - 11905: 0xB7EF, - 20965 - 11905: 0x8448, - 20966 - 11905: 0x8449, - 20967 - 11905: 0x844A, - 20968 - 11905: 0x844B, - 20969 - 11905: 0x844C, - 20970 - 11905: 0x844D, - 20971 - 11905: 0xD9EC, - 20972 - 11905: 0x844E, - 20973 - 11905: 0xC6BE, - 20974 - 11905: 0x844F, - 20975 - 11905: 0xBFAD, - 20976 - 11905: 0xBBCB, - 20977 - 11905: 0x8450, - 20978 - 11905: 0x8451, - 20979 - 11905: 0xB5CA, - 20980 - 11905: 0x8452, - 20981 - 11905: 0xDBC9, - 20982 - 11905: 0xD0D7, - 20983 - 11905: 0x8453, - 20984 - 11905: 0xCDB9, - 20985 - 11905: 0xB0BC, - 20986 - 11905: 0xB3F6, - 20987 - 11905: 0xBBF7, - 20988 - 11905: 0xDBCA, - 20989 - 11905: 0xBAAF, - 20990 - 11905: 0x8454, - 20991 - 11905: 0xD4E4, - 20992 - 11905: 0xB5B6, - 20993 - 11905: 0xB5F3, - 20994 - 11905: 0xD8D6, - 20995 - 11905: 0xC8D0, - 20996 - 11905: 0x8455, - 20997 - 11905: 0x8456, - 20998 - 11905: 0xB7D6, - 20999 - 11905: 0xC7D0, - 21000 - 11905: 0xD8D7, - 21001 - 11905: 0x8457, - 21002 - 11905: 0xBFAF, - 21003 - 11905: 0x8458, - 21004 - 11905: 0x8459, - 21005 - 11905: 0xDBBB, - 21006 - 11905: 0xD8D8, - 21007 - 11905: 0x845A, - 21008 - 11905: 0x845B, - 21009 - 11905: 0xD0CC, - 21010 - 11905: 0xBBAE, - 21011 - 11905: 0x845C, - 21012 - 11905: 0x845D, - 21013 - 11905: 0x845E, - 21014 - 11905: 0xEBBE, - 21015 - 11905: 0xC1D0, - 21016 - 11905: 0xC1F5, - 21017 - 11905: 0xD4F2, - 21018 - 11905: 0xB8D5, - 21019 - 11905: 0xB4B4, - 21020 - 11905: 0x845F, - 21021 - 11905: 0xB3F5, - 21022 - 11905: 0x8460, - 21023 - 11905: 0x8461, - 21024 - 11905: 0xC9BE, - 21025 - 11905: 0x8462, - 21026 - 11905: 0x8463, - 21027 - 11905: 0x8464, - 21028 - 11905: 0xC5D0, - 21029 - 11905: 0x8465, - 21030 - 11905: 0x8466, - 21031 - 11905: 0x8467, - 21032 - 11905: 0xC5D9, - 21033 - 11905: 0xC0FB, - 21034 - 11905: 0x8468, - 21035 - 11905: 0xB1F0, - 21036 - 11905: 0x8469, - 21037 - 11905: 0xD8D9, - 21038 - 11905: 0xB9CE, - 21039 - 11905: 0x846A, - 21040 - 11905: 0xB5BD, - 21041 - 11905: 0x846B, - 21042 - 11905: 0x846C, - 21043 - 11905: 0xD8DA, - 21044 - 11905: 0x846D, - 21045 - 11905: 0x846E, - 21046 - 11905: 0xD6C6, - 21047 - 11905: 0xCBA2, - 21048 - 11905: 0xC8AF, - 21049 - 11905: 0xC9B2, - 21050 - 11905: 0xB4CC, - 21051 - 11905: 0xBFCC, - 21052 - 11905: 0x846F, - 21053 - 11905: 0xB9F4, - 21054 - 11905: 0x8470, - 21055 - 11905: 0xD8DB, - 21056 - 11905: 0xD8DC, - 21057 - 11905: 0xB6E7, - 21058 - 11905: 0xBCC1, - 21059 - 11905: 0xCCEA, - 21060 - 11905: 0x8471, - 21061 - 11905: 0x8472, - 21062 - 11905: 0x8473, - 21063 - 11905: 0x8474, - 21064 - 11905: 0x8475, - 21065 - 11905: 0x8476, - 21066 - 11905: 0xCFF7, - 21067 - 11905: 0x8477, - 21068 - 11905: 0xD8DD, - 21069 - 11905: 0xC7B0, - 21070 - 11905: 0x8478, - 21071 - 11905: 0x8479, - 21072 - 11905: 0xB9D0, - 21073 - 11905: 0xBDA3, - 21074 - 11905: 0x847A, - 21075 - 11905: 0x847B, - 21076 - 11905: 0xCCDE, - 21077 - 11905: 0x847C, - 21078 - 11905: 0xC6CA, - 21079 - 11905: 0x847D, - 21080 - 11905: 0x847E, - 21081 - 11905: 0x8480, - 21082 - 11905: 0x8481, - 21083 - 11905: 0x8482, - 21084 - 11905: 0xD8E0, - 21085 - 11905: 0x8483, - 21086 - 11905: 0xD8DE, - 21087 - 11905: 0x8484, - 21088 - 11905: 0x8485, - 21089 - 11905: 0xD8DF, - 21090 - 11905: 0x8486, - 21091 - 11905: 0x8487, - 21092 - 11905: 0x8488, - 21093 - 11905: 0xB0FE, - 21094 - 11905: 0x8489, - 21095 - 11905: 0xBEE7, - 21096 - 11905: 0x848A, - 21097 - 11905: 0xCAA3, - 21098 - 11905: 0xBCF4, - 21099 - 11905: 0x848B, - 21100 - 11905: 0x848C, - 21101 - 11905: 0x848D, - 21102 - 11905: 0x848E, - 21103 - 11905: 0xB8B1, - 21104 - 11905: 0x848F, - 21105 - 11905: 0x8490, - 21106 - 11905: 0xB8EE, - 21107 - 11905: 0x8491, - 21108 - 11905: 0x8492, - 21109 - 11905: 0x8493, - 21110 - 11905: 0x8494, - 21111 - 11905: 0x8495, - 21112 - 11905: 0x8496, - 21113 - 11905: 0x8497, - 21114 - 11905: 0x8498, - 21115 - 11905: 0x8499, - 21116 - 11905: 0x849A, - 21117 - 11905: 0xD8E2, - 21118 - 11905: 0x849B, - 21119 - 11905: 0xBDCB, - 21120 - 11905: 0x849C, - 21121 - 11905: 0xD8E4, - 21122 - 11905: 0xD8E3, - 21123 - 11905: 0x849D, - 21124 - 11905: 0x849E, - 21125 - 11905: 0x849F, - 21126 - 11905: 0x84A0, - 21127 - 11905: 0x84A1, - 21128 - 11905: 0xC5FC, - 21129 - 11905: 0x84A2, - 21130 - 11905: 0x84A3, - 21131 - 11905: 0x84A4, - 21132 - 11905: 0x84A5, - 21133 - 11905: 0x84A6, - 21134 - 11905: 0x84A7, - 21135 - 11905: 0x84A8, - 21136 - 11905: 0xD8E5, - 21137 - 11905: 0x84A9, - 21138 - 11905: 0x84AA, - 21139 - 11905: 0xD8E6, - 21140 - 11905: 0x84AB, - 21141 - 11905: 0x84AC, - 21142 - 11905: 0x84AD, - 21143 - 11905: 0x84AE, - 21144 - 11905: 0x84AF, - 21145 - 11905: 0x84B0, - 21146 - 11905: 0x84B1, - 21147 - 11905: 0xC1A6, - 21148 - 11905: 0x84B2, - 21149 - 11905: 0xC8B0, - 21150 - 11905: 0xB0EC, - 21151 - 11905: 0xB9A6, - 21152 - 11905: 0xBCD3, - 21153 - 11905: 0xCEF1, - 21154 - 11905: 0xDBBD, - 21155 - 11905: 0xC1D3, - 21156 - 11905: 0x84B3, - 21157 - 11905: 0x84B4, - 21158 - 11905: 0x84B5, - 21159 - 11905: 0x84B6, - 21160 - 11905: 0xB6AF, - 21161 - 11905: 0xD6FA, - 21162 - 11905: 0xC5AC, - 21163 - 11905: 0xBDD9, - 21164 - 11905: 0xDBBE, - 21165 - 11905: 0xDBBF, - 21166 - 11905: 0x84B7, - 21167 - 11905: 0x84B8, - 21168 - 11905: 0x84B9, - 21169 - 11905: 0xC0F8, - 21170 - 11905: 0xBEA2, - 21171 - 11905: 0xC0CD, - 21172 - 11905: 0x84BA, - 21173 - 11905: 0x84BB, - 21174 - 11905: 0x84BC, - 21175 - 11905: 0x84BD, - 21176 - 11905: 0x84BE, - 21177 - 11905: 0x84BF, - 21178 - 11905: 0x84C0, - 21179 - 11905: 0x84C1, - 21180 - 11905: 0x84C2, - 21181 - 11905: 0x84C3, - 21182 - 11905: 0xDBC0, - 21183 - 11905: 0xCAC6, - 21184 - 11905: 0x84C4, - 21185 - 11905: 0x84C5, - 21186 - 11905: 0x84C6, - 21187 - 11905: 0xB2AA, - 21188 - 11905: 0x84C7, - 21189 - 11905: 0x84C8, - 21190 - 11905: 0x84C9, - 21191 - 11905: 0xD3C2, - 21192 - 11905: 0x84CA, - 21193 - 11905: 0xC3E3, - 21194 - 11905: 0x84CB, - 21195 - 11905: 0xD1AB, - 21196 - 11905: 0x84CC, - 21197 - 11905: 0x84CD, - 21198 - 11905: 0x84CE, - 21199 - 11905: 0x84CF, - 21200 - 11905: 0xDBC2, - 21201 - 11905: 0x84D0, - 21202 - 11905: 0xC0D5, - 21203 - 11905: 0x84D1, - 21204 - 11905: 0x84D2, - 21205 - 11905: 0x84D3, - 21206 - 11905: 0xDBC3, - 21207 - 11905: 0x84D4, - 21208 - 11905: 0xBFB1, - 21209 - 11905: 0x84D5, - 21210 - 11905: 0x84D6, - 21211 - 11905: 0x84D7, - 21212 - 11905: 0x84D8, - 21213 - 11905: 0x84D9, - 21214 - 11905: 0x84DA, - 21215 - 11905: 0xC4BC, - 21216 - 11905: 0x84DB, - 21217 - 11905: 0x84DC, - 21218 - 11905: 0x84DD, - 21219 - 11905: 0x84DE, - 21220 - 11905: 0xC7DA, - 21221 - 11905: 0x84DF, - 21222 - 11905: 0x84E0, - 21223 - 11905: 0x84E1, - 21224 - 11905: 0x84E2, - 21225 - 11905: 0x84E3, - 21226 - 11905: 0x84E4, - 21227 - 11905: 0x84E5, - 21228 - 11905: 0x84E6, - 21229 - 11905: 0x84E7, - 21230 - 11905: 0x84E8, - 21231 - 11905: 0x84E9, - 21232 - 11905: 0xDBC4, - 21233 - 11905: 0x84EA, - 21234 - 11905: 0x84EB, - 21235 - 11905: 0x84EC, - 21236 - 11905: 0x84ED, - 21237 - 11905: 0x84EE, - 21238 - 11905: 0x84EF, - 21239 - 11905: 0x84F0, - 21240 - 11905: 0x84F1, - 21241 - 11905: 0xD9E8, - 21242 - 11905: 0xC9D7, - 21243 - 11905: 0x84F2, - 21244 - 11905: 0x84F3, - 21245 - 11905: 0x84F4, - 21246 - 11905: 0xB9B4, - 21247 - 11905: 0xCEF0, - 21248 - 11905: 0xD4C8, - 21249 - 11905: 0x84F5, - 21250 - 11905: 0x84F6, - 21251 - 11905: 0x84F7, - 21252 - 11905: 0x84F8, - 21253 - 11905: 0xB0FC, - 21254 - 11905: 0xB4D2, - 21255 - 11905: 0x84F9, - 21256 - 11905: 0xD0D9, - 21257 - 11905: 0x84FA, - 21258 - 11905: 0x84FB, - 21259 - 11905: 0x84FC, - 21260 - 11905: 0x84FD, - 21261 - 11905: 0xD9E9, - 21262 - 11905: 0x84FE, - 21263 - 11905: 0xDECB, - 21264 - 11905: 0xD9EB, - 21265 - 11905: 0x8540, - 21266 - 11905: 0x8541, - 21267 - 11905: 0x8542, - 21268 - 11905: 0x8543, - 21269 - 11905: 0xD8B0, - 21270 - 11905: 0xBBAF, - 21271 - 11905: 0xB1B1, - 21272 - 11905: 0x8544, - 21273 - 11905: 0xB3D7, - 21274 - 11905: 0xD8CE, - 21275 - 11905: 0x8545, - 21276 - 11905: 0x8546, - 21277 - 11905: 0xD4D1, - 21278 - 11905: 0x8547, - 21279 - 11905: 0x8548, - 21280 - 11905: 0xBDB3, - 21281 - 11905: 0xBFEF, - 21282 - 11905: 0x8549, - 21283 - 11905: 0xCFBB, - 21284 - 11905: 0x854A, - 21285 - 11905: 0x854B, - 21286 - 11905: 0xD8D0, - 21287 - 11905: 0x854C, - 21288 - 11905: 0x854D, - 21289 - 11905: 0x854E, - 21290 - 11905: 0xB7CB, - 21291 - 11905: 0x854F, - 21292 - 11905: 0x8550, - 21293 - 11905: 0x8551, - 21294 - 11905: 0xD8D1, - 21295 - 11905: 0x8552, - 21296 - 11905: 0x8553, - 21297 - 11905: 0x8554, - 21298 - 11905: 0x8555, - 21299 - 11905: 0x8556, - 21300 - 11905: 0x8557, - 21301 - 11905: 0x8558, - 21302 - 11905: 0x8559, - 21303 - 11905: 0x855A, - 21304 - 11905: 0x855B, - 21305 - 11905: 0xC6A5, - 21306 - 11905: 0xC7F8, - 21307 - 11905: 0xD2BD, - 21308 - 11905: 0x855C, - 21309 - 11905: 0x855D, - 21310 - 11905: 0xD8D2, - 21311 - 11905: 0xC4E4, - 21312 - 11905: 0x855E, - 21313 - 11905: 0xCAAE, - 21314 - 11905: 0x855F, - 21315 - 11905: 0xC7A7, - 21316 - 11905: 0x8560, - 21317 - 11905: 0xD8A6, - 21318 - 11905: 0x8561, - 21319 - 11905: 0xC9FD, - 21320 - 11905: 0xCEE7, - 21321 - 11905: 0xBBDC, - 21322 - 11905: 0xB0EB, - 21323 - 11905: 0x8562, - 21324 - 11905: 0x8563, - 21325 - 11905: 0x8564, - 21326 - 11905: 0xBBAA, - 21327 - 11905: 0xD0AD, - 21328 - 11905: 0x8565, - 21329 - 11905: 0xB1B0, - 21330 - 11905: 0xD7E4, - 21331 - 11905: 0xD7BF, - 21332 - 11905: 0x8566, - 21333 - 11905: 0xB5A5, - 21334 - 11905: 0xC2F4, - 21335 - 11905: 0xC4CF, - 21336 - 11905: 0x8567, - 21337 - 11905: 0x8568, - 21338 - 11905: 0xB2A9, - 21339 - 11905: 0x8569, - 21340 - 11905: 0xB2B7, - 21341 - 11905: 0x856A, - 21342 - 11905: 0xB1E5, - 21343 - 11905: 0xDFB2, - 21344 - 11905: 0xD5BC, - 21345 - 11905: 0xBFA8, - 21346 - 11905: 0xC2AC, - 21347 - 11905: 0xD8D5, - 21348 - 11905: 0xC2B1, - 21349 - 11905: 0x856B, - 21350 - 11905: 0xD8D4, - 21351 - 11905: 0xCED4, - 21352 - 11905: 0x856C, - 21353 - 11905: 0xDAE0, - 21354 - 11905: 0x856D, - 21355 - 11905: 0xCEC0, - 21356 - 11905: 0x856E, - 21357 - 11905: 0x856F, - 21358 - 11905: 0xD8B4, - 21359 - 11905: 0xC3AE, - 21360 - 11905: 0xD3A1, - 21361 - 11905: 0xCEA3, - 21362 - 11905: 0x8570, - 21363 - 11905: 0xBCB4, - 21364 - 11905: 0xC8B4, - 21365 - 11905: 0xC2D1, - 21366 - 11905: 0x8571, - 21367 - 11905: 0xBEED, - 21368 - 11905: 0xD0B6, - 21369 - 11905: 0x8572, - 21370 - 11905: 0xDAE1, - 21371 - 11905: 0x8573, - 21372 - 11905: 0x8574, - 21373 - 11905: 0x8575, - 21374 - 11905: 0x8576, - 21375 - 11905: 0xC7E4, - 21376 - 11905: 0x8577, - 21377 - 11905: 0x8578, - 21378 - 11905: 0xB3A7, - 21379 - 11905: 0x8579, - 21380 - 11905: 0xB6F2, - 21381 - 11905: 0xCCFC, - 21382 - 11905: 0xC0FA, - 21383 - 11905: 0x857A, - 21384 - 11905: 0x857B, - 21385 - 11905: 0xC0F7, - 21386 - 11905: 0x857C, - 21387 - 11905: 0xD1B9, - 21388 - 11905: 0xD1E1, - 21389 - 11905: 0xD8C7, - 21390 - 11905: 0x857D, - 21391 - 11905: 0x857E, - 21392 - 11905: 0x8580, - 21393 - 11905: 0x8581, - 21394 - 11905: 0x8582, - 21395 - 11905: 0x8583, - 21396 - 11905: 0x8584, - 21397 - 11905: 0xB2DE, - 21398 - 11905: 0x8585, - 21399 - 11905: 0x8586, - 21400 - 11905: 0xC0E5, - 21401 - 11905: 0x8587, - 21402 - 11905: 0xBAF1, - 21403 - 11905: 0x8588, - 21404 - 11905: 0x8589, - 21405 - 11905: 0xD8C8, - 21406 - 11905: 0x858A, - 21407 - 11905: 0xD4AD, - 21408 - 11905: 0x858B, - 21409 - 11905: 0x858C, - 21410 - 11905: 0xCFE1, - 21411 - 11905: 0xD8C9, - 21412 - 11905: 0x858D, - 21413 - 11905: 0xD8CA, - 21414 - 11905: 0xCFC3, - 21415 - 11905: 0x858E, - 21416 - 11905: 0xB3F8, - 21417 - 11905: 0xBEC7, - 21418 - 11905: 0x858F, - 21419 - 11905: 0x8590, - 21420 - 11905: 0x8591, - 21421 - 11905: 0x8592, - 21422 - 11905: 0xD8CB, - 21423 - 11905: 0x8593, - 21424 - 11905: 0x8594, - 21425 - 11905: 0x8595, - 21426 - 11905: 0x8596, - 21427 - 11905: 0x8597, - 21428 - 11905: 0x8598, - 21429 - 11905: 0x8599, - 21430 - 11905: 0xDBCC, - 21431 - 11905: 0x859A, - 21432 - 11905: 0x859B, - 21433 - 11905: 0x859C, - 21434 - 11905: 0x859D, - 21435 - 11905: 0xC8A5, - 21436 - 11905: 0x859E, - 21437 - 11905: 0x859F, - 21438 - 11905: 0x85A0, - 21439 - 11905: 0xCFD8, - 21440 - 11905: 0x85A1, - 21441 - 11905: 0xC8FE, - 21442 - 11905: 0xB2CE, - 21443 - 11905: 0x85A2, - 21444 - 11905: 0x85A3, - 21445 - 11905: 0x85A4, - 21446 - 11905: 0x85A5, - 21447 - 11905: 0x85A6, - 21448 - 11905: 0xD3D6, - 21449 - 11905: 0xB2E6, - 21450 - 11905: 0xBCB0, - 21451 - 11905: 0xD3D1, - 21452 - 11905: 0xCBAB, - 21453 - 11905: 0xB7B4, - 21454 - 11905: 0x85A7, - 21455 - 11905: 0x85A8, - 21456 - 11905: 0x85A9, - 21457 - 11905: 0xB7A2, - 21458 - 11905: 0x85AA, - 21459 - 11905: 0x85AB, - 21460 - 11905: 0xCAE5, - 21461 - 11905: 0x85AC, - 21462 - 11905: 0xC8A1, - 21463 - 11905: 0xCADC, - 21464 - 11905: 0xB1E4, - 21465 - 11905: 0xD0F0, - 21466 - 11905: 0x85AD, - 21467 - 11905: 0xC5D1, - 21468 - 11905: 0x85AE, - 21469 - 11905: 0x85AF, - 21470 - 11905: 0x85B0, - 21471 - 11905: 0xDBC5, - 21472 - 11905: 0xB5FE, - 21473 - 11905: 0x85B1, - 21474 - 11905: 0x85B2, - 21475 - 11905: 0xBFDA, - 21476 - 11905: 0xB9C5, - 21477 - 11905: 0xBEE4, - 21478 - 11905: 0xC1ED, - 21479 - 11905: 0x85B3, - 21480 - 11905: 0xDFB6, - 21481 - 11905: 0xDFB5, - 21482 - 11905: 0xD6BB, - 21483 - 11905: 0xBDD0, - 21484 - 11905: 0xD5D9, - 21485 - 11905: 0xB0C8, - 21486 - 11905: 0xB6A3, - 21487 - 11905: 0xBFC9, - 21488 - 11905: 0xCCA8, - 21489 - 11905: 0xDFB3, - 21490 - 11905: 0xCAB7, - 21491 - 11905: 0xD3D2, - 21492 - 11905: 0x85B4, - 21493 - 11905: 0xD8CF, - 21494 - 11905: 0xD2B6, - 21495 - 11905: 0xBAC5, - 21496 - 11905: 0xCBBE, - 21497 - 11905: 0xCCBE, - 21498 - 11905: 0x85B5, - 21499 - 11905: 0xDFB7, - 21500 - 11905: 0xB5F0, - 21501 - 11905: 0xDFB4, - 21502 - 11905: 0x85B6, - 21503 - 11905: 0x85B7, - 21504 - 11905: 0x85B8, - 21505 - 11905: 0xD3F5, - 21506 - 11905: 0x85B9, - 21507 - 11905: 0xB3D4, - 21508 - 11905: 0xB8F7, - 21509 - 11905: 0x85BA, - 21510 - 11905: 0xDFBA, - 21511 - 11905: 0x85BB, - 21512 - 11905: 0xBACF, - 21513 - 11905: 0xBCAA, - 21514 - 11905: 0xB5F5, - 21515 - 11905: 0x85BC, - 21516 - 11905: 0xCDAC, - 21517 - 11905: 0xC3FB, - 21518 - 11905: 0xBAF3, - 21519 - 11905: 0xC0F4, - 21520 - 11905: 0xCDC2, - 21521 - 11905: 0xCFF2, - 21522 - 11905: 0xDFB8, - 21523 - 11905: 0xCFC5, - 21524 - 11905: 0x85BD, - 21525 - 11905: 0xC2C0, - 21526 - 11905: 0xDFB9, - 21527 - 11905: 0xC2F0, - 21528 - 11905: 0x85BE, - 21529 - 11905: 0x85BF, - 21530 - 11905: 0x85C0, - 21531 - 11905: 0xBEFD, - 21532 - 11905: 0x85C1, - 21533 - 11905: 0xC1DF, - 21534 - 11905: 0xCDCC, - 21535 - 11905: 0xD2F7, - 21536 - 11905: 0xB7CD, - 21537 - 11905: 0xDFC1, - 21538 - 11905: 0x85C2, - 21539 - 11905: 0xDFC4, - 21540 - 11905: 0x85C3, - 21541 - 11905: 0x85C4, - 21542 - 11905: 0xB7F1, - 21543 - 11905: 0xB0C9, - 21544 - 11905: 0xB6D6, - 21545 - 11905: 0xB7D4, - 21546 - 11905: 0x85C5, - 21547 - 11905: 0xBAAC, - 21548 - 11905: 0xCCFD, - 21549 - 11905: 0xBFD4, - 21550 - 11905: 0xCBB1, - 21551 - 11905: 0xC6F4, - 21552 - 11905: 0x85C6, - 21553 - 11905: 0xD6A8, - 21554 - 11905: 0xDFC5, - 21555 - 11905: 0x85C7, - 21556 - 11905: 0xCEE2, - 21557 - 11905: 0xB3B3, - 21558 - 11905: 0x85C8, - 21559 - 11905: 0x85C9, - 21560 - 11905: 0xCEFC, - 21561 - 11905: 0xB4B5, - 21562 - 11905: 0x85CA, - 21563 - 11905: 0xCEC7, - 21564 - 11905: 0xBAF0, - 21565 - 11905: 0x85CB, - 21566 - 11905: 0xCEE1, - 21567 - 11905: 0x85CC, - 21568 - 11905: 0xD1BD, - 21569 - 11905: 0x85CD, - 21570 - 11905: 0x85CE, - 21571 - 11905: 0xDFC0, - 21572 - 11905: 0x85CF, - 21573 - 11905: 0x85D0, - 21574 - 11905: 0xB4F4, - 21575 - 11905: 0x85D1, - 21576 - 11905: 0xB3CA, - 21577 - 11905: 0x85D2, - 21578 - 11905: 0xB8E6, - 21579 - 11905: 0xDFBB, - 21580 - 11905: 0x85D3, - 21581 - 11905: 0x85D4, - 21582 - 11905: 0x85D5, - 21583 - 11905: 0x85D6, - 21584 - 11905: 0xC4C5, - 21585 - 11905: 0x85D7, - 21586 - 11905: 0xDFBC, - 21587 - 11905: 0xDFBD, - 21588 - 11905: 0xDFBE, - 21589 - 11905: 0xC5BB, - 21590 - 11905: 0xDFBF, - 21591 - 11905: 0xDFC2, - 21592 - 11905: 0xD4B1, - 21593 - 11905: 0xDFC3, - 21594 - 11905: 0x85D8, - 21595 - 11905: 0xC7BA, - 21596 - 11905: 0xCED8, - 21597 - 11905: 0x85D9, - 21598 - 11905: 0x85DA, - 21599 - 11905: 0x85DB, - 21600 - 11905: 0x85DC, - 21601 - 11905: 0x85DD, - 21602 - 11905: 0xC4D8, - 21603 - 11905: 0x85DE, - 21604 - 11905: 0xDFCA, - 21605 - 11905: 0x85DF, - 21606 - 11905: 0xDFCF, - 21607 - 11905: 0x85E0, - 21608 - 11905: 0xD6DC, - 21609 - 11905: 0x85E1, - 21610 - 11905: 0x85E2, - 21611 - 11905: 0x85E3, - 21612 - 11905: 0x85E4, - 21613 - 11905: 0x85E5, - 21614 - 11905: 0x85E6, - 21615 - 11905: 0x85E7, - 21616 - 11905: 0x85E8, - 21617 - 11905: 0xDFC9, - 21618 - 11905: 0xDFDA, - 21619 - 11905: 0xCEB6, - 21620 - 11905: 0x85E9, - 21621 - 11905: 0xBAC7, - 21622 - 11905: 0xDFCE, - 21623 - 11905: 0xDFC8, - 21624 - 11905: 0xC5DE, - 21625 - 11905: 0x85EA, - 21626 - 11905: 0x85EB, - 21627 - 11905: 0xC9EB, - 21628 - 11905: 0xBAF4, - 21629 - 11905: 0xC3FC, - 21630 - 11905: 0x85EC, - 21631 - 11905: 0x85ED, - 21632 - 11905: 0xBED7, - 21633 - 11905: 0x85EE, - 21634 - 11905: 0xDFC6, - 21635 - 11905: 0x85EF, - 21636 - 11905: 0xDFCD, - 21637 - 11905: 0x85F0, - 21638 - 11905: 0xC5D8, - 21639 - 11905: 0x85F1, - 21640 - 11905: 0x85F2, - 21641 - 11905: 0x85F3, - 21642 - 11905: 0x85F4, - 21643 - 11905: 0xD5A6, - 21644 - 11905: 0xBACD, - 21645 - 11905: 0x85F5, - 21646 - 11905: 0xBECC, - 21647 - 11905: 0xD3BD, - 21648 - 11905: 0xB8C0, - 21649 - 11905: 0x85F6, - 21650 - 11905: 0xD6E4, - 21651 - 11905: 0x85F7, - 21652 - 11905: 0xDFC7, - 21653 - 11905: 0xB9BE, - 21654 - 11905: 0xBFA7, - 21655 - 11905: 0x85F8, - 21656 - 11905: 0x85F9, - 21657 - 11905: 0xC1FC, - 21658 - 11905: 0xDFCB, - 21659 - 11905: 0xDFCC, - 21660 - 11905: 0x85FA, - 21661 - 11905: 0xDFD0, - 21662 - 11905: 0x85FB, - 21663 - 11905: 0x85FC, - 21664 - 11905: 0x85FD, - 21665 - 11905: 0x85FE, - 21666 - 11905: 0x8640, - 21667 - 11905: 0xDFDB, - 21668 - 11905: 0xDFE5, - 21669 - 11905: 0x8641, - 21670 - 11905: 0xDFD7, - 21671 - 11905: 0xDFD6, - 21672 - 11905: 0xD7C9, - 21673 - 11905: 0xDFE3, - 21674 - 11905: 0xDFE4, - 21675 - 11905: 0xE5EB, - 21676 - 11905: 0xD2A7, - 21677 - 11905: 0xDFD2, - 21678 - 11905: 0x8642, - 21679 - 11905: 0xBFA9, - 21680 - 11905: 0x8643, - 21681 - 11905: 0xD4DB, - 21682 - 11905: 0x8644, - 21683 - 11905: 0xBFC8, - 21684 - 11905: 0xDFD4, - 21685 - 11905: 0x8645, - 21686 - 11905: 0x8646, - 21687 - 11905: 0x8647, - 21688 - 11905: 0xCFCC, - 21689 - 11905: 0x8648, - 21690 - 11905: 0x8649, - 21691 - 11905: 0xDFDD, - 21692 - 11905: 0x864A, - 21693 - 11905: 0xD1CA, - 21694 - 11905: 0x864B, - 21695 - 11905: 0xDFDE, - 21696 - 11905: 0xB0A7, - 21697 - 11905: 0xC6B7, - 21698 - 11905: 0xDFD3, - 21699 - 11905: 0x864C, - 21700 - 11905: 0xBAE5, - 21701 - 11905: 0x864D, - 21702 - 11905: 0xB6DF, - 21703 - 11905: 0xCDDB, - 21704 - 11905: 0xB9FE, - 21705 - 11905: 0xD4D5, - 21706 - 11905: 0x864E, - 21707 - 11905: 0x864F, - 21708 - 11905: 0xDFDF, - 21709 - 11905: 0xCFEC, - 21710 - 11905: 0xB0A5, - 21711 - 11905: 0xDFE7, - 21712 - 11905: 0xDFD1, - 21713 - 11905: 0xD1C6, - 21714 - 11905: 0xDFD5, - 21715 - 11905: 0xDFD8, - 21716 - 11905: 0xDFD9, - 21717 - 11905: 0xDFDC, - 21718 - 11905: 0x8650, - 21719 - 11905: 0xBBA9, - 21720 - 11905: 0x8651, - 21721 - 11905: 0xDFE0, - 21722 - 11905: 0xDFE1, - 21723 - 11905: 0x8652, - 21724 - 11905: 0xDFE2, - 21725 - 11905: 0xDFE6, - 21726 - 11905: 0xDFE8, - 21727 - 11905: 0xD3B4, - 21728 - 11905: 0x8653, - 21729 - 11905: 0x8654, - 21730 - 11905: 0x8655, - 21731 - 11905: 0x8656, - 21732 - 11905: 0x8657, - 21733 - 11905: 0xB8E7, - 21734 - 11905: 0xC5B6, - 21735 - 11905: 0xDFEA, - 21736 - 11905: 0xC9DA, - 21737 - 11905: 0xC1A8, - 21738 - 11905: 0xC4C4, - 21739 - 11905: 0x8658, - 21740 - 11905: 0x8659, - 21741 - 11905: 0xBFDE, - 21742 - 11905: 0xCFF8, - 21743 - 11905: 0x865A, - 21744 - 11905: 0x865B, - 21745 - 11905: 0x865C, - 21746 - 11905: 0xD5DC, - 21747 - 11905: 0xDFEE, - 21748 - 11905: 0x865D, - 21749 - 11905: 0x865E, - 21750 - 11905: 0x865F, - 21751 - 11905: 0x8660, - 21752 - 11905: 0x8661, - 21753 - 11905: 0x8662, - 21754 - 11905: 0xB2B8, - 21755 - 11905: 0x8663, - 21756 - 11905: 0xBADF, - 21757 - 11905: 0xDFEC, - 21758 - 11905: 0x8664, - 21759 - 11905: 0xDBC1, - 21760 - 11905: 0x8665, - 21761 - 11905: 0xD1E4, - 21762 - 11905: 0x8666, - 21763 - 11905: 0x8667, - 21764 - 11905: 0x8668, - 21765 - 11905: 0x8669, - 21766 - 11905: 0xCBF4, - 21767 - 11905: 0xB4BD, - 21768 - 11905: 0x866A, - 21769 - 11905: 0xB0A6, - 21770 - 11905: 0x866B, - 21771 - 11905: 0x866C, - 21772 - 11905: 0x866D, - 21773 - 11905: 0x866E, - 21774 - 11905: 0x866F, - 21775 - 11905: 0xDFF1, - 21776 - 11905: 0xCCC6, - 21777 - 11905: 0xDFF2, - 21778 - 11905: 0x8670, - 21779 - 11905: 0x8671, - 21780 - 11905: 0xDFED, - 21781 - 11905: 0x8672, - 21782 - 11905: 0x8673, - 21783 - 11905: 0x8674, - 21784 - 11905: 0x8675, - 21785 - 11905: 0x8676, - 21786 - 11905: 0x8677, - 21787 - 11905: 0xDFE9, - 21788 - 11905: 0x8678, - 21789 - 11905: 0x8679, - 21790 - 11905: 0x867A, - 21791 - 11905: 0x867B, - 21792 - 11905: 0xDFEB, - 21793 - 11905: 0x867C, - 21794 - 11905: 0xDFEF, - 21795 - 11905: 0xDFF0, - 21796 - 11905: 0xBBBD, - 21797 - 11905: 0x867D, - 21798 - 11905: 0x867E, - 21799 - 11905: 0xDFF3, - 21800 - 11905: 0x8680, - 21801 - 11905: 0x8681, - 21802 - 11905: 0xDFF4, - 21803 - 11905: 0x8682, - 21804 - 11905: 0xBBA3, - 21805 - 11905: 0x8683, - 21806 - 11905: 0xCADB, - 21807 - 11905: 0xCEA8, - 21808 - 11905: 0xE0A7, - 21809 - 11905: 0xB3AA, - 21810 - 11905: 0x8684, - 21811 - 11905: 0xE0A6, - 21812 - 11905: 0x8685, - 21813 - 11905: 0x8686, - 21814 - 11905: 0x8687, - 21815 - 11905: 0xE0A1, - 21816 - 11905: 0x8688, - 21817 - 11905: 0x8689, - 21818 - 11905: 0x868A, - 21819 - 11905: 0x868B, - 21820 - 11905: 0xDFFE, - 21821 - 11905: 0x868C, - 21822 - 11905: 0xCDD9, - 21823 - 11905: 0xDFFC, - 21824 - 11905: 0x868D, - 21825 - 11905: 0xDFFA, - 21826 - 11905: 0x868E, - 21827 - 11905: 0xBFD0, - 21828 - 11905: 0xD7C4, - 21829 - 11905: 0x868F, - 21830 - 11905: 0xC9CC, - 21831 - 11905: 0x8690, - 21832 - 11905: 0x8691, - 21833 - 11905: 0xDFF8, - 21834 - 11905: 0xB0A1, - 21835 - 11905: 0x8692, - 21836 - 11905: 0x8693, - 21837 - 11905: 0x8694, - 21838 - 11905: 0x8695, - 21839 - 11905: 0x8696, - 21840 - 11905: 0xDFFD, - 21841 - 11905: 0x8697, - 21842 - 11905: 0x8698, - 21843 - 11905: 0x8699, - 21844 - 11905: 0x869A, - 21845 - 11905: 0xDFFB, - 21846 - 11905: 0xE0A2, - 21847 - 11905: 0x869B, - 21848 - 11905: 0x869C, - 21849 - 11905: 0x869D, - 21850 - 11905: 0x869E, - 21851 - 11905: 0x869F, - 21852 - 11905: 0xE0A8, - 21853 - 11905: 0x86A0, - 21854 - 11905: 0x86A1, - 21855 - 11905: 0x86A2, - 21856 - 11905: 0x86A3, - 21857 - 11905: 0xB7C8, - 21858 - 11905: 0x86A4, - 21859 - 11905: 0x86A5, - 21860 - 11905: 0xC6A1, - 21861 - 11905: 0xC9B6, - 21862 - 11905: 0xC0B2, - 21863 - 11905: 0xDFF5, - 21864 - 11905: 0x86A6, - 21865 - 11905: 0x86A7, - 21866 - 11905: 0xC5BE, - 21867 - 11905: 0x86A8, - 21868 - 11905: 0xD8C4, - 21869 - 11905: 0xDFF9, - 21870 - 11905: 0xC4F6, - 21871 - 11905: 0x86A9, - 21872 - 11905: 0x86AA, - 21873 - 11905: 0x86AB, - 21874 - 11905: 0x86AC, - 21875 - 11905: 0x86AD, - 21876 - 11905: 0x86AE, - 21877 - 11905: 0xE0A3, - 21878 - 11905: 0xE0A4, - 21879 - 11905: 0xE0A5, - 21880 - 11905: 0xD0A5, - 21881 - 11905: 0x86AF, - 21882 - 11905: 0x86B0, - 21883 - 11905: 0xE0B4, - 21884 - 11905: 0xCCE4, - 21885 - 11905: 0x86B1, - 21886 - 11905: 0xE0B1, - 21887 - 11905: 0x86B2, - 21888 - 11905: 0xBFA6, - 21889 - 11905: 0xE0AF, - 21890 - 11905: 0xCEB9, - 21891 - 11905: 0xE0AB, - 21892 - 11905: 0xC9C6, - 21893 - 11905: 0x86B3, - 21894 - 11905: 0x86B4, - 21895 - 11905: 0xC0AE, - 21896 - 11905: 0xE0AE, - 21897 - 11905: 0xBAED, - 21898 - 11905: 0xBAB0, - 21899 - 11905: 0xE0A9, - 21900 - 11905: 0x86B5, - 21901 - 11905: 0x86B6, - 21902 - 11905: 0x86B7, - 21903 - 11905: 0xDFF6, - 21904 - 11905: 0x86B8, - 21905 - 11905: 0xE0B3, - 21906 - 11905: 0x86B9, - 21907 - 11905: 0x86BA, - 21908 - 11905: 0xE0B8, - 21909 - 11905: 0x86BB, - 21910 - 11905: 0x86BC, - 21911 - 11905: 0x86BD, - 21912 - 11905: 0xB4AD, - 21913 - 11905: 0xE0B9, - 21914 - 11905: 0x86BE, - 21915 - 11905: 0x86BF, - 21916 - 11905: 0xCFB2, - 21917 - 11905: 0xBAC8, - 21918 - 11905: 0x86C0, - 21919 - 11905: 0xE0B0, - 21920 - 11905: 0x86C1, - 21921 - 11905: 0x86C2, - 21922 - 11905: 0x86C3, - 21923 - 11905: 0x86C4, - 21924 - 11905: 0x86C5, - 21925 - 11905: 0x86C6, - 21926 - 11905: 0x86C7, - 21927 - 11905: 0xD0FA, - 21928 - 11905: 0x86C8, - 21929 - 11905: 0x86C9, - 21930 - 11905: 0x86CA, - 21931 - 11905: 0x86CB, - 21932 - 11905: 0x86CC, - 21933 - 11905: 0x86CD, - 21934 - 11905: 0x86CE, - 21935 - 11905: 0x86CF, - 21936 - 11905: 0x86D0, - 21937 - 11905: 0xE0AC, - 21938 - 11905: 0x86D1, - 21939 - 11905: 0xD4FB, - 21940 - 11905: 0x86D2, - 21941 - 11905: 0xDFF7, - 21942 - 11905: 0x86D3, - 21943 - 11905: 0xC5E7, - 21944 - 11905: 0x86D4, - 21945 - 11905: 0xE0AD, - 21946 - 11905: 0x86D5, - 21947 - 11905: 0xD3F7, - 21948 - 11905: 0x86D6, - 21949 - 11905: 0xE0B6, - 21950 - 11905: 0xE0B7, - 21951 - 11905: 0x86D7, - 21952 - 11905: 0x86D8, - 21953 - 11905: 0x86D9, - 21954 - 11905: 0x86DA, - 21955 - 11905: 0x86DB, - 21956 - 11905: 0xE0C4, - 21957 - 11905: 0xD0E1, - 21958 - 11905: 0x86DC, - 21959 - 11905: 0x86DD, - 21960 - 11905: 0x86DE, - 21961 - 11905: 0xE0BC, - 21962 - 11905: 0x86DF, - 21963 - 11905: 0x86E0, - 21964 - 11905: 0xE0C9, - 21965 - 11905: 0xE0CA, - 21966 - 11905: 0x86E1, - 21967 - 11905: 0x86E2, - 21968 - 11905: 0x86E3, - 21969 - 11905: 0xE0BE, - 21970 - 11905: 0xE0AA, - 21971 - 11905: 0xC9A4, - 21972 - 11905: 0xE0C1, - 21973 - 11905: 0x86E4, - 21974 - 11905: 0xE0B2, - 21975 - 11905: 0x86E5, - 21976 - 11905: 0x86E6, - 21977 - 11905: 0x86E7, - 21978 - 11905: 0x86E8, - 21979 - 11905: 0x86E9, - 21980 - 11905: 0xCAC8, - 21981 - 11905: 0xE0C3, - 21982 - 11905: 0x86EA, - 21983 - 11905: 0xE0B5, - 21984 - 11905: 0x86EB, - 21985 - 11905: 0xCECB, - 21986 - 11905: 0x86EC, - 21987 - 11905: 0xCBC3, - 21988 - 11905: 0xE0CD, - 21989 - 11905: 0xE0C6, - 21990 - 11905: 0xE0C2, - 21991 - 11905: 0x86ED, - 21992 - 11905: 0xE0CB, - 21993 - 11905: 0x86EE, - 21994 - 11905: 0xE0BA, - 21995 - 11905: 0xE0BF, - 21996 - 11905: 0xE0C0, - 21997 - 11905: 0x86EF, - 21998 - 11905: 0x86F0, - 21999 - 11905: 0xE0C5, - 22000 - 11905: 0x86F1, - 22001 - 11905: 0x86F2, - 22002 - 11905: 0xE0C7, - 22003 - 11905: 0xE0C8, - 22004 - 11905: 0x86F3, - 22005 - 11905: 0xE0CC, - 22006 - 11905: 0x86F4, - 22007 - 11905: 0xE0BB, - 22008 - 11905: 0x86F5, - 22009 - 11905: 0x86F6, - 22010 - 11905: 0x86F7, - 22011 - 11905: 0x86F8, - 22012 - 11905: 0x86F9, - 22013 - 11905: 0xCBD4, - 22014 - 11905: 0xE0D5, - 22015 - 11905: 0x86FA, - 22016 - 11905: 0xE0D6, - 22017 - 11905: 0xE0D2, - 22018 - 11905: 0x86FB, - 22019 - 11905: 0x86FC, - 22020 - 11905: 0x86FD, - 22021 - 11905: 0x86FE, - 22022 - 11905: 0x8740, - 22023 - 11905: 0x8741, - 22024 - 11905: 0xE0D0, - 22025 - 11905: 0xBCCE, - 22026 - 11905: 0x8742, - 22027 - 11905: 0x8743, - 22028 - 11905: 0xE0D1, - 22029 - 11905: 0x8744, - 22030 - 11905: 0xB8C2, - 22031 - 11905: 0xD8C5, - 22032 - 11905: 0x8745, - 22033 - 11905: 0x8746, - 22034 - 11905: 0x8747, - 22035 - 11905: 0x8748, - 22036 - 11905: 0x8749, - 22037 - 11905: 0x874A, - 22038 - 11905: 0x874B, - 22039 - 11905: 0x874C, - 22040 - 11905: 0xD0EA, - 22041 - 11905: 0x874D, - 22042 - 11905: 0x874E, - 22043 - 11905: 0xC2EF, - 22044 - 11905: 0x874F, - 22045 - 11905: 0x8750, - 22046 - 11905: 0xE0CF, - 22047 - 11905: 0xE0BD, - 22048 - 11905: 0x8751, - 22049 - 11905: 0x8752, - 22050 - 11905: 0x8753, - 22051 - 11905: 0xE0D4, - 22052 - 11905: 0xE0D3, - 22053 - 11905: 0x8754, - 22054 - 11905: 0x8755, - 22055 - 11905: 0xE0D7, - 22056 - 11905: 0x8756, - 22057 - 11905: 0x8757, - 22058 - 11905: 0x8758, - 22059 - 11905: 0x8759, - 22060 - 11905: 0xE0DC, - 22061 - 11905: 0xE0D8, - 22062 - 11905: 0x875A, - 22063 - 11905: 0x875B, - 22064 - 11905: 0x875C, - 22065 - 11905: 0xD6F6, - 22066 - 11905: 0xB3B0, - 22067 - 11905: 0x875D, - 22068 - 11905: 0xD7EC, - 22069 - 11905: 0x875E, - 22070 - 11905: 0xCBBB, - 22071 - 11905: 0x875F, - 22072 - 11905: 0x8760, - 22073 - 11905: 0xE0DA, - 22074 - 11905: 0x8761, - 22075 - 11905: 0xCEFB, - 22076 - 11905: 0x8762, - 22077 - 11905: 0x8763, - 22078 - 11905: 0x8764, - 22079 - 11905: 0xBAD9, - 22080 - 11905: 0x8765, - 22081 - 11905: 0x8766, - 22082 - 11905: 0x8767, - 22083 - 11905: 0x8768, - 22084 - 11905: 0x8769, - 22085 - 11905: 0x876A, - 22086 - 11905: 0x876B, - 22087 - 11905: 0x876C, - 22088 - 11905: 0x876D, - 22089 - 11905: 0x876E, - 22090 - 11905: 0x876F, - 22091 - 11905: 0x8770, - 22092 - 11905: 0xE0E1, - 22093 - 11905: 0xE0DD, - 22094 - 11905: 0xD2AD, - 22095 - 11905: 0x8771, - 22096 - 11905: 0x8772, - 22097 - 11905: 0x8773, - 22098 - 11905: 0x8774, - 22099 - 11905: 0x8775, - 22100 - 11905: 0xE0E2, - 22101 - 11905: 0x8776, - 22102 - 11905: 0x8777, - 22103 - 11905: 0xE0DB, - 22104 - 11905: 0xE0D9, - 22105 - 11905: 0xE0DF, - 22106 - 11905: 0x8778, - 22107 - 11905: 0x8779, - 22108 - 11905: 0xE0E0, - 22109 - 11905: 0x877A, - 22110 - 11905: 0x877B, - 22111 - 11905: 0x877C, - 22112 - 11905: 0x877D, - 22113 - 11905: 0x877E, - 22114 - 11905: 0xE0DE, - 22115 - 11905: 0x8780, - 22116 - 11905: 0xE0E4, - 22117 - 11905: 0x8781, - 22118 - 11905: 0x8782, - 22119 - 11905: 0x8783, - 22120 - 11905: 0xC6F7, - 22121 - 11905: 0xD8AC, - 22122 - 11905: 0xD4EB, - 22123 - 11905: 0xE0E6, - 22124 - 11905: 0xCAC9, - 22125 - 11905: 0x8784, - 22126 - 11905: 0x8785, - 22127 - 11905: 0x8786, - 22128 - 11905: 0x8787, - 22129 - 11905: 0xE0E5, - 22130 - 11905: 0x8788, - 22131 - 11905: 0x8789, - 22132 - 11905: 0x878A, - 22133 - 11905: 0x878B, - 22134 - 11905: 0xB8C1, - 22135 - 11905: 0x878C, - 22136 - 11905: 0x878D, - 22137 - 11905: 0x878E, - 22138 - 11905: 0x878F, - 22139 - 11905: 0xE0E7, - 22140 - 11905: 0xE0E8, - 22141 - 11905: 0x8790, - 22142 - 11905: 0x8791, - 22143 - 11905: 0x8792, - 22144 - 11905: 0x8793, - 22145 - 11905: 0x8794, - 22146 - 11905: 0x8795, - 22147 - 11905: 0x8796, - 22148 - 11905: 0x8797, - 22149 - 11905: 0xE0E9, - 22150 - 11905: 0xE0E3, - 22151 - 11905: 0x8798, - 22152 - 11905: 0x8799, - 22153 - 11905: 0x879A, - 22154 - 11905: 0x879B, - 22155 - 11905: 0x879C, - 22156 - 11905: 0x879D, - 22157 - 11905: 0x879E, - 22158 - 11905: 0xBABF, - 22159 - 11905: 0xCCE7, - 22160 - 11905: 0x879F, - 22161 - 11905: 0x87A0, - 22162 - 11905: 0x87A1, - 22163 - 11905: 0xE0EA, - 22164 - 11905: 0x87A2, - 22165 - 11905: 0x87A3, - 22166 - 11905: 0x87A4, - 22167 - 11905: 0x87A5, - 22168 - 11905: 0x87A6, - 22169 - 11905: 0x87A7, - 22170 - 11905: 0x87A8, - 22171 - 11905: 0x87A9, - 22172 - 11905: 0x87AA, - 22173 - 11905: 0x87AB, - 22174 - 11905: 0x87AC, - 22175 - 11905: 0x87AD, - 22176 - 11905: 0x87AE, - 22177 - 11905: 0x87AF, - 22178 - 11905: 0x87B0, - 22179 - 11905: 0xCFF9, - 22180 - 11905: 0x87B1, - 22181 - 11905: 0x87B2, - 22182 - 11905: 0x87B3, - 22183 - 11905: 0x87B4, - 22184 - 11905: 0x87B5, - 22185 - 11905: 0x87B6, - 22186 - 11905: 0x87B7, - 22187 - 11905: 0x87B8, - 22188 - 11905: 0x87B9, - 22189 - 11905: 0x87BA, - 22190 - 11905: 0x87BB, - 22191 - 11905: 0xE0EB, - 22192 - 11905: 0x87BC, - 22193 - 11905: 0x87BD, - 22194 - 11905: 0x87BE, - 22195 - 11905: 0x87BF, - 22196 - 11905: 0x87C0, - 22197 - 11905: 0x87C1, - 22198 - 11905: 0x87C2, - 22199 - 11905: 0xC8C2, - 22200 - 11905: 0x87C3, - 22201 - 11905: 0x87C4, - 22202 - 11905: 0x87C5, - 22203 - 11905: 0x87C6, - 22204 - 11905: 0xBDC0, - 22205 - 11905: 0x87C7, - 22206 - 11905: 0x87C8, - 22207 - 11905: 0x87C9, - 22208 - 11905: 0x87CA, - 22209 - 11905: 0x87CB, - 22210 - 11905: 0x87CC, - 22211 - 11905: 0x87CD, - 22212 - 11905: 0x87CE, - 22213 - 11905: 0x87CF, - 22214 - 11905: 0x87D0, - 22215 - 11905: 0x87D1, - 22216 - 11905: 0x87D2, - 22217 - 11905: 0x87D3, - 22218 - 11905: 0xC4D2, - 22219 - 11905: 0x87D4, - 22220 - 11905: 0x87D5, - 22221 - 11905: 0x87D6, - 22222 - 11905: 0x87D7, - 22223 - 11905: 0x87D8, - 22224 - 11905: 0x87D9, - 22225 - 11905: 0x87DA, - 22226 - 11905: 0x87DB, - 22227 - 11905: 0x87DC, - 22228 - 11905: 0xE0EC, - 22229 - 11905: 0x87DD, - 22230 - 11905: 0x87DE, - 22231 - 11905: 0xE0ED, - 22232 - 11905: 0x87DF, - 22233 - 11905: 0x87E0, - 22234 - 11905: 0xC7F4, - 22235 - 11905: 0xCBC4, - 22236 - 11905: 0x87E1, - 22237 - 11905: 0xE0EE, - 22238 - 11905: 0xBBD8, - 22239 - 11905: 0xD8B6, - 22240 - 11905: 0xD2F2, - 22241 - 11905: 0xE0EF, - 22242 - 11905: 0xCDC5, - 22243 - 11905: 0x87E2, - 22244 - 11905: 0xB6DA, - 22245 - 11905: 0x87E3, - 22246 - 11905: 0x87E4, - 22247 - 11905: 0x87E5, - 22248 - 11905: 0x87E6, - 22249 - 11905: 0x87E7, - 22250 - 11905: 0x87E8, - 22251 - 11905: 0xE0F1, - 22252 - 11905: 0x87E9, - 22253 - 11905: 0xD4B0, - 22254 - 11905: 0x87EA, - 22255 - 11905: 0x87EB, - 22256 - 11905: 0xC0A7, - 22257 - 11905: 0xB4D1, - 22258 - 11905: 0x87EC, - 22259 - 11905: 0x87ED, - 22260 - 11905: 0xCEA7, - 22261 - 11905: 0xE0F0, - 22262 - 11905: 0x87EE, - 22263 - 11905: 0x87EF, - 22264 - 11905: 0x87F0, - 22265 - 11905: 0xE0F2, - 22266 - 11905: 0xB9CC, - 22267 - 11905: 0x87F1, - 22268 - 11905: 0x87F2, - 22269 - 11905: 0xB9FA, - 22270 - 11905: 0xCDBC, - 22271 - 11905: 0xE0F3, - 22272 - 11905: 0x87F3, - 22273 - 11905: 0x87F4, - 22274 - 11905: 0x87F5, - 22275 - 11905: 0xC6D4, - 22276 - 11905: 0xE0F4, - 22277 - 11905: 0x87F6, - 22278 - 11905: 0xD4B2, - 22279 - 11905: 0x87F7, - 22280 - 11905: 0xC8A6, - 22281 - 11905: 0xE0F6, - 22282 - 11905: 0xE0F5, - 22283 - 11905: 0x87F8, - 22284 - 11905: 0x87F9, - 22285 - 11905: 0x87FA, - 22286 - 11905: 0x87FB, - 22287 - 11905: 0x87FC, - 22288 - 11905: 0x87FD, - 22289 - 11905: 0x87FE, - 22290 - 11905: 0x8840, - 22291 - 11905: 0x8841, - 22292 - 11905: 0x8842, - 22293 - 11905: 0x8843, - 22294 - 11905: 0x8844, - 22295 - 11905: 0x8845, - 22296 - 11905: 0x8846, - 22297 - 11905: 0x8847, - 22298 - 11905: 0x8848, - 22299 - 11905: 0x8849, - 22300 - 11905: 0xE0F7, - 22301 - 11905: 0x884A, - 22302 - 11905: 0x884B, - 22303 - 11905: 0xCDC1, - 22304 - 11905: 0x884C, - 22305 - 11905: 0x884D, - 22306 - 11905: 0x884E, - 22307 - 11905: 0xCAA5, - 22308 - 11905: 0x884F, - 22309 - 11905: 0x8850, - 22310 - 11905: 0x8851, - 22311 - 11905: 0x8852, - 22312 - 11905: 0xD4DA, - 22313 - 11905: 0xDBD7, - 22314 - 11905: 0xDBD9, - 22315 - 11905: 0x8853, - 22316 - 11905: 0xDBD8, - 22317 - 11905: 0xB9E7, - 22318 - 11905: 0xDBDC, - 22319 - 11905: 0xDBDD, - 22320 - 11905: 0xB5D8, - 22321 - 11905: 0x8854, - 22322 - 11905: 0x8855, - 22323 - 11905: 0xDBDA, - 22324 - 11905: 0x8856, - 22325 - 11905: 0x8857, - 22326 - 11905: 0x8858, - 22327 - 11905: 0x8859, - 22328 - 11905: 0x885A, - 22329 - 11905: 0xDBDB, - 22330 - 11905: 0xB3A1, - 22331 - 11905: 0xDBDF, - 22332 - 11905: 0x885B, - 22333 - 11905: 0x885C, - 22334 - 11905: 0xBBF8, - 22335 - 11905: 0x885D, - 22336 - 11905: 0xD6B7, - 22337 - 11905: 0x885E, - 22338 - 11905: 0xDBE0, - 22339 - 11905: 0x885F, - 22340 - 11905: 0x8860, - 22341 - 11905: 0x8861, - 22342 - 11905: 0x8862, - 22343 - 11905: 0xBEF9, - 22344 - 11905: 0x8863, - 22345 - 11905: 0x8864, - 22346 - 11905: 0xB7BB, - 22347 - 11905: 0x8865, - 22348 - 11905: 0xDBD0, - 22349 - 11905: 0xCCAE, - 22350 - 11905: 0xBFB2, - 22351 - 11905: 0xBBB5, - 22352 - 11905: 0xD7F8, - 22353 - 11905: 0xBFD3, - 22354 - 11905: 0x8866, - 22355 - 11905: 0x8867, - 22356 - 11905: 0x8868, - 22357 - 11905: 0x8869, - 22358 - 11905: 0x886A, - 22359 - 11905: 0xBFE9, - 22360 - 11905: 0x886B, - 22361 - 11905: 0x886C, - 22362 - 11905: 0xBCE1, - 22363 - 11905: 0xCCB3, - 22364 - 11905: 0xDBDE, - 22365 - 11905: 0xB0D3, - 22366 - 11905: 0xCEEB, - 22367 - 11905: 0xB7D8, - 22368 - 11905: 0xD7B9, - 22369 - 11905: 0xC6C2, - 22370 - 11905: 0x886D, - 22371 - 11905: 0x886E, - 22372 - 11905: 0xC0A4, - 22373 - 11905: 0x886F, - 22374 - 11905: 0xCCB9, - 22375 - 11905: 0x8870, - 22376 - 11905: 0xDBE7, - 22377 - 11905: 0xDBE1, - 22378 - 11905: 0xC6BA, - 22379 - 11905: 0xDBE3, - 22380 - 11905: 0x8871, - 22381 - 11905: 0xDBE8, - 22382 - 11905: 0x8872, - 22383 - 11905: 0xC5F7, - 22384 - 11905: 0x8873, - 22385 - 11905: 0x8874, - 22386 - 11905: 0x8875, - 22387 - 11905: 0xDBEA, - 22388 - 11905: 0x8876, - 22389 - 11905: 0x8877, - 22390 - 11905: 0xDBE9, - 22391 - 11905: 0xBFC0, - 22392 - 11905: 0x8878, - 22393 - 11905: 0x8879, - 22394 - 11905: 0x887A, - 22395 - 11905: 0xDBE6, - 22396 - 11905: 0xDBE5, - 22397 - 11905: 0x887B, - 22398 - 11905: 0x887C, - 22399 - 11905: 0x887D, - 22400 - 11905: 0x887E, - 22401 - 11905: 0x8880, - 22402 - 11905: 0xB4B9, - 22403 - 11905: 0xC0AC, - 22404 - 11905: 0xC2A2, - 22405 - 11905: 0xDBE2, - 22406 - 11905: 0xDBE4, - 22407 - 11905: 0x8881, - 22408 - 11905: 0x8882, - 22409 - 11905: 0x8883, - 22410 - 11905: 0x8884, - 22411 - 11905: 0xD0CD, - 22412 - 11905: 0xDBED, - 22413 - 11905: 0x8885, - 22414 - 11905: 0x8886, - 22415 - 11905: 0x8887, - 22416 - 11905: 0x8888, - 22417 - 11905: 0x8889, - 22418 - 11905: 0xC0DD, - 22419 - 11905: 0xDBF2, - 22420 - 11905: 0x888A, - 22421 - 11905: 0x888B, - 22422 - 11905: 0x888C, - 22423 - 11905: 0x888D, - 22424 - 11905: 0x888E, - 22425 - 11905: 0x888F, - 22426 - 11905: 0x8890, - 22427 - 11905: 0xB6E2, - 22428 - 11905: 0x8891, - 22429 - 11905: 0x8892, - 22430 - 11905: 0x8893, - 22431 - 11905: 0x8894, - 22432 - 11905: 0xDBF3, - 22433 - 11905: 0xDBD2, - 22434 - 11905: 0xB9B8, - 22435 - 11905: 0xD4AB, - 22436 - 11905: 0xDBEC, - 22437 - 11905: 0x8895, - 22438 - 11905: 0xBFD1, - 22439 - 11905: 0xDBF0, - 22440 - 11905: 0x8896, - 22441 - 11905: 0xDBD1, - 22442 - 11905: 0x8897, - 22443 - 11905: 0xB5E6, - 22444 - 11905: 0x8898, - 22445 - 11905: 0xDBEB, - 22446 - 11905: 0xBFE5, - 22447 - 11905: 0x8899, - 22448 - 11905: 0x889A, - 22449 - 11905: 0x889B, - 22450 - 11905: 0xDBEE, - 22451 - 11905: 0x889C, - 22452 - 11905: 0xDBF1, - 22453 - 11905: 0x889D, - 22454 - 11905: 0x889E, - 22455 - 11905: 0x889F, - 22456 - 11905: 0xDBF9, - 22457 - 11905: 0x88A0, - 22458 - 11905: 0x88A1, - 22459 - 11905: 0x88A2, - 22460 - 11905: 0x88A3, - 22461 - 11905: 0x88A4, - 22462 - 11905: 0x88A5, - 22463 - 11905: 0x88A6, - 22464 - 11905: 0x88A7, - 22465 - 11905: 0x88A8, - 22466 - 11905: 0xB9A1, - 22467 - 11905: 0xB0A3, - 22468 - 11905: 0x88A9, - 22469 - 11905: 0x88AA, - 22470 - 11905: 0x88AB, - 22471 - 11905: 0x88AC, - 22472 - 11905: 0x88AD, - 22473 - 11905: 0x88AE, - 22474 - 11905: 0x88AF, - 22475 - 11905: 0xC2F1, - 22476 - 11905: 0x88B0, - 22477 - 11905: 0x88B1, - 22478 - 11905: 0xB3C7, - 22479 - 11905: 0xDBEF, - 22480 - 11905: 0x88B2, - 22481 - 11905: 0x88B3, - 22482 - 11905: 0xDBF8, - 22483 - 11905: 0x88B4, - 22484 - 11905: 0xC6D2, - 22485 - 11905: 0xDBF4, - 22486 - 11905: 0x88B5, - 22487 - 11905: 0x88B6, - 22488 - 11905: 0xDBF5, - 22489 - 11905: 0xDBF7, - 22490 - 11905: 0xDBF6, - 22491 - 11905: 0x88B7, - 22492 - 11905: 0x88B8, - 22493 - 11905: 0xDBFE, - 22494 - 11905: 0x88B9, - 22495 - 11905: 0xD3F2, - 22496 - 11905: 0xB2BA, - 22497 - 11905: 0x88BA, - 22498 - 11905: 0x88BB, - 22499 - 11905: 0x88BC, - 22500 - 11905: 0xDBFD, - 22501 - 11905: 0x88BD, - 22502 - 11905: 0x88BE, - 22503 - 11905: 0x88BF, - 22504 - 11905: 0x88C0, - 22505 - 11905: 0x88C1, - 22506 - 11905: 0x88C2, - 22507 - 11905: 0x88C3, - 22508 - 11905: 0x88C4, - 22509 - 11905: 0xDCA4, - 22510 - 11905: 0x88C5, - 22511 - 11905: 0xDBFB, - 22512 - 11905: 0x88C6, - 22513 - 11905: 0x88C7, - 22514 - 11905: 0x88C8, - 22515 - 11905: 0x88C9, - 22516 - 11905: 0xDBFA, - 22517 - 11905: 0x88CA, - 22518 - 11905: 0x88CB, - 22519 - 11905: 0x88CC, - 22520 - 11905: 0xDBFC, - 22521 - 11905: 0xC5E0, - 22522 - 11905: 0xBBF9, - 22523 - 11905: 0x88CD, - 22524 - 11905: 0x88CE, - 22525 - 11905: 0xDCA3, - 22526 - 11905: 0x88CF, - 22527 - 11905: 0x88D0, - 22528 - 11905: 0xDCA5, - 22529 - 11905: 0x88D1, - 22530 - 11905: 0xCCC3, - 22531 - 11905: 0x88D2, - 22532 - 11905: 0x88D3, - 22533 - 11905: 0x88D4, - 22534 - 11905: 0xB6D1, - 22535 - 11905: 0xDDC0, - 22536 - 11905: 0x88D5, - 22537 - 11905: 0x88D6, - 22538 - 11905: 0x88D7, - 22539 - 11905: 0xDCA1, - 22540 - 11905: 0x88D8, - 22541 - 11905: 0xDCA2, - 22542 - 11905: 0x88D9, - 22543 - 11905: 0x88DA, - 22544 - 11905: 0x88DB, - 22545 - 11905: 0xC7B5, - 22546 - 11905: 0x88DC, - 22547 - 11905: 0x88DD, - 22548 - 11905: 0x88DE, - 22549 - 11905: 0xB6E9, - 22550 - 11905: 0x88DF, - 22551 - 11905: 0x88E0, - 22552 - 11905: 0x88E1, - 22553 - 11905: 0xDCA7, - 22554 - 11905: 0x88E2, - 22555 - 11905: 0x88E3, - 22556 - 11905: 0x88E4, - 22557 - 11905: 0x88E5, - 22558 - 11905: 0xDCA6, - 22559 - 11905: 0x88E6, - 22560 - 11905: 0xDCA9, - 22561 - 11905: 0xB1A4, - 22562 - 11905: 0x88E7, - 22563 - 11905: 0x88E8, - 22564 - 11905: 0xB5CC, - 22565 - 11905: 0x88E9, - 22566 - 11905: 0x88EA, - 22567 - 11905: 0x88EB, - 22568 - 11905: 0x88EC, - 22569 - 11905: 0x88ED, - 22570 - 11905: 0xBFB0, - 22571 - 11905: 0x88EE, - 22572 - 11905: 0x88EF, - 22573 - 11905: 0x88F0, - 22574 - 11905: 0x88F1, - 22575 - 11905: 0x88F2, - 22576 - 11905: 0xD1DF, - 22577 - 11905: 0x88F3, - 22578 - 11905: 0x88F4, - 22579 - 11905: 0x88F5, - 22580 - 11905: 0x88F6, - 22581 - 11905: 0xB6C2, - 22582 - 11905: 0x88F7, - 22583 - 11905: 0x88F8, - 22584 - 11905: 0x88F9, - 22585 - 11905: 0x88FA, - 22586 - 11905: 0x88FB, - 22587 - 11905: 0x88FC, - 22588 - 11905: 0x88FD, - 22589 - 11905: 0x88FE, - 22590 - 11905: 0x8940, - 22591 - 11905: 0x8941, - 22592 - 11905: 0x8942, - 22593 - 11905: 0x8943, - 22594 - 11905: 0x8944, - 22595 - 11905: 0x8945, - 22596 - 11905: 0xDCA8, - 22597 - 11905: 0x8946, - 22598 - 11905: 0x8947, - 22599 - 11905: 0x8948, - 22600 - 11905: 0x8949, - 22601 - 11905: 0x894A, - 22602 - 11905: 0x894B, - 22603 - 11905: 0x894C, - 22604 - 11905: 0xCBFA, - 22605 - 11905: 0xEBF3, - 22606 - 11905: 0x894D, - 22607 - 11905: 0x894E, - 22608 - 11905: 0x894F, - 22609 - 11905: 0xCBDC, - 22610 - 11905: 0x8950, - 22611 - 11905: 0x8951, - 22612 - 11905: 0xCBFE, - 22613 - 11905: 0x8952, - 22614 - 11905: 0x8953, - 22615 - 11905: 0x8954, - 22616 - 11905: 0xCCC1, - 22617 - 11905: 0x8955, - 22618 - 11905: 0x8956, - 22619 - 11905: 0x8957, - 22620 - 11905: 0x8958, - 22621 - 11905: 0x8959, - 22622 - 11905: 0xC8FB, - 22623 - 11905: 0x895A, - 22624 - 11905: 0x895B, - 22625 - 11905: 0x895C, - 22626 - 11905: 0x895D, - 22627 - 11905: 0x895E, - 22628 - 11905: 0x895F, - 22629 - 11905: 0xDCAA, - 22630 - 11905: 0x8960, - 22631 - 11905: 0x8961, - 22632 - 11905: 0x8962, - 22633 - 11905: 0x8963, - 22634 - 11905: 0x8964, - 22635 - 11905: 0xCCEE, - 22636 - 11905: 0xDCAB, - 22637 - 11905: 0x8965, - 22638 - 11905: 0x8966, - 22639 - 11905: 0x8967, - 22640 - 11905: 0x8968, - 22641 - 11905: 0x8969, - 22642 - 11905: 0x896A, - 22643 - 11905: 0x896B, - 22644 - 11905: 0x896C, - 22645 - 11905: 0x896D, - 22646 - 11905: 0x896E, - 22647 - 11905: 0x896F, - 22648 - 11905: 0x8970, - 22649 - 11905: 0x8971, - 22650 - 11905: 0x8972, - 22651 - 11905: 0x8973, - 22652 - 11905: 0x8974, - 22653 - 11905: 0x8975, - 22654 - 11905: 0xDBD3, - 22655 - 11905: 0x8976, - 22656 - 11905: 0xDCAF, - 22657 - 11905: 0xDCAC, - 22658 - 11905: 0x8977, - 22659 - 11905: 0xBEB3, - 22660 - 11905: 0x8978, - 22661 - 11905: 0xCAFB, - 22662 - 11905: 0x8979, - 22663 - 11905: 0x897A, - 22664 - 11905: 0x897B, - 22665 - 11905: 0xDCAD, - 22666 - 11905: 0x897C, - 22667 - 11905: 0x897D, - 22668 - 11905: 0x897E, - 22669 - 11905: 0x8980, - 22670 - 11905: 0x8981, - 22671 - 11905: 0x8982, - 22672 - 11905: 0x8983, - 22673 - 11905: 0x8984, - 22674 - 11905: 0xC9CA, - 22675 - 11905: 0xC4B9, - 22676 - 11905: 0x8985, - 22677 - 11905: 0x8986, - 22678 - 11905: 0x8987, - 22679 - 11905: 0x8988, - 22680 - 11905: 0x8989, - 22681 - 11905: 0xC7BD, - 22682 - 11905: 0xDCAE, - 22683 - 11905: 0x898A, - 22684 - 11905: 0x898B, - 22685 - 11905: 0x898C, - 22686 - 11905: 0xD4F6, - 22687 - 11905: 0xD0E6, - 22688 - 11905: 0x898D, - 22689 - 11905: 0x898E, - 22690 - 11905: 0x898F, - 22691 - 11905: 0x8990, - 22692 - 11905: 0x8991, - 22693 - 11905: 0x8992, - 22694 - 11905: 0x8993, - 22695 - 11905: 0x8994, - 22696 - 11905: 0xC4AB, - 22697 - 11905: 0xB6D5, - 22698 - 11905: 0x8995, - 22699 - 11905: 0x8996, - 22700 - 11905: 0x8997, - 22701 - 11905: 0x8998, - 22702 - 11905: 0x8999, - 22703 - 11905: 0x899A, - 22704 - 11905: 0x899B, - 22705 - 11905: 0x899C, - 22706 - 11905: 0x899D, - 22707 - 11905: 0x899E, - 22708 - 11905: 0x899F, - 22709 - 11905: 0x89A0, - 22710 - 11905: 0x89A1, - 22711 - 11905: 0x89A2, - 22712 - 11905: 0x89A3, - 22713 - 11905: 0x89A4, - 22714 - 11905: 0x89A5, - 22715 - 11905: 0x89A6, - 22716 - 11905: 0xDBD4, - 22717 - 11905: 0x89A7, - 22718 - 11905: 0x89A8, - 22719 - 11905: 0x89A9, - 22720 - 11905: 0x89AA, - 22721 - 11905: 0xB1DA, - 22722 - 11905: 0x89AB, - 22723 - 11905: 0x89AC, - 22724 - 11905: 0x89AD, - 22725 - 11905: 0xDBD5, - 22726 - 11905: 0x89AE, - 22727 - 11905: 0x89AF, - 22728 - 11905: 0x89B0, - 22729 - 11905: 0x89B1, - 22730 - 11905: 0x89B2, - 22731 - 11905: 0x89B3, - 22732 - 11905: 0x89B4, - 22733 - 11905: 0x89B5, - 22734 - 11905: 0x89B6, - 22735 - 11905: 0x89B7, - 22736 - 11905: 0x89B8, - 22737 - 11905: 0xDBD6, - 22738 - 11905: 0x89B9, - 22739 - 11905: 0x89BA, - 22740 - 11905: 0x89BB, - 22741 - 11905: 0xBABE, - 22742 - 11905: 0x89BC, - 22743 - 11905: 0x89BD, - 22744 - 11905: 0x89BE, - 22745 - 11905: 0x89BF, - 22746 - 11905: 0x89C0, - 22747 - 11905: 0x89C1, - 22748 - 11905: 0x89C2, - 22749 - 11905: 0x89C3, - 22750 - 11905: 0x89C4, - 22751 - 11905: 0x89C5, - 22752 - 11905: 0x89C6, - 22753 - 11905: 0x89C7, - 22754 - 11905: 0x89C8, - 22755 - 11905: 0x89C9, - 22756 - 11905: 0xC8C0, - 22757 - 11905: 0x89CA, - 22758 - 11905: 0x89CB, - 22759 - 11905: 0x89CC, - 22760 - 11905: 0x89CD, - 22761 - 11905: 0x89CE, - 22762 - 11905: 0x89CF, - 22763 - 11905: 0xCABF, - 22764 - 11905: 0xC8C9, - 22765 - 11905: 0x89D0, - 22766 - 11905: 0xD7B3, - 22767 - 11905: 0x89D1, - 22768 - 11905: 0xC9F9, - 22769 - 11905: 0x89D2, - 22770 - 11905: 0x89D3, - 22771 - 11905: 0xBFC7, - 22772 - 11905: 0x89D4, - 22773 - 11905: 0x89D5, - 22774 - 11905: 0xBAF8, - 22775 - 11905: 0x89D6, - 22776 - 11905: 0x89D7, - 22777 - 11905: 0xD2BC, - 22778 - 11905: 0x89D8, - 22779 - 11905: 0x89D9, - 22780 - 11905: 0x89DA, - 22781 - 11905: 0x89DB, - 22782 - 11905: 0x89DC, - 22783 - 11905: 0x89DD, - 22784 - 11905: 0x89DE, - 22785 - 11905: 0x89DF, - 22786 - 11905: 0xE2BA, - 22787 - 11905: 0x89E0, - 22788 - 11905: 0xB4A6, - 22789 - 11905: 0x89E1, - 22790 - 11905: 0x89E2, - 22791 - 11905: 0xB1B8, - 22792 - 11905: 0x89E3, - 22793 - 11905: 0x89E4, - 22794 - 11905: 0x89E5, - 22795 - 11905: 0x89E6, - 22796 - 11905: 0x89E7, - 22797 - 11905: 0xB8B4, - 22798 - 11905: 0x89E8, - 22799 - 11905: 0xCFC4, - 22800 - 11905: 0x89E9, - 22801 - 11905: 0x89EA, - 22802 - 11905: 0x89EB, - 22803 - 11905: 0x89EC, - 22804 - 11905: 0xD9E7, - 22805 - 11905: 0xCFA6, - 22806 - 11905: 0xCDE2, - 22807 - 11905: 0x89ED, - 22808 - 11905: 0x89EE, - 22809 - 11905: 0xD9ED, - 22810 - 11905: 0xB6E0, - 22811 - 11905: 0x89EF, - 22812 - 11905: 0xD2B9, - 22813 - 11905: 0x89F0, - 22814 - 11905: 0x89F1, - 22815 - 11905: 0xB9BB, - 22816 - 11905: 0x89F2, - 22817 - 11905: 0x89F3, - 22818 - 11905: 0x89F4, - 22819 - 11905: 0x89F5, - 22820 - 11905: 0xE2B9, - 22821 - 11905: 0xE2B7, - 22822 - 11905: 0x89F6, - 22823 - 11905: 0xB4F3, - 22824 - 11905: 0x89F7, - 22825 - 11905: 0xCCEC, - 22826 - 11905: 0xCCAB, - 22827 - 11905: 0xB7F2, - 22828 - 11905: 0x89F8, - 22829 - 11905: 0xD8B2, - 22830 - 11905: 0xD1EB, - 22831 - 11905: 0xBABB, - 22832 - 11905: 0x89F9, - 22833 - 11905: 0xCAA7, - 22834 - 11905: 0x89FA, - 22835 - 11905: 0x89FB, - 22836 - 11905: 0xCDB7, - 22837 - 11905: 0x89FC, - 22838 - 11905: 0x89FD, - 22839 - 11905: 0xD2C4, - 22840 - 11905: 0xBFE4, - 22841 - 11905: 0xBCD0, - 22842 - 11905: 0xB6E1, - 22843 - 11905: 0x89FE, - 22844 - 11905: 0xDEC5, - 22845 - 11905: 0x8A40, - 22846 - 11905: 0x8A41, - 22847 - 11905: 0x8A42, - 22848 - 11905: 0x8A43, - 22849 - 11905: 0xDEC6, - 22850 - 11905: 0xDBBC, - 22851 - 11905: 0x8A44, - 22852 - 11905: 0xD1D9, - 22853 - 11905: 0x8A45, - 22854 - 11905: 0x8A46, - 22855 - 11905: 0xC6E6, - 22856 - 11905: 0xC4CE, - 22857 - 11905: 0xB7EE, - 22858 - 11905: 0x8A47, - 22859 - 11905: 0xB7DC, - 22860 - 11905: 0x8A48, - 22861 - 11905: 0x8A49, - 22862 - 11905: 0xBFFC, - 22863 - 11905: 0xD7E0, - 22864 - 11905: 0x8A4A, - 22865 - 11905: 0xC6F5, - 22866 - 11905: 0x8A4B, - 22867 - 11905: 0x8A4C, - 22868 - 11905: 0xB1BC, - 22869 - 11905: 0xDEC8, - 22870 - 11905: 0xBDB1, - 22871 - 11905: 0xCCD7, - 22872 - 11905: 0xDECA, - 22873 - 11905: 0x8A4D, - 22874 - 11905: 0xDEC9, - 22875 - 11905: 0x8A4E, - 22876 - 11905: 0x8A4F, - 22877 - 11905: 0x8A50, - 22878 - 11905: 0x8A51, - 22879 - 11905: 0x8A52, - 22880 - 11905: 0xB5EC, - 22881 - 11905: 0x8A53, - 22882 - 11905: 0xC9DD, - 22883 - 11905: 0x8A54, - 22884 - 11905: 0x8A55, - 22885 - 11905: 0xB0C2, - 22886 - 11905: 0x8A56, - 22887 - 11905: 0x8A57, - 22888 - 11905: 0x8A58, - 22889 - 11905: 0x8A59, - 22890 - 11905: 0x8A5A, - 22891 - 11905: 0x8A5B, - 22892 - 11905: 0x8A5C, - 22893 - 11905: 0x8A5D, - 22894 - 11905: 0x8A5E, - 22895 - 11905: 0x8A5F, - 22896 - 11905: 0x8A60, - 22897 - 11905: 0x8A61, - 22898 - 11905: 0x8A62, - 22899 - 11905: 0xC5AE, - 22900 - 11905: 0xC5AB, - 22901 - 11905: 0x8A63, - 22902 - 11905: 0xC4CC, - 22903 - 11905: 0x8A64, - 22904 - 11905: 0xBCE9, - 22905 - 11905: 0xCBFD, - 22906 - 11905: 0x8A65, - 22907 - 11905: 0x8A66, - 22908 - 11905: 0x8A67, - 22909 - 11905: 0xBAC3, - 22910 - 11905: 0x8A68, - 22911 - 11905: 0x8A69, - 22912 - 11905: 0x8A6A, - 22913 - 11905: 0xE5F9, - 22914 - 11905: 0xC8E7, - 22915 - 11905: 0xE5FA, - 22916 - 11905: 0xCDFD, - 22917 - 11905: 0x8A6B, - 22918 - 11905: 0xD7B1, - 22919 - 11905: 0xB8BE, - 22920 - 11905: 0xC2E8, - 22921 - 11905: 0x8A6C, - 22922 - 11905: 0xC8D1, - 22923 - 11905: 0x8A6D, - 22924 - 11905: 0x8A6E, - 22925 - 11905: 0xE5FB, - 22926 - 11905: 0x8A6F, - 22927 - 11905: 0x8A70, - 22928 - 11905: 0x8A71, - 22929 - 11905: 0x8A72, - 22930 - 11905: 0xB6CA, - 22931 - 11905: 0xBCCB, - 22932 - 11905: 0x8A73, - 22933 - 11905: 0x8A74, - 22934 - 11905: 0xD1FD, - 22935 - 11905: 0xE6A1, - 22936 - 11905: 0x8A75, - 22937 - 11905: 0xC3EE, - 22938 - 11905: 0x8A76, - 22939 - 11905: 0x8A77, - 22940 - 11905: 0x8A78, - 22941 - 11905: 0x8A79, - 22942 - 11905: 0xE6A4, - 22943 - 11905: 0x8A7A, - 22944 - 11905: 0x8A7B, - 22945 - 11905: 0x8A7C, - 22946 - 11905: 0x8A7D, - 22947 - 11905: 0xE5FE, - 22948 - 11905: 0xE6A5, - 22949 - 11905: 0xCDD7, - 22950 - 11905: 0x8A7E, - 22951 - 11905: 0x8A80, - 22952 - 11905: 0xB7C1, - 22953 - 11905: 0xE5FC, - 22954 - 11905: 0xE5FD, - 22955 - 11905: 0xE6A3, - 22956 - 11905: 0x8A81, - 22957 - 11905: 0x8A82, - 22958 - 11905: 0xC4DD, - 22959 - 11905: 0xE6A8, - 22960 - 11905: 0x8A83, - 22961 - 11905: 0x8A84, - 22962 - 11905: 0xE6A7, - 22963 - 11905: 0x8A85, - 22964 - 11905: 0x8A86, - 22965 - 11905: 0x8A87, - 22966 - 11905: 0x8A88, - 22967 - 11905: 0x8A89, - 22968 - 11905: 0x8A8A, - 22969 - 11905: 0xC3C3, - 22970 - 11905: 0x8A8B, - 22971 - 11905: 0xC6DE, - 22972 - 11905: 0x8A8C, - 22973 - 11905: 0x8A8D, - 22974 - 11905: 0xE6AA, - 22975 - 11905: 0x8A8E, - 22976 - 11905: 0x8A8F, - 22977 - 11905: 0x8A90, - 22978 - 11905: 0x8A91, - 22979 - 11905: 0x8A92, - 22980 - 11905: 0x8A93, - 22981 - 11905: 0x8A94, - 22982 - 11905: 0xC4B7, - 22983 - 11905: 0x8A95, - 22984 - 11905: 0x8A96, - 22985 - 11905: 0x8A97, - 22986 - 11905: 0xE6A2, - 22987 - 11905: 0xCABC, - 22988 - 11905: 0x8A98, - 22989 - 11905: 0x8A99, - 22990 - 11905: 0x8A9A, - 22991 - 11905: 0x8A9B, - 22992 - 11905: 0xBDE3, - 22993 - 11905: 0xB9C3, - 22994 - 11905: 0xE6A6, - 22995 - 11905: 0xD0D5, - 22996 - 11905: 0xCEAF, - 22997 - 11905: 0x8A9C, - 22998 - 11905: 0x8A9D, - 22999 - 11905: 0xE6A9, - 23000 - 11905: 0xE6B0, - 23001 - 11905: 0x8A9E, - 23002 - 11905: 0xD2A6, - 23003 - 11905: 0x8A9F, - 23004 - 11905: 0xBDAA, - 23005 - 11905: 0xE6AD, - 23006 - 11905: 0x8AA0, - 23007 - 11905: 0x8AA1, - 23008 - 11905: 0x8AA2, - 23009 - 11905: 0x8AA3, - 23010 - 11905: 0x8AA4, - 23011 - 11905: 0xE6AF, - 23012 - 11905: 0x8AA5, - 23013 - 11905: 0xC0D1, - 23014 - 11905: 0x8AA6, - 23015 - 11905: 0x8AA7, - 23016 - 11905: 0xD2CC, - 23017 - 11905: 0x8AA8, - 23018 - 11905: 0x8AA9, - 23019 - 11905: 0x8AAA, - 23020 - 11905: 0xBCA7, - 23021 - 11905: 0x8AAB, - 23022 - 11905: 0x8AAC, - 23023 - 11905: 0x8AAD, - 23024 - 11905: 0x8AAE, - 23025 - 11905: 0x8AAF, - 23026 - 11905: 0x8AB0, - 23027 - 11905: 0x8AB1, - 23028 - 11905: 0x8AB2, - 23029 - 11905: 0x8AB3, - 23030 - 11905: 0x8AB4, - 23031 - 11905: 0x8AB5, - 23032 - 11905: 0x8AB6, - 23033 - 11905: 0xE6B1, - 23034 - 11905: 0x8AB7, - 23035 - 11905: 0xD2F6, - 23036 - 11905: 0x8AB8, - 23037 - 11905: 0x8AB9, - 23038 - 11905: 0x8ABA, - 23039 - 11905: 0xD7CB, - 23040 - 11905: 0x8ABB, - 23041 - 11905: 0xCDFE, - 23042 - 11905: 0x8ABC, - 23043 - 11905: 0xCDDE, - 23044 - 11905: 0xC2A6, - 23045 - 11905: 0xE6AB, - 23046 - 11905: 0xE6AC, - 23047 - 11905: 0xBDBF, - 23048 - 11905: 0xE6AE, - 23049 - 11905: 0xE6B3, - 23050 - 11905: 0x8ABD, - 23051 - 11905: 0x8ABE, - 23052 - 11905: 0xE6B2, - 23053 - 11905: 0x8ABF, - 23054 - 11905: 0x8AC0, - 23055 - 11905: 0x8AC1, - 23056 - 11905: 0x8AC2, - 23057 - 11905: 0xE6B6, - 23058 - 11905: 0x8AC3, - 23059 - 11905: 0xE6B8, - 23060 - 11905: 0x8AC4, - 23061 - 11905: 0x8AC5, - 23062 - 11905: 0x8AC6, - 23063 - 11905: 0x8AC7, - 23064 - 11905: 0xC4EF, - 23065 - 11905: 0x8AC8, - 23066 - 11905: 0x8AC9, - 23067 - 11905: 0x8ACA, - 23068 - 11905: 0xC4C8, - 23069 - 11905: 0x8ACB, - 23070 - 11905: 0x8ACC, - 23071 - 11905: 0xBEEA, - 23072 - 11905: 0xC9EF, - 23073 - 11905: 0x8ACD, - 23074 - 11905: 0x8ACE, - 23075 - 11905: 0xE6B7, - 23076 - 11905: 0x8ACF, - 23077 - 11905: 0xB6F0, - 23078 - 11905: 0x8AD0, - 23079 - 11905: 0x8AD1, - 23080 - 11905: 0x8AD2, - 23081 - 11905: 0xC3E4, - 23082 - 11905: 0x8AD3, - 23083 - 11905: 0x8AD4, - 23084 - 11905: 0x8AD5, - 23085 - 11905: 0x8AD6, - 23086 - 11905: 0x8AD7, - 23087 - 11905: 0x8AD8, - 23088 - 11905: 0x8AD9, - 23089 - 11905: 0xD3E9, - 23090 - 11905: 0xE6B4, - 23091 - 11905: 0x8ADA, - 23092 - 11905: 0xE6B5, - 23093 - 11905: 0x8ADB, - 23094 - 11905: 0xC8A2, - 23095 - 11905: 0x8ADC, - 23096 - 11905: 0x8ADD, - 23097 - 11905: 0x8ADE, - 23098 - 11905: 0x8ADF, - 23099 - 11905: 0x8AE0, - 23100 - 11905: 0xE6BD, - 23101 - 11905: 0x8AE1, - 23102 - 11905: 0x8AE2, - 23103 - 11905: 0x8AE3, - 23104 - 11905: 0xE6B9, - 23105 - 11905: 0x8AE4, - 23106 - 11905: 0x8AE5, - 23107 - 11905: 0x8AE6, - 23108 - 11905: 0x8AE7, - 23109 - 11905: 0x8AE8, - 23110 - 11905: 0xC6C5, - 23111 - 11905: 0x8AE9, - 23112 - 11905: 0x8AEA, - 23113 - 11905: 0xCDF1, - 23114 - 11905: 0xE6BB, - 23115 - 11905: 0x8AEB, - 23116 - 11905: 0x8AEC, - 23117 - 11905: 0x8AED, - 23118 - 11905: 0x8AEE, - 23119 - 11905: 0x8AEF, - 23120 - 11905: 0x8AF0, - 23121 - 11905: 0x8AF1, - 23122 - 11905: 0x8AF2, - 23123 - 11905: 0x8AF3, - 23124 - 11905: 0x8AF4, - 23125 - 11905: 0xE6BC, - 23126 - 11905: 0x8AF5, - 23127 - 11905: 0x8AF6, - 23128 - 11905: 0x8AF7, - 23129 - 11905: 0x8AF8, - 23130 - 11905: 0xBBE9, - 23131 - 11905: 0x8AF9, - 23132 - 11905: 0x8AFA, - 23133 - 11905: 0x8AFB, - 23134 - 11905: 0x8AFC, - 23135 - 11905: 0x8AFD, - 23136 - 11905: 0x8AFE, - 23137 - 11905: 0x8B40, - 23138 - 11905: 0xE6BE, - 23139 - 11905: 0x8B41, - 23140 - 11905: 0x8B42, - 23141 - 11905: 0x8B43, - 23142 - 11905: 0x8B44, - 23143 - 11905: 0xE6BA, - 23144 - 11905: 0x8B45, - 23145 - 11905: 0x8B46, - 23146 - 11905: 0xC0B7, - 23147 - 11905: 0x8B47, - 23148 - 11905: 0x8B48, - 23149 - 11905: 0x8B49, - 23150 - 11905: 0x8B4A, - 23151 - 11905: 0x8B4B, - 23152 - 11905: 0x8B4C, - 23153 - 11905: 0x8B4D, - 23154 - 11905: 0x8B4E, - 23155 - 11905: 0x8B4F, - 23156 - 11905: 0xD3A4, - 23157 - 11905: 0xE6BF, - 23158 - 11905: 0xC9F4, - 23159 - 11905: 0xE6C3, - 23160 - 11905: 0x8B50, - 23161 - 11905: 0x8B51, - 23162 - 11905: 0xE6C4, - 23163 - 11905: 0x8B52, - 23164 - 11905: 0x8B53, - 23165 - 11905: 0x8B54, - 23166 - 11905: 0x8B55, - 23167 - 11905: 0xD0F6, - 23168 - 11905: 0x8B56, - 23169 - 11905: 0x8B57, - 23170 - 11905: 0x8B58, - 23171 - 11905: 0x8B59, - 23172 - 11905: 0x8B5A, - 23173 - 11905: 0x8B5B, - 23174 - 11905: 0x8B5C, - 23175 - 11905: 0x8B5D, - 23176 - 11905: 0x8B5E, - 23177 - 11905: 0x8B5F, - 23178 - 11905: 0x8B60, - 23179 - 11905: 0x8B61, - 23180 - 11905: 0x8B62, - 23181 - 11905: 0x8B63, - 23182 - 11905: 0x8B64, - 23183 - 11905: 0x8B65, - 23184 - 11905: 0x8B66, - 23185 - 11905: 0x8B67, - 23186 - 11905: 0xC3BD, - 23187 - 11905: 0x8B68, - 23188 - 11905: 0x8B69, - 23189 - 11905: 0x8B6A, - 23190 - 11905: 0x8B6B, - 23191 - 11905: 0x8B6C, - 23192 - 11905: 0x8B6D, - 23193 - 11905: 0x8B6E, - 23194 - 11905: 0xC3C4, - 23195 - 11905: 0xE6C2, - 23196 - 11905: 0x8B6F, - 23197 - 11905: 0x8B70, - 23198 - 11905: 0x8B71, - 23199 - 11905: 0x8B72, - 23200 - 11905: 0x8B73, - 23201 - 11905: 0x8B74, - 23202 - 11905: 0x8B75, - 23203 - 11905: 0x8B76, - 23204 - 11905: 0x8B77, - 23205 - 11905: 0x8B78, - 23206 - 11905: 0x8B79, - 23207 - 11905: 0x8B7A, - 23208 - 11905: 0x8B7B, - 23209 - 11905: 0x8B7C, - 23210 - 11905: 0xE6C1, - 23211 - 11905: 0x8B7D, - 23212 - 11905: 0x8B7E, - 23213 - 11905: 0x8B80, - 23214 - 11905: 0x8B81, - 23215 - 11905: 0x8B82, - 23216 - 11905: 0x8B83, - 23217 - 11905: 0x8B84, - 23218 - 11905: 0xE6C7, - 23219 - 11905: 0xCFB1, - 23220 - 11905: 0x8B85, - 23221 - 11905: 0xEBF4, - 23222 - 11905: 0x8B86, - 23223 - 11905: 0x8B87, - 23224 - 11905: 0xE6CA, - 23225 - 11905: 0x8B88, - 23226 - 11905: 0x8B89, - 23227 - 11905: 0x8B8A, - 23228 - 11905: 0x8B8B, - 23229 - 11905: 0x8B8C, - 23230 - 11905: 0xE6C5, - 23231 - 11905: 0x8B8D, - 23232 - 11905: 0x8B8E, - 23233 - 11905: 0xBCDE, - 23234 - 11905: 0xC9A9, - 23235 - 11905: 0x8B8F, - 23236 - 11905: 0x8B90, - 23237 - 11905: 0x8B91, - 23238 - 11905: 0x8B92, - 23239 - 11905: 0x8B93, - 23240 - 11905: 0x8B94, - 23241 - 11905: 0xBCB5, - 23242 - 11905: 0x8B95, - 23243 - 11905: 0x8B96, - 23244 - 11905: 0xCFD3, - 23245 - 11905: 0x8B97, - 23246 - 11905: 0x8B98, - 23247 - 11905: 0x8B99, - 23248 - 11905: 0x8B9A, - 23249 - 11905: 0x8B9B, - 23250 - 11905: 0xE6C8, - 23251 - 11905: 0x8B9C, - 23252 - 11905: 0xE6C9, - 23253 - 11905: 0x8B9D, - 23254 - 11905: 0xE6CE, - 23255 - 11905: 0x8B9E, - 23256 - 11905: 0xE6D0, - 23257 - 11905: 0x8B9F, - 23258 - 11905: 0x8BA0, - 23259 - 11905: 0x8BA1, - 23260 - 11905: 0xE6D1, - 23261 - 11905: 0x8BA2, - 23262 - 11905: 0x8BA3, - 23263 - 11905: 0x8BA4, - 23264 - 11905: 0xE6CB, - 23265 - 11905: 0xB5D5, - 23266 - 11905: 0x8BA5, - 23267 - 11905: 0xE6CC, - 23268 - 11905: 0x8BA6, - 23269 - 11905: 0x8BA7, - 23270 - 11905: 0xE6CF, - 23271 - 11905: 0x8BA8, - 23272 - 11905: 0x8BA9, - 23273 - 11905: 0xC4DB, - 23274 - 11905: 0x8BAA, - 23275 - 11905: 0xE6C6, - 23276 - 11905: 0x8BAB, - 23277 - 11905: 0x8BAC, - 23278 - 11905: 0x8BAD, - 23279 - 11905: 0x8BAE, - 23280 - 11905: 0x8BAF, - 23281 - 11905: 0xE6CD, - 23282 - 11905: 0x8BB0, - 23283 - 11905: 0x8BB1, - 23284 - 11905: 0x8BB2, - 23285 - 11905: 0x8BB3, - 23286 - 11905: 0x8BB4, - 23287 - 11905: 0x8BB5, - 23288 - 11905: 0x8BB6, - 23289 - 11905: 0x8BB7, - 23290 - 11905: 0x8BB8, - 23291 - 11905: 0x8BB9, - 23292 - 11905: 0x8BBA, - 23293 - 11905: 0x8BBB, - 23294 - 11905: 0x8BBC, - 23295 - 11905: 0x8BBD, - 23296 - 11905: 0x8BBE, - 23297 - 11905: 0x8BBF, - 23298 - 11905: 0x8BC0, - 23299 - 11905: 0x8BC1, - 23300 - 11905: 0x8BC2, - 23301 - 11905: 0x8BC3, - 23302 - 11905: 0x8BC4, - 23303 - 11905: 0x8BC5, - 23304 - 11905: 0x8BC6, - 23305 - 11905: 0xE6D2, - 23306 - 11905: 0x8BC7, - 23307 - 11905: 0x8BC8, - 23308 - 11905: 0x8BC9, - 23309 - 11905: 0x8BCA, - 23310 - 11905: 0x8BCB, - 23311 - 11905: 0x8BCC, - 23312 - 11905: 0x8BCD, - 23313 - 11905: 0x8BCE, - 23314 - 11905: 0x8BCF, - 23315 - 11905: 0x8BD0, - 23316 - 11905: 0x8BD1, - 23317 - 11905: 0x8BD2, - 23318 - 11905: 0xE6D4, - 23319 - 11905: 0xE6D3, - 23320 - 11905: 0x8BD3, - 23321 - 11905: 0x8BD4, - 23322 - 11905: 0x8BD5, - 23323 - 11905: 0x8BD6, - 23324 - 11905: 0x8BD7, - 23325 - 11905: 0x8BD8, - 23326 - 11905: 0x8BD9, - 23327 - 11905: 0x8BDA, - 23328 - 11905: 0x8BDB, - 23329 - 11905: 0x8BDC, - 23330 - 11905: 0x8BDD, - 23331 - 11905: 0x8BDE, - 23332 - 11905: 0x8BDF, - 23333 - 11905: 0x8BE0, - 23334 - 11905: 0x8BE1, - 23335 - 11905: 0x8BE2, - 23336 - 11905: 0x8BE3, - 23337 - 11905: 0x8BE4, - 23338 - 11905: 0x8BE5, - 23339 - 11905: 0x8BE6, - 23340 - 11905: 0x8BE7, - 23341 - 11905: 0x8BE8, - 23342 - 11905: 0x8BE9, - 23343 - 11905: 0x8BEA, - 23344 - 11905: 0x8BEB, - 23345 - 11905: 0x8BEC, - 23346 - 11905: 0xE6D5, - 23347 - 11905: 0x8BED, - 23348 - 11905: 0xD9F8, - 23349 - 11905: 0x8BEE, - 23350 - 11905: 0x8BEF, - 23351 - 11905: 0xE6D6, - 23352 - 11905: 0x8BF0, - 23353 - 11905: 0x8BF1, - 23354 - 11905: 0x8BF2, - 23355 - 11905: 0x8BF3, - 23356 - 11905: 0x8BF4, - 23357 - 11905: 0x8BF5, - 23358 - 11905: 0x8BF6, - 23359 - 11905: 0x8BF7, - 23360 - 11905: 0xE6D7, - 23361 - 11905: 0x8BF8, - 23362 - 11905: 0x8BF9, - 23363 - 11905: 0x8BFA, - 23364 - 11905: 0x8BFB, - 23365 - 11905: 0x8BFC, - 23366 - 11905: 0x8BFD, - 23367 - 11905: 0x8BFE, - 23368 - 11905: 0x8C40, - 23369 - 11905: 0x8C41, - 23370 - 11905: 0x8C42, - 23371 - 11905: 0x8C43, - 23372 - 11905: 0x8C44, - 23373 - 11905: 0x8C45, - 23374 - 11905: 0x8C46, - 23375 - 11905: 0x8C47, - 23376 - 11905: 0xD7D3, - 23377 - 11905: 0xE6DD, - 23378 - 11905: 0x8C48, - 23379 - 11905: 0xE6DE, - 23380 - 11905: 0xBFD7, - 23381 - 11905: 0xD4D0, - 23382 - 11905: 0x8C49, - 23383 - 11905: 0xD7D6, - 23384 - 11905: 0xB4E6, - 23385 - 11905: 0xCBEF, - 23386 - 11905: 0xE6DA, - 23387 - 11905: 0xD8C3, - 23388 - 11905: 0xD7CE, - 23389 - 11905: 0xD0A2, - 23390 - 11905: 0x8C4A, - 23391 - 11905: 0xC3CF, - 23392 - 11905: 0x8C4B, - 23393 - 11905: 0x8C4C, - 23394 - 11905: 0xE6DF, - 23395 - 11905: 0xBCBE, - 23396 - 11905: 0xB9C2, - 23397 - 11905: 0xE6DB, - 23398 - 11905: 0xD1A7, - 23399 - 11905: 0x8C4D, - 23400 - 11905: 0x8C4E, - 23401 - 11905: 0xBAA2, - 23402 - 11905: 0xC2CF, - 23403 - 11905: 0x8C4F, - 23404 - 11905: 0xD8AB, - 23405 - 11905: 0x8C50, - 23406 - 11905: 0x8C51, - 23407 - 11905: 0x8C52, - 23408 - 11905: 0xCAEB, - 23409 - 11905: 0xE5EE, - 23410 - 11905: 0x8C53, - 23411 - 11905: 0xE6DC, - 23412 - 11905: 0x8C54, - 23413 - 11905: 0xB7F5, - 23414 - 11905: 0x8C55, - 23415 - 11905: 0x8C56, - 23416 - 11905: 0x8C57, - 23417 - 11905: 0x8C58, - 23418 - 11905: 0xC8E6, - 23419 - 11905: 0x8C59, - 23420 - 11905: 0x8C5A, - 23421 - 11905: 0xC4F5, - 23422 - 11905: 0x8C5B, - 23423 - 11905: 0x8C5C, - 23424 - 11905: 0xE5B2, - 23425 - 11905: 0xC4FE, - 23426 - 11905: 0x8C5D, - 23427 - 11905: 0xCBFC, - 23428 - 11905: 0xE5B3, - 23429 - 11905: 0xD5AC, - 23430 - 11905: 0x8C5E, - 23431 - 11905: 0xD3EE, - 23432 - 11905: 0xCAD8, - 23433 - 11905: 0xB0B2, - 23434 - 11905: 0x8C5F, - 23435 - 11905: 0xCBCE, - 23436 - 11905: 0xCDEA, - 23437 - 11905: 0x8C60, - 23438 - 11905: 0x8C61, - 23439 - 11905: 0xBAEA, - 23440 - 11905: 0x8C62, - 23441 - 11905: 0x8C63, - 23442 - 11905: 0x8C64, - 23443 - 11905: 0xE5B5, - 23444 - 11905: 0x8C65, - 23445 - 11905: 0xE5B4, - 23446 - 11905: 0x8C66, - 23447 - 11905: 0xD7DA, - 23448 - 11905: 0xB9D9, - 23449 - 11905: 0xD6E6, - 23450 - 11905: 0xB6A8, - 23451 - 11905: 0xCDF0, - 23452 - 11905: 0xD2CB, - 23453 - 11905: 0xB1A6, - 23454 - 11905: 0xCAB5, - 23455 - 11905: 0x8C67, - 23456 - 11905: 0xB3E8, - 23457 - 11905: 0xC9F3, - 23458 - 11905: 0xBFCD, - 23459 - 11905: 0xD0FB, - 23460 - 11905: 0xCAD2, - 23461 - 11905: 0xE5B6, - 23462 - 11905: 0xBBC2, - 23463 - 11905: 0x8C68, - 23464 - 11905: 0x8C69, - 23465 - 11905: 0x8C6A, - 23466 - 11905: 0xCFDC, - 23467 - 11905: 0xB9AC, - 23468 - 11905: 0x8C6B, - 23469 - 11905: 0x8C6C, - 23470 - 11905: 0x8C6D, - 23471 - 11905: 0x8C6E, - 23472 - 11905: 0xD4D7, - 23473 - 11905: 0x8C6F, - 23474 - 11905: 0x8C70, - 23475 - 11905: 0xBAA6, - 23476 - 11905: 0xD1E7, - 23477 - 11905: 0xCFFC, - 23478 - 11905: 0xBCD2, - 23479 - 11905: 0x8C71, - 23480 - 11905: 0xE5B7, - 23481 - 11905: 0xC8DD, - 23482 - 11905: 0x8C72, - 23483 - 11905: 0x8C73, - 23484 - 11905: 0x8C74, - 23485 - 11905: 0xBFED, - 23486 - 11905: 0xB1F6, - 23487 - 11905: 0xCBDE, - 23488 - 11905: 0x8C75, - 23489 - 11905: 0x8C76, - 23490 - 11905: 0xBCC5, - 23491 - 11905: 0x8C77, - 23492 - 11905: 0xBCC4, - 23493 - 11905: 0xD2FA, - 23494 - 11905: 0xC3DC, - 23495 - 11905: 0xBFDC, - 23496 - 11905: 0x8C78, - 23497 - 11905: 0x8C79, - 23498 - 11905: 0x8C7A, - 23499 - 11905: 0x8C7B, - 23500 - 11905: 0xB8BB, - 23501 - 11905: 0x8C7C, - 23502 - 11905: 0x8C7D, - 23503 - 11905: 0x8C7E, - 23504 - 11905: 0xC3C2, - 23505 - 11905: 0x8C80, - 23506 - 11905: 0xBAAE, - 23507 - 11905: 0xD4A2, - 23508 - 11905: 0x8C81, - 23509 - 11905: 0x8C82, - 23510 - 11905: 0x8C83, - 23511 - 11905: 0x8C84, - 23512 - 11905: 0x8C85, - 23513 - 11905: 0x8C86, - 23514 - 11905: 0x8C87, - 23515 - 11905: 0x8C88, - 23516 - 11905: 0x8C89, - 23517 - 11905: 0xC7DE, - 23518 - 11905: 0xC4AF, - 23519 - 11905: 0xB2EC, - 23520 - 11905: 0x8C8A, - 23521 - 11905: 0xB9D1, - 23522 - 11905: 0x8C8B, - 23523 - 11905: 0x8C8C, - 23524 - 11905: 0xE5BB, - 23525 - 11905: 0xC1C8, - 23526 - 11905: 0x8C8D, - 23527 - 11905: 0x8C8E, - 23528 - 11905: 0xD5AF, - 23529 - 11905: 0x8C8F, - 23530 - 11905: 0x8C90, - 23531 - 11905: 0x8C91, - 23532 - 11905: 0x8C92, - 23533 - 11905: 0x8C93, - 23534 - 11905: 0xE5BC, - 23535 - 11905: 0x8C94, - 23536 - 11905: 0xE5BE, - 23537 - 11905: 0x8C95, - 23538 - 11905: 0x8C96, - 23539 - 11905: 0x8C97, - 23540 - 11905: 0x8C98, - 23541 - 11905: 0x8C99, - 23542 - 11905: 0x8C9A, - 23543 - 11905: 0x8C9B, - 23544 - 11905: 0xB4E7, - 23545 - 11905: 0xB6D4, - 23546 - 11905: 0xCBC2, - 23547 - 11905: 0xD1B0, - 23548 - 11905: 0xB5BC, - 23549 - 11905: 0x8C9C, - 23550 - 11905: 0x8C9D, - 23551 - 11905: 0xCAD9, - 23552 - 11905: 0x8C9E, - 23553 - 11905: 0xB7E2, - 23554 - 11905: 0x8C9F, - 23555 - 11905: 0x8CA0, - 23556 - 11905: 0xC9E4, - 23557 - 11905: 0x8CA1, - 23558 - 11905: 0xBDAB, - 23559 - 11905: 0x8CA2, - 23560 - 11905: 0x8CA3, - 23561 - 11905: 0xCEBE, - 23562 - 11905: 0xD7F0, - 23563 - 11905: 0x8CA4, - 23564 - 11905: 0x8CA5, - 23565 - 11905: 0x8CA6, - 23566 - 11905: 0x8CA7, - 23567 - 11905: 0xD0A1, - 23568 - 11905: 0x8CA8, - 23569 - 11905: 0xC9D9, - 23570 - 11905: 0x8CA9, - 23571 - 11905: 0x8CAA, - 23572 - 11905: 0xB6FB, - 23573 - 11905: 0xE6D8, - 23574 - 11905: 0xBCE2, - 23575 - 11905: 0x8CAB, - 23576 - 11905: 0xB3BE, - 23577 - 11905: 0x8CAC, - 23578 - 11905: 0xC9D0, - 23579 - 11905: 0x8CAD, - 23580 - 11905: 0xE6D9, - 23581 - 11905: 0xB3A2, - 23582 - 11905: 0x8CAE, - 23583 - 11905: 0x8CAF, - 23584 - 11905: 0x8CB0, - 23585 - 11905: 0x8CB1, - 23586 - 11905: 0xDECC, - 23587 - 11905: 0x8CB2, - 23588 - 11905: 0xD3C8, - 23589 - 11905: 0xDECD, - 23590 - 11905: 0x8CB3, - 23591 - 11905: 0xD2A2, - 23592 - 11905: 0x8CB4, - 23593 - 11905: 0x8CB5, - 23594 - 11905: 0x8CB6, - 23595 - 11905: 0x8CB7, - 23596 - 11905: 0xDECE, - 23597 - 11905: 0x8CB8, - 23598 - 11905: 0x8CB9, - 23599 - 11905: 0x8CBA, - 23600 - 11905: 0x8CBB, - 23601 - 11905: 0xBECD, - 23602 - 11905: 0x8CBC, - 23603 - 11905: 0x8CBD, - 23604 - 11905: 0xDECF, - 23605 - 11905: 0x8CBE, - 23606 - 11905: 0x8CBF, - 23607 - 11905: 0x8CC0, - 23608 - 11905: 0xCAAC, - 23609 - 11905: 0xD2FC, - 23610 - 11905: 0xB3DF, - 23611 - 11905: 0xE5EA, - 23612 - 11905: 0xC4E1, - 23613 - 11905: 0xBEA1, - 23614 - 11905: 0xCEB2, - 23615 - 11905: 0xC4F2, - 23616 - 11905: 0xBED6, - 23617 - 11905: 0xC6A8, - 23618 - 11905: 0xB2E3, - 23619 - 11905: 0x8CC1, - 23620 - 11905: 0x8CC2, - 23621 - 11905: 0xBED3, - 23622 - 11905: 0x8CC3, - 23623 - 11905: 0x8CC4, - 23624 - 11905: 0xC7FC, - 23625 - 11905: 0xCCEB, - 23626 - 11905: 0xBDEC, - 23627 - 11905: 0xCEDD, - 23628 - 11905: 0x8CC5, - 23629 - 11905: 0x8CC6, - 23630 - 11905: 0xCABA, - 23631 - 11905: 0xC6C1, - 23632 - 11905: 0xE5EC, - 23633 - 11905: 0xD0BC, - 23634 - 11905: 0x8CC7, - 23635 - 11905: 0x8CC8, - 23636 - 11905: 0x8CC9, - 23637 - 11905: 0xD5B9, - 23638 - 11905: 0x8CCA, - 23639 - 11905: 0x8CCB, - 23640 - 11905: 0x8CCC, - 23641 - 11905: 0xE5ED, - 23642 - 11905: 0x8CCD, - 23643 - 11905: 0x8CCE, - 23644 - 11905: 0x8CCF, - 23645 - 11905: 0x8CD0, - 23646 - 11905: 0xCAF4, - 23647 - 11905: 0x8CD1, - 23648 - 11905: 0xCDC0, - 23649 - 11905: 0xC2C5, - 23650 - 11905: 0x8CD2, - 23651 - 11905: 0xE5EF, - 23652 - 11905: 0x8CD3, - 23653 - 11905: 0xC2C4, - 23654 - 11905: 0xE5F0, - 23655 - 11905: 0x8CD4, - 23656 - 11905: 0x8CD5, - 23657 - 11905: 0x8CD6, - 23658 - 11905: 0x8CD7, - 23659 - 11905: 0x8CD8, - 23660 - 11905: 0x8CD9, - 23661 - 11905: 0x8CDA, - 23662 - 11905: 0xE5F8, - 23663 - 11905: 0xCDCD, - 23664 - 11905: 0x8CDB, - 23665 - 11905: 0xC9BD, - 23666 - 11905: 0x8CDC, - 23667 - 11905: 0x8CDD, - 23668 - 11905: 0x8CDE, - 23669 - 11905: 0x8CDF, - 23670 - 11905: 0x8CE0, - 23671 - 11905: 0x8CE1, - 23672 - 11905: 0x8CE2, - 23673 - 11905: 0xD2D9, - 23674 - 11905: 0xE1A8, - 23675 - 11905: 0x8CE3, - 23676 - 11905: 0x8CE4, - 23677 - 11905: 0x8CE5, - 23678 - 11905: 0x8CE6, - 23679 - 11905: 0xD3EC, - 23680 - 11905: 0x8CE7, - 23681 - 11905: 0xCBEA, - 23682 - 11905: 0xC6F1, - 23683 - 11905: 0x8CE8, - 23684 - 11905: 0x8CE9, - 23685 - 11905: 0x8CEA, - 23686 - 11905: 0x8CEB, - 23687 - 11905: 0x8CEC, - 23688 - 11905: 0xE1AC, - 23689 - 11905: 0x8CED, - 23690 - 11905: 0x8CEE, - 23691 - 11905: 0x8CEF, - 23692 - 11905: 0xE1A7, - 23693 - 11905: 0xE1A9, - 23694 - 11905: 0x8CF0, - 23695 - 11905: 0x8CF1, - 23696 - 11905: 0xE1AA, - 23697 - 11905: 0xE1AF, - 23698 - 11905: 0x8CF2, - 23699 - 11905: 0x8CF3, - 23700 - 11905: 0xB2ED, - 23701 - 11905: 0x8CF4, - 23702 - 11905: 0xE1AB, - 23703 - 11905: 0xB8DA, - 23704 - 11905: 0xE1AD, - 23705 - 11905: 0xE1AE, - 23706 - 11905: 0xE1B0, - 23707 - 11905: 0xB5BA, - 23708 - 11905: 0xE1B1, - 23709 - 11905: 0x8CF5, - 23710 - 11905: 0x8CF6, - 23711 - 11905: 0x8CF7, - 23712 - 11905: 0x8CF8, - 23713 - 11905: 0x8CF9, - 23714 - 11905: 0xE1B3, - 23715 - 11905: 0xE1B8, - 23716 - 11905: 0x8CFA, - 23717 - 11905: 0x8CFB, - 23718 - 11905: 0x8CFC, - 23719 - 11905: 0x8CFD, - 23720 - 11905: 0x8CFE, - 23721 - 11905: 0xD1D2, - 23722 - 11905: 0x8D40, - 23723 - 11905: 0xE1B6, - 23724 - 11905: 0xE1B5, - 23725 - 11905: 0xC1EB, - 23726 - 11905: 0x8D41, - 23727 - 11905: 0x8D42, - 23728 - 11905: 0x8D43, - 23729 - 11905: 0xE1B7, - 23730 - 11905: 0x8D44, - 23731 - 11905: 0xD4C0, - 23732 - 11905: 0x8D45, - 23733 - 11905: 0xE1B2, - 23734 - 11905: 0x8D46, - 23735 - 11905: 0xE1BA, - 23736 - 11905: 0xB0B6, - 23737 - 11905: 0x8D47, - 23738 - 11905: 0x8D48, - 23739 - 11905: 0x8D49, - 23740 - 11905: 0x8D4A, - 23741 - 11905: 0xE1B4, - 23742 - 11905: 0x8D4B, - 23743 - 11905: 0xBFF9, - 23744 - 11905: 0x8D4C, - 23745 - 11905: 0xE1B9, - 23746 - 11905: 0x8D4D, - 23747 - 11905: 0x8D4E, - 23748 - 11905: 0xE1BB, - 23749 - 11905: 0x8D4F, - 23750 - 11905: 0x8D50, - 23751 - 11905: 0x8D51, - 23752 - 11905: 0x8D52, - 23753 - 11905: 0x8D53, - 23754 - 11905: 0x8D54, - 23755 - 11905: 0xE1BE, - 23756 - 11905: 0x8D55, - 23757 - 11905: 0x8D56, - 23758 - 11905: 0x8D57, - 23759 - 11905: 0x8D58, - 23760 - 11905: 0x8D59, - 23761 - 11905: 0x8D5A, - 23762 - 11905: 0xE1BC, - 23763 - 11905: 0x8D5B, - 23764 - 11905: 0x8D5C, - 23765 - 11905: 0x8D5D, - 23766 - 11905: 0x8D5E, - 23767 - 11905: 0x8D5F, - 23768 - 11905: 0x8D60, - 23769 - 11905: 0xD6C5, - 23770 - 11905: 0x8D61, - 23771 - 11905: 0x8D62, - 23772 - 11905: 0x8D63, - 23773 - 11905: 0x8D64, - 23774 - 11905: 0x8D65, - 23775 - 11905: 0x8D66, - 23776 - 11905: 0x8D67, - 23777 - 11905: 0xCFBF, - 23778 - 11905: 0x8D68, - 23779 - 11905: 0x8D69, - 23780 - 11905: 0xE1BD, - 23781 - 11905: 0xE1BF, - 23782 - 11905: 0xC2CD, - 23783 - 11905: 0x8D6A, - 23784 - 11905: 0xB6EB, - 23785 - 11905: 0x8D6B, - 23786 - 11905: 0xD3F8, - 23787 - 11905: 0x8D6C, - 23788 - 11905: 0x8D6D, - 23789 - 11905: 0xC7CD, - 23790 - 11905: 0x8D6E, - 23791 - 11905: 0x8D6F, - 23792 - 11905: 0xB7E5, - 23793 - 11905: 0x8D70, - 23794 - 11905: 0x8D71, - 23795 - 11905: 0x8D72, - 23796 - 11905: 0x8D73, - 23797 - 11905: 0x8D74, - 23798 - 11905: 0x8D75, - 23799 - 11905: 0x8D76, - 23800 - 11905: 0x8D77, - 23801 - 11905: 0x8D78, - 23802 - 11905: 0x8D79, - 23803 - 11905: 0xBEFE, - 23804 - 11905: 0x8D7A, - 23805 - 11905: 0x8D7B, - 23806 - 11905: 0x8D7C, - 23807 - 11905: 0x8D7D, - 23808 - 11905: 0x8D7E, - 23809 - 11905: 0x8D80, - 23810 - 11905: 0xE1C0, - 23811 - 11905: 0xE1C1, - 23812 - 11905: 0x8D81, - 23813 - 11905: 0x8D82, - 23814 - 11905: 0xE1C7, - 23815 - 11905: 0xB3E7, - 23816 - 11905: 0x8D83, - 23817 - 11905: 0x8D84, - 23818 - 11905: 0x8D85, - 23819 - 11905: 0x8D86, - 23820 - 11905: 0x8D87, - 23821 - 11905: 0x8D88, - 23822 - 11905: 0xC6E9, - 23823 - 11905: 0x8D89, - 23824 - 11905: 0x8D8A, - 23825 - 11905: 0x8D8B, - 23826 - 11905: 0x8D8C, - 23827 - 11905: 0x8D8D, - 23828 - 11905: 0xB4DE, - 23829 - 11905: 0x8D8E, - 23830 - 11905: 0xD1C2, - 23831 - 11905: 0x8D8F, - 23832 - 11905: 0x8D90, - 23833 - 11905: 0x8D91, - 23834 - 11905: 0x8D92, - 23835 - 11905: 0xE1C8, - 23836 - 11905: 0x8D93, - 23837 - 11905: 0x8D94, - 23838 - 11905: 0xE1C6, - 23839 - 11905: 0x8D95, - 23840 - 11905: 0x8D96, - 23841 - 11905: 0x8D97, - 23842 - 11905: 0x8D98, - 23843 - 11905: 0x8D99, - 23844 - 11905: 0xE1C5, - 23845 - 11905: 0x8D9A, - 23846 - 11905: 0xE1C3, - 23847 - 11905: 0xE1C2, - 23848 - 11905: 0x8D9B, - 23849 - 11905: 0xB1C0, - 23850 - 11905: 0x8D9C, - 23851 - 11905: 0x8D9D, - 23852 - 11905: 0x8D9E, - 23853 - 11905: 0xD5B8, - 23854 - 11905: 0xE1C4, - 23855 - 11905: 0x8D9F, - 23856 - 11905: 0x8DA0, - 23857 - 11905: 0x8DA1, - 23858 - 11905: 0x8DA2, - 23859 - 11905: 0x8DA3, - 23860 - 11905: 0xE1CB, - 23861 - 11905: 0x8DA4, - 23862 - 11905: 0x8DA5, - 23863 - 11905: 0x8DA6, - 23864 - 11905: 0x8DA7, - 23865 - 11905: 0x8DA8, - 23866 - 11905: 0x8DA9, - 23867 - 11905: 0x8DAA, - 23868 - 11905: 0x8DAB, - 23869 - 11905: 0xE1CC, - 23870 - 11905: 0xE1CA, - 23871 - 11905: 0x8DAC, - 23872 - 11905: 0x8DAD, - 23873 - 11905: 0x8DAE, - 23874 - 11905: 0x8DAF, - 23875 - 11905: 0x8DB0, - 23876 - 11905: 0x8DB1, - 23877 - 11905: 0x8DB2, - 23878 - 11905: 0x8DB3, - 23879 - 11905: 0xEFFA, - 23880 - 11905: 0x8DB4, - 23881 - 11905: 0x8DB5, - 23882 - 11905: 0xE1D3, - 23883 - 11905: 0xE1D2, - 23884 - 11905: 0xC7B6, - 23885 - 11905: 0x8DB6, - 23886 - 11905: 0x8DB7, - 23887 - 11905: 0x8DB8, - 23888 - 11905: 0x8DB9, - 23889 - 11905: 0x8DBA, - 23890 - 11905: 0x8DBB, - 23891 - 11905: 0x8DBC, - 23892 - 11905: 0x8DBD, - 23893 - 11905: 0x8DBE, - 23894 - 11905: 0x8DBF, - 23895 - 11905: 0x8DC0, - 23896 - 11905: 0xE1C9, - 23897 - 11905: 0x8DC1, - 23898 - 11905: 0x8DC2, - 23899 - 11905: 0xE1CE, - 23900 - 11905: 0x8DC3, - 23901 - 11905: 0xE1D0, - 23902 - 11905: 0x8DC4, - 23903 - 11905: 0x8DC5, - 23904 - 11905: 0x8DC6, - 23905 - 11905: 0x8DC7, - 23906 - 11905: 0x8DC8, - 23907 - 11905: 0x8DC9, - 23908 - 11905: 0x8DCA, - 23909 - 11905: 0x8DCB, - 23910 - 11905: 0x8DCC, - 23911 - 11905: 0x8DCD, - 23912 - 11905: 0x8DCE, - 23913 - 11905: 0xE1D4, - 23914 - 11905: 0x8DCF, - 23915 - 11905: 0xE1D1, - 23916 - 11905: 0xE1CD, - 23917 - 11905: 0x8DD0, - 23918 - 11905: 0x8DD1, - 23919 - 11905: 0xE1CF, - 23920 - 11905: 0x8DD2, - 23921 - 11905: 0x8DD3, - 23922 - 11905: 0x8DD4, - 23923 - 11905: 0x8DD5, - 23924 - 11905: 0xE1D5, - 23925 - 11905: 0x8DD6, - 23926 - 11905: 0x8DD7, - 23927 - 11905: 0x8DD8, - 23928 - 11905: 0x8DD9, - 23929 - 11905: 0x8DDA, - 23930 - 11905: 0x8DDB, - 23931 - 11905: 0x8DDC, - 23932 - 11905: 0x8DDD, - 23933 - 11905: 0x8DDE, - 23934 - 11905: 0x8DDF, - 23935 - 11905: 0x8DE0, - 23936 - 11905: 0x8DE1, - 23937 - 11905: 0x8DE2, - 23938 - 11905: 0xE1D6, - 23939 - 11905: 0x8DE3, - 23940 - 11905: 0x8DE4, - 23941 - 11905: 0x8DE5, - 23942 - 11905: 0x8DE6, - 23943 - 11905: 0x8DE7, - 23944 - 11905: 0x8DE8, - 23945 - 11905: 0x8DE9, - 23946 - 11905: 0x8DEA, - 23947 - 11905: 0x8DEB, - 23948 - 11905: 0x8DEC, - 23949 - 11905: 0x8DED, - 23950 - 11905: 0x8DEE, - 23951 - 11905: 0x8DEF, - 23952 - 11905: 0x8DF0, - 23953 - 11905: 0x8DF1, - 23954 - 11905: 0x8DF2, - 23955 - 11905: 0x8DF3, - 23956 - 11905: 0x8DF4, - 23957 - 11905: 0x8DF5, - 23958 - 11905: 0x8DF6, - 23959 - 11905: 0x8DF7, - 23960 - 11905: 0x8DF8, - 23961 - 11905: 0xE1D7, - 23962 - 11905: 0x8DF9, - 23963 - 11905: 0x8DFA, - 23964 - 11905: 0x8DFB, - 23965 - 11905: 0xE1D8, - 23966 - 11905: 0x8DFC, - 23967 - 11905: 0x8DFD, - 23968 - 11905: 0x8DFE, - 23969 - 11905: 0x8E40, - 23970 - 11905: 0x8E41, - 23971 - 11905: 0x8E42, - 23972 - 11905: 0x8E43, - 23973 - 11905: 0x8E44, - 23974 - 11905: 0x8E45, - 23975 - 11905: 0x8E46, - 23976 - 11905: 0x8E47, - 23977 - 11905: 0x8E48, - 23978 - 11905: 0x8E49, - 23979 - 11905: 0x8E4A, - 23980 - 11905: 0x8E4B, - 23981 - 11905: 0x8E4C, - 23982 - 11905: 0x8E4D, - 23983 - 11905: 0x8E4E, - 23984 - 11905: 0x8E4F, - 23985 - 11905: 0x8E50, - 23986 - 11905: 0x8E51, - 23987 - 11905: 0x8E52, - 23988 - 11905: 0x8E53, - 23989 - 11905: 0x8E54, - 23990 - 11905: 0x8E55, - 23991 - 11905: 0xE1DA, - 23992 - 11905: 0x8E56, - 23993 - 11905: 0x8E57, - 23994 - 11905: 0x8E58, - 23995 - 11905: 0x8E59, - 23996 - 11905: 0x8E5A, - 23997 - 11905: 0x8E5B, - 23998 - 11905: 0x8E5C, - 23999 - 11905: 0x8E5D, - 24000 - 11905: 0x8E5E, - 24001 - 11905: 0x8E5F, - 24002 - 11905: 0x8E60, - 24003 - 11905: 0x8E61, - 24004 - 11905: 0x8E62, - 24005 - 11905: 0xE1DB, - 24006 - 11905: 0x8E63, - 24007 - 11905: 0x8E64, - 24008 - 11905: 0x8E65, - 24009 - 11905: 0x8E66, - 24010 - 11905: 0x8E67, - 24011 - 11905: 0x8E68, - 24012 - 11905: 0x8E69, - 24013 - 11905: 0xCEA1, - 24014 - 11905: 0x8E6A, - 24015 - 11905: 0x8E6B, - 24016 - 11905: 0x8E6C, - 24017 - 11905: 0x8E6D, - 24018 - 11905: 0x8E6E, - 24019 - 11905: 0x8E6F, - 24020 - 11905: 0x8E70, - 24021 - 11905: 0x8E71, - 24022 - 11905: 0x8E72, - 24023 - 11905: 0x8E73, - 24024 - 11905: 0x8E74, - 24025 - 11905: 0x8E75, - 24026 - 11905: 0x8E76, - 24027 - 11905: 0xE7DD, - 24028 - 11905: 0x8E77, - 24029 - 11905: 0xB4A8, - 24030 - 11905: 0xD6DD, - 24031 - 11905: 0x8E78, - 24032 - 11905: 0x8E79, - 24033 - 11905: 0xD1B2, - 24034 - 11905: 0xB3B2, - 24035 - 11905: 0x8E7A, - 24036 - 11905: 0x8E7B, - 24037 - 11905: 0xB9A4, - 24038 - 11905: 0xD7F3, - 24039 - 11905: 0xC7C9, - 24040 - 11905: 0xBEDE, - 24041 - 11905: 0xB9AE, - 24042 - 11905: 0x8E7C, - 24043 - 11905: 0xCED7, - 24044 - 11905: 0x8E7D, - 24045 - 11905: 0x8E7E, - 24046 - 11905: 0xB2EE, - 24047 - 11905: 0xDBCF, - 24048 - 11905: 0x8E80, - 24049 - 11905: 0xBCBA, - 24050 - 11905: 0xD2D1, - 24051 - 11905: 0xCBC8, - 24052 - 11905: 0xB0CD, - 24053 - 11905: 0x8E81, - 24054 - 11905: 0x8E82, - 24055 - 11905: 0xCFEF, - 24056 - 11905: 0x8E83, - 24057 - 11905: 0x8E84, - 24058 - 11905: 0x8E85, - 24059 - 11905: 0x8E86, - 24060 - 11905: 0x8E87, - 24061 - 11905: 0xD9E3, - 24062 - 11905: 0xBDED, - 24063 - 11905: 0x8E88, - 24064 - 11905: 0x8E89, - 24065 - 11905: 0xB1D2, - 24066 - 11905: 0xCAD0, - 24067 - 11905: 0xB2BC, - 24068 - 11905: 0x8E8A, - 24069 - 11905: 0xCBA7, - 24070 - 11905: 0xB7AB, - 24071 - 11905: 0x8E8B, - 24072 - 11905: 0xCAA6, - 24073 - 11905: 0x8E8C, - 24074 - 11905: 0x8E8D, - 24075 - 11905: 0x8E8E, - 24076 - 11905: 0xCFA3, - 24077 - 11905: 0x8E8F, - 24078 - 11905: 0x8E90, - 24079 - 11905: 0xE0F8, - 24080 - 11905: 0xD5CA, - 24081 - 11905: 0xE0FB, - 24082 - 11905: 0x8E91, - 24083 - 11905: 0x8E92, - 24084 - 11905: 0xE0FA, - 24085 - 11905: 0xC5C1, - 24086 - 11905: 0xCCFB, - 24087 - 11905: 0x8E93, - 24088 - 11905: 0xC1B1, - 24089 - 11905: 0xE0F9, - 24090 - 11905: 0xD6E3, - 24091 - 11905: 0xB2AF, - 24092 - 11905: 0xD6C4, - 24093 - 11905: 0xB5DB, - 24094 - 11905: 0x8E94, - 24095 - 11905: 0x8E95, - 24096 - 11905: 0x8E96, - 24097 - 11905: 0x8E97, - 24098 - 11905: 0x8E98, - 24099 - 11905: 0x8E99, - 24100 - 11905: 0x8E9A, - 24101 - 11905: 0x8E9B, - 24102 - 11905: 0xB4F8, - 24103 - 11905: 0xD6A1, - 24104 - 11905: 0x8E9C, - 24105 - 11905: 0x8E9D, - 24106 - 11905: 0x8E9E, - 24107 - 11905: 0x8E9F, - 24108 - 11905: 0x8EA0, - 24109 - 11905: 0xCFAF, - 24110 - 11905: 0xB0EF, - 24111 - 11905: 0x8EA1, - 24112 - 11905: 0x8EA2, - 24113 - 11905: 0xE0FC, - 24114 - 11905: 0x8EA3, - 24115 - 11905: 0x8EA4, - 24116 - 11905: 0x8EA5, - 24117 - 11905: 0x8EA6, - 24118 - 11905: 0x8EA7, - 24119 - 11905: 0xE1A1, - 24120 - 11905: 0xB3A3, - 24121 - 11905: 0x8EA8, - 24122 - 11905: 0x8EA9, - 24123 - 11905: 0xE0FD, - 24124 - 11905: 0xE0FE, - 24125 - 11905: 0xC3B1, - 24126 - 11905: 0x8EAA, - 24127 - 11905: 0x8EAB, - 24128 - 11905: 0x8EAC, - 24129 - 11905: 0x8EAD, - 24130 - 11905: 0xC3DD, - 24131 - 11905: 0x8EAE, - 24132 - 11905: 0xE1A2, - 24133 - 11905: 0xB7F9, - 24134 - 11905: 0x8EAF, - 24135 - 11905: 0x8EB0, - 24136 - 11905: 0x8EB1, - 24137 - 11905: 0x8EB2, - 24138 - 11905: 0x8EB3, - 24139 - 11905: 0x8EB4, - 24140 - 11905: 0xBBCF, - 24141 - 11905: 0x8EB5, - 24142 - 11905: 0x8EB6, - 24143 - 11905: 0x8EB7, - 24144 - 11905: 0x8EB8, - 24145 - 11905: 0x8EB9, - 24146 - 11905: 0x8EBA, - 24147 - 11905: 0x8EBB, - 24148 - 11905: 0xE1A3, - 24149 - 11905: 0xC4BB, - 24150 - 11905: 0x8EBC, - 24151 - 11905: 0x8EBD, - 24152 - 11905: 0x8EBE, - 24153 - 11905: 0x8EBF, - 24154 - 11905: 0x8EC0, - 24155 - 11905: 0xE1A4, - 24156 - 11905: 0x8EC1, - 24157 - 11905: 0x8EC2, - 24158 - 11905: 0xE1A5, - 24159 - 11905: 0x8EC3, - 24160 - 11905: 0x8EC4, - 24161 - 11905: 0xE1A6, - 24162 - 11905: 0xB4B1, - 24163 - 11905: 0x8EC5, - 24164 - 11905: 0x8EC6, - 24165 - 11905: 0x8EC7, - 24166 - 11905: 0x8EC8, - 24167 - 11905: 0x8EC9, - 24168 - 11905: 0x8ECA, - 24169 - 11905: 0x8ECB, - 24170 - 11905: 0x8ECC, - 24171 - 11905: 0x8ECD, - 24172 - 11905: 0x8ECE, - 24173 - 11905: 0x8ECF, - 24174 - 11905: 0x8ED0, - 24175 - 11905: 0x8ED1, - 24176 - 11905: 0x8ED2, - 24177 - 11905: 0x8ED3, - 24178 - 11905: 0xB8C9, - 24179 - 11905: 0xC6BD, - 24180 - 11905: 0xC4EA, - 24181 - 11905: 0x8ED4, - 24182 - 11905: 0xB2A2, - 24183 - 11905: 0x8ED5, - 24184 - 11905: 0xD0D2, - 24185 - 11905: 0x8ED6, - 24186 - 11905: 0xE7DB, - 24187 - 11905: 0xBBC3, - 24188 - 11905: 0xD3D7, - 24189 - 11905: 0xD3C4, - 24190 - 11905: 0x8ED7, - 24191 - 11905: 0xB9E3, - 24192 - 11905: 0xE2CF, - 24193 - 11905: 0x8ED8, - 24194 - 11905: 0x8ED9, - 24195 - 11905: 0x8EDA, - 24196 - 11905: 0xD7AF, - 24197 - 11905: 0x8EDB, - 24198 - 11905: 0xC7EC, - 24199 - 11905: 0xB1D3, - 24200 - 11905: 0x8EDC, - 24201 - 11905: 0x8EDD, - 24202 - 11905: 0xB4B2, - 24203 - 11905: 0xE2D1, - 24204 - 11905: 0x8EDE, - 24205 - 11905: 0x8EDF, - 24206 - 11905: 0x8EE0, - 24207 - 11905: 0xD0F2, - 24208 - 11905: 0xC2AE, - 24209 - 11905: 0xE2D0, - 24210 - 11905: 0x8EE1, - 24211 - 11905: 0xBFE2, - 24212 - 11905: 0xD3A6, - 24213 - 11905: 0xB5D7, - 24214 - 11905: 0xE2D2, - 24215 - 11905: 0xB5EA, - 24216 - 11905: 0x8EE2, - 24217 - 11905: 0xC3ED, - 24218 - 11905: 0xB8FD, - 24219 - 11905: 0x8EE3, - 24220 - 11905: 0xB8AE, - 24221 - 11905: 0x8EE4, - 24222 - 11905: 0xC5D3, - 24223 - 11905: 0xB7CF, - 24224 - 11905: 0xE2D4, - 24225 - 11905: 0x8EE5, - 24226 - 11905: 0x8EE6, - 24227 - 11905: 0x8EE7, - 24228 - 11905: 0x8EE8, - 24229 - 11905: 0xE2D3, - 24230 - 11905: 0xB6C8, - 24231 - 11905: 0xD7F9, - 24232 - 11905: 0x8EE9, - 24233 - 11905: 0x8EEA, - 24234 - 11905: 0x8EEB, - 24235 - 11905: 0x8EEC, - 24236 - 11905: 0x8EED, - 24237 - 11905: 0xCDA5, - 24238 - 11905: 0x8EEE, - 24239 - 11905: 0x8EEF, - 24240 - 11905: 0x8EF0, - 24241 - 11905: 0x8EF1, - 24242 - 11905: 0x8EF2, - 24243 - 11905: 0xE2D8, - 24244 - 11905: 0x8EF3, - 24245 - 11905: 0xE2D6, - 24246 - 11905: 0xCAFC, - 24247 - 11905: 0xBFB5, - 24248 - 11905: 0xD3B9, - 24249 - 11905: 0xE2D5, - 24250 - 11905: 0x8EF4, - 24251 - 11905: 0x8EF5, - 24252 - 11905: 0x8EF6, - 24253 - 11905: 0x8EF7, - 24254 - 11905: 0xE2D7, - 24255 - 11905: 0x8EF8, - 24256 - 11905: 0x8EF9, - 24257 - 11905: 0x8EFA, - 24258 - 11905: 0x8EFB, - 24259 - 11905: 0x8EFC, - 24260 - 11905: 0x8EFD, - 24261 - 11905: 0x8EFE, - 24262 - 11905: 0x8F40, - 24263 - 11905: 0x8F41, - 24264 - 11905: 0x8F42, - 24265 - 11905: 0xC1AE, - 24266 - 11905: 0xC0C8, - 24267 - 11905: 0x8F43, - 24268 - 11905: 0x8F44, - 24269 - 11905: 0x8F45, - 24270 - 11905: 0x8F46, - 24271 - 11905: 0x8F47, - 24272 - 11905: 0x8F48, - 24273 - 11905: 0xE2DB, - 24274 - 11905: 0xE2DA, - 24275 - 11905: 0xC0AA, - 24276 - 11905: 0x8F49, - 24277 - 11905: 0x8F4A, - 24278 - 11905: 0xC1CE, - 24279 - 11905: 0x8F4B, - 24280 - 11905: 0x8F4C, - 24281 - 11905: 0x8F4D, - 24282 - 11905: 0x8F4E, - 24283 - 11905: 0xE2DC, - 24284 - 11905: 0x8F4F, - 24285 - 11905: 0x8F50, - 24286 - 11905: 0x8F51, - 24287 - 11905: 0x8F52, - 24288 - 11905: 0x8F53, - 24289 - 11905: 0x8F54, - 24290 - 11905: 0x8F55, - 24291 - 11905: 0x8F56, - 24292 - 11905: 0x8F57, - 24293 - 11905: 0x8F58, - 24294 - 11905: 0x8F59, - 24295 - 11905: 0x8F5A, - 24296 - 11905: 0xE2DD, - 24297 - 11905: 0x8F5B, - 24298 - 11905: 0xE2DE, - 24299 - 11905: 0x8F5C, - 24300 - 11905: 0x8F5D, - 24301 - 11905: 0x8F5E, - 24302 - 11905: 0x8F5F, - 24303 - 11905: 0x8F60, - 24304 - 11905: 0x8F61, - 24305 - 11905: 0x8F62, - 24306 - 11905: 0x8F63, - 24307 - 11905: 0x8F64, - 24308 - 11905: 0xDBC8, - 24309 - 11905: 0x8F65, - 24310 - 11905: 0xD1D3, - 24311 - 11905: 0xCDA2, - 24312 - 11905: 0x8F66, - 24313 - 11905: 0x8F67, - 24314 - 11905: 0xBDA8, - 24315 - 11905: 0x8F68, - 24316 - 11905: 0x8F69, - 24317 - 11905: 0x8F6A, - 24318 - 11905: 0xDEC3, - 24319 - 11905: 0xD8A5, - 24320 - 11905: 0xBFAA, - 24321 - 11905: 0xDBCD, - 24322 - 11905: 0xD2EC, - 24323 - 11905: 0xC6FA, - 24324 - 11905: 0xC5AA, - 24325 - 11905: 0x8F6B, - 24326 - 11905: 0x8F6C, - 24327 - 11905: 0x8F6D, - 24328 - 11905: 0xDEC4, - 24329 - 11905: 0x8F6E, - 24330 - 11905: 0xB1D7, - 24331 - 11905: 0xDFAE, - 24332 - 11905: 0x8F6F, - 24333 - 11905: 0x8F70, - 24334 - 11905: 0x8F71, - 24335 - 11905: 0xCABD, - 24336 - 11905: 0x8F72, - 24337 - 11905: 0xDFB1, - 24338 - 11905: 0x8F73, - 24339 - 11905: 0xB9AD, - 24340 - 11905: 0x8F74, - 24341 - 11905: 0xD2FD, - 24342 - 11905: 0x8F75, - 24343 - 11905: 0xB8A5, - 24344 - 11905: 0xBAEB, - 24345 - 11905: 0x8F76, - 24346 - 11905: 0x8F77, - 24347 - 11905: 0xB3DA, - 24348 - 11905: 0x8F78, - 24349 - 11905: 0x8F79, - 24350 - 11905: 0x8F7A, - 24351 - 11905: 0xB5DC, - 24352 - 11905: 0xD5C5, - 24353 - 11905: 0x8F7B, - 24354 - 11905: 0x8F7C, - 24355 - 11905: 0x8F7D, - 24356 - 11905: 0x8F7E, - 24357 - 11905: 0xC3D6, - 24358 - 11905: 0xCFD2, - 24359 - 11905: 0xBBA1, - 24360 - 11905: 0x8F80, - 24361 - 11905: 0xE5F3, - 24362 - 11905: 0xE5F2, - 24363 - 11905: 0x8F81, - 24364 - 11905: 0x8F82, - 24365 - 11905: 0xE5F4, - 24366 - 11905: 0x8F83, - 24367 - 11905: 0xCDE4, - 24368 - 11905: 0x8F84, - 24369 - 11905: 0xC8F5, - 24370 - 11905: 0x8F85, - 24371 - 11905: 0x8F86, - 24372 - 11905: 0x8F87, - 24373 - 11905: 0x8F88, - 24374 - 11905: 0x8F89, - 24375 - 11905: 0x8F8A, - 24376 - 11905: 0x8F8B, - 24377 - 11905: 0xB5AF, - 24378 - 11905: 0xC7BF, - 24379 - 11905: 0x8F8C, - 24380 - 11905: 0xE5F6, - 24381 - 11905: 0x8F8D, - 24382 - 11905: 0x8F8E, - 24383 - 11905: 0x8F8F, - 24384 - 11905: 0xECB0, - 24385 - 11905: 0x8F90, - 24386 - 11905: 0x8F91, - 24387 - 11905: 0x8F92, - 24388 - 11905: 0x8F93, - 24389 - 11905: 0x8F94, - 24390 - 11905: 0x8F95, - 24391 - 11905: 0x8F96, - 24392 - 11905: 0x8F97, - 24393 - 11905: 0x8F98, - 24394 - 11905: 0x8F99, - 24395 - 11905: 0x8F9A, - 24396 - 11905: 0x8F9B, - 24397 - 11905: 0x8F9C, - 24398 - 11905: 0x8F9D, - 24399 - 11905: 0x8F9E, - 24400 - 11905: 0xE5E6, - 24401 - 11905: 0x8F9F, - 24402 - 11905: 0xB9E9, - 24403 - 11905: 0xB5B1, - 24404 - 11905: 0x8FA0, - 24405 - 11905: 0xC2BC, - 24406 - 11905: 0xE5E8, - 24407 - 11905: 0xE5E7, - 24408 - 11905: 0xE5E9, - 24409 - 11905: 0x8FA1, - 24410 - 11905: 0x8FA2, - 24411 - 11905: 0x8FA3, - 24412 - 11905: 0x8FA4, - 24413 - 11905: 0xD2CD, - 24414 - 11905: 0x8FA5, - 24415 - 11905: 0x8FA6, - 24416 - 11905: 0x8FA7, - 24417 - 11905: 0xE1EA, - 24418 - 11905: 0xD0CE, - 24419 - 11905: 0x8FA8, - 24420 - 11905: 0xCDAE, - 24421 - 11905: 0x8FA9, - 24422 - 11905: 0xD1E5, - 24423 - 11905: 0x8FAA, - 24424 - 11905: 0x8FAB, - 24425 - 11905: 0xB2CA, - 24426 - 11905: 0xB1EB, - 24427 - 11905: 0x8FAC, - 24428 - 11905: 0xB1F2, - 24429 - 11905: 0xC5ED, - 24430 - 11905: 0x8FAD, - 24431 - 11905: 0x8FAE, - 24432 - 11905: 0xD5C3, - 24433 - 11905: 0xD3B0, - 24434 - 11905: 0x8FAF, - 24435 - 11905: 0xE1DC, - 24436 - 11905: 0x8FB0, - 24437 - 11905: 0x8FB1, - 24438 - 11905: 0x8FB2, - 24439 - 11905: 0xE1DD, - 24440 - 11905: 0x8FB3, - 24441 - 11905: 0xD2DB, - 24442 - 11905: 0x8FB4, - 24443 - 11905: 0xB3B9, - 24444 - 11905: 0xB1CB, - 24445 - 11905: 0x8FB5, - 24446 - 11905: 0x8FB6, - 24447 - 11905: 0x8FB7, - 24448 - 11905: 0xCDF9, - 24449 - 11905: 0xD5F7, - 24450 - 11905: 0xE1DE, - 24451 - 11905: 0x8FB8, - 24452 - 11905: 0xBEB6, - 24453 - 11905: 0xB4FD, - 24454 - 11905: 0x8FB9, - 24455 - 11905: 0xE1DF, - 24456 - 11905: 0xBADC, - 24457 - 11905: 0xE1E0, - 24458 - 11905: 0xBBB2, - 24459 - 11905: 0xC2C9, - 24460 - 11905: 0xE1E1, - 24461 - 11905: 0x8FBA, - 24462 - 11905: 0x8FBB, - 24463 - 11905: 0x8FBC, - 24464 - 11905: 0xD0EC, - 24465 - 11905: 0x8FBD, - 24466 - 11905: 0xCDBD, - 24467 - 11905: 0x8FBE, - 24468 - 11905: 0x8FBF, - 24469 - 11905: 0xE1E2, - 24470 - 11905: 0x8FC0, - 24471 - 11905: 0xB5C3, - 24472 - 11905: 0xC5C7, - 24473 - 11905: 0xE1E3, - 24474 - 11905: 0x8FC1, - 24475 - 11905: 0x8FC2, - 24476 - 11905: 0xE1E4, - 24477 - 11905: 0x8FC3, - 24478 - 11905: 0x8FC4, - 24479 - 11905: 0x8FC5, - 24480 - 11905: 0x8FC6, - 24481 - 11905: 0xD3F9, - 24482 - 11905: 0x8FC7, - 24483 - 11905: 0x8FC8, - 24484 - 11905: 0x8FC9, - 24485 - 11905: 0x8FCA, - 24486 - 11905: 0x8FCB, - 24487 - 11905: 0x8FCC, - 24488 - 11905: 0xE1E5, - 24489 - 11905: 0x8FCD, - 24490 - 11905: 0xD1AD, - 24491 - 11905: 0x8FCE, - 24492 - 11905: 0x8FCF, - 24493 - 11905: 0xE1E6, - 24494 - 11905: 0xCEA2, - 24495 - 11905: 0x8FD0, - 24496 - 11905: 0x8FD1, - 24497 - 11905: 0x8FD2, - 24498 - 11905: 0x8FD3, - 24499 - 11905: 0x8FD4, - 24500 - 11905: 0x8FD5, - 24501 - 11905: 0xE1E7, - 24502 - 11905: 0x8FD6, - 24503 - 11905: 0xB5C2, - 24504 - 11905: 0x8FD7, - 24505 - 11905: 0x8FD8, - 24506 - 11905: 0x8FD9, - 24507 - 11905: 0x8FDA, - 24508 - 11905: 0xE1E8, - 24509 - 11905: 0xBBD5, - 24510 - 11905: 0x8FDB, - 24511 - 11905: 0x8FDC, - 24512 - 11905: 0x8FDD, - 24513 - 11905: 0x8FDE, - 24514 - 11905: 0x8FDF, - 24515 - 11905: 0xD0C4, - 24516 - 11905: 0xE2E0, - 24517 - 11905: 0xB1D8, - 24518 - 11905: 0xD2E4, - 24519 - 11905: 0x8FE0, - 24520 - 11905: 0x8FE1, - 24521 - 11905: 0xE2E1, - 24522 - 11905: 0x8FE2, - 24523 - 11905: 0x8FE3, - 24524 - 11905: 0xBCC9, - 24525 - 11905: 0xC8CC, - 24526 - 11905: 0x8FE4, - 24527 - 11905: 0xE2E3, - 24528 - 11905: 0xECFE, - 24529 - 11905: 0xECFD, - 24530 - 11905: 0xDFAF, - 24531 - 11905: 0x8FE5, - 24532 - 11905: 0x8FE6, - 24533 - 11905: 0x8FE7, - 24534 - 11905: 0xE2E2, - 24535 - 11905: 0xD6BE, - 24536 - 11905: 0xCDFC, - 24537 - 11905: 0xC3A6, - 24538 - 11905: 0x8FE8, - 24539 - 11905: 0x8FE9, - 24540 - 11905: 0x8FEA, - 24541 - 11905: 0xE3C3, - 24542 - 11905: 0x8FEB, - 24543 - 11905: 0x8FEC, - 24544 - 11905: 0xD6D2, - 24545 - 11905: 0xE2E7, - 24546 - 11905: 0x8FED, - 24547 - 11905: 0x8FEE, - 24548 - 11905: 0xE2E8, - 24549 - 11905: 0x8FEF, - 24550 - 11905: 0x8FF0, - 24551 - 11905: 0xD3C7, - 24552 - 11905: 0x8FF1, - 24553 - 11905: 0x8FF2, - 24554 - 11905: 0xE2EC, - 24555 - 11905: 0xBFEC, - 24556 - 11905: 0x8FF3, - 24557 - 11905: 0xE2ED, - 24558 - 11905: 0xE2E5, - 24559 - 11905: 0x8FF4, - 24560 - 11905: 0x8FF5, - 24561 - 11905: 0xB3C0, - 24562 - 11905: 0x8FF6, - 24563 - 11905: 0x8FF7, - 24564 - 11905: 0x8FF8, - 24565 - 11905: 0xC4EE, - 24566 - 11905: 0x8FF9, - 24567 - 11905: 0x8FFA, - 24568 - 11905: 0xE2EE, - 24569 - 11905: 0x8FFB, - 24570 - 11905: 0x8FFC, - 24571 - 11905: 0xD0C3, - 24572 - 11905: 0x8FFD, - 24573 - 11905: 0xBAF6, - 24574 - 11905: 0xE2E9, - 24575 - 11905: 0xB7DE, - 24576 - 11905: 0xBBB3, - 24577 - 11905: 0xCCAC, - 24578 - 11905: 0xCBCB, - 24579 - 11905: 0xE2E4, - 24580 - 11905: 0xE2E6, - 24581 - 11905: 0xE2EA, - 24582 - 11905: 0xE2EB, - 24583 - 11905: 0x8FFE, - 24584 - 11905: 0x9040, - 24585 - 11905: 0x9041, - 24586 - 11905: 0xE2F7, - 24587 - 11905: 0x9042, - 24588 - 11905: 0x9043, - 24589 - 11905: 0xE2F4, - 24590 - 11905: 0xD4F5, - 24591 - 11905: 0xE2F3, - 24592 - 11905: 0x9044, - 24593 - 11905: 0x9045, - 24594 - 11905: 0xC5AD, - 24595 - 11905: 0x9046, - 24596 - 11905: 0xD5FA, - 24597 - 11905: 0xC5C2, - 24598 - 11905: 0xB2C0, - 24599 - 11905: 0x9047, - 24600 - 11905: 0x9048, - 24601 - 11905: 0xE2EF, - 24602 - 11905: 0x9049, - 24603 - 11905: 0xE2F2, - 24604 - 11905: 0xC1AF, - 24605 - 11905: 0xCBBC, - 24606 - 11905: 0x904A, - 24607 - 11905: 0x904B, - 24608 - 11905: 0xB5A1, - 24609 - 11905: 0xE2F9, - 24610 - 11905: 0x904C, - 24611 - 11905: 0x904D, - 24612 - 11905: 0x904E, - 24613 - 11905: 0xBCB1, - 24614 - 11905: 0xE2F1, - 24615 - 11905: 0xD0D4, - 24616 - 11905: 0xD4B9, - 24617 - 11905: 0xE2F5, - 24618 - 11905: 0xB9D6, - 24619 - 11905: 0xE2F6, - 24620 - 11905: 0x904F, - 24621 - 11905: 0x9050, - 24622 - 11905: 0x9051, - 24623 - 11905: 0xC7D3, - 24624 - 11905: 0x9052, - 24625 - 11905: 0x9053, - 24626 - 11905: 0x9054, - 24627 - 11905: 0x9055, - 24628 - 11905: 0x9056, - 24629 - 11905: 0xE2F0, - 24630 - 11905: 0x9057, - 24631 - 11905: 0x9058, - 24632 - 11905: 0x9059, - 24633 - 11905: 0x905A, - 24634 - 11905: 0x905B, - 24635 - 11905: 0xD7DC, - 24636 - 11905: 0xEDA1, - 24637 - 11905: 0x905C, - 24638 - 11905: 0x905D, - 24639 - 11905: 0xE2F8, - 24640 - 11905: 0x905E, - 24641 - 11905: 0xEDA5, - 24642 - 11905: 0xE2FE, - 24643 - 11905: 0xCAD1, - 24644 - 11905: 0x905F, - 24645 - 11905: 0x9060, - 24646 - 11905: 0x9061, - 24647 - 11905: 0x9062, - 24648 - 11905: 0x9063, - 24649 - 11905: 0x9064, - 24650 - 11905: 0x9065, - 24651 - 11905: 0xC1B5, - 24652 - 11905: 0x9066, - 24653 - 11905: 0xBBD0, - 24654 - 11905: 0x9067, - 24655 - 11905: 0x9068, - 24656 - 11905: 0xBFD6, - 24657 - 11905: 0x9069, - 24658 - 11905: 0xBAE3, - 24659 - 11905: 0x906A, - 24660 - 11905: 0x906B, - 24661 - 11905: 0xCBA1, - 24662 - 11905: 0x906C, - 24663 - 11905: 0x906D, - 24664 - 11905: 0x906E, - 24665 - 11905: 0xEDA6, - 24666 - 11905: 0xEDA3, - 24667 - 11905: 0x906F, - 24668 - 11905: 0x9070, - 24669 - 11905: 0xEDA2, - 24670 - 11905: 0x9071, - 24671 - 11905: 0x9072, - 24672 - 11905: 0x9073, - 24673 - 11905: 0x9074, - 24674 - 11905: 0xBBD6, - 24675 - 11905: 0xEDA7, - 24676 - 11905: 0xD0F4, - 24677 - 11905: 0x9075, - 24678 - 11905: 0x9076, - 24679 - 11905: 0xEDA4, - 24680 - 11905: 0xBADE, - 24681 - 11905: 0xB6F7, - 24682 - 11905: 0xE3A1, - 24683 - 11905: 0xB6B2, - 24684 - 11905: 0xCCF1, - 24685 - 11905: 0xB9A7, - 24686 - 11905: 0x9077, - 24687 - 11905: 0xCFA2, - 24688 - 11905: 0xC7A1, - 24689 - 11905: 0x9078, - 24690 - 11905: 0x9079, - 24691 - 11905: 0xBFD2, - 24692 - 11905: 0x907A, - 24693 - 11905: 0x907B, - 24694 - 11905: 0xB6F1, - 24695 - 11905: 0x907C, - 24696 - 11905: 0xE2FA, - 24697 - 11905: 0xE2FB, - 24698 - 11905: 0xE2FD, - 24699 - 11905: 0xE2FC, - 24700 - 11905: 0xC4D5, - 24701 - 11905: 0xE3A2, - 24702 - 11905: 0x907D, - 24703 - 11905: 0xD3C1, - 24704 - 11905: 0x907E, - 24705 - 11905: 0x9080, - 24706 - 11905: 0x9081, - 24707 - 11905: 0xE3A7, - 24708 - 11905: 0xC7C4, - 24709 - 11905: 0x9082, - 24710 - 11905: 0x9083, - 24711 - 11905: 0x9084, - 24712 - 11905: 0x9085, - 24713 - 11905: 0xCFA4, - 24714 - 11905: 0x9086, - 24715 - 11905: 0x9087, - 24716 - 11905: 0xE3A9, - 24717 - 11905: 0xBAB7, - 24718 - 11905: 0x9088, - 24719 - 11905: 0x9089, - 24720 - 11905: 0x908A, - 24721 - 11905: 0x908B, - 24722 - 11905: 0xE3A8, - 24723 - 11905: 0x908C, - 24724 - 11905: 0xBBDA, - 24725 - 11905: 0x908D, - 24726 - 11905: 0xE3A3, - 24727 - 11905: 0x908E, - 24728 - 11905: 0x908F, - 24729 - 11905: 0x9090, - 24730 - 11905: 0xE3A4, - 24731 - 11905: 0xE3AA, - 24732 - 11905: 0x9091, - 24733 - 11905: 0xE3A6, - 24734 - 11905: 0x9092, - 24735 - 11905: 0xCEF2, - 24736 - 11905: 0xD3C6, - 24737 - 11905: 0x9093, - 24738 - 11905: 0x9094, - 24739 - 11905: 0xBBBC, - 24740 - 11905: 0x9095, - 24741 - 11905: 0x9096, - 24742 - 11905: 0xD4C3, - 24743 - 11905: 0x9097, - 24744 - 11905: 0xC4FA, - 24745 - 11905: 0x9098, - 24746 - 11905: 0x9099, - 24747 - 11905: 0xEDA8, - 24748 - 11905: 0xD0FC, - 24749 - 11905: 0xE3A5, - 24750 - 11905: 0x909A, - 24751 - 11905: 0xC3F5, - 24752 - 11905: 0x909B, - 24753 - 11905: 0xE3AD, - 24754 - 11905: 0xB1AF, - 24755 - 11905: 0x909C, - 24756 - 11905: 0xE3B2, - 24757 - 11905: 0x909D, - 24758 - 11905: 0x909E, - 24759 - 11905: 0x909F, - 24760 - 11905: 0xBCC2, - 24761 - 11905: 0x90A0, - 24762 - 11905: 0x90A1, - 24763 - 11905: 0xE3AC, - 24764 - 11905: 0xB5BF, - 24765 - 11905: 0x90A2, - 24766 - 11905: 0x90A3, - 24767 - 11905: 0x90A4, - 24768 - 11905: 0x90A5, - 24769 - 11905: 0x90A6, - 24770 - 11905: 0x90A7, - 24771 - 11905: 0x90A8, - 24772 - 11905: 0x90A9, - 24773 - 11905: 0xC7E9, - 24774 - 11905: 0xE3B0, - 24775 - 11905: 0x90AA, - 24776 - 11905: 0x90AB, - 24777 - 11905: 0x90AC, - 24778 - 11905: 0xBEAA, - 24779 - 11905: 0xCDEF, - 24780 - 11905: 0x90AD, - 24781 - 11905: 0x90AE, - 24782 - 11905: 0x90AF, - 24783 - 11905: 0x90B0, - 24784 - 11905: 0x90B1, - 24785 - 11905: 0xBBF3, - 24786 - 11905: 0x90B2, - 24787 - 11905: 0x90B3, - 24788 - 11905: 0x90B4, - 24789 - 11905: 0xCCE8, - 24790 - 11905: 0x90B5, - 24791 - 11905: 0x90B6, - 24792 - 11905: 0xE3AF, - 24793 - 11905: 0x90B7, - 24794 - 11905: 0xE3B1, - 24795 - 11905: 0x90B8, - 24796 - 11905: 0xCFA7, - 24797 - 11905: 0xE3AE, - 24798 - 11905: 0x90B9, - 24799 - 11905: 0xCEA9, - 24800 - 11905: 0xBBDD, - 24801 - 11905: 0x90BA, - 24802 - 11905: 0x90BB, - 24803 - 11905: 0x90BC, - 24804 - 11905: 0x90BD, - 24805 - 11905: 0x90BE, - 24806 - 11905: 0xB5EB, - 24807 - 11905: 0xBEE5, - 24808 - 11905: 0xB2D2, - 24809 - 11905: 0xB3CD, - 24810 - 11905: 0x90BF, - 24811 - 11905: 0xB1B9, - 24812 - 11905: 0xE3AB, - 24813 - 11905: 0xB2D1, - 24814 - 11905: 0xB5AC, - 24815 - 11905: 0xB9DF, - 24816 - 11905: 0xB6E8, - 24817 - 11905: 0x90C0, - 24818 - 11905: 0x90C1, - 24819 - 11905: 0xCFEB, - 24820 - 11905: 0xE3B7, - 24821 - 11905: 0x90C2, - 24822 - 11905: 0xBBCC, - 24823 - 11905: 0x90C3, - 24824 - 11905: 0x90C4, - 24825 - 11905: 0xC8C7, - 24826 - 11905: 0xD0CA, - 24827 - 11905: 0x90C5, - 24828 - 11905: 0x90C6, - 24829 - 11905: 0x90C7, - 24830 - 11905: 0x90C8, - 24831 - 11905: 0x90C9, - 24832 - 11905: 0xE3B8, - 24833 - 11905: 0xB3EE, - 24834 - 11905: 0x90CA, - 24835 - 11905: 0x90CB, - 24836 - 11905: 0x90CC, - 24837 - 11905: 0x90CD, - 24838 - 11905: 0xEDA9, - 24839 - 11905: 0x90CE, - 24840 - 11905: 0xD3FA, - 24841 - 11905: 0xD3E4, - 24842 - 11905: 0x90CF, - 24843 - 11905: 0x90D0, - 24844 - 11905: 0x90D1, - 24845 - 11905: 0xEDAA, - 24846 - 11905: 0xE3B9, - 24847 - 11905: 0xD2E2, - 24848 - 11905: 0x90D2, - 24849 - 11905: 0x90D3, - 24850 - 11905: 0x90D4, - 24851 - 11905: 0x90D5, - 24852 - 11905: 0x90D6, - 24853 - 11905: 0xE3B5, - 24854 - 11905: 0x90D7, - 24855 - 11905: 0x90D8, - 24856 - 11905: 0x90D9, - 24857 - 11905: 0x90DA, - 24858 - 11905: 0xD3DE, - 24859 - 11905: 0x90DB, - 24860 - 11905: 0x90DC, - 24861 - 11905: 0x90DD, - 24862 - 11905: 0x90DE, - 24863 - 11905: 0xB8D0, - 24864 - 11905: 0xE3B3, - 24865 - 11905: 0x90DF, - 24866 - 11905: 0x90E0, - 24867 - 11905: 0xE3B6, - 24868 - 11905: 0xB7DF, - 24869 - 11905: 0x90E1, - 24870 - 11905: 0xE3B4, - 24871 - 11905: 0xC0A2, - 24872 - 11905: 0x90E2, - 24873 - 11905: 0x90E3, - 24874 - 11905: 0x90E4, - 24875 - 11905: 0xE3BA, - 24876 - 11905: 0x90E5, - 24877 - 11905: 0x90E6, - 24878 - 11905: 0x90E7, - 24879 - 11905: 0x90E8, - 24880 - 11905: 0x90E9, - 24881 - 11905: 0x90EA, - 24882 - 11905: 0x90EB, - 24883 - 11905: 0x90EC, - 24884 - 11905: 0x90ED, - 24885 - 11905: 0x90EE, - 24886 - 11905: 0x90EF, - 24887 - 11905: 0x90F0, - 24888 - 11905: 0x90F1, - 24889 - 11905: 0x90F2, - 24890 - 11905: 0x90F3, - 24891 - 11905: 0x90F4, - 24892 - 11905: 0x90F5, - 24893 - 11905: 0x90F6, - 24894 - 11905: 0x90F7, - 24895 - 11905: 0xD4B8, - 24896 - 11905: 0x90F8, - 24897 - 11905: 0x90F9, - 24898 - 11905: 0x90FA, - 24899 - 11905: 0x90FB, - 24900 - 11905: 0x90FC, - 24901 - 11905: 0x90FD, - 24902 - 11905: 0x90FE, - 24903 - 11905: 0x9140, - 24904 - 11905: 0xB4C8, - 24905 - 11905: 0x9141, - 24906 - 11905: 0xE3BB, - 24907 - 11905: 0x9142, - 24908 - 11905: 0xBBC5, - 24909 - 11905: 0x9143, - 24910 - 11905: 0xC9F7, - 24911 - 11905: 0x9144, - 24912 - 11905: 0x9145, - 24913 - 11905: 0xC9E5, - 24914 - 11905: 0x9146, - 24915 - 11905: 0x9147, - 24916 - 11905: 0x9148, - 24917 - 11905: 0xC4BD, - 24918 - 11905: 0x9149, - 24919 - 11905: 0x914A, - 24920 - 11905: 0x914B, - 24921 - 11905: 0x914C, - 24922 - 11905: 0x914D, - 24923 - 11905: 0x914E, - 24924 - 11905: 0x914F, - 24925 - 11905: 0xEDAB, - 24926 - 11905: 0x9150, - 24927 - 11905: 0x9151, - 24928 - 11905: 0x9152, - 24929 - 11905: 0x9153, - 24930 - 11905: 0xC2FD, - 24931 - 11905: 0x9154, - 24932 - 11905: 0x9155, - 24933 - 11905: 0x9156, - 24934 - 11905: 0x9157, - 24935 - 11905: 0xBBDB, - 24936 - 11905: 0xBFAE, - 24937 - 11905: 0x9158, - 24938 - 11905: 0x9159, - 24939 - 11905: 0x915A, - 24940 - 11905: 0x915B, - 24941 - 11905: 0x915C, - 24942 - 11905: 0x915D, - 24943 - 11905: 0x915E, - 24944 - 11905: 0xCEBF, - 24945 - 11905: 0x915F, - 24946 - 11905: 0x9160, - 24947 - 11905: 0x9161, - 24948 - 11905: 0x9162, - 24949 - 11905: 0xE3BC, - 24950 - 11905: 0x9163, - 24951 - 11905: 0xBFB6, - 24952 - 11905: 0x9164, - 24953 - 11905: 0x9165, - 24954 - 11905: 0x9166, - 24955 - 11905: 0x9167, - 24956 - 11905: 0x9168, - 24957 - 11905: 0x9169, - 24958 - 11905: 0x916A, - 24959 - 11905: 0x916B, - 24960 - 11905: 0x916C, - 24961 - 11905: 0x916D, - 24962 - 11905: 0x916E, - 24963 - 11905: 0x916F, - 24964 - 11905: 0x9170, - 24965 - 11905: 0x9171, - 24966 - 11905: 0x9172, - 24967 - 11905: 0x9173, - 24968 - 11905: 0x9174, - 24969 - 11905: 0x9175, - 24970 - 11905: 0x9176, - 24971 - 11905: 0xB1EF, - 24972 - 11905: 0x9177, - 24973 - 11905: 0x9178, - 24974 - 11905: 0xD4F7, - 24975 - 11905: 0x9179, - 24976 - 11905: 0x917A, - 24977 - 11905: 0x917B, - 24978 - 11905: 0x917C, - 24979 - 11905: 0x917D, - 24980 - 11905: 0xE3BE, - 24981 - 11905: 0x917E, - 24982 - 11905: 0x9180, - 24983 - 11905: 0x9181, - 24984 - 11905: 0x9182, - 24985 - 11905: 0x9183, - 24986 - 11905: 0x9184, - 24987 - 11905: 0x9185, - 24988 - 11905: 0x9186, - 24989 - 11905: 0xEDAD, - 24990 - 11905: 0x9187, - 24991 - 11905: 0x9188, - 24992 - 11905: 0x9189, - 24993 - 11905: 0x918A, - 24994 - 11905: 0x918B, - 24995 - 11905: 0x918C, - 24996 - 11905: 0x918D, - 24997 - 11905: 0x918E, - 24998 - 11905: 0x918F, - 24999 - 11905: 0xE3BF, - 25000 - 11905: 0xBAA9, - 25001 - 11905: 0xEDAC, - 25002 - 11905: 0x9190, - 25003 - 11905: 0x9191, - 25004 - 11905: 0xE3BD, - 25005 - 11905: 0x9192, - 25006 - 11905: 0x9193, - 25007 - 11905: 0x9194, - 25008 - 11905: 0x9195, - 25009 - 11905: 0x9196, - 25010 - 11905: 0x9197, - 25011 - 11905: 0x9198, - 25012 - 11905: 0x9199, - 25013 - 11905: 0x919A, - 25014 - 11905: 0x919B, - 25015 - 11905: 0xE3C0, - 25016 - 11905: 0x919C, - 25017 - 11905: 0x919D, - 25018 - 11905: 0x919E, - 25019 - 11905: 0x919F, - 25020 - 11905: 0x91A0, - 25021 - 11905: 0x91A1, - 25022 - 11905: 0xBAB6, - 25023 - 11905: 0x91A2, - 25024 - 11905: 0x91A3, - 25025 - 11905: 0x91A4, - 25026 - 11905: 0xB6AE, - 25027 - 11905: 0x91A5, - 25028 - 11905: 0x91A6, - 25029 - 11905: 0x91A7, - 25030 - 11905: 0x91A8, - 25031 - 11905: 0x91A9, - 25032 - 11905: 0xD0B8, - 25033 - 11905: 0x91AA, - 25034 - 11905: 0xB0C3, - 25035 - 11905: 0xEDAE, - 25036 - 11905: 0x91AB, - 25037 - 11905: 0x91AC, - 25038 - 11905: 0x91AD, - 25039 - 11905: 0x91AE, - 25040 - 11905: 0x91AF, - 25041 - 11905: 0xEDAF, - 25042 - 11905: 0xC0C1, - 25043 - 11905: 0x91B0, - 25044 - 11905: 0xE3C1, - 25045 - 11905: 0x91B1, - 25046 - 11905: 0x91B2, - 25047 - 11905: 0x91B3, - 25048 - 11905: 0x91B4, - 25049 - 11905: 0x91B5, - 25050 - 11905: 0x91B6, - 25051 - 11905: 0x91B7, - 25052 - 11905: 0x91B8, - 25053 - 11905: 0x91B9, - 25054 - 11905: 0x91BA, - 25055 - 11905: 0x91BB, - 25056 - 11905: 0x91BC, - 25057 - 11905: 0x91BD, - 25058 - 11905: 0x91BE, - 25059 - 11905: 0x91BF, - 25060 - 11905: 0x91C0, - 25061 - 11905: 0x91C1, - 25062 - 11905: 0xC5B3, - 25063 - 11905: 0x91C2, - 25064 - 11905: 0x91C3, - 25065 - 11905: 0x91C4, - 25066 - 11905: 0x91C5, - 25067 - 11905: 0x91C6, - 25068 - 11905: 0x91C7, - 25069 - 11905: 0x91C8, - 25070 - 11905: 0x91C9, - 25071 - 11905: 0x91CA, - 25072 - 11905: 0x91CB, - 25073 - 11905: 0x91CC, - 25074 - 11905: 0x91CD, - 25075 - 11905: 0x91CE, - 25076 - 11905: 0x91CF, - 25077 - 11905: 0xE3C2, - 25078 - 11905: 0x91D0, - 25079 - 11905: 0x91D1, - 25080 - 11905: 0x91D2, - 25081 - 11905: 0x91D3, - 25082 - 11905: 0x91D4, - 25083 - 11905: 0x91D5, - 25084 - 11905: 0x91D6, - 25085 - 11905: 0x91D7, - 25086 - 11905: 0x91D8, - 25087 - 11905: 0xDCB2, - 25088 - 11905: 0x91D9, - 25089 - 11905: 0x91DA, - 25090 - 11905: 0x91DB, - 25091 - 11905: 0x91DC, - 25092 - 11905: 0x91DD, - 25093 - 11905: 0x91DE, - 25094 - 11905: 0xEDB0, - 25095 - 11905: 0x91DF, - 25096 - 11905: 0xB8EA, - 25097 - 11905: 0x91E0, - 25098 - 11905: 0xCEEC, - 25099 - 11905: 0xEAA7, - 25100 - 11905: 0xD0E7, - 25101 - 11905: 0xCAF9, - 25102 - 11905: 0xC8D6, - 25103 - 11905: 0xCFB7, - 25104 - 11905: 0xB3C9, - 25105 - 11905: 0xCED2, - 25106 - 11905: 0xBDE4, - 25107 - 11905: 0x91E1, - 25108 - 11905: 0x91E2, - 25109 - 11905: 0xE3DE, - 25110 - 11905: 0xBBF2, - 25111 - 11905: 0xEAA8, - 25112 - 11905: 0xD5BD, - 25113 - 11905: 0x91E3, - 25114 - 11905: 0xC6DD, - 25115 - 11905: 0xEAA9, - 25116 - 11905: 0x91E4, - 25117 - 11905: 0x91E5, - 25118 - 11905: 0x91E6, - 25119 - 11905: 0xEAAA, - 25120 - 11905: 0x91E7, - 25121 - 11905: 0xEAAC, - 25122 - 11905: 0xEAAB, - 25123 - 11905: 0x91E8, - 25124 - 11905: 0xEAAE, - 25125 - 11905: 0xEAAD, - 25126 - 11905: 0x91E9, - 25127 - 11905: 0x91EA, - 25128 - 11905: 0x91EB, - 25129 - 11905: 0x91EC, - 25130 - 11905: 0xBDD8, - 25131 - 11905: 0x91ED, - 25132 - 11905: 0xEAAF, - 25133 - 11905: 0x91EE, - 25134 - 11905: 0xC2BE, - 25135 - 11905: 0x91EF, - 25136 - 11905: 0x91F0, - 25137 - 11905: 0x91F1, - 25138 - 11905: 0x91F2, - 25139 - 11905: 0xB4C1, - 25140 - 11905: 0xB4F7, - 25141 - 11905: 0x91F3, - 25142 - 11905: 0x91F4, - 25143 - 11905: 0xBBA7, - 25144 - 11905: 0x91F5, - 25145 - 11905: 0x91F6, - 25146 - 11905: 0x91F7, - 25147 - 11905: 0x91F8, - 25148 - 11905: 0x91F9, - 25149 - 11905: 0xECE6, - 25150 - 11905: 0xECE5, - 25151 - 11905: 0xB7BF, - 25152 - 11905: 0xCBF9, - 25153 - 11905: 0xB1E2, - 25154 - 11905: 0x91FA, - 25155 - 11905: 0xECE7, - 25156 - 11905: 0x91FB, - 25157 - 11905: 0x91FC, - 25158 - 11905: 0x91FD, - 25159 - 11905: 0xC9C8, - 25160 - 11905: 0xECE8, - 25161 - 11905: 0xECE9, - 25162 - 11905: 0x91FE, - 25163 - 11905: 0xCAD6, - 25164 - 11905: 0xDED0, - 25165 - 11905: 0xB2C5, - 25166 - 11905: 0xD4FA, - 25167 - 11905: 0x9240, - 25168 - 11905: 0x9241, - 25169 - 11905: 0xC6CB, - 25170 - 11905: 0xB0C7, - 25171 - 11905: 0xB4F2, - 25172 - 11905: 0xC8D3, - 25173 - 11905: 0x9242, - 25174 - 11905: 0x9243, - 25175 - 11905: 0x9244, - 25176 - 11905: 0xCDD0, - 25177 - 11905: 0x9245, - 25178 - 11905: 0x9246, - 25179 - 11905: 0xBFB8, - 25180 - 11905: 0x9247, - 25181 - 11905: 0x9248, - 25182 - 11905: 0x9249, - 25183 - 11905: 0x924A, - 25184 - 11905: 0x924B, - 25185 - 11905: 0x924C, - 25186 - 11905: 0x924D, - 25187 - 11905: 0xBFDB, - 25188 - 11905: 0x924E, - 25189 - 11905: 0x924F, - 25190 - 11905: 0xC7A4, - 25191 - 11905: 0xD6B4, - 25192 - 11905: 0x9250, - 25193 - 11905: 0xC0A9, - 25194 - 11905: 0xDED1, - 25195 - 11905: 0xC9A8, - 25196 - 11905: 0xD1EF, - 25197 - 11905: 0xC5A4, - 25198 - 11905: 0xB0E7, - 25199 - 11905: 0xB3B6, - 25200 - 11905: 0xC8C5, - 25201 - 11905: 0x9251, - 25202 - 11905: 0x9252, - 25203 - 11905: 0xB0E2, - 25204 - 11905: 0x9253, - 25205 - 11905: 0x9254, - 25206 - 11905: 0xB7F6, - 25207 - 11905: 0x9255, - 25208 - 11905: 0x9256, - 25209 - 11905: 0xC5FA, - 25210 - 11905: 0x9257, - 25211 - 11905: 0x9258, - 25212 - 11905: 0xB6F3, - 25213 - 11905: 0x9259, - 25214 - 11905: 0xD5D2, - 25215 - 11905: 0xB3D0, - 25216 - 11905: 0xBCBC, - 25217 - 11905: 0x925A, - 25218 - 11905: 0x925B, - 25219 - 11905: 0x925C, - 25220 - 11905: 0xB3AD, - 25221 - 11905: 0x925D, - 25222 - 11905: 0x925E, - 25223 - 11905: 0x925F, - 25224 - 11905: 0x9260, - 25225 - 11905: 0xBEF1, - 25226 - 11905: 0xB0D1, - 25227 - 11905: 0x9261, - 25228 - 11905: 0x9262, - 25229 - 11905: 0x9263, - 25230 - 11905: 0x9264, - 25231 - 11905: 0x9265, - 25232 - 11905: 0x9266, - 25233 - 11905: 0xD2D6, - 25234 - 11905: 0xCAE3, - 25235 - 11905: 0xD7A5, - 25236 - 11905: 0x9267, - 25237 - 11905: 0xCDB6, - 25238 - 11905: 0xB6B6, - 25239 - 11905: 0xBFB9, - 25240 - 11905: 0xD5DB, - 25241 - 11905: 0x9268, - 25242 - 11905: 0xB8A7, - 25243 - 11905: 0xC5D7, - 25244 - 11905: 0x9269, - 25245 - 11905: 0x926A, - 25246 - 11905: 0x926B, - 25247 - 11905: 0xDED2, - 25248 - 11905: 0xBFD9, - 25249 - 11905: 0xC2D5, - 25250 - 11905: 0xC7C0, - 25251 - 11905: 0x926C, - 25252 - 11905: 0xBBA4, - 25253 - 11905: 0xB1A8, - 25254 - 11905: 0x926D, - 25255 - 11905: 0x926E, - 25256 - 11905: 0xC5EA, - 25257 - 11905: 0x926F, - 25258 - 11905: 0x9270, - 25259 - 11905: 0xC5FB, - 25260 - 11905: 0xCCA7, - 25261 - 11905: 0x9271, - 25262 - 11905: 0x9272, - 25263 - 11905: 0x9273, - 25264 - 11905: 0x9274, - 25265 - 11905: 0xB1A7, - 25266 - 11905: 0x9275, - 25267 - 11905: 0x9276, - 25268 - 11905: 0x9277, - 25269 - 11905: 0xB5D6, - 25270 - 11905: 0x9278, - 25271 - 11905: 0x9279, - 25272 - 11905: 0x927A, - 25273 - 11905: 0xC4A8, - 25274 - 11905: 0x927B, - 25275 - 11905: 0xDED3, - 25276 - 11905: 0xD1BA, - 25277 - 11905: 0xB3E9, - 25278 - 11905: 0x927C, - 25279 - 11905: 0xC3F2, - 25280 - 11905: 0x927D, - 25281 - 11905: 0x927E, - 25282 - 11905: 0xB7F7, - 25283 - 11905: 0x9280, - 25284 - 11905: 0xD6F4, - 25285 - 11905: 0xB5A3, - 25286 - 11905: 0xB2F0, - 25287 - 11905: 0xC4B4, - 25288 - 11905: 0xC4E9, - 25289 - 11905: 0xC0AD, - 25290 - 11905: 0xDED4, - 25291 - 11905: 0x9281, - 25292 - 11905: 0xB0E8, - 25293 - 11905: 0xC5C4, - 25294 - 11905: 0xC1E0, - 25295 - 11905: 0x9282, - 25296 - 11905: 0xB9D5, - 25297 - 11905: 0x9283, - 25298 - 11905: 0xBEDC, - 25299 - 11905: 0xCDD8, - 25300 - 11905: 0xB0CE, - 25301 - 11905: 0x9284, - 25302 - 11905: 0xCDCF, - 25303 - 11905: 0xDED6, - 25304 - 11905: 0xBED0, - 25305 - 11905: 0xD7BE, - 25306 - 11905: 0xDED5, - 25307 - 11905: 0xD5D0, - 25308 - 11905: 0xB0DD, - 25309 - 11905: 0x9285, - 25310 - 11905: 0x9286, - 25311 - 11905: 0xC4E2, - 25312 - 11905: 0x9287, - 25313 - 11905: 0x9288, - 25314 - 11905: 0xC2A3, - 25315 - 11905: 0xBCF0, - 25316 - 11905: 0x9289, - 25317 - 11905: 0xD3B5, - 25318 - 11905: 0xC0B9, - 25319 - 11905: 0xC5A1, - 25320 - 11905: 0xB2A6, - 25321 - 11905: 0xD4F1, - 25322 - 11905: 0x928A, - 25323 - 11905: 0x928B, - 25324 - 11905: 0xC0A8, - 25325 - 11905: 0xCAC3, - 25326 - 11905: 0xDED7, - 25327 - 11905: 0xD5FC, - 25328 - 11905: 0x928C, - 25329 - 11905: 0xB9B0, - 25330 - 11905: 0x928D, - 25331 - 11905: 0xC8AD, - 25332 - 11905: 0xCBA9, - 25333 - 11905: 0x928E, - 25334 - 11905: 0xDED9, - 25335 - 11905: 0xBFBD, - 25336 - 11905: 0x928F, - 25337 - 11905: 0x9290, - 25338 - 11905: 0x9291, - 25339 - 11905: 0x9292, - 25340 - 11905: 0xC6B4, - 25341 - 11905: 0xD7A7, - 25342 - 11905: 0xCAB0, - 25343 - 11905: 0xC4C3, - 25344 - 11905: 0x9293, - 25345 - 11905: 0xB3D6, - 25346 - 11905: 0xB9D2, - 25347 - 11905: 0x9294, - 25348 - 11905: 0x9295, - 25349 - 11905: 0x9296, - 25350 - 11905: 0x9297, - 25351 - 11905: 0xD6B8, - 25352 - 11905: 0xEAFC, - 25353 - 11905: 0xB0B4, - 25354 - 11905: 0x9298, - 25355 - 11905: 0x9299, - 25356 - 11905: 0x929A, - 25357 - 11905: 0x929B, - 25358 - 11905: 0xBFE6, - 25359 - 11905: 0x929C, - 25360 - 11905: 0x929D, - 25361 - 11905: 0xCCF4, - 25362 - 11905: 0x929E, - 25363 - 11905: 0x929F, - 25364 - 11905: 0x92A0, - 25365 - 11905: 0x92A1, - 25366 - 11905: 0xCDDA, - 25367 - 11905: 0x92A2, - 25368 - 11905: 0x92A3, - 25369 - 11905: 0x92A4, - 25370 - 11905: 0xD6BF, - 25371 - 11905: 0xC2CE, - 25372 - 11905: 0x92A5, - 25373 - 11905: 0xCECE, - 25374 - 11905: 0xCCA2, - 25375 - 11905: 0xD0AE, - 25376 - 11905: 0xC4D3, - 25377 - 11905: 0xB5B2, - 25378 - 11905: 0xDED8, - 25379 - 11905: 0xD5F5, - 25380 - 11905: 0xBCB7, - 25381 - 11905: 0xBBD3, - 25382 - 11905: 0x92A6, - 25383 - 11905: 0x92A7, - 25384 - 11905: 0xB0A4, - 25385 - 11905: 0x92A8, - 25386 - 11905: 0xC5B2, - 25387 - 11905: 0xB4EC, - 25388 - 11905: 0x92A9, - 25389 - 11905: 0x92AA, - 25390 - 11905: 0x92AB, - 25391 - 11905: 0xD5F1, - 25392 - 11905: 0x92AC, - 25393 - 11905: 0x92AD, - 25394 - 11905: 0xEAFD, - 25395 - 11905: 0x92AE, - 25396 - 11905: 0x92AF, - 25397 - 11905: 0x92B0, - 25398 - 11905: 0x92B1, - 25399 - 11905: 0x92B2, - 25400 - 11905: 0x92B3, - 25401 - 11905: 0xDEDA, - 25402 - 11905: 0xCDA6, - 25403 - 11905: 0x92B4, - 25404 - 11905: 0x92B5, - 25405 - 11905: 0xCDEC, - 25406 - 11905: 0x92B6, - 25407 - 11905: 0x92B7, - 25408 - 11905: 0x92B8, - 25409 - 11905: 0x92B9, - 25410 - 11905: 0xCEE6, - 25411 - 11905: 0xDEDC, - 25412 - 11905: 0x92BA, - 25413 - 11905: 0xCDB1, - 25414 - 11905: 0xC0A6, - 25415 - 11905: 0x92BB, - 25416 - 11905: 0x92BC, - 25417 - 11905: 0xD7BD, - 25418 - 11905: 0x92BD, - 25419 - 11905: 0xDEDB, - 25420 - 11905: 0xB0C6, - 25421 - 11905: 0xBAB4, - 25422 - 11905: 0xC9D3, - 25423 - 11905: 0xC4F3, - 25424 - 11905: 0xBEE8, - 25425 - 11905: 0x92BE, - 25426 - 11905: 0x92BF, - 25427 - 11905: 0x92C0, - 25428 - 11905: 0x92C1, - 25429 - 11905: 0xB2B6, - 25430 - 11905: 0x92C2, - 25431 - 11905: 0x92C3, - 25432 - 11905: 0x92C4, - 25433 - 11905: 0x92C5, - 25434 - 11905: 0x92C6, - 25435 - 11905: 0x92C7, - 25436 - 11905: 0x92C8, - 25437 - 11905: 0x92C9, - 25438 - 11905: 0xC0CC, - 25439 - 11905: 0xCBF0, - 25440 - 11905: 0x92CA, - 25441 - 11905: 0xBCF1, - 25442 - 11905: 0xBBBB, - 25443 - 11905: 0xB5B7, - 25444 - 11905: 0x92CB, - 25445 - 11905: 0x92CC, - 25446 - 11905: 0x92CD, - 25447 - 11905: 0xC5F5, - 25448 - 11905: 0x92CE, - 25449 - 11905: 0xDEE6, - 25450 - 11905: 0x92CF, - 25451 - 11905: 0x92D0, - 25452 - 11905: 0x92D1, - 25453 - 11905: 0xDEE3, - 25454 - 11905: 0xBEDD, - 25455 - 11905: 0x92D2, - 25456 - 11905: 0x92D3, - 25457 - 11905: 0xDEDF, - 25458 - 11905: 0x92D4, - 25459 - 11905: 0x92D5, - 25460 - 11905: 0x92D6, - 25461 - 11905: 0x92D7, - 25462 - 11905: 0xB4B7, - 25463 - 11905: 0xBDDD, - 25464 - 11905: 0x92D8, - 25465 - 11905: 0x92D9, - 25466 - 11905: 0xDEE0, - 25467 - 11905: 0xC4ED, - 25468 - 11905: 0x92DA, - 25469 - 11905: 0x92DB, - 25470 - 11905: 0x92DC, - 25471 - 11905: 0x92DD, - 25472 - 11905: 0xCFC6, - 25473 - 11905: 0x92DE, - 25474 - 11905: 0xB5E0, - 25475 - 11905: 0x92DF, - 25476 - 11905: 0x92E0, - 25477 - 11905: 0x92E1, - 25478 - 11905: 0x92E2, - 25479 - 11905: 0xB6DE, - 25480 - 11905: 0xCADA, - 25481 - 11905: 0xB5F4, - 25482 - 11905: 0xDEE5, - 25483 - 11905: 0x92E3, - 25484 - 11905: 0xD5C6, - 25485 - 11905: 0x92E4, - 25486 - 11905: 0xDEE1, - 25487 - 11905: 0xCCCD, - 25488 - 11905: 0xC6FE, - 25489 - 11905: 0x92E5, - 25490 - 11905: 0xC5C5, - 25491 - 11905: 0x92E6, - 25492 - 11905: 0x92E7, - 25493 - 11905: 0x92E8, - 25494 - 11905: 0xD2B4, - 25495 - 11905: 0x92E9, - 25496 - 11905: 0xBEF2, - 25497 - 11905: 0x92EA, - 25498 - 11905: 0x92EB, - 25499 - 11905: 0x92EC, - 25500 - 11905: 0x92ED, - 25501 - 11905: 0x92EE, - 25502 - 11905: 0x92EF, - 25503 - 11905: 0x92F0, - 25504 - 11905: 0xC2D3, - 25505 - 11905: 0x92F1, - 25506 - 11905: 0xCCBD, - 25507 - 11905: 0xB3B8, - 25508 - 11905: 0x92F2, - 25509 - 11905: 0xBDD3, - 25510 - 11905: 0x92F3, - 25511 - 11905: 0xBFD8, - 25512 - 11905: 0xCDC6, - 25513 - 11905: 0xD1DA, - 25514 - 11905: 0xB4EB, - 25515 - 11905: 0x92F4, - 25516 - 11905: 0xDEE4, - 25517 - 11905: 0xDEDD, - 25518 - 11905: 0xDEE7, - 25519 - 11905: 0x92F5, - 25520 - 11905: 0xEAFE, - 25521 - 11905: 0x92F6, - 25522 - 11905: 0x92F7, - 25523 - 11905: 0xC2B0, - 25524 - 11905: 0xDEE2, - 25525 - 11905: 0x92F8, - 25526 - 11905: 0x92F9, - 25527 - 11905: 0xD6C0, - 25528 - 11905: 0xB5A7, - 25529 - 11905: 0x92FA, - 25530 - 11905: 0xB2F4, - 25531 - 11905: 0x92FB, - 25532 - 11905: 0xDEE8, - 25533 - 11905: 0x92FC, - 25534 - 11905: 0xDEF2, - 25535 - 11905: 0x92FD, - 25536 - 11905: 0x92FE, - 25537 - 11905: 0x9340, - 25538 - 11905: 0x9341, - 25539 - 11905: 0x9342, - 25540 - 11905: 0xDEED, - 25541 - 11905: 0x9343, - 25542 - 11905: 0xDEF1, - 25543 - 11905: 0x9344, - 25544 - 11905: 0x9345, - 25545 - 11905: 0xC8E0, - 25546 - 11905: 0x9346, - 25547 - 11905: 0x9347, - 25548 - 11905: 0x9348, - 25549 - 11905: 0xD7E1, - 25550 - 11905: 0xDEEF, - 25551 - 11905: 0xC3E8, - 25552 - 11905: 0xCCE1, - 25553 - 11905: 0x9349, - 25554 - 11905: 0xB2E5, - 25555 - 11905: 0x934A, - 25556 - 11905: 0x934B, - 25557 - 11905: 0x934C, - 25558 - 11905: 0xD2BE, - 25559 - 11905: 0x934D, - 25560 - 11905: 0x934E, - 25561 - 11905: 0x934F, - 25562 - 11905: 0x9350, - 25563 - 11905: 0x9351, - 25564 - 11905: 0x9352, - 25565 - 11905: 0x9353, - 25566 - 11905: 0xDEEE, - 25567 - 11905: 0x9354, - 25568 - 11905: 0xDEEB, - 25569 - 11905: 0xCED5, - 25570 - 11905: 0x9355, - 25571 - 11905: 0xB4A7, - 25572 - 11905: 0x9356, - 25573 - 11905: 0x9357, - 25574 - 11905: 0x9358, - 25575 - 11905: 0x9359, - 25576 - 11905: 0x935A, - 25577 - 11905: 0xBFAB, - 25578 - 11905: 0xBEBE, - 25579 - 11905: 0x935B, - 25580 - 11905: 0x935C, - 25581 - 11905: 0xBDD2, - 25582 - 11905: 0x935D, - 25583 - 11905: 0x935E, - 25584 - 11905: 0x935F, - 25585 - 11905: 0x9360, - 25586 - 11905: 0xDEE9, - 25587 - 11905: 0x9361, - 25588 - 11905: 0xD4AE, - 25589 - 11905: 0x9362, - 25590 - 11905: 0xDEDE, - 25591 - 11905: 0x9363, - 25592 - 11905: 0xDEEA, - 25593 - 11905: 0x9364, - 25594 - 11905: 0x9365, - 25595 - 11905: 0x9366, - 25596 - 11905: 0x9367, - 25597 - 11905: 0xC0BF, - 25598 - 11905: 0x9368, - 25599 - 11905: 0xDEEC, - 25600 - 11905: 0xB2F3, - 25601 - 11905: 0xB8E9, - 25602 - 11905: 0xC2A7, - 25603 - 11905: 0x9369, - 25604 - 11905: 0x936A, - 25605 - 11905: 0xBDC1, - 25606 - 11905: 0x936B, - 25607 - 11905: 0x936C, - 25608 - 11905: 0x936D, - 25609 - 11905: 0x936E, - 25610 - 11905: 0x936F, - 25611 - 11905: 0xDEF5, - 25612 - 11905: 0xDEF8, - 25613 - 11905: 0x9370, - 25614 - 11905: 0x9371, - 25615 - 11905: 0xB2AB, - 25616 - 11905: 0xB4A4, - 25617 - 11905: 0x9372, - 25618 - 11905: 0x9373, - 25619 - 11905: 0xB4EA, - 25620 - 11905: 0xC9A6, - 25621 - 11905: 0x9374, - 25622 - 11905: 0x9375, - 25623 - 11905: 0x9376, - 25624 - 11905: 0x9377, - 25625 - 11905: 0x9378, - 25626 - 11905: 0x9379, - 25627 - 11905: 0xDEF6, - 25628 - 11905: 0xCBD1, - 25629 - 11905: 0x937A, - 25630 - 11905: 0xB8E3, - 25631 - 11905: 0x937B, - 25632 - 11905: 0xDEF7, - 25633 - 11905: 0xDEFA, - 25634 - 11905: 0x937C, - 25635 - 11905: 0x937D, - 25636 - 11905: 0x937E, - 25637 - 11905: 0x9380, - 25638 - 11905: 0xDEF9, - 25639 - 11905: 0x9381, - 25640 - 11905: 0x9382, - 25641 - 11905: 0x9383, - 25642 - 11905: 0xCCC2, - 25643 - 11905: 0x9384, - 25644 - 11905: 0xB0E1, - 25645 - 11905: 0xB4EE, - 25646 - 11905: 0x9385, - 25647 - 11905: 0x9386, - 25648 - 11905: 0x9387, - 25649 - 11905: 0x9388, - 25650 - 11905: 0x9389, - 25651 - 11905: 0x938A, - 25652 - 11905: 0xE5BA, - 25653 - 11905: 0x938B, - 25654 - 11905: 0x938C, - 25655 - 11905: 0x938D, - 25656 - 11905: 0x938E, - 25657 - 11905: 0x938F, - 25658 - 11905: 0xD0AF, - 25659 - 11905: 0x9390, - 25660 - 11905: 0x9391, - 25661 - 11905: 0xB2EB, - 25662 - 11905: 0x9392, - 25663 - 11905: 0xEBA1, - 25664 - 11905: 0x9393, - 25665 - 11905: 0xDEF4, - 25666 - 11905: 0x9394, - 25667 - 11905: 0x9395, - 25668 - 11905: 0xC9E3, - 25669 - 11905: 0xDEF3, - 25670 - 11905: 0xB0DA, - 25671 - 11905: 0xD2A1, - 25672 - 11905: 0xB1F7, - 25673 - 11905: 0x9396, - 25674 - 11905: 0xCCAF, - 25675 - 11905: 0x9397, - 25676 - 11905: 0x9398, - 25677 - 11905: 0x9399, - 25678 - 11905: 0x939A, - 25679 - 11905: 0x939B, - 25680 - 11905: 0x939C, - 25681 - 11905: 0x939D, - 25682 - 11905: 0xDEF0, - 25683 - 11905: 0x939E, - 25684 - 11905: 0xCBA4, - 25685 - 11905: 0x939F, - 25686 - 11905: 0x93A0, - 25687 - 11905: 0x93A1, - 25688 - 11905: 0xD5AA, - 25689 - 11905: 0x93A2, - 25690 - 11905: 0x93A3, - 25691 - 11905: 0x93A4, - 25692 - 11905: 0x93A5, - 25693 - 11905: 0x93A6, - 25694 - 11905: 0xDEFB, - 25695 - 11905: 0x93A7, - 25696 - 11905: 0x93A8, - 25697 - 11905: 0x93A9, - 25698 - 11905: 0x93AA, - 25699 - 11905: 0x93AB, - 25700 - 11905: 0x93AC, - 25701 - 11905: 0x93AD, - 25702 - 11905: 0x93AE, - 25703 - 11905: 0xB4DD, - 25704 - 11905: 0x93AF, - 25705 - 11905: 0xC4A6, - 25706 - 11905: 0x93B0, - 25707 - 11905: 0x93B1, - 25708 - 11905: 0x93B2, - 25709 - 11905: 0xDEFD, - 25710 - 11905: 0x93B3, - 25711 - 11905: 0x93B4, - 25712 - 11905: 0x93B5, - 25713 - 11905: 0x93B6, - 25714 - 11905: 0x93B7, - 25715 - 11905: 0x93B8, - 25716 - 11905: 0x93B9, - 25717 - 11905: 0x93BA, - 25718 - 11905: 0x93BB, - 25719 - 11905: 0x93BC, - 25720 - 11905: 0xC3FE, - 25721 - 11905: 0xC4A1, - 25722 - 11905: 0xDFA1, - 25723 - 11905: 0x93BD, - 25724 - 11905: 0x93BE, - 25725 - 11905: 0x93BF, - 25726 - 11905: 0x93C0, - 25727 - 11905: 0x93C1, - 25728 - 11905: 0x93C2, - 25729 - 11905: 0x93C3, - 25730 - 11905: 0xC1CC, - 25731 - 11905: 0x93C4, - 25732 - 11905: 0xDEFC, - 25733 - 11905: 0xBEEF, - 25734 - 11905: 0x93C5, - 25735 - 11905: 0xC6B2, - 25736 - 11905: 0x93C6, - 25737 - 11905: 0x93C7, - 25738 - 11905: 0x93C8, - 25739 - 11905: 0x93C9, - 25740 - 11905: 0x93CA, - 25741 - 11905: 0x93CB, - 25742 - 11905: 0x93CC, - 25743 - 11905: 0x93CD, - 25744 - 11905: 0x93CE, - 25745 - 11905: 0xB3C5, - 25746 - 11905: 0xC8F6, - 25747 - 11905: 0x93CF, - 25748 - 11905: 0x93D0, - 25749 - 11905: 0xCBBA, - 25750 - 11905: 0xDEFE, - 25751 - 11905: 0x93D1, - 25752 - 11905: 0x93D2, - 25753 - 11905: 0xDFA4, - 25754 - 11905: 0x93D3, - 25755 - 11905: 0x93D4, - 25756 - 11905: 0x93D5, - 25757 - 11905: 0x93D6, - 25758 - 11905: 0xD7B2, - 25759 - 11905: 0x93D7, - 25760 - 11905: 0x93D8, - 25761 - 11905: 0x93D9, - 25762 - 11905: 0x93DA, - 25763 - 11905: 0x93DB, - 25764 - 11905: 0xB3B7, - 25765 - 11905: 0x93DC, - 25766 - 11905: 0x93DD, - 25767 - 11905: 0x93DE, - 25768 - 11905: 0x93DF, - 25769 - 11905: 0xC1C3, - 25770 - 11905: 0x93E0, - 25771 - 11905: 0x93E1, - 25772 - 11905: 0xC7CB, - 25773 - 11905: 0xB2A5, - 25774 - 11905: 0xB4E9, - 25775 - 11905: 0x93E2, - 25776 - 11905: 0xD7AB, - 25777 - 11905: 0x93E3, - 25778 - 11905: 0x93E4, - 25779 - 11905: 0x93E5, - 25780 - 11905: 0x93E6, - 25781 - 11905: 0xC4EC, - 25782 - 11905: 0x93E7, - 25783 - 11905: 0xDFA2, - 25784 - 11905: 0xDFA3, - 25785 - 11905: 0x93E8, - 25786 - 11905: 0xDFA5, - 25787 - 11905: 0x93E9, - 25788 - 11905: 0xBAB3, - 25789 - 11905: 0x93EA, - 25790 - 11905: 0x93EB, - 25791 - 11905: 0x93EC, - 25792 - 11905: 0xDFA6, - 25793 - 11905: 0x93ED, - 25794 - 11905: 0xC0DE, - 25795 - 11905: 0x93EE, - 25796 - 11905: 0x93EF, - 25797 - 11905: 0xC9C3, - 25798 - 11905: 0x93F0, - 25799 - 11905: 0x93F1, - 25800 - 11905: 0x93F2, - 25801 - 11905: 0x93F3, - 25802 - 11905: 0x93F4, - 25803 - 11905: 0x93F5, - 25804 - 11905: 0x93F6, - 25805 - 11905: 0xB2D9, - 25806 - 11905: 0xC7E6, - 25807 - 11905: 0x93F7, - 25808 - 11905: 0xDFA7, - 25809 - 11905: 0x93F8, - 25810 - 11905: 0xC7DC, - 25811 - 11905: 0x93F9, - 25812 - 11905: 0x93FA, - 25813 - 11905: 0x93FB, - 25814 - 11905: 0x93FC, - 25815 - 11905: 0xDFA8, - 25816 - 11905: 0xEBA2, - 25817 - 11905: 0x93FD, - 25818 - 11905: 0x93FE, - 25819 - 11905: 0x9440, - 25820 - 11905: 0x9441, - 25821 - 11905: 0x9442, - 25822 - 11905: 0xCBD3, - 25823 - 11905: 0x9443, - 25824 - 11905: 0x9444, - 25825 - 11905: 0x9445, - 25826 - 11905: 0xDFAA, - 25827 - 11905: 0x9446, - 25828 - 11905: 0xDFA9, - 25829 - 11905: 0x9447, - 25830 - 11905: 0xB2C1, - 25831 - 11905: 0x9448, - 25832 - 11905: 0x9449, - 25833 - 11905: 0x944A, - 25834 - 11905: 0x944B, - 25835 - 11905: 0x944C, - 25836 - 11905: 0x944D, - 25837 - 11905: 0x944E, - 25838 - 11905: 0x944F, - 25839 - 11905: 0x9450, - 25840 - 11905: 0x9451, - 25841 - 11905: 0x9452, - 25842 - 11905: 0x9453, - 25843 - 11905: 0x9454, - 25844 - 11905: 0x9455, - 25845 - 11905: 0x9456, - 25846 - 11905: 0x9457, - 25847 - 11905: 0x9458, - 25848 - 11905: 0x9459, - 25849 - 11905: 0x945A, - 25850 - 11905: 0x945B, - 25851 - 11905: 0x945C, - 25852 - 11905: 0x945D, - 25853 - 11905: 0x945E, - 25854 - 11905: 0x945F, - 25855 - 11905: 0x9460, - 25856 - 11905: 0xC5CA, - 25857 - 11905: 0x9461, - 25858 - 11905: 0x9462, - 25859 - 11905: 0x9463, - 25860 - 11905: 0x9464, - 25861 - 11905: 0x9465, - 25862 - 11905: 0x9466, - 25863 - 11905: 0x9467, - 25864 - 11905: 0x9468, - 25865 - 11905: 0xDFAB, - 25866 - 11905: 0x9469, - 25867 - 11905: 0x946A, - 25868 - 11905: 0x946B, - 25869 - 11905: 0x946C, - 25870 - 11905: 0x946D, - 25871 - 11905: 0x946E, - 25872 - 11905: 0x946F, - 25873 - 11905: 0x9470, - 25874 - 11905: 0xD4DC, - 25875 - 11905: 0x9471, - 25876 - 11905: 0x9472, - 25877 - 11905: 0x9473, - 25878 - 11905: 0x9474, - 25879 - 11905: 0x9475, - 25880 - 11905: 0xC8C1, - 25881 - 11905: 0x9476, - 25882 - 11905: 0x9477, - 25883 - 11905: 0x9478, - 25884 - 11905: 0x9479, - 25885 - 11905: 0x947A, - 25886 - 11905: 0x947B, - 25887 - 11905: 0x947C, - 25888 - 11905: 0x947D, - 25889 - 11905: 0x947E, - 25890 - 11905: 0x9480, - 25891 - 11905: 0x9481, - 25892 - 11905: 0x9482, - 25893 - 11905: 0xDFAC, - 25894 - 11905: 0x9483, - 25895 - 11905: 0x9484, - 25896 - 11905: 0x9485, - 25897 - 11905: 0x9486, - 25898 - 11905: 0x9487, - 25899 - 11905: 0xBEF0, - 25900 - 11905: 0x9488, - 25901 - 11905: 0x9489, - 25902 - 11905: 0xDFAD, - 25903 - 11905: 0xD6A7, - 25904 - 11905: 0x948A, - 25905 - 11905: 0x948B, - 25906 - 11905: 0x948C, - 25907 - 11905: 0x948D, - 25908 - 11905: 0xEAB7, - 25909 - 11905: 0xEBB6, - 25910 - 11905: 0xCAD5, - 25911 - 11905: 0x948E, - 25912 - 11905: 0xD8FC, - 25913 - 11905: 0xB8C4, - 25914 - 11905: 0x948F, - 25915 - 11905: 0xB9A5, - 25916 - 11905: 0x9490, - 25917 - 11905: 0x9491, - 25918 - 11905: 0xB7C5, - 25919 - 11905: 0xD5FE, - 25920 - 11905: 0x9492, - 25921 - 11905: 0x9493, - 25922 - 11905: 0x9494, - 25923 - 11905: 0x9495, - 25924 - 11905: 0x9496, - 25925 - 11905: 0xB9CA, - 25926 - 11905: 0x9497, - 25927 - 11905: 0x9498, - 25928 - 11905: 0xD0A7, - 25929 - 11905: 0xF4CD, - 25930 - 11905: 0x9499, - 25931 - 11905: 0x949A, - 25932 - 11905: 0xB5D0, - 25933 - 11905: 0x949B, - 25934 - 11905: 0x949C, - 25935 - 11905: 0xC3F4, - 25936 - 11905: 0x949D, - 25937 - 11905: 0xBEC8, - 25938 - 11905: 0x949E, - 25939 - 11905: 0x949F, - 25940 - 11905: 0x94A0, - 25941 - 11905: 0xEBB7, - 25942 - 11905: 0xB0BD, - 25943 - 11905: 0x94A1, - 25944 - 11905: 0x94A2, - 25945 - 11905: 0xBDCC, - 25946 - 11905: 0x94A3, - 25947 - 11905: 0xC1B2, - 25948 - 11905: 0x94A4, - 25949 - 11905: 0xB1D6, - 25950 - 11905: 0xB3A8, - 25951 - 11905: 0x94A5, - 25952 - 11905: 0x94A6, - 25953 - 11905: 0x94A7, - 25954 - 11905: 0xB8D2, - 25955 - 11905: 0xC9A2, - 25956 - 11905: 0x94A8, - 25957 - 11905: 0x94A9, - 25958 - 11905: 0xB6D8, - 25959 - 11905: 0x94AA, - 25960 - 11905: 0x94AB, - 25961 - 11905: 0x94AC, - 25962 - 11905: 0x94AD, - 25963 - 11905: 0xEBB8, - 25964 - 11905: 0xBEB4, - 25965 - 11905: 0x94AE, - 25966 - 11905: 0x94AF, - 25967 - 11905: 0x94B0, - 25968 - 11905: 0xCAFD, - 25969 - 11905: 0x94B1, - 25970 - 11905: 0xC7C3, - 25971 - 11905: 0x94B2, - 25972 - 11905: 0xD5FB, - 25973 - 11905: 0x94B3, - 25974 - 11905: 0x94B4, - 25975 - 11905: 0xB7F3, - 25976 - 11905: 0x94B5, - 25977 - 11905: 0x94B6, - 25978 - 11905: 0x94B7, - 25979 - 11905: 0x94B8, - 25980 - 11905: 0x94B9, - 25981 - 11905: 0x94BA, - 25982 - 11905: 0x94BB, - 25983 - 11905: 0x94BC, - 25984 - 11905: 0x94BD, - 25985 - 11905: 0x94BE, - 25986 - 11905: 0x94BF, - 25987 - 11905: 0x94C0, - 25988 - 11905: 0x94C1, - 25989 - 11905: 0x94C2, - 25990 - 11905: 0x94C3, - 25991 - 11905: 0xCEC4, - 25992 - 11905: 0x94C4, - 25993 - 11905: 0x94C5, - 25994 - 11905: 0x94C6, - 25995 - 11905: 0xD5AB, - 25996 - 11905: 0xB1F3, - 25997 - 11905: 0x94C7, - 25998 - 11905: 0x94C8, - 25999 - 11905: 0x94C9, - 26000 - 11905: 0xECB3, - 26001 - 11905: 0xB0DF, - 26002 - 11905: 0x94CA, - 26003 - 11905: 0xECB5, - 26004 - 11905: 0x94CB, - 26005 - 11905: 0x94CC, - 26006 - 11905: 0x94CD, - 26007 - 11905: 0xB6B7, - 26008 - 11905: 0x94CE, - 26009 - 11905: 0xC1CF, - 26010 - 11905: 0x94CF, - 26011 - 11905: 0xF5FA, - 26012 - 11905: 0xD0B1, - 26013 - 11905: 0x94D0, - 26014 - 11905: 0x94D1, - 26015 - 11905: 0xD5E5, - 26016 - 11905: 0x94D2, - 26017 - 11905: 0xCED3, - 26018 - 11905: 0x94D3, - 26019 - 11905: 0x94D4, - 26020 - 11905: 0xBDEF, - 26021 - 11905: 0xB3E2, - 26022 - 11905: 0x94D5, - 26023 - 11905: 0xB8AB, - 26024 - 11905: 0x94D6, - 26025 - 11905: 0xD5B6, - 26026 - 11905: 0x94D7, - 26027 - 11905: 0xEDBD, - 26028 - 11905: 0x94D8, - 26029 - 11905: 0xB6CF, - 26030 - 11905: 0x94D9, - 26031 - 11905: 0xCBB9, - 26032 - 11905: 0xD0C2, - 26033 - 11905: 0x94DA, - 26034 - 11905: 0x94DB, - 26035 - 11905: 0x94DC, - 26036 - 11905: 0x94DD, - 26037 - 11905: 0x94DE, - 26038 - 11905: 0x94DF, - 26039 - 11905: 0x94E0, - 26040 - 11905: 0x94E1, - 26041 - 11905: 0xB7BD, - 26042 - 11905: 0x94E2, - 26043 - 11905: 0x94E3, - 26044 - 11905: 0xECB6, - 26045 - 11905: 0xCAA9, - 26046 - 11905: 0x94E4, - 26047 - 11905: 0x94E5, - 26048 - 11905: 0x94E6, - 26049 - 11905: 0xC5D4, - 26050 - 11905: 0x94E7, - 26051 - 11905: 0xECB9, - 26052 - 11905: 0xECB8, - 26053 - 11905: 0xC2C3, - 26054 - 11905: 0xECB7, - 26055 - 11905: 0x94E8, - 26056 - 11905: 0x94E9, - 26057 - 11905: 0x94EA, - 26058 - 11905: 0x94EB, - 26059 - 11905: 0xD0FD, - 26060 - 11905: 0xECBA, - 26061 - 11905: 0x94EC, - 26062 - 11905: 0xECBB, - 26063 - 11905: 0xD7E5, - 26064 - 11905: 0x94ED, - 26065 - 11905: 0x94EE, - 26066 - 11905: 0xECBC, - 26067 - 11905: 0x94EF, - 26068 - 11905: 0x94F0, - 26069 - 11905: 0x94F1, - 26070 - 11905: 0xECBD, - 26071 - 11905: 0xC6EC, - 26072 - 11905: 0x94F2, - 26073 - 11905: 0x94F3, - 26074 - 11905: 0x94F4, - 26075 - 11905: 0x94F5, - 26076 - 11905: 0x94F6, - 26077 - 11905: 0x94F7, - 26078 - 11905: 0x94F8, - 26079 - 11905: 0x94F9, - 26080 - 11905: 0xCEDE, - 26081 - 11905: 0x94FA, - 26082 - 11905: 0xBCC8, - 26083 - 11905: 0x94FB, - 26084 - 11905: 0x94FC, - 26085 - 11905: 0xC8D5, - 26086 - 11905: 0xB5A9, - 26087 - 11905: 0xBEC9, - 26088 - 11905: 0xD6BC, - 26089 - 11905: 0xD4E7, - 26090 - 11905: 0x94FD, - 26091 - 11905: 0x94FE, - 26092 - 11905: 0xD1AE, - 26093 - 11905: 0xD0F1, - 26094 - 11905: 0xEAB8, - 26095 - 11905: 0xEAB9, - 26096 - 11905: 0xEABA, - 26097 - 11905: 0xBAB5, - 26098 - 11905: 0x9540, - 26099 - 11905: 0x9541, - 26100 - 11905: 0x9542, - 26101 - 11905: 0x9543, - 26102 - 11905: 0xCAB1, - 26103 - 11905: 0xBFF5, - 26104 - 11905: 0x9544, - 26105 - 11905: 0x9545, - 26106 - 11905: 0xCDFA, - 26107 - 11905: 0x9546, - 26108 - 11905: 0x9547, - 26109 - 11905: 0x9548, - 26110 - 11905: 0x9549, - 26111 - 11905: 0x954A, - 26112 - 11905: 0xEAC0, - 26113 - 11905: 0x954B, - 26114 - 11905: 0xB0BA, - 26115 - 11905: 0xEABE, - 26116 - 11905: 0x954C, - 26117 - 11905: 0x954D, - 26118 - 11905: 0xC0A5, - 26119 - 11905: 0x954E, - 26120 - 11905: 0x954F, - 26121 - 11905: 0x9550, - 26122 - 11905: 0xEABB, - 26123 - 11905: 0x9551, - 26124 - 11905: 0xB2FD, - 26125 - 11905: 0x9552, - 26126 - 11905: 0xC3F7, - 26127 - 11905: 0xBBE8, - 26128 - 11905: 0x9553, - 26129 - 11905: 0x9554, - 26130 - 11905: 0x9555, - 26131 - 11905: 0xD2D7, - 26132 - 11905: 0xCEF4, - 26133 - 11905: 0xEABF, - 26134 - 11905: 0x9556, - 26135 - 11905: 0x9557, - 26136 - 11905: 0x9558, - 26137 - 11905: 0xEABC, - 26138 - 11905: 0x9559, - 26139 - 11905: 0x955A, - 26140 - 11905: 0x955B, - 26141 - 11905: 0xEAC3, - 26142 - 11905: 0x955C, - 26143 - 11905: 0xD0C7, - 26144 - 11905: 0xD3B3, - 26145 - 11905: 0x955D, - 26146 - 11905: 0x955E, - 26147 - 11905: 0x955F, - 26148 - 11905: 0x9560, - 26149 - 11905: 0xB4BA, - 26150 - 11905: 0x9561, - 26151 - 11905: 0xC3C1, - 26152 - 11905: 0xD7F2, - 26153 - 11905: 0x9562, - 26154 - 11905: 0x9563, - 26155 - 11905: 0x9564, - 26156 - 11905: 0x9565, - 26157 - 11905: 0xD5D1, - 26158 - 11905: 0x9566, - 26159 - 11905: 0xCAC7, - 26160 - 11905: 0x9567, - 26161 - 11905: 0xEAC5, - 26162 - 11905: 0x9568, - 26163 - 11905: 0x9569, - 26164 - 11905: 0xEAC4, - 26165 - 11905: 0xEAC7, - 26166 - 11905: 0xEAC6, - 26167 - 11905: 0x956A, - 26168 - 11905: 0x956B, - 26169 - 11905: 0x956C, - 26170 - 11905: 0x956D, - 26171 - 11905: 0x956E, - 26172 - 11905: 0xD6E7, - 26173 - 11905: 0x956F, - 26174 - 11905: 0xCFD4, - 26175 - 11905: 0x9570, - 26176 - 11905: 0x9571, - 26177 - 11905: 0xEACB, - 26178 - 11905: 0x9572, - 26179 - 11905: 0xBBCE, - 26180 - 11905: 0x9573, - 26181 - 11905: 0x9574, - 26182 - 11905: 0x9575, - 26183 - 11905: 0x9576, - 26184 - 11905: 0x9577, - 26185 - 11905: 0x9578, - 26186 - 11905: 0x9579, - 26187 - 11905: 0xBDFA, - 26188 - 11905: 0xC9CE, - 26189 - 11905: 0x957A, - 26190 - 11905: 0x957B, - 26191 - 11905: 0xEACC, - 26192 - 11905: 0x957C, - 26193 - 11905: 0x957D, - 26194 - 11905: 0xC9B9, - 26195 - 11905: 0xCFFE, - 26196 - 11905: 0xEACA, - 26197 - 11905: 0xD4CE, - 26198 - 11905: 0xEACD, - 26199 - 11905: 0xEACF, - 26200 - 11905: 0x957E, - 26201 - 11905: 0x9580, - 26202 - 11905: 0xCDED, - 26203 - 11905: 0x9581, - 26204 - 11905: 0x9582, - 26205 - 11905: 0x9583, - 26206 - 11905: 0x9584, - 26207 - 11905: 0xEAC9, - 26208 - 11905: 0x9585, - 26209 - 11905: 0xEACE, - 26210 - 11905: 0x9586, - 26211 - 11905: 0x9587, - 26212 - 11905: 0xCEEE, - 26213 - 11905: 0x9588, - 26214 - 11905: 0xBBDE, - 26215 - 11905: 0x9589, - 26216 - 11905: 0xB3BF, - 26217 - 11905: 0x958A, - 26218 - 11905: 0x958B, - 26219 - 11905: 0x958C, - 26220 - 11905: 0x958D, - 26221 - 11905: 0x958E, - 26222 - 11905: 0xC6D5, - 26223 - 11905: 0xBEB0, - 26224 - 11905: 0xCEFA, - 26225 - 11905: 0x958F, - 26226 - 11905: 0x9590, - 26227 - 11905: 0x9591, - 26228 - 11905: 0xC7E7, - 26229 - 11905: 0x9592, - 26230 - 11905: 0xBEA7, - 26231 - 11905: 0xEAD0, - 26232 - 11905: 0x9593, - 26233 - 11905: 0x9594, - 26234 - 11905: 0xD6C7, - 26235 - 11905: 0x9595, - 26236 - 11905: 0x9596, - 26237 - 11905: 0x9597, - 26238 - 11905: 0xC1C0, - 26239 - 11905: 0x9598, - 26240 - 11905: 0x9599, - 26241 - 11905: 0x959A, - 26242 - 11905: 0xD4DD, - 26243 - 11905: 0x959B, - 26244 - 11905: 0xEAD1, - 26245 - 11905: 0x959C, - 26246 - 11905: 0x959D, - 26247 - 11905: 0xCFBE, - 26248 - 11905: 0x959E, - 26249 - 11905: 0x959F, - 26250 - 11905: 0x95A0, - 26251 - 11905: 0x95A1, - 26252 - 11905: 0xEAD2, - 26253 - 11905: 0x95A2, - 26254 - 11905: 0x95A3, - 26255 - 11905: 0x95A4, - 26256 - 11905: 0x95A5, - 26257 - 11905: 0xCAEE, - 26258 - 11905: 0x95A6, - 26259 - 11905: 0x95A7, - 26260 - 11905: 0x95A8, - 26261 - 11905: 0x95A9, - 26262 - 11905: 0xC5AF, - 26263 - 11905: 0xB0B5, - 26264 - 11905: 0x95AA, - 26265 - 11905: 0x95AB, - 26266 - 11905: 0x95AC, - 26267 - 11905: 0x95AD, - 26268 - 11905: 0x95AE, - 26269 - 11905: 0xEAD4, - 26270 - 11905: 0x95AF, - 26271 - 11905: 0x95B0, - 26272 - 11905: 0x95B1, - 26273 - 11905: 0x95B2, - 26274 - 11905: 0x95B3, - 26275 - 11905: 0x95B4, - 26276 - 11905: 0x95B5, - 26277 - 11905: 0x95B6, - 26278 - 11905: 0x95B7, - 26279 - 11905: 0xEAD3, - 26280 - 11905: 0xF4DF, - 26281 - 11905: 0x95B8, - 26282 - 11905: 0x95B9, - 26283 - 11905: 0x95BA, - 26284 - 11905: 0x95BB, - 26285 - 11905: 0x95BC, - 26286 - 11905: 0xC4BA, - 26287 - 11905: 0x95BD, - 26288 - 11905: 0x95BE, - 26289 - 11905: 0x95BF, - 26290 - 11905: 0x95C0, - 26291 - 11905: 0x95C1, - 26292 - 11905: 0xB1A9, - 26293 - 11905: 0x95C2, - 26294 - 11905: 0x95C3, - 26295 - 11905: 0x95C4, - 26296 - 11905: 0x95C5, - 26297 - 11905: 0xE5DF, - 26298 - 11905: 0x95C6, - 26299 - 11905: 0x95C7, - 26300 - 11905: 0x95C8, - 26301 - 11905: 0x95C9, - 26302 - 11905: 0xEAD5, - 26303 - 11905: 0x95CA, - 26304 - 11905: 0x95CB, - 26305 - 11905: 0x95CC, - 26306 - 11905: 0x95CD, - 26307 - 11905: 0x95CE, - 26308 - 11905: 0x95CF, - 26309 - 11905: 0x95D0, - 26310 - 11905: 0x95D1, - 26311 - 11905: 0x95D2, - 26312 - 11905: 0x95D3, - 26313 - 11905: 0x95D4, - 26314 - 11905: 0x95D5, - 26315 - 11905: 0x95D6, - 26316 - 11905: 0x95D7, - 26317 - 11905: 0x95D8, - 26318 - 11905: 0x95D9, - 26319 - 11905: 0x95DA, - 26320 - 11905: 0x95DB, - 26321 - 11905: 0x95DC, - 26322 - 11905: 0x95DD, - 26323 - 11905: 0x95DE, - 26324 - 11905: 0x95DF, - 26325 - 11905: 0x95E0, - 26326 - 11905: 0x95E1, - 26327 - 11905: 0x95E2, - 26328 - 11905: 0x95E3, - 26329 - 11905: 0xCAEF, - 26330 - 11905: 0x95E4, - 26331 - 11905: 0xEAD6, - 26332 - 11905: 0xEAD7, - 26333 - 11905: 0xC6D8, - 26334 - 11905: 0x95E5, - 26335 - 11905: 0x95E6, - 26336 - 11905: 0x95E7, - 26337 - 11905: 0x95E8, - 26338 - 11905: 0x95E9, - 26339 - 11905: 0x95EA, - 26340 - 11905: 0x95EB, - 26341 - 11905: 0x95EC, - 26342 - 11905: 0xEAD8, - 26343 - 11905: 0x95ED, - 26344 - 11905: 0x95EE, - 26345 - 11905: 0xEAD9, - 26346 - 11905: 0x95EF, - 26347 - 11905: 0x95F0, - 26348 - 11905: 0x95F1, - 26349 - 11905: 0x95F2, - 26350 - 11905: 0x95F3, - 26351 - 11905: 0x95F4, - 26352 - 11905: 0xD4BB, - 26353 - 11905: 0x95F5, - 26354 - 11905: 0xC7FA, - 26355 - 11905: 0xD2B7, - 26356 - 11905: 0xB8FC, - 26357 - 11905: 0x95F6, - 26358 - 11905: 0x95F7, - 26359 - 11905: 0xEAC2, - 26360 - 11905: 0x95F8, - 26361 - 11905: 0xB2DC, - 26362 - 11905: 0x95F9, - 26363 - 11905: 0x95FA, - 26364 - 11905: 0xC2FC, - 26365 - 11905: 0x95FB, - 26366 - 11905: 0xD4F8, - 26367 - 11905: 0xCCE6, - 26368 - 11905: 0xD7EE, - 26369 - 11905: 0x95FC, - 26370 - 11905: 0x95FD, - 26371 - 11905: 0x95FE, - 26372 - 11905: 0x9640, - 26373 - 11905: 0x9641, - 26374 - 11905: 0x9642, - 26375 - 11905: 0x9643, - 26376 - 11905: 0xD4C2, - 26377 - 11905: 0xD3D0, - 26378 - 11905: 0xEBC3, - 26379 - 11905: 0xC5F3, - 26380 - 11905: 0x9644, - 26381 - 11905: 0xB7FE, - 26382 - 11905: 0x9645, - 26383 - 11905: 0x9646, - 26384 - 11905: 0xEBD4, - 26385 - 11905: 0x9647, - 26386 - 11905: 0x9648, - 26387 - 11905: 0x9649, - 26388 - 11905: 0xCBB7, - 26389 - 11905: 0xEBDE, - 26390 - 11905: 0x964A, - 26391 - 11905: 0xC0CA, - 26392 - 11905: 0x964B, - 26393 - 11905: 0x964C, - 26394 - 11905: 0x964D, - 26395 - 11905: 0xCDFB, - 26396 - 11905: 0x964E, - 26397 - 11905: 0xB3AF, - 26398 - 11905: 0x964F, - 26399 - 11905: 0xC6DA, - 26400 - 11905: 0x9650, - 26401 - 11905: 0x9651, - 26402 - 11905: 0x9652, - 26403 - 11905: 0x9653, - 26404 - 11905: 0x9654, - 26405 - 11905: 0x9655, - 26406 - 11905: 0xEBFC, - 26407 - 11905: 0x9656, - 26408 - 11905: 0xC4BE, - 26409 - 11905: 0x9657, - 26410 - 11905: 0xCEB4, - 26411 - 11905: 0xC4A9, - 26412 - 11905: 0xB1BE, - 26413 - 11905: 0xD4FD, - 26414 - 11905: 0x9658, - 26415 - 11905: 0xCAF5, - 26416 - 11905: 0x9659, - 26417 - 11905: 0xD6EC, - 26418 - 11905: 0x965A, - 26419 - 11905: 0x965B, - 26420 - 11905: 0xC6D3, - 26421 - 11905: 0xB6E4, - 26422 - 11905: 0x965C, - 26423 - 11905: 0x965D, - 26424 - 11905: 0x965E, - 26425 - 11905: 0x965F, - 26426 - 11905: 0xBBFA, - 26427 - 11905: 0x9660, - 26428 - 11905: 0x9661, - 26429 - 11905: 0xD0E0, - 26430 - 11905: 0x9662, - 26431 - 11905: 0x9663, - 26432 - 11905: 0xC9B1, - 26433 - 11905: 0x9664, - 26434 - 11905: 0xD4D3, - 26435 - 11905: 0xC8A8, - 26436 - 11905: 0x9665, - 26437 - 11905: 0x9666, - 26438 - 11905: 0xB8CB, - 26439 - 11905: 0x9667, - 26440 - 11905: 0xE8BE, - 26441 - 11905: 0xC9BC, - 26442 - 11905: 0x9668, - 26443 - 11905: 0x9669, - 26444 - 11905: 0xE8BB, - 26445 - 11905: 0x966A, - 26446 - 11905: 0xC0EE, - 26447 - 11905: 0xD0D3, - 26448 - 11905: 0xB2C4, - 26449 - 11905: 0xB4E5, - 26450 - 11905: 0x966B, - 26451 - 11905: 0xE8BC, - 26452 - 11905: 0x966C, - 26453 - 11905: 0x966D, - 26454 - 11905: 0xD5C8, - 26455 - 11905: 0x966E, - 26456 - 11905: 0x966F, - 26457 - 11905: 0x9670, - 26458 - 11905: 0x9671, - 26459 - 11905: 0x9672, - 26460 - 11905: 0xB6C5, - 26461 - 11905: 0x9673, - 26462 - 11905: 0xE8BD, - 26463 - 11905: 0xCAF8, - 26464 - 11905: 0xB8DC, - 26465 - 11905: 0xCCF5, - 26466 - 11905: 0x9674, - 26467 - 11905: 0x9675, - 26468 - 11905: 0x9676, - 26469 - 11905: 0xC0B4, - 26470 - 11905: 0x9677, - 26471 - 11905: 0x9678, - 26472 - 11905: 0xD1EE, - 26473 - 11905: 0xE8BF, - 26474 - 11905: 0xE8C2, - 26475 - 11905: 0x9679, - 26476 - 11905: 0x967A, - 26477 - 11905: 0xBABC, - 26478 - 11905: 0x967B, - 26479 - 11905: 0xB1AD, - 26480 - 11905: 0xBDDC, - 26481 - 11905: 0x967C, - 26482 - 11905: 0xEABD, - 26483 - 11905: 0xE8C3, - 26484 - 11905: 0x967D, - 26485 - 11905: 0xE8C6, - 26486 - 11905: 0x967E, - 26487 - 11905: 0xE8CB, - 26488 - 11905: 0x9680, - 26489 - 11905: 0x9681, - 26490 - 11905: 0x9682, - 26491 - 11905: 0x9683, - 26492 - 11905: 0xE8CC, - 26493 - 11905: 0x9684, - 26494 - 11905: 0xCBC9, - 26495 - 11905: 0xB0E5, - 26496 - 11905: 0x9685, - 26497 - 11905: 0xBCAB, - 26498 - 11905: 0x9686, - 26499 - 11905: 0x9687, - 26500 - 11905: 0xB9B9, - 26501 - 11905: 0x9688, - 26502 - 11905: 0x9689, - 26503 - 11905: 0xE8C1, - 26504 - 11905: 0x968A, - 26505 - 11905: 0xCDF7, - 26506 - 11905: 0x968B, - 26507 - 11905: 0xE8CA, - 26508 - 11905: 0x968C, - 26509 - 11905: 0x968D, - 26510 - 11905: 0x968E, - 26511 - 11905: 0x968F, - 26512 - 11905: 0xCEF6, - 26513 - 11905: 0x9690, - 26514 - 11905: 0x9691, - 26515 - 11905: 0x9692, - 26516 - 11905: 0x9693, - 26517 - 11905: 0xD5ED, - 26518 - 11905: 0x9694, - 26519 - 11905: 0xC1D6, - 26520 - 11905: 0xE8C4, - 26521 - 11905: 0x9695, - 26522 - 11905: 0xC3B6, - 26523 - 11905: 0x9696, - 26524 - 11905: 0xB9FB, - 26525 - 11905: 0xD6A6, - 26526 - 11905: 0xE8C8, - 26527 - 11905: 0x9697, - 26528 - 11905: 0x9698, - 26529 - 11905: 0x9699, - 26530 - 11905: 0xCAE0, - 26531 - 11905: 0xD4E6, - 26532 - 11905: 0x969A, - 26533 - 11905: 0xE8C0, - 26534 - 11905: 0x969B, - 26535 - 11905: 0xE8C5, - 26536 - 11905: 0xE8C7, - 26537 - 11905: 0x969C, - 26538 - 11905: 0xC7B9, - 26539 - 11905: 0xB7E3, - 26540 - 11905: 0x969D, - 26541 - 11905: 0xE8C9, - 26542 - 11905: 0x969E, - 26543 - 11905: 0xBFDD, - 26544 - 11905: 0xE8D2, - 26545 - 11905: 0x969F, - 26546 - 11905: 0x96A0, - 26547 - 11905: 0xE8D7, - 26548 - 11905: 0x96A1, - 26549 - 11905: 0xE8D5, - 26550 - 11905: 0xBCDC, - 26551 - 11905: 0xBCCF, - 26552 - 11905: 0xE8DB, - 26553 - 11905: 0x96A2, - 26554 - 11905: 0x96A3, - 26555 - 11905: 0x96A4, - 26556 - 11905: 0x96A5, - 26557 - 11905: 0x96A6, - 26558 - 11905: 0x96A7, - 26559 - 11905: 0x96A8, - 26560 - 11905: 0x96A9, - 26561 - 11905: 0xE8DE, - 26562 - 11905: 0x96AA, - 26563 - 11905: 0xE8DA, - 26564 - 11905: 0xB1FA, - 26565 - 11905: 0x96AB, - 26566 - 11905: 0x96AC, - 26567 - 11905: 0x96AD, - 26568 - 11905: 0x96AE, - 26569 - 11905: 0x96AF, - 26570 - 11905: 0x96B0, - 26571 - 11905: 0x96B1, - 26572 - 11905: 0x96B2, - 26573 - 11905: 0x96B3, - 26574 - 11905: 0x96B4, - 26575 - 11905: 0xB0D8, - 26576 - 11905: 0xC4B3, - 26577 - 11905: 0xB8CC, - 26578 - 11905: 0xC6E2, - 26579 - 11905: 0xC8BE, - 26580 - 11905: 0xC8E1, - 26581 - 11905: 0x96B5, - 26582 - 11905: 0x96B6, - 26583 - 11905: 0x96B7, - 26584 - 11905: 0xE8CF, - 26585 - 11905: 0xE8D4, - 26586 - 11905: 0xE8D6, - 26587 - 11905: 0x96B8, - 26588 - 11905: 0xB9F1, - 26589 - 11905: 0xE8D8, - 26590 - 11905: 0xD7F5, - 26591 - 11905: 0x96B9, - 26592 - 11905: 0xC4FB, - 26593 - 11905: 0x96BA, - 26594 - 11905: 0xE8DC, - 26595 - 11905: 0x96BB, - 26596 - 11905: 0x96BC, - 26597 - 11905: 0xB2E9, - 26598 - 11905: 0x96BD, - 26599 - 11905: 0x96BE, - 26600 - 11905: 0x96BF, - 26601 - 11905: 0xE8D1, - 26602 - 11905: 0x96C0, - 26603 - 11905: 0x96C1, - 26604 - 11905: 0xBCED, - 26605 - 11905: 0x96C2, - 26606 - 11905: 0x96C3, - 26607 - 11905: 0xBFC2, - 26608 - 11905: 0xE8CD, - 26609 - 11905: 0xD6F9, - 26610 - 11905: 0x96C4, - 26611 - 11905: 0xC1F8, - 26612 - 11905: 0xB2F1, - 26613 - 11905: 0x96C5, - 26614 - 11905: 0x96C6, - 26615 - 11905: 0x96C7, - 26616 - 11905: 0x96C8, - 26617 - 11905: 0x96C9, - 26618 - 11905: 0x96CA, - 26619 - 11905: 0x96CB, - 26620 - 11905: 0x96CC, - 26621 - 11905: 0xE8DF, - 26622 - 11905: 0x96CD, - 26623 - 11905: 0xCAC1, - 26624 - 11905: 0xE8D9, - 26625 - 11905: 0x96CE, - 26626 - 11905: 0x96CF, - 26627 - 11905: 0x96D0, - 26628 - 11905: 0x96D1, - 26629 - 11905: 0xD5A4, - 26630 - 11905: 0x96D2, - 26631 - 11905: 0xB1EA, - 26632 - 11905: 0xD5BB, - 26633 - 11905: 0xE8CE, - 26634 - 11905: 0xE8D0, - 26635 - 11905: 0xB6B0, - 26636 - 11905: 0xE8D3, - 26637 - 11905: 0x96D3, - 26638 - 11905: 0xE8DD, - 26639 - 11905: 0xC0B8, - 26640 - 11905: 0x96D4, - 26641 - 11905: 0xCAF7, - 26642 - 11905: 0x96D5, - 26643 - 11905: 0xCBA8, - 26644 - 11905: 0x96D6, - 26645 - 11905: 0x96D7, - 26646 - 11905: 0xC6DC, - 26647 - 11905: 0xC0F5, - 26648 - 11905: 0x96D8, - 26649 - 11905: 0x96D9, - 26650 - 11905: 0x96DA, - 26651 - 11905: 0x96DB, - 26652 - 11905: 0x96DC, - 26653 - 11905: 0xE8E9, - 26654 - 11905: 0x96DD, - 26655 - 11905: 0x96DE, - 26656 - 11905: 0x96DF, - 26657 - 11905: 0xD0A3, - 26658 - 11905: 0x96E0, - 26659 - 11905: 0x96E1, - 26660 - 11905: 0x96E2, - 26661 - 11905: 0x96E3, - 26662 - 11905: 0x96E4, - 26663 - 11905: 0x96E5, - 26664 - 11905: 0x96E6, - 26665 - 11905: 0xE8F2, - 26666 - 11905: 0xD6EA, - 26667 - 11905: 0x96E7, - 26668 - 11905: 0x96E8, - 26669 - 11905: 0x96E9, - 26670 - 11905: 0x96EA, - 26671 - 11905: 0x96EB, - 26672 - 11905: 0x96EC, - 26673 - 11905: 0x96ED, - 26674 - 11905: 0xE8E0, - 26675 - 11905: 0xE8E1, - 26676 - 11905: 0x96EE, - 26677 - 11905: 0x96EF, - 26678 - 11905: 0x96F0, - 26679 - 11905: 0xD1F9, - 26680 - 11905: 0xBACB, - 26681 - 11905: 0xB8F9, - 26682 - 11905: 0x96F1, - 26683 - 11905: 0x96F2, - 26684 - 11905: 0xB8F1, - 26685 - 11905: 0xD4D4, - 26686 - 11905: 0xE8EF, - 26687 - 11905: 0x96F3, - 26688 - 11905: 0xE8EE, - 26689 - 11905: 0xE8EC, - 26690 - 11905: 0xB9F0, - 26691 - 11905: 0xCCD2, - 26692 - 11905: 0xE8E6, - 26693 - 11905: 0xCEA6, - 26694 - 11905: 0xBFF2, - 26695 - 11905: 0x96F4, - 26696 - 11905: 0xB0B8, - 26697 - 11905: 0xE8F1, - 26698 - 11905: 0xE8F0, - 26699 - 11905: 0x96F5, - 26700 - 11905: 0xD7C0, - 26701 - 11905: 0x96F6, - 26702 - 11905: 0xE8E4, - 26703 - 11905: 0x96F7, - 26704 - 11905: 0xCDA9, - 26705 - 11905: 0xC9A3, - 26706 - 11905: 0x96F8, - 26707 - 11905: 0xBBB8, - 26708 - 11905: 0xBDDB, - 26709 - 11905: 0xE8EA, - 26710 - 11905: 0x96F9, - 26711 - 11905: 0x96FA, - 26712 - 11905: 0x96FB, - 26713 - 11905: 0x96FC, - 26714 - 11905: 0x96FD, - 26715 - 11905: 0x96FE, - 26716 - 11905: 0x9740, - 26717 - 11905: 0x9741, - 26718 - 11905: 0x9742, - 26719 - 11905: 0x9743, - 26720 - 11905: 0xE8E2, - 26721 - 11905: 0xE8E3, - 26722 - 11905: 0xE8E5, - 26723 - 11905: 0xB5B5, - 26724 - 11905: 0xE8E7, - 26725 - 11905: 0xC7C5, - 26726 - 11905: 0xE8EB, - 26727 - 11905: 0xE8ED, - 26728 - 11905: 0xBDB0, - 26729 - 11905: 0xD7AE, - 26730 - 11905: 0x9744, - 26731 - 11905: 0xE8F8, - 26732 - 11905: 0x9745, - 26733 - 11905: 0x9746, - 26734 - 11905: 0x9747, - 26735 - 11905: 0x9748, - 26736 - 11905: 0x9749, - 26737 - 11905: 0x974A, - 26738 - 11905: 0x974B, - 26739 - 11905: 0x974C, - 26740 - 11905: 0xE8F5, - 26741 - 11905: 0x974D, - 26742 - 11905: 0xCDB0, - 26743 - 11905: 0xE8F6, - 26744 - 11905: 0x974E, - 26745 - 11905: 0x974F, - 26746 - 11905: 0x9750, - 26747 - 11905: 0x9751, - 26748 - 11905: 0x9752, - 26749 - 11905: 0x9753, - 26750 - 11905: 0x9754, - 26751 - 11905: 0x9755, - 26752 - 11905: 0x9756, - 26753 - 11905: 0xC1BA, - 26754 - 11905: 0x9757, - 26755 - 11905: 0xE8E8, - 26756 - 11905: 0x9758, - 26757 - 11905: 0xC3B7, - 26758 - 11905: 0xB0F0, - 26759 - 11905: 0x9759, - 26760 - 11905: 0x975A, - 26761 - 11905: 0x975B, - 26762 - 11905: 0x975C, - 26763 - 11905: 0x975D, - 26764 - 11905: 0x975E, - 26765 - 11905: 0x975F, - 26766 - 11905: 0x9760, - 26767 - 11905: 0xE8F4, - 26768 - 11905: 0x9761, - 26769 - 11905: 0x9762, - 26770 - 11905: 0x9763, - 26771 - 11905: 0xE8F7, - 26772 - 11905: 0x9764, - 26773 - 11905: 0x9765, - 26774 - 11905: 0x9766, - 26775 - 11905: 0xB9A3, - 26776 - 11905: 0x9767, - 26777 - 11905: 0x9768, - 26778 - 11905: 0x9769, - 26779 - 11905: 0x976A, - 26780 - 11905: 0x976B, - 26781 - 11905: 0x976C, - 26782 - 11905: 0x976D, - 26783 - 11905: 0x976E, - 26784 - 11905: 0x976F, - 26785 - 11905: 0x9770, - 26786 - 11905: 0xC9D2, - 26787 - 11905: 0x9771, - 26788 - 11905: 0x9772, - 26789 - 11905: 0x9773, - 26790 - 11905: 0xC3CE, - 26791 - 11905: 0xCEE0, - 26792 - 11905: 0xC0E6, - 26793 - 11905: 0x9774, - 26794 - 11905: 0x9775, - 26795 - 11905: 0x9776, - 26796 - 11905: 0x9777, - 26797 - 11905: 0xCBF3, - 26798 - 11905: 0x9778, - 26799 - 11905: 0xCCDD, - 26800 - 11905: 0xD0B5, - 26801 - 11905: 0x9779, - 26802 - 11905: 0x977A, - 26803 - 11905: 0xCAE1, - 26804 - 11905: 0x977B, - 26805 - 11905: 0xE8F3, - 26806 - 11905: 0x977C, - 26807 - 11905: 0x977D, - 26808 - 11905: 0x977E, - 26809 - 11905: 0x9780, - 26810 - 11905: 0x9781, - 26811 - 11905: 0x9782, - 26812 - 11905: 0x9783, - 26813 - 11905: 0x9784, - 26814 - 11905: 0x9785, - 26815 - 11905: 0x9786, - 26816 - 11905: 0xBCEC, - 26817 - 11905: 0x9787, - 26818 - 11905: 0xE8F9, - 26819 - 11905: 0x9788, - 26820 - 11905: 0x9789, - 26821 - 11905: 0x978A, - 26822 - 11905: 0x978B, - 26823 - 11905: 0x978C, - 26824 - 11905: 0x978D, - 26825 - 11905: 0xC3DE, - 26826 - 11905: 0x978E, - 26827 - 11905: 0xC6E5, - 26828 - 11905: 0x978F, - 26829 - 11905: 0xB9F7, - 26830 - 11905: 0x9790, - 26831 - 11905: 0x9791, - 26832 - 11905: 0x9792, - 26833 - 11905: 0x9793, - 26834 - 11905: 0xB0F4, - 26835 - 11905: 0x9794, - 26836 - 11905: 0x9795, - 26837 - 11905: 0xD7D8, - 26838 - 11905: 0x9796, - 26839 - 11905: 0x9797, - 26840 - 11905: 0xBCAC, - 26841 - 11905: 0x9798, - 26842 - 11905: 0xC5EF, - 26843 - 11905: 0x9799, - 26844 - 11905: 0x979A, - 26845 - 11905: 0x979B, - 26846 - 11905: 0x979C, - 26847 - 11905: 0x979D, - 26848 - 11905: 0xCCC4, - 26849 - 11905: 0x979E, - 26850 - 11905: 0x979F, - 26851 - 11905: 0xE9A6, - 26852 - 11905: 0x97A0, - 26853 - 11905: 0x97A1, - 26854 - 11905: 0x97A2, - 26855 - 11905: 0x97A3, - 26856 - 11905: 0x97A4, - 26857 - 11905: 0x97A5, - 26858 - 11905: 0x97A6, - 26859 - 11905: 0x97A7, - 26860 - 11905: 0x97A8, - 26861 - 11905: 0x97A9, - 26862 - 11905: 0xC9AD, - 26863 - 11905: 0x97AA, - 26864 - 11905: 0xE9A2, - 26865 - 11905: 0xC0E2, - 26866 - 11905: 0x97AB, - 26867 - 11905: 0x97AC, - 26868 - 11905: 0x97AD, - 26869 - 11905: 0xBFC3, - 26870 - 11905: 0x97AE, - 26871 - 11905: 0x97AF, - 26872 - 11905: 0x97B0, - 26873 - 11905: 0xE8FE, - 26874 - 11905: 0xB9D7, - 26875 - 11905: 0x97B1, - 26876 - 11905: 0xE8FB, - 26877 - 11905: 0x97B2, - 26878 - 11905: 0x97B3, - 26879 - 11905: 0x97B4, - 26880 - 11905: 0x97B5, - 26881 - 11905: 0xE9A4, - 26882 - 11905: 0x97B6, - 26883 - 11905: 0x97B7, - 26884 - 11905: 0x97B8, - 26885 - 11905: 0xD2CE, - 26886 - 11905: 0x97B9, - 26887 - 11905: 0x97BA, - 26888 - 11905: 0x97BB, - 26889 - 11905: 0x97BC, - 26890 - 11905: 0x97BD, - 26891 - 11905: 0xE9A3, - 26892 - 11905: 0x97BE, - 26893 - 11905: 0xD6B2, - 26894 - 11905: 0xD7B5, - 26895 - 11905: 0x97BF, - 26896 - 11905: 0xE9A7, - 26897 - 11905: 0x97C0, - 26898 - 11905: 0xBDB7, - 26899 - 11905: 0x97C1, - 26900 - 11905: 0x97C2, - 26901 - 11905: 0x97C3, - 26902 - 11905: 0x97C4, - 26903 - 11905: 0x97C5, - 26904 - 11905: 0x97C6, - 26905 - 11905: 0x97C7, - 26906 - 11905: 0x97C8, - 26907 - 11905: 0x97C9, - 26908 - 11905: 0x97CA, - 26909 - 11905: 0x97CB, - 26910 - 11905: 0x97CC, - 26911 - 11905: 0xE8FC, - 26912 - 11905: 0xE8FD, - 26913 - 11905: 0x97CD, - 26914 - 11905: 0x97CE, - 26915 - 11905: 0x97CF, - 26916 - 11905: 0xE9A1, - 26917 - 11905: 0x97D0, - 26918 - 11905: 0x97D1, - 26919 - 11905: 0x97D2, - 26920 - 11905: 0x97D3, - 26921 - 11905: 0x97D4, - 26922 - 11905: 0x97D5, - 26923 - 11905: 0x97D6, - 26924 - 11905: 0x97D7, - 26925 - 11905: 0xCDD6, - 26926 - 11905: 0x97D8, - 26927 - 11905: 0x97D9, - 26928 - 11905: 0xD2AC, - 26929 - 11905: 0x97DA, - 26930 - 11905: 0x97DB, - 26931 - 11905: 0x97DC, - 26932 - 11905: 0xE9B2, - 26933 - 11905: 0x97DD, - 26934 - 11905: 0x97DE, - 26935 - 11905: 0x97DF, - 26936 - 11905: 0x97E0, - 26937 - 11905: 0xE9A9, - 26938 - 11905: 0x97E1, - 26939 - 11905: 0x97E2, - 26940 - 11905: 0x97E3, - 26941 - 11905: 0xB4AA, - 26942 - 11905: 0x97E4, - 26943 - 11905: 0xB4BB, - 26944 - 11905: 0x97E5, - 26945 - 11905: 0x97E6, - 26946 - 11905: 0xE9AB, - 26947 - 11905: 0x97E7, - 26948 - 11905: 0x97E8, - 26949 - 11905: 0x97E9, - 26950 - 11905: 0x97EA, - 26951 - 11905: 0x97EB, - 26952 - 11905: 0x97EC, - 26953 - 11905: 0x97ED, - 26954 - 11905: 0x97EE, - 26955 - 11905: 0x97EF, - 26956 - 11905: 0x97F0, - 26957 - 11905: 0x97F1, - 26958 - 11905: 0x97F2, - 26959 - 11905: 0x97F3, - 26960 - 11905: 0x97F4, - 26961 - 11905: 0x97F5, - 26962 - 11905: 0x97F6, - 26963 - 11905: 0x97F7, - 26964 - 11905: 0xD0A8, - 26965 - 11905: 0x97F8, - 26966 - 11905: 0x97F9, - 26967 - 11905: 0xE9A5, - 26968 - 11905: 0x97FA, - 26969 - 11905: 0x97FB, - 26970 - 11905: 0xB3FE, - 26971 - 11905: 0x97FC, - 26972 - 11905: 0x97FD, - 26973 - 11905: 0xE9AC, - 26974 - 11905: 0xC0E3, - 26975 - 11905: 0x97FE, - 26976 - 11905: 0xE9AA, - 26977 - 11905: 0x9840, - 26978 - 11905: 0x9841, - 26979 - 11905: 0xE9B9, - 26980 - 11905: 0x9842, - 26981 - 11905: 0x9843, - 26982 - 11905: 0xE9B8, - 26983 - 11905: 0x9844, - 26984 - 11905: 0x9845, - 26985 - 11905: 0x9846, - 26986 - 11905: 0x9847, - 26987 - 11905: 0xE9AE, - 26988 - 11905: 0x9848, - 26989 - 11905: 0x9849, - 26990 - 11905: 0xE8FA, - 26991 - 11905: 0x984A, - 26992 - 11905: 0x984B, - 26993 - 11905: 0xE9A8, - 26994 - 11905: 0x984C, - 26995 - 11905: 0x984D, - 26996 - 11905: 0x984E, - 26997 - 11905: 0x984F, - 26998 - 11905: 0x9850, - 26999 - 11905: 0xBFAC, - 27000 - 11905: 0xE9B1, - 27001 - 11905: 0xE9BA, - 27002 - 11905: 0x9851, - 27003 - 11905: 0x9852, - 27004 - 11905: 0xC2A5, - 27005 - 11905: 0x9853, - 27006 - 11905: 0x9854, - 27007 - 11905: 0x9855, - 27008 - 11905: 0xE9AF, - 27009 - 11905: 0x9856, - 27010 - 11905: 0xB8C5, - 27011 - 11905: 0x9857, - 27012 - 11905: 0xE9AD, - 27013 - 11905: 0x9858, - 27014 - 11905: 0xD3DC, - 27015 - 11905: 0xE9B4, - 27016 - 11905: 0xE9B5, - 27017 - 11905: 0xE9B7, - 27018 - 11905: 0x9859, - 27019 - 11905: 0x985A, - 27020 - 11905: 0x985B, - 27021 - 11905: 0xE9C7, - 27022 - 11905: 0x985C, - 27023 - 11905: 0x985D, - 27024 - 11905: 0x985E, - 27025 - 11905: 0x985F, - 27026 - 11905: 0x9860, - 27027 - 11905: 0x9861, - 27028 - 11905: 0xC0C6, - 27029 - 11905: 0xE9C5, - 27030 - 11905: 0x9862, - 27031 - 11905: 0x9863, - 27032 - 11905: 0xE9B0, - 27033 - 11905: 0x9864, - 27034 - 11905: 0x9865, - 27035 - 11905: 0xE9BB, - 27036 - 11905: 0xB0F1, - 27037 - 11905: 0x9866, - 27038 - 11905: 0x9867, - 27039 - 11905: 0x9868, - 27040 - 11905: 0x9869, - 27041 - 11905: 0x986A, - 27042 - 11905: 0x986B, - 27043 - 11905: 0x986C, - 27044 - 11905: 0x986D, - 27045 - 11905: 0x986E, - 27046 - 11905: 0x986F, - 27047 - 11905: 0xE9BC, - 27048 - 11905: 0xD5A5, - 27049 - 11905: 0x9870, - 27050 - 11905: 0x9871, - 27051 - 11905: 0xE9BE, - 27052 - 11905: 0x9872, - 27053 - 11905: 0xE9BF, - 27054 - 11905: 0x9873, - 27055 - 11905: 0x9874, - 27056 - 11905: 0x9875, - 27057 - 11905: 0xE9C1, - 27058 - 11905: 0x9876, - 27059 - 11905: 0x9877, - 27060 - 11905: 0xC1F1, - 27061 - 11905: 0x9878, - 27062 - 11905: 0x9879, - 27063 - 11905: 0xC8B6, - 27064 - 11905: 0x987A, - 27065 - 11905: 0x987B, - 27066 - 11905: 0x987C, - 27067 - 11905: 0xE9BD, - 27068 - 11905: 0x987D, - 27069 - 11905: 0x987E, - 27070 - 11905: 0x9880, - 27071 - 11905: 0x9881, - 27072 - 11905: 0x9882, - 27073 - 11905: 0xE9C2, - 27074 - 11905: 0x9883, - 27075 - 11905: 0x9884, - 27076 - 11905: 0x9885, - 27077 - 11905: 0x9886, - 27078 - 11905: 0x9887, - 27079 - 11905: 0x9888, - 27080 - 11905: 0x9889, - 27081 - 11905: 0x988A, - 27082 - 11905: 0xE9C3, - 27083 - 11905: 0x988B, - 27084 - 11905: 0xE9B3, - 27085 - 11905: 0x988C, - 27086 - 11905: 0xE9B6, - 27087 - 11905: 0x988D, - 27088 - 11905: 0xBBB1, - 27089 - 11905: 0x988E, - 27090 - 11905: 0x988F, - 27091 - 11905: 0x9890, - 27092 - 11905: 0xE9C0, - 27093 - 11905: 0x9891, - 27094 - 11905: 0x9892, - 27095 - 11905: 0x9893, - 27096 - 11905: 0x9894, - 27097 - 11905: 0x9895, - 27098 - 11905: 0x9896, - 27099 - 11905: 0xBCF7, - 27100 - 11905: 0x9897, - 27101 - 11905: 0x9898, - 27102 - 11905: 0x9899, - 27103 - 11905: 0xE9C4, - 27104 - 11905: 0xE9C6, - 27105 - 11905: 0x989A, - 27106 - 11905: 0x989B, - 27107 - 11905: 0x989C, - 27108 - 11905: 0x989D, - 27109 - 11905: 0x989E, - 27110 - 11905: 0x989F, - 27111 - 11905: 0x98A0, - 27112 - 11905: 0x98A1, - 27113 - 11905: 0x98A2, - 27114 - 11905: 0x98A3, - 27115 - 11905: 0x98A4, - 27116 - 11905: 0x98A5, - 27117 - 11905: 0xE9CA, - 27118 - 11905: 0x98A6, - 27119 - 11905: 0x98A7, - 27120 - 11905: 0x98A8, - 27121 - 11905: 0x98A9, - 27122 - 11905: 0xE9CE, - 27123 - 11905: 0x98AA, - 27124 - 11905: 0x98AB, - 27125 - 11905: 0x98AC, - 27126 - 11905: 0x98AD, - 27127 - 11905: 0x98AE, - 27128 - 11905: 0x98AF, - 27129 - 11905: 0x98B0, - 27130 - 11905: 0x98B1, - 27131 - 11905: 0x98B2, - 27132 - 11905: 0x98B3, - 27133 - 11905: 0xB2DB, - 27134 - 11905: 0x98B4, - 27135 - 11905: 0xE9C8, - 27136 - 11905: 0x98B5, - 27137 - 11905: 0x98B6, - 27138 - 11905: 0x98B7, - 27139 - 11905: 0x98B8, - 27140 - 11905: 0x98B9, - 27141 - 11905: 0x98BA, - 27142 - 11905: 0x98BB, - 27143 - 11905: 0x98BC, - 27144 - 11905: 0x98BD, - 27145 - 11905: 0x98BE, - 27146 - 11905: 0xB7AE, - 27147 - 11905: 0x98BF, - 27148 - 11905: 0x98C0, - 27149 - 11905: 0x98C1, - 27150 - 11905: 0x98C2, - 27151 - 11905: 0x98C3, - 27152 - 11905: 0x98C4, - 27153 - 11905: 0x98C5, - 27154 - 11905: 0x98C6, - 27155 - 11905: 0x98C7, - 27156 - 11905: 0x98C8, - 27157 - 11905: 0x98C9, - 27158 - 11905: 0x98CA, - 27159 - 11905: 0xE9CB, - 27160 - 11905: 0xE9CC, - 27161 - 11905: 0x98CB, - 27162 - 11905: 0x98CC, - 27163 - 11905: 0x98CD, - 27164 - 11905: 0x98CE, - 27165 - 11905: 0x98CF, - 27166 - 11905: 0x98D0, - 27167 - 11905: 0xD5C1, - 27168 - 11905: 0x98D1, - 27169 - 11905: 0xC4A3, - 27170 - 11905: 0x98D2, - 27171 - 11905: 0x98D3, - 27172 - 11905: 0x98D4, - 27173 - 11905: 0x98D5, - 27174 - 11905: 0x98D6, - 27175 - 11905: 0x98D7, - 27176 - 11905: 0xE9D8, - 27177 - 11905: 0x98D8, - 27178 - 11905: 0xBAE1, - 27179 - 11905: 0x98D9, - 27180 - 11905: 0x98DA, - 27181 - 11905: 0x98DB, - 27182 - 11905: 0x98DC, - 27183 - 11905: 0xE9C9, - 27184 - 11905: 0x98DD, - 27185 - 11905: 0xD3A3, - 27186 - 11905: 0x98DE, - 27187 - 11905: 0x98DF, - 27188 - 11905: 0x98E0, - 27189 - 11905: 0xE9D4, - 27190 - 11905: 0x98E1, - 27191 - 11905: 0x98E2, - 27192 - 11905: 0x98E3, - 27193 - 11905: 0x98E4, - 27194 - 11905: 0x98E5, - 27195 - 11905: 0x98E6, - 27196 - 11905: 0x98E7, - 27197 - 11905: 0xE9D7, - 27198 - 11905: 0xE9D0, - 27199 - 11905: 0x98E8, - 27200 - 11905: 0x98E9, - 27201 - 11905: 0x98EA, - 27202 - 11905: 0x98EB, - 27203 - 11905: 0x98EC, - 27204 - 11905: 0xE9CF, - 27205 - 11905: 0x98ED, - 27206 - 11905: 0x98EE, - 27207 - 11905: 0xC7C1, - 27208 - 11905: 0x98EF, - 27209 - 11905: 0x98F0, - 27210 - 11905: 0x98F1, - 27211 - 11905: 0x98F2, - 27212 - 11905: 0x98F3, - 27213 - 11905: 0x98F4, - 27214 - 11905: 0x98F5, - 27215 - 11905: 0x98F6, - 27216 - 11905: 0xE9D2, - 27217 - 11905: 0x98F7, - 27218 - 11905: 0x98F8, - 27219 - 11905: 0x98F9, - 27220 - 11905: 0x98FA, - 27221 - 11905: 0x98FB, - 27222 - 11905: 0x98FC, - 27223 - 11905: 0x98FD, - 27224 - 11905: 0xE9D9, - 27225 - 11905: 0xB3C8, - 27226 - 11905: 0x98FE, - 27227 - 11905: 0xE9D3, - 27228 - 11905: 0x9940, - 27229 - 11905: 0x9941, - 27230 - 11905: 0x9942, - 27231 - 11905: 0x9943, - 27232 - 11905: 0x9944, - 27233 - 11905: 0xCFF0, - 27234 - 11905: 0x9945, - 27235 - 11905: 0x9946, - 27236 - 11905: 0x9947, - 27237 - 11905: 0xE9CD, - 27238 - 11905: 0x9948, - 27239 - 11905: 0x9949, - 27240 - 11905: 0x994A, - 27241 - 11905: 0x994B, - 27242 - 11905: 0x994C, - 27243 - 11905: 0x994D, - 27244 - 11905: 0x994E, - 27245 - 11905: 0x994F, - 27246 - 11905: 0x9950, - 27247 - 11905: 0x9951, - 27248 - 11905: 0x9952, - 27249 - 11905: 0xB3F7, - 27250 - 11905: 0x9953, - 27251 - 11905: 0x9954, - 27252 - 11905: 0x9955, - 27253 - 11905: 0x9956, - 27254 - 11905: 0x9957, - 27255 - 11905: 0x9958, - 27256 - 11905: 0x9959, - 27257 - 11905: 0xE9D6, - 27258 - 11905: 0x995A, - 27259 - 11905: 0x995B, - 27260 - 11905: 0xE9DA, - 27261 - 11905: 0x995C, - 27262 - 11905: 0x995D, - 27263 - 11905: 0x995E, - 27264 - 11905: 0xCCB4, - 27265 - 11905: 0x995F, - 27266 - 11905: 0x9960, - 27267 - 11905: 0x9961, - 27268 - 11905: 0xCFAD, - 27269 - 11905: 0x9962, - 27270 - 11905: 0x9963, - 27271 - 11905: 0x9964, - 27272 - 11905: 0x9965, - 27273 - 11905: 0x9966, - 27274 - 11905: 0x9967, - 27275 - 11905: 0x9968, - 27276 - 11905: 0x9969, - 27277 - 11905: 0x996A, - 27278 - 11905: 0xE9D5, - 27279 - 11905: 0x996B, - 27280 - 11905: 0xE9DC, - 27281 - 11905: 0xE9DB, - 27282 - 11905: 0x996C, - 27283 - 11905: 0x996D, - 27284 - 11905: 0x996E, - 27285 - 11905: 0x996F, - 27286 - 11905: 0x9970, - 27287 - 11905: 0xE9DE, - 27288 - 11905: 0x9971, - 27289 - 11905: 0x9972, - 27290 - 11905: 0x9973, - 27291 - 11905: 0x9974, - 27292 - 11905: 0x9975, - 27293 - 11905: 0x9976, - 27294 - 11905: 0x9977, - 27295 - 11905: 0x9978, - 27296 - 11905: 0xE9D1, - 27297 - 11905: 0x9979, - 27298 - 11905: 0x997A, - 27299 - 11905: 0x997B, - 27300 - 11905: 0x997C, - 27301 - 11905: 0x997D, - 27302 - 11905: 0x997E, - 27303 - 11905: 0x9980, - 27304 - 11905: 0x9981, - 27305 - 11905: 0xE9DD, - 27306 - 11905: 0x9982, - 27307 - 11905: 0xE9DF, - 27308 - 11905: 0xC3CA, - 27309 - 11905: 0x9983, - 27310 - 11905: 0x9984, - 27311 - 11905: 0x9985, - 27312 - 11905: 0x9986, - 27313 - 11905: 0x9987, - 27314 - 11905: 0x9988, - 27315 - 11905: 0x9989, - 27316 - 11905: 0x998A, - 27317 - 11905: 0x998B, - 27318 - 11905: 0x998C, - 27319 - 11905: 0x998D, - 27320 - 11905: 0x998E, - 27321 - 11905: 0x998F, - 27322 - 11905: 0x9990, - 27323 - 11905: 0x9991, - 27324 - 11905: 0x9992, - 27325 - 11905: 0x9993, - 27326 - 11905: 0x9994, - 27327 - 11905: 0x9995, - 27328 - 11905: 0x9996, - 27329 - 11905: 0x9997, - 27330 - 11905: 0x9998, - 27331 - 11905: 0x9999, - 27332 - 11905: 0x999A, - 27333 - 11905: 0x999B, - 27334 - 11905: 0x999C, - 27335 - 11905: 0x999D, - 27336 - 11905: 0x999E, - 27337 - 11905: 0x999F, - 27338 - 11905: 0x99A0, - 27339 - 11905: 0x99A1, - 27340 - 11905: 0x99A2, - 27341 - 11905: 0x99A3, - 27342 - 11905: 0x99A4, - 27343 - 11905: 0x99A5, - 27344 - 11905: 0x99A6, - 27345 - 11905: 0x99A7, - 27346 - 11905: 0x99A8, - 27347 - 11905: 0x99A9, - 27348 - 11905: 0x99AA, - 27349 - 11905: 0x99AB, - 27350 - 11905: 0x99AC, - 27351 - 11905: 0x99AD, - 27352 - 11905: 0x99AE, - 27353 - 11905: 0x99AF, - 27354 - 11905: 0x99B0, - 27355 - 11905: 0x99B1, - 27356 - 11905: 0x99B2, - 27357 - 11905: 0x99B3, - 27358 - 11905: 0x99B4, - 27359 - 11905: 0x99B5, - 27360 - 11905: 0x99B6, - 27361 - 11905: 0x99B7, - 27362 - 11905: 0x99B8, - 27363 - 11905: 0x99B9, - 27364 - 11905: 0x99BA, - 27365 - 11905: 0x99BB, - 27366 - 11905: 0x99BC, - 27367 - 11905: 0x99BD, - 27368 - 11905: 0x99BE, - 27369 - 11905: 0x99BF, - 27370 - 11905: 0x99C0, - 27371 - 11905: 0x99C1, - 27372 - 11905: 0x99C2, - 27373 - 11905: 0x99C3, - 27374 - 11905: 0x99C4, - 27375 - 11905: 0x99C5, - 27376 - 11905: 0x99C6, - 27377 - 11905: 0x99C7, - 27378 - 11905: 0x99C8, - 27379 - 11905: 0x99C9, - 27380 - 11905: 0x99CA, - 27381 - 11905: 0x99CB, - 27382 - 11905: 0x99CC, - 27383 - 11905: 0x99CD, - 27384 - 11905: 0x99CE, - 27385 - 11905: 0x99CF, - 27386 - 11905: 0x99D0, - 27387 - 11905: 0x99D1, - 27388 - 11905: 0x99D2, - 27389 - 11905: 0x99D3, - 27390 - 11905: 0x99D4, - 27391 - 11905: 0x99D5, - 27392 - 11905: 0x99D6, - 27393 - 11905: 0x99D7, - 27394 - 11905: 0x99D8, - 27395 - 11905: 0x99D9, - 27396 - 11905: 0x99DA, - 27397 - 11905: 0x99DB, - 27398 - 11905: 0x99DC, - 27399 - 11905: 0x99DD, - 27400 - 11905: 0x99DE, - 27401 - 11905: 0x99DF, - 27402 - 11905: 0x99E0, - 27403 - 11905: 0x99E1, - 27404 - 11905: 0x99E2, - 27405 - 11905: 0x99E3, - 27406 - 11905: 0x99E4, - 27407 - 11905: 0x99E5, - 27408 - 11905: 0x99E6, - 27409 - 11905: 0x99E7, - 27410 - 11905: 0x99E8, - 27411 - 11905: 0x99E9, - 27412 - 11905: 0x99EA, - 27413 - 11905: 0x99EB, - 27414 - 11905: 0x99EC, - 27415 - 11905: 0x99ED, - 27416 - 11905: 0x99EE, - 27417 - 11905: 0x99EF, - 27418 - 11905: 0x99F0, - 27419 - 11905: 0x99F1, - 27420 - 11905: 0x99F2, - 27421 - 11905: 0x99F3, - 27422 - 11905: 0x99F4, - 27423 - 11905: 0x99F5, - 27424 - 11905: 0xC7B7, - 27425 - 11905: 0xB4CE, - 27426 - 11905: 0xBBB6, - 27427 - 11905: 0xD0C0, - 27428 - 11905: 0xECA3, - 27429 - 11905: 0x99F6, - 27430 - 11905: 0x99F7, - 27431 - 11905: 0xC5B7, - 27432 - 11905: 0x99F8, - 27433 - 11905: 0x99F9, - 27434 - 11905: 0x99FA, - 27435 - 11905: 0x99FB, - 27436 - 11905: 0x99FC, - 27437 - 11905: 0x99FD, - 27438 - 11905: 0x99FE, - 27439 - 11905: 0x9A40, - 27440 - 11905: 0x9A41, - 27441 - 11905: 0x9A42, - 27442 - 11905: 0xD3FB, - 27443 - 11905: 0x9A43, - 27444 - 11905: 0x9A44, - 27445 - 11905: 0x9A45, - 27446 - 11905: 0x9A46, - 27447 - 11905: 0xECA4, - 27448 - 11905: 0x9A47, - 27449 - 11905: 0xECA5, - 27450 - 11905: 0xC6DB, - 27451 - 11905: 0x9A48, - 27452 - 11905: 0x9A49, - 27453 - 11905: 0x9A4A, - 27454 - 11905: 0xBFEE, - 27455 - 11905: 0x9A4B, - 27456 - 11905: 0x9A4C, - 27457 - 11905: 0x9A4D, - 27458 - 11905: 0x9A4E, - 27459 - 11905: 0xECA6, - 27460 - 11905: 0x9A4F, - 27461 - 11905: 0x9A50, - 27462 - 11905: 0xECA7, - 27463 - 11905: 0xD0AA, - 27464 - 11905: 0x9A51, - 27465 - 11905: 0xC7B8, - 27466 - 11905: 0x9A52, - 27467 - 11905: 0x9A53, - 27468 - 11905: 0xB8E8, - 27469 - 11905: 0x9A54, - 27470 - 11905: 0x9A55, - 27471 - 11905: 0x9A56, - 27472 - 11905: 0x9A57, - 27473 - 11905: 0x9A58, - 27474 - 11905: 0x9A59, - 27475 - 11905: 0x9A5A, - 27476 - 11905: 0x9A5B, - 27477 - 11905: 0x9A5C, - 27478 - 11905: 0x9A5D, - 27479 - 11905: 0x9A5E, - 27480 - 11905: 0x9A5F, - 27481 - 11905: 0xECA8, - 27482 - 11905: 0x9A60, - 27483 - 11905: 0x9A61, - 27484 - 11905: 0x9A62, - 27485 - 11905: 0x9A63, - 27486 - 11905: 0x9A64, - 27487 - 11905: 0x9A65, - 27488 - 11905: 0x9A66, - 27489 - 11905: 0x9A67, - 27490 - 11905: 0xD6B9, - 27491 - 11905: 0xD5FD, - 27492 - 11905: 0xB4CB, - 27493 - 11905: 0xB2BD, - 27494 - 11905: 0xCEE4, - 27495 - 11905: 0xC6E7, - 27496 - 11905: 0x9A68, - 27497 - 11905: 0x9A69, - 27498 - 11905: 0xCDE1, - 27499 - 11905: 0x9A6A, - 27500 - 11905: 0x9A6B, - 27501 - 11905: 0x9A6C, - 27502 - 11905: 0x9A6D, - 27503 - 11905: 0x9A6E, - 27504 - 11905: 0x9A6F, - 27505 - 11905: 0x9A70, - 27506 - 11905: 0x9A71, - 27507 - 11905: 0x9A72, - 27508 - 11905: 0x9A73, - 27509 - 11905: 0x9A74, - 27510 - 11905: 0x9A75, - 27511 - 11905: 0x9A76, - 27512 - 11905: 0x9A77, - 27513 - 11905: 0xB4F5, - 27514 - 11905: 0x9A78, - 27515 - 11905: 0xCBC0, - 27516 - 11905: 0xBCDF, - 27517 - 11905: 0x9A79, - 27518 - 11905: 0x9A7A, - 27519 - 11905: 0x9A7B, - 27520 - 11905: 0x9A7C, - 27521 - 11905: 0xE9E2, - 27522 - 11905: 0xE9E3, - 27523 - 11905: 0xD1EA, - 27524 - 11905: 0xE9E5, - 27525 - 11905: 0x9A7D, - 27526 - 11905: 0xB4F9, - 27527 - 11905: 0xE9E4, - 27528 - 11905: 0x9A7E, - 27529 - 11905: 0xD1B3, - 27530 - 11905: 0xCAE2, - 27531 - 11905: 0xB2D0, - 27532 - 11905: 0x9A80, - 27533 - 11905: 0xE9E8, - 27534 - 11905: 0x9A81, - 27535 - 11905: 0x9A82, - 27536 - 11905: 0x9A83, - 27537 - 11905: 0x9A84, - 27538 - 11905: 0xE9E6, - 27539 - 11905: 0xE9E7, - 27540 - 11905: 0x9A85, - 27541 - 11905: 0x9A86, - 27542 - 11905: 0xD6B3, - 27543 - 11905: 0x9A87, - 27544 - 11905: 0x9A88, - 27545 - 11905: 0x9A89, - 27546 - 11905: 0xE9E9, - 27547 - 11905: 0xE9EA, - 27548 - 11905: 0x9A8A, - 27549 - 11905: 0x9A8B, - 27550 - 11905: 0x9A8C, - 27551 - 11905: 0x9A8D, - 27552 - 11905: 0x9A8E, - 27553 - 11905: 0xE9EB, - 27554 - 11905: 0x9A8F, - 27555 - 11905: 0x9A90, - 27556 - 11905: 0x9A91, - 27557 - 11905: 0x9A92, - 27558 - 11905: 0x9A93, - 27559 - 11905: 0x9A94, - 27560 - 11905: 0x9A95, - 27561 - 11905: 0x9A96, - 27562 - 11905: 0xE9EC, - 27563 - 11905: 0x9A97, - 27564 - 11905: 0x9A98, - 27565 - 11905: 0x9A99, - 27566 - 11905: 0x9A9A, - 27567 - 11905: 0x9A9B, - 27568 - 11905: 0x9A9C, - 27569 - 11905: 0x9A9D, - 27570 - 11905: 0x9A9E, - 27571 - 11905: 0xECAF, - 27572 - 11905: 0xC5B9, - 27573 - 11905: 0xB6CE, - 27574 - 11905: 0x9A9F, - 27575 - 11905: 0xD2F3, - 27576 - 11905: 0x9AA0, - 27577 - 11905: 0x9AA1, - 27578 - 11905: 0x9AA2, - 27579 - 11905: 0x9AA3, - 27580 - 11905: 0x9AA4, - 27581 - 11905: 0x9AA5, - 27582 - 11905: 0x9AA6, - 27583 - 11905: 0xB5EE, - 27584 - 11905: 0x9AA7, - 27585 - 11905: 0xBBD9, - 27586 - 11905: 0xECB1, - 27587 - 11905: 0x9AA8, - 27588 - 11905: 0x9AA9, - 27589 - 11905: 0xD2E3, - 27590 - 11905: 0x9AAA, - 27591 - 11905: 0x9AAB, - 27592 - 11905: 0x9AAC, - 27593 - 11905: 0x9AAD, - 27594 - 11905: 0x9AAE, - 27595 - 11905: 0xCEE3, - 27596 - 11905: 0x9AAF, - 27597 - 11905: 0xC4B8, - 27598 - 11905: 0x9AB0, - 27599 - 11905: 0xC3BF, - 27600 - 11905: 0x9AB1, - 27601 - 11905: 0x9AB2, - 27602 - 11905: 0xB6BE, - 27603 - 11905: 0xD8B9, - 27604 - 11905: 0xB1C8, - 27605 - 11905: 0xB1CF, - 27606 - 11905: 0xB1D1, - 27607 - 11905: 0xC5FE, - 27608 - 11905: 0x9AB3, - 27609 - 11905: 0xB1D0, - 27610 - 11905: 0x9AB4, - 27611 - 11905: 0xC3AB, - 27612 - 11905: 0x9AB5, - 27613 - 11905: 0x9AB6, - 27614 - 11905: 0x9AB7, - 27615 - 11905: 0x9AB8, - 27616 - 11905: 0x9AB9, - 27617 - 11905: 0xD5B1, - 27618 - 11905: 0x9ABA, - 27619 - 11905: 0x9ABB, - 27620 - 11905: 0x9ABC, - 27621 - 11905: 0x9ABD, - 27622 - 11905: 0x9ABE, - 27623 - 11905: 0x9ABF, - 27624 - 11905: 0x9AC0, - 27625 - 11905: 0x9AC1, - 27626 - 11905: 0xEBA4, - 27627 - 11905: 0xBAC1, - 27628 - 11905: 0x9AC2, - 27629 - 11905: 0x9AC3, - 27630 - 11905: 0x9AC4, - 27631 - 11905: 0xCCBA, - 27632 - 11905: 0x9AC5, - 27633 - 11905: 0x9AC6, - 27634 - 11905: 0x9AC7, - 27635 - 11905: 0xEBA5, - 27636 - 11905: 0x9AC8, - 27637 - 11905: 0xEBA7, - 27638 - 11905: 0x9AC9, - 27639 - 11905: 0x9ACA, - 27640 - 11905: 0x9ACB, - 27641 - 11905: 0xEBA8, - 27642 - 11905: 0x9ACC, - 27643 - 11905: 0x9ACD, - 27644 - 11905: 0x9ACE, - 27645 - 11905: 0xEBA6, - 27646 - 11905: 0x9ACF, - 27647 - 11905: 0x9AD0, - 27648 - 11905: 0x9AD1, - 27649 - 11905: 0x9AD2, - 27650 - 11905: 0x9AD3, - 27651 - 11905: 0x9AD4, - 27652 - 11905: 0x9AD5, - 27653 - 11905: 0xEBA9, - 27654 - 11905: 0xEBAB, - 27655 - 11905: 0xEBAA, - 27656 - 11905: 0x9AD6, - 27657 - 11905: 0x9AD7, - 27658 - 11905: 0x9AD8, - 27659 - 11905: 0x9AD9, - 27660 - 11905: 0x9ADA, - 27661 - 11905: 0xEBAC, - 27662 - 11905: 0x9ADB, - 27663 - 11905: 0xCACF, - 27664 - 11905: 0xD8B5, - 27665 - 11905: 0xC3F1, - 27666 - 11905: 0x9ADC, - 27667 - 11905: 0xC3A5, - 27668 - 11905: 0xC6F8, - 27669 - 11905: 0xEBAD, - 27670 - 11905: 0xC4CA, - 27671 - 11905: 0x9ADD, - 27672 - 11905: 0xEBAE, - 27673 - 11905: 0xEBAF, - 27674 - 11905: 0xEBB0, - 27675 - 11905: 0xB7D5, - 27676 - 11905: 0x9ADE, - 27677 - 11905: 0x9ADF, - 27678 - 11905: 0x9AE0, - 27679 - 11905: 0xB7FA, - 27680 - 11905: 0x9AE1, - 27681 - 11905: 0xEBB1, - 27682 - 11905: 0xC7E2, - 27683 - 11905: 0x9AE2, - 27684 - 11905: 0xEBB3, - 27685 - 11905: 0x9AE3, - 27686 - 11905: 0xBAA4, - 27687 - 11905: 0xD1F5, - 27688 - 11905: 0xB0B1, - 27689 - 11905: 0xEBB2, - 27690 - 11905: 0xEBB4, - 27691 - 11905: 0x9AE4, - 27692 - 11905: 0x9AE5, - 27693 - 11905: 0x9AE6, - 27694 - 11905: 0xB5AA, - 27695 - 11905: 0xC2C8, - 27696 - 11905: 0xC7E8, - 27697 - 11905: 0x9AE7, - 27698 - 11905: 0xEBB5, - 27699 - 11905: 0x9AE8, - 27700 - 11905: 0xCBAE, - 27701 - 11905: 0xE3DF, - 27702 - 11905: 0x9AE9, - 27703 - 11905: 0x9AEA, - 27704 - 11905: 0xD3C0, - 27705 - 11905: 0x9AEB, - 27706 - 11905: 0x9AEC, - 27707 - 11905: 0x9AED, - 27708 - 11905: 0x9AEE, - 27709 - 11905: 0xD9DB, - 27710 - 11905: 0x9AEF, - 27711 - 11905: 0x9AF0, - 27712 - 11905: 0xCDA1, - 27713 - 11905: 0xD6AD, - 27714 - 11905: 0xC7F3, - 27715 - 11905: 0x9AF1, - 27716 - 11905: 0x9AF2, - 27717 - 11905: 0x9AF3, - 27718 - 11905: 0xD9E0, - 27719 - 11905: 0xBBE3, - 27720 - 11905: 0x9AF4, - 27721 - 11905: 0xBABA, - 27722 - 11905: 0xE3E2, - 27723 - 11905: 0x9AF5, - 27724 - 11905: 0x9AF6, - 27725 - 11905: 0x9AF7, - 27726 - 11905: 0x9AF8, - 27727 - 11905: 0x9AF9, - 27728 - 11905: 0xCFAB, - 27729 - 11905: 0x9AFA, - 27730 - 11905: 0x9AFB, - 27731 - 11905: 0x9AFC, - 27732 - 11905: 0xE3E0, - 27733 - 11905: 0xC9C7, - 27734 - 11905: 0x9AFD, - 27735 - 11905: 0xBAB9, - 27736 - 11905: 0x9AFE, - 27737 - 11905: 0x9B40, - 27738 - 11905: 0x9B41, - 27739 - 11905: 0xD1B4, - 27740 - 11905: 0xE3E1, - 27741 - 11905: 0xC8EA, - 27742 - 11905: 0xB9AF, - 27743 - 11905: 0xBDAD, - 27744 - 11905: 0xB3D8, - 27745 - 11905: 0xCEDB, - 27746 - 11905: 0x9B42, - 27747 - 11905: 0x9B43, - 27748 - 11905: 0xCCC0, - 27749 - 11905: 0x9B44, - 27750 - 11905: 0x9B45, - 27751 - 11905: 0x9B46, - 27752 - 11905: 0xE3E8, - 27753 - 11905: 0xE3E9, - 27754 - 11905: 0xCDF4, - 27755 - 11905: 0x9B47, - 27756 - 11905: 0x9B48, - 27757 - 11905: 0x9B49, - 27758 - 11905: 0x9B4A, - 27759 - 11905: 0x9B4B, - 27760 - 11905: 0xCCAD, - 27761 - 11905: 0x9B4C, - 27762 - 11905: 0xBCB3, - 27763 - 11905: 0x9B4D, - 27764 - 11905: 0xE3EA, - 27765 - 11905: 0x9B4E, - 27766 - 11905: 0xE3EB, - 27767 - 11905: 0x9B4F, - 27768 - 11905: 0x9B50, - 27769 - 11905: 0xD0DA, - 27770 - 11905: 0x9B51, - 27771 - 11905: 0x9B52, - 27772 - 11905: 0x9B53, - 27773 - 11905: 0xC6FB, - 27774 - 11905: 0xB7DA, - 27775 - 11905: 0x9B54, - 27776 - 11905: 0x9B55, - 27777 - 11905: 0xC7DF, - 27778 - 11905: 0xD2CA, - 27779 - 11905: 0xCED6, - 27780 - 11905: 0x9B56, - 27781 - 11905: 0xE3E4, - 27782 - 11905: 0xE3EC, - 27783 - 11905: 0x9B57, - 27784 - 11905: 0xC9F2, - 27785 - 11905: 0xB3C1, - 27786 - 11905: 0x9B58, - 27787 - 11905: 0x9B59, - 27788 - 11905: 0xE3E7, - 27789 - 11905: 0x9B5A, - 27790 - 11905: 0x9B5B, - 27791 - 11905: 0xC6E3, - 27792 - 11905: 0xE3E5, - 27793 - 11905: 0x9B5C, - 27794 - 11905: 0x9B5D, - 27795 - 11905: 0xEDB3, - 27796 - 11905: 0xE3E6, - 27797 - 11905: 0x9B5E, - 27798 - 11905: 0x9B5F, - 27799 - 11905: 0x9B60, - 27800 - 11905: 0x9B61, - 27801 - 11905: 0xC9B3, - 27802 - 11905: 0x9B62, - 27803 - 11905: 0xC5E6, - 27804 - 11905: 0x9B63, - 27805 - 11905: 0x9B64, - 27806 - 11905: 0x9B65, - 27807 - 11905: 0xB9B5, - 27808 - 11905: 0x9B66, - 27809 - 11905: 0xC3BB, - 27810 - 11905: 0x9B67, - 27811 - 11905: 0xE3E3, - 27812 - 11905: 0xC5BD, - 27813 - 11905: 0xC1A4, - 27814 - 11905: 0xC2D9, - 27815 - 11905: 0xB2D7, - 27816 - 11905: 0x9B68, - 27817 - 11905: 0xE3ED, - 27818 - 11905: 0xBBA6, - 27819 - 11905: 0xC4AD, - 27820 - 11905: 0x9B69, - 27821 - 11905: 0xE3F0, - 27822 - 11905: 0xBEDA, - 27823 - 11905: 0x9B6A, - 27824 - 11905: 0x9B6B, - 27825 - 11905: 0xE3FB, - 27826 - 11905: 0xE3F5, - 27827 - 11905: 0xBAD3, - 27828 - 11905: 0x9B6C, - 27829 - 11905: 0x9B6D, - 27830 - 11905: 0x9B6E, - 27831 - 11905: 0x9B6F, - 27832 - 11905: 0xB7D0, - 27833 - 11905: 0xD3CD, - 27834 - 11905: 0x9B70, - 27835 - 11905: 0xD6CE, - 27836 - 11905: 0xD5D3, - 27837 - 11905: 0xB9C1, - 27838 - 11905: 0xD5B4, - 27839 - 11905: 0xD1D8, - 27840 - 11905: 0x9B71, - 27841 - 11905: 0x9B72, - 27842 - 11905: 0x9B73, - 27843 - 11905: 0x9B74, - 27844 - 11905: 0xD0B9, - 27845 - 11905: 0xC7F6, - 27846 - 11905: 0x9B75, - 27847 - 11905: 0x9B76, - 27848 - 11905: 0x9B77, - 27849 - 11905: 0xC8AA, - 27850 - 11905: 0xB2B4, - 27851 - 11905: 0x9B78, - 27852 - 11905: 0xC3DA, - 27853 - 11905: 0x9B79, - 27854 - 11905: 0x9B7A, - 27855 - 11905: 0x9B7B, - 27856 - 11905: 0xE3EE, - 27857 - 11905: 0x9B7C, - 27858 - 11905: 0x9B7D, - 27859 - 11905: 0xE3FC, - 27860 - 11905: 0xE3EF, - 27861 - 11905: 0xB7A8, - 27862 - 11905: 0xE3F7, - 27863 - 11905: 0xE3F4, - 27864 - 11905: 0x9B7E, - 27865 - 11905: 0x9B80, - 27866 - 11905: 0x9B81, - 27867 - 11905: 0xB7BA, - 27868 - 11905: 0x9B82, - 27869 - 11905: 0x9B83, - 27870 - 11905: 0xC5A2, - 27871 - 11905: 0x9B84, - 27872 - 11905: 0xE3F6, - 27873 - 11905: 0xC5DD, - 27874 - 11905: 0xB2A8, - 27875 - 11905: 0xC6FC, - 27876 - 11905: 0x9B85, - 27877 - 11905: 0xC4E0, - 27878 - 11905: 0x9B86, - 27879 - 11905: 0x9B87, - 27880 - 11905: 0xD7A2, - 27881 - 11905: 0x9B88, - 27882 - 11905: 0xC0E1, - 27883 - 11905: 0xE3F9, - 27884 - 11905: 0x9B89, - 27885 - 11905: 0x9B8A, - 27886 - 11905: 0xE3FA, - 27887 - 11905: 0xE3FD, - 27888 - 11905: 0xCCA9, - 27889 - 11905: 0xE3F3, - 27890 - 11905: 0x9B8B, - 27891 - 11905: 0xD3BE, - 27892 - 11905: 0x9B8C, - 27893 - 11905: 0xB1C3, - 27894 - 11905: 0xEDB4, - 27895 - 11905: 0xE3F1, - 27896 - 11905: 0xE3F2, - 27897 - 11905: 0x9B8D, - 27898 - 11905: 0xE3F8, - 27899 - 11905: 0xD0BA, - 27900 - 11905: 0xC6C3, - 27901 - 11905: 0xD4F3, - 27902 - 11905: 0xE3FE, - 27903 - 11905: 0x9B8E, - 27904 - 11905: 0x9B8F, - 27905 - 11905: 0xBDE0, - 27906 - 11905: 0x9B90, - 27907 - 11905: 0x9B91, - 27908 - 11905: 0xE4A7, - 27909 - 11905: 0x9B92, - 27910 - 11905: 0x9B93, - 27911 - 11905: 0xE4A6, - 27912 - 11905: 0x9B94, - 27913 - 11905: 0x9B95, - 27914 - 11905: 0x9B96, - 27915 - 11905: 0xD1F3, - 27916 - 11905: 0xE4A3, - 27917 - 11905: 0x9B97, - 27918 - 11905: 0xE4A9, - 27919 - 11905: 0x9B98, - 27920 - 11905: 0x9B99, - 27921 - 11905: 0x9B9A, - 27922 - 11905: 0xC8F7, - 27923 - 11905: 0x9B9B, - 27924 - 11905: 0x9B9C, - 27925 - 11905: 0x9B9D, - 27926 - 11905: 0x9B9E, - 27927 - 11905: 0xCFB4, - 27928 - 11905: 0x9B9F, - 27929 - 11905: 0xE4A8, - 27930 - 11905: 0xE4AE, - 27931 - 11905: 0xC2E5, - 27932 - 11905: 0x9BA0, - 27933 - 11905: 0x9BA1, - 27934 - 11905: 0xB6B4, - 27935 - 11905: 0x9BA2, - 27936 - 11905: 0x9BA3, - 27937 - 11905: 0x9BA4, - 27938 - 11905: 0x9BA5, - 27939 - 11905: 0x9BA6, - 27940 - 11905: 0x9BA7, - 27941 - 11905: 0xBDF2, - 27942 - 11905: 0x9BA8, - 27943 - 11905: 0xE4A2, - 27944 - 11905: 0x9BA9, - 27945 - 11905: 0x9BAA, - 27946 - 11905: 0xBAE9, - 27947 - 11905: 0xE4AA, - 27948 - 11905: 0x9BAB, - 27949 - 11905: 0x9BAC, - 27950 - 11905: 0xE4AC, - 27951 - 11905: 0x9BAD, - 27952 - 11905: 0x9BAE, - 27953 - 11905: 0xB6FD, - 27954 - 11905: 0xD6DE, - 27955 - 11905: 0xE4B2, - 27956 - 11905: 0x9BAF, - 27957 - 11905: 0xE4AD, - 27958 - 11905: 0x9BB0, - 27959 - 11905: 0x9BB1, - 27960 - 11905: 0x9BB2, - 27961 - 11905: 0xE4A1, - 27962 - 11905: 0x9BB3, - 27963 - 11905: 0xBBEE, - 27964 - 11905: 0xCDDD, - 27965 - 11905: 0xC7A2, - 27966 - 11905: 0xC5C9, - 27967 - 11905: 0x9BB4, - 27968 - 11905: 0x9BB5, - 27969 - 11905: 0xC1F7, - 27970 - 11905: 0x9BB6, - 27971 - 11905: 0xE4A4, - 27972 - 11905: 0x9BB7, - 27973 - 11905: 0xC7B3, - 27974 - 11905: 0xBDAC, - 27975 - 11905: 0xBDBD, - 27976 - 11905: 0xE4A5, - 27977 - 11905: 0x9BB8, - 27978 - 11905: 0xD7C7, - 27979 - 11905: 0xB2E2, - 27980 - 11905: 0x9BB9, - 27981 - 11905: 0xE4AB, - 27982 - 11905: 0xBCC3, - 27983 - 11905: 0xE4AF, - 27984 - 11905: 0x9BBA, - 27985 - 11905: 0xBBEB, - 27986 - 11905: 0xE4B0, - 27987 - 11905: 0xC5A8, - 27988 - 11905: 0xE4B1, - 27989 - 11905: 0x9BBB, - 27990 - 11905: 0x9BBC, - 27991 - 11905: 0x9BBD, - 27992 - 11905: 0x9BBE, - 27993 - 11905: 0xD5E3, - 27994 - 11905: 0xBFA3, - 27995 - 11905: 0x9BBF, - 27996 - 11905: 0xE4BA, - 27997 - 11905: 0x9BC0, - 27998 - 11905: 0xE4B7, - 27999 - 11905: 0x9BC1, - 28000 - 11905: 0xE4BB, - 28001 - 11905: 0x9BC2, - 28002 - 11905: 0x9BC3, - 28003 - 11905: 0xE4BD, - 28004 - 11905: 0x9BC4, - 28005 - 11905: 0x9BC5, - 28006 - 11905: 0xC6D6, - 28007 - 11905: 0x9BC6, - 28008 - 11905: 0x9BC7, - 28009 - 11905: 0xBAC6, - 28010 - 11905: 0xC0CB, - 28011 - 11905: 0x9BC8, - 28012 - 11905: 0x9BC9, - 28013 - 11905: 0x9BCA, - 28014 - 11905: 0xB8A1, - 28015 - 11905: 0xE4B4, - 28016 - 11905: 0x9BCB, - 28017 - 11905: 0x9BCC, - 28018 - 11905: 0x9BCD, - 28019 - 11905: 0x9BCE, - 28020 - 11905: 0xD4A1, - 28021 - 11905: 0x9BCF, - 28022 - 11905: 0x9BD0, - 28023 - 11905: 0xBAA3, - 28024 - 11905: 0xBDFE, - 28025 - 11905: 0x9BD1, - 28026 - 11905: 0x9BD2, - 28027 - 11905: 0x9BD3, - 28028 - 11905: 0xE4BC, - 28029 - 11905: 0x9BD4, - 28030 - 11905: 0x9BD5, - 28031 - 11905: 0x9BD6, - 28032 - 11905: 0x9BD7, - 28033 - 11905: 0x9BD8, - 28034 - 11905: 0xCDBF, - 28035 - 11905: 0x9BD9, - 28036 - 11905: 0x9BDA, - 28037 - 11905: 0xC4F9, - 28038 - 11905: 0x9BDB, - 28039 - 11905: 0x9BDC, - 28040 - 11905: 0xCFFB, - 28041 - 11905: 0xC9E6, - 28042 - 11905: 0x9BDD, - 28043 - 11905: 0x9BDE, - 28044 - 11905: 0xD3BF, - 28045 - 11905: 0x9BDF, - 28046 - 11905: 0xCFD1, - 28047 - 11905: 0x9BE0, - 28048 - 11905: 0x9BE1, - 28049 - 11905: 0xE4B3, - 28050 - 11905: 0x9BE2, - 28051 - 11905: 0xE4B8, - 28052 - 11905: 0xE4B9, - 28053 - 11905: 0xCCE9, - 28054 - 11905: 0x9BE3, - 28055 - 11905: 0x9BE4, - 28056 - 11905: 0x9BE5, - 28057 - 11905: 0x9BE6, - 28058 - 11905: 0x9BE7, - 28059 - 11905: 0xCCCE, - 28060 - 11905: 0x9BE8, - 28061 - 11905: 0xC0D4, - 28062 - 11905: 0xE4B5, - 28063 - 11905: 0xC1B0, - 28064 - 11905: 0xE4B6, - 28065 - 11905: 0xCED0, - 28066 - 11905: 0x9BE9, - 28067 - 11905: 0xBBC1, - 28068 - 11905: 0xB5D3, - 28069 - 11905: 0x9BEA, - 28070 - 11905: 0xC8F3, - 28071 - 11905: 0xBDA7, - 28072 - 11905: 0xD5C7, - 28073 - 11905: 0xC9AC, - 28074 - 11905: 0xB8A2, - 28075 - 11905: 0xE4CA, - 28076 - 11905: 0x9BEB, - 28077 - 11905: 0x9BEC, - 28078 - 11905: 0xE4CC, - 28079 - 11905: 0xD1C4, - 28080 - 11905: 0x9BED, - 28081 - 11905: 0x9BEE, - 28082 - 11905: 0xD2BA, - 28083 - 11905: 0x9BEF, - 28084 - 11905: 0x9BF0, - 28085 - 11905: 0xBAAD, - 28086 - 11905: 0x9BF1, - 28087 - 11905: 0x9BF2, - 28088 - 11905: 0xBAD4, - 28089 - 11905: 0x9BF3, - 28090 - 11905: 0x9BF4, - 28091 - 11905: 0x9BF5, - 28092 - 11905: 0x9BF6, - 28093 - 11905: 0x9BF7, - 28094 - 11905: 0x9BF8, - 28095 - 11905: 0xE4C3, - 28096 - 11905: 0xB5ED, - 28097 - 11905: 0x9BF9, - 28098 - 11905: 0x9BFA, - 28099 - 11905: 0x9BFB, - 28100 - 11905: 0xD7CD, - 28101 - 11905: 0xE4C0, - 28102 - 11905: 0xCFFD, - 28103 - 11905: 0xE4BF, - 28104 - 11905: 0x9BFC, - 28105 - 11905: 0x9BFD, - 28106 - 11905: 0x9BFE, - 28107 - 11905: 0xC1DC, - 28108 - 11905: 0xCCCA, - 28109 - 11905: 0x9C40, - 28110 - 11905: 0x9C41, - 28111 - 11905: 0x9C42, - 28112 - 11905: 0x9C43, - 28113 - 11905: 0xCAE7, - 28114 - 11905: 0x9C44, - 28115 - 11905: 0x9C45, - 28116 - 11905: 0x9C46, - 28117 - 11905: 0x9C47, - 28118 - 11905: 0xC4D7, - 28119 - 11905: 0x9C48, - 28120 - 11905: 0xCCD4, - 28121 - 11905: 0xE4C8, - 28122 - 11905: 0x9C49, - 28123 - 11905: 0x9C4A, - 28124 - 11905: 0x9C4B, - 28125 - 11905: 0xE4C7, - 28126 - 11905: 0xE4C1, - 28127 - 11905: 0x9C4C, - 28128 - 11905: 0xE4C4, - 28129 - 11905: 0xB5AD, - 28130 - 11905: 0x9C4D, - 28131 - 11905: 0x9C4E, - 28132 - 11905: 0xD3D9, - 28133 - 11905: 0x9C4F, - 28134 - 11905: 0xE4C6, - 28135 - 11905: 0x9C50, - 28136 - 11905: 0x9C51, - 28137 - 11905: 0x9C52, - 28138 - 11905: 0x9C53, - 28139 - 11905: 0xD2F9, - 28140 - 11905: 0xB4E3, - 28141 - 11905: 0x9C54, - 28142 - 11905: 0xBBB4, - 28143 - 11905: 0x9C55, - 28144 - 11905: 0x9C56, - 28145 - 11905: 0xC9EE, - 28146 - 11905: 0x9C57, - 28147 - 11905: 0xB4BE, - 28148 - 11905: 0x9C58, - 28149 - 11905: 0x9C59, - 28150 - 11905: 0x9C5A, - 28151 - 11905: 0xBBEC, - 28152 - 11905: 0x9C5B, - 28153 - 11905: 0xD1CD, - 28154 - 11905: 0x9C5C, - 28155 - 11905: 0xCCED, - 28156 - 11905: 0xEDB5, - 28157 - 11905: 0x9C5D, - 28158 - 11905: 0x9C5E, - 28159 - 11905: 0x9C5F, - 28160 - 11905: 0x9C60, - 28161 - 11905: 0x9C61, - 28162 - 11905: 0x9C62, - 28163 - 11905: 0x9C63, - 28164 - 11905: 0x9C64, - 28165 - 11905: 0xC7E5, - 28166 - 11905: 0x9C65, - 28167 - 11905: 0x9C66, - 28168 - 11905: 0x9C67, - 28169 - 11905: 0x9C68, - 28170 - 11905: 0xD4A8, - 28171 - 11905: 0x9C69, - 28172 - 11905: 0xE4CB, - 28173 - 11905: 0xD7D5, - 28174 - 11905: 0xE4C2, - 28175 - 11905: 0x9C6A, - 28176 - 11905: 0xBDA5, - 28177 - 11905: 0xE4C5, - 28178 - 11905: 0x9C6B, - 28179 - 11905: 0x9C6C, - 28180 - 11905: 0xD3E6, - 28181 - 11905: 0x9C6D, - 28182 - 11905: 0xE4C9, - 28183 - 11905: 0xC9F8, - 28184 - 11905: 0x9C6E, - 28185 - 11905: 0x9C6F, - 28186 - 11905: 0xE4BE, - 28187 - 11905: 0x9C70, - 28188 - 11905: 0x9C71, - 28189 - 11905: 0xD3E5, - 28190 - 11905: 0x9C72, - 28191 - 11905: 0x9C73, - 28192 - 11905: 0xC7FE, - 28193 - 11905: 0xB6C9, - 28194 - 11905: 0x9C74, - 28195 - 11905: 0xD4FC, - 28196 - 11905: 0xB2B3, - 28197 - 11905: 0xE4D7, - 28198 - 11905: 0x9C75, - 28199 - 11905: 0x9C76, - 28200 - 11905: 0x9C77, - 28201 - 11905: 0xCEC2, - 28202 - 11905: 0x9C78, - 28203 - 11905: 0xE4CD, - 28204 - 11905: 0x9C79, - 28205 - 11905: 0xCEBC, - 28206 - 11905: 0x9C7A, - 28207 - 11905: 0xB8DB, - 28208 - 11905: 0x9C7B, - 28209 - 11905: 0x9C7C, - 28210 - 11905: 0xE4D6, - 28211 - 11905: 0x9C7D, - 28212 - 11905: 0xBFCA, - 28213 - 11905: 0x9C7E, - 28214 - 11905: 0x9C80, - 28215 - 11905: 0x9C81, - 28216 - 11905: 0xD3CE, - 28217 - 11905: 0x9C82, - 28218 - 11905: 0xC3EC, - 28219 - 11905: 0x9C83, - 28220 - 11905: 0x9C84, - 28221 - 11905: 0x9C85, - 28222 - 11905: 0x9C86, - 28223 - 11905: 0x9C87, - 28224 - 11905: 0x9C88, - 28225 - 11905: 0x9C89, - 28226 - 11905: 0x9C8A, - 28227 - 11905: 0xC5C8, - 28228 - 11905: 0xE4D8, - 28229 - 11905: 0x9C8B, - 28230 - 11905: 0x9C8C, - 28231 - 11905: 0x9C8D, - 28232 - 11905: 0x9C8E, - 28233 - 11905: 0x9C8F, - 28234 - 11905: 0x9C90, - 28235 - 11905: 0x9C91, - 28236 - 11905: 0x9C92, - 28237 - 11905: 0xCDC4, - 28238 - 11905: 0xE4CF, - 28239 - 11905: 0x9C93, - 28240 - 11905: 0x9C94, - 28241 - 11905: 0x9C95, - 28242 - 11905: 0x9C96, - 28243 - 11905: 0xE4D4, - 28244 - 11905: 0xE4D5, - 28245 - 11905: 0x9C97, - 28246 - 11905: 0xBAFE, - 28247 - 11905: 0x9C98, - 28248 - 11905: 0xCFE6, - 28249 - 11905: 0x9C99, - 28250 - 11905: 0x9C9A, - 28251 - 11905: 0xD5BF, - 28252 - 11905: 0x9C9B, - 28253 - 11905: 0x9C9C, - 28254 - 11905: 0x9C9D, - 28255 - 11905: 0xE4D2, - 28256 - 11905: 0x9C9E, - 28257 - 11905: 0x9C9F, - 28258 - 11905: 0x9CA0, - 28259 - 11905: 0x9CA1, - 28260 - 11905: 0x9CA2, - 28261 - 11905: 0x9CA3, - 28262 - 11905: 0x9CA4, - 28263 - 11905: 0x9CA5, - 28264 - 11905: 0x9CA6, - 28265 - 11905: 0x9CA7, - 28266 - 11905: 0x9CA8, - 28267 - 11905: 0xE4D0, - 28268 - 11905: 0x9CA9, - 28269 - 11905: 0x9CAA, - 28270 - 11905: 0xE4CE, - 28271 - 11905: 0x9CAB, - 28272 - 11905: 0x9CAC, - 28273 - 11905: 0x9CAD, - 28274 - 11905: 0x9CAE, - 28275 - 11905: 0x9CAF, - 28276 - 11905: 0x9CB0, - 28277 - 11905: 0x9CB1, - 28278 - 11905: 0x9CB2, - 28279 - 11905: 0x9CB3, - 28280 - 11905: 0x9CB4, - 28281 - 11905: 0x9CB5, - 28282 - 11905: 0x9CB6, - 28283 - 11905: 0x9CB7, - 28284 - 11905: 0x9CB8, - 28285 - 11905: 0x9CB9, - 28286 - 11905: 0xCDE5, - 28287 - 11905: 0xCAAA, - 28288 - 11905: 0x9CBA, - 28289 - 11905: 0x9CBB, - 28290 - 11905: 0x9CBC, - 28291 - 11905: 0xC0A3, - 28292 - 11905: 0x9CBD, - 28293 - 11905: 0xBDA6, - 28294 - 11905: 0xE4D3, - 28295 - 11905: 0x9CBE, - 28296 - 11905: 0x9CBF, - 28297 - 11905: 0xB8C8, - 28298 - 11905: 0x9CC0, - 28299 - 11905: 0x9CC1, - 28300 - 11905: 0x9CC2, - 28301 - 11905: 0x9CC3, - 28302 - 11905: 0x9CC4, - 28303 - 11905: 0xE4E7, - 28304 - 11905: 0xD4B4, - 28305 - 11905: 0x9CC5, - 28306 - 11905: 0x9CC6, - 28307 - 11905: 0x9CC7, - 28308 - 11905: 0x9CC8, - 28309 - 11905: 0x9CC9, - 28310 - 11905: 0x9CCA, - 28311 - 11905: 0x9CCB, - 28312 - 11905: 0xE4DB, - 28313 - 11905: 0x9CCC, - 28314 - 11905: 0x9CCD, - 28315 - 11905: 0x9CCE, - 28316 - 11905: 0xC1EF, - 28317 - 11905: 0x9CCF, - 28318 - 11905: 0x9CD0, - 28319 - 11905: 0xE4E9, - 28320 - 11905: 0x9CD1, - 28321 - 11905: 0x9CD2, - 28322 - 11905: 0xD2E7, - 28323 - 11905: 0x9CD3, - 28324 - 11905: 0x9CD4, - 28325 - 11905: 0xE4DF, - 28326 - 11905: 0x9CD5, - 28327 - 11905: 0xE4E0, - 28328 - 11905: 0x9CD6, - 28329 - 11905: 0x9CD7, - 28330 - 11905: 0xCFAA, - 28331 - 11905: 0x9CD8, - 28332 - 11905: 0x9CD9, - 28333 - 11905: 0x9CDA, - 28334 - 11905: 0x9CDB, - 28335 - 11905: 0xCBDD, - 28336 - 11905: 0x9CDC, - 28337 - 11905: 0xE4DA, - 28338 - 11905: 0xE4D1, - 28339 - 11905: 0x9CDD, - 28340 - 11905: 0xE4E5, - 28341 - 11905: 0x9CDE, - 28342 - 11905: 0xC8DC, - 28343 - 11905: 0xE4E3, - 28344 - 11905: 0x9CDF, - 28345 - 11905: 0x9CE0, - 28346 - 11905: 0xC4E7, - 28347 - 11905: 0xE4E2, - 28348 - 11905: 0x9CE1, - 28349 - 11905: 0xE4E1, - 28350 - 11905: 0x9CE2, - 28351 - 11905: 0x9CE3, - 28352 - 11905: 0x9CE4, - 28353 - 11905: 0xB3FC, - 28354 - 11905: 0xE4E8, - 28355 - 11905: 0x9CE5, - 28356 - 11905: 0x9CE6, - 28357 - 11905: 0x9CE7, - 28358 - 11905: 0x9CE8, - 28359 - 11905: 0xB5E1, - 28360 - 11905: 0x9CE9, - 28361 - 11905: 0x9CEA, - 28362 - 11905: 0x9CEB, - 28363 - 11905: 0xD7CC, - 28364 - 11905: 0x9CEC, - 28365 - 11905: 0x9CED, - 28366 - 11905: 0x9CEE, - 28367 - 11905: 0xE4E6, - 28368 - 11905: 0x9CEF, - 28369 - 11905: 0xBBAC, - 28370 - 11905: 0x9CF0, - 28371 - 11905: 0xD7D2, - 28372 - 11905: 0xCCCF, - 28373 - 11905: 0xEBF8, - 28374 - 11905: 0x9CF1, - 28375 - 11905: 0xE4E4, - 28376 - 11905: 0x9CF2, - 28377 - 11905: 0x9CF3, - 28378 - 11905: 0xB9F6, - 28379 - 11905: 0x9CF4, - 28380 - 11905: 0x9CF5, - 28381 - 11905: 0x9CF6, - 28382 - 11905: 0xD6CD, - 28383 - 11905: 0xE4D9, - 28384 - 11905: 0xE4DC, - 28385 - 11905: 0xC2FA, - 28386 - 11905: 0xE4DE, - 28387 - 11905: 0x9CF7, - 28388 - 11905: 0xC2CB, - 28389 - 11905: 0xC0C4, - 28390 - 11905: 0xC2D0, - 28391 - 11905: 0x9CF8, - 28392 - 11905: 0xB1F5, - 28393 - 11905: 0xCCB2, - 28394 - 11905: 0x9CF9, - 28395 - 11905: 0x9CFA, - 28396 - 11905: 0x9CFB, - 28397 - 11905: 0x9CFC, - 28398 - 11905: 0x9CFD, - 28399 - 11905: 0x9CFE, - 28400 - 11905: 0x9D40, - 28401 - 11905: 0x9D41, - 28402 - 11905: 0x9D42, - 28403 - 11905: 0x9D43, - 28404 - 11905: 0xB5CE, - 28405 - 11905: 0x9D44, - 28406 - 11905: 0x9D45, - 28407 - 11905: 0x9D46, - 28408 - 11905: 0x9D47, - 28409 - 11905: 0xE4EF, - 28410 - 11905: 0x9D48, - 28411 - 11905: 0x9D49, - 28412 - 11905: 0x9D4A, - 28413 - 11905: 0x9D4B, - 28414 - 11905: 0x9D4C, - 28415 - 11905: 0x9D4D, - 28416 - 11905: 0x9D4E, - 28417 - 11905: 0x9D4F, - 28418 - 11905: 0xC6AF, - 28419 - 11905: 0x9D50, - 28420 - 11905: 0x9D51, - 28421 - 11905: 0x9D52, - 28422 - 11905: 0xC6E1, - 28423 - 11905: 0x9D53, - 28424 - 11905: 0x9D54, - 28425 - 11905: 0xE4F5, - 28426 - 11905: 0x9D55, - 28427 - 11905: 0x9D56, - 28428 - 11905: 0x9D57, - 28429 - 11905: 0x9D58, - 28430 - 11905: 0x9D59, - 28431 - 11905: 0xC2A9, - 28432 - 11905: 0x9D5A, - 28433 - 11905: 0x9D5B, - 28434 - 11905: 0x9D5C, - 28435 - 11905: 0xC0EC, - 28436 - 11905: 0xD1DD, - 28437 - 11905: 0xE4EE, - 28438 - 11905: 0x9D5D, - 28439 - 11905: 0x9D5E, - 28440 - 11905: 0x9D5F, - 28441 - 11905: 0x9D60, - 28442 - 11905: 0x9D61, - 28443 - 11905: 0x9D62, - 28444 - 11905: 0x9D63, - 28445 - 11905: 0x9D64, - 28446 - 11905: 0x9D65, - 28447 - 11905: 0x9D66, - 28448 - 11905: 0xC4AE, - 28449 - 11905: 0x9D67, - 28450 - 11905: 0x9D68, - 28451 - 11905: 0x9D69, - 28452 - 11905: 0xE4ED, - 28453 - 11905: 0x9D6A, - 28454 - 11905: 0x9D6B, - 28455 - 11905: 0x9D6C, - 28456 - 11905: 0x9D6D, - 28457 - 11905: 0xE4F6, - 28458 - 11905: 0xE4F4, - 28459 - 11905: 0xC2FE, - 28460 - 11905: 0x9D6E, - 28461 - 11905: 0xE4DD, - 28462 - 11905: 0x9D6F, - 28463 - 11905: 0xE4F0, - 28464 - 11905: 0x9D70, - 28465 - 11905: 0xCAFE, - 28466 - 11905: 0x9D71, - 28467 - 11905: 0xD5C4, - 28468 - 11905: 0x9D72, - 28469 - 11905: 0x9D73, - 28470 - 11905: 0xE4F1, - 28471 - 11905: 0x9D74, - 28472 - 11905: 0x9D75, - 28473 - 11905: 0x9D76, - 28474 - 11905: 0x9D77, - 28475 - 11905: 0x9D78, - 28476 - 11905: 0x9D79, - 28477 - 11905: 0x9D7A, - 28478 - 11905: 0xD1FA, - 28479 - 11905: 0x9D7B, - 28480 - 11905: 0x9D7C, - 28481 - 11905: 0x9D7D, - 28482 - 11905: 0x9D7E, - 28483 - 11905: 0x9D80, - 28484 - 11905: 0x9D81, - 28485 - 11905: 0x9D82, - 28486 - 11905: 0xE4EB, - 28487 - 11905: 0xE4EC, - 28488 - 11905: 0x9D83, - 28489 - 11905: 0x9D84, - 28490 - 11905: 0x9D85, - 28491 - 11905: 0xE4F2, - 28492 - 11905: 0x9D86, - 28493 - 11905: 0xCEAB, - 28494 - 11905: 0x9D87, - 28495 - 11905: 0x9D88, - 28496 - 11905: 0x9D89, - 28497 - 11905: 0x9D8A, - 28498 - 11905: 0x9D8B, - 28499 - 11905: 0x9D8C, - 28500 - 11905: 0x9D8D, - 28501 - 11905: 0x9D8E, - 28502 - 11905: 0x9D8F, - 28503 - 11905: 0x9D90, - 28504 - 11905: 0xC5CB, - 28505 - 11905: 0x9D91, - 28506 - 11905: 0x9D92, - 28507 - 11905: 0x9D93, - 28508 - 11905: 0xC7B1, - 28509 - 11905: 0x9D94, - 28510 - 11905: 0xC2BA, - 28511 - 11905: 0x9D95, - 28512 - 11905: 0x9D96, - 28513 - 11905: 0x9D97, - 28514 - 11905: 0xE4EA, - 28515 - 11905: 0x9D98, - 28516 - 11905: 0x9D99, - 28517 - 11905: 0x9D9A, - 28518 - 11905: 0xC1CA, - 28519 - 11905: 0x9D9B, - 28520 - 11905: 0x9D9C, - 28521 - 11905: 0x9D9D, - 28522 - 11905: 0x9D9E, - 28523 - 11905: 0x9D9F, - 28524 - 11905: 0x9DA0, - 28525 - 11905: 0xCCB6, - 28526 - 11905: 0xB3B1, - 28527 - 11905: 0x9DA1, - 28528 - 11905: 0x9DA2, - 28529 - 11905: 0x9DA3, - 28530 - 11905: 0xE4FB, - 28531 - 11905: 0x9DA4, - 28532 - 11905: 0xE4F3, - 28533 - 11905: 0x9DA5, - 28534 - 11905: 0x9DA6, - 28535 - 11905: 0x9DA7, - 28536 - 11905: 0xE4FA, - 28537 - 11905: 0x9DA8, - 28538 - 11905: 0xE4FD, - 28539 - 11905: 0x9DA9, - 28540 - 11905: 0xE4FC, - 28541 - 11905: 0x9DAA, - 28542 - 11905: 0x9DAB, - 28543 - 11905: 0x9DAC, - 28544 - 11905: 0x9DAD, - 28545 - 11905: 0x9DAE, - 28546 - 11905: 0x9DAF, - 28547 - 11905: 0x9DB0, - 28548 - 11905: 0xB3CE, - 28549 - 11905: 0x9DB1, - 28550 - 11905: 0x9DB2, - 28551 - 11905: 0x9DB3, - 28552 - 11905: 0xB3BA, - 28553 - 11905: 0xE4F7, - 28554 - 11905: 0x9DB4, - 28555 - 11905: 0x9DB5, - 28556 - 11905: 0xE4F9, - 28557 - 11905: 0xE4F8, - 28558 - 11905: 0xC5EC, - 28559 - 11905: 0x9DB6, - 28560 - 11905: 0x9DB7, - 28561 - 11905: 0x9DB8, - 28562 - 11905: 0x9DB9, - 28563 - 11905: 0x9DBA, - 28564 - 11905: 0x9DBB, - 28565 - 11905: 0x9DBC, - 28566 - 11905: 0x9DBD, - 28567 - 11905: 0x9DBE, - 28568 - 11905: 0x9DBF, - 28569 - 11905: 0x9DC0, - 28570 - 11905: 0x9DC1, - 28571 - 11905: 0x9DC2, - 28572 - 11905: 0xC0BD, - 28573 - 11905: 0x9DC3, - 28574 - 11905: 0x9DC4, - 28575 - 11905: 0x9DC5, - 28576 - 11905: 0x9DC6, - 28577 - 11905: 0xD4E8, - 28578 - 11905: 0x9DC7, - 28579 - 11905: 0x9DC8, - 28580 - 11905: 0x9DC9, - 28581 - 11905: 0x9DCA, - 28582 - 11905: 0x9DCB, - 28583 - 11905: 0xE5A2, - 28584 - 11905: 0x9DCC, - 28585 - 11905: 0x9DCD, - 28586 - 11905: 0x9DCE, - 28587 - 11905: 0x9DCF, - 28588 - 11905: 0x9DD0, - 28589 - 11905: 0x9DD1, - 28590 - 11905: 0x9DD2, - 28591 - 11905: 0x9DD3, - 28592 - 11905: 0x9DD4, - 28593 - 11905: 0x9DD5, - 28594 - 11905: 0x9DD6, - 28595 - 11905: 0xB0C4, - 28596 - 11905: 0x9DD7, - 28597 - 11905: 0x9DD8, - 28598 - 11905: 0xE5A4, - 28599 - 11905: 0x9DD9, - 28600 - 11905: 0x9DDA, - 28601 - 11905: 0xE5A3, - 28602 - 11905: 0x9DDB, - 28603 - 11905: 0x9DDC, - 28604 - 11905: 0x9DDD, - 28605 - 11905: 0x9DDE, - 28606 - 11905: 0x9DDF, - 28607 - 11905: 0x9DE0, - 28608 - 11905: 0xBCA4, - 28609 - 11905: 0x9DE1, - 28610 - 11905: 0xE5A5, - 28611 - 11905: 0x9DE2, - 28612 - 11905: 0x9DE3, - 28613 - 11905: 0x9DE4, - 28614 - 11905: 0x9DE5, - 28615 - 11905: 0x9DE6, - 28616 - 11905: 0x9DE7, - 28617 - 11905: 0xE5A1, - 28618 - 11905: 0x9DE8, - 28619 - 11905: 0x9DE9, - 28620 - 11905: 0x9DEA, - 28621 - 11905: 0x9DEB, - 28622 - 11905: 0x9DEC, - 28623 - 11905: 0x9DED, - 28624 - 11905: 0x9DEE, - 28625 - 11905: 0xE4FE, - 28626 - 11905: 0xB1F4, - 28627 - 11905: 0x9DEF, - 28628 - 11905: 0x9DF0, - 28629 - 11905: 0x9DF1, - 28630 - 11905: 0x9DF2, - 28631 - 11905: 0x9DF3, - 28632 - 11905: 0x9DF4, - 28633 - 11905: 0x9DF5, - 28634 - 11905: 0x9DF6, - 28635 - 11905: 0x9DF7, - 28636 - 11905: 0x9DF8, - 28637 - 11905: 0x9DF9, - 28638 - 11905: 0xE5A8, - 28639 - 11905: 0x9DFA, - 28640 - 11905: 0xE5A9, - 28641 - 11905: 0xE5A6, - 28642 - 11905: 0x9DFB, - 28643 - 11905: 0x9DFC, - 28644 - 11905: 0x9DFD, - 28645 - 11905: 0x9DFE, - 28646 - 11905: 0x9E40, - 28647 - 11905: 0x9E41, - 28648 - 11905: 0x9E42, - 28649 - 11905: 0x9E43, - 28650 - 11905: 0x9E44, - 28651 - 11905: 0x9E45, - 28652 - 11905: 0x9E46, - 28653 - 11905: 0x9E47, - 28654 - 11905: 0xE5A7, - 28655 - 11905: 0xE5AA, - 28656 - 11905: 0x9E48, - 28657 - 11905: 0x9E49, - 28658 - 11905: 0x9E4A, - 28659 - 11905: 0x9E4B, - 28660 - 11905: 0x9E4C, - 28661 - 11905: 0x9E4D, - 28662 - 11905: 0x9E4E, - 28663 - 11905: 0x9E4F, - 28664 - 11905: 0x9E50, - 28665 - 11905: 0x9E51, - 28666 - 11905: 0x9E52, - 28667 - 11905: 0x9E53, - 28668 - 11905: 0x9E54, - 28669 - 11905: 0x9E55, - 28670 - 11905: 0x9E56, - 28671 - 11905: 0x9E57, - 28672 - 11905: 0x9E58, - 28673 - 11905: 0x9E59, - 28674 - 11905: 0x9E5A, - 28675 - 11905: 0x9E5B, - 28676 - 11905: 0x9E5C, - 28677 - 11905: 0x9E5D, - 28678 - 11905: 0x9E5E, - 28679 - 11905: 0x9E5F, - 28680 - 11905: 0x9E60, - 28681 - 11905: 0x9E61, - 28682 - 11905: 0x9E62, - 28683 - 11905: 0x9E63, - 28684 - 11905: 0x9E64, - 28685 - 11905: 0x9E65, - 28686 - 11905: 0x9E66, - 28687 - 11905: 0x9E67, - 28688 - 11905: 0x9E68, - 28689 - 11905: 0xC6D9, - 28690 - 11905: 0x9E69, - 28691 - 11905: 0x9E6A, - 28692 - 11905: 0x9E6B, - 28693 - 11905: 0x9E6C, - 28694 - 11905: 0x9E6D, - 28695 - 11905: 0x9E6E, - 28696 - 11905: 0x9E6F, - 28697 - 11905: 0x9E70, - 28698 - 11905: 0xE5AB, - 28699 - 11905: 0xE5AD, - 28700 - 11905: 0x9E71, - 28701 - 11905: 0x9E72, - 28702 - 11905: 0x9E73, - 28703 - 11905: 0x9E74, - 28704 - 11905: 0x9E75, - 28705 - 11905: 0x9E76, - 28706 - 11905: 0x9E77, - 28707 - 11905: 0xE5AC, - 28708 - 11905: 0x9E78, - 28709 - 11905: 0x9E79, - 28710 - 11905: 0x9E7A, - 28711 - 11905: 0x9E7B, - 28712 - 11905: 0x9E7C, - 28713 - 11905: 0x9E7D, - 28714 - 11905: 0x9E7E, - 28715 - 11905: 0x9E80, - 28716 - 11905: 0x9E81, - 28717 - 11905: 0x9E82, - 28718 - 11905: 0x9E83, - 28719 - 11905: 0x9E84, - 28720 - 11905: 0x9E85, - 28721 - 11905: 0x9E86, - 28722 - 11905: 0x9E87, - 28723 - 11905: 0x9E88, - 28724 - 11905: 0x9E89, - 28725 - 11905: 0xE5AF, - 28726 - 11905: 0x9E8A, - 28727 - 11905: 0x9E8B, - 28728 - 11905: 0x9E8C, - 28729 - 11905: 0xE5AE, - 28730 - 11905: 0x9E8D, - 28731 - 11905: 0x9E8E, - 28732 - 11905: 0x9E8F, - 28733 - 11905: 0x9E90, - 28734 - 11905: 0x9E91, - 28735 - 11905: 0x9E92, - 28736 - 11905: 0x9E93, - 28737 - 11905: 0x9E94, - 28738 - 11905: 0x9E95, - 28739 - 11905: 0x9E96, - 28740 - 11905: 0x9E97, - 28741 - 11905: 0x9E98, - 28742 - 11905: 0x9E99, - 28743 - 11905: 0x9E9A, - 28744 - 11905: 0x9E9B, - 28745 - 11905: 0x9E9C, - 28746 - 11905: 0x9E9D, - 28747 - 11905: 0x9E9E, - 28748 - 11905: 0xB9E0, - 28749 - 11905: 0x9E9F, - 28750 - 11905: 0x9EA0, - 28751 - 11905: 0xE5B0, - 28752 - 11905: 0x9EA1, - 28753 - 11905: 0x9EA2, - 28754 - 11905: 0x9EA3, - 28755 - 11905: 0x9EA4, - 28756 - 11905: 0x9EA5, - 28757 - 11905: 0x9EA6, - 28758 - 11905: 0x9EA7, - 28759 - 11905: 0x9EA8, - 28760 - 11905: 0x9EA9, - 28761 - 11905: 0x9EAA, - 28762 - 11905: 0x9EAB, - 28763 - 11905: 0x9EAC, - 28764 - 11905: 0x9EAD, - 28765 - 11905: 0x9EAE, - 28766 - 11905: 0xE5B1, - 28767 - 11905: 0x9EAF, - 28768 - 11905: 0x9EB0, - 28769 - 11905: 0x9EB1, - 28770 - 11905: 0x9EB2, - 28771 - 11905: 0x9EB3, - 28772 - 11905: 0x9EB4, - 28773 - 11905: 0x9EB5, - 28774 - 11905: 0x9EB6, - 28775 - 11905: 0x9EB7, - 28776 - 11905: 0x9EB8, - 28777 - 11905: 0x9EB9, - 28778 - 11905: 0x9EBA, - 28779 - 11905: 0xBBF0, - 28780 - 11905: 0xECE1, - 28781 - 11905: 0xC3F0, - 28782 - 11905: 0x9EBB, - 28783 - 11905: 0xB5C6, - 28784 - 11905: 0xBBD2, - 28785 - 11905: 0x9EBC, - 28786 - 11905: 0x9EBD, - 28787 - 11905: 0x9EBE, - 28788 - 11905: 0x9EBF, - 28789 - 11905: 0xC1E9, - 28790 - 11905: 0xD4EE, - 28791 - 11905: 0x9EC0, - 28792 - 11905: 0xBEC4, - 28793 - 11905: 0x9EC1, - 28794 - 11905: 0x9EC2, - 28795 - 11905: 0x9EC3, - 28796 - 11905: 0xD7C6, - 28797 - 11905: 0x9EC4, - 28798 - 11905: 0xD4D6, - 28799 - 11905: 0xB2D3, - 28800 - 11905: 0xECBE, - 28801 - 11905: 0x9EC5, - 28802 - 11905: 0x9EC6, - 28803 - 11905: 0x9EC7, - 28804 - 11905: 0x9EC8, - 28805 - 11905: 0xEAC1, - 28806 - 11905: 0x9EC9, - 28807 - 11905: 0x9ECA, - 28808 - 11905: 0x9ECB, - 28809 - 11905: 0xC2AF, - 28810 - 11905: 0xB4B6, - 28811 - 11905: 0x9ECC, - 28812 - 11905: 0x9ECD, - 28813 - 11905: 0x9ECE, - 28814 - 11905: 0xD1D7, - 28815 - 11905: 0x9ECF, - 28816 - 11905: 0x9ED0, - 28817 - 11905: 0x9ED1, - 28818 - 11905: 0xB3B4, - 28819 - 11905: 0x9ED2, - 28820 - 11905: 0xC8B2, - 28821 - 11905: 0xBFBB, - 28822 - 11905: 0xECC0, - 28823 - 11905: 0x9ED3, - 28824 - 11905: 0x9ED4, - 28825 - 11905: 0xD6CB, - 28826 - 11905: 0x9ED5, - 28827 - 11905: 0x9ED6, - 28828 - 11905: 0xECBF, - 28829 - 11905: 0xECC1, - 28830 - 11905: 0x9ED7, - 28831 - 11905: 0x9ED8, - 28832 - 11905: 0x9ED9, - 28833 - 11905: 0x9EDA, - 28834 - 11905: 0x9EDB, - 28835 - 11905: 0x9EDC, - 28836 - 11905: 0x9EDD, - 28837 - 11905: 0x9EDE, - 28838 - 11905: 0x9EDF, - 28839 - 11905: 0x9EE0, - 28840 - 11905: 0x9EE1, - 28841 - 11905: 0x9EE2, - 28842 - 11905: 0x9EE3, - 28843 - 11905: 0xECC5, - 28844 - 11905: 0xBEE6, - 28845 - 11905: 0xCCBF, - 28846 - 11905: 0xC5DA, - 28847 - 11905: 0xBEBC, - 28848 - 11905: 0x9EE4, - 28849 - 11905: 0xECC6, - 28850 - 11905: 0x9EE5, - 28851 - 11905: 0xB1FE, - 28852 - 11905: 0x9EE6, - 28853 - 11905: 0x9EE7, - 28854 - 11905: 0x9EE8, - 28855 - 11905: 0xECC4, - 28856 - 11905: 0xD5A8, - 28857 - 11905: 0xB5E3, - 28858 - 11905: 0x9EE9, - 28859 - 11905: 0xECC2, - 28860 - 11905: 0xC1B6, - 28861 - 11905: 0xB3E3, - 28862 - 11905: 0x9EEA, - 28863 - 11905: 0x9EEB, - 28864 - 11905: 0xECC3, - 28865 - 11905: 0xCBB8, - 28866 - 11905: 0xC0C3, - 28867 - 11905: 0xCCFE, - 28868 - 11905: 0x9EEC, - 28869 - 11905: 0x9EED, - 28870 - 11905: 0x9EEE, - 28871 - 11905: 0x9EEF, - 28872 - 11905: 0xC1D2, - 28873 - 11905: 0x9EF0, - 28874 - 11905: 0xECC8, - 28875 - 11905: 0x9EF1, - 28876 - 11905: 0x9EF2, - 28877 - 11905: 0x9EF3, - 28878 - 11905: 0x9EF4, - 28879 - 11905: 0x9EF5, - 28880 - 11905: 0x9EF6, - 28881 - 11905: 0x9EF7, - 28882 - 11905: 0x9EF8, - 28883 - 11905: 0x9EF9, - 28884 - 11905: 0x9EFA, - 28885 - 11905: 0x9EFB, - 28886 - 11905: 0x9EFC, - 28887 - 11905: 0x9EFD, - 28888 - 11905: 0xBAE6, - 28889 - 11905: 0xC0D3, - 28890 - 11905: 0x9EFE, - 28891 - 11905: 0xD6F2, - 28892 - 11905: 0x9F40, - 28893 - 11905: 0x9F41, - 28894 - 11905: 0x9F42, - 28895 - 11905: 0xD1CC, - 28896 - 11905: 0x9F43, - 28897 - 11905: 0x9F44, - 28898 - 11905: 0x9F45, - 28899 - 11905: 0x9F46, - 28900 - 11905: 0xBFBE, - 28901 - 11905: 0x9F47, - 28902 - 11905: 0xB7B3, - 28903 - 11905: 0xC9D5, - 28904 - 11905: 0xECC7, - 28905 - 11905: 0xBBE2, - 28906 - 11905: 0x9F48, - 28907 - 11905: 0xCCCC, - 28908 - 11905: 0xBDFD, - 28909 - 11905: 0xC8C8, - 28910 - 11905: 0x9F49, - 28911 - 11905: 0xCFA9, - 28912 - 11905: 0x9F4A, - 28913 - 11905: 0x9F4B, - 28914 - 11905: 0x9F4C, - 28915 - 11905: 0x9F4D, - 28916 - 11905: 0x9F4E, - 28917 - 11905: 0x9F4F, - 28918 - 11905: 0x9F50, - 28919 - 11905: 0xCDE9, - 28920 - 11905: 0x9F51, - 28921 - 11905: 0xC5EB, - 28922 - 11905: 0x9F52, - 28923 - 11905: 0x9F53, - 28924 - 11905: 0x9F54, - 28925 - 11905: 0xB7E9, - 28926 - 11905: 0x9F55, - 28927 - 11905: 0x9F56, - 28928 - 11905: 0x9F57, - 28929 - 11905: 0x9F58, - 28930 - 11905: 0x9F59, - 28931 - 11905: 0x9F5A, - 28932 - 11905: 0x9F5B, - 28933 - 11905: 0x9F5C, - 28934 - 11905: 0x9F5D, - 28935 - 11905: 0x9F5E, - 28936 - 11905: 0x9F5F, - 28937 - 11905: 0xD1C9, - 28938 - 11905: 0xBAB8, - 28939 - 11905: 0x9F60, - 28940 - 11905: 0x9F61, - 28941 - 11905: 0x9F62, - 28942 - 11905: 0x9F63, - 28943 - 11905: 0x9F64, - 28944 - 11905: 0xECC9, - 28945 - 11905: 0x9F65, - 28946 - 11905: 0x9F66, - 28947 - 11905: 0xECCA, - 28948 - 11905: 0x9F67, - 28949 - 11905: 0xBBC0, - 28950 - 11905: 0xECCB, - 28951 - 11905: 0x9F68, - 28952 - 11905: 0xECE2, - 28953 - 11905: 0xB1BA, - 28954 - 11905: 0xB7D9, - 28955 - 11905: 0x9F69, - 28956 - 11905: 0x9F6A, - 28957 - 11905: 0x9F6B, - 28958 - 11905: 0x9F6C, - 28959 - 11905: 0x9F6D, - 28960 - 11905: 0x9F6E, - 28961 - 11905: 0x9F6F, - 28962 - 11905: 0x9F70, - 28963 - 11905: 0x9F71, - 28964 - 11905: 0x9F72, - 28965 - 11905: 0x9F73, - 28966 - 11905: 0xBDB9, - 28967 - 11905: 0x9F74, - 28968 - 11905: 0x9F75, - 28969 - 11905: 0x9F76, - 28970 - 11905: 0x9F77, - 28971 - 11905: 0x9F78, - 28972 - 11905: 0x9F79, - 28973 - 11905: 0x9F7A, - 28974 - 11905: 0x9F7B, - 28975 - 11905: 0xECCC, - 28976 - 11905: 0xD1E6, - 28977 - 11905: 0xECCD, - 28978 - 11905: 0x9F7C, - 28979 - 11905: 0x9F7D, - 28980 - 11905: 0x9F7E, - 28981 - 11905: 0x9F80, - 28982 - 11905: 0xC8BB, - 28983 - 11905: 0x9F81, - 28984 - 11905: 0x9F82, - 28985 - 11905: 0x9F83, - 28986 - 11905: 0x9F84, - 28987 - 11905: 0x9F85, - 28988 - 11905: 0x9F86, - 28989 - 11905: 0x9F87, - 28990 - 11905: 0x9F88, - 28991 - 11905: 0x9F89, - 28992 - 11905: 0x9F8A, - 28993 - 11905: 0x9F8B, - 28994 - 11905: 0x9F8C, - 28995 - 11905: 0x9F8D, - 28996 - 11905: 0x9F8E, - 28997 - 11905: 0xECD1, - 28998 - 11905: 0x9F8F, - 28999 - 11905: 0x9F90, - 29000 - 11905: 0x9F91, - 29001 - 11905: 0x9F92, - 29002 - 11905: 0xECD3, - 29003 - 11905: 0x9F93, - 29004 - 11905: 0xBBCD, - 29005 - 11905: 0x9F94, - 29006 - 11905: 0xBCE5, - 29007 - 11905: 0x9F95, - 29008 - 11905: 0x9F96, - 29009 - 11905: 0x9F97, - 29010 - 11905: 0x9F98, - 29011 - 11905: 0x9F99, - 29012 - 11905: 0x9F9A, - 29013 - 11905: 0x9F9B, - 29014 - 11905: 0x9F9C, - 29015 - 11905: 0x9F9D, - 29016 - 11905: 0x9F9E, - 29017 - 11905: 0x9F9F, - 29018 - 11905: 0x9FA0, - 29019 - 11905: 0x9FA1, - 29020 - 11905: 0xECCF, - 29021 - 11905: 0x9FA2, - 29022 - 11905: 0xC9B7, - 29023 - 11905: 0x9FA3, - 29024 - 11905: 0x9FA4, - 29025 - 11905: 0x9FA5, - 29026 - 11905: 0x9FA6, - 29027 - 11905: 0x9FA7, - 29028 - 11905: 0xC3BA, - 29029 - 11905: 0x9FA8, - 29030 - 11905: 0xECE3, - 29031 - 11905: 0xD5D5, - 29032 - 11905: 0xECD0, - 29033 - 11905: 0x9FA9, - 29034 - 11905: 0x9FAA, - 29035 - 11905: 0x9FAB, - 29036 - 11905: 0x9FAC, - 29037 - 11905: 0x9FAD, - 29038 - 11905: 0xD6F3, - 29039 - 11905: 0x9FAE, - 29040 - 11905: 0x9FAF, - 29041 - 11905: 0x9FB0, - 29042 - 11905: 0xECD2, - 29043 - 11905: 0xECCE, - 29044 - 11905: 0x9FB1, - 29045 - 11905: 0x9FB2, - 29046 - 11905: 0x9FB3, - 29047 - 11905: 0x9FB4, - 29048 - 11905: 0xECD4, - 29049 - 11905: 0x9FB5, - 29050 - 11905: 0xECD5, - 29051 - 11905: 0x9FB6, - 29052 - 11905: 0x9FB7, - 29053 - 11905: 0xC9BF, - 29054 - 11905: 0x9FB8, - 29055 - 11905: 0x9FB9, - 29056 - 11905: 0x9FBA, - 29057 - 11905: 0x9FBB, - 29058 - 11905: 0x9FBC, - 29059 - 11905: 0x9FBD, - 29060 - 11905: 0xCFA8, - 29061 - 11905: 0x9FBE, - 29062 - 11905: 0x9FBF, - 29063 - 11905: 0x9FC0, - 29064 - 11905: 0x9FC1, - 29065 - 11905: 0x9FC2, - 29066 - 11905: 0xD0DC, - 29067 - 11905: 0x9FC3, - 29068 - 11905: 0x9FC4, - 29069 - 11905: 0x9FC5, - 29070 - 11905: 0x9FC6, - 29071 - 11905: 0xD1AC, - 29072 - 11905: 0x9FC7, - 29073 - 11905: 0x9FC8, - 29074 - 11905: 0x9FC9, - 29075 - 11905: 0x9FCA, - 29076 - 11905: 0xC8DB, - 29077 - 11905: 0x9FCB, - 29078 - 11905: 0x9FCC, - 29079 - 11905: 0x9FCD, - 29080 - 11905: 0xECD6, - 29081 - 11905: 0xCEF5, - 29082 - 11905: 0x9FCE, - 29083 - 11905: 0x9FCF, - 29084 - 11905: 0x9FD0, - 29085 - 11905: 0x9FD1, - 29086 - 11905: 0x9FD2, - 29087 - 11905: 0xCAEC, - 29088 - 11905: 0xECDA, - 29089 - 11905: 0x9FD3, - 29090 - 11905: 0x9FD4, - 29091 - 11905: 0x9FD5, - 29092 - 11905: 0x9FD6, - 29093 - 11905: 0x9FD7, - 29094 - 11905: 0x9FD8, - 29095 - 11905: 0x9FD9, - 29096 - 11905: 0xECD9, - 29097 - 11905: 0x9FDA, - 29098 - 11905: 0x9FDB, - 29099 - 11905: 0x9FDC, - 29100 - 11905: 0xB0BE, - 29101 - 11905: 0x9FDD, - 29102 - 11905: 0x9FDE, - 29103 - 11905: 0x9FDF, - 29104 - 11905: 0x9FE0, - 29105 - 11905: 0x9FE1, - 29106 - 11905: 0x9FE2, - 29107 - 11905: 0xECD7, - 29108 - 11905: 0x9FE3, - 29109 - 11905: 0xECD8, - 29110 - 11905: 0x9FE4, - 29111 - 11905: 0x9FE5, - 29112 - 11905: 0x9FE6, - 29113 - 11905: 0xECE4, - 29114 - 11905: 0x9FE7, - 29115 - 11905: 0x9FE8, - 29116 - 11905: 0x9FE9, - 29117 - 11905: 0x9FEA, - 29118 - 11905: 0x9FEB, - 29119 - 11905: 0x9FEC, - 29120 - 11905: 0x9FED, - 29121 - 11905: 0x9FEE, - 29122 - 11905: 0x9FEF, - 29123 - 11905: 0xC8BC, - 29124 - 11905: 0x9FF0, - 29125 - 11905: 0x9FF1, - 29126 - 11905: 0x9FF2, - 29127 - 11905: 0x9FF3, - 29128 - 11905: 0x9FF4, - 29129 - 11905: 0x9FF5, - 29130 - 11905: 0x9FF6, - 29131 - 11905: 0x9FF7, - 29132 - 11905: 0x9FF8, - 29133 - 11905: 0x9FF9, - 29134 - 11905: 0xC1C7, - 29135 - 11905: 0x9FFA, - 29136 - 11905: 0x9FFB, - 29137 - 11905: 0x9FFC, - 29138 - 11905: 0x9FFD, - 29139 - 11905: 0x9FFE, - 29140 - 11905: 0xECDC, - 29141 - 11905: 0xD1E0, - 29142 - 11905: 0xA040, - 29143 - 11905: 0xA041, - 29144 - 11905: 0xA042, - 29145 - 11905: 0xA043, - 29146 - 11905: 0xA044, - 29147 - 11905: 0xA045, - 29148 - 11905: 0xA046, - 29149 - 11905: 0xA047, - 29150 - 11905: 0xA048, - 29151 - 11905: 0xA049, - 29152 - 11905: 0xECDB, - 29153 - 11905: 0xA04A, - 29154 - 11905: 0xA04B, - 29155 - 11905: 0xA04C, - 29156 - 11905: 0xA04D, - 29157 - 11905: 0xD4EF, - 29158 - 11905: 0xA04E, - 29159 - 11905: 0xECDD, - 29160 - 11905: 0xA04F, - 29161 - 11905: 0xA050, - 29162 - 11905: 0xA051, - 29163 - 11905: 0xA052, - 29164 - 11905: 0xA053, - 29165 - 11905: 0xA054, - 29166 - 11905: 0xDBC6, - 29167 - 11905: 0xA055, - 29168 - 11905: 0xA056, - 29169 - 11905: 0xA057, - 29170 - 11905: 0xA058, - 29171 - 11905: 0xA059, - 29172 - 11905: 0xA05A, - 29173 - 11905: 0xA05B, - 29174 - 11905: 0xA05C, - 29175 - 11905: 0xA05D, - 29176 - 11905: 0xA05E, - 29177 - 11905: 0xECDE, - 29178 - 11905: 0xA05F, - 29179 - 11905: 0xA060, - 29180 - 11905: 0xA061, - 29181 - 11905: 0xA062, - 29182 - 11905: 0xA063, - 29183 - 11905: 0xA064, - 29184 - 11905: 0xA065, - 29185 - 11905: 0xA066, - 29186 - 11905: 0xA067, - 29187 - 11905: 0xA068, - 29188 - 11905: 0xA069, - 29189 - 11905: 0xA06A, - 29190 - 11905: 0xB1AC, - 29191 - 11905: 0xA06B, - 29192 - 11905: 0xA06C, - 29193 - 11905: 0xA06D, - 29194 - 11905: 0xA06E, - 29195 - 11905: 0xA06F, - 29196 - 11905: 0xA070, - 29197 - 11905: 0xA071, - 29198 - 11905: 0xA072, - 29199 - 11905: 0xA073, - 29200 - 11905: 0xA074, - 29201 - 11905: 0xA075, - 29202 - 11905: 0xA076, - 29203 - 11905: 0xA077, - 29204 - 11905: 0xA078, - 29205 - 11905: 0xA079, - 29206 - 11905: 0xA07A, - 29207 - 11905: 0xA07B, - 29208 - 11905: 0xA07C, - 29209 - 11905: 0xA07D, - 29210 - 11905: 0xA07E, - 29211 - 11905: 0xA080, - 29212 - 11905: 0xA081, - 29213 - 11905: 0xECDF, - 29214 - 11905: 0xA082, - 29215 - 11905: 0xA083, - 29216 - 11905: 0xA084, - 29217 - 11905: 0xA085, - 29218 - 11905: 0xA086, - 29219 - 11905: 0xA087, - 29220 - 11905: 0xA088, - 29221 - 11905: 0xA089, - 29222 - 11905: 0xA08A, - 29223 - 11905: 0xA08B, - 29224 - 11905: 0xECE0, - 29225 - 11905: 0xA08C, - 29226 - 11905: 0xD7A6, - 29227 - 11905: 0xA08D, - 29228 - 11905: 0xC5C0, - 29229 - 11905: 0xA08E, - 29230 - 11905: 0xA08F, - 29231 - 11905: 0xA090, - 29232 - 11905: 0xEBBC, - 29233 - 11905: 0xB0AE, - 29234 - 11905: 0xA091, - 29235 - 11905: 0xA092, - 29236 - 11905: 0xA093, - 29237 - 11905: 0xBEF4, - 29238 - 11905: 0xB8B8, - 29239 - 11905: 0xD2AF, - 29240 - 11905: 0xB0D6, - 29241 - 11905: 0xB5F9, - 29242 - 11905: 0xA094, - 29243 - 11905: 0xD8B3, - 29244 - 11905: 0xA095, - 29245 - 11905: 0xCBAC, - 29246 - 11905: 0xA096, - 29247 - 11905: 0xE3DD, - 29248 - 11905: 0xA097, - 29249 - 11905: 0xA098, - 29250 - 11905: 0xA099, - 29251 - 11905: 0xA09A, - 29252 - 11905: 0xA09B, - 29253 - 11905: 0xA09C, - 29254 - 11905: 0xA09D, - 29255 - 11905: 0xC6AC, - 29256 - 11905: 0xB0E6, - 29257 - 11905: 0xA09E, - 29258 - 11905: 0xA09F, - 29259 - 11905: 0xA0A0, - 29260 - 11905: 0xC5C6, - 29261 - 11905: 0xEBB9, - 29262 - 11905: 0xA0A1, - 29263 - 11905: 0xA0A2, - 29264 - 11905: 0xA0A3, - 29265 - 11905: 0xA0A4, - 29266 - 11905: 0xEBBA, - 29267 - 11905: 0xA0A5, - 29268 - 11905: 0xA0A6, - 29269 - 11905: 0xA0A7, - 29270 - 11905: 0xEBBB, - 29271 - 11905: 0xA0A8, - 29272 - 11905: 0xA0A9, - 29273 - 11905: 0xD1C0, - 29274 - 11905: 0xA0AA, - 29275 - 11905: 0xC5A3, - 29276 - 11905: 0xA0AB, - 29277 - 11905: 0xEAF2, - 29278 - 11905: 0xA0AC, - 29279 - 11905: 0xC4B2, - 29280 - 11905: 0xA0AD, - 29281 - 11905: 0xC4B5, - 29282 - 11905: 0xC0CE, - 29283 - 11905: 0xA0AE, - 29284 - 11905: 0xA0AF, - 29285 - 11905: 0xA0B0, - 29286 - 11905: 0xEAF3, - 29287 - 11905: 0xC4C1, - 29288 - 11905: 0xA0B1, - 29289 - 11905: 0xCEEF, - 29290 - 11905: 0xA0B2, - 29291 - 11905: 0xA0B3, - 29292 - 11905: 0xA0B4, - 29293 - 11905: 0xA0B5, - 29294 - 11905: 0xEAF0, - 29295 - 11905: 0xEAF4, - 29296 - 11905: 0xA0B6, - 29297 - 11905: 0xA0B7, - 29298 - 11905: 0xC9FC, - 29299 - 11905: 0xA0B8, - 29300 - 11905: 0xA0B9, - 29301 - 11905: 0xC7A3, - 29302 - 11905: 0xA0BA, - 29303 - 11905: 0xA0BB, - 29304 - 11905: 0xA0BC, - 29305 - 11905: 0xCCD8, - 29306 - 11905: 0xCEFE, - 29307 - 11905: 0xA0BD, - 29308 - 11905: 0xA0BE, - 29309 - 11905: 0xA0BF, - 29310 - 11905: 0xEAF5, - 29311 - 11905: 0xEAF6, - 29312 - 11905: 0xCFAC, - 29313 - 11905: 0xC0E7, - 29314 - 11905: 0xA0C0, - 29315 - 11905: 0xA0C1, - 29316 - 11905: 0xEAF7, - 29317 - 11905: 0xA0C2, - 29318 - 11905: 0xA0C3, - 29319 - 11905: 0xA0C4, - 29320 - 11905: 0xA0C5, - 29321 - 11905: 0xA0C6, - 29322 - 11905: 0xB6BF, - 29323 - 11905: 0xEAF8, - 29324 - 11905: 0xA0C7, - 29325 - 11905: 0xEAF9, - 29326 - 11905: 0xA0C8, - 29327 - 11905: 0xEAFA, - 29328 - 11905: 0xA0C9, - 29329 - 11905: 0xA0CA, - 29330 - 11905: 0xEAFB, - 29331 - 11905: 0xA0CB, - 29332 - 11905: 0xA0CC, - 29333 - 11905: 0xA0CD, - 29334 - 11905: 0xA0CE, - 29335 - 11905: 0xA0CF, - 29336 - 11905: 0xA0D0, - 29337 - 11905: 0xA0D1, - 29338 - 11905: 0xA0D2, - 29339 - 11905: 0xA0D3, - 29340 - 11905: 0xA0D4, - 29341 - 11905: 0xA0D5, - 29342 - 11905: 0xA0D6, - 29343 - 11905: 0xEAF1, - 29344 - 11905: 0xA0D7, - 29345 - 11905: 0xA0D8, - 29346 - 11905: 0xA0D9, - 29347 - 11905: 0xA0DA, - 29348 - 11905: 0xA0DB, - 29349 - 11905: 0xA0DC, - 29350 - 11905: 0xA0DD, - 29351 - 11905: 0xA0DE, - 29352 - 11905: 0xA0DF, - 29353 - 11905: 0xA0E0, - 29354 - 11905: 0xA0E1, - 29355 - 11905: 0xA0E2, - 29356 - 11905: 0xC8AE, - 29357 - 11905: 0xE1EB, - 29358 - 11905: 0xA0E3, - 29359 - 11905: 0xB7B8, - 29360 - 11905: 0xE1EC, - 29361 - 11905: 0xA0E4, - 29362 - 11905: 0xA0E5, - 29363 - 11905: 0xA0E6, - 29364 - 11905: 0xE1ED, - 29365 - 11905: 0xA0E7, - 29366 - 11905: 0xD7B4, - 29367 - 11905: 0xE1EE, - 29368 - 11905: 0xE1EF, - 29369 - 11905: 0xD3CC, - 29370 - 11905: 0xA0E8, - 29371 - 11905: 0xA0E9, - 29372 - 11905: 0xA0EA, - 29373 - 11905: 0xA0EB, - 29374 - 11905: 0xA0EC, - 29375 - 11905: 0xA0ED, - 29376 - 11905: 0xA0EE, - 29377 - 11905: 0xE1F1, - 29378 - 11905: 0xBFF1, - 29379 - 11905: 0xE1F0, - 29380 - 11905: 0xB5D2, - 29381 - 11905: 0xA0EF, - 29382 - 11905: 0xA0F0, - 29383 - 11905: 0xA0F1, - 29384 - 11905: 0xB1B7, - 29385 - 11905: 0xA0F2, - 29386 - 11905: 0xA0F3, - 29387 - 11905: 0xA0F4, - 29388 - 11905: 0xA0F5, - 29389 - 11905: 0xE1F3, - 29390 - 11905: 0xE1F2, - 29391 - 11905: 0xA0F6, - 29392 - 11905: 0xBAFC, - 29393 - 11905: 0xA0F7, - 29394 - 11905: 0xE1F4, - 29395 - 11905: 0xA0F8, - 29396 - 11905: 0xA0F9, - 29397 - 11905: 0xA0FA, - 29398 - 11905: 0xA0FB, - 29399 - 11905: 0xB9B7, - 29400 - 11905: 0xA0FC, - 29401 - 11905: 0xBED1, - 29402 - 11905: 0xA0FD, - 29403 - 11905: 0xA0FE, - 29404 - 11905: 0xAA40, - 29405 - 11905: 0xAA41, - 29406 - 11905: 0xC4FC, - 29407 - 11905: 0xAA42, - 29408 - 11905: 0xBADD, - 29409 - 11905: 0xBDC6, - 29410 - 11905: 0xAA43, - 29411 - 11905: 0xAA44, - 29412 - 11905: 0xAA45, - 29413 - 11905: 0xAA46, - 29414 - 11905: 0xAA47, - 29415 - 11905: 0xAA48, - 29416 - 11905: 0xE1F5, - 29417 - 11905: 0xE1F7, - 29418 - 11905: 0xAA49, - 29419 - 11905: 0xAA4A, - 29420 - 11905: 0xB6C0, - 29421 - 11905: 0xCFC1, - 29422 - 11905: 0xCAA8, - 29423 - 11905: 0xE1F6, - 29424 - 11905: 0xD5F8, - 29425 - 11905: 0xD3FC, - 29426 - 11905: 0xE1F8, - 29427 - 11905: 0xE1FC, - 29428 - 11905: 0xE1F9, - 29429 - 11905: 0xAA4B, - 29430 - 11905: 0xAA4C, - 29431 - 11905: 0xE1FA, - 29432 - 11905: 0xC0EA, - 29433 - 11905: 0xAA4D, - 29434 - 11905: 0xE1FE, - 29435 - 11905: 0xE2A1, - 29436 - 11905: 0xC0C7, - 29437 - 11905: 0xAA4E, - 29438 - 11905: 0xAA4F, - 29439 - 11905: 0xAA50, - 29440 - 11905: 0xAA51, - 29441 - 11905: 0xE1FB, - 29442 - 11905: 0xAA52, - 29443 - 11905: 0xE1FD, - 29444 - 11905: 0xAA53, - 29445 - 11905: 0xAA54, - 29446 - 11905: 0xAA55, - 29447 - 11905: 0xAA56, - 29448 - 11905: 0xAA57, - 29449 - 11905: 0xAA58, - 29450 - 11905: 0xE2A5, - 29451 - 11905: 0xAA59, - 29452 - 11905: 0xAA5A, - 29453 - 11905: 0xAA5B, - 29454 - 11905: 0xC1D4, - 29455 - 11905: 0xAA5C, - 29456 - 11905: 0xAA5D, - 29457 - 11905: 0xAA5E, - 29458 - 11905: 0xAA5F, - 29459 - 11905: 0xE2A3, - 29460 - 11905: 0xAA60, - 29461 - 11905: 0xE2A8, - 29462 - 11905: 0xB2FE, - 29463 - 11905: 0xE2A2, - 29464 - 11905: 0xAA61, - 29465 - 11905: 0xAA62, - 29466 - 11905: 0xAA63, - 29467 - 11905: 0xC3CD, - 29468 - 11905: 0xB2C2, - 29469 - 11905: 0xE2A7, - 29470 - 11905: 0xE2A6, - 29471 - 11905: 0xAA64, - 29472 - 11905: 0xAA65, - 29473 - 11905: 0xE2A4, - 29474 - 11905: 0xE2A9, - 29475 - 11905: 0xAA66, - 29476 - 11905: 0xAA67, - 29477 - 11905: 0xE2AB, - 29478 - 11905: 0xAA68, - 29479 - 11905: 0xAA69, - 29480 - 11905: 0xAA6A, - 29481 - 11905: 0xD0C9, - 29482 - 11905: 0xD6ED, - 29483 - 11905: 0xC3A8, - 29484 - 11905: 0xE2AC, - 29485 - 11905: 0xAA6B, - 29486 - 11905: 0xCFD7, - 29487 - 11905: 0xAA6C, - 29488 - 11905: 0xAA6D, - 29489 - 11905: 0xE2AE, - 29490 - 11905: 0xAA6E, - 29491 - 11905: 0xAA6F, - 29492 - 11905: 0xBAEF, - 29493 - 11905: 0xAA70, - 29494 - 11905: 0xAA71, - 29495 - 11905: 0xE9E0, - 29496 - 11905: 0xE2AD, - 29497 - 11905: 0xE2AA, - 29498 - 11905: 0xAA72, - 29499 - 11905: 0xAA73, - 29500 - 11905: 0xAA74, - 29501 - 11905: 0xAA75, - 29502 - 11905: 0xBBAB, - 29503 - 11905: 0xD4B3, - 29504 - 11905: 0xAA76, - 29505 - 11905: 0xAA77, - 29506 - 11905: 0xAA78, - 29507 - 11905: 0xAA79, - 29508 - 11905: 0xAA7A, - 29509 - 11905: 0xAA7B, - 29510 - 11905: 0xAA7C, - 29511 - 11905: 0xAA7D, - 29512 - 11905: 0xAA7E, - 29513 - 11905: 0xAA80, - 29514 - 11905: 0xAA81, - 29515 - 11905: 0xAA82, - 29516 - 11905: 0xAA83, - 29517 - 11905: 0xE2B0, - 29518 - 11905: 0xAA84, - 29519 - 11905: 0xAA85, - 29520 - 11905: 0xE2AF, - 29521 - 11905: 0xAA86, - 29522 - 11905: 0xE9E1, - 29523 - 11905: 0xAA87, - 29524 - 11905: 0xAA88, - 29525 - 11905: 0xAA89, - 29526 - 11905: 0xAA8A, - 29527 - 11905: 0xE2B1, - 29528 - 11905: 0xAA8B, - 29529 - 11905: 0xAA8C, - 29530 - 11905: 0xAA8D, - 29531 - 11905: 0xAA8E, - 29532 - 11905: 0xAA8F, - 29533 - 11905: 0xAA90, - 29534 - 11905: 0xAA91, - 29535 - 11905: 0xAA92, - 29536 - 11905: 0xE2B2, - 29537 - 11905: 0xAA93, - 29538 - 11905: 0xAA94, - 29539 - 11905: 0xAA95, - 29540 - 11905: 0xAA96, - 29541 - 11905: 0xAA97, - 29542 - 11905: 0xAA98, - 29543 - 11905: 0xAA99, - 29544 - 11905: 0xAA9A, - 29545 - 11905: 0xAA9B, - 29546 - 11905: 0xAA9C, - 29547 - 11905: 0xAA9D, - 29548 - 11905: 0xE2B3, - 29549 - 11905: 0xCCA1, - 29550 - 11905: 0xAA9E, - 29551 - 11905: 0xE2B4, - 29552 - 11905: 0xAA9F, - 29553 - 11905: 0xAAA0, - 29554 - 11905: 0xAB40, - 29555 - 11905: 0xAB41, - 29556 - 11905: 0xAB42, - 29557 - 11905: 0xAB43, - 29558 - 11905: 0xAB44, - 29559 - 11905: 0xAB45, - 29560 - 11905: 0xAB46, - 29561 - 11905: 0xAB47, - 29562 - 11905: 0xAB48, - 29563 - 11905: 0xAB49, - 29564 - 11905: 0xAB4A, - 29565 - 11905: 0xAB4B, - 29566 - 11905: 0xE2B5, - 29567 - 11905: 0xAB4C, - 29568 - 11905: 0xAB4D, - 29569 - 11905: 0xAB4E, - 29570 - 11905: 0xAB4F, - 29571 - 11905: 0xAB50, - 29572 - 11905: 0xD0FE, - 29573 - 11905: 0xAB51, - 29574 - 11905: 0xAB52, - 29575 - 11905: 0xC2CA, - 29576 - 11905: 0xAB53, - 29577 - 11905: 0xD3F1, - 29578 - 11905: 0xAB54, - 29579 - 11905: 0xCDF5, - 29580 - 11905: 0xAB55, - 29581 - 11905: 0xAB56, - 29582 - 11905: 0xE7E0, - 29583 - 11905: 0xAB57, - 29584 - 11905: 0xAB58, - 29585 - 11905: 0xE7E1, - 29586 - 11905: 0xAB59, - 29587 - 11905: 0xAB5A, - 29588 - 11905: 0xAB5B, - 29589 - 11905: 0xAB5C, - 29590 - 11905: 0xBEC1, - 29591 - 11905: 0xAB5D, - 29592 - 11905: 0xAB5E, - 29593 - 11905: 0xAB5F, - 29594 - 11905: 0xAB60, - 29595 - 11905: 0xC2EA, - 29596 - 11905: 0xAB61, - 29597 - 11905: 0xAB62, - 29598 - 11905: 0xAB63, - 29599 - 11905: 0xE7E4, - 29600 - 11905: 0xAB64, - 29601 - 11905: 0xAB65, - 29602 - 11905: 0xE7E3, - 29603 - 11905: 0xAB66, - 29604 - 11905: 0xAB67, - 29605 - 11905: 0xAB68, - 29606 - 11905: 0xAB69, - 29607 - 11905: 0xAB6A, - 29608 - 11905: 0xAB6B, - 29609 - 11905: 0xCDE6, - 29610 - 11905: 0xAB6C, - 29611 - 11905: 0xC3B5, - 29612 - 11905: 0xAB6D, - 29613 - 11905: 0xAB6E, - 29614 - 11905: 0xE7E2, - 29615 - 11905: 0xBBB7, - 29616 - 11905: 0xCFD6, - 29617 - 11905: 0xAB6F, - 29618 - 11905: 0xC1E1, - 29619 - 11905: 0xE7E9, - 29620 - 11905: 0xAB70, - 29621 - 11905: 0xAB71, - 29622 - 11905: 0xAB72, - 29623 - 11905: 0xE7E8, - 29624 - 11905: 0xAB73, - 29625 - 11905: 0xAB74, - 29626 - 11905: 0xE7F4, - 29627 - 11905: 0xB2A3, - 29628 - 11905: 0xAB75, - 29629 - 11905: 0xAB76, - 29630 - 11905: 0xAB77, - 29631 - 11905: 0xAB78, - 29632 - 11905: 0xE7EA, - 29633 - 11905: 0xAB79, - 29634 - 11905: 0xE7E6, - 29635 - 11905: 0xAB7A, - 29636 - 11905: 0xAB7B, - 29637 - 11905: 0xAB7C, - 29638 - 11905: 0xAB7D, - 29639 - 11905: 0xAB7E, - 29640 - 11905: 0xE7EC, - 29641 - 11905: 0xE7EB, - 29642 - 11905: 0xC9BA, - 29643 - 11905: 0xAB80, - 29644 - 11905: 0xAB81, - 29645 - 11905: 0xD5E4, - 29646 - 11905: 0xAB82, - 29647 - 11905: 0xE7E5, - 29648 - 11905: 0xB7A9, - 29649 - 11905: 0xE7E7, - 29650 - 11905: 0xAB83, - 29651 - 11905: 0xAB84, - 29652 - 11905: 0xAB85, - 29653 - 11905: 0xAB86, - 29654 - 11905: 0xAB87, - 29655 - 11905: 0xAB88, - 29656 - 11905: 0xAB89, - 29657 - 11905: 0xE7EE, - 29658 - 11905: 0xAB8A, - 29659 - 11905: 0xAB8B, - 29660 - 11905: 0xAB8C, - 29661 - 11905: 0xAB8D, - 29662 - 11905: 0xE7F3, - 29663 - 11905: 0xAB8E, - 29664 - 11905: 0xD6E9, - 29665 - 11905: 0xAB8F, - 29666 - 11905: 0xAB90, - 29667 - 11905: 0xAB91, - 29668 - 11905: 0xAB92, - 29669 - 11905: 0xE7ED, - 29670 - 11905: 0xAB93, - 29671 - 11905: 0xE7F2, - 29672 - 11905: 0xAB94, - 29673 - 11905: 0xE7F1, - 29674 - 11905: 0xAB95, - 29675 - 11905: 0xAB96, - 29676 - 11905: 0xAB97, - 29677 - 11905: 0xB0E0, - 29678 - 11905: 0xAB98, - 29679 - 11905: 0xAB99, - 29680 - 11905: 0xAB9A, - 29681 - 11905: 0xAB9B, - 29682 - 11905: 0xE7F5, - 29683 - 11905: 0xAB9C, - 29684 - 11905: 0xAB9D, - 29685 - 11905: 0xAB9E, - 29686 - 11905: 0xAB9F, - 29687 - 11905: 0xABA0, - 29688 - 11905: 0xAC40, - 29689 - 11905: 0xAC41, - 29690 - 11905: 0xAC42, - 29691 - 11905: 0xAC43, - 29692 - 11905: 0xAC44, - 29693 - 11905: 0xAC45, - 29694 - 11905: 0xAC46, - 29695 - 11905: 0xAC47, - 29696 - 11905: 0xAC48, - 29697 - 11905: 0xAC49, - 29698 - 11905: 0xAC4A, - 29699 - 11905: 0xC7F2, - 29700 - 11905: 0xAC4B, - 29701 - 11905: 0xC0C5, - 29702 - 11905: 0xC0ED, - 29703 - 11905: 0xAC4C, - 29704 - 11905: 0xAC4D, - 29705 - 11905: 0xC1F0, - 29706 - 11905: 0xE7F0, - 29707 - 11905: 0xAC4E, - 29708 - 11905: 0xAC4F, - 29709 - 11905: 0xAC50, - 29710 - 11905: 0xAC51, - 29711 - 11905: 0xE7F6, - 29712 - 11905: 0xCBF6, - 29713 - 11905: 0xAC52, - 29714 - 11905: 0xAC53, - 29715 - 11905: 0xAC54, - 29716 - 11905: 0xAC55, - 29717 - 11905: 0xAC56, - 29718 - 11905: 0xAC57, - 29719 - 11905: 0xAC58, - 29720 - 11905: 0xAC59, - 29721 - 11905: 0xAC5A, - 29722 - 11905: 0xE8A2, - 29723 - 11905: 0xE8A1, - 29724 - 11905: 0xAC5B, - 29725 - 11905: 0xAC5C, - 29726 - 11905: 0xAC5D, - 29727 - 11905: 0xAC5E, - 29728 - 11905: 0xAC5F, - 29729 - 11905: 0xAC60, - 29730 - 11905: 0xD7C1, - 29731 - 11905: 0xAC61, - 29732 - 11905: 0xAC62, - 29733 - 11905: 0xE7FA, - 29734 - 11905: 0xE7F9, - 29735 - 11905: 0xAC63, - 29736 - 11905: 0xE7FB, - 29737 - 11905: 0xAC64, - 29738 - 11905: 0xE7F7, - 29739 - 11905: 0xAC65, - 29740 - 11905: 0xE7FE, - 29741 - 11905: 0xAC66, - 29742 - 11905: 0xE7FD, - 29743 - 11905: 0xAC67, - 29744 - 11905: 0xE7FC, - 29745 - 11905: 0xAC68, - 29746 - 11905: 0xAC69, - 29747 - 11905: 0xC1D5, - 29748 - 11905: 0xC7D9, - 29749 - 11905: 0xC5FD, - 29750 - 11905: 0xC5C3, - 29751 - 11905: 0xAC6A, - 29752 - 11905: 0xAC6B, - 29753 - 11905: 0xAC6C, - 29754 - 11905: 0xAC6D, - 29755 - 11905: 0xAC6E, - 29756 - 11905: 0xC7ED, - 29757 - 11905: 0xAC6F, - 29758 - 11905: 0xAC70, - 29759 - 11905: 0xAC71, - 29760 - 11905: 0xAC72, - 29761 - 11905: 0xE8A3, - 29762 - 11905: 0xAC73, - 29763 - 11905: 0xAC74, - 29764 - 11905: 0xAC75, - 29765 - 11905: 0xAC76, - 29766 - 11905: 0xAC77, - 29767 - 11905: 0xAC78, - 29768 - 11905: 0xAC79, - 29769 - 11905: 0xAC7A, - 29770 - 11905: 0xAC7B, - 29771 - 11905: 0xAC7C, - 29772 - 11905: 0xAC7D, - 29773 - 11905: 0xAC7E, - 29774 - 11905: 0xAC80, - 29775 - 11905: 0xAC81, - 29776 - 11905: 0xAC82, - 29777 - 11905: 0xAC83, - 29778 - 11905: 0xAC84, - 29779 - 11905: 0xAC85, - 29780 - 11905: 0xAC86, - 29781 - 11905: 0xE8A6, - 29782 - 11905: 0xAC87, - 29783 - 11905: 0xE8A5, - 29784 - 11905: 0xAC88, - 29785 - 11905: 0xE8A7, - 29786 - 11905: 0xBAF7, - 29787 - 11905: 0xE7F8, - 29788 - 11905: 0xE8A4, - 29789 - 11905: 0xAC89, - 29790 - 11905: 0xC8F0, - 29791 - 11905: 0xC9AA, - 29792 - 11905: 0xAC8A, - 29793 - 11905: 0xAC8B, - 29794 - 11905: 0xAC8C, - 29795 - 11905: 0xAC8D, - 29796 - 11905: 0xAC8E, - 29797 - 11905: 0xAC8F, - 29798 - 11905: 0xAC90, - 29799 - 11905: 0xAC91, - 29800 - 11905: 0xAC92, - 29801 - 11905: 0xAC93, - 29802 - 11905: 0xAC94, - 29803 - 11905: 0xAC95, - 29804 - 11905: 0xAC96, - 29805 - 11905: 0xE8A9, - 29806 - 11905: 0xAC97, - 29807 - 11905: 0xAC98, - 29808 - 11905: 0xB9E5, - 29809 - 11905: 0xAC99, - 29810 - 11905: 0xAC9A, - 29811 - 11905: 0xAC9B, - 29812 - 11905: 0xAC9C, - 29813 - 11905: 0xAC9D, - 29814 - 11905: 0xD1FE, - 29815 - 11905: 0xE8A8, - 29816 - 11905: 0xAC9E, - 29817 - 11905: 0xAC9F, - 29818 - 11905: 0xACA0, - 29819 - 11905: 0xAD40, - 29820 - 11905: 0xAD41, - 29821 - 11905: 0xAD42, - 29822 - 11905: 0xE8AA, - 29823 - 11905: 0xAD43, - 29824 - 11905: 0xE8AD, - 29825 - 11905: 0xE8AE, - 29826 - 11905: 0xAD44, - 29827 - 11905: 0xC1A7, - 29828 - 11905: 0xAD45, - 29829 - 11905: 0xAD46, - 29830 - 11905: 0xAD47, - 29831 - 11905: 0xE8AF, - 29832 - 11905: 0xAD48, - 29833 - 11905: 0xAD49, - 29834 - 11905: 0xAD4A, - 29835 - 11905: 0xE8B0, - 29836 - 11905: 0xAD4B, - 29837 - 11905: 0xAD4C, - 29838 - 11905: 0xE8AC, - 29839 - 11905: 0xAD4D, - 29840 - 11905: 0xE8B4, - 29841 - 11905: 0xAD4E, - 29842 - 11905: 0xAD4F, - 29843 - 11905: 0xAD50, - 29844 - 11905: 0xAD51, - 29845 - 11905: 0xAD52, - 29846 - 11905: 0xAD53, - 29847 - 11905: 0xAD54, - 29848 - 11905: 0xAD55, - 29849 - 11905: 0xAD56, - 29850 - 11905: 0xAD57, - 29851 - 11905: 0xAD58, - 29852 - 11905: 0xE8AB, - 29853 - 11905: 0xAD59, - 29854 - 11905: 0xE8B1, - 29855 - 11905: 0xAD5A, - 29856 - 11905: 0xAD5B, - 29857 - 11905: 0xAD5C, - 29858 - 11905: 0xAD5D, - 29859 - 11905: 0xAD5E, - 29860 - 11905: 0xAD5F, - 29861 - 11905: 0xAD60, - 29862 - 11905: 0xAD61, - 29863 - 11905: 0xE8B5, - 29864 - 11905: 0xE8B2, - 29865 - 11905: 0xE8B3, - 29866 - 11905: 0xAD62, - 29867 - 11905: 0xAD63, - 29868 - 11905: 0xAD64, - 29869 - 11905: 0xAD65, - 29870 - 11905: 0xAD66, - 29871 - 11905: 0xAD67, - 29872 - 11905: 0xAD68, - 29873 - 11905: 0xAD69, - 29874 - 11905: 0xAD6A, - 29875 - 11905: 0xAD6B, - 29876 - 11905: 0xAD6C, - 29877 - 11905: 0xAD6D, - 29878 - 11905: 0xAD6E, - 29879 - 11905: 0xAD6F, - 29880 - 11905: 0xAD70, - 29881 - 11905: 0xAD71, - 29882 - 11905: 0xE8B7, - 29883 - 11905: 0xAD72, - 29884 - 11905: 0xAD73, - 29885 - 11905: 0xAD74, - 29886 - 11905: 0xAD75, - 29887 - 11905: 0xAD76, - 29888 - 11905: 0xAD77, - 29889 - 11905: 0xAD78, - 29890 - 11905: 0xAD79, - 29891 - 11905: 0xAD7A, - 29892 - 11905: 0xAD7B, - 29893 - 11905: 0xAD7C, - 29894 - 11905: 0xAD7D, - 29895 - 11905: 0xAD7E, - 29896 - 11905: 0xAD80, - 29897 - 11905: 0xAD81, - 29898 - 11905: 0xAD82, - 29899 - 11905: 0xAD83, - 29900 - 11905: 0xAD84, - 29901 - 11905: 0xAD85, - 29902 - 11905: 0xAD86, - 29903 - 11905: 0xAD87, - 29904 - 11905: 0xAD88, - 29905 - 11905: 0xAD89, - 29906 - 11905: 0xE8B6, - 29907 - 11905: 0xAD8A, - 29908 - 11905: 0xAD8B, - 29909 - 11905: 0xAD8C, - 29910 - 11905: 0xAD8D, - 29911 - 11905: 0xAD8E, - 29912 - 11905: 0xAD8F, - 29913 - 11905: 0xAD90, - 29914 - 11905: 0xAD91, - 29915 - 11905: 0xAD92, - 29916 - 11905: 0xB9CF, - 29917 - 11905: 0xAD93, - 29918 - 11905: 0xF0AC, - 29919 - 11905: 0xAD94, - 29920 - 11905: 0xF0AD, - 29921 - 11905: 0xAD95, - 29922 - 11905: 0xC6B0, - 29923 - 11905: 0xB0EA, - 29924 - 11905: 0xC8BF, - 29925 - 11905: 0xAD96, - 29926 - 11905: 0xCDDF, - 29927 - 11905: 0xAD97, - 29928 - 11905: 0xAD98, - 29929 - 11905: 0xAD99, - 29930 - 11905: 0xAD9A, - 29931 - 11905: 0xAD9B, - 29932 - 11905: 0xAD9C, - 29933 - 11905: 0xAD9D, - 29934 - 11905: 0xCECD, - 29935 - 11905: 0xEAB1, - 29936 - 11905: 0xAD9E, - 29937 - 11905: 0xAD9F, - 29938 - 11905: 0xADA0, - 29939 - 11905: 0xAE40, - 29940 - 11905: 0xEAB2, - 29941 - 11905: 0xAE41, - 29942 - 11905: 0xC6BF, - 29943 - 11905: 0xB4C9, - 29944 - 11905: 0xAE42, - 29945 - 11905: 0xAE43, - 29946 - 11905: 0xAE44, - 29947 - 11905: 0xAE45, - 29948 - 11905: 0xAE46, - 29949 - 11905: 0xAE47, - 29950 - 11905: 0xAE48, - 29951 - 11905: 0xEAB3, - 29952 - 11905: 0xAE49, - 29953 - 11905: 0xAE4A, - 29954 - 11905: 0xAE4B, - 29955 - 11905: 0xAE4C, - 29956 - 11905: 0xD5E7, - 29957 - 11905: 0xAE4D, - 29958 - 11905: 0xAE4E, - 29959 - 11905: 0xAE4F, - 29960 - 11905: 0xAE50, - 29961 - 11905: 0xAE51, - 29962 - 11905: 0xAE52, - 29963 - 11905: 0xAE53, - 29964 - 11905: 0xAE54, - 29965 - 11905: 0xDDF9, - 29966 - 11905: 0xAE55, - 29967 - 11905: 0xEAB4, - 29968 - 11905: 0xAE56, - 29969 - 11905: 0xEAB5, - 29970 - 11905: 0xAE57, - 29971 - 11905: 0xEAB6, - 29972 - 11905: 0xAE58, - 29973 - 11905: 0xAE59, - 29974 - 11905: 0xAE5A, - 29975 - 11905: 0xAE5B, - 29976 - 11905: 0xB8CA, - 29977 - 11905: 0xDFB0, - 29978 - 11905: 0xC9F5, - 29979 - 11905: 0xAE5C, - 29980 - 11905: 0xCCF0, - 29981 - 11905: 0xAE5D, - 29982 - 11905: 0xAE5E, - 29983 - 11905: 0xC9FA, - 29984 - 11905: 0xAE5F, - 29985 - 11905: 0xAE60, - 29986 - 11905: 0xAE61, - 29987 - 11905: 0xAE62, - 29988 - 11905: 0xAE63, - 29989 - 11905: 0xC9FB, - 29990 - 11905: 0xAE64, - 29991 - 11905: 0xAE65, - 29992 - 11905: 0xD3C3, - 29993 - 11905: 0xCBA6, - 29994 - 11905: 0xAE66, - 29995 - 11905: 0xB8A6, - 29996 - 11905: 0xF0AE, - 29997 - 11905: 0xB1C2, - 29998 - 11905: 0xAE67, - 29999 - 11905: 0xE5B8, - 30000 - 11905: 0xCCEF, - 30001 - 11905: 0xD3C9, - 30002 - 11905: 0xBCD7, - 30003 - 11905: 0xC9EA, - 30004 - 11905: 0xAE68, - 30005 - 11905: 0xB5E7, - 30006 - 11905: 0xAE69, - 30007 - 11905: 0xC4D0, - 30008 - 11905: 0xB5E9, - 30009 - 11905: 0xAE6A, - 30010 - 11905: 0xEEAE, - 30011 - 11905: 0xBBAD, - 30012 - 11905: 0xAE6B, - 30013 - 11905: 0xAE6C, - 30014 - 11905: 0xE7DE, - 30015 - 11905: 0xAE6D, - 30016 - 11905: 0xEEAF, - 30017 - 11905: 0xAE6E, - 30018 - 11905: 0xAE6F, - 30019 - 11905: 0xAE70, - 30020 - 11905: 0xAE71, - 30021 - 11905: 0xB3A9, - 30022 - 11905: 0xAE72, - 30023 - 11905: 0xAE73, - 30024 - 11905: 0xEEB2, - 30025 - 11905: 0xAE74, - 30026 - 11905: 0xAE75, - 30027 - 11905: 0xEEB1, - 30028 - 11905: 0xBDE7, - 30029 - 11905: 0xAE76, - 30030 - 11905: 0xEEB0, - 30031 - 11905: 0xCEB7, - 30032 - 11905: 0xAE77, - 30033 - 11905: 0xAE78, - 30034 - 11905: 0xAE79, - 30035 - 11905: 0xAE7A, - 30036 - 11905: 0xC5CF, - 30037 - 11905: 0xAE7B, - 30038 - 11905: 0xAE7C, - 30039 - 11905: 0xAE7D, - 30040 - 11905: 0xAE7E, - 30041 - 11905: 0xC1F4, - 30042 - 11905: 0xDBCE, - 30043 - 11905: 0xEEB3, - 30044 - 11905: 0xD0F3, - 30045 - 11905: 0xAE80, - 30046 - 11905: 0xAE81, - 30047 - 11905: 0xAE82, - 30048 - 11905: 0xAE83, - 30049 - 11905: 0xAE84, - 30050 - 11905: 0xAE85, - 30051 - 11905: 0xAE86, - 30052 - 11905: 0xAE87, - 30053 - 11905: 0xC2D4, - 30054 - 11905: 0xC6E8, - 30055 - 11905: 0xAE88, - 30056 - 11905: 0xAE89, - 30057 - 11905: 0xAE8A, - 30058 - 11905: 0xB7AC, - 30059 - 11905: 0xAE8B, - 30060 - 11905: 0xAE8C, - 30061 - 11905: 0xAE8D, - 30062 - 11905: 0xAE8E, - 30063 - 11905: 0xAE8F, - 30064 - 11905: 0xAE90, - 30065 - 11905: 0xAE91, - 30066 - 11905: 0xEEB4, - 30067 - 11905: 0xAE92, - 30068 - 11905: 0xB3EB, - 30069 - 11905: 0xAE93, - 30070 - 11905: 0xAE94, - 30071 - 11905: 0xAE95, - 30072 - 11905: 0xBBFB, - 30073 - 11905: 0xEEB5, - 30074 - 11905: 0xAE96, - 30075 - 11905: 0xAE97, - 30076 - 11905: 0xAE98, - 30077 - 11905: 0xAE99, - 30078 - 11905: 0xAE9A, - 30079 - 11905: 0xE7DC, - 30080 - 11905: 0xAE9B, - 30081 - 11905: 0xAE9C, - 30082 - 11905: 0xAE9D, - 30083 - 11905: 0xEEB6, - 30084 - 11905: 0xAE9E, - 30085 - 11905: 0xAE9F, - 30086 - 11905: 0xBDAE, - 30087 - 11905: 0xAEA0, - 30088 - 11905: 0xAF40, - 30089 - 11905: 0xAF41, - 30090 - 11905: 0xAF42, - 30091 - 11905: 0xF1E2, - 30092 - 11905: 0xAF43, - 30093 - 11905: 0xAF44, - 30094 - 11905: 0xAF45, - 30095 - 11905: 0xCAE8, - 30096 - 11905: 0xAF46, - 30097 - 11905: 0xD2C9, - 30098 - 11905: 0xF0DA, - 30099 - 11905: 0xAF47, - 30100 - 11905: 0xF0DB, - 30101 - 11905: 0xAF48, - 30102 - 11905: 0xF0DC, - 30103 - 11905: 0xC1C6, - 30104 - 11905: 0xAF49, - 30105 - 11905: 0xB8ED, - 30106 - 11905: 0xBECE, - 30107 - 11905: 0xAF4A, - 30108 - 11905: 0xAF4B, - 30109 - 11905: 0xF0DE, - 30110 - 11905: 0xAF4C, - 30111 - 11905: 0xC5B1, - 30112 - 11905: 0xF0DD, - 30113 - 11905: 0xD1F1, - 30114 - 11905: 0xAF4D, - 30115 - 11905: 0xF0E0, - 30116 - 11905: 0xB0CC, - 30117 - 11905: 0xBDEA, - 30118 - 11905: 0xAF4E, - 30119 - 11905: 0xAF4F, - 30120 - 11905: 0xAF50, - 30121 - 11905: 0xAF51, - 30122 - 11905: 0xAF52, - 30123 - 11905: 0xD2DF, - 30124 - 11905: 0xF0DF, - 30125 - 11905: 0xAF53, - 30126 - 11905: 0xB4AF, - 30127 - 11905: 0xB7E8, - 30128 - 11905: 0xF0E6, - 30129 - 11905: 0xF0E5, - 30130 - 11905: 0xC6A3, - 30131 - 11905: 0xF0E1, - 30132 - 11905: 0xF0E2, - 30133 - 11905: 0xB4C3, - 30134 - 11905: 0xAF54, - 30135 - 11905: 0xAF55, - 30136 - 11905: 0xF0E3, - 30137 - 11905: 0xD5EE, - 30138 - 11905: 0xAF56, - 30139 - 11905: 0xAF57, - 30140 - 11905: 0xCCDB, - 30141 - 11905: 0xBED2, - 30142 - 11905: 0xBCB2, - 30143 - 11905: 0xAF58, - 30144 - 11905: 0xAF59, - 30145 - 11905: 0xAF5A, - 30146 - 11905: 0xF0E8, - 30147 - 11905: 0xF0E7, - 30148 - 11905: 0xF0E4, - 30149 - 11905: 0xB2A1, - 30150 - 11905: 0xAF5B, - 30151 - 11905: 0xD6A2, - 30152 - 11905: 0xD3B8, - 30153 - 11905: 0xBEB7, - 30154 - 11905: 0xC8AC, - 30155 - 11905: 0xAF5C, - 30156 - 11905: 0xAF5D, - 30157 - 11905: 0xF0EA, - 30158 - 11905: 0xAF5E, - 30159 - 11905: 0xAF5F, - 30160 - 11905: 0xAF60, - 30161 - 11905: 0xAF61, - 30162 - 11905: 0xD1F7, - 30163 - 11905: 0xAF62, - 30164 - 11905: 0xD6CC, - 30165 - 11905: 0xBADB, - 30166 - 11905: 0xF0E9, - 30167 - 11905: 0xAF63, - 30168 - 11905: 0xB6BB, - 30169 - 11905: 0xAF64, - 30170 - 11905: 0xAF65, - 30171 - 11905: 0xCDB4, - 30172 - 11905: 0xAF66, - 30173 - 11905: 0xAF67, - 30174 - 11905: 0xC6A6, - 30175 - 11905: 0xAF68, - 30176 - 11905: 0xAF69, - 30177 - 11905: 0xAF6A, - 30178 - 11905: 0xC1A1, - 30179 - 11905: 0xF0EB, - 30180 - 11905: 0xF0EE, - 30181 - 11905: 0xAF6B, - 30182 - 11905: 0xF0ED, - 30183 - 11905: 0xF0F0, - 30184 - 11905: 0xF0EC, - 30185 - 11905: 0xAF6C, - 30186 - 11905: 0xBBBE, - 30187 - 11905: 0xF0EF, - 30188 - 11905: 0xAF6D, - 30189 - 11905: 0xAF6E, - 30190 - 11905: 0xAF6F, - 30191 - 11905: 0xAF70, - 30192 - 11905: 0xCCB5, - 30193 - 11905: 0xF0F2, - 30194 - 11905: 0xAF71, - 30195 - 11905: 0xAF72, - 30196 - 11905: 0xB3D5, - 30197 - 11905: 0xAF73, - 30198 - 11905: 0xAF74, - 30199 - 11905: 0xAF75, - 30200 - 11905: 0xAF76, - 30201 - 11905: 0xB1D4, - 30202 - 11905: 0xAF77, - 30203 - 11905: 0xAF78, - 30204 - 11905: 0xF0F3, - 30205 - 11905: 0xAF79, - 30206 - 11905: 0xAF7A, - 30207 - 11905: 0xF0F4, - 30208 - 11905: 0xF0F6, - 30209 - 11905: 0xB4E1, - 30210 - 11905: 0xAF7B, - 30211 - 11905: 0xF0F1, - 30212 - 11905: 0xAF7C, - 30213 - 11905: 0xF0F7, - 30214 - 11905: 0xAF7D, - 30215 - 11905: 0xAF7E, - 30216 - 11905: 0xAF80, - 30217 - 11905: 0xAF81, - 30218 - 11905: 0xF0FA, - 30219 - 11905: 0xAF82, - 30220 - 11905: 0xF0F8, - 30221 - 11905: 0xAF83, - 30222 - 11905: 0xAF84, - 30223 - 11905: 0xAF85, - 30224 - 11905: 0xF0F5, - 30225 - 11905: 0xAF86, - 30226 - 11905: 0xAF87, - 30227 - 11905: 0xAF88, - 30228 - 11905: 0xAF89, - 30229 - 11905: 0xF0FD, - 30230 - 11905: 0xAF8A, - 30231 - 11905: 0xF0F9, - 30232 - 11905: 0xF0FC, - 30233 - 11905: 0xF0FE, - 30234 - 11905: 0xAF8B, - 30235 - 11905: 0xF1A1, - 30236 - 11905: 0xAF8C, - 30237 - 11905: 0xAF8D, - 30238 - 11905: 0xAF8E, - 30239 - 11905: 0xCEC1, - 30240 - 11905: 0xF1A4, - 30241 - 11905: 0xAF8F, - 30242 - 11905: 0xF1A3, - 30243 - 11905: 0xAF90, - 30244 - 11905: 0xC1F6, - 30245 - 11905: 0xF0FB, - 30246 - 11905: 0xCADD, - 30247 - 11905: 0xAF91, - 30248 - 11905: 0xAF92, - 30249 - 11905: 0xB4F1, - 30250 - 11905: 0xB1F1, - 30251 - 11905: 0xCCB1, - 30252 - 11905: 0xAF93, - 30253 - 11905: 0xF1A6, - 30254 - 11905: 0xAF94, - 30255 - 11905: 0xAF95, - 30256 - 11905: 0xF1A7, - 30257 - 11905: 0xAF96, - 30258 - 11905: 0xAF97, - 30259 - 11905: 0xF1AC, - 30260 - 11905: 0xD5CE, - 30261 - 11905: 0xF1A9, - 30262 - 11905: 0xAF98, - 30263 - 11905: 0xAF99, - 30264 - 11905: 0xC8B3, - 30265 - 11905: 0xAF9A, - 30266 - 11905: 0xAF9B, - 30267 - 11905: 0xAF9C, - 30268 - 11905: 0xF1A2, - 30269 - 11905: 0xAF9D, - 30270 - 11905: 0xF1AB, - 30271 - 11905: 0xF1A8, - 30272 - 11905: 0xF1A5, - 30273 - 11905: 0xAF9E, - 30274 - 11905: 0xAF9F, - 30275 - 11905: 0xF1AA, - 30276 - 11905: 0xAFA0, - 30277 - 11905: 0xB040, - 30278 - 11905: 0xB041, - 30279 - 11905: 0xB042, - 30280 - 11905: 0xB043, - 30281 - 11905: 0xB044, - 30282 - 11905: 0xB045, - 30283 - 11905: 0xB046, - 30284 - 11905: 0xB0A9, - 30285 - 11905: 0xF1AD, - 30286 - 11905: 0xB047, - 30287 - 11905: 0xB048, - 30288 - 11905: 0xB049, - 30289 - 11905: 0xB04A, - 30290 - 11905: 0xB04B, - 30291 - 11905: 0xB04C, - 30292 - 11905: 0xF1AF, - 30293 - 11905: 0xB04D, - 30294 - 11905: 0xF1B1, - 30295 - 11905: 0xB04E, - 30296 - 11905: 0xB04F, - 30297 - 11905: 0xB050, - 30298 - 11905: 0xB051, - 30299 - 11905: 0xB052, - 30300 - 11905: 0xF1B0, - 30301 - 11905: 0xB053, - 30302 - 11905: 0xF1AE, - 30303 - 11905: 0xB054, - 30304 - 11905: 0xB055, - 30305 - 11905: 0xB056, - 30306 - 11905: 0xB057, - 30307 - 11905: 0xD1A2, - 30308 - 11905: 0xB058, - 30309 - 11905: 0xB059, - 30310 - 11905: 0xB05A, - 30311 - 11905: 0xB05B, - 30312 - 11905: 0xB05C, - 30313 - 11905: 0xB05D, - 30314 - 11905: 0xB05E, - 30315 - 11905: 0xF1B2, - 30316 - 11905: 0xB05F, - 30317 - 11905: 0xB060, - 30318 - 11905: 0xB061, - 30319 - 11905: 0xF1B3, - 30320 - 11905: 0xB062, - 30321 - 11905: 0xB063, - 30322 - 11905: 0xB064, - 30323 - 11905: 0xB065, - 30324 - 11905: 0xB066, - 30325 - 11905: 0xB067, - 30326 - 11905: 0xB068, - 30327 - 11905: 0xB069, - 30328 - 11905: 0xB9EF, - 30329 - 11905: 0xB06A, - 30330 - 11905: 0xB06B, - 30331 - 11905: 0xB5C7, - 30332 - 11905: 0xB06C, - 30333 - 11905: 0xB0D7, - 30334 - 11905: 0xB0D9, - 30335 - 11905: 0xB06D, - 30336 - 11905: 0xB06E, - 30337 - 11905: 0xB06F, - 30338 - 11905: 0xD4ED, - 30339 - 11905: 0xB070, - 30340 - 11905: 0xB5C4, - 30341 - 11905: 0xB071, - 30342 - 11905: 0xBDD4, - 30343 - 11905: 0xBBCA, - 30344 - 11905: 0xF0A7, - 30345 - 11905: 0xB072, - 30346 - 11905: 0xB073, - 30347 - 11905: 0xB8DE, - 30348 - 11905: 0xB074, - 30349 - 11905: 0xB075, - 30350 - 11905: 0xF0A8, - 30351 - 11905: 0xB076, - 30352 - 11905: 0xB077, - 30353 - 11905: 0xB0A8, - 30354 - 11905: 0xB078, - 30355 - 11905: 0xF0A9, - 30356 - 11905: 0xB079, - 30357 - 11905: 0xB07A, - 30358 - 11905: 0xCDEE, - 30359 - 11905: 0xB07B, - 30360 - 11905: 0xB07C, - 30361 - 11905: 0xF0AA, - 30362 - 11905: 0xB07D, - 30363 - 11905: 0xB07E, - 30364 - 11905: 0xB080, - 30365 - 11905: 0xB081, - 30366 - 11905: 0xB082, - 30367 - 11905: 0xB083, - 30368 - 11905: 0xB084, - 30369 - 11905: 0xB085, - 30370 - 11905: 0xB086, - 30371 - 11905: 0xB087, - 30372 - 11905: 0xF0AB, - 30373 - 11905: 0xB088, - 30374 - 11905: 0xB089, - 30375 - 11905: 0xB08A, - 30376 - 11905: 0xB08B, - 30377 - 11905: 0xB08C, - 30378 - 11905: 0xB08D, - 30379 - 11905: 0xB08E, - 30380 - 11905: 0xB08F, - 30381 - 11905: 0xB090, - 30382 - 11905: 0xC6A4, - 30383 - 11905: 0xB091, - 30384 - 11905: 0xB092, - 30385 - 11905: 0xD6E5, - 30386 - 11905: 0xF1E4, - 30387 - 11905: 0xB093, - 30388 - 11905: 0xF1E5, - 30389 - 11905: 0xB094, - 30390 - 11905: 0xB095, - 30391 - 11905: 0xB096, - 30392 - 11905: 0xB097, - 30393 - 11905: 0xB098, - 30394 - 11905: 0xB099, - 30395 - 11905: 0xB09A, - 30396 - 11905: 0xB09B, - 30397 - 11905: 0xB09C, - 30398 - 11905: 0xB09D, - 30399 - 11905: 0xC3F3, - 30400 - 11905: 0xB09E, - 30401 - 11905: 0xB09F, - 30402 - 11905: 0xD3DB, - 30403 - 11905: 0xB0A0, - 30404 - 11905: 0xB140, - 30405 - 11905: 0xD6D1, - 30406 - 11905: 0xC5E8, - 30407 - 11905: 0xB141, - 30408 - 11905: 0xD3AF, - 30409 - 11905: 0xB142, - 30410 - 11905: 0xD2E6, - 30411 - 11905: 0xB143, - 30412 - 11905: 0xB144, - 30413 - 11905: 0xEEC1, - 30414 - 11905: 0xB0BB, - 30415 - 11905: 0xD5B5, - 30416 - 11905: 0xD1CE, - 30417 - 11905: 0xBCE0, - 30418 - 11905: 0xBAD0, - 30419 - 11905: 0xB145, - 30420 - 11905: 0xBFF8, - 30421 - 11905: 0xB146, - 30422 - 11905: 0xB8C7, - 30423 - 11905: 0xB5C1, - 30424 - 11905: 0xC5CC, - 30425 - 11905: 0xB147, - 30426 - 11905: 0xB148, - 30427 - 11905: 0xCAA2, - 30428 - 11905: 0xB149, - 30429 - 11905: 0xB14A, - 30430 - 11905: 0xB14B, - 30431 - 11905: 0xC3CB, - 30432 - 11905: 0xB14C, - 30433 - 11905: 0xB14D, - 30434 - 11905: 0xB14E, - 30435 - 11905: 0xB14F, - 30436 - 11905: 0xB150, - 30437 - 11905: 0xEEC2, - 30438 - 11905: 0xB151, - 30439 - 11905: 0xB152, - 30440 - 11905: 0xB153, - 30441 - 11905: 0xB154, - 30442 - 11905: 0xB155, - 30443 - 11905: 0xB156, - 30444 - 11905: 0xB157, - 30445 - 11905: 0xB158, - 30446 - 11905: 0xC4BF, - 30447 - 11905: 0xB6A2, - 30448 - 11905: 0xB159, - 30449 - 11905: 0xEDEC, - 30450 - 11905: 0xC3A4, - 30451 - 11905: 0xB15A, - 30452 - 11905: 0xD6B1, - 30453 - 11905: 0xB15B, - 30454 - 11905: 0xB15C, - 30455 - 11905: 0xB15D, - 30456 - 11905: 0xCFE0, - 30457 - 11905: 0xEDEF, - 30458 - 11905: 0xB15E, - 30459 - 11905: 0xB15F, - 30460 - 11905: 0xC5CE, - 30461 - 11905: 0xB160, - 30462 - 11905: 0xB6DC, - 30463 - 11905: 0xB161, - 30464 - 11905: 0xB162, - 30465 - 11905: 0xCAA1, - 30466 - 11905: 0xB163, - 30467 - 11905: 0xB164, - 30468 - 11905: 0xEDED, - 30469 - 11905: 0xB165, - 30470 - 11905: 0xB166, - 30471 - 11905: 0xEDF0, - 30472 - 11905: 0xEDF1, - 30473 - 11905: 0xC3BC, - 30474 - 11905: 0xB167, - 30475 - 11905: 0xBFB4, - 30476 - 11905: 0xB168, - 30477 - 11905: 0xEDEE, - 30478 - 11905: 0xB169, - 30479 - 11905: 0xB16A, - 30480 - 11905: 0xB16B, - 30481 - 11905: 0xB16C, - 30482 - 11905: 0xB16D, - 30483 - 11905: 0xB16E, - 30484 - 11905: 0xB16F, - 30485 - 11905: 0xB170, - 30486 - 11905: 0xB171, - 30487 - 11905: 0xB172, - 30488 - 11905: 0xB173, - 30489 - 11905: 0xEDF4, - 30490 - 11905: 0xEDF2, - 30491 - 11905: 0xB174, - 30492 - 11905: 0xB175, - 30493 - 11905: 0xB176, - 30494 - 11905: 0xB177, - 30495 - 11905: 0xD5E6, - 30496 - 11905: 0xC3DF, - 30497 - 11905: 0xB178, - 30498 - 11905: 0xEDF3, - 30499 - 11905: 0xB179, - 30500 - 11905: 0xB17A, - 30501 - 11905: 0xB17B, - 30502 - 11905: 0xEDF6, - 30503 - 11905: 0xB17C, - 30504 - 11905: 0xD5A3, - 30505 - 11905: 0xD1A3, - 30506 - 11905: 0xB17D, - 30507 - 11905: 0xB17E, - 30508 - 11905: 0xB180, - 30509 - 11905: 0xEDF5, - 30510 - 11905: 0xB181, - 30511 - 11905: 0xC3D0, - 30512 - 11905: 0xB182, - 30513 - 11905: 0xB183, - 30514 - 11905: 0xB184, - 30515 - 11905: 0xB185, - 30516 - 11905: 0xB186, - 30517 - 11905: 0xEDF7, - 30518 - 11905: 0xBFF4, - 30519 - 11905: 0xBEEC, - 30520 - 11905: 0xEDF8, - 30521 - 11905: 0xB187, - 30522 - 11905: 0xCCF7, - 30523 - 11905: 0xB188, - 30524 - 11905: 0xD1DB, - 30525 - 11905: 0xB189, - 30526 - 11905: 0xB18A, - 30527 - 11905: 0xB18B, - 30528 - 11905: 0xD7C5, - 30529 - 11905: 0xD5F6, - 30530 - 11905: 0xB18C, - 30531 - 11905: 0xEDFC, - 30532 - 11905: 0xB18D, - 30533 - 11905: 0xB18E, - 30534 - 11905: 0xB18F, - 30535 - 11905: 0xEDFB, - 30536 - 11905: 0xB190, - 30537 - 11905: 0xB191, - 30538 - 11905: 0xB192, - 30539 - 11905: 0xB193, - 30540 - 11905: 0xB194, - 30541 - 11905: 0xB195, - 30542 - 11905: 0xB196, - 30543 - 11905: 0xB197, - 30544 - 11905: 0xEDF9, - 30545 - 11905: 0xEDFA, - 30546 - 11905: 0xB198, - 30547 - 11905: 0xB199, - 30548 - 11905: 0xB19A, - 30549 - 11905: 0xB19B, - 30550 - 11905: 0xB19C, - 30551 - 11905: 0xB19D, - 30552 - 11905: 0xB19E, - 30553 - 11905: 0xB19F, - 30554 - 11905: 0xEDFD, - 30555 - 11905: 0xBEA6, - 30556 - 11905: 0xB1A0, - 30557 - 11905: 0xB240, - 30558 - 11905: 0xB241, - 30559 - 11905: 0xB242, - 30560 - 11905: 0xB243, - 30561 - 11905: 0xCBAF, - 30562 - 11905: 0xEEA1, - 30563 - 11905: 0xB6BD, - 30564 - 11905: 0xB244, - 30565 - 11905: 0xEEA2, - 30566 - 11905: 0xC4C0, - 30567 - 11905: 0xB245, - 30568 - 11905: 0xEDFE, - 30569 - 11905: 0xB246, - 30570 - 11905: 0xB247, - 30571 - 11905: 0xBDDE, - 30572 - 11905: 0xB2C7, - 30573 - 11905: 0xB248, - 30574 - 11905: 0xB249, - 30575 - 11905: 0xB24A, - 30576 - 11905: 0xB24B, - 30577 - 11905: 0xB24C, - 30578 - 11905: 0xB24D, - 30579 - 11905: 0xB24E, - 30580 - 11905: 0xB24F, - 30581 - 11905: 0xB250, - 30582 - 11905: 0xB251, - 30583 - 11905: 0xB252, - 30584 - 11905: 0xB253, - 30585 - 11905: 0xB6C3, - 30586 - 11905: 0xB254, - 30587 - 11905: 0xB255, - 30588 - 11905: 0xB256, - 30589 - 11905: 0xEEA5, - 30590 - 11905: 0xD8BA, - 30591 - 11905: 0xEEA3, - 30592 - 11905: 0xEEA6, - 30593 - 11905: 0xB257, - 30594 - 11905: 0xB258, - 30595 - 11905: 0xB259, - 30596 - 11905: 0xC3E9, - 30597 - 11905: 0xB3F2, - 30598 - 11905: 0xB25A, - 30599 - 11905: 0xB25B, - 30600 - 11905: 0xB25C, - 30601 - 11905: 0xB25D, - 30602 - 11905: 0xB25E, - 30603 - 11905: 0xB25F, - 30604 - 11905: 0xEEA7, - 30605 - 11905: 0xEEA4, - 30606 - 11905: 0xCFB9, - 30607 - 11905: 0xB260, - 30608 - 11905: 0xB261, - 30609 - 11905: 0xEEA8, - 30610 - 11905: 0xC2F7, - 30611 - 11905: 0xB262, - 30612 - 11905: 0xB263, - 30613 - 11905: 0xB264, - 30614 - 11905: 0xB265, - 30615 - 11905: 0xB266, - 30616 - 11905: 0xB267, - 30617 - 11905: 0xB268, - 30618 - 11905: 0xB269, - 30619 - 11905: 0xB26A, - 30620 - 11905: 0xB26B, - 30621 - 11905: 0xB26C, - 30622 - 11905: 0xB26D, - 30623 - 11905: 0xEEA9, - 30624 - 11905: 0xEEAA, - 30625 - 11905: 0xB26E, - 30626 - 11905: 0xDEAB, - 30627 - 11905: 0xB26F, - 30628 - 11905: 0xB270, - 30629 - 11905: 0xC6B3, - 30630 - 11905: 0xB271, - 30631 - 11905: 0xC7C6, - 30632 - 11905: 0xB272, - 30633 - 11905: 0xD6F5, - 30634 - 11905: 0xB5C9, - 30635 - 11905: 0xB273, - 30636 - 11905: 0xCBB2, - 30637 - 11905: 0xB274, - 30638 - 11905: 0xB275, - 30639 - 11905: 0xB276, - 30640 - 11905: 0xEEAB, - 30641 - 11905: 0xB277, - 30642 - 11905: 0xB278, - 30643 - 11905: 0xCDAB, - 30644 - 11905: 0xB279, - 30645 - 11905: 0xEEAC, - 30646 - 11905: 0xB27A, - 30647 - 11905: 0xB27B, - 30648 - 11905: 0xB27C, - 30649 - 11905: 0xB27D, - 30650 - 11905: 0xB27E, - 30651 - 11905: 0xD5B0, - 30652 - 11905: 0xB280, - 30653 - 11905: 0xEEAD, - 30654 - 11905: 0xB281, - 30655 - 11905: 0xF6C4, - 30656 - 11905: 0xB282, - 30657 - 11905: 0xB283, - 30658 - 11905: 0xB284, - 30659 - 11905: 0xB285, - 30660 - 11905: 0xB286, - 30661 - 11905: 0xB287, - 30662 - 11905: 0xB288, - 30663 - 11905: 0xB289, - 30664 - 11905: 0xB28A, - 30665 - 11905: 0xB28B, - 30666 - 11905: 0xB28C, - 30667 - 11905: 0xB28D, - 30668 - 11905: 0xB28E, - 30669 - 11905: 0xDBC7, - 30670 - 11905: 0xB28F, - 30671 - 11905: 0xB290, - 30672 - 11905: 0xB291, - 30673 - 11905: 0xB292, - 30674 - 11905: 0xB293, - 30675 - 11905: 0xB294, - 30676 - 11905: 0xB295, - 30677 - 11905: 0xB296, - 30678 - 11905: 0xB297, - 30679 - 11905: 0xB4A3, - 30680 - 11905: 0xB298, - 30681 - 11905: 0xB299, - 30682 - 11905: 0xB29A, - 30683 - 11905: 0xC3AC, - 30684 - 11905: 0xF1E6, - 30685 - 11905: 0xB29B, - 30686 - 11905: 0xB29C, - 30687 - 11905: 0xB29D, - 30688 - 11905: 0xB29E, - 30689 - 11905: 0xB29F, - 30690 - 11905: 0xCAB8, - 30691 - 11905: 0xD2D3, - 30692 - 11905: 0xB2A0, - 30693 - 11905: 0xD6AA, - 30694 - 11905: 0xB340, - 30695 - 11905: 0xEFF2, - 30696 - 11905: 0xB341, - 30697 - 11905: 0xBED8, - 30698 - 11905: 0xB342, - 30699 - 11905: 0xBDC3, - 30700 - 11905: 0xEFF3, - 30701 - 11905: 0xB6CC, - 30702 - 11905: 0xB0AB, - 30703 - 11905: 0xB343, - 30704 - 11905: 0xB344, - 30705 - 11905: 0xB345, - 30706 - 11905: 0xB346, - 30707 - 11905: 0xCAAF, - 30708 - 11905: 0xB347, - 30709 - 11905: 0xB348, - 30710 - 11905: 0xEDB6, - 30711 - 11905: 0xB349, - 30712 - 11905: 0xEDB7, - 30713 - 11905: 0xB34A, - 30714 - 11905: 0xB34B, - 30715 - 11905: 0xB34C, - 30716 - 11905: 0xB34D, - 30717 - 11905: 0xCEF9, - 30718 - 11905: 0xB7AF, - 30719 - 11905: 0xBFF3, - 30720 - 11905: 0xEDB8, - 30721 - 11905: 0xC2EB, - 30722 - 11905: 0xC9B0, - 30723 - 11905: 0xB34E, - 30724 - 11905: 0xB34F, - 30725 - 11905: 0xB350, - 30726 - 11905: 0xB351, - 30727 - 11905: 0xB352, - 30728 - 11905: 0xB353, - 30729 - 11905: 0xEDB9, - 30730 - 11905: 0xB354, - 30731 - 11905: 0xB355, - 30732 - 11905: 0xC6F6, - 30733 - 11905: 0xBFB3, - 30734 - 11905: 0xB356, - 30735 - 11905: 0xB357, - 30736 - 11905: 0xB358, - 30737 - 11905: 0xEDBC, - 30738 - 11905: 0xC5F8, - 30739 - 11905: 0xB359, - 30740 - 11905: 0xD1D0, - 30741 - 11905: 0xB35A, - 30742 - 11905: 0xD7A9, - 30743 - 11905: 0xEDBA, - 30744 - 11905: 0xEDBB, - 30745 - 11905: 0xB35B, - 30746 - 11905: 0xD1E2, - 30747 - 11905: 0xB35C, - 30748 - 11905: 0xEDBF, - 30749 - 11905: 0xEDC0, - 30750 - 11905: 0xB35D, - 30751 - 11905: 0xEDC4, - 30752 - 11905: 0xB35E, - 30753 - 11905: 0xB35F, - 30754 - 11905: 0xB360, - 30755 - 11905: 0xEDC8, - 30756 - 11905: 0xB361, - 30757 - 11905: 0xEDC6, - 30758 - 11905: 0xEDCE, - 30759 - 11905: 0xD5E8, - 30760 - 11905: 0xB362, - 30761 - 11905: 0xEDC9, - 30762 - 11905: 0xB363, - 30763 - 11905: 0xB364, - 30764 - 11905: 0xEDC7, - 30765 - 11905: 0xEDBE, - 30766 - 11905: 0xB365, - 30767 - 11905: 0xB366, - 30768 - 11905: 0xC5E9, - 30769 - 11905: 0xB367, - 30770 - 11905: 0xB368, - 30771 - 11905: 0xB369, - 30772 - 11905: 0xC6C6, - 30773 - 11905: 0xB36A, - 30774 - 11905: 0xB36B, - 30775 - 11905: 0xC9E9, - 30776 - 11905: 0xD4D2, - 30777 - 11905: 0xEDC1, - 30778 - 11905: 0xEDC2, - 30779 - 11905: 0xEDC3, - 30780 - 11905: 0xEDC5, - 30781 - 11905: 0xB36C, - 30782 - 11905: 0xC0F9, - 30783 - 11905: 0xB36D, - 30784 - 11905: 0xB4A1, - 30785 - 11905: 0xB36E, - 30786 - 11905: 0xB36F, - 30787 - 11905: 0xB370, - 30788 - 11905: 0xB371, - 30789 - 11905: 0xB9E8, - 30790 - 11905: 0xB372, - 30791 - 11905: 0xEDD0, - 30792 - 11905: 0xB373, - 30793 - 11905: 0xB374, - 30794 - 11905: 0xB375, - 30795 - 11905: 0xB376, - 30796 - 11905: 0xEDD1, - 30797 - 11905: 0xB377, - 30798 - 11905: 0xEDCA, - 30799 - 11905: 0xB378, - 30800 - 11905: 0xEDCF, - 30801 - 11905: 0xB379, - 30802 - 11905: 0xCEF8, - 30803 - 11905: 0xB37A, - 30804 - 11905: 0xB37B, - 30805 - 11905: 0xCBB6, - 30806 - 11905: 0xEDCC, - 30807 - 11905: 0xEDCD, - 30808 - 11905: 0xB37C, - 30809 - 11905: 0xB37D, - 30810 - 11905: 0xB37E, - 30811 - 11905: 0xB380, - 30812 - 11905: 0xB381, - 30813 - 11905: 0xCFF5, - 30814 - 11905: 0xB382, - 30815 - 11905: 0xB383, - 30816 - 11905: 0xB384, - 30817 - 11905: 0xB385, - 30818 - 11905: 0xB386, - 30819 - 11905: 0xB387, - 30820 - 11905: 0xB388, - 30821 - 11905: 0xB389, - 30822 - 11905: 0xB38A, - 30823 - 11905: 0xB38B, - 30824 - 11905: 0xB38C, - 30825 - 11905: 0xB38D, - 30826 - 11905: 0xEDD2, - 30827 - 11905: 0xC1F2, - 30828 - 11905: 0xD3B2, - 30829 - 11905: 0xEDCB, - 30830 - 11905: 0xC8B7, - 30831 - 11905: 0xB38E, - 30832 - 11905: 0xB38F, - 30833 - 11905: 0xB390, - 30834 - 11905: 0xB391, - 30835 - 11905: 0xB392, - 30836 - 11905: 0xB393, - 30837 - 11905: 0xB394, - 30838 - 11905: 0xB395, - 30839 - 11905: 0xBCEF, - 30840 - 11905: 0xB396, - 30841 - 11905: 0xB397, - 30842 - 11905: 0xB398, - 30843 - 11905: 0xB399, - 30844 - 11905: 0xC5F0, - 30845 - 11905: 0xB39A, - 30846 - 11905: 0xB39B, - 30847 - 11905: 0xB39C, - 30848 - 11905: 0xB39D, - 30849 - 11905: 0xB39E, - 30850 - 11905: 0xB39F, - 30851 - 11905: 0xB3A0, - 30852 - 11905: 0xB440, - 30853 - 11905: 0xB441, - 30854 - 11905: 0xB442, - 30855 - 11905: 0xEDD6, - 30856 - 11905: 0xB443, - 30857 - 11905: 0xB5EF, - 30858 - 11905: 0xB444, - 30859 - 11905: 0xB445, - 30860 - 11905: 0xC2B5, - 30861 - 11905: 0xB0AD, - 30862 - 11905: 0xCBE9, - 30863 - 11905: 0xB446, - 30864 - 11905: 0xB447, - 30865 - 11905: 0xB1AE, - 30866 - 11905: 0xB448, - 30867 - 11905: 0xEDD4, - 30868 - 11905: 0xB449, - 30869 - 11905: 0xB44A, - 30870 - 11905: 0xB44B, - 30871 - 11905: 0xCDEB, - 30872 - 11905: 0xB5E2, - 30873 - 11905: 0xB44C, - 30874 - 11905: 0xEDD5, - 30875 - 11905: 0xEDD3, - 30876 - 11905: 0xEDD7, - 30877 - 11905: 0xB44D, - 30878 - 11905: 0xB44E, - 30879 - 11905: 0xB5FA, - 30880 - 11905: 0xB44F, - 30881 - 11905: 0xEDD8, - 30882 - 11905: 0xB450, - 30883 - 11905: 0xEDD9, - 30884 - 11905: 0xB451, - 30885 - 11905: 0xEDDC, - 30886 - 11905: 0xB452, - 30887 - 11905: 0xB1CC, - 30888 - 11905: 0xB453, - 30889 - 11905: 0xB454, - 30890 - 11905: 0xB455, - 30891 - 11905: 0xB456, - 30892 - 11905: 0xB457, - 30893 - 11905: 0xB458, - 30894 - 11905: 0xB459, - 30895 - 11905: 0xB45A, - 30896 - 11905: 0xC5F6, - 30897 - 11905: 0xBCEE, - 30898 - 11905: 0xEDDA, - 30899 - 11905: 0xCCBC, - 30900 - 11905: 0xB2EA, - 30901 - 11905: 0xB45B, - 30902 - 11905: 0xB45C, - 30903 - 11905: 0xB45D, - 30904 - 11905: 0xB45E, - 30905 - 11905: 0xEDDB, - 30906 - 11905: 0xB45F, - 30907 - 11905: 0xB460, - 30908 - 11905: 0xB461, - 30909 - 11905: 0xB462, - 30910 - 11905: 0xC4EB, - 30911 - 11905: 0xB463, - 30912 - 11905: 0xB464, - 30913 - 11905: 0xB4C5, - 30914 - 11905: 0xB465, - 30915 - 11905: 0xB466, - 30916 - 11905: 0xB467, - 30917 - 11905: 0xB0F5, - 30918 - 11905: 0xB468, - 30919 - 11905: 0xB469, - 30920 - 11905: 0xB46A, - 30921 - 11905: 0xEDDF, - 30922 - 11905: 0xC0DA, - 30923 - 11905: 0xB4E8, - 30924 - 11905: 0xB46B, - 30925 - 11905: 0xB46C, - 30926 - 11905: 0xB46D, - 30927 - 11905: 0xB46E, - 30928 - 11905: 0xC5CD, - 30929 - 11905: 0xB46F, - 30930 - 11905: 0xB470, - 30931 - 11905: 0xB471, - 30932 - 11905: 0xEDDD, - 30933 - 11905: 0xBFC4, - 30934 - 11905: 0xB472, - 30935 - 11905: 0xB473, - 30936 - 11905: 0xB474, - 30937 - 11905: 0xEDDE, - 30938 - 11905: 0xB475, - 30939 - 11905: 0xB476, - 30940 - 11905: 0xB477, - 30941 - 11905: 0xB478, - 30942 - 11905: 0xB479, - 30943 - 11905: 0xB47A, - 30944 - 11905: 0xB47B, - 30945 - 11905: 0xB47C, - 30946 - 11905: 0xB47D, - 30947 - 11905: 0xB47E, - 30948 - 11905: 0xB480, - 30949 - 11905: 0xB481, - 30950 - 11905: 0xB482, - 30951 - 11905: 0xB483, - 30952 - 11905: 0xC4A5, - 30953 - 11905: 0xB484, - 30954 - 11905: 0xB485, - 30955 - 11905: 0xB486, - 30956 - 11905: 0xEDE0, - 30957 - 11905: 0xB487, - 30958 - 11905: 0xB488, - 30959 - 11905: 0xB489, - 30960 - 11905: 0xB48A, - 30961 - 11905: 0xB48B, - 30962 - 11905: 0xEDE1, - 30963 - 11905: 0xB48C, - 30964 - 11905: 0xEDE3, - 30965 - 11905: 0xB48D, - 30966 - 11905: 0xB48E, - 30967 - 11905: 0xC1D7, - 30968 - 11905: 0xB48F, - 30969 - 11905: 0xB490, - 30970 - 11905: 0xBBC7, - 30971 - 11905: 0xB491, - 30972 - 11905: 0xB492, - 30973 - 11905: 0xB493, - 30974 - 11905: 0xB494, - 30975 - 11905: 0xB495, - 30976 - 11905: 0xB496, - 30977 - 11905: 0xBDB8, - 30978 - 11905: 0xB497, - 30979 - 11905: 0xB498, - 30980 - 11905: 0xB499, - 30981 - 11905: 0xEDE2, - 30982 - 11905: 0xB49A, - 30983 - 11905: 0xB49B, - 30984 - 11905: 0xB49C, - 30985 - 11905: 0xB49D, - 30986 - 11905: 0xB49E, - 30987 - 11905: 0xB49F, - 30988 - 11905: 0xB4A0, - 30989 - 11905: 0xB540, - 30990 - 11905: 0xB541, - 30991 - 11905: 0xB542, - 30992 - 11905: 0xB543, - 30993 - 11905: 0xB544, - 30994 - 11905: 0xB545, - 30995 - 11905: 0xEDE4, - 30996 - 11905: 0xB546, - 30997 - 11905: 0xB547, - 30998 - 11905: 0xB548, - 30999 - 11905: 0xB549, - 31000 - 11905: 0xB54A, - 31001 - 11905: 0xB54B, - 31002 - 11905: 0xB54C, - 31003 - 11905: 0xB54D, - 31004 - 11905: 0xB54E, - 31005 - 11905: 0xB54F, - 31006 - 11905: 0xEDE6, - 31007 - 11905: 0xB550, - 31008 - 11905: 0xB551, - 31009 - 11905: 0xB552, - 31010 - 11905: 0xB553, - 31011 - 11905: 0xB554, - 31012 - 11905: 0xEDE5, - 31013 - 11905: 0xB555, - 31014 - 11905: 0xB556, - 31015 - 11905: 0xB557, - 31016 - 11905: 0xB558, - 31017 - 11905: 0xB559, - 31018 - 11905: 0xB55A, - 31019 - 11905: 0xB55B, - 31020 - 11905: 0xB55C, - 31021 - 11905: 0xB55D, - 31022 - 11905: 0xB55E, - 31023 - 11905: 0xB55F, - 31024 - 11905: 0xB560, - 31025 - 11905: 0xB561, - 31026 - 11905: 0xB562, - 31027 - 11905: 0xB563, - 31028 - 11905: 0xEDE7, - 31029 - 11905: 0xB564, - 31030 - 11905: 0xB565, - 31031 - 11905: 0xB566, - 31032 - 11905: 0xB567, - 31033 - 11905: 0xB568, - 31034 - 11905: 0xCABE, - 31035 - 11905: 0xECEA, - 31036 - 11905: 0xC0F1, - 31037 - 11905: 0xB569, - 31038 - 11905: 0xC9E7, - 31039 - 11905: 0xB56A, - 31040 - 11905: 0xECEB, - 31041 - 11905: 0xC6EE, - 31042 - 11905: 0xB56B, - 31043 - 11905: 0xB56C, - 31044 - 11905: 0xB56D, - 31045 - 11905: 0xB56E, - 31046 - 11905: 0xECEC, - 31047 - 11905: 0xB56F, - 31048 - 11905: 0xC6ED, - 31049 - 11905: 0xECED, - 31050 - 11905: 0xB570, - 31051 - 11905: 0xB571, - 31052 - 11905: 0xB572, - 31053 - 11905: 0xB573, - 31054 - 11905: 0xB574, - 31055 - 11905: 0xB575, - 31056 - 11905: 0xB576, - 31057 - 11905: 0xB577, - 31058 - 11905: 0xB578, - 31059 - 11905: 0xECF0, - 31060 - 11905: 0xB579, - 31061 - 11905: 0xB57A, - 31062 - 11905: 0xD7E6, - 31063 - 11905: 0xECF3, - 31064 - 11905: 0xB57B, - 31065 - 11905: 0xB57C, - 31066 - 11905: 0xECF1, - 31067 - 11905: 0xECEE, - 31068 - 11905: 0xECEF, - 31069 - 11905: 0xD7A3, - 31070 - 11905: 0xC9F1, - 31071 - 11905: 0xCBEE, - 31072 - 11905: 0xECF4, - 31073 - 11905: 0xB57D, - 31074 - 11905: 0xECF2, - 31075 - 11905: 0xB57E, - 31076 - 11905: 0xB580, - 31077 - 11905: 0xCFE9, - 31078 - 11905: 0xB581, - 31079 - 11905: 0xECF6, - 31080 - 11905: 0xC6B1, - 31081 - 11905: 0xB582, - 31082 - 11905: 0xB583, - 31083 - 11905: 0xB584, - 31084 - 11905: 0xB585, - 31085 - 11905: 0xBCC0, - 31086 - 11905: 0xB586, - 31087 - 11905: 0xECF5, - 31088 - 11905: 0xB587, - 31089 - 11905: 0xB588, - 31090 - 11905: 0xB589, - 31091 - 11905: 0xB58A, - 31092 - 11905: 0xB58B, - 31093 - 11905: 0xB58C, - 31094 - 11905: 0xB58D, - 31095 - 11905: 0xB5BB, - 31096 - 11905: 0xBBF6, - 31097 - 11905: 0xB58E, - 31098 - 11905: 0xECF7, - 31099 - 11905: 0xB58F, - 31100 - 11905: 0xB590, - 31101 - 11905: 0xB591, - 31102 - 11905: 0xB592, - 31103 - 11905: 0xB593, - 31104 - 11905: 0xD9F7, - 31105 - 11905: 0xBDFB, - 31106 - 11905: 0xB594, - 31107 - 11905: 0xB595, - 31108 - 11905: 0xC2BB, - 31109 - 11905: 0xECF8, - 31110 - 11905: 0xB596, - 31111 - 11905: 0xB597, - 31112 - 11905: 0xB598, - 31113 - 11905: 0xB599, - 31114 - 11905: 0xECF9, - 31115 - 11905: 0xB59A, - 31116 - 11905: 0xB59B, - 31117 - 11905: 0xB59C, - 31118 - 11905: 0xB59D, - 31119 - 11905: 0xB8A3, - 31120 - 11905: 0xB59E, - 31121 - 11905: 0xB59F, - 31122 - 11905: 0xB5A0, - 31123 - 11905: 0xB640, - 31124 - 11905: 0xB641, - 31125 - 11905: 0xB642, - 31126 - 11905: 0xB643, - 31127 - 11905: 0xB644, - 31128 - 11905: 0xB645, - 31129 - 11905: 0xB646, - 31130 - 11905: 0xECFA, - 31131 - 11905: 0xB647, - 31132 - 11905: 0xB648, - 31133 - 11905: 0xB649, - 31134 - 11905: 0xB64A, - 31135 - 11905: 0xB64B, - 31136 - 11905: 0xB64C, - 31137 - 11905: 0xB64D, - 31138 - 11905: 0xB64E, - 31139 - 11905: 0xB64F, - 31140 - 11905: 0xB650, - 31141 - 11905: 0xB651, - 31142 - 11905: 0xB652, - 31143 - 11905: 0xECFB, - 31144 - 11905: 0xB653, - 31145 - 11905: 0xB654, - 31146 - 11905: 0xB655, - 31147 - 11905: 0xB656, - 31148 - 11905: 0xB657, - 31149 - 11905: 0xB658, - 31150 - 11905: 0xB659, - 31151 - 11905: 0xB65A, - 31152 - 11905: 0xB65B, - 31153 - 11905: 0xB65C, - 31154 - 11905: 0xB65D, - 31155 - 11905: 0xECFC, - 31156 - 11905: 0xB65E, - 31157 - 11905: 0xB65F, - 31158 - 11905: 0xB660, - 31159 - 11905: 0xB661, - 31160 - 11905: 0xB662, - 31161 - 11905: 0xD3ED, - 31162 - 11905: 0xD8AE, - 31163 - 11905: 0xC0EB, - 31164 - 11905: 0xB663, - 31165 - 11905: 0xC7DD, - 31166 - 11905: 0xBACC, - 31167 - 11905: 0xB664, - 31168 - 11905: 0xD0E3, - 31169 - 11905: 0xCBBD, - 31170 - 11905: 0xB665, - 31171 - 11905: 0xCDBA, - 31172 - 11905: 0xB666, - 31173 - 11905: 0xB667, - 31174 - 11905: 0xB8D1, - 31175 - 11905: 0xB668, - 31176 - 11905: 0xB669, - 31177 - 11905: 0xB1FC, - 31178 - 11905: 0xB66A, - 31179 - 11905: 0xC7EF, - 31180 - 11905: 0xB66B, - 31181 - 11905: 0xD6D6, - 31182 - 11905: 0xB66C, - 31183 - 11905: 0xB66D, - 31184 - 11905: 0xB66E, - 31185 - 11905: 0xBFC6, - 31186 - 11905: 0xC3EB, - 31187 - 11905: 0xB66F, - 31188 - 11905: 0xB670, - 31189 - 11905: 0xEFF5, - 31190 - 11905: 0xB671, - 31191 - 11905: 0xB672, - 31192 - 11905: 0xC3D8, - 31193 - 11905: 0xB673, - 31194 - 11905: 0xB674, - 31195 - 11905: 0xB675, - 31196 - 11905: 0xB676, - 31197 - 11905: 0xB677, - 31198 - 11905: 0xB678, - 31199 - 11905: 0xD7E2, - 31200 - 11905: 0xB679, - 31201 - 11905: 0xB67A, - 31202 - 11905: 0xB67B, - 31203 - 11905: 0xEFF7, - 31204 - 11905: 0xB3D3, - 31205 - 11905: 0xB67C, - 31206 - 11905: 0xC7D8, - 31207 - 11905: 0xD1ED, - 31208 - 11905: 0xB67D, - 31209 - 11905: 0xD6C8, - 31210 - 11905: 0xB67E, - 31211 - 11905: 0xEFF8, - 31212 - 11905: 0xB680, - 31213 - 11905: 0xEFF6, - 31214 - 11905: 0xB681, - 31215 - 11905: 0xBBFD, - 31216 - 11905: 0xB3C6, - 31217 - 11905: 0xB682, - 31218 - 11905: 0xB683, - 31219 - 11905: 0xB684, - 31220 - 11905: 0xB685, - 31221 - 11905: 0xB686, - 31222 - 11905: 0xB687, - 31223 - 11905: 0xB688, - 31224 - 11905: 0xBDD5, - 31225 - 11905: 0xB689, - 31226 - 11905: 0xB68A, - 31227 - 11905: 0xD2C6, - 31228 - 11905: 0xB68B, - 31229 - 11905: 0xBBE0, - 31230 - 11905: 0xB68C, - 31231 - 11905: 0xB68D, - 31232 - 11905: 0xCFA1, - 31233 - 11905: 0xB68E, - 31234 - 11905: 0xEFFC, - 31235 - 11905: 0xEFFB, - 31236 - 11905: 0xB68F, - 31237 - 11905: 0xB690, - 31238 - 11905: 0xEFF9, - 31239 - 11905: 0xB691, - 31240 - 11905: 0xB692, - 31241 - 11905: 0xB693, - 31242 - 11905: 0xB694, - 31243 - 11905: 0xB3CC, - 31244 - 11905: 0xB695, - 31245 - 11905: 0xC9D4, - 31246 - 11905: 0xCBB0, - 31247 - 11905: 0xB696, - 31248 - 11905: 0xB697, - 31249 - 11905: 0xB698, - 31250 - 11905: 0xB699, - 31251 - 11905: 0xB69A, - 31252 - 11905: 0xEFFE, - 31253 - 11905: 0xB69B, - 31254 - 11905: 0xB69C, - 31255 - 11905: 0xB0DE, - 31256 - 11905: 0xB69D, - 31257 - 11905: 0xB69E, - 31258 - 11905: 0xD6C9, - 31259 - 11905: 0xB69F, - 31260 - 11905: 0xB6A0, - 31261 - 11905: 0xB740, - 31262 - 11905: 0xEFFD, - 31263 - 11905: 0xB741, - 31264 - 11905: 0xB3ED, - 31265 - 11905: 0xB742, - 31266 - 11905: 0xB743, - 31267 - 11905: 0xF6D5, - 31268 - 11905: 0xB744, - 31269 - 11905: 0xB745, - 31270 - 11905: 0xB746, - 31271 - 11905: 0xB747, - 31272 - 11905: 0xB748, - 31273 - 11905: 0xB749, - 31274 - 11905: 0xB74A, - 31275 - 11905: 0xB74B, - 31276 - 11905: 0xB74C, - 31277 - 11905: 0xB74D, - 31278 - 11905: 0xB74E, - 31279 - 11905: 0xB74F, - 31280 - 11905: 0xB750, - 31281 - 11905: 0xB751, - 31282 - 11905: 0xB752, - 31283 - 11905: 0xCEC8, - 31284 - 11905: 0xB753, - 31285 - 11905: 0xB754, - 31286 - 11905: 0xB755, - 31287 - 11905: 0xF0A2, - 31288 - 11905: 0xB756, - 31289 - 11905: 0xF0A1, - 31290 - 11905: 0xB757, - 31291 - 11905: 0xB5BE, - 31292 - 11905: 0xBCDA, - 31293 - 11905: 0xBBFC, - 31294 - 11905: 0xB758, - 31295 - 11905: 0xB8E5, - 31296 - 11905: 0xB759, - 31297 - 11905: 0xB75A, - 31298 - 11905: 0xB75B, - 31299 - 11905: 0xB75C, - 31300 - 11905: 0xB75D, - 31301 - 11905: 0xB75E, - 31302 - 11905: 0xC4C2, - 31303 - 11905: 0xB75F, - 31304 - 11905: 0xB760, - 31305 - 11905: 0xB761, - 31306 - 11905: 0xB762, - 31307 - 11905: 0xB763, - 31308 - 11905: 0xB764, - 31309 - 11905: 0xB765, - 31310 - 11905: 0xB766, - 31311 - 11905: 0xB767, - 31312 - 11905: 0xB768, - 31313 - 11905: 0xF0A3, - 31314 - 11905: 0xB769, - 31315 - 11905: 0xB76A, - 31316 - 11905: 0xB76B, - 31317 - 11905: 0xB76C, - 31318 - 11905: 0xB76D, - 31319 - 11905: 0xCBEB, - 31320 - 11905: 0xB76E, - 31321 - 11905: 0xB76F, - 31322 - 11905: 0xB770, - 31323 - 11905: 0xB771, - 31324 - 11905: 0xB772, - 31325 - 11905: 0xB773, - 31326 - 11905: 0xB774, - 31327 - 11905: 0xB775, - 31328 - 11905: 0xB776, - 31329 - 11905: 0xB777, - 31330 - 11905: 0xB778, - 31331 - 11905: 0xB779, - 31332 - 11905: 0xB77A, - 31333 - 11905: 0xB77B, - 31334 - 11905: 0xB77C, - 31335 - 11905: 0xB77D, - 31336 - 11905: 0xB77E, - 31337 - 11905: 0xB780, - 31338 - 11905: 0xB781, - 31339 - 11905: 0xB782, - 31340 - 11905: 0xB783, - 31341 - 11905: 0xB784, - 31342 - 11905: 0xB785, - 31343 - 11905: 0xB786, - 31344 - 11905: 0xF0A6, - 31345 - 11905: 0xB787, - 31346 - 11905: 0xB788, - 31347 - 11905: 0xB789, - 31348 - 11905: 0xD1A8, - 31349 - 11905: 0xB78A, - 31350 - 11905: 0xBEBF, - 31351 - 11905: 0xC7EE, - 31352 - 11905: 0xF1B6, - 31353 - 11905: 0xF1B7, - 31354 - 11905: 0xBFD5, - 31355 - 11905: 0xB78B, - 31356 - 11905: 0xB78C, - 31357 - 11905: 0xB78D, - 31358 - 11905: 0xB78E, - 31359 - 11905: 0xB4A9, - 31360 - 11905: 0xF1B8, - 31361 - 11905: 0xCDBB, - 31362 - 11905: 0xB78F, - 31363 - 11905: 0xC7D4, - 31364 - 11905: 0xD5AD, - 31365 - 11905: 0xB790, - 31366 - 11905: 0xF1B9, - 31367 - 11905: 0xB791, - 31368 - 11905: 0xF1BA, - 31369 - 11905: 0xB792, - 31370 - 11905: 0xB793, - 31371 - 11905: 0xB794, - 31372 - 11905: 0xB795, - 31373 - 11905: 0xC7CF, - 31374 - 11905: 0xB796, - 31375 - 11905: 0xB797, - 31376 - 11905: 0xB798, - 31377 - 11905: 0xD2A4, - 31378 - 11905: 0xD6CF, - 31379 - 11905: 0xB799, - 31380 - 11905: 0xB79A, - 31381 - 11905: 0xF1BB, - 31382 - 11905: 0xBDD1, - 31383 - 11905: 0xB4B0, - 31384 - 11905: 0xBEBD, - 31385 - 11905: 0xB79B, - 31386 - 11905: 0xB79C, - 31387 - 11905: 0xB79D, - 31388 - 11905: 0xB4DC, - 31389 - 11905: 0xCED1, - 31390 - 11905: 0xB79E, - 31391 - 11905: 0xBFDF, - 31392 - 11905: 0xF1BD, - 31393 - 11905: 0xB79F, - 31394 - 11905: 0xB7A0, - 31395 - 11905: 0xB840, - 31396 - 11905: 0xB841, - 31397 - 11905: 0xBFFA, - 31398 - 11905: 0xF1BC, - 31399 - 11905: 0xB842, - 31400 - 11905: 0xF1BF, - 31401 - 11905: 0xB843, - 31402 - 11905: 0xB844, - 31403 - 11905: 0xB845, - 31404 - 11905: 0xF1BE, - 31405 - 11905: 0xF1C0, - 31406 - 11905: 0xB846, - 31407 - 11905: 0xB847, - 31408 - 11905: 0xB848, - 31409 - 11905: 0xB849, - 31410 - 11905: 0xB84A, - 31411 - 11905: 0xF1C1, - 31412 - 11905: 0xB84B, - 31413 - 11905: 0xB84C, - 31414 - 11905: 0xB84D, - 31415 - 11905: 0xB84E, - 31416 - 11905: 0xB84F, - 31417 - 11905: 0xB850, - 31418 - 11905: 0xB851, - 31419 - 11905: 0xB852, - 31420 - 11905: 0xB853, - 31421 - 11905: 0xB854, - 31422 - 11905: 0xB855, - 31423 - 11905: 0xC1FE, - 31424 - 11905: 0xB856, - 31425 - 11905: 0xB857, - 31426 - 11905: 0xB858, - 31427 - 11905: 0xB859, - 31428 - 11905: 0xB85A, - 31429 - 11905: 0xB85B, - 31430 - 11905: 0xB85C, - 31431 - 11905: 0xB85D, - 31432 - 11905: 0xB85E, - 31433 - 11905: 0xB85F, - 31434 - 11905: 0xB860, - 31435 - 11905: 0xC1A2, - 31436 - 11905: 0xB861, - 31437 - 11905: 0xB862, - 31438 - 11905: 0xB863, - 31439 - 11905: 0xB864, - 31440 - 11905: 0xB865, - 31441 - 11905: 0xB866, - 31442 - 11905: 0xB867, - 31443 - 11905: 0xB868, - 31444 - 11905: 0xB869, - 31445 - 11905: 0xB86A, - 31446 - 11905: 0xCAFA, - 31447 - 11905: 0xB86B, - 31448 - 11905: 0xB86C, - 31449 - 11905: 0xD5BE, - 31450 - 11905: 0xB86D, - 31451 - 11905: 0xB86E, - 31452 - 11905: 0xB86F, - 31453 - 11905: 0xB870, - 31454 - 11905: 0xBEBA, - 31455 - 11905: 0xBEB9, - 31456 - 11905: 0xD5C2, - 31457 - 11905: 0xB871, - 31458 - 11905: 0xB872, - 31459 - 11905: 0xBFA2, - 31460 - 11905: 0xB873, - 31461 - 11905: 0xCDAF, - 31462 - 11905: 0xF1B5, - 31463 - 11905: 0xB874, - 31464 - 11905: 0xB875, - 31465 - 11905: 0xB876, - 31466 - 11905: 0xB877, - 31467 - 11905: 0xB878, - 31468 - 11905: 0xB879, - 31469 - 11905: 0xBDDF, - 31470 - 11905: 0xB87A, - 31471 - 11905: 0xB6CB, - 31472 - 11905: 0xB87B, - 31473 - 11905: 0xB87C, - 31474 - 11905: 0xB87D, - 31475 - 11905: 0xB87E, - 31476 - 11905: 0xB880, - 31477 - 11905: 0xB881, - 31478 - 11905: 0xB882, - 31479 - 11905: 0xB883, - 31480 - 11905: 0xB884, - 31481 - 11905: 0xD6F1, - 31482 - 11905: 0xF3C3, - 31483 - 11905: 0xB885, - 31484 - 11905: 0xB886, - 31485 - 11905: 0xF3C4, - 31486 - 11905: 0xB887, - 31487 - 11905: 0xB8CD, - 31488 - 11905: 0xB888, - 31489 - 11905: 0xB889, - 31490 - 11905: 0xB88A, - 31491 - 11905: 0xF3C6, - 31492 - 11905: 0xF3C7, - 31493 - 11905: 0xB88B, - 31494 - 11905: 0xB0CA, - 31495 - 11905: 0xB88C, - 31496 - 11905: 0xF3C5, - 31497 - 11905: 0xB88D, - 31498 - 11905: 0xF3C9, - 31499 - 11905: 0xCBF1, - 31500 - 11905: 0xB88E, - 31501 - 11905: 0xB88F, - 31502 - 11905: 0xB890, - 31503 - 11905: 0xF3CB, - 31504 - 11905: 0xB891, - 31505 - 11905: 0xD0A6, - 31506 - 11905: 0xB892, - 31507 - 11905: 0xB893, - 31508 - 11905: 0xB1CA, - 31509 - 11905: 0xF3C8, - 31510 - 11905: 0xB894, - 31511 - 11905: 0xB895, - 31512 - 11905: 0xB896, - 31513 - 11905: 0xF3CF, - 31514 - 11905: 0xB897, - 31515 - 11905: 0xB5D1, - 31516 - 11905: 0xB898, - 31517 - 11905: 0xB899, - 31518 - 11905: 0xF3D7, - 31519 - 11905: 0xB89A, - 31520 - 11905: 0xF3D2, - 31521 - 11905: 0xB89B, - 31522 - 11905: 0xB89C, - 31523 - 11905: 0xB89D, - 31524 - 11905: 0xF3D4, - 31525 - 11905: 0xF3D3, - 31526 - 11905: 0xB7FB, - 31527 - 11905: 0xB89E, - 31528 - 11905: 0xB1BF, - 31529 - 11905: 0xB89F, - 31530 - 11905: 0xF3CE, - 31531 - 11905: 0xF3CA, - 31532 - 11905: 0xB5DA, - 31533 - 11905: 0xB8A0, - 31534 - 11905: 0xF3D0, - 31535 - 11905: 0xB940, - 31536 - 11905: 0xB941, - 31537 - 11905: 0xF3D1, - 31538 - 11905: 0xB942, - 31539 - 11905: 0xF3D5, - 31540 - 11905: 0xB943, - 31541 - 11905: 0xB944, - 31542 - 11905: 0xB945, - 31543 - 11905: 0xB946, - 31544 - 11905: 0xF3CD, - 31545 - 11905: 0xB947, - 31546 - 11905: 0xBCE3, - 31547 - 11905: 0xB948, - 31548 - 11905: 0xC1FD, - 31549 - 11905: 0xB949, - 31550 - 11905: 0xF3D6, - 31551 - 11905: 0xB94A, - 31552 - 11905: 0xB94B, - 31553 - 11905: 0xB94C, - 31554 - 11905: 0xB94D, - 31555 - 11905: 0xB94E, - 31556 - 11905: 0xB94F, - 31557 - 11905: 0xF3DA, - 31558 - 11905: 0xB950, - 31559 - 11905: 0xF3CC, - 31560 - 11905: 0xB951, - 31561 - 11905: 0xB5C8, - 31562 - 11905: 0xB952, - 31563 - 11905: 0xBDEE, - 31564 - 11905: 0xF3DC, - 31565 - 11905: 0xB953, - 31566 - 11905: 0xB954, - 31567 - 11905: 0xB7A4, - 31568 - 11905: 0xBFF0, - 31569 - 11905: 0xD6FE, - 31570 - 11905: 0xCDB2, - 31571 - 11905: 0xB955, - 31572 - 11905: 0xB4F0, - 31573 - 11905: 0xB956, - 31574 - 11905: 0xB2DF, - 31575 - 11905: 0xB957, - 31576 - 11905: 0xF3D8, - 31577 - 11905: 0xB958, - 31578 - 11905: 0xF3D9, - 31579 - 11905: 0xC9B8, - 31580 - 11905: 0xB959, - 31581 - 11905: 0xF3DD, - 31582 - 11905: 0xB95A, - 31583 - 11905: 0xB95B, - 31584 - 11905: 0xF3DE, - 31585 - 11905: 0xB95C, - 31586 - 11905: 0xF3E1, - 31587 - 11905: 0xB95D, - 31588 - 11905: 0xB95E, - 31589 - 11905: 0xB95F, - 31590 - 11905: 0xB960, - 31591 - 11905: 0xB961, - 31592 - 11905: 0xB962, - 31593 - 11905: 0xB963, - 31594 - 11905: 0xB964, - 31595 - 11905: 0xB965, - 31596 - 11905: 0xB966, - 31597 - 11905: 0xB967, - 31598 - 11905: 0xF3DF, - 31599 - 11905: 0xB968, - 31600 - 11905: 0xB969, - 31601 - 11905: 0xF3E3, - 31602 - 11905: 0xF3E2, - 31603 - 11905: 0xB96A, - 31604 - 11905: 0xB96B, - 31605 - 11905: 0xF3DB, - 31606 - 11905: 0xB96C, - 31607 - 11905: 0xBFEA, - 31608 - 11905: 0xB96D, - 31609 - 11905: 0xB3EF, - 31610 - 11905: 0xB96E, - 31611 - 11905: 0xF3E0, - 31612 - 11905: 0xB96F, - 31613 - 11905: 0xB970, - 31614 - 11905: 0xC7A9, - 31615 - 11905: 0xB971, - 31616 - 11905: 0xBCF2, - 31617 - 11905: 0xB972, - 31618 - 11905: 0xB973, - 31619 - 11905: 0xB974, - 31620 - 11905: 0xB975, - 31621 - 11905: 0xF3EB, - 31622 - 11905: 0xB976, - 31623 - 11905: 0xB977, - 31624 - 11905: 0xB978, - 31625 - 11905: 0xB979, - 31626 - 11905: 0xB97A, - 31627 - 11905: 0xB97B, - 31628 - 11905: 0xB97C, - 31629 - 11905: 0xB9BF, - 31630 - 11905: 0xB97D, - 31631 - 11905: 0xB97E, - 31632 - 11905: 0xF3E4, - 31633 - 11905: 0xB980, - 31634 - 11905: 0xB981, - 31635 - 11905: 0xB982, - 31636 - 11905: 0xB2AD, - 31637 - 11905: 0xBBFE, - 31638 - 11905: 0xB983, - 31639 - 11905: 0xCBE3, - 31640 - 11905: 0xB984, - 31641 - 11905: 0xB985, - 31642 - 11905: 0xB986, - 31643 - 11905: 0xB987, - 31644 - 11905: 0xF3ED, - 31645 - 11905: 0xF3E9, - 31646 - 11905: 0xB988, - 31647 - 11905: 0xB989, - 31648 - 11905: 0xB98A, - 31649 - 11905: 0xB9DC, - 31650 - 11905: 0xF3EE, - 31651 - 11905: 0xB98B, - 31652 - 11905: 0xB98C, - 31653 - 11905: 0xB98D, - 31654 - 11905: 0xF3E5, - 31655 - 11905: 0xF3E6, - 31656 - 11905: 0xF3EA, - 31657 - 11905: 0xC2E1, - 31658 - 11905: 0xF3EC, - 31659 - 11905: 0xF3EF, - 31660 - 11905: 0xF3E8, - 31661 - 11905: 0xBCFD, - 31662 - 11905: 0xB98E, - 31663 - 11905: 0xB98F, - 31664 - 11905: 0xB990, - 31665 - 11905: 0xCFE4, - 31666 - 11905: 0xB991, - 31667 - 11905: 0xB992, - 31668 - 11905: 0xF3F0, - 31669 - 11905: 0xB993, - 31670 - 11905: 0xB994, - 31671 - 11905: 0xB995, - 31672 - 11905: 0xF3E7, - 31673 - 11905: 0xB996, - 31674 - 11905: 0xB997, - 31675 - 11905: 0xB998, - 31676 - 11905: 0xB999, - 31677 - 11905: 0xB99A, - 31678 - 11905: 0xB99B, - 31679 - 11905: 0xB99C, - 31680 - 11905: 0xB99D, - 31681 - 11905: 0xF3F2, - 31682 - 11905: 0xB99E, - 31683 - 11905: 0xB99F, - 31684 - 11905: 0xB9A0, - 31685 - 11905: 0xBA40, - 31686 - 11905: 0xD7AD, - 31687 - 11905: 0xC6AA, - 31688 - 11905: 0xBA41, - 31689 - 11905: 0xBA42, - 31690 - 11905: 0xBA43, - 31691 - 11905: 0xBA44, - 31692 - 11905: 0xF3F3, - 31693 - 11905: 0xBA45, - 31694 - 11905: 0xBA46, - 31695 - 11905: 0xBA47, - 31696 - 11905: 0xBA48, - 31697 - 11905: 0xF3F1, - 31698 - 11905: 0xBA49, - 31699 - 11905: 0xC2A8, - 31700 - 11905: 0xBA4A, - 31701 - 11905: 0xBA4B, - 31702 - 11905: 0xBA4C, - 31703 - 11905: 0xBA4D, - 31704 - 11905: 0xBA4E, - 31705 - 11905: 0xB8DD, - 31706 - 11905: 0xF3F5, - 31707 - 11905: 0xBA4F, - 31708 - 11905: 0xBA50, - 31709 - 11905: 0xF3F4, - 31710 - 11905: 0xBA51, - 31711 - 11905: 0xBA52, - 31712 - 11905: 0xBA53, - 31713 - 11905: 0xB4DB, - 31714 - 11905: 0xBA54, - 31715 - 11905: 0xBA55, - 31716 - 11905: 0xBA56, - 31717 - 11905: 0xF3F6, - 31718 - 11905: 0xF3F7, - 31719 - 11905: 0xBA57, - 31720 - 11905: 0xBA58, - 31721 - 11905: 0xBA59, - 31722 - 11905: 0xF3F8, - 31723 - 11905: 0xBA5A, - 31724 - 11905: 0xBA5B, - 31725 - 11905: 0xBA5C, - 31726 - 11905: 0xC0BA, - 31727 - 11905: 0xBA5D, - 31728 - 11905: 0xBA5E, - 31729 - 11905: 0xC0E9, - 31730 - 11905: 0xBA5F, - 31731 - 11905: 0xBA60, - 31732 - 11905: 0xBA61, - 31733 - 11905: 0xBA62, - 31734 - 11905: 0xBA63, - 31735 - 11905: 0xC5F1, - 31736 - 11905: 0xBA64, - 31737 - 11905: 0xBA65, - 31738 - 11905: 0xBA66, - 31739 - 11905: 0xBA67, - 31740 - 11905: 0xF3FB, - 31741 - 11905: 0xBA68, - 31742 - 11905: 0xF3FA, - 31743 - 11905: 0xBA69, - 31744 - 11905: 0xBA6A, - 31745 - 11905: 0xBA6B, - 31746 - 11905: 0xBA6C, - 31747 - 11905: 0xBA6D, - 31748 - 11905: 0xBA6E, - 31749 - 11905: 0xBA6F, - 31750 - 11905: 0xBA70, - 31751 - 11905: 0xB4D8, - 31752 - 11905: 0xBA71, - 31753 - 11905: 0xBA72, - 31754 - 11905: 0xBA73, - 31755 - 11905: 0xF3FE, - 31756 - 11905: 0xF3F9, - 31757 - 11905: 0xBA74, - 31758 - 11905: 0xBA75, - 31759 - 11905: 0xF3FC, - 31760 - 11905: 0xBA76, - 31761 - 11905: 0xBA77, - 31762 - 11905: 0xBA78, - 31763 - 11905: 0xBA79, - 31764 - 11905: 0xBA7A, - 31765 - 11905: 0xBA7B, - 31766 - 11905: 0xF3FD, - 31767 - 11905: 0xBA7C, - 31768 - 11905: 0xBA7D, - 31769 - 11905: 0xBA7E, - 31770 - 11905: 0xBA80, - 31771 - 11905: 0xBA81, - 31772 - 11905: 0xBA82, - 31773 - 11905: 0xBA83, - 31774 - 11905: 0xBA84, - 31775 - 11905: 0xF4A1, - 31776 - 11905: 0xBA85, - 31777 - 11905: 0xBA86, - 31778 - 11905: 0xBA87, - 31779 - 11905: 0xBA88, - 31780 - 11905: 0xBA89, - 31781 - 11905: 0xBA8A, - 31782 - 11905: 0xF4A3, - 31783 - 11905: 0xBBC9, - 31784 - 11905: 0xBA8B, - 31785 - 11905: 0xBA8C, - 31786 - 11905: 0xF4A2, - 31787 - 11905: 0xBA8D, - 31788 - 11905: 0xBA8E, - 31789 - 11905: 0xBA8F, - 31790 - 11905: 0xBA90, - 31791 - 11905: 0xBA91, - 31792 - 11905: 0xBA92, - 31793 - 11905: 0xBA93, - 31794 - 11905: 0xBA94, - 31795 - 11905: 0xBA95, - 31796 - 11905: 0xBA96, - 31797 - 11905: 0xBA97, - 31798 - 11905: 0xBA98, - 31799 - 11905: 0xBA99, - 31800 - 11905: 0xF4A4, - 31801 - 11905: 0xBA9A, - 31802 - 11905: 0xBA9B, - 31803 - 11905: 0xBA9C, - 31804 - 11905: 0xBA9D, - 31805 - 11905: 0xBA9E, - 31806 - 11905: 0xBA9F, - 31807 - 11905: 0xB2BE, - 31808 - 11905: 0xF4A6, - 31809 - 11905: 0xF4A5, - 31810 - 11905: 0xBAA0, - 31811 - 11905: 0xBB40, - 31812 - 11905: 0xBB41, - 31813 - 11905: 0xBB42, - 31814 - 11905: 0xBB43, - 31815 - 11905: 0xBB44, - 31816 - 11905: 0xBB45, - 31817 - 11905: 0xBB46, - 31818 - 11905: 0xBB47, - 31819 - 11905: 0xBB48, - 31820 - 11905: 0xBB49, - 31821 - 11905: 0xBCAE, - 31822 - 11905: 0xBB4A, - 31823 - 11905: 0xBB4B, - 31824 - 11905: 0xBB4C, - 31825 - 11905: 0xBB4D, - 31826 - 11905: 0xBB4E, - 31827 - 11905: 0xBB4F, - 31828 - 11905: 0xBB50, - 31829 - 11905: 0xBB51, - 31830 - 11905: 0xBB52, - 31831 - 11905: 0xBB53, - 31832 - 11905: 0xBB54, - 31833 - 11905: 0xBB55, - 31834 - 11905: 0xBB56, - 31835 - 11905: 0xBB57, - 31836 - 11905: 0xBB58, - 31837 - 11905: 0xBB59, - 31838 - 11905: 0xBB5A, - 31839 - 11905: 0xBB5B, - 31840 - 11905: 0xBB5C, - 31841 - 11905: 0xBB5D, - 31842 - 11905: 0xBB5E, - 31843 - 11905: 0xBB5F, - 31844 - 11905: 0xBB60, - 31845 - 11905: 0xBB61, - 31846 - 11905: 0xBB62, - 31847 - 11905: 0xBB63, - 31848 - 11905: 0xBB64, - 31849 - 11905: 0xBB65, - 31850 - 11905: 0xBB66, - 31851 - 11905: 0xBB67, - 31852 - 11905: 0xBB68, - 31853 - 11905: 0xBB69, - 31854 - 11905: 0xBB6A, - 31855 - 11905: 0xBB6B, - 31856 - 11905: 0xBB6C, - 31857 - 11905: 0xBB6D, - 31858 - 11905: 0xBB6E, - 31859 - 11905: 0xC3D7, - 31860 - 11905: 0xD9E1, - 31861 - 11905: 0xBB6F, - 31862 - 11905: 0xBB70, - 31863 - 11905: 0xBB71, - 31864 - 11905: 0xBB72, - 31865 - 11905: 0xBB73, - 31866 - 11905: 0xBB74, - 31867 - 11905: 0xC0E0, - 31868 - 11905: 0xF4CC, - 31869 - 11905: 0xD7D1, - 31870 - 11905: 0xBB75, - 31871 - 11905: 0xBB76, - 31872 - 11905: 0xBB77, - 31873 - 11905: 0xBB78, - 31874 - 11905: 0xBB79, - 31875 - 11905: 0xBB7A, - 31876 - 11905: 0xBB7B, - 31877 - 11905: 0xBB7C, - 31878 - 11905: 0xBB7D, - 31879 - 11905: 0xBB7E, - 31880 - 11905: 0xBB80, - 31881 - 11905: 0xB7DB, - 31882 - 11905: 0xBB81, - 31883 - 11905: 0xBB82, - 31884 - 11905: 0xBB83, - 31885 - 11905: 0xBB84, - 31886 - 11905: 0xBB85, - 31887 - 11905: 0xBB86, - 31888 - 11905: 0xBB87, - 31889 - 11905: 0xF4CE, - 31890 - 11905: 0xC1A3, - 31891 - 11905: 0xBB88, - 31892 - 11905: 0xBB89, - 31893 - 11905: 0xC6C9, - 31894 - 11905: 0xBB8A, - 31895 - 11905: 0xB4D6, - 31896 - 11905: 0xD5B3, - 31897 - 11905: 0xBB8B, - 31898 - 11905: 0xBB8C, - 31899 - 11905: 0xBB8D, - 31900 - 11905: 0xF4D0, - 31901 - 11905: 0xF4CF, - 31902 - 11905: 0xF4D1, - 31903 - 11905: 0xCBDA, - 31904 - 11905: 0xBB8E, - 31905 - 11905: 0xBB8F, - 31906 - 11905: 0xF4D2, - 31907 - 11905: 0xBB90, - 31908 - 11905: 0xD4C1, - 31909 - 11905: 0xD6E0, - 31910 - 11905: 0xBB91, - 31911 - 11905: 0xBB92, - 31912 - 11905: 0xBB93, - 31913 - 11905: 0xBB94, - 31914 - 11905: 0xB7E0, - 31915 - 11905: 0xBB95, - 31916 - 11905: 0xBB96, - 31917 - 11905: 0xBB97, - 31918 - 11905: 0xC1B8, - 31919 - 11905: 0xBB98, - 31920 - 11905: 0xBB99, - 31921 - 11905: 0xC1BB, - 31922 - 11905: 0xF4D3, - 31923 - 11905: 0xBEAC, - 31924 - 11905: 0xBB9A, - 31925 - 11905: 0xBB9B, - 31926 - 11905: 0xBB9C, - 31927 - 11905: 0xBB9D, - 31928 - 11905: 0xBB9E, - 31929 - 11905: 0xB4E2, - 31930 - 11905: 0xBB9F, - 31931 - 11905: 0xBBA0, - 31932 - 11905: 0xF4D4, - 31933 - 11905: 0xF4D5, - 31934 - 11905: 0xBEAB, - 31935 - 11905: 0xBC40, - 31936 - 11905: 0xBC41, - 31937 - 11905: 0xF4D6, - 31938 - 11905: 0xBC42, - 31939 - 11905: 0xBC43, - 31940 - 11905: 0xBC44, - 31941 - 11905: 0xF4DB, - 31942 - 11905: 0xBC45, - 31943 - 11905: 0xF4D7, - 31944 - 11905: 0xF4DA, - 31945 - 11905: 0xBC46, - 31946 - 11905: 0xBAFD, - 31947 - 11905: 0xBC47, - 31948 - 11905: 0xF4D8, - 31949 - 11905: 0xF4D9, - 31950 - 11905: 0xBC48, - 31951 - 11905: 0xBC49, - 31952 - 11905: 0xBC4A, - 31953 - 11905: 0xBC4B, - 31954 - 11905: 0xBC4C, - 31955 - 11905: 0xBC4D, - 31956 - 11905: 0xBC4E, - 31957 - 11905: 0xB8E2, - 31958 - 11905: 0xCCC7, - 31959 - 11905: 0xF4DC, - 31960 - 11905: 0xBC4F, - 31961 - 11905: 0xB2DA, - 31962 - 11905: 0xBC50, - 31963 - 11905: 0xBC51, - 31964 - 11905: 0xC3D3, - 31965 - 11905: 0xBC52, - 31966 - 11905: 0xBC53, - 31967 - 11905: 0xD4E3, - 31968 - 11905: 0xBFB7, - 31969 - 11905: 0xBC54, - 31970 - 11905: 0xBC55, - 31971 - 11905: 0xBC56, - 31972 - 11905: 0xBC57, - 31973 - 11905: 0xBC58, - 31974 - 11905: 0xBC59, - 31975 - 11905: 0xBC5A, - 31976 - 11905: 0xF4DD, - 31977 - 11905: 0xBC5B, - 31978 - 11905: 0xBC5C, - 31979 - 11905: 0xBC5D, - 31980 - 11905: 0xBC5E, - 31981 - 11905: 0xBC5F, - 31982 - 11905: 0xBC60, - 31983 - 11905: 0xC5B4, - 31984 - 11905: 0xBC61, - 31985 - 11905: 0xBC62, - 31986 - 11905: 0xBC63, - 31987 - 11905: 0xBC64, - 31988 - 11905: 0xBC65, - 31989 - 11905: 0xBC66, - 31990 - 11905: 0xBC67, - 31991 - 11905: 0xBC68, - 31992 - 11905: 0xF4E9, - 31993 - 11905: 0xBC69, - 31994 - 11905: 0xBC6A, - 31995 - 11905: 0xCFB5, - 31996 - 11905: 0xBC6B, - 31997 - 11905: 0xBC6C, - 31998 - 11905: 0xBC6D, - 31999 - 11905: 0xBC6E, - 32000 - 11905: 0xBC6F, - 32001 - 11905: 0xBC70, - 32002 - 11905: 0xBC71, - 32003 - 11905: 0xBC72, - 32004 - 11905: 0xBC73, - 32005 - 11905: 0xBC74, - 32006 - 11905: 0xBC75, - 32007 - 11905: 0xBC76, - 32008 - 11905: 0xBC77, - 32009 - 11905: 0xBC78, - 32010 - 11905: 0xCEC9, - 32011 - 11905: 0xBC79, - 32012 - 11905: 0xBC7A, - 32013 - 11905: 0xBC7B, - 32014 - 11905: 0xBC7C, - 32015 - 11905: 0xBC7D, - 32016 - 11905: 0xBC7E, - 32017 - 11905: 0xBC80, - 32018 - 11905: 0xBC81, - 32019 - 11905: 0xBC82, - 32020 - 11905: 0xBC83, - 32021 - 11905: 0xBC84, - 32022 - 11905: 0xBC85, - 32023 - 11905: 0xBC86, - 32024 - 11905: 0xBC87, - 32025 - 11905: 0xBC88, - 32026 - 11905: 0xBC89, - 32027 - 11905: 0xBC8A, - 32028 - 11905: 0xBC8B, - 32029 - 11905: 0xBC8C, - 32030 - 11905: 0xBC8D, - 32031 - 11905: 0xBC8E, - 32032 - 11905: 0xCBD8, - 32033 - 11905: 0xBC8F, - 32034 - 11905: 0xCBF7, - 32035 - 11905: 0xBC90, - 32036 - 11905: 0xBC91, - 32037 - 11905: 0xBC92, - 32038 - 11905: 0xBC93, - 32039 - 11905: 0xBDF4, - 32040 - 11905: 0xBC94, - 32041 - 11905: 0xBC95, - 32042 - 11905: 0xBC96, - 32043 - 11905: 0xD7CF, - 32044 - 11905: 0xBC97, - 32045 - 11905: 0xBC98, - 32046 - 11905: 0xBC99, - 32047 - 11905: 0xC0DB, - 32048 - 11905: 0xBC9A, - 32049 - 11905: 0xBC9B, - 32050 - 11905: 0xBC9C, - 32051 - 11905: 0xBC9D, - 32052 - 11905: 0xBC9E, - 32053 - 11905: 0xBC9F, - 32054 - 11905: 0xBCA0, - 32055 - 11905: 0xBD40, - 32056 - 11905: 0xBD41, - 32057 - 11905: 0xBD42, - 32058 - 11905: 0xBD43, - 32059 - 11905: 0xBD44, - 32060 - 11905: 0xBD45, - 32061 - 11905: 0xBD46, - 32062 - 11905: 0xBD47, - 32063 - 11905: 0xBD48, - 32064 - 11905: 0xBD49, - 32065 - 11905: 0xBD4A, - 32066 - 11905: 0xBD4B, - 32067 - 11905: 0xBD4C, - 32068 - 11905: 0xBD4D, - 32069 - 11905: 0xBD4E, - 32070 - 11905: 0xBD4F, - 32071 - 11905: 0xBD50, - 32072 - 11905: 0xBD51, - 32073 - 11905: 0xBD52, - 32074 - 11905: 0xBD53, - 32075 - 11905: 0xBD54, - 32076 - 11905: 0xBD55, - 32077 - 11905: 0xBD56, - 32078 - 11905: 0xBD57, - 32079 - 11905: 0xBD58, - 32080 - 11905: 0xBD59, - 32081 - 11905: 0xBD5A, - 32082 - 11905: 0xBD5B, - 32083 - 11905: 0xBD5C, - 32084 - 11905: 0xBD5D, - 32085 - 11905: 0xBD5E, - 32086 - 11905: 0xBD5F, - 32087 - 11905: 0xBD60, - 32088 - 11905: 0xBD61, - 32089 - 11905: 0xBD62, - 32090 - 11905: 0xBD63, - 32091 - 11905: 0xBD64, - 32092 - 11905: 0xBD65, - 32093 - 11905: 0xBD66, - 32094 - 11905: 0xBD67, - 32095 - 11905: 0xBD68, - 32096 - 11905: 0xBD69, - 32097 - 11905: 0xBD6A, - 32098 - 11905: 0xBD6B, - 32099 - 11905: 0xBD6C, - 32100 - 11905: 0xBD6D, - 32101 - 11905: 0xBD6E, - 32102 - 11905: 0xBD6F, - 32103 - 11905: 0xBD70, - 32104 - 11905: 0xBD71, - 32105 - 11905: 0xBD72, - 32106 - 11905: 0xBD73, - 32107 - 11905: 0xBD74, - 32108 - 11905: 0xBD75, - 32109 - 11905: 0xBD76, - 32110 - 11905: 0xD0F5, - 32111 - 11905: 0xBD77, - 32112 - 11905: 0xBD78, - 32113 - 11905: 0xBD79, - 32114 - 11905: 0xBD7A, - 32115 - 11905: 0xBD7B, - 32116 - 11905: 0xBD7C, - 32117 - 11905: 0xBD7D, - 32118 - 11905: 0xBD7E, - 32119 - 11905: 0xF4EA, - 32120 - 11905: 0xBD80, - 32121 - 11905: 0xBD81, - 32122 - 11905: 0xBD82, - 32123 - 11905: 0xBD83, - 32124 - 11905: 0xBD84, - 32125 - 11905: 0xBD85, - 32126 - 11905: 0xBD86, - 32127 - 11905: 0xBD87, - 32128 - 11905: 0xBD88, - 32129 - 11905: 0xBD89, - 32130 - 11905: 0xBD8A, - 32131 - 11905: 0xBD8B, - 32132 - 11905: 0xBD8C, - 32133 - 11905: 0xBD8D, - 32134 - 11905: 0xBD8E, - 32135 - 11905: 0xBD8F, - 32136 - 11905: 0xBD90, - 32137 - 11905: 0xBD91, - 32138 - 11905: 0xBD92, - 32139 - 11905: 0xBD93, - 32140 - 11905: 0xBD94, - 32141 - 11905: 0xBD95, - 32142 - 11905: 0xBD96, - 32143 - 11905: 0xBD97, - 32144 - 11905: 0xBD98, - 32145 - 11905: 0xBD99, - 32146 - 11905: 0xBD9A, - 32147 - 11905: 0xBD9B, - 32148 - 11905: 0xBD9C, - 32149 - 11905: 0xBD9D, - 32150 - 11905: 0xBD9E, - 32151 - 11905: 0xBD9F, - 32152 - 11905: 0xBDA0, - 32153 - 11905: 0xBE40, - 32154 - 11905: 0xBE41, - 32155 - 11905: 0xBE42, - 32156 - 11905: 0xBE43, - 32157 - 11905: 0xBE44, - 32158 - 11905: 0xBE45, - 32159 - 11905: 0xBE46, - 32160 - 11905: 0xBE47, - 32161 - 11905: 0xBE48, - 32162 - 11905: 0xBE49, - 32163 - 11905: 0xBE4A, - 32164 - 11905: 0xBE4B, - 32165 - 11905: 0xBE4C, - 32166 - 11905: 0xF4EB, - 32167 - 11905: 0xBE4D, - 32168 - 11905: 0xBE4E, - 32169 - 11905: 0xBE4F, - 32170 - 11905: 0xBE50, - 32171 - 11905: 0xBE51, - 32172 - 11905: 0xBE52, - 32173 - 11905: 0xBE53, - 32174 - 11905: 0xF4EC, - 32175 - 11905: 0xBE54, - 32176 - 11905: 0xBE55, - 32177 - 11905: 0xBE56, - 32178 - 11905: 0xBE57, - 32179 - 11905: 0xBE58, - 32180 - 11905: 0xBE59, - 32181 - 11905: 0xBE5A, - 32182 - 11905: 0xBE5B, - 32183 - 11905: 0xBE5C, - 32184 - 11905: 0xBE5D, - 32185 - 11905: 0xBE5E, - 32186 - 11905: 0xBE5F, - 32187 - 11905: 0xBE60, - 32188 - 11905: 0xBE61, - 32189 - 11905: 0xBE62, - 32190 - 11905: 0xBE63, - 32191 - 11905: 0xBE64, - 32192 - 11905: 0xBE65, - 32193 - 11905: 0xBE66, - 32194 - 11905: 0xBE67, - 32195 - 11905: 0xBE68, - 32196 - 11905: 0xBE69, - 32197 - 11905: 0xBE6A, - 32198 - 11905: 0xBE6B, - 32199 - 11905: 0xBE6C, - 32200 - 11905: 0xBE6D, - 32201 - 11905: 0xBE6E, - 32202 - 11905: 0xBE6F, - 32203 - 11905: 0xBE70, - 32204 - 11905: 0xBE71, - 32205 - 11905: 0xBE72, - 32206 - 11905: 0xBE73, - 32207 - 11905: 0xBE74, - 32208 - 11905: 0xBE75, - 32209 - 11905: 0xBE76, - 32210 - 11905: 0xBE77, - 32211 - 11905: 0xBE78, - 32212 - 11905: 0xBE79, - 32213 - 11905: 0xBE7A, - 32214 - 11905: 0xBE7B, - 32215 - 11905: 0xBE7C, - 32216 - 11905: 0xBE7D, - 32217 - 11905: 0xBE7E, - 32218 - 11905: 0xBE80, - 32219 - 11905: 0xBE81, - 32220 - 11905: 0xBE82, - 32221 - 11905: 0xBE83, - 32222 - 11905: 0xBE84, - 32223 - 11905: 0xBE85, - 32224 - 11905: 0xBE86, - 32225 - 11905: 0xBE87, - 32226 - 11905: 0xBE88, - 32227 - 11905: 0xBE89, - 32228 - 11905: 0xBE8A, - 32229 - 11905: 0xBE8B, - 32230 - 11905: 0xBE8C, - 32231 - 11905: 0xBE8D, - 32232 - 11905: 0xBE8E, - 32233 - 11905: 0xBE8F, - 32234 - 11905: 0xBE90, - 32235 - 11905: 0xBE91, - 32236 - 11905: 0xBE92, - 32237 - 11905: 0xBE93, - 32238 - 11905: 0xBE94, - 32239 - 11905: 0xBE95, - 32240 - 11905: 0xBE96, - 32241 - 11905: 0xBE97, - 32242 - 11905: 0xBE98, - 32243 - 11905: 0xBE99, - 32244 - 11905: 0xBE9A, - 32245 - 11905: 0xBE9B, - 32246 - 11905: 0xBE9C, - 32247 - 11905: 0xBE9D, - 32248 - 11905: 0xBE9E, - 32249 - 11905: 0xBE9F, - 32250 - 11905: 0xBEA0, - 32251 - 11905: 0xBF40, - 32252 - 11905: 0xBF41, - 32253 - 11905: 0xBF42, - 32254 - 11905: 0xBF43, - 32255 - 11905: 0xBF44, - 32256 - 11905: 0xBF45, - 32257 - 11905: 0xBF46, - 32258 - 11905: 0xBF47, - 32259 - 11905: 0xBF48, - 32260 - 11905: 0xBF49, - 32261 - 11905: 0xBF4A, - 32262 - 11905: 0xBF4B, - 32263 - 11905: 0xBF4C, - 32264 - 11905: 0xBF4D, - 32265 - 11905: 0xBF4E, - 32266 - 11905: 0xBF4F, - 32267 - 11905: 0xBF50, - 32268 - 11905: 0xBF51, - 32269 - 11905: 0xBF52, - 32270 - 11905: 0xBF53, - 32271 - 11905: 0xBF54, - 32272 - 11905: 0xBF55, - 32273 - 11905: 0xBF56, - 32274 - 11905: 0xBF57, - 32275 - 11905: 0xBF58, - 32276 - 11905: 0xBF59, - 32277 - 11905: 0xBF5A, - 32278 - 11905: 0xBF5B, - 32279 - 11905: 0xBF5C, - 32280 - 11905: 0xBF5D, - 32281 - 11905: 0xBF5E, - 32282 - 11905: 0xBF5F, - 32283 - 11905: 0xBF60, - 32284 - 11905: 0xBF61, - 32285 - 11905: 0xBF62, - 32286 - 11905: 0xBF63, - 32287 - 11905: 0xBF64, - 32288 - 11905: 0xBF65, - 32289 - 11905: 0xBF66, - 32290 - 11905: 0xBF67, - 32291 - 11905: 0xBF68, - 32292 - 11905: 0xBF69, - 32293 - 11905: 0xBF6A, - 32294 - 11905: 0xBF6B, - 32295 - 11905: 0xBF6C, - 32296 - 11905: 0xBF6D, - 32297 - 11905: 0xBF6E, - 32298 - 11905: 0xBF6F, - 32299 - 11905: 0xBF70, - 32300 - 11905: 0xBF71, - 32301 - 11905: 0xBF72, - 32302 - 11905: 0xBF73, - 32303 - 11905: 0xBF74, - 32304 - 11905: 0xBF75, - 32305 - 11905: 0xBF76, - 32306 - 11905: 0xBF77, - 32307 - 11905: 0xBF78, - 32308 - 11905: 0xBF79, - 32309 - 11905: 0xBF7A, - 32310 - 11905: 0xBF7B, - 32311 - 11905: 0xBF7C, - 32312 - 11905: 0xBF7D, - 32313 - 11905: 0xBF7E, - 32314 - 11905: 0xBF80, - 32315 - 11905: 0xF7E3, - 32316 - 11905: 0xBF81, - 32317 - 11905: 0xBF82, - 32318 - 11905: 0xBF83, - 32319 - 11905: 0xBF84, - 32320 - 11905: 0xBF85, - 32321 - 11905: 0xB7B1, - 32322 - 11905: 0xBF86, - 32323 - 11905: 0xBF87, - 32324 - 11905: 0xBF88, - 32325 - 11905: 0xBF89, - 32326 - 11905: 0xBF8A, - 32327 - 11905: 0xF4ED, - 32328 - 11905: 0xBF8B, - 32329 - 11905: 0xBF8C, - 32330 - 11905: 0xBF8D, - 32331 - 11905: 0xBF8E, - 32332 - 11905: 0xBF8F, - 32333 - 11905: 0xBF90, - 32334 - 11905: 0xBF91, - 32335 - 11905: 0xBF92, - 32336 - 11905: 0xBF93, - 32337 - 11905: 0xBF94, - 32338 - 11905: 0xBF95, - 32339 - 11905: 0xBF96, - 32340 - 11905: 0xBF97, - 32341 - 11905: 0xBF98, - 32342 - 11905: 0xBF99, - 32343 - 11905: 0xBF9A, - 32344 - 11905: 0xBF9B, - 32345 - 11905: 0xBF9C, - 32346 - 11905: 0xBF9D, - 32347 - 11905: 0xBF9E, - 32348 - 11905: 0xBF9F, - 32349 - 11905: 0xBFA0, - 32350 - 11905: 0xC040, - 32351 - 11905: 0xC041, - 32352 - 11905: 0xC042, - 32353 - 11905: 0xC043, - 32354 - 11905: 0xC044, - 32355 - 11905: 0xC045, - 32356 - 11905: 0xC046, - 32357 - 11905: 0xC047, - 32358 - 11905: 0xC048, - 32359 - 11905: 0xC049, - 32360 - 11905: 0xC04A, - 32361 - 11905: 0xC04B, - 32362 - 11905: 0xC04C, - 32363 - 11905: 0xC04D, - 32364 - 11905: 0xC04E, - 32365 - 11905: 0xC04F, - 32366 - 11905: 0xC050, - 32367 - 11905: 0xC051, - 32368 - 11905: 0xC052, - 32369 - 11905: 0xC053, - 32370 - 11905: 0xC054, - 32371 - 11905: 0xC055, - 32372 - 11905: 0xC056, - 32373 - 11905: 0xC057, - 32374 - 11905: 0xC058, - 32375 - 11905: 0xC059, - 32376 - 11905: 0xC05A, - 32377 - 11905: 0xC05B, - 32378 - 11905: 0xC05C, - 32379 - 11905: 0xC05D, - 32380 - 11905: 0xC05E, - 32381 - 11905: 0xC05F, - 32382 - 11905: 0xC060, - 32383 - 11905: 0xC061, - 32384 - 11905: 0xC062, - 32385 - 11905: 0xC063, - 32386 - 11905: 0xD7EB, - 32387 - 11905: 0xC064, - 32388 - 11905: 0xC065, - 32389 - 11905: 0xC066, - 32390 - 11905: 0xC067, - 32391 - 11905: 0xC068, - 32392 - 11905: 0xC069, - 32393 - 11905: 0xC06A, - 32394 - 11905: 0xC06B, - 32395 - 11905: 0xC06C, - 32396 - 11905: 0xC06D, - 32397 - 11905: 0xC06E, - 32398 - 11905: 0xC06F, - 32399 - 11905: 0xC070, - 32400 - 11905: 0xC071, - 32401 - 11905: 0xC072, - 32402 - 11905: 0xC073, - 32403 - 11905: 0xC074, - 32404 - 11905: 0xC075, - 32405 - 11905: 0xC076, - 32406 - 11905: 0xC077, - 32407 - 11905: 0xC078, - 32408 - 11905: 0xC079, - 32409 - 11905: 0xC07A, - 32410 - 11905: 0xC07B, - 32411 - 11905: 0xF4EE, - 32412 - 11905: 0xC07C, - 32413 - 11905: 0xC07D, - 32414 - 11905: 0xC07E, - 32415 - 11905: 0xE6F9, - 32416 - 11905: 0xBEC0, - 32417 - 11905: 0xE6FA, - 32418 - 11905: 0xBAEC, - 32419 - 11905: 0xE6FB, - 32420 - 11905: 0xCFCB, - 32421 - 11905: 0xE6FC, - 32422 - 11905: 0xD4BC, - 32423 - 11905: 0xBCB6, - 32424 - 11905: 0xE6FD, - 32425 - 11905: 0xE6FE, - 32426 - 11905: 0xBCCD, - 32427 - 11905: 0xC8D2, - 32428 - 11905: 0xCEB3, - 32429 - 11905: 0xE7A1, - 32430 - 11905: 0xC080, - 32431 - 11905: 0xB4BF, - 32432 - 11905: 0xE7A2, - 32433 - 11905: 0xC9B4, - 32434 - 11905: 0xB8D9, - 32435 - 11905: 0xC4C9, - 32436 - 11905: 0xC081, - 32437 - 11905: 0xD7DD, - 32438 - 11905: 0xC2DA, - 32439 - 11905: 0xB7D7, - 32440 - 11905: 0xD6BD, - 32441 - 11905: 0xCEC6, - 32442 - 11905: 0xB7C4, - 32443 - 11905: 0xC082, - 32444 - 11905: 0xC083, - 32445 - 11905: 0xC5A6, - 32446 - 11905: 0xE7A3, - 32447 - 11905: 0xCFDF, - 32448 - 11905: 0xE7A4, - 32449 - 11905: 0xE7A5, - 32450 - 11905: 0xE7A6, - 32451 - 11905: 0xC1B7, - 32452 - 11905: 0xD7E9, - 32453 - 11905: 0xC9F0, - 32454 - 11905: 0xCFB8, - 32455 - 11905: 0xD6AF, - 32456 - 11905: 0xD6D5, - 32457 - 11905: 0xE7A7, - 32458 - 11905: 0xB0ED, - 32459 - 11905: 0xE7A8, - 32460 - 11905: 0xE7A9, - 32461 - 11905: 0xC9DC, - 32462 - 11905: 0xD2EF, - 32463 - 11905: 0xBEAD, - 32464 - 11905: 0xE7AA, - 32465 - 11905: 0xB0F3, - 32466 - 11905: 0xC8DE, - 32467 - 11905: 0xBDE1, - 32468 - 11905: 0xE7AB, - 32469 - 11905: 0xC8C6, - 32470 - 11905: 0xC084, - 32471 - 11905: 0xE7AC, - 32472 - 11905: 0xBBE6, - 32473 - 11905: 0xB8F8, - 32474 - 11905: 0xD1A4, - 32475 - 11905: 0xE7AD, - 32476 - 11905: 0xC2E7, - 32477 - 11905: 0xBEF8, - 32478 - 11905: 0xBDCA, - 32479 - 11905: 0xCDB3, - 32480 - 11905: 0xE7AE, - 32481 - 11905: 0xE7AF, - 32482 - 11905: 0xBEEE, - 32483 - 11905: 0xD0E5, - 32484 - 11905: 0xC085, - 32485 - 11905: 0xCBE7, - 32486 - 11905: 0xCCD0, - 32487 - 11905: 0xBCCC, - 32488 - 11905: 0xE7B0, - 32489 - 11905: 0xBCA8, - 32490 - 11905: 0xD0F7, - 32491 - 11905: 0xE7B1, - 32492 - 11905: 0xC086, - 32493 - 11905: 0xD0F8, - 32494 - 11905: 0xE7B2, - 32495 - 11905: 0xE7B3, - 32496 - 11905: 0xB4C2, - 32497 - 11905: 0xE7B4, - 32498 - 11905: 0xE7B5, - 32499 - 11905: 0xC9FE, - 32500 - 11905: 0xCEAC, - 32501 - 11905: 0xC3E0, - 32502 - 11905: 0xE7B7, - 32503 - 11905: 0xB1C1, - 32504 - 11905: 0xB3F1, - 32505 - 11905: 0xC087, - 32506 - 11905: 0xE7B8, - 32507 - 11905: 0xE7B9, - 32508 - 11905: 0xD7DB, - 32509 - 11905: 0xD5C0, - 32510 - 11905: 0xE7BA, - 32511 - 11905: 0xC2CC, - 32512 - 11905: 0xD7BA, - 32513 - 11905: 0xE7BB, - 32514 - 11905: 0xE7BC, - 32515 - 11905: 0xE7BD, - 32516 - 11905: 0xBCEA, - 32517 - 11905: 0xC3E5, - 32518 - 11905: 0xC0C2, - 32519 - 11905: 0xE7BE, - 32520 - 11905: 0xE7BF, - 32521 - 11905: 0xBCA9, - 32522 - 11905: 0xC088, - 32523 - 11905: 0xE7C0, - 32524 - 11905: 0xE7C1, - 32525 - 11905: 0xE7B6, - 32526 - 11905: 0xB6D0, - 32527 - 11905: 0xE7C2, - 32528 - 11905: 0xC089, - 32529 - 11905: 0xE7C3, - 32530 - 11905: 0xE7C4, - 32531 - 11905: 0xBBBA, - 32532 - 11905: 0xB5DE, - 32533 - 11905: 0xC2C6, - 32534 - 11905: 0xB1E0, - 32535 - 11905: 0xE7C5, - 32536 - 11905: 0xD4B5, - 32537 - 11905: 0xE7C6, - 32538 - 11905: 0xB8BF, - 32539 - 11905: 0xE7C8, - 32540 - 11905: 0xE7C7, - 32541 - 11905: 0xB7EC, - 32542 - 11905: 0xC08A, - 32543 - 11905: 0xE7C9, - 32544 - 11905: 0xB2F8, - 32545 - 11905: 0xE7CA, - 32546 - 11905: 0xE7CB, - 32547 - 11905: 0xE7CC, - 32548 - 11905: 0xE7CD, - 32549 - 11905: 0xE7CE, - 32550 - 11905: 0xE7CF, - 32551 - 11905: 0xE7D0, - 32552 - 11905: 0xD3A7, - 32553 - 11905: 0xCBF5, - 32554 - 11905: 0xE7D1, - 32555 - 11905: 0xE7D2, - 32556 - 11905: 0xE7D3, - 32557 - 11905: 0xE7D4, - 32558 - 11905: 0xC9C9, - 32559 - 11905: 0xE7D5, - 32560 - 11905: 0xE7D6, - 32561 - 11905: 0xE7D7, - 32562 - 11905: 0xE7D8, - 32563 - 11905: 0xE7D9, - 32564 - 11905: 0xBDC9, - 32565 - 11905: 0xE7DA, - 32566 - 11905: 0xF3BE, - 32567 - 11905: 0xC08B, - 32568 - 11905: 0xB8D7, - 32569 - 11905: 0xC08C, - 32570 - 11905: 0xC8B1, - 32571 - 11905: 0xC08D, - 32572 - 11905: 0xC08E, - 32573 - 11905: 0xC08F, - 32574 - 11905: 0xC090, - 32575 - 11905: 0xC091, - 32576 - 11905: 0xC092, - 32577 - 11905: 0xC093, - 32578 - 11905: 0xF3BF, - 32579 - 11905: 0xC094, - 32580 - 11905: 0xF3C0, - 32581 - 11905: 0xF3C1, - 32582 - 11905: 0xC095, - 32583 - 11905: 0xC096, - 32584 - 11905: 0xC097, - 32585 - 11905: 0xC098, - 32586 - 11905: 0xC099, - 32587 - 11905: 0xC09A, - 32588 - 11905: 0xC09B, - 32589 - 11905: 0xC09C, - 32590 - 11905: 0xC09D, - 32591 - 11905: 0xC09E, - 32592 - 11905: 0xB9DE, - 32593 - 11905: 0xCDF8, - 32594 - 11905: 0xC09F, - 32595 - 11905: 0xC0A0, - 32596 - 11905: 0xD8E8, - 32597 - 11905: 0xBAB1, - 32598 - 11905: 0xC140, - 32599 - 11905: 0xC2DE, - 32600 - 11905: 0xEEB7, - 32601 - 11905: 0xC141, - 32602 - 11905: 0xB7A3, - 32603 - 11905: 0xC142, - 32604 - 11905: 0xC143, - 32605 - 11905: 0xC144, - 32606 - 11905: 0xC145, - 32607 - 11905: 0xEEB9, - 32608 - 11905: 0xC146, - 32609 - 11905: 0xEEB8, - 32610 - 11905: 0xB0D5, - 32611 - 11905: 0xC147, - 32612 - 11905: 0xC148, - 32613 - 11905: 0xC149, - 32614 - 11905: 0xC14A, - 32615 - 11905: 0xC14B, - 32616 - 11905: 0xEEBB, - 32617 - 11905: 0xD5D6, - 32618 - 11905: 0xD7EF, - 32619 - 11905: 0xC14C, - 32620 - 11905: 0xC14D, - 32621 - 11905: 0xC14E, - 32622 - 11905: 0xD6C3, - 32623 - 11905: 0xC14F, - 32624 - 11905: 0xC150, - 32625 - 11905: 0xEEBD, - 32626 - 11905: 0xCAF0, - 32627 - 11905: 0xC151, - 32628 - 11905: 0xEEBC, - 32629 - 11905: 0xC152, - 32630 - 11905: 0xC153, - 32631 - 11905: 0xC154, - 32632 - 11905: 0xC155, - 32633 - 11905: 0xEEBE, - 32634 - 11905: 0xC156, - 32635 - 11905: 0xC157, - 32636 - 11905: 0xC158, - 32637 - 11905: 0xC159, - 32638 - 11905: 0xEEC0, - 32639 - 11905: 0xC15A, - 32640 - 11905: 0xC15B, - 32641 - 11905: 0xEEBF, - 32642 - 11905: 0xC15C, - 32643 - 11905: 0xC15D, - 32644 - 11905: 0xC15E, - 32645 - 11905: 0xC15F, - 32646 - 11905: 0xC160, - 32647 - 11905: 0xC161, - 32648 - 11905: 0xC162, - 32649 - 11905: 0xC163, - 32650 - 11905: 0xD1F2, - 32651 - 11905: 0xC164, - 32652 - 11905: 0xC7BC, - 32653 - 11905: 0xC165, - 32654 - 11905: 0xC3C0, - 32655 - 11905: 0xC166, - 32656 - 11905: 0xC167, - 32657 - 11905: 0xC168, - 32658 - 11905: 0xC169, - 32659 - 11905: 0xC16A, - 32660 - 11905: 0xB8E1, - 32661 - 11905: 0xC16B, - 32662 - 11905: 0xC16C, - 32663 - 11905: 0xC16D, - 32664 - 11905: 0xC16E, - 32665 - 11905: 0xC16F, - 32666 - 11905: 0xC1E7, - 32667 - 11905: 0xC170, - 32668 - 11905: 0xC171, - 32669 - 11905: 0xF4C6, - 32670 - 11905: 0xD0DF, - 32671 - 11905: 0xF4C7, - 32672 - 11905: 0xC172, - 32673 - 11905: 0xCFDB, - 32674 - 11905: 0xC173, - 32675 - 11905: 0xC174, - 32676 - 11905: 0xC8BA, - 32677 - 11905: 0xC175, - 32678 - 11905: 0xC176, - 32679 - 11905: 0xF4C8, - 32680 - 11905: 0xC177, - 32681 - 11905: 0xC178, - 32682 - 11905: 0xC179, - 32683 - 11905: 0xC17A, - 32684 - 11905: 0xC17B, - 32685 - 11905: 0xC17C, - 32686 - 11905: 0xC17D, - 32687 - 11905: 0xF4C9, - 32688 - 11905: 0xF4CA, - 32689 - 11905: 0xC17E, - 32690 - 11905: 0xF4CB, - 32691 - 11905: 0xC180, - 32692 - 11905: 0xC181, - 32693 - 11905: 0xC182, - 32694 - 11905: 0xC183, - 32695 - 11905: 0xC184, - 32696 - 11905: 0xD9FA, - 32697 - 11905: 0xB8FE, - 32698 - 11905: 0xC185, - 32699 - 11905: 0xC186, - 32700 - 11905: 0xE5F1, - 32701 - 11905: 0xD3F0, - 32702 - 11905: 0xC187, - 32703 - 11905: 0xF4E0, - 32704 - 11905: 0xC188, - 32705 - 11905: 0xCECC, - 32706 - 11905: 0xC189, - 32707 - 11905: 0xC18A, - 32708 - 11905: 0xC18B, - 32709 - 11905: 0xB3E1, - 32710 - 11905: 0xC18C, - 32711 - 11905: 0xC18D, - 32712 - 11905: 0xC18E, - 32713 - 11905: 0xC18F, - 32714 - 11905: 0xF1B4, - 32715 - 11905: 0xC190, - 32716 - 11905: 0xD2EE, - 32717 - 11905: 0xC191, - 32718 - 11905: 0xF4E1, - 32719 - 11905: 0xC192, - 32720 - 11905: 0xC193, - 32721 - 11905: 0xC194, - 32722 - 11905: 0xC195, - 32723 - 11905: 0xC196, - 32724 - 11905: 0xCFE8, - 32725 - 11905: 0xF4E2, - 32726 - 11905: 0xC197, - 32727 - 11905: 0xC198, - 32728 - 11905: 0xC7CC, - 32729 - 11905: 0xC199, - 32730 - 11905: 0xC19A, - 32731 - 11905: 0xC19B, - 32732 - 11905: 0xC19C, - 32733 - 11905: 0xC19D, - 32734 - 11905: 0xC19E, - 32735 - 11905: 0xB5D4, - 32736 - 11905: 0xB4E4, - 32737 - 11905: 0xF4E4, - 32738 - 11905: 0xC19F, - 32739 - 11905: 0xC1A0, - 32740 - 11905: 0xC240, - 32741 - 11905: 0xF4E3, - 32742 - 11905: 0xF4E5, - 32743 - 11905: 0xC241, - 32744 - 11905: 0xC242, - 32745 - 11905: 0xF4E6, - 32746 - 11905: 0xC243, - 32747 - 11905: 0xC244, - 32748 - 11905: 0xC245, - 32749 - 11905: 0xC246, - 32750 - 11905: 0xF4E7, - 32751 - 11905: 0xC247, - 32752 - 11905: 0xBAB2, - 32753 - 11905: 0xB0BF, - 32754 - 11905: 0xC248, - 32755 - 11905: 0xF4E8, - 32756 - 11905: 0xC249, - 32757 - 11905: 0xC24A, - 32758 - 11905: 0xC24B, - 32759 - 11905: 0xC24C, - 32760 - 11905: 0xC24D, - 32761 - 11905: 0xC24E, - 32762 - 11905: 0xC24F, - 32763 - 11905: 0xB7AD, - 32764 - 11905: 0xD2ED, - 32765 - 11905: 0xC250, - 32766 - 11905: 0xC251, - 32767 - 11905: 0xC252, - 32768 - 11905: 0xD2AB, - 32769 - 11905: 0xC0CF, - 32770 - 11905: 0xC253, - 32771 - 11905: 0xBFBC, - 32772 - 11905: 0xEBA3, - 32773 - 11905: 0xD5DF, - 32774 - 11905: 0xEAC8, - 32775 - 11905: 0xC254, - 32776 - 11905: 0xC255, - 32777 - 11905: 0xC256, - 32778 - 11905: 0xC257, - 32779 - 11905: 0xF1F3, - 32780 - 11905: 0xB6F8, - 32781 - 11905: 0xCBA3, - 32782 - 11905: 0xC258, - 32783 - 11905: 0xC259, - 32784 - 11905: 0xC4CD, - 32785 - 11905: 0xC25A, - 32786 - 11905: 0xF1E7, - 32787 - 11905: 0xC25B, - 32788 - 11905: 0xF1E8, - 32789 - 11905: 0xB8FB, - 32790 - 11905: 0xF1E9, - 32791 - 11905: 0xBAC4, - 32792 - 11905: 0xD4C5, - 32793 - 11905: 0xB0D2, - 32794 - 11905: 0xC25C, - 32795 - 11905: 0xC25D, - 32796 - 11905: 0xF1EA, - 32797 - 11905: 0xC25E, - 32798 - 11905: 0xC25F, - 32799 - 11905: 0xC260, - 32800 - 11905: 0xF1EB, - 32801 - 11905: 0xC261, - 32802 - 11905: 0xF1EC, - 32803 - 11905: 0xC262, - 32804 - 11905: 0xC263, - 32805 - 11905: 0xF1ED, - 32806 - 11905: 0xF1EE, - 32807 - 11905: 0xF1EF, - 32808 - 11905: 0xF1F1, - 32809 - 11905: 0xF1F0, - 32810 - 11905: 0xC5D5, - 32811 - 11905: 0xC264, - 32812 - 11905: 0xC265, - 32813 - 11905: 0xC266, - 32814 - 11905: 0xC267, - 32815 - 11905: 0xC268, - 32816 - 11905: 0xC269, - 32817 - 11905: 0xF1F2, - 32818 - 11905: 0xC26A, - 32819 - 11905: 0xB6FA, - 32820 - 11905: 0xC26B, - 32821 - 11905: 0xF1F4, - 32822 - 11905: 0xD2AE, - 32823 - 11905: 0xDEC7, - 32824 - 11905: 0xCBCA, - 32825 - 11905: 0xC26C, - 32826 - 11905: 0xC26D, - 32827 - 11905: 0xB3DC, - 32828 - 11905: 0xC26E, - 32829 - 11905: 0xB5A2, - 32830 - 11905: 0xC26F, - 32831 - 11905: 0xB9A2, - 32832 - 11905: 0xC270, - 32833 - 11905: 0xC271, - 32834 - 11905: 0xC4F4, - 32835 - 11905: 0xF1F5, - 32836 - 11905: 0xC272, - 32837 - 11905: 0xC273, - 32838 - 11905: 0xF1F6, - 32839 - 11905: 0xC274, - 32840 - 11905: 0xC275, - 32841 - 11905: 0xC276, - 32842 - 11905: 0xC1C4, - 32843 - 11905: 0xC1FB, - 32844 - 11905: 0xD6B0, - 32845 - 11905: 0xF1F7, - 32846 - 11905: 0xC277, - 32847 - 11905: 0xC278, - 32848 - 11905: 0xC279, - 32849 - 11905: 0xC27A, - 32850 - 11905: 0xF1F8, - 32851 - 11905: 0xC27B, - 32852 - 11905: 0xC1AA, - 32853 - 11905: 0xC27C, - 32854 - 11905: 0xC27D, - 32855 - 11905: 0xC27E, - 32856 - 11905: 0xC6B8, - 32857 - 11905: 0xC280, - 32858 - 11905: 0xBEDB, - 32859 - 11905: 0xC281, - 32860 - 11905: 0xC282, - 32861 - 11905: 0xC283, - 32862 - 11905: 0xC284, - 32863 - 11905: 0xC285, - 32864 - 11905: 0xC286, - 32865 - 11905: 0xC287, - 32866 - 11905: 0xC288, - 32867 - 11905: 0xC289, - 32868 - 11905: 0xC28A, - 32869 - 11905: 0xC28B, - 32870 - 11905: 0xC28C, - 32871 - 11905: 0xC28D, - 32872 - 11905: 0xC28E, - 32873 - 11905: 0xF1F9, - 32874 - 11905: 0xB4CF, - 32875 - 11905: 0xC28F, - 32876 - 11905: 0xC290, - 32877 - 11905: 0xC291, - 32878 - 11905: 0xC292, - 32879 - 11905: 0xC293, - 32880 - 11905: 0xC294, - 32881 - 11905: 0xF1FA, - 32882 - 11905: 0xC295, - 32883 - 11905: 0xC296, - 32884 - 11905: 0xC297, - 32885 - 11905: 0xC298, - 32886 - 11905: 0xC299, - 32887 - 11905: 0xC29A, - 32888 - 11905: 0xC29B, - 32889 - 11905: 0xC29C, - 32890 - 11905: 0xC29D, - 32891 - 11905: 0xC29E, - 32892 - 11905: 0xC29F, - 32893 - 11905: 0xC2A0, - 32894 - 11905: 0xC340, - 32895 - 11905: 0xEDB2, - 32896 - 11905: 0xEDB1, - 32897 - 11905: 0xC341, - 32898 - 11905: 0xC342, - 32899 - 11905: 0xCBE0, - 32900 - 11905: 0xD2DE, - 32901 - 11905: 0xC343, - 32902 - 11905: 0xCBC1, - 32903 - 11905: 0xD5D8, - 32904 - 11905: 0xC344, - 32905 - 11905: 0xC8E2, - 32906 - 11905: 0xC345, - 32907 - 11905: 0xC0DF, - 32908 - 11905: 0xBCA1, - 32909 - 11905: 0xC346, - 32910 - 11905: 0xC347, - 32911 - 11905: 0xC348, - 32912 - 11905: 0xC349, - 32913 - 11905: 0xC34A, - 32914 - 11905: 0xC34B, - 32915 - 11905: 0xEBC1, - 32916 - 11905: 0xC34C, - 32917 - 11905: 0xC34D, - 32918 - 11905: 0xD0A4, - 32919 - 11905: 0xC34E, - 32920 - 11905: 0xD6E2, - 32921 - 11905: 0xC34F, - 32922 - 11905: 0xB6C7, - 32923 - 11905: 0xB8D8, - 32924 - 11905: 0xEBC0, - 32925 - 11905: 0xB8CE, - 32926 - 11905: 0xC350, - 32927 - 11905: 0xEBBF, - 32928 - 11905: 0xB3A6, - 32929 - 11905: 0xB9C9, - 32930 - 11905: 0xD6AB, - 32931 - 11905: 0xC351, - 32932 - 11905: 0xB7F4, - 32933 - 11905: 0xB7CA, - 32934 - 11905: 0xC352, - 32935 - 11905: 0xC353, - 32936 - 11905: 0xC354, - 32937 - 11905: 0xBCE7, - 32938 - 11905: 0xB7BE, - 32939 - 11905: 0xEBC6, - 32940 - 11905: 0xC355, - 32941 - 11905: 0xEBC7, - 32942 - 11905: 0xB0B9, - 32943 - 11905: 0xBFCF, - 32944 - 11905: 0xC356, - 32945 - 11905: 0xEBC5, - 32946 - 11905: 0xD3FD, - 32947 - 11905: 0xC357, - 32948 - 11905: 0xEBC8, - 32949 - 11905: 0xC358, - 32950 - 11905: 0xC359, - 32951 - 11905: 0xEBC9, - 32952 - 11905: 0xC35A, - 32953 - 11905: 0xC35B, - 32954 - 11905: 0xB7CE, - 32955 - 11905: 0xC35C, - 32956 - 11905: 0xEBC2, - 32957 - 11905: 0xEBC4, - 32958 - 11905: 0xC9F6, - 32959 - 11905: 0xD6D7, - 32960 - 11905: 0xD5CD, - 32961 - 11905: 0xD0B2, - 32962 - 11905: 0xEBCF, - 32963 - 11905: 0xCEB8, - 32964 - 11905: 0xEBD0, - 32965 - 11905: 0xC35D, - 32966 - 11905: 0xB5A8, - 32967 - 11905: 0xC35E, - 32968 - 11905: 0xC35F, - 32969 - 11905: 0xC360, - 32970 - 11905: 0xC361, - 32971 - 11905: 0xC362, - 32972 - 11905: 0xB1B3, - 32973 - 11905: 0xEBD2, - 32974 - 11905: 0xCCA5, - 32975 - 11905: 0xC363, - 32976 - 11905: 0xC364, - 32977 - 11905: 0xC365, - 32978 - 11905: 0xC366, - 32979 - 11905: 0xC367, - 32980 - 11905: 0xC368, - 32981 - 11905: 0xC369, - 32982 - 11905: 0xC5D6, - 32983 - 11905: 0xEBD3, - 32984 - 11905: 0xC36A, - 32985 - 11905: 0xEBD1, - 32986 - 11905: 0xC5DF, - 32987 - 11905: 0xEBCE, - 32988 - 11905: 0xCAA4, - 32989 - 11905: 0xEBD5, - 32990 - 11905: 0xB0FB, - 32991 - 11905: 0xC36B, - 32992 - 11905: 0xC36C, - 32993 - 11905: 0xBAFA, - 32994 - 11905: 0xC36D, - 32995 - 11905: 0xC36E, - 32996 - 11905: 0xD8B7, - 32997 - 11905: 0xF1E3, - 32998 - 11905: 0xC36F, - 32999 - 11905: 0xEBCA, - 33000 - 11905: 0xEBCB, - 33001 - 11905: 0xEBCC, - 33002 - 11905: 0xEBCD, - 33003 - 11905: 0xEBD6, - 33004 - 11905: 0xE6C0, - 33005 - 11905: 0xEBD9, - 33006 - 11905: 0xC370, - 33007 - 11905: 0xBFE8, - 33008 - 11905: 0xD2C8, - 33009 - 11905: 0xEBD7, - 33010 - 11905: 0xEBDC, - 33011 - 11905: 0xB8EC, - 33012 - 11905: 0xEBD8, - 33013 - 11905: 0xC371, - 33014 - 11905: 0xBDBA, - 33015 - 11905: 0xC372, - 33016 - 11905: 0xD0D8, - 33017 - 11905: 0xC373, - 33018 - 11905: 0xB0B7, - 33019 - 11905: 0xC374, - 33020 - 11905: 0xEBDD, - 33021 - 11905: 0xC4DC, - 33022 - 11905: 0xC375, - 33023 - 11905: 0xC376, - 33024 - 11905: 0xC377, - 33025 - 11905: 0xC378, - 33026 - 11905: 0xD6AC, - 33027 - 11905: 0xC379, - 33028 - 11905: 0xC37A, - 33029 - 11905: 0xC37B, - 33030 - 11905: 0xB4E0, - 33031 - 11905: 0xC37C, - 33032 - 11905: 0xC37D, - 33033 - 11905: 0xC2F6, - 33034 - 11905: 0xBCB9, - 33035 - 11905: 0xC37E, - 33036 - 11905: 0xC380, - 33037 - 11905: 0xEBDA, - 33038 - 11905: 0xEBDB, - 33039 - 11905: 0xD4E0, - 33040 - 11905: 0xC6EA, - 33041 - 11905: 0xC4D4, - 33042 - 11905: 0xEBDF, - 33043 - 11905: 0xC5A7, - 33044 - 11905: 0xD9F5, - 33045 - 11905: 0xC381, - 33046 - 11905: 0xB2B1, - 33047 - 11905: 0xC382, - 33048 - 11905: 0xEBE4, - 33049 - 11905: 0xC383, - 33050 - 11905: 0xBDC5, - 33051 - 11905: 0xC384, - 33052 - 11905: 0xC385, - 33053 - 11905: 0xC386, - 33054 - 11905: 0xEBE2, - 33055 - 11905: 0xC387, - 33056 - 11905: 0xC388, - 33057 - 11905: 0xC389, - 33058 - 11905: 0xC38A, - 33059 - 11905: 0xC38B, - 33060 - 11905: 0xC38C, - 33061 - 11905: 0xC38D, - 33062 - 11905: 0xC38E, - 33063 - 11905: 0xC38F, - 33064 - 11905: 0xC390, - 33065 - 11905: 0xC391, - 33066 - 11905: 0xC392, - 33067 - 11905: 0xC393, - 33068 - 11905: 0xEBE3, - 33069 - 11905: 0xC394, - 33070 - 11905: 0xC395, - 33071 - 11905: 0xB8AC, - 33072 - 11905: 0xC396, - 33073 - 11905: 0xCDD1, - 33074 - 11905: 0xEBE5, - 33075 - 11905: 0xC397, - 33076 - 11905: 0xC398, - 33077 - 11905: 0xC399, - 33078 - 11905: 0xEBE1, - 33079 - 11905: 0xC39A, - 33080 - 11905: 0xC1B3, - 33081 - 11905: 0xC39B, - 33082 - 11905: 0xC39C, - 33083 - 11905: 0xC39D, - 33084 - 11905: 0xC39E, - 33085 - 11905: 0xC39F, - 33086 - 11905: 0xC6A2, - 33087 - 11905: 0xC3A0, - 33088 - 11905: 0xC440, - 33089 - 11905: 0xC441, - 33090 - 11905: 0xC442, - 33091 - 11905: 0xC443, - 33092 - 11905: 0xC444, - 33093 - 11905: 0xC445, - 33094 - 11905: 0xCCF3, - 33095 - 11905: 0xC446, - 33096 - 11905: 0xEBE6, - 33097 - 11905: 0xC447, - 33098 - 11905: 0xC0B0, - 33099 - 11905: 0xD2B8, - 33100 - 11905: 0xEBE7, - 33101 - 11905: 0xC448, - 33102 - 11905: 0xC449, - 33103 - 11905: 0xC44A, - 33104 - 11905: 0xB8AF, - 33105 - 11905: 0xB8AD, - 33106 - 11905: 0xC44B, - 33107 - 11905: 0xEBE8, - 33108 - 11905: 0xC7BB, - 33109 - 11905: 0xCDF3, - 33110 - 11905: 0xC44C, - 33111 - 11905: 0xC44D, - 33112 - 11905: 0xC44E, - 33113 - 11905: 0xEBEA, - 33114 - 11905: 0xEBEB, - 33115 - 11905: 0xC44F, - 33116 - 11905: 0xC450, - 33117 - 11905: 0xC451, - 33118 - 11905: 0xC452, - 33119 - 11905: 0xC453, - 33120 - 11905: 0xEBED, - 33121 - 11905: 0xC454, - 33122 - 11905: 0xC455, - 33123 - 11905: 0xC456, - 33124 - 11905: 0xC457, - 33125 - 11905: 0xD0C8, - 33126 - 11905: 0xC458, - 33127 - 11905: 0xEBF2, - 33128 - 11905: 0xC459, - 33129 - 11905: 0xEBEE, - 33130 - 11905: 0xC45A, - 33131 - 11905: 0xC45B, - 33132 - 11905: 0xC45C, - 33133 - 11905: 0xEBF1, - 33134 - 11905: 0xC8F9, - 33135 - 11905: 0xC45D, - 33136 - 11905: 0xD1FC, - 33137 - 11905: 0xEBEC, - 33138 - 11905: 0xC45E, - 33139 - 11905: 0xC45F, - 33140 - 11905: 0xEBE9, - 33141 - 11905: 0xC460, - 33142 - 11905: 0xC461, - 33143 - 11905: 0xC462, - 33144 - 11905: 0xC463, - 33145 - 11905: 0xB8B9, - 33146 - 11905: 0xCFD9, - 33147 - 11905: 0xC4E5, - 33148 - 11905: 0xEBEF, - 33149 - 11905: 0xEBF0, - 33150 - 11905: 0xCCDA, - 33151 - 11905: 0xCDC8, - 33152 - 11905: 0xB0F2, - 33153 - 11905: 0xC464, - 33154 - 11905: 0xEBF6, - 33155 - 11905: 0xC465, - 33156 - 11905: 0xC466, - 33157 - 11905: 0xC467, - 33158 - 11905: 0xC468, - 33159 - 11905: 0xC469, - 33160 - 11905: 0xEBF5, - 33161 - 11905: 0xC46A, - 33162 - 11905: 0xB2B2, - 33163 - 11905: 0xC46B, - 33164 - 11905: 0xC46C, - 33165 - 11905: 0xC46D, - 33166 - 11905: 0xC46E, - 33167 - 11905: 0xB8E0, - 33168 - 11905: 0xC46F, - 33169 - 11905: 0xEBF7, - 33170 - 11905: 0xC470, - 33171 - 11905: 0xC471, - 33172 - 11905: 0xC472, - 33173 - 11905: 0xC473, - 33174 - 11905: 0xC474, - 33175 - 11905: 0xC475, - 33176 - 11905: 0xB1EC, - 33177 - 11905: 0xC476, - 33178 - 11905: 0xC477, - 33179 - 11905: 0xCCC5, - 33180 - 11905: 0xC4A4, - 33181 - 11905: 0xCFA5, - 33182 - 11905: 0xC478, - 33183 - 11905: 0xC479, - 33184 - 11905: 0xC47A, - 33185 - 11905: 0xC47B, - 33186 - 11905: 0xC47C, - 33187 - 11905: 0xEBF9, - 33188 - 11905: 0xC47D, - 33189 - 11905: 0xC47E, - 33190 - 11905: 0xECA2, - 33191 - 11905: 0xC480, - 33192 - 11905: 0xC5F2, - 33193 - 11905: 0xC481, - 33194 - 11905: 0xEBFA, - 33195 - 11905: 0xC482, - 33196 - 11905: 0xC483, - 33197 - 11905: 0xC484, - 33198 - 11905: 0xC485, - 33199 - 11905: 0xC486, - 33200 - 11905: 0xC487, - 33201 - 11905: 0xC488, - 33202 - 11905: 0xC489, - 33203 - 11905: 0xC9C5, - 33204 - 11905: 0xC48A, - 33205 - 11905: 0xC48B, - 33206 - 11905: 0xC48C, - 33207 - 11905: 0xC48D, - 33208 - 11905: 0xC48E, - 33209 - 11905: 0xC48F, - 33210 - 11905: 0xE2DF, - 33211 - 11905: 0xEBFE, - 33212 - 11905: 0xC490, - 33213 - 11905: 0xC491, - 33214 - 11905: 0xC492, - 33215 - 11905: 0xC493, - 33216 - 11905: 0xCDCE, - 33217 - 11905: 0xECA1, - 33218 - 11905: 0xB1DB, - 33219 - 11905: 0xD3B7, - 33220 - 11905: 0xC494, - 33221 - 11905: 0xC495, - 33222 - 11905: 0xD2DC, - 33223 - 11905: 0xC496, - 33224 - 11905: 0xC497, - 33225 - 11905: 0xC498, - 33226 - 11905: 0xEBFD, - 33227 - 11905: 0xC499, - 33228 - 11905: 0xEBFB, - 33229 - 11905: 0xC49A, - 33230 - 11905: 0xC49B, - 33231 - 11905: 0xC49C, - 33232 - 11905: 0xC49D, - 33233 - 11905: 0xC49E, - 33234 - 11905: 0xC49F, - 33235 - 11905: 0xC4A0, - 33236 - 11905: 0xC540, - 33237 - 11905: 0xC541, - 33238 - 11905: 0xC542, - 33239 - 11905: 0xC543, - 33240 - 11905: 0xC544, - 33241 - 11905: 0xC545, - 33242 - 11905: 0xC546, - 33243 - 11905: 0xC547, - 33244 - 11905: 0xC548, - 33245 - 11905: 0xC549, - 33246 - 11905: 0xC54A, - 33247 - 11905: 0xC54B, - 33248 - 11905: 0xC54C, - 33249 - 11905: 0xC54D, - 33250 - 11905: 0xC54E, - 33251 - 11905: 0xB3BC, - 33252 - 11905: 0xC54F, - 33253 - 11905: 0xC550, - 33254 - 11905: 0xC551, - 33255 - 11905: 0xEAB0, - 33256 - 11905: 0xC552, - 33257 - 11905: 0xC553, - 33258 - 11905: 0xD7D4, - 33259 - 11905: 0xC554, - 33260 - 11905: 0xF4AB, - 33261 - 11905: 0xB3F4, - 33262 - 11905: 0xC555, - 33263 - 11905: 0xC556, - 33264 - 11905: 0xC557, - 33265 - 11905: 0xC558, - 33266 - 11905: 0xC559, - 33267 - 11905: 0xD6C1, - 33268 - 11905: 0xD6C2, - 33269 - 11905: 0xC55A, - 33270 - 11905: 0xC55B, - 33271 - 11905: 0xC55C, - 33272 - 11905: 0xC55D, - 33273 - 11905: 0xC55E, - 33274 - 11905: 0xC55F, - 33275 - 11905: 0xD5E9, - 33276 - 11905: 0xBECA, - 33277 - 11905: 0xC560, - 33278 - 11905: 0xF4A7, - 33279 - 11905: 0xC561, - 33280 - 11905: 0xD2A8, - 33281 - 11905: 0xF4A8, - 33282 - 11905: 0xF4A9, - 33283 - 11905: 0xC562, - 33284 - 11905: 0xF4AA, - 33285 - 11905: 0xBECB, - 33286 - 11905: 0xD3DF, - 33287 - 11905: 0xC563, - 33288 - 11905: 0xC564, - 33289 - 11905: 0xC565, - 33290 - 11905: 0xC566, - 33291 - 11905: 0xC567, - 33292 - 11905: 0xC9E0, - 33293 - 11905: 0xC9E1, - 33294 - 11905: 0xC568, - 33295 - 11905: 0xC569, - 33296 - 11905: 0xF3C2, - 33297 - 11905: 0xC56A, - 33298 - 11905: 0xCAE6, - 33299 - 11905: 0xC56B, - 33300 - 11905: 0xCCF2, - 33301 - 11905: 0xC56C, - 33302 - 11905: 0xC56D, - 33303 - 11905: 0xC56E, - 33304 - 11905: 0xC56F, - 33305 - 11905: 0xC570, - 33306 - 11905: 0xC571, - 33307 - 11905: 0xE2B6, - 33308 - 11905: 0xCBB4, - 33309 - 11905: 0xC572, - 33310 - 11905: 0xCEE8, - 33311 - 11905: 0xD6DB, - 33312 - 11905: 0xC573, - 33313 - 11905: 0xF4AD, - 33314 - 11905: 0xF4AE, - 33315 - 11905: 0xF4AF, - 33316 - 11905: 0xC574, - 33317 - 11905: 0xC575, - 33318 - 11905: 0xC576, - 33319 - 11905: 0xC577, - 33320 - 11905: 0xF4B2, - 33321 - 11905: 0xC578, - 33322 - 11905: 0xBABD, - 33323 - 11905: 0xF4B3, - 33324 - 11905: 0xB0E3, - 33325 - 11905: 0xF4B0, - 33326 - 11905: 0xC579, - 33327 - 11905: 0xF4B1, - 33328 - 11905: 0xBDA2, - 33329 - 11905: 0xB2D5, - 33330 - 11905: 0xC57A, - 33331 - 11905: 0xF4B6, - 33332 - 11905: 0xF4B7, - 33333 - 11905: 0xB6E6, - 33334 - 11905: 0xB2B0, - 33335 - 11905: 0xCFCF, - 33336 - 11905: 0xF4B4, - 33337 - 11905: 0xB4AC, - 33338 - 11905: 0xC57B, - 33339 - 11905: 0xF4B5, - 33340 - 11905: 0xC57C, - 33341 - 11905: 0xC57D, - 33342 - 11905: 0xF4B8, - 33343 - 11905: 0xC57E, - 33344 - 11905: 0xC580, - 33345 - 11905: 0xC581, - 33346 - 11905: 0xC582, - 33347 - 11905: 0xC583, - 33348 - 11905: 0xF4B9, - 33349 - 11905: 0xC584, - 33350 - 11905: 0xC585, - 33351 - 11905: 0xCDA7, - 33352 - 11905: 0xC586, - 33353 - 11905: 0xF4BA, - 33354 - 11905: 0xC587, - 33355 - 11905: 0xF4BB, - 33356 - 11905: 0xC588, - 33357 - 11905: 0xC589, - 33358 - 11905: 0xC58A, - 33359 - 11905: 0xF4BC, - 33360 - 11905: 0xC58B, - 33361 - 11905: 0xC58C, - 33362 - 11905: 0xC58D, - 33363 - 11905: 0xC58E, - 33364 - 11905: 0xC58F, - 33365 - 11905: 0xC590, - 33366 - 11905: 0xC591, - 33367 - 11905: 0xC592, - 33368 - 11905: 0xCBD2, - 33369 - 11905: 0xC593, - 33370 - 11905: 0xF4BD, - 33371 - 11905: 0xC594, - 33372 - 11905: 0xC595, - 33373 - 11905: 0xC596, - 33374 - 11905: 0xC597, - 33375 - 11905: 0xF4BE, - 33376 - 11905: 0xC598, - 33377 - 11905: 0xC599, - 33378 - 11905: 0xC59A, - 33379 - 11905: 0xC59B, - 33380 - 11905: 0xC59C, - 33381 - 11905: 0xC59D, - 33382 - 11905: 0xC59E, - 33383 - 11905: 0xC59F, - 33384 - 11905: 0xF4BF, - 33385 - 11905: 0xC5A0, - 33386 - 11905: 0xC640, - 33387 - 11905: 0xC641, - 33388 - 11905: 0xC642, - 33389 - 11905: 0xC643, - 33390 - 11905: 0xF4DE, - 33391 - 11905: 0xC1BC, - 33392 - 11905: 0xBCE8, - 33393 - 11905: 0xC644, - 33394 - 11905: 0xC9AB, - 33395 - 11905: 0xD1DE, - 33396 - 11905: 0xE5F5, - 33397 - 11905: 0xC645, - 33398 - 11905: 0xC646, - 33399 - 11905: 0xC647, - 33400 - 11905: 0xC648, - 33401 - 11905: 0xDCB3, - 33402 - 11905: 0xD2D5, - 33403 - 11905: 0xC649, - 33404 - 11905: 0xC64A, - 33405 - 11905: 0xDCB4, - 33406 - 11905: 0xB0AC, - 33407 - 11905: 0xDCB5, - 33408 - 11905: 0xC64B, - 33409 - 11905: 0xC64C, - 33410 - 11905: 0xBDDA, - 33411 - 11905: 0xC64D, - 33412 - 11905: 0xDCB9, - 33413 - 11905: 0xC64E, - 33414 - 11905: 0xC64F, - 33415 - 11905: 0xC650, - 33416 - 11905: 0xD8C2, - 33417 - 11905: 0xC651, - 33418 - 11905: 0xDCB7, - 33419 - 11905: 0xD3F3, - 33420 - 11905: 0xC652, - 33421 - 11905: 0xC9D6, - 33422 - 11905: 0xDCBA, - 33423 - 11905: 0xDCB6, - 33424 - 11905: 0xC653, - 33425 - 11905: 0xDCBB, - 33426 - 11905: 0xC3A2, - 33427 - 11905: 0xC654, - 33428 - 11905: 0xC655, - 33429 - 11905: 0xC656, - 33430 - 11905: 0xC657, - 33431 - 11905: 0xDCBC, - 33432 - 11905: 0xDCC5, - 33433 - 11905: 0xDCBD, - 33434 - 11905: 0xC658, - 33435 - 11905: 0xC659, - 33436 - 11905: 0xCEDF, - 33437 - 11905: 0xD6A5, - 33438 - 11905: 0xC65A, - 33439 - 11905: 0xDCCF, - 33440 - 11905: 0xC65B, - 33441 - 11905: 0xDCCD, - 33442 - 11905: 0xC65C, - 33443 - 11905: 0xC65D, - 33444 - 11905: 0xDCD2, - 33445 - 11905: 0xBDE6, - 33446 - 11905: 0xC2AB, - 33447 - 11905: 0xC65E, - 33448 - 11905: 0xDCB8, - 33449 - 11905: 0xDCCB, - 33450 - 11905: 0xDCCE, - 33451 - 11905: 0xDCBE, - 33452 - 11905: 0xB7D2, - 33453 - 11905: 0xB0C5, - 33454 - 11905: 0xDCC7, - 33455 - 11905: 0xD0BE, - 33456 - 11905: 0xDCC1, - 33457 - 11905: 0xBBA8, - 33458 - 11905: 0xC65F, - 33459 - 11905: 0xB7BC, - 33460 - 11905: 0xDCCC, - 33461 - 11905: 0xC660, - 33462 - 11905: 0xC661, - 33463 - 11905: 0xDCC6, - 33464 - 11905: 0xDCBF, - 33465 - 11905: 0xC7DB, - 33466 - 11905: 0xC662, - 33467 - 11905: 0xC663, - 33468 - 11905: 0xC664, - 33469 - 11905: 0xD1BF, - 33470 - 11905: 0xDCC0, - 33471 - 11905: 0xC665, - 33472 - 11905: 0xC666, - 33473 - 11905: 0xDCCA, - 33474 - 11905: 0xC667, - 33475 - 11905: 0xC668, - 33476 - 11905: 0xDCD0, - 33477 - 11905: 0xC669, - 33478 - 11905: 0xC66A, - 33479 - 11905: 0xCEAD, - 33480 - 11905: 0xDCC2, - 33481 - 11905: 0xC66B, - 33482 - 11905: 0xDCC3, - 33483 - 11905: 0xDCC8, - 33484 - 11905: 0xDCC9, - 33485 - 11905: 0xB2D4, - 33486 - 11905: 0xDCD1, - 33487 - 11905: 0xCBD5, - 33488 - 11905: 0xC66C, - 33489 - 11905: 0xD4B7, - 33490 - 11905: 0xDCDB, - 33491 - 11905: 0xDCDF, - 33492 - 11905: 0xCCA6, - 33493 - 11905: 0xDCE6, - 33494 - 11905: 0xC66D, - 33495 - 11905: 0xC3E7, - 33496 - 11905: 0xDCDC, - 33497 - 11905: 0xC66E, - 33498 - 11905: 0xC66F, - 33499 - 11905: 0xBFC1, - 33500 - 11905: 0xDCD9, - 33501 - 11905: 0xC670, - 33502 - 11905: 0xB0FA, - 33503 - 11905: 0xB9B6, - 33504 - 11905: 0xDCE5, - 33505 - 11905: 0xDCD3, - 33506 - 11905: 0xC671, - 33507 - 11905: 0xDCC4, - 33508 - 11905: 0xDCD6, - 33509 - 11905: 0xC8F4, - 33510 - 11905: 0xBFE0, - 33511 - 11905: 0xC672, - 33512 - 11905: 0xC673, - 33513 - 11905: 0xC674, - 33514 - 11905: 0xC675, - 33515 - 11905: 0xC9BB, - 33516 - 11905: 0xC676, - 33517 - 11905: 0xC677, - 33518 - 11905: 0xC678, - 33519 - 11905: 0xB1BD, - 33520 - 11905: 0xC679, - 33521 - 11905: 0xD3A2, - 33522 - 11905: 0xC67A, - 33523 - 11905: 0xC67B, - 33524 - 11905: 0xDCDA, - 33525 - 11905: 0xC67C, - 33526 - 11905: 0xC67D, - 33527 - 11905: 0xDCD5, - 33528 - 11905: 0xC67E, - 33529 - 11905: 0xC6BB, - 33530 - 11905: 0xC680, - 33531 - 11905: 0xDCDE, - 33532 - 11905: 0xC681, - 33533 - 11905: 0xC682, - 33534 - 11905: 0xC683, - 33535 - 11905: 0xC684, - 33536 - 11905: 0xC685, - 33537 - 11905: 0xD7C2, - 33538 - 11905: 0xC3AF, - 33539 - 11905: 0xB7B6, - 33540 - 11905: 0xC7D1, - 33541 - 11905: 0xC3A9, - 33542 - 11905: 0xDCE2, - 33543 - 11905: 0xDCD8, - 33544 - 11905: 0xDCEB, - 33545 - 11905: 0xDCD4, - 33546 - 11905: 0xC686, - 33547 - 11905: 0xC687, - 33548 - 11905: 0xDCDD, - 33549 - 11905: 0xC688, - 33550 - 11905: 0xBEA5, - 33551 - 11905: 0xDCD7, - 33552 - 11905: 0xC689, - 33553 - 11905: 0xDCE0, - 33554 - 11905: 0xC68A, - 33555 - 11905: 0xC68B, - 33556 - 11905: 0xDCE3, - 33557 - 11905: 0xDCE4, - 33558 - 11905: 0xC68C, - 33559 - 11905: 0xDCF8, - 33560 - 11905: 0xC68D, - 33561 - 11905: 0xC68E, - 33562 - 11905: 0xDCE1, - 33563 - 11905: 0xDDA2, - 33564 - 11905: 0xDCE7, - 33565 - 11905: 0xC68F, - 33566 - 11905: 0xC690, - 33567 - 11905: 0xC691, - 33568 - 11905: 0xC692, - 33569 - 11905: 0xC693, - 33570 - 11905: 0xC694, - 33571 - 11905: 0xC695, - 33572 - 11905: 0xC696, - 33573 - 11905: 0xC697, - 33574 - 11905: 0xC698, - 33575 - 11905: 0xBCEB, - 33576 - 11905: 0xB4C4, - 33577 - 11905: 0xC699, - 33578 - 11905: 0xC69A, - 33579 - 11905: 0xC3A3, - 33580 - 11905: 0xB2E7, - 33581 - 11905: 0xDCFA, - 33582 - 11905: 0xC69B, - 33583 - 11905: 0xDCF2, - 33584 - 11905: 0xC69C, - 33585 - 11905: 0xDCEF, - 33586 - 11905: 0xC69D, - 33587 - 11905: 0xDCFC, - 33588 - 11905: 0xDCEE, - 33589 - 11905: 0xD2F0, - 33590 - 11905: 0xB2E8, - 33591 - 11905: 0xC69E, - 33592 - 11905: 0xC8D7, - 33593 - 11905: 0xC8E3, - 33594 - 11905: 0xDCFB, - 33595 - 11905: 0xC69F, - 33596 - 11905: 0xDCED, - 33597 - 11905: 0xC6A0, - 33598 - 11905: 0xC740, - 33599 - 11905: 0xC741, - 33600 - 11905: 0xDCF7, - 33601 - 11905: 0xC742, - 33602 - 11905: 0xC743, - 33603 - 11905: 0xDCF5, - 33604 - 11905: 0xC744, - 33605 - 11905: 0xC745, - 33606 - 11905: 0xBEA3, - 33607 - 11905: 0xDCF4, - 33608 - 11905: 0xC746, - 33609 - 11905: 0xB2DD, - 33610 - 11905: 0xC747, - 33611 - 11905: 0xC748, - 33612 - 11905: 0xC749, - 33613 - 11905: 0xC74A, - 33614 - 11905: 0xC74B, - 33615 - 11905: 0xDCF3, - 33616 - 11905: 0xBCF6, - 33617 - 11905: 0xDCE8, - 33618 - 11905: 0xBBC4, - 33619 - 11905: 0xC74C, - 33620 - 11905: 0xC0F3, - 33621 - 11905: 0xC74D, - 33622 - 11905: 0xC74E, - 33623 - 11905: 0xC74F, - 33624 - 11905: 0xC750, - 33625 - 11905: 0xC751, - 33626 - 11905: 0xBCD4, - 33627 - 11905: 0xDCE9, - 33628 - 11905: 0xDCEA, - 33629 - 11905: 0xC752, - 33630 - 11905: 0xDCF1, - 33631 - 11905: 0xDCF6, - 33632 - 11905: 0xDCF9, - 33633 - 11905: 0xB5B4, - 33634 - 11905: 0xC753, - 33635 - 11905: 0xC8D9, - 33636 - 11905: 0xBBE7, - 33637 - 11905: 0xDCFE, - 33638 - 11905: 0xDCFD, - 33639 - 11905: 0xD3AB, - 33640 - 11905: 0xDDA1, - 33641 - 11905: 0xDDA3, - 33642 - 11905: 0xDDA5, - 33643 - 11905: 0xD2F1, - 33644 - 11905: 0xDDA4, - 33645 - 11905: 0xDDA6, - 33646 - 11905: 0xDDA7, - 33647 - 11905: 0xD2A9, - 33648 - 11905: 0xC754, - 33649 - 11905: 0xC755, - 33650 - 11905: 0xC756, - 33651 - 11905: 0xC757, - 33652 - 11905: 0xC758, - 33653 - 11905: 0xC759, - 33654 - 11905: 0xC75A, - 33655 - 11905: 0xBAC9, - 33656 - 11905: 0xDDA9, - 33657 - 11905: 0xC75B, - 33658 - 11905: 0xC75C, - 33659 - 11905: 0xDDB6, - 33660 - 11905: 0xDDB1, - 33661 - 11905: 0xDDB4, - 33662 - 11905: 0xC75D, - 33663 - 11905: 0xC75E, - 33664 - 11905: 0xC75F, - 33665 - 11905: 0xC760, - 33666 - 11905: 0xC761, - 33667 - 11905: 0xC762, - 33668 - 11905: 0xC763, - 33669 - 11905: 0xDDB0, - 33670 - 11905: 0xC6CE, - 33671 - 11905: 0xC764, - 33672 - 11905: 0xC765, - 33673 - 11905: 0xC0F2, - 33674 - 11905: 0xC766, - 33675 - 11905: 0xC767, - 33676 - 11905: 0xC768, - 33677 - 11905: 0xC769, - 33678 - 11905: 0xC9AF, - 33679 - 11905: 0xC76A, - 33680 - 11905: 0xC76B, - 33681 - 11905: 0xC76C, - 33682 - 11905: 0xDCEC, - 33683 - 11905: 0xDDAE, - 33684 - 11905: 0xC76D, - 33685 - 11905: 0xC76E, - 33686 - 11905: 0xC76F, - 33687 - 11905: 0xC770, - 33688 - 11905: 0xDDB7, - 33689 - 11905: 0xC771, - 33690 - 11905: 0xC772, - 33691 - 11905: 0xDCF0, - 33692 - 11905: 0xDDAF, - 33693 - 11905: 0xC773, - 33694 - 11905: 0xDDB8, - 33695 - 11905: 0xC774, - 33696 - 11905: 0xDDAC, - 33697 - 11905: 0xC775, - 33698 - 11905: 0xC776, - 33699 - 11905: 0xC777, - 33700 - 11905: 0xC778, - 33701 - 11905: 0xC779, - 33702 - 11905: 0xC77A, - 33703 - 11905: 0xC77B, - 33704 - 11905: 0xDDB9, - 33705 - 11905: 0xDDB3, - 33706 - 11905: 0xDDAD, - 33707 - 11905: 0xC4AA, - 33708 - 11905: 0xC77C, - 33709 - 11905: 0xC77D, - 33710 - 11905: 0xC77E, - 33711 - 11905: 0xC780, - 33712 - 11905: 0xDDA8, - 33713 - 11905: 0xC0B3, - 33714 - 11905: 0xC1AB, - 33715 - 11905: 0xDDAA, - 33716 - 11905: 0xDDAB, - 33717 - 11905: 0xC781, - 33718 - 11905: 0xDDB2, - 33719 - 11905: 0xBBF1, - 33720 - 11905: 0xDDB5, - 33721 - 11905: 0xD3A8, - 33722 - 11905: 0xDDBA, - 33723 - 11905: 0xC782, - 33724 - 11905: 0xDDBB, - 33725 - 11905: 0xC3A7, - 33726 - 11905: 0xC783, - 33727 - 11905: 0xC784, - 33728 - 11905: 0xDDD2, - 33729 - 11905: 0xDDBC, - 33730 - 11905: 0xC785, - 33731 - 11905: 0xC786, - 33732 - 11905: 0xC787, - 33733 - 11905: 0xDDD1, - 33734 - 11905: 0xC788, - 33735 - 11905: 0xB9BD, - 33736 - 11905: 0xC789, - 33737 - 11905: 0xC78A, - 33738 - 11905: 0xBED5, - 33739 - 11905: 0xC78B, - 33740 - 11905: 0xBEFA, - 33741 - 11905: 0xC78C, - 33742 - 11905: 0xC78D, - 33743 - 11905: 0xBACA, - 33744 - 11905: 0xC78E, - 33745 - 11905: 0xC78F, - 33746 - 11905: 0xC790, - 33747 - 11905: 0xC791, - 33748 - 11905: 0xDDCA, - 33749 - 11905: 0xC792, - 33750 - 11905: 0xDDC5, - 33751 - 11905: 0xC793, - 33752 - 11905: 0xDDBF, - 33753 - 11905: 0xC794, - 33754 - 11905: 0xC795, - 33755 - 11905: 0xC796, - 33756 - 11905: 0xB2CB, - 33757 - 11905: 0xDDC3, - 33758 - 11905: 0xC797, - 33759 - 11905: 0xDDCB, - 33760 - 11905: 0xB2A4, - 33761 - 11905: 0xDDD5, - 33762 - 11905: 0xC798, - 33763 - 11905: 0xC799, - 33764 - 11905: 0xC79A, - 33765 - 11905: 0xDDBE, - 33766 - 11905: 0xC79B, - 33767 - 11905: 0xC79C, - 33768 - 11905: 0xC79D, - 33769 - 11905: 0xC6D0, - 33770 - 11905: 0xDDD0, - 33771 - 11905: 0xC79E, - 33772 - 11905: 0xC79F, - 33773 - 11905: 0xC7A0, - 33774 - 11905: 0xC840, - 33775 - 11905: 0xC841, - 33776 - 11905: 0xDDD4, - 33777 - 11905: 0xC1E2, - 33778 - 11905: 0xB7C6, - 33779 - 11905: 0xC842, - 33780 - 11905: 0xC843, - 33781 - 11905: 0xC844, - 33782 - 11905: 0xC845, - 33783 - 11905: 0xC846, - 33784 - 11905: 0xDDCE, - 33785 - 11905: 0xDDCF, - 33786 - 11905: 0xC847, - 33787 - 11905: 0xC848, - 33788 - 11905: 0xC849, - 33789 - 11905: 0xDDC4, - 33790 - 11905: 0xC84A, - 33791 - 11905: 0xC84B, - 33792 - 11905: 0xC84C, - 33793 - 11905: 0xDDBD, - 33794 - 11905: 0xC84D, - 33795 - 11905: 0xDDCD, - 33796 - 11905: 0xCCD1, - 33797 - 11905: 0xC84E, - 33798 - 11905: 0xDDC9, - 33799 - 11905: 0xC84F, - 33800 - 11905: 0xC850, - 33801 - 11905: 0xC851, - 33802 - 11905: 0xC852, - 33803 - 11905: 0xDDC2, - 33804 - 11905: 0xC3C8, - 33805 - 11905: 0xC6BC, - 33806 - 11905: 0xCEAE, - 33807 - 11905: 0xDDCC, - 33808 - 11905: 0xC853, - 33809 - 11905: 0xDDC8, - 33810 - 11905: 0xC854, - 33811 - 11905: 0xC855, - 33812 - 11905: 0xC856, - 33813 - 11905: 0xC857, - 33814 - 11905: 0xC858, - 33815 - 11905: 0xC859, - 33816 - 11905: 0xDDC1, - 33817 - 11905: 0xC85A, - 33818 - 11905: 0xC85B, - 33819 - 11905: 0xC85C, - 33820 - 11905: 0xDDC6, - 33821 - 11905: 0xC2DC, - 33822 - 11905: 0xC85D, - 33823 - 11905: 0xC85E, - 33824 - 11905: 0xC85F, - 33825 - 11905: 0xC860, - 33826 - 11905: 0xC861, - 33827 - 11905: 0xC862, - 33828 - 11905: 0xD3A9, - 33829 - 11905: 0xD3AA, - 33830 - 11905: 0xDDD3, - 33831 - 11905: 0xCFF4, - 33832 - 11905: 0xC8F8, - 33833 - 11905: 0xC863, - 33834 - 11905: 0xC864, - 33835 - 11905: 0xC865, - 33836 - 11905: 0xC866, - 33837 - 11905: 0xC867, - 33838 - 11905: 0xC868, - 33839 - 11905: 0xC869, - 33840 - 11905: 0xC86A, - 33841 - 11905: 0xDDE6, - 33842 - 11905: 0xC86B, - 33843 - 11905: 0xC86C, - 33844 - 11905: 0xC86D, - 33845 - 11905: 0xC86E, - 33846 - 11905: 0xC86F, - 33847 - 11905: 0xC870, - 33848 - 11905: 0xDDC7, - 33849 - 11905: 0xC871, - 33850 - 11905: 0xC872, - 33851 - 11905: 0xC873, - 33852 - 11905: 0xDDE0, - 33853 - 11905: 0xC2E4, - 33854 - 11905: 0xC874, - 33855 - 11905: 0xC875, - 33856 - 11905: 0xC876, - 33857 - 11905: 0xC877, - 33858 - 11905: 0xC878, - 33859 - 11905: 0xC879, - 33860 - 11905: 0xC87A, - 33861 - 11905: 0xC87B, - 33862 - 11905: 0xDDE1, - 33863 - 11905: 0xC87C, - 33864 - 11905: 0xC87D, - 33865 - 11905: 0xC87E, - 33866 - 11905: 0xC880, - 33867 - 11905: 0xC881, - 33868 - 11905: 0xC882, - 33869 - 11905: 0xC883, - 33870 - 11905: 0xC884, - 33871 - 11905: 0xC885, - 33872 - 11905: 0xC886, - 33873 - 11905: 0xDDD7, - 33874 - 11905: 0xC887, - 33875 - 11905: 0xC888, - 33876 - 11905: 0xC889, - 33877 - 11905: 0xC88A, - 33878 - 11905: 0xC88B, - 33879 - 11905: 0xD6F8, - 33880 - 11905: 0xC88C, - 33881 - 11905: 0xDDD9, - 33882 - 11905: 0xDDD8, - 33883 - 11905: 0xB8F0, - 33884 - 11905: 0xDDD6, - 33885 - 11905: 0xC88D, - 33886 - 11905: 0xC88E, - 33887 - 11905: 0xC88F, - 33888 - 11905: 0xC890, - 33889 - 11905: 0xC6CF, - 33890 - 11905: 0xC891, - 33891 - 11905: 0xB6AD, - 33892 - 11905: 0xC892, - 33893 - 11905: 0xC893, - 33894 - 11905: 0xC894, - 33895 - 11905: 0xC895, - 33896 - 11905: 0xC896, - 33897 - 11905: 0xDDE2, - 33898 - 11905: 0xC897, - 33899 - 11905: 0xBAF9, - 33900 - 11905: 0xD4E1, - 33901 - 11905: 0xDDE7, - 33902 - 11905: 0xC898, - 33903 - 11905: 0xC899, - 33904 - 11905: 0xC89A, - 33905 - 11905: 0xB4D0, - 33906 - 11905: 0xC89B, - 33907 - 11905: 0xDDDA, - 33908 - 11905: 0xC89C, - 33909 - 11905: 0xBFFB, - 33910 - 11905: 0xDDE3, - 33911 - 11905: 0xC89D, - 33912 - 11905: 0xDDDF, - 33913 - 11905: 0xC89E, - 33914 - 11905: 0xDDDD, - 33915 - 11905: 0xC89F, - 33916 - 11905: 0xC8A0, - 33917 - 11905: 0xC940, - 33918 - 11905: 0xC941, - 33919 - 11905: 0xC942, - 33920 - 11905: 0xC943, - 33921 - 11905: 0xC944, - 33922 - 11905: 0xB5D9, - 33923 - 11905: 0xC945, - 33924 - 11905: 0xC946, - 33925 - 11905: 0xC947, - 33926 - 11905: 0xC948, - 33927 - 11905: 0xDDDB, - 33928 - 11905: 0xDDDC, - 33929 - 11905: 0xDDDE, - 33930 - 11905: 0xC949, - 33931 - 11905: 0xBDAF, - 33932 - 11905: 0xDDE4, - 33933 - 11905: 0xC94A, - 33934 - 11905: 0xDDE5, - 33935 - 11905: 0xC94B, - 33936 - 11905: 0xC94C, - 33937 - 11905: 0xC94D, - 33938 - 11905: 0xC94E, - 33939 - 11905: 0xC94F, - 33940 - 11905: 0xC950, - 33941 - 11905: 0xC951, - 33942 - 11905: 0xC952, - 33943 - 11905: 0xDDF5, - 33944 - 11905: 0xC953, - 33945 - 11905: 0xC3C9, - 33946 - 11905: 0xC954, - 33947 - 11905: 0xC955, - 33948 - 11905: 0xCBE2, - 33949 - 11905: 0xC956, - 33950 - 11905: 0xC957, - 33951 - 11905: 0xC958, - 33952 - 11905: 0xC959, - 33953 - 11905: 0xDDF2, - 33954 - 11905: 0xC95A, - 33955 - 11905: 0xC95B, - 33956 - 11905: 0xC95C, - 33957 - 11905: 0xC95D, - 33958 - 11905: 0xC95E, - 33959 - 11905: 0xC95F, - 33960 - 11905: 0xC960, - 33961 - 11905: 0xC961, - 33962 - 11905: 0xC962, - 33963 - 11905: 0xC963, - 33964 - 11905: 0xC964, - 33965 - 11905: 0xC965, - 33966 - 11905: 0xC966, - 33967 - 11905: 0xD8E1, - 33968 - 11905: 0xC967, - 33969 - 11905: 0xC968, - 33970 - 11905: 0xC6D1, - 33971 - 11905: 0xC969, - 33972 - 11905: 0xDDF4, - 33973 - 11905: 0xC96A, - 33974 - 11905: 0xC96B, - 33975 - 11905: 0xC96C, - 33976 - 11905: 0xD5F4, - 33977 - 11905: 0xDDF3, - 33978 - 11905: 0xDDF0, - 33979 - 11905: 0xC96D, - 33980 - 11905: 0xC96E, - 33981 - 11905: 0xDDEC, - 33982 - 11905: 0xC96F, - 33983 - 11905: 0xDDEF, - 33984 - 11905: 0xC970, - 33985 - 11905: 0xDDE8, - 33986 - 11905: 0xC971, - 33987 - 11905: 0xC972, - 33988 - 11905: 0xD0EE, - 33989 - 11905: 0xC973, - 33990 - 11905: 0xC974, - 33991 - 11905: 0xC975, - 33992 - 11905: 0xC976, - 33993 - 11905: 0xC8D8, - 33994 - 11905: 0xDDEE, - 33995 - 11905: 0xC977, - 33996 - 11905: 0xC978, - 33997 - 11905: 0xDDE9, - 33998 - 11905: 0xC979, - 33999 - 11905: 0xC97A, - 34000 - 11905: 0xDDEA, - 34001 - 11905: 0xCBF2, - 34002 - 11905: 0xC97B, - 34003 - 11905: 0xDDED, - 34004 - 11905: 0xC97C, - 34005 - 11905: 0xC97D, - 34006 - 11905: 0xB1CD, - 34007 - 11905: 0xC97E, - 34008 - 11905: 0xC980, - 34009 - 11905: 0xC981, - 34010 - 11905: 0xC982, - 34011 - 11905: 0xC983, - 34012 - 11905: 0xC984, - 34013 - 11905: 0xC0B6, - 34014 - 11905: 0xC985, - 34015 - 11905: 0xBCBB, - 34016 - 11905: 0xDDF1, - 34017 - 11905: 0xC986, - 34018 - 11905: 0xC987, - 34019 - 11905: 0xDDF7, - 34020 - 11905: 0xC988, - 34021 - 11905: 0xDDF6, - 34022 - 11905: 0xDDEB, - 34023 - 11905: 0xC989, - 34024 - 11905: 0xC98A, - 34025 - 11905: 0xC98B, - 34026 - 11905: 0xC98C, - 34027 - 11905: 0xC98D, - 34028 - 11905: 0xC5EE, - 34029 - 11905: 0xC98E, - 34030 - 11905: 0xC98F, - 34031 - 11905: 0xC990, - 34032 - 11905: 0xDDFB, - 34033 - 11905: 0xC991, - 34034 - 11905: 0xC992, - 34035 - 11905: 0xC993, - 34036 - 11905: 0xC994, - 34037 - 11905: 0xC995, - 34038 - 11905: 0xC996, - 34039 - 11905: 0xC997, - 34040 - 11905: 0xC998, - 34041 - 11905: 0xC999, - 34042 - 11905: 0xC99A, - 34043 - 11905: 0xC99B, - 34044 - 11905: 0xDEA4, - 34045 - 11905: 0xC99C, - 34046 - 11905: 0xC99D, - 34047 - 11905: 0xDEA3, - 34048 - 11905: 0xC99E, - 34049 - 11905: 0xC99F, - 34050 - 11905: 0xC9A0, - 34051 - 11905: 0xCA40, - 34052 - 11905: 0xCA41, - 34053 - 11905: 0xCA42, - 34054 - 11905: 0xCA43, - 34055 - 11905: 0xCA44, - 34056 - 11905: 0xCA45, - 34057 - 11905: 0xCA46, - 34058 - 11905: 0xCA47, - 34059 - 11905: 0xCA48, - 34060 - 11905: 0xDDF8, - 34061 - 11905: 0xCA49, - 34062 - 11905: 0xCA4A, - 34063 - 11905: 0xCA4B, - 34064 - 11905: 0xCA4C, - 34065 - 11905: 0xC3EF, - 34066 - 11905: 0xCA4D, - 34067 - 11905: 0xC2FB, - 34068 - 11905: 0xCA4E, - 34069 - 11905: 0xCA4F, - 34070 - 11905: 0xCA50, - 34071 - 11905: 0xD5E1, - 34072 - 11905: 0xCA51, - 34073 - 11905: 0xCA52, - 34074 - 11905: 0xCEB5, - 34075 - 11905: 0xCA53, - 34076 - 11905: 0xCA54, - 34077 - 11905: 0xCA55, - 34078 - 11905: 0xCA56, - 34079 - 11905: 0xDDFD, - 34080 - 11905: 0xCA57, - 34081 - 11905: 0xB2CC, - 34082 - 11905: 0xCA58, - 34083 - 11905: 0xCA59, - 34084 - 11905: 0xCA5A, - 34085 - 11905: 0xCA5B, - 34086 - 11905: 0xCA5C, - 34087 - 11905: 0xCA5D, - 34088 - 11905: 0xCA5E, - 34089 - 11905: 0xCA5F, - 34090 - 11905: 0xCA60, - 34091 - 11905: 0xC4E8, - 34092 - 11905: 0xCADF, - 34093 - 11905: 0xCA61, - 34094 - 11905: 0xCA62, - 34095 - 11905: 0xCA63, - 34096 - 11905: 0xCA64, - 34097 - 11905: 0xCA65, - 34098 - 11905: 0xCA66, - 34099 - 11905: 0xCA67, - 34100 - 11905: 0xCA68, - 34101 - 11905: 0xCA69, - 34102 - 11905: 0xCA6A, - 34103 - 11905: 0xC7BE, - 34104 - 11905: 0xDDFA, - 34105 - 11905: 0xDDFC, - 34106 - 11905: 0xDDFE, - 34107 - 11905: 0xDEA2, - 34108 - 11905: 0xB0AA, - 34109 - 11905: 0xB1CE, - 34110 - 11905: 0xCA6B, - 34111 - 11905: 0xCA6C, - 34112 - 11905: 0xCA6D, - 34113 - 11905: 0xCA6E, - 34114 - 11905: 0xCA6F, - 34115 - 11905: 0xDEAC, - 34116 - 11905: 0xCA70, - 34117 - 11905: 0xCA71, - 34118 - 11905: 0xCA72, - 34119 - 11905: 0xCA73, - 34120 - 11905: 0xDEA6, - 34121 - 11905: 0xBDB6, - 34122 - 11905: 0xC8EF, - 34123 - 11905: 0xCA74, - 34124 - 11905: 0xCA75, - 34125 - 11905: 0xCA76, - 34126 - 11905: 0xCA77, - 34127 - 11905: 0xCA78, - 34128 - 11905: 0xCA79, - 34129 - 11905: 0xCA7A, - 34130 - 11905: 0xCA7B, - 34131 - 11905: 0xCA7C, - 34132 - 11905: 0xCA7D, - 34133 - 11905: 0xCA7E, - 34134 - 11905: 0xDEA1, - 34135 - 11905: 0xCA80, - 34136 - 11905: 0xCA81, - 34137 - 11905: 0xDEA5, - 34138 - 11905: 0xCA82, - 34139 - 11905: 0xCA83, - 34140 - 11905: 0xCA84, - 34141 - 11905: 0xCA85, - 34142 - 11905: 0xDEA9, - 34143 - 11905: 0xCA86, - 34144 - 11905: 0xCA87, - 34145 - 11905: 0xCA88, - 34146 - 11905: 0xCA89, - 34147 - 11905: 0xCA8A, - 34148 - 11905: 0xDEA8, - 34149 - 11905: 0xCA8B, - 34150 - 11905: 0xCA8C, - 34151 - 11905: 0xCA8D, - 34152 - 11905: 0xDEA7, - 34153 - 11905: 0xCA8E, - 34154 - 11905: 0xCA8F, - 34155 - 11905: 0xCA90, - 34156 - 11905: 0xCA91, - 34157 - 11905: 0xCA92, - 34158 - 11905: 0xCA93, - 34159 - 11905: 0xCA94, - 34160 - 11905: 0xCA95, - 34161 - 11905: 0xCA96, - 34162 - 11905: 0xDEAD, - 34163 - 11905: 0xCA97, - 34164 - 11905: 0xD4CC, - 34165 - 11905: 0xCA98, - 34166 - 11905: 0xCA99, - 34167 - 11905: 0xCA9A, - 34168 - 11905: 0xCA9B, - 34169 - 11905: 0xDEB3, - 34170 - 11905: 0xDEAA, - 34171 - 11905: 0xDEAE, - 34172 - 11905: 0xCA9C, - 34173 - 11905: 0xCA9D, - 34174 - 11905: 0xC0D9, - 34175 - 11905: 0xCA9E, - 34176 - 11905: 0xCA9F, - 34177 - 11905: 0xCAA0, - 34178 - 11905: 0xCB40, - 34179 - 11905: 0xCB41, - 34180 - 11905: 0xB1A1, - 34181 - 11905: 0xDEB6, - 34182 - 11905: 0xCB42, - 34183 - 11905: 0xDEB1, - 34184 - 11905: 0xCB43, - 34185 - 11905: 0xCB44, - 34186 - 11905: 0xCB45, - 34187 - 11905: 0xCB46, - 34188 - 11905: 0xCB47, - 34189 - 11905: 0xCB48, - 34190 - 11905: 0xCB49, - 34191 - 11905: 0xDEB2, - 34192 - 11905: 0xCB4A, - 34193 - 11905: 0xCB4B, - 34194 - 11905: 0xCB4C, - 34195 - 11905: 0xCB4D, - 34196 - 11905: 0xCB4E, - 34197 - 11905: 0xCB4F, - 34198 - 11905: 0xCB50, - 34199 - 11905: 0xCB51, - 34200 - 11905: 0xCB52, - 34201 - 11905: 0xCB53, - 34202 - 11905: 0xCB54, - 34203 - 11905: 0xD1A6, - 34204 - 11905: 0xDEB5, - 34205 - 11905: 0xCB55, - 34206 - 11905: 0xCB56, - 34207 - 11905: 0xCB57, - 34208 - 11905: 0xCB58, - 34209 - 11905: 0xCB59, - 34210 - 11905: 0xCB5A, - 34211 - 11905: 0xCB5B, - 34212 - 11905: 0xDEAF, - 34213 - 11905: 0xCB5C, - 34214 - 11905: 0xCB5D, - 34215 - 11905: 0xCB5E, - 34216 - 11905: 0xDEB0, - 34217 - 11905: 0xCB5F, - 34218 - 11905: 0xD0BD, - 34219 - 11905: 0xCB60, - 34220 - 11905: 0xCB61, - 34221 - 11905: 0xCB62, - 34222 - 11905: 0xDEB4, - 34223 - 11905: 0xCAED, - 34224 - 11905: 0xDEB9, - 34225 - 11905: 0xCB63, - 34226 - 11905: 0xCB64, - 34227 - 11905: 0xCB65, - 34228 - 11905: 0xCB66, - 34229 - 11905: 0xCB67, - 34230 - 11905: 0xCB68, - 34231 - 11905: 0xDEB8, - 34232 - 11905: 0xCB69, - 34233 - 11905: 0xDEB7, - 34234 - 11905: 0xCB6A, - 34235 - 11905: 0xCB6B, - 34236 - 11905: 0xCB6C, - 34237 - 11905: 0xCB6D, - 34238 - 11905: 0xCB6E, - 34239 - 11905: 0xCB6F, - 34240 - 11905: 0xCB70, - 34241 - 11905: 0xDEBB, - 34242 - 11905: 0xCB71, - 34243 - 11905: 0xCB72, - 34244 - 11905: 0xCB73, - 34245 - 11905: 0xCB74, - 34246 - 11905: 0xCB75, - 34247 - 11905: 0xCB76, - 34248 - 11905: 0xCB77, - 34249 - 11905: 0xBDE5, - 34250 - 11905: 0xCB78, - 34251 - 11905: 0xCB79, - 34252 - 11905: 0xCB7A, - 34253 - 11905: 0xCB7B, - 34254 - 11905: 0xCB7C, - 34255 - 11905: 0xB2D8, - 34256 - 11905: 0xC3EA, - 34257 - 11905: 0xCB7D, - 34258 - 11905: 0xCB7E, - 34259 - 11905: 0xDEBA, - 34260 - 11905: 0xCB80, - 34261 - 11905: 0xC5BA, - 34262 - 11905: 0xCB81, - 34263 - 11905: 0xCB82, - 34264 - 11905: 0xCB83, - 34265 - 11905: 0xCB84, - 34266 - 11905: 0xCB85, - 34267 - 11905: 0xCB86, - 34268 - 11905: 0xDEBC, - 34269 - 11905: 0xCB87, - 34270 - 11905: 0xCB88, - 34271 - 11905: 0xCB89, - 34272 - 11905: 0xCB8A, - 34273 - 11905: 0xCB8B, - 34274 - 11905: 0xCB8C, - 34275 - 11905: 0xCB8D, - 34276 - 11905: 0xCCD9, - 34277 - 11905: 0xCB8E, - 34278 - 11905: 0xCB8F, - 34279 - 11905: 0xCB90, - 34280 - 11905: 0xCB91, - 34281 - 11905: 0xB7AA, - 34282 - 11905: 0xCB92, - 34283 - 11905: 0xCB93, - 34284 - 11905: 0xCB94, - 34285 - 11905: 0xCB95, - 34286 - 11905: 0xCB96, - 34287 - 11905: 0xCB97, - 34288 - 11905: 0xCB98, - 34289 - 11905: 0xCB99, - 34290 - 11905: 0xCB9A, - 34291 - 11905: 0xCB9B, - 34292 - 11905: 0xCB9C, - 34293 - 11905: 0xCB9D, - 34294 - 11905: 0xCB9E, - 34295 - 11905: 0xCB9F, - 34296 - 11905: 0xCBA0, - 34297 - 11905: 0xCC40, - 34298 - 11905: 0xCC41, - 34299 - 11905: 0xD4E5, - 34300 - 11905: 0xCC42, - 34301 - 11905: 0xCC43, - 34302 - 11905: 0xCC44, - 34303 - 11905: 0xDEBD, - 34304 - 11905: 0xCC45, - 34305 - 11905: 0xCC46, - 34306 - 11905: 0xCC47, - 34307 - 11905: 0xCC48, - 34308 - 11905: 0xCC49, - 34309 - 11905: 0xDEBF, - 34310 - 11905: 0xCC4A, - 34311 - 11905: 0xCC4B, - 34312 - 11905: 0xCC4C, - 34313 - 11905: 0xCC4D, - 34314 - 11905: 0xCC4E, - 34315 - 11905: 0xCC4F, - 34316 - 11905: 0xCC50, - 34317 - 11905: 0xCC51, - 34318 - 11905: 0xCC52, - 34319 - 11905: 0xCC53, - 34320 - 11905: 0xCC54, - 34321 - 11905: 0xC4A2, - 34322 - 11905: 0xCC55, - 34323 - 11905: 0xCC56, - 34324 - 11905: 0xCC57, - 34325 - 11905: 0xCC58, - 34326 - 11905: 0xDEC1, - 34327 - 11905: 0xCC59, - 34328 - 11905: 0xCC5A, - 34329 - 11905: 0xCC5B, - 34330 - 11905: 0xCC5C, - 34331 - 11905: 0xCC5D, - 34332 - 11905: 0xCC5E, - 34333 - 11905: 0xCC5F, - 34334 - 11905: 0xCC60, - 34335 - 11905: 0xCC61, - 34336 - 11905: 0xCC62, - 34337 - 11905: 0xCC63, - 34338 - 11905: 0xCC64, - 34339 - 11905: 0xCC65, - 34340 - 11905: 0xCC66, - 34341 - 11905: 0xCC67, - 34342 - 11905: 0xCC68, - 34343 - 11905: 0xDEBE, - 34344 - 11905: 0xCC69, - 34345 - 11905: 0xDEC0, - 34346 - 11905: 0xCC6A, - 34347 - 11905: 0xCC6B, - 34348 - 11905: 0xCC6C, - 34349 - 11905: 0xCC6D, - 34350 - 11905: 0xCC6E, - 34351 - 11905: 0xCC6F, - 34352 - 11905: 0xCC70, - 34353 - 11905: 0xCC71, - 34354 - 11905: 0xCC72, - 34355 - 11905: 0xCC73, - 34356 - 11905: 0xCC74, - 34357 - 11905: 0xCC75, - 34358 - 11905: 0xCC76, - 34359 - 11905: 0xCC77, - 34360 - 11905: 0xD5BA, - 34361 - 11905: 0xCC78, - 34362 - 11905: 0xCC79, - 34363 - 11905: 0xCC7A, - 34364 - 11905: 0xDEC2, - 34365 - 11905: 0xCC7B, - 34366 - 11905: 0xCC7C, - 34367 - 11905: 0xCC7D, - 34368 - 11905: 0xCC7E, - 34369 - 11905: 0xCC80, - 34370 - 11905: 0xCC81, - 34371 - 11905: 0xCC82, - 34372 - 11905: 0xCC83, - 34373 - 11905: 0xCC84, - 34374 - 11905: 0xCC85, - 34375 - 11905: 0xCC86, - 34376 - 11905: 0xCC87, - 34377 - 11905: 0xCC88, - 34378 - 11905: 0xCC89, - 34379 - 11905: 0xCC8A, - 34380 - 11905: 0xCC8B, - 34381 - 11905: 0xF2AE, - 34382 - 11905: 0xBBA2, - 34383 - 11905: 0xC2B2, - 34384 - 11905: 0xC5B0, - 34385 - 11905: 0xC2C7, - 34386 - 11905: 0xCC8C, - 34387 - 11905: 0xCC8D, - 34388 - 11905: 0xF2AF, - 34389 - 11905: 0xCC8E, - 34390 - 11905: 0xCC8F, - 34391 - 11905: 0xCC90, - 34392 - 11905: 0xCC91, - 34393 - 11905: 0xCC92, - 34394 - 11905: 0xD0E9, - 34395 - 11905: 0xCC93, - 34396 - 11905: 0xCC94, - 34397 - 11905: 0xCC95, - 34398 - 11905: 0xD3DD, - 34399 - 11905: 0xCC96, - 34400 - 11905: 0xCC97, - 34401 - 11905: 0xCC98, - 34402 - 11905: 0xEBBD, - 34403 - 11905: 0xCC99, - 34404 - 11905: 0xCC9A, - 34405 - 11905: 0xCC9B, - 34406 - 11905: 0xCC9C, - 34407 - 11905: 0xCC9D, - 34408 - 11905: 0xCC9E, - 34409 - 11905: 0xCC9F, - 34410 - 11905: 0xCCA0, - 34411 - 11905: 0xB3E6, - 34412 - 11905: 0xF2B0, - 34413 - 11905: 0xCD40, - 34414 - 11905: 0xF2B1, - 34415 - 11905: 0xCD41, - 34416 - 11905: 0xCD42, - 34417 - 11905: 0xCAAD, - 34418 - 11905: 0xCD43, - 34419 - 11905: 0xCD44, - 34420 - 11905: 0xCD45, - 34421 - 11905: 0xCD46, - 34422 - 11905: 0xCD47, - 34423 - 11905: 0xCD48, - 34424 - 11905: 0xCD49, - 34425 - 11905: 0xBAE7, - 34426 - 11905: 0xF2B3, - 34427 - 11905: 0xF2B5, - 34428 - 11905: 0xF2B4, - 34429 - 11905: 0xCBE4, - 34430 - 11905: 0xCFBA, - 34431 - 11905: 0xF2B2, - 34432 - 11905: 0xCAB4, - 34433 - 11905: 0xD2CF, - 34434 - 11905: 0xC2EC, - 34435 - 11905: 0xCD4A, - 34436 - 11905: 0xCD4B, - 34437 - 11905: 0xCD4C, - 34438 - 11905: 0xCD4D, - 34439 - 11905: 0xCD4E, - 34440 - 11905: 0xCD4F, - 34441 - 11905: 0xCD50, - 34442 - 11905: 0xCEC3, - 34443 - 11905: 0xF2B8, - 34444 - 11905: 0xB0F6, - 34445 - 11905: 0xF2B7, - 34446 - 11905: 0xCD51, - 34447 - 11905: 0xCD52, - 34448 - 11905: 0xCD53, - 34449 - 11905: 0xCD54, - 34450 - 11905: 0xCD55, - 34451 - 11905: 0xF2BE, - 34452 - 11905: 0xCD56, - 34453 - 11905: 0xB2CF, - 34454 - 11905: 0xCD57, - 34455 - 11905: 0xCD58, - 34456 - 11905: 0xCD59, - 34457 - 11905: 0xCD5A, - 34458 - 11905: 0xCD5B, - 34459 - 11905: 0xCD5C, - 34460 - 11905: 0xD1C1, - 34461 - 11905: 0xF2BA, - 34462 - 11905: 0xCD5D, - 34463 - 11905: 0xCD5E, - 34464 - 11905: 0xCD5F, - 34465 - 11905: 0xCD60, - 34466 - 11905: 0xCD61, - 34467 - 11905: 0xF2BC, - 34468 - 11905: 0xD4E9, - 34469 - 11905: 0xCD62, - 34470 - 11905: 0xCD63, - 34471 - 11905: 0xF2BB, - 34472 - 11905: 0xF2B6, - 34473 - 11905: 0xF2BF, - 34474 - 11905: 0xF2BD, - 34475 - 11905: 0xCD64, - 34476 - 11905: 0xF2B9, - 34477 - 11905: 0xCD65, - 34478 - 11905: 0xCD66, - 34479 - 11905: 0xF2C7, - 34480 - 11905: 0xF2C4, - 34481 - 11905: 0xF2C6, - 34482 - 11905: 0xCD67, - 34483 - 11905: 0xCD68, - 34484 - 11905: 0xF2CA, - 34485 - 11905: 0xF2C2, - 34486 - 11905: 0xF2C0, - 34487 - 11905: 0xCD69, - 34488 - 11905: 0xCD6A, - 34489 - 11905: 0xCD6B, - 34490 - 11905: 0xF2C5, - 34491 - 11905: 0xCD6C, - 34492 - 11905: 0xCD6D, - 34493 - 11905: 0xCD6E, - 34494 - 11905: 0xCD6F, - 34495 - 11905: 0xCD70, - 34496 - 11905: 0xD6FB, - 34497 - 11905: 0xCD71, - 34498 - 11905: 0xCD72, - 34499 - 11905: 0xCD73, - 34500 - 11905: 0xF2C1, - 34501 - 11905: 0xCD74, - 34502 - 11905: 0xC7F9, - 34503 - 11905: 0xC9DF, - 34504 - 11905: 0xCD75, - 34505 - 11905: 0xF2C8, - 34506 - 11905: 0xB9C6, - 34507 - 11905: 0xB5B0, - 34508 - 11905: 0xCD76, - 34509 - 11905: 0xCD77, - 34510 - 11905: 0xF2C3, - 34511 - 11905: 0xF2C9, - 34512 - 11905: 0xF2D0, - 34513 - 11905: 0xF2D6, - 34514 - 11905: 0xCD78, - 34515 - 11905: 0xCD79, - 34516 - 11905: 0xBBD7, - 34517 - 11905: 0xCD7A, - 34518 - 11905: 0xCD7B, - 34519 - 11905: 0xCD7C, - 34520 - 11905: 0xF2D5, - 34521 - 11905: 0xCDDC, - 34522 - 11905: 0xCD7D, - 34523 - 11905: 0xD6EB, - 34524 - 11905: 0xCD7E, - 34525 - 11905: 0xCD80, - 34526 - 11905: 0xF2D2, - 34527 - 11905: 0xF2D4, - 34528 - 11905: 0xCD81, - 34529 - 11905: 0xCD82, - 34530 - 11905: 0xCD83, - 34531 - 11905: 0xCD84, - 34532 - 11905: 0xB8F2, - 34533 - 11905: 0xCD85, - 34534 - 11905: 0xCD86, - 34535 - 11905: 0xCD87, - 34536 - 11905: 0xCD88, - 34537 - 11905: 0xF2CB, - 34538 - 11905: 0xCD89, - 34539 - 11905: 0xCD8A, - 34540 - 11905: 0xCD8B, - 34541 - 11905: 0xF2CE, - 34542 - 11905: 0xC2F9, - 34543 - 11905: 0xCD8C, - 34544 - 11905: 0xD5DD, - 34545 - 11905: 0xF2CC, - 34546 - 11905: 0xF2CD, - 34547 - 11905: 0xF2CF, - 34548 - 11905: 0xF2D3, - 34549 - 11905: 0xCD8D, - 34550 - 11905: 0xCD8E, - 34551 - 11905: 0xCD8F, - 34552 - 11905: 0xF2D9, - 34553 - 11905: 0xD3BC, - 34554 - 11905: 0xCD90, - 34555 - 11905: 0xCD91, - 34556 - 11905: 0xCD92, - 34557 - 11905: 0xCD93, - 34558 - 11905: 0xB6EA, - 34559 - 11905: 0xCD94, - 34560 - 11905: 0xCAF1, - 34561 - 11905: 0xCD95, - 34562 - 11905: 0xB7E4, - 34563 - 11905: 0xF2D7, - 34564 - 11905: 0xCD96, - 34565 - 11905: 0xCD97, - 34566 - 11905: 0xCD98, - 34567 - 11905: 0xF2D8, - 34568 - 11905: 0xF2DA, - 34569 - 11905: 0xF2DD, - 34570 - 11905: 0xF2DB, - 34571 - 11905: 0xCD99, - 34572 - 11905: 0xCD9A, - 34573 - 11905: 0xF2DC, - 34574 - 11905: 0xCD9B, - 34575 - 11905: 0xCD9C, - 34576 - 11905: 0xCD9D, - 34577 - 11905: 0xCD9E, - 34578 - 11905: 0xD1D1, - 34579 - 11905: 0xF2D1, - 34580 - 11905: 0xCD9F, - 34581 - 11905: 0xCDC9, - 34582 - 11905: 0xCDA0, - 34583 - 11905: 0xCECF, - 34584 - 11905: 0xD6A9, - 34585 - 11905: 0xCE40, - 34586 - 11905: 0xF2E3, - 34587 - 11905: 0xCE41, - 34588 - 11905: 0xC3DB, - 34589 - 11905: 0xCE42, - 34590 - 11905: 0xF2E0, - 34591 - 11905: 0xCE43, - 34592 - 11905: 0xCE44, - 34593 - 11905: 0xC0AF, - 34594 - 11905: 0xF2EC, - 34595 - 11905: 0xF2DE, - 34596 - 11905: 0xCE45, - 34597 - 11905: 0xF2E1, - 34598 - 11905: 0xCE46, - 34599 - 11905: 0xCE47, - 34600 - 11905: 0xCE48, - 34601 - 11905: 0xF2E8, - 34602 - 11905: 0xCE49, - 34603 - 11905: 0xCE4A, - 34604 - 11905: 0xCE4B, - 34605 - 11905: 0xCE4C, - 34606 - 11905: 0xF2E2, - 34607 - 11905: 0xCE4D, - 34608 - 11905: 0xCE4E, - 34609 - 11905: 0xF2E7, - 34610 - 11905: 0xCE4F, - 34611 - 11905: 0xCE50, - 34612 - 11905: 0xF2E6, - 34613 - 11905: 0xCE51, - 34614 - 11905: 0xCE52, - 34615 - 11905: 0xF2E9, - 34616 - 11905: 0xCE53, - 34617 - 11905: 0xCE54, - 34618 - 11905: 0xCE55, - 34619 - 11905: 0xF2DF, - 34620 - 11905: 0xCE56, - 34621 - 11905: 0xCE57, - 34622 - 11905: 0xF2E4, - 34623 - 11905: 0xF2EA, - 34624 - 11905: 0xCE58, - 34625 - 11905: 0xCE59, - 34626 - 11905: 0xCE5A, - 34627 - 11905: 0xCE5B, - 34628 - 11905: 0xCE5C, - 34629 - 11905: 0xCE5D, - 34630 - 11905: 0xCE5E, - 34631 - 11905: 0xD3AC, - 34632 - 11905: 0xF2E5, - 34633 - 11905: 0xB2F5, - 34634 - 11905: 0xCE5F, - 34635 - 11905: 0xCE60, - 34636 - 11905: 0xF2F2, - 34637 - 11905: 0xCE61, - 34638 - 11905: 0xD0AB, - 34639 - 11905: 0xCE62, - 34640 - 11905: 0xCE63, - 34641 - 11905: 0xCE64, - 34642 - 11905: 0xCE65, - 34643 - 11905: 0xF2F5, - 34644 - 11905: 0xCE66, - 34645 - 11905: 0xCE67, - 34646 - 11905: 0xCE68, - 34647 - 11905: 0xBBC8, - 34648 - 11905: 0xCE69, - 34649 - 11905: 0xF2F9, - 34650 - 11905: 0xCE6A, - 34651 - 11905: 0xCE6B, - 34652 - 11905: 0xCE6C, - 34653 - 11905: 0xCE6D, - 34654 - 11905: 0xCE6E, - 34655 - 11905: 0xCE6F, - 34656 - 11905: 0xF2F0, - 34657 - 11905: 0xCE70, - 34658 - 11905: 0xCE71, - 34659 - 11905: 0xF2F6, - 34660 - 11905: 0xF2F8, - 34661 - 11905: 0xF2FA, - 34662 - 11905: 0xCE72, - 34663 - 11905: 0xCE73, - 34664 - 11905: 0xCE74, - 34665 - 11905: 0xCE75, - 34666 - 11905: 0xCE76, - 34667 - 11905: 0xCE77, - 34668 - 11905: 0xCE78, - 34669 - 11905: 0xCE79, - 34670 - 11905: 0xF2F3, - 34671 - 11905: 0xCE7A, - 34672 - 11905: 0xF2F1, - 34673 - 11905: 0xCE7B, - 34674 - 11905: 0xCE7C, - 34675 - 11905: 0xCE7D, - 34676 - 11905: 0xBAFB, - 34677 - 11905: 0xCE7E, - 34678 - 11905: 0xB5FB, - 34679 - 11905: 0xCE80, - 34680 - 11905: 0xCE81, - 34681 - 11905: 0xCE82, - 34682 - 11905: 0xCE83, - 34683 - 11905: 0xF2EF, - 34684 - 11905: 0xF2F7, - 34685 - 11905: 0xF2ED, - 34686 - 11905: 0xF2EE, - 34687 - 11905: 0xCE84, - 34688 - 11905: 0xCE85, - 34689 - 11905: 0xCE86, - 34690 - 11905: 0xF2EB, - 34691 - 11905: 0xF3A6, - 34692 - 11905: 0xCE87, - 34693 - 11905: 0xF3A3, - 34694 - 11905: 0xCE88, - 34695 - 11905: 0xCE89, - 34696 - 11905: 0xF3A2, - 34697 - 11905: 0xCE8A, - 34698 - 11905: 0xCE8B, - 34699 - 11905: 0xF2F4, - 34700 - 11905: 0xCE8C, - 34701 - 11905: 0xC8DA, - 34702 - 11905: 0xCE8D, - 34703 - 11905: 0xCE8E, - 34704 - 11905: 0xCE8F, - 34705 - 11905: 0xCE90, - 34706 - 11905: 0xCE91, - 34707 - 11905: 0xF2FB, - 34708 - 11905: 0xCE92, - 34709 - 11905: 0xCE93, - 34710 - 11905: 0xCE94, - 34711 - 11905: 0xF3A5, - 34712 - 11905: 0xCE95, - 34713 - 11905: 0xCE96, - 34714 - 11905: 0xCE97, - 34715 - 11905: 0xCE98, - 34716 - 11905: 0xCE99, - 34717 - 11905: 0xCE9A, - 34718 - 11905: 0xCE9B, - 34719 - 11905: 0xC3F8, - 34720 - 11905: 0xCE9C, - 34721 - 11905: 0xCE9D, - 34722 - 11905: 0xCE9E, - 34723 - 11905: 0xCE9F, - 34724 - 11905: 0xCEA0, - 34725 - 11905: 0xCF40, - 34726 - 11905: 0xCF41, - 34727 - 11905: 0xCF42, - 34728 - 11905: 0xF2FD, - 34729 - 11905: 0xCF43, - 34730 - 11905: 0xCF44, - 34731 - 11905: 0xF3A7, - 34732 - 11905: 0xF3A9, - 34733 - 11905: 0xF3A4, - 34734 - 11905: 0xCF45, - 34735 - 11905: 0xF2FC, - 34736 - 11905: 0xCF46, - 34737 - 11905: 0xCF47, - 34738 - 11905: 0xCF48, - 34739 - 11905: 0xF3AB, - 34740 - 11905: 0xCF49, - 34741 - 11905: 0xF3AA, - 34742 - 11905: 0xCF4A, - 34743 - 11905: 0xCF4B, - 34744 - 11905: 0xCF4C, - 34745 - 11905: 0xCF4D, - 34746 - 11905: 0xC2DD, - 34747 - 11905: 0xCF4E, - 34748 - 11905: 0xCF4F, - 34749 - 11905: 0xF3AE, - 34750 - 11905: 0xCF50, - 34751 - 11905: 0xCF51, - 34752 - 11905: 0xF3B0, - 34753 - 11905: 0xCF52, - 34754 - 11905: 0xCF53, - 34755 - 11905: 0xCF54, - 34756 - 11905: 0xCF55, - 34757 - 11905: 0xCF56, - 34758 - 11905: 0xF3A1, - 34759 - 11905: 0xCF57, - 34760 - 11905: 0xCF58, - 34761 - 11905: 0xCF59, - 34762 - 11905: 0xF3B1, - 34763 - 11905: 0xF3AC, - 34764 - 11905: 0xCF5A, - 34765 - 11905: 0xCF5B, - 34766 - 11905: 0xCF5C, - 34767 - 11905: 0xCF5D, - 34768 - 11905: 0xCF5E, - 34769 - 11905: 0xF3AF, - 34770 - 11905: 0xF2FE, - 34771 - 11905: 0xF3AD, - 34772 - 11905: 0xCF5F, - 34773 - 11905: 0xCF60, - 34774 - 11905: 0xCF61, - 34775 - 11905: 0xCF62, - 34776 - 11905: 0xCF63, - 34777 - 11905: 0xCF64, - 34778 - 11905: 0xCF65, - 34779 - 11905: 0xF3B2, - 34780 - 11905: 0xCF66, - 34781 - 11905: 0xCF67, - 34782 - 11905: 0xCF68, - 34783 - 11905: 0xCF69, - 34784 - 11905: 0xF3B4, - 34785 - 11905: 0xCF6A, - 34786 - 11905: 0xCF6B, - 34787 - 11905: 0xCF6C, - 34788 - 11905: 0xCF6D, - 34789 - 11905: 0xF3A8, - 34790 - 11905: 0xCF6E, - 34791 - 11905: 0xCF6F, - 34792 - 11905: 0xCF70, - 34793 - 11905: 0xCF71, - 34794 - 11905: 0xF3B3, - 34795 - 11905: 0xCF72, - 34796 - 11905: 0xCF73, - 34797 - 11905: 0xCF74, - 34798 - 11905: 0xF3B5, - 34799 - 11905: 0xCF75, - 34800 - 11905: 0xCF76, - 34801 - 11905: 0xCF77, - 34802 - 11905: 0xCF78, - 34803 - 11905: 0xCF79, - 34804 - 11905: 0xCF7A, - 34805 - 11905: 0xCF7B, - 34806 - 11905: 0xCF7C, - 34807 - 11905: 0xCF7D, - 34808 - 11905: 0xCF7E, - 34809 - 11905: 0xD0B7, - 34810 - 11905: 0xCF80, - 34811 - 11905: 0xCF81, - 34812 - 11905: 0xCF82, - 34813 - 11905: 0xCF83, - 34814 - 11905: 0xF3B8, - 34815 - 11905: 0xCF84, - 34816 - 11905: 0xCF85, - 34817 - 11905: 0xCF86, - 34818 - 11905: 0xCF87, - 34819 - 11905: 0xD9F9, - 34820 - 11905: 0xCF88, - 34821 - 11905: 0xCF89, - 34822 - 11905: 0xCF8A, - 34823 - 11905: 0xCF8B, - 34824 - 11905: 0xCF8C, - 34825 - 11905: 0xCF8D, - 34826 - 11905: 0xF3B9, - 34827 - 11905: 0xCF8E, - 34828 - 11905: 0xCF8F, - 34829 - 11905: 0xCF90, - 34830 - 11905: 0xCF91, - 34831 - 11905: 0xCF92, - 34832 - 11905: 0xCF93, - 34833 - 11905: 0xCF94, - 34834 - 11905: 0xCF95, - 34835 - 11905: 0xF3B7, - 34836 - 11905: 0xCF96, - 34837 - 11905: 0xC8E4, - 34838 - 11905: 0xF3B6, - 34839 - 11905: 0xCF97, - 34840 - 11905: 0xCF98, - 34841 - 11905: 0xCF99, - 34842 - 11905: 0xCF9A, - 34843 - 11905: 0xF3BA, - 34844 - 11905: 0xCF9B, - 34845 - 11905: 0xCF9C, - 34846 - 11905: 0xCF9D, - 34847 - 11905: 0xCF9E, - 34848 - 11905: 0xCF9F, - 34849 - 11905: 0xF3BB, - 34850 - 11905: 0xB4C0, - 34851 - 11905: 0xCFA0, - 34852 - 11905: 0xD040, - 34853 - 11905: 0xD041, - 34854 - 11905: 0xD042, - 34855 - 11905: 0xD043, - 34856 - 11905: 0xD044, - 34857 - 11905: 0xD045, - 34858 - 11905: 0xD046, - 34859 - 11905: 0xD047, - 34860 - 11905: 0xD048, - 34861 - 11905: 0xD049, - 34862 - 11905: 0xD04A, - 34863 - 11905: 0xD04B, - 34864 - 11905: 0xD04C, - 34865 - 11905: 0xD04D, - 34866 - 11905: 0xEEC3, - 34867 - 11905: 0xD04E, - 34868 - 11905: 0xD04F, - 34869 - 11905: 0xD050, - 34870 - 11905: 0xD051, - 34871 - 11905: 0xD052, - 34872 - 11905: 0xD053, - 34873 - 11905: 0xF3BC, - 34874 - 11905: 0xD054, - 34875 - 11905: 0xD055, - 34876 - 11905: 0xF3BD, - 34877 - 11905: 0xD056, - 34878 - 11905: 0xD057, - 34879 - 11905: 0xD058, - 34880 - 11905: 0xD1AA, - 34881 - 11905: 0xD059, - 34882 - 11905: 0xD05A, - 34883 - 11905: 0xD05B, - 34884 - 11905: 0xF4AC, - 34885 - 11905: 0xD0C6, - 34886 - 11905: 0xD05C, - 34887 - 11905: 0xD05D, - 34888 - 11905: 0xD05E, - 34889 - 11905: 0xD05F, - 34890 - 11905: 0xD060, - 34891 - 11905: 0xD061, - 34892 - 11905: 0xD0D0, - 34893 - 11905: 0xD1DC, - 34894 - 11905: 0xD062, - 34895 - 11905: 0xD063, - 34896 - 11905: 0xD064, - 34897 - 11905: 0xD065, - 34898 - 11905: 0xD066, - 34899 - 11905: 0xD067, - 34900 - 11905: 0xCFCE, - 34901 - 11905: 0xD068, - 34902 - 11905: 0xD069, - 34903 - 11905: 0xBDD6, - 34904 - 11905: 0xD06A, - 34905 - 11905: 0xD1C3, - 34906 - 11905: 0xD06B, - 34907 - 11905: 0xD06C, - 34908 - 11905: 0xD06D, - 34909 - 11905: 0xD06E, - 34910 - 11905: 0xD06F, - 34911 - 11905: 0xD070, - 34912 - 11905: 0xD071, - 34913 - 11905: 0xBAE2, - 34914 - 11905: 0xE1E9, - 34915 - 11905: 0xD2C2, - 34916 - 11905: 0xF1C2, - 34917 - 11905: 0xB2B9, - 34918 - 11905: 0xD072, - 34919 - 11905: 0xD073, - 34920 - 11905: 0xB1ED, - 34921 - 11905: 0xF1C3, - 34922 - 11905: 0xD074, - 34923 - 11905: 0xC9C0, - 34924 - 11905: 0xB3C4, - 34925 - 11905: 0xD075, - 34926 - 11905: 0xD9F2, - 34927 - 11905: 0xD076, - 34928 - 11905: 0xCBA5, - 34929 - 11905: 0xD077, - 34930 - 11905: 0xF1C4, - 34931 - 11905: 0xD078, - 34932 - 11905: 0xD079, - 34933 - 11905: 0xD07A, - 34934 - 11905: 0xD07B, - 34935 - 11905: 0xD6D4, - 34936 - 11905: 0xD07C, - 34937 - 11905: 0xD07D, - 34938 - 11905: 0xD07E, - 34939 - 11905: 0xD080, - 34940 - 11905: 0xD081, - 34941 - 11905: 0xF1C5, - 34942 - 11905: 0xF4C0, - 34943 - 11905: 0xF1C6, - 34944 - 11905: 0xD082, - 34945 - 11905: 0xD4AC, - 34946 - 11905: 0xF1C7, - 34947 - 11905: 0xD083, - 34948 - 11905: 0xB0C0, - 34949 - 11905: 0xF4C1, - 34950 - 11905: 0xD084, - 34951 - 11905: 0xD085, - 34952 - 11905: 0xF4C2, - 34953 - 11905: 0xD086, - 34954 - 11905: 0xD087, - 34955 - 11905: 0xB4FC, - 34956 - 11905: 0xD088, - 34957 - 11905: 0xC5DB, - 34958 - 11905: 0xD089, - 34959 - 11905: 0xD08A, - 34960 - 11905: 0xD08B, - 34961 - 11905: 0xD08C, - 34962 - 11905: 0xCCBB, - 34963 - 11905: 0xD08D, - 34964 - 11905: 0xD08E, - 34965 - 11905: 0xD08F, - 34966 - 11905: 0xD0E4, - 34967 - 11905: 0xD090, - 34968 - 11905: 0xD091, - 34969 - 11905: 0xD092, - 34970 - 11905: 0xD093, - 34971 - 11905: 0xD094, - 34972 - 11905: 0xCDE0, - 34973 - 11905: 0xD095, - 34974 - 11905: 0xD096, - 34975 - 11905: 0xD097, - 34976 - 11905: 0xD098, - 34977 - 11905: 0xD099, - 34978 - 11905: 0xF1C8, - 34979 - 11905: 0xD09A, - 34980 - 11905: 0xD9F3, - 34981 - 11905: 0xD09B, - 34982 - 11905: 0xD09C, - 34983 - 11905: 0xD09D, - 34984 - 11905: 0xD09E, - 34985 - 11905: 0xD09F, - 34986 - 11905: 0xD0A0, - 34987 - 11905: 0xB1BB, - 34988 - 11905: 0xD140, - 34989 - 11905: 0xCFAE, - 34990 - 11905: 0xD141, - 34991 - 11905: 0xD142, - 34992 - 11905: 0xD143, - 34993 - 11905: 0xB8A4, - 34994 - 11905: 0xD144, - 34995 - 11905: 0xD145, - 34996 - 11905: 0xD146, - 34997 - 11905: 0xD147, - 34998 - 11905: 0xD148, - 34999 - 11905: 0xF1CA, - 35000 - 11905: 0xD149, - 35001 - 11905: 0xD14A, - 35002 - 11905: 0xD14B, - 35003 - 11905: 0xD14C, - 35004 - 11905: 0xF1CB, - 35005 - 11905: 0xD14D, - 35006 - 11905: 0xD14E, - 35007 - 11905: 0xD14F, - 35008 - 11905: 0xD150, - 35009 - 11905: 0xB2C3, - 35010 - 11905: 0xC1D1, - 35011 - 11905: 0xD151, - 35012 - 11905: 0xD152, - 35013 - 11905: 0xD7B0, - 35014 - 11905: 0xF1C9, - 35015 - 11905: 0xD153, - 35016 - 11905: 0xD154, - 35017 - 11905: 0xF1CC, - 35018 - 11905: 0xD155, - 35019 - 11905: 0xD156, - 35020 - 11905: 0xD157, - 35021 - 11905: 0xD158, - 35022 - 11905: 0xF1CE, - 35023 - 11905: 0xD159, - 35024 - 11905: 0xD15A, - 35025 - 11905: 0xD15B, - 35026 - 11905: 0xD9F6, - 35027 - 11905: 0xD15C, - 35028 - 11905: 0xD2E1, - 35029 - 11905: 0xD4A3, - 35030 - 11905: 0xD15D, - 35031 - 11905: 0xD15E, - 35032 - 11905: 0xF4C3, - 35033 - 11905: 0xC8B9, - 35034 - 11905: 0xD15F, - 35035 - 11905: 0xD160, - 35036 - 11905: 0xD161, - 35037 - 11905: 0xD162, - 35038 - 11905: 0xD163, - 35039 - 11905: 0xF4C4, - 35040 - 11905: 0xD164, - 35041 - 11905: 0xD165, - 35042 - 11905: 0xF1CD, - 35043 - 11905: 0xF1CF, - 35044 - 11905: 0xBFE3, - 35045 - 11905: 0xF1D0, - 35046 - 11905: 0xD166, - 35047 - 11905: 0xD167, - 35048 - 11905: 0xF1D4, - 35049 - 11905: 0xD168, - 35050 - 11905: 0xD169, - 35051 - 11905: 0xD16A, - 35052 - 11905: 0xD16B, - 35053 - 11905: 0xD16C, - 35054 - 11905: 0xD16D, - 35055 - 11905: 0xD16E, - 35056 - 11905: 0xF1D6, - 35057 - 11905: 0xF1D1, - 35058 - 11905: 0xD16F, - 35059 - 11905: 0xC9D1, - 35060 - 11905: 0xC5E1, - 35061 - 11905: 0xD170, - 35062 - 11905: 0xD171, - 35063 - 11905: 0xD172, - 35064 - 11905: 0xC2E3, - 35065 - 11905: 0xB9FC, - 35066 - 11905: 0xD173, - 35067 - 11905: 0xD174, - 35068 - 11905: 0xF1D3, - 35069 - 11905: 0xD175, - 35070 - 11905: 0xF1D5, - 35071 - 11905: 0xD176, - 35072 - 11905: 0xD177, - 35073 - 11905: 0xD178, - 35074 - 11905: 0xB9D3, - 35075 - 11905: 0xD179, - 35076 - 11905: 0xD17A, - 35077 - 11905: 0xD17B, - 35078 - 11905: 0xD17C, - 35079 - 11905: 0xD17D, - 35080 - 11905: 0xD17E, - 35081 - 11905: 0xD180, - 35082 - 11905: 0xF1DB, - 35083 - 11905: 0xD181, - 35084 - 11905: 0xD182, - 35085 - 11905: 0xD183, - 35086 - 11905: 0xD184, - 35087 - 11905: 0xD185, - 35088 - 11905: 0xBAD6, - 35089 - 11905: 0xD186, - 35090 - 11905: 0xB0FD, - 35091 - 11905: 0xF1D9, - 35092 - 11905: 0xD187, - 35093 - 11905: 0xD188, - 35094 - 11905: 0xD189, - 35095 - 11905: 0xD18A, - 35096 - 11905: 0xD18B, - 35097 - 11905: 0xF1D8, - 35098 - 11905: 0xF1D2, - 35099 - 11905: 0xF1DA, - 35100 - 11905: 0xD18C, - 35101 - 11905: 0xD18D, - 35102 - 11905: 0xD18E, - 35103 - 11905: 0xD18F, - 35104 - 11905: 0xD190, - 35105 - 11905: 0xF1D7, - 35106 - 11905: 0xD191, - 35107 - 11905: 0xD192, - 35108 - 11905: 0xD193, - 35109 - 11905: 0xC8EC, - 35110 - 11905: 0xD194, - 35111 - 11905: 0xD195, - 35112 - 11905: 0xD196, - 35113 - 11905: 0xD197, - 35114 - 11905: 0xCDCA, - 35115 - 11905: 0xF1DD, - 35116 - 11905: 0xD198, - 35117 - 11905: 0xD199, - 35118 - 11905: 0xD19A, - 35119 - 11905: 0xD19B, - 35120 - 11905: 0xE5BD, - 35121 - 11905: 0xD19C, - 35122 - 11905: 0xD19D, - 35123 - 11905: 0xD19E, - 35124 - 11905: 0xF1DC, - 35125 - 11905: 0xD19F, - 35126 - 11905: 0xF1DE, - 35127 - 11905: 0xD1A0, - 35128 - 11905: 0xD240, - 35129 - 11905: 0xD241, - 35130 - 11905: 0xD242, - 35131 - 11905: 0xD243, - 35132 - 11905: 0xD244, - 35133 - 11905: 0xD245, - 35134 - 11905: 0xD246, - 35135 - 11905: 0xD247, - 35136 - 11905: 0xD248, - 35137 - 11905: 0xF1DF, - 35138 - 11905: 0xD249, - 35139 - 11905: 0xD24A, - 35140 - 11905: 0xCFE5, - 35141 - 11905: 0xD24B, - 35142 - 11905: 0xD24C, - 35143 - 11905: 0xD24D, - 35144 - 11905: 0xD24E, - 35145 - 11905: 0xD24F, - 35146 - 11905: 0xD250, - 35147 - 11905: 0xD251, - 35148 - 11905: 0xD252, - 35149 - 11905: 0xD253, - 35150 - 11905: 0xD254, - 35151 - 11905: 0xD255, - 35152 - 11905: 0xD256, - 35153 - 11905: 0xD257, - 35154 - 11905: 0xD258, - 35155 - 11905: 0xD259, - 35156 - 11905: 0xD25A, - 35157 - 11905: 0xD25B, - 35158 - 11905: 0xD25C, - 35159 - 11905: 0xD25D, - 35160 - 11905: 0xD25E, - 35161 - 11905: 0xD25F, - 35162 - 11905: 0xD260, - 35163 - 11905: 0xD261, - 35164 - 11905: 0xD262, - 35165 - 11905: 0xD263, - 35166 - 11905: 0xF4C5, - 35167 - 11905: 0xBDF3, - 35168 - 11905: 0xD264, - 35169 - 11905: 0xD265, - 35170 - 11905: 0xD266, - 35171 - 11905: 0xD267, - 35172 - 11905: 0xD268, - 35173 - 11905: 0xD269, - 35174 - 11905: 0xF1E0, - 35175 - 11905: 0xD26A, - 35176 - 11905: 0xD26B, - 35177 - 11905: 0xD26C, - 35178 - 11905: 0xD26D, - 35179 - 11905: 0xD26E, - 35180 - 11905: 0xD26F, - 35181 - 11905: 0xD270, - 35182 - 11905: 0xD271, - 35183 - 11905: 0xD272, - 35184 - 11905: 0xD273, - 35185 - 11905: 0xD274, - 35186 - 11905: 0xD275, - 35187 - 11905: 0xD276, - 35188 - 11905: 0xD277, - 35189 - 11905: 0xD278, - 35190 - 11905: 0xD279, - 35191 - 11905: 0xD27A, - 35192 - 11905: 0xD27B, - 35193 - 11905: 0xD27C, - 35194 - 11905: 0xD27D, - 35195 - 11905: 0xF1E1, - 35196 - 11905: 0xD27E, - 35197 - 11905: 0xD280, - 35198 - 11905: 0xD281, - 35199 - 11905: 0xCEF7, - 35200 - 11905: 0xD282, - 35201 - 11905: 0xD2AA, - 35202 - 11905: 0xD283, - 35203 - 11905: 0xF1FB, - 35204 - 11905: 0xD284, - 35205 - 11905: 0xD285, - 35206 - 11905: 0xB8B2, - 35207 - 11905: 0xD286, - 35208 - 11905: 0xD287, - 35209 - 11905: 0xD288, - 35210 - 11905: 0xD289, - 35211 - 11905: 0xD28A, - 35212 - 11905: 0xD28B, - 35213 - 11905: 0xD28C, - 35214 - 11905: 0xD28D, - 35215 - 11905: 0xD28E, - 35216 - 11905: 0xD28F, - 35217 - 11905: 0xD290, - 35218 - 11905: 0xD291, - 35219 - 11905: 0xD292, - 35220 - 11905: 0xD293, - 35221 - 11905: 0xD294, - 35222 - 11905: 0xD295, - 35223 - 11905: 0xD296, - 35224 - 11905: 0xD297, - 35225 - 11905: 0xD298, - 35226 - 11905: 0xD299, - 35227 - 11905: 0xD29A, - 35228 - 11905: 0xD29B, - 35229 - 11905: 0xD29C, - 35230 - 11905: 0xD29D, - 35231 - 11905: 0xD29E, - 35232 - 11905: 0xD29F, - 35233 - 11905: 0xD2A0, - 35234 - 11905: 0xD340, - 35235 - 11905: 0xD341, - 35236 - 11905: 0xD342, - 35237 - 11905: 0xD343, - 35238 - 11905: 0xD344, - 35239 - 11905: 0xD345, - 35240 - 11905: 0xD346, - 35241 - 11905: 0xD347, - 35242 - 11905: 0xD348, - 35243 - 11905: 0xD349, - 35244 - 11905: 0xD34A, - 35245 - 11905: 0xD34B, - 35246 - 11905: 0xD34C, - 35247 - 11905: 0xD34D, - 35248 - 11905: 0xD34E, - 35249 - 11905: 0xD34F, - 35250 - 11905: 0xD350, - 35251 - 11905: 0xD351, - 35252 - 11905: 0xD352, - 35253 - 11905: 0xD353, - 35254 - 11905: 0xD354, - 35255 - 11905: 0xD355, - 35256 - 11905: 0xD356, - 35257 - 11905: 0xD357, - 35258 - 11905: 0xD358, - 35259 - 11905: 0xD359, - 35260 - 11905: 0xD35A, - 35261 - 11905: 0xD35B, - 35262 - 11905: 0xD35C, - 35263 - 11905: 0xD35D, - 35264 - 11905: 0xD35E, - 35265 - 11905: 0xBCFB, - 35266 - 11905: 0xB9DB, - 35267 - 11905: 0xD35F, - 35268 - 11905: 0xB9E6, - 35269 - 11905: 0xC3D9, - 35270 - 11905: 0xCAD3, - 35271 - 11905: 0xEAE8, - 35272 - 11905: 0xC0C0, - 35273 - 11905: 0xBEF5, - 35274 - 11905: 0xEAE9, - 35275 - 11905: 0xEAEA, - 35276 - 11905: 0xEAEB, - 35277 - 11905: 0xD360, - 35278 - 11905: 0xEAEC, - 35279 - 11905: 0xEAED, - 35280 - 11905: 0xEAEE, - 35281 - 11905: 0xEAEF, - 35282 - 11905: 0xBDC7, - 35283 - 11905: 0xD361, - 35284 - 11905: 0xD362, - 35285 - 11905: 0xD363, - 35286 - 11905: 0xF5FB, - 35287 - 11905: 0xD364, - 35288 - 11905: 0xD365, - 35289 - 11905: 0xD366, - 35290 - 11905: 0xF5FD, - 35291 - 11905: 0xD367, - 35292 - 11905: 0xF5FE, - 35293 - 11905: 0xD368, - 35294 - 11905: 0xF5FC, - 35295 - 11905: 0xD369, - 35296 - 11905: 0xD36A, - 35297 - 11905: 0xD36B, - 35298 - 11905: 0xD36C, - 35299 - 11905: 0xBDE2, - 35300 - 11905: 0xD36D, - 35301 - 11905: 0xF6A1, - 35302 - 11905: 0xB4A5, - 35303 - 11905: 0xD36E, - 35304 - 11905: 0xD36F, - 35305 - 11905: 0xD370, - 35306 - 11905: 0xD371, - 35307 - 11905: 0xF6A2, - 35308 - 11905: 0xD372, - 35309 - 11905: 0xD373, - 35310 - 11905: 0xD374, - 35311 - 11905: 0xF6A3, - 35312 - 11905: 0xD375, - 35313 - 11905: 0xD376, - 35314 - 11905: 0xD377, - 35315 - 11905: 0xECB2, - 35316 - 11905: 0xD378, - 35317 - 11905: 0xD379, - 35318 - 11905: 0xD37A, - 35319 - 11905: 0xD37B, - 35320 - 11905: 0xD37C, - 35321 - 11905: 0xD37D, - 35322 - 11905: 0xD37E, - 35323 - 11905: 0xD380, - 35324 - 11905: 0xD381, - 35325 - 11905: 0xD382, - 35326 - 11905: 0xD383, - 35327 - 11905: 0xD384, - 35328 - 11905: 0xD1D4, - 35329 - 11905: 0xD385, - 35330 - 11905: 0xD386, - 35331 - 11905: 0xD387, - 35332 - 11905: 0xD388, - 35333 - 11905: 0xD389, - 35334 - 11905: 0xD38A, - 35335 - 11905: 0xD9EA, - 35336 - 11905: 0xD38B, - 35337 - 11905: 0xD38C, - 35338 - 11905: 0xD38D, - 35339 - 11905: 0xD38E, - 35340 - 11905: 0xD38F, - 35341 - 11905: 0xD390, - 35342 - 11905: 0xD391, - 35343 - 11905: 0xD392, - 35344 - 11905: 0xD393, - 35345 - 11905: 0xD394, - 35346 - 11905: 0xD395, - 35347 - 11905: 0xD396, - 35348 - 11905: 0xD397, - 35349 - 11905: 0xD398, - 35350 - 11905: 0xD399, - 35351 - 11905: 0xD39A, - 35352 - 11905: 0xD39B, - 35353 - 11905: 0xD39C, - 35354 - 11905: 0xD39D, - 35355 - 11905: 0xD39E, - 35356 - 11905: 0xD39F, - 35357 - 11905: 0xD3A0, - 35358 - 11905: 0xD440, - 35359 - 11905: 0xD441, - 35360 - 11905: 0xD442, - 35361 - 11905: 0xD443, - 35362 - 11905: 0xD444, - 35363 - 11905: 0xD445, - 35364 - 11905: 0xD446, - 35365 - 11905: 0xD447, - 35366 - 11905: 0xD448, - 35367 - 11905: 0xD449, - 35368 - 11905: 0xD44A, - 35369 - 11905: 0xD44B, - 35370 - 11905: 0xD44C, - 35371 - 11905: 0xD44D, - 35372 - 11905: 0xD44E, - 35373 - 11905: 0xD44F, - 35374 - 11905: 0xD450, - 35375 - 11905: 0xD451, - 35376 - 11905: 0xD452, - 35377 - 11905: 0xD453, - 35378 - 11905: 0xD454, - 35379 - 11905: 0xD455, - 35380 - 11905: 0xD456, - 35381 - 11905: 0xD457, - 35382 - 11905: 0xD458, - 35383 - 11905: 0xD459, - 35384 - 11905: 0xD45A, - 35385 - 11905: 0xD45B, - 35386 - 11905: 0xD45C, - 35387 - 11905: 0xD45D, - 35388 - 11905: 0xD45E, - 35389 - 11905: 0xD45F, - 35390 - 11905: 0xF6A4, - 35391 - 11905: 0xD460, - 35392 - 11905: 0xD461, - 35393 - 11905: 0xD462, - 35394 - 11905: 0xD463, - 35395 - 11905: 0xD464, - 35396 - 11905: 0xD465, - 35397 - 11905: 0xD466, - 35398 - 11905: 0xD467, - 35399 - 11905: 0xD468, - 35400 - 11905: 0xEEBA, - 35401 - 11905: 0xD469, - 35402 - 11905: 0xD46A, - 35403 - 11905: 0xD46B, - 35404 - 11905: 0xD46C, - 35405 - 11905: 0xD46D, - 35406 - 11905: 0xD46E, - 35407 - 11905: 0xD46F, - 35408 - 11905: 0xD470, - 35409 - 11905: 0xD471, - 35410 - 11905: 0xD472, - 35411 - 11905: 0xD473, - 35412 - 11905: 0xD474, - 35413 - 11905: 0xD475, - 35414 - 11905: 0xD476, - 35415 - 11905: 0xD477, - 35416 - 11905: 0xD478, - 35417 - 11905: 0xD479, - 35418 - 11905: 0xD47A, - 35419 - 11905: 0xD47B, - 35420 - 11905: 0xD47C, - 35421 - 11905: 0xD47D, - 35422 - 11905: 0xD47E, - 35423 - 11905: 0xD480, - 35424 - 11905: 0xD481, - 35425 - 11905: 0xD482, - 35426 - 11905: 0xD483, - 35427 - 11905: 0xD484, - 35428 - 11905: 0xD485, - 35429 - 11905: 0xD486, - 35430 - 11905: 0xD487, - 35431 - 11905: 0xD488, - 35432 - 11905: 0xD489, - 35433 - 11905: 0xD48A, - 35434 - 11905: 0xD48B, - 35435 - 11905: 0xD48C, - 35436 - 11905: 0xD48D, - 35437 - 11905: 0xD48E, - 35438 - 11905: 0xD48F, - 35439 - 11905: 0xD490, - 35440 - 11905: 0xD491, - 35441 - 11905: 0xD492, - 35442 - 11905: 0xD493, - 35443 - 11905: 0xD494, - 35444 - 11905: 0xD495, - 35445 - 11905: 0xD496, - 35446 - 11905: 0xD497, - 35447 - 11905: 0xD498, - 35448 - 11905: 0xD499, - 35449 - 11905: 0xD5B2, - 35450 - 11905: 0xD49A, - 35451 - 11905: 0xD49B, - 35452 - 11905: 0xD49C, - 35453 - 11905: 0xD49D, - 35454 - 11905: 0xD49E, - 35455 - 11905: 0xD49F, - 35456 - 11905: 0xD4A0, - 35457 - 11905: 0xD540, - 35458 - 11905: 0xD541, - 35459 - 11905: 0xD542, - 35460 - 11905: 0xD543, - 35461 - 11905: 0xD544, - 35462 - 11905: 0xD545, - 35463 - 11905: 0xD546, - 35464 - 11905: 0xD547, - 35465 - 11905: 0xD3FE, - 35466 - 11905: 0xCCDC, - 35467 - 11905: 0xD548, - 35468 - 11905: 0xD549, - 35469 - 11905: 0xD54A, - 35470 - 11905: 0xD54B, - 35471 - 11905: 0xD54C, - 35472 - 11905: 0xD54D, - 35473 - 11905: 0xD54E, - 35474 - 11905: 0xD54F, - 35475 - 11905: 0xCAC4, - 35476 - 11905: 0xD550, - 35477 - 11905: 0xD551, - 35478 - 11905: 0xD552, - 35479 - 11905: 0xD553, - 35480 - 11905: 0xD554, - 35481 - 11905: 0xD555, - 35482 - 11905: 0xD556, - 35483 - 11905: 0xD557, - 35484 - 11905: 0xD558, - 35485 - 11905: 0xD559, - 35486 - 11905: 0xD55A, - 35487 - 11905: 0xD55B, - 35488 - 11905: 0xD55C, - 35489 - 11905: 0xD55D, - 35490 - 11905: 0xD55E, - 35491 - 11905: 0xD55F, - 35492 - 11905: 0xD560, - 35493 - 11905: 0xD561, - 35494 - 11905: 0xD562, - 35495 - 11905: 0xD563, - 35496 - 11905: 0xD564, - 35497 - 11905: 0xD565, - 35498 - 11905: 0xD566, - 35499 - 11905: 0xD567, - 35500 - 11905: 0xD568, - 35501 - 11905: 0xD569, - 35502 - 11905: 0xD56A, - 35503 - 11905: 0xD56B, - 35504 - 11905: 0xD56C, - 35505 - 11905: 0xD56D, - 35506 - 11905: 0xD56E, - 35507 - 11905: 0xD56F, - 35508 - 11905: 0xD570, - 35509 - 11905: 0xD571, - 35510 - 11905: 0xD572, - 35511 - 11905: 0xD573, - 35512 - 11905: 0xD574, - 35513 - 11905: 0xD575, - 35514 - 11905: 0xD576, - 35515 - 11905: 0xD577, - 35516 - 11905: 0xD578, - 35517 - 11905: 0xD579, - 35518 - 11905: 0xD57A, - 35519 - 11905: 0xD57B, - 35520 - 11905: 0xD57C, - 35521 - 11905: 0xD57D, - 35522 - 11905: 0xD57E, - 35523 - 11905: 0xD580, - 35524 - 11905: 0xD581, - 35525 - 11905: 0xD582, - 35526 - 11905: 0xD583, - 35527 - 11905: 0xD584, - 35528 - 11905: 0xD585, - 35529 - 11905: 0xD586, - 35530 - 11905: 0xD587, - 35531 - 11905: 0xD588, - 35532 - 11905: 0xD589, - 35533 - 11905: 0xD58A, - 35534 - 11905: 0xD58B, - 35535 - 11905: 0xD58C, - 35536 - 11905: 0xD58D, - 35537 - 11905: 0xD58E, - 35538 - 11905: 0xD58F, - 35539 - 11905: 0xD590, - 35540 - 11905: 0xD591, - 35541 - 11905: 0xD592, - 35542 - 11905: 0xD593, - 35543 - 11905: 0xD594, - 35544 - 11905: 0xD595, - 35545 - 11905: 0xD596, - 35546 - 11905: 0xD597, - 35547 - 11905: 0xD598, - 35548 - 11905: 0xD599, - 35549 - 11905: 0xD59A, - 35550 - 11905: 0xD59B, - 35551 - 11905: 0xD59C, - 35552 - 11905: 0xD59D, - 35553 - 11905: 0xD59E, - 35554 - 11905: 0xD59F, - 35555 - 11905: 0xD5A0, - 35556 - 11905: 0xD640, - 35557 - 11905: 0xD641, - 35558 - 11905: 0xD642, - 35559 - 11905: 0xD643, - 35560 - 11905: 0xD644, - 35561 - 11905: 0xD645, - 35562 - 11905: 0xD646, - 35563 - 11905: 0xD647, - 35564 - 11905: 0xD648, - 35565 - 11905: 0xD649, - 35566 - 11905: 0xD64A, - 35567 - 11905: 0xD64B, - 35568 - 11905: 0xD64C, - 35569 - 11905: 0xD64D, - 35570 - 11905: 0xD64E, - 35571 - 11905: 0xD64F, - 35572 - 11905: 0xD650, - 35573 - 11905: 0xD651, - 35574 - 11905: 0xD652, - 35575 - 11905: 0xD653, - 35576 - 11905: 0xD654, - 35577 - 11905: 0xD655, - 35578 - 11905: 0xD656, - 35579 - 11905: 0xD657, - 35580 - 11905: 0xD658, - 35581 - 11905: 0xD659, - 35582 - 11905: 0xD65A, - 35583 - 11905: 0xD65B, - 35584 - 11905: 0xD65C, - 35585 - 11905: 0xD65D, - 35586 - 11905: 0xD65E, - 35587 - 11905: 0xD65F, - 35588 - 11905: 0xD660, - 35589 - 11905: 0xD661, - 35590 - 11905: 0xD662, - 35591 - 11905: 0xE5C0, - 35592 - 11905: 0xD663, - 35593 - 11905: 0xD664, - 35594 - 11905: 0xD665, - 35595 - 11905: 0xD666, - 35596 - 11905: 0xD667, - 35597 - 11905: 0xD668, - 35598 - 11905: 0xD669, - 35599 - 11905: 0xD66A, - 35600 - 11905: 0xD66B, - 35601 - 11905: 0xD66C, - 35602 - 11905: 0xD66D, - 35603 - 11905: 0xD66E, - 35604 - 11905: 0xD66F, - 35605 - 11905: 0xD670, - 35606 - 11905: 0xD671, - 35607 - 11905: 0xD672, - 35608 - 11905: 0xD673, - 35609 - 11905: 0xD674, - 35610 - 11905: 0xD675, - 35611 - 11905: 0xD676, - 35612 - 11905: 0xD677, - 35613 - 11905: 0xD678, - 35614 - 11905: 0xD679, - 35615 - 11905: 0xD67A, - 35616 - 11905: 0xD67B, - 35617 - 11905: 0xD67C, - 35618 - 11905: 0xD67D, - 35619 - 11905: 0xD67E, - 35620 - 11905: 0xD680, - 35621 - 11905: 0xD681, - 35622 - 11905: 0xF6A5, - 35623 - 11905: 0xD682, - 35624 - 11905: 0xD683, - 35625 - 11905: 0xD684, - 35626 - 11905: 0xD685, - 35627 - 11905: 0xD686, - 35628 - 11905: 0xD687, - 35629 - 11905: 0xD688, - 35630 - 11905: 0xD689, - 35631 - 11905: 0xD68A, - 35632 - 11905: 0xD68B, - 35633 - 11905: 0xD68C, - 35634 - 11905: 0xD68D, - 35635 - 11905: 0xD68E, - 35636 - 11905: 0xD68F, - 35637 - 11905: 0xD690, - 35638 - 11905: 0xD691, - 35639 - 11905: 0xD692, - 35640 - 11905: 0xD693, - 35641 - 11905: 0xD694, - 35642 - 11905: 0xD695, - 35643 - 11905: 0xD696, - 35644 - 11905: 0xD697, - 35645 - 11905: 0xD698, - 35646 - 11905: 0xD699, - 35647 - 11905: 0xD69A, - 35648 - 11905: 0xD69B, - 35649 - 11905: 0xD69C, - 35650 - 11905: 0xD69D, - 35651 - 11905: 0xD69E, - 35652 - 11905: 0xD69F, - 35653 - 11905: 0xD6A0, - 35654 - 11905: 0xD740, - 35655 - 11905: 0xD741, - 35656 - 11905: 0xD742, - 35657 - 11905: 0xD743, - 35658 - 11905: 0xD744, - 35659 - 11905: 0xD745, - 35660 - 11905: 0xD746, - 35661 - 11905: 0xD747, - 35662 - 11905: 0xD748, - 35663 - 11905: 0xD749, - 35664 - 11905: 0xD74A, - 35665 - 11905: 0xD74B, - 35666 - 11905: 0xD74C, - 35667 - 11905: 0xD74D, - 35668 - 11905: 0xD74E, - 35669 - 11905: 0xD74F, - 35670 - 11905: 0xD750, - 35671 - 11905: 0xD751, - 35672 - 11905: 0xD752, - 35673 - 11905: 0xD753, - 35674 - 11905: 0xD754, - 35675 - 11905: 0xD755, - 35676 - 11905: 0xD756, - 35677 - 11905: 0xD757, - 35678 - 11905: 0xD758, - 35679 - 11905: 0xD759, - 35680 - 11905: 0xD75A, - 35681 - 11905: 0xD75B, - 35682 - 11905: 0xD75C, - 35683 - 11905: 0xD75D, - 35684 - 11905: 0xD75E, - 35685 - 11905: 0xD75F, - 35686 - 11905: 0xBEAF, - 35687 - 11905: 0xD760, - 35688 - 11905: 0xD761, - 35689 - 11905: 0xD762, - 35690 - 11905: 0xD763, - 35691 - 11905: 0xD764, - 35692 - 11905: 0xC6A9, - 35693 - 11905: 0xD765, - 35694 - 11905: 0xD766, - 35695 - 11905: 0xD767, - 35696 - 11905: 0xD768, - 35697 - 11905: 0xD769, - 35698 - 11905: 0xD76A, - 35699 - 11905: 0xD76B, - 35700 - 11905: 0xD76C, - 35701 - 11905: 0xD76D, - 35702 - 11905: 0xD76E, - 35703 - 11905: 0xD76F, - 35704 - 11905: 0xD770, - 35705 - 11905: 0xD771, - 35706 - 11905: 0xD772, - 35707 - 11905: 0xD773, - 35708 - 11905: 0xD774, - 35709 - 11905: 0xD775, - 35710 - 11905: 0xD776, - 35711 - 11905: 0xD777, - 35712 - 11905: 0xD778, - 35713 - 11905: 0xD779, - 35714 - 11905: 0xD77A, - 35715 - 11905: 0xD77B, - 35716 - 11905: 0xD77C, - 35717 - 11905: 0xD77D, - 35718 - 11905: 0xD77E, - 35719 - 11905: 0xD780, - 35720 - 11905: 0xD781, - 35721 - 11905: 0xD782, - 35722 - 11905: 0xD783, - 35723 - 11905: 0xD784, - 35724 - 11905: 0xD785, - 35725 - 11905: 0xD786, - 35726 - 11905: 0xD787, - 35727 - 11905: 0xD788, - 35728 - 11905: 0xD789, - 35729 - 11905: 0xD78A, - 35730 - 11905: 0xD78B, - 35731 - 11905: 0xD78C, - 35732 - 11905: 0xD78D, - 35733 - 11905: 0xD78E, - 35734 - 11905: 0xD78F, - 35735 - 11905: 0xD790, - 35736 - 11905: 0xD791, - 35737 - 11905: 0xD792, - 35738 - 11905: 0xD793, - 35739 - 11905: 0xD794, - 35740 - 11905: 0xD795, - 35741 - 11905: 0xD796, - 35742 - 11905: 0xD797, - 35743 - 11905: 0xD798, - 35744 - 11905: 0xDAA5, - 35745 - 11905: 0xBCC6, - 35746 - 11905: 0xB6A9, - 35747 - 11905: 0xB8BC, - 35748 - 11905: 0xC8CF, - 35749 - 11905: 0xBCA5, - 35750 - 11905: 0xDAA6, - 35751 - 11905: 0xDAA7, - 35752 - 11905: 0xCCD6, - 35753 - 11905: 0xC8C3, - 35754 - 11905: 0xDAA8, - 35755 - 11905: 0xC6FD, - 35756 - 11905: 0xD799, - 35757 - 11905: 0xD1B5, - 35758 - 11905: 0xD2E9, - 35759 - 11905: 0xD1B6, - 35760 - 11905: 0xBCC7, - 35761 - 11905: 0xD79A, - 35762 - 11905: 0xBDB2, - 35763 - 11905: 0xBBE4, - 35764 - 11905: 0xDAA9, - 35765 - 11905: 0xDAAA, - 35766 - 11905: 0xD1C8, - 35767 - 11905: 0xDAAB, - 35768 - 11905: 0xD0ED, - 35769 - 11905: 0xB6EF, - 35770 - 11905: 0xC2DB, - 35771 - 11905: 0xD79B, - 35772 - 11905: 0xCBCF, - 35773 - 11905: 0xB7ED, - 35774 - 11905: 0xC9E8, - 35775 - 11905: 0xB7C3, - 35776 - 11905: 0xBEF7, - 35777 - 11905: 0xD6A4, - 35778 - 11905: 0xDAAC, - 35779 - 11905: 0xDAAD, - 35780 - 11905: 0xC6C0, - 35781 - 11905: 0xD7E7, - 35782 - 11905: 0xCAB6, - 35783 - 11905: 0xD79C, - 35784 - 11905: 0xD5A9, - 35785 - 11905: 0xCBDF, - 35786 - 11905: 0xD5EF, - 35787 - 11905: 0xDAAE, - 35788 - 11905: 0xD6DF, - 35789 - 11905: 0xB4CA, - 35790 - 11905: 0xDAB0, - 35791 - 11905: 0xDAAF, - 35792 - 11905: 0xD79D, - 35793 - 11905: 0xD2EB, - 35794 - 11905: 0xDAB1, - 35795 - 11905: 0xDAB2, - 35796 - 11905: 0xDAB3, - 35797 - 11905: 0xCAD4, - 35798 - 11905: 0xDAB4, - 35799 - 11905: 0xCAAB, - 35800 - 11905: 0xDAB5, - 35801 - 11905: 0xDAB6, - 35802 - 11905: 0xB3CF, - 35803 - 11905: 0xD6EF, - 35804 - 11905: 0xDAB7, - 35805 - 11905: 0xBBB0, - 35806 - 11905: 0xB5AE, - 35807 - 11905: 0xDAB8, - 35808 - 11905: 0xDAB9, - 35809 - 11905: 0xB9EE, - 35810 - 11905: 0xD1AF, - 35811 - 11905: 0xD2E8, - 35812 - 11905: 0xDABA, - 35813 - 11905: 0xB8C3, - 35814 - 11905: 0xCFEA, - 35815 - 11905: 0xB2EF, - 35816 - 11905: 0xDABB, - 35817 - 11905: 0xDABC, - 35818 - 11905: 0xD79E, - 35819 - 11905: 0xBDEB, - 35820 - 11905: 0xCEDC, - 35821 - 11905: 0xD3EF, - 35822 - 11905: 0xDABD, - 35823 - 11905: 0xCEF3, - 35824 - 11905: 0xDABE, - 35825 - 11905: 0xD3D5, - 35826 - 11905: 0xBBE5, - 35827 - 11905: 0xDABF, - 35828 - 11905: 0xCBB5, - 35829 - 11905: 0xCBD0, - 35830 - 11905: 0xDAC0, - 35831 - 11905: 0xC7EB, - 35832 - 11905: 0xD6EE, - 35833 - 11905: 0xDAC1, - 35834 - 11905: 0xC5B5, - 35835 - 11905: 0xB6C1, - 35836 - 11905: 0xDAC2, - 35837 - 11905: 0xB7CC, - 35838 - 11905: 0xBFCE, - 35839 - 11905: 0xDAC3, - 35840 - 11905: 0xDAC4, - 35841 - 11905: 0xCBAD, - 35842 - 11905: 0xDAC5, - 35843 - 11905: 0xB5F7, - 35844 - 11905: 0xDAC6, - 35845 - 11905: 0xC1C2, - 35846 - 11905: 0xD7BB, - 35847 - 11905: 0xDAC7, - 35848 - 11905: 0xCCB8, - 35849 - 11905: 0xD79F, - 35850 - 11905: 0xD2EA, - 35851 - 11905: 0xC4B1, - 35852 - 11905: 0xDAC8, - 35853 - 11905: 0xB5FD, - 35854 - 11905: 0xBBD1, - 35855 - 11905: 0xDAC9, - 35856 - 11905: 0xD0B3, - 35857 - 11905: 0xDACA, - 35858 - 11905: 0xDACB, - 35859 - 11905: 0xCEBD, - 35860 - 11905: 0xDACC, - 35861 - 11905: 0xDACD, - 35862 - 11905: 0xDACE, - 35863 - 11905: 0xB2F7, - 35864 - 11905: 0xDAD1, - 35865 - 11905: 0xDACF, - 35866 - 11905: 0xD1E8, - 35867 - 11905: 0xDAD0, - 35868 - 11905: 0xC3D5, - 35869 - 11905: 0xDAD2, - 35870 - 11905: 0xD7A0, - 35871 - 11905: 0xDAD3, - 35872 - 11905: 0xDAD4, - 35873 - 11905: 0xDAD5, - 35874 - 11905: 0xD0BB, - 35875 - 11905: 0xD2A5, - 35876 - 11905: 0xB0F9, - 35877 - 11905: 0xDAD6, - 35878 - 11905: 0xC7AB, - 35879 - 11905: 0xDAD7, - 35880 - 11905: 0xBDF7, - 35881 - 11905: 0xC3A1, - 35882 - 11905: 0xDAD8, - 35883 - 11905: 0xDAD9, - 35884 - 11905: 0xC3FD, - 35885 - 11905: 0xCCB7, - 35886 - 11905: 0xDADA, - 35887 - 11905: 0xDADB, - 35888 - 11905: 0xC0BE, - 35889 - 11905: 0xC6D7, - 35890 - 11905: 0xDADC, - 35891 - 11905: 0xDADD, - 35892 - 11905: 0xC7B4, - 35893 - 11905: 0xDADE, - 35894 - 11905: 0xDADF, - 35895 - 11905: 0xB9C8, - 35896 - 11905: 0xD840, - 35897 - 11905: 0xD841, - 35898 - 11905: 0xD842, - 35899 - 11905: 0xD843, - 35900 - 11905: 0xD844, - 35901 - 11905: 0xD845, - 35902 - 11905: 0xD846, - 35903 - 11905: 0xD847, - 35904 - 11905: 0xD848, - 35905 - 11905: 0xBBED, - 35906 - 11905: 0xD849, - 35907 - 11905: 0xD84A, - 35908 - 11905: 0xD84B, - 35909 - 11905: 0xD84C, - 35910 - 11905: 0xB6B9, - 35911 - 11905: 0xF4F8, - 35912 - 11905: 0xD84D, - 35913 - 11905: 0xF4F9, - 35914 - 11905: 0xD84E, - 35915 - 11905: 0xD84F, - 35916 - 11905: 0xCDE3, - 35917 - 11905: 0xD850, - 35918 - 11905: 0xD851, - 35919 - 11905: 0xD852, - 35920 - 11905: 0xD853, - 35921 - 11905: 0xD854, - 35922 - 11905: 0xD855, - 35923 - 11905: 0xD856, - 35924 - 11905: 0xD857, - 35925 - 11905: 0xF5B9, - 35926 - 11905: 0xD858, - 35927 - 11905: 0xD859, - 35928 - 11905: 0xD85A, - 35929 - 11905: 0xD85B, - 35930 - 11905: 0xEBE0, - 35931 - 11905: 0xD85C, - 35932 - 11905: 0xD85D, - 35933 - 11905: 0xD85E, - 35934 - 11905: 0xD85F, - 35935 - 11905: 0xD860, - 35936 - 11905: 0xD861, - 35937 - 11905: 0xCFF3, - 35938 - 11905: 0xBBBF, - 35939 - 11905: 0xD862, - 35940 - 11905: 0xD863, - 35941 - 11905: 0xD864, - 35942 - 11905: 0xD865, - 35943 - 11905: 0xD866, - 35944 - 11905: 0xD867, - 35945 - 11905: 0xD868, - 35946 - 11905: 0xBAC0, - 35947 - 11905: 0xD4A5, - 35948 - 11905: 0xD869, - 35949 - 11905: 0xD86A, - 35950 - 11905: 0xD86B, - 35951 - 11905: 0xD86C, - 35952 - 11905: 0xD86D, - 35953 - 11905: 0xD86E, - 35954 - 11905: 0xD86F, - 35955 - 11905: 0xE1D9, - 35956 - 11905: 0xD870, - 35957 - 11905: 0xD871, - 35958 - 11905: 0xD872, - 35959 - 11905: 0xD873, - 35960 - 11905: 0xF5F4, - 35961 - 11905: 0xB1AA, - 35962 - 11905: 0xB2F2, - 35963 - 11905: 0xD874, - 35964 - 11905: 0xD875, - 35965 - 11905: 0xD876, - 35966 - 11905: 0xD877, - 35967 - 11905: 0xD878, - 35968 - 11905: 0xD879, - 35969 - 11905: 0xD87A, - 35970 - 11905: 0xF5F5, - 35971 - 11905: 0xD87B, - 35972 - 11905: 0xD87C, - 35973 - 11905: 0xF5F7, - 35974 - 11905: 0xD87D, - 35975 - 11905: 0xD87E, - 35976 - 11905: 0xD880, - 35977 - 11905: 0xBAD1, - 35978 - 11905: 0xF5F6, - 35979 - 11905: 0xD881, - 35980 - 11905: 0xC3B2, - 35981 - 11905: 0xD882, - 35982 - 11905: 0xD883, - 35983 - 11905: 0xD884, - 35984 - 11905: 0xD885, - 35985 - 11905: 0xD886, - 35986 - 11905: 0xD887, - 35987 - 11905: 0xD888, - 35988 - 11905: 0xF5F9, - 35989 - 11905: 0xD889, - 35990 - 11905: 0xD88A, - 35991 - 11905: 0xD88B, - 35992 - 11905: 0xF5F8, - 35993 - 11905: 0xD88C, - 35994 - 11905: 0xD88D, - 35995 - 11905: 0xD88E, - 35996 - 11905: 0xD88F, - 35997 - 11905: 0xD890, - 35998 - 11905: 0xD891, - 35999 - 11905: 0xD892, - 36000 - 11905: 0xD893, - 36001 - 11905: 0xD894, - 36002 - 11905: 0xD895, - 36003 - 11905: 0xD896, - 36004 - 11905: 0xD897, - 36005 - 11905: 0xD898, - 36006 - 11905: 0xD899, - 36007 - 11905: 0xD89A, - 36008 - 11905: 0xD89B, - 36009 - 11905: 0xD89C, - 36010 - 11905: 0xD89D, - 36011 - 11905: 0xD89E, - 36012 - 11905: 0xD89F, - 36013 - 11905: 0xD8A0, - 36014 - 11905: 0xD940, - 36015 - 11905: 0xD941, - 36016 - 11905: 0xD942, - 36017 - 11905: 0xD943, - 36018 - 11905: 0xD944, - 36019 - 11905: 0xD945, - 36020 - 11905: 0xD946, - 36021 - 11905: 0xD947, - 36022 - 11905: 0xD948, - 36023 - 11905: 0xD949, - 36024 - 11905: 0xD94A, - 36025 - 11905: 0xD94B, - 36026 - 11905: 0xD94C, - 36027 - 11905: 0xD94D, - 36028 - 11905: 0xD94E, - 36029 - 11905: 0xD94F, - 36030 - 11905: 0xD950, - 36031 - 11905: 0xD951, - 36032 - 11905: 0xD952, - 36033 - 11905: 0xD953, - 36034 - 11905: 0xD954, - 36035 - 11905: 0xD955, - 36036 - 11905: 0xD956, - 36037 - 11905: 0xD957, - 36038 - 11905: 0xD958, - 36039 - 11905: 0xD959, - 36040 - 11905: 0xD95A, - 36041 - 11905: 0xD95B, - 36042 - 11905: 0xD95C, - 36043 - 11905: 0xD95D, - 36044 - 11905: 0xD95E, - 36045 - 11905: 0xD95F, - 36046 - 11905: 0xD960, - 36047 - 11905: 0xD961, - 36048 - 11905: 0xD962, - 36049 - 11905: 0xD963, - 36050 - 11905: 0xD964, - 36051 - 11905: 0xD965, - 36052 - 11905: 0xD966, - 36053 - 11905: 0xD967, - 36054 - 11905: 0xD968, - 36055 - 11905: 0xD969, - 36056 - 11905: 0xD96A, - 36057 - 11905: 0xD96B, - 36058 - 11905: 0xD96C, - 36059 - 11905: 0xD96D, - 36060 - 11905: 0xD96E, - 36061 - 11905: 0xD96F, - 36062 - 11905: 0xD970, - 36063 - 11905: 0xD971, - 36064 - 11905: 0xD972, - 36065 - 11905: 0xD973, - 36066 - 11905: 0xD974, - 36067 - 11905: 0xD975, - 36068 - 11905: 0xD976, - 36069 - 11905: 0xD977, - 36070 - 11905: 0xD978, - 36071 - 11905: 0xD979, - 36072 - 11905: 0xD97A, - 36073 - 11905: 0xD97B, - 36074 - 11905: 0xD97C, - 36075 - 11905: 0xD97D, - 36076 - 11905: 0xD97E, - 36077 - 11905: 0xD980, - 36078 - 11905: 0xD981, - 36079 - 11905: 0xD982, - 36080 - 11905: 0xD983, - 36081 - 11905: 0xD984, - 36082 - 11905: 0xD985, - 36083 - 11905: 0xD986, - 36084 - 11905: 0xD987, - 36085 - 11905: 0xD988, - 36086 - 11905: 0xD989, - 36087 - 11905: 0xD98A, - 36088 - 11905: 0xD98B, - 36089 - 11905: 0xD98C, - 36090 - 11905: 0xD98D, - 36091 - 11905: 0xD98E, - 36092 - 11905: 0xD98F, - 36093 - 11905: 0xD990, - 36094 - 11905: 0xD991, - 36095 - 11905: 0xD992, - 36096 - 11905: 0xD993, - 36097 - 11905: 0xD994, - 36098 - 11905: 0xD995, - 36099 - 11905: 0xD996, - 36100 - 11905: 0xD997, - 36101 - 11905: 0xD998, - 36102 - 11905: 0xD999, - 36103 - 11905: 0xD99A, - 36104 - 11905: 0xD99B, - 36105 - 11905: 0xD99C, - 36106 - 11905: 0xD99D, - 36107 - 11905: 0xD99E, - 36108 - 11905: 0xD99F, - 36109 - 11905: 0xD9A0, - 36110 - 11905: 0xDA40, - 36111 - 11905: 0xDA41, - 36112 - 11905: 0xDA42, - 36113 - 11905: 0xDA43, - 36114 - 11905: 0xDA44, - 36115 - 11905: 0xDA45, - 36116 - 11905: 0xDA46, - 36117 - 11905: 0xDA47, - 36118 - 11905: 0xDA48, - 36119 - 11905: 0xDA49, - 36120 - 11905: 0xDA4A, - 36121 - 11905: 0xDA4B, - 36122 - 11905: 0xDA4C, - 36123 - 11905: 0xDA4D, - 36124 - 11905: 0xDA4E, - 36125 - 11905: 0xB1B4, - 36126 - 11905: 0xD5EA, - 36127 - 11905: 0xB8BA, - 36128 - 11905: 0xDA4F, - 36129 - 11905: 0xB9B1, - 36130 - 11905: 0xB2C6, - 36131 - 11905: 0xD4F0, - 36132 - 11905: 0xCFCD, - 36133 - 11905: 0xB0DC, - 36134 - 11905: 0xD5CB, - 36135 - 11905: 0xBBF5, - 36136 - 11905: 0xD6CA, - 36137 - 11905: 0xB7B7, - 36138 - 11905: 0xCCB0, - 36139 - 11905: 0xC6B6, - 36140 - 11905: 0xB1E1, - 36141 - 11905: 0xB9BA, - 36142 - 11905: 0xD6FC, - 36143 - 11905: 0xB9E1, - 36144 - 11905: 0xB7A1, - 36145 - 11905: 0xBCFA, - 36146 - 11905: 0xEADA, - 36147 - 11905: 0xEADB, - 36148 - 11905: 0xCCF9, - 36149 - 11905: 0xB9F3, - 36150 - 11905: 0xEADC, - 36151 - 11905: 0xB4FB, - 36152 - 11905: 0xC3B3, - 36153 - 11905: 0xB7D1, - 36154 - 11905: 0xBAD8, - 36155 - 11905: 0xEADD, - 36156 - 11905: 0xD4F4, - 36157 - 11905: 0xEADE, - 36158 - 11905: 0xBCD6, - 36159 - 11905: 0xBBDF, - 36160 - 11905: 0xEADF, - 36161 - 11905: 0xC1DE, - 36162 - 11905: 0xC2B8, - 36163 - 11905: 0xD4DF, - 36164 - 11905: 0xD7CA, - 36165 - 11905: 0xEAE0, - 36166 - 11905: 0xEAE1, - 36167 - 11905: 0xEAE4, - 36168 - 11905: 0xEAE2, - 36169 - 11905: 0xEAE3, - 36170 - 11905: 0xC9DE, - 36171 - 11905: 0xB8B3, - 36172 - 11905: 0xB6C4, - 36173 - 11905: 0xEAE5, - 36174 - 11905: 0xCAEA, - 36175 - 11905: 0xC9CD, - 36176 - 11905: 0xB4CD, - 36177 - 11905: 0xDA50, - 36178 - 11905: 0xDA51, - 36179 - 11905: 0xE2D9, - 36180 - 11905: 0xC5E2, - 36181 - 11905: 0xEAE6, - 36182 - 11905: 0xC0B5, - 36183 - 11905: 0xDA52, - 36184 - 11905: 0xD7B8, - 36185 - 11905: 0xEAE7, - 36186 - 11905: 0xD7AC, - 36187 - 11905: 0xC8FC, - 36188 - 11905: 0xD8D3, - 36189 - 11905: 0xD8CD, - 36190 - 11905: 0xD4DE, - 36191 - 11905: 0xDA53, - 36192 - 11905: 0xD4F9, - 36193 - 11905: 0xC9C4, - 36194 - 11905: 0xD3AE, - 36195 - 11905: 0xB8D3, - 36196 - 11905: 0xB3E0, - 36197 - 11905: 0xDA54, - 36198 - 11905: 0xC9E2, - 36199 - 11905: 0xF4F6, - 36200 - 11905: 0xDA55, - 36201 - 11905: 0xDA56, - 36202 - 11905: 0xDA57, - 36203 - 11905: 0xBAD5, - 36204 - 11905: 0xDA58, - 36205 - 11905: 0xF4F7, - 36206 - 11905: 0xDA59, - 36207 - 11905: 0xDA5A, - 36208 - 11905: 0xD7DF, - 36209 - 11905: 0xDA5B, - 36210 - 11905: 0xDA5C, - 36211 - 11905: 0xF4F1, - 36212 - 11905: 0xB8B0, - 36213 - 11905: 0xD5D4, - 36214 - 11905: 0xB8CF, - 36215 - 11905: 0xC6F0, - 36216 - 11905: 0xDA5D, - 36217 - 11905: 0xDA5E, - 36218 - 11905: 0xDA5F, - 36219 - 11905: 0xDA60, - 36220 - 11905: 0xDA61, - 36221 - 11905: 0xDA62, - 36222 - 11905: 0xDA63, - 36223 - 11905: 0xDA64, - 36224 - 11905: 0xDA65, - 36225 - 11905: 0xB3C3, - 36226 - 11905: 0xDA66, - 36227 - 11905: 0xDA67, - 36228 - 11905: 0xF4F2, - 36229 - 11905: 0xB3AC, - 36230 - 11905: 0xDA68, - 36231 - 11905: 0xDA69, - 36232 - 11905: 0xDA6A, - 36233 - 11905: 0xDA6B, - 36234 - 11905: 0xD4BD, - 36235 - 11905: 0xC7F7, - 36236 - 11905: 0xDA6C, - 36237 - 11905: 0xDA6D, - 36238 - 11905: 0xDA6E, - 36239 - 11905: 0xDA6F, - 36240 - 11905: 0xDA70, - 36241 - 11905: 0xF4F4, - 36242 - 11905: 0xDA71, - 36243 - 11905: 0xDA72, - 36244 - 11905: 0xF4F3, - 36245 - 11905: 0xDA73, - 36246 - 11905: 0xDA74, - 36247 - 11905: 0xDA75, - 36248 - 11905: 0xDA76, - 36249 - 11905: 0xDA77, - 36250 - 11905: 0xDA78, - 36251 - 11905: 0xDA79, - 36252 - 11905: 0xDA7A, - 36253 - 11905: 0xDA7B, - 36254 - 11905: 0xDA7C, - 36255 - 11905: 0xCCCB, - 36256 - 11905: 0xDA7D, - 36257 - 11905: 0xDA7E, - 36258 - 11905: 0xDA80, - 36259 - 11905: 0xC8A4, - 36260 - 11905: 0xDA81, - 36261 - 11905: 0xDA82, - 36262 - 11905: 0xDA83, - 36263 - 11905: 0xDA84, - 36264 - 11905: 0xDA85, - 36265 - 11905: 0xDA86, - 36266 - 11905: 0xDA87, - 36267 - 11905: 0xDA88, - 36268 - 11905: 0xDA89, - 36269 - 11905: 0xDA8A, - 36270 - 11905: 0xDA8B, - 36271 - 11905: 0xDA8C, - 36272 - 11905: 0xDA8D, - 36273 - 11905: 0xF4F5, - 36274 - 11905: 0xDA8E, - 36275 - 11905: 0xD7E3, - 36276 - 11905: 0xC5BF, - 36277 - 11905: 0xF5C0, - 36278 - 11905: 0xDA8F, - 36279 - 11905: 0xDA90, - 36280 - 11905: 0xF5BB, - 36281 - 11905: 0xDA91, - 36282 - 11905: 0xF5C3, - 36283 - 11905: 0xDA92, - 36284 - 11905: 0xF5C2, - 36285 - 11905: 0xDA93, - 36286 - 11905: 0xD6BA, - 36287 - 11905: 0xF5C1, - 36288 - 11905: 0xDA94, - 36289 - 11905: 0xDA95, - 36290 - 11905: 0xDA96, - 36291 - 11905: 0xD4BE, - 36292 - 11905: 0xF5C4, - 36293 - 11905: 0xDA97, - 36294 - 11905: 0xF5CC, - 36295 - 11905: 0xDA98, - 36296 - 11905: 0xDA99, - 36297 - 11905: 0xDA9A, - 36298 - 11905: 0xDA9B, - 36299 - 11905: 0xB0CF, - 36300 - 11905: 0xB5F8, - 36301 - 11905: 0xDA9C, - 36302 - 11905: 0xF5C9, - 36303 - 11905: 0xF5CA, - 36304 - 11905: 0xDA9D, - 36305 - 11905: 0xC5DC, - 36306 - 11905: 0xDA9E, - 36307 - 11905: 0xDA9F, - 36308 - 11905: 0xDAA0, - 36309 - 11905: 0xDB40, - 36310 - 11905: 0xF5C5, - 36311 - 11905: 0xF5C6, - 36312 - 11905: 0xDB41, - 36313 - 11905: 0xDB42, - 36314 - 11905: 0xF5C7, - 36315 - 11905: 0xF5CB, - 36316 - 11905: 0xDB43, - 36317 - 11905: 0xBEE0, - 36318 - 11905: 0xF5C8, - 36319 - 11905: 0xB8FA, - 36320 - 11905: 0xDB44, - 36321 - 11905: 0xDB45, - 36322 - 11905: 0xDB46, - 36323 - 11905: 0xF5D0, - 36324 - 11905: 0xF5D3, - 36325 - 11905: 0xDB47, - 36326 - 11905: 0xDB48, - 36327 - 11905: 0xDB49, - 36328 - 11905: 0xBFE7, - 36329 - 11905: 0xDB4A, - 36330 - 11905: 0xB9F2, - 36331 - 11905: 0xF5BC, - 36332 - 11905: 0xF5CD, - 36333 - 11905: 0xDB4B, - 36334 - 11905: 0xDB4C, - 36335 - 11905: 0xC2B7, - 36336 - 11905: 0xDB4D, - 36337 - 11905: 0xDB4E, - 36338 - 11905: 0xDB4F, - 36339 - 11905: 0xCCF8, - 36340 - 11905: 0xDB50, - 36341 - 11905: 0xBCF9, - 36342 - 11905: 0xDB51, - 36343 - 11905: 0xF5CE, - 36344 - 11905: 0xF5CF, - 36345 - 11905: 0xF5D1, - 36346 - 11905: 0xB6E5, - 36347 - 11905: 0xF5D2, - 36348 - 11905: 0xDB52, - 36349 - 11905: 0xF5D5, - 36350 - 11905: 0xDB53, - 36351 - 11905: 0xDB54, - 36352 - 11905: 0xDB55, - 36353 - 11905: 0xDB56, - 36354 - 11905: 0xDB57, - 36355 - 11905: 0xDB58, - 36356 - 11905: 0xDB59, - 36357 - 11905: 0xF5BD, - 36358 - 11905: 0xDB5A, - 36359 - 11905: 0xDB5B, - 36360 - 11905: 0xDB5C, - 36361 - 11905: 0xF5D4, - 36362 - 11905: 0xD3BB, - 36363 - 11905: 0xDB5D, - 36364 - 11905: 0xB3EC, - 36365 - 11905: 0xDB5E, - 36366 - 11905: 0xDB5F, - 36367 - 11905: 0xCCA4, - 36368 - 11905: 0xDB60, - 36369 - 11905: 0xDB61, - 36370 - 11905: 0xDB62, - 36371 - 11905: 0xDB63, - 36372 - 11905: 0xF5D6, - 36373 - 11905: 0xDB64, - 36374 - 11905: 0xDB65, - 36375 - 11905: 0xDB66, - 36376 - 11905: 0xDB67, - 36377 - 11905: 0xDB68, - 36378 - 11905: 0xDB69, - 36379 - 11905: 0xDB6A, - 36380 - 11905: 0xDB6B, - 36381 - 11905: 0xF5D7, - 36382 - 11905: 0xBEE1, - 36383 - 11905: 0xF5D8, - 36384 - 11905: 0xDB6C, - 36385 - 11905: 0xDB6D, - 36386 - 11905: 0xCCDF, - 36387 - 11905: 0xF5DB, - 36388 - 11905: 0xDB6E, - 36389 - 11905: 0xDB6F, - 36390 - 11905: 0xDB70, - 36391 - 11905: 0xDB71, - 36392 - 11905: 0xDB72, - 36393 - 11905: 0xB2C8, - 36394 - 11905: 0xD7D9, - 36395 - 11905: 0xDB73, - 36396 - 11905: 0xF5D9, - 36397 - 11905: 0xDB74, - 36398 - 11905: 0xF5DA, - 36399 - 11905: 0xF5DC, - 36400 - 11905: 0xDB75, - 36401 - 11905: 0xF5E2, - 36402 - 11905: 0xDB76, - 36403 - 11905: 0xDB77, - 36404 - 11905: 0xDB78, - 36405 - 11905: 0xF5E0, - 36406 - 11905: 0xDB79, - 36407 - 11905: 0xDB7A, - 36408 - 11905: 0xDB7B, - 36409 - 11905: 0xF5DF, - 36410 - 11905: 0xF5DD, - 36411 - 11905: 0xDB7C, - 36412 - 11905: 0xDB7D, - 36413 - 11905: 0xF5E1, - 36414 - 11905: 0xDB7E, - 36415 - 11905: 0xDB80, - 36416 - 11905: 0xF5DE, - 36417 - 11905: 0xF5E4, - 36418 - 11905: 0xF5E5, - 36419 - 11905: 0xDB81, - 36420 - 11905: 0xCCE3, - 36421 - 11905: 0xDB82, - 36422 - 11905: 0xDB83, - 36423 - 11905: 0xE5BF, - 36424 - 11905: 0xB5B8, - 36425 - 11905: 0xF5E3, - 36426 - 11905: 0xF5E8, - 36427 - 11905: 0xCCA3, - 36428 - 11905: 0xDB84, - 36429 - 11905: 0xDB85, - 36430 - 11905: 0xDB86, - 36431 - 11905: 0xDB87, - 36432 - 11905: 0xDB88, - 36433 - 11905: 0xF5E6, - 36434 - 11905: 0xF5E7, - 36435 - 11905: 0xDB89, - 36436 - 11905: 0xDB8A, - 36437 - 11905: 0xDB8B, - 36438 - 11905: 0xDB8C, - 36439 - 11905: 0xDB8D, - 36440 - 11905: 0xDB8E, - 36441 - 11905: 0xF5BE, - 36442 - 11905: 0xDB8F, - 36443 - 11905: 0xDB90, - 36444 - 11905: 0xDB91, - 36445 - 11905: 0xDB92, - 36446 - 11905: 0xDB93, - 36447 - 11905: 0xDB94, - 36448 - 11905: 0xDB95, - 36449 - 11905: 0xDB96, - 36450 - 11905: 0xDB97, - 36451 - 11905: 0xDB98, - 36452 - 11905: 0xDB99, - 36453 - 11905: 0xDB9A, - 36454 - 11905: 0xB1C4, - 36455 - 11905: 0xDB9B, - 36456 - 11905: 0xDB9C, - 36457 - 11905: 0xF5BF, - 36458 - 11905: 0xDB9D, - 36459 - 11905: 0xDB9E, - 36460 - 11905: 0xB5C5, - 36461 - 11905: 0xB2E4, - 36462 - 11905: 0xDB9F, - 36463 - 11905: 0xF5EC, - 36464 - 11905: 0xF5E9, - 36465 - 11905: 0xDBA0, - 36466 - 11905: 0xB6D7, - 36467 - 11905: 0xDC40, - 36468 - 11905: 0xF5ED, - 36469 - 11905: 0xDC41, - 36470 - 11905: 0xF5EA, - 36471 - 11905: 0xDC42, - 36472 - 11905: 0xDC43, - 36473 - 11905: 0xDC44, - 36474 - 11905: 0xDC45, - 36475 - 11905: 0xDC46, - 36476 - 11905: 0xF5EB, - 36477 - 11905: 0xDC47, - 36478 - 11905: 0xDC48, - 36479 - 11905: 0xB4DA, - 36480 - 11905: 0xDC49, - 36481 - 11905: 0xD4EA, - 36482 - 11905: 0xDC4A, - 36483 - 11905: 0xDC4B, - 36484 - 11905: 0xDC4C, - 36485 - 11905: 0xF5EE, - 36486 - 11905: 0xDC4D, - 36487 - 11905: 0xB3F9, - 36488 - 11905: 0xDC4E, - 36489 - 11905: 0xDC4F, - 36490 - 11905: 0xDC50, - 36491 - 11905: 0xDC51, - 36492 - 11905: 0xDC52, - 36493 - 11905: 0xDC53, - 36494 - 11905: 0xDC54, - 36495 - 11905: 0xF5EF, - 36496 - 11905: 0xF5F1, - 36497 - 11905: 0xDC55, - 36498 - 11905: 0xDC56, - 36499 - 11905: 0xDC57, - 36500 - 11905: 0xF5F0, - 36501 - 11905: 0xDC58, - 36502 - 11905: 0xDC59, - 36503 - 11905: 0xDC5A, - 36504 - 11905: 0xDC5B, - 36505 - 11905: 0xDC5C, - 36506 - 11905: 0xDC5D, - 36507 - 11905: 0xDC5E, - 36508 - 11905: 0xF5F2, - 36509 - 11905: 0xDC5F, - 36510 - 11905: 0xF5F3, - 36511 - 11905: 0xDC60, - 36512 - 11905: 0xDC61, - 36513 - 11905: 0xDC62, - 36514 - 11905: 0xDC63, - 36515 - 11905: 0xDC64, - 36516 - 11905: 0xDC65, - 36517 - 11905: 0xDC66, - 36518 - 11905: 0xDC67, - 36519 - 11905: 0xDC68, - 36520 - 11905: 0xDC69, - 36521 - 11905: 0xDC6A, - 36522 - 11905: 0xDC6B, - 36523 - 11905: 0xC9ED, - 36524 - 11905: 0xB9AA, - 36525 - 11905: 0xDC6C, - 36526 - 11905: 0xDC6D, - 36527 - 11905: 0xC7FB, - 36528 - 11905: 0xDC6E, - 36529 - 11905: 0xDC6F, - 36530 - 11905: 0xB6E3, - 36531 - 11905: 0xDC70, - 36532 - 11905: 0xDC71, - 36533 - 11905: 0xDC72, - 36534 - 11905: 0xDC73, - 36535 - 11905: 0xDC74, - 36536 - 11905: 0xDC75, - 36537 - 11905: 0xDC76, - 36538 - 11905: 0xCCC9, - 36539 - 11905: 0xDC77, - 36540 - 11905: 0xDC78, - 36541 - 11905: 0xDC79, - 36542 - 11905: 0xDC7A, - 36543 - 11905: 0xDC7B, - 36544 - 11905: 0xDC7C, - 36545 - 11905: 0xDC7D, - 36546 - 11905: 0xDC7E, - 36547 - 11905: 0xDC80, - 36548 - 11905: 0xDC81, - 36549 - 11905: 0xDC82, - 36550 - 11905: 0xDC83, - 36551 - 11905: 0xDC84, - 36552 - 11905: 0xDC85, - 36553 - 11905: 0xDC86, - 36554 - 11905: 0xDC87, - 36555 - 11905: 0xDC88, - 36556 - 11905: 0xDC89, - 36557 - 11905: 0xDC8A, - 36558 - 11905: 0xEAA6, - 36559 - 11905: 0xDC8B, - 36560 - 11905: 0xDC8C, - 36561 - 11905: 0xDC8D, - 36562 - 11905: 0xDC8E, - 36563 - 11905: 0xDC8F, - 36564 - 11905: 0xDC90, - 36565 - 11905: 0xDC91, - 36566 - 11905: 0xDC92, - 36567 - 11905: 0xDC93, - 36568 - 11905: 0xDC94, - 36569 - 11905: 0xDC95, - 36570 - 11905: 0xDC96, - 36571 - 11905: 0xDC97, - 36572 - 11905: 0xDC98, - 36573 - 11905: 0xDC99, - 36574 - 11905: 0xDC9A, - 36575 - 11905: 0xDC9B, - 36576 - 11905: 0xDC9C, - 36577 - 11905: 0xDC9D, - 36578 - 11905: 0xDC9E, - 36579 - 11905: 0xDC9F, - 36580 - 11905: 0xDCA0, - 36581 - 11905: 0xDD40, - 36582 - 11905: 0xDD41, - 36583 - 11905: 0xDD42, - 36584 - 11905: 0xDD43, - 36585 - 11905: 0xDD44, - 36586 - 11905: 0xDD45, - 36587 - 11905: 0xDD46, - 36588 - 11905: 0xDD47, - 36589 - 11905: 0xDD48, - 36590 - 11905: 0xDD49, - 36591 - 11905: 0xDD4A, - 36592 - 11905: 0xDD4B, - 36593 - 11905: 0xDD4C, - 36594 - 11905: 0xDD4D, - 36595 - 11905: 0xDD4E, - 36596 - 11905: 0xDD4F, - 36597 - 11905: 0xDD50, - 36598 - 11905: 0xDD51, - 36599 - 11905: 0xDD52, - 36600 - 11905: 0xDD53, - 36601 - 11905: 0xDD54, - 36602 - 11905: 0xDD55, - 36603 - 11905: 0xDD56, - 36604 - 11905: 0xDD57, - 36605 - 11905: 0xDD58, - 36606 - 11905: 0xDD59, - 36607 - 11905: 0xDD5A, - 36608 - 11905: 0xDD5B, - 36609 - 11905: 0xDD5C, - 36610 - 11905: 0xDD5D, - 36611 - 11905: 0xDD5E, - 36612 - 11905: 0xDD5F, - 36613 - 11905: 0xDD60, - 36614 - 11905: 0xDD61, - 36615 - 11905: 0xDD62, - 36616 - 11905: 0xDD63, - 36617 - 11905: 0xDD64, - 36618 - 11905: 0xDD65, - 36619 - 11905: 0xDD66, - 36620 - 11905: 0xDD67, - 36621 - 11905: 0xDD68, - 36622 - 11905: 0xDD69, - 36623 - 11905: 0xDD6A, - 36624 - 11905: 0xDD6B, - 36625 - 11905: 0xDD6C, - 36626 - 11905: 0xDD6D, - 36627 - 11905: 0xDD6E, - 36628 - 11905: 0xDD6F, - 36629 - 11905: 0xDD70, - 36630 - 11905: 0xDD71, - 36631 - 11905: 0xDD72, - 36632 - 11905: 0xDD73, - 36633 - 11905: 0xDD74, - 36634 - 11905: 0xDD75, - 36635 - 11905: 0xDD76, - 36636 - 11905: 0xDD77, - 36637 - 11905: 0xDD78, - 36638 - 11905: 0xDD79, - 36639 - 11905: 0xDD7A, - 36640 - 11905: 0xDD7B, - 36641 - 11905: 0xDD7C, - 36642 - 11905: 0xDD7D, - 36643 - 11905: 0xDD7E, - 36644 - 11905: 0xDD80, - 36645 - 11905: 0xDD81, - 36646 - 11905: 0xDD82, - 36647 - 11905: 0xDD83, - 36648 - 11905: 0xDD84, - 36649 - 11905: 0xDD85, - 36650 - 11905: 0xDD86, - 36651 - 11905: 0xDD87, - 36652 - 11905: 0xDD88, - 36653 - 11905: 0xDD89, - 36654 - 11905: 0xDD8A, - 36655 - 11905: 0xDD8B, - 36656 - 11905: 0xDD8C, - 36657 - 11905: 0xDD8D, - 36658 - 11905: 0xDD8E, - 36659 - 11905: 0xDD8F, - 36660 - 11905: 0xDD90, - 36661 - 11905: 0xDD91, - 36662 - 11905: 0xDD92, - 36663 - 11905: 0xDD93, - 36664 - 11905: 0xDD94, - 36665 - 11905: 0xDD95, - 36666 - 11905: 0xDD96, - 36667 - 11905: 0xDD97, - 36668 - 11905: 0xDD98, - 36669 - 11905: 0xDD99, - 36670 - 11905: 0xDD9A, - 36671 - 11905: 0xDD9B, - 36672 - 11905: 0xDD9C, - 36673 - 11905: 0xDD9D, - 36674 - 11905: 0xDD9E, - 36675 - 11905: 0xDD9F, - 36676 - 11905: 0xDDA0, - 36677 - 11905: 0xDE40, - 36678 - 11905: 0xDE41, - 36679 - 11905: 0xDE42, - 36680 - 11905: 0xDE43, - 36681 - 11905: 0xDE44, - 36682 - 11905: 0xDE45, - 36683 - 11905: 0xDE46, - 36684 - 11905: 0xDE47, - 36685 - 11905: 0xDE48, - 36686 - 11905: 0xDE49, - 36687 - 11905: 0xDE4A, - 36688 - 11905: 0xDE4B, - 36689 - 11905: 0xDE4C, - 36690 - 11905: 0xDE4D, - 36691 - 11905: 0xDE4E, - 36692 - 11905: 0xDE4F, - 36693 - 11905: 0xDE50, - 36694 - 11905: 0xDE51, - 36695 - 11905: 0xDE52, - 36696 - 11905: 0xDE53, - 36697 - 11905: 0xDE54, - 36698 - 11905: 0xDE55, - 36699 - 11905: 0xDE56, - 36700 - 11905: 0xDE57, - 36701 - 11905: 0xDE58, - 36702 - 11905: 0xDE59, - 36703 - 11905: 0xDE5A, - 36704 - 11905: 0xDE5B, - 36705 - 11905: 0xDE5C, - 36706 - 11905: 0xDE5D, - 36707 - 11905: 0xDE5E, - 36708 - 11905: 0xDE5F, - 36709 - 11905: 0xDE60, - 36710 - 11905: 0xB3B5, - 36711 - 11905: 0xD4FE, - 36712 - 11905: 0xB9EC, - 36713 - 11905: 0xD0F9, - 36714 - 11905: 0xDE61, - 36715 - 11905: 0xE9ED, - 36716 - 11905: 0xD7AA, - 36717 - 11905: 0xE9EE, - 36718 - 11905: 0xC2D6, - 36719 - 11905: 0xC8ED, - 36720 - 11905: 0xBAE4, - 36721 - 11905: 0xE9EF, - 36722 - 11905: 0xE9F0, - 36723 - 11905: 0xE9F1, - 36724 - 11905: 0xD6E1, - 36725 - 11905: 0xE9F2, - 36726 - 11905: 0xE9F3, - 36727 - 11905: 0xE9F5, - 36728 - 11905: 0xE9F4, - 36729 - 11905: 0xE9F6, - 36730 - 11905: 0xE9F7, - 36731 - 11905: 0xC7E1, - 36732 - 11905: 0xE9F8, - 36733 - 11905: 0xD4D8, - 36734 - 11905: 0xE9F9, - 36735 - 11905: 0xBDCE, - 36736 - 11905: 0xDE62, - 36737 - 11905: 0xE9FA, - 36738 - 11905: 0xE9FB, - 36739 - 11905: 0xBDCF, - 36740 - 11905: 0xE9FC, - 36741 - 11905: 0xB8A8, - 36742 - 11905: 0xC1BE, - 36743 - 11905: 0xE9FD, - 36744 - 11905: 0xB1B2, - 36745 - 11905: 0xBBD4, - 36746 - 11905: 0xB9F5, - 36747 - 11905: 0xE9FE, - 36748 - 11905: 0xDE63, - 36749 - 11905: 0xEAA1, - 36750 - 11905: 0xEAA2, - 36751 - 11905: 0xEAA3, - 36752 - 11905: 0xB7F8, - 36753 - 11905: 0xBCAD, - 36754 - 11905: 0xDE64, - 36755 - 11905: 0xCAE4, - 36756 - 11905: 0xE0CE, - 36757 - 11905: 0xD4AF, - 36758 - 11905: 0xCFBD, - 36759 - 11905: 0xD5B7, - 36760 - 11905: 0xEAA4, - 36761 - 11905: 0xD5DE, - 36762 - 11905: 0xEAA5, - 36763 - 11905: 0xD0C1, - 36764 - 11905: 0xB9BC, - 36765 - 11905: 0xDE65, - 36766 - 11905: 0xB4C7, - 36767 - 11905: 0xB1D9, - 36768 - 11905: 0xDE66, - 36769 - 11905: 0xDE67, - 36770 - 11905: 0xDE68, - 36771 - 11905: 0xC0B1, - 36772 - 11905: 0xDE69, - 36773 - 11905: 0xDE6A, - 36774 - 11905: 0xDE6B, - 36775 - 11905: 0xDE6C, - 36776 - 11905: 0xB1E6, - 36777 - 11905: 0xB1E7, - 36778 - 11905: 0xDE6D, - 36779 - 11905: 0xB1E8, - 36780 - 11905: 0xDE6E, - 36781 - 11905: 0xDE6F, - 36782 - 11905: 0xDE70, - 36783 - 11905: 0xDE71, - 36784 - 11905: 0xB3BD, - 36785 - 11905: 0xC8E8, - 36786 - 11905: 0xDE72, - 36787 - 11905: 0xDE73, - 36788 - 11905: 0xDE74, - 36789 - 11905: 0xDE75, - 36790 - 11905: 0xE5C1, - 36791 - 11905: 0xDE76, - 36792 - 11905: 0xDE77, - 36793 - 11905: 0xB1DF, - 36794 - 11905: 0xDE78, - 36795 - 11905: 0xDE79, - 36796 - 11905: 0xDE7A, - 36797 - 11905: 0xC1C9, - 36798 - 11905: 0xB4EF, - 36799 - 11905: 0xDE7B, - 36800 - 11905: 0xDE7C, - 36801 - 11905: 0xC7A8, - 36802 - 11905: 0xD3D8, - 36803 - 11905: 0xDE7D, - 36804 - 11905: 0xC6F9, - 36805 - 11905: 0xD1B8, - 36806 - 11905: 0xDE7E, - 36807 - 11905: 0xB9FD, - 36808 - 11905: 0xC2F5, - 36809 - 11905: 0xDE80, - 36810 - 11905: 0xDE81, - 36811 - 11905: 0xDE82, - 36812 - 11905: 0xDE83, - 36813 - 11905: 0xDE84, - 36814 - 11905: 0xD3AD, - 36815 - 11905: 0xDE85, - 36816 - 11905: 0xD4CB, - 36817 - 11905: 0xBDFC, - 36818 - 11905: 0xDE86, - 36819 - 11905: 0xE5C2, - 36820 - 11905: 0xB7B5, - 36821 - 11905: 0xE5C3, - 36822 - 11905: 0xDE87, - 36823 - 11905: 0xDE88, - 36824 - 11905: 0xBBB9, - 36825 - 11905: 0xD5E2, - 36826 - 11905: 0xDE89, - 36827 - 11905: 0xBDF8, - 36828 - 11905: 0xD4B6, - 36829 - 11905: 0xCEA5, - 36830 - 11905: 0xC1AC, - 36831 - 11905: 0xB3D9, - 36832 - 11905: 0xDE8A, - 36833 - 11905: 0xDE8B, - 36834 - 11905: 0xCCF6, - 36835 - 11905: 0xDE8C, - 36836 - 11905: 0xE5C6, - 36837 - 11905: 0xE5C4, - 36838 - 11905: 0xE5C8, - 36839 - 11905: 0xDE8D, - 36840 - 11905: 0xE5CA, - 36841 - 11905: 0xE5C7, - 36842 - 11905: 0xB5CF, - 36843 - 11905: 0xC6C8, - 36844 - 11905: 0xDE8E, - 36845 - 11905: 0xB5FC, - 36846 - 11905: 0xE5C5, - 36847 - 11905: 0xDE8F, - 36848 - 11905: 0xCAF6, - 36849 - 11905: 0xDE90, - 36850 - 11905: 0xDE91, - 36851 - 11905: 0xE5C9, - 36852 - 11905: 0xDE92, - 36853 - 11905: 0xDE93, - 36854 - 11905: 0xDE94, - 36855 - 11905: 0xC3D4, - 36856 - 11905: 0xB1C5, - 36857 - 11905: 0xBCA3, - 36858 - 11905: 0xDE95, - 36859 - 11905: 0xDE96, - 36860 - 11905: 0xDE97, - 36861 - 11905: 0xD7B7, - 36862 - 11905: 0xDE98, - 36863 - 11905: 0xDE99, - 36864 - 11905: 0xCDCB, - 36865 - 11905: 0xCBCD, - 36866 - 11905: 0xCACA, - 36867 - 11905: 0xCCD3, - 36868 - 11905: 0xE5CC, - 36869 - 11905: 0xE5CB, - 36870 - 11905: 0xC4E6, - 36871 - 11905: 0xDE9A, - 36872 - 11905: 0xDE9B, - 36873 - 11905: 0xD1A1, - 36874 - 11905: 0xD1B7, - 36875 - 11905: 0xE5CD, - 36876 - 11905: 0xDE9C, - 36877 - 11905: 0xE5D0, - 36878 - 11905: 0xDE9D, - 36879 - 11905: 0xCDB8, - 36880 - 11905: 0xD6F0, - 36881 - 11905: 0xE5CF, - 36882 - 11905: 0xB5DD, - 36883 - 11905: 0xDE9E, - 36884 - 11905: 0xCDBE, - 36885 - 11905: 0xDE9F, - 36886 - 11905: 0xE5D1, - 36887 - 11905: 0xB6BA, - 36888 - 11905: 0xDEA0, - 36889 - 11905: 0xDF40, - 36890 - 11905: 0xCDA8, - 36891 - 11905: 0xB9E4, - 36892 - 11905: 0xDF41, - 36893 - 11905: 0xCAC5, - 36894 - 11905: 0xB3D1, - 36895 - 11905: 0xCBD9, - 36896 - 11905: 0xD4EC, - 36897 - 11905: 0xE5D2, - 36898 - 11905: 0xB7EA, - 36899 - 11905: 0xDF42, - 36900 - 11905: 0xDF43, - 36901 - 11905: 0xDF44, - 36902 - 11905: 0xE5CE, - 36903 - 11905: 0xDF45, - 36904 - 11905: 0xDF46, - 36905 - 11905: 0xDF47, - 36906 - 11905: 0xDF48, - 36907 - 11905: 0xDF49, - 36908 - 11905: 0xDF4A, - 36909 - 11905: 0xE5D5, - 36910 - 11905: 0xB4FE, - 36911 - 11905: 0xE5D6, - 36912 - 11905: 0xDF4B, - 36913 - 11905: 0xDF4C, - 36914 - 11905: 0xDF4D, - 36915 - 11905: 0xDF4E, - 36916 - 11905: 0xDF4F, - 36917 - 11905: 0xE5D3, - 36918 - 11905: 0xE5D4, - 36919 - 11905: 0xDF50, - 36920 - 11905: 0xD2DD, - 36921 - 11905: 0xDF51, - 36922 - 11905: 0xDF52, - 36923 - 11905: 0xC2DF, - 36924 - 11905: 0xB1C6, - 36925 - 11905: 0xDF53, - 36926 - 11905: 0xD3E2, - 36927 - 11905: 0xDF54, - 36928 - 11905: 0xDF55, - 36929 - 11905: 0xB6DD, - 36930 - 11905: 0xCBEC, - 36931 - 11905: 0xDF56, - 36932 - 11905: 0xE5D7, - 36933 - 11905: 0xDF57, - 36934 - 11905: 0xDF58, - 36935 - 11905: 0xD3F6, - 36936 - 11905: 0xDF59, - 36937 - 11905: 0xDF5A, - 36938 - 11905: 0xDF5B, - 36939 - 11905: 0xDF5C, - 36940 - 11905: 0xDF5D, - 36941 - 11905: 0xB1E9, - 36942 - 11905: 0xDF5E, - 36943 - 11905: 0xB6F4, - 36944 - 11905: 0xE5DA, - 36945 - 11905: 0xE5D8, - 36946 - 11905: 0xE5D9, - 36947 - 11905: 0xB5C0, - 36948 - 11905: 0xDF5F, - 36949 - 11905: 0xDF60, - 36950 - 11905: 0xDF61, - 36951 - 11905: 0xD2C5, - 36952 - 11905: 0xE5DC, - 36953 - 11905: 0xDF62, - 36954 - 11905: 0xDF63, - 36955 - 11905: 0xE5DE, - 36956 - 11905: 0xDF64, - 36957 - 11905: 0xDF65, - 36958 - 11905: 0xDF66, - 36959 - 11905: 0xDF67, - 36960 - 11905: 0xDF68, - 36961 - 11905: 0xDF69, - 36962 - 11905: 0xE5DD, - 36963 - 11905: 0xC7B2, - 36964 - 11905: 0xDF6A, - 36965 - 11905: 0xD2A3, - 36966 - 11905: 0xDF6B, - 36967 - 11905: 0xDF6C, - 36968 - 11905: 0xE5DB, - 36969 - 11905: 0xDF6D, - 36970 - 11905: 0xDF6E, - 36971 - 11905: 0xDF6F, - 36972 - 11905: 0xDF70, - 36973 - 11905: 0xD4E2, - 36974 - 11905: 0xD5DA, - 36975 - 11905: 0xDF71, - 36976 - 11905: 0xDF72, - 36977 - 11905: 0xDF73, - 36978 - 11905: 0xDF74, - 36979 - 11905: 0xDF75, - 36980 - 11905: 0xE5E0, - 36981 - 11905: 0xD7F1, - 36982 - 11905: 0xDF76, - 36983 - 11905: 0xDF77, - 36984 - 11905: 0xDF78, - 36985 - 11905: 0xDF79, - 36986 - 11905: 0xDF7A, - 36987 - 11905: 0xDF7B, - 36988 - 11905: 0xDF7C, - 36989 - 11905: 0xE5E1, - 36990 - 11905: 0xDF7D, - 36991 - 11905: 0xB1DC, - 36992 - 11905: 0xD1FB, - 36993 - 11905: 0xDF7E, - 36994 - 11905: 0xE5E2, - 36995 - 11905: 0xE5E4, - 36996 - 11905: 0xDF80, - 36997 - 11905: 0xDF81, - 36998 - 11905: 0xDF82, - 36999 - 11905: 0xDF83, - 37000 - 11905: 0xE5E3, - 37001 - 11905: 0xDF84, - 37002 - 11905: 0xDF85, - 37003 - 11905: 0xE5E5, - 37004 - 11905: 0xDF86, - 37005 - 11905: 0xDF87, - 37006 - 11905: 0xDF88, - 37007 - 11905: 0xDF89, - 37008 - 11905: 0xDF8A, - 37009 - 11905: 0xD2D8, - 37010 - 11905: 0xDF8B, - 37011 - 11905: 0xB5CB, - 37012 - 11905: 0xDF8C, - 37013 - 11905: 0xE7DF, - 37014 - 11905: 0xDF8D, - 37015 - 11905: 0xDAF5, - 37016 - 11905: 0xDF8E, - 37017 - 11905: 0xDAF8, - 37018 - 11905: 0xDF8F, - 37019 - 11905: 0xDAF6, - 37020 - 11905: 0xDF90, - 37021 - 11905: 0xDAF7, - 37022 - 11905: 0xDF91, - 37023 - 11905: 0xDF92, - 37024 - 11905: 0xDF93, - 37025 - 11905: 0xDAFA, - 37026 - 11905: 0xD0CF, - 37027 - 11905: 0xC4C7, - 37028 - 11905: 0xDF94, - 37029 - 11905: 0xDF95, - 37030 - 11905: 0xB0EE, - 37031 - 11905: 0xDF96, - 37032 - 11905: 0xDF97, - 37033 - 11905: 0xDF98, - 37034 - 11905: 0xD0B0, - 37035 - 11905: 0xDF99, - 37036 - 11905: 0xDAF9, - 37037 - 11905: 0xDF9A, - 37038 - 11905: 0xD3CA, - 37039 - 11905: 0xBAAA, - 37040 - 11905: 0xDBA2, - 37041 - 11905: 0xC7F1, - 37042 - 11905: 0xDF9B, - 37043 - 11905: 0xDAFC, - 37044 - 11905: 0xDAFB, - 37045 - 11905: 0xC9DB, - 37046 - 11905: 0xDAFD, - 37047 - 11905: 0xDF9C, - 37048 - 11905: 0xDBA1, - 37049 - 11905: 0xD7DE, - 37050 - 11905: 0xDAFE, - 37051 - 11905: 0xC1DA, - 37052 - 11905: 0xDF9D, - 37053 - 11905: 0xDF9E, - 37054 - 11905: 0xDBA5, - 37055 - 11905: 0xDF9F, - 37056 - 11905: 0xDFA0, - 37057 - 11905: 0xD3F4, - 37058 - 11905: 0xE040, - 37059 - 11905: 0xE041, - 37060 - 11905: 0xDBA7, - 37061 - 11905: 0xDBA4, - 37062 - 11905: 0xE042, - 37063 - 11905: 0xDBA8, - 37064 - 11905: 0xE043, - 37065 - 11905: 0xE044, - 37066 - 11905: 0xBDBC, - 37067 - 11905: 0xE045, - 37068 - 11905: 0xE046, - 37069 - 11905: 0xE047, - 37070 - 11905: 0xC0C9, - 37071 - 11905: 0xDBA3, - 37072 - 11905: 0xDBA6, - 37073 - 11905: 0xD6A3, - 37074 - 11905: 0xE048, - 37075 - 11905: 0xDBA9, - 37076 - 11905: 0xE049, - 37077 - 11905: 0xE04A, - 37078 - 11905: 0xE04B, - 37079 - 11905: 0xDBAD, - 37080 - 11905: 0xE04C, - 37081 - 11905: 0xE04D, - 37082 - 11905: 0xE04E, - 37083 - 11905: 0xDBAE, - 37084 - 11905: 0xDBAC, - 37085 - 11905: 0xBAC2, - 37086 - 11905: 0xE04F, - 37087 - 11905: 0xE050, - 37088 - 11905: 0xE051, - 37089 - 11905: 0xBFA4, - 37090 - 11905: 0xDBAB, - 37091 - 11905: 0xE052, - 37092 - 11905: 0xE053, - 37093 - 11905: 0xE054, - 37094 - 11905: 0xDBAA, - 37095 - 11905: 0xD4C7, - 37096 - 11905: 0xB2BF, - 37097 - 11905: 0xE055, - 37098 - 11905: 0xE056, - 37099 - 11905: 0xDBAF, - 37100 - 11905: 0xE057, - 37101 - 11905: 0xB9F9, - 37102 - 11905: 0xE058, - 37103 - 11905: 0xDBB0, - 37104 - 11905: 0xE059, - 37105 - 11905: 0xE05A, - 37106 - 11905: 0xE05B, - 37107 - 11905: 0xE05C, - 37108 - 11905: 0xB3BB, - 37109 - 11905: 0xE05D, - 37110 - 11905: 0xE05E, - 37111 - 11905: 0xE05F, - 37112 - 11905: 0xB5A6, - 37113 - 11905: 0xE060, - 37114 - 11905: 0xE061, - 37115 - 11905: 0xE062, - 37116 - 11905: 0xE063, - 37117 - 11905: 0xB6BC, - 37118 - 11905: 0xDBB1, - 37119 - 11905: 0xE064, - 37120 - 11905: 0xE065, - 37121 - 11905: 0xE066, - 37122 - 11905: 0xB6F5, - 37123 - 11905: 0xE067, - 37124 - 11905: 0xDBB2, - 37125 - 11905: 0xE068, - 37126 - 11905: 0xE069, - 37127 - 11905: 0xE06A, - 37128 - 11905: 0xE06B, - 37129 - 11905: 0xE06C, - 37130 - 11905: 0xE06D, - 37131 - 11905: 0xE06E, - 37132 - 11905: 0xE06F, - 37133 - 11905: 0xE070, - 37134 - 11905: 0xE071, - 37135 - 11905: 0xE072, - 37136 - 11905: 0xE073, - 37137 - 11905: 0xE074, - 37138 - 11905: 0xE075, - 37139 - 11905: 0xE076, - 37140 - 11905: 0xE077, - 37141 - 11905: 0xE078, - 37142 - 11905: 0xE079, - 37143 - 11905: 0xE07A, - 37144 - 11905: 0xE07B, - 37145 - 11905: 0xB1C9, - 37146 - 11905: 0xE07C, - 37147 - 11905: 0xE07D, - 37148 - 11905: 0xE07E, - 37149 - 11905: 0xE080, - 37150 - 11905: 0xDBB4, - 37151 - 11905: 0xE081, - 37152 - 11905: 0xE082, - 37153 - 11905: 0xE083, - 37154 - 11905: 0xDBB3, - 37155 - 11905: 0xDBB5, - 37156 - 11905: 0xE084, - 37157 - 11905: 0xE085, - 37158 - 11905: 0xE086, - 37159 - 11905: 0xE087, - 37160 - 11905: 0xE088, - 37161 - 11905: 0xE089, - 37162 - 11905: 0xE08A, - 37163 - 11905: 0xE08B, - 37164 - 11905: 0xE08C, - 37165 - 11905: 0xE08D, - 37166 - 11905: 0xE08E, - 37167 - 11905: 0xDBB7, - 37168 - 11905: 0xE08F, - 37169 - 11905: 0xDBB6, - 37170 - 11905: 0xE090, - 37171 - 11905: 0xE091, - 37172 - 11905: 0xE092, - 37173 - 11905: 0xE093, - 37174 - 11905: 0xE094, - 37175 - 11905: 0xE095, - 37176 - 11905: 0xE096, - 37177 - 11905: 0xDBB8, - 37178 - 11905: 0xE097, - 37179 - 11905: 0xE098, - 37180 - 11905: 0xE099, - 37181 - 11905: 0xE09A, - 37182 - 11905: 0xE09B, - 37183 - 11905: 0xE09C, - 37184 - 11905: 0xE09D, - 37185 - 11905: 0xE09E, - 37186 - 11905: 0xE09F, - 37187 - 11905: 0xDBB9, - 37188 - 11905: 0xE0A0, - 37189 - 11905: 0xE140, - 37190 - 11905: 0xDBBA, - 37191 - 11905: 0xE141, - 37192 - 11905: 0xE142, - 37193 - 11905: 0xD3CF, - 37194 - 11905: 0xF4FA, - 37195 - 11905: 0xC7F5, - 37196 - 11905: 0xD7C3, - 37197 - 11905: 0xC5E4, - 37198 - 11905: 0xF4FC, - 37199 - 11905: 0xF4FD, - 37200 - 11905: 0xF4FB, - 37201 - 11905: 0xE143, - 37202 - 11905: 0xBEC6, - 37203 - 11905: 0xE144, - 37204 - 11905: 0xE145, - 37205 - 11905: 0xE146, - 37206 - 11905: 0xE147, - 37207 - 11905: 0xD0EF, - 37208 - 11905: 0xE148, - 37209 - 11905: 0xE149, - 37210 - 11905: 0xB7D3, - 37211 - 11905: 0xE14A, - 37212 - 11905: 0xE14B, - 37213 - 11905: 0xD4CD, - 37214 - 11905: 0xCCAA, - 37215 - 11905: 0xE14C, - 37216 - 11905: 0xE14D, - 37217 - 11905: 0xF5A2, - 37218 - 11905: 0xF5A1, - 37219 - 11905: 0xBAA8, - 37220 - 11905: 0xF4FE, - 37221 - 11905: 0xCBD6, - 37222 - 11905: 0xE14E, - 37223 - 11905: 0xE14F, - 37224 - 11905: 0xE150, - 37225 - 11905: 0xF5A4, - 37226 - 11905: 0xC0D2, - 37227 - 11905: 0xE151, - 37228 - 11905: 0xB3EA, - 37229 - 11905: 0xE152, - 37230 - 11905: 0xCDAA, - 37231 - 11905: 0xF5A5, - 37232 - 11905: 0xF5A3, - 37233 - 11905: 0xBDB4, - 37234 - 11905: 0xF5A8, - 37235 - 11905: 0xE153, - 37236 - 11905: 0xF5A9, - 37237 - 11905: 0xBDCD, - 37238 - 11905: 0xC3B8, - 37239 - 11905: 0xBFE1, - 37240 - 11905: 0xCBE1, - 37241 - 11905: 0xF5AA, - 37242 - 11905: 0xE154, - 37243 - 11905: 0xE155, - 37244 - 11905: 0xE156, - 37245 - 11905: 0xF5A6, - 37246 - 11905: 0xF5A7, - 37247 - 11905: 0xC4F0, - 37248 - 11905: 0xE157, - 37249 - 11905: 0xE158, - 37250 - 11905: 0xE159, - 37251 - 11905: 0xE15A, - 37252 - 11905: 0xE15B, - 37253 - 11905: 0xF5AC, - 37254 - 11905: 0xE15C, - 37255 - 11905: 0xB4BC, - 37256 - 11905: 0xE15D, - 37257 - 11905: 0xD7ED, - 37258 - 11905: 0xE15E, - 37259 - 11905: 0xB4D7, - 37260 - 11905: 0xF5AB, - 37261 - 11905: 0xF5AE, - 37262 - 11905: 0xE15F, - 37263 - 11905: 0xE160, - 37264 - 11905: 0xF5AD, - 37265 - 11905: 0xF5AF, - 37266 - 11905: 0xD0D1, - 37267 - 11905: 0xE161, - 37268 - 11905: 0xE162, - 37269 - 11905: 0xE163, - 37270 - 11905: 0xE164, - 37271 - 11905: 0xE165, - 37272 - 11905: 0xE166, - 37273 - 11905: 0xE167, - 37274 - 11905: 0xC3D1, - 37275 - 11905: 0xC8A9, - 37276 - 11905: 0xE168, - 37277 - 11905: 0xE169, - 37278 - 11905: 0xE16A, - 37279 - 11905: 0xE16B, - 37280 - 11905: 0xE16C, - 37281 - 11905: 0xE16D, - 37282 - 11905: 0xF5B0, - 37283 - 11905: 0xF5B1, - 37284 - 11905: 0xE16E, - 37285 - 11905: 0xE16F, - 37286 - 11905: 0xE170, - 37287 - 11905: 0xE171, - 37288 - 11905: 0xE172, - 37289 - 11905: 0xE173, - 37290 - 11905: 0xF5B2, - 37291 - 11905: 0xE174, - 37292 - 11905: 0xE175, - 37293 - 11905: 0xF5B3, - 37294 - 11905: 0xF5B4, - 37295 - 11905: 0xF5B5, - 37296 - 11905: 0xE176, - 37297 - 11905: 0xE177, - 37298 - 11905: 0xE178, - 37299 - 11905: 0xE179, - 37300 - 11905: 0xF5B7, - 37301 - 11905: 0xF5B6, - 37302 - 11905: 0xE17A, - 37303 - 11905: 0xE17B, - 37304 - 11905: 0xE17C, - 37305 - 11905: 0xE17D, - 37306 - 11905: 0xF5B8, - 37307 - 11905: 0xE17E, - 37308 - 11905: 0xE180, - 37309 - 11905: 0xE181, - 37310 - 11905: 0xE182, - 37311 - 11905: 0xE183, - 37312 - 11905: 0xE184, - 37313 - 11905: 0xE185, - 37314 - 11905: 0xE186, - 37315 - 11905: 0xE187, - 37316 - 11905: 0xE188, - 37317 - 11905: 0xE189, - 37318 - 11905: 0xE18A, - 37319 - 11905: 0xB2C9, - 37320 - 11905: 0xE18B, - 37321 - 11905: 0xD3D4, - 37322 - 11905: 0xCACD, - 37323 - 11905: 0xE18C, - 37324 - 11905: 0xC0EF, - 37325 - 11905: 0xD6D8, - 37326 - 11905: 0xD2B0, - 37327 - 11905: 0xC1BF, - 37328 - 11905: 0xE18D, - 37329 - 11905: 0xBDF0, - 37330 - 11905: 0xE18E, - 37331 - 11905: 0xE18F, - 37332 - 11905: 0xE190, - 37333 - 11905: 0xE191, - 37334 - 11905: 0xE192, - 37335 - 11905: 0xE193, - 37336 - 11905: 0xE194, - 37337 - 11905: 0xE195, - 37338 - 11905: 0xE196, - 37339 - 11905: 0xE197, - 37340 - 11905: 0xB8AA, - 37341 - 11905: 0xE198, - 37342 - 11905: 0xE199, - 37343 - 11905: 0xE19A, - 37344 - 11905: 0xE19B, - 37345 - 11905: 0xE19C, - 37346 - 11905: 0xE19D, - 37347 - 11905: 0xE19E, - 37348 - 11905: 0xE19F, - 37349 - 11905: 0xE1A0, - 37350 - 11905: 0xE240, - 37351 - 11905: 0xE241, - 37352 - 11905: 0xE242, - 37353 - 11905: 0xE243, - 37354 - 11905: 0xE244, - 37355 - 11905: 0xE245, - 37356 - 11905: 0xE246, - 37357 - 11905: 0xE247, - 37358 - 11905: 0xE248, - 37359 - 11905: 0xE249, - 37360 - 11905: 0xE24A, - 37361 - 11905: 0xE24B, - 37362 - 11905: 0xE24C, - 37363 - 11905: 0xE24D, - 37364 - 11905: 0xE24E, - 37365 - 11905: 0xE24F, - 37366 - 11905: 0xE250, - 37367 - 11905: 0xE251, - 37368 - 11905: 0xE252, - 37369 - 11905: 0xE253, - 37370 - 11905: 0xE254, - 37371 - 11905: 0xE255, - 37372 - 11905: 0xE256, - 37373 - 11905: 0xE257, - 37374 - 11905: 0xE258, - 37375 - 11905: 0xE259, - 37376 - 11905: 0xE25A, - 37377 - 11905: 0xE25B, - 37378 - 11905: 0xE25C, - 37379 - 11905: 0xE25D, - 37380 - 11905: 0xE25E, - 37381 - 11905: 0xE25F, - 37382 - 11905: 0xE260, - 37383 - 11905: 0xE261, - 37384 - 11905: 0xE262, - 37385 - 11905: 0xE263, - 37386 - 11905: 0xE264, - 37387 - 11905: 0xE265, - 37388 - 11905: 0xE266, - 37389 - 11905: 0xE267, - 37390 - 11905: 0xE268, - 37391 - 11905: 0xE269, - 37392 - 11905: 0xE26A, - 37393 - 11905: 0xE26B, - 37394 - 11905: 0xE26C, - 37395 - 11905: 0xE26D, - 37396 - 11905: 0xE26E, - 37397 - 11905: 0xE26F, - 37398 - 11905: 0xE270, - 37399 - 11905: 0xE271, - 37400 - 11905: 0xE272, - 37401 - 11905: 0xE273, - 37402 - 11905: 0xE274, - 37403 - 11905: 0xE275, - 37404 - 11905: 0xE276, - 37405 - 11905: 0xE277, - 37406 - 11905: 0xE278, - 37407 - 11905: 0xE279, - 37408 - 11905: 0xE27A, - 37409 - 11905: 0xE27B, - 37410 - 11905: 0xE27C, - 37411 - 11905: 0xE27D, - 37412 - 11905: 0xE27E, - 37413 - 11905: 0xE280, - 37414 - 11905: 0xE281, - 37415 - 11905: 0xE282, - 37416 - 11905: 0xE283, - 37417 - 11905: 0xE284, - 37418 - 11905: 0xE285, - 37419 - 11905: 0xE286, - 37420 - 11905: 0xE287, - 37421 - 11905: 0xE288, - 37422 - 11905: 0xE289, - 37423 - 11905: 0xE28A, - 37424 - 11905: 0xE28B, - 37425 - 11905: 0xE28C, - 37426 - 11905: 0xE28D, - 37427 - 11905: 0xE28E, - 37428 - 11905: 0xE28F, - 37429 - 11905: 0xE290, - 37430 - 11905: 0xE291, - 37431 - 11905: 0xE292, - 37432 - 11905: 0xE293, - 37433 - 11905: 0xE294, - 37434 - 11905: 0xE295, - 37435 - 11905: 0xE296, - 37436 - 11905: 0xE297, - 37437 - 11905: 0xE298, - 37438 - 11905: 0xE299, - 37439 - 11905: 0xE29A, - 37440 - 11905: 0xE29B, - 37441 - 11905: 0xE29C, - 37442 - 11905: 0xE29D, - 37443 - 11905: 0xE29E, - 37444 - 11905: 0xE29F, - 37445 - 11905: 0xE2A0, - 37446 - 11905: 0xE340, - 37447 - 11905: 0xE341, - 37448 - 11905: 0xE342, - 37449 - 11905: 0xE343, - 37450 - 11905: 0xE344, - 37451 - 11905: 0xE345, - 37452 - 11905: 0xE346, - 37453 - 11905: 0xE347, - 37454 - 11905: 0xE348, - 37455 - 11905: 0xE349, - 37456 - 11905: 0xE34A, - 37457 - 11905: 0xE34B, - 37458 - 11905: 0xE34C, - 37459 - 11905: 0xE34D, - 37460 - 11905: 0xE34E, - 37461 - 11905: 0xE34F, - 37462 - 11905: 0xE350, - 37463 - 11905: 0xE351, - 37464 - 11905: 0xE352, - 37465 - 11905: 0xE353, - 37466 - 11905: 0xE354, - 37467 - 11905: 0xE355, - 37468 - 11905: 0xE356, - 37469 - 11905: 0xE357, - 37470 - 11905: 0xE358, - 37471 - 11905: 0xE359, - 37472 - 11905: 0xE35A, - 37473 - 11905: 0xE35B, - 37474 - 11905: 0xE35C, - 37475 - 11905: 0xE35D, - 37476 - 11905: 0xE35E, - 37477 - 11905: 0xE35F, - 37478 - 11905: 0xE360, - 37479 - 11905: 0xE361, - 37480 - 11905: 0xE362, - 37481 - 11905: 0xE363, - 37482 - 11905: 0xE364, - 37483 - 11905: 0xE365, - 37484 - 11905: 0xE366, - 37485 - 11905: 0xE367, - 37486 - 11905: 0xE368, - 37487 - 11905: 0xE369, - 37488 - 11905: 0xE36A, - 37489 - 11905: 0xE36B, - 37490 - 11905: 0xE36C, - 37491 - 11905: 0xE36D, - 37492 - 11905: 0xBCF8, - 37493 - 11905: 0xE36E, - 37494 - 11905: 0xE36F, - 37495 - 11905: 0xE370, - 37496 - 11905: 0xE371, - 37497 - 11905: 0xE372, - 37498 - 11905: 0xE373, - 37499 - 11905: 0xE374, - 37500 - 11905: 0xE375, - 37501 - 11905: 0xE376, - 37502 - 11905: 0xE377, - 37503 - 11905: 0xE378, - 37504 - 11905: 0xE379, - 37505 - 11905: 0xE37A, - 37506 - 11905: 0xE37B, - 37507 - 11905: 0xE37C, - 37508 - 11905: 0xE37D, - 37509 - 11905: 0xE37E, - 37510 - 11905: 0xE380, - 37511 - 11905: 0xE381, - 37512 - 11905: 0xE382, - 37513 - 11905: 0xE383, - 37514 - 11905: 0xE384, - 37515 - 11905: 0xE385, - 37516 - 11905: 0xE386, - 37517 - 11905: 0xE387, - 37518 - 11905: 0xF6C6, - 37519 - 11905: 0xE388, - 37520 - 11905: 0xE389, - 37521 - 11905: 0xE38A, - 37522 - 11905: 0xE38B, - 37523 - 11905: 0xE38C, - 37524 - 11905: 0xE38D, - 37525 - 11905: 0xE38E, - 37526 - 11905: 0xE38F, - 37527 - 11905: 0xE390, - 37528 - 11905: 0xE391, - 37529 - 11905: 0xE392, - 37530 - 11905: 0xE393, - 37531 - 11905: 0xE394, - 37532 - 11905: 0xE395, - 37533 - 11905: 0xE396, - 37534 - 11905: 0xE397, - 37535 - 11905: 0xE398, - 37536 - 11905: 0xE399, - 37537 - 11905: 0xE39A, - 37538 - 11905: 0xE39B, - 37539 - 11905: 0xE39C, - 37540 - 11905: 0xE39D, - 37541 - 11905: 0xE39E, - 37542 - 11905: 0xE39F, - 37543 - 11905: 0xE3A0, - 37544 - 11905: 0xE440, - 37545 - 11905: 0xE441, - 37546 - 11905: 0xE442, - 37547 - 11905: 0xE443, - 37548 - 11905: 0xE444, - 37549 - 11905: 0xE445, - 37550 - 11905: 0xF6C7, - 37551 - 11905: 0xE446, - 37552 - 11905: 0xE447, - 37553 - 11905: 0xE448, - 37554 - 11905: 0xE449, - 37555 - 11905: 0xE44A, - 37556 - 11905: 0xE44B, - 37557 - 11905: 0xE44C, - 37558 - 11905: 0xE44D, - 37559 - 11905: 0xE44E, - 37560 - 11905: 0xE44F, - 37561 - 11905: 0xE450, - 37562 - 11905: 0xE451, - 37563 - 11905: 0xE452, - 37564 - 11905: 0xE453, - 37565 - 11905: 0xE454, - 37566 - 11905: 0xE455, - 37567 - 11905: 0xE456, - 37568 - 11905: 0xE457, - 37569 - 11905: 0xE458, - 37570 - 11905: 0xE459, - 37571 - 11905: 0xE45A, - 37572 - 11905: 0xE45B, - 37573 - 11905: 0xE45C, - 37574 - 11905: 0xE45D, - 37575 - 11905: 0xE45E, - 37576 - 11905: 0xF6C8, - 37577 - 11905: 0xE45F, - 37578 - 11905: 0xE460, - 37579 - 11905: 0xE461, - 37580 - 11905: 0xE462, - 37581 - 11905: 0xE463, - 37582 - 11905: 0xE464, - 37583 - 11905: 0xE465, - 37584 - 11905: 0xE466, - 37585 - 11905: 0xE467, - 37586 - 11905: 0xE468, - 37587 - 11905: 0xE469, - 37588 - 11905: 0xE46A, - 37589 - 11905: 0xE46B, - 37590 - 11905: 0xE46C, - 37591 - 11905: 0xE46D, - 37592 - 11905: 0xE46E, - 37593 - 11905: 0xE46F, - 37594 - 11905: 0xE470, - 37595 - 11905: 0xE471, - 37596 - 11905: 0xE472, - 37597 - 11905: 0xE473, - 37598 - 11905: 0xE474, - 37599 - 11905: 0xE475, - 37600 - 11905: 0xE476, - 37601 - 11905: 0xE477, - 37602 - 11905: 0xE478, - 37603 - 11905: 0xE479, - 37604 - 11905: 0xE47A, - 37605 - 11905: 0xE47B, - 37606 - 11905: 0xE47C, - 37607 - 11905: 0xE47D, - 37608 - 11905: 0xE47E, - 37609 - 11905: 0xE480, - 37610 - 11905: 0xE481, - 37611 - 11905: 0xE482, - 37612 - 11905: 0xE483, - 37613 - 11905: 0xE484, - 37614 - 11905: 0xE485, - 37615 - 11905: 0xE486, - 37616 - 11905: 0xE487, - 37617 - 11905: 0xE488, - 37618 - 11905: 0xE489, - 37619 - 11905: 0xE48A, - 37620 - 11905: 0xE48B, - 37621 - 11905: 0xE48C, - 37622 - 11905: 0xE48D, - 37623 - 11905: 0xE48E, - 37624 - 11905: 0xE48F, - 37625 - 11905: 0xE490, - 37626 - 11905: 0xE491, - 37627 - 11905: 0xE492, - 37628 - 11905: 0xE493, - 37629 - 11905: 0xE494, - 37630 - 11905: 0xE495, - 37631 - 11905: 0xE496, - 37632 - 11905: 0xE497, - 37633 - 11905: 0xE498, - 37634 - 11905: 0xE499, - 37635 - 11905: 0xE49A, - 37636 - 11905: 0xE49B, - 37637 - 11905: 0xE49C, - 37638 - 11905: 0xE49D, - 37639 - 11905: 0xE49E, - 37640 - 11905: 0xE49F, - 37641 - 11905: 0xE4A0, - 37642 - 11905: 0xE540, - 37643 - 11905: 0xE541, - 37644 - 11905: 0xE542, - 37645 - 11905: 0xE543, - 37646 - 11905: 0xE544, - 37647 - 11905: 0xE545, - 37648 - 11905: 0xE546, - 37649 - 11905: 0xE547, - 37650 - 11905: 0xE548, - 37651 - 11905: 0xE549, - 37652 - 11905: 0xE54A, - 37653 - 11905: 0xE54B, - 37654 - 11905: 0xE54C, - 37655 - 11905: 0xE54D, - 37656 - 11905: 0xE54E, - 37657 - 11905: 0xE54F, - 37658 - 11905: 0xE550, - 37659 - 11905: 0xE551, - 37660 - 11905: 0xE552, - 37661 - 11905: 0xE553, - 37662 - 11905: 0xE554, - 37663 - 11905: 0xE555, - 37664 - 11905: 0xE556, - 37665 - 11905: 0xE557, - 37666 - 11905: 0xE558, - 37667 - 11905: 0xE559, - 37668 - 11905: 0xE55A, - 37669 - 11905: 0xE55B, - 37670 - 11905: 0xE55C, - 37671 - 11905: 0xE55D, - 37672 - 11905: 0xE55E, - 37673 - 11905: 0xE55F, - 37674 - 11905: 0xE560, - 37675 - 11905: 0xE561, - 37676 - 11905: 0xE562, - 37677 - 11905: 0xE563, - 37678 - 11905: 0xE564, - 37679 - 11905: 0xE565, - 37680 - 11905: 0xE566, - 37681 - 11905: 0xE567, - 37682 - 11905: 0xE568, - 37683 - 11905: 0xE569, - 37684 - 11905: 0xE56A, - 37685 - 11905: 0xE56B, - 37686 - 11905: 0xE56C, - 37687 - 11905: 0xE56D, - 37688 - 11905: 0xE56E, - 37689 - 11905: 0xE56F, - 37690 - 11905: 0xE570, - 37691 - 11905: 0xE571, - 37692 - 11905: 0xE572, - 37693 - 11905: 0xE573, - 37694 - 11905: 0xF6C9, - 37695 - 11905: 0xE574, - 37696 - 11905: 0xE575, - 37697 - 11905: 0xE576, - 37698 - 11905: 0xE577, - 37699 - 11905: 0xE578, - 37700 - 11905: 0xE579, - 37701 - 11905: 0xE57A, - 37702 - 11905: 0xE57B, - 37703 - 11905: 0xE57C, - 37704 - 11905: 0xE57D, - 37705 - 11905: 0xE57E, - 37706 - 11905: 0xE580, - 37707 - 11905: 0xE581, - 37708 - 11905: 0xE582, - 37709 - 11905: 0xE583, - 37710 - 11905: 0xE584, - 37711 - 11905: 0xE585, - 37712 - 11905: 0xE586, - 37713 - 11905: 0xE587, - 37714 - 11905: 0xE588, - 37715 - 11905: 0xE589, - 37716 - 11905: 0xE58A, - 37717 - 11905: 0xE58B, - 37718 - 11905: 0xE58C, - 37719 - 11905: 0xE58D, - 37720 - 11905: 0xE58E, - 37721 - 11905: 0xE58F, - 37722 - 11905: 0xE590, - 37723 - 11905: 0xE591, - 37724 - 11905: 0xE592, - 37725 - 11905: 0xE593, - 37726 - 11905: 0xE594, - 37727 - 11905: 0xE595, - 37728 - 11905: 0xE596, - 37729 - 11905: 0xE597, - 37730 - 11905: 0xE598, - 37731 - 11905: 0xE599, - 37732 - 11905: 0xE59A, - 37733 - 11905: 0xE59B, - 37734 - 11905: 0xE59C, - 37735 - 11905: 0xE59D, - 37736 - 11905: 0xE59E, - 37737 - 11905: 0xE59F, - 37738 - 11905: 0xF6CA, - 37739 - 11905: 0xE5A0, - 37740 - 11905: 0xE640, - 37741 - 11905: 0xE641, - 37742 - 11905: 0xE642, - 37743 - 11905: 0xE643, - 37744 - 11905: 0xE644, - 37745 - 11905: 0xE645, - 37746 - 11905: 0xE646, - 37747 - 11905: 0xE647, - 37748 - 11905: 0xE648, - 37749 - 11905: 0xE649, - 37750 - 11905: 0xE64A, - 37751 - 11905: 0xE64B, - 37752 - 11905: 0xE64C, - 37753 - 11905: 0xE64D, - 37754 - 11905: 0xE64E, - 37755 - 11905: 0xE64F, - 37756 - 11905: 0xE650, - 37757 - 11905: 0xE651, - 37758 - 11905: 0xE652, - 37759 - 11905: 0xE653, - 37760 - 11905: 0xE654, - 37761 - 11905: 0xE655, - 37762 - 11905: 0xE656, - 37763 - 11905: 0xE657, - 37764 - 11905: 0xE658, - 37765 - 11905: 0xE659, - 37766 - 11905: 0xE65A, - 37767 - 11905: 0xE65B, - 37768 - 11905: 0xE65C, - 37769 - 11905: 0xE65D, - 37770 - 11905: 0xE65E, - 37771 - 11905: 0xE65F, - 37772 - 11905: 0xE660, - 37773 - 11905: 0xE661, - 37774 - 11905: 0xE662, - 37775 - 11905: 0xF6CC, - 37776 - 11905: 0xE663, - 37777 - 11905: 0xE664, - 37778 - 11905: 0xE665, - 37779 - 11905: 0xE666, - 37780 - 11905: 0xE667, - 37781 - 11905: 0xE668, - 37782 - 11905: 0xE669, - 37783 - 11905: 0xE66A, - 37784 - 11905: 0xE66B, - 37785 - 11905: 0xE66C, - 37786 - 11905: 0xE66D, - 37787 - 11905: 0xE66E, - 37788 - 11905: 0xE66F, - 37789 - 11905: 0xE670, - 37790 - 11905: 0xE671, - 37791 - 11905: 0xE672, - 37792 - 11905: 0xE673, - 37793 - 11905: 0xE674, - 37794 - 11905: 0xE675, - 37795 - 11905: 0xE676, - 37796 - 11905: 0xE677, - 37797 - 11905: 0xE678, - 37798 - 11905: 0xE679, - 37799 - 11905: 0xE67A, - 37800 - 11905: 0xE67B, - 37801 - 11905: 0xE67C, - 37802 - 11905: 0xE67D, - 37803 - 11905: 0xE67E, - 37804 - 11905: 0xE680, - 37805 - 11905: 0xE681, - 37806 - 11905: 0xE682, - 37807 - 11905: 0xE683, - 37808 - 11905: 0xE684, - 37809 - 11905: 0xE685, - 37810 - 11905: 0xE686, - 37811 - 11905: 0xE687, - 37812 - 11905: 0xE688, - 37813 - 11905: 0xE689, - 37814 - 11905: 0xE68A, - 37815 - 11905: 0xE68B, - 37816 - 11905: 0xE68C, - 37817 - 11905: 0xE68D, - 37818 - 11905: 0xE68E, - 37819 - 11905: 0xE68F, - 37820 - 11905: 0xE690, - 37821 - 11905: 0xE691, - 37822 - 11905: 0xE692, - 37823 - 11905: 0xE693, - 37824 - 11905: 0xE694, - 37825 - 11905: 0xE695, - 37826 - 11905: 0xE696, - 37827 - 11905: 0xE697, - 37828 - 11905: 0xE698, - 37829 - 11905: 0xE699, - 37830 - 11905: 0xE69A, - 37831 - 11905: 0xE69B, - 37832 - 11905: 0xE69C, - 37833 - 11905: 0xE69D, - 37834 - 11905: 0xF6CB, - 37835 - 11905: 0xE69E, - 37836 - 11905: 0xE69F, - 37837 - 11905: 0xE6A0, - 37838 - 11905: 0xE740, - 37839 - 11905: 0xE741, - 37840 - 11905: 0xE742, - 37841 - 11905: 0xE743, - 37842 - 11905: 0xE744, - 37843 - 11905: 0xE745, - 37844 - 11905: 0xE746, - 37845 - 11905: 0xE747, - 37846 - 11905: 0xF7E9, - 37847 - 11905: 0xE748, - 37848 - 11905: 0xE749, - 37849 - 11905: 0xE74A, - 37850 - 11905: 0xE74B, - 37851 - 11905: 0xE74C, - 37852 - 11905: 0xE74D, - 37853 - 11905: 0xE74E, - 37854 - 11905: 0xE74F, - 37855 - 11905: 0xE750, - 37856 - 11905: 0xE751, - 37857 - 11905: 0xE752, - 37858 - 11905: 0xE753, - 37859 - 11905: 0xE754, - 37860 - 11905: 0xE755, - 37861 - 11905: 0xE756, - 37862 - 11905: 0xE757, - 37863 - 11905: 0xE758, - 37864 - 11905: 0xE759, - 37865 - 11905: 0xE75A, - 37866 - 11905: 0xE75B, - 37867 - 11905: 0xE75C, - 37868 - 11905: 0xE75D, - 37869 - 11905: 0xE75E, - 37870 - 11905: 0xE75F, - 37871 - 11905: 0xE760, - 37872 - 11905: 0xE761, - 37873 - 11905: 0xE762, - 37874 - 11905: 0xE763, - 37875 - 11905: 0xE764, - 37876 - 11905: 0xE765, - 37877 - 11905: 0xE766, - 37878 - 11905: 0xE767, - 37879 - 11905: 0xE768, - 37880 - 11905: 0xE769, - 37881 - 11905: 0xE76A, - 37882 - 11905: 0xE76B, - 37883 - 11905: 0xE76C, - 37884 - 11905: 0xE76D, - 37885 - 11905: 0xE76E, - 37886 - 11905: 0xE76F, - 37887 - 11905: 0xE770, - 37888 - 11905: 0xE771, - 37889 - 11905: 0xE772, - 37890 - 11905: 0xE773, - 37891 - 11905: 0xE774, - 37892 - 11905: 0xE775, - 37893 - 11905: 0xE776, - 37894 - 11905: 0xE777, - 37895 - 11905: 0xE778, - 37896 - 11905: 0xE779, - 37897 - 11905: 0xE77A, - 37898 - 11905: 0xE77B, - 37899 - 11905: 0xE77C, - 37900 - 11905: 0xE77D, - 37901 - 11905: 0xE77E, - 37902 - 11905: 0xE780, - 37903 - 11905: 0xE781, - 37904 - 11905: 0xE782, - 37905 - 11905: 0xE783, - 37906 - 11905: 0xE784, - 37907 - 11905: 0xE785, - 37908 - 11905: 0xE786, - 37909 - 11905: 0xE787, - 37910 - 11905: 0xE788, - 37911 - 11905: 0xE789, - 37912 - 11905: 0xE78A, - 37913 - 11905: 0xE78B, - 37914 - 11905: 0xE78C, - 37915 - 11905: 0xE78D, - 37916 - 11905: 0xE78E, - 37917 - 11905: 0xE78F, - 37918 - 11905: 0xE790, - 37919 - 11905: 0xE791, - 37920 - 11905: 0xE792, - 37921 - 11905: 0xE793, - 37922 - 11905: 0xE794, - 37923 - 11905: 0xE795, - 37924 - 11905: 0xE796, - 37925 - 11905: 0xE797, - 37926 - 11905: 0xE798, - 37927 - 11905: 0xE799, - 37928 - 11905: 0xE79A, - 37929 - 11905: 0xE79B, - 37930 - 11905: 0xE79C, - 37931 - 11905: 0xE79D, - 37932 - 11905: 0xE79E, - 37933 - 11905: 0xE79F, - 37934 - 11905: 0xE7A0, - 37935 - 11905: 0xE840, - 37936 - 11905: 0xE841, - 37937 - 11905: 0xE842, - 37938 - 11905: 0xE843, - 37939 - 11905: 0xE844, - 37940 - 11905: 0xE845, - 37941 - 11905: 0xE846, - 37942 - 11905: 0xE847, - 37943 - 11905: 0xE848, - 37944 - 11905: 0xE849, - 37945 - 11905: 0xE84A, - 37946 - 11905: 0xE84B, - 37947 - 11905: 0xE84C, - 37948 - 11905: 0xE84D, - 37949 - 11905: 0xE84E, - 37950 - 11905: 0xF6CD, - 37951 - 11905: 0xE84F, - 37952 - 11905: 0xE850, - 37953 - 11905: 0xE851, - 37954 - 11905: 0xE852, - 37955 - 11905: 0xE853, - 37956 - 11905: 0xE854, - 37957 - 11905: 0xE855, - 37958 - 11905: 0xE856, - 37959 - 11905: 0xE857, - 37960 - 11905: 0xE858, - 37961 - 11905: 0xE859, - 37962 - 11905: 0xE85A, - 37963 - 11905: 0xE85B, - 37964 - 11905: 0xE85C, - 37965 - 11905: 0xE85D, - 37966 - 11905: 0xE85E, - 37967 - 11905: 0xE85F, - 37968 - 11905: 0xE860, - 37969 - 11905: 0xE861, - 37970 - 11905: 0xE862, - 37971 - 11905: 0xE863, - 37972 - 11905: 0xE864, - 37973 - 11905: 0xE865, - 37974 - 11905: 0xE866, - 37975 - 11905: 0xE867, - 37976 - 11905: 0xE868, - 37977 - 11905: 0xE869, - 37978 - 11905: 0xE86A, - 37979 - 11905: 0xE86B, - 37980 - 11905: 0xE86C, - 37981 - 11905: 0xE86D, - 37982 - 11905: 0xE86E, - 37983 - 11905: 0xE86F, - 37984 - 11905: 0xE870, - 37985 - 11905: 0xE871, - 37986 - 11905: 0xE872, - 37987 - 11905: 0xE873, - 37988 - 11905: 0xE874, - 37989 - 11905: 0xE875, - 37990 - 11905: 0xE876, - 37991 - 11905: 0xE877, - 37992 - 11905: 0xE878, - 37993 - 11905: 0xE879, - 37994 - 11905: 0xE87A, - 37995 - 11905: 0xF6CE, - 37996 - 11905: 0xE87B, - 37997 - 11905: 0xE87C, - 37998 - 11905: 0xE87D, - 37999 - 11905: 0xE87E, - 38000 - 11905: 0xE880, - 38001 - 11905: 0xE881, - 38002 - 11905: 0xE882, - 38003 - 11905: 0xE883, - 38004 - 11905: 0xE884, - 38005 - 11905: 0xE885, - 38006 - 11905: 0xE886, - 38007 - 11905: 0xE887, - 38008 - 11905: 0xE888, - 38009 - 11905: 0xE889, - 38010 - 11905: 0xE88A, - 38011 - 11905: 0xE88B, - 38012 - 11905: 0xE88C, - 38013 - 11905: 0xE88D, - 38014 - 11905: 0xE88E, - 38015 - 11905: 0xE88F, - 38016 - 11905: 0xE890, - 38017 - 11905: 0xE891, - 38018 - 11905: 0xE892, - 38019 - 11905: 0xE893, - 38020 - 11905: 0xE894, - 38021 - 11905: 0xEEC4, - 38022 - 11905: 0xEEC5, - 38023 - 11905: 0xEEC6, - 38024 - 11905: 0xD5EB, - 38025 - 11905: 0xB6A4, - 38026 - 11905: 0xEEC8, - 38027 - 11905: 0xEEC7, - 38028 - 11905: 0xEEC9, - 38029 - 11905: 0xEECA, - 38030 - 11905: 0xC7A5, - 38031 - 11905: 0xEECB, - 38032 - 11905: 0xEECC, - 38033 - 11905: 0xE895, - 38034 - 11905: 0xB7B0, - 38035 - 11905: 0xB5F6, - 38036 - 11905: 0xEECD, - 38037 - 11905: 0xEECF, - 38038 - 11905: 0xE896, - 38039 - 11905: 0xEECE, - 38040 - 11905: 0xE897, - 38041 - 11905: 0xB8C6, - 38042 - 11905: 0xEED0, - 38043 - 11905: 0xEED1, - 38044 - 11905: 0xEED2, - 38045 - 11905: 0xB6DB, - 38046 - 11905: 0xB3AE, - 38047 - 11905: 0xD6D3, - 38048 - 11905: 0xC4C6, - 38049 - 11905: 0xB1B5, - 38050 - 11905: 0xB8D6, - 38051 - 11905: 0xEED3, - 38052 - 11905: 0xEED4, - 38053 - 11905: 0xD4BF, - 38054 - 11905: 0xC7D5, - 38055 - 11905: 0xBEFB, - 38056 - 11905: 0xCED9, - 38057 - 11905: 0xB9B3, - 38058 - 11905: 0xEED6, - 38059 - 11905: 0xEED5, - 38060 - 11905: 0xEED8, - 38061 - 11905: 0xEED7, - 38062 - 11905: 0xC5A5, - 38063 - 11905: 0xEED9, - 38064 - 11905: 0xEEDA, - 38065 - 11905: 0xC7AE, - 38066 - 11905: 0xEEDB, - 38067 - 11905: 0xC7AF, - 38068 - 11905: 0xEEDC, - 38069 - 11905: 0xB2A7, - 38070 - 11905: 0xEEDD, - 38071 - 11905: 0xEEDE, - 38072 - 11905: 0xEEDF, - 38073 - 11905: 0xEEE0, - 38074 - 11905: 0xEEE1, - 38075 - 11905: 0xD7EA, - 38076 - 11905: 0xEEE2, - 38077 - 11905: 0xEEE3, - 38078 - 11905: 0xBCD8, - 38079 - 11905: 0xEEE4, - 38080 - 11905: 0xD3CB, - 38081 - 11905: 0xCCFA, - 38082 - 11905: 0xB2AC, - 38083 - 11905: 0xC1E5, - 38084 - 11905: 0xEEE5, - 38085 - 11905: 0xC7A6, - 38086 - 11905: 0xC3AD, - 38087 - 11905: 0xE898, - 38088 - 11905: 0xEEE6, - 38089 - 11905: 0xEEE7, - 38090 - 11905: 0xEEE8, - 38091 - 11905: 0xEEE9, - 38092 - 11905: 0xEEEA, - 38093 - 11905: 0xEEEB, - 38094 - 11905: 0xEEEC, - 38095 - 11905: 0xE899, - 38096 - 11905: 0xEEED, - 38097 - 11905: 0xEEEE, - 38098 - 11905: 0xEEEF, - 38099 - 11905: 0xE89A, - 38100 - 11905: 0xE89B, - 38101 - 11905: 0xEEF0, - 38102 - 11905: 0xEEF1, - 38103 - 11905: 0xEEF2, - 38104 - 11905: 0xEEF4, - 38105 - 11905: 0xEEF3, - 38106 - 11905: 0xE89C, - 38107 - 11905: 0xEEF5, - 38108 - 11905: 0xCDAD, - 38109 - 11905: 0xC2C1, - 38110 - 11905: 0xEEF6, - 38111 - 11905: 0xEEF7, - 38112 - 11905: 0xEEF8, - 38113 - 11905: 0xD5A1, - 38114 - 11905: 0xEEF9, - 38115 - 11905: 0xCFB3, - 38116 - 11905: 0xEEFA, - 38117 - 11905: 0xEEFB, - 38118 - 11905: 0xE89D, - 38119 - 11905: 0xEEFC, - 38120 - 11905: 0xEEFD, - 38121 - 11905: 0xEFA1, - 38122 - 11905: 0xEEFE, - 38123 - 11905: 0xEFA2, - 38124 - 11905: 0xB8F5, - 38125 - 11905: 0xC3FA, - 38126 - 11905: 0xEFA3, - 38127 - 11905: 0xEFA4, - 38128 - 11905: 0xBDC2, - 38129 - 11905: 0xD2BF, - 38130 - 11905: 0xB2F9, - 38131 - 11905: 0xEFA5, - 38132 - 11905: 0xEFA6, - 38133 - 11905: 0xEFA7, - 38134 - 11905: 0xD2F8, - 38135 - 11905: 0xEFA8, - 38136 - 11905: 0xD6FD, - 38137 - 11905: 0xEFA9, - 38138 - 11905: 0xC6CC, - 38139 - 11905: 0xE89E, - 38140 - 11905: 0xEFAA, - 38141 - 11905: 0xEFAB, - 38142 - 11905: 0xC1B4, - 38143 - 11905: 0xEFAC, - 38144 - 11905: 0xCFFA, - 38145 - 11905: 0xCBF8, - 38146 - 11905: 0xEFAE, - 38147 - 11905: 0xEFAD, - 38148 - 11905: 0xB3FA, - 38149 - 11905: 0xB9F8, - 38150 - 11905: 0xEFAF, - 38151 - 11905: 0xEFB0, - 38152 - 11905: 0xD0E2, - 38153 - 11905: 0xEFB1, - 38154 - 11905: 0xEFB2, - 38155 - 11905: 0xB7E6, - 38156 - 11905: 0xD0BF, - 38157 - 11905: 0xEFB3, - 38158 - 11905: 0xEFB4, - 38159 - 11905: 0xEFB5, - 38160 - 11905: 0xC8F1, - 38161 - 11905: 0xCCE0, - 38162 - 11905: 0xEFB6, - 38163 - 11905: 0xEFB7, - 38164 - 11905: 0xEFB8, - 38165 - 11905: 0xEFB9, - 38166 - 11905: 0xEFBA, - 38167 - 11905: 0xD5E0, - 38168 - 11905: 0xEFBB, - 38169 - 11905: 0xB4ED, - 38170 - 11905: 0xC3AA, - 38171 - 11905: 0xEFBC, - 38172 - 11905: 0xE89F, - 38173 - 11905: 0xEFBD, - 38174 - 11905: 0xEFBE, - 38175 - 11905: 0xEFBF, - 38176 - 11905: 0xE8A0, - 38177 - 11905: 0xCEFD, - 38178 - 11905: 0xEFC0, - 38179 - 11905: 0xC2E0, - 38180 - 11905: 0xB4B8, - 38181 - 11905: 0xD7B6, - 38182 - 11905: 0xBDF5, - 38183 - 11905: 0xE940, - 38184 - 11905: 0xCFC7, - 38185 - 11905: 0xEFC3, - 38186 - 11905: 0xEFC1, - 38187 - 11905: 0xEFC2, - 38188 - 11905: 0xEFC4, - 38189 - 11905: 0xB6A7, - 38190 - 11905: 0xBCFC, - 38191 - 11905: 0xBEE2, - 38192 - 11905: 0xC3CC, - 38193 - 11905: 0xEFC5, - 38194 - 11905: 0xEFC6, - 38195 - 11905: 0xE941, - 38196 - 11905: 0xEFC7, - 38197 - 11905: 0xEFCF, - 38198 - 11905: 0xEFC8, - 38199 - 11905: 0xEFC9, - 38200 - 11905: 0xEFCA, - 38201 - 11905: 0xC7C2, - 38202 - 11905: 0xEFF1, - 38203 - 11905: 0xB6CD, - 38204 - 11905: 0xEFCB, - 38205 - 11905: 0xE942, - 38206 - 11905: 0xEFCC, - 38207 - 11905: 0xEFCD, - 38208 - 11905: 0xB6C6, - 38209 - 11905: 0xC3BE, - 38210 - 11905: 0xEFCE, - 38211 - 11905: 0xE943, - 38212 - 11905: 0xEFD0, - 38213 - 11905: 0xEFD1, - 38214 - 11905: 0xEFD2, - 38215 - 11905: 0xD5F2, - 38216 - 11905: 0xE944, - 38217 - 11905: 0xEFD3, - 38218 - 11905: 0xC4F7, - 38219 - 11905: 0xE945, - 38220 - 11905: 0xEFD4, - 38221 - 11905: 0xC4F8, - 38222 - 11905: 0xEFD5, - 38223 - 11905: 0xEFD6, - 38224 - 11905: 0xB8E4, - 38225 - 11905: 0xB0F7, - 38226 - 11905: 0xEFD7, - 38227 - 11905: 0xEFD8, - 38228 - 11905: 0xEFD9, - 38229 - 11905: 0xE946, - 38230 - 11905: 0xEFDA, - 38231 - 11905: 0xEFDB, - 38232 - 11905: 0xEFDC, - 38233 - 11905: 0xEFDD, - 38234 - 11905: 0xE947, - 38235 - 11905: 0xEFDE, - 38236 - 11905: 0xBEB5, - 38237 - 11905: 0xEFE1, - 38238 - 11905: 0xEFDF, - 38239 - 11905: 0xEFE0, - 38240 - 11905: 0xE948, - 38241 - 11905: 0xEFE2, - 38242 - 11905: 0xEFE3, - 38243 - 11905: 0xC1CD, - 38244 - 11905: 0xEFE4, - 38245 - 11905: 0xEFE5, - 38246 - 11905: 0xEFE6, - 38247 - 11905: 0xEFE7, - 38248 - 11905: 0xEFE8, - 38249 - 11905: 0xEFE9, - 38250 - 11905: 0xEFEA, - 38251 - 11905: 0xEFEB, - 38252 - 11905: 0xEFEC, - 38253 - 11905: 0xC0D8, - 38254 - 11905: 0xE949, - 38255 - 11905: 0xEFED, - 38256 - 11905: 0xC1AD, - 38257 - 11905: 0xEFEE, - 38258 - 11905: 0xEFEF, - 38259 - 11905: 0xEFF0, - 38260 - 11905: 0xE94A, - 38261 - 11905: 0xE94B, - 38262 - 11905: 0xCFE2, - 38263 - 11905: 0xE94C, - 38264 - 11905: 0xE94D, - 38265 - 11905: 0xE94E, - 38266 - 11905: 0xE94F, - 38267 - 11905: 0xE950, - 38268 - 11905: 0xE951, - 38269 - 11905: 0xE952, - 38270 - 11905: 0xE953, - 38271 - 11905: 0xB3A4, - 38272 - 11905: 0xE954, - 38273 - 11905: 0xE955, - 38274 - 11905: 0xE956, - 38275 - 11905: 0xE957, - 38276 - 11905: 0xE958, - 38277 - 11905: 0xE959, - 38278 - 11905: 0xE95A, - 38279 - 11905: 0xE95B, - 38280 - 11905: 0xE95C, - 38281 - 11905: 0xE95D, - 38282 - 11905: 0xE95E, - 38283 - 11905: 0xE95F, - 38284 - 11905: 0xE960, - 38285 - 11905: 0xE961, - 38286 - 11905: 0xE962, - 38287 - 11905: 0xE963, - 38288 - 11905: 0xE964, - 38289 - 11905: 0xE965, - 38290 - 11905: 0xE966, - 38291 - 11905: 0xE967, - 38292 - 11905: 0xE968, - 38293 - 11905: 0xE969, - 38294 - 11905: 0xE96A, - 38295 - 11905: 0xE96B, - 38296 - 11905: 0xE96C, - 38297 - 11905: 0xE96D, - 38298 - 11905: 0xE96E, - 38299 - 11905: 0xE96F, - 38300 - 11905: 0xE970, - 38301 - 11905: 0xE971, - 38302 - 11905: 0xE972, - 38303 - 11905: 0xE973, - 38304 - 11905: 0xE974, - 38305 - 11905: 0xE975, - 38306 - 11905: 0xE976, - 38307 - 11905: 0xE977, - 38308 - 11905: 0xE978, - 38309 - 11905: 0xE979, - 38310 - 11905: 0xE97A, - 38311 - 11905: 0xE97B, - 38312 - 11905: 0xE97C, - 38313 - 11905: 0xE97D, - 38314 - 11905: 0xE97E, - 38315 - 11905: 0xE980, - 38316 - 11905: 0xE981, - 38317 - 11905: 0xE982, - 38318 - 11905: 0xE983, - 38319 - 11905: 0xE984, - 38320 - 11905: 0xE985, - 38321 - 11905: 0xE986, - 38322 - 11905: 0xE987, - 38323 - 11905: 0xE988, - 38324 - 11905: 0xE989, - 38325 - 11905: 0xE98A, - 38326 - 11905: 0xE98B, - 38327 - 11905: 0xE98C, - 38328 - 11905: 0xE98D, - 38329 - 11905: 0xE98E, - 38330 - 11905: 0xE98F, - 38331 - 11905: 0xE990, - 38332 - 11905: 0xE991, - 38333 - 11905: 0xE992, - 38334 - 11905: 0xE993, - 38335 - 11905: 0xE994, - 38336 - 11905: 0xE995, - 38337 - 11905: 0xE996, - 38338 - 11905: 0xE997, - 38339 - 11905: 0xE998, - 38340 - 11905: 0xE999, - 38341 - 11905: 0xE99A, - 38342 - 11905: 0xE99B, - 38343 - 11905: 0xE99C, - 38344 - 11905: 0xE99D, - 38345 - 11905: 0xE99E, - 38346 - 11905: 0xE99F, - 38347 - 11905: 0xE9A0, - 38348 - 11905: 0xEA40, - 38349 - 11905: 0xEA41, - 38350 - 11905: 0xEA42, - 38351 - 11905: 0xEA43, - 38352 - 11905: 0xEA44, - 38353 - 11905: 0xEA45, - 38354 - 11905: 0xEA46, - 38355 - 11905: 0xEA47, - 38356 - 11905: 0xEA48, - 38357 - 11905: 0xEA49, - 38358 - 11905: 0xEA4A, - 38359 - 11905: 0xEA4B, - 38360 - 11905: 0xEA4C, - 38361 - 11905: 0xEA4D, - 38362 - 11905: 0xEA4E, - 38363 - 11905: 0xEA4F, - 38364 - 11905: 0xEA50, - 38365 - 11905: 0xEA51, - 38366 - 11905: 0xEA52, - 38367 - 11905: 0xEA53, - 38368 - 11905: 0xEA54, - 38369 - 11905: 0xEA55, - 38370 - 11905: 0xEA56, - 38371 - 11905: 0xEA57, - 38372 - 11905: 0xEA58, - 38373 - 11905: 0xEA59, - 38374 - 11905: 0xEA5A, - 38375 - 11905: 0xEA5B, - 38376 - 11905: 0xC3C5, - 38377 - 11905: 0xE3C5, - 38378 - 11905: 0xC9C1, - 38379 - 11905: 0xE3C6, - 38380 - 11905: 0xEA5C, - 38381 - 11905: 0xB1D5, - 38382 - 11905: 0xCECA, - 38383 - 11905: 0xB4B3, - 38384 - 11905: 0xC8F2, - 38385 - 11905: 0xE3C7, - 38386 - 11905: 0xCFD0, - 38387 - 11905: 0xE3C8, - 38388 - 11905: 0xBCE4, - 38389 - 11905: 0xE3C9, - 38390 - 11905: 0xE3CA, - 38391 - 11905: 0xC3C6, - 38392 - 11905: 0xD5A2, - 38393 - 11905: 0xC4D6, - 38394 - 11905: 0xB9EB, - 38395 - 11905: 0xCEC5, - 38396 - 11905: 0xE3CB, - 38397 - 11905: 0xC3F6, - 38398 - 11905: 0xE3CC, - 38399 - 11905: 0xEA5D, - 38400 - 11905: 0xB7A7, - 38401 - 11905: 0xB8F3, - 38402 - 11905: 0xBAD2, - 38403 - 11905: 0xE3CD, - 38404 - 11905: 0xE3CE, - 38405 - 11905: 0xD4C4, - 38406 - 11905: 0xE3CF, - 38407 - 11905: 0xEA5E, - 38408 - 11905: 0xE3D0, - 38409 - 11905: 0xD1CB, - 38410 - 11905: 0xE3D1, - 38411 - 11905: 0xE3D2, - 38412 - 11905: 0xE3D3, - 38413 - 11905: 0xE3D4, - 38414 - 11905: 0xD1D6, - 38415 - 11905: 0xE3D5, - 38416 - 11905: 0xB2FB, - 38417 - 11905: 0xC0BB, - 38418 - 11905: 0xE3D6, - 38419 - 11905: 0xEA5F, - 38420 - 11905: 0xC0AB, - 38421 - 11905: 0xE3D7, - 38422 - 11905: 0xE3D8, - 38423 - 11905: 0xE3D9, - 38424 - 11905: 0xEA60, - 38425 - 11905: 0xE3DA, - 38426 - 11905: 0xE3DB, - 38427 - 11905: 0xEA61, - 38428 - 11905: 0xB8B7, - 38429 - 11905: 0xDAE2, - 38430 - 11905: 0xEA62, - 38431 - 11905: 0xB6D3, - 38432 - 11905: 0xEA63, - 38433 - 11905: 0xDAE4, - 38434 - 11905: 0xDAE3, - 38435 - 11905: 0xEA64, - 38436 - 11905: 0xEA65, - 38437 - 11905: 0xEA66, - 38438 - 11905: 0xEA67, - 38439 - 11905: 0xEA68, - 38440 - 11905: 0xEA69, - 38441 - 11905: 0xEA6A, - 38442 - 11905: 0xDAE6, - 38443 - 11905: 0xEA6B, - 38444 - 11905: 0xEA6C, - 38445 - 11905: 0xEA6D, - 38446 - 11905: 0xC8EE, - 38447 - 11905: 0xEA6E, - 38448 - 11905: 0xEA6F, - 38449 - 11905: 0xDAE5, - 38450 - 11905: 0xB7C0, - 38451 - 11905: 0xD1F4, - 38452 - 11905: 0xD2F5, - 38453 - 11905: 0xD5F3, - 38454 - 11905: 0xBDD7, - 38455 - 11905: 0xEA70, - 38456 - 11905: 0xEA71, - 38457 - 11905: 0xEA72, - 38458 - 11905: 0xEA73, - 38459 - 11905: 0xD7E8, - 38460 - 11905: 0xDAE8, - 38461 - 11905: 0xDAE7, - 38462 - 11905: 0xEA74, - 38463 - 11905: 0xB0A2, - 38464 - 11905: 0xCDD3, - 38465 - 11905: 0xEA75, - 38466 - 11905: 0xDAE9, - 38467 - 11905: 0xEA76, - 38468 - 11905: 0xB8BD, - 38469 - 11905: 0xBCCA, - 38470 - 11905: 0xC2BD, - 38471 - 11905: 0xC2A4, - 38472 - 11905: 0xB3C2, - 38473 - 11905: 0xDAEA, - 38474 - 11905: 0xEA77, - 38475 - 11905: 0xC2AA, - 38476 - 11905: 0xC4B0, - 38477 - 11905: 0xBDB5, - 38478 - 11905: 0xEA78, - 38479 - 11905: 0xEA79, - 38480 - 11905: 0xCFDE, - 38481 - 11905: 0xEA7A, - 38482 - 11905: 0xEA7B, - 38483 - 11905: 0xEA7C, - 38484 - 11905: 0xDAEB, - 38485 - 11905: 0xC9C2, - 38486 - 11905: 0xEA7D, - 38487 - 11905: 0xEA7E, - 38488 - 11905: 0xEA80, - 38489 - 11905: 0xEA81, - 38490 - 11905: 0xEA82, - 38491 - 11905: 0xB1DD, - 38492 - 11905: 0xEA83, - 38493 - 11905: 0xEA84, - 38494 - 11905: 0xEA85, - 38495 - 11905: 0xDAEC, - 38496 - 11905: 0xEA86, - 38497 - 11905: 0xB6B8, - 38498 - 11905: 0xD4BA, - 38499 - 11905: 0xEA87, - 38500 - 11905: 0xB3FD, - 38501 - 11905: 0xEA88, - 38502 - 11905: 0xEA89, - 38503 - 11905: 0xDAED, - 38504 - 11905: 0xD4C9, - 38505 - 11905: 0xCFD5, - 38506 - 11905: 0xC5E3, - 38507 - 11905: 0xEA8A, - 38508 - 11905: 0xDAEE, - 38509 - 11905: 0xEA8B, - 38510 - 11905: 0xEA8C, - 38511 - 11905: 0xEA8D, - 38512 - 11905: 0xEA8E, - 38513 - 11905: 0xEA8F, - 38514 - 11905: 0xDAEF, - 38515 - 11905: 0xEA90, - 38516 - 11905: 0xDAF0, - 38517 - 11905: 0xC1EA, - 38518 - 11905: 0xCCD5, - 38519 - 11905: 0xCFDD, - 38520 - 11905: 0xEA91, - 38521 - 11905: 0xEA92, - 38522 - 11905: 0xEA93, - 38523 - 11905: 0xEA94, - 38524 - 11905: 0xEA95, - 38525 - 11905: 0xEA96, - 38526 - 11905: 0xEA97, - 38527 - 11905: 0xEA98, - 38528 - 11905: 0xEA99, - 38529 - 11905: 0xEA9A, - 38530 - 11905: 0xEA9B, - 38531 - 11905: 0xEA9C, - 38532 - 11905: 0xEA9D, - 38533 - 11905: 0xD3E7, - 38534 - 11905: 0xC2A1, - 38535 - 11905: 0xEA9E, - 38536 - 11905: 0xDAF1, - 38537 - 11905: 0xEA9F, - 38538 - 11905: 0xEAA0, - 38539 - 11905: 0xCBE5, - 38540 - 11905: 0xEB40, - 38541 - 11905: 0xDAF2, - 38542 - 11905: 0xEB41, - 38543 - 11905: 0xCBE6, - 38544 - 11905: 0xD2FE, - 38545 - 11905: 0xEB42, - 38546 - 11905: 0xEB43, - 38547 - 11905: 0xEB44, - 38548 - 11905: 0xB8F4, - 38549 - 11905: 0xEB45, - 38550 - 11905: 0xEB46, - 38551 - 11905: 0xDAF3, - 38552 - 11905: 0xB0AF, - 38553 - 11905: 0xCFB6, - 38554 - 11905: 0xEB47, - 38555 - 11905: 0xEB48, - 38556 - 11905: 0xD5CF, - 38557 - 11905: 0xEB49, - 38558 - 11905: 0xEB4A, - 38559 - 11905: 0xEB4B, - 38560 - 11905: 0xEB4C, - 38561 - 11905: 0xEB4D, - 38562 - 11905: 0xEB4E, - 38563 - 11905: 0xEB4F, - 38564 - 11905: 0xEB50, - 38565 - 11905: 0xEB51, - 38566 - 11905: 0xEB52, - 38567 - 11905: 0xCBED, - 38568 - 11905: 0xEB53, - 38569 - 11905: 0xEB54, - 38570 - 11905: 0xEB55, - 38571 - 11905: 0xEB56, - 38572 - 11905: 0xEB57, - 38573 - 11905: 0xEB58, - 38574 - 11905: 0xEB59, - 38575 - 11905: 0xEB5A, - 38576 - 11905: 0xDAF4, - 38577 - 11905: 0xEB5B, - 38578 - 11905: 0xEB5C, - 38579 - 11905: 0xE3C4, - 38580 - 11905: 0xEB5D, - 38581 - 11905: 0xEB5E, - 38582 - 11905: 0xC1A5, - 38583 - 11905: 0xEB5F, - 38584 - 11905: 0xEB60, - 38585 - 11905: 0xF6BF, - 38586 - 11905: 0xEB61, - 38587 - 11905: 0xEB62, - 38588 - 11905: 0xF6C0, - 38589 - 11905: 0xF6C1, - 38590 - 11905: 0xC4D1, - 38591 - 11905: 0xEB63, - 38592 - 11905: 0xC8B8, - 38593 - 11905: 0xD1E3, - 38594 - 11905: 0xEB64, - 38595 - 11905: 0xEB65, - 38596 - 11905: 0xD0DB, - 38597 - 11905: 0xD1C5, - 38598 - 11905: 0xBCAF, - 38599 - 11905: 0xB9CD, - 38600 - 11905: 0xEB66, - 38601 - 11905: 0xEFF4, - 38602 - 11905: 0xEB67, - 38603 - 11905: 0xEB68, - 38604 - 11905: 0xB4C6, - 38605 - 11905: 0xD3BA, - 38606 - 11905: 0xF6C2, - 38607 - 11905: 0xB3FB, - 38608 - 11905: 0xEB69, - 38609 - 11905: 0xEB6A, - 38610 - 11905: 0xF6C3, - 38611 - 11905: 0xEB6B, - 38612 - 11905: 0xEB6C, - 38613 - 11905: 0xB5F1, - 38614 - 11905: 0xEB6D, - 38615 - 11905: 0xEB6E, - 38616 - 11905: 0xEB6F, - 38617 - 11905: 0xEB70, - 38618 - 11905: 0xEB71, - 38619 - 11905: 0xEB72, - 38620 - 11905: 0xEB73, - 38621 - 11905: 0xEB74, - 38622 - 11905: 0xEB75, - 38623 - 11905: 0xEB76, - 38624 - 11905: 0xF6C5, - 38625 - 11905: 0xEB77, - 38626 - 11905: 0xEB78, - 38627 - 11905: 0xEB79, - 38628 - 11905: 0xEB7A, - 38629 - 11905: 0xEB7B, - 38630 - 11905: 0xEB7C, - 38631 - 11905: 0xEB7D, - 38632 - 11905: 0xD3EA, - 38633 - 11905: 0xF6A7, - 38634 - 11905: 0xD1A9, - 38635 - 11905: 0xEB7E, - 38636 - 11905: 0xEB80, - 38637 - 11905: 0xEB81, - 38638 - 11905: 0xEB82, - 38639 - 11905: 0xF6A9, - 38640 - 11905: 0xEB83, - 38641 - 11905: 0xEB84, - 38642 - 11905: 0xEB85, - 38643 - 11905: 0xF6A8, - 38644 - 11905: 0xEB86, - 38645 - 11905: 0xEB87, - 38646 - 11905: 0xC1E3, - 38647 - 11905: 0xC0D7, - 38648 - 11905: 0xEB88, - 38649 - 11905: 0xB1A2, - 38650 - 11905: 0xEB89, - 38651 - 11905: 0xEB8A, - 38652 - 11905: 0xEB8B, - 38653 - 11905: 0xEB8C, - 38654 - 11905: 0xCEED, - 38655 - 11905: 0xEB8D, - 38656 - 11905: 0xD0E8, - 38657 - 11905: 0xF6AB, - 38658 - 11905: 0xEB8E, - 38659 - 11905: 0xEB8F, - 38660 - 11905: 0xCFF6, - 38661 - 11905: 0xEB90, - 38662 - 11905: 0xF6AA, - 38663 - 11905: 0xD5F0, - 38664 - 11905: 0xF6AC, - 38665 - 11905: 0xC3B9, - 38666 - 11905: 0xEB91, - 38667 - 11905: 0xEB92, - 38668 - 11905: 0xEB93, - 38669 - 11905: 0xBBF4, - 38670 - 11905: 0xF6AE, - 38671 - 11905: 0xF6AD, - 38672 - 11905: 0xEB94, - 38673 - 11905: 0xEB95, - 38674 - 11905: 0xEB96, - 38675 - 11905: 0xC4DE, - 38676 - 11905: 0xEB97, - 38677 - 11905: 0xEB98, - 38678 - 11905: 0xC1D8, - 38679 - 11905: 0xEB99, - 38680 - 11905: 0xEB9A, - 38681 - 11905: 0xEB9B, - 38682 - 11905: 0xEB9C, - 38683 - 11905: 0xEB9D, - 38684 - 11905: 0xCBAA, - 38685 - 11905: 0xEB9E, - 38686 - 11905: 0xCFBC, - 38687 - 11905: 0xEB9F, - 38688 - 11905: 0xEBA0, - 38689 - 11905: 0xEC40, - 38690 - 11905: 0xEC41, - 38691 - 11905: 0xEC42, - 38692 - 11905: 0xEC43, - 38693 - 11905: 0xEC44, - 38694 - 11905: 0xEC45, - 38695 - 11905: 0xEC46, - 38696 - 11905: 0xEC47, - 38697 - 11905: 0xEC48, - 38698 - 11905: 0xF6AF, - 38699 - 11905: 0xEC49, - 38700 - 11905: 0xEC4A, - 38701 - 11905: 0xF6B0, - 38702 - 11905: 0xEC4B, - 38703 - 11905: 0xEC4C, - 38704 - 11905: 0xF6B1, - 38705 - 11905: 0xEC4D, - 38706 - 11905: 0xC2B6, - 38707 - 11905: 0xEC4E, - 38708 - 11905: 0xEC4F, - 38709 - 11905: 0xEC50, - 38710 - 11905: 0xEC51, - 38711 - 11905: 0xEC52, - 38712 - 11905: 0xB0D4, - 38713 - 11905: 0xC5F9, - 38714 - 11905: 0xEC53, - 38715 - 11905: 0xEC54, - 38716 - 11905: 0xEC55, - 38717 - 11905: 0xEC56, - 38718 - 11905: 0xF6B2, - 38719 - 11905: 0xEC57, - 38720 - 11905: 0xEC58, - 38721 - 11905: 0xEC59, - 38722 - 11905: 0xEC5A, - 38723 - 11905: 0xEC5B, - 38724 - 11905: 0xEC5C, - 38725 - 11905: 0xEC5D, - 38726 - 11905: 0xEC5E, - 38727 - 11905: 0xEC5F, - 38728 - 11905: 0xEC60, - 38729 - 11905: 0xEC61, - 38730 - 11905: 0xEC62, - 38731 - 11905: 0xEC63, - 38732 - 11905: 0xEC64, - 38733 - 11905: 0xEC65, - 38734 - 11905: 0xEC66, - 38735 - 11905: 0xEC67, - 38736 - 11905: 0xEC68, - 38737 - 11905: 0xEC69, - 38738 - 11905: 0xC7E0, - 38739 - 11905: 0xF6A6, - 38740 - 11905: 0xEC6A, - 38741 - 11905: 0xEC6B, - 38742 - 11905: 0xBEB8, - 38743 - 11905: 0xEC6C, - 38744 - 11905: 0xEC6D, - 38745 - 11905: 0xBEB2, - 38746 - 11905: 0xEC6E, - 38747 - 11905: 0xB5E5, - 38748 - 11905: 0xEC6F, - 38749 - 11905: 0xEC70, - 38750 - 11905: 0xB7C7, - 38751 - 11905: 0xEC71, - 38752 - 11905: 0xBFBF, - 38753 - 11905: 0xC3D2, - 38754 - 11905: 0xC3E6, - 38755 - 11905: 0xEC72, - 38756 - 11905: 0xEC73, - 38757 - 11905: 0xD8CC, - 38758 - 11905: 0xEC74, - 38759 - 11905: 0xEC75, - 38760 - 11905: 0xEC76, - 38761 - 11905: 0xB8EF, - 38762 - 11905: 0xEC77, - 38763 - 11905: 0xEC78, - 38764 - 11905: 0xEC79, - 38765 - 11905: 0xEC7A, - 38766 - 11905: 0xEC7B, - 38767 - 11905: 0xEC7C, - 38768 - 11905: 0xEC7D, - 38769 - 11905: 0xEC7E, - 38770 - 11905: 0xEC80, - 38771 - 11905: 0xBDF9, - 38772 - 11905: 0xD1A5, - 38773 - 11905: 0xEC81, - 38774 - 11905: 0xB0D0, - 38775 - 11905: 0xEC82, - 38776 - 11905: 0xEC83, - 38777 - 11905: 0xEC84, - 38778 - 11905: 0xEC85, - 38779 - 11905: 0xEC86, - 38780 - 11905: 0xF7B0, - 38781 - 11905: 0xEC87, - 38782 - 11905: 0xEC88, - 38783 - 11905: 0xEC89, - 38784 - 11905: 0xEC8A, - 38785 - 11905: 0xEC8B, - 38786 - 11905: 0xEC8C, - 38787 - 11905: 0xEC8D, - 38788 - 11905: 0xEC8E, - 38789 - 11905: 0xF7B1, - 38790 - 11905: 0xEC8F, - 38791 - 11905: 0xEC90, - 38792 - 11905: 0xEC91, - 38793 - 11905: 0xEC92, - 38794 - 11905: 0xEC93, - 38795 - 11905: 0xD0AC, - 38796 - 11905: 0xEC94, - 38797 - 11905: 0xB0B0, - 38798 - 11905: 0xEC95, - 38799 - 11905: 0xEC96, - 38800 - 11905: 0xEC97, - 38801 - 11905: 0xF7B2, - 38802 - 11905: 0xF7B3, - 38803 - 11905: 0xEC98, - 38804 - 11905: 0xF7B4, - 38805 - 11905: 0xEC99, - 38806 - 11905: 0xEC9A, - 38807 - 11905: 0xEC9B, - 38808 - 11905: 0xC7CA, - 38809 - 11905: 0xEC9C, - 38810 - 11905: 0xEC9D, - 38811 - 11905: 0xEC9E, - 38812 - 11905: 0xEC9F, - 38813 - 11905: 0xECA0, - 38814 - 11905: 0xED40, - 38815 - 11905: 0xED41, - 38816 - 11905: 0xBECF, - 38817 - 11905: 0xED42, - 38818 - 11905: 0xED43, - 38819 - 11905: 0xF7B7, - 38820 - 11905: 0xED44, - 38821 - 11905: 0xED45, - 38822 - 11905: 0xED46, - 38823 - 11905: 0xED47, - 38824 - 11905: 0xED48, - 38825 - 11905: 0xED49, - 38826 - 11905: 0xED4A, - 38827 - 11905: 0xF7B6, - 38828 - 11905: 0xED4B, - 38829 - 11905: 0xB1DE, - 38830 - 11905: 0xED4C, - 38831 - 11905: 0xF7B5, - 38832 - 11905: 0xED4D, - 38833 - 11905: 0xED4E, - 38834 - 11905: 0xF7B8, - 38835 - 11905: 0xED4F, - 38836 - 11905: 0xF7B9, - 38837 - 11905: 0xED50, - 38838 - 11905: 0xED51, - 38839 - 11905: 0xED52, - 38840 - 11905: 0xED53, - 38841 - 11905: 0xED54, - 38842 - 11905: 0xED55, - 38843 - 11905: 0xED56, - 38844 - 11905: 0xED57, - 38845 - 11905: 0xED58, - 38846 - 11905: 0xED59, - 38847 - 11905: 0xED5A, - 38848 - 11905: 0xED5B, - 38849 - 11905: 0xED5C, - 38850 - 11905: 0xED5D, - 38851 - 11905: 0xED5E, - 38852 - 11905: 0xED5F, - 38853 - 11905: 0xED60, - 38854 - 11905: 0xED61, - 38855 - 11905: 0xED62, - 38856 - 11905: 0xED63, - 38857 - 11905: 0xED64, - 38858 - 11905: 0xED65, - 38859 - 11905: 0xED66, - 38860 - 11905: 0xED67, - 38861 - 11905: 0xED68, - 38862 - 11905: 0xED69, - 38863 - 11905: 0xED6A, - 38864 - 11905: 0xED6B, - 38865 - 11905: 0xED6C, - 38866 - 11905: 0xED6D, - 38867 - 11905: 0xED6E, - 38868 - 11905: 0xED6F, - 38869 - 11905: 0xED70, - 38870 - 11905: 0xED71, - 38871 - 11905: 0xED72, - 38872 - 11905: 0xED73, - 38873 - 11905: 0xED74, - 38874 - 11905: 0xED75, - 38875 - 11905: 0xED76, - 38876 - 11905: 0xED77, - 38877 - 11905: 0xED78, - 38878 - 11905: 0xED79, - 38879 - 11905: 0xED7A, - 38880 - 11905: 0xED7B, - 38881 - 11905: 0xED7C, - 38882 - 11905: 0xED7D, - 38883 - 11905: 0xED7E, - 38884 - 11905: 0xED80, - 38885 - 11905: 0xED81, - 38886 - 11905: 0xCEA4, - 38887 - 11905: 0xC8CD, - 38888 - 11905: 0xED82, - 38889 - 11905: 0xBAAB, - 38890 - 11905: 0xE8B8, - 38891 - 11905: 0xE8B9, - 38892 - 11905: 0xE8BA, - 38893 - 11905: 0xBEC2, - 38894 - 11905: 0xED83, - 38895 - 11905: 0xED84, - 38896 - 11905: 0xED85, - 38897 - 11905: 0xED86, - 38898 - 11905: 0xED87, - 38899 - 11905: 0xD2F4, - 38900 - 11905: 0xED88, - 38901 - 11905: 0xD4CF, - 38902 - 11905: 0xC9D8, - 38903 - 11905: 0xED89, - 38904 - 11905: 0xED8A, - 38905 - 11905: 0xED8B, - 38906 - 11905: 0xED8C, - 38907 - 11905: 0xED8D, - 38908 - 11905: 0xED8E, - 38909 - 11905: 0xED8F, - 38910 - 11905: 0xED90, - 38911 - 11905: 0xED91, - 38912 - 11905: 0xED92, - 38913 - 11905: 0xED93, - 38914 - 11905: 0xED94, - 38915 - 11905: 0xED95, - 38916 - 11905: 0xED96, - 38917 - 11905: 0xED97, - 38918 - 11905: 0xED98, - 38919 - 11905: 0xED99, - 38920 - 11905: 0xED9A, - 38921 - 11905: 0xED9B, - 38922 - 11905: 0xED9C, - 38923 - 11905: 0xED9D, - 38924 - 11905: 0xED9E, - 38925 - 11905: 0xED9F, - 38926 - 11905: 0xEDA0, - 38927 - 11905: 0xEE40, - 38928 - 11905: 0xEE41, - 38929 - 11905: 0xEE42, - 38930 - 11905: 0xEE43, - 38931 - 11905: 0xEE44, - 38932 - 11905: 0xEE45, - 38933 - 11905: 0xEE46, - 38934 - 11905: 0xEE47, - 38935 - 11905: 0xEE48, - 38936 - 11905: 0xEE49, - 38937 - 11905: 0xEE4A, - 38938 - 11905: 0xEE4B, - 38939 - 11905: 0xEE4C, - 38940 - 11905: 0xEE4D, - 38941 - 11905: 0xEE4E, - 38942 - 11905: 0xEE4F, - 38943 - 11905: 0xEE50, - 38944 - 11905: 0xEE51, - 38945 - 11905: 0xEE52, - 38946 - 11905: 0xEE53, - 38947 - 11905: 0xEE54, - 38948 - 11905: 0xEE55, - 38949 - 11905: 0xEE56, - 38950 - 11905: 0xEE57, - 38951 - 11905: 0xEE58, - 38952 - 11905: 0xEE59, - 38953 - 11905: 0xEE5A, - 38954 - 11905: 0xEE5B, - 38955 - 11905: 0xEE5C, - 38956 - 11905: 0xEE5D, - 38957 - 11905: 0xEE5E, - 38958 - 11905: 0xEE5F, - 38959 - 11905: 0xEE60, - 38960 - 11905: 0xEE61, - 38961 - 11905: 0xEE62, - 38962 - 11905: 0xEE63, - 38963 - 11905: 0xEE64, - 38964 - 11905: 0xEE65, - 38965 - 11905: 0xEE66, - 38966 - 11905: 0xEE67, - 38967 - 11905: 0xEE68, - 38968 - 11905: 0xEE69, - 38969 - 11905: 0xEE6A, - 38970 - 11905: 0xEE6B, - 38971 - 11905: 0xEE6C, - 38972 - 11905: 0xEE6D, - 38973 - 11905: 0xEE6E, - 38974 - 11905: 0xEE6F, - 38975 - 11905: 0xEE70, - 38976 - 11905: 0xEE71, - 38977 - 11905: 0xEE72, - 38978 - 11905: 0xEE73, - 38979 - 11905: 0xEE74, - 38980 - 11905: 0xEE75, - 38981 - 11905: 0xEE76, - 38982 - 11905: 0xEE77, - 38983 - 11905: 0xEE78, - 38984 - 11905: 0xEE79, - 38985 - 11905: 0xEE7A, - 38986 - 11905: 0xEE7B, - 38987 - 11905: 0xEE7C, - 38988 - 11905: 0xEE7D, - 38989 - 11905: 0xEE7E, - 38990 - 11905: 0xEE80, - 38991 - 11905: 0xEE81, - 38992 - 11905: 0xEE82, - 38993 - 11905: 0xEE83, - 38994 - 11905: 0xEE84, - 38995 - 11905: 0xEE85, - 38996 - 11905: 0xEE86, - 38997 - 11905: 0xEE87, - 38998 - 11905: 0xEE88, - 38999 - 11905: 0xEE89, - 39000 - 11905: 0xEE8A, - 39001 - 11905: 0xEE8B, - 39002 - 11905: 0xEE8C, - 39003 - 11905: 0xEE8D, - 39004 - 11905: 0xEE8E, - 39005 - 11905: 0xEE8F, - 39006 - 11905: 0xEE90, - 39007 - 11905: 0xEE91, - 39008 - 11905: 0xEE92, - 39009 - 11905: 0xEE93, - 39010 - 11905: 0xEE94, - 39011 - 11905: 0xEE95, - 39012 - 11905: 0xEE96, - 39013 - 11905: 0xEE97, - 39014 - 11905: 0xEE98, - 39015 - 11905: 0xEE99, - 39016 - 11905: 0xEE9A, - 39017 - 11905: 0xEE9B, - 39018 - 11905: 0xEE9C, - 39019 - 11905: 0xEE9D, - 39020 - 11905: 0xEE9E, - 39021 - 11905: 0xEE9F, - 39022 - 11905: 0xEEA0, - 39023 - 11905: 0xEF40, - 39024 - 11905: 0xEF41, - 39025 - 11905: 0xEF42, - 39026 - 11905: 0xEF43, - 39027 - 11905: 0xEF44, - 39028 - 11905: 0xEF45, - 39029 - 11905: 0xD2B3, - 39030 - 11905: 0xB6A5, - 39031 - 11905: 0xC7EA, - 39032 - 11905: 0xF1FC, - 39033 - 11905: 0xCFEE, - 39034 - 11905: 0xCBB3, - 39035 - 11905: 0xD0EB, - 39036 - 11905: 0xE7EF, - 39037 - 11905: 0xCDE7, - 39038 - 11905: 0xB9CB, - 39039 - 11905: 0xB6D9, - 39040 - 11905: 0xF1FD, - 39041 - 11905: 0xB0E4, - 39042 - 11905: 0xCBCC, - 39043 - 11905: 0xF1FE, - 39044 - 11905: 0xD4A4, - 39045 - 11905: 0xC2AD, - 39046 - 11905: 0xC1EC, - 39047 - 11905: 0xC6C4, - 39048 - 11905: 0xBEB1, - 39049 - 11905: 0xF2A1, - 39050 - 11905: 0xBCD5, - 39051 - 11905: 0xEF46, - 39052 - 11905: 0xF2A2, - 39053 - 11905: 0xF2A3, - 39054 - 11905: 0xEF47, - 39055 - 11905: 0xF2A4, - 39056 - 11905: 0xD2C3, - 39057 - 11905: 0xC6B5, - 39058 - 11905: 0xEF48, - 39059 - 11905: 0xCDC7, - 39060 - 11905: 0xF2A5, - 39061 - 11905: 0xEF49, - 39062 - 11905: 0xD3B1, - 39063 - 11905: 0xBFC5, - 39064 - 11905: 0xCCE2, - 39065 - 11905: 0xEF4A, - 39066 - 11905: 0xF2A6, - 39067 - 11905: 0xF2A7, - 39068 - 11905: 0xD1D5, - 39069 - 11905: 0xB6EE, - 39070 - 11905: 0xF2A8, - 39071 - 11905: 0xF2A9, - 39072 - 11905: 0xB5DF, - 39073 - 11905: 0xF2AA, - 39074 - 11905: 0xF2AB, - 39075 - 11905: 0xEF4B, - 39076 - 11905: 0xB2FC, - 39077 - 11905: 0xF2AC, - 39078 - 11905: 0xF2AD, - 39079 - 11905: 0xC8A7, - 39080 - 11905: 0xEF4C, - 39081 - 11905: 0xEF4D, - 39082 - 11905: 0xEF4E, - 39083 - 11905: 0xEF4F, - 39084 - 11905: 0xEF50, - 39085 - 11905: 0xEF51, - 39086 - 11905: 0xEF52, - 39087 - 11905: 0xEF53, - 39088 - 11905: 0xEF54, - 39089 - 11905: 0xEF55, - 39090 - 11905: 0xEF56, - 39091 - 11905: 0xEF57, - 39092 - 11905: 0xEF58, - 39093 - 11905: 0xEF59, - 39094 - 11905: 0xEF5A, - 39095 - 11905: 0xEF5B, - 39096 - 11905: 0xEF5C, - 39097 - 11905: 0xEF5D, - 39098 - 11905: 0xEF5E, - 39099 - 11905: 0xEF5F, - 39100 - 11905: 0xEF60, - 39101 - 11905: 0xEF61, - 39102 - 11905: 0xEF62, - 39103 - 11905: 0xEF63, - 39104 - 11905: 0xEF64, - 39105 - 11905: 0xEF65, - 39106 - 11905: 0xEF66, - 39107 - 11905: 0xEF67, - 39108 - 11905: 0xEF68, - 39109 - 11905: 0xEF69, - 39110 - 11905: 0xEF6A, - 39111 - 11905: 0xEF6B, - 39112 - 11905: 0xEF6C, - 39113 - 11905: 0xEF6D, - 39114 - 11905: 0xEF6E, - 39115 - 11905: 0xEF6F, - 39116 - 11905: 0xEF70, - 39117 - 11905: 0xEF71, - 39118 - 11905: 0xB7E7, - 39119 - 11905: 0xEF72, - 39120 - 11905: 0xEF73, - 39121 - 11905: 0xECA9, - 39122 - 11905: 0xECAA, - 39123 - 11905: 0xECAB, - 39124 - 11905: 0xEF74, - 39125 - 11905: 0xECAC, - 39126 - 11905: 0xEF75, - 39127 - 11905: 0xEF76, - 39128 - 11905: 0xC6AE, - 39129 - 11905: 0xECAD, - 39130 - 11905: 0xECAE, - 39131 - 11905: 0xEF77, - 39132 - 11905: 0xEF78, - 39133 - 11905: 0xEF79, - 39134 - 11905: 0xB7C9, - 39135 - 11905: 0xCAB3, - 39136 - 11905: 0xEF7A, - 39137 - 11905: 0xEF7B, - 39138 - 11905: 0xEF7C, - 39139 - 11905: 0xEF7D, - 39140 - 11905: 0xEF7E, - 39141 - 11905: 0xEF80, - 39142 - 11905: 0xEF81, - 39143 - 11905: 0xE2B8, - 39144 - 11905: 0xF7CF, - 39145 - 11905: 0xEF82, - 39146 - 11905: 0xEF83, - 39147 - 11905: 0xEF84, - 39148 - 11905: 0xEF85, - 39149 - 11905: 0xEF86, - 39150 - 11905: 0xEF87, - 39151 - 11905: 0xEF88, - 39152 - 11905: 0xEF89, - 39153 - 11905: 0xEF8A, - 39154 - 11905: 0xEF8B, - 39155 - 11905: 0xEF8C, - 39156 - 11905: 0xEF8D, - 39157 - 11905: 0xEF8E, - 39158 - 11905: 0xEF8F, - 39159 - 11905: 0xEF90, - 39160 - 11905: 0xEF91, - 39161 - 11905: 0xEF92, - 39162 - 11905: 0xEF93, - 39163 - 11905: 0xEF94, - 39164 - 11905: 0xEF95, - 39165 - 11905: 0xEF96, - 39166 - 11905: 0xEF97, - 39167 - 11905: 0xEF98, - 39168 - 11905: 0xEF99, - 39169 - 11905: 0xEF9A, - 39170 - 11905: 0xEF9B, - 39171 - 11905: 0xEF9C, - 39172 - 11905: 0xEF9D, - 39173 - 11905: 0xEF9E, - 39174 - 11905: 0xEF9F, - 39175 - 11905: 0xEFA0, - 39176 - 11905: 0xF040, - 39177 - 11905: 0xF041, - 39178 - 11905: 0xF042, - 39179 - 11905: 0xF043, - 39180 - 11905: 0xF044, - 39181 - 11905: 0xF7D0, - 39182 - 11905: 0xF045, - 39183 - 11905: 0xF046, - 39184 - 11905: 0xB2CD, - 39185 - 11905: 0xF047, - 39186 - 11905: 0xF048, - 39187 - 11905: 0xF049, - 39188 - 11905: 0xF04A, - 39189 - 11905: 0xF04B, - 39190 - 11905: 0xF04C, - 39191 - 11905: 0xF04D, - 39192 - 11905: 0xF04E, - 39193 - 11905: 0xF04F, - 39194 - 11905: 0xF050, - 39195 - 11905: 0xF051, - 39196 - 11905: 0xF052, - 39197 - 11905: 0xF053, - 39198 - 11905: 0xF054, - 39199 - 11905: 0xF055, - 39200 - 11905: 0xF056, - 39201 - 11905: 0xF057, - 39202 - 11905: 0xF058, - 39203 - 11905: 0xF059, - 39204 - 11905: 0xF05A, - 39205 - 11905: 0xF05B, - 39206 - 11905: 0xF05C, - 39207 - 11905: 0xF05D, - 39208 - 11905: 0xF05E, - 39209 - 11905: 0xF05F, - 39210 - 11905: 0xF060, - 39211 - 11905: 0xF061, - 39212 - 11905: 0xF062, - 39213 - 11905: 0xF063, - 39214 - 11905: 0xF7D1, - 39215 - 11905: 0xF064, - 39216 - 11905: 0xF065, - 39217 - 11905: 0xF066, - 39218 - 11905: 0xF067, - 39219 - 11905: 0xF068, - 39220 - 11905: 0xF069, - 39221 - 11905: 0xF06A, - 39222 - 11905: 0xF06B, - 39223 - 11905: 0xF06C, - 39224 - 11905: 0xF06D, - 39225 - 11905: 0xF06E, - 39226 - 11905: 0xF06F, - 39227 - 11905: 0xF070, - 39228 - 11905: 0xF071, - 39229 - 11905: 0xF072, - 39230 - 11905: 0xF073, - 39231 - 11905: 0xF074, - 39232 - 11905: 0xF075, - 39233 - 11905: 0xF076, - 39234 - 11905: 0xF077, - 39235 - 11905: 0xF078, - 39236 - 11905: 0xF079, - 39237 - 11905: 0xF07A, - 39238 - 11905: 0xF07B, - 39239 - 11905: 0xF07C, - 39240 - 11905: 0xF07D, - 39241 - 11905: 0xF07E, - 39242 - 11905: 0xF080, - 39243 - 11905: 0xF081, - 39244 - 11905: 0xF082, - 39245 - 11905: 0xF083, - 39246 - 11905: 0xF084, - 39247 - 11905: 0xF085, - 39248 - 11905: 0xF086, - 39249 - 11905: 0xF087, - 39250 - 11905: 0xF088, - 39251 - 11905: 0xF089, - 39252 - 11905: 0xF7D3, - 39253 - 11905: 0xF7D2, - 39254 - 11905: 0xF08A, - 39255 - 11905: 0xF08B, - 39256 - 11905: 0xF08C, - 39257 - 11905: 0xF08D, - 39258 - 11905: 0xF08E, - 39259 - 11905: 0xF08F, - 39260 - 11905: 0xF090, - 39261 - 11905: 0xF091, - 39262 - 11905: 0xF092, - 39263 - 11905: 0xF093, - 39264 - 11905: 0xF094, - 39265 - 11905: 0xF095, - 39266 - 11905: 0xF096, - 39267 - 11905: 0xE2BB, - 39268 - 11905: 0xF097, - 39269 - 11905: 0xBCA2, - 39270 - 11905: 0xF098, - 39271 - 11905: 0xE2BC, - 39272 - 11905: 0xE2BD, - 39273 - 11905: 0xE2BE, - 39274 - 11905: 0xE2BF, - 39275 - 11905: 0xE2C0, - 39276 - 11905: 0xE2C1, - 39277 - 11905: 0xB7B9, - 39278 - 11905: 0xD2FB, - 39279 - 11905: 0xBDA4, - 39280 - 11905: 0xCACE, - 39281 - 11905: 0xB1A5, - 39282 - 11905: 0xCBC7, - 39283 - 11905: 0xF099, - 39284 - 11905: 0xE2C2, - 39285 - 11905: 0xB6FC, - 39286 - 11905: 0xC8C4, - 39287 - 11905: 0xE2C3, - 39288 - 11905: 0xF09A, - 39289 - 11905: 0xF09B, - 39290 - 11905: 0xBDC8, - 39291 - 11905: 0xF09C, - 39292 - 11905: 0xB1FD, - 39293 - 11905: 0xE2C4, - 39294 - 11905: 0xF09D, - 39295 - 11905: 0xB6F6, - 39296 - 11905: 0xE2C5, - 39297 - 11905: 0xC4D9, - 39298 - 11905: 0xF09E, - 39299 - 11905: 0xF09F, - 39300 - 11905: 0xE2C6, - 39301 - 11905: 0xCFDA, - 39302 - 11905: 0xB9DD, - 39303 - 11905: 0xE2C7, - 39304 - 11905: 0xC0A1, - 39305 - 11905: 0xF0A0, - 39306 - 11905: 0xE2C8, - 39307 - 11905: 0xB2F6, - 39308 - 11905: 0xF140, - 39309 - 11905: 0xE2C9, - 39310 - 11905: 0xF141, - 39311 - 11905: 0xC1F3, - 39312 - 11905: 0xE2CA, - 39313 - 11905: 0xE2CB, - 39314 - 11905: 0xC2F8, - 39315 - 11905: 0xE2CC, - 39316 - 11905: 0xE2CD, - 39317 - 11905: 0xE2CE, - 39318 - 11905: 0xCAD7, - 39319 - 11905: 0xD8B8, - 39320 - 11905: 0xD9E5, - 39321 - 11905: 0xCFE3, - 39322 - 11905: 0xF142, - 39323 - 11905: 0xF143, - 39324 - 11905: 0xF144, - 39325 - 11905: 0xF145, - 39326 - 11905: 0xF146, - 39327 - 11905: 0xF147, - 39328 - 11905: 0xF148, - 39329 - 11905: 0xF149, - 39330 - 11905: 0xF14A, - 39331 - 11905: 0xF14B, - 39332 - 11905: 0xF14C, - 39333 - 11905: 0xF0A5, - 39334 - 11905: 0xF14D, - 39335 - 11905: 0xF14E, - 39336 - 11905: 0xDCB0, - 39337 - 11905: 0xF14F, - 39338 - 11905: 0xF150, - 39339 - 11905: 0xF151, - 39340 - 11905: 0xF152, - 39341 - 11905: 0xF153, - 39342 - 11905: 0xF154, - 39343 - 11905: 0xF155, - 39344 - 11905: 0xF156, - 39345 - 11905: 0xF157, - 39346 - 11905: 0xF158, - 39347 - 11905: 0xF159, - 39348 - 11905: 0xF15A, - 39349 - 11905: 0xF15B, - 39350 - 11905: 0xF15C, - 39351 - 11905: 0xF15D, - 39352 - 11905: 0xF15E, - 39353 - 11905: 0xF15F, - 39354 - 11905: 0xF160, - 39355 - 11905: 0xF161, - 39356 - 11905: 0xF162, - 39357 - 11905: 0xF163, - 39358 - 11905: 0xF164, - 39359 - 11905: 0xF165, - 39360 - 11905: 0xF166, - 39361 - 11905: 0xF167, - 39362 - 11905: 0xF168, - 39363 - 11905: 0xF169, - 39364 - 11905: 0xF16A, - 39365 - 11905: 0xF16B, - 39366 - 11905: 0xF16C, - 39367 - 11905: 0xF16D, - 39368 - 11905: 0xF16E, - 39369 - 11905: 0xF16F, - 39370 - 11905: 0xF170, - 39371 - 11905: 0xF171, - 39372 - 11905: 0xF172, - 39373 - 11905: 0xF173, - 39374 - 11905: 0xF174, - 39375 - 11905: 0xF175, - 39376 - 11905: 0xF176, - 39377 - 11905: 0xF177, - 39378 - 11905: 0xF178, - 39379 - 11905: 0xF179, - 39380 - 11905: 0xF17A, - 39381 - 11905: 0xF17B, - 39382 - 11905: 0xF17C, - 39383 - 11905: 0xF17D, - 39384 - 11905: 0xF17E, - 39385 - 11905: 0xF180, - 39386 - 11905: 0xF181, - 39387 - 11905: 0xF182, - 39388 - 11905: 0xF183, - 39389 - 11905: 0xF184, - 39390 - 11905: 0xF185, - 39391 - 11905: 0xF186, - 39392 - 11905: 0xF187, - 39393 - 11905: 0xF188, - 39394 - 11905: 0xF189, - 39395 - 11905: 0xF18A, - 39396 - 11905: 0xF18B, - 39397 - 11905: 0xF18C, - 39398 - 11905: 0xF18D, - 39399 - 11905: 0xF18E, - 39400 - 11905: 0xF18F, - 39401 - 11905: 0xF190, - 39402 - 11905: 0xF191, - 39403 - 11905: 0xF192, - 39404 - 11905: 0xF193, - 39405 - 11905: 0xF194, - 39406 - 11905: 0xF195, - 39407 - 11905: 0xF196, - 39408 - 11905: 0xF197, - 39409 - 11905: 0xF198, - 39410 - 11905: 0xF199, - 39411 - 11905: 0xF19A, - 39412 - 11905: 0xF19B, - 39413 - 11905: 0xF19C, - 39414 - 11905: 0xF19D, - 39415 - 11905: 0xF19E, - 39416 - 11905: 0xF19F, - 39417 - 11905: 0xF1A0, - 39418 - 11905: 0xF240, - 39419 - 11905: 0xF241, - 39420 - 11905: 0xF242, - 39421 - 11905: 0xF243, - 39422 - 11905: 0xF244, - 39423 - 11905: 0xF245, - 39424 - 11905: 0xF246, - 39425 - 11905: 0xF247, - 39426 - 11905: 0xF248, - 39427 - 11905: 0xF249, - 39428 - 11905: 0xF24A, - 39429 - 11905: 0xF24B, - 39430 - 11905: 0xF24C, - 39431 - 11905: 0xF24D, - 39432 - 11905: 0xF24E, - 39433 - 11905: 0xF24F, - 39434 - 11905: 0xF250, - 39435 - 11905: 0xF251, - 39436 - 11905: 0xF252, - 39437 - 11905: 0xF253, - 39438 - 11905: 0xF254, - 39439 - 11905: 0xF255, - 39440 - 11905: 0xF256, - 39441 - 11905: 0xF257, - 39442 - 11905: 0xF258, - 39443 - 11905: 0xF259, - 39444 - 11905: 0xF25A, - 39445 - 11905: 0xF25B, - 39446 - 11905: 0xF25C, - 39447 - 11905: 0xF25D, - 39448 - 11905: 0xF25E, - 39449 - 11905: 0xF25F, - 39450 - 11905: 0xF260, - 39451 - 11905: 0xF261, - 39452 - 11905: 0xF262, - 39453 - 11905: 0xF263, - 39454 - 11905: 0xF264, - 39455 - 11905: 0xF265, - 39456 - 11905: 0xF266, - 39457 - 11905: 0xF267, - 39458 - 11905: 0xF268, - 39459 - 11905: 0xF269, - 39460 - 11905: 0xF26A, - 39461 - 11905: 0xF26B, - 39462 - 11905: 0xF26C, - 39463 - 11905: 0xF26D, - 39464 - 11905: 0xF26E, - 39465 - 11905: 0xF26F, - 39466 - 11905: 0xF270, - 39467 - 11905: 0xF271, - 39468 - 11905: 0xF272, - 39469 - 11905: 0xF273, - 39470 - 11905: 0xF274, - 39471 - 11905: 0xF275, - 39472 - 11905: 0xF276, - 39473 - 11905: 0xF277, - 39474 - 11905: 0xF278, - 39475 - 11905: 0xF279, - 39476 - 11905: 0xF27A, - 39477 - 11905: 0xF27B, - 39478 - 11905: 0xF27C, - 39479 - 11905: 0xF27D, - 39480 - 11905: 0xF27E, - 39481 - 11905: 0xF280, - 39482 - 11905: 0xF281, - 39483 - 11905: 0xF282, - 39484 - 11905: 0xF283, - 39485 - 11905: 0xF284, - 39486 - 11905: 0xF285, - 39487 - 11905: 0xF286, - 39488 - 11905: 0xF287, - 39489 - 11905: 0xF288, - 39490 - 11905: 0xF289, - 39491 - 11905: 0xF28A, - 39492 - 11905: 0xF28B, - 39493 - 11905: 0xF28C, - 39494 - 11905: 0xF28D, - 39495 - 11905: 0xF28E, - 39496 - 11905: 0xF28F, - 39497 - 11905: 0xF290, - 39498 - 11905: 0xF291, - 39499 - 11905: 0xF292, - 39500 - 11905: 0xF293, - 39501 - 11905: 0xF294, - 39502 - 11905: 0xF295, - 39503 - 11905: 0xF296, - 39504 - 11905: 0xF297, - 39505 - 11905: 0xF298, - 39506 - 11905: 0xF299, - 39507 - 11905: 0xF29A, - 39508 - 11905: 0xF29B, - 39509 - 11905: 0xF29C, - 39510 - 11905: 0xF29D, - 39511 - 11905: 0xF29E, - 39512 - 11905: 0xF29F, - 39513 - 11905: 0xF2A0, - 39514 - 11905: 0xF340, - 39515 - 11905: 0xF341, - 39516 - 11905: 0xF342, - 39517 - 11905: 0xF343, - 39518 - 11905: 0xF344, - 39519 - 11905: 0xF345, - 39520 - 11905: 0xF346, - 39521 - 11905: 0xF347, - 39522 - 11905: 0xF348, - 39523 - 11905: 0xF349, - 39524 - 11905: 0xF34A, - 39525 - 11905: 0xF34B, - 39526 - 11905: 0xF34C, - 39527 - 11905: 0xF34D, - 39528 - 11905: 0xF34E, - 39529 - 11905: 0xF34F, - 39530 - 11905: 0xF350, - 39531 - 11905: 0xF351, - 39532 - 11905: 0xC2ED, - 39533 - 11905: 0xD4A6, - 39534 - 11905: 0xCDD4, - 39535 - 11905: 0xD1B1, - 39536 - 11905: 0xB3DB, - 39537 - 11905: 0xC7FD, - 39538 - 11905: 0xF352, - 39539 - 11905: 0xB2B5, - 39540 - 11905: 0xC2BF, - 39541 - 11905: 0xE6E0, - 39542 - 11905: 0xCABB, - 39543 - 11905: 0xE6E1, - 39544 - 11905: 0xE6E2, - 39545 - 11905: 0xBED4, - 39546 - 11905: 0xE6E3, - 39547 - 11905: 0xD7A4, - 39548 - 11905: 0xCDD5, - 39549 - 11905: 0xE6E5, - 39550 - 11905: 0xBCDD, - 39551 - 11905: 0xE6E4, - 39552 - 11905: 0xE6E6, - 39553 - 11905: 0xE6E7, - 39554 - 11905: 0xC2EE, - 39555 - 11905: 0xF353, - 39556 - 11905: 0xBDBE, - 39557 - 11905: 0xE6E8, - 39558 - 11905: 0xC2E6, - 39559 - 11905: 0xBAA7, - 39560 - 11905: 0xE6E9, - 39561 - 11905: 0xF354, - 39562 - 11905: 0xE6EA, - 39563 - 11905: 0xB3D2, - 39564 - 11905: 0xD1E9, - 39565 - 11905: 0xF355, - 39566 - 11905: 0xF356, - 39567 - 11905: 0xBFA5, - 39568 - 11905: 0xE6EB, - 39569 - 11905: 0xC6EF, - 39570 - 11905: 0xE6EC, - 39571 - 11905: 0xE6ED, - 39572 - 11905: 0xF357, - 39573 - 11905: 0xF358, - 39574 - 11905: 0xE6EE, - 39575 - 11905: 0xC6AD, - 39576 - 11905: 0xE6EF, - 39577 - 11905: 0xF359, - 39578 - 11905: 0xC9A7, - 39579 - 11905: 0xE6F0, - 39580 - 11905: 0xE6F1, - 39581 - 11905: 0xE6F2, - 39582 - 11905: 0xE5B9, - 39583 - 11905: 0xE6F3, - 39584 - 11905: 0xE6F4, - 39585 - 11905: 0xC2E2, - 39586 - 11905: 0xE6F5, - 39587 - 11905: 0xE6F6, - 39588 - 11905: 0xD6E8, - 39589 - 11905: 0xE6F7, - 39590 - 11905: 0xF35A, - 39591 - 11905: 0xE6F8, - 39592 - 11905: 0xB9C7, - 39593 - 11905: 0xF35B, - 39594 - 11905: 0xF35C, - 39595 - 11905: 0xF35D, - 39596 - 11905: 0xF35E, - 39597 - 11905: 0xF35F, - 39598 - 11905: 0xF360, - 39599 - 11905: 0xF361, - 39600 - 11905: 0xF7BB, - 39601 - 11905: 0xF7BA, - 39602 - 11905: 0xF362, - 39603 - 11905: 0xF363, - 39604 - 11905: 0xF364, - 39605 - 11905: 0xF365, - 39606 - 11905: 0xF7BE, - 39607 - 11905: 0xF7BC, - 39608 - 11905: 0xBAA1, - 39609 - 11905: 0xF366, - 39610 - 11905: 0xF7BF, - 39611 - 11905: 0xF367, - 39612 - 11905: 0xF7C0, - 39613 - 11905: 0xF368, - 39614 - 11905: 0xF369, - 39615 - 11905: 0xF36A, - 39616 - 11905: 0xF7C2, - 39617 - 11905: 0xF7C1, - 39618 - 11905: 0xF7C4, - 39619 - 11905: 0xF36B, - 39620 - 11905: 0xF36C, - 39621 - 11905: 0xF7C3, - 39622 - 11905: 0xF36D, - 39623 - 11905: 0xF36E, - 39624 - 11905: 0xF36F, - 39625 - 11905: 0xF370, - 39626 - 11905: 0xF371, - 39627 - 11905: 0xF7C5, - 39628 - 11905: 0xF7C6, - 39629 - 11905: 0xF372, - 39630 - 11905: 0xF373, - 39631 - 11905: 0xF374, - 39632 - 11905: 0xF375, - 39633 - 11905: 0xF7C7, - 39634 - 11905: 0xF376, - 39635 - 11905: 0xCBE8, - 39636 - 11905: 0xF377, - 39637 - 11905: 0xF378, - 39638 - 11905: 0xF379, - 39639 - 11905: 0xF37A, - 39640 - 11905: 0xB8DF, - 39641 - 11905: 0xF37B, - 39642 - 11905: 0xF37C, - 39643 - 11905: 0xF37D, - 39644 - 11905: 0xF37E, - 39645 - 11905: 0xF380, - 39646 - 11905: 0xF381, - 39647 - 11905: 0xF7D4, - 39648 - 11905: 0xF382, - 39649 - 11905: 0xF7D5, - 39650 - 11905: 0xF383, - 39651 - 11905: 0xF384, - 39652 - 11905: 0xF385, - 39653 - 11905: 0xF386, - 39654 - 11905: 0xF7D6, - 39655 - 11905: 0xF387, - 39656 - 11905: 0xF388, - 39657 - 11905: 0xF389, - 39658 - 11905: 0xF38A, - 39659 - 11905: 0xF7D8, - 39660 - 11905: 0xF38B, - 39661 - 11905: 0xF7DA, - 39662 - 11905: 0xF38C, - 39663 - 11905: 0xF7D7, - 39664 - 11905: 0xF38D, - 39665 - 11905: 0xF38E, - 39666 - 11905: 0xF38F, - 39667 - 11905: 0xF390, - 39668 - 11905: 0xF391, - 39669 - 11905: 0xF392, - 39670 - 11905: 0xF393, - 39671 - 11905: 0xF394, - 39672 - 11905: 0xF395, - 39673 - 11905: 0xF7DB, - 39674 - 11905: 0xF396, - 39675 - 11905: 0xF7D9, - 39676 - 11905: 0xF397, - 39677 - 11905: 0xF398, - 39678 - 11905: 0xF399, - 39679 - 11905: 0xF39A, - 39680 - 11905: 0xF39B, - 39681 - 11905: 0xF39C, - 39682 - 11905: 0xF39D, - 39683 - 11905: 0xD7D7, - 39684 - 11905: 0xF39E, - 39685 - 11905: 0xF39F, - 39686 - 11905: 0xF3A0, - 39687 - 11905: 0xF440, - 39688 - 11905: 0xF7DC, - 39689 - 11905: 0xF441, - 39690 - 11905: 0xF442, - 39691 - 11905: 0xF443, - 39692 - 11905: 0xF444, - 39693 - 11905: 0xF445, - 39694 - 11905: 0xF446, - 39695 - 11905: 0xF7DD, - 39696 - 11905: 0xF447, - 39697 - 11905: 0xF448, - 39698 - 11905: 0xF449, - 39699 - 11905: 0xF7DE, - 39700 - 11905: 0xF44A, - 39701 - 11905: 0xF44B, - 39702 - 11905: 0xF44C, - 39703 - 11905: 0xF44D, - 39704 - 11905: 0xF44E, - 39705 - 11905: 0xF44F, - 39706 - 11905: 0xF450, - 39707 - 11905: 0xF451, - 39708 - 11905: 0xF452, - 39709 - 11905: 0xF453, - 39710 - 11905: 0xF454, - 39711 - 11905: 0xF7DF, - 39712 - 11905: 0xF455, - 39713 - 11905: 0xF456, - 39714 - 11905: 0xF457, - 39715 - 11905: 0xF7E0, - 39716 - 11905: 0xF458, - 39717 - 11905: 0xF459, - 39718 - 11905: 0xF45A, - 39719 - 11905: 0xF45B, - 39720 - 11905: 0xF45C, - 39721 - 11905: 0xF45D, - 39722 - 11905: 0xF45E, - 39723 - 11905: 0xF45F, - 39724 - 11905: 0xF460, - 39725 - 11905: 0xF461, - 39726 - 11905: 0xF462, - 39727 - 11905: 0xDBCB, - 39728 - 11905: 0xF463, - 39729 - 11905: 0xF464, - 39730 - 11905: 0xD8AA, - 39731 - 11905: 0xF465, - 39732 - 11905: 0xF466, - 39733 - 11905: 0xF467, - 39734 - 11905: 0xF468, - 39735 - 11905: 0xF469, - 39736 - 11905: 0xF46A, - 39737 - 11905: 0xF46B, - 39738 - 11905: 0xF46C, - 39739 - 11905: 0xE5F7, - 39740 - 11905: 0xB9ED, - 39741 - 11905: 0xF46D, - 39742 - 11905: 0xF46E, - 39743 - 11905: 0xF46F, - 39744 - 11905: 0xF470, - 39745 - 11905: 0xBFFD, - 39746 - 11905: 0xBBEA, - 39747 - 11905: 0xF7C9, - 39748 - 11905: 0xC6C7, - 39749 - 11905: 0xF7C8, - 39750 - 11905: 0xF471, - 39751 - 11905: 0xF7CA, - 39752 - 11905: 0xF7CC, - 39753 - 11905: 0xF7CB, - 39754 - 11905: 0xF472, - 39755 - 11905: 0xF473, - 39756 - 11905: 0xF474, - 39757 - 11905: 0xF7CD, - 39758 - 11905: 0xF475, - 39759 - 11905: 0xCEBA, - 39760 - 11905: 0xF476, - 39761 - 11905: 0xF7CE, - 39762 - 11905: 0xF477, - 39763 - 11905: 0xF478, - 39764 - 11905: 0xC4A7, - 39765 - 11905: 0xF479, - 39766 - 11905: 0xF47A, - 39767 - 11905: 0xF47B, - 39768 - 11905: 0xF47C, - 39769 - 11905: 0xF47D, - 39770 - 11905: 0xF47E, - 39771 - 11905: 0xF480, - 39772 - 11905: 0xF481, - 39773 - 11905: 0xF482, - 39774 - 11905: 0xF483, - 39775 - 11905: 0xF484, - 39776 - 11905: 0xF485, - 39777 - 11905: 0xF486, - 39778 - 11905: 0xF487, - 39779 - 11905: 0xF488, - 39780 - 11905: 0xF489, - 39781 - 11905: 0xF48A, - 39782 - 11905: 0xF48B, - 39783 - 11905: 0xF48C, - 39784 - 11905: 0xF48D, - 39785 - 11905: 0xF48E, - 39786 - 11905: 0xF48F, - 39787 - 11905: 0xF490, - 39788 - 11905: 0xF491, - 39789 - 11905: 0xF492, - 39790 - 11905: 0xF493, - 39791 - 11905: 0xF494, - 39792 - 11905: 0xF495, - 39793 - 11905: 0xF496, - 39794 - 11905: 0xF497, - 39795 - 11905: 0xF498, - 39796 - 11905: 0xF499, - 39797 - 11905: 0xF49A, - 39798 - 11905: 0xF49B, - 39799 - 11905: 0xF49C, - 39800 - 11905: 0xF49D, - 39801 - 11905: 0xF49E, - 39802 - 11905: 0xF49F, - 39803 - 11905: 0xF4A0, - 39804 - 11905: 0xF540, - 39805 - 11905: 0xF541, - 39806 - 11905: 0xF542, - 39807 - 11905: 0xF543, - 39808 - 11905: 0xF544, - 39809 - 11905: 0xF545, - 39810 - 11905: 0xF546, - 39811 - 11905: 0xF547, - 39812 - 11905: 0xF548, - 39813 - 11905: 0xF549, - 39814 - 11905: 0xF54A, - 39815 - 11905: 0xF54B, - 39816 - 11905: 0xF54C, - 39817 - 11905: 0xF54D, - 39818 - 11905: 0xF54E, - 39819 - 11905: 0xF54F, - 39820 - 11905: 0xF550, - 39821 - 11905: 0xF551, - 39822 - 11905: 0xF552, - 39823 - 11905: 0xF553, - 39824 - 11905: 0xF554, - 39825 - 11905: 0xF555, - 39826 - 11905: 0xF556, - 39827 - 11905: 0xF557, - 39828 - 11905: 0xF558, - 39829 - 11905: 0xF559, - 39830 - 11905: 0xF55A, - 39831 - 11905: 0xF55B, - 39832 - 11905: 0xF55C, - 39833 - 11905: 0xF55D, - 39834 - 11905: 0xF55E, - 39835 - 11905: 0xF55F, - 39836 - 11905: 0xF560, - 39837 - 11905: 0xF561, - 39838 - 11905: 0xF562, - 39839 - 11905: 0xF563, - 39840 - 11905: 0xF564, - 39841 - 11905: 0xF565, - 39842 - 11905: 0xF566, - 39843 - 11905: 0xF567, - 39844 - 11905: 0xF568, - 39845 - 11905: 0xF569, - 39846 - 11905: 0xF56A, - 39847 - 11905: 0xF56B, - 39848 - 11905: 0xF56C, - 39849 - 11905: 0xF56D, - 39850 - 11905: 0xF56E, - 39851 - 11905: 0xF56F, - 39852 - 11905: 0xF570, - 39853 - 11905: 0xF571, - 39854 - 11905: 0xF572, - 39855 - 11905: 0xF573, - 39856 - 11905: 0xF574, - 39857 - 11905: 0xF575, - 39858 - 11905: 0xF576, - 39859 - 11905: 0xF577, - 39860 - 11905: 0xF578, - 39861 - 11905: 0xF579, - 39862 - 11905: 0xF57A, - 39863 - 11905: 0xF57B, - 39864 - 11905: 0xF57C, - 39865 - 11905: 0xF57D, - 39866 - 11905: 0xF57E, - 39867 - 11905: 0xF580, - 39868 - 11905: 0xF581, - 39869 - 11905: 0xF582, - 39870 - 11905: 0xF583, - 39871 - 11905: 0xF584, - 39872 - 11905: 0xF585, - 39873 - 11905: 0xF586, - 39874 - 11905: 0xF587, - 39875 - 11905: 0xF588, - 39876 - 11905: 0xF589, - 39877 - 11905: 0xF58A, - 39878 - 11905: 0xF58B, - 39879 - 11905: 0xF58C, - 39880 - 11905: 0xF58D, - 39881 - 11905: 0xF58E, - 39882 - 11905: 0xF58F, - 39883 - 11905: 0xF590, - 39884 - 11905: 0xF591, - 39885 - 11905: 0xF592, - 39886 - 11905: 0xF593, - 39887 - 11905: 0xF594, - 39888 - 11905: 0xF595, - 39889 - 11905: 0xF596, - 39890 - 11905: 0xF597, - 39891 - 11905: 0xF598, - 39892 - 11905: 0xF599, - 39893 - 11905: 0xF59A, - 39894 - 11905: 0xF59B, - 39895 - 11905: 0xF59C, - 39896 - 11905: 0xF59D, - 39897 - 11905: 0xF59E, - 39898 - 11905: 0xF59F, - 39899 - 11905: 0xF5A0, - 39900 - 11905: 0xF640, - 39901 - 11905: 0xF641, - 39902 - 11905: 0xF642, - 39903 - 11905: 0xF643, - 39904 - 11905: 0xF644, - 39905 - 11905: 0xF645, - 39906 - 11905: 0xF646, - 39907 - 11905: 0xF647, - 39908 - 11905: 0xF648, - 39909 - 11905: 0xF649, - 39910 - 11905: 0xF64A, - 39911 - 11905: 0xF64B, - 39912 - 11905: 0xF64C, - 39913 - 11905: 0xF64D, - 39914 - 11905: 0xF64E, - 39915 - 11905: 0xF64F, - 39916 - 11905: 0xF650, - 39917 - 11905: 0xF651, - 39918 - 11905: 0xF652, - 39919 - 11905: 0xF653, - 39920 - 11905: 0xF654, - 39921 - 11905: 0xF655, - 39922 - 11905: 0xF656, - 39923 - 11905: 0xF657, - 39924 - 11905: 0xF658, - 39925 - 11905: 0xF659, - 39926 - 11905: 0xF65A, - 39927 - 11905: 0xF65B, - 39928 - 11905: 0xF65C, - 39929 - 11905: 0xF65D, - 39930 - 11905: 0xF65E, - 39931 - 11905: 0xF65F, - 39932 - 11905: 0xF660, - 39933 - 11905: 0xF661, - 39934 - 11905: 0xF662, - 39935 - 11905: 0xF663, - 39936 - 11905: 0xF664, - 39937 - 11905: 0xF665, - 39938 - 11905: 0xF666, - 39939 - 11905: 0xF667, - 39940 - 11905: 0xF668, - 39941 - 11905: 0xF669, - 39942 - 11905: 0xF66A, - 39943 - 11905: 0xF66B, - 39944 - 11905: 0xF66C, - 39945 - 11905: 0xF66D, - 39946 - 11905: 0xF66E, - 39947 - 11905: 0xF66F, - 39948 - 11905: 0xF670, - 39949 - 11905: 0xF671, - 39950 - 11905: 0xF672, - 39951 - 11905: 0xF673, - 39952 - 11905: 0xF674, - 39953 - 11905: 0xF675, - 39954 - 11905: 0xF676, - 39955 - 11905: 0xF677, - 39956 - 11905: 0xF678, - 39957 - 11905: 0xF679, - 39958 - 11905: 0xF67A, - 39959 - 11905: 0xF67B, - 39960 - 11905: 0xF67C, - 39961 - 11905: 0xF67D, - 39962 - 11905: 0xF67E, - 39963 - 11905: 0xF680, - 39964 - 11905: 0xF681, - 39965 - 11905: 0xF682, - 39966 - 11905: 0xF683, - 39967 - 11905: 0xF684, - 39968 - 11905: 0xF685, - 39969 - 11905: 0xF686, - 39970 - 11905: 0xF687, - 39971 - 11905: 0xF688, - 39972 - 11905: 0xF689, - 39973 - 11905: 0xF68A, - 39974 - 11905: 0xF68B, - 39975 - 11905: 0xF68C, - 39976 - 11905: 0xF68D, - 39977 - 11905: 0xF68E, - 39978 - 11905: 0xF68F, - 39979 - 11905: 0xF690, - 39980 - 11905: 0xF691, - 39981 - 11905: 0xF692, - 39982 - 11905: 0xF693, - 39983 - 11905: 0xF694, - 39984 - 11905: 0xF695, - 39985 - 11905: 0xF696, - 39986 - 11905: 0xF697, - 39987 - 11905: 0xF698, - 39988 - 11905: 0xF699, - 39989 - 11905: 0xF69A, - 39990 - 11905: 0xF69B, - 39991 - 11905: 0xF69C, - 39992 - 11905: 0xF69D, - 39993 - 11905: 0xF69E, - 39994 - 11905: 0xF69F, - 39995 - 11905: 0xF6A0, - 39996 - 11905: 0xF740, - 39997 - 11905: 0xF741, - 39998 - 11905: 0xF742, - 39999 - 11905: 0xF743, - 40000 - 11905: 0xF744, - 40001 - 11905: 0xF745, - 40002 - 11905: 0xF746, - 40003 - 11905: 0xF747, - 40004 - 11905: 0xF748, - 40005 - 11905: 0xF749, - 40006 - 11905: 0xF74A, - 40007 - 11905: 0xF74B, - 40008 - 11905: 0xF74C, - 40009 - 11905: 0xF74D, - 40010 - 11905: 0xF74E, - 40011 - 11905: 0xF74F, - 40012 - 11905: 0xF750, - 40013 - 11905: 0xF751, - 40014 - 11905: 0xF752, - 40015 - 11905: 0xF753, - 40016 - 11905: 0xF754, - 40017 - 11905: 0xF755, - 40018 - 11905: 0xF756, - 40019 - 11905: 0xF757, - 40020 - 11905: 0xF758, - 40021 - 11905: 0xF759, - 40022 - 11905: 0xF75A, - 40023 - 11905: 0xF75B, - 40024 - 11905: 0xF75C, - 40025 - 11905: 0xF75D, - 40026 - 11905: 0xF75E, - 40027 - 11905: 0xF75F, - 40028 - 11905: 0xF760, - 40029 - 11905: 0xF761, - 40030 - 11905: 0xF762, - 40031 - 11905: 0xF763, - 40032 - 11905: 0xF764, - 40033 - 11905: 0xF765, - 40034 - 11905: 0xF766, - 40035 - 11905: 0xF767, - 40036 - 11905: 0xF768, - 40037 - 11905: 0xF769, - 40038 - 11905: 0xF76A, - 40039 - 11905: 0xF76B, - 40040 - 11905: 0xF76C, - 40041 - 11905: 0xF76D, - 40042 - 11905: 0xF76E, - 40043 - 11905: 0xF76F, - 40044 - 11905: 0xF770, - 40045 - 11905: 0xF771, - 40046 - 11905: 0xF772, - 40047 - 11905: 0xF773, - 40048 - 11905: 0xF774, - 40049 - 11905: 0xF775, - 40050 - 11905: 0xF776, - 40051 - 11905: 0xF777, - 40052 - 11905: 0xF778, - 40053 - 11905: 0xF779, - 40054 - 11905: 0xF77A, - 40055 - 11905: 0xF77B, - 40056 - 11905: 0xF77C, - 40057 - 11905: 0xF77D, - 40058 - 11905: 0xF77E, - 40059 - 11905: 0xF780, - 40060 - 11905: 0xD3E3, - 40061 - 11905: 0xF781, - 40062 - 11905: 0xF782, - 40063 - 11905: 0xF6CF, - 40064 - 11905: 0xF783, - 40065 - 11905: 0xC2B3, - 40066 - 11905: 0xF6D0, - 40067 - 11905: 0xF784, - 40068 - 11905: 0xF785, - 40069 - 11905: 0xF6D1, - 40070 - 11905: 0xF6D2, - 40071 - 11905: 0xF6D3, - 40072 - 11905: 0xF6D4, - 40073 - 11905: 0xF786, - 40074 - 11905: 0xF787, - 40075 - 11905: 0xF6D6, - 40076 - 11905: 0xF788, - 40077 - 11905: 0xB1AB, - 40078 - 11905: 0xF6D7, - 40079 - 11905: 0xF789, - 40080 - 11905: 0xF6D8, - 40081 - 11905: 0xF6D9, - 40082 - 11905: 0xF6DA, - 40083 - 11905: 0xF78A, - 40084 - 11905: 0xF6DB, - 40085 - 11905: 0xF6DC, - 40086 - 11905: 0xF78B, - 40087 - 11905: 0xF78C, - 40088 - 11905: 0xF78D, - 40089 - 11905: 0xF78E, - 40090 - 11905: 0xF6DD, - 40091 - 11905: 0xF6DE, - 40092 - 11905: 0xCFCA, - 40093 - 11905: 0xF78F, - 40094 - 11905: 0xF6DF, - 40095 - 11905: 0xF6E0, - 40096 - 11905: 0xF6E1, - 40097 - 11905: 0xF6E2, - 40098 - 11905: 0xF6E3, - 40099 - 11905: 0xF6E4, - 40100 - 11905: 0xC0F0, - 40101 - 11905: 0xF6E5, - 40102 - 11905: 0xF6E6, - 40103 - 11905: 0xF6E7, - 40104 - 11905: 0xF6E8, - 40105 - 11905: 0xF6E9, - 40106 - 11905: 0xF790, - 40107 - 11905: 0xF6EA, - 40108 - 11905: 0xF791, - 40109 - 11905: 0xF6EB, - 40110 - 11905: 0xF6EC, - 40111 - 11905: 0xF792, - 40112 - 11905: 0xF6ED, - 40113 - 11905: 0xF6EE, - 40114 - 11905: 0xF6EF, - 40115 - 11905: 0xF6F0, - 40116 - 11905: 0xF6F1, - 40117 - 11905: 0xF6F2, - 40118 - 11905: 0xF6F3, - 40119 - 11905: 0xF6F4, - 40120 - 11905: 0xBEA8, - 40121 - 11905: 0xF793, - 40122 - 11905: 0xF6F5, - 40123 - 11905: 0xF6F6, - 40124 - 11905: 0xF6F7, - 40125 - 11905: 0xF6F8, - 40126 - 11905: 0xF794, - 40127 - 11905: 0xF795, - 40128 - 11905: 0xF796, - 40129 - 11905: 0xF797, - 40130 - 11905: 0xF798, - 40131 - 11905: 0xC8FA, - 40132 - 11905: 0xF6F9, - 40133 - 11905: 0xF6FA, - 40134 - 11905: 0xF6FB, - 40135 - 11905: 0xF6FC, - 40136 - 11905: 0xF799, - 40137 - 11905: 0xF79A, - 40138 - 11905: 0xF6FD, - 40139 - 11905: 0xF6FE, - 40140 - 11905: 0xF7A1, - 40141 - 11905: 0xF7A2, - 40142 - 11905: 0xF7A3, - 40143 - 11905: 0xF7A4, - 40144 - 11905: 0xF7A5, - 40145 - 11905: 0xF79B, - 40146 - 11905: 0xF79C, - 40147 - 11905: 0xF7A6, - 40148 - 11905: 0xF7A7, - 40149 - 11905: 0xF7A8, - 40150 - 11905: 0xB1EE, - 40151 - 11905: 0xF7A9, - 40152 - 11905: 0xF7AA, - 40153 - 11905: 0xF7AB, - 40154 - 11905: 0xF79D, - 40155 - 11905: 0xF79E, - 40156 - 11905: 0xF7AC, - 40157 - 11905: 0xF7AD, - 40158 - 11905: 0xC1DB, - 40159 - 11905: 0xF7AE, - 40160 - 11905: 0xF79F, - 40161 - 11905: 0xF7A0, - 40162 - 11905: 0xF7AF, - 40163 - 11905: 0xF840, - 40164 - 11905: 0xF841, - 40165 - 11905: 0xF842, - 40166 - 11905: 0xF843, - 40167 - 11905: 0xF844, - 40168 - 11905: 0xF845, - 40169 - 11905: 0xF846, - 40170 - 11905: 0xF847, - 40171 - 11905: 0xF848, - 40172 - 11905: 0xF849, - 40173 - 11905: 0xF84A, - 40174 - 11905: 0xF84B, - 40175 - 11905: 0xF84C, - 40176 - 11905: 0xF84D, - 40177 - 11905: 0xF84E, - 40178 - 11905: 0xF84F, - 40179 - 11905: 0xF850, - 40180 - 11905: 0xF851, - 40181 - 11905: 0xF852, - 40182 - 11905: 0xF853, - 40183 - 11905: 0xF854, - 40184 - 11905: 0xF855, - 40185 - 11905: 0xF856, - 40186 - 11905: 0xF857, - 40187 - 11905: 0xF858, - 40188 - 11905: 0xF859, - 40189 - 11905: 0xF85A, - 40190 - 11905: 0xF85B, - 40191 - 11905: 0xF85C, - 40192 - 11905: 0xF85D, - 40193 - 11905: 0xF85E, - 40194 - 11905: 0xF85F, - 40195 - 11905: 0xF860, - 40196 - 11905: 0xF861, - 40197 - 11905: 0xF862, - 40198 - 11905: 0xF863, - 40199 - 11905: 0xF864, - 40200 - 11905: 0xF865, - 40201 - 11905: 0xF866, - 40202 - 11905: 0xF867, - 40203 - 11905: 0xF868, - 40204 - 11905: 0xF869, - 40205 - 11905: 0xF86A, - 40206 - 11905: 0xF86B, - 40207 - 11905: 0xF86C, - 40208 - 11905: 0xF86D, - 40209 - 11905: 0xF86E, - 40210 - 11905: 0xF86F, - 40211 - 11905: 0xF870, - 40212 - 11905: 0xF871, - 40213 - 11905: 0xF872, - 40214 - 11905: 0xF873, - 40215 - 11905: 0xF874, - 40216 - 11905: 0xF875, - 40217 - 11905: 0xF876, - 40218 - 11905: 0xF877, - 40219 - 11905: 0xF878, - 40220 - 11905: 0xF879, - 40221 - 11905: 0xF87A, - 40222 - 11905: 0xF87B, - 40223 - 11905: 0xF87C, - 40224 - 11905: 0xF87D, - 40225 - 11905: 0xF87E, - 40226 - 11905: 0xF880, - 40227 - 11905: 0xF881, - 40228 - 11905: 0xF882, - 40229 - 11905: 0xF883, - 40230 - 11905: 0xF884, - 40231 - 11905: 0xF885, - 40232 - 11905: 0xF886, - 40233 - 11905: 0xF887, - 40234 - 11905: 0xF888, - 40235 - 11905: 0xF889, - 40236 - 11905: 0xF88A, - 40237 - 11905: 0xF88B, - 40238 - 11905: 0xF88C, - 40239 - 11905: 0xF88D, - 40240 - 11905: 0xF88E, - 40241 - 11905: 0xF88F, - 40242 - 11905: 0xF890, - 40243 - 11905: 0xF891, - 40244 - 11905: 0xF892, - 40245 - 11905: 0xF893, - 40246 - 11905: 0xF894, - 40247 - 11905: 0xF895, - 40248 - 11905: 0xF896, - 40249 - 11905: 0xF897, - 40250 - 11905: 0xF898, - 40251 - 11905: 0xF899, - 40252 - 11905: 0xF89A, - 40253 - 11905: 0xF89B, - 40254 - 11905: 0xF89C, - 40255 - 11905: 0xF89D, - 40256 - 11905: 0xF89E, - 40257 - 11905: 0xF89F, - 40258 - 11905: 0xF8A0, - 40259 - 11905: 0xF940, - 40260 - 11905: 0xF941, - 40261 - 11905: 0xF942, - 40262 - 11905: 0xF943, - 40263 - 11905: 0xF944, - 40264 - 11905: 0xF945, - 40265 - 11905: 0xF946, - 40266 - 11905: 0xF947, - 40267 - 11905: 0xF948, - 40268 - 11905: 0xF949, - 40269 - 11905: 0xF94A, - 40270 - 11905: 0xF94B, - 40271 - 11905: 0xF94C, - 40272 - 11905: 0xF94D, - 40273 - 11905: 0xF94E, - 40274 - 11905: 0xF94F, - 40275 - 11905: 0xF950, - 40276 - 11905: 0xF951, - 40277 - 11905: 0xF952, - 40278 - 11905: 0xF953, - 40279 - 11905: 0xF954, - 40280 - 11905: 0xF955, - 40281 - 11905: 0xF956, - 40282 - 11905: 0xF957, - 40283 - 11905: 0xF958, - 40284 - 11905: 0xF959, - 40285 - 11905: 0xF95A, - 40286 - 11905: 0xF95B, - 40287 - 11905: 0xF95C, - 40288 - 11905: 0xF95D, - 40289 - 11905: 0xF95E, - 40290 - 11905: 0xF95F, - 40291 - 11905: 0xF960, - 40292 - 11905: 0xF961, - 40293 - 11905: 0xF962, - 40294 - 11905: 0xF963, - 40295 - 11905: 0xF964, - 40296 - 11905: 0xF965, - 40297 - 11905: 0xF966, - 40298 - 11905: 0xF967, - 40299 - 11905: 0xF968, - 40300 - 11905: 0xF969, - 40301 - 11905: 0xF96A, - 40302 - 11905: 0xF96B, - 40303 - 11905: 0xF96C, - 40304 - 11905: 0xF96D, - 40305 - 11905: 0xF96E, - 40306 - 11905: 0xF96F, - 40307 - 11905: 0xF970, - 40308 - 11905: 0xF971, - 40309 - 11905: 0xF972, - 40310 - 11905: 0xF973, - 40311 - 11905: 0xF974, - 40312 - 11905: 0xF975, - 40313 - 11905: 0xF976, - 40314 - 11905: 0xF977, - 40315 - 11905: 0xF978, - 40316 - 11905: 0xF979, - 40317 - 11905: 0xF97A, - 40318 - 11905: 0xF97B, - 40319 - 11905: 0xF97C, - 40320 - 11905: 0xF97D, - 40321 - 11905: 0xF97E, - 40322 - 11905: 0xF980, - 40323 - 11905: 0xF981, - 40324 - 11905: 0xF982, - 40325 - 11905: 0xF983, - 40326 - 11905: 0xF984, - 40327 - 11905: 0xF985, - 40328 - 11905: 0xF986, - 40329 - 11905: 0xF987, - 40330 - 11905: 0xF988, - 40331 - 11905: 0xF989, - 40332 - 11905: 0xF98A, - 40333 - 11905: 0xF98B, - 40334 - 11905: 0xF98C, - 40335 - 11905: 0xF98D, - 40336 - 11905: 0xF98E, - 40337 - 11905: 0xF98F, - 40338 - 11905: 0xF990, - 40339 - 11905: 0xF991, - 40340 - 11905: 0xF992, - 40341 - 11905: 0xF993, - 40342 - 11905: 0xF994, - 40343 - 11905: 0xF995, - 40344 - 11905: 0xF996, - 40345 - 11905: 0xF997, - 40346 - 11905: 0xF998, - 40347 - 11905: 0xF999, - 40348 - 11905: 0xF99A, - 40349 - 11905: 0xF99B, - 40350 - 11905: 0xF99C, - 40351 - 11905: 0xF99D, - 40352 - 11905: 0xF99E, - 40353 - 11905: 0xF99F, - 40354 - 11905: 0xF9A0, - 40355 - 11905: 0xFA40, - 40356 - 11905: 0xFA41, - 40357 - 11905: 0xFA42, - 40358 - 11905: 0xFA43, - 40359 - 11905: 0xFA44, - 40360 - 11905: 0xFA45, - 40361 - 11905: 0xFA46, - 40362 - 11905: 0xFA47, - 40363 - 11905: 0xFA48, - 40364 - 11905: 0xFA49, - 40365 - 11905: 0xFA4A, - 40366 - 11905: 0xFA4B, - 40367 - 11905: 0xFA4C, - 40368 - 11905: 0xFA4D, - 40369 - 11905: 0xFA4E, - 40370 - 11905: 0xFA4F, - 40371 - 11905: 0xFA50, - 40372 - 11905: 0xFA51, - 40373 - 11905: 0xFA52, - 40374 - 11905: 0xFA53, - 40375 - 11905: 0xFA54, - 40376 - 11905: 0xFA55, - 40377 - 11905: 0xFA56, - 40378 - 11905: 0xFA57, - 40379 - 11905: 0xFA58, - 40380 - 11905: 0xFA59, - 40381 - 11905: 0xFA5A, - 40382 - 11905: 0xFA5B, - 40383 - 11905: 0xFA5C, - 40384 - 11905: 0xFA5D, - 40385 - 11905: 0xFA5E, - 40386 - 11905: 0xFA5F, - 40387 - 11905: 0xFA60, - 40388 - 11905: 0xFA61, - 40389 - 11905: 0xFA62, - 40390 - 11905: 0xFA63, - 40391 - 11905: 0xFA64, - 40392 - 11905: 0xFA65, - 40393 - 11905: 0xFA66, - 40394 - 11905: 0xFA67, - 40395 - 11905: 0xFA68, - 40396 - 11905: 0xFA69, - 40397 - 11905: 0xFA6A, - 40398 - 11905: 0xFA6B, - 40399 - 11905: 0xFA6C, - 40400 - 11905: 0xFA6D, - 40401 - 11905: 0xFA6E, - 40402 - 11905: 0xFA6F, - 40403 - 11905: 0xFA70, - 40404 - 11905: 0xFA71, - 40405 - 11905: 0xFA72, - 40406 - 11905: 0xFA73, - 40407 - 11905: 0xFA74, - 40408 - 11905: 0xFA75, - 40409 - 11905: 0xFA76, - 40410 - 11905: 0xFA77, - 40411 - 11905: 0xFA78, - 40412 - 11905: 0xFA79, - 40413 - 11905: 0xFA7A, - 40414 - 11905: 0xFA7B, - 40415 - 11905: 0xFA7C, - 40416 - 11905: 0xFA7D, - 40417 - 11905: 0xFA7E, - 40418 - 11905: 0xFA80, - 40419 - 11905: 0xFA81, - 40420 - 11905: 0xFA82, - 40421 - 11905: 0xFA83, - 40422 - 11905: 0xFA84, - 40423 - 11905: 0xFA85, - 40424 - 11905: 0xFA86, - 40425 - 11905: 0xFA87, - 40426 - 11905: 0xFA88, - 40427 - 11905: 0xFA89, - 40428 - 11905: 0xFA8A, - 40429 - 11905: 0xFA8B, - 40430 - 11905: 0xFA8C, - 40431 - 11905: 0xFA8D, - 40432 - 11905: 0xFA8E, - 40433 - 11905: 0xFA8F, - 40434 - 11905: 0xFA90, - 40435 - 11905: 0xFA91, - 40436 - 11905: 0xFA92, - 40437 - 11905: 0xFA93, - 40438 - 11905: 0xFA94, - 40439 - 11905: 0xFA95, - 40440 - 11905: 0xFA96, - 40441 - 11905: 0xFA97, - 40442 - 11905: 0xFA98, - 40443 - 11905: 0xFA99, - 40444 - 11905: 0xFA9A, - 40445 - 11905: 0xFA9B, - 40446 - 11905: 0xFA9C, - 40447 - 11905: 0xFA9D, - 40448 - 11905: 0xFA9E, - 40449 - 11905: 0xFA9F, - 40450 - 11905: 0xFAA0, - 40451 - 11905: 0xFB40, - 40452 - 11905: 0xFB41, - 40453 - 11905: 0xFB42, - 40454 - 11905: 0xFB43, - 40455 - 11905: 0xFB44, - 40456 - 11905: 0xFB45, - 40457 - 11905: 0xFB46, - 40458 - 11905: 0xFB47, - 40459 - 11905: 0xFB48, - 40460 - 11905: 0xFB49, - 40461 - 11905: 0xFB4A, - 40462 - 11905: 0xFB4B, - 40463 - 11905: 0xFB4C, - 40464 - 11905: 0xFB4D, - 40465 - 11905: 0xFB4E, - 40466 - 11905: 0xFB4F, - 40467 - 11905: 0xFB50, - 40468 - 11905: 0xFB51, - 40469 - 11905: 0xFB52, - 40470 - 11905: 0xFB53, - 40471 - 11905: 0xFB54, - 40472 - 11905: 0xFB55, - 40473 - 11905: 0xFB56, - 40474 - 11905: 0xFB57, - 40475 - 11905: 0xFB58, - 40476 - 11905: 0xFB59, - 40477 - 11905: 0xFB5A, - 40478 - 11905: 0xFB5B, - 40479 - 11905: 0xC4F1, - 40480 - 11905: 0xF0AF, - 40481 - 11905: 0xBCA6, - 40482 - 11905: 0xF0B0, - 40483 - 11905: 0xC3F9, - 40484 - 11905: 0xFB5C, - 40485 - 11905: 0xC5B8, - 40486 - 11905: 0xD1BB, - 40487 - 11905: 0xFB5D, - 40488 - 11905: 0xF0B1, - 40489 - 11905: 0xF0B2, - 40490 - 11905: 0xF0B3, - 40491 - 11905: 0xF0B4, - 40492 - 11905: 0xF0B5, - 40493 - 11905: 0xD1BC, - 40494 - 11905: 0xFB5E, - 40495 - 11905: 0xD1EC, - 40496 - 11905: 0xFB5F, - 40497 - 11905: 0xF0B7, - 40498 - 11905: 0xF0B6, - 40499 - 11905: 0xD4A7, - 40500 - 11905: 0xFB60, - 40501 - 11905: 0xCDD2, - 40502 - 11905: 0xF0B8, - 40503 - 11905: 0xF0BA, - 40504 - 11905: 0xF0B9, - 40505 - 11905: 0xF0BB, - 40506 - 11905: 0xF0BC, - 40507 - 11905: 0xFB61, - 40508 - 11905: 0xFB62, - 40509 - 11905: 0xB8EB, - 40510 - 11905: 0xF0BD, - 40511 - 11905: 0xBAE8, - 40512 - 11905: 0xFB63, - 40513 - 11905: 0xF0BE, - 40514 - 11905: 0xF0BF, - 40515 - 11905: 0xBEE9, - 40516 - 11905: 0xF0C0, - 40517 - 11905: 0xB6EC, - 40518 - 11905: 0xF0C1, - 40519 - 11905: 0xF0C2, - 40520 - 11905: 0xF0C3, - 40521 - 11905: 0xF0C4, - 40522 - 11905: 0xC8B5, - 40523 - 11905: 0xF0C5, - 40524 - 11905: 0xF0C6, - 40525 - 11905: 0xFB64, - 40526 - 11905: 0xF0C7, - 40527 - 11905: 0xC5F4, - 40528 - 11905: 0xFB65, - 40529 - 11905: 0xF0C8, - 40530 - 11905: 0xFB66, - 40531 - 11905: 0xFB67, - 40532 - 11905: 0xFB68, - 40533 - 11905: 0xF0C9, - 40534 - 11905: 0xFB69, - 40535 - 11905: 0xF0CA, - 40536 - 11905: 0xF7BD, - 40537 - 11905: 0xFB6A, - 40538 - 11905: 0xF0CB, - 40539 - 11905: 0xF0CC, - 40540 - 11905: 0xF0CD, - 40541 - 11905: 0xFB6B, - 40542 - 11905: 0xF0CE, - 40543 - 11905: 0xFB6C, - 40544 - 11905: 0xFB6D, - 40545 - 11905: 0xFB6E, - 40546 - 11905: 0xFB6F, - 40547 - 11905: 0xF0CF, - 40548 - 11905: 0xBAD7, - 40549 - 11905: 0xFB70, - 40550 - 11905: 0xF0D0, - 40551 - 11905: 0xF0D1, - 40552 - 11905: 0xF0D2, - 40553 - 11905: 0xF0D3, - 40554 - 11905: 0xF0D4, - 40555 - 11905: 0xF0D5, - 40556 - 11905: 0xF0D6, - 40557 - 11905: 0xF0D8, - 40558 - 11905: 0xFB71, - 40559 - 11905: 0xFB72, - 40560 - 11905: 0xD3A5, - 40561 - 11905: 0xF0D7, - 40562 - 11905: 0xFB73, - 40563 - 11905: 0xF0D9, - 40564 - 11905: 0xFB74, - 40565 - 11905: 0xFB75, - 40566 - 11905: 0xFB76, - 40567 - 11905: 0xFB77, - 40568 - 11905: 0xFB78, - 40569 - 11905: 0xFB79, - 40570 - 11905: 0xFB7A, - 40571 - 11905: 0xFB7B, - 40572 - 11905: 0xFB7C, - 40573 - 11905: 0xFB7D, - 40574 - 11905: 0xF5BA, - 40575 - 11905: 0xC2B9, - 40576 - 11905: 0xFB7E, - 40577 - 11905: 0xFB80, - 40578 - 11905: 0xF7E4, - 40579 - 11905: 0xFB81, - 40580 - 11905: 0xFB82, - 40581 - 11905: 0xFB83, - 40582 - 11905: 0xFB84, - 40583 - 11905: 0xF7E5, - 40584 - 11905: 0xF7E6, - 40585 - 11905: 0xFB85, - 40586 - 11905: 0xFB86, - 40587 - 11905: 0xF7E7, - 40588 - 11905: 0xFB87, - 40589 - 11905: 0xFB88, - 40590 - 11905: 0xFB89, - 40591 - 11905: 0xFB8A, - 40592 - 11905: 0xFB8B, - 40593 - 11905: 0xFB8C, - 40594 - 11905: 0xF7E8, - 40595 - 11905: 0xC2B4, - 40596 - 11905: 0xFB8D, - 40597 - 11905: 0xFB8E, - 40598 - 11905: 0xFB8F, - 40599 - 11905: 0xFB90, - 40600 - 11905: 0xFB91, - 40601 - 11905: 0xFB92, - 40602 - 11905: 0xFB93, - 40603 - 11905: 0xFB94, - 40604 - 11905: 0xFB95, - 40605 - 11905: 0xF7EA, - 40606 - 11905: 0xFB96, - 40607 - 11905: 0xF7EB, - 40608 - 11905: 0xFB97, - 40609 - 11905: 0xFB98, - 40610 - 11905: 0xFB99, - 40611 - 11905: 0xFB9A, - 40612 - 11905: 0xFB9B, - 40613 - 11905: 0xFB9C, - 40614 - 11905: 0xC2F3, - 40615 - 11905: 0xFB9D, - 40616 - 11905: 0xFB9E, - 40617 - 11905: 0xFB9F, - 40618 - 11905: 0xFBA0, - 40619 - 11905: 0xFC40, - 40620 - 11905: 0xFC41, - 40621 - 11905: 0xFC42, - 40622 - 11905: 0xFC43, - 40623 - 11905: 0xFC44, - 40624 - 11905: 0xFC45, - 40625 - 11905: 0xFC46, - 40626 - 11905: 0xFC47, - 40627 - 11905: 0xFC48, - 40628 - 11905: 0xF4F0, - 40629 - 11905: 0xFC49, - 40630 - 11905: 0xFC4A, - 40631 - 11905: 0xFC4B, - 40632 - 11905: 0xF4EF, - 40633 - 11905: 0xFC4C, - 40634 - 11905: 0xFC4D, - 40635 - 11905: 0xC2E9, - 40636 - 11905: 0xFC4E, - 40637 - 11905: 0xF7E1, - 40638 - 11905: 0xF7E2, - 40639 - 11905: 0xFC4F, - 40640 - 11905: 0xFC50, - 40641 - 11905: 0xFC51, - 40642 - 11905: 0xFC52, - 40643 - 11905: 0xFC53, - 40644 - 11905: 0xBBC6, - 40645 - 11905: 0xFC54, - 40646 - 11905: 0xFC55, - 40647 - 11905: 0xFC56, - 40648 - 11905: 0xFC57, - 40649 - 11905: 0xD9E4, - 40650 - 11905: 0xFC58, - 40651 - 11905: 0xFC59, - 40652 - 11905: 0xFC5A, - 40653 - 11905: 0xCAF2, - 40654 - 11905: 0xC0E8, - 40655 - 11905: 0xF0A4, - 40656 - 11905: 0xFC5B, - 40657 - 11905: 0xBADA, - 40658 - 11905: 0xFC5C, - 40659 - 11905: 0xFC5D, - 40660 - 11905: 0xC7AD, - 40661 - 11905: 0xFC5E, - 40662 - 11905: 0xFC5F, - 40663 - 11905: 0xFC60, - 40664 - 11905: 0xC4AC, - 40665 - 11905: 0xFC61, - 40666 - 11905: 0xFC62, - 40667 - 11905: 0xF7EC, - 40668 - 11905: 0xF7ED, - 40669 - 11905: 0xF7EE, - 40670 - 11905: 0xFC63, - 40671 - 11905: 0xF7F0, - 40672 - 11905: 0xF7EF, - 40673 - 11905: 0xFC64, - 40674 - 11905: 0xF7F1, - 40675 - 11905: 0xFC65, - 40676 - 11905: 0xFC66, - 40677 - 11905: 0xF7F4, - 40678 - 11905: 0xFC67, - 40679 - 11905: 0xF7F3, - 40680 - 11905: 0xFC68, - 40681 - 11905: 0xF7F2, - 40682 - 11905: 0xF7F5, - 40683 - 11905: 0xFC69, - 40684 - 11905: 0xFC6A, - 40685 - 11905: 0xFC6B, - 40686 - 11905: 0xFC6C, - 40687 - 11905: 0xF7F6, - 40688 - 11905: 0xFC6D, - 40689 - 11905: 0xFC6E, - 40690 - 11905: 0xFC6F, - 40691 - 11905: 0xFC70, - 40692 - 11905: 0xFC71, - 40693 - 11905: 0xFC72, - 40694 - 11905: 0xFC73, - 40695 - 11905: 0xFC74, - 40696 - 11905: 0xFC75, - 40697 - 11905: 0xEDE9, - 40698 - 11905: 0xFC76, - 40699 - 11905: 0xEDEA, - 40700 - 11905: 0xEDEB, - 40701 - 11905: 0xFC77, - 40702 - 11905: 0xF6BC, - 40703 - 11905: 0xFC78, - 40704 - 11905: 0xFC79, - 40705 - 11905: 0xFC7A, - 40706 - 11905: 0xFC7B, - 40707 - 11905: 0xFC7C, - 40708 - 11905: 0xFC7D, - 40709 - 11905: 0xFC7E, - 40710 - 11905: 0xFC80, - 40711 - 11905: 0xFC81, - 40712 - 11905: 0xFC82, - 40713 - 11905: 0xFC83, - 40714 - 11905: 0xFC84, - 40715 - 11905: 0xF6BD, - 40716 - 11905: 0xFC85, - 40717 - 11905: 0xF6BE, - 40718 - 11905: 0xB6A6, - 40719 - 11905: 0xFC86, - 40720 - 11905: 0xD8BE, - 40721 - 11905: 0xFC87, - 40722 - 11905: 0xFC88, - 40723 - 11905: 0xB9C4, - 40724 - 11905: 0xFC89, - 40725 - 11905: 0xFC8A, - 40726 - 11905: 0xFC8B, - 40727 - 11905: 0xD8BB, - 40728 - 11905: 0xFC8C, - 40729 - 11905: 0xDCB1, - 40730 - 11905: 0xFC8D, - 40731 - 11905: 0xFC8E, - 40732 - 11905: 0xFC8F, - 40733 - 11905: 0xFC90, - 40734 - 11905: 0xFC91, - 40735 - 11905: 0xFC92, - 40736 - 11905: 0xCAF3, - 40737 - 11905: 0xFC93, - 40738 - 11905: 0xF7F7, - 40739 - 11905: 0xFC94, - 40740 - 11905: 0xFC95, - 40741 - 11905: 0xFC96, - 40742 - 11905: 0xFC97, - 40743 - 11905: 0xFC98, - 40744 - 11905: 0xFC99, - 40745 - 11905: 0xFC9A, - 40746 - 11905: 0xFC9B, - 40747 - 11905: 0xFC9C, - 40748 - 11905: 0xF7F8, - 40749 - 11905: 0xFC9D, - 40750 - 11905: 0xFC9E, - 40751 - 11905: 0xF7F9, - 40752 - 11905: 0xFC9F, - 40753 - 11905: 0xFCA0, - 40754 - 11905: 0xFD40, - 40755 - 11905: 0xFD41, - 40756 - 11905: 0xFD42, - 40757 - 11905: 0xFD43, - 40758 - 11905: 0xFD44, - 40759 - 11905: 0xF7FB, - 40760 - 11905: 0xFD45, - 40761 - 11905: 0xF7FA, - 40762 - 11905: 0xFD46, - 40763 - 11905: 0xB1C7, - 40764 - 11905: 0xFD47, - 40765 - 11905: 0xF7FC, - 40766 - 11905: 0xF7FD, - 40767 - 11905: 0xFD48, - 40768 - 11905: 0xFD49, - 40769 - 11905: 0xFD4A, - 40770 - 11905: 0xFD4B, - 40771 - 11905: 0xFD4C, - 40772 - 11905: 0xF7FE, - 40773 - 11905: 0xFD4D, - 40774 - 11905: 0xFD4E, - 40775 - 11905: 0xFD4F, - 40776 - 11905: 0xFD50, - 40777 - 11905: 0xFD51, - 40778 - 11905: 0xFD52, - 40779 - 11905: 0xFD53, - 40780 - 11905: 0xFD54, - 40781 - 11905: 0xFD55, - 40782 - 11905: 0xFD56, - 40783 - 11905: 0xFD57, - 40784 - 11905: 0xC6EB, - 40785 - 11905: 0xECB4, - 40786 - 11905: 0xFD58, - 40787 - 11905: 0xFD59, - 40788 - 11905: 0xFD5A, - 40789 - 11905: 0xFD5B, - 40790 - 11905: 0xFD5C, - 40791 - 11905: 0xFD5D, - 40792 - 11905: 0xFD5E, - 40793 - 11905: 0xFD5F, - 40794 - 11905: 0xFD60, - 40795 - 11905: 0xFD61, - 40796 - 11905: 0xFD62, - 40797 - 11905: 0xFD63, - 40798 - 11905: 0xFD64, - 40799 - 11905: 0xFD65, - 40800 - 11905: 0xFD66, - 40801 - 11905: 0xFD67, - 40802 - 11905: 0xFD68, - 40803 - 11905: 0xFD69, - 40804 - 11905: 0xFD6A, - 40805 - 11905: 0xFD6B, - 40806 - 11905: 0xFD6C, - 40807 - 11905: 0xFD6D, - 40808 - 11905: 0xFD6E, - 40809 - 11905: 0xFD6F, - 40810 - 11905: 0xFD70, - 40811 - 11905: 0xFD71, - 40812 - 11905: 0xFD72, - 40813 - 11905: 0xFD73, - 40814 - 11905: 0xFD74, - 40815 - 11905: 0xFD75, - 40816 - 11905: 0xFD76, - 40817 - 11905: 0xFD77, - 40818 - 11905: 0xFD78, - 40819 - 11905: 0xFD79, - 40820 - 11905: 0xFD7A, - 40821 - 11905: 0xFD7B, - 40822 - 11905: 0xFD7C, - 40823 - 11905: 0xFD7D, - 40824 - 11905: 0xFD7E, - 40825 - 11905: 0xFD80, - 40826 - 11905: 0xFD81, - 40827 - 11905: 0xFD82, - 40828 - 11905: 0xFD83, - 40829 - 11905: 0xFD84, - 40830 - 11905: 0xFD85, - 40831 - 11905: 0xB3DD, - 40832 - 11905: 0xF6B3, - 40833 - 11905: 0xFD86, - 40834 - 11905: 0xFD87, - 40835 - 11905: 0xF6B4, - 40836 - 11905: 0xC1E4, - 40837 - 11905: 0xF6B5, - 40838 - 11905: 0xF6B6, - 40839 - 11905: 0xF6B7, - 40840 - 11905: 0xF6B8, - 40841 - 11905: 0xF6B9, - 40842 - 11905: 0xF6BA, - 40843 - 11905: 0xC8A3, - 40844 - 11905: 0xF6BB, - 40845 - 11905: 0xFD88, - 40846 - 11905: 0xFD89, - 40847 - 11905: 0xFD8A, - 40848 - 11905: 0xFD8B, - 40849 - 11905: 0xFD8C, - 40850 - 11905: 0xFD8D, - 40851 - 11905: 0xFD8E, - 40852 - 11905: 0xFD8F, - 40853 - 11905: 0xFD90, - 40854 - 11905: 0xFD91, - 40855 - 11905: 0xFD92, - 40856 - 11905: 0xFD93, - 40857 - 11905: 0xC1FA, - 40858 - 11905: 0xB9A8, - 40859 - 11905: 0xEDE8, - 40860 - 11905: 0xFD94, - 40861 - 11905: 0xFD95, - 40862 - 11905: 0xFD96, - 40863 - 11905: 0xB9EA, - 40864 - 11905: 0xD9DF, - 40865 - 11905: 0xFD97, - 40866 - 11905: 0xFD98, - 40867 - 11905: 0xFD99, - 40868 - 11905: 0xFD9A, - 40869 - 11905: 0xFD9B, -} - -const encode1Low, encode1High = 8208, 9795 - -var encode1 = [...]uint16{ - 8208 - 8208: 0xA95C, - 8211 - 8208: 0xA843, - 8212 - 8208: 0xA1AA, - 8213 - 8208: 0xA844, - 8214 - 8208: 0xA1AC, - 8216 - 8208: 0xA1AE, - 8217 - 8208: 0xA1AF, - 8220 - 8208: 0xA1B0, - 8221 - 8208: 0xA1B1, - 8229 - 8208: 0xA845, - 8230 - 8208: 0xA1AD, - 8240 - 8208: 0xA1EB, - 8242 - 8208: 0xA1E4, - 8243 - 8208: 0xA1E5, - 8245 - 8208: 0xA846, - 8251 - 8208: 0xA1F9, - 8364 - 8208: 0xA2E3, - 8451 - 8208: 0xA1E6, - 8453 - 8208: 0xA847, - 8457 - 8208: 0xA848, - 8470 - 8208: 0xA1ED, - 8481 - 8208: 0xA959, - 8544 - 8208: 0xA2F1, - 8545 - 8208: 0xA2F2, - 8546 - 8208: 0xA2F3, - 8547 - 8208: 0xA2F4, - 8548 - 8208: 0xA2F5, - 8549 - 8208: 0xA2F6, - 8550 - 8208: 0xA2F7, - 8551 - 8208: 0xA2F8, - 8552 - 8208: 0xA2F9, - 8553 - 8208: 0xA2FA, - 8554 - 8208: 0xA2FB, - 8555 - 8208: 0xA2FC, - 8560 - 8208: 0xA2A1, - 8561 - 8208: 0xA2A2, - 8562 - 8208: 0xA2A3, - 8563 - 8208: 0xA2A4, - 8564 - 8208: 0xA2A5, - 8565 - 8208: 0xA2A6, - 8566 - 8208: 0xA2A7, - 8567 - 8208: 0xA2A8, - 8568 - 8208: 0xA2A9, - 8569 - 8208: 0xA2AA, - 8592 - 8208: 0xA1FB, - 8593 - 8208: 0xA1FC, - 8594 - 8208: 0xA1FA, - 8595 - 8208: 0xA1FD, - 8598 - 8208: 0xA849, - 8599 - 8208: 0xA84A, - 8600 - 8208: 0xA84B, - 8601 - 8208: 0xA84C, - 8712 - 8208: 0xA1CA, - 8719 - 8208: 0xA1C7, - 8721 - 8208: 0xA1C6, - 8725 - 8208: 0xA84D, - 8730 - 8208: 0xA1CC, - 8733 - 8208: 0xA1D8, - 8734 - 8208: 0xA1DE, - 8735 - 8208: 0xA84E, - 8736 - 8208: 0xA1CF, - 8739 - 8208: 0xA84F, - 8741 - 8208: 0xA1CE, - 8743 - 8208: 0xA1C4, - 8744 - 8208: 0xA1C5, - 8745 - 8208: 0xA1C9, - 8746 - 8208: 0xA1C8, - 8747 - 8208: 0xA1D2, - 8750 - 8208: 0xA1D3, - 8756 - 8208: 0xA1E0, - 8757 - 8208: 0xA1DF, - 8758 - 8208: 0xA1C3, - 8759 - 8208: 0xA1CB, - 8765 - 8208: 0xA1D7, - 8776 - 8208: 0xA1D6, - 8780 - 8208: 0xA1D5, - 8786 - 8208: 0xA850, - 8800 - 8208: 0xA1D9, - 8801 - 8208: 0xA1D4, - 8804 - 8208: 0xA1DC, - 8805 - 8208: 0xA1DD, - 8806 - 8208: 0xA851, - 8807 - 8208: 0xA852, - 8814 - 8208: 0xA1DA, - 8815 - 8208: 0xA1DB, - 8853 - 8208: 0xA892, - 8857 - 8208: 0xA1D1, - 8869 - 8208: 0xA1CD, - 8895 - 8208: 0xA853, - 8978 - 8208: 0xA1D0, - 9312 - 8208: 0xA2D9, - 9313 - 8208: 0xA2DA, - 9314 - 8208: 0xA2DB, - 9315 - 8208: 0xA2DC, - 9316 - 8208: 0xA2DD, - 9317 - 8208: 0xA2DE, - 9318 - 8208: 0xA2DF, - 9319 - 8208: 0xA2E0, - 9320 - 8208: 0xA2E1, - 9321 - 8208: 0xA2E2, - 9332 - 8208: 0xA2C5, - 9333 - 8208: 0xA2C6, - 9334 - 8208: 0xA2C7, - 9335 - 8208: 0xA2C8, - 9336 - 8208: 0xA2C9, - 9337 - 8208: 0xA2CA, - 9338 - 8208: 0xA2CB, - 9339 - 8208: 0xA2CC, - 9340 - 8208: 0xA2CD, - 9341 - 8208: 0xA2CE, - 9342 - 8208: 0xA2CF, - 9343 - 8208: 0xA2D0, - 9344 - 8208: 0xA2D1, - 9345 - 8208: 0xA2D2, - 9346 - 8208: 0xA2D3, - 9347 - 8208: 0xA2D4, - 9348 - 8208: 0xA2D5, - 9349 - 8208: 0xA2D6, - 9350 - 8208: 0xA2D7, - 9351 - 8208: 0xA2D8, - 9352 - 8208: 0xA2B1, - 9353 - 8208: 0xA2B2, - 9354 - 8208: 0xA2B3, - 9355 - 8208: 0xA2B4, - 9356 - 8208: 0xA2B5, - 9357 - 8208: 0xA2B6, - 9358 - 8208: 0xA2B7, - 9359 - 8208: 0xA2B8, - 9360 - 8208: 0xA2B9, - 9361 - 8208: 0xA2BA, - 9362 - 8208: 0xA2BB, - 9363 - 8208: 0xA2BC, - 9364 - 8208: 0xA2BD, - 9365 - 8208: 0xA2BE, - 9366 - 8208: 0xA2BF, - 9367 - 8208: 0xA2C0, - 9368 - 8208: 0xA2C1, - 9369 - 8208: 0xA2C2, - 9370 - 8208: 0xA2C3, - 9371 - 8208: 0xA2C4, - 9472 - 8208: 0xA9A4, - 9473 - 8208: 0xA9A5, - 9474 - 8208: 0xA9A6, - 9475 - 8208: 0xA9A7, - 9476 - 8208: 0xA9A8, - 9477 - 8208: 0xA9A9, - 9478 - 8208: 0xA9AA, - 9479 - 8208: 0xA9AB, - 9480 - 8208: 0xA9AC, - 9481 - 8208: 0xA9AD, - 9482 - 8208: 0xA9AE, - 9483 - 8208: 0xA9AF, - 9484 - 8208: 0xA9B0, - 9485 - 8208: 0xA9B1, - 9486 - 8208: 0xA9B2, - 9487 - 8208: 0xA9B3, - 9488 - 8208: 0xA9B4, - 9489 - 8208: 0xA9B5, - 9490 - 8208: 0xA9B6, - 9491 - 8208: 0xA9B7, - 9492 - 8208: 0xA9B8, - 9493 - 8208: 0xA9B9, - 9494 - 8208: 0xA9BA, - 9495 - 8208: 0xA9BB, - 9496 - 8208: 0xA9BC, - 9497 - 8208: 0xA9BD, - 9498 - 8208: 0xA9BE, - 9499 - 8208: 0xA9BF, - 9500 - 8208: 0xA9C0, - 9501 - 8208: 0xA9C1, - 9502 - 8208: 0xA9C2, - 9503 - 8208: 0xA9C3, - 9504 - 8208: 0xA9C4, - 9505 - 8208: 0xA9C5, - 9506 - 8208: 0xA9C6, - 9507 - 8208: 0xA9C7, - 9508 - 8208: 0xA9C8, - 9509 - 8208: 0xA9C9, - 9510 - 8208: 0xA9CA, - 9511 - 8208: 0xA9CB, - 9512 - 8208: 0xA9CC, - 9513 - 8208: 0xA9CD, - 9514 - 8208: 0xA9CE, - 9515 - 8208: 0xA9CF, - 9516 - 8208: 0xA9D0, - 9517 - 8208: 0xA9D1, - 9518 - 8208: 0xA9D2, - 9519 - 8208: 0xA9D3, - 9520 - 8208: 0xA9D4, - 9521 - 8208: 0xA9D5, - 9522 - 8208: 0xA9D6, - 9523 - 8208: 0xA9D7, - 9524 - 8208: 0xA9D8, - 9525 - 8208: 0xA9D9, - 9526 - 8208: 0xA9DA, - 9527 - 8208: 0xA9DB, - 9528 - 8208: 0xA9DC, - 9529 - 8208: 0xA9DD, - 9530 - 8208: 0xA9DE, - 9531 - 8208: 0xA9DF, - 9532 - 8208: 0xA9E0, - 9533 - 8208: 0xA9E1, - 9534 - 8208: 0xA9E2, - 9535 - 8208: 0xA9E3, - 9536 - 8208: 0xA9E4, - 9537 - 8208: 0xA9E5, - 9538 - 8208: 0xA9E6, - 9539 - 8208: 0xA9E7, - 9540 - 8208: 0xA9E8, - 9541 - 8208: 0xA9E9, - 9542 - 8208: 0xA9EA, - 9543 - 8208: 0xA9EB, - 9544 - 8208: 0xA9EC, - 9545 - 8208: 0xA9ED, - 9546 - 8208: 0xA9EE, - 9547 - 8208: 0xA9EF, - 9552 - 8208: 0xA854, - 9553 - 8208: 0xA855, - 9554 - 8208: 0xA856, - 9555 - 8208: 0xA857, - 9556 - 8208: 0xA858, - 9557 - 8208: 0xA859, - 9558 - 8208: 0xA85A, - 9559 - 8208: 0xA85B, - 9560 - 8208: 0xA85C, - 9561 - 8208: 0xA85D, - 9562 - 8208: 0xA85E, - 9563 - 8208: 0xA85F, - 9564 - 8208: 0xA860, - 9565 - 8208: 0xA861, - 9566 - 8208: 0xA862, - 9567 - 8208: 0xA863, - 9568 - 8208: 0xA864, - 9569 - 8208: 0xA865, - 9570 - 8208: 0xA866, - 9571 - 8208: 0xA867, - 9572 - 8208: 0xA868, - 9573 - 8208: 0xA869, - 9574 - 8208: 0xA86A, - 9575 - 8208: 0xA86B, - 9576 - 8208: 0xA86C, - 9577 - 8208: 0xA86D, - 9578 - 8208: 0xA86E, - 9579 - 8208: 0xA86F, - 9580 - 8208: 0xA870, - 9581 - 8208: 0xA871, - 9582 - 8208: 0xA872, - 9583 - 8208: 0xA873, - 9584 - 8208: 0xA874, - 9585 - 8208: 0xA875, - 9586 - 8208: 0xA876, - 9587 - 8208: 0xA877, - 9601 - 8208: 0xA878, - 9602 - 8208: 0xA879, - 9603 - 8208: 0xA87A, - 9604 - 8208: 0xA87B, - 9605 - 8208: 0xA87C, - 9606 - 8208: 0xA87D, - 9607 - 8208: 0xA87E, - 9608 - 8208: 0xA880, - 9609 - 8208: 0xA881, - 9610 - 8208: 0xA882, - 9611 - 8208: 0xA883, - 9612 - 8208: 0xA884, - 9613 - 8208: 0xA885, - 9614 - 8208: 0xA886, - 9615 - 8208: 0xA887, - 9619 - 8208: 0xA888, - 9620 - 8208: 0xA889, - 9621 - 8208: 0xA88A, - 9632 - 8208: 0xA1F6, - 9633 - 8208: 0xA1F5, - 9650 - 8208: 0xA1F8, - 9651 - 8208: 0xA1F7, - 9660 - 8208: 0xA88B, - 9661 - 8208: 0xA88C, - 9670 - 8208: 0xA1F4, - 9671 - 8208: 0xA1F3, - 9675 - 8208: 0xA1F0, - 9678 - 8208: 0xA1F2, - 9679 - 8208: 0xA1F1, - 9698 - 8208: 0xA88D, - 9699 - 8208: 0xA88E, - 9700 - 8208: 0xA88F, - 9701 - 8208: 0xA890, - 9733 - 8208: 0xA1EF, - 9734 - 8208: 0xA1EE, - 9737 - 8208: 0xA891, - 9792 - 8208: 0xA1E2, - 9794 - 8208: 0xA1E1, -} - -const encode2Low, encode2High = 164, 1106 - -var encode2 = [...]uint16{ - 164 - 164: 0xA1E8, - 167 - 164: 0xA1EC, - 168 - 164: 0xA1A7, - 176 - 164: 0xA1E3, - 177 - 164: 0xA1C0, - 183 - 164: 0xA1A4, - 215 - 164: 0xA1C1, - 224 - 164: 0xA8A4, - 225 - 164: 0xA8A2, - 232 - 164: 0xA8A8, - 233 - 164: 0xA8A6, - 234 - 164: 0xA8BA, - 236 - 164: 0xA8AC, - 237 - 164: 0xA8AA, - 242 - 164: 0xA8B0, - 243 - 164: 0xA8AE, - 247 - 164: 0xA1C2, - 249 - 164: 0xA8B4, - 250 - 164: 0xA8B2, - 252 - 164: 0xA8B9, - 257 - 164: 0xA8A1, - 275 - 164: 0xA8A5, - 283 - 164: 0xA8A7, - 299 - 164: 0xA8A9, - 324 - 164: 0xA8BD, - 328 - 164: 0xA8BE, - 333 - 164: 0xA8AD, - 363 - 164: 0xA8B1, - 462 - 164: 0xA8A3, - 464 - 164: 0xA8AB, - 466 - 164: 0xA8AF, - 468 - 164: 0xA8B3, - 470 - 164: 0xA8B5, - 472 - 164: 0xA8B6, - 474 - 164: 0xA8B7, - 476 - 164: 0xA8B8, - 505 - 164: 0xA8BF, - 593 - 164: 0xA8BB, - 609 - 164: 0xA8C0, - 711 - 164: 0xA1A6, - 713 - 164: 0xA1A5, - 714 - 164: 0xA840, - 715 - 164: 0xA841, - 729 - 164: 0xA842, - 913 - 164: 0xA6A1, - 914 - 164: 0xA6A2, - 915 - 164: 0xA6A3, - 916 - 164: 0xA6A4, - 917 - 164: 0xA6A5, - 918 - 164: 0xA6A6, - 919 - 164: 0xA6A7, - 920 - 164: 0xA6A8, - 921 - 164: 0xA6A9, - 922 - 164: 0xA6AA, - 923 - 164: 0xA6AB, - 924 - 164: 0xA6AC, - 925 - 164: 0xA6AD, - 926 - 164: 0xA6AE, - 927 - 164: 0xA6AF, - 928 - 164: 0xA6B0, - 929 - 164: 0xA6B1, - 931 - 164: 0xA6B2, - 932 - 164: 0xA6B3, - 933 - 164: 0xA6B4, - 934 - 164: 0xA6B5, - 935 - 164: 0xA6B6, - 936 - 164: 0xA6B7, - 937 - 164: 0xA6B8, - 945 - 164: 0xA6C1, - 946 - 164: 0xA6C2, - 947 - 164: 0xA6C3, - 948 - 164: 0xA6C4, - 949 - 164: 0xA6C5, - 950 - 164: 0xA6C6, - 951 - 164: 0xA6C7, - 952 - 164: 0xA6C8, - 953 - 164: 0xA6C9, - 954 - 164: 0xA6CA, - 955 - 164: 0xA6CB, - 956 - 164: 0xA6CC, - 957 - 164: 0xA6CD, - 958 - 164: 0xA6CE, - 959 - 164: 0xA6CF, - 960 - 164: 0xA6D0, - 961 - 164: 0xA6D1, - 963 - 164: 0xA6D2, - 964 - 164: 0xA6D3, - 965 - 164: 0xA6D4, - 966 - 164: 0xA6D5, - 967 - 164: 0xA6D6, - 968 - 164: 0xA6D7, - 969 - 164: 0xA6D8, - 1025 - 164: 0xA7A7, - 1040 - 164: 0xA7A1, - 1041 - 164: 0xA7A2, - 1042 - 164: 0xA7A3, - 1043 - 164: 0xA7A4, - 1044 - 164: 0xA7A5, - 1045 - 164: 0xA7A6, - 1046 - 164: 0xA7A8, - 1047 - 164: 0xA7A9, - 1048 - 164: 0xA7AA, - 1049 - 164: 0xA7AB, - 1050 - 164: 0xA7AC, - 1051 - 164: 0xA7AD, - 1052 - 164: 0xA7AE, - 1053 - 164: 0xA7AF, - 1054 - 164: 0xA7B0, - 1055 - 164: 0xA7B1, - 1056 - 164: 0xA7B2, - 1057 - 164: 0xA7B3, - 1058 - 164: 0xA7B4, - 1059 - 164: 0xA7B5, - 1060 - 164: 0xA7B6, - 1061 - 164: 0xA7B7, - 1062 - 164: 0xA7B8, - 1063 - 164: 0xA7B9, - 1064 - 164: 0xA7BA, - 1065 - 164: 0xA7BB, - 1066 - 164: 0xA7BC, - 1067 - 164: 0xA7BD, - 1068 - 164: 0xA7BE, - 1069 - 164: 0xA7BF, - 1070 - 164: 0xA7C0, - 1071 - 164: 0xA7C1, - 1072 - 164: 0xA7D1, - 1073 - 164: 0xA7D2, - 1074 - 164: 0xA7D3, - 1075 - 164: 0xA7D4, - 1076 - 164: 0xA7D5, - 1077 - 164: 0xA7D6, - 1078 - 164: 0xA7D8, - 1079 - 164: 0xA7D9, - 1080 - 164: 0xA7DA, - 1081 - 164: 0xA7DB, - 1082 - 164: 0xA7DC, - 1083 - 164: 0xA7DD, - 1084 - 164: 0xA7DE, - 1085 - 164: 0xA7DF, - 1086 - 164: 0xA7E0, - 1087 - 164: 0xA7E1, - 1088 - 164: 0xA7E2, - 1089 - 164: 0xA7E3, - 1090 - 164: 0xA7E4, - 1091 - 164: 0xA7E5, - 1092 - 164: 0xA7E6, - 1093 - 164: 0xA7E7, - 1094 - 164: 0xA7E8, - 1095 - 164: 0xA7E9, - 1096 - 164: 0xA7EA, - 1097 - 164: 0xA7EB, - 1098 - 164: 0xA7EC, - 1099 - 164: 0xA7ED, - 1100 - 164: 0xA7EE, - 1101 - 164: 0xA7EF, - 1102 - 164: 0xA7F0, - 1103 - 164: 0xA7F1, - 1105 - 164: 0xA7D7, -} - -const encode3Low, encode3High = 65072, 65510 - -var encode3 = [...]uint16{ - 65072 - 65072: 0xA955, - 65073 - 65072: 0xA6F2, - 65075 - 65072: 0xA6F4, - 65076 - 65072: 0xA6F5, - 65077 - 65072: 0xA6E0, - 65078 - 65072: 0xA6E1, - 65079 - 65072: 0xA6F0, - 65080 - 65072: 0xA6F1, - 65081 - 65072: 0xA6E2, - 65082 - 65072: 0xA6E3, - 65083 - 65072: 0xA6EE, - 65084 - 65072: 0xA6EF, - 65085 - 65072: 0xA6E6, - 65086 - 65072: 0xA6E7, - 65087 - 65072: 0xA6E4, - 65088 - 65072: 0xA6E5, - 65089 - 65072: 0xA6E8, - 65090 - 65072: 0xA6E9, - 65091 - 65072: 0xA6EA, - 65092 - 65072: 0xA6EB, - 65097 - 65072: 0xA968, - 65098 - 65072: 0xA969, - 65099 - 65072: 0xA96A, - 65100 - 65072: 0xA96B, - 65101 - 65072: 0xA96C, - 65102 - 65072: 0xA96D, - 65103 - 65072: 0xA96E, - 65104 - 65072: 0xA96F, - 65105 - 65072: 0xA970, - 65106 - 65072: 0xA971, - 65108 - 65072: 0xA972, - 65109 - 65072: 0xA973, - 65110 - 65072: 0xA974, - 65111 - 65072: 0xA975, - 65113 - 65072: 0xA976, - 65114 - 65072: 0xA977, - 65115 - 65072: 0xA978, - 65116 - 65072: 0xA979, - 65117 - 65072: 0xA97A, - 65118 - 65072: 0xA97B, - 65119 - 65072: 0xA97C, - 65120 - 65072: 0xA97D, - 65121 - 65072: 0xA97E, - 65122 - 65072: 0xA980, - 65123 - 65072: 0xA981, - 65124 - 65072: 0xA982, - 65125 - 65072: 0xA983, - 65126 - 65072: 0xA984, - 65128 - 65072: 0xA985, - 65129 - 65072: 0xA986, - 65130 - 65072: 0xA987, - 65131 - 65072: 0xA988, - 65281 - 65072: 0xA3A1, - 65282 - 65072: 0xA3A2, - 65283 - 65072: 0xA3A3, - 65284 - 65072: 0xA1E7, - 65285 - 65072: 0xA3A5, - 65286 - 65072: 0xA3A6, - 65287 - 65072: 0xA3A7, - 65288 - 65072: 0xA3A8, - 65289 - 65072: 0xA3A9, - 65290 - 65072: 0xA3AA, - 65291 - 65072: 0xA3AB, - 65292 - 65072: 0xA3AC, - 65293 - 65072: 0xA3AD, - 65294 - 65072: 0xA3AE, - 65295 - 65072: 0xA3AF, - 65296 - 65072: 0xA3B0, - 65297 - 65072: 0xA3B1, - 65298 - 65072: 0xA3B2, - 65299 - 65072: 0xA3B3, - 65300 - 65072: 0xA3B4, - 65301 - 65072: 0xA3B5, - 65302 - 65072: 0xA3B6, - 65303 - 65072: 0xA3B7, - 65304 - 65072: 0xA3B8, - 65305 - 65072: 0xA3B9, - 65306 - 65072: 0xA3BA, - 65307 - 65072: 0xA3BB, - 65308 - 65072: 0xA3BC, - 65309 - 65072: 0xA3BD, - 65310 - 65072: 0xA3BE, - 65311 - 65072: 0xA3BF, - 65312 - 65072: 0xA3C0, - 65313 - 65072: 0xA3C1, - 65314 - 65072: 0xA3C2, - 65315 - 65072: 0xA3C3, - 65316 - 65072: 0xA3C4, - 65317 - 65072: 0xA3C5, - 65318 - 65072: 0xA3C6, - 65319 - 65072: 0xA3C7, - 65320 - 65072: 0xA3C8, - 65321 - 65072: 0xA3C9, - 65322 - 65072: 0xA3CA, - 65323 - 65072: 0xA3CB, - 65324 - 65072: 0xA3CC, - 65325 - 65072: 0xA3CD, - 65326 - 65072: 0xA3CE, - 65327 - 65072: 0xA3CF, - 65328 - 65072: 0xA3D0, - 65329 - 65072: 0xA3D1, - 65330 - 65072: 0xA3D2, - 65331 - 65072: 0xA3D3, - 65332 - 65072: 0xA3D4, - 65333 - 65072: 0xA3D5, - 65334 - 65072: 0xA3D6, - 65335 - 65072: 0xA3D7, - 65336 - 65072: 0xA3D8, - 65337 - 65072: 0xA3D9, - 65338 - 65072: 0xA3DA, - 65339 - 65072: 0xA3DB, - 65340 - 65072: 0xA3DC, - 65341 - 65072: 0xA3DD, - 65342 - 65072: 0xA3DE, - 65343 - 65072: 0xA3DF, - 65344 - 65072: 0xA3E0, - 65345 - 65072: 0xA3E1, - 65346 - 65072: 0xA3E2, - 65347 - 65072: 0xA3E3, - 65348 - 65072: 0xA3E4, - 65349 - 65072: 0xA3E5, - 65350 - 65072: 0xA3E6, - 65351 - 65072: 0xA3E7, - 65352 - 65072: 0xA3E8, - 65353 - 65072: 0xA3E9, - 65354 - 65072: 0xA3EA, - 65355 - 65072: 0xA3EB, - 65356 - 65072: 0xA3EC, - 65357 - 65072: 0xA3ED, - 65358 - 65072: 0xA3EE, - 65359 - 65072: 0xA3EF, - 65360 - 65072: 0xA3F0, - 65361 - 65072: 0xA3F1, - 65362 - 65072: 0xA3F2, - 65363 - 65072: 0xA3F3, - 65364 - 65072: 0xA3F4, - 65365 - 65072: 0xA3F5, - 65366 - 65072: 0xA3F6, - 65367 - 65072: 0xA3F7, - 65368 - 65072: 0xA3F8, - 65369 - 65072: 0xA3F9, - 65370 - 65072: 0xA3FA, - 65371 - 65072: 0xA3FB, - 65372 - 65072: 0xA3FC, - 65373 - 65072: 0xA3FD, - 65374 - 65072: 0xA1AB, - 65504 - 65072: 0xA1E9, - 65505 - 65072: 0xA1EA, - 65506 - 65072: 0xA956, - 65507 - 65072: 0xA3FE, - 65508 - 65072: 0xA957, - 65509 - 65072: 0xA3A4, -} - -const encode4Low, encode4High = 63788, 64042 - -var encode4 = [...]uint16{ - 63788 - 63788: 0xFD9C, - 63865 - 63788: 0xFD9D, - 63893 - 63788: 0xFD9E, - 63975 - 63788: 0xFD9F, - 63985 - 63788: 0xFDA0, - 64012 - 63788: 0xFE40, - 64013 - 63788: 0xFE41, - 64014 - 63788: 0xFE42, - 64015 - 63788: 0xFE43, - 64017 - 63788: 0xFE44, - 64019 - 63788: 0xFE45, - 64020 - 63788: 0xFE46, - 64024 - 63788: 0xFE47, - 64031 - 63788: 0xFE48, - 64032 - 63788: 0xFE49, - 64033 - 63788: 0xFE4A, - 64035 - 63788: 0xFE4B, - 64036 - 63788: 0xFE4C, - 64039 - 63788: 0xFE4D, - 64040 - 63788: 0xFE4E, - 64041 - 63788: 0xFE4F, -} diff --git a/vendor/golang.org/x/text/transform/transform.go b/vendor/golang.org/x/text/transform/transform.go deleted file mode 100644 index 48ec64b..0000000 --- a/vendor/golang.org/x/text/transform/transform.go +++ /dev/null @@ -1,709 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package transform provides reader and writer wrappers that transform the -// bytes passing through as well as various transformations. Example -// transformations provided by other packages include normalization and -// conversion between character sets. -package transform // import "golang.org/x/text/transform" - -import ( - "bytes" - "errors" - "io" - "unicode/utf8" -) - -var ( - // ErrShortDst means that the destination buffer was too short to - // receive all of the transformed bytes. - ErrShortDst = errors.New("transform: short destination buffer") - - // ErrShortSrc means that the source buffer has insufficient data to - // complete the transformation. - ErrShortSrc = errors.New("transform: short source buffer") - - // ErrEndOfSpan means that the input and output (the transformed input) - // are not identical. - ErrEndOfSpan = errors.New("transform: input and output are not identical") - - // errInconsistentByteCount means that Transform returned success (nil - // error) but also returned nSrc inconsistent with the src argument. - errInconsistentByteCount = errors.New("transform: inconsistent byte count returned") - - // errShortInternal means that an internal buffer is not large enough - // to make progress and the Transform operation must be aborted. - errShortInternal = errors.New("transform: short internal buffer") -) - -// Transformer transforms bytes. -type Transformer interface { - // Transform writes to dst the transformed bytes read from src, and - // returns the number of dst bytes written and src bytes read. The - // atEOF argument tells whether src represents the last bytes of the - // input. - // - // Callers should always process the nDst bytes produced and account - // for the nSrc bytes consumed before considering the error err. - // - // A nil error means that all of the transformed bytes (whether freshly - // transformed from src or left over from previous Transform calls) - // were written to dst. A nil error can be returned regardless of - // whether atEOF is true. If err is nil then nSrc must equal len(src); - // the converse is not necessarily true. - // - // ErrShortDst means that dst was too short to receive all of the - // transformed bytes. ErrShortSrc means that src had insufficient data - // to complete the transformation. If both conditions apply, then - // either error may be returned. Other than the error conditions listed - // here, implementations are free to report other errors that arise. - Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) - - // Reset resets the state and allows a Transformer to be reused. - Reset() -} - -// SpanningTransformer extends the Transformer interface with a Span method -// that determines how much of the input already conforms to the Transformer. -type SpanningTransformer interface { - Transformer - - // Span returns a position in src such that transforming src[:n] results in - // identical output src[:n] for these bytes. It does not necessarily return - // the largest such n. The atEOF argument tells whether src represents the - // last bytes of the input. - // - // Callers should always account for the n bytes consumed before - // considering the error err. - // - // A nil error means that all input bytes are known to be identical to the - // output produced by the Transformer. A nil error can be returned - // regardless of whether atEOF is true. If err is nil, then n must - // equal len(src); the converse is not necessarily true. - // - // ErrEndOfSpan means that the Transformer output may differ from the - // input after n bytes. Note that n may be len(src), meaning that the output - // would contain additional bytes after otherwise identical output. - // ErrShortSrc means that src had insufficient data to determine whether the - // remaining bytes would change. Other than the error conditions listed - // here, implementations are free to report other errors that arise. - // - // Calling Span can modify the Transformer state as a side effect. In - // effect, it does the transformation just as calling Transform would, only - // without copying to a destination buffer and only up to a point it can - // determine the input and output bytes are the same. This is obviously more - // limited than calling Transform, but can be more efficient in terms of - // copying and allocating buffers. Calls to Span and Transform may be - // interleaved. - Span(src []byte, atEOF bool) (n int, err error) -} - -// NopResetter can be embedded by implementations of Transformer to add a nop -// Reset method. -type NopResetter struct{} - -// Reset implements the Reset method of the Transformer interface. -func (NopResetter) Reset() {} - -// Reader wraps another io.Reader by transforming the bytes read. -type Reader struct { - r io.Reader - t Transformer - err error - - // dst[dst0:dst1] contains bytes that have been transformed by t but - // not yet copied out via Read. - dst []byte - dst0, dst1 int - - // src[src0:src1] contains bytes that have been read from r but not - // yet transformed through t. - src []byte - src0, src1 int - - // transformComplete is whether the transformation is complete, - // regardless of whether or not it was successful. - transformComplete bool -} - -const defaultBufSize = 4096 - -// NewReader returns a new Reader that wraps r by transforming the bytes read -// via t. It calls Reset on t. -func NewReader(r io.Reader, t Transformer) *Reader { - t.Reset() - return &Reader{ - r: r, - t: t, - dst: make([]byte, defaultBufSize), - src: make([]byte, defaultBufSize), - } -} - -// Read implements the io.Reader interface. -func (r *Reader) Read(p []byte) (int, error) { - n, err := 0, error(nil) - for { - // Copy out any transformed bytes and return the final error if we are done. - if r.dst0 != r.dst1 { - n = copy(p, r.dst[r.dst0:r.dst1]) - r.dst0 += n - if r.dst0 == r.dst1 && r.transformComplete { - return n, r.err - } - return n, nil - } else if r.transformComplete { - return 0, r.err - } - - // Try to transform some source bytes, or to flush the transformer if we - // are out of source bytes. We do this even if r.r.Read returned an error. - // As the io.Reader documentation says, "process the n > 0 bytes returned - // before considering the error". - if r.src0 != r.src1 || r.err != nil { - r.dst0 = 0 - r.dst1, n, err = r.t.Transform(r.dst, r.src[r.src0:r.src1], r.err == io.EOF) - r.src0 += n - - switch { - case err == nil: - if r.src0 != r.src1 { - r.err = errInconsistentByteCount - } - // The Transform call was successful; we are complete if we - // cannot read more bytes into src. - r.transformComplete = r.err != nil - continue - case err == ErrShortDst && (r.dst1 != 0 || n != 0): - // Make room in dst by copying out, and try again. - continue - case err == ErrShortSrc && r.src1-r.src0 != len(r.src) && r.err == nil: - // Read more bytes into src via the code below, and try again. - default: - r.transformComplete = true - // The reader error (r.err) takes precedence over the - // transformer error (err) unless r.err is nil or io.EOF. - if r.err == nil || r.err == io.EOF { - r.err = err - } - continue - } - } - - // Move any untransformed source bytes to the start of the buffer - // and read more bytes. - if r.src0 != 0 { - r.src0, r.src1 = 0, copy(r.src, r.src[r.src0:r.src1]) - } - n, r.err = r.r.Read(r.src[r.src1:]) - r.src1 += n - } -} - -// TODO: implement ReadByte (and ReadRune??). - -// Writer wraps another io.Writer by transforming the bytes read. -// The user needs to call Close to flush unwritten bytes that may -// be buffered. -type Writer struct { - w io.Writer - t Transformer - dst []byte - - // src[:n] contains bytes that have not yet passed through t. - src []byte - n int -} - -// NewWriter returns a new Writer that wraps w by transforming the bytes written -// via t. It calls Reset on t. -func NewWriter(w io.Writer, t Transformer) *Writer { - t.Reset() - return &Writer{ - w: w, - t: t, - dst: make([]byte, defaultBufSize), - src: make([]byte, defaultBufSize), - } -} - -// Write implements the io.Writer interface. If there are not enough -// bytes available to complete a Transform, the bytes will be buffered -// for the next write. Call Close to convert the remaining bytes. -func (w *Writer) Write(data []byte) (n int, err error) { - src := data - if w.n > 0 { - // Append bytes from data to the last remainder. - // TODO: limit the amount copied on first try. - n = copy(w.src[w.n:], data) - w.n += n - src = w.src[:w.n] - } - for { - nDst, nSrc, err := w.t.Transform(w.dst, src, false) - if _, werr := w.w.Write(w.dst[:nDst]); werr != nil { - return n, werr - } - src = src[nSrc:] - if w.n == 0 { - n += nSrc - } else if len(src) <= n { - // Enough bytes from w.src have been consumed. We make src point - // to data instead to reduce the copying. - w.n = 0 - n -= len(src) - src = data[n:] - if n < len(data) && (err == nil || err == ErrShortSrc) { - continue - } - } - switch err { - case ErrShortDst: - // This error is okay as long as we are making progress. - if nDst > 0 || nSrc > 0 { - continue - } - case ErrShortSrc: - if len(src) < len(w.src) { - m := copy(w.src, src) - // If w.n > 0, bytes from data were already copied to w.src and n - // was already set to the number of bytes consumed. - if w.n == 0 { - n += m - } - w.n = m - err = nil - } else if nDst > 0 || nSrc > 0 { - // Not enough buffer to store the remainder. Keep processing as - // long as there is progress. Without this case, transforms that - // require a lookahead larger than the buffer may result in an - // error. This is not something one may expect to be common in - // practice, but it may occur when buffers are set to small - // sizes during testing. - continue - } - case nil: - if w.n > 0 { - err = errInconsistentByteCount - } - } - return n, err - } -} - -// Close implements the io.Closer interface. -func (w *Writer) Close() error { - src := w.src[:w.n] - for { - nDst, nSrc, err := w.t.Transform(w.dst, src, true) - if _, werr := w.w.Write(w.dst[:nDst]); werr != nil { - return werr - } - if err != ErrShortDst { - return err - } - src = src[nSrc:] - } -} - -type nop struct{ NopResetter } - -func (nop) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { - n := copy(dst, src) - if n < len(src) { - err = ErrShortDst - } - return n, n, err -} - -func (nop) Span(src []byte, atEOF bool) (n int, err error) { - return len(src), nil -} - -type discard struct{ NopResetter } - -func (discard) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { - return 0, len(src), nil -} - -var ( - // Discard is a Transformer for which all Transform calls succeed - // by consuming all bytes and writing nothing. - Discard Transformer = discard{} - - // Nop is a SpanningTransformer that copies src to dst. - Nop SpanningTransformer = nop{} -) - -// chain is a sequence of links. A chain with N Transformers has N+1 links and -// N+1 buffers. Of those N+1 buffers, the first and last are the src and dst -// buffers given to chain.Transform and the middle N-1 buffers are intermediate -// buffers owned by the chain. The i'th link transforms bytes from the i'th -// buffer chain.link[i].b at read offset chain.link[i].p to the i+1'th buffer -// chain.link[i+1].b at write offset chain.link[i+1].n, for i in [0, N). -type chain struct { - link []link - err error - // errStart is the index at which the error occurred plus 1. Processing - // errStart at this level at the next call to Transform. As long as - // errStart > 0, chain will not consume any more source bytes. - errStart int -} - -func (c *chain) fatalError(errIndex int, err error) { - if i := errIndex + 1; i > c.errStart { - c.errStart = i - c.err = err - } -} - -type link struct { - t Transformer - // b[p:n] holds the bytes to be transformed by t. - b []byte - p int - n int -} - -func (l *link) src() []byte { - return l.b[l.p:l.n] -} - -func (l *link) dst() []byte { - return l.b[l.n:] -} - -// Chain returns a Transformer that applies t in sequence. -func Chain(t ...Transformer) Transformer { - if len(t) == 0 { - return nop{} - } - c := &chain{link: make([]link, len(t)+1)} - for i, tt := range t { - c.link[i].t = tt - } - // Allocate intermediate buffers. - b := make([][defaultBufSize]byte, len(t)-1) - for i := range b { - c.link[i+1].b = b[i][:] - } - return c -} - -// Reset resets the state of Chain. It calls Reset on all the Transformers. -func (c *chain) Reset() { - for i, l := range c.link { - if l.t != nil { - l.t.Reset() - } - c.link[i].p, c.link[i].n = 0, 0 - } -} - -// TODO: make chain use Span (is going to be fun to implement!) - -// Transform applies the transformers of c in sequence. -func (c *chain) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { - // Set up src and dst in the chain. - srcL := &c.link[0] - dstL := &c.link[len(c.link)-1] - srcL.b, srcL.p, srcL.n = src, 0, len(src) - dstL.b, dstL.n = dst, 0 - var lastFull, needProgress bool // for detecting progress - - // i is the index of the next Transformer to apply, for i in [low, high]. - // low is the lowest index for which c.link[low] may still produce bytes. - // high is the highest index for which c.link[high] has a Transformer. - // The error returned by Transform determines whether to increase or - // decrease i. We try to completely fill a buffer before converting it. - for low, i, high := c.errStart, c.errStart, len(c.link)-2; low <= i && i <= high; { - in, out := &c.link[i], &c.link[i+1] - nDst, nSrc, err0 := in.t.Transform(out.dst(), in.src(), atEOF && low == i) - out.n += nDst - in.p += nSrc - if i > 0 && in.p == in.n { - in.p, in.n = 0, 0 - } - needProgress, lastFull = lastFull, false - switch err0 { - case ErrShortDst: - // Process the destination buffer next. Return if we are already - // at the high index. - if i == high { - return dstL.n, srcL.p, ErrShortDst - } - if out.n != 0 { - i++ - // If the Transformer at the next index is not able to process any - // source bytes there is nothing that can be done to make progress - // and the bytes will remain unprocessed. lastFull is used to - // detect this and break out of the loop with a fatal error. - lastFull = true - continue - } - // The destination buffer was too small, but is completely empty. - // Return a fatal error as this transformation can never complete. - c.fatalError(i, errShortInternal) - case ErrShortSrc: - if i == 0 { - // Save ErrShortSrc in err. All other errors take precedence. - err = ErrShortSrc - break - } - // Source bytes were depleted before filling up the destination buffer. - // Verify we made some progress, move the remaining bytes to the errStart - // and try to get more source bytes. - if needProgress && nSrc == 0 || in.n-in.p == len(in.b) { - // There were not enough source bytes to proceed while the source - // buffer cannot hold any more bytes. Return a fatal error as this - // transformation can never complete. - c.fatalError(i, errShortInternal) - break - } - // in.b is an internal buffer and we can make progress. - in.p, in.n = 0, copy(in.b, in.src()) - fallthrough - case nil: - // if i == low, we have depleted the bytes at index i or any lower levels. - // In that case we increase low and i. In all other cases we decrease i to - // fetch more bytes before proceeding to the next index. - if i > low { - i-- - continue - } - default: - c.fatalError(i, err0) - } - // Exhausted level low or fatal error: increase low and continue - // to process the bytes accepted so far. - i++ - low = i - } - - // If c.errStart > 0, this means we found a fatal error. We will clear - // all upstream buffers. At this point, no more progress can be made - // downstream, as Transform would have bailed while handling ErrShortDst. - if c.errStart > 0 { - for i := 1; i < c.errStart; i++ { - c.link[i].p, c.link[i].n = 0, 0 - } - err, c.errStart, c.err = c.err, 0, nil - } - return dstL.n, srcL.p, err -} - -// Deprecated: Use runes.Remove instead. -func RemoveFunc(f func(r rune) bool) Transformer { - return removeF(f) -} - -type removeF func(r rune) bool - -func (removeF) Reset() {} - -// Transform implements the Transformer interface. -func (t removeF) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { - for r, sz := rune(0), 0; len(src) > 0; src = src[sz:] { - - if r = rune(src[0]); r < utf8.RuneSelf { - sz = 1 - } else { - r, sz = utf8.DecodeRune(src) - - if sz == 1 { - // Invalid rune. - if !atEOF && !utf8.FullRune(src) { - err = ErrShortSrc - break - } - // We replace illegal bytes with RuneError. Not doing so might - // otherwise turn a sequence of invalid UTF-8 into valid UTF-8. - // The resulting byte sequence may subsequently contain runes - // for which t(r) is true that were passed unnoticed. - if !t(r) { - if nDst+3 > len(dst) { - err = ErrShortDst - break - } - nDst += copy(dst[nDst:], "\uFFFD") - } - nSrc++ - continue - } - } - - if !t(r) { - if nDst+sz > len(dst) { - err = ErrShortDst - break - } - nDst += copy(dst[nDst:], src[:sz]) - } - nSrc += sz - } - return -} - -// grow returns a new []byte that is longer than b, and copies the first n bytes -// of b to the start of the new slice. -func grow(b []byte, n int) []byte { - m := len(b) - if m <= 32 { - m = 64 - } else if m <= 256 { - m *= 2 - } else { - m += m >> 1 - } - buf := make([]byte, m) - copy(buf, b[:n]) - return buf -} - -const initialBufSize = 128 - -// String returns a string with the result of converting s[:n] using t, where -// n <= len(s). If err == nil, n will be len(s). It calls Reset on t. -func String(t Transformer, s string) (result string, n int, err error) { - t.Reset() - if s == "" { - // Fast path for the common case for empty input. Results in about a - // 86% reduction of running time for BenchmarkStringLowerEmpty. - if _, _, err := t.Transform(nil, nil, true); err == nil { - return "", 0, nil - } - } - - // Allocate only once. Note that both dst and src escape when passed to - // Transform. - buf := [2 * initialBufSize]byte{} - dst := buf[:initialBufSize:initialBufSize] - src := buf[initialBufSize : 2*initialBufSize] - - // The input string s is transformed in multiple chunks (starting with a - // chunk size of initialBufSize). nDst and nSrc are per-chunk (or - // per-Transform-call) indexes, pDst and pSrc are overall indexes. - nDst, nSrc := 0, 0 - pDst, pSrc := 0, 0 - - // pPrefix is the length of a common prefix: the first pPrefix bytes of the - // result will equal the first pPrefix bytes of s. It is not guaranteed to - // be the largest such value, but if pPrefix, len(result) and len(s) are - // all equal after the final transform (i.e. calling Transform with atEOF - // being true returned nil error) then we don't need to allocate a new - // result string. - pPrefix := 0 - for { - // Invariant: pDst == pPrefix && pSrc == pPrefix. - - n := copy(src, s[pSrc:]) - nDst, nSrc, err = t.Transform(dst, src[:n], pSrc+n == len(s)) - pDst += nDst - pSrc += nSrc - - // TODO: let transformers implement an optional Spanner interface, akin - // to norm's QuickSpan. This would even allow us to avoid any allocation. - if !bytes.Equal(dst[:nDst], src[:nSrc]) { - break - } - pPrefix = pSrc - if err == ErrShortDst { - // A buffer can only be short if a transformer modifies its input. - break - } else if err == ErrShortSrc { - if nSrc == 0 { - // No progress was made. - break - } - // Equal so far and !atEOF, so continue checking. - } else if err != nil || pPrefix == len(s) { - return string(s[:pPrefix]), pPrefix, err - } - } - // Post-condition: pDst == pPrefix + nDst && pSrc == pPrefix + nSrc. - - // We have transformed the first pSrc bytes of the input s to become pDst - // transformed bytes. Those transformed bytes are discontiguous: the first - // pPrefix of them equal s[:pPrefix] and the last nDst of them equal - // dst[:nDst]. We copy them around, into a new dst buffer if necessary, so - // that they become one contiguous slice: dst[:pDst]. - if pPrefix != 0 { - newDst := dst - if pDst > len(newDst) { - newDst = make([]byte, len(s)+nDst-nSrc) - } - copy(newDst[pPrefix:pDst], dst[:nDst]) - copy(newDst[:pPrefix], s[:pPrefix]) - dst = newDst - } - - // Prevent duplicate Transform calls with atEOF being true at the end of - // the input. Also return if we have an unrecoverable error. - if (err == nil && pSrc == len(s)) || - (err != nil && err != ErrShortDst && err != ErrShortSrc) { - return string(dst[:pDst]), pSrc, err - } - - // Transform the remaining input, growing dst and src buffers as necessary. - for { - n := copy(src, s[pSrc:]) - atEOF := pSrc+n == len(s) - nDst, nSrc, err := t.Transform(dst[pDst:], src[:n], atEOF) - pDst += nDst - pSrc += nSrc - - // If we got ErrShortDst or ErrShortSrc, do not grow as long as we can - // make progress. This may avoid excessive allocations. - if err == ErrShortDst { - if nDst == 0 { - dst = grow(dst, pDst) - } - } else if err == ErrShortSrc { - if atEOF { - return string(dst[:pDst]), pSrc, err - } - if nSrc == 0 { - src = grow(src, 0) - } - } else if err != nil || pSrc == len(s) { - return string(dst[:pDst]), pSrc, err - } - } -} - -// Bytes returns a new byte slice with the result of converting b[:n] using t, -// where n <= len(b). If err == nil, n will be len(b). It calls Reset on t. -func Bytes(t Transformer, b []byte) (result []byte, n int, err error) { - return doAppend(t, 0, make([]byte, len(b)), b) -} - -// Append appends the result of converting src[:n] using t to dst, where -// n <= len(src), If err == nil, n will be len(src). It calls Reset on t. -func Append(t Transformer, dst, src []byte) (result []byte, n int, err error) { - if len(dst) == cap(dst) { - n := len(src) + len(dst) // It is okay for this to be 0. - b := make([]byte, n) - dst = b[:copy(b, dst)] - } - return doAppend(t, len(dst), dst[:cap(dst)], src) -} - -func doAppend(t Transformer, pDst int, dst, src []byte) (result []byte, n int, err error) { - t.Reset() - pSrc := 0 - for { - nDst, nSrc, err := t.Transform(dst[pDst:], src[pSrc:], true) - pDst += nDst - pSrc += nSrc - if err != ErrShortDst { - return dst[:pDst], pSrc, err - } - - // Grow the destination buffer, but do not grow as long as we can make - // progress. This may avoid excessive allocations. - if nDst == 0 { - dst = grow(dst, pDst) - } - } -} diff --git a/vendor/gopkg.in/yaml.v3/LICENSE b/vendor/gopkg.in/yaml.v3/LICENSE deleted file mode 100644 index 2683e4b..0000000 --- a/vendor/gopkg.in/yaml.v3/LICENSE +++ /dev/null @@ -1,50 +0,0 @@ - -This project is covered by two different licenses: MIT and Apache. - -#### MIT License #### - -The following files were ported to Go from C files of libyaml, and thus -are still covered by their original MIT license, with the additional -copyright staring in 2011 when the project was ported over: - - apic.go emitterc.go parserc.go readerc.go scannerc.go - writerc.go yamlh.go yamlprivateh.go - -Copyright (c) 2006-2010 Kirill Simonov -Copyright (c) 2006-2011 Kirill Simonov - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -### Apache License ### - -All the remaining project files are covered by the Apache license: - -Copyright (c) 2011-2019 Canonical Ltd - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/vendor/gopkg.in/yaml.v3/NOTICE b/vendor/gopkg.in/yaml.v3/NOTICE deleted file mode 100644 index 866d74a..0000000 --- a/vendor/gopkg.in/yaml.v3/NOTICE +++ /dev/null @@ -1,13 +0,0 @@ -Copyright 2011-2016 Canonical Ltd. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/vendor/gopkg.in/yaml.v3/README.md b/vendor/gopkg.in/yaml.v3/README.md deleted file mode 100644 index 08eb1ba..0000000 --- a/vendor/gopkg.in/yaml.v3/README.md +++ /dev/null @@ -1,150 +0,0 @@ -# YAML support for the Go language - -Introduction ------------- - -The yaml package enables Go programs to comfortably encode and decode YAML -values. It was developed within [Canonical](https://www.canonical.com) as -part of the [juju](https://juju.ubuntu.com) project, and is based on a -pure Go port of the well-known [libyaml](http://pyyaml.org/wiki/LibYAML) -C library to parse and generate YAML data quickly and reliably. - -Compatibility -------------- - -The yaml package supports most of YAML 1.2, but preserves some behavior -from 1.1 for backwards compatibility. - -Specifically, as of v3 of the yaml package: - - - YAML 1.1 bools (_yes/no, on/off_) are supported as long as they are being - decoded into a typed bool value. Otherwise they behave as a string. Booleans - in YAML 1.2 are _true/false_ only. - - Octals encode and decode as _0777_ per YAML 1.1, rather than _0o777_ - as specified in YAML 1.2, because most parsers still use the old format. - Octals in the _0o777_ format are supported though, so new files work. - - Does not support base-60 floats. These are gone from YAML 1.2, and were - actually never supported by this package as it's clearly a poor choice. - -and offers backwards -compatibility with YAML 1.1 in some cases. -1.2, including support for -anchors, tags, map merging, etc. Multi-document unmarshalling is not yet -implemented, and base-60 floats from YAML 1.1 are purposefully not -supported since they're a poor design and are gone in YAML 1.2. - -Installation and usage ----------------------- - -The import path for the package is *gopkg.in/yaml.v3*. - -To install it, run: - - go get gopkg.in/yaml.v3 - -API documentation ------------------ - -If opened in a browser, the import path itself leads to the API documentation: - - - [https://gopkg.in/yaml.v3](https://gopkg.in/yaml.v3) - -API stability -------------- - -The package API for yaml v3 will remain stable as described in [gopkg.in](https://gopkg.in). - - -License -------- - -The yaml package is licensed under the MIT and Apache License 2.0 licenses. -Please see the LICENSE file for details. - - -Example -------- - -```Go -package main - -import ( - "fmt" - "log" - - "gopkg.in/yaml.v3" -) - -var data = ` -a: Easy! -b: - c: 2 - d: [3, 4] -` - -// Note: struct fields must be public in order for unmarshal to -// correctly populate the data. -type T struct { - A string - B struct { - RenamedC int `yaml:"c"` - D []int `yaml:",flow"` - } -} - -func main() { - t := T{} - - err := yaml.Unmarshal([]byte(data), &t) - if err != nil { - log.Fatalf("error: %v", err) - } - fmt.Printf("--- t:\n%v\n\n", t) - - d, err := yaml.Marshal(&t) - if err != nil { - log.Fatalf("error: %v", err) - } - fmt.Printf("--- t dump:\n%s\n\n", string(d)) - - m := make(map[interface{}]interface{}) - - err = yaml.Unmarshal([]byte(data), &m) - if err != nil { - log.Fatalf("error: %v", err) - } - fmt.Printf("--- m:\n%v\n\n", m) - - d, err = yaml.Marshal(&m) - if err != nil { - log.Fatalf("error: %v", err) - } - fmt.Printf("--- m dump:\n%s\n\n", string(d)) -} -``` - -This example will generate the following output: - -``` ---- t: -{Easy! {2 [3 4]}} - ---- t dump: -a: Easy! -b: - c: 2 - d: [3, 4] - - ---- m: -map[a:Easy! b:map[c:2 d:[3 4]]] - ---- m dump: -a: Easy! -b: - c: 2 - d: - - 3 - - 4 -``` - diff --git a/vendor/gopkg.in/yaml.v3/apic.go b/vendor/gopkg.in/yaml.v3/apic.go deleted file mode 100644 index ae7d049..0000000 --- a/vendor/gopkg.in/yaml.v3/apic.go +++ /dev/null @@ -1,747 +0,0 @@ -// -// Copyright (c) 2011-2019 Canonical Ltd -// Copyright (c) 2006-2010 Kirill Simonov -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of -// this software and associated documentation files (the "Software"), to deal in -// the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -// of the Software, and to permit persons to whom the Software is furnished to do -// so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. - -package yaml - -import ( - "io" -) - -func yaml_insert_token(parser *yaml_parser_t, pos int, token *yaml_token_t) { - //fmt.Println("yaml_insert_token", "pos:", pos, "typ:", token.typ, "head:", parser.tokens_head, "len:", len(parser.tokens)) - - // Check if we can move the queue at the beginning of the buffer. - if parser.tokens_head > 0 && len(parser.tokens) == cap(parser.tokens) { - if parser.tokens_head != len(parser.tokens) { - copy(parser.tokens, parser.tokens[parser.tokens_head:]) - } - parser.tokens = parser.tokens[:len(parser.tokens)-parser.tokens_head] - parser.tokens_head = 0 - } - parser.tokens = append(parser.tokens, *token) - if pos < 0 { - return - } - copy(parser.tokens[parser.tokens_head+pos+1:], parser.tokens[parser.tokens_head+pos:]) - parser.tokens[parser.tokens_head+pos] = *token -} - -// Create a new parser object. -func yaml_parser_initialize(parser *yaml_parser_t) bool { - *parser = yaml_parser_t{ - raw_buffer: make([]byte, 0, input_raw_buffer_size), - buffer: make([]byte, 0, input_buffer_size), - } - return true -} - -// Destroy a parser object. -func yaml_parser_delete(parser *yaml_parser_t) { - *parser = yaml_parser_t{} -} - -// String read handler. -func yaml_string_read_handler(parser *yaml_parser_t, buffer []byte) (n int, err error) { - if parser.input_pos == len(parser.input) { - return 0, io.EOF - } - n = copy(buffer, parser.input[parser.input_pos:]) - parser.input_pos += n - return n, nil -} - -// Reader read handler. -func yaml_reader_read_handler(parser *yaml_parser_t, buffer []byte) (n int, err error) { - return parser.input_reader.Read(buffer) -} - -// Set a string input. -func yaml_parser_set_input_string(parser *yaml_parser_t, input []byte) { - if parser.read_handler != nil { - panic("must set the input source only once") - } - parser.read_handler = yaml_string_read_handler - parser.input = input - parser.input_pos = 0 -} - -// Set a file input. -func yaml_parser_set_input_reader(parser *yaml_parser_t, r io.Reader) { - if parser.read_handler != nil { - panic("must set the input source only once") - } - parser.read_handler = yaml_reader_read_handler - parser.input_reader = r -} - -// Set the source encoding. -func yaml_parser_set_encoding(parser *yaml_parser_t, encoding yaml_encoding_t) { - if parser.encoding != yaml_ANY_ENCODING { - panic("must set the encoding only once") - } - parser.encoding = encoding -} - -// Create a new emitter object. -func yaml_emitter_initialize(emitter *yaml_emitter_t) { - *emitter = yaml_emitter_t{ - buffer: make([]byte, output_buffer_size), - raw_buffer: make([]byte, 0, output_raw_buffer_size), - states: make([]yaml_emitter_state_t, 0, initial_stack_size), - events: make([]yaml_event_t, 0, initial_queue_size), - best_width: -1, - } -} - -// Destroy an emitter object. -func yaml_emitter_delete(emitter *yaml_emitter_t) { - *emitter = yaml_emitter_t{} -} - -// String write handler. -func yaml_string_write_handler(emitter *yaml_emitter_t, buffer []byte) error { - *emitter.output_buffer = append(*emitter.output_buffer, buffer...) - return nil -} - -// yaml_writer_write_handler uses emitter.output_writer to write the -// emitted text. -func yaml_writer_write_handler(emitter *yaml_emitter_t, buffer []byte) error { - _, err := emitter.output_writer.Write(buffer) - return err -} - -// Set a string output. -func yaml_emitter_set_output_string(emitter *yaml_emitter_t, output_buffer *[]byte) { - if emitter.write_handler != nil { - panic("must set the output target only once") - } - emitter.write_handler = yaml_string_write_handler - emitter.output_buffer = output_buffer -} - -// Set a file output. -func yaml_emitter_set_output_writer(emitter *yaml_emitter_t, w io.Writer) { - if emitter.write_handler != nil { - panic("must set the output target only once") - } - emitter.write_handler = yaml_writer_write_handler - emitter.output_writer = w -} - -// Set the output encoding. -func yaml_emitter_set_encoding(emitter *yaml_emitter_t, encoding yaml_encoding_t) { - if emitter.encoding != yaml_ANY_ENCODING { - panic("must set the output encoding only once") - } - emitter.encoding = encoding -} - -// Set the canonical output style. -func yaml_emitter_set_canonical(emitter *yaml_emitter_t, canonical bool) { - emitter.canonical = canonical -} - -// Set the indentation increment. -func yaml_emitter_set_indent(emitter *yaml_emitter_t, indent int) { - if indent < 2 || indent > 9 { - indent = 2 - } - emitter.best_indent = indent -} - -// Set the preferred line width. -func yaml_emitter_set_width(emitter *yaml_emitter_t, width int) { - if width < 0 { - width = -1 - } - emitter.best_width = width -} - -// Set if unescaped non-ASCII characters are allowed. -func yaml_emitter_set_unicode(emitter *yaml_emitter_t, unicode bool) { - emitter.unicode = unicode -} - -// Set the preferred line break character. -func yaml_emitter_set_break(emitter *yaml_emitter_t, line_break yaml_break_t) { - emitter.line_break = line_break -} - -///* -// * Destroy a token object. -// */ -// -//YAML_DECLARE(void) -//yaml_token_delete(yaml_token_t *token) -//{ -// assert(token); // Non-NULL token object expected. -// -// switch (token.type) -// { -// case YAML_TAG_DIRECTIVE_TOKEN: -// yaml_free(token.data.tag_directive.handle); -// yaml_free(token.data.tag_directive.prefix); -// break; -// -// case YAML_ALIAS_TOKEN: -// yaml_free(token.data.alias.value); -// break; -// -// case YAML_ANCHOR_TOKEN: -// yaml_free(token.data.anchor.value); -// break; -// -// case YAML_TAG_TOKEN: -// yaml_free(token.data.tag.handle); -// yaml_free(token.data.tag.suffix); -// break; -// -// case YAML_SCALAR_TOKEN: -// yaml_free(token.data.scalar.value); -// break; -// -// default: -// break; -// } -// -// memset(token, 0, sizeof(yaml_token_t)); -//} -// -///* -// * Check if a string is a valid UTF-8 sequence. -// * -// * Check 'reader.c' for more details on UTF-8 encoding. -// */ -// -//static int -//yaml_check_utf8(yaml_char_t *start, size_t length) -//{ -// yaml_char_t *end = start+length; -// yaml_char_t *pointer = start; -// -// while (pointer < end) { -// unsigned char octet; -// unsigned int width; -// unsigned int value; -// size_t k; -// -// octet = pointer[0]; -// width = (octet & 0x80) == 0x00 ? 1 : -// (octet & 0xE0) == 0xC0 ? 2 : -// (octet & 0xF0) == 0xE0 ? 3 : -// (octet & 0xF8) == 0xF0 ? 4 : 0; -// value = (octet & 0x80) == 0x00 ? octet & 0x7F : -// (octet & 0xE0) == 0xC0 ? octet & 0x1F : -// (octet & 0xF0) == 0xE0 ? octet & 0x0F : -// (octet & 0xF8) == 0xF0 ? octet & 0x07 : 0; -// if (!width) return 0; -// if (pointer+width > end) return 0; -// for (k = 1; k < width; k ++) { -// octet = pointer[k]; -// if ((octet & 0xC0) != 0x80) return 0; -// value = (value << 6) + (octet & 0x3F); -// } -// if (!((width == 1) || -// (width == 2 && value >= 0x80) || -// (width == 3 && value >= 0x800) || -// (width == 4 && value >= 0x10000))) return 0; -// -// pointer += width; -// } -// -// return 1; -//} -// - -// Create STREAM-START. -func yaml_stream_start_event_initialize(event *yaml_event_t, encoding yaml_encoding_t) { - *event = yaml_event_t{ - typ: yaml_STREAM_START_EVENT, - encoding: encoding, - } -} - -// Create STREAM-END. -func yaml_stream_end_event_initialize(event *yaml_event_t) { - *event = yaml_event_t{ - typ: yaml_STREAM_END_EVENT, - } -} - -// Create DOCUMENT-START. -func yaml_document_start_event_initialize( - event *yaml_event_t, - version_directive *yaml_version_directive_t, - tag_directives []yaml_tag_directive_t, - implicit bool, -) { - *event = yaml_event_t{ - typ: yaml_DOCUMENT_START_EVENT, - version_directive: version_directive, - tag_directives: tag_directives, - implicit: implicit, - } -} - -// Create DOCUMENT-END. -func yaml_document_end_event_initialize(event *yaml_event_t, implicit bool) { - *event = yaml_event_t{ - typ: yaml_DOCUMENT_END_EVENT, - implicit: implicit, - } -} - -// Create ALIAS. -func yaml_alias_event_initialize(event *yaml_event_t, anchor []byte) bool { - *event = yaml_event_t{ - typ: yaml_ALIAS_EVENT, - anchor: anchor, - } - return true -} - -// Create SCALAR. -func yaml_scalar_event_initialize(event *yaml_event_t, anchor, tag, value []byte, plain_implicit, quoted_implicit bool, style yaml_scalar_style_t) bool { - *event = yaml_event_t{ - typ: yaml_SCALAR_EVENT, - anchor: anchor, - tag: tag, - value: value, - implicit: plain_implicit, - quoted_implicit: quoted_implicit, - style: yaml_style_t(style), - } - return true -} - -// Create SEQUENCE-START. -func yaml_sequence_start_event_initialize(event *yaml_event_t, anchor, tag []byte, implicit bool, style yaml_sequence_style_t) bool { - *event = yaml_event_t{ - typ: yaml_SEQUENCE_START_EVENT, - anchor: anchor, - tag: tag, - implicit: implicit, - style: yaml_style_t(style), - } - return true -} - -// Create SEQUENCE-END. -func yaml_sequence_end_event_initialize(event *yaml_event_t) bool { - *event = yaml_event_t{ - typ: yaml_SEQUENCE_END_EVENT, - } - return true -} - -// Create MAPPING-START. -func yaml_mapping_start_event_initialize(event *yaml_event_t, anchor, tag []byte, implicit bool, style yaml_mapping_style_t) { - *event = yaml_event_t{ - typ: yaml_MAPPING_START_EVENT, - anchor: anchor, - tag: tag, - implicit: implicit, - style: yaml_style_t(style), - } -} - -// Create MAPPING-END. -func yaml_mapping_end_event_initialize(event *yaml_event_t) { - *event = yaml_event_t{ - typ: yaml_MAPPING_END_EVENT, - } -} - -// Destroy an event object. -func yaml_event_delete(event *yaml_event_t) { - *event = yaml_event_t{} -} - -///* -// * Create a document object. -// */ -// -//YAML_DECLARE(int) -//yaml_document_initialize(document *yaml_document_t, -// version_directive *yaml_version_directive_t, -// tag_directives_start *yaml_tag_directive_t, -// tag_directives_end *yaml_tag_directive_t, -// start_implicit int, end_implicit int) -//{ -// struct { -// error yaml_error_type_t -// } context -// struct { -// start *yaml_node_t -// end *yaml_node_t -// top *yaml_node_t -// } nodes = { NULL, NULL, NULL } -// version_directive_copy *yaml_version_directive_t = NULL -// struct { -// start *yaml_tag_directive_t -// end *yaml_tag_directive_t -// top *yaml_tag_directive_t -// } tag_directives_copy = { NULL, NULL, NULL } -// value yaml_tag_directive_t = { NULL, NULL } -// mark yaml_mark_t = { 0, 0, 0 } -// -// assert(document) // Non-NULL document object is expected. -// assert((tag_directives_start && tag_directives_end) || -// (tag_directives_start == tag_directives_end)) -// // Valid tag directives are expected. -// -// if (!STACK_INIT(&context, nodes, INITIAL_STACK_SIZE)) goto error -// -// if (version_directive) { -// version_directive_copy = yaml_malloc(sizeof(yaml_version_directive_t)) -// if (!version_directive_copy) goto error -// version_directive_copy.major = version_directive.major -// version_directive_copy.minor = version_directive.minor -// } -// -// if (tag_directives_start != tag_directives_end) { -// tag_directive *yaml_tag_directive_t -// if (!STACK_INIT(&context, tag_directives_copy, INITIAL_STACK_SIZE)) -// goto error -// for (tag_directive = tag_directives_start -// tag_directive != tag_directives_end; tag_directive ++) { -// assert(tag_directive.handle) -// assert(tag_directive.prefix) -// if (!yaml_check_utf8(tag_directive.handle, -// strlen((char *)tag_directive.handle))) -// goto error -// if (!yaml_check_utf8(tag_directive.prefix, -// strlen((char *)tag_directive.prefix))) -// goto error -// value.handle = yaml_strdup(tag_directive.handle) -// value.prefix = yaml_strdup(tag_directive.prefix) -// if (!value.handle || !value.prefix) goto error -// if (!PUSH(&context, tag_directives_copy, value)) -// goto error -// value.handle = NULL -// value.prefix = NULL -// } -// } -// -// DOCUMENT_INIT(*document, nodes.start, nodes.end, version_directive_copy, -// tag_directives_copy.start, tag_directives_copy.top, -// start_implicit, end_implicit, mark, mark) -// -// return 1 -// -//error: -// STACK_DEL(&context, nodes) -// yaml_free(version_directive_copy) -// while (!STACK_EMPTY(&context, tag_directives_copy)) { -// value yaml_tag_directive_t = POP(&context, tag_directives_copy) -// yaml_free(value.handle) -// yaml_free(value.prefix) -// } -// STACK_DEL(&context, tag_directives_copy) -// yaml_free(value.handle) -// yaml_free(value.prefix) -// -// return 0 -//} -// -///* -// * Destroy a document object. -// */ -// -//YAML_DECLARE(void) -//yaml_document_delete(document *yaml_document_t) -//{ -// struct { -// error yaml_error_type_t -// } context -// tag_directive *yaml_tag_directive_t -// -// context.error = YAML_NO_ERROR // Eliminate a compiler warning. -// -// assert(document) // Non-NULL document object is expected. -// -// while (!STACK_EMPTY(&context, document.nodes)) { -// node yaml_node_t = POP(&context, document.nodes) -// yaml_free(node.tag) -// switch (node.type) { -// case YAML_SCALAR_NODE: -// yaml_free(node.data.scalar.value) -// break -// case YAML_SEQUENCE_NODE: -// STACK_DEL(&context, node.data.sequence.items) -// break -// case YAML_MAPPING_NODE: -// STACK_DEL(&context, node.data.mapping.pairs) -// break -// default: -// assert(0) // Should not happen. -// } -// } -// STACK_DEL(&context, document.nodes) -// -// yaml_free(document.version_directive) -// for (tag_directive = document.tag_directives.start -// tag_directive != document.tag_directives.end -// tag_directive++) { -// yaml_free(tag_directive.handle) -// yaml_free(tag_directive.prefix) -// } -// yaml_free(document.tag_directives.start) -// -// memset(document, 0, sizeof(yaml_document_t)) -//} -// -///** -// * Get a document node. -// */ -// -//YAML_DECLARE(yaml_node_t *) -//yaml_document_get_node(document *yaml_document_t, index int) -//{ -// assert(document) // Non-NULL document object is expected. -// -// if (index > 0 && document.nodes.start + index <= document.nodes.top) { -// return document.nodes.start + index - 1 -// } -// return NULL -//} -// -///** -// * Get the root object. -// */ -// -//YAML_DECLARE(yaml_node_t *) -//yaml_document_get_root_node(document *yaml_document_t) -//{ -// assert(document) // Non-NULL document object is expected. -// -// if (document.nodes.top != document.nodes.start) { -// return document.nodes.start -// } -// return NULL -//} -// -///* -// * Add a scalar node to a document. -// */ -// -//YAML_DECLARE(int) -//yaml_document_add_scalar(document *yaml_document_t, -// tag *yaml_char_t, value *yaml_char_t, length int, -// style yaml_scalar_style_t) -//{ -// struct { -// error yaml_error_type_t -// } context -// mark yaml_mark_t = { 0, 0, 0 } -// tag_copy *yaml_char_t = NULL -// value_copy *yaml_char_t = NULL -// node yaml_node_t -// -// assert(document) // Non-NULL document object is expected. -// assert(value) // Non-NULL value is expected. -// -// if (!tag) { -// tag = (yaml_char_t *)YAML_DEFAULT_SCALAR_TAG -// } -// -// if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error -// tag_copy = yaml_strdup(tag) -// if (!tag_copy) goto error -// -// if (length < 0) { -// length = strlen((char *)value) -// } -// -// if (!yaml_check_utf8(value, length)) goto error -// value_copy = yaml_malloc(length+1) -// if (!value_copy) goto error -// memcpy(value_copy, value, length) -// value_copy[length] = '\0' -// -// SCALAR_NODE_INIT(node, tag_copy, value_copy, length, style, mark, mark) -// if (!PUSH(&context, document.nodes, node)) goto error -// -// return document.nodes.top - document.nodes.start -// -//error: -// yaml_free(tag_copy) -// yaml_free(value_copy) -// -// return 0 -//} -// -///* -// * Add a sequence node to a document. -// */ -// -//YAML_DECLARE(int) -//yaml_document_add_sequence(document *yaml_document_t, -// tag *yaml_char_t, style yaml_sequence_style_t) -//{ -// struct { -// error yaml_error_type_t -// } context -// mark yaml_mark_t = { 0, 0, 0 } -// tag_copy *yaml_char_t = NULL -// struct { -// start *yaml_node_item_t -// end *yaml_node_item_t -// top *yaml_node_item_t -// } items = { NULL, NULL, NULL } -// node yaml_node_t -// -// assert(document) // Non-NULL document object is expected. -// -// if (!tag) { -// tag = (yaml_char_t *)YAML_DEFAULT_SEQUENCE_TAG -// } -// -// if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error -// tag_copy = yaml_strdup(tag) -// if (!tag_copy) goto error -// -// if (!STACK_INIT(&context, items, INITIAL_STACK_SIZE)) goto error -// -// SEQUENCE_NODE_INIT(node, tag_copy, items.start, items.end, -// style, mark, mark) -// if (!PUSH(&context, document.nodes, node)) goto error -// -// return document.nodes.top - document.nodes.start -// -//error: -// STACK_DEL(&context, items) -// yaml_free(tag_copy) -// -// return 0 -//} -// -///* -// * Add a mapping node to a document. -// */ -// -//YAML_DECLARE(int) -//yaml_document_add_mapping(document *yaml_document_t, -// tag *yaml_char_t, style yaml_mapping_style_t) -//{ -// struct { -// error yaml_error_type_t -// } context -// mark yaml_mark_t = { 0, 0, 0 } -// tag_copy *yaml_char_t = NULL -// struct { -// start *yaml_node_pair_t -// end *yaml_node_pair_t -// top *yaml_node_pair_t -// } pairs = { NULL, NULL, NULL } -// node yaml_node_t -// -// assert(document) // Non-NULL document object is expected. -// -// if (!tag) { -// tag = (yaml_char_t *)YAML_DEFAULT_MAPPING_TAG -// } -// -// if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error -// tag_copy = yaml_strdup(tag) -// if (!tag_copy) goto error -// -// if (!STACK_INIT(&context, pairs, INITIAL_STACK_SIZE)) goto error -// -// MAPPING_NODE_INIT(node, tag_copy, pairs.start, pairs.end, -// style, mark, mark) -// if (!PUSH(&context, document.nodes, node)) goto error -// -// return document.nodes.top - document.nodes.start -// -//error: -// STACK_DEL(&context, pairs) -// yaml_free(tag_copy) -// -// return 0 -//} -// -///* -// * Append an item to a sequence node. -// */ -// -//YAML_DECLARE(int) -//yaml_document_append_sequence_item(document *yaml_document_t, -// sequence int, item int) -//{ -// struct { -// error yaml_error_type_t -// } context -// -// assert(document) // Non-NULL document is required. -// assert(sequence > 0 -// && document.nodes.start + sequence <= document.nodes.top) -// // Valid sequence id is required. -// assert(document.nodes.start[sequence-1].type == YAML_SEQUENCE_NODE) -// // A sequence node is required. -// assert(item > 0 && document.nodes.start + item <= document.nodes.top) -// // Valid item id is required. -// -// if (!PUSH(&context, -// document.nodes.start[sequence-1].data.sequence.items, item)) -// return 0 -// -// return 1 -//} -// -///* -// * Append a pair of a key and a value to a mapping node. -// */ -// -//YAML_DECLARE(int) -//yaml_document_append_mapping_pair(document *yaml_document_t, -// mapping int, key int, value int) -//{ -// struct { -// error yaml_error_type_t -// } context -// -// pair yaml_node_pair_t -// -// assert(document) // Non-NULL document is required. -// assert(mapping > 0 -// && document.nodes.start + mapping <= document.nodes.top) -// // Valid mapping id is required. -// assert(document.nodes.start[mapping-1].type == YAML_MAPPING_NODE) -// // A mapping node is required. -// assert(key > 0 && document.nodes.start + key <= document.nodes.top) -// // Valid key id is required. -// assert(value > 0 && document.nodes.start + value <= document.nodes.top) -// // Valid value id is required. -// -// pair.key = key -// pair.value = value -// -// if (!PUSH(&context, -// document.nodes.start[mapping-1].data.mapping.pairs, pair)) -// return 0 -// -// return 1 -//} -// -// diff --git a/vendor/gopkg.in/yaml.v3/decode.go b/vendor/gopkg.in/yaml.v3/decode.go deleted file mode 100644 index df36e3a..0000000 --- a/vendor/gopkg.in/yaml.v3/decode.go +++ /dev/null @@ -1,950 +0,0 @@ -// -// Copyright (c) 2011-2019 Canonical Ltd -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package yaml - -import ( - "encoding" - "encoding/base64" - "fmt" - "io" - "math" - "reflect" - "strconv" - "time" -) - -// ---------------------------------------------------------------------------- -// Parser, produces a node tree out of a libyaml event stream. - -type parser struct { - parser yaml_parser_t - event yaml_event_t - doc *Node - anchors map[string]*Node - doneInit bool - textless bool -} - -func newParser(b []byte) *parser { - p := parser{} - if !yaml_parser_initialize(&p.parser) { - panic("failed to initialize YAML emitter") - } - if len(b) == 0 { - b = []byte{'\n'} - } - yaml_parser_set_input_string(&p.parser, b) - return &p -} - -func newParserFromReader(r io.Reader) *parser { - p := parser{} - if !yaml_parser_initialize(&p.parser) { - panic("failed to initialize YAML emitter") - } - yaml_parser_set_input_reader(&p.parser, r) - return &p -} - -func (p *parser) init() { - if p.doneInit { - return - } - p.anchors = make(map[string]*Node) - p.expect(yaml_STREAM_START_EVENT) - p.doneInit = true -} - -func (p *parser) destroy() { - if p.event.typ != yaml_NO_EVENT { - yaml_event_delete(&p.event) - } - yaml_parser_delete(&p.parser) -} - -// expect consumes an event from the event stream and -// checks that it's of the expected type. -func (p *parser) expect(e yaml_event_type_t) { - if p.event.typ == yaml_NO_EVENT { - if !yaml_parser_parse(&p.parser, &p.event) { - p.fail() - } - } - if p.event.typ == yaml_STREAM_END_EVENT { - failf("attempted to go past the end of stream; corrupted value?") - } - if p.event.typ != e { - p.parser.problem = fmt.Sprintf("expected %s event but got %s", e, p.event.typ) - p.fail() - } - yaml_event_delete(&p.event) - p.event.typ = yaml_NO_EVENT -} - -// peek peeks at the next event in the event stream, -// puts the results into p.event and returns the event type. -func (p *parser) peek() yaml_event_type_t { - if p.event.typ != yaml_NO_EVENT { - return p.event.typ - } - if !yaml_parser_parse(&p.parser, &p.event) { - p.fail() - } - return p.event.typ -} - -func (p *parser) fail() { - var where string - var line int - if p.parser.context_mark.line != 0 { - line = p.parser.context_mark.line - // Scanner errors don't iterate line before returning error - if p.parser.error == yaml_SCANNER_ERROR { - line++ - } - } else if p.parser.problem_mark.line != 0 { - line = p.parser.problem_mark.line - // Scanner errors don't iterate line before returning error - if p.parser.error == yaml_SCANNER_ERROR { - line++ - } - } - if line != 0 { - where = "line " + strconv.Itoa(line) + ": " - } - var msg string - if len(p.parser.problem) > 0 { - msg = p.parser.problem - } else { - msg = "unknown problem parsing YAML content" - } - failf("%s%s", where, msg) -} - -func (p *parser) anchor(n *Node, anchor []byte) { - if anchor != nil { - n.Anchor = string(anchor) - p.anchors[n.Anchor] = n - } -} - -func (p *parser) parse() *Node { - p.init() - switch p.peek() { - case yaml_SCALAR_EVENT: - return p.scalar() - case yaml_ALIAS_EVENT: - return p.alias() - case yaml_MAPPING_START_EVENT: - return p.mapping() - case yaml_SEQUENCE_START_EVENT: - return p.sequence() - case yaml_DOCUMENT_START_EVENT: - return p.document() - case yaml_STREAM_END_EVENT: - // Happens when attempting to decode an empty buffer. - return nil - case yaml_TAIL_COMMENT_EVENT: - panic("internal error: unexpected tail comment event (please report)") - default: - panic("internal error: attempted to parse unknown event (please report): " + p.event.typ.String()) - } -} - -func (p *parser) node(kind Kind, defaultTag, tag, value string) *Node { - var style Style - if tag != "" && tag != "!" { - tag = shortTag(tag) - style = TaggedStyle - } else if defaultTag != "" { - tag = defaultTag - } else if kind == ScalarNode { - tag, _ = resolve("", value) - } - n := &Node{ - Kind: kind, - Tag: tag, - Value: value, - Style: style, - } - if !p.textless { - n.Line = p.event.start_mark.line + 1 - n.Column = p.event.start_mark.column + 1 - n.HeadComment = string(p.event.head_comment) - n.LineComment = string(p.event.line_comment) - n.FootComment = string(p.event.foot_comment) - } - return n -} - -func (p *parser) parseChild(parent *Node) *Node { - child := p.parse() - parent.Content = append(parent.Content, child) - return child -} - -func (p *parser) document() *Node { - n := p.node(DocumentNode, "", "", "") - p.doc = n - p.expect(yaml_DOCUMENT_START_EVENT) - p.parseChild(n) - if p.peek() == yaml_DOCUMENT_END_EVENT { - n.FootComment = string(p.event.foot_comment) - } - p.expect(yaml_DOCUMENT_END_EVENT) - return n -} - -func (p *parser) alias() *Node { - n := p.node(AliasNode, "", "", string(p.event.anchor)) - n.Alias = p.anchors[n.Value] - if n.Alias == nil { - failf("unknown anchor '%s' referenced", n.Value) - } - p.expect(yaml_ALIAS_EVENT) - return n -} - -func (p *parser) scalar() *Node { - var parsedStyle = p.event.scalar_style() - var nodeStyle Style - switch { - case parsedStyle&yaml_DOUBLE_QUOTED_SCALAR_STYLE != 0: - nodeStyle = DoubleQuotedStyle - case parsedStyle&yaml_SINGLE_QUOTED_SCALAR_STYLE != 0: - nodeStyle = SingleQuotedStyle - case parsedStyle&yaml_LITERAL_SCALAR_STYLE != 0: - nodeStyle = LiteralStyle - case parsedStyle&yaml_FOLDED_SCALAR_STYLE != 0: - nodeStyle = FoldedStyle - } - var nodeValue = string(p.event.value) - var nodeTag = string(p.event.tag) - var defaultTag string - if nodeStyle == 0 { - if nodeValue == "<<" { - defaultTag = mergeTag - } - } else { - defaultTag = strTag - } - n := p.node(ScalarNode, defaultTag, nodeTag, nodeValue) - n.Style |= nodeStyle - p.anchor(n, p.event.anchor) - p.expect(yaml_SCALAR_EVENT) - return n -} - -func (p *parser) sequence() *Node { - n := p.node(SequenceNode, seqTag, string(p.event.tag), "") - if p.event.sequence_style()&yaml_FLOW_SEQUENCE_STYLE != 0 { - n.Style |= FlowStyle - } - p.anchor(n, p.event.anchor) - p.expect(yaml_SEQUENCE_START_EVENT) - for p.peek() != yaml_SEQUENCE_END_EVENT { - p.parseChild(n) - } - n.LineComment = string(p.event.line_comment) - n.FootComment = string(p.event.foot_comment) - p.expect(yaml_SEQUENCE_END_EVENT) - return n -} - -func (p *parser) mapping() *Node { - n := p.node(MappingNode, mapTag, string(p.event.tag), "") - block := true - if p.event.mapping_style()&yaml_FLOW_MAPPING_STYLE != 0 { - block = false - n.Style |= FlowStyle - } - p.anchor(n, p.event.anchor) - p.expect(yaml_MAPPING_START_EVENT) - for p.peek() != yaml_MAPPING_END_EVENT { - k := p.parseChild(n) - if block && k.FootComment != "" { - // Must be a foot comment for the prior value when being dedented. - if len(n.Content) > 2 { - n.Content[len(n.Content)-3].FootComment = k.FootComment - k.FootComment = "" - } - } - v := p.parseChild(n) - if k.FootComment == "" && v.FootComment != "" { - k.FootComment = v.FootComment - v.FootComment = "" - } - if p.peek() == yaml_TAIL_COMMENT_EVENT { - if k.FootComment == "" { - k.FootComment = string(p.event.foot_comment) - } - p.expect(yaml_TAIL_COMMENT_EVENT) - } - } - n.LineComment = string(p.event.line_comment) - n.FootComment = string(p.event.foot_comment) - if n.Style&FlowStyle == 0 && n.FootComment != "" && len(n.Content) > 1 { - n.Content[len(n.Content)-2].FootComment = n.FootComment - n.FootComment = "" - } - p.expect(yaml_MAPPING_END_EVENT) - return n -} - -// ---------------------------------------------------------------------------- -// Decoder, unmarshals a node into a provided value. - -type decoder struct { - doc *Node - aliases map[*Node]bool - terrors []string - - stringMapType reflect.Type - generalMapType reflect.Type - - knownFields bool - uniqueKeys bool - decodeCount int - aliasCount int - aliasDepth int -} - -var ( - nodeType = reflect.TypeOf(Node{}) - durationType = reflect.TypeOf(time.Duration(0)) - stringMapType = reflect.TypeOf(map[string]interface{}{}) - generalMapType = reflect.TypeOf(map[interface{}]interface{}{}) - ifaceType = generalMapType.Elem() - timeType = reflect.TypeOf(time.Time{}) - ptrTimeType = reflect.TypeOf(&time.Time{}) -) - -func newDecoder() *decoder { - d := &decoder{ - stringMapType: stringMapType, - generalMapType: generalMapType, - uniqueKeys: true, - } - d.aliases = make(map[*Node]bool) - return d -} - -func (d *decoder) terror(n *Node, tag string, out reflect.Value) { - if n.Tag != "" { - tag = n.Tag - } - value := n.Value - if tag != seqTag && tag != mapTag { - if len(value) > 10 { - value = " `" + value[:7] + "...`" - } else { - value = " `" + value + "`" - } - } - d.terrors = append(d.terrors, fmt.Sprintf("line %d: cannot unmarshal %s%s into %s", n.Line, shortTag(tag), value, out.Type())) -} - -func (d *decoder) callUnmarshaler(n *Node, u Unmarshaler) (good bool) { - err := u.UnmarshalYAML(n) - if e, ok := err.(*TypeError); ok { - d.terrors = append(d.terrors, e.Errors...) - return false - } - if err != nil { - fail(err) - } - return true -} - -func (d *decoder) callObsoleteUnmarshaler(n *Node, u obsoleteUnmarshaler) (good bool) { - terrlen := len(d.terrors) - err := u.UnmarshalYAML(func(v interface{}) (err error) { - defer handleErr(&err) - d.unmarshal(n, reflect.ValueOf(v)) - if len(d.terrors) > terrlen { - issues := d.terrors[terrlen:] - d.terrors = d.terrors[:terrlen] - return &TypeError{issues} - } - return nil - }) - if e, ok := err.(*TypeError); ok { - d.terrors = append(d.terrors, e.Errors...) - return false - } - if err != nil { - fail(err) - } - return true -} - -// d.prepare initializes and dereferences pointers and calls UnmarshalYAML -// if a value is found to implement it. -// It returns the initialized and dereferenced out value, whether -// unmarshalling was already done by UnmarshalYAML, and if so whether -// its types unmarshalled appropriately. -// -// If n holds a null value, prepare returns before doing anything. -func (d *decoder) prepare(n *Node, out reflect.Value) (newout reflect.Value, unmarshaled, good bool) { - if n.ShortTag() == nullTag { - return out, false, false - } - again := true - for again { - again = false - if out.Kind() == reflect.Ptr { - if out.IsNil() { - out.Set(reflect.New(out.Type().Elem())) - } - out = out.Elem() - again = true - } - if out.CanAddr() { - outi := out.Addr().Interface() - if u, ok := outi.(Unmarshaler); ok { - good = d.callUnmarshaler(n, u) - return out, true, good - } - if u, ok := outi.(obsoleteUnmarshaler); ok { - good = d.callObsoleteUnmarshaler(n, u) - return out, true, good - } - } - } - return out, false, false -} - -func (d *decoder) fieldByIndex(n *Node, v reflect.Value, index []int) (field reflect.Value) { - if n.ShortTag() == nullTag { - return reflect.Value{} - } - for _, num := range index { - for { - if v.Kind() == reflect.Ptr { - if v.IsNil() { - v.Set(reflect.New(v.Type().Elem())) - } - v = v.Elem() - continue - } - break - } - v = v.Field(num) - } - return v -} - -const ( - // 400,000 decode operations is ~500kb of dense object declarations, or - // ~5kb of dense object declarations with 10000% alias expansion - alias_ratio_range_low = 400000 - - // 4,000,000 decode operations is ~5MB of dense object declarations, or - // ~4.5MB of dense object declarations with 10% alias expansion - alias_ratio_range_high = 4000000 - - // alias_ratio_range is the range over which we scale allowed alias ratios - alias_ratio_range = float64(alias_ratio_range_high - alias_ratio_range_low) -) - -func allowedAliasRatio(decodeCount int) float64 { - switch { - case decodeCount <= alias_ratio_range_low: - // allow 99% to come from alias expansion for small-to-medium documents - return 0.99 - case decodeCount >= alias_ratio_range_high: - // allow 10% to come from alias expansion for very large documents - return 0.10 - default: - // scale smoothly from 99% down to 10% over the range. - // this maps to 396,000 - 400,000 allowed alias-driven decodes over the range. - // 400,000 decode operations is ~100MB of allocations in worst-case scenarios (single-item maps). - return 0.99 - 0.89*(float64(decodeCount-alias_ratio_range_low)/alias_ratio_range) - } -} - -func (d *decoder) unmarshal(n *Node, out reflect.Value) (good bool) { - d.decodeCount++ - if d.aliasDepth > 0 { - d.aliasCount++ - } - if d.aliasCount > 100 && d.decodeCount > 1000 && float64(d.aliasCount)/float64(d.decodeCount) > allowedAliasRatio(d.decodeCount) { - failf("document contains excessive aliasing") - } - if out.Type() == nodeType { - out.Set(reflect.ValueOf(n).Elem()) - return true - } - switch n.Kind { - case DocumentNode: - return d.document(n, out) - case AliasNode: - return d.alias(n, out) - } - out, unmarshaled, good := d.prepare(n, out) - if unmarshaled { - return good - } - switch n.Kind { - case ScalarNode: - good = d.scalar(n, out) - case MappingNode: - good = d.mapping(n, out) - case SequenceNode: - good = d.sequence(n, out) - case 0: - if n.IsZero() { - return d.null(out) - } - fallthrough - default: - failf("cannot decode node with unknown kind %d", n.Kind) - } - return good -} - -func (d *decoder) document(n *Node, out reflect.Value) (good bool) { - if len(n.Content) == 1 { - d.doc = n - d.unmarshal(n.Content[0], out) - return true - } - return false -} - -func (d *decoder) alias(n *Node, out reflect.Value) (good bool) { - if d.aliases[n] { - // TODO this could actually be allowed in some circumstances. - failf("anchor '%s' value contains itself", n.Value) - } - d.aliases[n] = true - d.aliasDepth++ - good = d.unmarshal(n.Alias, out) - d.aliasDepth-- - delete(d.aliases, n) - return good -} - -var zeroValue reflect.Value - -func resetMap(out reflect.Value) { - for _, k := range out.MapKeys() { - out.SetMapIndex(k, zeroValue) - } -} - -func (d *decoder) null(out reflect.Value) bool { - if out.CanAddr() { - switch out.Kind() { - case reflect.Interface, reflect.Ptr, reflect.Map, reflect.Slice: - out.Set(reflect.Zero(out.Type())) - return true - } - } - return false -} - -func (d *decoder) scalar(n *Node, out reflect.Value) bool { - var tag string - var resolved interface{} - if n.indicatedString() { - tag = strTag - resolved = n.Value - } else { - tag, resolved = resolve(n.Tag, n.Value) - if tag == binaryTag { - data, err := base64.StdEncoding.DecodeString(resolved.(string)) - if err != nil { - failf("!!binary value contains invalid base64 data") - } - resolved = string(data) - } - } - if resolved == nil { - return d.null(out) - } - if resolvedv := reflect.ValueOf(resolved); out.Type() == resolvedv.Type() { - // We've resolved to exactly the type we want, so use that. - out.Set(resolvedv) - return true - } - // Perhaps we can use the value as a TextUnmarshaler to - // set its value. - if out.CanAddr() { - u, ok := out.Addr().Interface().(encoding.TextUnmarshaler) - if ok { - var text []byte - if tag == binaryTag { - text = []byte(resolved.(string)) - } else { - // We let any value be unmarshaled into TextUnmarshaler. - // That might be more lax than we'd like, but the - // TextUnmarshaler itself should bowl out any dubious values. - text = []byte(n.Value) - } - err := u.UnmarshalText(text) - if err != nil { - fail(err) - } - return true - } - } - switch out.Kind() { - case reflect.String: - if tag == binaryTag { - out.SetString(resolved.(string)) - return true - } - out.SetString(n.Value) - return true - case reflect.Interface: - out.Set(reflect.ValueOf(resolved)) - return true - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - // This used to work in v2, but it's very unfriendly. - isDuration := out.Type() == durationType - - switch resolved := resolved.(type) { - case int: - if !isDuration && !out.OverflowInt(int64(resolved)) { - out.SetInt(int64(resolved)) - return true - } - case int64: - if !isDuration && !out.OverflowInt(resolved) { - out.SetInt(resolved) - return true - } - case uint64: - if !isDuration && resolved <= math.MaxInt64 && !out.OverflowInt(int64(resolved)) { - out.SetInt(int64(resolved)) - return true - } - case float64: - if !isDuration && resolved <= math.MaxInt64 && !out.OverflowInt(int64(resolved)) { - out.SetInt(int64(resolved)) - return true - } - case string: - if out.Type() == durationType { - d, err := time.ParseDuration(resolved) - if err == nil { - out.SetInt(int64(d)) - return true - } - } - } - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - switch resolved := resolved.(type) { - case int: - if resolved >= 0 && !out.OverflowUint(uint64(resolved)) { - out.SetUint(uint64(resolved)) - return true - } - case int64: - if resolved >= 0 && !out.OverflowUint(uint64(resolved)) { - out.SetUint(uint64(resolved)) - return true - } - case uint64: - if !out.OverflowUint(uint64(resolved)) { - out.SetUint(uint64(resolved)) - return true - } - case float64: - if resolved <= math.MaxUint64 && !out.OverflowUint(uint64(resolved)) { - out.SetUint(uint64(resolved)) - return true - } - } - case reflect.Bool: - switch resolved := resolved.(type) { - case bool: - out.SetBool(resolved) - return true - case string: - // This offers some compatibility with the 1.1 spec (https://yaml.org/type/bool.html). - // It only works if explicitly attempting to unmarshal into a typed bool value. - switch resolved { - case "y", "Y", "yes", "Yes", "YES", "on", "On", "ON": - out.SetBool(true) - return true - case "n", "N", "no", "No", "NO", "off", "Off", "OFF": - out.SetBool(false) - return true - } - } - case reflect.Float32, reflect.Float64: - switch resolved := resolved.(type) { - case int: - out.SetFloat(float64(resolved)) - return true - case int64: - out.SetFloat(float64(resolved)) - return true - case uint64: - out.SetFloat(float64(resolved)) - return true - case float64: - out.SetFloat(resolved) - return true - } - case reflect.Struct: - if resolvedv := reflect.ValueOf(resolved); out.Type() == resolvedv.Type() { - out.Set(resolvedv) - return true - } - case reflect.Ptr: - panic("yaml internal error: please report the issue") - } - d.terror(n, tag, out) - return false -} - -func settableValueOf(i interface{}) reflect.Value { - v := reflect.ValueOf(i) - sv := reflect.New(v.Type()).Elem() - sv.Set(v) - return sv -} - -func (d *decoder) sequence(n *Node, out reflect.Value) (good bool) { - l := len(n.Content) - - var iface reflect.Value - switch out.Kind() { - case reflect.Slice: - out.Set(reflect.MakeSlice(out.Type(), l, l)) - case reflect.Array: - if l != out.Len() { - failf("invalid array: want %d elements but got %d", out.Len(), l) - } - case reflect.Interface: - // No type hints. Will have to use a generic sequence. - iface = out - out = settableValueOf(make([]interface{}, l)) - default: - d.terror(n, seqTag, out) - return false - } - et := out.Type().Elem() - - j := 0 - for i := 0; i < l; i++ { - e := reflect.New(et).Elem() - if ok := d.unmarshal(n.Content[i], e); ok { - out.Index(j).Set(e) - j++ - } - } - if out.Kind() != reflect.Array { - out.Set(out.Slice(0, j)) - } - if iface.IsValid() { - iface.Set(out) - } - return true -} - -func (d *decoder) mapping(n *Node, out reflect.Value) (good bool) { - l := len(n.Content) - if d.uniqueKeys { - nerrs := len(d.terrors) - for i := 0; i < l; i += 2 { - ni := n.Content[i] - for j := i + 2; j < l; j += 2 { - nj := n.Content[j] - if ni.Kind == nj.Kind && ni.Value == nj.Value { - d.terrors = append(d.terrors, fmt.Sprintf("line %d: mapping key %#v already defined at line %d", nj.Line, nj.Value, ni.Line)) - } - } - } - if len(d.terrors) > nerrs { - return false - } - } - switch out.Kind() { - case reflect.Struct: - return d.mappingStruct(n, out) - case reflect.Map: - // okay - case reflect.Interface: - iface := out - if isStringMap(n) { - out = reflect.MakeMap(d.stringMapType) - } else { - out = reflect.MakeMap(d.generalMapType) - } - iface.Set(out) - default: - d.terror(n, mapTag, out) - return false - } - - outt := out.Type() - kt := outt.Key() - et := outt.Elem() - - stringMapType := d.stringMapType - generalMapType := d.generalMapType - if outt.Elem() == ifaceType { - if outt.Key().Kind() == reflect.String { - d.stringMapType = outt - } else if outt.Key() == ifaceType { - d.generalMapType = outt - } - } - - mapIsNew := false - if out.IsNil() { - out.Set(reflect.MakeMap(outt)) - mapIsNew = true - } - for i := 0; i < l; i += 2 { - if isMerge(n.Content[i]) { - d.merge(n.Content[i+1], out) - continue - } - k := reflect.New(kt).Elem() - if d.unmarshal(n.Content[i], k) { - kkind := k.Kind() - if kkind == reflect.Interface { - kkind = k.Elem().Kind() - } - if kkind == reflect.Map || kkind == reflect.Slice { - failf("invalid map key: %#v", k.Interface()) - } - e := reflect.New(et).Elem() - if d.unmarshal(n.Content[i+1], e) || n.Content[i+1].ShortTag() == nullTag && (mapIsNew || !out.MapIndex(k).IsValid()) { - out.SetMapIndex(k, e) - } - } - } - d.stringMapType = stringMapType - d.generalMapType = generalMapType - return true -} - -func isStringMap(n *Node) bool { - if n.Kind != MappingNode { - return false - } - l := len(n.Content) - for i := 0; i < l; i += 2 { - if n.Content[i].ShortTag() != strTag { - return false - } - } - return true -} - -func (d *decoder) mappingStruct(n *Node, out reflect.Value) (good bool) { - sinfo, err := getStructInfo(out.Type()) - if err != nil { - panic(err) - } - - var inlineMap reflect.Value - var elemType reflect.Type - if sinfo.InlineMap != -1 { - inlineMap = out.Field(sinfo.InlineMap) - inlineMap.Set(reflect.New(inlineMap.Type()).Elem()) - elemType = inlineMap.Type().Elem() - } - - for _, index := range sinfo.InlineUnmarshalers { - field := d.fieldByIndex(n, out, index) - d.prepare(n, field) - } - - var doneFields []bool - if d.uniqueKeys { - doneFields = make([]bool, len(sinfo.FieldsList)) - } - name := settableValueOf("") - l := len(n.Content) - for i := 0; i < l; i += 2 { - ni := n.Content[i] - if isMerge(ni) { - d.merge(n.Content[i+1], out) - continue - } - if !d.unmarshal(ni, name) { - continue - } - if info, ok := sinfo.FieldsMap[name.String()]; ok { - if d.uniqueKeys { - if doneFields[info.Id] { - d.terrors = append(d.terrors, fmt.Sprintf("line %d: field %s already set in type %s", ni.Line, name.String(), out.Type())) - continue - } - doneFields[info.Id] = true - } - var field reflect.Value - if info.Inline == nil { - field = out.Field(info.Num) - } else { - field = d.fieldByIndex(n, out, info.Inline) - } - d.unmarshal(n.Content[i+1], field) - } else if sinfo.InlineMap != -1 { - if inlineMap.IsNil() { - inlineMap.Set(reflect.MakeMap(inlineMap.Type())) - } - value := reflect.New(elemType).Elem() - d.unmarshal(n.Content[i+1], value) - inlineMap.SetMapIndex(name, value) - } else if d.knownFields { - d.terrors = append(d.terrors, fmt.Sprintf("line %d: field %s not found in type %s", ni.Line, name.String(), out.Type())) - } - } - return true -} - -func failWantMap() { - failf("map merge requires map or sequence of maps as the value") -} - -func (d *decoder) merge(n *Node, out reflect.Value) { - switch n.Kind { - case MappingNode: - d.unmarshal(n, out) - case AliasNode: - if n.Alias != nil && n.Alias.Kind != MappingNode { - failWantMap() - } - d.unmarshal(n, out) - case SequenceNode: - // Step backwards as earlier nodes take precedence. - for i := len(n.Content) - 1; i >= 0; i-- { - ni := n.Content[i] - if ni.Kind == AliasNode { - if ni.Alias != nil && ni.Alias.Kind != MappingNode { - failWantMap() - } - } else if ni.Kind != MappingNode { - failWantMap() - } - d.unmarshal(ni, out) - } - default: - failWantMap() - } -} - -func isMerge(n *Node) bool { - return n.Kind == ScalarNode && n.Value == "<<" && (n.Tag == "" || n.Tag == "!" || shortTag(n.Tag) == mergeTag) -} diff --git a/vendor/gopkg.in/yaml.v3/emitterc.go b/vendor/gopkg.in/yaml.v3/emitterc.go deleted file mode 100644 index 0f47c9c..0000000 --- a/vendor/gopkg.in/yaml.v3/emitterc.go +++ /dev/null @@ -1,2020 +0,0 @@ -// -// Copyright (c) 2011-2019 Canonical Ltd -// Copyright (c) 2006-2010 Kirill Simonov -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of -// this software and associated documentation files (the "Software"), to deal in -// the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -// of the Software, and to permit persons to whom the Software is furnished to do -// so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. - -package yaml - -import ( - "bytes" - "fmt" -) - -// Flush the buffer if needed. -func flush(emitter *yaml_emitter_t) bool { - if emitter.buffer_pos+5 >= len(emitter.buffer) { - return yaml_emitter_flush(emitter) - } - return true -} - -// Put a character to the output buffer. -func put(emitter *yaml_emitter_t, value byte) bool { - if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) { - return false - } - emitter.buffer[emitter.buffer_pos] = value - emitter.buffer_pos++ - emitter.column++ - return true -} - -// Put a line break to the output buffer. -func put_break(emitter *yaml_emitter_t) bool { - if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) { - return false - } - switch emitter.line_break { - case yaml_CR_BREAK: - emitter.buffer[emitter.buffer_pos] = '\r' - emitter.buffer_pos += 1 - case yaml_LN_BREAK: - emitter.buffer[emitter.buffer_pos] = '\n' - emitter.buffer_pos += 1 - case yaml_CRLN_BREAK: - emitter.buffer[emitter.buffer_pos+0] = '\r' - emitter.buffer[emitter.buffer_pos+1] = '\n' - emitter.buffer_pos += 2 - default: - panic("unknown line break setting") - } - if emitter.column == 0 { - emitter.space_above = true - } - emitter.column = 0 - emitter.line++ - // [Go] Do this here and below and drop from everywhere else (see commented lines). - emitter.indention = true - return true -} - -// Copy a character from a string into buffer. -func write(emitter *yaml_emitter_t, s []byte, i *int) bool { - if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) { - return false - } - p := emitter.buffer_pos - w := width(s[*i]) - switch w { - case 4: - emitter.buffer[p+3] = s[*i+3] - fallthrough - case 3: - emitter.buffer[p+2] = s[*i+2] - fallthrough - case 2: - emitter.buffer[p+1] = s[*i+1] - fallthrough - case 1: - emitter.buffer[p+0] = s[*i+0] - default: - panic("unknown character width") - } - emitter.column++ - emitter.buffer_pos += w - *i += w - return true -} - -// Write a whole string into buffer. -func write_all(emitter *yaml_emitter_t, s []byte) bool { - for i := 0; i < len(s); { - if !write(emitter, s, &i) { - return false - } - } - return true -} - -// Copy a line break character from a string into buffer. -func write_break(emitter *yaml_emitter_t, s []byte, i *int) bool { - if s[*i] == '\n' { - if !put_break(emitter) { - return false - } - *i++ - } else { - if !write(emitter, s, i) { - return false - } - if emitter.column == 0 { - emitter.space_above = true - } - emitter.column = 0 - emitter.line++ - // [Go] Do this here and above and drop from everywhere else (see commented lines). - emitter.indention = true - } - return true -} - -// Set an emitter error and return false. -func yaml_emitter_set_emitter_error(emitter *yaml_emitter_t, problem string) bool { - emitter.error = yaml_EMITTER_ERROR - emitter.problem = problem - return false -} - -// Emit an event. -func yaml_emitter_emit(emitter *yaml_emitter_t, event *yaml_event_t) bool { - emitter.events = append(emitter.events, *event) - for !yaml_emitter_need_more_events(emitter) { - event := &emitter.events[emitter.events_head] - if !yaml_emitter_analyze_event(emitter, event) { - return false - } - if !yaml_emitter_state_machine(emitter, event) { - return false - } - yaml_event_delete(event) - emitter.events_head++ - } - return true -} - -// Check if we need to accumulate more events before emitting. -// -// We accumulate extra -// - 1 event for DOCUMENT-START -// - 2 events for SEQUENCE-START -// - 3 events for MAPPING-START -// -func yaml_emitter_need_more_events(emitter *yaml_emitter_t) bool { - if emitter.events_head == len(emitter.events) { - return true - } - var accumulate int - switch emitter.events[emitter.events_head].typ { - case yaml_DOCUMENT_START_EVENT: - accumulate = 1 - break - case yaml_SEQUENCE_START_EVENT: - accumulate = 2 - break - case yaml_MAPPING_START_EVENT: - accumulate = 3 - break - default: - return false - } - if len(emitter.events)-emitter.events_head > accumulate { - return false - } - var level int - for i := emitter.events_head; i < len(emitter.events); i++ { - switch emitter.events[i].typ { - case yaml_STREAM_START_EVENT, yaml_DOCUMENT_START_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT: - level++ - case yaml_STREAM_END_EVENT, yaml_DOCUMENT_END_EVENT, yaml_SEQUENCE_END_EVENT, yaml_MAPPING_END_EVENT: - level-- - } - if level == 0 { - return false - } - } - return true -} - -// Append a directive to the directives stack. -func yaml_emitter_append_tag_directive(emitter *yaml_emitter_t, value *yaml_tag_directive_t, allow_duplicates bool) bool { - for i := 0; i < len(emitter.tag_directives); i++ { - if bytes.Equal(value.handle, emitter.tag_directives[i].handle) { - if allow_duplicates { - return true - } - return yaml_emitter_set_emitter_error(emitter, "duplicate %TAG directive") - } - } - - // [Go] Do we actually need to copy this given garbage collection - // and the lack of deallocating destructors? - tag_copy := yaml_tag_directive_t{ - handle: make([]byte, len(value.handle)), - prefix: make([]byte, len(value.prefix)), - } - copy(tag_copy.handle, value.handle) - copy(tag_copy.prefix, value.prefix) - emitter.tag_directives = append(emitter.tag_directives, tag_copy) - return true -} - -// Increase the indentation level. -func yaml_emitter_increase_indent(emitter *yaml_emitter_t, flow, indentless bool) bool { - emitter.indents = append(emitter.indents, emitter.indent) - if emitter.indent < 0 { - if flow { - emitter.indent = emitter.best_indent - } else { - emitter.indent = 0 - } - } else if !indentless { - // [Go] This was changed so that indentations are more regular. - if emitter.states[len(emitter.states)-1] == yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE { - // The first indent inside a sequence will just skip the "- " indicator. - emitter.indent += 2 - } else { - // Everything else aligns to the chosen indentation. - emitter.indent = emitter.best_indent*((emitter.indent+emitter.best_indent)/emitter.best_indent) - } - } - return true -} - -// State dispatcher. -func yaml_emitter_state_machine(emitter *yaml_emitter_t, event *yaml_event_t) bool { - switch emitter.state { - default: - case yaml_EMIT_STREAM_START_STATE: - return yaml_emitter_emit_stream_start(emitter, event) - - case yaml_EMIT_FIRST_DOCUMENT_START_STATE: - return yaml_emitter_emit_document_start(emitter, event, true) - - case yaml_EMIT_DOCUMENT_START_STATE: - return yaml_emitter_emit_document_start(emitter, event, false) - - case yaml_EMIT_DOCUMENT_CONTENT_STATE: - return yaml_emitter_emit_document_content(emitter, event) - - case yaml_EMIT_DOCUMENT_END_STATE: - return yaml_emitter_emit_document_end(emitter, event) - - case yaml_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE: - return yaml_emitter_emit_flow_sequence_item(emitter, event, true, false) - - case yaml_EMIT_FLOW_SEQUENCE_TRAIL_ITEM_STATE: - return yaml_emitter_emit_flow_sequence_item(emitter, event, false, true) - - case yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE: - return yaml_emitter_emit_flow_sequence_item(emitter, event, false, false) - - case yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE: - return yaml_emitter_emit_flow_mapping_key(emitter, event, true, false) - - case yaml_EMIT_FLOW_MAPPING_TRAIL_KEY_STATE: - return yaml_emitter_emit_flow_mapping_key(emitter, event, false, true) - - case yaml_EMIT_FLOW_MAPPING_KEY_STATE: - return yaml_emitter_emit_flow_mapping_key(emitter, event, false, false) - - case yaml_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE: - return yaml_emitter_emit_flow_mapping_value(emitter, event, true) - - case yaml_EMIT_FLOW_MAPPING_VALUE_STATE: - return yaml_emitter_emit_flow_mapping_value(emitter, event, false) - - case yaml_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE: - return yaml_emitter_emit_block_sequence_item(emitter, event, true) - - case yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE: - return yaml_emitter_emit_block_sequence_item(emitter, event, false) - - case yaml_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE: - return yaml_emitter_emit_block_mapping_key(emitter, event, true) - - case yaml_EMIT_BLOCK_MAPPING_KEY_STATE: - return yaml_emitter_emit_block_mapping_key(emitter, event, false) - - case yaml_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE: - return yaml_emitter_emit_block_mapping_value(emitter, event, true) - - case yaml_EMIT_BLOCK_MAPPING_VALUE_STATE: - return yaml_emitter_emit_block_mapping_value(emitter, event, false) - - case yaml_EMIT_END_STATE: - return yaml_emitter_set_emitter_error(emitter, "expected nothing after STREAM-END") - } - panic("invalid emitter state") -} - -// Expect STREAM-START. -func yaml_emitter_emit_stream_start(emitter *yaml_emitter_t, event *yaml_event_t) bool { - if event.typ != yaml_STREAM_START_EVENT { - return yaml_emitter_set_emitter_error(emitter, "expected STREAM-START") - } - if emitter.encoding == yaml_ANY_ENCODING { - emitter.encoding = event.encoding - if emitter.encoding == yaml_ANY_ENCODING { - emitter.encoding = yaml_UTF8_ENCODING - } - } - if emitter.best_indent < 2 || emitter.best_indent > 9 { - emitter.best_indent = 2 - } - if emitter.best_width >= 0 && emitter.best_width <= emitter.best_indent*2 { - emitter.best_width = 80 - } - if emitter.best_width < 0 { - emitter.best_width = 1<<31 - 1 - } - if emitter.line_break == yaml_ANY_BREAK { - emitter.line_break = yaml_LN_BREAK - } - - emitter.indent = -1 - emitter.line = 0 - emitter.column = 0 - emitter.whitespace = true - emitter.indention = true - emitter.space_above = true - emitter.foot_indent = -1 - - if emitter.encoding != yaml_UTF8_ENCODING { - if !yaml_emitter_write_bom(emitter) { - return false - } - } - emitter.state = yaml_EMIT_FIRST_DOCUMENT_START_STATE - return true -} - -// Expect DOCUMENT-START or STREAM-END. -func yaml_emitter_emit_document_start(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool { - - if event.typ == yaml_DOCUMENT_START_EVENT { - - if event.version_directive != nil { - if !yaml_emitter_analyze_version_directive(emitter, event.version_directive) { - return false - } - } - - for i := 0; i < len(event.tag_directives); i++ { - tag_directive := &event.tag_directives[i] - if !yaml_emitter_analyze_tag_directive(emitter, tag_directive) { - return false - } - if !yaml_emitter_append_tag_directive(emitter, tag_directive, false) { - return false - } - } - - for i := 0; i < len(default_tag_directives); i++ { - tag_directive := &default_tag_directives[i] - if !yaml_emitter_append_tag_directive(emitter, tag_directive, true) { - return false - } - } - - implicit := event.implicit - if !first || emitter.canonical { - implicit = false - } - - if emitter.open_ended && (event.version_directive != nil || len(event.tag_directives) > 0) { - if !yaml_emitter_write_indicator(emitter, []byte("..."), true, false, false) { - return false - } - if !yaml_emitter_write_indent(emitter) { - return false - } - } - - if event.version_directive != nil { - implicit = false - if !yaml_emitter_write_indicator(emitter, []byte("%YAML"), true, false, false) { - return false - } - if !yaml_emitter_write_indicator(emitter, []byte("1.1"), true, false, false) { - return false - } - if !yaml_emitter_write_indent(emitter) { - return false - } - } - - if len(event.tag_directives) > 0 { - implicit = false - for i := 0; i < len(event.tag_directives); i++ { - tag_directive := &event.tag_directives[i] - if !yaml_emitter_write_indicator(emitter, []byte("%TAG"), true, false, false) { - return false - } - if !yaml_emitter_write_tag_handle(emitter, tag_directive.handle) { - return false - } - if !yaml_emitter_write_tag_content(emitter, tag_directive.prefix, true) { - return false - } - if !yaml_emitter_write_indent(emitter) { - return false - } - } - } - - if yaml_emitter_check_empty_document(emitter) { - implicit = false - } - if !implicit { - if !yaml_emitter_write_indent(emitter) { - return false - } - if !yaml_emitter_write_indicator(emitter, []byte("---"), true, false, false) { - return false - } - if emitter.canonical || true { - if !yaml_emitter_write_indent(emitter) { - return false - } - } - } - - if len(emitter.head_comment) > 0 { - if !yaml_emitter_process_head_comment(emitter) { - return false - } - if !put_break(emitter) { - return false - } - } - - emitter.state = yaml_EMIT_DOCUMENT_CONTENT_STATE - return true - } - - if event.typ == yaml_STREAM_END_EVENT { - if emitter.open_ended { - if !yaml_emitter_write_indicator(emitter, []byte("..."), true, false, false) { - return false - } - if !yaml_emitter_write_indent(emitter) { - return false - } - } - if !yaml_emitter_flush(emitter) { - return false - } - emitter.state = yaml_EMIT_END_STATE - return true - } - - return yaml_emitter_set_emitter_error(emitter, "expected DOCUMENT-START or STREAM-END") -} - -// Expect the root node. -func yaml_emitter_emit_document_content(emitter *yaml_emitter_t, event *yaml_event_t) bool { - emitter.states = append(emitter.states, yaml_EMIT_DOCUMENT_END_STATE) - - if !yaml_emitter_process_head_comment(emitter) { - return false - } - if !yaml_emitter_emit_node(emitter, event, true, false, false, false) { - return false - } - if !yaml_emitter_process_line_comment(emitter) { - return false - } - if !yaml_emitter_process_foot_comment(emitter) { - return false - } - return true -} - -// Expect DOCUMENT-END. -func yaml_emitter_emit_document_end(emitter *yaml_emitter_t, event *yaml_event_t) bool { - if event.typ != yaml_DOCUMENT_END_EVENT { - return yaml_emitter_set_emitter_error(emitter, "expected DOCUMENT-END") - } - // [Go] Force document foot separation. - emitter.foot_indent = 0 - if !yaml_emitter_process_foot_comment(emitter) { - return false - } - emitter.foot_indent = -1 - if !yaml_emitter_write_indent(emitter) { - return false - } - if !event.implicit { - // [Go] Allocate the slice elsewhere. - if !yaml_emitter_write_indicator(emitter, []byte("..."), true, false, false) { - return false - } - if !yaml_emitter_write_indent(emitter) { - return false - } - } - if !yaml_emitter_flush(emitter) { - return false - } - emitter.state = yaml_EMIT_DOCUMENT_START_STATE - emitter.tag_directives = emitter.tag_directives[:0] - return true -} - -// Expect a flow item node. -func yaml_emitter_emit_flow_sequence_item(emitter *yaml_emitter_t, event *yaml_event_t, first, trail bool) bool { - if first { - if !yaml_emitter_write_indicator(emitter, []byte{'['}, true, true, false) { - return false - } - if !yaml_emitter_increase_indent(emitter, true, false) { - return false - } - emitter.flow_level++ - } - - if event.typ == yaml_SEQUENCE_END_EVENT { - if emitter.canonical && !first && !trail { - if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { - return false - } - } - emitter.flow_level-- - emitter.indent = emitter.indents[len(emitter.indents)-1] - emitter.indents = emitter.indents[:len(emitter.indents)-1] - if emitter.column == 0 || emitter.canonical && !first { - if !yaml_emitter_write_indent(emitter) { - return false - } - } - if !yaml_emitter_write_indicator(emitter, []byte{']'}, false, false, false) { - return false - } - if !yaml_emitter_process_line_comment(emitter) { - return false - } - if !yaml_emitter_process_foot_comment(emitter) { - return false - } - emitter.state = emitter.states[len(emitter.states)-1] - emitter.states = emitter.states[:len(emitter.states)-1] - - return true - } - - if !first && !trail { - if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { - return false - } - } - - if !yaml_emitter_process_head_comment(emitter) { - return false - } - if emitter.column == 0 { - if !yaml_emitter_write_indent(emitter) { - return false - } - } - - if emitter.canonical || emitter.column > emitter.best_width { - if !yaml_emitter_write_indent(emitter) { - return false - } - } - if len(emitter.line_comment)+len(emitter.foot_comment)+len(emitter.tail_comment) > 0 { - emitter.states = append(emitter.states, yaml_EMIT_FLOW_SEQUENCE_TRAIL_ITEM_STATE) - } else { - emitter.states = append(emitter.states, yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE) - } - if !yaml_emitter_emit_node(emitter, event, false, true, false, false) { - return false - } - if len(emitter.line_comment)+len(emitter.foot_comment)+len(emitter.tail_comment) > 0 { - if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { - return false - } - } - if !yaml_emitter_process_line_comment(emitter) { - return false - } - if !yaml_emitter_process_foot_comment(emitter) { - return false - } - return true -} - -// Expect a flow key node. -func yaml_emitter_emit_flow_mapping_key(emitter *yaml_emitter_t, event *yaml_event_t, first, trail bool) bool { - if first { - if !yaml_emitter_write_indicator(emitter, []byte{'{'}, true, true, false) { - return false - } - if !yaml_emitter_increase_indent(emitter, true, false) { - return false - } - emitter.flow_level++ - } - - if event.typ == yaml_MAPPING_END_EVENT { - if (emitter.canonical || len(emitter.head_comment)+len(emitter.foot_comment)+len(emitter.tail_comment) > 0) && !first && !trail { - if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { - return false - } - } - if !yaml_emitter_process_head_comment(emitter) { - return false - } - emitter.flow_level-- - emitter.indent = emitter.indents[len(emitter.indents)-1] - emitter.indents = emitter.indents[:len(emitter.indents)-1] - if emitter.canonical && !first { - if !yaml_emitter_write_indent(emitter) { - return false - } - } - if !yaml_emitter_write_indicator(emitter, []byte{'}'}, false, false, false) { - return false - } - if !yaml_emitter_process_line_comment(emitter) { - return false - } - if !yaml_emitter_process_foot_comment(emitter) { - return false - } - emitter.state = emitter.states[len(emitter.states)-1] - emitter.states = emitter.states[:len(emitter.states)-1] - return true - } - - if !first && !trail { - if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { - return false - } - } - - if !yaml_emitter_process_head_comment(emitter) { - return false - } - - if emitter.column == 0 { - if !yaml_emitter_write_indent(emitter) { - return false - } - } - - if emitter.canonical || emitter.column > emitter.best_width { - if !yaml_emitter_write_indent(emitter) { - return false - } - } - - if !emitter.canonical && yaml_emitter_check_simple_key(emitter) { - emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE) - return yaml_emitter_emit_node(emitter, event, false, false, true, true) - } - if !yaml_emitter_write_indicator(emitter, []byte{'?'}, true, false, false) { - return false - } - emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_VALUE_STATE) - return yaml_emitter_emit_node(emitter, event, false, false, true, false) -} - -// Expect a flow value node. -func yaml_emitter_emit_flow_mapping_value(emitter *yaml_emitter_t, event *yaml_event_t, simple bool) bool { - if simple { - if !yaml_emitter_write_indicator(emitter, []byte{':'}, false, false, false) { - return false - } - } else { - if emitter.canonical || emitter.column > emitter.best_width { - if !yaml_emitter_write_indent(emitter) { - return false - } - } - if !yaml_emitter_write_indicator(emitter, []byte{':'}, true, false, false) { - return false - } - } - if len(emitter.line_comment)+len(emitter.foot_comment)+len(emitter.tail_comment) > 0 { - emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_TRAIL_KEY_STATE) - } else { - emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_KEY_STATE) - } - if !yaml_emitter_emit_node(emitter, event, false, false, true, false) { - return false - } - if len(emitter.line_comment)+len(emitter.foot_comment)+len(emitter.tail_comment) > 0 { - if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { - return false - } - } - if !yaml_emitter_process_line_comment(emitter) { - return false - } - if !yaml_emitter_process_foot_comment(emitter) { - return false - } - return true -} - -// Expect a block item node. -func yaml_emitter_emit_block_sequence_item(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool { - if first { - if !yaml_emitter_increase_indent(emitter, false, false) { - return false - } - } - if event.typ == yaml_SEQUENCE_END_EVENT { - emitter.indent = emitter.indents[len(emitter.indents)-1] - emitter.indents = emitter.indents[:len(emitter.indents)-1] - emitter.state = emitter.states[len(emitter.states)-1] - emitter.states = emitter.states[:len(emitter.states)-1] - return true - } - if !yaml_emitter_process_head_comment(emitter) { - return false - } - if !yaml_emitter_write_indent(emitter) { - return false - } - if !yaml_emitter_write_indicator(emitter, []byte{'-'}, true, false, true) { - return false - } - emitter.states = append(emitter.states, yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE) - if !yaml_emitter_emit_node(emitter, event, false, true, false, false) { - return false - } - if !yaml_emitter_process_line_comment(emitter) { - return false - } - if !yaml_emitter_process_foot_comment(emitter) { - return false - } - return true -} - -// Expect a block key node. -func yaml_emitter_emit_block_mapping_key(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool { - if first { - if !yaml_emitter_increase_indent(emitter, false, false) { - return false - } - } - if !yaml_emitter_process_head_comment(emitter) { - return false - } - if event.typ == yaml_MAPPING_END_EVENT { - emitter.indent = emitter.indents[len(emitter.indents)-1] - emitter.indents = emitter.indents[:len(emitter.indents)-1] - emitter.state = emitter.states[len(emitter.states)-1] - emitter.states = emitter.states[:len(emitter.states)-1] - return true - } - if !yaml_emitter_write_indent(emitter) { - return false - } - if len(emitter.line_comment) > 0 { - // [Go] A line comment was provided for the key. That's unusual as the - // scanner associates line comments with the value. Either way, - // save the line comment and render it appropriately later. - emitter.key_line_comment = emitter.line_comment - emitter.line_comment = nil - } - if yaml_emitter_check_simple_key(emitter) { - emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE) - return yaml_emitter_emit_node(emitter, event, false, false, true, true) - } - if !yaml_emitter_write_indicator(emitter, []byte{'?'}, true, false, true) { - return false - } - emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_VALUE_STATE) - return yaml_emitter_emit_node(emitter, event, false, false, true, false) -} - -// Expect a block value node. -func yaml_emitter_emit_block_mapping_value(emitter *yaml_emitter_t, event *yaml_event_t, simple bool) bool { - if simple { - if !yaml_emitter_write_indicator(emitter, []byte{':'}, false, false, false) { - return false - } - } else { - if !yaml_emitter_write_indent(emitter) { - return false - } - if !yaml_emitter_write_indicator(emitter, []byte{':'}, true, false, true) { - return false - } - } - if len(emitter.key_line_comment) > 0 { - // [Go] Line comments are generally associated with the value, but when there's - // no value on the same line as a mapping key they end up attached to the - // key itself. - if event.typ == yaml_SCALAR_EVENT { - if len(emitter.line_comment) == 0 { - // A scalar is coming and it has no line comments by itself yet, - // so just let it handle the line comment as usual. If it has a - // line comment, we can't have both so the one from the key is lost. - emitter.line_comment = emitter.key_line_comment - emitter.key_line_comment = nil - } - } else if event.sequence_style() != yaml_FLOW_SEQUENCE_STYLE && (event.typ == yaml_MAPPING_START_EVENT || event.typ == yaml_SEQUENCE_START_EVENT) { - // An indented block follows, so write the comment right now. - emitter.line_comment, emitter.key_line_comment = emitter.key_line_comment, emitter.line_comment - if !yaml_emitter_process_line_comment(emitter) { - return false - } - emitter.line_comment, emitter.key_line_comment = emitter.key_line_comment, emitter.line_comment - } - } - emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_KEY_STATE) - if !yaml_emitter_emit_node(emitter, event, false, false, true, false) { - return false - } - if !yaml_emitter_process_line_comment(emitter) { - return false - } - if !yaml_emitter_process_foot_comment(emitter) { - return false - } - return true -} - -func yaml_emitter_silent_nil_event(emitter *yaml_emitter_t, event *yaml_event_t) bool { - return event.typ == yaml_SCALAR_EVENT && event.implicit && !emitter.canonical && len(emitter.scalar_data.value) == 0 -} - -// Expect a node. -func yaml_emitter_emit_node(emitter *yaml_emitter_t, event *yaml_event_t, - root bool, sequence bool, mapping bool, simple_key bool) bool { - - emitter.root_context = root - emitter.sequence_context = sequence - emitter.mapping_context = mapping - emitter.simple_key_context = simple_key - - switch event.typ { - case yaml_ALIAS_EVENT: - return yaml_emitter_emit_alias(emitter, event) - case yaml_SCALAR_EVENT: - return yaml_emitter_emit_scalar(emitter, event) - case yaml_SEQUENCE_START_EVENT: - return yaml_emitter_emit_sequence_start(emitter, event) - case yaml_MAPPING_START_EVENT: - return yaml_emitter_emit_mapping_start(emitter, event) - default: - return yaml_emitter_set_emitter_error(emitter, - fmt.Sprintf("expected SCALAR, SEQUENCE-START, MAPPING-START, or ALIAS, but got %v", event.typ)) - } -} - -// Expect ALIAS. -func yaml_emitter_emit_alias(emitter *yaml_emitter_t, event *yaml_event_t) bool { - if !yaml_emitter_process_anchor(emitter) { - return false - } - emitter.state = emitter.states[len(emitter.states)-1] - emitter.states = emitter.states[:len(emitter.states)-1] - return true -} - -// Expect SCALAR. -func yaml_emitter_emit_scalar(emitter *yaml_emitter_t, event *yaml_event_t) bool { - if !yaml_emitter_select_scalar_style(emitter, event) { - return false - } - if !yaml_emitter_process_anchor(emitter) { - return false - } - if !yaml_emitter_process_tag(emitter) { - return false - } - if !yaml_emitter_increase_indent(emitter, true, false) { - return false - } - if !yaml_emitter_process_scalar(emitter) { - return false - } - emitter.indent = emitter.indents[len(emitter.indents)-1] - emitter.indents = emitter.indents[:len(emitter.indents)-1] - emitter.state = emitter.states[len(emitter.states)-1] - emitter.states = emitter.states[:len(emitter.states)-1] - return true -} - -// Expect SEQUENCE-START. -func yaml_emitter_emit_sequence_start(emitter *yaml_emitter_t, event *yaml_event_t) bool { - if !yaml_emitter_process_anchor(emitter) { - return false - } - if !yaml_emitter_process_tag(emitter) { - return false - } - if emitter.flow_level > 0 || emitter.canonical || event.sequence_style() == yaml_FLOW_SEQUENCE_STYLE || - yaml_emitter_check_empty_sequence(emitter) { - emitter.state = yaml_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE - } else { - emitter.state = yaml_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE - } - return true -} - -// Expect MAPPING-START. -func yaml_emitter_emit_mapping_start(emitter *yaml_emitter_t, event *yaml_event_t) bool { - if !yaml_emitter_process_anchor(emitter) { - return false - } - if !yaml_emitter_process_tag(emitter) { - return false - } - if emitter.flow_level > 0 || emitter.canonical || event.mapping_style() == yaml_FLOW_MAPPING_STYLE || - yaml_emitter_check_empty_mapping(emitter) { - emitter.state = yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE - } else { - emitter.state = yaml_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE - } - return true -} - -// Check if the document content is an empty scalar. -func yaml_emitter_check_empty_document(emitter *yaml_emitter_t) bool { - return false // [Go] Huh? -} - -// Check if the next events represent an empty sequence. -func yaml_emitter_check_empty_sequence(emitter *yaml_emitter_t) bool { - if len(emitter.events)-emitter.events_head < 2 { - return false - } - return emitter.events[emitter.events_head].typ == yaml_SEQUENCE_START_EVENT && - emitter.events[emitter.events_head+1].typ == yaml_SEQUENCE_END_EVENT -} - -// Check if the next events represent an empty mapping. -func yaml_emitter_check_empty_mapping(emitter *yaml_emitter_t) bool { - if len(emitter.events)-emitter.events_head < 2 { - return false - } - return emitter.events[emitter.events_head].typ == yaml_MAPPING_START_EVENT && - emitter.events[emitter.events_head+1].typ == yaml_MAPPING_END_EVENT -} - -// Check if the next node can be expressed as a simple key. -func yaml_emitter_check_simple_key(emitter *yaml_emitter_t) bool { - length := 0 - switch emitter.events[emitter.events_head].typ { - case yaml_ALIAS_EVENT: - length += len(emitter.anchor_data.anchor) - case yaml_SCALAR_EVENT: - if emitter.scalar_data.multiline { - return false - } - length += len(emitter.anchor_data.anchor) + - len(emitter.tag_data.handle) + - len(emitter.tag_data.suffix) + - len(emitter.scalar_data.value) - case yaml_SEQUENCE_START_EVENT: - if !yaml_emitter_check_empty_sequence(emitter) { - return false - } - length += len(emitter.anchor_data.anchor) + - len(emitter.tag_data.handle) + - len(emitter.tag_data.suffix) - case yaml_MAPPING_START_EVENT: - if !yaml_emitter_check_empty_mapping(emitter) { - return false - } - length += len(emitter.anchor_data.anchor) + - len(emitter.tag_data.handle) + - len(emitter.tag_data.suffix) - default: - return false - } - return length <= 128 -} - -// Determine an acceptable scalar style. -func yaml_emitter_select_scalar_style(emitter *yaml_emitter_t, event *yaml_event_t) bool { - - no_tag := len(emitter.tag_data.handle) == 0 && len(emitter.tag_data.suffix) == 0 - if no_tag && !event.implicit && !event.quoted_implicit { - return yaml_emitter_set_emitter_error(emitter, "neither tag nor implicit flags are specified") - } - - style := event.scalar_style() - if style == yaml_ANY_SCALAR_STYLE { - style = yaml_PLAIN_SCALAR_STYLE - } - if emitter.canonical { - style = yaml_DOUBLE_QUOTED_SCALAR_STYLE - } - if emitter.simple_key_context && emitter.scalar_data.multiline { - style = yaml_DOUBLE_QUOTED_SCALAR_STYLE - } - - if style == yaml_PLAIN_SCALAR_STYLE { - if emitter.flow_level > 0 && !emitter.scalar_data.flow_plain_allowed || - emitter.flow_level == 0 && !emitter.scalar_data.block_plain_allowed { - style = yaml_SINGLE_QUOTED_SCALAR_STYLE - } - if len(emitter.scalar_data.value) == 0 && (emitter.flow_level > 0 || emitter.simple_key_context) { - style = yaml_SINGLE_QUOTED_SCALAR_STYLE - } - if no_tag && !event.implicit { - style = yaml_SINGLE_QUOTED_SCALAR_STYLE - } - } - if style == yaml_SINGLE_QUOTED_SCALAR_STYLE { - if !emitter.scalar_data.single_quoted_allowed { - style = yaml_DOUBLE_QUOTED_SCALAR_STYLE - } - } - if style == yaml_LITERAL_SCALAR_STYLE || style == yaml_FOLDED_SCALAR_STYLE { - if !emitter.scalar_data.block_allowed || emitter.flow_level > 0 || emitter.simple_key_context { - style = yaml_DOUBLE_QUOTED_SCALAR_STYLE - } - } - - if no_tag && !event.quoted_implicit && style != yaml_PLAIN_SCALAR_STYLE { - emitter.tag_data.handle = []byte{'!'} - } - emitter.scalar_data.style = style - return true -} - -// Write an anchor. -func yaml_emitter_process_anchor(emitter *yaml_emitter_t) bool { - if emitter.anchor_data.anchor == nil { - return true - } - c := []byte{'&'} - if emitter.anchor_data.alias { - c[0] = '*' - } - if !yaml_emitter_write_indicator(emitter, c, true, false, false) { - return false - } - return yaml_emitter_write_anchor(emitter, emitter.anchor_data.anchor) -} - -// Write a tag. -func yaml_emitter_process_tag(emitter *yaml_emitter_t) bool { - if len(emitter.tag_data.handle) == 0 && len(emitter.tag_data.suffix) == 0 { - return true - } - if len(emitter.tag_data.handle) > 0 { - if !yaml_emitter_write_tag_handle(emitter, emitter.tag_data.handle) { - return false - } - if len(emitter.tag_data.suffix) > 0 { - if !yaml_emitter_write_tag_content(emitter, emitter.tag_data.suffix, false) { - return false - } - } - } else { - // [Go] Allocate these slices elsewhere. - if !yaml_emitter_write_indicator(emitter, []byte("!<"), true, false, false) { - return false - } - if !yaml_emitter_write_tag_content(emitter, emitter.tag_data.suffix, false) { - return false - } - if !yaml_emitter_write_indicator(emitter, []byte{'>'}, false, false, false) { - return false - } - } - return true -} - -// Write a scalar. -func yaml_emitter_process_scalar(emitter *yaml_emitter_t) bool { - switch emitter.scalar_data.style { - case yaml_PLAIN_SCALAR_STYLE: - return yaml_emitter_write_plain_scalar(emitter, emitter.scalar_data.value, !emitter.simple_key_context) - - case yaml_SINGLE_QUOTED_SCALAR_STYLE: - return yaml_emitter_write_single_quoted_scalar(emitter, emitter.scalar_data.value, !emitter.simple_key_context) - - case yaml_DOUBLE_QUOTED_SCALAR_STYLE: - return yaml_emitter_write_double_quoted_scalar(emitter, emitter.scalar_data.value, !emitter.simple_key_context) - - case yaml_LITERAL_SCALAR_STYLE: - return yaml_emitter_write_literal_scalar(emitter, emitter.scalar_data.value) - - case yaml_FOLDED_SCALAR_STYLE: - return yaml_emitter_write_folded_scalar(emitter, emitter.scalar_data.value) - } - panic("unknown scalar style") -} - -// Write a head comment. -func yaml_emitter_process_head_comment(emitter *yaml_emitter_t) bool { - if len(emitter.tail_comment) > 0 { - if !yaml_emitter_write_indent(emitter) { - return false - } - if !yaml_emitter_write_comment(emitter, emitter.tail_comment) { - return false - } - emitter.tail_comment = emitter.tail_comment[:0] - emitter.foot_indent = emitter.indent - if emitter.foot_indent < 0 { - emitter.foot_indent = 0 - } - } - - if len(emitter.head_comment) == 0 { - return true - } - if !yaml_emitter_write_indent(emitter) { - return false - } - if !yaml_emitter_write_comment(emitter, emitter.head_comment) { - return false - } - emitter.head_comment = emitter.head_comment[:0] - return true -} - -// Write an line comment. -func yaml_emitter_process_line_comment(emitter *yaml_emitter_t) bool { - if len(emitter.line_comment) == 0 { - return true - } - if !emitter.whitespace { - if !put(emitter, ' ') { - return false - } - } - if !yaml_emitter_write_comment(emitter, emitter.line_comment) { - return false - } - emitter.line_comment = emitter.line_comment[:0] - return true -} - -// Write a foot comment. -func yaml_emitter_process_foot_comment(emitter *yaml_emitter_t) bool { - if len(emitter.foot_comment) == 0 { - return true - } - if !yaml_emitter_write_indent(emitter) { - return false - } - if !yaml_emitter_write_comment(emitter, emitter.foot_comment) { - return false - } - emitter.foot_comment = emitter.foot_comment[:0] - emitter.foot_indent = emitter.indent - if emitter.foot_indent < 0 { - emitter.foot_indent = 0 - } - return true -} - -// Check if a %YAML directive is valid. -func yaml_emitter_analyze_version_directive(emitter *yaml_emitter_t, version_directive *yaml_version_directive_t) bool { - if version_directive.major != 1 || version_directive.minor != 1 { - return yaml_emitter_set_emitter_error(emitter, "incompatible %YAML directive") - } - return true -} - -// Check if a %TAG directive is valid. -func yaml_emitter_analyze_tag_directive(emitter *yaml_emitter_t, tag_directive *yaml_tag_directive_t) bool { - handle := tag_directive.handle - prefix := tag_directive.prefix - if len(handle) == 0 { - return yaml_emitter_set_emitter_error(emitter, "tag handle must not be empty") - } - if handle[0] != '!' { - return yaml_emitter_set_emitter_error(emitter, "tag handle must start with '!'") - } - if handle[len(handle)-1] != '!' { - return yaml_emitter_set_emitter_error(emitter, "tag handle must end with '!'") - } - for i := 1; i < len(handle)-1; i += width(handle[i]) { - if !is_alpha(handle, i) { - return yaml_emitter_set_emitter_error(emitter, "tag handle must contain alphanumerical characters only") - } - } - if len(prefix) == 0 { - return yaml_emitter_set_emitter_error(emitter, "tag prefix must not be empty") - } - return true -} - -// Check if an anchor is valid. -func yaml_emitter_analyze_anchor(emitter *yaml_emitter_t, anchor []byte, alias bool) bool { - if len(anchor) == 0 { - problem := "anchor value must not be empty" - if alias { - problem = "alias value must not be empty" - } - return yaml_emitter_set_emitter_error(emitter, problem) - } - for i := 0; i < len(anchor); i += width(anchor[i]) { - if !is_alpha(anchor, i) { - problem := "anchor value must contain alphanumerical characters only" - if alias { - problem = "alias value must contain alphanumerical characters only" - } - return yaml_emitter_set_emitter_error(emitter, problem) - } - } - emitter.anchor_data.anchor = anchor - emitter.anchor_data.alias = alias - return true -} - -// Check if a tag is valid. -func yaml_emitter_analyze_tag(emitter *yaml_emitter_t, tag []byte) bool { - if len(tag) == 0 { - return yaml_emitter_set_emitter_error(emitter, "tag value must not be empty") - } - for i := 0; i < len(emitter.tag_directives); i++ { - tag_directive := &emitter.tag_directives[i] - if bytes.HasPrefix(tag, tag_directive.prefix) { - emitter.tag_data.handle = tag_directive.handle - emitter.tag_data.suffix = tag[len(tag_directive.prefix):] - return true - } - } - emitter.tag_data.suffix = tag - return true -} - -// Check if a scalar is valid. -func yaml_emitter_analyze_scalar(emitter *yaml_emitter_t, value []byte) bool { - var ( - block_indicators = false - flow_indicators = false - line_breaks = false - special_characters = false - tab_characters = false - - leading_space = false - leading_break = false - trailing_space = false - trailing_break = false - break_space = false - space_break = false - - preceded_by_whitespace = false - followed_by_whitespace = false - previous_space = false - previous_break = false - ) - - emitter.scalar_data.value = value - - if len(value) == 0 { - emitter.scalar_data.multiline = false - emitter.scalar_data.flow_plain_allowed = false - emitter.scalar_data.block_plain_allowed = true - emitter.scalar_data.single_quoted_allowed = true - emitter.scalar_data.block_allowed = false - return true - } - - if len(value) >= 3 && ((value[0] == '-' && value[1] == '-' && value[2] == '-') || (value[0] == '.' && value[1] == '.' && value[2] == '.')) { - block_indicators = true - flow_indicators = true - } - - preceded_by_whitespace = true - for i, w := 0, 0; i < len(value); i += w { - w = width(value[i]) - followed_by_whitespace = i+w >= len(value) || is_blank(value, i+w) - - if i == 0 { - switch value[i] { - case '#', ',', '[', ']', '{', '}', '&', '*', '!', '|', '>', '\'', '"', '%', '@', '`': - flow_indicators = true - block_indicators = true - case '?', ':': - flow_indicators = true - if followed_by_whitespace { - block_indicators = true - } - case '-': - if followed_by_whitespace { - flow_indicators = true - block_indicators = true - } - } - } else { - switch value[i] { - case ',', '?', '[', ']', '{', '}': - flow_indicators = true - case ':': - flow_indicators = true - if followed_by_whitespace { - block_indicators = true - } - case '#': - if preceded_by_whitespace { - flow_indicators = true - block_indicators = true - } - } - } - - if value[i] == '\t' { - tab_characters = true - } else if !is_printable(value, i) || !is_ascii(value, i) && !emitter.unicode { - special_characters = true - } - if is_space(value, i) { - if i == 0 { - leading_space = true - } - if i+width(value[i]) == len(value) { - trailing_space = true - } - if previous_break { - break_space = true - } - previous_space = true - previous_break = false - } else if is_break(value, i) { - line_breaks = true - if i == 0 { - leading_break = true - } - if i+width(value[i]) == len(value) { - trailing_break = true - } - if previous_space { - space_break = true - } - previous_space = false - previous_break = true - } else { - previous_space = false - previous_break = false - } - - // [Go]: Why 'z'? Couldn't be the end of the string as that's the loop condition. - preceded_by_whitespace = is_blankz(value, i) - } - - emitter.scalar_data.multiline = line_breaks - emitter.scalar_data.flow_plain_allowed = true - emitter.scalar_data.block_plain_allowed = true - emitter.scalar_data.single_quoted_allowed = true - emitter.scalar_data.block_allowed = true - - if leading_space || leading_break || trailing_space || trailing_break { - emitter.scalar_data.flow_plain_allowed = false - emitter.scalar_data.block_plain_allowed = false - } - if trailing_space { - emitter.scalar_data.block_allowed = false - } - if break_space { - emitter.scalar_data.flow_plain_allowed = false - emitter.scalar_data.block_plain_allowed = false - emitter.scalar_data.single_quoted_allowed = false - } - if space_break || tab_characters || special_characters { - emitter.scalar_data.flow_plain_allowed = false - emitter.scalar_data.block_plain_allowed = false - emitter.scalar_data.single_quoted_allowed = false - } - if space_break || special_characters { - emitter.scalar_data.block_allowed = false - } - if line_breaks { - emitter.scalar_data.flow_plain_allowed = false - emitter.scalar_data.block_plain_allowed = false - } - if flow_indicators { - emitter.scalar_data.flow_plain_allowed = false - } - if block_indicators { - emitter.scalar_data.block_plain_allowed = false - } - return true -} - -// Check if the event data is valid. -func yaml_emitter_analyze_event(emitter *yaml_emitter_t, event *yaml_event_t) bool { - - emitter.anchor_data.anchor = nil - emitter.tag_data.handle = nil - emitter.tag_data.suffix = nil - emitter.scalar_data.value = nil - - if len(event.head_comment) > 0 { - emitter.head_comment = event.head_comment - } - if len(event.line_comment) > 0 { - emitter.line_comment = event.line_comment - } - if len(event.foot_comment) > 0 { - emitter.foot_comment = event.foot_comment - } - if len(event.tail_comment) > 0 { - emitter.tail_comment = event.tail_comment - } - - switch event.typ { - case yaml_ALIAS_EVENT: - if !yaml_emitter_analyze_anchor(emitter, event.anchor, true) { - return false - } - - case yaml_SCALAR_EVENT: - if len(event.anchor) > 0 { - if !yaml_emitter_analyze_anchor(emitter, event.anchor, false) { - return false - } - } - if len(event.tag) > 0 && (emitter.canonical || (!event.implicit && !event.quoted_implicit)) { - if !yaml_emitter_analyze_tag(emitter, event.tag) { - return false - } - } - if !yaml_emitter_analyze_scalar(emitter, event.value) { - return false - } - - case yaml_SEQUENCE_START_EVENT: - if len(event.anchor) > 0 { - if !yaml_emitter_analyze_anchor(emitter, event.anchor, false) { - return false - } - } - if len(event.tag) > 0 && (emitter.canonical || !event.implicit) { - if !yaml_emitter_analyze_tag(emitter, event.tag) { - return false - } - } - - case yaml_MAPPING_START_EVENT: - if len(event.anchor) > 0 { - if !yaml_emitter_analyze_anchor(emitter, event.anchor, false) { - return false - } - } - if len(event.tag) > 0 && (emitter.canonical || !event.implicit) { - if !yaml_emitter_analyze_tag(emitter, event.tag) { - return false - } - } - } - return true -} - -// Write the BOM character. -func yaml_emitter_write_bom(emitter *yaml_emitter_t) bool { - if !flush(emitter) { - return false - } - pos := emitter.buffer_pos - emitter.buffer[pos+0] = '\xEF' - emitter.buffer[pos+1] = '\xBB' - emitter.buffer[pos+2] = '\xBF' - emitter.buffer_pos += 3 - return true -} - -func yaml_emitter_write_indent(emitter *yaml_emitter_t) bool { - indent := emitter.indent - if indent < 0 { - indent = 0 - } - if !emitter.indention || emitter.column > indent || (emitter.column == indent && !emitter.whitespace) { - if !put_break(emitter) { - return false - } - } - if emitter.foot_indent == indent { - if !put_break(emitter) { - return false - } - } - for emitter.column < indent { - if !put(emitter, ' ') { - return false - } - } - emitter.whitespace = true - //emitter.indention = true - emitter.space_above = false - emitter.foot_indent = -1 - return true -} - -func yaml_emitter_write_indicator(emitter *yaml_emitter_t, indicator []byte, need_whitespace, is_whitespace, is_indention bool) bool { - if need_whitespace && !emitter.whitespace { - if !put(emitter, ' ') { - return false - } - } - if !write_all(emitter, indicator) { - return false - } - emitter.whitespace = is_whitespace - emitter.indention = (emitter.indention && is_indention) - emitter.open_ended = false - return true -} - -func yaml_emitter_write_anchor(emitter *yaml_emitter_t, value []byte) bool { - if !write_all(emitter, value) { - return false - } - emitter.whitespace = false - emitter.indention = false - return true -} - -func yaml_emitter_write_tag_handle(emitter *yaml_emitter_t, value []byte) bool { - if !emitter.whitespace { - if !put(emitter, ' ') { - return false - } - } - if !write_all(emitter, value) { - return false - } - emitter.whitespace = false - emitter.indention = false - return true -} - -func yaml_emitter_write_tag_content(emitter *yaml_emitter_t, value []byte, need_whitespace bool) bool { - if need_whitespace && !emitter.whitespace { - if !put(emitter, ' ') { - return false - } - } - for i := 0; i < len(value); { - var must_write bool - switch value[i] { - case ';', '/', '?', ':', '@', '&', '=', '+', '$', ',', '_', '.', '~', '*', '\'', '(', ')', '[', ']': - must_write = true - default: - must_write = is_alpha(value, i) - } - if must_write { - if !write(emitter, value, &i) { - return false - } - } else { - w := width(value[i]) - for k := 0; k < w; k++ { - octet := value[i] - i++ - if !put(emitter, '%') { - return false - } - - c := octet >> 4 - if c < 10 { - c += '0' - } else { - c += 'A' - 10 - } - if !put(emitter, c) { - return false - } - - c = octet & 0x0f - if c < 10 { - c += '0' - } else { - c += 'A' - 10 - } - if !put(emitter, c) { - return false - } - } - } - } - emitter.whitespace = false - emitter.indention = false - return true -} - -func yaml_emitter_write_plain_scalar(emitter *yaml_emitter_t, value []byte, allow_breaks bool) bool { - if len(value) > 0 && !emitter.whitespace { - if !put(emitter, ' ') { - return false - } - } - - spaces := false - breaks := false - for i := 0; i < len(value); { - if is_space(value, i) { - if allow_breaks && !spaces && emitter.column > emitter.best_width && !is_space(value, i+1) { - if !yaml_emitter_write_indent(emitter) { - return false - } - i += width(value[i]) - } else { - if !write(emitter, value, &i) { - return false - } - } - spaces = true - } else if is_break(value, i) { - if !breaks && value[i] == '\n' { - if !put_break(emitter) { - return false - } - } - if !write_break(emitter, value, &i) { - return false - } - //emitter.indention = true - breaks = true - } else { - if breaks { - if !yaml_emitter_write_indent(emitter) { - return false - } - } - if !write(emitter, value, &i) { - return false - } - emitter.indention = false - spaces = false - breaks = false - } - } - - if len(value) > 0 { - emitter.whitespace = false - } - emitter.indention = false - if emitter.root_context { - emitter.open_ended = true - } - - return true -} - -func yaml_emitter_write_single_quoted_scalar(emitter *yaml_emitter_t, value []byte, allow_breaks bool) bool { - - if !yaml_emitter_write_indicator(emitter, []byte{'\''}, true, false, false) { - return false - } - - spaces := false - breaks := false - for i := 0; i < len(value); { - if is_space(value, i) { - if allow_breaks && !spaces && emitter.column > emitter.best_width && i > 0 && i < len(value)-1 && !is_space(value, i+1) { - if !yaml_emitter_write_indent(emitter) { - return false - } - i += width(value[i]) - } else { - if !write(emitter, value, &i) { - return false - } - } - spaces = true - } else if is_break(value, i) { - if !breaks && value[i] == '\n' { - if !put_break(emitter) { - return false - } - } - if !write_break(emitter, value, &i) { - return false - } - //emitter.indention = true - breaks = true - } else { - if breaks { - if !yaml_emitter_write_indent(emitter) { - return false - } - } - if value[i] == '\'' { - if !put(emitter, '\'') { - return false - } - } - if !write(emitter, value, &i) { - return false - } - emitter.indention = false - spaces = false - breaks = false - } - } - if !yaml_emitter_write_indicator(emitter, []byte{'\''}, false, false, false) { - return false - } - emitter.whitespace = false - emitter.indention = false - return true -} - -func yaml_emitter_write_double_quoted_scalar(emitter *yaml_emitter_t, value []byte, allow_breaks bool) bool { - spaces := false - if !yaml_emitter_write_indicator(emitter, []byte{'"'}, true, false, false) { - return false - } - - for i := 0; i < len(value); { - if !is_printable(value, i) || (!emitter.unicode && !is_ascii(value, i)) || - is_bom(value, i) || is_break(value, i) || - value[i] == '"' || value[i] == '\\' { - - octet := value[i] - - var w int - var v rune - switch { - case octet&0x80 == 0x00: - w, v = 1, rune(octet&0x7F) - case octet&0xE0 == 0xC0: - w, v = 2, rune(octet&0x1F) - case octet&0xF0 == 0xE0: - w, v = 3, rune(octet&0x0F) - case octet&0xF8 == 0xF0: - w, v = 4, rune(octet&0x07) - } - for k := 1; k < w; k++ { - octet = value[i+k] - v = (v << 6) + (rune(octet) & 0x3F) - } - i += w - - if !put(emitter, '\\') { - return false - } - - var ok bool - switch v { - case 0x00: - ok = put(emitter, '0') - case 0x07: - ok = put(emitter, 'a') - case 0x08: - ok = put(emitter, 'b') - case 0x09: - ok = put(emitter, 't') - case 0x0A: - ok = put(emitter, 'n') - case 0x0b: - ok = put(emitter, 'v') - case 0x0c: - ok = put(emitter, 'f') - case 0x0d: - ok = put(emitter, 'r') - case 0x1b: - ok = put(emitter, 'e') - case 0x22: - ok = put(emitter, '"') - case 0x5c: - ok = put(emitter, '\\') - case 0x85: - ok = put(emitter, 'N') - case 0xA0: - ok = put(emitter, '_') - case 0x2028: - ok = put(emitter, 'L') - case 0x2029: - ok = put(emitter, 'P') - default: - if v <= 0xFF { - ok = put(emitter, 'x') - w = 2 - } else if v <= 0xFFFF { - ok = put(emitter, 'u') - w = 4 - } else { - ok = put(emitter, 'U') - w = 8 - } - for k := (w - 1) * 4; ok && k >= 0; k -= 4 { - digit := byte((v >> uint(k)) & 0x0F) - if digit < 10 { - ok = put(emitter, digit+'0') - } else { - ok = put(emitter, digit+'A'-10) - } - } - } - if !ok { - return false - } - spaces = false - } else if is_space(value, i) { - if allow_breaks && !spaces && emitter.column > emitter.best_width && i > 0 && i < len(value)-1 { - if !yaml_emitter_write_indent(emitter) { - return false - } - if is_space(value, i+1) { - if !put(emitter, '\\') { - return false - } - } - i += width(value[i]) - } else if !write(emitter, value, &i) { - return false - } - spaces = true - } else { - if !write(emitter, value, &i) { - return false - } - spaces = false - } - } - if !yaml_emitter_write_indicator(emitter, []byte{'"'}, false, false, false) { - return false - } - emitter.whitespace = false - emitter.indention = false - return true -} - -func yaml_emitter_write_block_scalar_hints(emitter *yaml_emitter_t, value []byte) bool { - if is_space(value, 0) || is_break(value, 0) { - indent_hint := []byte{'0' + byte(emitter.best_indent)} - if !yaml_emitter_write_indicator(emitter, indent_hint, false, false, false) { - return false - } - } - - emitter.open_ended = false - - var chomp_hint [1]byte - if len(value) == 0 { - chomp_hint[0] = '-' - } else { - i := len(value) - 1 - for value[i]&0xC0 == 0x80 { - i-- - } - if !is_break(value, i) { - chomp_hint[0] = '-' - } else if i == 0 { - chomp_hint[0] = '+' - emitter.open_ended = true - } else { - i-- - for value[i]&0xC0 == 0x80 { - i-- - } - if is_break(value, i) { - chomp_hint[0] = '+' - emitter.open_ended = true - } - } - } - if chomp_hint[0] != 0 { - if !yaml_emitter_write_indicator(emitter, chomp_hint[:], false, false, false) { - return false - } - } - return true -} - -func yaml_emitter_write_literal_scalar(emitter *yaml_emitter_t, value []byte) bool { - if !yaml_emitter_write_indicator(emitter, []byte{'|'}, true, false, false) { - return false - } - if !yaml_emitter_write_block_scalar_hints(emitter, value) { - return false - } - if !yaml_emitter_process_line_comment(emitter) { - return false - } - //emitter.indention = true - emitter.whitespace = true - breaks := true - for i := 0; i < len(value); { - if is_break(value, i) { - if !write_break(emitter, value, &i) { - return false - } - //emitter.indention = true - breaks = true - } else { - if breaks { - if !yaml_emitter_write_indent(emitter) { - return false - } - } - if !write(emitter, value, &i) { - return false - } - emitter.indention = false - breaks = false - } - } - - return true -} - -func yaml_emitter_write_folded_scalar(emitter *yaml_emitter_t, value []byte) bool { - if !yaml_emitter_write_indicator(emitter, []byte{'>'}, true, false, false) { - return false - } - if !yaml_emitter_write_block_scalar_hints(emitter, value) { - return false - } - if !yaml_emitter_process_line_comment(emitter) { - return false - } - - //emitter.indention = true - emitter.whitespace = true - - breaks := true - leading_spaces := true - for i := 0; i < len(value); { - if is_break(value, i) { - if !breaks && !leading_spaces && value[i] == '\n' { - k := 0 - for is_break(value, k) { - k += width(value[k]) - } - if !is_blankz(value, k) { - if !put_break(emitter) { - return false - } - } - } - if !write_break(emitter, value, &i) { - return false - } - //emitter.indention = true - breaks = true - } else { - if breaks { - if !yaml_emitter_write_indent(emitter) { - return false - } - leading_spaces = is_blank(value, i) - } - if !breaks && is_space(value, i) && !is_space(value, i+1) && emitter.column > emitter.best_width { - if !yaml_emitter_write_indent(emitter) { - return false - } - i += width(value[i]) - } else { - if !write(emitter, value, &i) { - return false - } - } - emitter.indention = false - breaks = false - } - } - return true -} - -func yaml_emitter_write_comment(emitter *yaml_emitter_t, comment []byte) bool { - breaks := false - pound := false - for i := 0; i < len(comment); { - if is_break(comment, i) { - if !write_break(emitter, comment, &i) { - return false - } - //emitter.indention = true - breaks = true - pound = false - } else { - if breaks && !yaml_emitter_write_indent(emitter) { - return false - } - if !pound { - if comment[i] != '#' && (!put(emitter, '#') || !put(emitter, ' ')) { - return false - } - pound = true - } - if !write(emitter, comment, &i) { - return false - } - emitter.indention = false - breaks = false - } - } - if !breaks && !put_break(emitter) { - return false - } - - emitter.whitespace = true - //emitter.indention = true - return true -} diff --git a/vendor/gopkg.in/yaml.v3/encode.go b/vendor/gopkg.in/yaml.v3/encode.go deleted file mode 100644 index de9e72a..0000000 --- a/vendor/gopkg.in/yaml.v3/encode.go +++ /dev/null @@ -1,577 +0,0 @@ -// -// Copyright (c) 2011-2019 Canonical Ltd -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package yaml - -import ( - "encoding" - "fmt" - "io" - "reflect" - "regexp" - "sort" - "strconv" - "strings" - "time" - "unicode/utf8" -) - -type encoder struct { - emitter yaml_emitter_t - event yaml_event_t - out []byte - flow bool - indent int - doneInit bool -} - -func newEncoder() *encoder { - e := &encoder{} - yaml_emitter_initialize(&e.emitter) - yaml_emitter_set_output_string(&e.emitter, &e.out) - yaml_emitter_set_unicode(&e.emitter, true) - return e -} - -func newEncoderWithWriter(w io.Writer) *encoder { - e := &encoder{} - yaml_emitter_initialize(&e.emitter) - yaml_emitter_set_output_writer(&e.emitter, w) - yaml_emitter_set_unicode(&e.emitter, true) - return e -} - -func (e *encoder) init() { - if e.doneInit { - return - } - if e.indent == 0 { - e.indent = 4 - } - e.emitter.best_indent = e.indent - yaml_stream_start_event_initialize(&e.event, yaml_UTF8_ENCODING) - e.emit() - e.doneInit = true -} - -func (e *encoder) finish() { - e.emitter.open_ended = false - yaml_stream_end_event_initialize(&e.event) - e.emit() -} - -func (e *encoder) destroy() { - yaml_emitter_delete(&e.emitter) -} - -func (e *encoder) emit() { - // This will internally delete the e.event value. - e.must(yaml_emitter_emit(&e.emitter, &e.event)) -} - -func (e *encoder) must(ok bool) { - if !ok { - msg := e.emitter.problem - if msg == "" { - msg = "unknown problem generating YAML content" - } - failf("%s", msg) - } -} - -func (e *encoder) marshalDoc(tag string, in reflect.Value) { - e.init() - var node *Node - if in.IsValid() { - node, _ = in.Interface().(*Node) - } - if node != nil && node.Kind == DocumentNode { - e.nodev(in) - } else { - yaml_document_start_event_initialize(&e.event, nil, nil, true) - e.emit() - e.marshal(tag, in) - yaml_document_end_event_initialize(&e.event, true) - e.emit() - } -} - -func (e *encoder) marshal(tag string, in reflect.Value) { - tag = shortTag(tag) - if !in.IsValid() || in.Kind() == reflect.Ptr && in.IsNil() { - e.nilv() - return - } - iface := in.Interface() - switch value := iface.(type) { - case *Node: - e.nodev(in) - return - case Node: - if !in.CanAddr() { - var n = reflect.New(in.Type()).Elem() - n.Set(in) - in = n - } - e.nodev(in.Addr()) - return - case time.Time: - e.timev(tag, in) - return - case *time.Time: - e.timev(tag, in.Elem()) - return - case time.Duration: - e.stringv(tag, reflect.ValueOf(value.String())) - return - case Marshaler: - v, err := value.MarshalYAML() - if err != nil { - fail(err) - } - if v == nil { - e.nilv() - return - } - e.marshal(tag, reflect.ValueOf(v)) - return - case encoding.TextMarshaler: - text, err := value.MarshalText() - if err != nil { - fail(err) - } - in = reflect.ValueOf(string(text)) - case nil: - e.nilv() - return - } - switch in.Kind() { - case reflect.Interface: - e.marshal(tag, in.Elem()) - case reflect.Map: - e.mapv(tag, in) - case reflect.Ptr: - e.marshal(tag, in.Elem()) - case reflect.Struct: - e.structv(tag, in) - case reflect.Slice, reflect.Array: - e.slicev(tag, in) - case reflect.String: - e.stringv(tag, in) - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - e.intv(tag, in) - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - e.uintv(tag, in) - case reflect.Float32, reflect.Float64: - e.floatv(tag, in) - case reflect.Bool: - e.boolv(tag, in) - default: - panic("cannot marshal type: " + in.Type().String()) - } -} - -func (e *encoder) mapv(tag string, in reflect.Value) { - e.mappingv(tag, func() { - keys := keyList(in.MapKeys()) - sort.Sort(keys) - for _, k := range keys { - e.marshal("", k) - e.marshal("", in.MapIndex(k)) - } - }) -} - -func (e *encoder) fieldByIndex(v reflect.Value, index []int) (field reflect.Value) { - for _, num := range index { - for { - if v.Kind() == reflect.Ptr { - if v.IsNil() { - return reflect.Value{} - } - v = v.Elem() - continue - } - break - } - v = v.Field(num) - } - return v -} - -func (e *encoder) structv(tag string, in reflect.Value) { - sinfo, err := getStructInfo(in.Type()) - if err != nil { - panic(err) - } - e.mappingv(tag, func() { - for _, info := range sinfo.FieldsList { - var value reflect.Value - if info.Inline == nil { - value = in.Field(info.Num) - } else { - value = e.fieldByIndex(in, info.Inline) - if !value.IsValid() { - continue - } - } - if info.OmitEmpty && isZero(value) { - continue - } - e.marshal("", reflect.ValueOf(info.Key)) - e.flow = info.Flow - e.marshal("", value) - } - if sinfo.InlineMap >= 0 { - m := in.Field(sinfo.InlineMap) - if m.Len() > 0 { - e.flow = false - keys := keyList(m.MapKeys()) - sort.Sort(keys) - for _, k := range keys { - if _, found := sinfo.FieldsMap[k.String()]; found { - panic(fmt.Sprintf("cannot have key %q in inlined map: conflicts with struct field", k.String())) - } - e.marshal("", k) - e.flow = false - e.marshal("", m.MapIndex(k)) - } - } - } - }) -} - -func (e *encoder) mappingv(tag string, f func()) { - implicit := tag == "" - style := yaml_BLOCK_MAPPING_STYLE - if e.flow { - e.flow = false - style = yaml_FLOW_MAPPING_STYLE - } - yaml_mapping_start_event_initialize(&e.event, nil, []byte(tag), implicit, style) - e.emit() - f() - yaml_mapping_end_event_initialize(&e.event) - e.emit() -} - -func (e *encoder) slicev(tag string, in reflect.Value) { - implicit := tag == "" - style := yaml_BLOCK_SEQUENCE_STYLE - if e.flow { - e.flow = false - style = yaml_FLOW_SEQUENCE_STYLE - } - e.must(yaml_sequence_start_event_initialize(&e.event, nil, []byte(tag), implicit, style)) - e.emit() - n := in.Len() - for i := 0; i < n; i++ { - e.marshal("", in.Index(i)) - } - e.must(yaml_sequence_end_event_initialize(&e.event)) - e.emit() -} - -// isBase60 returns whether s is in base 60 notation as defined in YAML 1.1. -// -// The base 60 float notation in YAML 1.1 is a terrible idea and is unsupported -// in YAML 1.2 and by this package, but these should be marshalled quoted for -// the time being for compatibility with other parsers. -func isBase60Float(s string) (result bool) { - // Fast path. - if s == "" { - return false - } - c := s[0] - if !(c == '+' || c == '-' || c >= '0' && c <= '9') || strings.IndexByte(s, ':') < 0 { - return false - } - // Do the full match. - return base60float.MatchString(s) -} - -// From http://yaml.org/type/float.html, except the regular expression there -// is bogus. In practice parsers do not enforce the "\.[0-9_]*" suffix. -var base60float = regexp.MustCompile(`^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+(?:\.[0-9_]*)?$`) - -// isOldBool returns whether s is bool notation as defined in YAML 1.1. -// -// We continue to force strings that YAML 1.1 would interpret as booleans to be -// rendered as quotes strings so that the marshalled output valid for YAML 1.1 -// parsing. -func isOldBool(s string) (result bool) { - switch s { - case "y", "Y", "yes", "Yes", "YES", "on", "On", "ON", - "n", "N", "no", "No", "NO", "off", "Off", "OFF": - return true - default: - return false - } -} - -func (e *encoder) stringv(tag string, in reflect.Value) { - var style yaml_scalar_style_t - s := in.String() - canUsePlain := true - switch { - case !utf8.ValidString(s): - if tag == binaryTag { - failf("explicitly tagged !!binary data must be base64-encoded") - } - if tag != "" { - failf("cannot marshal invalid UTF-8 data as %s", shortTag(tag)) - } - // It can't be encoded directly as YAML so use a binary tag - // and encode it as base64. - tag = binaryTag - s = encodeBase64(s) - case tag == "": - // Check to see if it would resolve to a specific - // tag when encoded unquoted. If it doesn't, - // there's no need to quote it. - rtag, _ := resolve("", s) - canUsePlain = rtag == strTag && !(isBase60Float(s) || isOldBool(s)) - } - // Note: it's possible for user code to emit invalid YAML - // if they explicitly specify a tag and a string containing - // text that's incompatible with that tag. - switch { - case strings.Contains(s, "\n"): - if e.flow { - style = yaml_DOUBLE_QUOTED_SCALAR_STYLE - } else { - style = yaml_LITERAL_SCALAR_STYLE - } - case canUsePlain: - style = yaml_PLAIN_SCALAR_STYLE - default: - style = yaml_DOUBLE_QUOTED_SCALAR_STYLE - } - e.emitScalar(s, "", tag, style, nil, nil, nil, nil) -} - -func (e *encoder) boolv(tag string, in reflect.Value) { - var s string - if in.Bool() { - s = "true" - } else { - s = "false" - } - e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE, nil, nil, nil, nil) -} - -func (e *encoder) intv(tag string, in reflect.Value) { - s := strconv.FormatInt(in.Int(), 10) - e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE, nil, nil, nil, nil) -} - -func (e *encoder) uintv(tag string, in reflect.Value) { - s := strconv.FormatUint(in.Uint(), 10) - e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE, nil, nil, nil, nil) -} - -func (e *encoder) timev(tag string, in reflect.Value) { - t := in.Interface().(time.Time) - s := t.Format(time.RFC3339Nano) - e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE, nil, nil, nil, nil) -} - -func (e *encoder) floatv(tag string, in reflect.Value) { - // Issue #352: When formatting, use the precision of the underlying value - precision := 64 - if in.Kind() == reflect.Float32 { - precision = 32 - } - - s := strconv.FormatFloat(in.Float(), 'g', -1, precision) - switch s { - case "+Inf": - s = ".inf" - case "-Inf": - s = "-.inf" - case "NaN": - s = ".nan" - } - e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE, nil, nil, nil, nil) -} - -func (e *encoder) nilv() { - e.emitScalar("null", "", "", yaml_PLAIN_SCALAR_STYLE, nil, nil, nil, nil) -} - -func (e *encoder) emitScalar(value, anchor, tag string, style yaml_scalar_style_t, head, line, foot, tail []byte) { - // TODO Kill this function. Replace all initialize calls by their underlining Go literals. - implicit := tag == "" - if !implicit { - tag = longTag(tag) - } - e.must(yaml_scalar_event_initialize(&e.event, []byte(anchor), []byte(tag), []byte(value), implicit, implicit, style)) - e.event.head_comment = head - e.event.line_comment = line - e.event.foot_comment = foot - e.event.tail_comment = tail - e.emit() -} - -func (e *encoder) nodev(in reflect.Value) { - e.node(in.Interface().(*Node), "") -} - -func (e *encoder) node(node *Node, tail string) { - // Zero nodes behave as nil. - if node.Kind == 0 && node.IsZero() { - e.nilv() - return - } - - // If the tag was not explicitly requested, and dropping it won't change the - // implicit tag of the value, don't include it in the presentation. - var tag = node.Tag - var stag = shortTag(tag) - var forceQuoting bool - if tag != "" && node.Style&TaggedStyle == 0 { - if node.Kind == ScalarNode { - if stag == strTag && node.Style&(SingleQuotedStyle|DoubleQuotedStyle|LiteralStyle|FoldedStyle) != 0 { - tag = "" - } else { - rtag, _ := resolve("", node.Value) - if rtag == stag { - tag = "" - } else if stag == strTag { - tag = "" - forceQuoting = true - } - } - } else { - var rtag string - switch node.Kind { - case MappingNode: - rtag = mapTag - case SequenceNode: - rtag = seqTag - } - if rtag == stag { - tag = "" - } - } - } - - switch node.Kind { - case DocumentNode: - yaml_document_start_event_initialize(&e.event, nil, nil, true) - e.event.head_comment = []byte(node.HeadComment) - e.emit() - for _, node := range node.Content { - e.node(node, "") - } - yaml_document_end_event_initialize(&e.event, true) - e.event.foot_comment = []byte(node.FootComment) - e.emit() - - case SequenceNode: - style := yaml_BLOCK_SEQUENCE_STYLE - if node.Style&FlowStyle != 0 { - style = yaml_FLOW_SEQUENCE_STYLE - } - e.must(yaml_sequence_start_event_initialize(&e.event, []byte(node.Anchor), []byte(longTag(tag)), tag == "", style)) - e.event.head_comment = []byte(node.HeadComment) - e.emit() - for _, node := range node.Content { - e.node(node, "") - } - e.must(yaml_sequence_end_event_initialize(&e.event)) - e.event.line_comment = []byte(node.LineComment) - e.event.foot_comment = []byte(node.FootComment) - e.emit() - - case MappingNode: - style := yaml_BLOCK_MAPPING_STYLE - if node.Style&FlowStyle != 0 { - style = yaml_FLOW_MAPPING_STYLE - } - yaml_mapping_start_event_initialize(&e.event, []byte(node.Anchor), []byte(longTag(tag)), tag == "", style) - e.event.tail_comment = []byte(tail) - e.event.head_comment = []byte(node.HeadComment) - e.emit() - - // The tail logic below moves the foot comment of prior keys to the following key, - // since the value for each key may be a nested structure and the foot needs to be - // processed only the entirety of the value is streamed. The last tail is processed - // with the mapping end event. - var tail string - for i := 0; i+1 < len(node.Content); i += 2 { - k := node.Content[i] - foot := k.FootComment - if foot != "" { - kopy := *k - kopy.FootComment = "" - k = &kopy - } - e.node(k, tail) - tail = foot - - v := node.Content[i+1] - e.node(v, "") - } - - yaml_mapping_end_event_initialize(&e.event) - e.event.tail_comment = []byte(tail) - e.event.line_comment = []byte(node.LineComment) - e.event.foot_comment = []byte(node.FootComment) - e.emit() - - case AliasNode: - yaml_alias_event_initialize(&e.event, []byte(node.Value)) - e.event.head_comment = []byte(node.HeadComment) - e.event.line_comment = []byte(node.LineComment) - e.event.foot_comment = []byte(node.FootComment) - e.emit() - - case ScalarNode: - value := node.Value - if !utf8.ValidString(value) { - if stag == binaryTag { - failf("explicitly tagged !!binary data must be base64-encoded") - } - if stag != "" { - failf("cannot marshal invalid UTF-8 data as %s", stag) - } - // It can't be encoded directly as YAML so use a binary tag - // and encode it as base64. - tag = binaryTag - value = encodeBase64(value) - } - - style := yaml_PLAIN_SCALAR_STYLE - switch { - case node.Style&DoubleQuotedStyle != 0: - style = yaml_DOUBLE_QUOTED_SCALAR_STYLE - case node.Style&SingleQuotedStyle != 0: - style = yaml_SINGLE_QUOTED_SCALAR_STYLE - case node.Style&LiteralStyle != 0: - style = yaml_LITERAL_SCALAR_STYLE - case node.Style&FoldedStyle != 0: - style = yaml_FOLDED_SCALAR_STYLE - case strings.Contains(value, "\n"): - style = yaml_LITERAL_SCALAR_STYLE - case forceQuoting: - style = yaml_DOUBLE_QUOTED_SCALAR_STYLE - } - - e.emitScalar(value, node.Anchor, tag, style, []byte(node.HeadComment), []byte(node.LineComment), []byte(node.FootComment), []byte(tail)) - default: - failf("cannot encode node with unknown kind %d", node.Kind) - } -} diff --git a/vendor/gopkg.in/yaml.v3/go.mod b/vendor/gopkg.in/yaml.v3/go.mod deleted file mode 100644 index f407ea3..0000000 --- a/vendor/gopkg.in/yaml.v3/go.mod +++ /dev/null @@ -1,5 +0,0 @@ -module "gopkg.in/yaml.v3" - -require ( - "gopkg.in/check.v1" v0.0.0-20161208181325-20d25e280405 -) diff --git a/vendor/gopkg.in/yaml.v3/parserc.go b/vendor/gopkg.in/yaml.v3/parserc.go deleted file mode 100644 index ac66fcc..0000000 --- a/vendor/gopkg.in/yaml.v3/parserc.go +++ /dev/null @@ -1,1249 +0,0 @@ -// -// Copyright (c) 2011-2019 Canonical Ltd -// Copyright (c) 2006-2010 Kirill Simonov -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of -// this software and associated documentation files (the "Software"), to deal in -// the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -// of the Software, and to permit persons to whom the Software is furnished to do -// so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. - -package yaml - -import ( - "bytes" -) - -// The parser implements the following grammar: -// -// stream ::= STREAM-START implicit_document? explicit_document* STREAM-END -// implicit_document ::= block_node DOCUMENT-END* -// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* -// block_node_or_indentless_sequence ::= -// ALIAS -// | properties (block_content | indentless_block_sequence)? -// | block_content -// | indentless_block_sequence -// block_node ::= ALIAS -// | properties block_content? -// | block_content -// flow_node ::= ALIAS -// | properties flow_content? -// | flow_content -// properties ::= TAG ANCHOR? | ANCHOR TAG? -// block_content ::= block_collection | flow_collection | SCALAR -// flow_content ::= flow_collection | SCALAR -// block_collection ::= block_sequence | block_mapping -// flow_collection ::= flow_sequence | flow_mapping -// block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END -// indentless_sequence ::= (BLOCK-ENTRY block_node?)+ -// block_mapping ::= BLOCK-MAPPING_START -// ((KEY block_node_or_indentless_sequence?)? -// (VALUE block_node_or_indentless_sequence?)?)* -// BLOCK-END -// flow_sequence ::= FLOW-SEQUENCE-START -// (flow_sequence_entry FLOW-ENTRY)* -// flow_sequence_entry? -// FLOW-SEQUENCE-END -// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? -// flow_mapping ::= FLOW-MAPPING-START -// (flow_mapping_entry FLOW-ENTRY)* -// flow_mapping_entry? -// FLOW-MAPPING-END -// flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? - -// Peek the next token in the token queue. -func peek_token(parser *yaml_parser_t) *yaml_token_t { - if parser.token_available || yaml_parser_fetch_more_tokens(parser) { - token := &parser.tokens[parser.tokens_head] - yaml_parser_unfold_comments(parser, token) - return token - } - return nil -} - -// yaml_parser_unfold_comments walks through the comments queue and joins all -// comments behind the position of the provided token into the respective -// top-level comment slices in the parser. -func yaml_parser_unfold_comments(parser *yaml_parser_t, token *yaml_token_t) { - for parser.comments_head < len(parser.comments) && token.start_mark.index >= parser.comments[parser.comments_head].token_mark.index { - comment := &parser.comments[parser.comments_head] - if len(comment.head) > 0 { - if token.typ == yaml_BLOCK_END_TOKEN { - // No heads on ends, so keep comment.head for a follow up token. - break - } - if len(parser.head_comment) > 0 { - parser.head_comment = append(parser.head_comment, '\n') - } - parser.head_comment = append(parser.head_comment, comment.head...) - } - if len(comment.foot) > 0 { - if len(parser.foot_comment) > 0 { - parser.foot_comment = append(parser.foot_comment, '\n') - } - parser.foot_comment = append(parser.foot_comment, comment.foot...) - } - if len(comment.line) > 0 { - if len(parser.line_comment) > 0 { - parser.line_comment = append(parser.line_comment, '\n') - } - parser.line_comment = append(parser.line_comment, comment.line...) - } - *comment = yaml_comment_t{} - parser.comments_head++ - } -} - -// Remove the next token from the queue (must be called after peek_token). -func skip_token(parser *yaml_parser_t) { - parser.token_available = false - parser.tokens_parsed++ - parser.stream_end_produced = parser.tokens[parser.tokens_head].typ == yaml_STREAM_END_TOKEN - parser.tokens_head++ -} - -// Get the next event. -func yaml_parser_parse(parser *yaml_parser_t, event *yaml_event_t) bool { - // Erase the event object. - *event = yaml_event_t{} - - // No events after the end of the stream or error. - if parser.stream_end_produced || parser.error != yaml_NO_ERROR || parser.state == yaml_PARSE_END_STATE { - return true - } - - // Generate the next event. - return yaml_parser_state_machine(parser, event) -} - -// Set parser error. -func yaml_parser_set_parser_error(parser *yaml_parser_t, problem string, problem_mark yaml_mark_t) bool { - parser.error = yaml_PARSER_ERROR - parser.problem = problem - parser.problem_mark = problem_mark - return false -} - -func yaml_parser_set_parser_error_context(parser *yaml_parser_t, context string, context_mark yaml_mark_t, problem string, problem_mark yaml_mark_t) bool { - parser.error = yaml_PARSER_ERROR - parser.context = context - parser.context_mark = context_mark - parser.problem = problem - parser.problem_mark = problem_mark - return false -} - -// State dispatcher. -func yaml_parser_state_machine(parser *yaml_parser_t, event *yaml_event_t) bool { - //trace("yaml_parser_state_machine", "state:", parser.state.String()) - - switch parser.state { - case yaml_PARSE_STREAM_START_STATE: - return yaml_parser_parse_stream_start(parser, event) - - case yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE: - return yaml_parser_parse_document_start(parser, event, true) - - case yaml_PARSE_DOCUMENT_START_STATE: - return yaml_parser_parse_document_start(parser, event, false) - - case yaml_PARSE_DOCUMENT_CONTENT_STATE: - return yaml_parser_parse_document_content(parser, event) - - case yaml_PARSE_DOCUMENT_END_STATE: - return yaml_parser_parse_document_end(parser, event) - - case yaml_PARSE_BLOCK_NODE_STATE: - return yaml_parser_parse_node(parser, event, true, false) - - case yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE: - return yaml_parser_parse_node(parser, event, true, true) - - case yaml_PARSE_FLOW_NODE_STATE: - return yaml_parser_parse_node(parser, event, false, false) - - case yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE: - return yaml_parser_parse_block_sequence_entry(parser, event, true) - - case yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE: - return yaml_parser_parse_block_sequence_entry(parser, event, false) - - case yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE: - return yaml_parser_parse_indentless_sequence_entry(parser, event) - - case yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE: - return yaml_parser_parse_block_mapping_key(parser, event, true) - - case yaml_PARSE_BLOCK_MAPPING_KEY_STATE: - return yaml_parser_parse_block_mapping_key(parser, event, false) - - case yaml_PARSE_BLOCK_MAPPING_VALUE_STATE: - return yaml_parser_parse_block_mapping_value(parser, event) - - case yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE: - return yaml_parser_parse_flow_sequence_entry(parser, event, true) - - case yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE: - return yaml_parser_parse_flow_sequence_entry(parser, event, false) - - case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE: - return yaml_parser_parse_flow_sequence_entry_mapping_key(parser, event) - - case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE: - return yaml_parser_parse_flow_sequence_entry_mapping_value(parser, event) - - case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE: - return yaml_parser_parse_flow_sequence_entry_mapping_end(parser, event) - - case yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE: - return yaml_parser_parse_flow_mapping_key(parser, event, true) - - case yaml_PARSE_FLOW_MAPPING_KEY_STATE: - return yaml_parser_parse_flow_mapping_key(parser, event, false) - - case yaml_PARSE_FLOW_MAPPING_VALUE_STATE: - return yaml_parser_parse_flow_mapping_value(parser, event, false) - - case yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE: - return yaml_parser_parse_flow_mapping_value(parser, event, true) - - default: - panic("invalid parser state") - } -} - -// Parse the production: -// stream ::= STREAM-START implicit_document? explicit_document* STREAM-END -// ************ -func yaml_parser_parse_stream_start(parser *yaml_parser_t, event *yaml_event_t) bool { - token := peek_token(parser) - if token == nil { - return false - } - if token.typ != yaml_STREAM_START_TOKEN { - return yaml_parser_set_parser_error(parser, "did not find expected ", token.start_mark) - } - parser.state = yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE - *event = yaml_event_t{ - typ: yaml_STREAM_START_EVENT, - start_mark: token.start_mark, - end_mark: token.end_mark, - encoding: token.encoding, - } - skip_token(parser) - return true -} - -// Parse the productions: -// implicit_document ::= block_node DOCUMENT-END* -// * -// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* -// ************************* -func yaml_parser_parse_document_start(parser *yaml_parser_t, event *yaml_event_t, implicit bool) bool { - - token := peek_token(parser) - if token == nil { - return false - } - - // Parse extra document end indicators. - if !implicit { - for token.typ == yaml_DOCUMENT_END_TOKEN { - skip_token(parser) - token = peek_token(parser) - if token == nil { - return false - } - } - } - - if implicit && token.typ != yaml_VERSION_DIRECTIVE_TOKEN && - token.typ != yaml_TAG_DIRECTIVE_TOKEN && - token.typ != yaml_DOCUMENT_START_TOKEN && - token.typ != yaml_STREAM_END_TOKEN { - // Parse an implicit document. - if !yaml_parser_process_directives(parser, nil, nil) { - return false - } - parser.states = append(parser.states, yaml_PARSE_DOCUMENT_END_STATE) - parser.state = yaml_PARSE_BLOCK_NODE_STATE - - var head_comment []byte - if len(parser.head_comment) > 0 { - // [Go] Scan the header comment backwards, and if an empty line is found, break - // the header so the part before the last empty line goes into the - // document header, while the bottom of it goes into a follow up event. - for i := len(parser.head_comment) - 1; i > 0; i-- { - if parser.head_comment[i] == '\n' { - if i == len(parser.head_comment)-1 { - head_comment = parser.head_comment[:i] - parser.head_comment = parser.head_comment[i+1:] - break - } else if parser.head_comment[i-1] == '\n' { - head_comment = parser.head_comment[:i-1] - parser.head_comment = parser.head_comment[i+1:] - break - } - } - } - } - - *event = yaml_event_t{ - typ: yaml_DOCUMENT_START_EVENT, - start_mark: token.start_mark, - end_mark: token.end_mark, - - head_comment: head_comment, - } - - } else if token.typ != yaml_STREAM_END_TOKEN { - // Parse an explicit document. - var version_directive *yaml_version_directive_t - var tag_directives []yaml_tag_directive_t - start_mark := token.start_mark - if !yaml_parser_process_directives(parser, &version_directive, &tag_directives) { - return false - } - token = peek_token(parser) - if token == nil { - return false - } - if token.typ != yaml_DOCUMENT_START_TOKEN { - yaml_parser_set_parser_error(parser, - "did not find expected ", token.start_mark) - return false - } - parser.states = append(parser.states, yaml_PARSE_DOCUMENT_END_STATE) - parser.state = yaml_PARSE_DOCUMENT_CONTENT_STATE - end_mark := token.end_mark - - *event = yaml_event_t{ - typ: yaml_DOCUMENT_START_EVENT, - start_mark: start_mark, - end_mark: end_mark, - version_directive: version_directive, - tag_directives: tag_directives, - implicit: false, - } - skip_token(parser) - - } else { - // Parse the stream end. - parser.state = yaml_PARSE_END_STATE - *event = yaml_event_t{ - typ: yaml_STREAM_END_EVENT, - start_mark: token.start_mark, - end_mark: token.end_mark, - } - skip_token(parser) - } - - return true -} - -// Parse the productions: -// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* -// *********** -// -func yaml_parser_parse_document_content(parser *yaml_parser_t, event *yaml_event_t) bool { - token := peek_token(parser) - if token == nil { - return false - } - - if token.typ == yaml_VERSION_DIRECTIVE_TOKEN || - token.typ == yaml_TAG_DIRECTIVE_TOKEN || - token.typ == yaml_DOCUMENT_START_TOKEN || - token.typ == yaml_DOCUMENT_END_TOKEN || - token.typ == yaml_STREAM_END_TOKEN { - parser.state = parser.states[len(parser.states)-1] - parser.states = parser.states[:len(parser.states)-1] - return yaml_parser_process_empty_scalar(parser, event, - token.start_mark) - } - return yaml_parser_parse_node(parser, event, true, false) -} - -// Parse the productions: -// implicit_document ::= block_node DOCUMENT-END* -// ************* -// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* -// -func yaml_parser_parse_document_end(parser *yaml_parser_t, event *yaml_event_t) bool { - token := peek_token(parser) - if token == nil { - return false - } - - start_mark := token.start_mark - end_mark := token.start_mark - - implicit := true - if token.typ == yaml_DOCUMENT_END_TOKEN { - end_mark = token.end_mark - skip_token(parser) - implicit = false - } - - parser.tag_directives = parser.tag_directives[:0] - - parser.state = yaml_PARSE_DOCUMENT_START_STATE - *event = yaml_event_t{ - typ: yaml_DOCUMENT_END_EVENT, - start_mark: start_mark, - end_mark: end_mark, - implicit: implicit, - } - yaml_parser_set_event_comments(parser, event) - if len(event.head_comment) > 0 && len(event.foot_comment) == 0 { - event.foot_comment = event.head_comment - event.head_comment = nil - } - return true -} - -func yaml_parser_set_event_comments(parser *yaml_parser_t, event *yaml_event_t) { - event.head_comment = parser.head_comment - event.line_comment = parser.line_comment - event.foot_comment = parser.foot_comment - parser.head_comment = nil - parser.line_comment = nil - parser.foot_comment = nil - parser.tail_comment = nil - parser.stem_comment = nil -} - -// Parse the productions: -// block_node_or_indentless_sequence ::= -// ALIAS -// ***** -// | properties (block_content | indentless_block_sequence)? -// ********** * -// | block_content | indentless_block_sequence -// * -// block_node ::= ALIAS -// ***** -// | properties block_content? -// ********** * -// | block_content -// * -// flow_node ::= ALIAS -// ***** -// | properties flow_content? -// ********** * -// | flow_content -// * -// properties ::= TAG ANCHOR? | ANCHOR TAG? -// ************************* -// block_content ::= block_collection | flow_collection | SCALAR -// ****** -// flow_content ::= flow_collection | SCALAR -// ****** -func yaml_parser_parse_node(parser *yaml_parser_t, event *yaml_event_t, block, indentless_sequence bool) bool { - //defer trace("yaml_parser_parse_node", "block:", block, "indentless_sequence:", indentless_sequence)() - - token := peek_token(parser) - if token == nil { - return false - } - - if token.typ == yaml_ALIAS_TOKEN { - parser.state = parser.states[len(parser.states)-1] - parser.states = parser.states[:len(parser.states)-1] - *event = yaml_event_t{ - typ: yaml_ALIAS_EVENT, - start_mark: token.start_mark, - end_mark: token.end_mark, - anchor: token.value, - } - yaml_parser_set_event_comments(parser, event) - skip_token(parser) - return true - } - - start_mark := token.start_mark - end_mark := token.start_mark - - var tag_token bool - var tag_handle, tag_suffix, anchor []byte - var tag_mark yaml_mark_t - if token.typ == yaml_ANCHOR_TOKEN { - anchor = token.value - start_mark = token.start_mark - end_mark = token.end_mark - skip_token(parser) - token = peek_token(parser) - if token == nil { - return false - } - if token.typ == yaml_TAG_TOKEN { - tag_token = true - tag_handle = token.value - tag_suffix = token.suffix - tag_mark = token.start_mark - end_mark = token.end_mark - skip_token(parser) - token = peek_token(parser) - if token == nil { - return false - } - } - } else if token.typ == yaml_TAG_TOKEN { - tag_token = true - tag_handle = token.value - tag_suffix = token.suffix - start_mark = token.start_mark - tag_mark = token.start_mark - end_mark = token.end_mark - skip_token(parser) - token = peek_token(parser) - if token == nil { - return false - } - if token.typ == yaml_ANCHOR_TOKEN { - anchor = token.value - end_mark = token.end_mark - skip_token(parser) - token = peek_token(parser) - if token == nil { - return false - } - } - } - - var tag []byte - if tag_token { - if len(tag_handle) == 0 { - tag = tag_suffix - tag_suffix = nil - } else { - for i := range parser.tag_directives { - if bytes.Equal(parser.tag_directives[i].handle, tag_handle) { - tag = append([]byte(nil), parser.tag_directives[i].prefix...) - tag = append(tag, tag_suffix...) - break - } - } - if len(tag) == 0 { - yaml_parser_set_parser_error_context(parser, - "while parsing a node", start_mark, - "found undefined tag handle", tag_mark) - return false - } - } - } - - implicit := len(tag) == 0 - if indentless_sequence && token.typ == yaml_BLOCK_ENTRY_TOKEN { - end_mark = token.end_mark - parser.state = yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE - *event = yaml_event_t{ - typ: yaml_SEQUENCE_START_EVENT, - start_mark: start_mark, - end_mark: end_mark, - anchor: anchor, - tag: tag, - implicit: implicit, - style: yaml_style_t(yaml_BLOCK_SEQUENCE_STYLE), - } - return true - } - if token.typ == yaml_SCALAR_TOKEN { - var plain_implicit, quoted_implicit bool - end_mark = token.end_mark - if (len(tag) == 0 && token.style == yaml_PLAIN_SCALAR_STYLE) || (len(tag) == 1 && tag[0] == '!') { - plain_implicit = true - } else if len(tag) == 0 { - quoted_implicit = true - } - parser.state = parser.states[len(parser.states)-1] - parser.states = parser.states[:len(parser.states)-1] - - *event = yaml_event_t{ - typ: yaml_SCALAR_EVENT, - start_mark: start_mark, - end_mark: end_mark, - anchor: anchor, - tag: tag, - value: token.value, - implicit: plain_implicit, - quoted_implicit: quoted_implicit, - style: yaml_style_t(token.style), - } - yaml_parser_set_event_comments(parser, event) - skip_token(parser) - return true - } - if token.typ == yaml_FLOW_SEQUENCE_START_TOKEN { - // [Go] Some of the events below can be merged as they differ only on style. - end_mark = token.end_mark - parser.state = yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE - *event = yaml_event_t{ - typ: yaml_SEQUENCE_START_EVENT, - start_mark: start_mark, - end_mark: end_mark, - anchor: anchor, - tag: tag, - implicit: implicit, - style: yaml_style_t(yaml_FLOW_SEQUENCE_STYLE), - } - yaml_parser_set_event_comments(parser, event) - return true - } - if token.typ == yaml_FLOW_MAPPING_START_TOKEN { - end_mark = token.end_mark - parser.state = yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE - *event = yaml_event_t{ - typ: yaml_MAPPING_START_EVENT, - start_mark: start_mark, - end_mark: end_mark, - anchor: anchor, - tag: tag, - implicit: implicit, - style: yaml_style_t(yaml_FLOW_MAPPING_STYLE), - } - yaml_parser_set_event_comments(parser, event) - return true - } - if block && token.typ == yaml_BLOCK_SEQUENCE_START_TOKEN { - end_mark = token.end_mark - parser.state = yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE - *event = yaml_event_t{ - typ: yaml_SEQUENCE_START_EVENT, - start_mark: start_mark, - end_mark: end_mark, - anchor: anchor, - tag: tag, - implicit: implicit, - style: yaml_style_t(yaml_BLOCK_SEQUENCE_STYLE), - } - if parser.stem_comment != nil { - event.head_comment = parser.stem_comment - parser.stem_comment = nil - } - return true - } - if block && token.typ == yaml_BLOCK_MAPPING_START_TOKEN { - end_mark = token.end_mark - parser.state = yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE - *event = yaml_event_t{ - typ: yaml_MAPPING_START_EVENT, - start_mark: start_mark, - end_mark: end_mark, - anchor: anchor, - tag: tag, - implicit: implicit, - style: yaml_style_t(yaml_BLOCK_MAPPING_STYLE), - } - if parser.stem_comment != nil { - event.head_comment = parser.stem_comment - parser.stem_comment = nil - } - return true - } - if len(anchor) > 0 || len(tag) > 0 { - parser.state = parser.states[len(parser.states)-1] - parser.states = parser.states[:len(parser.states)-1] - - *event = yaml_event_t{ - typ: yaml_SCALAR_EVENT, - start_mark: start_mark, - end_mark: end_mark, - anchor: anchor, - tag: tag, - implicit: implicit, - quoted_implicit: false, - style: yaml_style_t(yaml_PLAIN_SCALAR_STYLE), - } - return true - } - - context := "while parsing a flow node" - if block { - context = "while parsing a block node" - } - yaml_parser_set_parser_error_context(parser, context, start_mark, - "did not find expected node content", token.start_mark) - return false -} - -// Parse the productions: -// block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END -// ******************** *********** * ********* -// -func yaml_parser_parse_block_sequence_entry(parser *yaml_parser_t, event *yaml_event_t, first bool) bool { - if first { - token := peek_token(parser) - parser.marks = append(parser.marks, token.start_mark) - skip_token(parser) - } - - token := peek_token(parser) - if token == nil { - return false - } - - if token.typ == yaml_BLOCK_ENTRY_TOKEN { - mark := token.end_mark - prior_head_len := len(parser.head_comment) - skip_token(parser) - yaml_parser_split_stem_comment(parser, prior_head_len) - token = peek_token(parser) - if token == nil { - return false - } - if token.typ != yaml_BLOCK_ENTRY_TOKEN && token.typ != yaml_BLOCK_END_TOKEN { - parser.states = append(parser.states, yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE) - return yaml_parser_parse_node(parser, event, true, false) - } else { - parser.state = yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE - return yaml_parser_process_empty_scalar(parser, event, mark) - } - } - if token.typ == yaml_BLOCK_END_TOKEN { - parser.state = parser.states[len(parser.states)-1] - parser.states = parser.states[:len(parser.states)-1] - parser.marks = parser.marks[:len(parser.marks)-1] - - *event = yaml_event_t{ - typ: yaml_SEQUENCE_END_EVENT, - start_mark: token.start_mark, - end_mark: token.end_mark, - } - - skip_token(parser) - return true - } - - context_mark := parser.marks[len(parser.marks)-1] - parser.marks = parser.marks[:len(parser.marks)-1] - return yaml_parser_set_parser_error_context(parser, - "while parsing a block collection", context_mark, - "did not find expected '-' indicator", token.start_mark) -} - -// Parse the productions: -// indentless_sequence ::= (BLOCK-ENTRY block_node?)+ -// *********** * -func yaml_parser_parse_indentless_sequence_entry(parser *yaml_parser_t, event *yaml_event_t) bool { - token := peek_token(parser) - if token == nil { - return false - } - - if token.typ == yaml_BLOCK_ENTRY_TOKEN { - mark := token.end_mark - prior_head_len := len(parser.head_comment) - skip_token(parser) - yaml_parser_split_stem_comment(parser, prior_head_len) - token = peek_token(parser) - if token == nil { - return false - } - if token.typ != yaml_BLOCK_ENTRY_TOKEN && - token.typ != yaml_KEY_TOKEN && - token.typ != yaml_VALUE_TOKEN && - token.typ != yaml_BLOCK_END_TOKEN { - parser.states = append(parser.states, yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE) - return yaml_parser_parse_node(parser, event, true, false) - } - parser.state = yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE - return yaml_parser_process_empty_scalar(parser, event, mark) - } - parser.state = parser.states[len(parser.states)-1] - parser.states = parser.states[:len(parser.states)-1] - - *event = yaml_event_t{ - typ: yaml_SEQUENCE_END_EVENT, - start_mark: token.start_mark, - end_mark: token.start_mark, // [Go] Shouldn't this be token.end_mark? - } - return true -} - -// Split stem comment from head comment. -// -// When a sequence or map is found under a sequence entry, the former head comment -// is assigned to the underlying sequence or map as a whole, not the individual -// sequence or map entry as would be expected otherwise. To handle this case the -// previous head comment is moved aside as the stem comment. -func yaml_parser_split_stem_comment(parser *yaml_parser_t, stem_len int) { - if stem_len == 0 { - return - } - - token := peek_token(parser) - if token.typ != yaml_BLOCK_SEQUENCE_START_TOKEN && token.typ != yaml_BLOCK_MAPPING_START_TOKEN { - return - } - - parser.stem_comment = parser.head_comment[:stem_len] - if len(parser.head_comment) == stem_len { - parser.head_comment = nil - } else { - // Copy suffix to prevent very strange bugs if someone ever appends - // further bytes to the prefix in the stem_comment slice above. - parser.head_comment = append([]byte(nil), parser.head_comment[stem_len+1:]...) - } -} - -// Parse the productions: -// block_mapping ::= BLOCK-MAPPING_START -// ******************* -// ((KEY block_node_or_indentless_sequence?)? -// *** * -// (VALUE block_node_or_indentless_sequence?)?)* -// -// BLOCK-END -// ********* -// -func yaml_parser_parse_block_mapping_key(parser *yaml_parser_t, event *yaml_event_t, first bool) bool { - if first { - token := peek_token(parser) - parser.marks = append(parser.marks, token.start_mark) - skip_token(parser) - } - - token := peek_token(parser) - if token == nil { - return false - } - - // [Go] A tail comment was left from the prior mapping value processed. Emit an event - // as it needs to be processed with that value and not the following key. - if len(parser.tail_comment) > 0 { - *event = yaml_event_t{ - typ: yaml_TAIL_COMMENT_EVENT, - start_mark: token.start_mark, - end_mark: token.end_mark, - foot_comment: parser.tail_comment, - } - parser.tail_comment = nil - return true - } - - if token.typ == yaml_KEY_TOKEN { - mark := token.end_mark - skip_token(parser) - token = peek_token(parser) - if token == nil { - return false - } - if token.typ != yaml_KEY_TOKEN && - token.typ != yaml_VALUE_TOKEN && - token.typ != yaml_BLOCK_END_TOKEN { - parser.states = append(parser.states, yaml_PARSE_BLOCK_MAPPING_VALUE_STATE) - return yaml_parser_parse_node(parser, event, true, true) - } else { - parser.state = yaml_PARSE_BLOCK_MAPPING_VALUE_STATE - return yaml_parser_process_empty_scalar(parser, event, mark) - } - } else if token.typ == yaml_BLOCK_END_TOKEN { - parser.state = parser.states[len(parser.states)-1] - parser.states = parser.states[:len(parser.states)-1] - parser.marks = parser.marks[:len(parser.marks)-1] - *event = yaml_event_t{ - typ: yaml_MAPPING_END_EVENT, - start_mark: token.start_mark, - end_mark: token.end_mark, - } - yaml_parser_set_event_comments(parser, event) - skip_token(parser) - return true - } - - context_mark := parser.marks[len(parser.marks)-1] - parser.marks = parser.marks[:len(parser.marks)-1] - return yaml_parser_set_parser_error_context(parser, - "while parsing a block mapping", context_mark, - "did not find expected key", token.start_mark) -} - -// Parse the productions: -// block_mapping ::= BLOCK-MAPPING_START -// -// ((KEY block_node_or_indentless_sequence?)? -// -// (VALUE block_node_or_indentless_sequence?)?)* -// ***** * -// BLOCK-END -// -// -func yaml_parser_parse_block_mapping_value(parser *yaml_parser_t, event *yaml_event_t) bool { - token := peek_token(parser) - if token == nil { - return false - } - if token.typ == yaml_VALUE_TOKEN { - mark := token.end_mark - skip_token(parser) - token = peek_token(parser) - if token == nil { - return false - } - if token.typ != yaml_KEY_TOKEN && - token.typ != yaml_VALUE_TOKEN && - token.typ != yaml_BLOCK_END_TOKEN { - parser.states = append(parser.states, yaml_PARSE_BLOCK_MAPPING_KEY_STATE) - return yaml_parser_parse_node(parser, event, true, true) - } - parser.state = yaml_PARSE_BLOCK_MAPPING_KEY_STATE - return yaml_parser_process_empty_scalar(parser, event, mark) - } - parser.state = yaml_PARSE_BLOCK_MAPPING_KEY_STATE - return yaml_parser_process_empty_scalar(parser, event, token.start_mark) -} - -// Parse the productions: -// flow_sequence ::= FLOW-SEQUENCE-START -// ******************* -// (flow_sequence_entry FLOW-ENTRY)* -// * ********** -// flow_sequence_entry? -// * -// FLOW-SEQUENCE-END -// ***************** -// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? -// * -// -func yaml_parser_parse_flow_sequence_entry(parser *yaml_parser_t, event *yaml_event_t, first bool) bool { - if first { - token := peek_token(parser) - parser.marks = append(parser.marks, token.start_mark) - skip_token(parser) - } - token := peek_token(parser) - if token == nil { - return false - } - if token.typ != yaml_FLOW_SEQUENCE_END_TOKEN { - if !first { - if token.typ == yaml_FLOW_ENTRY_TOKEN { - skip_token(parser) - token = peek_token(parser) - if token == nil { - return false - } - } else { - context_mark := parser.marks[len(parser.marks)-1] - parser.marks = parser.marks[:len(parser.marks)-1] - return yaml_parser_set_parser_error_context(parser, - "while parsing a flow sequence", context_mark, - "did not find expected ',' or ']'", token.start_mark) - } - } - - if token.typ == yaml_KEY_TOKEN { - parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE - *event = yaml_event_t{ - typ: yaml_MAPPING_START_EVENT, - start_mark: token.start_mark, - end_mark: token.end_mark, - implicit: true, - style: yaml_style_t(yaml_FLOW_MAPPING_STYLE), - } - skip_token(parser) - return true - } else if token.typ != yaml_FLOW_SEQUENCE_END_TOKEN { - parser.states = append(parser.states, yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE) - return yaml_parser_parse_node(parser, event, false, false) - } - } - - parser.state = parser.states[len(parser.states)-1] - parser.states = parser.states[:len(parser.states)-1] - parser.marks = parser.marks[:len(parser.marks)-1] - - *event = yaml_event_t{ - typ: yaml_SEQUENCE_END_EVENT, - start_mark: token.start_mark, - end_mark: token.end_mark, - } - yaml_parser_set_event_comments(parser, event) - - skip_token(parser) - return true -} - -// -// Parse the productions: -// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? -// *** * -// -func yaml_parser_parse_flow_sequence_entry_mapping_key(parser *yaml_parser_t, event *yaml_event_t) bool { - token := peek_token(parser) - if token == nil { - return false - } - if token.typ != yaml_VALUE_TOKEN && - token.typ != yaml_FLOW_ENTRY_TOKEN && - token.typ != yaml_FLOW_SEQUENCE_END_TOKEN { - parser.states = append(parser.states, yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE) - return yaml_parser_parse_node(parser, event, false, false) - } - mark := token.end_mark - skip_token(parser) - parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE - return yaml_parser_process_empty_scalar(parser, event, mark) -} - -// Parse the productions: -// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? -// ***** * -// -func yaml_parser_parse_flow_sequence_entry_mapping_value(parser *yaml_parser_t, event *yaml_event_t) bool { - token := peek_token(parser) - if token == nil { - return false - } - if token.typ == yaml_VALUE_TOKEN { - skip_token(parser) - token := peek_token(parser) - if token == nil { - return false - } - if token.typ != yaml_FLOW_ENTRY_TOKEN && token.typ != yaml_FLOW_SEQUENCE_END_TOKEN { - parser.states = append(parser.states, yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE) - return yaml_parser_parse_node(parser, event, false, false) - } - } - parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE - return yaml_parser_process_empty_scalar(parser, event, token.start_mark) -} - -// Parse the productions: -// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? -// * -// -func yaml_parser_parse_flow_sequence_entry_mapping_end(parser *yaml_parser_t, event *yaml_event_t) bool { - token := peek_token(parser) - if token == nil { - return false - } - parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE - *event = yaml_event_t{ - typ: yaml_MAPPING_END_EVENT, - start_mark: token.start_mark, - end_mark: token.start_mark, // [Go] Shouldn't this be end_mark? - } - return true -} - -// Parse the productions: -// flow_mapping ::= FLOW-MAPPING-START -// ****************** -// (flow_mapping_entry FLOW-ENTRY)* -// * ********** -// flow_mapping_entry? -// ****************** -// FLOW-MAPPING-END -// **************** -// flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? -// * *** * -// -func yaml_parser_parse_flow_mapping_key(parser *yaml_parser_t, event *yaml_event_t, first bool) bool { - if first { - token := peek_token(parser) - parser.marks = append(parser.marks, token.start_mark) - skip_token(parser) - } - - token := peek_token(parser) - if token == nil { - return false - } - - if token.typ != yaml_FLOW_MAPPING_END_TOKEN { - if !first { - if token.typ == yaml_FLOW_ENTRY_TOKEN { - skip_token(parser) - token = peek_token(parser) - if token == nil { - return false - } - } else { - context_mark := parser.marks[len(parser.marks)-1] - parser.marks = parser.marks[:len(parser.marks)-1] - return yaml_parser_set_parser_error_context(parser, - "while parsing a flow mapping", context_mark, - "did not find expected ',' or '}'", token.start_mark) - } - } - - if token.typ == yaml_KEY_TOKEN { - skip_token(parser) - token = peek_token(parser) - if token == nil { - return false - } - if token.typ != yaml_VALUE_TOKEN && - token.typ != yaml_FLOW_ENTRY_TOKEN && - token.typ != yaml_FLOW_MAPPING_END_TOKEN { - parser.states = append(parser.states, yaml_PARSE_FLOW_MAPPING_VALUE_STATE) - return yaml_parser_parse_node(parser, event, false, false) - } else { - parser.state = yaml_PARSE_FLOW_MAPPING_VALUE_STATE - return yaml_parser_process_empty_scalar(parser, event, token.start_mark) - } - } else if token.typ != yaml_FLOW_MAPPING_END_TOKEN { - parser.states = append(parser.states, yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE) - return yaml_parser_parse_node(parser, event, false, false) - } - } - - parser.state = parser.states[len(parser.states)-1] - parser.states = parser.states[:len(parser.states)-1] - parser.marks = parser.marks[:len(parser.marks)-1] - *event = yaml_event_t{ - typ: yaml_MAPPING_END_EVENT, - start_mark: token.start_mark, - end_mark: token.end_mark, - } - yaml_parser_set_event_comments(parser, event) - skip_token(parser) - return true -} - -// Parse the productions: -// flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? -// * ***** * -// -func yaml_parser_parse_flow_mapping_value(parser *yaml_parser_t, event *yaml_event_t, empty bool) bool { - token := peek_token(parser) - if token == nil { - return false - } - if empty { - parser.state = yaml_PARSE_FLOW_MAPPING_KEY_STATE - return yaml_parser_process_empty_scalar(parser, event, token.start_mark) - } - if token.typ == yaml_VALUE_TOKEN { - skip_token(parser) - token = peek_token(parser) - if token == nil { - return false - } - if token.typ != yaml_FLOW_ENTRY_TOKEN && token.typ != yaml_FLOW_MAPPING_END_TOKEN { - parser.states = append(parser.states, yaml_PARSE_FLOW_MAPPING_KEY_STATE) - return yaml_parser_parse_node(parser, event, false, false) - } - } - parser.state = yaml_PARSE_FLOW_MAPPING_KEY_STATE - return yaml_parser_process_empty_scalar(parser, event, token.start_mark) -} - -// Generate an empty scalar event. -func yaml_parser_process_empty_scalar(parser *yaml_parser_t, event *yaml_event_t, mark yaml_mark_t) bool { - *event = yaml_event_t{ - typ: yaml_SCALAR_EVENT, - start_mark: mark, - end_mark: mark, - value: nil, // Empty - implicit: true, - style: yaml_style_t(yaml_PLAIN_SCALAR_STYLE), - } - return true -} - -var default_tag_directives = []yaml_tag_directive_t{ - {[]byte("!"), []byte("!")}, - {[]byte("!!"), []byte("tag:yaml.org,2002:")}, -} - -// Parse directives. -func yaml_parser_process_directives(parser *yaml_parser_t, - version_directive_ref **yaml_version_directive_t, - tag_directives_ref *[]yaml_tag_directive_t) bool { - - var version_directive *yaml_version_directive_t - var tag_directives []yaml_tag_directive_t - - token := peek_token(parser) - if token == nil { - return false - } - - for token.typ == yaml_VERSION_DIRECTIVE_TOKEN || token.typ == yaml_TAG_DIRECTIVE_TOKEN { - if token.typ == yaml_VERSION_DIRECTIVE_TOKEN { - if version_directive != nil { - yaml_parser_set_parser_error(parser, - "found duplicate %YAML directive", token.start_mark) - return false - } - if token.major != 1 || token.minor != 1 { - yaml_parser_set_parser_error(parser, - "found incompatible YAML document", token.start_mark) - return false - } - version_directive = &yaml_version_directive_t{ - major: token.major, - minor: token.minor, - } - } else if token.typ == yaml_TAG_DIRECTIVE_TOKEN { - value := yaml_tag_directive_t{ - handle: token.value, - prefix: token.prefix, - } - if !yaml_parser_append_tag_directive(parser, value, false, token.start_mark) { - return false - } - tag_directives = append(tag_directives, value) - } - - skip_token(parser) - token = peek_token(parser) - if token == nil { - return false - } - } - - for i := range default_tag_directives { - if !yaml_parser_append_tag_directive(parser, default_tag_directives[i], true, token.start_mark) { - return false - } - } - - if version_directive_ref != nil { - *version_directive_ref = version_directive - } - if tag_directives_ref != nil { - *tag_directives_ref = tag_directives - } - return true -} - -// Append a tag directive to the directives stack. -func yaml_parser_append_tag_directive(parser *yaml_parser_t, value yaml_tag_directive_t, allow_duplicates bool, mark yaml_mark_t) bool { - for i := range parser.tag_directives { - if bytes.Equal(value.handle, parser.tag_directives[i].handle) { - if allow_duplicates { - return true - } - return yaml_parser_set_parser_error(parser, "found duplicate %TAG directive", mark) - } - } - - // [Go] I suspect the copy is unnecessary. This was likely done - // because there was no way to track ownership of the data. - value_copy := yaml_tag_directive_t{ - handle: make([]byte, len(value.handle)), - prefix: make([]byte, len(value.prefix)), - } - copy(value_copy.handle, value.handle) - copy(value_copy.prefix, value.prefix) - parser.tag_directives = append(parser.tag_directives, value_copy) - return true -} diff --git a/vendor/gopkg.in/yaml.v3/readerc.go b/vendor/gopkg.in/yaml.v3/readerc.go deleted file mode 100644 index b7de0a8..0000000 --- a/vendor/gopkg.in/yaml.v3/readerc.go +++ /dev/null @@ -1,434 +0,0 @@ -// -// Copyright (c) 2011-2019 Canonical Ltd -// Copyright (c) 2006-2010 Kirill Simonov -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of -// this software and associated documentation files (the "Software"), to deal in -// the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -// of the Software, and to permit persons to whom the Software is furnished to do -// so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. - -package yaml - -import ( - "io" -) - -// Set the reader error and return 0. -func yaml_parser_set_reader_error(parser *yaml_parser_t, problem string, offset int, value int) bool { - parser.error = yaml_READER_ERROR - parser.problem = problem - parser.problem_offset = offset - parser.problem_value = value - return false -} - -// Byte order marks. -const ( - bom_UTF8 = "\xef\xbb\xbf" - bom_UTF16LE = "\xff\xfe" - bom_UTF16BE = "\xfe\xff" -) - -// Determine the input stream encoding by checking the BOM symbol. If no BOM is -// found, the UTF-8 encoding is assumed. Return 1 on success, 0 on failure. -func yaml_parser_determine_encoding(parser *yaml_parser_t) bool { - // Ensure that we had enough bytes in the raw buffer. - for !parser.eof && len(parser.raw_buffer)-parser.raw_buffer_pos < 3 { - if !yaml_parser_update_raw_buffer(parser) { - return false - } - } - - // Determine the encoding. - buf := parser.raw_buffer - pos := parser.raw_buffer_pos - avail := len(buf) - pos - if avail >= 2 && buf[pos] == bom_UTF16LE[0] && buf[pos+1] == bom_UTF16LE[1] { - parser.encoding = yaml_UTF16LE_ENCODING - parser.raw_buffer_pos += 2 - parser.offset += 2 - } else if avail >= 2 && buf[pos] == bom_UTF16BE[0] && buf[pos+1] == bom_UTF16BE[1] { - parser.encoding = yaml_UTF16BE_ENCODING - parser.raw_buffer_pos += 2 - parser.offset += 2 - } else if avail >= 3 && buf[pos] == bom_UTF8[0] && buf[pos+1] == bom_UTF8[1] && buf[pos+2] == bom_UTF8[2] { - parser.encoding = yaml_UTF8_ENCODING - parser.raw_buffer_pos += 3 - parser.offset += 3 - } else { - parser.encoding = yaml_UTF8_ENCODING - } - return true -} - -// Update the raw buffer. -func yaml_parser_update_raw_buffer(parser *yaml_parser_t) bool { - size_read := 0 - - // Return if the raw buffer is full. - if parser.raw_buffer_pos == 0 && len(parser.raw_buffer) == cap(parser.raw_buffer) { - return true - } - - // Return on EOF. - if parser.eof { - return true - } - - // Move the remaining bytes in the raw buffer to the beginning. - if parser.raw_buffer_pos > 0 && parser.raw_buffer_pos < len(parser.raw_buffer) { - copy(parser.raw_buffer, parser.raw_buffer[parser.raw_buffer_pos:]) - } - parser.raw_buffer = parser.raw_buffer[:len(parser.raw_buffer)-parser.raw_buffer_pos] - parser.raw_buffer_pos = 0 - - // Call the read handler to fill the buffer. - size_read, err := parser.read_handler(parser, parser.raw_buffer[len(parser.raw_buffer):cap(parser.raw_buffer)]) - parser.raw_buffer = parser.raw_buffer[:len(parser.raw_buffer)+size_read] - if err == io.EOF { - parser.eof = true - } else if err != nil { - return yaml_parser_set_reader_error(parser, "input error: "+err.Error(), parser.offset, -1) - } - return true -} - -// Ensure that the buffer contains at least `length` characters. -// Return true on success, false on failure. -// -// The length is supposed to be significantly less that the buffer size. -func yaml_parser_update_buffer(parser *yaml_parser_t, length int) bool { - if parser.read_handler == nil { - panic("read handler must be set") - } - - // [Go] This function was changed to guarantee the requested length size at EOF. - // The fact we need to do this is pretty awful, but the description above implies - // for that to be the case, and there are tests - - // If the EOF flag is set and the raw buffer is empty, do nothing. - if parser.eof && parser.raw_buffer_pos == len(parser.raw_buffer) { - // [Go] ACTUALLY! Read the documentation of this function above. - // This is just broken. To return true, we need to have the - // given length in the buffer. Not doing that means every single - // check that calls this function to make sure the buffer has a - // given length is Go) panicking; or C) accessing invalid memory. - //return true - } - - // Return if the buffer contains enough characters. - if parser.unread >= length { - return true - } - - // Determine the input encoding if it is not known yet. - if parser.encoding == yaml_ANY_ENCODING { - if !yaml_parser_determine_encoding(parser) { - return false - } - } - - // Move the unread characters to the beginning of the buffer. - buffer_len := len(parser.buffer) - if parser.buffer_pos > 0 && parser.buffer_pos < buffer_len { - copy(parser.buffer, parser.buffer[parser.buffer_pos:]) - buffer_len -= parser.buffer_pos - parser.buffer_pos = 0 - } else if parser.buffer_pos == buffer_len { - buffer_len = 0 - parser.buffer_pos = 0 - } - - // Open the whole buffer for writing, and cut it before returning. - parser.buffer = parser.buffer[:cap(parser.buffer)] - - // Fill the buffer until it has enough characters. - first := true - for parser.unread < length { - - // Fill the raw buffer if necessary. - if !first || parser.raw_buffer_pos == len(parser.raw_buffer) { - if !yaml_parser_update_raw_buffer(parser) { - parser.buffer = parser.buffer[:buffer_len] - return false - } - } - first = false - - // Decode the raw buffer. - inner: - for parser.raw_buffer_pos != len(parser.raw_buffer) { - var value rune - var width int - - raw_unread := len(parser.raw_buffer) - parser.raw_buffer_pos - - // Decode the next character. - switch parser.encoding { - case yaml_UTF8_ENCODING: - // Decode a UTF-8 character. Check RFC 3629 - // (http://www.ietf.org/rfc/rfc3629.txt) for more details. - // - // The following table (taken from the RFC) is used for - // decoding. - // - // Char. number range | UTF-8 octet sequence - // (hexadecimal) | (binary) - // --------------------+------------------------------------ - // 0000 0000-0000 007F | 0xxxxxxx - // 0000 0080-0000 07FF | 110xxxxx 10xxxxxx - // 0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx - // 0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx - // - // Additionally, the characters in the range 0xD800-0xDFFF - // are prohibited as they are reserved for use with UTF-16 - // surrogate pairs. - - // Determine the length of the UTF-8 sequence. - octet := parser.raw_buffer[parser.raw_buffer_pos] - switch { - case octet&0x80 == 0x00: - width = 1 - case octet&0xE0 == 0xC0: - width = 2 - case octet&0xF0 == 0xE0: - width = 3 - case octet&0xF8 == 0xF0: - width = 4 - default: - // The leading octet is invalid. - return yaml_parser_set_reader_error(parser, - "invalid leading UTF-8 octet", - parser.offset, int(octet)) - } - - // Check if the raw buffer contains an incomplete character. - if width > raw_unread { - if parser.eof { - return yaml_parser_set_reader_error(parser, - "incomplete UTF-8 octet sequence", - parser.offset, -1) - } - break inner - } - - // Decode the leading octet. - switch { - case octet&0x80 == 0x00: - value = rune(octet & 0x7F) - case octet&0xE0 == 0xC0: - value = rune(octet & 0x1F) - case octet&0xF0 == 0xE0: - value = rune(octet & 0x0F) - case octet&0xF8 == 0xF0: - value = rune(octet & 0x07) - default: - value = 0 - } - - // Check and decode the trailing octets. - for k := 1; k < width; k++ { - octet = parser.raw_buffer[parser.raw_buffer_pos+k] - - // Check if the octet is valid. - if (octet & 0xC0) != 0x80 { - return yaml_parser_set_reader_error(parser, - "invalid trailing UTF-8 octet", - parser.offset+k, int(octet)) - } - - // Decode the octet. - value = (value << 6) + rune(octet&0x3F) - } - - // Check the length of the sequence against the value. - switch { - case width == 1: - case width == 2 && value >= 0x80: - case width == 3 && value >= 0x800: - case width == 4 && value >= 0x10000: - default: - return yaml_parser_set_reader_error(parser, - "invalid length of a UTF-8 sequence", - parser.offset, -1) - } - - // Check the range of the value. - if value >= 0xD800 && value <= 0xDFFF || value > 0x10FFFF { - return yaml_parser_set_reader_error(parser, - "invalid Unicode character", - parser.offset, int(value)) - } - - case yaml_UTF16LE_ENCODING, yaml_UTF16BE_ENCODING: - var low, high int - if parser.encoding == yaml_UTF16LE_ENCODING { - low, high = 0, 1 - } else { - low, high = 1, 0 - } - - // The UTF-16 encoding is not as simple as one might - // naively think. Check RFC 2781 - // (http://www.ietf.org/rfc/rfc2781.txt). - // - // Normally, two subsequent bytes describe a Unicode - // character. However a special technique (called a - // surrogate pair) is used for specifying character - // values larger than 0xFFFF. - // - // A surrogate pair consists of two pseudo-characters: - // high surrogate area (0xD800-0xDBFF) - // low surrogate area (0xDC00-0xDFFF) - // - // The following formulas are used for decoding - // and encoding characters using surrogate pairs: - // - // U = U' + 0x10000 (0x01 00 00 <= U <= 0x10 FF FF) - // U' = yyyyyyyyyyxxxxxxxxxx (0 <= U' <= 0x0F FF FF) - // W1 = 110110yyyyyyyyyy - // W2 = 110111xxxxxxxxxx - // - // where U is the character value, W1 is the high surrogate - // area, W2 is the low surrogate area. - - // Check for incomplete UTF-16 character. - if raw_unread < 2 { - if parser.eof { - return yaml_parser_set_reader_error(parser, - "incomplete UTF-16 character", - parser.offset, -1) - } - break inner - } - - // Get the character. - value = rune(parser.raw_buffer[parser.raw_buffer_pos+low]) + - (rune(parser.raw_buffer[parser.raw_buffer_pos+high]) << 8) - - // Check for unexpected low surrogate area. - if value&0xFC00 == 0xDC00 { - return yaml_parser_set_reader_error(parser, - "unexpected low surrogate area", - parser.offset, int(value)) - } - - // Check for a high surrogate area. - if value&0xFC00 == 0xD800 { - width = 4 - - // Check for incomplete surrogate pair. - if raw_unread < 4 { - if parser.eof { - return yaml_parser_set_reader_error(parser, - "incomplete UTF-16 surrogate pair", - parser.offset, -1) - } - break inner - } - - // Get the next character. - value2 := rune(parser.raw_buffer[parser.raw_buffer_pos+low+2]) + - (rune(parser.raw_buffer[parser.raw_buffer_pos+high+2]) << 8) - - // Check for a low surrogate area. - if value2&0xFC00 != 0xDC00 { - return yaml_parser_set_reader_error(parser, - "expected low surrogate area", - parser.offset+2, int(value2)) - } - - // Generate the value of the surrogate pair. - value = 0x10000 + ((value & 0x3FF) << 10) + (value2 & 0x3FF) - } else { - width = 2 - } - - default: - panic("impossible") - } - - // Check if the character is in the allowed range: - // #x9 | #xA | #xD | [#x20-#x7E] (8 bit) - // | #x85 | [#xA0-#xD7FF] | [#xE000-#xFFFD] (16 bit) - // | [#x10000-#x10FFFF] (32 bit) - switch { - case value == 0x09: - case value == 0x0A: - case value == 0x0D: - case value >= 0x20 && value <= 0x7E: - case value == 0x85: - case value >= 0xA0 && value <= 0xD7FF: - case value >= 0xE000 && value <= 0xFFFD: - case value >= 0x10000 && value <= 0x10FFFF: - default: - return yaml_parser_set_reader_error(parser, - "control characters are not allowed", - parser.offset, int(value)) - } - - // Move the raw pointers. - parser.raw_buffer_pos += width - parser.offset += width - - // Finally put the character into the buffer. - if value <= 0x7F { - // 0000 0000-0000 007F . 0xxxxxxx - parser.buffer[buffer_len+0] = byte(value) - buffer_len += 1 - } else if value <= 0x7FF { - // 0000 0080-0000 07FF . 110xxxxx 10xxxxxx - parser.buffer[buffer_len+0] = byte(0xC0 + (value >> 6)) - parser.buffer[buffer_len+1] = byte(0x80 + (value & 0x3F)) - buffer_len += 2 - } else if value <= 0xFFFF { - // 0000 0800-0000 FFFF . 1110xxxx 10xxxxxx 10xxxxxx - parser.buffer[buffer_len+0] = byte(0xE0 + (value >> 12)) - parser.buffer[buffer_len+1] = byte(0x80 + ((value >> 6) & 0x3F)) - parser.buffer[buffer_len+2] = byte(0x80 + (value & 0x3F)) - buffer_len += 3 - } else { - // 0001 0000-0010 FFFF . 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx - parser.buffer[buffer_len+0] = byte(0xF0 + (value >> 18)) - parser.buffer[buffer_len+1] = byte(0x80 + ((value >> 12) & 0x3F)) - parser.buffer[buffer_len+2] = byte(0x80 + ((value >> 6) & 0x3F)) - parser.buffer[buffer_len+3] = byte(0x80 + (value & 0x3F)) - buffer_len += 4 - } - - parser.unread++ - } - - // On EOF, put NUL into the buffer and return. - if parser.eof { - parser.buffer[buffer_len] = 0 - buffer_len++ - parser.unread++ - break - } - } - // [Go] Read the documentation of this function above. To return true, - // we need to have the given length in the buffer. Not doing that means - // every single check that calls this function to make sure the buffer - // has a given length is Go) panicking; or C) accessing invalid memory. - // This happens here due to the EOF above breaking early. - for buffer_len < length { - parser.buffer[buffer_len] = 0 - buffer_len++ - } - parser.buffer = parser.buffer[:buffer_len] - return true -} diff --git a/vendor/gopkg.in/yaml.v3/resolve.go b/vendor/gopkg.in/yaml.v3/resolve.go deleted file mode 100644 index 64ae888..0000000 --- a/vendor/gopkg.in/yaml.v3/resolve.go +++ /dev/null @@ -1,326 +0,0 @@ -// -// Copyright (c) 2011-2019 Canonical Ltd -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package yaml - -import ( - "encoding/base64" - "math" - "regexp" - "strconv" - "strings" - "time" -) - -type resolveMapItem struct { - value interface{} - tag string -} - -var resolveTable = make([]byte, 256) -var resolveMap = make(map[string]resolveMapItem) - -func init() { - t := resolveTable - t[int('+')] = 'S' // Sign - t[int('-')] = 'S' - for _, c := range "0123456789" { - t[int(c)] = 'D' // Digit - } - for _, c := range "yYnNtTfFoO~" { - t[int(c)] = 'M' // In map - } - t[int('.')] = '.' // Float (potentially in map) - - var resolveMapList = []struct { - v interface{} - tag string - l []string - }{ - {true, boolTag, []string{"true", "True", "TRUE"}}, - {false, boolTag, []string{"false", "False", "FALSE"}}, - {nil, nullTag, []string{"", "~", "null", "Null", "NULL"}}, - {math.NaN(), floatTag, []string{".nan", ".NaN", ".NAN"}}, - {math.Inf(+1), floatTag, []string{".inf", ".Inf", ".INF"}}, - {math.Inf(+1), floatTag, []string{"+.inf", "+.Inf", "+.INF"}}, - {math.Inf(-1), floatTag, []string{"-.inf", "-.Inf", "-.INF"}}, - {"<<", mergeTag, []string{"<<"}}, - } - - m := resolveMap - for _, item := range resolveMapList { - for _, s := range item.l { - m[s] = resolveMapItem{item.v, item.tag} - } - } -} - -const ( - nullTag = "!!null" - boolTag = "!!bool" - strTag = "!!str" - intTag = "!!int" - floatTag = "!!float" - timestampTag = "!!timestamp" - seqTag = "!!seq" - mapTag = "!!map" - binaryTag = "!!binary" - mergeTag = "!!merge" -) - -var longTags = make(map[string]string) -var shortTags = make(map[string]string) - -func init() { - for _, stag := range []string{nullTag, boolTag, strTag, intTag, floatTag, timestampTag, seqTag, mapTag, binaryTag, mergeTag} { - ltag := longTag(stag) - longTags[stag] = ltag - shortTags[ltag] = stag - } -} - -const longTagPrefix = "tag:yaml.org,2002:" - -func shortTag(tag string) string { - if strings.HasPrefix(tag, longTagPrefix) { - if stag, ok := shortTags[tag]; ok { - return stag - } - return "!!" + tag[len(longTagPrefix):] - } - return tag -} - -func longTag(tag string) string { - if strings.HasPrefix(tag, "!!") { - if ltag, ok := longTags[tag]; ok { - return ltag - } - return longTagPrefix + tag[2:] - } - return tag -} - -func resolvableTag(tag string) bool { - switch tag { - case "", strTag, boolTag, intTag, floatTag, nullTag, timestampTag: - return true - } - return false -} - -var yamlStyleFloat = regexp.MustCompile(`^[-+]?(\.[0-9]+|[0-9]+(\.[0-9]*)?)([eE][-+]?[0-9]+)?$`) - -func resolve(tag string, in string) (rtag string, out interface{}) { - tag = shortTag(tag) - if !resolvableTag(tag) { - return tag, in - } - - defer func() { - switch tag { - case "", rtag, strTag, binaryTag: - return - case floatTag: - if rtag == intTag { - switch v := out.(type) { - case int64: - rtag = floatTag - out = float64(v) - return - case int: - rtag = floatTag - out = float64(v) - return - } - } - } - failf("cannot decode %s `%s` as a %s", shortTag(rtag), in, shortTag(tag)) - }() - - // Any data is accepted as a !!str or !!binary. - // Otherwise, the prefix is enough of a hint about what it might be. - hint := byte('N') - if in != "" { - hint = resolveTable[in[0]] - } - if hint != 0 && tag != strTag && tag != binaryTag { - // Handle things we can lookup in a map. - if item, ok := resolveMap[in]; ok { - return item.tag, item.value - } - - // Base 60 floats are a bad idea, were dropped in YAML 1.2, and - // are purposefully unsupported here. They're still quoted on - // the way out for compatibility with other parser, though. - - switch hint { - case 'M': - // We've already checked the map above. - - case '.': - // Not in the map, so maybe a normal float. - floatv, err := strconv.ParseFloat(in, 64) - if err == nil { - return floatTag, floatv - } - - case 'D', 'S': - // Int, float, or timestamp. - // Only try values as a timestamp if the value is unquoted or there's an explicit - // !!timestamp tag. - if tag == "" || tag == timestampTag { - t, ok := parseTimestamp(in) - if ok { - return timestampTag, t - } - } - - plain := strings.Replace(in, "_", "", -1) - intv, err := strconv.ParseInt(plain, 0, 64) - if err == nil { - if intv == int64(int(intv)) { - return intTag, int(intv) - } else { - return intTag, intv - } - } - uintv, err := strconv.ParseUint(plain, 0, 64) - if err == nil { - return intTag, uintv - } - if yamlStyleFloat.MatchString(plain) { - floatv, err := strconv.ParseFloat(plain, 64) - if err == nil { - return floatTag, floatv - } - } - if strings.HasPrefix(plain, "0b") { - intv, err := strconv.ParseInt(plain[2:], 2, 64) - if err == nil { - if intv == int64(int(intv)) { - return intTag, int(intv) - } else { - return intTag, intv - } - } - uintv, err := strconv.ParseUint(plain[2:], 2, 64) - if err == nil { - return intTag, uintv - } - } else if strings.HasPrefix(plain, "-0b") { - intv, err := strconv.ParseInt("-"+plain[3:], 2, 64) - if err == nil { - if true || intv == int64(int(intv)) { - return intTag, int(intv) - } else { - return intTag, intv - } - } - } - // Octals as introduced in version 1.2 of the spec. - // Octals from the 1.1 spec, spelled as 0777, are still - // decoded by default in v3 as well for compatibility. - // May be dropped in v4 depending on how usage evolves. - if strings.HasPrefix(plain, "0o") { - intv, err := strconv.ParseInt(plain[2:], 8, 64) - if err == nil { - if intv == int64(int(intv)) { - return intTag, int(intv) - } else { - return intTag, intv - } - } - uintv, err := strconv.ParseUint(plain[2:], 8, 64) - if err == nil { - return intTag, uintv - } - } else if strings.HasPrefix(plain, "-0o") { - intv, err := strconv.ParseInt("-"+plain[3:], 8, 64) - if err == nil { - if true || intv == int64(int(intv)) { - return intTag, int(intv) - } else { - return intTag, intv - } - } - } - default: - panic("internal error: missing handler for resolver table: " + string(rune(hint)) + " (with " + in + ")") - } - } - return strTag, in -} - -// encodeBase64 encodes s as base64 that is broken up into multiple lines -// as appropriate for the resulting length. -func encodeBase64(s string) string { - const lineLen = 70 - encLen := base64.StdEncoding.EncodedLen(len(s)) - lines := encLen/lineLen + 1 - buf := make([]byte, encLen*2+lines) - in := buf[0:encLen] - out := buf[encLen:] - base64.StdEncoding.Encode(in, []byte(s)) - k := 0 - for i := 0; i < len(in); i += lineLen { - j := i + lineLen - if j > len(in) { - j = len(in) - } - k += copy(out[k:], in[i:j]) - if lines > 1 { - out[k] = '\n' - k++ - } - } - return string(out[:k]) -} - -// This is a subset of the formats allowed by the regular expression -// defined at http://yaml.org/type/timestamp.html. -var allowedTimestampFormats = []string{ - "2006-1-2T15:4:5.999999999Z07:00", // RCF3339Nano with short date fields. - "2006-1-2t15:4:5.999999999Z07:00", // RFC3339Nano with short date fields and lower-case "t". - "2006-1-2 15:4:5.999999999", // space separated with no time zone - "2006-1-2", // date only - // Notable exception: time.Parse cannot handle: "2001-12-14 21:59:43.10 -5" - // from the set of examples. -} - -// parseTimestamp parses s as a timestamp string and -// returns the timestamp and reports whether it succeeded. -// Timestamp formats are defined at http://yaml.org/type/timestamp.html -func parseTimestamp(s string) (time.Time, bool) { - // TODO write code to check all the formats supported by - // http://yaml.org/type/timestamp.html instead of using time.Parse. - - // Quick check: all date formats start with YYYY-. - i := 0 - for ; i < len(s); i++ { - if c := s[i]; c < '0' || c > '9' { - break - } - } - if i != 4 || i == len(s) || s[i] != '-' { - return time.Time{}, false - } - for _, format := range allowedTimestampFormats { - if t, err := time.Parse(format, s); err == nil { - return t, true - } - } - return time.Time{}, false -} diff --git a/vendor/gopkg.in/yaml.v3/scannerc.go b/vendor/gopkg.in/yaml.v3/scannerc.go deleted file mode 100644 index ca00701..0000000 --- a/vendor/gopkg.in/yaml.v3/scannerc.go +++ /dev/null @@ -1,3038 +0,0 @@ -// -// Copyright (c) 2011-2019 Canonical Ltd -// Copyright (c) 2006-2010 Kirill Simonov -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of -// this software and associated documentation files (the "Software"), to deal in -// the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -// of the Software, and to permit persons to whom the Software is furnished to do -// so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. - -package yaml - -import ( - "bytes" - "fmt" -) - -// Introduction -// ************ -// -// The following notes assume that you are familiar with the YAML specification -// (http://yaml.org/spec/1.2/spec.html). We mostly follow it, although in -// some cases we are less restrictive that it requires. -// -// The process of transforming a YAML stream into a sequence of events is -// divided on two steps: Scanning and Parsing. -// -// The Scanner transforms the input stream into a sequence of tokens, while the -// parser transform the sequence of tokens produced by the Scanner into a -// sequence of parsing events. -// -// The Scanner is rather clever and complicated. The Parser, on the contrary, -// is a straightforward implementation of a recursive-descendant parser (or, -// LL(1) parser, as it is usually called). -// -// Actually there are two issues of Scanning that might be called "clever", the -// rest is quite straightforward. The issues are "block collection start" and -// "simple keys". Both issues are explained below in details. -// -// Here the Scanning step is explained and implemented. We start with the list -// of all the tokens produced by the Scanner together with short descriptions. -// -// Now, tokens: -// -// STREAM-START(encoding) # The stream start. -// STREAM-END # The stream end. -// VERSION-DIRECTIVE(major,minor) # The '%YAML' directive. -// TAG-DIRECTIVE(handle,prefix) # The '%TAG' directive. -// DOCUMENT-START # '---' -// DOCUMENT-END # '...' -// BLOCK-SEQUENCE-START # Indentation increase denoting a block -// BLOCK-MAPPING-START # sequence or a block mapping. -// BLOCK-END # Indentation decrease. -// FLOW-SEQUENCE-START # '[' -// FLOW-SEQUENCE-END # ']' -// BLOCK-SEQUENCE-START # '{' -// BLOCK-SEQUENCE-END # '}' -// BLOCK-ENTRY # '-' -// FLOW-ENTRY # ',' -// KEY # '?' or nothing (simple keys). -// VALUE # ':' -// ALIAS(anchor) # '*anchor' -// ANCHOR(anchor) # '&anchor' -// TAG(handle,suffix) # '!handle!suffix' -// SCALAR(value,style) # A scalar. -// -// The following two tokens are "virtual" tokens denoting the beginning and the -// end of the stream: -// -// STREAM-START(encoding) -// STREAM-END -// -// We pass the information about the input stream encoding with the -// STREAM-START token. -// -// The next two tokens are responsible for tags: -// -// VERSION-DIRECTIVE(major,minor) -// TAG-DIRECTIVE(handle,prefix) -// -// Example: -// -// %YAML 1.1 -// %TAG ! !foo -// %TAG !yaml! tag:yaml.org,2002: -// --- -// -// The correspoding sequence of tokens: -// -// STREAM-START(utf-8) -// VERSION-DIRECTIVE(1,1) -// TAG-DIRECTIVE("!","!foo") -// TAG-DIRECTIVE("!yaml","tag:yaml.org,2002:") -// DOCUMENT-START -// STREAM-END -// -// Note that the VERSION-DIRECTIVE and TAG-DIRECTIVE tokens occupy a whole -// line. -// -// The document start and end indicators are represented by: -// -// DOCUMENT-START -// DOCUMENT-END -// -// Note that if a YAML stream contains an implicit document (without '---' -// and '...' indicators), no DOCUMENT-START and DOCUMENT-END tokens will be -// produced. -// -// In the following examples, we present whole documents together with the -// produced tokens. -// -// 1. An implicit document: -// -// 'a scalar' -// -// Tokens: -// -// STREAM-START(utf-8) -// SCALAR("a scalar",single-quoted) -// STREAM-END -// -// 2. An explicit document: -// -// --- -// 'a scalar' -// ... -// -// Tokens: -// -// STREAM-START(utf-8) -// DOCUMENT-START -// SCALAR("a scalar",single-quoted) -// DOCUMENT-END -// STREAM-END -// -// 3. Several documents in a stream: -// -// 'a scalar' -// --- -// 'another scalar' -// --- -// 'yet another scalar' -// -// Tokens: -// -// STREAM-START(utf-8) -// SCALAR("a scalar",single-quoted) -// DOCUMENT-START -// SCALAR("another scalar",single-quoted) -// DOCUMENT-START -// SCALAR("yet another scalar",single-quoted) -// STREAM-END -// -// We have already introduced the SCALAR token above. The following tokens are -// used to describe aliases, anchors, tag, and scalars: -// -// ALIAS(anchor) -// ANCHOR(anchor) -// TAG(handle,suffix) -// SCALAR(value,style) -// -// The following series of examples illustrate the usage of these tokens: -// -// 1. A recursive sequence: -// -// &A [ *A ] -// -// Tokens: -// -// STREAM-START(utf-8) -// ANCHOR("A") -// FLOW-SEQUENCE-START -// ALIAS("A") -// FLOW-SEQUENCE-END -// STREAM-END -// -// 2. A tagged scalar: -// -// !!float "3.14" # A good approximation. -// -// Tokens: -// -// STREAM-START(utf-8) -// TAG("!!","float") -// SCALAR("3.14",double-quoted) -// STREAM-END -// -// 3. Various scalar styles: -// -// --- # Implicit empty plain scalars do not produce tokens. -// --- a plain scalar -// --- 'a single-quoted scalar' -// --- "a double-quoted scalar" -// --- |- -// a literal scalar -// --- >- -// a folded -// scalar -// -// Tokens: -// -// STREAM-START(utf-8) -// DOCUMENT-START -// DOCUMENT-START -// SCALAR("a plain scalar",plain) -// DOCUMENT-START -// SCALAR("a single-quoted scalar",single-quoted) -// DOCUMENT-START -// SCALAR("a double-quoted scalar",double-quoted) -// DOCUMENT-START -// SCALAR("a literal scalar",literal) -// DOCUMENT-START -// SCALAR("a folded scalar",folded) -// STREAM-END -// -// Now it's time to review collection-related tokens. We will start with -// flow collections: -// -// FLOW-SEQUENCE-START -// FLOW-SEQUENCE-END -// FLOW-MAPPING-START -// FLOW-MAPPING-END -// FLOW-ENTRY -// KEY -// VALUE -// -// The tokens FLOW-SEQUENCE-START, FLOW-SEQUENCE-END, FLOW-MAPPING-START, and -// FLOW-MAPPING-END represent the indicators '[', ']', '{', and '}' -// correspondingly. FLOW-ENTRY represent the ',' indicator. Finally the -// indicators '?' and ':', which are used for denoting mapping keys and values, -// are represented by the KEY and VALUE tokens. -// -// The following examples show flow collections: -// -// 1. A flow sequence: -// -// [item 1, item 2, item 3] -// -// Tokens: -// -// STREAM-START(utf-8) -// FLOW-SEQUENCE-START -// SCALAR("item 1",plain) -// FLOW-ENTRY -// SCALAR("item 2",plain) -// FLOW-ENTRY -// SCALAR("item 3",plain) -// FLOW-SEQUENCE-END -// STREAM-END -// -// 2. A flow mapping: -// -// { -// a simple key: a value, # Note that the KEY token is produced. -// ? a complex key: another value, -// } -// -// Tokens: -// -// STREAM-START(utf-8) -// FLOW-MAPPING-START -// KEY -// SCALAR("a simple key",plain) -// VALUE -// SCALAR("a value",plain) -// FLOW-ENTRY -// KEY -// SCALAR("a complex key",plain) -// VALUE -// SCALAR("another value",plain) -// FLOW-ENTRY -// FLOW-MAPPING-END -// STREAM-END -// -// A simple key is a key which is not denoted by the '?' indicator. Note that -// the Scanner still produce the KEY token whenever it encounters a simple key. -// -// For scanning block collections, the following tokens are used (note that we -// repeat KEY and VALUE here): -// -// BLOCK-SEQUENCE-START -// BLOCK-MAPPING-START -// BLOCK-END -// BLOCK-ENTRY -// KEY -// VALUE -// -// The tokens BLOCK-SEQUENCE-START and BLOCK-MAPPING-START denote indentation -// increase that precedes a block collection (cf. the INDENT token in Python). -// The token BLOCK-END denote indentation decrease that ends a block collection -// (cf. the DEDENT token in Python). However YAML has some syntax pecularities -// that makes detections of these tokens more complex. -// -// The tokens BLOCK-ENTRY, KEY, and VALUE are used to represent the indicators -// '-', '?', and ':' correspondingly. -// -// The following examples show how the tokens BLOCK-SEQUENCE-START, -// BLOCK-MAPPING-START, and BLOCK-END are emitted by the Scanner: -// -// 1. Block sequences: -// -// - item 1 -// - item 2 -// - -// - item 3.1 -// - item 3.2 -// - -// key 1: value 1 -// key 2: value 2 -// -// Tokens: -// -// STREAM-START(utf-8) -// BLOCK-SEQUENCE-START -// BLOCK-ENTRY -// SCALAR("item 1",plain) -// BLOCK-ENTRY -// SCALAR("item 2",plain) -// BLOCK-ENTRY -// BLOCK-SEQUENCE-START -// BLOCK-ENTRY -// SCALAR("item 3.1",plain) -// BLOCK-ENTRY -// SCALAR("item 3.2",plain) -// BLOCK-END -// BLOCK-ENTRY -// BLOCK-MAPPING-START -// KEY -// SCALAR("key 1",plain) -// VALUE -// SCALAR("value 1",plain) -// KEY -// SCALAR("key 2",plain) -// VALUE -// SCALAR("value 2",plain) -// BLOCK-END -// BLOCK-END -// STREAM-END -// -// 2. Block mappings: -// -// a simple key: a value # The KEY token is produced here. -// ? a complex key -// : another value -// a mapping: -// key 1: value 1 -// key 2: value 2 -// a sequence: -// - item 1 -// - item 2 -// -// Tokens: -// -// STREAM-START(utf-8) -// BLOCK-MAPPING-START -// KEY -// SCALAR("a simple key",plain) -// VALUE -// SCALAR("a value",plain) -// KEY -// SCALAR("a complex key",plain) -// VALUE -// SCALAR("another value",plain) -// KEY -// SCALAR("a mapping",plain) -// BLOCK-MAPPING-START -// KEY -// SCALAR("key 1",plain) -// VALUE -// SCALAR("value 1",plain) -// KEY -// SCALAR("key 2",plain) -// VALUE -// SCALAR("value 2",plain) -// BLOCK-END -// KEY -// SCALAR("a sequence",plain) -// VALUE -// BLOCK-SEQUENCE-START -// BLOCK-ENTRY -// SCALAR("item 1",plain) -// BLOCK-ENTRY -// SCALAR("item 2",plain) -// BLOCK-END -// BLOCK-END -// STREAM-END -// -// YAML does not always require to start a new block collection from a new -// line. If the current line contains only '-', '?', and ':' indicators, a new -// block collection may start at the current line. The following examples -// illustrate this case: -// -// 1. Collections in a sequence: -// -// - - item 1 -// - item 2 -// - key 1: value 1 -// key 2: value 2 -// - ? complex key -// : complex value -// -// Tokens: -// -// STREAM-START(utf-8) -// BLOCK-SEQUENCE-START -// BLOCK-ENTRY -// BLOCK-SEQUENCE-START -// BLOCK-ENTRY -// SCALAR("item 1",plain) -// BLOCK-ENTRY -// SCALAR("item 2",plain) -// BLOCK-END -// BLOCK-ENTRY -// BLOCK-MAPPING-START -// KEY -// SCALAR("key 1",plain) -// VALUE -// SCALAR("value 1",plain) -// KEY -// SCALAR("key 2",plain) -// VALUE -// SCALAR("value 2",plain) -// BLOCK-END -// BLOCK-ENTRY -// BLOCK-MAPPING-START -// KEY -// SCALAR("complex key") -// VALUE -// SCALAR("complex value") -// BLOCK-END -// BLOCK-END -// STREAM-END -// -// 2. Collections in a mapping: -// -// ? a sequence -// : - item 1 -// - item 2 -// ? a mapping -// : key 1: value 1 -// key 2: value 2 -// -// Tokens: -// -// STREAM-START(utf-8) -// BLOCK-MAPPING-START -// KEY -// SCALAR("a sequence",plain) -// VALUE -// BLOCK-SEQUENCE-START -// BLOCK-ENTRY -// SCALAR("item 1",plain) -// BLOCK-ENTRY -// SCALAR("item 2",plain) -// BLOCK-END -// KEY -// SCALAR("a mapping",plain) -// VALUE -// BLOCK-MAPPING-START -// KEY -// SCALAR("key 1",plain) -// VALUE -// SCALAR("value 1",plain) -// KEY -// SCALAR("key 2",plain) -// VALUE -// SCALAR("value 2",plain) -// BLOCK-END -// BLOCK-END -// STREAM-END -// -// YAML also permits non-indented sequences if they are included into a block -// mapping. In this case, the token BLOCK-SEQUENCE-START is not produced: -// -// key: -// - item 1 # BLOCK-SEQUENCE-START is NOT produced here. -// - item 2 -// -// Tokens: -// -// STREAM-START(utf-8) -// BLOCK-MAPPING-START -// KEY -// SCALAR("key",plain) -// VALUE -// BLOCK-ENTRY -// SCALAR("item 1",plain) -// BLOCK-ENTRY -// SCALAR("item 2",plain) -// BLOCK-END -// - -// Ensure that the buffer contains the required number of characters. -// Return true on success, false on failure (reader error or memory error). -func cache(parser *yaml_parser_t, length int) bool { - // [Go] This was inlined: !cache(A, B) -> unread < B && !update(A, B) - return parser.unread >= length || yaml_parser_update_buffer(parser, length) -} - -// Advance the buffer pointer. -func skip(parser *yaml_parser_t) { - if !is_blank(parser.buffer, parser.buffer_pos) { - parser.newlines = 0 - } - parser.mark.index++ - parser.mark.column++ - parser.unread-- - parser.buffer_pos += width(parser.buffer[parser.buffer_pos]) -} - -func skip_line(parser *yaml_parser_t) { - if is_crlf(parser.buffer, parser.buffer_pos) { - parser.mark.index += 2 - parser.mark.column = 0 - parser.mark.line++ - parser.unread -= 2 - parser.buffer_pos += 2 - parser.newlines++ - } else if is_break(parser.buffer, parser.buffer_pos) { - parser.mark.index++ - parser.mark.column = 0 - parser.mark.line++ - parser.unread-- - parser.buffer_pos += width(parser.buffer[parser.buffer_pos]) - parser.newlines++ - } -} - -// Copy a character to a string buffer and advance pointers. -func read(parser *yaml_parser_t, s []byte) []byte { - if !is_blank(parser.buffer, parser.buffer_pos) { - parser.newlines = 0 - } - w := width(parser.buffer[parser.buffer_pos]) - if w == 0 { - panic("invalid character sequence") - } - if len(s) == 0 { - s = make([]byte, 0, 32) - } - if w == 1 && len(s)+w <= cap(s) { - s = s[:len(s)+1] - s[len(s)-1] = parser.buffer[parser.buffer_pos] - parser.buffer_pos++ - } else { - s = append(s, parser.buffer[parser.buffer_pos:parser.buffer_pos+w]...) - parser.buffer_pos += w - } - parser.mark.index++ - parser.mark.column++ - parser.unread-- - return s -} - -// Copy a line break character to a string buffer and advance pointers. -func read_line(parser *yaml_parser_t, s []byte) []byte { - buf := parser.buffer - pos := parser.buffer_pos - switch { - case buf[pos] == '\r' && buf[pos+1] == '\n': - // CR LF . LF - s = append(s, '\n') - parser.buffer_pos += 2 - parser.mark.index++ - parser.unread-- - case buf[pos] == '\r' || buf[pos] == '\n': - // CR|LF . LF - s = append(s, '\n') - parser.buffer_pos += 1 - case buf[pos] == '\xC2' && buf[pos+1] == '\x85': - // NEL . LF - s = append(s, '\n') - parser.buffer_pos += 2 - case buf[pos] == '\xE2' && buf[pos+1] == '\x80' && (buf[pos+2] == '\xA8' || buf[pos+2] == '\xA9'): - // LS|PS . LS|PS - s = append(s, buf[parser.buffer_pos:pos+3]...) - parser.buffer_pos += 3 - default: - return s - } - parser.mark.index++ - parser.mark.column = 0 - parser.mark.line++ - parser.unread-- - parser.newlines++ - return s -} - -// Get the next token. -func yaml_parser_scan(parser *yaml_parser_t, token *yaml_token_t) bool { - // Erase the token object. - *token = yaml_token_t{} // [Go] Is this necessary? - - // No tokens after STREAM-END or error. - if parser.stream_end_produced || parser.error != yaml_NO_ERROR { - return true - } - - // Ensure that the tokens queue contains enough tokens. - if !parser.token_available { - if !yaml_parser_fetch_more_tokens(parser) { - return false - } - } - - // Fetch the next token from the queue. - *token = parser.tokens[parser.tokens_head] - parser.tokens_head++ - parser.tokens_parsed++ - parser.token_available = false - - if token.typ == yaml_STREAM_END_TOKEN { - parser.stream_end_produced = true - } - return true -} - -// Set the scanner error and return false. -func yaml_parser_set_scanner_error(parser *yaml_parser_t, context string, context_mark yaml_mark_t, problem string) bool { - parser.error = yaml_SCANNER_ERROR - parser.context = context - parser.context_mark = context_mark - parser.problem = problem - parser.problem_mark = parser.mark - return false -} - -func yaml_parser_set_scanner_tag_error(parser *yaml_parser_t, directive bool, context_mark yaml_mark_t, problem string) bool { - context := "while parsing a tag" - if directive { - context = "while parsing a %TAG directive" - } - return yaml_parser_set_scanner_error(parser, context, context_mark, problem) -} - -func trace(args ...interface{}) func() { - pargs := append([]interface{}{"+++"}, args...) - fmt.Println(pargs...) - pargs = append([]interface{}{"---"}, args...) - return func() { fmt.Println(pargs...) } -} - -// Ensure that the tokens queue contains at least one token which can be -// returned to the Parser. -func yaml_parser_fetch_more_tokens(parser *yaml_parser_t) bool { - // While we need more tokens to fetch, do it. - for { - // [Go] The comment parsing logic requires a lookahead of two tokens - // so that foot comments may be parsed in time of associating them - // with the tokens that are parsed before them, and also for line - // comments to be transformed into head comments in some edge cases. - if parser.tokens_head < len(parser.tokens)-2 { - // If a potential simple key is at the head position, we need to fetch - // the next token to disambiguate it. - head_tok_idx, ok := parser.simple_keys_by_tok[parser.tokens_parsed] - if !ok { - break - } else if valid, ok := yaml_simple_key_is_valid(parser, &parser.simple_keys[head_tok_idx]); !ok { - return false - } else if !valid { - break - } - } - // Fetch the next token. - if !yaml_parser_fetch_next_token(parser) { - return false - } - } - - parser.token_available = true - return true -} - -// The dispatcher for token fetchers. -func yaml_parser_fetch_next_token(parser *yaml_parser_t) (ok bool) { - // Ensure that the buffer is initialized. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - - // Check if we just started scanning. Fetch STREAM-START then. - if !parser.stream_start_produced { - return yaml_parser_fetch_stream_start(parser) - } - - scan_mark := parser.mark - - // Eat whitespaces and comments until we reach the next token. - if !yaml_parser_scan_to_next_token(parser) { - return false - } - - // [Go] While unrolling indents, transform the head comments of prior - // indentation levels observed after scan_start into foot comments at - // the respective indexes. - - // Check the indentation level against the current column. - if !yaml_parser_unroll_indent(parser, parser.mark.column, scan_mark) { - return false - } - - // Ensure that the buffer contains at least 4 characters. 4 is the length - // of the longest indicators ('--- ' and '... '). - if parser.unread < 4 && !yaml_parser_update_buffer(parser, 4) { - return false - } - - // Is it the end of the stream? - if is_z(parser.buffer, parser.buffer_pos) { - return yaml_parser_fetch_stream_end(parser) - } - - // Is it a directive? - if parser.mark.column == 0 && parser.buffer[parser.buffer_pos] == '%' { - return yaml_parser_fetch_directive(parser) - } - - buf := parser.buffer - pos := parser.buffer_pos - - // Is it the document start indicator? - if parser.mark.column == 0 && buf[pos] == '-' && buf[pos+1] == '-' && buf[pos+2] == '-' && is_blankz(buf, pos+3) { - return yaml_parser_fetch_document_indicator(parser, yaml_DOCUMENT_START_TOKEN) - } - - // Is it the document end indicator? - if parser.mark.column == 0 && buf[pos] == '.' && buf[pos+1] == '.' && buf[pos+2] == '.' && is_blankz(buf, pos+3) { - return yaml_parser_fetch_document_indicator(parser, yaml_DOCUMENT_END_TOKEN) - } - - comment_mark := parser.mark - if len(parser.tokens) > 0 && (parser.flow_level == 0 && buf[pos] == ':' || parser.flow_level > 0 && buf[pos] == ',') { - // Associate any following comments with the prior token. - comment_mark = parser.tokens[len(parser.tokens)-1].start_mark - } - defer func() { - if !ok { - return - } - if len(parser.tokens) > 0 && parser.tokens[len(parser.tokens)-1].typ == yaml_BLOCK_ENTRY_TOKEN { - // Sequence indicators alone have no line comments. It becomes - // a head comment for whatever follows. - return - } - if !yaml_parser_scan_line_comment(parser, comment_mark) { - ok = false - return - } - }() - - // Is it the flow sequence start indicator? - if buf[pos] == '[' { - return yaml_parser_fetch_flow_collection_start(parser, yaml_FLOW_SEQUENCE_START_TOKEN) - } - - // Is it the flow mapping start indicator? - if parser.buffer[parser.buffer_pos] == '{' { - return yaml_parser_fetch_flow_collection_start(parser, yaml_FLOW_MAPPING_START_TOKEN) - } - - // Is it the flow sequence end indicator? - if parser.buffer[parser.buffer_pos] == ']' { - return yaml_parser_fetch_flow_collection_end(parser, - yaml_FLOW_SEQUENCE_END_TOKEN) - } - - // Is it the flow mapping end indicator? - if parser.buffer[parser.buffer_pos] == '}' { - return yaml_parser_fetch_flow_collection_end(parser, - yaml_FLOW_MAPPING_END_TOKEN) - } - - // Is it the flow entry indicator? - if parser.buffer[parser.buffer_pos] == ',' { - return yaml_parser_fetch_flow_entry(parser) - } - - // Is it the block entry indicator? - if parser.buffer[parser.buffer_pos] == '-' && is_blankz(parser.buffer, parser.buffer_pos+1) { - return yaml_parser_fetch_block_entry(parser) - } - - // Is it the key indicator? - if parser.buffer[parser.buffer_pos] == '?' && (parser.flow_level > 0 || is_blankz(parser.buffer, parser.buffer_pos+1)) { - return yaml_parser_fetch_key(parser) - } - - // Is it the value indicator? - if parser.buffer[parser.buffer_pos] == ':' && (parser.flow_level > 0 || is_blankz(parser.buffer, parser.buffer_pos+1)) { - return yaml_parser_fetch_value(parser) - } - - // Is it an alias? - if parser.buffer[parser.buffer_pos] == '*' { - return yaml_parser_fetch_anchor(parser, yaml_ALIAS_TOKEN) - } - - // Is it an anchor? - if parser.buffer[parser.buffer_pos] == '&' { - return yaml_parser_fetch_anchor(parser, yaml_ANCHOR_TOKEN) - } - - // Is it a tag? - if parser.buffer[parser.buffer_pos] == '!' { - return yaml_parser_fetch_tag(parser) - } - - // Is it a literal scalar? - if parser.buffer[parser.buffer_pos] == '|' && parser.flow_level == 0 { - return yaml_parser_fetch_block_scalar(parser, true) - } - - // Is it a folded scalar? - if parser.buffer[parser.buffer_pos] == '>' && parser.flow_level == 0 { - return yaml_parser_fetch_block_scalar(parser, false) - } - - // Is it a single-quoted scalar? - if parser.buffer[parser.buffer_pos] == '\'' { - return yaml_parser_fetch_flow_scalar(parser, true) - } - - // Is it a double-quoted scalar? - if parser.buffer[parser.buffer_pos] == '"' { - return yaml_parser_fetch_flow_scalar(parser, false) - } - - // Is it a plain scalar? - // - // A plain scalar may start with any non-blank characters except - // - // '-', '?', ':', ',', '[', ']', '{', '}', - // '#', '&', '*', '!', '|', '>', '\'', '\"', - // '%', '@', '`'. - // - // In the block context (and, for the '-' indicator, in the flow context - // too), it may also start with the characters - // - // '-', '?', ':' - // - // if it is followed by a non-space character. - // - // The last rule is more restrictive than the specification requires. - // [Go] TODO Make this logic more reasonable. - //switch parser.buffer[parser.buffer_pos] { - //case '-', '?', ':', ',', '?', '-', ',', ':', ']', '[', '}', '{', '&', '#', '!', '*', '>', '|', '"', '\'', '@', '%', '-', '`': - //} - if !(is_blankz(parser.buffer, parser.buffer_pos) || parser.buffer[parser.buffer_pos] == '-' || - parser.buffer[parser.buffer_pos] == '?' || parser.buffer[parser.buffer_pos] == ':' || - parser.buffer[parser.buffer_pos] == ',' || parser.buffer[parser.buffer_pos] == '[' || - parser.buffer[parser.buffer_pos] == ']' || parser.buffer[parser.buffer_pos] == '{' || - parser.buffer[parser.buffer_pos] == '}' || parser.buffer[parser.buffer_pos] == '#' || - parser.buffer[parser.buffer_pos] == '&' || parser.buffer[parser.buffer_pos] == '*' || - parser.buffer[parser.buffer_pos] == '!' || parser.buffer[parser.buffer_pos] == '|' || - parser.buffer[parser.buffer_pos] == '>' || parser.buffer[parser.buffer_pos] == '\'' || - parser.buffer[parser.buffer_pos] == '"' || parser.buffer[parser.buffer_pos] == '%' || - parser.buffer[parser.buffer_pos] == '@' || parser.buffer[parser.buffer_pos] == '`') || - (parser.buffer[parser.buffer_pos] == '-' && !is_blank(parser.buffer, parser.buffer_pos+1)) || - (parser.flow_level == 0 && - (parser.buffer[parser.buffer_pos] == '?' || parser.buffer[parser.buffer_pos] == ':') && - !is_blankz(parser.buffer, parser.buffer_pos+1)) { - return yaml_parser_fetch_plain_scalar(parser) - } - - // If we don't determine the token type so far, it is an error. - return yaml_parser_set_scanner_error(parser, - "while scanning for the next token", parser.mark, - "found character that cannot start any token") -} - -func yaml_simple_key_is_valid(parser *yaml_parser_t, simple_key *yaml_simple_key_t) (valid, ok bool) { - if !simple_key.possible { - return false, true - } - - // The 1.2 specification says: - // - // "If the ? indicator is omitted, parsing needs to see past the - // implicit key to recognize it as such. To limit the amount of - // lookahead required, the “:” indicator must appear at most 1024 - // Unicode characters beyond the start of the key. In addition, the key - // is restricted to a single line." - // - if simple_key.mark.line < parser.mark.line || simple_key.mark.index+1024 < parser.mark.index { - // Check if the potential simple key to be removed is required. - if simple_key.required { - return false, yaml_parser_set_scanner_error(parser, - "while scanning a simple key", simple_key.mark, - "could not find expected ':'") - } - simple_key.possible = false - return false, true - } - return true, true -} - -// Check if a simple key may start at the current position and add it if -// needed. -func yaml_parser_save_simple_key(parser *yaml_parser_t) bool { - // A simple key is required at the current position if the scanner is in - // the block context and the current column coincides with the indentation - // level. - - required := parser.flow_level == 0 && parser.indent == parser.mark.column - - // - // If the current position may start a simple key, save it. - // - if parser.simple_key_allowed { - simple_key := yaml_simple_key_t{ - possible: true, - required: required, - token_number: parser.tokens_parsed + (len(parser.tokens) - parser.tokens_head), - mark: parser.mark, - } - - if !yaml_parser_remove_simple_key(parser) { - return false - } - parser.simple_keys[len(parser.simple_keys)-1] = simple_key - parser.simple_keys_by_tok[simple_key.token_number] = len(parser.simple_keys) - 1 - } - return true -} - -// Remove a potential simple key at the current flow level. -func yaml_parser_remove_simple_key(parser *yaml_parser_t) bool { - i := len(parser.simple_keys) - 1 - if parser.simple_keys[i].possible { - // If the key is required, it is an error. - if parser.simple_keys[i].required { - return yaml_parser_set_scanner_error(parser, - "while scanning a simple key", parser.simple_keys[i].mark, - "could not find expected ':'") - } - // Remove the key from the stack. - parser.simple_keys[i].possible = false - delete(parser.simple_keys_by_tok, parser.simple_keys[i].token_number) - } - return true -} - -// max_flow_level limits the flow_level -const max_flow_level = 10000 - -// Increase the flow level and resize the simple key list if needed. -func yaml_parser_increase_flow_level(parser *yaml_parser_t) bool { - // Reset the simple key on the next level. - parser.simple_keys = append(parser.simple_keys, yaml_simple_key_t{ - possible: false, - required: false, - token_number: parser.tokens_parsed + (len(parser.tokens) - parser.tokens_head), - mark: parser.mark, - }) - - // Increase the flow level. - parser.flow_level++ - if parser.flow_level > max_flow_level { - return yaml_parser_set_scanner_error(parser, - "while increasing flow level", parser.simple_keys[len(parser.simple_keys)-1].mark, - fmt.Sprintf("exceeded max depth of %d", max_flow_level)) - } - return true -} - -// Decrease the flow level. -func yaml_parser_decrease_flow_level(parser *yaml_parser_t) bool { - if parser.flow_level > 0 { - parser.flow_level-- - last := len(parser.simple_keys) - 1 - delete(parser.simple_keys_by_tok, parser.simple_keys[last].token_number) - parser.simple_keys = parser.simple_keys[:last] - } - return true -} - -// max_indents limits the indents stack size -const max_indents = 10000 - -// Push the current indentation level to the stack and set the new level -// the current column is greater than the indentation level. In this case, -// append or insert the specified token into the token queue. -func yaml_parser_roll_indent(parser *yaml_parser_t, column, number int, typ yaml_token_type_t, mark yaml_mark_t) bool { - // In the flow context, do nothing. - if parser.flow_level > 0 { - return true - } - - if parser.indent < column { - // Push the current indentation level to the stack and set the new - // indentation level. - parser.indents = append(parser.indents, parser.indent) - parser.indent = column - if len(parser.indents) > max_indents { - return yaml_parser_set_scanner_error(parser, - "while increasing indent level", parser.simple_keys[len(parser.simple_keys)-1].mark, - fmt.Sprintf("exceeded max depth of %d", max_indents)) - } - - // Create a token and insert it into the queue. - token := yaml_token_t{ - typ: typ, - start_mark: mark, - end_mark: mark, - } - if number > -1 { - number -= parser.tokens_parsed - } - yaml_insert_token(parser, number, &token) - } - return true -} - -// Pop indentation levels from the indents stack until the current level -// becomes less or equal to the column. For each indentation level, append -// the BLOCK-END token. -func yaml_parser_unroll_indent(parser *yaml_parser_t, column int, scan_mark yaml_mark_t) bool { - // In the flow context, do nothing. - if parser.flow_level > 0 { - return true - } - - block_mark := scan_mark - block_mark.index-- - - // Loop through the indentation levels in the stack. - for parser.indent > column { - - // [Go] Reposition the end token before potential following - // foot comments of parent blocks. For that, search - // backwards for recent comments that were at the same - // indent as the block that is ending now. - stop_index := block_mark.index - for i := len(parser.comments) - 1; i >= 0; i-- { - comment := &parser.comments[i] - - if comment.end_mark.index < stop_index { - // Don't go back beyond the start of the comment/whitespace scan, unless column < 0. - // If requested indent column is < 0, then the document is over and everything else - // is a foot anyway. - break - } - if comment.start_mark.column == parser.indent+1 { - // This is a good match. But maybe there's a former comment - // at that same indent level, so keep searching. - block_mark = comment.start_mark - } - - // While the end of the former comment matches with - // the start of the following one, we know there's - // nothing in between and scanning is still safe. - stop_index = comment.scan_mark.index - } - - // Create a token and append it to the queue. - token := yaml_token_t{ - typ: yaml_BLOCK_END_TOKEN, - start_mark: block_mark, - end_mark: block_mark, - } - yaml_insert_token(parser, -1, &token) - - // Pop the indentation level. - parser.indent = parser.indents[len(parser.indents)-1] - parser.indents = parser.indents[:len(parser.indents)-1] - } - return true -} - -// Initialize the scanner and produce the STREAM-START token. -func yaml_parser_fetch_stream_start(parser *yaml_parser_t) bool { - - // Set the initial indentation. - parser.indent = -1 - - // Initialize the simple key stack. - parser.simple_keys = append(parser.simple_keys, yaml_simple_key_t{}) - - parser.simple_keys_by_tok = make(map[int]int) - - // A simple key is allowed at the beginning of the stream. - parser.simple_key_allowed = true - - // We have started. - parser.stream_start_produced = true - - // Create the STREAM-START token and append it to the queue. - token := yaml_token_t{ - typ: yaml_STREAM_START_TOKEN, - start_mark: parser.mark, - end_mark: parser.mark, - encoding: parser.encoding, - } - yaml_insert_token(parser, -1, &token) - return true -} - -// Produce the STREAM-END token and shut down the scanner. -func yaml_parser_fetch_stream_end(parser *yaml_parser_t) bool { - - // Force new line. - if parser.mark.column != 0 { - parser.mark.column = 0 - parser.mark.line++ - } - - // Reset the indentation level. - if !yaml_parser_unroll_indent(parser, -1, parser.mark) { - return false - } - - // Reset simple keys. - if !yaml_parser_remove_simple_key(parser) { - return false - } - - parser.simple_key_allowed = false - - // Create the STREAM-END token and append it to the queue. - token := yaml_token_t{ - typ: yaml_STREAM_END_TOKEN, - start_mark: parser.mark, - end_mark: parser.mark, - } - yaml_insert_token(parser, -1, &token) - return true -} - -// Produce a VERSION-DIRECTIVE or TAG-DIRECTIVE token. -func yaml_parser_fetch_directive(parser *yaml_parser_t) bool { - // Reset the indentation level. - if !yaml_parser_unroll_indent(parser, -1, parser.mark) { - return false - } - - // Reset simple keys. - if !yaml_parser_remove_simple_key(parser) { - return false - } - - parser.simple_key_allowed = false - - // Create the YAML-DIRECTIVE or TAG-DIRECTIVE token. - token := yaml_token_t{} - if !yaml_parser_scan_directive(parser, &token) { - return false - } - // Append the token to the queue. - yaml_insert_token(parser, -1, &token) - return true -} - -// Produce the DOCUMENT-START or DOCUMENT-END token. -func yaml_parser_fetch_document_indicator(parser *yaml_parser_t, typ yaml_token_type_t) bool { - // Reset the indentation level. - if !yaml_parser_unroll_indent(parser, -1, parser.mark) { - return false - } - - // Reset simple keys. - if !yaml_parser_remove_simple_key(parser) { - return false - } - - parser.simple_key_allowed = false - - // Consume the token. - start_mark := parser.mark - - skip(parser) - skip(parser) - skip(parser) - - end_mark := parser.mark - - // Create the DOCUMENT-START or DOCUMENT-END token. - token := yaml_token_t{ - typ: typ, - start_mark: start_mark, - end_mark: end_mark, - } - // Append the token to the queue. - yaml_insert_token(parser, -1, &token) - return true -} - -// Produce the FLOW-SEQUENCE-START or FLOW-MAPPING-START token. -func yaml_parser_fetch_flow_collection_start(parser *yaml_parser_t, typ yaml_token_type_t) bool { - - // The indicators '[' and '{' may start a simple key. - if !yaml_parser_save_simple_key(parser) { - return false - } - - // Increase the flow level. - if !yaml_parser_increase_flow_level(parser) { - return false - } - - // A simple key may follow the indicators '[' and '{'. - parser.simple_key_allowed = true - - // Consume the token. - start_mark := parser.mark - skip(parser) - end_mark := parser.mark - - // Create the FLOW-SEQUENCE-START of FLOW-MAPPING-START token. - token := yaml_token_t{ - typ: typ, - start_mark: start_mark, - end_mark: end_mark, - } - // Append the token to the queue. - yaml_insert_token(parser, -1, &token) - return true -} - -// Produce the FLOW-SEQUENCE-END or FLOW-MAPPING-END token. -func yaml_parser_fetch_flow_collection_end(parser *yaml_parser_t, typ yaml_token_type_t) bool { - // Reset any potential simple key on the current flow level. - if !yaml_parser_remove_simple_key(parser) { - return false - } - - // Decrease the flow level. - if !yaml_parser_decrease_flow_level(parser) { - return false - } - - // No simple keys after the indicators ']' and '}'. - parser.simple_key_allowed = false - - // Consume the token. - - start_mark := parser.mark - skip(parser) - end_mark := parser.mark - - // Create the FLOW-SEQUENCE-END of FLOW-MAPPING-END token. - token := yaml_token_t{ - typ: typ, - start_mark: start_mark, - end_mark: end_mark, - } - // Append the token to the queue. - yaml_insert_token(parser, -1, &token) - return true -} - -// Produce the FLOW-ENTRY token. -func yaml_parser_fetch_flow_entry(parser *yaml_parser_t) bool { - // Reset any potential simple keys on the current flow level. - if !yaml_parser_remove_simple_key(parser) { - return false - } - - // Simple keys are allowed after ','. - parser.simple_key_allowed = true - - // Consume the token. - start_mark := parser.mark - skip(parser) - end_mark := parser.mark - - // Create the FLOW-ENTRY token and append it to the queue. - token := yaml_token_t{ - typ: yaml_FLOW_ENTRY_TOKEN, - start_mark: start_mark, - end_mark: end_mark, - } - yaml_insert_token(parser, -1, &token) - return true -} - -// Produce the BLOCK-ENTRY token. -func yaml_parser_fetch_block_entry(parser *yaml_parser_t) bool { - // Check if the scanner is in the block context. - if parser.flow_level == 0 { - // Check if we are allowed to start a new entry. - if !parser.simple_key_allowed { - return yaml_parser_set_scanner_error(parser, "", parser.mark, - "block sequence entries are not allowed in this context") - } - // Add the BLOCK-SEQUENCE-START token if needed. - if !yaml_parser_roll_indent(parser, parser.mark.column, -1, yaml_BLOCK_SEQUENCE_START_TOKEN, parser.mark) { - return false - } - } else { - // It is an error for the '-' indicator to occur in the flow context, - // but we let the Parser detect and report about it because the Parser - // is able to point to the context. - } - - // Reset any potential simple keys on the current flow level. - if !yaml_parser_remove_simple_key(parser) { - return false - } - - // Simple keys are allowed after '-'. - parser.simple_key_allowed = true - - // Consume the token. - start_mark := parser.mark - skip(parser) - end_mark := parser.mark - - // Create the BLOCK-ENTRY token and append it to the queue. - token := yaml_token_t{ - typ: yaml_BLOCK_ENTRY_TOKEN, - start_mark: start_mark, - end_mark: end_mark, - } - yaml_insert_token(parser, -1, &token) - return true -} - -// Produce the KEY token. -func yaml_parser_fetch_key(parser *yaml_parser_t) bool { - - // In the block context, additional checks are required. - if parser.flow_level == 0 { - // Check if we are allowed to start a new key (not nessesary simple). - if !parser.simple_key_allowed { - return yaml_parser_set_scanner_error(parser, "", parser.mark, - "mapping keys are not allowed in this context") - } - // Add the BLOCK-MAPPING-START token if needed. - if !yaml_parser_roll_indent(parser, parser.mark.column, -1, yaml_BLOCK_MAPPING_START_TOKEN, parser.mark) { - return false - } - } - - // Reset any potential simple keys on the current flow level. - if !yaml_parser_remove_simple_key(parser) { - return false - } - - // Simple keys are allowed after '?' in the block context. - parser.simple_key_allowed = parser.flow_level == 0 - - // Consume the token. - start_mark := parser.mark - skip(parser) - end_mark := parser.mark - - // Create the KEY token and append it to the queue. - token := yaml_token_t{ - typ: yaml_KEY_TOKEN, - start_mark: start_mark, - end_mark: end_mark, - } - yaml_insert_token(parser, -1, &token) - return true -} - -// Produce the VALUE token. -func yaml_parser_fetch_value(parser *yaml_parser_t) bool { - - simple_key := &parser.simple_keys[len(parser.simple_keys)-1] - - // Have we found a simple key? - if valid, ok := yaml_simple_key_is_valid(parser, simple_key); !ok { - return false - - } else if valid { - - // Create the KEY token and insert it into the queue. - token := yaml_token_t{ - typ: yaml_KEY_TOKEN, - start_mark: simple_key.mark, - end_mark: simple_key.mark, - } - yaml_insert_token(parser, simple_key.token_number-parser.tokens_parsed, &token) - - // In the block context, we may need to add the BLOCK-MAPPING-START token. - if !yaml_parser_roll_indent(parser, simple_key.mark.column, - simple_key.token_number, - yaml_BLOCK_MAPPING_START_TOKEN, simple_key.mark) { - return false - } - - // Remove the simple key. - simple_key.possible = false - delete(parser.simple_keys_by_tok, simple_key.token_number) - - // A simple key cannot follow another simple key. - parser.simple_key_allowed = false - - } else { - // The ':' indicator follows a complex key. - - // In the block context, extra checks are required. - if parser.flow_level == 0 { - - // Check if we are allowed to start a complex value. - if !parser.simple_key_allowed { - return yaml_parser_set_scanner_error(parser, "", parser.mark, - "mapping values are not allowed in this context") - } - - // Add the BLOCK-MAPPING-START token if needed. - if !yaml_parser_roll_indent(parser, parser.mark.column, -1, yaml_BLOCK_MAPPING_START_TOKEN, parser.mark) { - return false - } - } - - // Simple keys after ':' are allowed in the block context. - parser.simple_key_allowed = parser.flow_level == 0 - } - - // Consume the token. - start_mark := parser.mark - skip(parser) - end_mark := parser.mark - - // Create the VALUE token and append it to the queue. - token := yaml_token_t{ - typ: yaml_VALUE_TOKEN, - start_mark: start_mark, - end_mark: end_mark, - } - yaml_insert_token(parser, -1, &token) - return true -} - -// Produce the ALIAS or ANCHOR token. -func yaml_parser_fetch_anchor(parser *yaml_parser_t, typ yaml_token_type_t) bool { - // An anchor or an alias could be a simple key. - if !yaml_parser_save_simple_key(parser) { - return false - } - - // A simple key cannot follow an anchor or an alias. - parser.simple_key_allowed = false - - // Create the ALIAS or ANCHOR token and append it to the queue. - var token yaml_token_t - if !yaml_parser_scan_anchor(parser, &token, typ) { - return false - } - yaml_insert_token(parser, -1, &token) - return true -} - -// Produce the TAG token. -func yaml_parser_fetch_tag(parser *yaml_parser_t) bool { - // A tag could be a simple key. - if !yaml_parser_save_simple_key(parser) { - return false - } - - // A simple key cannot follow a tag. - parser.simple_key_allowed = false - - // Create the TAG token and append it to the queue. - var token yaml_token_t - if !yaml_parser_scan_tag(parser, &token) { - return false - } - yaml_insert_token(parser, -1, &token) - return true -} - -// Produce the SCALAR(...,literal) or SCALAR(...,folded) tokens. -func yaml_parser_fetch_block_scalar(parser *yaml_parser_t, literal bool) bool { - // Remove any potential simple keys. - if !yaml_parser_remove_simple_key(parser) { - return false - } - - // A simple key may follow a block scalar. - parser.simple_key_allowed = true - - // Create the SCALAR token and append it to the queue. - var token yaml_token_t - if !yaml_parser_scan_block_scalar(parser, &token, literal) { - return false - } - yaml_insert_token(parser, -1, &token) - return true -} - -// Produce the SCALAR(...,single-quoted) or SCALAR(...,double-quoted) tokens. -func yaml_parser_fetch_flow_scalar(parser *yaml_parser_t, single bool) bool { - // A plain scalar could be a simple key. - if !yaml_parser_save_simple_key(parser) { - return false - } - - // A simple key cannot follow a flow scalar. - parser.simple_key_allowed = false - - // Create the SCALAR token and append it to the queue. - var token yaml_token_t - if !yaml_parser_scan_flow_scalar(parser, &token, single) { - return false - } - yaml_insert_token(parser, -1, &token) - return true -} - -// Produce the SCALAR(...,plain) token. -func yaml_parser_fetch_plain_scalar(parser *yaml_parser_t) bool { - // A plain scalar could be a simple key. - if !yaml_parser_save_simple_key(parser) { - return false - } - - // A simple key cannot follow a flow scalar. - parser.simple_key_allowed = false - - // Create the SCALAR token and append it to the queue. - var token yaml_token_t - if !yaml_parser_scan_plain_scalar(parser, &token) { - return false - } - yaml_insert_token(parser, -1, &token) - return true -} - -// Eat whitespaces and comments until the next token is found. -func yaml_parser_scan_to_next_token(parser *yaml_parser_t) bool { - - scan_mark := parser.mark - - // Until the next token is not found. - for { - // Allow the BOM mark to start a line. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - if parser.mark.column == 0 && is_bom(parser.buffer, parser.buffer_pos) { - skip(parser) - } - - // Eat whitespaces. - // Tabs are allowed: - // - in the flow context - // - in the block context, but not at the beginning of the line or - // after '-', '?', or ':' (complex value). - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - - for parser.buffer[parser.buffer_pos] == ' ' || ((parser.flow_level > 0 || !parser.simple_key_allowed) && parser.buffer[parser.buffer_pos] == '\t') { - skip(parser) - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - - // Check if we just had a line comment under a sequence entry that - // looks more like a header to the following content. Similar to this: - // - // - # The comment - // - Some data - // - // If so, transform the line comment to a head comment and reposition. - if len(parser.comments) > 0 && len(parser.tokens) > 1 { - tokenA := parser.tokens[len(parser.tokens)-2] - tokenB := parser.tokens[len(parser.tokens)-1] - comment := &parser.comments[len(parser.comments)-1] - if tokenA.typ == yaml_BLOCK_SEQUENCE_START_TOKEN && tokenB.typ == yaml_BLOCK_ENTRY_TOKEN && len(comment.line) > 0 && !is_break(parser.buffer, parser.buffer_pos) { - // If it was in the prior line, reposition so it becomes a - // header of the follow up token. Otherwise, keep it in place - // so it becomes a header of the former. - comment.head = comment.line - comment.line = nil - if comment.start_mark.line == parser.mark.line-1 { - comment.token_mark = parser.mark - } - } - } - - // Eat a comment until a line break. - if parser.buffer[parser.buffer_pos] == '#' { - if !yaml_parser_scan_comments(parser, scan_mark) { - return false - } - } - - // If it is a line break, eat it. - if is_break(parser.buffer, parser.buffer_pos) { - if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { - return false - } - skip_line(parser) - - // In the block context, a new line may start a simple key. - if parser.flow_level == 0 { - parser.simple_key_allowed = true - } - } else { - break // We have found a token. - } - } - - return true -} - -// Scan a YAML-DIRECTIVE or TAG-DIRECTIVE token. -// -// Scope: -// %YAML 1.1 # a comment \n -// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -// %TAG !yaml! tag:yaml.org,2002: \n -// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -// -func yaml_parser_scan_directive(parser *yaml_parser_t, token *yaml_token_t) bool { - // Eat '%'. - start_mark := parser.mark - skip(parser) - - // Scan the directive name. - var name []byte - if !yaml_parser_scan_directive_name(parser, start_mark, &name) { - return false - } - - // Is it a YAML directive? - if bytes.Equal(name, []byte("YAML")) { - // Scan the VERSION directive value. - var major, minor int8 - if !yaml_parser_scan_version_directive_value(parser, start_mark, &major, &minor) { - return false - } - end_mark := parser.mark - - // Create a VERSION-DIRECTIVE token. - *token = yaml_token_t{ - typ: yaml_VERSION_DIRECTIVE_TOKEN, - start_mark: start_mark, - end_mark: end_mark, - major: major, - minor: minor, - } - - // Is it a TAG directive? - } else if bytes.Equal(name, []byte("TAG")) { - // Scan the TAG directive value. - var handle, prefix []byte - if !yaml_parser_scan_tag_directive_value(parser, start_mark, &handle, &prefix) { - return false - } - end_mark := parser.mark - - // Create a TAG-DIRECTIVE token. - *token = yaml_token_t{ - typ: yaml_TAG_DIRECTIVE_TOKEN, - start_mark: start_mark, - end_mark: end_mark, - value: handle, - prefix: prefix, - } - - // Unknown directive. - } else { - yaml_parser_set_scanner_error(parser, "while scanning a directive", - start_mark, "found unknown directive name") - return false - } - - // Eat the rest of the line including any comments. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - - for is_blank(parser.buffer, parser.buffer_pos) { - skip(parser) - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - - if parser.buffer[parser.buffer_pos] == '#' { - // [Go] Discard this inline comment for the time being. - //if !yaml_parser_scan_line_comment(parser, start_mark) { - // return false - //} - for !is_breakz(parser.buffer, parser.buffer_pos) { - skip(parser) - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - } - - // Check if we are at the end of the line. - if !is_breakz(parser.buffer, parser.buffer_pos) { - yaml_parser_set_scanner_error(parser, "while scanning a directive", - start_mark, "did not find expected comment or line break") - return false - } - - // Eat a line break. - if is_break(parser.buffer, parser.buffer_pos) { - if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { - return false - } - skip_line(parser) - } - - return true -} - -// Scan the directive name. -// -// Scope: -// %YAML 1.1 # a comment \n -// ^^^^ -// %TAG !yaml! tag:yaml.org,2002: \n -// ^^^ -// -func yaml_parser_scan_directive_name(parser *yaml_parser_t, start_mark yaml_mark_t, name *[]byte) bool { - // Consume the directive name. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - - var s []byte - for is_alpha(parser.buffer, parser.buffer_pos) { - s = read(parser, s) - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - - // Check if the name is empty. - if len(s) == 0 { - yaml_parser_set_scanner_error(parser, "while scanning a directive", - start_mark, "could not find expected directive name") - return false - } - - // Check for an blank character after the name. - if !is_blankz(parser.buffer, parser.buffer_pos) { - yaml_parser_set_scanner_error(parser, "while scanning a directive", - start_mark, "found unexpected non-alphabetical character") - return false - } - *name = s - return true -} - -// Scan the value of VERSION-DIRECTIVE. -// -// Scope: -// %YAML 1.1 # a comment \n -// ^^^^^^ -func yaml_parser_scan_version_directive_value(parser *yaml_parser_t, start_mark yaml_mark_t, major, minor *int8) bool { - // Eat whitespaces. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - for is_blank(parser.buffer, parser.buffer_pos) { - skip(parser) - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - - // Consume the major version number. - if !yaml_parser_scan_version_directive_number(parser, start_mark, major) { - return false - } - - // Eat '.'. - if parser.buffer[parser.buffer_pos] != '.' { - return yaml_parser_set_scanner_error(parser, "while scanning a %YAML directive", - start_mark, "did not find expected digit or '.' character") - } - - skip(parser) - - // Consume the minor version number. - if !yaml_parser_scan_version_directive_number(parser, start_mark, minor) { - return false - } - return true -} - -const max_number_length = 2 - -// Scan the version number of VERSION-DIRECTIVE. -// -// Scope: -// %YAML 1.1 # a comment \n -// ^ -// %YAML 1.1 # a comment \n -// ^ -func yaml_parser_scan_version_directive_number(parser *yaml_parser_t, start_mark yaml_mark_t, number *int8) bool { - - // Repeat while the next character is digit. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - var value, length int8 - for is_digit(parser.buffer, parser.buffer_pos) { - // Check if the number is too long. - length++ - if length > max_number_length { - return yaml_parser_set_scanner_error(parser, "while scanning a %YAML directive", - start_mark, "found extremely long version number") - } - value = value*10 + int8(as_digit(parser.buffer, parser.buffer_pos)) - skip(parser) - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - - // Check if the number was present. - if length == 0 { - return yaml_parser_set_scanner_error(parser, "while scanning a %YAML directive", - start_mark, "did not find expected version number") - } - *number = value - return true -} - -// Scan the value of a TAG-DIRECTIVE token. -// -// Scope: -// %TAG !yaml! tag:yaml.org,2002: \n -// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -// -func yaml_parser_scan_tag_directive_value(parser *yaml_parser_t, start_mark yaml_mark_t, handle, prefix *[]byte) bool { - var handle_value, prefix_value []byte - - // Eat whitespaces. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - - for is_blank(parser.buffer, parser.buffer_pos) { - skip(parser) - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - - // Scan a handle. - if !yaml_parser_scan_tag_handle(parser, true, start_mark, &handle_value) { - return false - } - - // Expect a whitespace. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - if !is_blank(parser.buffer, parser.buffer_pos) { - yaml_parser_set_scanner_error(parser, "while scanning a %TAG directive", - start_mark, "did not find expected whitespace") - return false - } - - // Eat whitespaces. - for is_blank(parser.buffer, parser.buffer_pos) { - skip(parser) - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - - // Scan a prefix. - if !yaml_parser_scan_tag_uri(parser, true, nil, start_mark, &prefix_value) { - return false - } - - // Expect a whitespace or line break. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - if !is_blankz(parser.buffer, parser.buffer_pos) { - yaml_parser_set_scanner_error(parser, "while scanning a %TAG directive", - start_mark, "did not find expected whitespace or line break") - return false - } - - *handle = handle_value - *prefix = prefix_value - return true -} - -func yaml_parser_scan_anchor(parser *yaml_parser_t, token *yaml_token_t, typ yaml_token_type_t) bool { - var s []byte - - // Eat the indicator character. - start_mark := parser.mark - skip(parser) - - // Consume the value. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - - for is_alpha(parser.buffer, parser.buffer_pos) { - s = read(parser, s) - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - - end_mark := parser.mark - - /* - * Check if length of the anchor is greater than 0 and it is followed by - * a whitespace character or one of the indicators: - * - * '?', ':', ',', ']', '}', '%', '@', '`'. - */ - - if len(s) == 0 || - !(is_blankz(parser.buffer, parser.buffer_pos) || parser.buffer[parser.buffer_pos] == '?' || - parser.buffer[parser.buffer_pos] == ':' || parser.buffer[parser.buffer_pos] == ',' || - parser.buffer[parser.buffer_pos] == ']' || parser.buffer[parser.buffer_pos] == '}' || - parser.buffer[parser.buffer_pos] == '%' || parser.buffer[parser.buffer_pos] == '@' || - parser.buffer[parser.buffer_pos] == '`') { - context := "while scanning an alias" - if typ == yaml_ANCHOR_TOKEN { - context = "while scanning an anchor" - } - yaml_parser_set_scanner_error(parser, context, start_mark, - "did not find expected alphabetic or numeric character") - return false - } - - // Create a token. - *token = yaml_token_t{ - typ: typ, - start_mark: start_mark, - end_mark: end_mark, - value: s, - } - - return true -} - -/* - * Scan a TAG token. - */ - -func yaml_parser_scan_tag(parser *yaml_parser_t, token *yaml_token_t) bool { - var handle, suffix []byte - - start_mark := parser.mark - - // Check if the tag is in the canonical form. - if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { - return false - } - - if parser.buffer[parser.buffer_pos+1] == '<' { - // Keep the handle as '' - - // Eat '!<' - skip(parser) - skip(parser) - - // Consume the tag value. - if !yaml_parser_scan_tag_uri(parser, false, nil, start_mark, &suffix) { - return false - } - - // Check for '>' and eat it. - if parser.buffer[parser.buffer_pos] != '>' { - yaml_parser_set_scanner_error(parser, "while scanning a tag", - start_mark, "did not find the expected '>'") - return false - } - - skip(parser) - } else { - // The tag has either the '!suffix' or the '!handle!suffix' form. - - // First, try to scan a handle. - if !yaml_parser_scan_tag_handle(parser, false, start_mark, &handle) { - return false - } - - // Check if it is, indeed, handle. - if handle[0] == '!' && len(handle) > 1 && handle[len(handle)-1] == '!' { - // Scan the suffix now. - if !yaml_parser_scan_tag_uri(parser, false, nil, start_mark, &suffix) { - return false - } - } else { - // It wasn't a handle after all. Scan the rest of the tag. - if !yaml_parser_scan_tag_uri(parser, false, handle, start_mark, &suffix) { - return false - } - - // Set the handle to '!'. - handle = []byte{'!'} - - // A special case: the '!' tag. Set the handle to '' and the - // suffix to '!'. - if len(suffix) == 0 { - handle, suffix = suffix, handle - } - } - } - - // Check the character which ends the tag. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - if !is_blankz(parser.buffer, parser.buffer_pos) { - yaml_parser_set_scanner_error(parser, "while scanning a tag", - start_mark, "did not find expected whitespace or line break") - return false - } - - end_mark := parser.mark - - // Create a token. - *token = yaml_token_t{ - typ: yaml_TAG_TOKEN, - start_mark: start_mark, - end_mark: end_mark, - value: handle, - suffix: suffix, - } - return true -} - -// Scan a tag handle. -func yaml_parser_scan_tag_handle(parser *yaml_parser_t, directive bool, start_mark yaml_mark_t, handle *[]byte) bool { - // Check the initial '!' character. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - if parser.buffer[parser.buffer_pos] != '!' { - yaml_parser_set_scanner_tag_error(parser, directive, - start_mark, "did not find expected '!'") - return false - } - - var s []byte - - // Copy the '!' character. - s = read(parser, s) - - // Copy all subsequent alphabetical and numerical characters. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - for is_alpha(parser.buffer, parser.buffer_pos) { - s = read(parser, s) - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - - // Check if the trailing character is '!' and copy it. - if parser.buffer[parser.buffer_pos] == '!' { - s = read(parser, s) - } else { - // It's either the '!' tag or not really a tag handle. If it's a %TAG - // directive, it's an error. If it's a tag token, it must be a part of URI. - if directive && string(s) != "!" { - yaml_parser_set_scanner_tag_error(parser, directive, - start_mark, "did not find expected '!'") - return false - } - } - - *handle = s - return true -} - -// Scan a tag. -func yaml_parser_scan_tag_uri(parser *yaml_parser_t, directive bool, head []byte, start_mark yaml_mark_t, uri *[]byte) bool { - //size_t length = head ? strlen((char *)head) : 0 - var s []byte - hasTag := len(head) > 0 - - // Copy the head if needed. - // - // Note that we don't copy the leading '!' character. - if len(head) > 1 { - s = append(s, head[1:]...) - } - - // Scan the tag. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - - // The set of characters that may appear in URI is as follows: - // - // '0'-'9', 'A'-'Z', 'a'-'z', '_', '-', ';', '/', '?', ':', '@', '&', - // '=', '+', '$', ',', '.', '!', '~', '*', '\'', '(', ')', '[', ']', - // '%'. - // [Go] TODO Convert this into more reasonable logic. - for is_alpha(parser.buffer, parser.buffer_pos) || parser.buffer[parser.buffer_pos] == ';' || - parser.buffer[parser.buffer_pos] == '/' || parser.buffer[parser.buffer_pos] == '?' || - parser.buffer[parser.buffer_pos] == ':' || parser.buffer[parser.buffer_pos] == '@' || - parser.buffer[parser.buffer_pos] == '&' || parser.buffer[parser.buffer_pos] == '=' || - parser.buffer[parser.buffer_pos] == '+' || parser.buffer[parser.buffer_pos] == '$' || - parser.buffer[parser.buffer_pos] == ',' || parser.buffer[parser.buffer_pos] == '.' || - parser.buffer[parser.buffer_pos] == '!' || parser.buffer[parser.buffer_pos] == '~' || - parser.buffer[parser.buffer_pos] == '*' || parser.buffer[parser.buffer_pos] == '\'' || - parser.buffer[parser.buffer_pos] == '(' || parser.buffer[parser.buffer_pos] == ')' || - parser.buffer[parser.buffer_pos] == '[' || parser.buffer[parser.buffer_pos] == ']' || - parser.buffer[parser.buffer_pos] == '%' { - // Check if it is a URI-escape sequence. - if parser.buffer[parser.buffer_pos] == '%' { - if !yaml_parser_scan_uri_escapes(parser, directive, start_mark, &s) { - return false - } - } else { - s = read(parser, s) - } - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - hasTag = true - } - - if !hasTag { - yaml_parser_set_scanner_tag_error(parser, directive, - start_mark, "did not find expected tag URI") - return false - } - *uri = s - return true -} - -// Decode an URI-escape sequence corresponding to a single UTF-8 character. -func yaml_parser_scan_uri_escapes(parser *yaml_parser_t, directive bool, start_mark yaml_mark_t, s *[]byte) bool { - - // Decode the required number of characters. - w := 1024 - for w > 0 { - // Check for a URI-escaped octet. - if parser.unread < 3 && !yaml_parser_update_buffer(parser, 3) { - return false - } - - if !(parser.buffer[parser.buffer_pos] == '%' && - is_hex(parser.buffer, parser.buffer_pos+1) && - is_hex(parser.buffer, parser.buffer_pos+2)) { - return yaml_parser_set_scanner_tag_error(parser, directive, - start_mark, "did not find URI escaped octet") - } - - // Get the octet. - octet := byte((as_hex(parser.buffer, parser.buffer_pos+1) << 4) + as_hex(parser.buffer, parser.buffer_pos+2)) - - // If it is the leading octet, determine the length of the UTF-8 sequence. - if w == 1024 { - w = width(octet) - if w == 0 { - return yaml_parser_set_scanner_tag_error(parser, directive, - start_mark, "found an incorrect leading UTF-8 octet") - } - } else { - // Check if the trailing octet is correct. - if octet&0xC0 != 0x80 { - return yaml_parser_set_scanner_tag_error(parser, directive, - start_mark, "found an incorrect trailing UTF-8 octet") - } - } - - // Copy the octet and move the pointers. - *s = append(*s, octet) - skip(parser) - skip(parser) - skip(parser) - w-- - } - return true -} - -// Scan a block scalar. -func yaml_parser_scan_block_scalar(parser *yaml_parser_t, token *yaml_token_t, literal bool) bool { - // Eat the indicator '|' or '>'. - start_mark := parser.mark - skip(parser) - - // Scan the additional block scalar indicators. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - - // Check for a chomping indicator. - var chomping, increment int - if parser.buffer[parser.buffer_pos] == '+' || parser.buffer[parser.buffer_pos] == '-' { - // Set the chomping method and eat the indicator. - if parser.buffer[parser.buffer_pos] == '+' { - chomping = +1 - } else { - chomping = -1 - } - skip(parser) - - // Check for an indentation indicator. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - if is_digit(parser.buffer, parser.buffer_pos) { - // Check that the indentation is greater than 0. - if parser.buffer[parser.buffer_pos] == '0' { - yaml_parser_set_scanner_error(parser, "while scanning a block scalar", - start_mark, "found an indentation indicator equal to 0") - return false - } - - // Get the indentation level and eat the indicator. - increment = as_digit(parser.buffer, parser.buffer_pos) - skip(parser) - } - - } else if is_digit(parser.buffer, parser.buffer_pos) { - // Do the same as above, but in the opposite order. - - if parser.buffer[parser.buffer_pos] == '0' { - yaml_parser_set_scanner_error(parser, "while scanning a block scalar", - start_mark, "found an indentation indicator equal to 0") - return false - } - increment = as_digit(parser.buffer, parser.buffer_pos) - skip(parser) - - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - if parser.buffer[parser.buffer_pos] == '+' || parser.buffer[parser.buffer_pos] == '-' { - if parser.buffer[parser.buffer_pos] == '+' { - chomping = +1 - } else { - chomping = -1 - } - skip(parser) - } - } - - // Eat whitespaces and comments to the end of the line. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - for is_blank(parser.buffer, parser.buffer_pos) { - skip(parser) - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - if parser.buffer[parser.buffer_pos] == '#' { - if !yaml_parser_scan_line_comment(parser, start_mark) { - return false - } - for !is_breakz(parser.buffer, parser.buffer_pos) { - skip(parser) - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - } - - // Check if we are at the end of the line. - if !is_breakz(parser.buffer, parser.buffer_pos) { - yaml_parser_set_scanner_error(parser, "while scanning a block scalar", - start_mark, "did not find expected comment or line break") - return false - } - - // Eat a line break. - if is_break(parser.buffer, parser.buffer_pos) { - if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { - return false - } - skip_line(parser) - } - - end_mark := parser.mark - - // Set the indentation level if it was specified. - var indent int - if increment > 0 { - if parser.indent >= 0 { - indent = parser.indent + increment - } else { - indent = increment - } - } - - // Scan the leading line breaks and determine the indentation level if needed. - var s, leading_break, trailing_breaks []byte - if !yaml_parser_scan_block_scalar_breaks(parser, &indent, &trailing_breaks, start_mark, &end_mark) { - return false - } - - // Scan the block scalar content. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - var leading_blank, trailing_blank bool - for parser.mark.column == indent && !is_z(parser.buffer, parser.buffer_pos) { - // We are at the beginning of a non-empty line. - - // Is it a trailing whitespace? - trailing_blank = is_blank(parser.buffer, parser.buffer_pos) - - // Check if we need to fold the leading line break. - if !literal && !leading_blank && !trailing_blank && len(leading_break) > 0 && leading_break[0] == '\n' { - // Do we need to join the lines by space? - if len(trailing_breaks) == 0 { - s = append(s, ' ') - } - } else { - s = append(s, leading_break...) - } - leading_break = leading_break[:0] - - // Append the remaining line breaks. - s = append(s, trailing_breaks...) - trailing_breaks = trailing_breaks[:0] - - // Is it a leading whitespace? - leading_blank = is_blank(parser.buffer, parser.buffer_pos) - - // Consume the current line. - for !is_breakz(parser.buffer, parser.buffer_pos) { - s = read(parser, s) - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - - // Consume the line break. - if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { - return false - } - - leading_break = read_line(parser, leading_break) - - // Eat the following indentation spaces and line breaks. - if !yaml_parser_scan_block_scalar_breaks(parser, &indent, &trailing_breaks, start_mark, &end_mark) { - return false - } - } - - // Chomp the tail. - if chomping != -1 { - s = append(s, leading_break...) - } - if chomping == 1 { - s = append(s, trailing_breaks...) - } - - // Create a token. - *token = yaml_token_t{ - typ: yaml_SCALAR_TOKEN, - start_mark: start_mark, - end_mark: end_mark, - value: s, - style: yaml_LITERAL_SCALAR_STYLE, - } - if !literal { - token.style = yaml_FOLDED_SCALAR_STYLE - } - return true -} - -// Scan indentation spaces and line breaks for a block scalar. Determine the -// indentation level if needed. -func yaml_parser_scan_block_scalar_breaks(parser *yaml_parser_t, indent *int, breaks *[]byte, start_mark yaml_mark_t, end_mark *yaml_mark_t) bool { - *end_mark = parser.mark - - // Eat the indentation spaces and line breaks. - max_indent := 0 - for { - // Eat the indentation spaces. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - for (*indent == 0 || parser.mark.column < *indent) && is_space(parser.buffer, parser.buffer_pos) { - skip(parser) - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - if parser.mark.column > max_indent { - max_indent = parser.mark.column - } - - // Check for a tab character messing the indentation. - if (*indent == 0 || parser.mark.column < *indent) && is_tab(parser.buffer, parser.buffer_pos) { - return yaml_parser_set_scanner_error(parser, "while scanning a block scalar", - start_mark, "found a tab character where an indentation space is expected") - } - - // Have we found a non-empty line? - if !is_break(parser.buffer, parser.buffer_pos) { - break - } - - // Consume the line break. - if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { - return false - } - // [Go] Should really be returning breaks instead. - *breaks = read_line(parser, *breaks) - *end_mark = parser.mark - } - - // Determine the indentation level if needed. - if *indent == 0 { - *indent = max_indent - if *indent < parser.indent+1 { - *indent = parser.indent + 1 - } - if *indent < 1 { - *indent = 1 - } - } - return true -} - -// Scan a quoted scalar. -func yaml_parser_scan_flow_scalar(parser *yaml_parser_t, token *yaml_token_t, single bool) bool { - // Eat the left quote. - start_mark := parser.mark - skip(parser) - - // Consume the content of the quoted scalar. - var s, leading_break, trailing_breaks, whitespaces []byte - for { - // Check that there are no document indicators at the beginning of the line. - if parser.unread < 4 && !yaml_parser_update_buffer(parser, 4) { - return false - } - - if parser.mark.column == 0 && - ((parser.buffer[parser.buffer_pos+0] == '-' && - parser.buffer[parser.buffer_pos+1] == '-' && - parser.buffer[parser.buffer_pos+2] == '-') || - (parser.buffer[parser.buffer_pos+0] == '.' && - parser.buffer[parser.buffer_pos+1] == '.' && - parser.buffer[parser.buffer_pos+2] == '.')) && - is_blankz(parser.buffer, parser.buffer_pos+3) { - yaml_parser_set_scanner_error(parser, "while scanning a quoted scalar", - start_mark, "found unexpected document indicator") - return false - } - - // Check for EOF. - if is_z(parser.buffer, parser.buffer_pos) { - yaml_parser_set_scanner_error(parser, "while scanning a quoted scalar", - start_mark, "found unexpected end of stream") - return false - } - - // Consume non-blank characters. - leading_blanks := false - for !is_blankz(parser.buffer, parser.buffer_pos) { - if single && parser.buffer[parser.buffer_pos] == '\'' && parser.buffer[parser.buffer_pos+1] == '\'' { - // Is is an escaped single quote. - s = append(s, '\'') - skip(parser) - skip(parser) - - } else if single && parser.buffer[parser.buffer_pos] == '\'' { - // It is a right single quote. - break - } else if !single && parser.buffer[parser.buffer_pos] == '"' { - // It is a right double quote. - break - - } else if !single && parser.buffer[parser.buffer_pos] == '\\' && is_break(parser.buffer, parser.buffer_pos+1) { - // It is an escaped line break. - if parser.unread < 3 && !yaml_parser_update_buffer(parser, 3) { - return false - } - skip(parser) - skip_line(parser) - leading_blanks = true - break - - } else if !single && parser.buffer[parser.buffer_pos] == '\\' { - // It is an escape sequence. - code_length := 0 - - // Check the escape character. - switch parser.buffer[parser.buffer_pos+1] { - case '0': - s = append(s, 0) - case 'a': - s = append(s, '\x07') - case 'b': - s = append(s, '\x08') - case 't', '\t': - s = append(s, '\x09') - case 'n': - s = append(s, '\x0A') - case 'v': - s = append(s, '\x0B') - case 'f': - s = append(s, '\x0C') - case 'r': - s = append(s, '\x0D') - case 'e': - s = append(s, '\x1B') - case ' ': - s = append(s, '\x20') - case '"': - s = append(s, '"') - case '\'': - s = append(s, '\'') - case '\\': - s = append(s, '\\') - case 'N': // NEL (#x85) - s = append(s, '\xC2') - s = append(s, '\x85') - case '_': // #xA0 - s = append(s, '\xC2') - s = append(s, '\xA0') - case 'L': // LS (#x2028) - s = append(s, '\xE2') - s = append(s, '\x80') - s = append(s, '\xA8') - case 'P': // PS (#x2029) - s = append(s, '\xE2') - s = append(s, '\x80') - s = append(s, '\xA9') - case 'x': - code_length = 2 - case 'u': - code_length = 4 - case 'U': - code_length = 8 - default: - yaml_parser_set_scanner_error(parser, "while parsing a quoted scalar", - start_mark, "found unknown escape character") - return false - } - - skip(parser) - skip(parser) - - // Consume an arbitrary escape code. - if code_length > 0 { - var value int - - // Scan the character value. - if parser.unread < code_length && !yaml_parser_update_buffer(parser, code_length) { - return false - } - for k := 0; k < code_length; k++ { - if !is_hex(parser.buffer, parser.buffer_pos+k) { - yaml_parser_set_scanner_error(parser, "while parsing a quoted scalar", - start_mark, "did not find expected hexdecimal number") - return false - } - value = (value << 4) + as_hex(parser.buffer, parser.buffer_pos+k) - } - - // Check the value and write the character. - if (value >= 0xD800 && value <= 0xDFFF) || value > 0x10FFFF { - yaml_parser_set_scanner_error(parser, "while parsing a quoted scalar", - start_mark, "found invalid Unicode character escape code") - return false - } - if value <= 0x7F { - s = append(s, byte(value)) - } else if value <= 0x7FF { - s = append(s, byte(0xC0+(value>>6))) - s = append(s, byte(0x80+(value&0x3F))) - } else if value <= 0xFFFF { - s = append(s, byte(0xE0+(value>>12))) - s = append(s, byte(0x80+((value>>6)&0x3F))) - s = append(s, byte(0x80+(value&0x3F))) - } else { - s = append(s, byte(0xF0+(value>>18))) - s = append(s, byte(0x80+((value>>12)&0x3F))) - s = append(s, byte(0x80+((value>>6)&0x3F))) - s = append(s, byte(0x80+(value&0x3F))) - } - - // Advance the pointer. - for k := 0; k < code_length; k++ { - skip(parser) - } - } - } else { - // It is a non-escaped non-blank character. - s = read(parser, s) - } - if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { - return false - } - } - - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - - // Check if we are at the end of the scalar. - if single { - if parser.buffer[parser.buffer_pos] == '\'' { - break - } - } else { - if parser.buffer[parser.buffer_pos] == '"' { - break - } - } - - // Consume blank characters. - for is_blank(parser.buffer, parser.buffer_pos) || is_break(parser.buffer, parser.buffer_pos) { - if is_blank(parser.buffer, parser.buffer_pos) { - // Consume a space or a tab character. - if !leading_blanks { - whitespaces = read(parser, whitespaces) - } else { - skip(parser) - } - } else { - if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { - return false - } - - // Check if it is a first line break. - if !leading_blanks { - whitespaces = whitespaces[:0] - leading_break = read_line(parser, leading_break) - leading_blanks = true - } else { - trailing_breaks = read_line(parser, trailing_breaks) - } - } - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - - // Join the whitespaces or fold line breaks. - if leading_blanks { - // Do we need to fold line breaks? - if len(leading_break) > 0 && leading_break[0] == '\n' { - if len(trailing_breaks) == 0 { - s = append(s, ' ') - } else { - s = append(s, trailing_breaks...) - } - } else { - s = append(s, leading_break...) - s = append(s, trailing_breaks...) - } - trailing_breaks = trailing_breaks[:0] - leading_break = leading_break[:0] - } else { - s = append(s, whitespaces...) - whitespaces = whitespaces[:0] - } - } - - // Eat the right quote. - skip(parser) - end_mark := parser.mark - - // Create a token. - *token = yaml_token_t{ - typ: yaml_SCALAR_TOKEN, - start_mark: start_mark, - end_mark: end_mark, - value: s, - style: yaml_SINGLE_QUOTED_SCALAR_STYLE, - } - if !single { - token.style = yaml_DOUBLE_QUOTED_SCALAR_STYLE - } - return true -} - -// Scan a plain scalar. -func yaml_parser_scan_plain_scalar(parser *yaml_parser_t, token *yaml_token_t) bool { - - var s, leading_break, trailing_breaks, whitespaces []byte - var leading_blanks bool - var indent = parser.indent + 1 - - start_mark := parser.mark - end_mark := parser.mark - - // Consume the content of the plain scalar. - for { - // Check for a document indicator. - if parser.unread < 4 && !yaml_parser_update_buffer(parser, 4) { - return false - } - if parser.mark.column == 0 && - ((parser.buffer[parser.buffer_pos+0] == '-' && - parser.buffer[parser.buffer_pos+1] == '-' && - parser.buffer[parser.buffer_pos+2] == '-') || - (parser.buffer[parser.buffer_pos+0] == '.' && - parser.buffer[parser.buffer_pos+1] == '.' && - parser.buffer[parser.buffer_pos+2] == '.')) && - is_blankz(parser.buffer, parser.buffer_pos+3) { - break - } - - // Check for a comment. - if parser.buffer[parser.buffer_pos] == '#' { - break - } - - // Consume non-blank characters. - for !is_blankz(parser.buffer, parser.buffer_pos) { - - // Check for indicators that may end a plain scalar. - if (parser.buffer[parser.buffer_pos] == ':' && is_blankz(parser.buffer, parser.buffer_pos+1)) || - (parser.flow_level > 0 && - (parser.buffer[parser.buffer_pos] == ',' || - parser.buffer[parser.buffer_pos] == '?' || parser.buffer[parser.buffer_pos] == '[' || - parser.buffer[parser.buffer_pos] == ']' || parser.buffer[parser.buffer_pos] == '{' || - parser.buffer[parser.buffer_pos] == '}')) { - break - } - - // Check if we need to join whitespaces and breaks. - if leading_blanks || len(whitespaces) > 0 { - if leading_blanks { - // Do we need to fold line breaks? - if leading_break[0] == '\n' { - if len(trailing_breaks) == 0 { - s = append(s, ' ') - } else { - s = append(s, trailing_breaks...) - } - } else { - s = append(s, leading_break...) - s = append(s, trailing_breaks...) - } - trailing_breaks = trailing_breaks[:0] - leading_break = leading_break[:0] - leading_blanks = false - } else { - s = append(s, whitespaces...) - whitespaces = whitespaces[:0] - } - } - - // Copy the character. - s = read(parser, s) - - end_mark = parser.mark - if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { - return false - } - } - - // Is it the end? - if !(is_blank(parser.buffer, parser.buffer_pos) || is_break(parser.buffer, parser.buffer_pos)) { - break - } - - // Consume blank characters. - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - - for is_blank(parser.buffer, parser.buffer_pos) || is_break(parser.buffer, parser.buffer_pos) { - if is_blank(parser.buffer, parser.buffer_pos) { - - // Check for tab characters that abuse indentation. - if leading_blanks && parser.mark.column < indent && is_tab(parser.buffer, parser.buffer_pos) { - yaml_parser_set_scanner_error(parser, "while scanning a plain scalar", - start_mark, "found a tab character that violates indentation") - return false - } - - // Consume a space or a tab character. - if !leading_blanks { - whitespaces = read(parser, whitespaces) - } else { - skip(parser) - } - } else { - if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { - return false - } - - // Check if it is a first line break. - if !leading_blanks { - whitespaces = whitespaces[:0] - leading_break = read_line(parser, leading_break) - leading_blanks = true - } else { - trailing_breaks = read_line(parser, trailing_breaks) - } - } - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - } - - // Check indentation level. - if parser.flow_level == 0 && parser.mark.column < indent { - break - } - } - - // Create a token. - *token = yaml_token_t{ - typ: yaml_SCALAR_TOKEN, - start_mark: start_mark, - end_mark: end_mark, - value: s, - style: yaml_PLAIN_SCALAR_STYLE, - } - - // Note that we change the 'simple_key_allowed' flag. - if leading_blanks { - parser.simple_key_allowed = true - } - return true -} - -func yaml_parser_scan_line_comment(parser *yaml_parser_t, token_mark yaml_mark_t) bool { - if parser.newlines > 0 { - return true - } - - var start_mark yaml_mark_t - var text []byte - - for peek := 0; peek < 512; peek++ { - if parser.unread < peek+1 && !yaml_parser_update_buffer(parser, peek+1) { - break - } - if is_blank(parser.buffer, parser.buffer_pos+peek) { - continue - } - if parser.buffer[parser.buffer_pos+peek] == '#' { - seen := parser.mark.index+peek - for { - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - if is_breakz(parser.buffer, parser.buffer_pos) { - if parser.mark.index >= seen { - break - } - if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { - return false - } - skip_line(parser) - } else if parser.mark.index >= seen { - if len(text) == 0 { - start_mark = parser.mark - } - text = read(parser, text) - } else { - skip(parser) - } - } - } - break - } - if len(text) > 0 { - parser.comments = append(parser.comments, yaml_comment_t{ - token_mark: token_mark, - start_mark: start_mark, - line: text, - }) - } - return true -} - -func yaml_parser_scan_comments(parser *yaml_parser_t, scan_mark yaml_mark_t) bool { - token := parser.tokens[len(parser.tokens)-1] - - if token.typ == yaml_FLOW_ENTRY_TOKEN && len(parser.tokens) > 1 { - token = parser.tokens[len(parser.tokens)-2] - } - - var token_mark = token.start_mark - var start_mark yaml_mark_t - var next_indent = parser.indent - if next_indent < 0 { - next_indent = 0 - } - - var recent_empty = false - var first_empty = parser.newlines <= 1 - - var line = parser.mark.line - var column = parser.mark.column - - var text []byte - - // The foot line is the place where a comment must start to - // still be considered as a foot of the prior content. - // If there's some content in the currently parsed line, then - // the foot is the line below it. - var foot_line = -1 - if scan_mark.line > 0 { - foot_line = parser.mark.line-parser.newlines+1 - if parser.newlines == 0 && parser.mark.column > 1 { - foot_line++ - } - } - - var peek = 0 - for ; peek < 512; peek++ { - if parser.unread < peek+1 && !yaml_parser_update_buffer(parser, peek+1) { - break - } - column++ - if is_blank(parser.buffer, parser.buffer_pos+peek) { - continue - } - c := parser.buffer[parser.buffer_pos+peek] - var close_flow = parser.flow_level > 0 && (c == ']' || c == '}') - if close_flow || is_breakz(parser.buffer, parser.buffer_pos+peek) { - // Got line break or terminator. - if close_flow || !recent_empty { - if close_flow || first_empty && (start_mark.line == foot_line && token.typ != yaml_VALUE_TOKEN || start_mark.column-1 < next_indent) { - // This is the first empty line and there were no empty lines before, - // so this initial part of the comment is a foot of the prior token - // instead of being a head for the following one. Split it up. - // Alternatively, this might also be the last comment inside a flow - // scope, so it must be a footer. - if len(text) > 0 { - if start_mark.column-1 < next_indent { - // If dedented it's unrelated to the prior token. - token_mark = start_mark - } - parser.comments = append(parser.comments, yaml_comment_t{ - scan_mark: scan_mark, - token_mark: token_mark, - start_mark: start_mark, - end_mark: yaml_mark_t{parser.mark.index + peek, line, column}, - foot: text, - }) - scan_mark = yaml_mark_t{parser.mark.index + peek, line, column} - token_mark = scan_mark - text = nil - } - } else { - if len(text) > 0 && parser.buffer[parser.buffer_pos+peek] != 0 { - text = append(text, '\n') - } - } - } - if !is_break(parser.buffer, parser.buffer_pos+peek) { - break - } - first_empty = false - recent_empty = true - column = 0 - line++ - continue - } - - if len(text) > 0 && (close_flow || column-1 < next_indent && column != start_mark.column) { - // The comment at the different indentation is a foot of the - // preceding data rather than a head of the upcoming one. - parser.comments = append(parser.comments, yaml_comment_t{ - scan_mark: scan_mark, - token_mark: token_mark, - start_mark: start_mark, - end_mark: yaml_mark_t{parser.mark.index + peek, line, column}, - foot: text, - }) - scan_mark = yaml_mark_t{parser.mark.index + peek, line, column} - token_mark = scan_mark - text = nil - } - - if parser.buffer[parser.buffer_pos+peek] != '#' { - break - } - - if len(text) == 0 { - start_mark = yaml_mark_t{parser.mark.index + peek, line, column} - } else { - text = append(text, '\n') - } - - recent_empty = false - - // Consume until after the consumed comment line. - seen := parser.mark.index+peek - for { - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - if is_breakz(parser.buffer, parser.buffer_pos) { - if parser.mark.index >= seen { - break - } - if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { - return false - } - skip_line(parser) - } else if parser.mark.index >= seen { - text = read(parser, text) - } else { - skip(parser) - } - } - - peek = 0 - column = 0 - line = parser.mark.line - next_indent = parser.indent - if next_indent < 0 { - next_indent = 0 - } - } - - if len(text) > 0 { - parser.comments = append(parser.comments, yaml_comment_t{ - scan_mark: scan_mark, - token_mark: start_mark, - start_mark: start_mark, - end_mark: yaml_mark_t{parser.mark.index + peek - 1, line, column}, - head: text, - }) - } - return true -} diff --git a/vendor/gopkg.in/yaml.v3/sorter.go b/vendor/gopkg.in/yaml.v3/sorter.go deleted file mode 100644 index 9210ece..0000000 --- a/vendor/gopkg.in/yaml.v3/sorter.go +++ /dev/null @@ -1,134 +0,0 @@ -// -// Copyright (c) 2011-2019 Canonical Ltd -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package yaml - -import ( - "reflect" - "unicode" -) - -type keyList []reflect.Value - -func (l keyList) Len() int { return len(l) } -func (l keyList) Swap(i, j int) { l[i], l[j] = l[j], l[i] } -func (l keyList) Less(i, j int) bool { - a := l[i] - b := l[j] - ak := a.Kind() - bk := b.Kind() - for (ak == reflect.Interface || ak == reflect.Ptr) && !a.IsNil() { - a = a.Elem() - ak = a.Kind() - } - for (bk == reflect.Interface || bk == reflect.Ptr) && !b.IsNil() { - b = b.Elem() - bk = b.Kind() - } - af, aok := keyFloat(a) - bf, bok := keyFloat(b) - if aok && bok { - if af != bf { - return af < bf - } - if ak != bk { - return ak < bk - } - return numLess(a, b) - } - if ak != reflect.String || bk != reflect.String { - return ak < bk - } - ar, br := []rune(a.String()), []rune(b.String()) - digits := false - for i := 0; i < len(ar) && i < len(br); i++ { - if ar[i] == br[i] { - digits = unicode.IsDigit(ar[i]) - continue - } - al := unicode.IsLetter(ar[i]) - bl := unicode.IsLetter(br[i]) - if al && bl { - return ar[i] < br[i] - } - if al || bl { - if digits { - return al - } else { - return bl - } - } - var ai, bi int - var an, bn int64 - if ar[i] == '0' || br[i] == '0' { - for j := i - 1; j >= 0 && unicode.IsDigit(ar[j]); j-- { - if ar[j] != '0' { - an = 1 - bn = 1 - break - } - } - } - for ai = i; ai < len(ar) && unicode.IsDigit(ar[ai]); ai++ { - an = an*10 + int64(ar[ai]-'0') - } - for bi = i; bi < len(br) && unicode.IsDigit(br[bi]); bi++ { - bn = bn*10 + int64(br[bi]-'0') - } - if an != bn { - return an < bn - } - if ai != bi { - return ai < bi - } - return ar[i] < br[i] - } - return len(ar) < len(br) -} - -// keyFloat returns a float value for v if it is a number/bool -// and whether it is a number/bool or not. -func keyFloat(v reflect.Value) (f float64, ok bool) { - switch v.Kind() { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return float64(v.Int()), true - case reflect.Float32, reflect.Float64: - return v.Float(), true - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - return float64(v.Uint()), true - case reflect.Bool: - if v.Bool() { - return 1, true - } - return 0, true - } - return 0, false -} - -// numLess returns whether a < b. -// a and b must necessarily have the same kind. -func numLess(a, b reflect.Value) bool { - switch a.Kind() { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return a.Int() < b.Int() - case reflect.Float32, reflect.Float64: - return a.Float() < b.Float() - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - return a.Uint() < b.Uint() - case reflect.Bool: - return !a.Bool() && b.Bool() - } - panic("not a number") -} diff --git a/vendor/gopkg.in/yaml.v3/writerc.go b/vendor/gopkg.in/yaml.v3/writerc.go deleted file mode 100644 index b8a116b..0000000 --- a/vendor/gopkg.in/yaml.v3/writerc.go +++ /dev/null @@ -1,48 +0,0 @@ -// -// Copyright (c) 2011-2019 Canonical Ltd -// Copyright (c) 2006-2010 Kirill Simonov -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of -// this software and associated documentation files (the "Software"), to deal in -// the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -// of the Software, and to permit persons to whom the Software is furnished to do -// so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. - -package yaml - -// Set the writer error and return false. -func yaml_emitter_set_writer_error(emitter *yaml_emitter_t, problem string) bool { - emitter.error = yaml_WRITER_ERROR - emitter.problem = problem - return false -} - -// Flush the output buffer. -func yaml_emitter_flush(emitter *yaml_emitter_t) bool { - if emitter.write_handler == nil { - panic("write handler not set") - } - - // Check if the buffer is empty. - if emitter.buffer_pos == 0 { - return true - } - - if err := emitter.write_handler(emitter, emitter.buffer[:emitter.buffer_pos]); err != nil { - return yaml_emitter_set_writer_error(emitter, "write error: "+err.Error()) - } - emitter.buffer_pos = 0 - return true -} diff --git a/vendor/gopkg.in/yaml.v3/yaml.go b/vendor/gopkg.in/yaml.v3/yaml.go deleted file mode 100644 index 8cec6da..0000000 --- a/vendor/gopkg.in/yaml.v3/yaml.go +++ /dev/null @@ -1,698 +0,0 @@ -// -// Copyright (c) 2011-2019 Canonical Ltd -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Package yaml implements YAML support for the Go language. -// -// Source code and other details for the project are available at GitHub: -// -// https://github.com/go-yaml/yaml -// -package yaml - -import ( - "errors" - "fmt" - "io" - "reflect" - "strings" - "sync" - "unicode/utf8" -) - -// The Unmarshaler interface may be implemented by types to customize their -// behavior when being unmarshaled from a YAML document. -type Unmarshaler interface { - UnmarshalYAML(value *Node) error -} - -type obsoleteUnmarshaler interface { - UnmarshalYAML(unmarshal func(interface{}) error) error -} - -// The Marshaler interface may be implemented by types to customize their -// behavior when being marshaled into a YAML document. The returned value -// is marshaled in place of the original value implementing Marshaler. -// -// If an error is returned by MarshalYAML, the marshaling procedure stops -// and returns with the provided error. -type Marshaler interface { - MarshalYAML() (interface{}, error) -} - -// Unmarshal decodes the first document found within the in byte slice -// and assigns decoded values into the out value. -// -// Maps and pointers (to a struct, string, int, etc) are accepted as out -// values. If an internal pointer within a struct is not initialized, -// the yaml package will initialize it if necessary for unmarshalling -// the provided data. The out parameter must not be nil. -// -// The type of the decoded values should be compatible with the respective -// values in out. If one or more values cannot be decoded due to a type -// mismatches, decoding continues partially until the end of the YAML -// content, and a *yaml.TypeError is returned with details for all -// missed values. -// -// Struct fields are only unmarshalled if they are exported (have an -// upper case first letter), and are unmarshalled using the field name -// lowercased as the default key. Custom keys may be defined via the -// "yaml" name in the field tag: the content preceding the first comma -// is used as the key, and the following comma-separated options are -// used to tweak the marshalling process (see Marshal). -// Conflicting names result in a runtime error. -// -// For example: -// -// type T struct { -// F int `yaml:"a,omitempty"` -// B int -// } -// var t T -// yaml.Unmarshal([]byte("a: 1\nb: 2"), &t) -// -// See the documentation of Marshal for the format of tags and a list of -// supported tag options. -// -func Unmarshal(in []byte, out interface{}) (err error) { - return unmarshal(in, out, false) -} - -// A Decoder reads and decodes YAML values from an input stream. -type Decoder struct { - parser *parser - knownFields bool -} - -// NewDecoder returns a new decoder that reads from r. -// -// The decoder introduces its own buffering and may read -// data from r beyond the YAML values requested. -func NewDecoder(r io.Reader) *Decoder { - return &Decoder{ - parser: newParserFromReader(r), - } -} - -// KnownFields ensures that the keys in decoded mappings to -// exist as fields in the struct being decoded into. -func (dec *Decoder) KnownFields(enable bool) { - dec.knownFields = enable -} - -// Decode reads the next YAML-encoded value from its input -// and stores it in the value pointed to by v. -// -// See the documentation for Unmarshal for details about the -// conversion of YAML into a Go value. -func (dec *Decoder) Decode(v interface{}) (err error) { - d := newDecoder() - d.knownFields = dec.knownFields - defer handleErr(&err) - node := dec.parser.parse() - if node == nil { - return io.EOF - } - out := reflect.ValueOf(v) - if out.Kind() == reflect.Ptr && !out.IsNil() { - out = out.Elem() - } - d.unmarshal(node, out) - if len(d.terrors) > 0 { - return &TypeError{d.terrors} - } - return nil -} - -// Decode decodes the node and stores its data into the value pointed to by v. -// -// See the documentation for Unmarshal for details about the -// conversion of YAML into a Go value. -func (n *Node) Decode(v interface{}) (err error) { - d := newDecoder() - defer handleErr(&err) - out := reflect.ValueOf(v) - if out.Kind() == reflect.Ptr && !out.IsNil() { - out = out.Elem() - } - d.unmarshal(n, out) - if len(d.terrors) > 0 { - return &TypeError{d.terrors} - } - return nil -} - -func unmarshal(in []byte, out interface{}, strict bool) (err error) { - defer handleErr(&err) - d := newDecoder() - p := newParser(in) - defer p.destroy() - node := p.parse() - if node != nil { - v := reflect.ValueOf(out) - if v.Kind() == reflect.Ptr && !v.IsNil() { - v = v.Elem() - } - d.unmarshal(node, v) - } - if len(d.terrors) > 0 { - return &TypeError{d.terrors} - } - return nil -} - -// Marshal serializes the value provided into a YAML document. The structure -// of the generated document will reflect the structure of the value itself. -// Maps and pointers (to struct, string, int, etc) are accepted as the in value. -// -// Struct fields are only marshalled if they are exported (have an upper case -// first letter), and are marshalled using the field name lowercased as the -// default key. Custom keys may be defined via the "yaml" name in the field -// tag: the content preceding the first comma is used as the key, and the -// following comma-separated options are used to tweak the marshalling process. -// Conflicting names result in a runtime error. -// -// The field tag format accepted is: -// -// `(...) yaml:"[][,[,]]" (...)` -// -// The following flags are currently supported: -// -// omitempty Only include the field if it's not set to the zero -// value for the type or to empty slices or maps. -// Zero valued structs will be omitted if all their public -// fields are zero, unless they implement an IsZero -// method (see the IsZeroer interface type), in which -// case the field will be excluded if IsZero returns true. -// -// flow Marshal using a flow style (useful for structs, -// sequences and maps). -// -// inline Inline the field, which must be a struct or a map, -// causing all of its fields or keys to be processed as if -// they were part of the outer struct. For maps, keys must -// not conflict with the yaml keys of other struct fields. -// -// In addition, if the key is "-", the field is ignored. -// -// For example: -// -// type T struct { -// F int `yaml:"a,omitempty"` -// B int -// } -// yaml.Marshal(&T{B: 2}) // Returns "b: 2\n" -// yaml.Marshal(&T{F: 1}} // Returns "a: 1\nb: 0\n" -// -func Marshal(in interface{}) (out []byte, err error) { - defer handleErr(&err) - e := newEncoder() - defer e.destroy() - e.marshalDoc("", reflect.ValueOf(in)) - e.finish() - out = e.out - return -} - -// An Encoder writes YAML values to an output stream. -type Encoder struct { - encoder *encoder -} - -// NewEncoder returns a new encoder that writes to w. -// The Encoder should be closed after use to flush all data -// to w. -func NewEncoder(w io.Writer) *Encoder { - return &Encoder{ - encoder: newEncoderWithWriter(w), - } -} - -// Encode writes the YAML encoding of v to the stream. -// If multiple items are encoded to the stream, the -// second and subsequent document will be preceded -// with a "---" document separator, but the first will not. -// -// See the documentation for Marshal for details about the conversion of Go -// values to YAML. -func (e *Encoder) Encode(v interface{}) (err error) { - defer handleErr(&err) - e.encoder.marshalDoc("", reflect.ValueOf(v)) - return nil -} - -// Encode encodes value v and stores its representation in n. -// -// See the documentation for Marshal for details about the -// conversion of Go values into YAML. -func (n *Node) Encode(v interface{}) (err error) { - defer handleErr(&err) - e := newEncoder() - defer e.destroy() - e.marshalDoc("", reflect.ValueOf(v)) - e.finish() - p := newParser(e.out) - p.textless = true - defer p.destroy() - doc := p.parse() - *n = *doc.Content[0] - return nil -} - -// SetIndent changes the used indentation used when encoding. -func (e *Encoder) SetIndent(spaces int) { - if spaces < 0 { - panic("yaml: cannot indent to a negative number of spaces") - } - e.encoder.indent = spaces -} - -// Close closes the encoder by writing any remaining data. -// It does not write a stream terminating string "...". -func (e *Encoder) Close() (err error) { - defer handleErr(&err) - e.encoder.finish() - return nil -} - -func handleErr(err *error) { - if v := recover(); v != nil { - if e, ok := v.(yamlError); ok { - *err = e.err - } else { - panic(v) - } - } -} - -type yamlError struct { - err error -} - -func fail(err error) { - panic(yamlError{err}) -} - -func failf(format string, args ...interface{}) { - panic(yamlError{fmt.Errorf("yaml: "+format, args...)}) -} - -// A TypeError is returned by Unmarshal when one or more fields in -// the YAML document cannot be properly decoded into the requested -// types. When this error is returned, the value is still -// unmarshaled partially. -type TypeError struct { - Errors []string -} - -func (e *TypeError) Error() string { - return fmt.Sprintf("yaml: unmarshal errors:\n %s", strings.Join(e.Errors, "\n ")) -} - -type Kind uint32 - -const ( - DocumentNode Kind = 1 << iota - SequenceNode - MappingNode - ScalarNode - AliasNode -) - -type Style uint32 - -const ( - TaggedStyle Style = 1 << iota - DoubleQuotedStyle - SingleQuotedStyle - LiteralStyle - FoldedStyle - FlowStyle -) - -// Node represents an element in the YAML document hierarchy. While documents -// are typically encoded and decoded into higher level types, such as structs -// and maps, Node is an intermediate representation that allows detailed -// control over the content being decoded or encoded. -// -// It's worth noting that although Node offers access into details such as -// line numbers, colums, and comments, the content when re-encoded will not -// have its original textual representation preserved. An effort is made to -// render the data plesantly, and to preserve comments near the data they -// describe, though. -// -// Values that make use of the Node type interact with the yaml package in the -// same way any other type would do, by encoding and decoding yaml data -// directly or indirectly into them. -// -// For example: -// -// var person struct { -// Name string -// Address yaml.Node -// } -// err := yaml.Unmarshal(data, &person) -// -// Or by itself: -// -// var person Node -// err := yaml.Unmarshal(data, &person) -// -type Node struct { - // Kind defines whether the node is a document, a mapping, a sequence, - // a scalar value, or an alias to another node. The specific data type of - // scalar nodes may be obtained via the ShortTag and LongTag methods. - Kind Kind - - // Style allows customizing the apperance of the node in the tree. - Style Style - - // Tag holds the YAML tag defining the data type for the value. - // When decoding, this field will always be set to the resolved tag, - // even when it wasn't explicitly provided in the YAML content. - // When encoding, if this field is unset the value type will be - // implied from the node properties, and if it is set, it will only - // be serialized into the representation if TaggedStyle is used or - // the implicit tag diverges from the provided one. - Tag string - - // Value holds the unescaped and unquoted represenation of the value. - Value string - - // Anchor holds the anchor name for this node, which allows aliases to point to it. - Anchor string - - // Alias holds the node that this alias points to. Only valid when Kind is AliasNode. - Alias *Node - - // Content holds contained nodes for documents, mappings, and sequences. - Content []*Node - - // HeadComment holds any comments in the lines preceding the node and - // not separated by an empty line. - HeadComment string - - // LineComment holds any comments at the end of the line where the node is in. - LineComment string - - // FootComment holds any comments following the node and before empty lines. - FootComment string - - // Line and Column hold the node position in the decoded YAML text. - // These fields are not respected when encoding the node. - Line int - Column int -} - -// IsZero returns whether the node has all of its fields unset. -func (n *Node) IsZero() bool { - return n.Kind == 0 && n.Style == 0 && n.Tag == "" && n.Value == "" && n.Anchor == "" && n.Alias == nil && n.Content == nil && - n.HeadComment == "" && n.LineComment == "" && n.FootComment == "" && n.Line == 0 && n.Column == 0 -} - - -// LongTag returns the long form of the tag that indicates the data type for -// the node. If the Tag field isn't explicitly defined, one will be computed -// based on the node properties. -func (n *Node) LongTag() string { - return longTag(n.ShortTag()) -} - -// ShortTag returns the short form of the YAML tag that indicates data type for -// the node. If the Tag field isn't explicitly defined, one will be computed -// based on the node properties. -func (n *Node) ShortTag() string { - if n.indicatedString() { - return strTag - } - if n.Tag == "" || n.Tag == "!" { - switch n.Kind { - case MappingNode: - return mapTag - case SequenceNode: - return seqTag - case AliasNode: - if n.Alias != nil { - return n.Alias.ShortTag() - } - case ScalarNode: - tag, _ := resolve("", n.Value) - return tag - case 0: - // Special case to make the zero value convenient. - if n.IsZero() { - return nullTag - } - } - return "" - } - return shortTag(n.Tag) -} - -func (n *Node) indicatedString() bool { - return n.Kind == ScalarNode && - (shortTag(n.Tag) == strTag || - (n.Tag == "" || n.Tag == "!") && n.Style&(SingleQuotedStyle|DoubleQuotedStyle|LiteralStyle|FoldedStyle) != 0) -} - -// SetString is a convenience function that sets the node to a string value -// and defines its style in a pleasant way depending on its content. -func (n *Node) SetString(s string) { - n.Kind = ScalarNode - if utf8.ValidString(s) { - n.Value = s - n.Tag = strTag - } else { - n.Value = encodeBase64(s) - n.Tag = binaryTag - } - if strings.Contains(n.Value, "\n") { - n.Style = LiteralStyle - } -} - -// -------------------------------------------------------------------------- -// Maintain a mapping of keys to structure field indexes - -// The code in this section was copied from mgo/bson. - -// structInfo holds details for the serialization of fields of -// a given struct. -type structInfo struct { - FieldsMap map[string]fieldInfo - FieldsList []fieldInfo - - // InlineMap is the number of the field in the struct that - // contains an ,inline map, or -1 if there's none. - InlineMap int - - // InlineUnmarshalers holds indexes to inlined fields that - // contain unmarshaler values. - InlineUnmarshalers [][]int -} - -type fieldInfo struct { - Key string - Num int - OmitEmpty bool - Flow bool - // Id holds the unique field identifier, so we can cheaply - // check for field duplicates without maintaining an extra map. - Id int - - // Inline holds the field index if the field is part of an inlined struct. - Inline []int -} - -var structMap = make(map[reflect.Type]*structInfo) -var fieldMapMutex sync.RWMutex -var unmarshalerType reflect.Type - -func init() { - var v Unmarshaler - unmarshalerType = reflect.ValueOf(&v).Elem().Type() -} - -func getStructInfo(st reflect.Type) (*structInfo, error) { - fieldMapMutex.RLock() - sinfo, found := structMap[st] - fieldMapMutex.RUnlock() - if found { - return sinfo, nil - } - - n := st.NumField() - fieldsMap := make(map[string]fieldInfo) - fieldsList := make([]fieldInfo, 0, n) - inlineMap := -1 - inlineUnmarshalers := [][]int(nil) - for i := 0; i != n; i++ { - field := st.Field(i) - if field.PkgPath != "" && !field.Anonymous { - continue // Private field - } - - info := fieldInfo{Num: i} - - tag := field.Tag.Get("yaml") - if tag == "" && strings.Index(string(field.Tag), ":") < 0 { - tag = string(field.Tag) - } - if tag == "-" { - continue - } - - inline := false - fields := strings.Split(tag, ",") - if len(fields) > 1 { - for _, flag := range fields[1:] { - switch flag { - case "omitempty": - info.OmitEmpty = true - case "flow": - info.Flow = true - case "inline": - inline = true - default: - return nil, errors.New(fmt.Sprintf("unsupported flag %q in tag %q of type %s", flag, tag, st)) - } - } - tag = fields[0] - } - - if inline { - switch field.Type.Kind() { - case reflect.Map: - if inlineMap >= 0 { - return nil, errors.New("multiple ,inline maps in struct " + st.String()) - } - if field.Type.Key() != reflect.TypeOf("") { - return nil, errors.New("option ,inline needs a map with string keys in struct " + st.String()) - } - inlineMap = info.Num - case reflect.Struct, reflect.Ptr: - ftype := field.Type - for ftype.Kind() == reflect.Ptr { - ftype = ftype.Elem() - } - if ftype.Kind() != reflect.Struct { - return nil, errors.New("option ,inline may only be used on a struct or map field") - } - if reflect.PtrTo(ftype).Implements(unmarshalerType) { - inlineUnmarshalers = append(inlineUnmarshalers, []int{i}) - } else { - sinfo, err := getStructInfo(ftype) - if err != nil { - return nil, err - } - for _, index := range sinfo.InlineUnmarshalers { - inlineUnmarshalers = append(inlineUnmarshalers, append([]int{i}, index...)) - } - for _, finfo := range sinfo.FieldsList { - if _, found := fieldsMap[finfo.Key]; found { - msg := "duplicated key '" + finfo.Key + "' in struct " + st.String() - return nil, errors.New(msg) - } - if finfo.Inline == nil { - finfo.Inline = []int{i, finfo.Num} - } else { - finfo.Inline = append([]int{i}, finfo.Inline...) - } - finfo.Id = len(fieldsList) - fieldsMap[finfo.Key] = finfo - fieldsList = append(fieldsList, finfo) - } - } - default: - return nil, errors.New("option ,inline may only be used on a struct or map field") - } - continue - } - - if tag != "" { - info.Key = tag - } else { - info.Key = strings.ToLower(field.Name) - } - - if _, found = fieldsMap[info.Key]; found { - msg := "duplicated key '" + info.Key + "' in struct " + st.String() - return nil, errors.New(msg) - } - - info.Id = len(fieldsList) - fieldsList = append(fieldsList, info) - fieldsMap[info.Key] = info - } - - sinfo = &structInfo{ - FieldsMap: fieldsMap, - FieldsList: fieldsList, - InlineMap: inlineMap, - InlineUnmarshalers: inlineUnmarshalers, - } - - fieldMapMutex.Lock() - structMap[st] = sinfo - fieldMapMutex.Unlock() - return sinfo, nil -} - -// IsZeroer is used to check whether an object is zero to -// determine whether it should be omitted when marshaling -// with the omitempty flag. One notable implementation -// is time.Time. -type IsZeroer interface { - IsZero() bool -} - -func isZero(v reflect.Value) bool { - kind := v.Kind() - if z, ok := v.Interface().(IsZeroer); ok { - if (kind == reflect.Ptr || kind == reflect.Interface) && v.IsNil() { - return true - } - return z.IsZero() - } - switch kind { - case reflect.String: - return len(v.String()) == 0 - case reflect.Interface, reflect.Ptr: - return v.IsNil() - case reflect.Slice: - return v.Len() == 0 - case reflect.Map: - return v.Len() == 0 - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return v.Int() == 0 - case reflect.Float32, reflect.Float64: - return v.Float() == 0 - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - return v.Uint() == 0 - case reflect.Bool: - return !v.Bool() - case reflect.Struct: - vt := v.Type() - for i := v.NumField() - 1; i >= 0; i-- { - if vt.Field(i).PkgPath != "" { - continue // Private field - } - if !isZero(v.Field(i)) { - return false - } - } - return true - } - return false -} diff --git a/vendor/gopkg.in/yaml.v3/yamlh.go b/vendor/gopkg.in/yaml.v3/yamlh.go deleted file mode 100644 index 7c6d007..0000000 --- a/vendor/gopkg.in/yaml.v3/yamlh.go +++ /dev/null @@ -1,807 +0,0 @@ -// -// Copyright (c) 2011-2019 Canonical Ltd -// Copyright (c) 2006-2010 Kirill Simonov -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of -// this software and associated documentation files (the "Software"), to deal in -// the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -// of the Software, and to permit persons to whom the Software is furnished to do -// so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. - -package yaml - -import ( - "fmt" - "io" -) - -// The version directive data. -type yaml_version_directive_t struct { - major int8 // The major version number. - minor int8 // The minor version number. -} - -// The tag directive data. -type yaml_tag_directive_t struct { - handle []byte // The tag handle. - prefix []byte // The tag prefix. -} - -type yaml_encoding_t int - -// The stream encoding. -const ( - // Let the parser choose the encoding. - yaml_ANY_ENCODING yaml_encoding_t = iota - - yaml_UTF8_ENCODING // The default UTF-8 encoding. - yaml_UTF16LE_ENCODING // The UTF-16-LE encoding with BOM. - yaml_UTF16BE_ENCODING // The UTF-16-BE encoding with BOM. -) - -type yaml_break_t int - -// Line break types. -const ( - // Let the parser choose the break type. - yaml_ANY_BREAK yaml_break_t = iota - - yaml_CR_BREAK // Use CR for line breaks (Mac style). - yaml_LN_BREAK // Use LN for line breaks (Unix style). - yaml_CRLN_BREAK // Use CR LN for line breaks (DOS style). -) - -type yaml_error_type_t int - -// Many bad things could happen with the parser and emitter. -const ( - // No error is produced. - yaml_NO_ERROR yaml_error_type_t = iota - - yaml_MEMORY_ERROR // Cannot allocate or reallocate a block of memory. - yaml_READER_ERROR // Cannot read or decode the input stream. - yaml_SCANNER_ERROR // Cannot scan the input stream. - yaml_PARSER_ERROR // Cannot parse the input stream. - yaml_COMPOSER_ERROR // Cannot compose a YAML document. - yaml_WRITER_ERROR // Cannot write to the output stream. - yaml_EMITTER_ERROR // Cannot emit a YAML stream. -) - -// The pointer position. -type yaml_mark_t struct { - index int // The position index. - line int // The position line. - column int // The position column. -} - -// Node Styles - -type yaml_style_t int8 - -type yaml_scalar_style_t yaml_style_t - -// Scalar styles. -const ( - // Let the emitter choose the style. - yaml_ANY_SCALAR_STYLE yaml_scalar_style_t = 0 - - yaml_PLAIN_SCALAR_STYLE yaml_scalar_style_t = 1 << iota // The plain scalar style. - yaml_SINGLE_QUOTED_SCALAR_STYLE // The single-quoted scalar style. - yaml_DOUBLE_QUOTED_SCALAR_STYLE // The double-quoted scalar style. - yaml_LITERAL_SCALAR_STYLE // The literal scalar style. - yaml_FOLDED_SCALAR_STYLE // The folded scalar style. -) - -type yaml_sequence_style_t yaml_style_t - -// Sequence styles. -const ( - // Let the emitter choose the style. - yaml_ANY_SEQUENCE_STYLE yaml_sequence_style_t = iota - - yaml_BLOCK_SEQUENCE_STYLE // The block sequence style. - yaml_FLOW_SEQUENCE_STYLE // The flow sequence style. -) - -type yaml_mapping_style_t yaml_style_t - -// Mapping styles. -const ( - // Let the emitter choose the style. - yaml_ANY_MAPPING_STYLE yaml_mapping_style_t = iota - - yaml_BLOCK_MAPPING_STYLE // The block mapping style. - yaml_FLOW_MAPPING_STYLE // The flow mapping style. -) - -// Tokens - -type yaml_token_type_t int - -// Token types. -const ( - // An empty token. - yaml_NO_TOKEN yaml_token_type_t = iota - - yaml_STREAM_START_TOKEN // A STREAM-START token. - yaml_STREAM_END_TOKEN // A STREAM-END token. - - yaml_VERSION_DIRECTIVE_TOKEN // A VERSION-DIRECTIVE token. - yaml_TAG_DIRECTIVE_TOKEN // A TAG-DIRECTIVE token. - yaml_DOCUMENT_START_TOKEN // A DOCUMENT-START token. - yaml_DOCUMENT_END_TOKEN // A DOCUMENT-END token. - - yaml_BLOCK_SEQUENCE_START_TOKEN // A BLOCK-SEQUENCE-START token. - yaml_BLOCK_MAPPING_START_TOKEN // A BLOCK-SEQUENCE-END token. - yaml_BLOCK_END_TOKEN // A BLOCK-END token. - - yaml_FLOW_SEQUENCE_START_TOKEN // A FLOW-SEQUENCE-START token. - yaml_FLOW_SEQUENCE_END_TOKEN // A FLOW-SEQUENCE-END token. - yaml_FLOW_MAPPING_START_TOKEN // A FLOW-MAPPING-START token. - yaml_FLOW_MAPPING_END_TOKEN // A FLOW-MAPPING-END token. - - yaml_BLOCK_ENTRY_TOKEN // A BLOCK-ENTRY token. - yaml_FLOW_ENTRY_TOKEN // A FLOW-ENTRY token. - yaml_KEY_TOKEN // A KEY token. - yaml_VALUE_TOKEN // A VALUE token. - - yaml_ALIAS_TOKEN // An ALIAS token. - yaml_ANCHOR_TOKEN // An ANCHOR token. - yaml_TAG_TOKEN // A TAG token. - yaml_SCALAR_TOKEN // A SCALAR token. -) - -func (tt yaml_token_type_t) String() string { - switch tt { - case yaml_NO_TOKEN: - return "yaml_NO_TOKEN" - case yaml_STREAM_START_TOKEN: - return "yaml_STREAM_START_TOKEN" - case yaml_STREAM_END_TOKEN: - return "yaml_STREAM_END_TOKEN" - case yaml_VERSION_DIRECTIVE_TOKEN: - return "yaml_VERSION_DIRECTIVE_TOKEN" - case yaml_TAG_DIRECTIVE_TOKEN: - return "yaml_TAG_DIRECTIVE_TOKEN" - case yaml_DOCUMENT_START_TOKEN: - return "yaml_DOCUMENT_START_TOKEN" - case yaml_DOCUMENT_END_TOKEN: - return "yaml_DOCUMENT_END_TOKEN" - case yaml_BLOCK_SEQUENCE_START_TOKEN: - return "yaml_BLOCK_SEQUENCE_START_TOKEN" - case yaml_BLOCK_MAPPING_START_TOKEN: - return "yaml_BLOCK_MAPPING_START_TOKEN" - case yaml_BLOCK_END_TOKEN: - return "yaml_BLOCK_END_TOKEN" - case yaml_FLOW_SEQUENCE_START_TOKEN: - return "yaml_FLOW_SEQUENCE_START_TOKEN" - case yaml_FLOW_SEQUENCE_END_TOKEN: - return "yaml_FLOW_SEQUENCE_END_TOKEN" - case yaml_FLOW_MAPPING_START_TOKEN: - return "yaml_FLOW_MAPPING_START_TOKEN" - case yaml_FLOW_MAPPING_END_TOKEN: - return "yaml_FLOW_MAPPING_END_TOKEN" - case yaml_BLOCK_ENTRY_TOKEN: - return "yaml_BLOCK_ENTRY_TOKEN" - case yaml_FLOW_ENTRY_TOKEN: - return "yaml_FLOW_ENTRY_TOKEN" - case yaml_KEY_TOKEN: - return "yaml_KEY_TOKEN" - case yaml_VALUE_TOKEN: - return "yaml_VALUE_TOKEN" - case yaml_ALIAS_TOKEN: - return "yaml_ALIAS_TOKEN" - case yaml_ANCHOR_TOKEN: - return "yaml_ANCHOR_TOKEN" - case yaml_TAG_TOKEN: - return "yaml_TAG_TOKEN" - case yaml_SCALAR_TOKEN: - return "yaml_SCALAR_TOKEN" - } - return "" -} - -// The token structure. -type yaml_token_t struct { - // The token type. - typ yaml_token_type_t - - // The start/end of the token. - start_mark, end_mark yaml_mark_t - - // The stream encoding (for yaml_STREAM_START_TOKEN). - encoding yaml_encoding_t - - // The alias/anchor/scalar value or tag/tag directive handle - // (for yaml_ALIAS_TOKEN, yaml_ANCHOR_TOKEN, yaml_SCALAR_TOKEN, yaml_TAG_TOKEN, yaml_TAG_DIRECTIVE_TOKEN). - value []byte - - // The tag suffix (for yaml_TAG_TOKEN). - suffix []byte - - // The tag directive prefix (for yaml_TAG_DIRECTIVE_TOKEN). - prefix []byte - - // The scalar style (for yaml_SCALAR_TOKEN). - style yaml_scalar_style_t - - // The version directive major/minor (for yaml_VERSION_DIRECTIVE_TOKEN). - major, minor int8 -} - -// Events - -type yaml_event_type_t int8 - -// Event types. -const ( - // An empty event. - yaml_NO_EVENT yaml_event_type_t = iota - - yaml_STREAM_START_EVENT // A STREAM-START event. - yaml_STREAM_END_EVENT // A STREAM-END event. - yaml_DOCUMENT_START_EVENT // A DOCUMENT-START event. - yaml_DOCUMENT_END_EVENT // A DOCUMENT-END event. - yaml_ALIAS_EVENT // An ALIAS event. - yaml_SCALAR_EVENT // A SCALAR event. - yaml_SEQUENCE_START_EVENT // A SEQUENCE-START event. - yaml_SEQUENCE_END_EVENT // A SEQUENCE-END event. - yaml_MAPPING_START_EVENT // A MAPPING-START event. - yaml_MAPPING_END_EVENT // A MAPPING-END event. - yaml_TAIL_COMMENT_EVENT -) - -var eventStrings = []string{ - yaml_NO_EVENT: "none", - yaml_STREAM_START_EVENT: "stream start", - yaml_STREAM_END_EVENT: "stream end", - yaml_DOCUMENT_START_EVENT: "document start", - yaml_DOCUMENT_END_EVENT: "document end", - yaml_ALIAS_EVENT: "alias", - yaml_SCALAR_EVENT: "scalar", - yaml_SEQUENCE_START_EVENT: "sequence start", - yaml_SEQUENCE_END_EVENT: "sequence end", - yaml_MAPPING_START_EVENT: "mapping start", - yaml_MAPPING_END_EVENT: "mapping end", - yaml_TAIL_COMMENT_EVENT: "tail comment", -} - -func (e yaml_event_type_t) String() string { - if e < 0 || int(e) >= len(eventStrings) { - return fmt.Sprintf("unknown event %d", e) - } - return eventStrings[e] -} - -// The event structure. -type yaml_event_t struct { - - // The event type. - typ yaml_event_type_t - - // The start and end of the event. - start_mark, end_mark yaml_mark_t - - // The document encoding (for yaml_STREAM_START_EVENT). - encoding yaml_encoding_t - - // The version directive (for yaml_DOCUMENT_START_EVENT). - version_directive *yaml_version_directive_t - - // The list of tag directives (for yaml_DOCUMENT_START_EVENT). - tag_directives []yaml_tag_directive_t - - // The comments - head_comment []byte - line_comment []byte - foot_comment []byte - tail_comment []byte - - // The anchor (for yaml_SCALAR_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT, yaml_ALIAS_EVENT). - anchor []byte - - // The tag (for yaml_SCALAR_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT). - tag []byte - - // The scalar value (for yaml_SCALAR_EVENT). - value []byte - - // Is the document start/end indicator implicit, or the tag optional? - // (for yaml_DOCUMENT_START_EVENT, yaml_DOCUMENT_END_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT, yaml_SCALAR_EVENT). - implicit bool - - // Is the tag optional for any non-plain style? (for yaml_SCALAR_EVENT). - quoted_implicit bool - - // The style (for yaml_SCALAR_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT). - style yaml_style_t -} - -func (e *yaml_event_t) scalar_style() yaml_scalar_style_t { return yaml_scalar_style_t(e.style) } -func (e *yaml_event_t) sequence_style() yaml_sequence_style_t { return yaml_sequence_style_t(e.style) } -func (e *yaml_event_t) mapping_style() yaml_mapping_style_t { return yaml_mapping_style_t(e.style) } - -// Nodes - -const ( - yaml_NULL_TAG = "tag:yaml.org,2002:null" // The tag !!null with the only possible value: null. - yaml_BOOL_TAG = "tag:yaml.org,2002:bool" // The tag !!bool with the values: true and false. - yaml_STR_TAG = "tag:yaml.org,2002:str" // The tag !!str for string values. - yaml_INT_TAG = "tag:yaml.org,2002:int" // The tag !!int for integer values. - yaml_FLOAT_TAG = "tag:yaml.org,2002:float" // The tag !!float for float values. - yaml_TIMESTAMP_TAG = "tag:yaml.org,2002:timestamp" // The tag !!timestamp for date and time values. - - yaml_SEQ_TAG = "tag:yaml.org,2002:seq" // The tag !!seq is used to denote sequences. - yaml_MAP_TAG = "tag:yaml.org,2002:map" // The tag !!map is used to denote mapping. - - // Not in original libyaml. - yaml_BINARY_TAG = "tag:yaml.org,2002:binary" - yaml_MERGE_TAG = "tag:yaml.org,2002:merge" - - yaml_DEFAULT_SCALAR_TAG = yaml_STR_TAG // The default scalar tag is !!str. - yaml_DEFAULT_SEQUENCE_TAG = yaml_SEQ_TAG // The default sequence tag is !!seq. - yaml_DEFAULT_MAPPING_TAG = yaml_MAP_TAG // The default mapping tag is !!map. -) - -type yaml_node_type_t int - -// Node types. -const ( - // An empty node. - yaml_NO_NODE yaml_node_type_t = iota - - yaml_SCALAR_NODE // A scalar node. - yaml_SEQUENCE_NODE // A sequence node. - yaml_MAPPING_NODE // A mapping node. -) - -// An element of a sequence node. -type yaml_node_item_t int - -// An element of a mapping node. -type yaml_node_pair_t struct { - key int // The key of the element. - value int // The value of the element. -} - -// The node structure. -type yaml_node_t struct { - typ yaml_node_type_t // The node type. - tag []byte // The node tag. - - // The node data. - - // The scalar parameters (for yaml_SCALAR_NODE). - scalar struct { - value []byte // The scalar value. - length int // The length of the scalar value. - style yaml_scalar_style_t // The scalar style. - } - - // The sequence parameters (for YAML_SEQUENCE_NODE). - sequence struct { - items_data []yaml_node_item_t // The stack of sequence items. - style yaml_sequence_style_t // The sequence style. - } - - // The mapping parameters (for yaml_MAPPING_NODE). - mapping struct { - pairs_data []yaml_node_pair_t // The stack of mapping pairs (key, value). - pairs_start *yaml_node_pair_t // The beginning of the stack. - pairs_end *yaml_node_pair_t // The end of the stack. - pairs_top *yaml_node_pair_t // The top of the stack. - style yaml_mapping_style_t // The mapping style. - } - - start_mark yaml_mark_t // The beginning of the node. - end_mark yaml_mark_t // The end of the node. - -} - -// The document structure. -type yaml_document_t struct { - - // The document nodes. - nodes []yaml_node_t - - // The version directive. - version_directive *yaml_version_directive_t - - // The list of tag directives. - tag_directives_data []yaml_tag_directive_t - tag_directives_start int // The beginning of the tag directives list. - tag_directives_end int // The end of the tag directives list. - - start_implicit int // Is the document start indicator implicit? - end_implicit int // Is the document end indicator implicit? - - // The start/end of the document. - start_mark, end_mark yaml_mark_t -} - -// The prototype of a read handler. -// -// The read handler is called when the parser needs to read more bytes from the -// source. The handler should write not more than size bytes to the buffer. -// The number of written bytes should be set to the size_read variable. -// -// [in,out] data A pointer to an application data specified by -// yaml_parser_set_input(). -// [out] buffer The buffer to write the data from the source. -// [in] size The size of the buffer. -// [out] size_read The actual number of bytes read from the source. -// -// On success, the handler should return 1. If the handler failed, -// the returned value should be 0. On EOF, the handler should set the -// size_read to 0 and return 1. -type yaml_read_handler_t func(parser *yaml_parser_t, buffer []byte) (n int, err error) - -// This structure holds information about a potential simple key. -type yaml_simple_key_t struct { - possible bool // Is a simple key possible? - required bool // Is a simple key required? - token_number int // The number of the token. - mark yaml_mark_t // The position mark. -} - -// The states of the parser. -type yaml_parser_state_t int - -const ( - yaml_PARSE_STREAM_START_STATE yaml_parser_state_t = iota - - yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE // Expect the beginning of an implicit document. - yaml_PARSE_DOCUMENT_START_STATE // Expect DOCUMENT-START. - yaml_PARSE_DOCUMENT_CONTENT_STATE // Expect the content of a document. - yaml_PARSE_DOCUMENT_END_STATE // Expect DOCUMENT-END. - yaml_PARSE_BLOCK_NODE_STATE // Expect a block node. - yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE // Expect a block node or indentless sequence. - yaml_PARSE_FLOW_NODE_STATE // Expect a flow node. - yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE // Expect the first entry of a block sequence. - yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE // Expect an entry of a block sequence. - yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE // Expect an entry of an indentless sequence. - yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE // Expect the first key of a block mapping. - yaml_PARSE_BLOCK_MAPPING_KEY_STATE // Expect a block mapping key. - yaml_PARSE_BLOCK_MAPPING_VALUE_STATE // Expect a block mapping value. - yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE // Expect the first entry of a flow sequence. - yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE // Expect an entry of a flow sequence. - yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE // Expect a key of an ordered mapping. - yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE // Expect a value of an ordered mapping. - yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE // Expect the and of an ordered mapping entry. - yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE // Expect the first key of a flow mapping. - yaml_PARSE_FLOW_MAPPING_KEY_STATE // Expect a key of a flow mapping. - yaml_PARSE_FLOW_MAPPING_VALUE_STATE // Expect a value of a flow mapping. - yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE // Expect an empty value of a flow mapping. - yaml_PARSE_END_STATE // Expect nothing. -) - -func (ps yaml_parser_state_t) String() string { - switch ps { - case yaml_PARSE_STREAM_START_STATE: - return "yaml_PARSE_STREAM_START_STATE" - case yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE: - return "yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE" - case yaml_PARSE_DOCUMENT_START_STATE: - return "yaml_PARSE_DOCUMENT_START_STATE" - case yaml_PARSE_DOCUMENT_CONTENT_STATE: - return "yaml_PARSE_DOCUMENT_CONTENT_STATE" - case yaml_PARSE_DOCUMENT_END_STATE: - return "yaml_PARSE_DOCUMENT_END_STATE" - case yaml_PARSE_BLOCK_NODE_STATE: - return "yaml_PARSE_BLOCK_NODE_STATE" - case yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE: - return "yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE" - case yaml_PARSE_FLOW_NODE_STATE: - return "yaml_PARSE_FLOW_NODE_STATE" - case yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE: - return "yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE" - case yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE: - return "yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE" - case yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE: - return "yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE" - case yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE: - return "yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE" - case yaml_PARSE_BLOCK_MAPPING_KEY_STATE: - return "yaml_PARSE_BLOCK_MAPPING_KEY_STATE" - case yaml_PARSE_BLOCK_MAPPING_VALUE_STATE: - return "yaml_PARSE_BLOCK_MAPPING_VALUE_STATE" - case yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE: - return "yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE" - case yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE: - return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE" - case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE: - return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE" - case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE: - return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE" - case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE: - return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE" - case yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE: - return "yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE" - case yaml_PARSE_FLOW_MAPPING_KEY_STATE: - return "yaml_PARSE_FLOW_MAPPING_KEY_STATE" - case yaml_PARSE_FLOW_MAPPING_VALUE_STATE: - return "yaml_PARSE_FLOW_MAPPING_VALUE_STATE" - case yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE: - return "yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE" - case yaml_PARSE_END_STATE: - return "yaml_PARSE_END_STATE" - } - return "" -} - -// This structure holds aliases data. -type yaml_alias_data_t struct { - anchor []byte // The anchor. - index int // The node id. - mark yaml_mark_t // The anchor mark. -} - -// The parser structure. -// -// All members are internal. Manage the structure using the -// yaml_parser_ family of functions. -type yaml_parser_t struct { - - // Error handling - - error yaml_error_type_t // Error type. - - problem string // Error description. - - // The byte about which the problem occurred. - problem_offset int - problem_value int - problem_mark yaml_mark_t - - // The error context. - context string - context_mark yaml_mark_t - - // Reader stuff - - read_handler yaml_read_handler_t // Read handler. - - input_reader io.Reader // File input data. - input []byte // String input data. - input_pos int - - eof bool // EOF flag - - buffer []byte // The working buffer. - buffer_pos int // The current position of the buffer. - - unread int // The number of unread characters in the buffer. - - newlines int // The number of line breaks since last non-break/non-blank character - - raw_buffer []byte // The raw buffer. - raw_buffer_pos int // The current position of the buffer. - - encoding yaml_encoding_t // The input encoding. - - offset int // The offset of the current position (in bytes). - mark yaml_mark_t // The mark of the current position. - - // Comments - - head_comment []byte // The current head comments - line_comment []byte // The current line comments - foot_comment []byte // The current foot comments - tail_comment []byte // Foot comment that happens at the end of a block. - stem_comment []byte // Comment in item preceding a nested structure (list inside list item, etc) - - comments []yaml_comment_t // The folded comments for all parsed tokens - comments_head int - - // Scanner stuff - - stream_start_produced bool // Have we started to scan the input stream? - stream_end_produced bool // Have we reached the end of the input stream? - - flow_level int // The number of unclosed '[' and '{' indicators. - - tokens []yaml_token_t // The tokens queue. - tokens_head int // The head of the tokens queue. - tokens_parsed int // The number of tokens fetched from the queue. - token_available bool // Does the tokens queue contain a token ready for dequeueing. - - indent int // The current indentation level. - indents []int // The indentation levels stack. - - simple_key_allowed bool // May a simple key occur at the current position? - simple_keys []yaml_simple_key_t // The stack of simple keys. - simple_keys_by_tok map[int]int // possible simple_key indexes indexed by token_number - - // Parser stuff - - state yaml_parser_state_t // The current parser state. - states []yaml_parser_state_t // The parser states stack. - marks []yaml_mark_t // The stack of marks. - tag_directives []yaml_tag_directive_t // The list of TAG directives. - - // Dumper stuff - - aliases []yaml_alias_data_t // The alias data. - - document *yaml_document_t // The currently parsed document. -} - -type yaml_comment_t struct { - - scan_mark yaml_mark_t // Position where scanning for comments started - token_mark yaml_mark_t // Position after which tokens will be associated with this comment - start_mark yaml_mark_t // Position of '#' comment mark - end_mark yaml_mark_t // Position where comment terminated - - head []byte - line []byte - foot []byte -} - -// Emitter Definitions - -// The prototype of a write handler. -// -// The write handler is called when the emitter needs to flush the accumulated -// characters to the output. The handler should write @a size bytes of the -// @a buffer to the output. -// -// @param[in,out] data A pointer to an application data specified by -// yaml_emitter_set_output(). -// @param[in] buffer The buffer with bytes to be written. -// @param[in] size The size of the buffer. -// -// @returns On success, the handler should return @c 1. If the handler failed, -// the returned value should be @c 0. -// -type yaml_write_handler_t func(emitter *yaml_emitter_t, buffer []byte) error - -type yaml_emitter_state_t int - -// The emitter states. -const ( - // Expect STREAM-START. - yaml_EMIT_STREAM_START_STATE yaml_emitter_state_t = iota - - yaml_EMIT_FIRST_DOCUMENT_START_STATE // Expect the first DOCUMENT-START or STREAM-END. - yaml_EMIT_DOCUMENT_START_STATE // Expect DOCUMENT-START or STREAM-END. - yaml_EMIT_DOCUMENT_CONTENT_STATE // Expect the content of a document. - yaml_EMIT_DOCUMENT_END_STATE // Expect DOCUMENT-END. - yaml_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE // Expect the first item of a flow sequence. - yaml_EMIT_FLOW_SEQUENCE_TRAIL_ITEM_STATE // Expect the next item of a flow sequence, with the comma already written out - yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE // Expect an item of a flow sequence. - yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE // Expect the first key of a flow mapping. - yaml_EMIT_FLOW_MAPPING_TRAIL_KEY_STATE // Expect the next key of a flow mapping, with the comma already written out - yaml_EMIT_FLOW_MAPPING_KEY_STATE // Expect a key of a flow mapping. - yaml_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE // Expect a value for a simple key of a flow mapping. - yaml_EMIT_FLOW_MAPPING_VALUE_STATE // Expect a value of a flow mapping. - yaml_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE // Expect the first item of a block sequence. - yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE // Expect an item of a block sequence. - yaml_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE // Expect the first key of a block mapping. - yaml_EMIT_BLOCK_MAPPING_KEY_STATE // Expect the key of a block mapping. - yaml_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE // Expect a value for a simple key of a block mapping. - yaml_EMIT_BLOCK_MAPPING_VALUE_STATE // Expect a value of a block mapping. - yaml_EMIT_END_STATE // Expect nothing. -) - -// The emitter structure. -// -// All members are internal. Manage the structure using the @c yaml_emitter_ -// family of functions. -type yaml_emitter_t struct { - - // Error handling - - error yaml_error_type_t // Error type. - problem string // Error description. - - // Writer stuff - - write_handler yaml_write_handler_t // Write handler. - - output_buffer *[]byte // String output data. - output_writer io.Writer // File output data. - - buffer []byte // The working buffer. - buffer_pos int // The current position of the buffer. - - raw_buffer []byte // The raw buffer. - raw_buffer_pos int // The current position of the buffer. - - encoding yaml_encoding_t // The stream encoding. - - // Emitter stuff - - canonical bool // If the output is in the canonical style? - best_indent int // The number of indentation spaces. - best_width int // The preferred width of the output lines. - unicode bool // Allow unescaped non-ASCII characters? - line_break yaml_break_t // The preferred line break. - - state yaml_emitter_state_t // The current emitter state. - states []yaml_emitter_state_t // The stack of states. - - events []yaml_event_t // The event queue. - events_head int // The head of the event queue. - - indents []int // The stack of indentation levels. - - tag_directives []yaml_tag_directive_t // The list of tag directives. - - indent int // The current indentation level. - - flow_level int // The current flow level. - - root_context bool // Is it the document root context? - sequence_context bool // Is it a sequence context? - mapping_context bool // Is it a mapping context? - simple_key_context bool // Is it a simple mapping key context? - - line int // The current line. - column int // The current column. - whitespace bool // If the last character was a whitespace? - indention bool // If the last character was an indentation character (' ', '-', '?', ':')? - open_ended bool // If an explicit document end is required? - - space_above bool // Is there's an empty line above? - foot_indent int // The indent used to write the foot comment above, or -1 if none. - - // Anchor analysis. - anchor_data struct { - anchor []byte // The anchor value. - alias bool // Is it an alias? - } - - // Tag analysis. - tag_data struct { - handle []byte // The tag handle. - suffix []byte // The tag suffix. - } - - // Scalar analysis. - scalar_data struct { - value []byte // The scalar value. - multiline bool // Does the scalar contain line breaks? - flow_plain_allowed bool // Can the scalar be expessed in the flow plain style? - block_plain_allowed bool // Can the scalar be expressed in the block plain style? - single_quoted_allowed bool // Can the scalar be expressed in the single quoted style? - block_allowed bool // Can the scalar be expressed in the literal or folded styles? - style yaml_scalar_style_t // The output style. - } - - // Comments - head_comment []byte - line_comment []byte - foot_comment []byte - tail_comment []byte - - key_line_comment []byte - - // Dumper stuff - - opened bool // If the stream was already opened? - closed bool // If the stream was already closed? - - // The information associated with the document nodes. - anchors *struct { - references int // The number of references. - anchor int // The anchor id. - serialized bool // If the node has been emitted? - } - - last_anchor_id int // The last assigned anchor id. - - document *yaml_document_t // The currently emitted document. -} diff --git a/vendor/gopkg.in/yaml.v3/yamlprivateh.go b/vendor/gopkg.in/yaml.v3/yamlprivateh.go deleted file mode 100644 index e88f9c5..0000000 --- a/vendor/gopkg.in/yaml.v3/yamlprivateh.go +++ /dev/null @@ -1,198 +0,0 @@ -// -// Copyright (c) 2011-2019 Canonical Ltd -// Copyright (c) 2006-2010 Kirill Simonov -// -// Permission is hereby granted, free of charge, to any person obtaining a copy of -// this software and associated documentation files (the "Software"), to deal in -// the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -// of the Software, and to permit persons to whom the Software is furnished to do -// so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. - -package yaml - -const ( - // The size of the input raw buffer. - input_raw_buffer_size = 512 - - // The size of the input buffer. - // It should be possible to decode the whole raw buffer. - input_buffer_size = input_raw_buffer_size * 3 - - // The size of the output buffer. - output_buffer_size = 128 - - // The size of the output raw buffer. - // It should be possible to encode the whole output buffer. - output_raw_buffer_size = (output_buffer_size*2 + 2) - - // The size of other stacks and queues. - initial_stack_size = 16 - initial_queue_size = 16 - initial_string_size = 16 -) - -// Check if the character at the specified position is an alphabetical -// character, a digit, '_', or '-'. -func is_alpha(b []byte, i int) bool { - return b[i] >= '0' && b[i] <= '9' || b[i] >= 'A' && b[i] <= 'Z' || b[i] >= 'a' && b[i] <= 'z' || b[i] == '_' || b[i] == '-' -} - -// Check if the character at the specified position is a digit. -func is_digit(b []byte, i int) bool { - return b[i] >= '0' && b[i] <= '9' -} - -// Get the value of a digit. -func as_digit(b []byte, i int) int { - return int(b[i]) - '0' -} - -// Check if the character at the specified position is a hex-digit. -func is_hex(b []byte, i int) bool { - return b[i] >= '0' && b[i] <= '9' || b[i] >= 'A' && b[i] <= 'F' || b[i] >= 'a' && b[i] <= 'f' -} - -// Get the value of a hex-digit. -func as_hex(b []byte, i int) int { - bi := b[i] - if bi >= 'A' && bi <= 'F' { - return int(bi) - 'A' + 10 - } - if bi >= 'a' && bi <= 'f' { - return int(bi) - 'a' + 10 - } - return int(bi) - '0' -} - -// Check if the character is ASCII. -func is_ascii(b []byte, i int) bool { - return b[i] <= 0x7F -} - -// Check if the character at the start of the buffer can be printed unescaped. -func is_printable(b []byte, i int) bool { - return ((b[i] == 0x0A) || // . == #x0A - (b[i] >= 0x20 && b[i] <= 0x7E) || // #x20 <= . <= #x7E - (b[i] == 0xC2 && b[i+1] >= 0xA0) || // #0xA0 <= . <= #xD7FF - (b[i] > 0xC2 && b[i] < 0xED) || - (b[i] == 0xED && b[i+1] < 0xA0) || - (b[i] == 0xEE) || - (b[i] == 0xEF && // #xE000 <= . <= #xFFFD - !(b[i+1] == 0xBB && b[i+2] == 0xBF) && // && . != #xFEFF - !(b[i+1] == 0xBF && (b[i+2] == 0xBE || b[i+2] == 0xBF)))) -} - -// Check if the character at the specified position is NUL. -func is_z(b []byte, i int) bool { - return b[i] == 0x00 -} - -// Check if the beginning of the buffer is a BOM. -func is_bom(b []byte, i int) bool { - return b[0] == 0xEF && b[1] == 0xBB && b[2] == 0xBF -} - -// Check if the character at the specified position is space. -func is_space(b []byte, i int) bool { - return b[i] == ' ' -} - -// Check if the character at the specified position is tab. -func is_tab(b []byte, i int) bool { - return b[i] == '\t' -} - -// Check if the character at the specified position is blank (space or tab). -func is_blank(b []byte, i int) bool { - //return is_space(b, i) || is_tab(b, i) - return b[i] == ' ' || b[i] == '\t' -} - -// Check if the character at the specified position is a line break. -func is_break(b []byte, i int) bool { - return (b[i] == '\r' || // CR (#xD) - b[i] == '\n' || // LF (#xA) - b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85) - b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028) - b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9) // PS (#x2029) -} - -func is_crlf(b []byte, i int) bool { - return b[i] == '\r' && b[i+1] == '\n' -} - -// Check if the character is a line break or NUL. -func is_breakz(b []byte, i int) bool { - //return is_break(b, i) || is_z(b, i) - return ( - // is_break: - b[i] == '\r' || // CR (#xD) - b[i] == '\n' || // LF (#xA) - b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85) - b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028) - b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9 || // PS (#x2029) - // is_z: - b[i] == 0) -} - -// Check if the character is a line break, space, or NUL. -func is_spacez(b []byte, i int) bool { - //return is_space(b, i) || is_breakz(b, i) - return ( - // is_space: - b[i] == ' ' || - // is_breakz: - b[i] == '\r' || // CR (#xD) - b[i] == '\n' || // LF (#xA) - b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85) - b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028) - b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9 || // PS (#x2029) - b[i] == 0) -} - -// Check if the character is a line break, space, tab, or NUL. -func is_blankz(b []byte, i int) bool { - //return is_blank(b, i) || is_breakz(b, i) - return ( - // is_blank: - b[i] == ' ' || b[i] == '\t' || - // is_breakz: - b[i] == '\r' || // CR (#xD) - b[i] == '\n' || // LF (#xA) - b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85) - b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028) - b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9 || // PS (#x2029) - b[i] == 0) -} - -// Determine the width of the character. -func width(b byte) int { - // Don't replace these by a switch without first - // confirming that it is being inlined. - if b&0x80 == 0x00 { - return 1 - } - if b&0xE0 == 0xC0 { - return 2 - } - if b&0xF0 == 0xE0 { - return 3 - } - if b&0xF8 == 0xF0 { - return 4 - } - return 0 - -} diff --git a/vendor/modules.txt b/vendor/modules.txt index c025c8c..eeb8e2a 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -1,70 +1,79 @@ -# github.com/Masterminds/semver v1.5.0 -## explicit -github.com/Masterminds/semver -# github.com/abadojack/whatlanggo v1.0.1 -github.com/abadojack/whatlanggo # github.com/bitly/go-simplejson v0.5.0 github.com/bitly/go-simplejson # github.com/bwmarrin/snowflake v0.3.0 github.com/bwmarrin/snowflake -# github.com/fatih/color v1.12.0 +# github.com/go-ole/go-ole v1.2.5 +## explicit +github.com/go-ole/go-ole +# github.com/google/uuid v1.3.0 ## explicit -github.com/fatih/color -# github.com/go-playground/colors v1.2.0 -github.com/go-playground/colors +github.com/google/uuid # github.com/gorilla/websocket v1.4.2 github.com/gorilla/websocket -# github.com/jackmordaunt/icns v1.0.0 -github.com/jackmordaunt/icns -# github.com/kennygrant/sanitize v1.2.4 -github.com/kennygrant/sanitize +# github.com/imdario/mergo v0.3.12 +github.com/imdario/mergo # github.com/kkdai/youtube/v2 v2.7.2 ## explicit github.com/kkdai/youtube/v2 +# github.com/klauspost/compress v1.13.4 +## explicit +github.com/klauspost/compress/flate +# github.com/leaanthony/clir v1.0.4 +github.com/leaanthony/clir +# github.com/leaanthony/go-ansi-parser v1.2.0 +## explicit +github.com/leaanthony/go-ansi-parser +# github.com/leaanthony/go-common-file-dialog v1.0.3 +github.com/leaanthony/go-common-file-dialog/cfd +github.com/leaanthony/go-common-file-dialog/util +# github.com/leaanthony/idgen v1.0.0 +github.com/leaanthony/idgen # github.com/leaanthony/slicer v1.6.0 ## explicit github.com/leaanthony/slicer -# github.com/leaanthony/spinner v0.5.3 -github.com/leaanthony/spinner -# github.com/leaanthony/synx v0.1.0 -github.com/leaanthony/synx -# github.com/leaanthony/wincursor v0.1.0 -github.com/leaanthony/wincursor -# github.com/mattn/go-colorable v0.1.8 -github.com/mattn/go-colorable +# github.com/leaanthony/webview2runtime v1.2.0 +## explicit +github.com/leaanthony/webview2runtime +# github.com/logrusorgru/aurora v2.0.3+incompatible +## explicit +github.com/logrusorgru/aurora # github.com/mattn/go-isatty v0.0.13 ## explicit -github.com/mattn/go-isatty # github.com/mitchellh/mapstructure v1.4.1 ## explicit github.com/mitchellh/mapstructure -# github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 -github.com/nfnt/resize -# github.com/pkg/browser v0.0.0-20210706143420-7d21f8c997e2 -## explicit -github.com/pkg/browser # github.com/pkg/errors v0.9.1 -## explicit github.com/pkg/errors -# github.com/sirupsen/logrus v1.8.1 -## explicit -github.com/sirupsen/logrus -# github.com/syossan27/tebata v0.0.0-20180602121909-b283fe4bc5ba -github.com/syossan27/tebata -# github.com/wailsapp/wails v1.16.6 -## explicit -github.com/wailsapp/wails -github.com/wailsapp/wails/cmd -github.com/wailsapp/wails/lib/binding -github.com/wailsapp/wails/lib/event -github.com/wailsapp/wails/lib/interfaces -github.com/wailsapp/wails/lib/ipc -github.com/wailsapp/wails/lib/logger -github.com/wailsapp/wails/lib/messages -github.com/wailsapp/wails/lib/renderer -github.com/wailsapp/wails/lib/renderer/bridge -github.com/wailsapp/wails/lib/renderer/webview -github.com/wailsapp/wails/runtime +# github.com/rivo/uniseg v0.2.0 +github.com/rivo/uniseg +# github.com/wailsapp/wails/v2 v2.0.0-alpha.73 +## explicit +github.com/wailsapp/wails/v2 +github.com/wailsapp/wails/v2/internal/app +github.com/wailsapp/wails/v2/internal/assetdb +github.com/wailsapp/wails/v2/internal/binding +github.com/wailsapp/wails/v2/internal/bridge +github.com/wailsapp/wails/v2/internal/crypto +github.com/wailsapp/wails/v2/internal/deepcopy +github.com/wailsapp/wails/v2/internal/ffenestri +github.com/wailsapp/wails/v2/internal/ffenestri/windows/wv2runtime +github.com/wailsapp/wails/v2/internal/fs +github.com/wailsapp/wails/v2/internal/logger +github.com/wailsapp/wails/v2/internal/menumanager +github.com/wailsapp/wails/v2/internal/messagedispatcher +github.com/wailsapp/wails/v2/internal/messagedispatcher/message +github.com/wailsapp/wails/v2/internal/runtime +github.com/wailsapp/wails/v2/internal/servicebus +github.com/wailsapp/wails/v2/internal/signal +github.com/wailsapp/wails/v2/internal/subsystem +github.com/wailsapp/wails/v2/internal/webserver +github.com/wailsapp/wails/v2/pkg/logger +github.com/wailsapp/wails/v2/pkg/menu +github.com/wailsapp/wails/v2/pkg/menu/keys +github.com/wailsapp/wails/v2/pkg/options +github.com/wailsapp/wails/v2/pkg/options/dialog +github.com/wailsapp/wails/v2/pkg/options/mac +github.com/wailsapp/wails/v2/pkg/options/windows # github.com/xujiajun/mmap-go v1.0.1 github.com/xujiajun/mmap-go # github.com/xujiajun/nutsdb v0.6.0 @@ -76,10 +85,8 @@ github.com/xujiajun/nutsdb/ds/zset # github.com/xujiajun/utils v0.0.0-20190123093513-8bf096c4f53b github.com/xujiajun/utils/filesystem github.com/xujiajun/utils/strconv2 -# golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d -## explicit -golang.org/x/image/draw -golang.org/x/image/math/f64 +# github.com/ztrue/tracerr v0.3.0 +github.com/ztrue/tracerr # golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d ## explicit golang.org/x/net/html @@ -89,17 +96,15 @@ golang.org/x/net/html/atom golang.org/x/sys/internal/unsafeheader golang.org/x/sys/unix golang.org/x/sys/windows -# golang.org/x/text v0.3.7 -## explicit -golang.org/x/text/encoding -golang.org/x/text/encoding/internal -golang.org/x/text/encoding/internal/identifier -golang.org/x/text/encoding/japanese -golang.org/x/text/encoding/korean -golang.org/x/text/encoding/simplifiedchinese -golang.org/x/text/transform +golang.org/x/sys/windows/registry # gopkg.in/tucnak/telebot.v2 v2.3.5 ## explicit gopkg.in/tucnak/telebot.v2 -# gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b -gopkg.in/yaml.v3 +# nhooyr.io/websocket v1.8.7 +## explicit +nhooyr.io/websocket +nhooyr.io/websocket/internal/bpool +nhooyr.io/websocket/internal/errd +nhooyr.io/websocket/internal/wsjs +nhooyr.io/websocket/internal/xsync +nhooyr.io/websocket/wsjson diff --git a/vendor/nhooyr.io/websocket/.gitignore b/vendor/nhooyr.io/websocket/.gitignore new file mode 100644 index 0000000..6961e5c --- /dev/null +++ b/vendor/nhooyr.io/websocket/.gitignore @@ -0,0 +1 @@ +websocket.test diff --git a/vendor/github.com/jackmordaunt/icns/LICENSE b/vendor/nhooyr.io/websocket/LICENSE.txt similarity index 96% rename from vendor/github.com/jackmordaunt/icns/LICENSE rename to vendor/nhooyr.io/websocket/LICENSE.txt index 787939e..b5b5fef 100644 --- a/vendor/github.com/jackmordaunt/icns/LICENSE +++ b/vendor/nhooyr.io/websocket/LICENSE.txt @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2018 Jack Mordaunt +Copyright (c) 2018 Anmol Sethi Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/vendor/nhooyr.io/websocket/README.md b/vendor/nhooyr.io/websocket/README.md new file mode 100644 index 0000000..df20c58 --- /dev/null +++ b/vendor/nhooyr.io/websocket/README.md @@ -0,0 +1,132 @@ +# websocket + +[![godoc](https://godoc.org/nhooyr.io/websocket?status.svg)](https://pkg.go.dev/nhooyr.io/websocket) +[![coverage](https://img.shields.io/badge/coverage-88%25-success)](https://nhooyrio-websocket-coverage.netlify.app) + +websocket is a minimal and idiomatic WebSocket library for Go. + +## Install + +```bash +go get nhooyr.io/websocket +``` + +## Highlights + +- Minimal and idiomatic API +- First class [context.Context](https://blog.golang.org/context) support +- Fully passes the WebSocket [autobahn-testsuite](https://github.com/crossbario/autobahn-testsuite) +- [Single dependency](https://pkg.go.dev/nhooyr.io/websocket?tab=imports) +- JSON and protobuf helpers in the [wsjson](https://pkg.go.dev/nhooyr.io/websocket/wsjson) and [wspb](https://pkg.go.dev/nhooyr.io/websocket/wspb) subpackages +- Zero alloc reads and writes +- Concurrent writes +- [Close handshake](https://pkg.go.dev/nhooyr.io/websocket#Conn.Close) +- [net.Conn](https://pkg.go.dev/nhooyr.io/websocket#NetConn) wrapper +- [Ping pong](https://pkg.go.dev/nhooyr.io/websocket#Conn.Ping) API +- [RFC 7692](https://tools.ietf.org/html/rfc7692) permessage-deflate compression +- Compile to [Wasm](https://pkg.go.dev/nhooyr.io/websocket#hdr-Wasm) + +## Roadmap + +- [ ] HTTP/2 [#4](https://github.com/nhooyr/websocket/issues/4) + +## Examples + +For a production quality example that demonstrates the complete API, see the +[echo example](./examples/echo). + +For a full stack example, see the [chat example](./examples/chat). + +### Server + +```go +http.HandlerFunc(func (w http.ResponseWriter, r *http.Request) { + c, err := websocket.Accept(w, r, nil) + if err != nil { + // ... + } + defer c.Close(websocket.StatusInternalError, "the sky is falling") + + ctx, cancel := context.WithTimeout(r.Context(), time.Second*10) + defer cancel() + + var v interface{} + err = wsjson.Read(ctx, c, &v) + if err != nil { + // ... + } + + log.Printf("received: %v", v) + + c.Close(websocket.StatusNormalClosure, "") +}) +``` + +### Client + +```go +ctx, cancel := context.WithTimeout(context.Background(), time.Minute) +defer cancel() + +c, _, err := websocket.Dial(ctx, "ws://localhost:8080", nil) +if err != nil { + // ... +} +defer c.Close(websocket.StatusInternalError, "the sky is falling") + +err = wsjson.Write(ctx, c, "hi") +if err != nil { + // ... +} + +c.Close(websocket.StatusNormalClosure, "") +``` + +## Comparison + +### gorilla/websocket + +Advantages of [gorilla/websocket](https://github.com/gorilla/websocket): + +- Mature and widely used +- [Prepared writes](https://pkg.go.dev/github.com/gorilla/websocket#PreparedMessage) +- Configurable [buffer sizes](https://pkg.go.dev/github.com/gorilla/websocket#hdr-Buffers) + +Advantages of nhooyr.io/websocket: + +- Minimal and idiomatic API + - Compare godoc of [nhooyr.io/websocket](https://pkg.go.dev/nhooyr.io/websocket) with [gorilla/websocket](https://pkg.go.dev/github.com/gorilla/websocket) side by side. +- [net.Conn](https://pkg.go.dev/nhooyr.io/websocket#NetConn) wrapper +- Zero alloc reads and writes ([gorilla/websocket#535](https://github.com/gorilla/websocket/issues/535)) +- Full [context.Context](https://blog.golang.org/context) support +- Dial uses [net/http.Client](https://golang.org/pkg/net/http/#Client) + - Will enable easy HTTP/2 support in the future + - Gorilla writes directly to a net.Conn and so duplicates features of net/http.Client. +- Concurrent writes +- Close handshake ([gorilla/websocket#448](https://github.com/gorilla/websocket/issues/448)) +- Idiomatic [ping pong](https://pkg.go.dev/nhooyr.io/websocket#Conn.Ping) API + - Gorilla requires registering a pong callback before sending a Ping +- Can target Wasm ([gorilla/websocket#432](https://github.com/gorilla/websocket/issues/432)) +- Transparent message buffer reuse with [wsjson](https://pkg.go.dev/nhooyr.io/websocket/wsjson) and [wspb](https://pkg.go.dev/nhooyr.io/websocket/wspb) subpackages +- [1.75x](https://github.com/nhooyr/websocket/releases/tag/v1.7.4) faster WebSocket masking implementation in pure Go + - Gorilla's implementation is slower and uses [unsafe](https://golang.org/pkg/unsafe/). +- Full [permessage-deflate](https://tools.ietf.org/html/rfc7692) compression extension support + - Gorilla only supports no context takeover mode + - We use [klauspost/compress](https://github.com/klauspost/compress) for much lower memory usage ([gorilla/websocket#203](https://github.com/gorilla/websocket/issues/203)) +- [CloseRead](https://pkg.go.dev/nhooyr.io/websocket#Conn.CloseRead) helper ([gorilla/websocket#492](https://github.com/gorilla/websocket/issues/492)) +- Actively maintained ([gorilla/websocket#370](https://github.com/gorilla/websocket/issues/370)) + +#### golang.org/x/net/websocket + +[golang.org/x/net/websocket](https://pkg.go.dev/golang.org/x/net/websocket) is deprecated. +See [golang/go/issues/18152](https://github.com/golang/go/issues/18152). + +The [net.Conn](https://pkg.go.dev/nhooyr.io/websocket#NetConn) can help in transitioning +to nhooyr.io/websocket. + +#### gobwas/ws + +[gobwas/ws](https://github.com/gobwas/ws) has an extremely flexible API that allows it to be used +in an event driven style for performance. See the author's [blog post](https://medium.freecodecamp.org/million-websockets-and-go-cc58418460bb). + +However when writing idiomatic Go, nhooyr.io/websocket will be faster and easier to use. diff --git a/vendor/nhooyr.io/websocket/accept.go b/vendor/nhooyr.io/websocket/accept.go new file mode 100644 index 0000000..18536bd --- /dev/null +++ b/vendor/nhooyr.io/websocket/accept.go @@ -0,0 +1,370 @@ +// +build !js + +package websocket + +import ( + "bytes" + "crypto/sha1" + "encoding/base64" + "errors" + "fmt" + "io" + "log" + "net/http" + "net/textproto" + "net/url" + "path/filepath" + "strings" + + "nhooyr.io/websocket/internal/errd" +) + +// AcceptOptions represents Accept's options. +type AcceptOptions struct { + // Subprotocols lists the WebSocket subprotocols that Accept will negotiate with the client. + // The empty subprotocol will always be negotiated as per RFC 6455. If you would like to + // reject it, close the connection when c.Subprotocol() == "". + Subprotocols []string + + // InsecureSkipVerify is used to disable Accept's origin verification behaviour. + // + // You probably want to use OriginPatterns instead. + InsecureSkipVerify bool + + // OriginPatterns lists the host patterns for authorized origins. + // The request host is always authorized. + // Use this to enable cross origin WebSockets. + // + // i.e javascript running on example.com wants to access a WebSocket server at chat.example.com. + // In such a case, example.com is the origin and chat.example.com is the request host. + // One would set this field to []string{"example.com"} to authorize example.com to connect. + // + // Each pattern is matched case insensitively against the request origin host + // with filepath.Match. + // See https://golang.org/pkg/path/filepath/#Match + // + // Please ensure you understand the ramifications of enabling this. + // If used incorrectly your WebSocket server will be open to CSRF attacks. + // + // Do not use * as a pattern to allow any origin, prefer to use InsecureSkipVerify instead + // to bring attention to the danger of such a setting. + OriginPatterns []string + + // CompressionMode controls the compression mode. + // Defaults to CompressionNoContextTakeover. + // + // See docs on CompressionMode for details. + CompressionMode CompressionMode + + // CompressionThreshold controls the minimum size of a message before compression is applied. + // + // Defaults to 512 bytes for CompressionNoContextTakeover and 128 bytes + // for CompressionContextTakeover. + CompressionThreshold int +} + +// Accept accepts a WebSocket handshake from a client and upgrades the +// the connection to a WebSocket. +// +// Accept will not allow cross origin requests by default. +// See the InsecureSkipVerify and OriginPatterns options to allow cross origin requests. +// +// Accept will write a response to w on all errors. +func Accept(w http.ResponseWriter, r *http.Request, opts *AcceptOptions) (*Conn, error) { + return accept(w, r, opts) +} + +func accept(w http.ResponseWriter, r *http.Request, opts *AcceptOptions) (_ *Conn, err error) { + defer errd.Wrap(&err, "failed to accept WebSocket connection") + + if opts == nil { + opts = &AcceptOptions{} + } + opts = &*opts + + errCode, err := verifyClientRequest(w, r) + if err != nil { + http.Error(w, err.Error(), errCode) + return nil, err + } + + if !opts.InsecureSkipVerify { + err = authenticateOrigin(r, opts.OriginPatterns) + if err != nil { + if errors.Is(err, filepath.ErrBadPattern) { + log.Printf("websocket: %v", err) + err = errors.New(http.StatusText(http.StatusForbidden)) + } + http.Error(w, err.Error(), http.StatusForbidden) + return nil, err + } + } + + hj, ok := w.(http.Hijacker) + if !ok { + err = errors.New("http.ResponseWriter does not implement http.Hijacker") + http.Error(w, http.StatusText(http.StatusNotImplemented), http.StatusNotImplemented) + return nil, err + } + + w.Header().Set("Upgrade", "websocket") + w.Header().Set("Connection", "Upgrade") + + key := r.Header.Get("Sec-WebSocket-Key") + w.Header().Set("Sec-WebSocket-Accept", secWebSocketAccept(key)) + + subproto := selectSubprotocol(r, opts.Subprotocols) + if subproto != "" { + w.Header().Set("Sec-WebSocket-Protocol", subproto) + } + + copts, err := acceptCompression(r, w, opts.CompressionMode) + if err != nil { + return nil, err + } + + w.WriteHeader(http.StatusSwitchingProtocols) + // See https://github.com/nhooyr/websocket/issues/166 + if ginWriter, ok := w.(interface { + WriteHeaderNow() + }); ok { + ginWriter.WriteHeaderNow() + } + + netConn, brw, err := hj.Hijack() + if err != nil { + err = fmt.Errorf("failed to hijack connection: %w", err) + http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError) + return nil, err + } + + // https://github.com/golang/go/issues/32314 + b, _ := brw.Reader.Peek(brw.Reader.Buffered()) + brw.Reader.Reset(io.MultiReader(bytes.NewReader(b), netConn)) + + return newConn(connConfig{ + subprotocol: w.Header().Get("Sec-WebSocket-Protocol"), + rwc: netConn, + client: false, + copts: copts, + flateThreshold: opts.CompressionThreshold, + + br: brw.Reader, + bw: brw.Writer, + }), nil +} + +func verifyClientRequest(w http.ResponseWriter, r *http.Request) (errCode int, _ error) { + if !r.ProtoAtLeast(1, 1) { + return http.StatusUpgradeRequired, fmt.Errorf("WebSocket protocol violation: handshake request must be at least HTTP/1.1: %q", r.Proto) + } + + if !headerContainsTokenIgnoreCase(r.Header, "Connection", "Upgrade") { + w.Header().Set("Connection", "Upgrade") + w.Header().Set("Upgrade", "websocket") + return http.StatusUpgradeRequired, fmt.Errorf("WebSocket protocol violation: Connection header %q does not contain Upgrade", r.Header.Get("Connection")) + } + + if !headerContainsTokenIgnoreCase(r.Header, "Upgrade", "websocket") { + w.Header().Set("Connection", "Upgrade") + w.Header().Set("Upgrade", "websocket") + return http.StatusUpgradeRequired, fmt.Errorf("WebSocket protocol violation: Upgrade header %q does not contain websocket", r.Header.Get("Upgrade")) + } + + if r.Method != "GET" { + return http.StatusMethodNotAllowed, fmt.Errorf("WebSocket protocol violation: handshake request method is not GET but %q", r.Method) + } + + if r.Header.Get("Sec-WebSocket-Version") != "13" { + w.Header().Set("Sec-WebSocket-Version", "13") + return http.StatusBadRequest, fmt.Errorf("unsupported WebSocket protocol version (only 13 is supported): %q", r.Header.Get("Sec-WebSocket-Version")) + } + + if r.Header.Get("Sec-WebSocket-Key") == "" { + return http.StatusBadRequest, errors.New("WebSocket protocol violation: missing Sec-WebSocket-Key") + } + + return 0, nil +} + +func authenticateOrigin(r *http.Request, originHosts []string) error { + origin := r.Header.Get("Origin") + if origin == "" { + return nil + } + + u, err := url.Parse(origin) + if err != nil { + return fmt.Errorf("failed to parse Origin header %q: %w", origin, err) + } + + if strings.EqualFold(r.Host, u.Host) { + return nil + } + + for _, hostPattern := range originHosts { + matched, err := match(hostPattern, u.Host) + if err != nil { + return fmt.Errorf("failed to parse filepath pattern %q: %w", hostPattern, err) + } + if matched { + return nil + } + } + return fmt.Errorf("request Origin %q is not authorized for Host %q", origin, r.Host) +} + +func match(pattern, s string) (bool, error) { + return filepath.Match(strings.ToLower(pattern), strings.ToLower(s)) +} + +func selectSubprotocol(r *http.Request, subprotocols []string) string { + cps := headerTokens(r.Header, "Sec-WebSocket-Protocol") + for _, sp := range subprotocols { + for _, cp := range cps { + if strings.EqualFold(sp, cp) { + return cp + } + } + } + return "" +} + +func acceptCompression(r *http.Request, w http.ResponseWriter, mode CompressionMode) (*compressionOptions, error) { + if mode == CompressionDisabled { + return nil, nil + } + + for _, ext := range websocketExtensions(r.Header) { + switch ext.name { + case "permessage-deflate": + return acceptDeflate(w, ext, mode) + // Disabled for now, see https://github.com/nhooyr/websocket/issues/218 + // case "x-webkit-deflate-frame": + // return acceptWebkitDeflate(w, ext, mode) + } + } + return nil, nil +} + +func acceptDeflate(w http.ResponseWriter, ext websocketExtension, mode CompressionMode) (*compressionOptions, error) { + copts := mode.opts() + + for _, p := range ext.params { + switch p { + case "client_no_context_takeover": + copts.clientNoContextTakeover = true + continue + case "server_no_context_takeover": + copts.serverNoContextTakeover = true + continue + } + + if strings.HasPrefix(p, "client_max_window_bits") { + // We cannot adjust the read sliding window so cannot make use of this. + continue + } + + err := fmt.Errorf("unsupported permessage-deflate parameter: %q", p) + http.Error(w, err.Error(), http.StatusBadRequest) + return nil, err + } + + copts.setHeader(w.Header()) + + return copts, nil +} + +func acceptWebkitDeflate(w http.ResponseWriter, ext websocketExtension, mode CompressionMode) (*compressionOptions, error) { + copts := mode.opts() + // The peer must explicitly request it. + copts.serverNoContextTakeover = false + + for _, p := range ext.params { + if p == "no_context_takeover" { + copts.serverNoContextTakeover = true + continue + } + + // We explicitly fail on x-webkit-deflate-frame's max_window_bits parameter instead + // of ignoring it as the draft spec is unclear. It says the server can ignore it + // but the server has no way of signalling to the client it was ignored as the parameters + // are set one way. + // Thus us ignoring it would make the client think we understood it which would cause issues. + // See https://tools.ietf.org/html/draft-tyoshino-hybi-websocket-perframe-deflate-06#section-4.1 + // + // Either way, we're only implementing this for webkit which never sends the max_window_bits + // parameter so we don't need to worry about it. + err := fmt.Errorf("unsupported x-webkit-deflate-frame parameter: %q", p) + http.Error(w, err.Error(), http.StatusBadRequest) + return nil, err + } + + s := "x-webkit-deflate-frame" + if copts.clientNoContextTakeover { + s += "; no_context_takeover" + } + w.Header().Set("Sec-WebSocket-Extensions", s) + + return copts, nil +} + +func headerContainsTokenIgnoreCase(h http.Header, key, token string) bool { + for _, t := range headerTokens(h, key) { + if strings.EqualFold(t, token) { + return true + } + } + return false +} + +type websocketExtension struct { + name string + params []string +} + +func websocketExtensions(h http.Header) []websocketExtension { + var exts []websocketExtension + extStrs := headerTokens(h, "Sec-WebSocket-Extensions") + for _, extStr := range extStrs { + if extStr == "" { + continue + } + + vals := strings.Split(extStr, ";") + for i := range vals { + vals[i] = strings.TrimSpace(vals[i]) + } + + e := websocketExtension{ + name: vals[0], + params: vals[1:], + } + + exts = append(exts, e) + } + return exts +} + +func headerTokens(h http.Header, key string) []string { + key = textproto.CanonicalMIMEHeaderKey(key) + var tokens []string + for _, v := range h[key] { + v = strings.TrimSpace(v) + for _, t := range strings.Split(v, ",") { + t = strings.TrimSpace(t) + tokens = append(tokens, t) + } + } + return tokens +} + +var keyGUID = []byte("258EAFA5-E914-47DA-95CA-C5AB0DC85B11") + +func secWebSocketAccept(secWebSocketKey string) string { + h := sha1.New() + h.Write([]byte(secWebSocketKey)) + h.Write(keyGUID) + + return base64.StdEncoding.EncodeToString(h.Sum(nil)) +} diff --git a/vendor/nhooyr.io/websocket/accept_js.go b/vendor/nhooyr.io/websocket/accept_js.go new file mode 100644 index 0000000..daad4b7 --- /dev/null +++ b/vendor/nhooyr.io/websocket/accept_js.go @@ -0,0 +1,20 @@ +package websocket + +import ( + "errors" + "net/http" +) + +// AcceptOptions represents Accept's options. +type AcceptOptions struct { + Subprotocols []string + InsecureSkipVerify bool + OriginPatterns []string + CompressionMode CompressionMode + CompressionThreshold int +} + +// Accept is stubbed out for Wasm. +func Accept(w http.ResponseWriter, r *http.Request, opts *AcceptOptions) (*Conn, error) { + return nil, errors.New("unimplemented") +} diff --git a/vendor/nhooyr.io/websocket/close.go b/vendor/nhooyr.io/websocket/close.go new file mode 100644 index 0000000..7cbc19e --- /dev/null +++ b/vendor/nhooyr.io/websocket/close.go @@ -0,0 +1,76 @@ +package websocket + +import ( + "errors" + "fmt" +) + +// StatusCode represents a WebSocket status code. +// https://tools.ietf.org/html/rfc6455#section-7.4 +type StatusCode int + +// https://www.iana.org/assignments/websocket/websocket.xhtml#close-code-number +// +// These are only the status codes defined by the protocol. +// +// You can define custom codes in the 3000-4999 range. +// The 3000-3999 range is reserved for use by libraries, frameworks and applications. +// The 4000-4999 range is reserved for private use. +const ( + StatusNormalClosure StatusCode = 1000 + StatusGoingAway StatusCode = 1001 + StatusProtocolError StatusCode = 1002 + StatusUnsupportedData StatusCode = 1003 + + // 1004 is reserved and so unexported. + statusReserved StatusCode = 1004 + + // StatusNoStatusRcvd cannot be sent in a close message. + // It is reserved for when a close message is received without + // a status code. + StatusNoStatusRcvd StatusCode = 1005 + + // StatusAbnormalClosure is exported for use only with Wasm. + // In non Wasm Go, the returned error will indicate whether the + // connection was closed abnormally. + StatusAbnormalClosure StatusCode = 1006 + + StatusInvalidFramePayloadData StatusCode = 1007 + StatusPolicyViolation StatusCode = 1008 + StatusMessageTooBig StatusCode = 1009 + StatusMandatoryExtension StatusCode = 1010 + StatusInternalError StatusCode = 1011 + StatusServiceRestart StatusCode = 1012 + StatusTryAgainLater StatusCode = 1013 + StatusBadGateway StatusCode = 1014 + + // StatusTLSHandshake is only exported for use with Wasm. + // In non Wasm Go, the returned error will indicate whether there was + // a TLS handshake failure. + StatusTLSHandshake StatusCode = 1015 +) + +// CloseError is returned when the connection is closed with a status and reason. +// +// Use Go 1.13's errors.As to check for this error. +// Also see the CloseStatus helper. +type CloseError struct { + Code StatusCode + Reason string +} + +func (ce CloseError) Error() string { + return fmt.Sprintf("status = %v and reason = %q", ce.Code, ce.Reason) +} + +// CloseStatus is a convenience wrapper around Go 1.13's errors.As to grab +// the status code from a CloseError. +// +// -1 will be returned if the passed error is nil or not a CloseError. +func CloseStatus(err error) StatusCode { + var ce CloseError + if errors.As(err, &ce) { + return ce.Code + } + return -1 +} diff --git a/vendor/nhooyr.io/websocket/close_notjs.go b/vendor/nhooyr.io/websocket/close_notjs.go new file mode 100644 index 0000000..4251311 --- /dev/null +++ b/vendor/nhooyr.io/websocket/close_notjs.go @@ -0,0 +1,211 @@ +// +build !js + +package websocket + +import ( + "context" + "encoding/binary" + "errors" + "fmt" + "log" + "time" + + "nhooyr.io/websocket/internal/errd" +) + +// Close performs the WebSocket close handshake with the given status code and reason. +// +// It will write a WebSocket close frame with a timeout of 5s and then wait 5s for +// the peer to send a close frame. +// All data messages received from the peer during the close handshake will be discarded. +// +// The connection can only be closed once. Additional calls to Close +// are no-ops. +// +// The maximum length of reason must be 125 bytes. Avoid +// sending a dynamic reason. +// +// Close will unblock all goroutines interacting with the connection once +// complete. +func (c *Conn) Close(code StatusCode, reason string) error { + return c.closeHandshake(code, reason) +} + +func (c *Conn) closeHandshake(code StatusCode, reason string) (err error) { + defer errd.Wrap(&err, "failed to close WebSocket") + + writeErr := c.writeClose(code, reason) + closeHandshakeErr := c.waitCloseHandshake() + + if writeErr != nil { + return writeErr + } + + if CloseStatus(closeHandshakeErr) == -1 { + return closeHandshakeErr + } + + return nil +} + +var errAlreadyWroteClose = errors.New("already wrote close") + +func (c *Conn) writeClose(code StatusCode, reason string) error { + c.closeMu.Lock() + wroteClose := c.wroteClose + c.wroteClose = true + c.closeMu.Unlock() + if wroteClose { + return errAlreadyWroteClose + } + + ce := CloseError{ + Code: code, + Reason: reason, + } + + var p []byte + var marshalErr error + if ce.Code != StatusNoStatusRcvd { + p, marshalErr = ce.bytes() + if marshalErr != nil { + log.Printf("websocket: %v", marshalErr) + } + } + + writeErr := c.writeControl(context.Background(), opClose, p) + if CloseStatus(writeErr) != -1 { + // Not a real error if it's due to a close frame being received. + writeErr = nil + } + + // We do this after in case there was an error writing the close frame. + c.setCloseErr(fmt.Errorf("sent close frame: %w", ce)) + + if marshalErr != nil { + return marshalErr + } + return writeErr +} + +func (c *Conn) waitCloseHandshake() error { + defer c.close(nil) + + ctx, cancel := context.WithTimeout(context.Background(), time.Second*5) + defer cancel() + + err := c.readMu.lock(ctx) + if err != nil { + return err + } + defer c.readMu.unlock() + + if c.readCloseFrameErr != nil { + return c.readCloseFrameErr + } + + for { + h, err := c.readLoop(ctx) + if err != nil { + return err + } + + for i := int64(0); i < h.payloadLength; i++ { + _, err := c.br.ReadByte() + if err != nil { + return err + } + } + } +} + +func parseClosePayload(p []byte) (CloseError, error) { + if len(p) == 0 { + return CloseError{ + Code: StatusNoStatusRcvd, + }, nil + } + + if len(p) < 2 { + return CloseError{}, fmt.Errorf("close payload %q too small, cannot even contain the 2 byte status code", p) + } + + ce := CloseError{ + Code: StatusCode(binary.BigEndian.Uint16(p)), + Reason: string(p[2:]), + } + + if !validWireCloseCode(ce.Code) { + return CloseError{}, fmt.Errorf("invalid status code %v", ce.Code) + } + + return ce, nil +} + +// See http://www.iana.org/assignments/websocket/websocket.xhtml#close-code-number +// and https://tools.ietf.org/html/rfc6455#section-7.4.1 +func validWireCloseCode(code StatusCode) bool { + switch code { + case statusReserved, StatusNoStatusRcvd, StatusAbnormalClosure, StatusTLSHandshake: + return false + } + + if code >= StatusNormalClosure && code <= StatusBadGateway { + return true + } + if code >= 3000 && code <= 4999 { + return true + } + + return false +} + +func (ce CloseError) bytes() ([]byte, error) { + p, err := ce.bytesErr() + if err != nil { + err = fmt.Errorf("failed to marshal close frame: %w", err) + ce = CloseError{ + Code: StatusInternalError, + } + p, _ = ce.bytesErr() + } + return p, err +} + +const maxCloseReason = maxControlPayload - 2 + +func (ce CloseError) bytesErr() ([]byte, error) { + if len(ce.Reason) > maxCloseReason { + return nil, fmt.Errorf("reason string max is %v but got %q with length %v", maxCloseReason, ce.Reason, len(ce.Reason)) + } + + if !validWireCloseCode(ce.Code) { + return nil, fmt.Errorf("status code %v cannot be set", ce.Code) + } + + buf := make([]byte, 2+len(ce.Reason)) + binary.BigEndian.PutUint16(buf, uint16(ce.Code)) + copy(buf[2:], ce.Reason) + return buf, nil +} + +func (c *Conn) setCloseErr(err error) { + c.closeMu.Lock() + c.setCloseErrLocked(err) + c.closeMu.Unlock() +} + +func (c *Conn) setCloseErrLocked(err error) { + if c.closeErr == nil { + c.closeErr = fmt.Errorf("WebSocket closed: %w", err) + } +} + +func (c *Conn) isClosed() bool { + select { + case <-c.closed: + return true + default: + return false + } +} diff --git a/vendor/nhooyr.io/websocket/compress.go b/vendor/nhooyr.io/websocket/compress.go new file mode 100644 index 0000000..80b46d1 --- /dev/null +++ b/vendor/nhooyr.io/websocket/compress.go @@ -0,0 +1,39 @@ +package websocket + +// CompressionMode represents the modes available to the deflate extension. +// See https://tools.ietf.org/html/rfc7692 +// +// A compatibility layer is implemented for the older deflate-frame extension used +// by safari. See https://tools.ietf.org/html/draft-tyoshino-hybi-websocket-perframe-deflate-06 +// It will work the same in every way except that we cannot signal to the peer we +// want to use no context takeover on our side, we can only signal that they should. +// It is however currently disabled due to Safari bugs. See https://github.com/nhooyr/websocket/issues/218 +type CompressionMode int + +const ( + // CompressionNoContextTakeover grabs a new flate.Reader and flate.Writer as needed + // for every message. This applies to both server and client side. + // + // This means less efficient compression as the sliding window from previous messages + // will not be used but the memory overhead will be lower if the connections + // are long lived and seldom used. + // + // The message will only be compressed if greater than 512 bytes. + CompressionNoContextTakeover CompressionMode = iota + + // CompressionContextTakeover uses a flate.Reader and flate.Writer per connection. + // This enables reusing the sliding window from previous messages. + // As most WebSocket protocols are repetitive, this can be very efficient. + // It carries an overhead of 8 kB for every connection compared to CompressionNoContextTakeover. + // + // If the peer negotiates NoContextTakeover on the client or server side, it will be + // used instead as this is required by the RFC. + CompressionContextTakeover + + // CompressionDisabled disables the deflate extension. + // + // Use this if you are using a predominantly binary protocol with very + // little duplication in between messages or CPU and memory are more + // important than bandwidth. + CompressionDisabled +) diff --git a/vendor/nhooyr.io/websocket/compress_notjs.go b/vendor/nhooyr.io/websocket/compress_notjs.go new file mode 100644 index 0000000..809a272 --- /dev/null +++ b/vendor/nhooyr.io/websocket/compress_notjs.go @@ -0,0 +1,181 @@ +// +build !js + +package websocket + +import ( + "io" + "net/http" + "sync" + + "github.com/klauspost/compress/flate" +) + +func (m CompressionMode) opts() *compressionOptions { + return &compressionOptions{ + clientNoContextTakeover: m == CompressionNoContextTakeover, + serverNoContextTakeover: m == CompressionNoContextTakeover, + } +} + +type compressionOptions struct { + clientNoContextTakeover bool + serverNoContextTakeover bool +} + +func (copts *compressionOptions) setHeader(h http.Header) { + s := "permessage-deflate" + if copts.clientNoContextTakeover { + s += "; client_no_context_takeover" + } + if copts.serverNoContextTakeover { + s += "; server_no_context_takeover" + } + h.Set("Sec-WebSocket-Extensions", s) +} + +// These bytes are required to get flate.Reader to return. +// They are removed when sending to avoid the overhead as +// WebSocket framing tell's when the message has ended but then +// we need to add them back otherwise flate.Reader keeps +// trying to return more bytes. +const deflateMessageTail = "\x00\x00\xff\xff" + +type trimLastFourBytesWriter struct { + w io.Writer + tail []byte +} + +func (tw *trimLastFourBytesWriter) reset() { + if tw != nil && tw.tail != nil { + tw.tail = tw.tail[:0] + } +} + +func (tw *trimLastFourBytesWriter) Write(p []byte) (int, error) { + if tw.tail == nil { + tw.tail = make([]byte, 0, 4) + } + + extra := len(tw.tail) + len(p) - 4 + + if extra <= 0 { + tw.tail = append(tw.tail, p...) + return len(p), nil + } + + // Now we need to write as many extra bytes as we can from the previous tail. + if extra > len(tw.tail) { + extra = len(tw.tail) + } + if extra > 0 { + _, err := tw.w.Write(tw.tail[:extra]) + if err != nil { + return 0, err + } + + // Shift remaining bytes in tail over. + n := copy(tw.tail, tw.tail[extra:]) + tw.tail = tw.tail[:n] + } + + // If p is less than or equal to 4 bytes, + // all of it is is part of the tail. + if len(p) <= 4 { + tw.tail = append(tw.tail, p...) + return len(p), nil + } + + // Otherwise, only the last 4 bytes are. + tw.tail = append(tw.tail, p[len(p)-4:]...) + + p = p[:len(p)-4] + n, err := tw.w.Write(p) + return n + 4, err +} + +var flateReaderPool sync.Pool + +func getFlateReader(r io.Reader, dict []byte) io.Reader { + fr, ok := flateReaderPool.Get().(io.Reader) + if !ok { + return flate.NewReaderDict(r, dict) + } + fr.(flate.Resetter).Reset(r, dict) + return fr +} + +func putFlateReader(fr io.Reader) { + flateReaderPool.Put(fr) +} + +type slidingWindow struct { + buf []byte +} + +var swPoolMu sync.RWMutex +var swPool = map[int]*sync.Pool{} + +func slidingWindowPool(n int) *sync.Pool { + swPoolMu.RLock() + p, ok := swPool[n] + swPoolMu.RUnlock() + if ok { + return p + } + + p = &sync.Pool{} + + swPoolMu.Lock() + swPool[n] = p + swPoolMu.Unlock() + + return p +} + +func (sw *slidingWindow) init(n int) { + if sw.buf != nil { + return + } + + if n == 0 { + n = 32768 + } + + p := slidingWindowPool(n) + buf, ok := p.Get().([]byte) + if ok { + sw.buf = buf[:0] + } else { + sw.buf = make([]byte, 0, n) + } +} + +func (sw *slidingWindow) close() { + if sw.buf == nil { + return + } + + swPoolMu.Lock() + swPool[cap(sw.buf)].Put(sw.buf) + swPoolMu.Unlock() + sw.buf = nil +} + +func (sw *slidingWindow) write(p []byte) { + if len(p) >= cap(sw.buf) { + sw.buf = sw.buf[:cap(sw.buf)] + p = p[len(p)-cap(sw.buf):] + copy(sw.buf, p) + return + } + + left := cap(sw.buf) - len(sw.buf) + if left < len(p) { + // We need to shift spaceNeeded bytes from the end to make room for p at the end. + spaceNeeded := len(p) - left + copy(sw.buf, sw.buf[spaceNeeded:]) + sw.buf = sw.buf[:len(sw.buf)-spaceNeeded] + } + + sw.buf = append(sw.buf, p...) +} diff --git a/vendor/nhooyr.io/websocket/conn.go b/vendor/nhooyr.io/websocket/conn.go new file mode 100644 index 0000000..a41808b --- /dev/null +++ b/vendor/nhooyr.io/websocket/conn.go @@ -0,0 +1,13 @@ +package websocket + +// MessageType represents the type of a WebSocket message. +// See https://tools.ietf.org/html/rfc6455#section-5.6 +type MessageType int + +// MessageType constants. +const ( + // MessageText is for UTF-8 encoded text messages like JSON. + MessageText MessageType = iota + 1 + // MessageBinary is for binary messages like protobufs. + MessageBinary +) diff --git a/vendor/nhooyr.io/websocket/conn_notjs.go b/vendor/nhooyr.io/websocket/conn_notjs.go new file mode 100644 index 0000000..0c85ab7 --- /dev/null +++ b/vendor/nhooyr.io/websocket/conn_notjs.go @@ -0,0 +1,265 @@ +// +build !js + +package websocket + +import ( + "bufio" + "context" + "errors" + "fmt" + "io" + "runtime" + "strconv" + "sync" + "sync/atomic" +) + +// Conn represents a WebSocket connection. +// All methods may be called concurrently except for Reader and Read. +// +// You must always read from the connection. Otherwise control +// frames will not be handled. See Reader and CloseRead. +// +// Be sure to call Close on the connection when you +// are finished with it to release associated resources. +// +// On any error from any method, the connection is closed +// with an appropriate reason. +type Conn struct { + subprotocol string + rwc io.ReadWriteCloser + client bool + copts *compressionOptions + flateThreshold int + br *bufio.Reader + bw *bufio.Writer + + readTimeout chan context.Context + writeTimeout chan context.Context + + // Read state. + readMu *mu + readHeaderBuf [8]byte + readControlBuf [maxControlPayload]byte + msgReader *msgReader + readCloseFrameErr error + + // Write state. + msgWriterState *msgWriterState + writeFrameMu *mu + writeBuf []byte + writeHeaderBuf [8]byte + writeHeader header + + closed chan struct{} + closeMu sync.Mutex + closeErr error + wroteClose bool + + pingCounter int32 + activePingsMu sync.Mutex + activePings map[string]chan<- struct{} +} + +type connConfig struct { + subprotocol string + rwc io.ReadWriteCloser + client bool + copts *compressionOptions + flateThreshold int + + br *bufio.Reader + bw *bufio.Writer +} + +func newConn(cfg connConfig) *Conn { + c := &Conn{ + subprotocol: cfg.subprotocol, + rwc: cfg.rwc, + client: cfg.client, + copts: cfg.copts, + flateThreshold: cfg.flateThreshold, + + br: cfg.br, + bw: cfg.bw, + + readTimeout: make(chan context.Context), + writeTimeout: make(chan context.Context), + + closed: make(chan struct{}), + activePings: make(map[string]chan<- struct{}), + } + + c.readMu = newMu(c) + c.writeFrameMu = newMu(c) + + c.msgReader = newMsgReader(c) + + c.msgWriterState = newMsgWriterState(c) + if c.client { + c.writeBuf = extractBufioWriterBuf(c.bw, c.rwc) + } + + if c.flate() && c.flateThreshold == 0 { + c.flateThreshold = 128 + if !c.msgWriterState.flateContextTakeover() { + c.flateThreshold = 512 + } + } + + runtime.SetFinalizer(c, func(c *Conn) { + c.close(errors.New("connection garbage collected")) + }) + + go c.timeoutLoop() + + return c +} + +// Subprotocol returns the negotiated subprotocol. +// An empty string means the default protocol. +func (c *Conn) Subprotocol() string { + return c.subprotocol +} + +func (c *Conn) close(err error) { + c.closeMu.Lock() + defer c.closeMu.Unlock() + + if c.isClosed() { + return + } + c.setCloseErrLocked(err) + close(c.closed) + runtime.SetFinalizer(c, nil) + + // Have to close after c.closed is closed to ensure any goroutine that wakes up + // from the connection being closed also sees that c.closed is closed and returns + // closeErr. + c.rwc.Close() + + go func() { + c.msgWriterState.close() + + c.msgReader.close() + }() +} + +func (c *Conn) timeoutLoop() { + readCtx := context.Background() + writeCtx := context.Background() + + for { + select { + case <-c.closed: + return + + case writeCtx = <-c.writeTimeout: + case readCtx = <-c.readTimeout: + + case <-readCtx.Done(): + c.setCloseErr(fmt.Errorf("read timed out: %w", readCtx.Err())) + go c.writeError(StatusPolicyViolation, errors.New("timed out")) + case <-writeCtx.Done(): + c.close(fmt.Errorf("write timed out: %w", writeCtx.Err())) + return + } + } +} + +func (c *Conn) flate() bool { + return c.copts != nil +} + +// Ping sends a ping to the peer and waits for a pong. +// Use this to measure latency or ensure the peer is responsive. +// Ping must be called concurrently with Reader as it does +// not read from the connection but instead waits for a Reader call +// to read the pong. +// +// TCP Keepalives should suffice for most use cases. +func (c *Conn) Ping(ctx context.Context) error { + p := atomic.AddInt32(&c.pingCounter, 1) + + err := c.ping(ctx, strconv.Itoa(int(p))) + if err != nil { + return fmt.Errorf("failed to ping: %w", err) + } + return nil +} + +func (c *Conn) ping(ctx context.Context, p string) error { + pong := make(chan struct{}, 1) + + c.activePingsMu.Lock() + c.activePings[p] = pong + c.activePingsMu.Unlock() + + defer func() { + c.activePingsMu.Lock() + delete(c.activePings, p) + c.activePingsMu.Unlock() + }() + + err := c.writeControl(ctx, opPing, []byte(p)) + if err != nil { + return err + } + + select { + case <-c.closed: + return c.closeErr + case <-ctx.Done(): + err := fmt.Errorf("failed to wait for pong: %w", ctx.Err()) + c.close(err) + return err + case <-pong: + return nil + } +} + +type mu struct { + c *Conn + ch chan struct{} +} + +func newMu(c *Conn) *mu { + return &mu{ + c: c, + ch: make(chan struct{}, 1), + } +} + +func (m *mu) forceLock() { + m.ch <- struct{}{} +} + +func (m *mu) lock(ctx context.Context) error { + select { + case <-m.c.closed: + return m.c.closeErr + case <-ctx.Done(): + err := fmt.Errorf("failed to acquire lock: %w", ctx.Err()) + m.c.close(err) + return err + case m.ch <- struct{}{}: + // To make sure the connection is certainly alive. + // As it's possible the send on m.ch was selected + // over the receive on closed. + select { + case <-m.c.closed: + // Make sure to release. + m.unlock() + return m.c.closeErr + default: + } + return nil + } +} + +func (m *mu) unlock() { + select { + case <-m.ch: + default: + } +} diff --git a/vendor/nhooyr.io/websocket/dial.go b/vendor/nhooyr.io/websocket/dial.go new file mode 100644 index 0000000..7a7787f --- /dev/null +++ b/vendor/nhooyr.io/websocket/dial.go @@ -0,0 +1,292 @@ +// +build !js + +package websocket + +import ( + "bufio" + "bytes" + "context" + "crypto/rand" + "encoding/base64" + "fmt" + "io" + "io/ioutil" + "net/http" + "net/url" + "strings" + "sync" + "time" + + "nhooyr.io/websocket/internal/errd" +) + +// DialOptions represents Dial's options. +type DialOptions struct { + // HTTPClient is used for the connection. + // Its Transport must return writable bodies for WebSocket handshakes. + // http.Transport does beginning with Go 1.12. + HTTPClient *http.Client + + // HTTPHeader specifies the HTTP headers included in the handshake request. + HTTPHeader http.Header + + // Subprotocols lists the WebSocket subprotocols to negotiate with the server. + Subprotocols []string + + // CompressionMode controls the compression mode. + // Defaults to CompressionNoContextTakeover. + // + // See docs on CompressionMode for details. + CompressionMode CompressionMode + + // CompressionThreshold controls the minimum size of a message before compression is applied. + // + // Defaults to 512 bytes for CompressionNoContextTakeover and 128 bytes + // for CompressionContextTakeover. + CompressionThreshold int +} + +// Dial performs a WebSocket handshake on url. +// +// The response is the WebSocket handshake response from the server. +// You never need to close resp.Body yourself. +// +// If an error occurs, the returned response may be non nil. +// However, you can only read the first 1024 bytes of the body. +// +// This function requires at least Go 1.12 as it uses a new feature +// in net/http to perform WebSocket handshakes. +// See docs on the HTTPClient option and https://github.com/golang/go/issues/26937#issuecomment-415855861 +// +// URLs with http/https schemes will work and are interpreted as ws/wss. +func Dial(ctx context.Context, u string, opts *DialOptions) (*Conn, *http.Response, error) { + return dial(ctx, u, opts, nil) +} + +func dial(ctx context.Context, urls string, opts *DialOptions, rand io.Reader) (_ *Conn, _ *http.Response, err error) { + defer errd.Wrap(&err, "failed to WebSocket dial") + + if opts == nil { + opts = &DialOptions{} + } + + opts = &*opts + if opts.HTTPClient == nil { + opts.HTTPClient = http.DefaultClient + } else if opts.HTTPClient.Timeout > 0 { + var cancel context.CancelFunc + + ctx, cancel = context.WithTimeout(ctx, opts.HTTPClient.Timeout) + defer cancel() + + newClient := *opts.HTTPClient + newClient.Timeout = 0 + opts.HTTPClient = &newClient + } + + if opts.HTTPHeader == nil { + opts.HTTPHeader = http.Header{} + } + + secWebSocketKey, err := secWebSocketKey(rand) + if err != nil { + return nil, nil, fmt.Errorf("failed to generate Sec-WebSocket-Key: %w", err) + } + + var copts *compressionOptions + if opts.CompressionMode != CompressionDisabled { + copts = opts.CompressionMode.opts() + } + + resp, err := handshakeRequest(ctx, urls, opts, copts, secWebSocketKey) + if err != nil { + return nil, resp, err + } + respBody := resp.Body + resp.Body = nil + defer func() { + if err != nil { + // We read a bit of the body for easier debugging. + r := io.LimitReader(respBody, 1024) + + timer := time.AfterFunc(time.Second*3, func() { + respBody.Close() + }) + defer timer.Stop() + + b, _ := ioutil.ReadAll(r) + respBody.Close() + resp.Body = ioutil.NopCloser(bytes.NewReader(b)) + } + }() + + copts, err = verifyServerResponse(opts, copts, secWebSocketKey, resp) + if err != nil { + return nil, resp, err + } + + rwc, ok := respBody.(io.ReadWriteCloser) + if !ok { + return nil, resp, fmt.Errorf("response body is not a io.ReadWriteCloser: %T", respBody) + } + + return newConn(connConfig{ + subprotocol: resp.Header.Get("Sec-WebSocket-Protocol"), + rwc: rwc, + client: true, + copts: copts, + flateThreshold: opts.CompressionThreshold, + br: getBufioReader(rwc), + bw: getBufioWriter(rwc), + }), resp, nil +} + +func handshakeRequest(ctx context.Context, urls string, opts *DialOptions, copts *compressionOptions, secWebSocketKey string) (*http.Response, error) { + u, err := url.Parse(urls) + if err != nil { + return nil, fmt.Errorf("failed to parse url: %w", err) + } + + switch u.Scheme { + case "ws": + u.Scheme = "http" + case "wss": + u.Scheme = "https" + case "http", "https": + default: + return nil, fmt.Errorf("unexpected url scheme: %q", u.Scheme) + } + + req, _ := http.NewRequestWithContext(ctx, "GET", u.String(), nil) + req.Header = opts.HTTPHeader.Clone() + req.Header.Set("Connection", "Upgrade") + req.Header.Set("Upgrade", "websocket") + req.Header.Set("Sec-WebSocket-Version", "13") + req.Header.Set("Sec-WebSocket-Key", secWebSocketKey) + if len(opts.Subprotocols) > 0 { + req.Header.Set("Sec-WebSocket-Protocol", strings.Join(opts.Subprotocols, ",")) + } + if copts != nil { + copts.setHeader(req.Header) + } + + resp, err := opts.HTTPClient.Do(req) + if err != nil { + return nil, fmt.Errorf("failed to send handshake request: %w", err) + } + return resp, nil +} + +func secWebSocketKey(rr io.Reader) (string, error) { + if rr == nil { + rr = rand.Reader + } + b := make([]byte, 16) + _, err := io.ReadFull(rr, b) + if err != nil { + return "", fmt.Errorf("failed to read random data from rand.Reader: %w", err) + } + return base64.StdEncoding.EncodeToString(b), nil +} + +func verifyServerResponse(opts *DialOptions, copts *compressionOptions, secWebSocketKey string, resp *http.Response) (*compressionOptions, error) { + if resp.StatusCode != http.StatusSwitchingProtocols { + return nil, fmt.Errorf("expected handshake response status code %v but got %v", http.StatusSwitchingProtocols, resp.StatusCode) + } + + if !headerContainsTokenIgnoreCase(resp.Header, "Connection", "Upgrade") { + return nil, fmt.Errorf("WebSocket protocol violation: Connection header %q does not contain Upgrade", resp.Header.Get("Connection")) + } + + if !headerContainsTokenIgnoreCase(resp.Header, "Upgrade", "WebSocket") { + return nil, fmt.Errorf("WebSocket protocol violation: Upgrade header %q does not contain websocket", resp.Header.Get("Upgrade")) + } + + if resp.Header.Get("Sec-WebSocket-Accept") != secWebSocketAccept(secWebSocketKey) { + return nil, fmt.Errorf("WebSocket protocol violation: invalid Sec-WebSocket-Accept %q, key %q", + resp.Header.Get("Sec-WebSocket-Accept"), + secWebSocketKey, + ) + } + + err := verifySubprotocol(opts.Subprotocols, resp) + if err != nil { + return nil, err + } + + return verifyServerExtensions(copts, resp.Header) +} + +func verifySubprotocol(subprotos []string, resp *http.Response) error { + proto := resp.Header.Get("Sec-WebSocket-Protocol") + if proto == "" { + return nil + } + + for _, sp2 := range subprotos { + if strings.EqualFold(sp2, proto) { + return nil + } + } + + return fmt.Errorf("WebSocket protocol violation: unexpected Sec-WebSocket-Protocol from server: %q", proto) +} + +func verifyServerExtensions(copts *compressionOptions, h http.Header) (*compressionOptions, error) { + exts := websocketExtensions(h) + if len(exts) == 0 { + return nil, nil + } + + ext := exts[0] + if ext.name != "permessage-deflate" || len(exts) > 1 || copts == nil { + return nil, fmt.Errorf("WebSocket protcol violation: unsupported extensions from server: %+v", exts[1:]) + } + + copts = &*copts + + for _, p := range ext.params { + switch p { + case "client_no_context_takeover": + copts.clientNoContextTakeover = true + continue + case "server_no_context_takeover": + copts.serverNoContextTakeover = true + continue + } + + return nil, fmt.Errorf("unsupported permessage-deflate parameter: %q", p) + } + + return copts, nil +} + +var bufioReaderPool sync.Pool + +func getBufioReader(r io.Reader) *bufio.Reader { + br, ok := bufioReaderPool.Get().(*bufio.Reader) + if !ok { + return bufio.NewReader(r) + } + br.Reset(r) + return br +} + +func putBufioReader(br *bufio.Reader) { + bufioReaderPool.Put(br) +} + +var bufioWriterPool sync.Pool + +func getBufioWriter(w io.Writer) *bufio.Writer { + bw, ok := bufioWriterPool.Get().(*bufio.Writer) + if !ok { + return bufio.NewWriter(w) + } + bw.Reset(w) + return bw +} + +func putBufioWriter(bw *bufio.Writer) { + bufioWriterPool.Put(bw) +} diff --git a/vendor/nhooyr.io/websocket/doc.go b/vendor/nhooyr.io/websocket/doc.go new file mode 100644 index 0000000..efa920e --- /dev/null +++ b/vendor/nhooyr.io/websocket/doc.go @@ -0,0 +1,32 @@ +// +build !js + +// Package websocket implements the RFC 6455 WebSocket protocol. +// +// https://tools.ietf.org/html/rfc6455 +// +// Use Dial to dial a WebSocket server. +// +// Use Accept to accept a WebSocket client. +// +// Conn represents the resulting WebSocket connection. +// +// The examples are the best way to understand how to correctly use the library. +// +// The wsjson and wspb subpackages contain helpers for JSON and protobuf messages. +// +// More documentation at https://nhooyr.io/websocket. +// +// Wasm +// +// The client side supports compiling to Wasm. +// It wraps the WebSocket browser API. +// +// See https://developer.mozilla.org/en-US/docs/Web/API/WebSocket +// +// Some important caveats to be aware of: +// +// - Accept always errors out +// - Conn.Ping is no-op +// - HTTPClient, HTTPHeader and CompressionMode in DialOptions are no-op +// - *http.Response from Dial is &http.Response{} with a 101 status code on success +package websocket // import "nhooyr.io/websocket" diff --git a/vendor/nhooyr.io/websocket/frame.go b/vendor/nhooyr.io/websocket/frame.go new file mode 100644 index 0000000..2a036f9 --- /dev/null +++ b/vendor/nhooyr.io/websocket/frame.go @@ -0,0 +1,294 @@ +package websocket + +import ( + "bufio" + "encoding/binary" + "fmt" + "io" + "math" + "math/bits" + + "nhooyr.io/websocket/internal/errd" +) + +// opcode represents a WebSocket opcode. +type opcode int + +// https://tools.ietf.org/html/rfc6455#section-11.8. +const ( + opContinuation opcode = iota + opText + opBinary + // 3 - 7 are reserved for further non-control frames. + _ + _ + _ + _ + _ + opClose + opPing + opPong + // 11-16 are reserved for further control frames. +) + +// header represents a WebSocket frame header. +// See https://tools.ietf.org/html/rfc6455#section-5.2. +type header struct { + fin bool + rsv1 bool + rsv2 bool + rsv3 bool + opcode opcode + + payloadLength int64 + + masked bool + maskKey uint32 +} + +// readFrameHeader reads a header from the reader. +// See https://tools.ietf.org/html/rfc6455#section-5.2. +func readFrameHeader(r *bufio.Reader, readBuf []byte) (h header, err error) { + defer errd.Wrap(&err, "failed to read frame header") + + b, err := r.ReadByte() + if err != nil { + return header{}, err + } + + h.fin = b&(1<<7) != 0 + h.rsv1 = b&(1<<6) != 0 + h.rsv2 = b&(1<<5) != 0 + h.rsv3 = b&(1<<4) != 0 + + h.opcode = opcode(b & 0xf) + + b, err = r.ReadByte() + if err != nil { + return header{}, err + } + + h.masked = b&(1<<7) != 0 + + payloadLength := b &^ (1 << 7) + switch { + case payloadLength < 126: + h.payloadLength = int64(payloadLength) + case payloadLength == 126: + _, err = io.ReadFull(r, readBuf[:2]) + h.payloadLength = int64(binary.BigEndian.Uint16(readBuf)) + case payloadLength == 127: + _, err = io.ReadFull(r, readBuf) + h.payloadLength = int64(binary.BigEndian.Uint64(readBuf)) + } + if err != nil { + return header{}, err + } + + if h.payloadLength < 0 { + return header{}, fmt.Errorf("received negative payload length: %v", h.payloadLength) + } + + if h.masked { + _, err = io.ReadFull(r, readBuf[:4]) + if err != nil { + return header{}, err + } + h.maskKey = binary.LittleEndian.Uint32(readBuf) + } + + return h, nil +} + +// maxControlPayload is the maximum length of a control frame payload. +// See https://tools.ietf.org/html/rfc6455#section-5.5. +const maxControlPayload = 125 + +// writeFrameHeader writes the bytes of the header to w. +// See https://tools.ietf.org/html/rfc6455#section-5.2 +func writeFrameHeader(h header, w *bufio.Writer, buf []byte) (err error) { + defer errd.Wrap(&err, "failed to write frame header") + + var b byte + if h.fin { + b |= 1 << 7 + } + if h.rsv1 { + b |= 1 << 6 + } + if h.rsv2 { + b |= 1 << 5 + } + if h.rsv3 { + b |= 1 << 4 + } + + b |= byte(h.opcode) + + err = w.WriteByte(b) + if err != nil { + return err + } + + lengthByte := byte(0) + if h.masked { + lengthByte |= 1 << 7 + } + + switch { + case h.payloadLength > math.MaxUint16: + lengthByte |= 127 + case h.payloadLength > 125: + lengthByte |= 126 + case h.payloadLength >= 0: + lengthByte |= byte(h.payloadLength) + } + err = w.WriteByte(lengthByte) + if err != nil { + return err + } + + switch { + case h.payloadLength > math.MaxUint16: + binary.BigEndian.PutUint64(buf, uint64(h.payloadLength)) + _, err = w.Write(buf) + case h.payloadLength > 125: + binary.BigEndian.PutUint16(buf, uint16(h.payloadLength)) + _, err = w.Write(buf[:2]) + } + if err != nil { + return err + } + + if h.masked { + binary.LittleEndian.PutUint32(buf, h.maskKey) + _, err = w.Write(buf[:4]) + if err != nil { + return err + } + } + + return nil +} + +// mask applies the WebSocket masking algorithm to p +// with the given key. +// See https://tools.ietf.org/html/rfc6455#section-5.3 +// +// The returned value is the correctly rotated key to +// to continue to mask/unmask the message. +// +// It is optimized for LittleEndian and expects the key +// to be in little endian. +// +// See https://github.com/golang/go/issues/31586 +func mask(key uint32, b []byte) uint32 { + if len(b) >= 8 { + key64 := uint64(key)<<32 | uint64(key) + + // At some point in the future we can clean these unrolled loops up. + // See https://github.com/golang/go/issues/31586#issuecomment-487436401 + + // Then we xor until b is less than 128 bytes. + for len(b) >= 128 { + v := binary.LittleEndian.Uint64(b) + binary.LittleEndian.PutUint64(b, v^key64) + v = binary.LittleEndian.Uint64(b[8:16]) + binary.LittleEndian.PutUint64(b[8:16], v^key64) + v = binary.LittleEndian.Uint64(b[16:24]) + binary.LittleEndian.PutUint64(b[16:24], v^key64) + v = binary.LittleEndian.Uint64(b[24:32]) + binary.LittleEndian.PutUint64(b[24:32], v^key64) + v = binary.LittleEndian.Uint64(b[32:40]) + binary.LittleEndian.PutUint64(b[32:40], v^key64) + v = binary.LittleEndian.Uint64(b[40:48]) + binary.LittleEndian.PutUint64(b[40:48], v^key64) + v = binary.LittleEndian.Uint64(b[48:56]) + binary.LittleEndian.PutUint64(b[48:56], v^key64) + v = binary.LittleEndian.Uint64(b[56:64]) + binary.LittleEndian.PutUint64(b[56:64], v^key64) + v = binary.LittleEndian.Uint64(b[64:72]) + binary.LittleEndian.PutUint64(b[64:72], v^key64) + v = binary.LittleEndian.Uint64(b[72:80]) + binary.LittleEndian.PutUint64(b[72:80], v^key64) + v = binary.LittleEndian.Uint64(b[80:88]) + binary.LittleEndian.PutUint64(b[80:88], v^key64) + v = binary.LittleEndian.Uint64(b[88:96]) + binary.LittleEndian.PutUint64(b[88:96], v^key64) + v = binary.LittleEndian.Uint64(b[96:104]) + binary.LittleEndian.PutUint64(b[96:104], v^key64) + v = binary.LittleEndian.Uint64(b[104:112]) + binary.LittleEndian.PutUint64(b[104:112], v^key64) + v = binary.LittleEndian.Uint64(b[112:120]) + binary.LittleEndian.PutUint64(b[112:120], v^key64) + v = binary.LittleEndian.Uint64(b[120:128]) + binary.LittleEndian.PutUint64(b[120:128], v^key64) + b = b[128:] + } + + // Then we xor until b is less than 64 bytes. + for len(b) >= 64 { + v := binary.LittleEndian.Uint64(b) + binary.LittleEndian.PutUint64(b, v^key64) + v = binary.LittleEndian.Uint64(b[8:16]) + binary.LittleEndian.PutUint64(b[8:16], v^key64) + v = binary.LittleEndian.Uint64(b[16:24]) + binary.LittleEndian.PutUint64(b[16:24], v^key64) + v = binary.LittleEndian.Uint64(b[24:32]) + binary.LittleEndian.PutUint64(b[24:32], v^key64) + v = binary.LittleEndian.Uint64(b[32:40]) + binary.LittleEndian.PutUint64(b[32:40], v^key64) + v = binary.LittleEndian.Uint64(b[40:48]) + binary.LittleEndian.PutUint64(b[40:48], v^key64) + v = binary.LittleEndian.Uint64(b[48:56]) + binary.LittleEndian.PutUint64(b[48:56], v^key64) + v = binary.LittleEndian.Uint64(b[56:64]) + binary.LittleEndian.PutUint64(b[56:64], v^key64) + b = b[64:] + } + + // Then we xor until b is less than 32 bytes. + for len(b) >= 32 { + v := binary.LittleEndian.Uint64(b) + binary.LittleEndian.PutUint64(b, v^key64) + v = binary.LittleEndian.Uint64(b[8:16]) + binary.LittleEndian.PutUint64(b[8:16], v^key64) + v = binary.LittleEndian.Uint64(b[16:24]) + binary.LittleEndian.PutUint64(b[16:24], v^key64) + v = binary.LittleEndian.Uint64(b[24:32]) + binary.LittleEndian.PutUint64(b[24:32], v^key64) + b = b[32:] + } + + // Then we xor until b is less than 16 bytes. + for len(b) >= 16 { + v := binary.LittleEndian.Uint64(b) + binary.LittleEndian.PutUint64(b, v^key64) + v = binary.LittleEndian.Uint64(b[8:16]) + binary.LittleEndian.PutUint64(b[8:16], v^key64) + b = b[16:] + } + + // Then we xor until b is less than 8 bytes. + for len(b) >= 8 { + v := binary.LittleEndian.Uint64(b) + binary.LittleEndian.PutUint64(b, v^key64) + b = b[8:] + } + } + + // Then we xor until b is less than 4 bytes. + for len(b) >= 4 { + v := binary.LittleEndian.Uint32(b) + binary.LittleEndian.PutUint32(b, v^key) + b = b[4:] + } + + // xor remaining bytes. + for i := range b { + b[i] ^= byte(key) + key = bits.RotateLeft32(key, -8) + } + + return key +} diff --git a/vendor/nhooyr.io/websocket/go.mod b/vendor/nhooyr.io/websocket/go.mod new file mode 100644 index 0000000..c5f1a20 --- /dev/null +++ b/vendor/nhooyr.io/websocket/go.mod @@ -0,0 +1,15 @@ +module nhooyr.io/websocket + +go 1.13 + +require ( + github.com/gin-gonic/gin v1.6.3 + github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee // indirect + github.com/gobwas/pool v0.2.0 // indirect + github.com/gobwas/ws v1.0.2 + github.com/golang/protobuf v1.3.5 + github.com/google/go-cmp v0.4.0 + github.com/gorilla/websocket v1.4.1 + github.com/klauspost/compress v1.10.3 + golang.org/x/time v0.0.0-20191024005414-555d28b269f0 +) diff --git a/vendor/nhooyr.io/websocket/go.sum b/vendor/nhooyr.io/websocket/go.sum new file mode 100644 index 0000000..155c301 --- /dev/null +++ b/vendor/nhooyr.io/websocket/go.sum @@ -0,0 +1,64 @@ +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.6.3 h1:ahKqKTFpO5KTPHxWZjEdPScmYaGtLo8Y4DMHoEsnp14= +github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= +github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= +github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= +github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= +github.com/go-playground/validator/v10 v10.2.0 h1:KgJ0snyC2R9VXYN2rneOtQcw5aHQB1Vv0sFl1UcHBOY= +github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee h1:s+21KNqlpePfkah2I+gwHF8xmJWRjooY+5248k6m4A0= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= +github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8= +github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.0.2 h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo= +github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5 h1:F768QJ1E9tib+q5Sc8MkdJi1RxLTbRcTf8LJV56aRls= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM= +github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/klauspost/compress v1.10.3 h1:OP96hzwJVBIHYU52pVTI6CczrxPvrGfgqF9N5eTO0Q8= +github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= +github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= +github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 h1:Esafd1046DLDQ0W1YjYsBW+p8U2u7vzgW2SQVmlNazg= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= +github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42 h1:vEOn+mP2zCOVzKckCZy6YsCtDblrpj/w7B9nxGNELpg= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0 h1:/5xXl8Y5W96D+TtHSlonuFqGHIWVuyCkGJLwGh9JJFs= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/nhooyr.io/websocket/internal/bpool/bpool.go b/vendor/nhooyr.io/websocket/internal/bpool/bpool.go new file mode 100644 index 0000000..aa826fb --- /dev/null +++ b/vendor/nhooyr.io/websocket/internal/bpool/bpool.go @@ -0,0 +1,24 @@ +package bpool + +import ( + "bytes" + "sync" +) + +var bpool sync.Pool + +// Get returns a buffer from the pool or creates a new one if +// the pool is empty. +func Get() *bytes.Buffer { + b := bpool.Get() + if b == nil { + return &bytes.Buffer{} + } + return b.(*bytes.Buffer) +} + +// Put returns a buffer into the pool. +func Put(b *bytes.Buffer) { + b.Reset() + bpool.Put(b) +} diff --git a/vendor/nhooyr.io/websocket/internal/errd/wrap.go b/vendor/nhooyr.io/websocket/internal/errd/wrap.go new file mode 100644 index 0000000..6e77913 --- /dev/null +++ b/vendor/nhooyr.io/websocket/internal/errd/wrap.go @@ -0,0 +1,14 @@ +package errd + +import ( + "fmt" +) + +// Wrap wraps err with fmt.Errorf if err is non nil. +// Intended for use with defer and a named error return. +// Inspired by https://github.com/golang/go/issues/32676. +func Wrap(err *error, f string, v ...interface{}) { + if *err != nil { + *err = fmt.Errorf(f+": %w", append(v, *err)...) + } +} diff --git a/vendor/nhooyr.io/websocket/internal/wsjs/wsjs_js.go b/vendor/nhooyr.io/websocket/internal/wsjs/wsjs_js.go new file mode 100644 index 0000000..26ffb45 --- /dev/null +++ b/vendor/nhooyr.io/websocket/internal/wsjs/wsjs_js.go @@ -0,0 +1,170 @@ +// +build js + +// Package wsjs implements typed access to the browser javascript WebSocket API. +// +// https://developer.mozilla.org/en-US/docs/Web/API/WebSocket +package wsjs + +import ( + "syscall/js" +) + +func handleJSError(err *error, onErr func()) { + r := recover() + + if jsErr, ok := r.(js.Error); ok { + *err = jsErr + + if onErr != nil { + onErr() + } + return + } + + if r != nil { + panic(r) + } +} + +// New is a wrapper around the javascript WebSocket constructor. +func New(url string, protocols []string) (c WebSocket, err error) { + defer handleJSError(&err, func() { + c = WebSocket{} + }) + + jsProtocols := make([]interface{}, len(protocols)) + for i, p := range protocols { + jsProtocols[i] = p + } + + c = WebSocket{ + v: js.Global().Get("WebSocket").New(url, jsProtocols), + } + + c.setBinaryType("arraybuffer") + + return c, nil +} + +// WebSocket is a wrapper around a javascript WebSocket object. +type WebSocket struct { + v js.Value +} + +func (c WebSocket) setBinaryType(typ string) { + c.v.Set("binaryType", string(typ)) +} + +func (c WebSocket) addEventListener(eventType string, fn func(e js.Value)) func() { + f := js.FuncOf(func(this js.Value, args []js.Value) interface{} { + fn(args[0]) + return nil + }) + c.v.Call("addEventListener", eventType, f) + + return func() { + c.v.Call("removeEventListener", eventType, f) + f.Release() + } +} + +// CloseEvent is the type passed to a WebSocket close handler. +type CloseEvent struct { + Code uint16 + Reason string + WasClean bool +} + +// OnClose registers a function to be called when the WebSocket is closed. +func (c WebSocket) OnClose(fn func(CloseEvent)) (remove func()) { + return c.addEventListener("close", func(e js.Value) { + ce := CloseEvent{ + Code: uint16(e.Get("code").Int()), + Reason: e.Get("reason").String(), + WasClean: e.Get("wasClean").Bool(), + } + fn(ce) + }) +} + +// OnError registers a function to be called when there is an error +// with the WebSocket. +func (c WebSocket) OnError(fn func(e js.Value)) (remove func()) { + return c.addEventListener("error", fn) +} + +// MessageEvent is the type passed to a message handler. +type MessageEvent struct { + // string or []byte. + Data interface{} + + // There are more fields to the interface but we don't use them. + // See https://developer.mozilla.org/en-US/docs/Web/API/MessageEvent +} + +// OnMessage registers a function to be called when the WebSocket receives a message. +func (c WebSocket) OnMessage(fn func(m MessageEvent)) (remove func()) { + return c.addEventListener("message", func(e js.Value) { + var data interface{} + + arrayBuffer := e.Get("data") + if arrayBuffer.Type() == js.TypeString { + data = arrayBuffer.String() + } else { + data = extractArrayBuffer(arrayBuffer) + } + + me := MessageEvent{ + Data: data, + } + fn(me) + + return + }) +} + +// Subprotocol returns the WebSocket subprotocol in use. +func (c WebSocket) Subprotocol() string { + return c.v.Get("protocol").String() +} + +// OnOpen registers a function to be called when the WebSocket is opened. +func (c WebSocket) OnOpen(fn func(e js.Value)) (remove func()) { + return c.addEventListener("open", fn) +} + +// Close closes the WebSocket with the given code and reason. +func (c WebSocket) Close(code int, reason string) (err error) { + defer handleJSError(&err, nil) + c.v.Call("close", code, reason) + return err +} + +// SendText sends the given string as a text message +// on the WebSocket. +func (c WebSocket) SendText(v string) (err error) { + defer handleJSError(&err, nil) + c.v.Call("send", v) + return err +} + +// SendBytes sends the given message as a binary message +// on the WebSocket. +func (c WebSocket) SendBytes(v []byte) (err error) { + defer handleJSError(&err, nil) + c.v.Call("send", uint8Array(v)) + return err +} + +func extractArrayBuffer(arrayBuffer js.Value) []byte { + uint8Array := js.Global().Get("Uint8Array").New(arrayBuffer) + dst := make([]byte, uint8Array.Length()) + js.CopyBytesToGo(dst, uint8Array) + return dst +} + +func uint8Array(src []byte) js.Value { + uint8Array := js.Global().Get("Uint8Array").New(len(src)) + js.CopyBytesToJS(uint8Array, src) + return uint8Array +} diff --git a/vendor/nhooyr.io/websocket/internal/xsync/go.go b/vendor/nhooyr.io/websocket/internal/xsync/go.go new file mode 100644 index 0000000..7a61f27 --- /dev/null +++ b/vendor/nhooyr.io/websocket/internal/xsync/go.go @@ -0,0 +1,25 @@ +package xsync + +import ( + "fmt" +) + +// Go allows running a function in another goroutine +// and waiting for its error. +func Go(fn func() error) <-chan error { + errs := make(chan error, 1) + go func() { + defer func() { + r := recover() + if r != nil { + select { + case errs <- fmt.Errorf("panic in go fn: %v", r): + default: + } + } + }() + errs <- fn() + }() + + return errs +} diff --git a/vendor/nhooyr.io/websocket/internal/xsync/int64.go b/vendor/nhooyr.io/websocket/internal/xsync/int64.go new file mode 100644 index 0000000..a0c4020 --- /dev/null +++ b/vendor/nhooyr.io/websocket/internal/xsync/int64.go @@ -0,0 +1,23 @@ +package xsync + +import ( + "sync/atomic" +) + +// Int64 represents an atomic int64. +type Int64 struct { + // We do not use atomic.Load/StoreInt64 since it does not + // work on 32 bit computers but we need 64 bit integers. + i atomic.Value +} + +// Load loads the int64. +func (v *Int64) Load() int64 { + i, _ := v.i.Load().(int64) + return i +} + +// Store stores the int64. +func (v *Int64) Store(i int64) { + v.i.Store(i) +} diff --git a/vendor/nhooyr.io/websocket/netconn.go b/vendor/nhooyr.io/websocket/netconn.go new file mode 100644 index 0000000..64aadf0 --- /dev/null +++ b/vendor/nhooyr.io/websocket/netconn.go @@ -0,0 +1,166 @@ +package websocket + +import ( + "context" + "fmt" + "io" + "math" + "net" + "sync" + "time" +) + +// NetConn converts a *websocket.Conn into a net.Conn. +// +// It's for tunneling arbitrary protocols over WebSockets. +// Few users of the library will need this but it's tricky to implement +// correctly and so provided in the library. +// See https://github.com/nhooyr/websocket/issues/100. +// +// Every Write to the net.Conn will correspond to a message write of +// the given type on *websocket.Conn. +// +// The passed ctx bounds the lifetime of the net.Conn. If cancelled, +// all reads and writes on the net.Conn will be cancelled. +// +// If a message is read that is not of the correct type, the connection +// will be closed with StatusUnsupportedData and an error will be returned. +// +// Close will close the *websocket.Conn with StatusNormalClosure. +// +// When a deadline is hit, the connection will be closed. This is +// different from most net.Conn implementations where only the +// reading/writing goroutines are interrupted but the connection is kept alive. +// +// The Addr methods will return a mock net.Addr that returns "websocket" for Network +// and "websocket/unknown-addr" for String. +// +// A received StatusNormalClosure or StatusGoingAway close frame will be translated to +// io.EOF when reading. +func NetConn(ctx context.Context, c *Conn, msgType MessageType) net.Conn { + nc := &netConn{ + c: c, + msgType: msgType, + } + + var cancel context.CancelFunc + nc.writeContext, cancel = context.WithCancel(ctx) + nc.writeTimer = time.AfterFunc(math.MaxInt64, cancel) + if !nc.writeTimer.Stop() { + <-nc.writeTimer.C + } + + nc.readContext, cancel = context.WithCancel(ctx) + nc.readTimer = time.AfterFunc(math.MaxInt64, cancel) + if !nc.readTimer.Stop() { + <-nc.readTimer.C + } + + return nc +} + +type netConn struct { + c *Conn + msgType MessageType + + writeTimer *time.Timer + writeContext context.Context + + readTimer *time.Timer + readContext context.Context + + readMu sync.Mutex + eofed bool + reader io.Reader +} + +var _ net.Conn = &netConn{} + +func (c *netConn) Close() error { + return c.c.Close(StatusNormalClosure, "") +} + +func (c *netConn) Write(p []byte) (int, error) { + err := c.c.Write(c.writeContext, c.msgType, p) + if err != nil { + return 0, err + } + return len(p), nil +} + +func (c *netConn) Read(p []byte) (int, error) { + c.readMu.Lock() + defer c.readMu.Unlock() + + if c.eofed { + return 0, io.EOF + } + + if c.reader == nil { + typ, r, err := c.c.Reader(c.readContext) + if err != nil { + switch CloseStatus(err) { + case StatusNormalClosure, StatusGoingAway: + c.eofed = true + return 0, io.EOF + } + return 0, err + } + if typ != c.msgType { + err := fmt.Errorf("unexpected frame type read (expected %v): %v", c.msgType, typ) + c.c.Close(StatusUnsupportedData, err.Error()) + return 0, err + } + c.reader = r + } + + n, err := c.reader.Read(p) + if err == io.EOF { + c.reader = nil + err = nil + } + return n, err +} + +type websocketAddr struct { +} + +func (a websocketAddr) Network() string { + return "websocket" +} + +func (a websocketAddr) String() string { + return "websocket/unknown-addr" +} + +func (c *netConn) RemoteAddr() net.Addr { + return websocketAddr{} +} + +func (c *netConn) LocalAddr() net.Addr { + return websocketAddr{} +} + +func (c *netConn) SetDeadline(t time.Time) error { + c.SetWriteDeadline(t) + c.SetReadDeadline(t) + return nil +} + +func (c *netConn) SetWriteDeadline(t time.Time) error { + if t.IsZero() { + c.writeTimer.Stop() + } else { + c.writeTimer.Reset(t.Sub(time.Now())) + } + return nil +} + +func (c *netConn) SetReadDeadline(t time.Time) error { + if t.IsZero() { + c.readTimer.Stop() + } else { + c.readTimer.Reset(t.Sub(time.Now())) + } + return nil +} diff --git a/vendor/nhooyr.io/websocket/read.go b/vendor/nhooyr.io/websocket/read.go new file mode 100644 index 0000000..ae05cf9 --- /dev/null +++ b/vendor/nhooyr.io/websocket/read.go @@ -0,0 +1,474 @@ +// +build !js + +package websocket + +import ( + "bufio" + "context" + "errors" + "fmt" + "io" + "io/ioutil" + "strings" + "time" + + "nhooyr.io/websocket/internal/errd" + "nhooyr.io/websocket/internal/xsync" +) + +// Reader reads from the connection until until there is a WebSocket +// data message to be read. It will handle ping, pong and close frames as appropriate. +// +// It returns the type of the message and an io.Reader to read it. +// The passed context will also bound the reader. +// Ensure you read to EOF otherwise the connection will hang. +// +// Call CloseRead if you do not expect any data messages from the peer. +// +// Only one Reader may be open at a time. +func (c *Conn) Reader(ctx context.Context) (MessageType, io.Reader, error) { + return c.reader(ctx) +} + +// Read is a convenience method around Reader to read a single message +// from the connection. +func (c *Conn) Read(ctx context.Context) (MessageType, []byte, error) { + typ, r, err := c.Reader(ctx) + if err != nil { + return 0, nil, err + } + + b, err := ioutil.ReadAll(r) + return typ, b, err +} + +// CloseRead starts a goroutine to read from the connection until it is closed +// or a data message is received. +// +// Once CloseRead is called you cannot read any messages from the connection. +// The returned context will be cancelled when the connection is closed. +// +// If a data message is received, the connection will be closed with StatusPolicyViolation. +// +// Call CloseRead when you do not expect to read any more messages. +// Since it actively reads from the connection, it will ensure that ping, pong and close +// frames are responded to. This means c.Ping and c.Close will still work as expected. +func (c *Conn) CloseRead(ctx context.Context) context.Context { + ctx, cancel := context.WithCancel(ctx) + go func() { + defer cancel() + c.Reader(ctx) + c.Close(StatusPolicyViolation, "unexpected data message") + }() + return ctx +} + +// SetReadLimit sets the max number of bytes to read for a single message. +// It applies to the Reader and Read methods. +// +// By default, the connection has a message read limit of 32768 bytes. +// +// When the limit is hit, the connection will be closed with StatusMessageTooBig. +func (c *Conn) SetReadLimit(n int64) { + // We add read one more byte than the limit in case + // there is a fin frame that needs to be read. + c.msgReader.limitReader.limit.Store(n + 1) +} + +const defaultReadLimit = 32768 + +func newMsgReader(c *Conn) *msgReader { + mr := &msgReader{ + c: c, + fin: true, + } + mr.readFunc = mr.read + + mr.limitReader = newLimitReader(c, mr.readFunc, defaultReadLimit+1) + return mr +} + +func (mr *msgReader) resetFlate() { + if mr.flateContextTakeover() { + mr.dict.init(32768) + } + if mr.flateBufio == nil { + mr.flateBufio = getBufioReader(mr.readFunc) + } + + mr.flateReader = getFlateReader(mr.flateBufio, mr.dict.buf) + mr.limitReader.r = mr.flateReader + mr.flateTail.Reset(deflateMessageTail) +} + +func (mr *msgReader) putFlateReader() { + if mr.flateReader != nil { + putFlateReader(mr.flateReader) + mr.flateReader = nil + } +} + +func (mr *msgReader) close() { + mr.c.readMu.forceLock() + mr.putFlateReader() + mr.dict.close() + if mr.flateBufio != nil { + putBufioReader(mr.flateBufio) + } + + if mr.c.client { + putBufioReader(mr.c.br) + mr.c.br = nil + } +} + +func (mr *msgReader) flateContextTakeover() bool { + if mr.c.client { + return !mr.c.copts.serverNoContextTakeover + } + return !mr.c.copts.clientNoContextTakeover +} + +func (c *Conn) readRSV1Illegal(h header) bool { + // If compression is disabled, rsv1 is illegal. + if !c.flate() { + return true + } + // rsv1 is only allowed on data frames beginning messages. + if h.opcode != opText && h.opcode != opBinary { + return true + } + return false +} + +func (c *Conn) readLoop(ctx context.Context) (header, error) { + for { + h, err := c.readFrameHeader(ctx) + if err != nil { + return header{}, err + } + + if h.rsv1 && c.readRSV1Illegal(h) || h.rsv2 || h.rsv3 { + err := fmt.Errorf("received header with unexpected rsv bits set: %v:%v:%v", h.rsv1, h.rsv2, h.rsv3) + c.writeError(StatusProtocolError, err) + return header{}, err + } + + if !c.client && !h.masked { + return header{}, errors.New("received unmasked frame from client") + } + + switch h.opcode { + case opClose, opPing, opPong: + err = c.handleControl(ctx, h) + if err != nil { + // Pass through CloseErrors when receiving a close frame. + if h.opcode == opClose && CloseStatus(err) != -1 { + return header{}, err + } + return header{}, fmt.Errorf("failed to handle control frame %v: %w", h.opcode, err) + } + case opContinuation, opText, opBinary: + return h, nil + default: + err := fmt.Errorf("received unknown opcode %v", h.opcode) + c.writeError(StatusProtocolError, err) + return header{}, err + } + } +} + +func (c *Conn) readFrameHeader(ctx context.Context) (header, error) { + select { + case <-c.closed: + return header{}, c.closeErr + case c.readTimeout <- ctx: + } + + h, err := readFrameHeader(c.br, c.readHeaderBuf[:]) + if err != nil { + select { + case <-c.closed: + return header{}, c.closeErr + case <-ctx.Done(): + return header{}, ctx.Err() + default: + c.close(err) + return header{}, err + } + } + + select { + case <-c.closed: + return header{}, c.closeErr + case c.readTimeout <- context.Background(): + } + + return h, nil +} + +func (c *Conn) readFramePayload(ctx context.Context, p []byte) (int, error) { + select { + case <-c.closed: + return 0, c.closeErr + case c.readTimeout <- ctx: + } + + n, err := io.ReadFull(c.br, p) + if err != nil { + select { + case <-c.closed: + return n, c.closeErr + case <-ctx.Done(): + return n, ctx.Err() + default: + err = fmt.Errorf("failed to read frame payload: %w", err) + c.close(err) + return n, err + } + } + + select { + case <-c.closed: + return n, c.closeErr + case c.readTimeout <- context.Background(): + } + + return n, err +} + +func (c *Conn) handleControl(ctx context.Context, h header) (err error) { + if h.payloadLength < 0 || h.payloadLength > maxControlPayload { + err := fmt.Errorf("received control frame payload with invalid length: %d", h.payloadLength) + c.writeError(StatusProtocolError, err) + return err + } + + if !h.fin { + err := errors.New("received fragmented control frame") + c.writeError(StatusProtocolError, err) + return err + } + + ctx, cancel := context.WithTimeout(ctx, time.Second*5) + defer cancel() + + b := c.readControlBuf[:h.payloadLength] + _, err = c.readFramePayload(ctx, b) + if err != nil { + return err + } + + if h.masked { + mask(h.maskKey, b) + } + + switch h.opcode { + case opPing: + return c.writeControl(ctx, opPong, b) + case opPong: + c.activePingsMu.Lock() + pong, ok := c.activePings[string(b)] + c.activePingsMu.Unlock() + if ok { + select { + case pong <- struct{}{}: + default: + } + } + return nil + } + + defer func() { + c.readCloseFrameErr = err + }() + + ce, err := parseClosePayload(b) + if err != nil { + err = fmt.Errorf("received invalid close payload: %w", err) + c.writeError(StatusProtocolError, err) + return err + } + + err = fmt.Errorf("received close frame: %w", ce) + c.setCloseErr(err) + c.writeClose(ce.Code, ce.Reason) + c.close(err) + return err +} + +func (c *Conn) reader(ctx context.Context) (_ MessageType, _ io.Reader, err error) { + defer errd.Wrap(&err, "failed to get reader") + + err = c.readMu.lock(ctx) + if err != nil { + return 0, nil, err + } + defer c.readMu.unlock() + + if !c.msgReader.fin { + err = errors.New("previous message not read to completion") + c.close(fmt.Errorf("failed to get reader: %w", err)) + return 0, nil, err + } + + h, err := c.readLoop(ctx) + if err != nil { + return 0, nil, err + } + + if h.opcode == opContinuation { + err := errors.New("received continuation frame without text or binary frame") + c.writeError(StatusProtocolError, err) + return 0, nil, err + } + + c.msgReader.reset(ctx, h) + + return MessageType(h.opcode), c.msgReader, nil +} + +type msgReader struct { + c *Conn + + ctx context.Context + flate bool + flateReader io.Reader + flateBufio *bufio.Reader + flateTail strings.Reader + limitReader *limitReader + dict slidingWindow + + fin bool + payloadLength int64 + maskKey uint32 + + // readerFunc(mr.Read) to avoid continuous allocations. + readFunc readerFunc +} + +func (mr *msgReader) reset(ctx context.Context, h header) { + mr.ctx = ctx + mr.flate = h.rsv1 + mr.limitReader.reset(mr.readFunc) + + if mr.flate { + mr.resetFlate() + } + + mr.setFrame(h) +} + +func (mr *msgReader) setFrame(h header) { + mr.fin = h.fin + mr.payloadLength = h.payloadLength + mr.maskKey = h.maskKey +} + +func (mr *msgReader) Read(p []byte) (n int, err error) { + err = mr.c.readMu.lock(mr.ctx) + if err != nil { + return 0, fmt.Errorf("failed to read: %w", err) + } + defer mr.c.readMu.unlock() + + n, err = mr.limitReader.Read(p) + if mr.flate && mr.flateContextTakeover() { + p = p[:n] + mr.dict.write(p) + } + if errors.Is(err, io.EOF) || errors.Is(err, io.ErrUnexpectedEOF) && mr.fin && mr.flate { + mr.putFlateReader() + return n, io.EOF + } + if err != nil { + err = fmt.Errorf("failed to read: %w", err) + mr.c.close(err) + } + return n, err +} + +func (mr *msgReader) read(p []byte) (int, error) { + for { + if mr.payloadLength == 0 { + if mr.fin { + if mr.flate { + return mr.flateTail.Read(p) + } + return 0, io.EOF + } + + h, err := mr.c.readLoop(mr.ctx) + if err != nil { + return 0, err + } + if h.opcode != opContinuation { + err := errors.New("received new data message without finishing the previous message") + mr.c.writeError(StatusProtocolError, err) + return 0, err + } + mr.setFrame(h) + + continue + } + + if int64(len(p)) > mr.payloadLength { + p = p[:mr.payloadLength] + } + + n, err := mr.c.readFramePayload(mr.ctx, p) + if err != nil { + return n, err + } + + mr.payloadLength -= int64(n) + + if !mr.c.client { + mr.maskKey = mask(mr.maskKey, p) + } + + return n, nil + } +} + +type limitReader struct { + c *Conn + r io.Reader + limit xsync.Int64 + n int64 +} + +func newLimitReader(c *Conn, r io.Reader, limit int64) *limitReader { + lr := &limitReader{ + c: c, + } + lr.limit.Store(limit) + lr.reset(r) + return lr +} + +func (lr *limitReader) reset(r io.Reader) { + lr.n = lr.limit.Load() + lr.r = r +} + +func (lr *limitReader) Read(p []byte) (int, error) { + if lr.n <= 0 { + err := fmt.Errorf("read limited at %v bytes", lr.limit.Load()) + lr.c.writeError(StatusMessageTooBig, err) + return 0, err + } + + if int64(len(p)) > lr.n { + p = p[:lr.n] + } + n, err := lr.r.Read(p) + lr.n -= int64(n) + return n, err +} + +type readerFunc func(p []byte) (int, error) + +func (f readerFunc) Read(p []byte) (int, error) { + return f(p) +} diff --git a/vendor/nhooyr.io/websocket/stringer.go b/vendor/nhooyr.io/websocket/stringer.go new file mode 100644 index 0000000..5a66ba2 --- /dev/null +++ b/vendor/nhooyr.io/websocket/stringer.go @@ -0,0 +1,91 @@ +// Code generated by "stringer -type=opcode,MessageType,StatusCode -output=stringer.go"; DO NOT EDIT. + +package websocket + +import "strconv" + +func _() { + // An "invalid array index" compiler error signifies that the constant values have changed. + // Re-run the stringer command to generate them again. + var x [1]struct{} + _ = x[opContinuation-0] + _ = x[opText-1] + _ = x[opBinary-2] + _ = x[opClose-8] + _ = x[opPing-9] + _ = x[opPong-10] +} + +const ( + _opcode_name_0 = "opContinuationopTextopBinary" + _opcode_name_1 = "opCloseopPingopPong" +) + +var ( + _opcode_index_0 = [...]uint8{0, 14, 20, 28} + _opcode_index_1 = [...]uint8{0, 7, 13, 19} +) + +func (i opcode) String() string { + switch { + case 0 <= i && i <= 2: + return _opcode_name_0[_opcode_index_0[i]:_opcode_index_0[i+1]] + case 8 <= i && i <= 10: + i -= 8 + return _opcode_name_1[_opcode_index_1[i]:_opcode_index_1[i+1]] + default: + return "opcode(" + strconv.FormatInt(int64(i), 10) + ")" + } +} +func _() { + // An "invalid array index" compiler error signifies that the constant values have changed. + // Re-run the stringer command to generate them again. + var x [1]struct{} + _ = x[MessageText-1] + _ = x[MessageBinary-2] +} + +const _MessageType_name = "MessageTextMessageBinary" + +var _MessageType_index = [...]uint8{0, 11, 24} + +func (i MessageType) String() string { + i -= 1 + if i < 0 || i >= MessageType(len(_MessageType_index)-1) { + return "MessageType(" + strconv.FormatInt(int64(i+1), 10) + ")" + } + return _MessageType_name[_MessageType_index[i]:_MessageType_index[i+1]] +} +func _() { + // An "invalid array index" compiler error signifies that the constant values have changed. + // Re-run the stringer command to generate them again. + var x [1]struct{} + _ = x[StatusNormalClosure-1000] + _ = x[StatusGoingAway-1001] + _ = x[StatusProtocolError-1002] + _ = x[StatusUnsupportedData-1003] + _ = x[statusReserved-1004] + _ = x[StatusNoStatusRcvd-1005] + _ = x[StatusAbnormalClosure-1006] + _ = x[StatusInvalidFramePayloadData-1007] + _ = x[StatusPolicyViolation-1008] + _ = x[StatusMessageTooBig-1009] + _ = x[StatusMandatoryExtension-1010] + _ = x[StatusInternalError-1011] + _ = x[StatusServiceRestart-1012] + _ = x[StatusTryAgainLater-1013] + _ = x[StatusBadGateway-1014] + _ = x[StatusTLSHandshake-1015] +} + +const _StatusCode_name = "StatusNormalClosureStatusGoingAwayStatusProtocolErrorStatusUnsupportedDatastatusReservedStatusNoStatusRcvdStatusAbnormalClosureStatusInvalidFramePayloadDataStatusPolicyViolationStatusMessageTooBigStatusMandatoryExtensionStatusInternalErrorStatusServiceRestartStatusTryAgainLaterStatusBadGatewayStatusTLSHandshake" + +var _StatusCode_index = [...]uint16{0, 19, 34, 53, 74, 88, 106, 127, 156, 177, 196, 220, 239, 259, 278, 294, 312} + +func (i StatusCode) String() string { + i -= 1000 + if i < 0 || i >= StatusCode(len(_StatusCode_index)-1) { + return "StatusCode(" + strconv.FormatInt(int64(i+1000), 10) + ")" + } + return _StatusCode_name[_StatusCode_index[i]:_StatusCode_index[i+1]] +} diff --git a/vendor/nhooyr.io/websocket/write.go b/vendor/nhooyr.io/websocket/write.go new file mode 100644 index 0000000..2210cf8 --- /dev/null +++ b/vendor/nhooyr.io/websocket/write.go @@ -0,0 +1,397 @@ +// +build !js + +package websocket + +import ( + "bufio" + "context" + "crypto/rand" + "encoding/binary" + "errors" + "fmt" + "io" + "time" + + "github.com/klauspost/compress/flate" + + "nhooyr.io/websocket/internal/errd" +) + +// Writer returns a writer bounded by the context that will write +// a WebSocket message of type dataType to the connection. +// +// You must close the writer once you have written the entire message. +// +// Only one writer can be open at a time, multiple calls will block until the previous writer +// is closed. +func (c *Conn) Writer(ctx context.Context, typ MessageType) (io.WriteCloser, error) { + w, err := c.writer(ctx, typ) + if err != nil { + return nil, fmt.Errorf("failed to get writer: %w", err) + } + return w, nil +} + +// Write writes a message to the connection. +// +// See the Writer method if you want to stream a message. +// +// If compression is disabled or the threshold is not met, then it +// will write the message in a single frame. +func (c *Conn) Write(ctx context.Context, typ MessageType, p []byte) error { + _, err := c.write(ctx, typ, p) + if err != nil { + return fmt.Errorf("failed to write msg: %w", err) + } + return nil +} + +type msgWriter struct { + mw *msgWriterState + closed bool +} + +func (mw *msgWriter) Write(p []byte) (int, error) { + if mw.closed { + return 0, errors.New("cannot use closed writer") + } + return mw.mw.Write(p) +} + +func (mw *msgWriter) Close() error { + if mw.closed { + return errors.New("cannot use closed writer") + } + mw.closed = true + return mw.mw.Close() +} + +type msgWriterState struct { + c *Conn + + mu *mu + writeMu *mu + + ctx context.Context + opcode opcode + flate bool + + trimWriter *trimLastFourBytesWriter + dict slidingWindow +} + +func newMsgWriterState(c *Conn) *msgWriterState { + mw := &msgWriterState{ + c: c, + mu: newMu(c), + writeMu: newMu(c), + } + return mw +} + +func (mw *msgWriterState) ensureFlate() { + if mw.trimWriter == nil { + mw.trimWriter = &trimLastFourBytesWriter{ + w: writerFunc(mw.write), + } + } + + mw.dict.init(8192) + mw.flate = true +} + +func (mw *msgWriterState) flateContextTakeover() bool { + if mw.c.client { + return !mw.c.copts.clientNoContextTakeover + } + return !mw.c.copts.serverNoContextTakeover +} + +func (c *Conn) writer(ctx context.Context, typ MessageType) (io.WriteCloser, error) { + err := c.msgWriterState.reset(ctx, typ) + if err != nil { + return nil, err + } + return &msgWriter{ + mw: c.msgWriterState, + closed: false, + }, nil +} + +func (c *Conn) write(ctx context.Context, typ MessageType, p []byte) (int, error) { + mw, err := c.writer(ctx, typ) + if err != nil { + return 0, err + } + + if !c.flate() { + defer c.msgWriterState.mu.unlock() + return c.writeFrame(ctx, true, false, c.msgWriterState.opcode, p) + } + + n, err := mw.Write(p) + if err != nil { + return n, err + } + + err = mw.Close() + return n, err +} + +func (mw *msgWriterState) reset(ctx context.Context, typ MessageType) error { + err := mw.mu.lock(ctx) + if err != nil { + return err + } + + mw.ctx = ctx + mw.opcode = opcode(typ) + mw.flate = false + + mw.trimWriter.reset() + + return nil +} + +// Write writes the given bytes to the WebSocket connection. +func (mw *msgWriterState) Write(p []byte) (_ int, err error) { + err = mw.writeMu.lock(mw.ctx) + if err != nil { + return 0, fmt.Errorf("failed to write: %w", err) + } + defer mw.writeMu.unlock() + + defer func() { + if err != nil { + err = fmt.Errorf("failed to write: %w", err) + mw.c.close(err) + } + }() + + if mw.c.flate() { + // Only enables flate if the length crosses the + // threshold on the first frame + if mw.opcode != opContinuation && len(p) >= mw.c.flateThreshold { + mw.ensureFlate() + } + } + + if mw.flate { + err = flate.StatelessDeflate(mw.trimWriter, p, false, mw.dict.buf) + if err != nil { + return 0, err + } + mw.dict.write(p) + return len(p), nil + } + + return mw.write(p) +} + +func (mw *msgWriterState) write(p []byte) (int, error) { + n, err := mw.c.writeFrame(mw.ctx, false, mw.flate, mw.opcode, p) + if err != nil { + return n, fmt.Errorf("failed to write data frame: %w", err) + } + mw.opcode = opContinuation + return n, nil +} + +// Close flushes the frame to the connection. +func (mw *msgWriterState) Close() (err error) { + defer errd.Wrap(&err, "failed to close writer") + + err = mw.writeMu.lock(mw.ctx) + if err != nil { + return err + } + defer mw.writeMu.unlock() + + _, err = mw.c.writeFrame(mw.ctx, true, mw.flate, mw.opcode, nil) + if err != nil { + return fmt.Errorf("failed to write fin frame: %w", err) + } + + if mw.flate && !mw.flateContextTakeover() { + mw.dict.close() + } + mw.mu.unlock() + return nil +} + +func (mw *msgWriterState) close() { + if mw.c.client { + mw.c.writeFrameMu.forceLock() + putBufioWriter(mw.c.bw) + } + + mw.writeMu.forceLock() + mw.dict.close() +} + +func (c *Conn) writeControl(ctx context.Context, opcode opcode, p []byte) error { + ctx, cancel := context.WithTimeout(ctx, time.Second*5) + defer cancel() + + _, err := c.writeFrame(ctx, true, false, opcode, p) + if err != nil { + return fmt.Errorf("failed to write control frame %v: %w", opcode, err) + } + return nil +} + +// frame handles all writes to the connection. +func (c *Conn) writeFrame(ctx context.Context, fin bool, flate bool, opcode opcode, p []byte) (_ int, err error) { + err = c.writeFrameMu.lock(ctx) + if err != nil { + return 0, err + } + defer c.writeFrameMu.unlock() + + // If the state says a close has already been written, we wait until + // the connection is closed and return that error. + // + // However, if the frame being written is a close, that means its the close from + // the state being set so we let it go through. + c.closeMu.Lock() + wroteClose := c.wroteClose + c.closeMu.Unlock() + if wroteClose && opcode != opClose { + select { + case <-ctx.Done(): + return 0, ctx.Err() + case <-c.closed: + return 0, c.closeErr + } + } + + select { + case <-c.closed: + return 0, c.closeErr + case c.writeTimeout <- ctx: + } + + defer func() { + if err != nil { + select { + case <-c.closed: + err = c.closeErr + case <-ctx.Done(): + err = ctx.Err() + } + c.close(err) + err = fmt.Errorf("failed to write frame: %w", err) + } + }() + + c.writeHeader.fin = fin + c.writeHeader.opcode = opcode + c.writeHeader.payloadLength = int64(len(p)) + + if c.client { + c.writeHeader.masked = true + _, err = io.ReadFull(rand.Reader, c.writeHeaderBuf[:4]) + if err != nil { + return 0, fmt.Errorf("failed to generate masking key: %w", err) + } + c.writeHeader.maskKey = binary.LittleEndian.Uint32(c.writeHeaderBuf[:]) + } + + c.writeHeader.rsv1 = false + if flate && (opcode == opText || opcode == opBinary) { + c.writeHeader.rsv1 = true + } + + err = writeFrameHeader(c.writeHeader, c.bw, c.writeHeaderBuf[:]) + if err != nil { + return 0, err + } + + n, err := c.writeFramePayload(p) + if err != nil { + return n, err + } + + if c.writeHeader.fin { + err = c.bw.Flush() + if err != nil { + return n, fmt.Errorf("failed to flush: %w", err) + } + } + + select { + case <-c.closed: + return n, c.closeErr + case c.writeTimeout <- context.Background(): + } + + return n, nil +} + +func (c *Conn) writeFramePayload(p []byte) (n int, err error) { + defer errd.Wrap(&err, "failed to write frame payload") + + if !c.writeHeader.masked { + return c.bw.Write(p) + } + + maskKey := c.writeHeader.maskKey + for len(p) > 0 { + // If the buffer is full, we need to flush. + if c.bw.Available() == 0 { + err = c.bw.Flush() + if err != nil { + return n, err + } + } + + // Start of next write in the buffer. + i := c.bw.Buffered() + + j := len(p) + if j > c.bw.Available() { + j = c.bw.Available() + } + + _, err := c.bw.Write(p[:j]) + if err != nil { + return n, err + } + + maskKey = mask(maskKey, c.writeBuf[i:c.bw.Buffered()]) + + p = p[j:] + n += j + } + + return n, nil +} + +type writerFunc func(p []byte) (int, error) + +func (f writerFunc) Write(p []byte) (int, error) { + return f(p) +} + +// extractBufioWriterBuf grabs the []byte backing a *bufio.Writer +// and returns it. +func extractBufioWriterBuf(bw *bufio.Writer, w io.Writer) []byte { + var writeBuf []byte + bw.Reset(writerFunc(func(p2 []byte) (int, error) { + writeBuf = p2[:cap(p2)] + return len(p2), nil + })) + + bw.WriteByte(0) + bw.Flush() + + bw.Reset(w) + + return writeBuf +} + +func (c *Conn) writeError(code StatusCode, err error) { + c.setCloseErr(err) + c.writeClose(code, err.Error()) + c.close(nil) +} diff --git a/vendor/nhooyr.io/websocket/ws_js.go b/vendor/nhooyr.io/websocket/ws_js.go new file mode 100644 index 0000000..b87e32c --- /dev/null +++ b/vendor/nhooyr.io/websocket/ws_js.go @@ -0,0 +1,379 @@ +package websocket // import "nhooyr.io/websocket" + +import ( + "bytes" + "context" + "errors" + "fmt" + "io" + "net/http" + "reflect" + "runtime" + "strings" + "sync" + "syscall/js" + + "nhooyr.io/websocket/internal/bpool" + "nhooyr.io/websocket/internal/wsjs" + "nhooyr.io/websocket/internal/xsync" +) + +// Conn provides a wrapper around the browser WebSocket API. +type Conn struct { + ws wsjs.WebSocket + + // read limit for a message in bytes. + msgReadLimit xsync.Int64 + + closingMu sync.Mutex + isReadClosed xsync.Int64 + closeOnce sync.Once + closed chan struct{} + closeErrOnce sync.Once + closeErr error + closeWasClean bool + + releaseOnClose func() + releaseOnMessage func() + + readSignal chan struct{} + readBufMu sync.Mutex + readBuf []wsjs.MessageEvent +} + +func (c *Conn) close(err error, wasClean bool) { + c.closeOnce.Do(func() { + runtime.SetFinalizer(c, nil) + + if !wasClean { + err = fmt.Errorf("unclean connection close: %w", err) + } + c.setCloseErr(err) + c.closeWasClean = wasClean + close(c.closed) + }) +} + +func (c *Conn) init() { + c.closed = make(chan struct{}) + c.readSignal = make(chan struct{}, 1) + + c.msgReadLimit.Store(32768) + + c.releaseOnClose = c.ws.OnClose(func(e wsjs.CloseEvent) { + err := CloseError{ + Code: StatusCode(e.Code), + Reason: e.Reason, + } + // We do not know if we sent or received this close as + // its possible the browser triggered it without us + // explicitly sending it. + c.close(err, e.WasClean) + + c.releaseOnClose() + c.releaseOnMessage() + }) + + c.releaseOnMessage = c.ws.OnMessage(func(e wsjs.MessageEvent) { + c.readBufMu.Lock() + defer c.readBufMu.Unlock() + + c.readBuf = append(c.readBuf, e) + + // Lets the read goroutine know there is definitely something in readBuf. + select { + case c.readSignal <- struct{}{}: + default: + } + }) + + runtime.SetFinalizer(c, func(c *Conn) { + c.setCloseErr(errors.New("connection garbage collected")) + c.closeWithInternal() + }) +} + +func (c *Conn) closeWithInternal() { + c.Close(StatusInternalError, "something went wrong") +} + +// Read attempts to read a message from the connection. +// The maximum time spent waiting is bounded by the context. +func (c *Conn) Read(ctx context.Context) (MessageType, []byte, error) { + if c.isReadClosed.Load() == 1 { + return 0, nil, errors.New("WebSocket connection read closed") + } + + typ, p, err := c.read(ctx) + if err != nil { + return 0, nil, fmt.Errorf("failed to read: %w", err) + } + if int64(len(p)) > c.msgReadLimit.Load() { + err := fmt.Errorf("read limited at %v bytes", c.msgReadLimit.Load()) + c.Close(StatusMessageTooBig, err.Error()) + return 0, nil, err + } + return typ, p, nil +} + +func (c *Conn) read(ctx context.Context) (MessageType, []byte, error) { + select { + case <-ctx.Done(): + c.Close(StatusPolicyViolation, "read timed out") + return 0, nil, ctx.Err() + case <-c.readSignal: + case <-c.closed: + return 0, nil, c.closeErr + } + + c.readBufMu.Lock() + defer c.readBufMu.Unlock() + + me := c.readBuf[0] + // We copy the messages forward and decrease the size + // of the slice to avoid reallocating. + copy(c.readBuf, c.readBuf[1:]) + c.readBuf = c.readBuf[:len(c.readBuf)-1] + + if len(c.readBuf) > 0 { + // Next time we read, we'll grab the message. + select { + case c.readSignal <- struct{}{}: + default: + } + } + + switch p := me.Data.(type) { + case string: + return MessageText, []byte(p), nil + case []byte: + return MessageBinary, p, nil + default: + panic("websocket: unexpected data type from wsjs OnMessage: " + reflect.TypeOf(me.Data).String()) + } +} + +// Ping is mocked out for Wasm. +func (c *Conn) Ping(ctx context.Context) error { + return nil +} + +// Write writes a message of the given type to the connection. +// Always non blocking. +func (c *Conn) Write(ctx context.Context, typ MessageType, p []byte) error { + err := c.write(ctx, typ, p) + if err != nil { + // Have to ensure the WebSocket is closed after a write error + // to match the Go API. It can only error if the message type + // is unexpected or the passed bytes contain invalid UTF-8 for + // MessageText. + err := fmt.Errorf("failed to write: %w", err) + c.setCloseErr(err) + c.closeWithInternal() + return err + } + return nil +} + +func (c *Conn) write(ctx context.Context, typ MessageType, p []byte) error { + if c.isClosed() { + return c.closeErr + } + switch typ { + case MessageBinary: + return c.ws.SendBytes(p) + case MessageText: + return c.ws.SendText(string(p)) + default: + return fmt.Errorf("unexpected message type: %v", typ) + } +} + +// Close closes the WebSocket with the given code and reason. +// It will wait until the peer responds with a close frame +// or the connection is closed. +// It thus performs the full WebSocket close handshake. +func (c *Conn) Close(code StatusCode, reason string) error { + err := c.exportedClose(code, reason) + if err != nil { + return fmt.Errorf("failed to close WebSocket: %w", err) + } + return nil +} + +func (c *Conn) exportedClose(code StatusCode, reason string) error { + c.closingMu.Lock() + defer c.closingMu.Unlock() + + ce := fmt.Errorf("sent close: %w", CloseError{ + Code: code, + Reason: reason, + }) + + if c.isClosed() { + return fmt.Errorf("tried to close with %q but connection already closed: %w", ce, c.closeErr) + } + + c.setCloseErr(ce) + err := c.ws.Close(int(code), reason) + if err != nil { + return err + } + + <-c.closed + if !c.closeWasClean { + return c.closeErr + } + return nil +} + +// Subprotocol returns the negotiated subprotocol. +// An empty string means the default protocol. +func (c *Conn) Subprotocol() string { + return c.ws.Subprotocol() +} + +// DialOptions represents the options available to pass to Dial. +type DialOptions struct { + // Subprotocols lists the subprotocols to negotiate with the server. + Subprotocols []string +} + +// Dial creates a new WebSocket connection to the given url with the given options. +// The passed context bounds the maximum time spent waiting for the connection to open. +// The returned *http.Response is always nil or a mock. It's only in the signature +// to match the core API. +func Dial(ctx context.Context, url string, opts *DialOptions) (*Conn, *http.Response, error) { + c, resp, err := dial(ctx, url, opts) + if err != nil { + return nil, nil, fmt.Errorf("failed to WebSocket dial %q: %w", url, err) + } + return c, resp, nil +} + +func dial(ctx context.Context, url string, opts *DialOptions) (*Conn, *http.Response, error) { + if opts == nil { + opts = &DialOptions{} + } + + url = strings.Replace(url, "http://", "ws://", 1) + url = strings.Replace(url, "https://", "wss://", 1) + + ws, err := wsjs.New(url, opts.Subprotocols) + if err != nil { + return nil, nil, err + } + + c := &Conn{ + ws: ws, + } + c.init() + + opench := make(chan struct{}) + releaseOpen := ws.OnOpen(func(e js.Value) { + close(opench) + }) + defer releaseOpen() + + select { + case <-ctx.Done(): + c.Close(StatusPolicyViolation, "dial timed out") + return nil, nil, ctx.Err() + case <-opench: + return c, &http.Response{ + StatusCode: http.StatusSwitchingProtocols, + }, nil + case <-c.closed: + return nil, nil, c.closeErr + } +} + +// Reader attempts to read a message from the connection. +// The maximum time spent waiting is bounded by the context. +func (c *Conn) Reader(ctx context.Context) (MessageType, io.Reader, error) { + typ, p, err := c.Read(ctx) + if err != nil { + return 0, nil, err + } + return typ, bytes.NewReader(p), nil +} + +// Writer returns a writer to write a WebSocket data message to the connection. +// It buffers the entire message in memory and then sends it when the writer +// is closed. +func (c *Conn) Writer(ctx context.Context, typ MessageType) (io.WriteCloser, error) { + return writer{ + c: c, + ctx: ctx, + typ: typ, + b: bpool.Get(), + }, nil +} + +type writer struct { + closed bool + + c *Conn + ctx context.Context + typ MessageType + + b *bytes.Buffer +} + +func (w writer) Write(p []byte) (int, error) { + if w.closed { + return 0, errors.New("cannot write to closed writer") + } + n, err := w.b.Write(p) + if err != nil { + return n, fmt.Errorf("failed to write message: %w", err) + } + return n, nil +} + +func (w writer) Close() error { + if w.closed { + return errors.New("cannot close closed writer") + } + w.closed = true + defer bpool.Put(w.b) + + err := w.c.Write(w.ctx, w.typ, w.b.Bytes()) + if err != nil { + return fmt.Errorf("failed to close writer: %w", err) + } + return nil +} + +// CloseRead implements *Conn.CloseRead for wasm. +func (c *Conn) CloseRead(ctx context.Context) context.Context { + c.isReadClosed.Store(1) + + ctx, cancel := context.WithCancel(ctx) + go func() { + defer cancel() + c.read(ctx) + c.Close(StatusPolicyViolation, "unexpected data message") + }() + return ctx +} + +// SetReadLimit implements *Conn.SetReadLimit for wasm. +func (c *Conn) SetReadLimit(n int64) { + c.msgReadLimit.Store(n) +} + +func (c *Conn) setCloseErr(err error) { + c.closeErrOnce.Do(func() { + c.closeErr = fmt.Errorf("WebSocket closed: %w", err) + }) +} + +func (c *Conn) isClosed() bool { + select { + case <-c.closed: + return true + default: + return false + } +} diff --git a/vendor/nhooyr.io/websocket/wsjson/wsjson.go b/vendor/nhooyr.io/websocket/wsjson/wsjson.go new file mode 100644 index 0000000..2000a77 --- /dev/null +++ b/vendor/nhooyr.io/websocket/wsjson/wsjson.go @@ -0,0 +1,67 @@ +// Package wsjson provides helpers for reading and writing JSON messages. +package wsjson // import "nhooyr.io/websocket/wsjson" + +import ( + "context" + "encoding/json" + "fmt" + + "nhooyr.io/websocket" + "nhooyr.io/websocket/internal/bpool" + "nhooyr.io/websocket/internal/errd" +) + +// Read reads a JSON message from c into v. +// It will reuse buffers in between calls to avoid allocations. +func Read(ctx context.Context, c *websocket.Conn, v interface{}) error { + return read(ctx, c, v) +} + +func read(ctx context.Context, c *websocket.Conn, v interface{}) (err error) { + defer errd.Wrap(&err, "failed to read JSON message") + + _, r, err := c.Reader(ctx) + if err != nil { + return err + } + + b := bpool.Get() + defer bpool.Put(b) + + _, err = b.ReadFrom(r) + if err != nil { + return err + } + + err = json.Unmarshal(b.Bytes(), v) + if err != nil { + c.Close(websocket.StatusInvalidFramePayloadData, "failed to unmarshal JSON") + return fmt.Errorf("failed to unmarshal JSON: %w", err) + } + + return nil +} + +// Write writes the JSON message v to c. +// It will reuse buffers in between calls to avoid allocations. +func Write(ctx context.Context, c *websocket.Conn, v interface{}) error { + return write(ctx, c, v) +} + +func write(ctx context.Context, c *websocket.Conn, v interface{}) (err error) { + defer errd.Wrap(&err, "failed to write JSON message") + + w, err := c.Writer(ctx, websocket.MessageText) + if err != nil { + return err + } + + // json.Marshal cannot reuse buffers between calls as it has to return + // a copy of the byte slice but Encoder does as it directly writes to w. + err = json.NewEncoder(w).Encode(v) + if err != nil { + return fmt.Errorf("failed to marshal JSON: %w", err) + } + + return w.Close() +} diff --git a/wails.json b/wails.json new file mode 100644 index 0000000..b68464a --- /dev/null +++ b/wails.json @@ -0,0 +1,9 @@ +{ + "name": "ytd", + "outputfilename": "ytd", + "html": "frontend/dist/index.html", + "js": "frontend/dist/main.js", + "css": "frontend/dist/styles.css", + "frontend:build": "npm run build", + "frontend:install": "npm install" +} \ No newline at end of file